From b4bed3a58c81a864632d1ef5c53a96639b93f36a Mon Sep 17 00:00:00 2001 From: Dmitry Shachnev Date: Fri, 6 Jan 2023 08:10:46 +0000 Subject: [PATCH] Import qtlocation-opensource-src_5.15.8+dfsg.orig.tar.xz [dgit import orig qtlocation-opensource-src_5.15.8+dfsg.orig.tar.xz] --- .QT-ENTERPRISE-LICENSE-AGREEMENT | 1977 + .gitmodules | 4 + .qmake.conf | 11 + .tag | 1 + LICENSE.FDL | 450 + LICENSE.GPL2 | 339 + LICENSE.GPL3 | 674 + LICENSE.GPL3-EXCEPT | 704 + LICENSE.GPLv3 | 686 + LICENSE.LGPL3 | 165 + LICENSE.LGPLv3 | 175 + config.tests/gypsy/gypsy.pro | 2 + config.tests/gypsy/main.cpp | 44 + config.tests/winrt/main.cpp | 47 + config.tests/winrt/winrt.pro | 5 + configure.json | 6 + dist/changes-5.10.0 | 62 + dist/changes-5.10.1 | 26 + dist/changes-5.11.0 | 116 + dist/changes-5.11.1 | 40 + dist/changes-5.11.2 | 38 + dist/changes-5.11.3 | 32 + dist/changes-5.12.0 | 52 + dist/changes-5.12.1 | 56 + dist/changes-5.12.2 | 33 + dist/changes-5.12.3 | 33 + dist/changes-5.12.4 | 20 + dist/changes-5.12.5 | 20 + dist/changes-5.13.0 | 46 + dist/changes-5.13.1 | 20 + dist/changes-5.13.2 | 20 + dist/changes-5.14.0 | 47 + dist/changes-5.14.1 | 20 + dist/changes-5.14.2 | 20 + dist/changes-5.15.0 | 51 + dist/changes-5.15.1 | 20 + dist/changes-5.15.2 | 48 + dist/changes-5.2.1 | 53 + dist/changes-5.3.0 | 74 + dist/changes-5.3.1 | 57 + dist/changes-5.3.2 | 50 + dist/changes-5.4.0 | 54 + dist/changes-5.4.1 | 29 + dist/changes-5.4.2 | 28 + dist/changes-5.5.0 | 40 + dist/changes-5.5.1 | 54 + dist/changes-5.6.0 | 69 + dist/changes-5.6.1 | 38 + dist/changes-5.6.2 | 55 + dist/changes-5.6.3 | 38 + dist/changes-5.7.0 | 53 + dist/changes-5.7.1 | 45 + dist/changes-5.8.0 | 70 + dist/changes-5.9.0 | 131 + dist/changes-5.9.1 | 43 + dist/changes-5.9.2 | 56 + dist/changes-5.9.3 | 41 + dist/changes-5.9.4 | 31 + examples/examples.pro | 7 + .../geojson_viewer/GeoJsonDelegate.qml | 170 + .../GeoJsonDelegateMapObject.qml | 152 + .../geojson_viewer/data/01-point.json | 4 + .../geojson_viewer/data/02-linestring.json | 7 + .../geojson_viewer/data/03-multipoint.json | 8 + .../geojson_viewer/data/04-polygon.json | 12 + .../data/05-multilinestring.json | 7 + .../geojson_viewer/data/06-multipolygon.json | 21 + .../data/07-geometrycollection.json | 39 + .../geojson_viewer/data/08-feature.json | 27 + .../data/09-featurecollection.json | 48 + .../geojson_viewer/data/10-countries.json | 45891 ++++++++ .../geojson_viewer/data/10-countries_LICENSE | 27 + .../location/geojson_viewer/data/11-full.json | 380 + .../geojson_viewer/geojson_viewer.pro | 22 + examples/location/geojson_viewer/main.cpp | 296 + examples/location/geojson_viewer/main.qml | 215 + examples/location/geojson_viewer/qml.qrc | 7 + .../itemview_transitions/OsloListModel.qml | 13460 +++ .../doc/images/itemview_transitions.jpg | Bin 0 -> 87618 bytes .../doc/src/itemview_transitions.qdoc | 62 + .../itemview_transitions.pro | 18 + .../location/itemview_transitions/main.cpp | 63 + .../location/itemview_transitions/main.qml | 209 + examples/location/location.pro | 13 + .../mapviewer/doc/images/mapviewer.png | Bin 0 -> 176944 bytes .../location/mapviewer/doc/src/mapviewer.qdoc | 171 + examples/location/mapviewer/forms/Geocode.qml | 91 + .../mapviewer/forms/GeocodeForm.ui.qml | 183 + examples/location/mapviewer/forms/Locale.qml | 92 + .../mapviewer/forms/LocaleForm.ui.qml | 163 + examples/location/mapviewer/forms/Message.qml | 68 + .../mapviewer/forms/MessageForm.ui.qml | 116 + .../mapviewer/forms/ReverseGeocode.qml | 85 + .../mapviewer/forms/ReverseGeocodeForm.ui.qml | 150 + .../location/mapviewer/forms/RouteAddress.qml | 152 + .../mapviewer/forms/RouteAddressForm.ui.qml | 207 + .../mapviewer/forms/RouteCoordinate.qml | 89 + .../forms/RouteCoordinateForm.ui.qml | 183 + .../location/mapviewer/forms/RouteList.qml | 97 + .../mapviewer/forms/RouteListDelegate.qml | 92 + .../mapviewer/forms/RouteListHeader.qml | 94 + examples/location/mapviewer/helper.js | 91 + examples/location/mapviewer/main.cpp | 154 + .../location/mapviewer/map/CircleItem.qml | 68 + examples/location/mapviewer/map/ImageItem.qml | 71 + .../location/mapviewer/map/MapComponent.qml | 641 + .../location/mapviewer/map/MapSliders.qml | 333 + examples/location/mapviewer/map/Marker.qml | 126 + examples/location/mapviewer/map/MiniMap.qml | 127 + .../location/mapviewer/map/PolygonItem.qml | 73 + .../location/mapviewer/map/PolylineItem.qml | 67 + .../location/mapviewer/map/RectangleItem.qml | 69 + examples/location/mapviewer/mapviewer.pro | 47 + examples/location/mapviewer/mapviewer.qml | 525 + examples/location/mapviewer/mapviewer.qrc | 38 + .../mapviewer/menus/ItemPopupMenu.qml | 63 + .../location/mapviewer/menus/MainMenu.qml | 142 + .../location/mapviewer/menus/MapPopupMenu.qml | 74 + .../mapviewer/menus/MarkerPopupMenu.qml | 86 + .../location/mapviewer/resources/icon.png | Bin 0 -> 1859 bytes .../location/mapviewer/resources/marker.png | Bin 0 -> 752 bytes .../location/mapviewer/resources/scale.png | Bin 0 -> 98 bytes .../mapviewer/resources/scale_end.png | Bin 0 -> 93 bytes .../minimal_map/doc/images/minimal_map.png | Bin 0 -> 229975 bytes .../minimal_map/doc/src/minimal_map.qdoc | 89 + examples/location/minimal_map/main.cpp | 63 + examples/location/minimal_map/main.qml | 77 + examples/location/minimal_map/minimal_map.pro | 10 + examples/location/minimal_map/qml.qrc | 6 + .../location/places/doc/images/places.png | Bin 0 -> 233430 bytes examples/location/places/doc/src/places.qdoc | 166 + examples/location/places/forms/Message.qml | 68 + .../location/places/forms/MessageForm.ui.qml | 116 + .../location/places/forms/PlaceDetails.qml | 137 + .../places/forms/PlaceDetailsForm.ui.qml | 295 + .../places/forms/SearchBoundingBox.qml | 81 + .../places/forms/SearchBoundingBoxForm.ui.qml | 173 + .../places/forms/SearchBoundingCircle.qml | 79 + .../forms/SearchBoundingCircleForm.ui.qml | 161 + .../location/places/forms/SearchCenter.qml | 80 + .../places/forms/SearchCenterForm.ui.qml | 150 + .../location/places/forms/SearchOptions.qml | 88 + .../places/forms/SearchOptionsForm.ui.qml | 169 + examples/location/places/helper.js | 63 + examples/location/places/items/MainMenu.qml | 101 + .../location/places/items/MapComponent.qml | 224 + examples/location/places/items/SearchBar.qml | 132 + examples/location/places/main.cpp | 136 + examples/location/places/places.pro | 44 + examples/location/places/places.qml | 507 + examples/location/places/places.qrc | 42 + .../location/places/resources/categories.png | Bin 0 -> 130 bytes examples/location/places/resources/left.png | Bin 0 -> 141 bytes examples/location/places/resources/marker.png | Bin 0 -> 752 bytes examples/location/places/resources/right.png | Bin 0 -> 147 bytes examples/location/places/resources/scale.png | Bin 0 -> 98 bytes .../location/places/resources/scale_end.png | Bin 0 -> 93 bytes examples/location/places/resources/search.png | Bin 0 -> 259 bytes examples/location/places/resources/star.png | Bin 0 -> 1403 bytes .../places/views/CategoryDelegate.qml | 114 + .../location/places/views/CategoryView.qml | 77 + .../places/views/EditorialDelegate.qml | 96 + .../location/places/views/EditorialPage.qml | 124 + .../location/places/views/EditorialView.qml | 67 + examples/location/places/views/ImageView.qml | 161 + examples/location/places/views/RatingView.qml | 65 + .../location/places/views/ReviewDelegate.qml | 108 + examples/location/places/views/ReviewPage.qml | 133 + examples/location/places/views/ReviewView.qml | 67 + .../places/views/SearchResultDelegate.qml | 206 + .../places/views/SearchResultView.qml | 101 + .../location/places/views/SuggestionView.qml | 77 + examples/location/places_list/Marker.qml | 69 + .../places_list/doc/images/places_list.png | Bin 0 -> 18195 bytes .../places_list/doc/src/places_list.qdoc | 76 + examples/location/places_list/main.cpp | 61 + examples/location/places_list/marker.png | Bin 0 -> 752 bytes examples/location/places_list/places_list.pro | 12 + examples/location/places_list/places_list.qml | 111 + examples/location/places_list/places_list.qrc | 7 + .../places_map/doc/images/places_map.png | Bin 0 -> 167995 bytes .../places_map/doc/src/places_map.qdoc | 83 + examples/location/places_map/main.cpp | 63 + examples/location/places_map/marker.png | Bin 0 -> 752 bytes examples/location/places_map/places_map.pro | 12 + examples/location/places_map/places_map.qml | 138 + examples/location/places_map/places_map.qrc | 6 + examples/location/planespotter/Plane.qml | 125 + examples/location/planespotter/airplane.png | Bin 0 -> 831 bytes .../planespotter/doc/images/planespotter.png | Bin 0 -> 135872 bytes .../planespotter/doc/src/planespotter.qdoc | 143 + examples/location/planespotter/main.cpp | 211 + .../location/planespotter/planespotter.pro | 10 + .../location/planespotter/planespotter.qml | 228 + examples/location/planespotter/qml.qrc | 7 + .../geoflickr/doc/images/qml-flickr-1.jpg | Bin 0 -> 66794 bytes .../geoflickr/doc/src/geoflickr.qdoc | 87 + examples/positioning/geoflickr/flickr-90.qml | 61 + examples/positioning/geoflickr/flickr.qml | 147 + examples/positioning/geoflickr/flickr.qrc | 30 + .../geoflickr/flickrcommon/Progress.qml | 82 + .../geoflickr/flickrcommon/RestModel.qml | 75 + .../geoflickr/flickrcommon/ScrollBar.qml | 90 + .../geoflickr/flickrcommon/Slider.qml | 86 + .../geoflickr/flickrmobile/Button.qml | 88 + .../geoflickr/flickrmobile/GeoTab.qml | 181 + .../geoflickr/flickrmobile/GridDelegate.qml | 122 + .../geoflickr/flickrmobile/ImageDetails.qml | 166 + .../geoflickr/flickrmobile/ListDelegate.qml | 76 + .../geoflickr/flickrmobile/TitleBar.qml | 87 + .../geoflickr/flickrmobile/ToolBar.qml | 74 + .../geoflickr/flickrmobile/images/gloss.png | Bin 0 -> 889 bytes .../flickrmobile/images/lineedit.png | Bin 0 -> 1307 bytes .../flickrmobile/images/lineedit.sci | 5 + .../geoflickr/flickrmobile/images/moon.png | Bin 0 -> 2366 bytes .../geoflickr/flickrmobile/images/quit.png | Bin 0 -> 1785 bytes .../geoflickr/flickrmobile/images/star.png | Bin 0 -> 259 bytes .../geoflickr/flickrmobile/images/stripes.png | Bin 0 -> 159 bytes .../geoflickr/flickrmobile/images/sun.png | Bin 0 -> 8110 bytes .../flickrmobile/images/titlebar.png | Bin 0 -> 1327 bytes .../flickrmobile/images/titlebar.sci | 5 + .../flickrmobile/images/toolbutton.png | Bin 0 -> 2550 bytes .../flickrmobile/images/toolbutton.sci | 5 + .../geoflickr/flickrmobile/nmealog.txt | 1403 + examples/positioning/geoflickr/geoflickr.pro | 15 + .../geoflickr/geoflickr.qmlproject | 16 + .../geoflickr/qmllocationflickr.cpp | 68 + .../clientapplication.cpp | 72 + .../logfilepositionsource/clientapplication.h | 74 + .../doc/src/logfilepositionsource.qdoc | 87 + .../logfilepositionsource/logfile.qrc | 5 + .../logfilepositionsource.cpp | 132 + .../logfilepositionsource.h | 87 + .../logfilepositionsource.pro | 16 + .../logfilepositionsource/main.cpp | 62 + .../logfilepositionsource/simplelog.txt | 156 + examples/positioning/positioning.pro | 9 + .../doc/images/example-satelliteinfo.png | Bin 0 -> 27371 bytes .../satelliteinfo/doc/src/satelliteinfo.qdoc | 75 + examples/positioning/satelliteinfo/main.cpp | 72 + .../satelliteinfo/satelliteinfo.pro | 22 + .../satelliteinfo/satelliteinfo.qml | 314 + .../satelliteinfo/satelliteinfo.qrc | 5 + .../satelliteinfo/satellitemodel.cpp | 319 + .../satelliteinfo/satellitemodel.h | 134 + examples/positioning/weatherinfo/appmodel.cpp | 552 + examples/positioning/weatherinfo/appmodel.h | 181 + .../components/BigForecastIcon.qml | 93 + .../weatherinfo/components/ForecastIcon.qml | 99 + .../weatherinfo/components/WeatherIcon.qml | 112 + .../doc/images/example-weatherinfo.png | Bin 0 -> 82081 bytes .../weatherinfo/doc/src/weatherinfo.qdoc | 119 + .../positioning/weatherinfo/icons/README.txt | 5 + .../weatherinfo/icons/qt_attribution.json | 28 + .../weatherinfo/icons/weather-few-clouds.png | Bin 0 -> 79488 bytes .../weatherinfo/icons/weather-fog.png | Bin 0 -> 43896 bytes .../weatherinfo/icons/weather-haze.png | Bin 0 -> 130030 bytes .../weatherinfo/icons/weather-icy.png | Bin 0 -> 49362 bytes .../weatherinfo/icons/weather-overcast.png | Bin 0 -> 60290 bytes .../weatherinfo/icons/weather-showers.png | Bin 0 -> 76340 bytes .../weatherinfo/icons/weather-sleet.png | Bin 0 -> 87168 bytes .../weatherinfo/icons/weather-snow.png | Bin 0 -> 70939 bytes .../weatherinfo/icons/weather-storm.png | Bin 0 -> 93207 bytes .../icons/weather-sunny-very-few-clouds.png | Bin 0 -> 65731 bytes .../weatherinfo/icons/weather-sunny.png | Bin 0 -> 59084 bytes .../icons/weather-thundershower.png | Bin 0 -> 105643 bytes examples/positioning/weatherinfo/main.cpp | 82 + .../positioning/weatherinfo/weatherinfo.pro | 21 + .../positioning/weatherinfo/weatherinfo.qml | 240 + .../positioning/weatherinfo/weatherinfo.qrc | 20 + .../QtLocation/private/error_messages_p.h | 1 + .../private/locationvaluetypehelper_p.h | 1 + .../private/qabstractgeotilecache_p.h | 1 + .../5.15.8/QtLocation/private/qcache3q_p.h | 1 + .../private/qdeclarativecategory_p.h | 1 + .../private/qdeclarativecirclemapitem_p.h | 1 + .../private/qdeclarativecirclemapitem_p_p.h | 1 + .../private/qdeclarativecontactdetail_p.h | 1 + .../private/qdeclarativegeocodemodel_p.h | 1 + .../private/qdeclarativegeomaneuver_p.h | 1 + .../QtLocation/private/qdeclarativegeomap_p.h | 1 + .../qdeclarativegeomapcopyrightsnotice_p.h | 1 + .../private/qdeclarativegeomapitembase_p.h | 1 + .../private/qdeclarativegeomapitemgroup_p.h | 1 + ...declarativegeomapitemtransitionmanager_p.h | 1 + .../private/qdeclarativegeomapitemutils_p.h | 1 + .../private/qdeclarativegeomapitemview_p.h | 1 + .../private/qdeclarativegeomapparameter_p.h | 1 + .../private/qdeclarativegeomapquickitem_p.h | 1 + .../private/qdeclarativegeomaptype_p.h | 1 + .../private/qdeclarativegeoroute_p.h | 1 + .../private/qdeclarativegeoroutemodel_p.h | 1 + .../private/qdeclarativegeoroutesegment_p.h | 1 + .../qdeclarativegeoserviceprovider_p.h | 1 + .../private/qdeclarativenavigator_p.h | 1 + .../private/qdeclarativenavigator_p_p.h | 1 + .../QtLocation/private/qdeclarativeperiod_p.h | 1 + .../QtLocation/private/qdeclarativeplace_p.h | 1 + .../private/qdeclarativeplaceattribute_p.h | 1 + .../private/qdeclarativeplacecontentmodel_p.h | 1 + .../qdeclarativeplaceeditorialmodel_p.h | 1 + .../private/qdeclarativeplaceicon_p.h | 1 + .../private/qdeclarativeplaceimagemodel_p.h | 1 + .../private/qdeclarativeplaceuser_p.h | 1 + .../private/qdeclarativepolygonmapitem_p.h | 1 + .../private/qdeclarativepolygonmapitem_p_p.h | 1 + .../private/qdeclarativepolylinemapitem_p.h | 1 + .../private/qdeclarativepolylinemapitem_p_p.h | 1 + .../private/qdeclarativeratings_p.h | 1 + .../private/qdeclarativerectanglemapitem_p.h | 1 + .../qdeclarativerectanglemapitem_p_p.h | 1 + .../private/qdeclarativereviewmodel_p.h | 1 + .../private/qdeclarativeroutemapitem_p.h | 1 + .../private/qdeclarativesearchmodelbase_p.h | 1 + .../private/qdeclarativesearchresultmodel_p.h | 1 + .../qdeclarativesearchsuggestionmodel_p.h | 1 + .../private/qdeclarativesupplier_p.h | 1 + .../qdeclarativesupportedcategoriesmodel_p.h | 1 + .../private/qgeocameracapabilities_p.h | 1 + .../QtLocation/private/qgeocameradata_p.h | 1 + .../QtLocation/private/qgeocameratiles_p.h | 1 + .../QtLocation/private/qgeocameratiles_p_p.h | 1 + .../QtLocation/private/qgeocodereply_p.h | 1 + .../QtLocation/private/qgeocodingmanager_p.h | 1 + .../private/qgeocodingmanagerengine_p.h | 1 + .../QtLocation/private/qgeofiletilecache_p.h | 1 + .../5.15.8/QtLocation/private/qgeojson_p.h | 1 + .../QtLocation/private/qgeomaneuver_p.h | 1 + .../5.15.8/QtLocation/private/qgeomap_p.h | 1 + .../5.15.8/QtLocation/private/qgeomap_p_p.h | 1 + .../private/qgeomapitemgeometry_p.h | 1 + .../QtLocation/private/qgeomapobject_p.h | 1 + .../QtLocation/private/qgeomapobject_p_p.h | 1 + .../private/qgeomapobjectqsgsupport_p.h | 1 + .../QtLocation/private/qgeomapparameter_p.h | 1 + .../QtLocation/private/qgeomappingmanager_p.h | 1 + .../private/qgeomappingmanager_p_p.h | 1 + .../private/qgeomappingmanagerengine_p.h | 1 + .../private/qgeomappingmanagerengine_p_p.h | 1 + .../5.15.8/QtLocation/private/qgeomaptype_p.h | 1 + .../QtLocation/private/qgeomaptype_p_p.h | 1 + .../QtLocation/private/qgeoprojection_p.h | 1 + .../5.15.8/QtLocation/private/qgeoroute_p.h | 1 + .../QtLocation/private/qgeorouteparser_p.h | 1 + .../QtLocation/private/qgeorouteparser_p_p.h | 1 + .../private/qgeorouteparserosrmv4_p.h | 1 + .../private/qgeorouteparserosrmv5_p.h | 1 + .../QtLocation/private/qgeoroutereply_p.h | 1 + .../QtLocation/private/qgeorouterequest_p.h | 1 + .../QtLocation/private/qgeoroutesegment_p.h | 1 + .../QtLocation/private/qgeoroutingmanager_p.h | 1 + .../private/qgeoroutingmanagerengine_p.h | 1 + .../private/qgeoserviceprovider_p.h | 1 + .../QtLocation/private/qgeosimplify_p.h | 1 + .../QtLocation/private/qgeotiledmap_p.h | 1 + .../QtLocation/private/qgeotiledmap_p_p.h | 1 + .../QtLocation/private/qgeotiledmaplabs_p.h | 1 + .../private/qgeotiledmappingmanagerengine_p.h | 1 + .../qgeotiledmappingmanagerengine_p_p.h | 1 + .../QtLocation/private/qgeotiledmapreply_p.h | 1 + .../private/qgeotiledmapreply_p_p.h | 1 + .../QtLocation/private/qgeotiledmapscene_p.h | 1 + .../private/qgeotiledmapscene_p_p.h | 1 + .../QtLocation/private/qgeotilefetcher_p.h | 1 + .../QtLocation/private/qgeotilefetcher_p_p.h | 1 + .../private/qgeotilerequestmanager_p.h | 1 + .../QtLocation/private/qgeotilespec_p.h | 1 + .../QtLocation/private/qgeotilespec_p_p.h | 1 + .../QtLocation/private/qlocationglobal_p.h | 1 + .../QtLocation/private/qmapcircleobject_p.h | 1 + .../QtLocation/private/qmapcircleobject_p_p.h | 1 + .../private/qmapcircleobjectqsg_p_p.h | 1 + .../QtLocation/private/qmapiconobject_p.h | 1 + .../QtLocation/private/qmapiconobject_p_p.h | 1 + .../private/qmapiconobjectqsg_p_p.h | 1 + .../QtLocation/private/qmapobjectview_p.h | 1 + .../QtLocation/private/qmapobjectview_p_p.h | 1 + .../QtLocation/private/qmappolygonobject_p.h | 1 + .../private/qmappolygonobject_p_p.h | 1 + .../private/qmappolygonobjectqsg_p_p.h | 1 + .../QtLocation/private/qmappolylineobject_p.h | 1 + .../private/qmappolylineobject_p_p.h | 1 + .../private/qmappolylineobjectqsg_p_p.h | 1 + .../QtLocation/private/qmaprouteobject_p.h | 1 + .../QtLocation/private/qmaprouteobject_p_p.h | 1 + .../private/qmaprouteobjectqsg_p_p.h | 1 + .../QtLocation/private/qnavigationmanager_p.h | 1 + .../private/qnavigationmanagerengine_p.h | 1 + .../private/qparameterizableobject_p.h | 1 + .../5.15.8/QtLocation/private/qplace_p.h | 1 + .../QtLocation/private/qplaceattribute_p.h | 1 + .../QtLocation/private/qplacecategory_p.h | 1 + .../private/qplacecontactdetail_p.h | 1 + .../QtLocation/private/qplacecontent_p.h | 1 + .../private/qplacecontentrequest_p.h | 1 + .../QtLocation/private/qplaceeditorial_p.h | 1 + .../5.15.8/QtLocation/private/qplaceicon_p.h | 1 + .../5.15.8/QtLocation/private/qplaceimage_p.h | 1 + .../private/qplacemanagerengine_p.h | 1 + .../private/qplaceproposedsearchresult_p.h | 1 + .../QtLocation/private/qplaceratings_p.h | 1 + .../5.15.8/QtLocation/private/qplacereply_p.h | 1 + .../QtLocation/private/qplaceresult_p.h | 1 + .../QtLocation/private/qplacereview_p.h | 1 + .../private/qplacesearchrequest_p.h | 1 + .../QtLocation/private/qplacesearchresult_p.h | 1 + .../QtLocation/private/qplacesupplier_p.h | 1 + .../5.15.8/QtLocation/private/qplaceuser_p.h | 1 + .../QtLocation/private/qqsgmapobject_p.h | 1 + .../private/qquickgeomapgesturearea_p.h | 1 + .../QtLocation/private/unsupportedreplies_p.h | 1 + include/QtLocation/QGeoCodeReply | 1 + include/QtLocation/QGeoCodingManager | 1 + include/QtLocation/QGeoCodingManagerEngine | 1 + include/QtLocation/QGeoManeuver | 1 + include/QtLocation/QGeoRoute | 1 + include/QtLocation/QGeoRouteLeg | 1 + include/QtLocation/QGeoRouteReply | 1 + include/QtLocation/QGeoRouteRequest | 1 + include/QtLocation/QGeoRouteSegment | 1 + include/QtLocation/QGeoRoutingManager | 1 + include/QtLocation/QGeoRoutingManagerEngine | 1 + include/QtLocation/QGeoServiceProvider | 1 + include/QtLocation/QGeoServiceProviderFactory | 1 + include/QtLocation/QLocation | 1 + include/QtLocation/QPlace | 1 + include/QtLocation/QPlaceAttribute | 1 + include/QtLocation/QPlaceCategory | 1 + include/QtLocation/QPlaceContactDetail | 1 + include/QtLocation/QPlaceContent | 1 + include/QtLocation/QPlaceContentReply | 1 + include/QtLocation/QPlaceContentRequest | 1 + include/QtLocation/QPlaceDetailsReply | 1 + include/QtLocation/QPlaceEditorial | 1 + include/QtLocation/QPlaceIcon | 1 + include/QtLocation/QPlaceIdReply | 1 + include/QtLocation/QPlaceImage | 1 + include/QtLocation/QPlaceManager | 1 + include/QtLocation/QPlaceManagerEngine | 1 + include/QtLocation/QPlaceMatchReply | 1 + include/QtLocation/QPlaceMatchRequest | 1 + include/QtLocation/QPlaceProposedSearchResult | 1 + include/QtLocation/QPlaceRatings | 1 + include/QtLocation/QPlaceReply | 1 + include/QtLocation/QPlaceResult | 1 + include/QtLocation/QPlaceReview | 1 + include/QtLocation/QPlaceSearchReply | 1 + include/QtLocation/QPlaceSearchRequest | 1 + include/QtLocation/QPlaceSearchResult | 1 + .../QtLocation/QPlaceSearchSuggestionReply | 1 + include/QtLocation/QPlaceSupplier | 1 + include/QtLocation/QPlaceUser | 1 + include/QtLocation/QtLocation | 47 + include/QtLocation/QtLocationVersion | 1 + include/QtLocation/headers.pri | 6 + include/QtLocation/placemacro.h | 1 + include/QtLocation/qgeocodereply.h | 1 + include/QtLocation/qgeocodingmanager.h | 1 + include/QtLocation/qgeocodingmanagerengine.h | 1 + include/QtLocation/qgeomaneuver.h | 1 + include/QtLocation/qgeoroute.h | 1 + include/QtLocation/qgeoroutereply.h | 1 + include/QtLocation/qgeorouterequest.h | 1 + include/QtLocation/qgeoroutesegment.h | 1 + include/QtLocation/qgeoroutingmanager.h | 1 + include/QtLocation/qgeoroutingmanagerengine.h | 1 + include/QtLocation/qgeoserviceprovider.h | 1 + .../QtLocation/qgeoserviceproviderfactory.h | 1 + include/QtLocation/qlocation.h | 1 + include/QtLocation/qlocationglobal.h | 1 + include/QtLocation/qplace.h | 1 + include/QtLocation/qplaceattribute.h | 1 + include/QtLocation/qplacecategory.h | 1 + include/QtLocation/qplacecontactdetail.h | 1 + include/QtLocation/qplacecontent.h | 1 + include/QtLocation/qplacecontentreply.h | 1 + include/QtLocation/qplacecontentrequest.h | 1 + include/QtLocation/qplacedetailsreply.h | 1 + include/QtLocation/qplaceeditorial.h | 1 + include/QtLocation/qplaceicon.h | 1 + include/QtLocation/qplaceidreply.h | 1 + include/QtLocation/qplaceimage.h | 1 + include/QtLocation/qplacemanager.h | 1 + include/QtLocation/qplacemanagerengine.h | 1 + include/QtLocation/qplacematchreply.h | 1 + include/QtLocation/qplacematchrequest.h | 1 + .../QtLocation/qplaceproposedsearchresult.h | 1 + include/QtLocation/qplaceratings.h | 1 + include/QtLocation/qplacereply.h | 1 + include/QtLocation/qplaceresult.h | 1 + include/QtLocation/qplacereview.h | 1 + include/QtLocation/qplacesearchreply.h | 1 + include/QtLocation/qplacesearchrequest.h | 1 + include/QtLocation/qplacesearchresult.h | 1 + .../QtLocation/qplacesearchsuggestionreply.h | 1 + include/QtLocation/qplacesupplier.h | 1 + include/QtLocation/qplaceuser.h | 1 + include/QtLocation/qtlocationversion.h | 9 + .../QtPositioning/private/qclipperutils_p.h | 1 + .../private/qdoublematrix4x4_p.h | 1 + .../QtPositioning/private/qdoublevector2d_p.h | 1 + .../QtPositioning/private/qdoublevector3d_p.h | 1 + .../QtPositioning/private/qgeoaddress_p.h | 1 + .../QtPositioning/private/qgeocircle_p.h | 1 + .../QtPositioning/private/qgeocoordinate_p.h | 1 + .../private/qgeocoordinateobject_p.h | 1 + .../QtPositioning/private/qgeolocation_p.h | 1 + .../5.15.8/QtPositioning/private/qgeopath_p.h | 1 + .../QtPositioning/private/qgeopolygon_p.h | 1 + .../private/qgeopositioninfo_p.h | 1 + .../private/qgeopositioninfosource_p.h | 1 + .../QtPositioning/private/qgeorectangle_p.h | 1 + .../private/qgeosatelliteinfo_p.h | 1 + .../private/qgeosatelliteinfosource_p.h | 1 + .../QtPositioning/private/qgeoshape_p.h | 1 + .../private/qlocationdata_simulator_p.h | 1 + .../QtPositioning/private/qlocationutils_p.h | 1 + .../private/qnmeapositioninfosource_p.h | 1 + .../private/qpositioningglobal_p.h | 1 + .../QtPositioning/private/qwebmercator_p.h | 1 + include/QtPositioning/QGeoAddress | 1 + include/QtPositioning/QGeoAreaMonitorInfo | 1 + include/QtPositioning/QGeoAreaMonitorSource | 1 + include/QtPositioning/QGeoCircle | 1 + include/QtPositioning/QGeoCoordinate | 1 + include/QtPositioning/QGeoLocation | 1 + include/QtPositioning/QGeoPath | 1 + include/QtPositioning/QGeoPolygon | 1 + include/QtPositioning/QGeoPositionInfo | 1 + include/QtPositioning/QGeoPositionInfoSource | 1 + .../QGeoPositionInfoSourceFactory | 1 + include/QtPositioning/QGeoRectangle | 1 + include/QtPositioning/QGeoSatelliteInfo | 1 + include/QtPositioning/QGeoSatelliteInfoSource | 1 + include/QtPositioning/QGeoShape | 1 + include/QtPositioning/QNmeaPositionInfoSource | 1 + include/QtPositioning/QtPositioning | 22 + include/QtPositioning/QtPositioningVersion | 1 + include/QtPositioning/headers.pri | 6 + include/QtPositioning/qgeoaddress.h | 1 + include/QtPositioning/qgeoareamonitorinfo.h | 1 + include/QtPositioning/qgeoareamonitorsource.h | 1 + include/QtPositioning/qgeocircle.h | 1 + include/QtPositioning/qgeocoordinate.h | 1 + include/QtPositioning/qgeolocation.h | 1 + include/QtPositioning/qgeopath.h | 1 + include/QtPositioning/qgeopolygon.h | 1 + include/QtPositioning/qgeopositioninfo.h | 1 + .../QtPositioning/qgeopositioninfosource.h | 1 + .../qgeopositioninfosourcefactory.h | 1 + include/QtPositioning/qgeorectangle.h | 1 + include/QtPositioning/qgeosatelliteinfo.h | 1 + .../QtPositioning/qgeosatelliteinfosource.h | 1 + include/QtPositioning/qgeoshape.h | 1 + .../QtPositioning/qnmeapositioninfosource.h | 1 + include/QtPositioning/qpositioningglobal.h | 1 + include/QtPositioning/qtpositioningversion.h | 9 + .../private/qdeclarativegeoaddress_p.h | 1 + .../private/qdeclarativegeolocation_p.h | 1 + .../private/qdeclarativepluginparameter_p.h | 1 + .../private/qdeclarativeposition_p.h | 1 + .../private/qdeclarativepositionsource_p.h | 1 + .../private/qpositioningquickglobal_p.h | 1 + .../private/qquickgeocoordinateanimation_p.h | 1 + .../qquickgeocoordinateanimation_p_p.h | 1 + include/QtPositioningQuick/QtPositioningQuick | 6 + .../QtPositioningQuickVersion | 1 + include/QtPositioningQuick/headers.pri | 6 + .../qpositioningquickglobal.h | 1 + .../qtpositioningquickversion.h | 9 + qtlocation.pro | 8 + src/3rdparty/clip2tri/LICENSE | 21 + src/3rdparty/clip2tri/clip2tri.cpp | 406 + src/3rdparty/clip2tri/clip2tri.h | 102 + src/3rdparty/clip2tri/clip2tri.pro | 22 + src/3rdparty/clip2tri/qt_attribution.json | 13 + src/3rdparty/clipper/LICENSE | 48 + src/3rdparty/clipper/clipper.cpp | 4622 + src/3rdparty/clipper/clipper.h | 404 + src/3rdparty/clipper/clipper.pro | 16 + src/3rdparty/clipper/qt_attribution.json | 13 + src/3rdparty/earcut/LICENSE | 15 + src/3rdparty/earcut/earcut.hpp | 837 + src/3rdparty/earcut/qt_attribution.json | 13 + src/3rdparty/geosimplify.js/LICENSE | 27 + .../geosimplify.js/qt_attribution.json | 13 + src/3rdparty/mapbox-gl-native/LICENSE.md | 944 + .../mapbox-gl-native/LICENSE_Boost.txt | 23 + .../LICENSE_CSSColorParser.txt | 23 + .../mapbox-gl-native/LICENSE_geojson.txt | 13 + .../LICENSE_geojson_vt_cpp.txt | 15 + .../mapbox-gl-native/LICENSE_geometry.txt | 13 + .../mapbox-gl-native/LICENSE_mapbox.txt | 46 + .../mapbox-gl-native/LICENSE_parsedate.txt | 11 + .../mapbox-gl-native/LICENSE_protozero.txt | 24 + .../mapbox-gl-native/LICENSE_rapidjson.txt | 21 + .../mapbox-gl-native/LICENSE_vectortile.txt | 13 + .../mapbox-gl-native/LICENSE_wagyu.txt | 37 + .../deps/earcut/0.12.4/LICENSE | 15 + .../earcut/0.12.4/include/mapbox/earcut.hpp | 772 + .../geojson/0.4.2/include/mapbox/geojson.hpp | 42 + .../include/mapbox/geojson/rapidjson.hpp | 32 + .../0.4.2/include/mapbox/geojson_impl.hpp | 453 + .../6.5.1/include/mapbox/geojsonvt.hpp | 254 + .../6.5.1/include/mapbox/geojsonvt/clip.hpp | 251 + .../include/mapbox/geojsonvt/convert.hpp | 109 + .../include/mapbox/geojsonvt/simplify.hpp | 84 + .../6.5.1/include/mapbox/geojsonvt/tile.hpp | 184 + .../6.5.1/include/mapbox/geojsonvt/types.hpp | 162 + .../6.5.1/include/mapbox/geojsonvt/wrap.hpp | 46 + .../0.9.3/include/mapbox/geometry.hpp | 13 + .../0.9.3/include/mapbox/geometry/box.hpp | 34 + .../include/mapbox/geometry/envelope.hpp | 33 + .../0.9.3/include/mapbox/geometry/feature.hpp | 96 + .../mapbox/geometry/for_each_point.hpp | 45 + .../include/mapbox/geometry/geometry.hpp | 58 + .../include/mapbox/geometry/line_string.hpp | 26 + .../mapbox/geometry/multi_line_string.hpp | 26 + .../include/mapbox/geometry/multi_point.hpp | 26 + .../include/mapbox/geometry/multi_polygon.hpp | 26 + .../0.9.3/include/mapbox/geometry/point.hpp | 35 + .../mapbox/geometry/point_arithmetic.hpp | 119 + .../0.9.3/include/mapbox/geometry/polygon.hpp | 41 + .../deps/kdbush/0.1.1-1/LICENSE | 13 + .../deps/kdbush/0.1.1-1/include/kdbush.hpp | 210 + .../f27e7908/include/experimental/optional | 1052 + .../deps/polylabel/1.0.3/LICENSE | 14 + .../1.0.3/include/mapbox/polylabel.hpp | 178 + .../1.5.2/include/protozero/byteswap.hpp | 84 + .../1.5.2/include/protozero/config.hpp | 48 + .../1.5.2/include/protozero/exception.hpp | 68 + .../1.5.2/include/protozero/iterators.hpp | 328 + .../1.5.2/include/protozero/pbf_builder.hpp | 160 + .../1.5.2/include/protozero/pbf_message.hpp | 98 + .../1.5.2/include/protozero/pbf_reader.hpp | 952 + .../1.5.2/include/protozero/pbf_writer.hpp | 975 + .../1.5.2/include/protozero/types.hpp | 206 + .../1.5.2/include/protozero/varint.hpp | 187 + .../1.5.2/include/protozero/version.hpp | 34 + .../1.1.0/include/rapidjson/allocators.h | 271 + .../1.1.0/include/rapidjson/document.h | 2575 + .../1.1.0/include/rapidjson/encodedstream.h | 299 + .../1.1.0/include/rapidjson/encodings.h | 716 + .../1.1.0/include/rapidjson/error/en.h | 74 + .../1.1.0/include/rapidjson/error/error.h | 155 + .../1.1.0/include/rapidjson/filereadstream.h | 99 + .../1.1.0/include/rapidjson/filewritestream.h | 104 + .../rapidjson/1.1.0/include/rapidjson/fwd.h | 151 + .../include/rapidjson/internal/biginteger.h | 290 + .../1.1.0/include/rapidjson/internal/diyfp.h | 258 + .../1.1.0/include/rapidjson/internal/dtoa.h | 245 + .../include/rapidjson/internal/ieee754.h | 78 + .../1.1.0/include/rapidjson/internal/itoa.h | 304 + .../1.1.0/include/rapidjson/internal/meta.h | 181 + .../1.1.0/include/rapidjson/internal/pow10.h | 55 + .../1.1.0/include/rapidjson/internal/regex.h | 701 + .../1.1.0/include/rapidjson/internal/stack.h | 230 + .../include/rapidjson/internal/strfunc.h | 55 + .../1.1.0/include/rapidjson/internal/strtod.h | 269 + .../1.1.0/include/rapidjson/internal/swap.h | 46 + .../1.1.0/include/rapidjson/istreamwrapper.h | 115 + .../1.1.0/include/rapidjson/memorybuffer.h | 70 + .../1.1.0/include/rapidjson/memorystream.h | 71 + .../include/rapidjson/msinttypes/inttypes.h | 316 + .../include/rapidjson/msinttypes/stdint.h | 300 + .../1.1.0/include/rapidjson/ostreamwrapper.h | 81 + .../1.1.0/include/rapidjson/pointer.h | 1358 + .../1.1.0/include/rapidjson/prettywriter.h | 255 + .../1.1.0/include/rapidjson/rapidjson.h | 615 + .../1.1.0/include/rapidjson/reader.h | 1879 + .../1.1.0/include/rapidjson/schema.h | 2006 + .../1.1.0/include/rapidjson/stream.h | 179 + .../1.1.0/include/rapidjson/stringbuffer.h | 117 + .../1.1.0/include/rapidjson/writer.h | 610 + .../deps/shelf-pack/2.1.1/LICENSE.md | 15 + .../2.1.1/include/mapbox/shelf-pack.hpp | 535 + .../deps/supercluster/0.2.2/LICENSE | 13 + .../0.2.2/include/supercluster.hpp | 229 + .../deps/tao_tuple/28626e99/LICENSE | 22 + .../28626e99/include/tao/seq/concatenate.hpp | 29 + .../28626e99/include/tao/seq/config.hpp | 25 + .../include/tao/seq/exclusive_scan.hpp | 43 + .../28626e99/include/tao/seq/fold.hpp | 57 + .../28626e99/include/tao/seq/head.hpp | 30 + .../include/tao/seq/inclusive_scan.hpp | 32 + .../include/tao/seq/integer_sequence.hpp | 43 + .../28626e99/include/tao/seq/is_all.hpp | 35 + .../28626e99/include/tao/seq/is_any.hpp | 35 + .../include/tao/seq/make_integer_sequence.hpp | 84 + .../28626e99/include/tao/seq/map.hpp | 31 + .../28626e99/include/tao/seq/max.hpp | 33 + .../28626e99/include/tao/seq/min.hpp | 33 + .../28626e99/include/tao/seq/minus.hpp | 29 + .../28626e99/include/tao/seq/partial_sum.hpp | 42 + .../28626e99/include/tao/seq/plus.hpp | 29 + .../28626e99/include/tao/seq/select.hpp | 29 + .../28626e99/include/tao/seq/sum.hpp | 72 + .../28626e99/include/tao/seq/tail.hpp | 34 + .../include/tao/seq/type_by_index.hpp | 57 + .../28626e99/include/tao/seq/values.hpp | 19 + .../28626e99/include/tao/seq/zip.hpp | 30 + .../28626e99/include/tao/tuple/tuple.hpp | 817 + .../cba309e/include/unique_resource.hpp | 101 + .../deps/variant/1.1.4/LICENSE | 25 + .../variant/1.1.4/include/mapbox/optional.hpp | 74 + .../include/mapbox/recursive_wrapper.hpp | 122 + .../variant/1.1.4/include/mapbox/variant.hpp | 1013 + .../1.1.4/include/mapbox/variant_io.hpp | 45 + .../1.1.4/include/mapbox/variant_visitor.hpp | 38 + .../1.0.2/include/mapbox/vector_tile.hpp | 455 + .../mapbox/vector_tile/vector_tile_config.hpp | 60 + .../include/mapbox/vector_tile/version.hpp | 16 + .../geometry/wagyu/active_bound_list.hpp | 406 + .../include/mapbox/geometry/wagyu/bound.hpp | 101 + .../mapbox/geometry/wagyu/bubble_sort.hpp | 28 + .../mapbox/geometry/wagyu/build_edges.hpp | 186 + .../wagyu/build_local_minima_list.hpp | 26 + .../mapbox/geometry/wagyu/build_result.hpp | 72 + .../include/mapbox/geometry/wagyu/config.hpp | 53 + .../include/mapbox/geometry/wagyu/edge.hpp | 123 + .../mapbox/geometry/wagyu/intersect.hpp | 72 + .../mapbox/geometry/wagyu/intersect_util.hpp | 372 + .../mapbox/geometry/wagyu/local_minimum.hpp | 118 + .../geometry/wagyu/local_minimum_util.hpp | 323 + .../include/mapbox/geometry/wagyu/point.hpp | 111 + .../geometry/wagyu/process_horizontal.hpp | 268 + .../mapbox/geometry/wagyu/process_maxima.hpp | 127 + .../mapbox/geometry/wagyu/quick_clip.hpp | 133 + .../include/mapbox/geometry/wagyu/ring.hpp | 645 + .../mapbox/geometry/wagyu/ring_util.hpp | 852 + .../mapbox/geometry/wagyu/scanbeam.hpp | 36 + .../mapbox/geometry/wagyu/snap_rounding.hpp | 195 + .../geometry/wagyu/topology_correction.hpp | 1369 + .../include/mapbox/geometry/wagyu/util.hpp | 85 + .../include/mapbox/geometry/wagyu/vatti.hpp | 66 + .../include/mapbox/geometry/wagyu/wagyu.hpp | 141 + .../include/mbgl/actor/actor.hpp | 69 + .../include/mbgl/actor/actor_ref.hpp | 64 + .../include/mbgl/actor/aspiring_actor.hpp | 60 + .../include/mbgl/actor/established_actor.hpp | 80 + .../include/mbgl/actor/mailbox.hpp | 50 + .../include/mbgl/actor/message.hpp | 108 + .../include/mbgl/actor/scheduler.hpp | 46 + .../include/mbgl/annotation/annotation.hpp | 73 + .../include/mbgl/map/camera.hpp | 90 + .../include/mbgl/map/change.hpp | 26 + .../mapbox-gl-native/include/mbgl/map/map.hpp | 177 + .../include/mbgl/map/map_observer.hpp | 44 + .../include/mbgl/map/mode.hpp | 67 + .../include/mbgl/math/clamp.hpp | 14 + .../include/mbgl/math/log2.hpp | 30 + .../include/mbgl/math/minmax.hpp | 41 + .../include/mbgl/math/wrap.hpp | 17 + .../include/mbgl/renderer/backend_scope.hpp | 35 + .../include/mbgl/renderer/mode.hpp | 18 + .../include/mbgl/renderer/query.hpp | 43 + .../include/mbgl/renderer/renderer.hpp | 58 + .../mbgl/renderer/renderer_backend.hpp | 92 + .../mbgl/renderer/renderer_frontend.hpp | 31 + .../mbgl/renderer/renderer_observer.hpp | 35 + .../mbgl/storage/default_file_source.hpp | 160 + .../include/mbgl/storage/file_source.hpp | 36 + .../include/mbgl/storage/network_status.hpp | 34 + .../include/mbgl/storage/offline.hpp | 213 + .../mbgl/storage/online_file_source.hpp | 39 + .../include/mbgl/storage/resource.hpp | 103 + .../mbgl/storage/resource_transform.hpp | 26 + .../include/mbgl/storage/response.hpp | 74 + .../mbgl/style/color_ramp_property_value.hpp | 49 + .../include/mbgl/style/conversion.hpp | 306 + .../conversion/color_ramp_property_value.hpp | 47 + .../mbgl/style/conversion/constant.hpp | 88 + .../mbgl/style/conversion/coordinate.hpp | 18 + .../custom_geometry_source_options.hpp | 84 + .../conversion/data_driven_property_value.hpp | 78 + .../include/mbgl/style/conversion/filter.hpp | 18 + .../mbgl/style/conversion/function.hpp | 41 + .../include/mbgl/style/conversion/geojson.hpp | 21 + .../mbgl/style/conversion/geojson_options.hpp | 17 + .../mbgl/style/conversion/get_json_type.hpp | 14 + .../include/mbgl/style/conversion/layer.hpp | 24 + .../include/mbgl/style/conversion/light.hpp | 18 + .../mbgl/style/conversion/position.hpp | 17 + .../mbgl/style/conversion/property_value.hpp | 74 + .../include/mbgl/style/conversion/source.hpp | 20 + .../include/mbgl/style/conversion/tileset.hpp | 18 + .../style/conversion/transition_options.hpp | 18 + .../mbgl/style/data_driven_property_value.hpp | 74 + .../mbgl/style/expression/array_assertion.hpp | 47 + .../mbgl/style/expression/assertion.hpp | 35 + .../include/mbgl/style/expression/at.hpp | 45 + .../style/expression/boolean_operator.hpp | 52 + .../include/mbgl/style/expression/case.hpp | 39 + .../mbgl/style/expression/check_subtype.hpp | 17 + .../mbgl/style/expression/coalesce.hpp | 48 + .../mbgl/style/expression/coercion.hpp | 40 + .../mbgl/style/expression/collator.hpp | 29 + .../style/expression/collator_expression.hpp | 44 + .../style/expression/compound_expression.hpp | 147 + .../include/mbgl/style/expression/dsl.hpp | 84 + .../include/mbgl/style/expression/equals.hpp | 35 + .../include/mbgl/style/expression/error.hpp | 39 + .../mbgl/style/expression/expression.hpp | 215 + .../mbgl/style/expression/find_zoom_curve.hpp | 20 + .../style/expression/get_covering_stops.hpp | 18 + .../mbgl/style/expression/interpolate.hpp | 86 + .../mbgl/style/expression/interpolator.hpp | 50 + .../mbgl/style/expression/is_constant.hpp | 36 + .../mbgl/style/expression/is_expression.hpp | 13 + .../include/mbgl/style/expression/length.hpp | 32 + .../include/mbgl/style/expression/let.hpp | 85 + .../include/mbgl/style/expression/literal.hpp | 58 + .../include/mbgl/style/expression/match.hpp | 48 + .../mbgl/style/expression/parsing_context.hpp | 172 + .../include/mbgl/style/expression/step.hpp | 45 + .../include/mbgl/style/expression/type.hpp | 120 + .../include/mbgl/style/expression/value.hpp | 147 + .../include/mbgl/style/filter.hpp | 55 + .../include/mbgl/style/image.hpp | 31 + .../include/mbgl/style/layer.hpp | 139 + .../include/mbgl/style/layer_type.hpp | 20 + .../mbgl/style/layers/background_layer.hpp | 65 + .../mbgl/style/layers/circle_layer.hpp | 121 + .../mbgl/style/layers/custom_layer.hpp | 93 + .../style/layers/fill_extrusion_layer.hpp | 97 + .../include/mbgl/style/layers/fill_layer.hpp | 97 + .../mbgl/style/layers/heatmap_layer.hpp | 86 + .../mbgl/style/layers/hillshade_layer.hpp | 86 + .../include/mbgl/style/layers/layer.hpp.ejs | 93 + .../include/mbgl/style/layers/line_layer.hpp | 135 + .../mbgl/style/layers/raster_layer.hpp | 98 + .../mbgl/style/layers/symbol_layer.hpp | 287 + .../include/mbgl/style/light.hpp | 53 + .../include/mbgl/style/light.hpp.ejs | 40 + .../include/mbgl/style/position.hpp | 68 + .../mbgl/style/property_expression.hpp | 117 + .../include/mbgl/style/property_value.hpp | 55 + .../include/mbgl/style/source.hpp | 84 + .../style/sources/custom_geometry_source.hpp | 58 + .../mbgl/style/sources/geojson_source.hpp | 54 + .../mbgl/style/sources/image_source.hpp | 41 + .../mbgl/style/sources/raster_dem_source.hpp | 25 + .../mbgl/style/sources/raster_source.hpp | 39 + .../mbgl/style/sources/vector_source.hpp | 37 + .../include/mbgl/style/style.hpp | 79 + .../include/mbgl/style/transition_options.hpp | 32 + .../include/mbgl/style/types.hpp | 115 + .../include/mbgl/style/undefined.hpp | 12 + .../include/mbgl/tile/tile_id.hpp | 273 + .../include/mbgl/tile/tile_necessity.hpp | 15 + .../include/mbgl/util/async_request.hpp | 12 + .../include/mbgl/util/async_task.hpp | 24 + .../include/mbgl/util/char_array_buffer.hpp | 55 + .../include/mbgl/util/chrono.hpp | 45 + .../include/mbgl/util/color.hpp | 63 + .../include/mbgl/util/compression.hpp | 12 + .../include/mbgl/util/constants.hpp | 72 + .../include/mbgl/util/convert.hpp | 19 + .../include/mbgl/util/enum.hpp | 37 + .../include/mbgl/util/event.hpp | 59 + .../include/mbgl/util/exception.hpp | 39 + .../include/mbgl/util/feature.hpp | 32 + .../include/mbgl/util/font_stack.hpp | 17 + .../include/mbgl/util/geo.hpp | 249 + .../include/mbgl/util/geojson.hpp | 10 + .../include/mbgl/util/geometry.hpp | 67 + .../include/mbgl/util/ignore.hpp | 26 + .../include/mbgl/util/image.hpp | 177 + .../include/mbgl/util/immutable.hpp | 133 + .../include/mbgl/util/indexed_tuple.hpp | 53 + .../include/mbgl/util/interpolate.hpp | 138 + .../include/mbgl/util/logging.hpp | 80 + .../include/mbgl/util/noncopyable.hpp | 23 + .../include/mbgl/util/optional.hpp | 13 + .../include/mbgl/util/platform.hpp | 32 + .../include/mbgl/util/premultiply.hpp | 12 + .../include/mbgl/util/projection.hpp | 105 + .../include/mbgl/util/range.hpp | 27 + .../include/mbgl/util/run_loop.hpp | 133 + .../include/mbgl/util/size.hpp | 39 + .../include/mbgl/util/string.hpp | 77 + .../include/mbgl/util/thread.hpp | 155 + .../include/mbgl/util/tileset.hpp | 52 + .../include/mbgl/util/timer.hpp | 26 + .../include/mbgl/util/traits.hpp | 28 + .../include/mbgl/util/tuple.hpp | 19 + .../include/mbgl/util/type_list.hpp | 40 + .../include/mbgl/util/unique_any.hpp | 271 + .../include/mbgl/util/unitbezier.hpp | 134 + .../include/mbgl/util/util.hpp | 21 + .../include/mbgl/util/variant.hpp | 10 + .../include/mbgl/util/work_request.hpp | 21 + .../include/mbgl/util/work_task.hpp | 23 + .../include/mbgl/util/work_task_impl.hpp | 65 + .../mapbox-gl-native/mapbox-gl-native.pro | 451 + .../platform/default/asset_file_source.cpp | 81 + .../platform/default/async_task.cpp | 66 + .../platform/default/bidi.cpp | 133 + .../platform/default/collator.cpp | 79 + .../platform/default/default_file_source.cpp | 313 + .../platform/default/file_source_request.cpp | 37 + .../default/headless_backend_osmesa.cpp | 47 + .../platform/default/http_file_source.cpp | 499 + .../platform/default/image.cpp | 45 + .../platform/default/jpeg_reader.cpp | 151 + .../platform/default/local_file_source.cpp | 81 + .../default/local_glyph_rasterizer.cpp | 22 + .../platform/default/logging_stderr.cpp | 12 + .../default/mbgl/gl/headless_backend.cpp | 85 + .../default/mbgl/gl/headless_backend.hpp | 50 + .../default/mbgl/gl/headless_frontend.cpp | 96 + .../default/mbgl/gl/headless_frontend.hpp | 52 + .../default/mbgl/map/map_snapshotter.cpp | 221 + .../default/mbgl/map/map_snapshotter.hpp | 65 + .../platform/default/mbgl/storage/.clang-tidy | 2 + .../mbgl/storage/file_source_request.hpp | 31 + .../platform/default/mbgl/storage/offline.cpp | 139 + .../default/mbgl/storage/offline_database.cpp | 953 + .../default/mbgl/storage/offline_database.hpp | 117 + .../default/mbgl/storage/offline_download.cpp | 382 + .../default/mbgl/storage/offline_download.hpp | 68 + .../default/mbgl/storage/offline_schema.hpp | 63 + .../default/mbgl/storage/offline_schema.js | 21 + .../default/mbgl/storage/offline_schema.sql | 64 + .../platform/default/mbgl/test/main.cpp | 20 + .../default/mbgl/util/default_styles.hpp | 30 + .../default/mbgl/util/default_thread_pool.cpp | 57 + .../default/mbgl/util/default_thread_pool.hpp | 27 + .../default/mbgl/util/shared_thread_pool.cpp | 14 + .../default/mbgl/util/shared_thread_pool.hpp | 9 + .../platform/default/online_file_source.cpp | 415 + .../platform/default/png_reader.cpp | 142 + .../platform/default/png_writer.cpp | 80 + .../platform/default/run_loop.cpp | 219 + .../platform/default/sqlite3.cpp | 454 + .../platform/default/sqlite3.hpp | 178 + .../platform/default/string_stdlib.cpp | 74 + .../platform/default/thread.cpp | 37 + .../platform/default/thread_local.cpp | 66 + .../platform/default/timer.cpp | 73 + .../platform/default/unaccent.cpp | 43 + .../platform/default/unaccent.hpp | 13 + .../mapbox-gl-native/platform/default/utf.cpp | 26 + .../platform/default/webp_reader.cpp | 31 + .../platform/qt/include/QMapbox | 1 + .../platform/qt/include/QMapboxGL | 1 + .../platform/qt/include/qmapbox.hpp | 143 + .../platform/qt/include/qmapboxgl.hpp | 274 + .../platform/qt/mbgl/gl/gl_impl.hpp | 178 + .../platform/qt/src/async_task.cpp | 42 + .../platform/qt/src/async_task_impl.hpp | 38 + .../mapbox-gl-native/platform/qt/src/bidi.cpp | 52 + .../platform/qt/src/http_file_source.cpp | 120 + .../platform/qt/src/http_file_source.hpp | 37 + .../platform/qt/src/http_request.cpp | 149 + .../platform/qt/src/http_request.hpp | 33 + .../platform/qt/src/qmapbox.cpp | 229 + .../platform/qt/src/qmapboxgl.cpp | 1919 + .../qt/src/qmapboxgl_map_observer.cpp | 120 + .../qt/src/qmapboxgl_map_observer.hpp | 46 + .../qt/src/qmapboxgl_map_renderer.cpp | 95 + .../qt/src/qmapboxgl_map_renderer.hpp | 56 + .../platform/qt/src/qmapboxgl_p.hpp | 65 + .../qt/src/qmapboxgl_renderer_backend.cpp | 49 + .../qt/src/qmapboxgl_renderer_backend.hpp | 34 + .../qt/src/qmapboxgl_renderer_observer.hpp | 51 + .../platform/qt/src/qmapboxgl_scheduler.cpp | 38 + .../platform/qt/src/qmapboxgl_scheduler.hpp | 34 + .../platform/qt/src/qt_conversion.hpp | 147 + .../platform/qt/src/qt_geojson.cpp | 163 + .../platform/qt/src/qt_geojson.hpp | 27 + .../platform/qt/src/qt_image.cpp | 68 + .../platform/qt/src/qt_logging.cpp | 12 + .../platform/qt/src/run_loop.cpp | 123 + .../platform/qt/src/run_loop_impl.hpp | 39 + .../platform/qt/src/sqlite3.cpp | 478 + .../platform/qt/src/string_stdlib.cpp | 24 + .../platform/qt/src/thread.cpp | 19 + .../platform/qt/src/thread_local.cpp | 49 + .../platform/qt/src/timer.cpp | 56 + .../platform/qt/src/timer_impl.hpp | 31 + .../mapbox-gl-native/platform/qt/src/utf.cpp | 17 + .../mapbox-gl-native/qt_attribution.json | 490 + .../src/csscolorparser/csscolorparser.cpp | 288 + .../src/csscolorparser/csscolorparser.hpp | 59 + .../src/mbgl/actor/mailbox.cpp | 98 + .../src/mbgl/actor/scheduler.cpp | 19 + .../mbgl/algorithm/covered_by_children.hpp | 39 + .../src/mbgl/algorithm/generate_clip_ids.cpp | 77 + .../src/mbgl/algorithm/generate_clip_ids.hpp | 35 + .../mbgl/algorithm/generate_clip_ids_impl.hpp | 92 + .../src/mbgl/algorithm/update_renderables.hpp | 132 + .../src/mbgl/algorithm/update_tile_masks.hpp | 128 + .../mbgl/annotation/annotation_manager.cpp | 240 + .../mbgl/annotation/annotation_manager.hpp | 91 + .../src/mbgl/annotation/annotation_source.cpp | 24 + .../src/mbgl/annotation/annotation_source.hpp | 28 + .../src/mbgl/annotation/annotation_tile.cpp | 120 + .../src/mbgl/annotation/annotation_tile.hpp | 67 + .../mbgl/annotation/fill_annotation_impl.cpp | 34 + .../mbgl/annotation/fill_annotation_impl.hpp | 19 + .../mbgl/annotation/line_annotation_impl.cpp | 35 + .../mbgl/annotation/line_annotation_impl.hpp | 19 + .../annotation/render_annotation_source.cpp | 84 + .../annotation/render_annotation_source.hpp | 50 + .../mbgl/annotation/shape_annotation_impl.cpp | 62 + .../mbgl/annotation/shape_annotation_impl.hpp | 62 + .../annotation/symbol_annotation_impl.cpp | 24 + .../annotation/symbol_annotation_impl.hpp | 99 + .../src/mbgl/geometry/anchor.hpp | 22 + .../src/mbgl/geometry/debug_font_data.hpp | 206 + .../src/mbgl/geometry/dem_data.cpp | 106 + .../src/mbgl/geometry/dem_data.hpp | 49 + .../src/mbgl/geometry/feature_index.cpp | 197 + .../src/mbgl/geometry/feature_index.hpp | 104 + .../src/mbgl/geometry/line_atlas.cpp | 147 + .../src/mbgl/geometry/line_atlas.hpp | 55 + .../src/mbgl/gl/attribute.cpp | 45 + .../src/mbgl/gl/attribute.hpp | 318 + .../src/mbgl/gl/color_mode.cpp | 44 + .../src/mbgl/gl/color_mode.hpp | 99 + .../mapbox-gl-native/src/mbgl/gl/context.cpp | 814 + .../mapbox-gl-native/src/mbgl/gl/context.hpp | 314 + .../src/mbgl/gl/debugging.cpp | 33 + .../src/mbgl/gl/debugging.hpp | 34 + .../src/mbgl/gl/debugging_extension.cpp | 55 + .../src/mbgl/gl/debugging_extension.hpp | 120 + .../src/mbgl/gl/depth_mode.cpp | 18 + .../src/mbgl/gl/depth_mode.hpp | 36 + .../src/mbgl/gl/draw_mode.hpp | 79 + .../src/mbgl/gl/extension.hpp | 34 + .../mapbox-gl-native/src/mbgl/gl/features.hpp | 7 + .../src/mbgl/gl/framebuffer.hpp | 16 + .../mapbox-gl-native/src/mbgl/gl/gl.cpp | 71 + .../mapbox-gl-native/src/mbgl/gl/gl.hpp | 24 + .../src/mbgl/gl/index_buffer.hpp | 43 + .../mapbox-gl-native/src/mbgl/gl/object.cpp | 53 + .../mapbox-gl-native/src/mbgl/gl/object.hpp | 60 + .../src/mbgl/gl/primitives.hpp | 22 + .../mapbox-gl-native/src/mbgl/gl/program.hpp | 155 + .../src/mbgl/gl/program_binary_extension.hpp | 44 + .../src/mbgl/gl/renderbuffer.hpp | 32 + .../mapbox-gl-native/src/mbgl/gl/state.hpp | 70 + .../src/mbgl/gl/stencil_mode.cpp | 27 + .../src/mbgl/gl/stencil_mode.hpp | 66 + .../mapbox-gl-native/src/mbgl/gl/texture.hpp | 32 + .../mapbox-gl-native/src/mbgl/gl/types.hpp | 123 + .../mapbox-gl-native/src/mbgl/gl/uniform.cpp | 176 + .../mapbox-gl-native/src/mbgl/gl/uniform.hpp | 142 + .../mapbox-gl-native/src/mbgl/gl/value.cpp | 485 + .../mapbox-gl-native/src/mbgl/gl/value.hpp | 334 + .../src/mbgl/gl/vertex_array.cpp | 22 + .../src/mbgl/gl/vertex_array.hpp | 66 + .../src/mbgl/gl/vertex_array_extension.hpp | 37 + .../src/mbgl/gl/vertex_buffer.hpp | 48 + .../src/mbgl/layout/clip_lines.cpp | 68 + .../src/mbgl/layout/clip_lines.hpp | 16 + .../src/mbgl/layout/merge_lines.cpp | 97 + .../src/mbgl/layout/merge_lines.hpp | 30 + .../src/mbgl/layout/symbol_feature.hpp | 31 + .../src/mbgl/layout/symbol_instance.cpp | 65 + .../src/mbgl/layout/symbol_instance.hpp | 58 + .../src/mbgl/layout/symbol_layout.cpp | 611 + .../src/mbgl/layout/symbol_layout.hpp | 93 + .../src/mbgl/layout/symbol_projection.cpp | 425 + .../src/mbgl/layout/symbol_projection.hpp | 63 + .../mapbox-gl-native/src/mbgl/map/map.cpp | 824 + .../src/mbgl/map/transform.cpp | 698 + .../src/mbgl/map/transform.hpp | 172 + .../src/mbgl/map/transform_state.cpp | 437 + .../src/mbgl/map/transform_state.hpp | 147 + .../src/mbgl/map/zoom_history.hpp | 47 + .../mapbox-gl-native/src/mbgl/math/log2.cpp | 25 + .../src/mbgl/programs/attributes.hpp | 156 + .../src/mbgl/programs/background_program.cpp | 47 + .../src/mbgl/programs/background_program.hpp | 83 + .../src/mbgl/programs/binary_program.cpp | 119 + .../src/mbgl/programs/binary_program.hpp | 45 + .../src/mbgl/programs/circle_program.cpp | 7 + .../src/mbgl/programs/circle_program.hpp | 51 + .../mbgl/programs/clipping_mask_program.hpp | 26 + .../mbgl/programs/collision_box_program.cpp | 7 + .../mbgl/programs/collision_box_program.hpp | 184 + .../src/mbgl/programs/debug_program.hpp | 28 + .../programs/extrusion_texture_program.cpp | 7 + .../programs/extrusion_texture_program.hpp | 38 + .../mbgl/programs/fill_extrusion_program.cpp | 83 + .../mbgl/programs/fill_extrusion_program.hpp | 124 + .../src/mbgl/programs/fill_program.cpp | 47 + .../src/mbgl/programs/fill_program.hpp | 115 + .../src/mbgl/programs/heatmap_program.cpp | 7 + .../src/mbgl/programs/heatmap_program.hpp | 49 + .../mbgl/programs/heatmap_texture_program.cpp | 7 + .../mbgl/programs/heatmap_texture_program.hpp | 43 + .../programs/hillshade_prepare_program.cpp | 7 + .../programs/hillshade_prepare_program.hpp | 49 + .../src/mbgl/programs/hillshade_program.cpp | 7 + .../src/mbgl/programs/hillshade_program.hpp | 55 + .../src/mbgl/programs/line_program.cpp | 119 + .../src/mbgl/programs/line_program.hpp | 165 + .../src/mbgl/programs/program.hpp | 134 + .../src/mbgl/programs/program_parameters.cpp | 48 + .../src/mbgl/programs/program_parameters.hpp | 24 + .../src/mbgl/programs/programs.hpp | 80 + .../src/mbgl/programs/raster_program.cpp | 7 + .../src/mbgl/programs/raster_program.hpp | 68 + .../src/mbgl/programs/segment.hpp | 43 + .../src/mbgl/programs/symbol_program.cpp | 158 + .../src/mbgl/programs/symbol_program.hpp | 449 + .../src/mbgl/programs/uniforms.hpp | 66 + .../src/mbgl/renderer/backend_scope.cpp | 74 + .../src/mbgl/renderer/bucket.hpp | 65 + .../src/mbgl/renderer/bucket_parameters.cpp | 5 + .../src/mbgl/renderer/bucket_parameters.hpp | 15 + .../mbgl/renderer/buckets/circle_bucket.cpp | 117 + .../mbgl/renderer/buckets/circle_bucket.hpp | 45 + .../mbgl/renderer/buckets/debug_bucket.cpp | 83 + .../mbgl/renderer/buckets/debug_bucket.hpp | 41 + .../src/mbgl/renderer/buckets/fill_bucket.cpp | 138 + .../src/mbgl/renderer/buckets/fill_bucket.hpp | 47 + .../buckets/fill_extrusion_bucket.cpp | 174 + .../buckets/fill_extrusion_bucket.hpp | 42 + .../mbgl/renderer/buckets/heatmap_bucket.cpp | 99 + .../mbgl/renderer/buckets/heatmap_bucket.hpp | 45 + .../renderer/buckets/hillshade_bucket.cpp | 117 + .../renderer/buckets/hillshade_bucket.hpp | 64 + .../src/mbgl/renderer/buckets/line_bucket.cpp | 503 + .../src/mbgl/renderer/buckets/line_bucket.hpp | 72 + .../mbgl/renderer/buckets/raster_bucket.cpp | 112 + .../mbgl/renderer/buckets/raster_bucket.hpp | 46 + .../mbgl/renderer/buckets/symbol_bucket.cpp | 225 + .../mbgl/renderer/buckets/symbol_bucket.hpp | 146 + .../cross_faded_property_evaluator.cpp | 43 + .../cross_faded_property_evaluator.hpp | 45 + .../data_driven_property_evaluator.hpp | 43 + .../src/mbgl/renderer/group_by_layout.cpp | 48 + .../src/mbgl/renderer/group_by_layout.hpp | 12 + .../src/mbgl/renderer/image_atlas.cpp | 60 + .../src/mbgl/renderer/image_atlas.hpp | 51 + .../src/mbgl/renderer/image_manager.cpp | 184 + .../src/mbgl/renderer/image_manager.hpp | 91 + .../layers/render_background_layer.cpp | 120 + .../layers/render_background_layer.hpp | 33 + .../renderer/layers/render_circle_layer.cpp | 185 + .../renderer/layers/render_circle_layer.hpp | 41 + .../renderer/layers/render_custom_layer.cpp | 88 + .../renderer/layers/render_custom_layer.hpp | 36 + .../layers/render_fill_extrusion_layer.cpp | 219 + .../layers/render_fill_extrusion_layer.hpp | 45 + .../renderer/layers/render_fill_layer.cpp | 242 + .../renderer/layers/render_fill_layer.hpp | 41 + .../renderer/layers/render_heatmap_layer.cpp | 217 + .../renderer/layers/render_heatmap_layer.hpp | 49 + .../layers/render_hillshade_layer.cpp | 197 + .../layers/render_hillshade_layer.hpp | 38 + .../renderer/layers/render_line_layer.cpp | 223 + .../renderer/layers/render_line_layer.hpp | 53 + .../renderer/layers/render_raster_layer.cpp | 175 + .../renderer/layers/render_raster_layer.hpp | 34 + .../renderer/layers/render_symbol_layer.cpp | 358 + .../renderer/layers/render_symbol_layer.hpp | 97 + .../src/mbgl/renderer/paint_parameters.cpp | 100 + .../src/mbgl/renderer/paint_parameters.hpp | 79 + .../mbgl/renderer/paint_property_binder.hpp | 372 + .../renderer/paint_property_statistics.hpp | 29 + .../possibly_evaluated_property_value.hpp | 77 + .../property_evaluation_parameters.hpp | 34 + .../src/mbgl/renderer/property_evaluator.hpp | 26 + .../src/mbgl/renderer/render_layer.cpp | 106 + .../src/mbgl/renderer/render_layer.hpp | 111 + .../src/mbgl/renderer/render_light.cpp | 26 + .../src/mbgl/renderer/render_light.hpp | 31 + .../src/mbgl/renderer/render_pass.hpp | 35 + .../src/mbgl/renderer/render_source.cpp | 66 + .../src/mbgl/renderer/render_source.hpp | 91 + .../mbgl/renderer/render_source_observer.hpp | 18 + .../src/mbgl/renderer/render_static_data.cpp | 67 + .../src/mbgl/renderer/render_static_data.hpp | 39 + .../src/mbgl/renderer/render_tile.cpp | 167 + .../src/mbgl/renderer/render_tile.hpp | 52 + .../src/mbgl/renderer/renderer.cpp | 102 + .../src/mbgl/renderer/renderer_backend.cpp | 69 + .../src/mbgl/renderer/renderer_impl.cpp | 867 + .../src/mbgl/renderer/renderer_impl.hpp | 126 + .../sources/render_custom_geometry_source.cpp | 87 + .../sources/render_custom_geometry_source.hpp | 50 + .../sources/render_geojson_source.cpp | 105 + .../sources/render_geojson_source.hpp | 55 + .../renderer/sources/render_image_source.cpp | 221 + .../renderer/sources/render_image_source.hpp | 59 + .../sources/render_raster_dem_source.cpp | 166 + .../sources/render_raster_dem_source.hpp | 59 + .../renderer/sources/render_raster_source.cpp | 96 + .../renderer/sources/render_raster_source.hpp | 51 + .../renderer/sources/render_vector_source.cpp | 100 + .../renderer/sources/render_vector_source.hpp | 51 + .../src/mbgl/renderer/style_diff.cpp | 79 + .../src/mbgl/renderer/style_diff.hpp | 48 + .../src/mbgl/renderer/tile_mask.hpp | 15 + .../src/mbgl/renderer/tile_parameters.hpp | 28 + .../src/mbgl/renderer/tile_pyramid.cpp | 368 + .../src/mbgl/renderer/tile_pyramid.hpp | 81 + .../mbgl/renderer/transition_parameters.hpp | 16 + .../src/mbgl/renderer/update_parameters.hpp | 43 + .../src/mbgl/shaders/background.cpp | 14 + .../src/mbgl/shaders/background.hpp | 16 + .../src/mbgl/shaders/background_pattern.cpp | 14 + .../src/mbgl/shaders/background_pattern.hpp | 16 + .../src/mbgl/shaders/circle.cpp | 14 + .../src/mbgl/shaders/circle.hpp | 16 + .../src/mbgl/shaders/clipping_mask.cpp | 14 + .../src/mbgl/shaders/clipping_mask.hpp | 16 + .../src/mbgl/shaders/collision_box.cpp | 14 + .../src/mbgl/shaders/collision_box.hpp | 16 + .../src/mbgl/shaders/collision_circle.cpp | 14 + .../src/mbgl/shaders/collision_circle.hpp | 16 + .../src/mbgl/shaders/debug.cpp | 14 + .../src/mbgl/shaders/debug.hpp | 16 + .../src/mbgl/shaders/extrusion_texture.cpp | 14 + .../src/mbgl/shaders/extrusion_texture.hpp | 16 + .../src/mbgl/shaders/fill.cpp | 14 + .../src/mbgl/shaders/fill.hpp | 16 + .../src/mbgl/shaders/fill_extrusion.cpp | 14 + .../src/mbgl/shaders/fill_extrusion.hpp | 16 + .../mbgl/shaders/fill_extrusion_pattern.cpp | 14 + .../mbgl/shaders/fill_extrusion_pattern.hpp | 16 + .../src/mbgl/shaders/fill_outline.cpp | 14 + .../src/mbgl/shaders/fill_outline.hpp | 16 + .../src/mbgl/shaders/fill_outline_pattern.cpp | 14 + .../src/mbgl/shaders/fill_outline_pattern.hpp | 16 + .../src/mbgl/shaders/fill_pattern.cpp | 14 + .../src/mbgl/shaders/fill_pattern.hpp | 16 + .../src/mbgl/shaders/heatmap.cpp | 14 + .../src/mbgl/shaders/heatmap.hpp | 16 + .../src/mbgl/shaders/heatmap_texture.cpp | 14 + .../src/mbgl/shaders/heatmap_texture.hpp | 16 + .../src/mbgl/shaders/hillshade.cpp | 14 + .../src/mbgl/shaders/hillshade.hpp | 16 + .../src/mbgl/shaders/hillshade_prepare.cpp | 14 + .../src/mbgl/shaders/hillshade_prepare.hpp | 16 + .../src/mbgl/shaders/line.cpp | 14 + .../src/mbgl/shaders/line.hpp | 16 + .../src/mbgl/shaders/line_pattern.cpp | 14 + .../src/mbgl/shaders/line_pattern.hpp | 16 + .../src/mbgl/shaders/line_sdf.cpp | 14 + .../src/mbgl/shaders/line_sdf.hpp | 16 + .../src/mbgl/shaders/preludes.cpp | 13 + .../src/mbgl/shaders/preludes.hpp | 12 + .../src/mbgl/shaders/raster.cpp | 14 + .../src/mbgl/shaders/raster.hpp | 16 + .../src/mbgl/shaders/shaders.cpp | 30 + .../src/mbgl/shaders/shaders.hpp | 16 + .../src/mbgl/shaders/source.cpp | 1468 + .../src/mbgl/shaders/source.hpp | 11 + .../src/mbgl/shaders/symbol_icon.cpp | 14 + .../src/mbgl/shaders/symbol_icon.hpp | 16 + .../src/mbgl/shaders/symbol_sdf.cpp | 14 + .../src/mbgl/shaders/symbol_sdf.hpp | 16 + .../src/mbgl/sprite/sprite_loader.cpp | 104 + .../src/mbgl/sprite/sprite_loader.hpp | 44 + .../mbgl/sprite/sprite_loader_observer.hpp | 21 + .../src/mbgl/sprite/sprite_loader_worker.cpp | 29 + .../src/mbgl/sprite/sprite_loader_worker.hpp | 23 + .../src/mbgl/sprite/sprite_parser.cpp | 123 + .../src/mbgl/sprite/sprite_parser.hpp | 28 + .../src/mbgl/storage/asset_file_source.hpp | 26 + .../src/mbgl/storage/http_file_source.hpp | 22 + .../src/mbgl/storage/local_file_source.hpp | 26 + .../src/mbgl/storage/network_status.cpp | 54 + .../src/mbgl/storage/resource.cpp | 140 + .../src/mbgl/storage/resource_transform.cpp | 13 + .../src/mbgl/storage/response.cpp | 50 + .../src/mbgl/style/collection.hpp | 141 + .../src/mbgl/style/conversion/constant.cpp | 94 + .../src/mbgl/style/conversion/coordinate.cpp | 29 + .../src/mbgl/style/conversion/filter.cpp | 242 + .../src/mbgl/style/conversion/function.cpp | 724 + .../src/mbgl/style/conversion/geojson.cpp | 18 + .../mbgl/style/conversion/geojson_options.cpp | 85 + .../mbgl/style/conversion/get_json_type.cpp | 34 + .../src/mbgl/style/conversion/json.hpp | 28 + .../src/mbgl/style/conversion/layer.cpp | 232 + .../src/mbgl/style/conversion/light.cpp | 115 + .../conversion/make_property_setters.hpp | 239 + .../conversion/make_property_setters.hpp.ejs | 46 + .../src/mbgl/style/conversion/position.cpp | 22 + .../mbgl/style/conversion/property_setter.hpp | 72 + .../src/mbgl/style/conversion/source.cpp | 200 + .../src/mbgl/style/conversion/stringify.hpp | 173 + .../src/mbgl/style/conversion/tileset.cpp | 117 + .../style/conversion/transition_options.cpp | 40 + .../src/mbgl/style/custom_tile_loader.cpp | 116 + .../src/mbgl/style/custom_tile_loader.hpp | 45 + .../mbgl/style/expression/array_assertion.cpp | 105 + .../src/mbgl/style/expression/assertion.cpp | 96 + .../src/mbgl/style/expression/at.cpp | 70 + .../style/expression/boolean_operator.cpp | 97 + .../src/mbgl/style/expression/case.cpp | 105 + .../mbgl/style/expression/check_subtype.cpp | 60 + .../src/mbgl/style/expression/coalesce.cpp | 85 + .../src/mbgl/style/expression/coercion.cpp | 163 + .../style/expression/collator_expression.cpp | 121 + .../style/expression/compound_expression.cpp | 806 + .../src/mbgl/style/expression/dsl.cpp | 183 + .../src/mbgl/style/expression/equals.cpp | 113 + .../src/mbgl/style/expression/expression.cpp | 38 + .../mbgl/style/expression/find_zoom_curve.cpp | 99 + .../style/expression/get_covering_stops.cpp | 26 + .../src/mbgl/style/expression/interpolate.cpp | 313 + .../src/mbgl/style/expression/is_constant.cpp | 55 + .../mbgl/style/expression/is_expression.cpp | 29 + .../src/mbgl/style/expression/length.cpp | 67 + .../src/mbgl/style/expression/let.cpp | 115 + .../src/mbgl/style/expression/literal.cpp | 115 + .../src/mbgl/style/expression/match.cpp | 328 + .../mbgl/style/expression/parsing_context.cpp | 259 + .../src/mbgl/style/expression/step.cpp | 198 + .../src/mbgl/style/expression/util.cpp | 37 + .../src/mbgl/style/expression/util.hpp | 14 + .../src/mbgl/style/expression/value.cpp | 324 + .../src/mbgl/style/filter.cpp | 21 + .../mapbox-gl-native/src/mbgl/style/image.cpp | 34 + .../src/mbgl/style/image_impl.cpp | 24 + .../src/mbgl/style/image_impl.hpp | 33 + .../mapbox-gl-native/src/mbgl/style/layer.cpp | 42 + .../src/mbgl/style/layer_impl.cpp | 13 + .../src/mbgl/style/layer_impl.hpp | 58 + .../src/mbgl/style/layer_observer.hpp | 16 + .../mbgl/style/layers/background_layer.cpp | 153 + .../style/layers/background_layer_impl.cpp | 11 + .../style/layers/background_layer_impl.hpp | 21 + .../layers/background_layer_properties.cpp | 9 + .../layers/background_layer_properties.hpp | 34 + .../src/mbgl/style/layers/circle_layer.cpp | 397 + .../mbgl/style/layers/circle_layer_impl.cpp | 15 + .../mbgl/style/layers/circle_layer_impl.hpp | 21 + .../style/layers/circle_layer_properties.cpp | 9 + .../style/layers/circle_layer_properties.hpp | 74 + .../src/mbgl/style/layers/custom_layer.cpp | 59 + .../mbgl/style/layers/custom_layer_impl.cpp | 20 + .../mbgl/style/layers/custom_layer_impl.hpp | 26 + .../style/layers/fill_extrusion_layer.cpp | 289 + .../layers/fill_extrusion_layer_impl.cpp | 15 + .../layers/fill_extrusion_layer_impl.hpp | 21 + .../fill_extrusion_layer_properties.cpp | 9 + .../fill_extrusion_layer_properties.hpp | 54 + .../src/mbgl/style/layers/fill_layer.cpp | 289 + .../src/mbgl/style/layers/fill_layer_impl.cpp | 15 + .../src/mbgl/style/layers/fill_layer_impl.hpp | 21 + .../style/layers/fill_layer_properties.cpp | 9 + .../style/layers/fill_layer_properties.hpp | 54 + .../src/mbgl/style/layers/heatmap_layer.cpp | 241 + .../mbgl/style/layers/heatmap_layer_impl.cpp | 15 + .../mbgl/style/layers/heatmap_layer_impl.hpp | 21 + .../style/layers/heatmap_layer_properties.cpp | 9 + .../style/layers/heatmap_layer_properties.hpp | 42 + .../src/mbgl/style/layers/hillshade_layer.cpp | 240 + .../style/layers/hillshade_layer_impl.cpp | 11 + .../style/layers/hillshade_layer_impl.hpp | 21 + .../layers/hillshade_layer_properties.cpp | 9 + .../layers/hillshade_layer_properties.hpp | 49 + .../src/mbgl/style/layers/layer.cpp.ejs | 179 + .../style/layers/layer_properties.cpp.ejs | 14 + .../style/layers/layer_properties.hpp.ejs | 54 + .../src/mbgl/style/layers/line_layer.cpp | 435 + .../src/mbgl/style/layers/line_layer_impl.cpp | 16 + .../src/mbgl/style/layers/line_layer_impl.hpp | 22 + .../style/layers/line_layer_properties.cpp | 9 + .../style/layers/line_layer_properties.hpp | 96 + .../src/mbgl/style/layers/raster_layer.cpp | 294 + .../mbgl/style/layers/raster_layer_impl.cpp | 11 + .../mbgl/style/layers/raster_layer_impl.hpp | 21 + .../style/layers/raster_layer_properties.cpp | 9 + .../style/layers/raster_layer_properties.hpp | 59 + .../src/mbgl/style/layers/symbol_layer.cpp | 1055 + .../mbgl/style/layers/symbol_layer_impl.cpp | 16 + .../mbgl/style/layers/symbol_layer_impl.hpp | 22 + .../style/layers/symbol_layer_properties.cpp | 9 + .../style/layers/symbol_layer_properties.hpp | 308 + .../src/mbgl/style/layout_property.hpp | 34 + .../mapbox-gl-native/src/mbgl/style/light.cpp | 133 + .../src/mbgl/style/light.cpp.ejs | 60 + .../src/mbgl/style/light_impl.cpp | 7 + .../src/mbgl/style/light_impl.hpp | 59 + .../src/mbgl/style/light_observer.hpp | 16 + .../src/mbgl/style/observer.hpp | 20 + .../src/mbgl/style/paint_property.hpp | 75 + .../src/mbgl/style/parser.cpp | 306 + .../src/mbgl/style/parser.hpp | 62 + .../src/mbgl/style/properties.hpp | 245 + .../src/mbgl/style/rapidjson_conversion.hpp | 125 + .../src/mbgl/style/source.cpp | 40 + .../src/mbgl/style/source_impl.cpp | 12 + .../src/mbgl/style/source_impl.hpp | 33 + .../src/mbgl/style/source_observer.hpp | 23 + .../style/sources/custom_geometry_source.cpp | 45 + .../sources/custom_geometry_source_impl.cpp | 40 + .../sources/custom_geometry_source_impl.hpp | 29 + .../src/mbgl/style/sources/geojson_source.cpp | 82 + .../style/sources/geojson_source_impl.cpp | 86 + .../style/sources/geojson_source_impl.hpp | 37 + .../src/mbgl/style/sources/image_source.cpp | 84 + .../mbgl/style/sources/image_source_impl.cpp | 38 + .../mbgl/style/sources/image_source_impl.hpp | 30 + .../mbgl/style/sources/raster_dem_source.cpp | 19 + .../src/mbgl/style/sources/raster_source.cpp | 82 + .../mbgl/style/sources/raster_source_impl.cpp | 33 + .../mbgl/style/sources/raster_source_impl.hpp | 25 + .../src/mbgl/style/sources/vector_source.cpp | 79 + .../mbgl/style/sources/vector_source_impl.cpp | 27 + .../mbgl/style/sources/vector_source_impl.hpp | 23 + .../mapbox-gl-native/src/mbgl/style/style.cpp | 134 + .../src/mbgl/style/style_impl.cpp | 362 + .../src/mbgl/style/style_impl.hpp | 144 + .../mapbox-gl-native/src/mbgl/style/types.cpp | 110 + .../mapbox-gl-native/src/mbgl/text/bidi.hpp | 32 + .../src/mbgl/text/check_max_angle.cpp | 81 + .../src/mbgl/text/check_max_angle.hpp | 15 + .../src/mbgl/text/collision_feature.cpp | 141 + .../src/mbgl/text/collision_feature.hpp | 101 + .../src/mbgl/text/collision_index.cpp | 339 + .../src/mbgl/text/collision_index.hpp | 69 + .../src/mbgl/text/cross_tile_symbol_index.cpp | 224 + .../src/mbgl/text/cross_tile_symbol_index.hpp | 71 + .../src/mbgl/text/get_anchors.cpp | 176 + .../src/mbgl/text/get_anchors.hpp | 30 + .../mapbox-gl-native/src/mbgl/text/glyph.cpp | 14 + .../mapbox-gl-native/src/mbgl/text/glyph.hpp | 117 + .../src/mbgl/text/glyph_atlas.cpp | 65 + .../src/mbgl/text/glyph_atlas.hpp | 25 + .../src/mbgl/text/glyph_manager.cpp | 156 + .../src/mbgl/text/glyph_manager.hpp | 73 + .../src/mbgl/text/glyph_manager_observer.hpp | 19 + .../src/mbgl/text/glyph_pbf.cpp | 94 + .../src/mbgl/text/glyph_pbf.hpp | 13 + .../src/mbgl/text/glyph_range.hpp | 23 + .../src/mbgl/text/language_tag.cpp | 237 + .../src/mbgl/text/language_tag.hpp | 44 + .../src/mbgl/text/local_glyph_rasterizer.hpp | 46 + .../src/mbgl/text/placement.cpp | 384 + .../src/mbgl/text/placement.hpp | 108 + .../mapbox-gl-native/src/mbgl/text/quads.cpp | 176 + .../mapbox-gl-native/src/mbgl/text/quads.hpp | 53 + .../src/mbgl/text/shaping.cpp | 349 + .../src/mbgl/text/shaping.hpp | 60 + .../src/mbgl/tile/custom_geometry_tile.cpp | 90 + .../src/mbgl/tile/custom_geometry_tile.hpp | 44 + .../src/mbgl/tile/geojson_tile.cpp | 42 + .../src/mbgl/tile/geojson_tile.hpp | 24 + .../src/mbgl/tile/geojson_tile_data.hpp | 94 + .../src/mbgl/tile/geometry_tile.cpp | 299 + .../src/mbgl/tile/geometry_tile.hpp | 139 + .../src/mbgl/tile/geometry_tile_data.cpp | 183 + .../src/mbgl/tile/geometry_tile_data.hpp | 151 + .../src/mbgl/tile/geometry_tile_worker.cpp | 490 + .../src/mbgl/tile/geometry_tile_worker.hpp | 98 + .../src/mbgl/tile/raster_dem_tile.cpp | 125 + .../src/mbgl/tile/raster_dem_tile.hpp | 105 + .../src/mbgl/tile/raster_dem_tile_worker.cpp | 27 + .../src/mbgl/tile/raster_dem_tile_worker.hpp | 23 + .../src/mbgl/tile/raster_tile.cpp | 81 + .../src/mbgl/tile/raster_tile.hpp | 52 + .../src/mbgl/tile/raster_tile_worker.cpp | 27 + .../src/mbgl/tile/raster_tile_worker.hpp | 22 + .../mapbox-gl-native/src/mbgl/tile/tile.cpp | 51 + .../mapbox-gl-native/src/mbgl/tile/tile.hpp | 138 + .../src/mbgl/tile/tile_cache.cpp | 75 + .../src/mbgl/tile/tile_cache.hpp | 32 + .../src/mbgl/tile/tile_id_hash.cpp | 29 + .../src/mbgl/tile/tile_id_io.cpp | 43 + .../src/mbgl/tile/tile_loader.hpp | 57 + .../src/mbgl/tile/tile_loader_impl.hpp | 123 + .../src/mbgl/tile/tile_observer.hpp | 17 + .../src/mbgl/tile/vector_tile.cpp | 28 + .../src/mbgl/tile/vector_tile.hpp | 26 + .../src/mbgl/tile/vector_tile_data.cpp | 89 + .../src/mbgl/tile/vector_tile_data.hpp | 54 + .../mapbox-gl-native/src/mbgl/util/chrono.cpp | 50 + .../src/mbgl/util/clip_id.cpp | 11 + .../src/mbgl/util/clip_id.hpp | 34 + .../mapbox-gl-native/src/mbgl/util/color.cpp | 47 + .../src/mbgl/util/compression.cpp | 104 + .../src/mbgl/util/constants.cpp | 33 + .../src/mbgl/util/convert.cpp | 11 + .../mapbox-gl-native/src/mbgl/util/dtoa.cpp | 121 + .../mapbox-gl-native/src/mbgl/util/dtoa.hpp | 11 + .../mapbox-gl-native/src/mbgl/util/event.cpp | 35 + .../src/mbgl/util/font_stack.cpp | 16 + .../mapbox-gl-native/src/mbgl/util/geo.cpp | 124 + .../src/mbgl/util/geojson_impl.cpp | 1 + .../src/mbgl/util/grid_index.cpp | 303 + .../src/mbgl/util/grid_index.hpp | 106 + .../src/mbgl/util/http_header.cpp | 61 + .../src/mbgl/util/http_header.hpp | 25 + .../src/mbgl/util/http_timeout.cpp | 43 + .../src/mbgl/util/http_timeout.hpp | 15 + .../mapbox-gl-native/src/mbgl/util/i18n.cpp | 620 + .../mapbox-gl-native/src/mbgl/util/i18n.hpp | 80 + .../src/mbgl/util/interpolate.cpp | 22 + .../src/mbgl/util/intersection_tests.cpp | 137 + .../src/mbgl/util/intersection_tests.hpp | 15 + .../mapbox-gl-native/src/mbgl/util/io.cpp | 68 + .../mapbox-gl-native/src/mbgl/util/io.hpp | 24 + .../src/mbgl/util/logging.cpp | 73 + .../mbgl/util/longest_common_subsequence.hpp | 106 + .../mapbox-gl-native/src/mbgl/util/mapbox.cpp | 187 + .../mapbox-gl-native/src/mbgl/util/mapbox.hpp | 31 + .../mapbox-gl-native/src/mbgl/util/mat2.cpp | 54 + .../mapbox-gl-native/src/mbgl/util/mat2.hpp | 38 + .../mapbox-gl-native/src/mbgl/util/mat3.cpp | 105 + .../mapbox-gl-native/src/mbgl/util/mat3.hpp | 43 + .../mapbox-gl-native/src/mbgl/util/mat4.cpp | 348 + .../mapbox-gl-native/src/mbgl/util/mat4.hpp | 49 + .../mapbox-gl-native/src/mbgl/util/math.hpp | 123 + .../src/mbgl/util/offscreen_texture.cpp | 98 + .../src/mbgl/util/offscreen_texture.hpp | 38 + .../src/mbgl/util/premultiply.cpp | 53 + .../src/mbgl/util/rapidjson.hpp | 11 + .../mapbox-gl-native/src/mbgl/util/rect.hpp | 24 + .../mapbox-gl-native/src/mbgl/util/std.hpp | 27 + .../src/mbgl/util/stopwatch.cpp | 41 + .../src/mbgl/util/stopwatch.hpp | 53 + .../mapbox-gl-native/src/mbgl/util/string.cpp | 20 + .../src/mbgl/util/thread_local.hpp | 30 + .../src/mbgl/util/tile_coordinate.hpp | 49 + .../src/mbgl/util/tile_cover.cpp | 253 + .../src/mbgl/util/tile_cover.hpp | 45 + .../src/mbgl/util/tile_cover_impl.cpp | 356 + .../src/mbgl/util/tile_cover_impl.hpp | 106 + .../src/mbgl/util/tile_range.hpp | 67 + .../src/mbgl/util/tiny_sdf.cpp | 105 + .../src/mbgl/util/tiny_sdf.hpp | 20 + .../mapbox-gl-native/src/mbgl/util/token.hpp | 50 + .../mapbox-gl-native/src/mbgl/util/url.cpp | 167 + .../mapbox-gl-native/src/mbgl/util/url.hpp | 54 + .../mapbox-gl-native/src/mbgl/util/utf.hpp | 14 + .../src/mbgl/util/version.cpp | 9 + .../src/mbgl/util/version.hpp | 9 + .../src/mbgl/util/work_request.cpp | 17 + .../src/parsedate/parsedate.cpp | 689 + .../src/parsedate/parsedate.hpp | 38 + .../mapbox-gl-native/vendor/nunicode/LICENSE | 19 + .../vendor/nunicode/files.txt | 20 + .../vendor/nunicode/include/libnu/casemap.h | 140 + .../nunicode/include/libnu/casemap_internal.h | 21 + .../vendor/nunicode/include/libnu/config.h | 201 + .../vendor/nunicode/include/libnu/defines.h | 43 + .../vendor/nunicode/include/libnu/ducet.h | 37 + .../vendor/nunicode/include/libnu/mph.h | 71 + .../vendor/nunicode/include/libnu/strcoll.h | 199 + .../nunicode/include/libnu/strcoll_internal.h | 232 + .../vendor/nunicode/include/libnu/strings.h | 142 + .../vendor/nunicode/include/libnu/udb.h | 81 + .../vendor/nunicode/include/libnu/unaccent.h | 57 + .../vendor/nunicode/include/libnu/utf8.h | 130 + .../nunicode/include/libnu/utf8_internal.h | 168 + .../vendor/nunicode/src/libnu/ducet.c | 65 + .../vendor/nunicode/src/libnu/gen/_ducet.c | 6197 ++ .../nunicode/src/libnu/gen/_ducet_switch.c | 1216 + .../vendor/nunicode/src/libnu/gen/_tolower.c | 846 + .../nunicode/src/libnu/gen/_tounaccent.c | 460 + .../vendor/nunicode/src/libnu/gen/_toupper.c | 917 + .../vendor/nunicode/src/libnu/strcoll.c | 452 + .../vendor/nunicode/src/libnu/strings.c | 89 + .../vendor/nunicode/src/libnu/tolower.c | 58 + .../vendor/nunicode/src/libnu/tounaccent.c | 57 + .../vendor/nunicode/src/libnu/toupper.c | 32 + .../vendor/nunicode/src/libnu/utf8.c | 97 + .../vendor/nunicode/version.txt | 1 + src/3rdparty/poly2tri/AUTHORS | 8 + src/3rdparty/poly2tri/LICENSE | 27 + src/3rdparty/poly2tri/common/shapes.cpp | 363 + src/3rdparty/poly2tri/common/shapes.h | 325 + src/3rdparty/poly2tri/common/utils.h | 127 + src/3rdparty/poly2tri/poly2tri.h | 39 + src/3rdparty/poly2tri/poly2tri.pro | 27 + src/3rdparty/poly2tri/qt_attribution.json | 13 + .../poly2tri/sweep/advancing_front.cpp | 109 + src/3rdparty/poly2tri/sweep/advancing_front.h | 118 + src/3rdparty/poly2tri/sweep/cdt.cpp | 72 + src/3rdparty/poly2tri/sweep/cdt.h | 105 + src/3rdparty/poly2tri/sweep/sweep.cpp | 814 + src/3rdparty/poly2tri/sweep/sweep.h | 285 + src/3rdparty/poly2tri/sweep/sweep_context.cpp | 216 + src/3rdparty/poly2tri/sweep/sweep_context.h | 186 + src/3rdparty/zlib_dependency.pri | 6 + src/imports/imports.pro | 7 + src/imports/location/location.cpp | 237 + src/imports/location/location.pro | 10 + src/imports/location/plugin.json | 2 + src/imports/location/plugins.qmltypes | 1844 + src/imports/location/qmldir | 4 + src/imports/locationlabs/locationlabs.cpp | 97 + src/imports/locationlabs/locationlabs.pro | 20 + .../locationlabs/locationlabssingleton.cpp | 81 + .../locationlabs/locationlabssingleton_p.h | 68 + src/imports/locationlabs/plugin.json | 2 + src/imports/locationlabs/plugins.qmltypes | 252 + src/imports/locationlabs/qmldir | 4 + src/imports/positioning/locationsingleton.cpp | 386 + src/imports/positioning/locationsingleton.h | 105 + src/imports/positioning/plugin.json | 2 + src/imports/positioning/plugins.qmltypes | 316 + src/imports/positioning/positioning.cpp | 632 + src/imports/positioning/positioning.pro | 12 + src/imports/positioning/qmldir | 4 + src/location/configure.json | 79 + .../declarativemaps/declarativemaps.pri | 72 + .../declarativemaps/error_messages.cpp | 52 + .../declarativemaps/error_messages_p.h | 67 + .../locationvaluetypehelper.cpp | 190 + .../locationvaluetypehelper_p.h | 64 + .../qdeclarativecirclemapitem.cpp | 733 + .../qdeclarativecirclemapitem_p.h | 142 + .../qdeclarativecirclemapitem_p_p.h | 451 + .../qdeclarativegeocodemodel.cpp | 734 + .../qdeclarativegeocodemodel_p.h | 207 + .../qdeclarativegeomaneuver.cpp | 229 + .../qdeclarativegeomaneuver_p.h | 118 + .../declarativemaps/qdeclarativegeomap.cpp | 2692 + .../declarativemaps/qdeclarativegeomap_p.h | 347 + .../qdeclarativegeomapcopyrightsnotice.cpp | 374 + .../qdeclarativegeomapcopyrightsnotice_p.h | 123 + .../qdeclarativegeomapitembase.cpp | 361 + .../qdeclarativegeomapitembase_p.h | 177 + .../qdeclarativegeomapitemgroup.cpp | 217 + .../qdeclarativegeomapitemgroup_p.h | 97 + ...declarativegeomapitemtransitionmanager.cpp | 81 + ...declarativegeomapitemtransitionmanager_p.h | 120 + .../qdeclarativegeomapitemutils.cpp | 180 + .../qdeclarativegeomapitemutils_p.h | 122 + .../qdeclarativegeomapitemview.cpp | 577 + .../qdeclarativegeomapitemview_p.h | 163 + .../qdeclarativegeomapparameter.cpp | 154 + .../qdeclarativegeomapparameter_p.h | 90 + .../qdeclarativegeomapquickitem.cpp | 485 + .../qdeclarativegeomapquickitem_p.h | 137 + .../qdeclarativegeomaptype.cpp | 247 + .../qdeclarativegeomaptype_p.h | 135 + .../declarativemaps/qdeclarativegeoroute.cpp | 456 + .../declarativemaps/qdeclarativegeoroute_p.h | 142 + .../qdeclarativegeoroutemodel.cpp | 1947 + .../qdeclarativegeoroutemodel_p.h | 473 + .../qdeclarativegeoroutesegment.cpp | 164 + .../qdeclarativegeoroutesegment_p.h | 86 + .../qdeclarativegeoserviceprovider.cpp | 922 + .../qdeclarativegeoserviceprovider_p.h | 281 + .../qdeclarativepolygonmapitem.cpp | 1071 + .../qdeclarativepolygonmapitem_p.h | 137 + .../qdeclarativepolygonmapitem_p_p.h | 674 + .../qdeclarativepolylinemapitem.cpp | 2102 + .../qdeclarativepolylinemapitem_p.h | 175 + .../qdeclarativepolylinemapitem_p_p.h | 893 + .../qdeclarativerectanglemapitem.cpp | 413 + .../qdeclarativerectanglemapitem_p.h | 143 + .../qdeclarativerectanglemapitem_p_p.h | 419 + .../qdeclarativeroutemapitem.cpp | 148 + .../qdeclarativeroutemapitem_p.h | 92 + .../declarativemaps/qgeomapitemgeometry.cpp | 145 + .../declarativemaps/qgeomapitemgeometry_p.h | 162 + .../declarativemaps/qgeomapobject.cpp | 309 + .../declarativemaps/qgeomapobject_p.h | 142 + .../declarativemaps/qgeomapobject_p_p.h | 97 + src/location/declarativemaps/qgeosimplify.cpp | 313 + src/location/declarativemaps/qgeosimplify_p.h | 147 + .../qparameterizableobject.cpp | 121 + .../qparameterizableobject_p.h | 97 + .../qquickgeomapgesturearea.cpp | 1891 + .../qquickgeomapgesturearea_p.h | 399 + .../declarativeplaces/declarativeplaces.pri | 51 + .../qdeclarativecategory.cpp | 458 + .../qdeclarativecategory_p.h | 153 + .../qdeclarativecontactdetail.cpp | 223 + .../qdeclarativecontactdetail_p.h | 104 + .../declarativeplaces/qdeclarativeperiod_p.h | 98 + .../declarativeplaces/qdeclarativeplace.cpp | 1229 + .../declarativeplaces/qdeclarativeplace_p.h | 262 + .../qdeclarativeplaceattribute.cpp | 221 + .../qdeclarativeplaceattribute_p.h | 95 + .../qdeclarativeplacecontentmodel.cpp | 392 + .../qdeclarativeplacecontentmodel_p.h | 137 + .../qdeclarativeplaceeditorialmodel.cpp | 169 + .../qdeclarativeplaceeditorialmodel_p.h | 76 + .../qdeclarativeplaceicon.cpp | 250 + .../qdeclarativeplaceicon_p.h | 104 + .../qdeclarativeplaceimagemodel.cpp | 170 + .../qdeclarativeplaceimagemodel_p.h | 78 + .../qdeclarativeplaceuser.cpp | 139 + .../qdeclarativeplaceuser_p.h | 92 + .../declarativeplaces/qdeclarativeratings.cpp | 153 + .../declarativeplaces/qdeclarativeratings_p.h | 98 + .../qdeclarativereviewmodel.cpp | 183 + .../qdeclarativereviewmodel_p.h | 78 + .../qdeclarativesearchmodelbase.cpp | 391 + .../qdeclarativesearchmodelbase_p.h | 160 + .../qdeclarativesearchresultmodel.cpp | 1012 + .../qdeclarativesearchresultmodel_p.h | 188 + .../qdeclarativesearchsuggestionmodel.cpp | 353 + .../qdeclarativesearchsuggestionmodel_p.h | 104 + .../qdeclarativesupplier.cpp | 221 + .../qdeclarativesupplier_p.h | 111 + .../qdeclarativesupportedcategoriesmodel.cpp | 708 + .../qdeclarativesupportedcategoriesmodel_p.h | 166 + src/location/doc/images/api-mapcircle.png | Bin 0 -> 11336 bytes src/location/doc/images/api-mapitemgroup.png | Bin 0 -> 26089 bytes src/location/doc/images/api-mappolygon.png | Bin 0 -> 42391 bytes src/location/doc/images/api-mappolyline.png | Bin 0 -> 101623 bytes .../doc/images/api-mapquickitem-anchor.png | Bin 0 -> 61695 bytes src/location/doc/images/api-mapquickitem.png | Bin 0 -> 23147 bytes src/location/doc/images/api-maprectangle.png | Bin 0 -> 38249 bytes src/location/doc/images/mapsdemo-finished.png | Bin 0 -> 65434 bytes src/location/doc/images/mapsdemo-routing.png | Bin 0 -> 55176 bytes .../doc/images/mapsdemo-searchgui.png | Bin 0 -> 80027 bytes .../doc/images/mapsdemo-verybasic.png | Bin 0 -> 63947 bytes src/location/doc/qtlocation.qdocconf | 57 + src/location/doc/snippets/cpp/cpp.pro | 8 + src/location/doc/snippets/cpp/cppqml.cpp | 128 + src/location/doc/snippets/cpp/main.cpp | 55 + .../doc/snippets/declarative/content/Cell.qml | 78 + .../declarative/declarative-location.qml | 95 + .../doc/snippets/declarative/declarative.pro | 18 + .../doc/snippets/declarative/maps.qml | 110 + .../doc/snippets/declarative/marker.png | Bin 0 -> 1855 bytes .../doc/snippets/declarative/nmealog.txt | 1403 + .../doc/snippets/declarative/places.qml | 463 + .../snippets/declarative/places_loader.qml | 118 + .../doc/snippets/declarative/plugin.qml | 68 + .../doc/snippets/declarative/routing.qml | 121 + src/location/doc/snippets/places/main.cpp | 57 + src/location/doc/snippets/places/places.pro | 5 + .../doc/snippets/places/requesthandler.h | 590 + src/location/doc/snippets/snippets.pro | 2 + src/location/doc/src/cpp-qml.qdoc | 115 + .../doc/src/example-parameters.qdocinc | 12 + src/location/doc/src/maps.qdoc | 250 + src/location/doc/src/place-caveats.qdocinc | 21 + src/location/doc/src/place-crossref.qdocinc | 7 + src/location/doc/src/place-definition.qdocinc | 27 + src/location/doc/src/places.qdoc | 433 + src/location/doc/src/plugins/esri.qdoc | 230 + .../doc/src/plugins/itemsoverlay.qdoc | 109 + src/location/doc/src/plugins/mapbox.qdoc | 171 + src/location/doc/src/plugins/mapboxgl.qdoc | 277 + src/location/doc/src/plugins/nokia.qdoc | 329 + src/location/doc/src/plugins/osm.qdoc | 234 + .../doc/src/plugins/places-backend.qdoc | 151 + src/location/doc/src/qml-maps.qdoc | 229 + src/location/doc/src/qtlocation-changes.qdoc | 77 + src/location/doc/src/qtlocation-cpp.qdoc | 89 + src/location/doc/src/qtlocation-examples.qdoc | 45 + .../doc/src/qtlocation-geoservices.qdoc | 92 + src/location/doc/src/qtlocation-qml.qdoc | 128 + src/location/doc/src/qtlocation.qdoc | 207 + src/location/doc/src/src.pro | 9 + src/location/labs/labs.pri | 5 + src/location/labs/qdeclarativenavigator.cpp | 774 + src/location/labs/qdeclarativenavigator_p.h | 185 + src/location/labs/qdeclarativenavigator_p_p.h | 207 + src/location/labs/qgeojson.cpp | 1242 + src/location/labs/qgeojson_p.h | 81 + src/location/labs/qgeotiledmaplabs.cpp | 208 + src/location/labs/qgeotiledmaplabs_p.h | 91 + src/location/labs/qmapcircleobject.cpp | 310 + src/location/labs/qmapcircleobject_p.h | 93 + src/location/labs/qmapcircleobject_p_p.h | 119 + src/location/labs/qmapiconobject.cpp | 273 + src/location/labs/qmapiconobject_p.h | 88 + src/location/labs/qmapiconobject_p_p.h | 108 + src/location/labs/qmapobjectview.cpp | 461 + src/location/labs/qmapobjectview_p.h | 115 + src/location/labs/qmapobjectview_p_p.h | 101 + src/location/labs/qmappolygonobject.cpp | 290 + src/location/labs/qmappolygonobject_p.h | 90 + src/location/labs/qmappolygonobject_p_p.h | 117 + src/location/labs/qmappolylineobject.cpp | 237 + src/location/labs/qmappolylineobject_p.h | 85 + src/location/labs/qmappolylineobject_p_p.h | 110 + src/location/labs/qmaprouteobject.cpp | 190 + src/location/labs/qmaprouteobject_p.h | 90 + src/location/labs/qmaprouteobject_p_p.h | 81 + .../labs/qsg/qgeomapobjectqsgsupport.cpp | 243 + .../labs/qsg/qgeomapobjectqsgsupport_p.h | 94 + src/location/labs/qsg/qmapcircleobjectqsg.cpp | 386 + .../labs/qsg/qmapcircleobjectqsg_p_p.h | 137 + src/location/labs/qsg/qmapiconobjectqsg.cpp | 224 + src/location/labs/qsg/qmapiconobjectqsg_p_p.h | 97 + .../labs/qsg/qmappolygonobjectqsg.cpp | 222 + .../labs/qsg/qmappolygonobjectqsg_p_p.h | 98 + .../labs/qsg/qmappolylineobjectqsg.cpp | 205 + .../labs/qsg/qmappolylineobjectqsg_p_p.h | 98 + src/location/labs/qsg/qmaprouteobjectqsg.cpp | 108 + .../labs/qsg/qmaprouteobjectqsg_p_p.h | 91 + src/location/labs/qsg/qqsgmapobject.cpp | 68 + src/location/labs/qsg/qqsgmapobject_p.h | 74 + src/location/location.pro | 55 + src/location/maps/maps.pri | 105 + src/location/maps/qabstractgeotilecache.cpp | 153 + src/location/maps/qabstractgeotilecache_p.h | 148 + src/location/maps/qcache3q_p.h | 477 + src/location/maps/qgeocameracapabilities.cpp | 468 + src/location/maps/qgeocameracapabilities_p.h | 114 + src/location/maps/qgeocameradata.cpp | 230 + src/location/maps/qgeocameradata_p.h | 101 + src/location/maps/qgeocameratiles.cpp | 877 + src/location/maps/qgeocameratiles_p.h | 89 + src/location/maps/qgeocameratiles_p_p.h | 152 + src/location/maps/qgeocodereply.cpp | 360 + src/location/maps/qgeocodereply.h | 108 + src/location/maps/qgeocodereply_p.h | 89 + src/location/maps/qgeocodingmanager.cpp | 325 + src/location/maps/qgeocodingmanager.h | 92 + src/location/maps/qgeocodingmanager_p.h | 76 + src/location/maps/qgeocodingmanagerengine.cpp | 334 + src/location/maps/qgeocodingmanagerengine.h | 89 + src/location/maps/qgeocodingmanagerengine_p.h | 75 + src/location/maps/qgeofiletilecache.cpp | 629 + src/location/maps/qgeofiletilecache_p.h | 178 + src/location/maps/qgeomaneuver.cpp | 560 + src/location/maps/qgeomaneuver.h | 111 + src/location/maps/qgeomaneuver_p.h | 149 + src/location/maps/qgeomap.cpp | 492 + src/location/maps/qgeomap_p.h | 190 + src/location/maps/qgeomap_p_p.h | 133 + src/location/maps/qgeomapparameter.cpp | 108 + src/location/maps/qgeomapparameter_p.h | 91 + src/location/maps/qgeomappingmanager.cpp | 189 + src/location/maps/qgeomappingmanager_p.h | 105 + src/location/maps/qgeomappingmanager_p_p.h | 73 + .../maps/qgeomappingmanagerengine.cpp | 213 + .../maps/qgeomappingmanagerengine_p.h | 125 + .../maps/qgeomappingmanagerengine_p_p.h | 87 + src/location/maps/qgeomaptype.cpp | 157 + src/location/maps/qgeomaptype_p.h | 108 + src/location/maps/qgeomaptype_p_p.h | 91 + src/location/maps/qgeoprojection.cpp | 926 + src/location/maps/qgeoprojection_p.h | 280 + src/location/maps/qgeoroute.cpp | 783 + src/location/maps/qgeoroute.h | 130 + src/location/maps/qgeoroute_p.h | 191 + src/location/maps/qgeorouteparser.cpp | 104 + src/location/maps/qgeorouteparser_p.h | 92 + src/location/maps/qgeorouteparser_p_p.h | 73 + src/location/maps/qgeorouteparserosrmv4.cpp | 411 + src/location/maps/qgeorouteparserosrmv4_p.h | 72 + src/location/maps/qgeorouteparserosrmv5.cpp | 1078 + src/location/maps/qgeorouteparserosrmv5_p.h | 90 + src/location/maps/qgeoroutereply.cpp | 277 + src/location/maps/qgeoroutereply.h | 96 + src/location/maps/qgeoroutereply_p.h | 80 + src/location/maps/qgeorouterequest.cpp | 556 + src/location/maps/qgeorouterequest.h | 172 + src/location/maps/qgeorouterequest_p.h | 86 + src/location/maps/qgeoroutesegment.cpp | 469 + src/location/maps/qgeoroutesegment.h | 93 + src/location/maps/qgeoroutesegment_p.h | 143 + src/location/maps/qgeoroutingmanager.cpp | 411 + src/location/maps/qgeoroutingmanager.h | 91 + src/location/maps/qgeoroutingmanager_p.h | 69 + .../maps/qgeoroutingmanagerengine.cpp | 423 + src/location/maps/qgeoroutingmanagerengine.h | 100 + .../maps/qgeoroutingmanagerengine_p.h | 83 + src/location/maps/qgeoserviceprovider.cpp | 927 + src/location/maps/qgeoserviceprovider.h | 192 + src/location/maps/qgeoserviceprovider_p.h | 130 + .../maps/qgeoserviceproviderfactory.cpp | 223 + .../maps/qgeoserviceproviderfactory.h | 101 + src/location/maps/qgeotiledmap.cpp | 453 + src/location/maps/qgeotiledmap_p.h | 112 + src/location/maps/qgeotiledmap_p_p.h | 116 + .../maps/qgeotiledmappingmanagerengine.cpp | 329 + .../maps/qgeotiledmappingmanagerengine_p.h | 120 + .../maps/qgeotiledmappingmanagerengine_p_p.h | 84 + src/location/maps/qgeotiledmapreply.cpp | 317 + src/location/maps/qgeotiledmapreply_p.h | 110 + src/location/maps/qgeotiledmapreply_p_p.h | 75 + src/location/maps/qgeotiledmapscene.cpp | 673 + src/location/maps/qgeotiledmapscene_p.h | 99 + src/location/maps/qgeotiledmapscene_p_p.h | 193 + src/location/maps/qgeotilefetcher.cpp | 227 + src/location/maps/qgeotilefetcher_p.h | 105 + src/location/maps/qgeotilefetcher_p_p.h | 90 + src/location/maps/qgeotilerequestmanager.cpp | 245 + src/location/maps/qgeotilerequestmanager_p.h | 81 + src/location/maps/qgeotilespec.cpp | 241 + src/location/maps/qgeotilespec_p.h | 103 + src/location/maps/qgeotilespec_p_p.h | 78 + src/location/maps/qnavigationmanager.cpp | 130 + src/location/maps/qnavigationmanager_p.h | 104 + .../maps/qnavigationmanagerengine.cpp | 216 + .../maps/qnavigationmanagerengine_p.h | 166 + src/location/places/placemacro.h | 71 + src/location/places/places.pri | 94 + src/location/places/qplace.cpp | 811 + src/location/places/qplace.h | 140 + src/location/places/qplace_p.h | 170 + src/location/places/qplaceattribute.cpp | 231 + src/location/places/qplaceattribute.h | 81 + src/location/places/qplaceattribute_p.h | 79 + src/location/places/qplacecategory.cpp | 222 + src/location/places/qplacecategory.h | 91 + src/location/places/qplacecategory_p.h | 78 + src/location/places/qplacecontactdetail.cpp | 211 + src/location/places/qplacecontactdetail.h | 83 + src/location/places/qplacecontactdetail_p.h | 72 + src/location/places/qplacecontent.cpp | 267 + src/location/places/qplacecontent.h | 108 + src/location/places/qplacecontent_p.h | 103 + src/location/places/qplacecontentreply.cpp | 191 + src/location/places/qplacecontentreply.h | 80 + src/location/places/qplacecontentrequest.cpp | 256 + src/location/places/qplacecontentrequest.h | 82 + src/location/places/qplacecontentrequest_p.h | 77 + src/location/places/qplacedetailsreply.cpp | 106 + src/location/places/qplacedetailsreply.h | 67 + src/location/places/qplaceeditorial.cpp | 164 + src/location/places/qplaceeditorial.h | 71 + src/location/places/qplaceeditorial_p.h | 77 + src/location/places/qplaceicon.cpp | 233 + src/location/places/qplaceicon.h | 87 + src/location/places/qplaceicon_p.h | 74 + src/location/places/qplaceidreply.cpp | 132 + src/location/places/qplaceidreply.h | 75 + src/location/places/qplaceimage.cpp | 159 + src/location/places/qplaceimage.h | 77 + src/location/places/qplaceimage_p.h | 78 + src/location/places/qplacemanager.cpp | 489 + src/location/places/qplacemanager.h | 127 + src/location/places/qplacemanagerengine.cpp | 460 + src/location/places/qplacemanagerengine.h | 121 + src/location/places/qplacemanagerengine_p.h | 72 + src/location/places/qplacematchreply.cpp | 135 + src/location/places/qplacematchreply.h | 68 + src/location/places/qplacematchrequest.cpp | 259 + src/location/places/qplacematchrequest.h | 81 + .../places/qplaceproposedsearchresult.cpp | 116 + .../places/qplaceproposedsearchresult.h | 70 + .../places/qplaceproposedsearchresult_p.h | 72 + src/location/places/qplaceratings.cpp | 189 + src/location/places/qplaceratings.h | 82 + src/location/places/qplaceratings_p.h | 74 + src/location/places/qplacereply.cpp | 258 + src/location/places/qplacereply.h | 108 + src/location/places/qplacereply_p.h | 70 + src/location/places/qplaceresult.cpp | 174 + src/location/places/qplaceresult.h | 77 + src/location/places/qplaceresult_p.h | 74 + src/location/places/qplacereview.cpp | 229 + src/location/places/qplacereview.h | 78 + src/location/places/qplacereview_p.h | 80 + src/location/places/qplacesearchreply.cpp | 173 + src/location/places/qplacesearchreply.h | 76 + src/location/places/qplacesearchrequest.cpp | 438 + src/location/places/qplacesearchrequest.h | 109 + src/location/places/qplacesearchrequest_p.h | 92 + src/location/places/qplacesearchresult.cpp | 214 + src/location/places/qplacesearchresult.h | 106 + src/location/places/qplacesearchresult_p.h | 107 + .../places/qplacesearchsuggestionreply.cpp | 109 + .../places/qplacesearchsuggestionreply.h | 68 + src/location/places/qplacesupplier.cpp | 223 + src/location/places/qplacesupplier.h | 85 + src/location/places/qplacesupplier_p.h | 79 + src/location/places/qplaceuser.cpp | 153 + src/location/places/qplaceuser.h | 76 + src/location/places/qplaceuser_p.h | 72 + src/location/places/unsupportedreplies_p.h | 228 + src/location/qlocation.cpp | 78 + src/location/qlocation.h | 65 + src/location/qlocationglobal.h | 60 + src/location/qlocationglobal_p.h | 63 + src/plugins/geoservices/esri/esri.pro | 48 + src/plugins/geoservices/esri/esri.qrc | 5 + src/plugins/geoservices/esri/esri_plugin.json | 14 + .../geoservices/esri/geocodereply_esri.cpp | 206 + .../geoservices/esri/geocodereply_esri.h | 83 + .../esri/geocodingmanagerengine_esri.cpp | 186 + .../esri/geocodingmanagerengine_esri.h | 77 + src/plugins/geoservices/esri/geomapsource.cpp | 105 + src/plugins/geoservices/esri/geomapsource.h | 78 + .../esri/georoutejsonparser_esri.cpp | 246 + .../esri/georoutejsonparser_esri.h | 72 + .../geoservices/esri/georoutereply_esri.cpp | 96 + .../geoservices/esri/georoutereply_esri.h | 63 + .../esri/georoutingmanagerengine_esri.cpp | 190 + .../esri/georoutingmanagerengine_esri.h | 76 + .../esri/geoserviceproviderfactory_esri.cpp | 83 + .../esri/geoserviceproviderfactory_esri.h | 72 + .../geoservices/esri/geotiledmap_esri.cpp | 73 + .../geoservices/esri/geotiledmap_esri.h | 80 + .../geotiledmappingmanagerengine_esri.cpp | 298 + .../esri/geotiledmappingmanagerengine_esri.h | 78 + .../esri/geotiledmapreply_esri.cpp | 105 + .../geoservices/esri/geotiledmapreply_esri.h | 64 + .../geoservices/esri/geotilefetcher_esri.cpp | 77 + .../geoservices/esri/geotilefetcher_esri.h | 93 + src/plugins/geoservices/esri/maps.json | 123 + .../esri/placecategoriesreply_esri.cpp | 65 + .../esri/placecategoriesreply_esri.h | 61 + .../esri/placemanagerengine_esri.cpp | 369 + .../esri/placemanagerengine_esri.h | 109 + .../esri/placesearchreply_esri.cpp | 223 + .../geoservices/esri/placesearchreply_esri.h | 78 + src/plugins/geoservices/geoservices.pro | 18 + .../geoservices/itemsoverlay/itemsoverlay.pro | 24 + .../itemsoverlay/itemsoverlay_plugin.json | 9 + .../itemsoverlay/qgeomapitemsoverlay.cpp | 262 + .../itemsoverlay/qgeomapitemsoverlay.h | 70 + .../qgeomappingmanagerengineitemsoverlay.cpp | 80 + .../qgeomappingmanagerengineitemsoverlay.h | 59 + .../qgeoserviceproviderpluginitemsoverlay.cpp | 78 + .../qgeoserviceproviderpluginitemsoverlay.h | 69 + .../geoservices/mapbox/maki-4.0.0/LICENSE.txt | 116 + .../mapbox/maki-4.0.0/aerialway.svg | 10 + .../mapbox/maki-4.0.0/airfield.svg | 11 + .../geoservices/mapbox/maki-4.0.0/airport.svg | 11 + .../mapbox/maki-4.0.0/alcohol-shop.svg | 12 + .../mapbox/maki-4.0.0/america-football.svg | 10 + .../mapbox/maki-4.0.0/amusement-park.svg | 20 + .../mapbox/maki-4.0.0/aquarium.svg | 12 + .../mapbox/maki-4.0.0/art-gallery.svg | 10 + .../mapbox/maki-4.0.0/attraction.svg | 13 + .../geoservices/mapbox/maki-4.0.0/bakery.svg | 15 + .../geoservices/mapbox/maki-4.0.0/bank.svg | 19 + .../geoservices/mapbox/maki-4.0.0/bar.svg | 11 + .../geoservices/mapbox/maki-4.0.0/barrier.svg | 4 + .../mapbox/maki-4.0.0/baseball.svg | 12 + .../mapbox/maki-4.0.0/basketball.svg | 13 + .../geoservices/mapbox/maki-4.0.0/bbq.svg | 17 + .../geoservices/mapbox/maki-4.0.0/beer.svg | 11 + .../mapbox/maki-4.0.0/bicycle-share.svg | 20 + .../geoservices/mapbox/maki-4.0.0/bicycle.svg | 21 + .../mapbox/maki-4.0.0/blood-bank.svg | 8 + .../mapbox/maki-4.0.0/buddhism.svg | 24 + .../mapbox/maki-4.0.0/building-alt1.svg | 7 + .../mapbox/maki-4.0.0/building.svg | 7 + .../geoservices/mapbox/maki-4.0.0/bus.svg | 13 + .../geoservices/mapbox/maki-4.0.0/cafe.svg | 9 + .../mapbox/maki-4.0.0/campsite.svg | 11 + .../geoservices/mapbox/maki-4.0.0/car.svg | 10 + .../geoservices/mapbox/maki-4.0.0/castle.svg | 11 + .../mapbox/maki-4.0.0/cemetery.svg | 9 + .../geoservices/mapbox/maki-4.0.0/cinema.svg | 11 + .../mapbox/maki-4.0.0/circle-stroked.svg | 11 + .../geoservices/mapbox/maki-4.0.0/circle.svg | 7 + .../geoservices/mapbox/maki-4.0.0/city.svg | 14 + .../mapbox/maki-4.0.0/clothing-store.svg | 10 + .../geoservices/mapbox/maki-4.0.0/college.svg | 5 + .../mapbox/maki-4.0.0/commercial.svg | 7 + .../geoservices/mapbox/maki-4.0.0/cricket.svg | 14 + .../geoservices/mapbox/maki-4.0.0/cross.svg | 11 + .../geoservices/mapbox/maki-4.0.0/dam.svg | 20 + .../geoservices/mapbox/maki-4.0.0/danger.svg | 18 + .../mapbox/maki-4.0.0/defibrillator.svg | 4 + .../geoservices/mapbox/maki-4.0.0/dentist.svg | 9 + .../geoservices/mapbox/maki-4.0.0/doctor.svg | 13 + .../mapbox/maki-4.0.0/dog-park.svg | 49 + .../mapbox/maki-4.0.0/drinking-water.svg | 5 + .../geoservices/mapbox/maki-4.0.0/embassy.svg | 12 + .../mapbox/maki-4.0.0/emergency-phone.svg | 4 + .../mapbox/maki-4.0.0/entrance-alt1.svg | 4 + .../mapbox/maki-4.0.0/entrance.svg | 11 + .../geoservices/mapbox/maki-4.0.0/farm.svg | 4 + .../mapbox/maki-4.0.0/fast-food.svg | 12 + .../geoservices/mapbox/maki-4.0.0/fence.svg | 4 + .../geoservices/mapbox/maki-4.0.0/ferry.svg | 19 + .../mapbox/maki-4.0.0/fire-station.svg | 12 + .../geoservices/mapbox/maki-4.0.0/florist.svg | 4 + .../geoservices/mapbox/maki-4.0.0/fuel.svg | 12 + .../geoservices/mapbox/maki-4.0.0/gaming.svg | 11 + .../mapbox/maki-4.0.0/garden-center.svg | 5 + .../geoservices/mapbox/maki-4.0.0/garden.svg | 10 + .../geoservices/mapbox/maki-4.0.0/gift.svg | 13 + .../geoservices/mapbox/maki-4.0.0/golf.svg | 13 + .../geoservices/mapbox/maki-4.0.0/grocery.svg | 48 + .../mapbox/maki-4.0.0/hairdresser.svg | 13 + .../geoservices/mapbox/maki-4.0.0/harbor.svg | 14 + .../geoservices/mapbox/maki-4.0.0/heart.svg | 8 + .../mapbox/maki-4.0.0/heliport.svg | 13 + .../geoservices/mapbox/maki-4.0.0/home.svg | 8 + .../mapbox/maki-4.0.0/horse-riding.svg | 4 + .../mapbox/maki-4.0.0/hospital.svg | 10 + .../mapbox/maki-4.0.0/ice-cream.svg | 11 + .../mapbox/maki-4.0.0/industry.svg | 9 + .../mapbox/maki-4.0.0/information.svg | 11 + .../geoservices/mapbox/maki-4.0.0/karaoke.svg | 7 + .../mapbox/maki-4.0.0/landmark.svg | 9 + .../geoservices/mapbox/maki-4.0.0/landuse.svg | 4 + .../geoservices/mapbox/maki-4.0.0/laundry.svg | 11 + .../geoservices/mapbox/maki-4.0.0/library.svg | 15 + .../mapbox/maki-4.0.0/lighthouse.svg | 9 + .../geoservices/mapbox/maki-4.0.0/lodging.svg | 12 + .../geoservices/mapbox/maki-4.0.0/logging.svg | 4 + .../mapbox/maki-4.0.0/marker-stroked.svg | 4 + .../geoservices/mapbox/maki-4.0.0/marker.svg | 10 + .../mapbox/maki-4.0.0/mobile-phone.svg | 4 + .../mapbox/maki-4.0.0/monument.svg | 10 + .../mapbox/maki-4.0.0/mountain.svg | 11 + .../geoservices/mapbox/maki-4.0.0/museum.svg | 14 + .../geoservices/mapbox/maki-4.0.0/music.svg | 9 + .../geoservices/mapbox/maki-4.0.0/natural.svg | 4 + .../mapbox/maki-4.0.0/park-alt1.svg | 4 + .../geoservices/mapbox/maki-4.0.0/park.svg | 15 + .../mapbox/maki-4.0.0/parking-garage.svg | 12 + .../geoservices/mapbox/maki-4.0.0/parking.svg | 10 + .../mapbox/maki-4.0.0/pharmacy.svg | 9 + .../mapbox/maki-4.0.0/picnic-site.svg | 13 + .../geoservices/mapbox/maki-4.0.0/pitch.svg | 9 + .../mapbox/maki-4.0.0/place-of-worship.svg | 11 + .../mapbox/maki-4.0.0/playground.svg | 16 + .../geoservices/mapbox/maki-4.0.0/police.svg | 12 + .../geoservices/mapbox/maki-4.0.0/post.svg | 10 + .../geoservices/mapbox/maki-4.0.0/prison.svg | 11 + .../mapbox/maki-4.0.0/rail-light.svg | 12 + .../mapbox/maki-4.0.0/rail-metro.svg | 13 + .../geoservices/mapbox/maki-4.0.0/rail.svg | 49 + .../mapbox/maki-4.0.0/ranger-station.svg | 10 + .../mapbox/maki-4.0.0/recycling.svg | 10 + .../mapbox/maki-4.0.0/religious-christian.svg | 10 + .../mapbox/maki-4.0.0/religious-jewish.svg | 7 + .../mapbox/maki-4.0.0/religious-muslim.svg | 12 + .../maki-4.0.0/residential-community.svg | 8 + .../mapbox/maki-4.0.0/restaurant.svg | 12 + .../mapbox/maki-4.0.0/roadblock.svg | 7 + .../geoservices/mapbox/maki-4.0.0/rocket.svg | 13 + .../geoservices/mapbox/maki-4.0.0/school.svg | 7 + .../geoservices/mapbox/maki-4.0.0/scooter.svg | 4 + .../geoservices/mapbox/maki-4.0.0/shelter.svg | 7 + .../geoservices/mapbox/maki-4.0.0/shop.svg | 12 + .../geoservices/mapbox/maki-4.0.0/skiing.svg | 11 + .../mapbox/maki-4.0.0/slaughterhouse.svg | 4 + .../mapbox/maki-4.0.0/snowmobile.svg | 4 + .../geoservices/mapbox/maki-4.0.0/soccer.svg | 12 + .../mapbox/maki-4.0.0/square-stroked.svg | 8 + .../geoservices/mapbox/maki-4.0.0/square.svg | 7 + .../geoservices/mapbox/maki-4.0.0/stadium.svg | 13 + .../mapbox/maki-4.0.0/star-stroked.svg | 9 + .../geoservices/mapbox/maki-4.0.0/star.svg | 10 + .../mapbox/maki-4.0.0/suitcase.svg | 10 + .../geoservices/mapbox/maki-4.0.0/sushi.svg | 19 + .../mapbox/maki-4.0.0/swimming.svg | 13 + .../mapbox/maki-4.0.0/teahouse.svg | 8 + .../mapbox/maki-4.0.0/telephone.svg | 4 + .../geoservices/mapbox/maki-4.0.0/tennis.svg | 16 + .../geoservices/mapbox/maki-4.0.0/theatre.svg | 13 + .../geoservices/mapbox/maki-4.0.0/toilet.svg | 16 + .../mapbox/maki-4.0.0/town-hall.svg | 10 + .../geoservices/mapbox/maki-4.0.0/town.svg | 4 + .../mapbox/maki-4.0.0/triangle-stroked.svg | 12 + .../mapbox/maki-4.0.0/triangle.svg | 11 + .../mapbox/maki-4.0.0/veterinary.svg | 18 + .../geoservices/mapbox/maki-4.0.0/village.svg | 4 + .../geoservices/mapbox/maki-4.0.0/volcano.svg | 16 + .../mapbox/maki-4.0.0/warehouse.svg | 9 + .../mapbox/maki-4.0.0/waste-basket.svg | 10 + .../geoservices/mapbox/maki-4.0.0/water.svg | 7 + .../geoservices/mapbox/maki-4.0.0/wetland.svg | 21 + .../mapbox/maki-4.0.0/wheelchair.svg | 17 + .../geoservices/mapbox/maki-4.0.0/zoo.svg | 15 + src/plugins/geoservices/mapbox/mapbox.pro | 47 + src/plugins/geoservices/mapbox/mapbox.qrc | 150 + .../geoservices/mapbox/mapbox_plugin.json | 17 + .../mapbox/qgeocodereplymapbox.cpp | 105 + .../geoservices/mapbox/qgeocodereplymapbox.h | 63 + .../mapbox/qgeocodingmanagerenginemapbox.cpp | 205 + .../mapbox/qgeocodingmanagerenginemapbox.h | 83 + .../mapbox/qgeofiletilecachemapbox.cpp | 131 + .../mapbox/qgeofiletilecachemapbox.h | 63 + .../geoservices/mapbox/qgeomapreplymapbox.cpp | 80 + .../geoservices/mapbox/qgeomapreplymapbox.h | 64 + .../mapbox/qgeoroutereplymapbox.cpp | 164 + .../geoservices/mapbox/qgeoroutereplymapbox.h | 66 + .../mapbox/qgeoroutingmanagerenginemapbox.cpp | 315 + .../mapbox/qgeoroutingmanagerenginemapbox.h | 80 + .../qgeoserviceproviderpluginmapbox.cpp | 109 + .../mapbox/qgeoserviceproviderpluginmapbox.h | 69 + .../qgeotiledmappingmanagerenginemapbox.cpp | 260 + .../qgeotiledmappingmanagerenginemapbox.h | 63 + .../mapbox/qgeotilefetchermapbox.cpp | 104 + .../mapbox/qgeotilefetchermapbox.h | 74 + .../geoservices/mapbox/qmapboxcommon.cpp | 140 + .../geoservices/mapbox/qmapboxcommon.h | 71 + .../mapbox/qplacecategoriesreplymapbox.cpp | 66 + .../mapbox/qplacecategoriesreplymapbox.h | 62 + .../mapbox/qplacemanagerenginemapbox.cpp | 318 + .../mapbox/qplacemanagerenginemapbox.h | 102 + .../mapbox/qplacesearchreplymapbox.cpp | 230 + .../mapbox/qplacesearchreplymapbox.h | 71 + .../qplacesearchsuggestionreplymapbox.cpp | 119 + .../qplacesearchsuggestionreplymapbox.h | 70 + src/plugins/geoservices/mapboxgl/logo.png | Bin 0 -> 2749 bytes src/plugins/geoservices/mapboxgl/mapboxgl.pro | 48 + src/plugins/geoservices/mapboxgl/mapboxgl.qrc | 5 + .../geoservices/mapboxgl/mapboxgl_plugin.json | 11 + .../geoservices/mapboxgl/qgeomapmapboxgl.cpp | 517 + .../geoservices/mapboxgl/qgeomapmapboxgl.h | 84 + .../geoservices/mapboxgl/qgeomapmapboxgl_p.h | 115 + .../qgeomappingmanagerenginemapboxgl.cpp | 193 + .../qgeomappingmanagerenginemapboxgl.h | 68 + .../qgeoserviceproviderpluginmapboxgl.cpp | 85 + .../qgeoserviceproviderpluginmapboxgl.h | 72 + .../mapboxgl/qmapboxglstylechange.cpp | 685 + .../mapboxgl/qmapboxglstylechange_p.h | 194 + .../geoservices/mapboxgl/qsgmapboxglnode.cpp | 164 + .../geoservices/mapboxgl/qsgmapboxglnode.h | 81 + src/plugins/geoservices/nokia/logo.png | Bin 0 -> 1217 bytes .../geoservices/nokia/marclanguagecodes.h | 312 + src/plugins/geoservices/nokia/nokia.pro | 60 + src/plugins/geoservices/nokia/nokia.qrc | 5 + .../geoservices/nokia/nokia_plugin.json | 19 + .../nokia/placesv2/jsonparserhelpers.cpp | 243 + .../nokia/placesv2/jsonparserhelpers.h | 78 + .../geoservices/nokia/placesv2/placesv2.pri | 21 + .../placesv2/qplacecategoriesreplyhere.cpp | 62 + .../placesv2/qplacecategoriesreplyhere.h | 60 + .../nokia/placesv2/qplacecontentreplyimpl.cpp | 122 + .../nokia/placesv2/qplacecontentreplyimpl.h | 68 + .../nokia/placesv2/qplacedetailsreplyimpl.cpp | 345 + .../nokia/placesv2/qplacedetailsreplyimpl.h | 70 + .../nokia/placesv2/qplaceidreplyimpl.cpp | 66 + .../nokia/placesv2/qplaceidreplyimpl.h | 60 + .../nokia/placesv2/qplacesearchreplyhere.cpp | 238 + .../nokia/placesv2/qplacesearchreplyhere.h | 73 + .../qplacesearchsuggestionreplyimpl.cpp | 117 + .../qplacesearchsuggestionreplyimpl.h | 61 + .../geoservices/nokia/qgeocodejsonparser.cpp | 413 + .../geoservices/nokia/qgeocodejsonparser.h | 75 + .../geoservices/nokia/qgeocodereply_nokia.cpp | 127 + .../geoservices/nokia/qgeocodereply_nokia.h | 65 + .../nokia/qgeocodingmanagerengine_nokia.cpp | 363 + .../nokia/qgeocodingmanagerengine_nokia.h | 91 + .../geoservices/nokia/qgeoerror_messages.cpp | 52 + .../geoservices/nokia/qgeoerror_messages.h | 58 + .../nokia/qgeofiletilecachenokia.cpp | 124 + .../nokia/qgeofiletilecachenokia.h | 60 + .../qgeointrinsicnetworkaccessmanager.cpp | 100 + .../nokia/qgeointrinsicnetworkaccessmanager.h | 66 + .../geoservices/nokia/qgeomapreply_nokia.cpp | 91 + .../geoservices/nokia/qgeomapreply_nokia.h | 62 + .../geoservices/nokia/qgeomapversion.cpp | 79 + .../geoservices/nokia/qgeomapversion.h | 63 + .../nokia/qgeonetworkaccessmanager.h | 62 + .../nokia/qgeoroutereply_nokia.cpp | 128 + .../geoservices/nokia/qgeoroutereply_nokia.h | 66 + .../geoservices/nokia/qgeoroutexmlparser.cpp | 647 + .../geoservices/nokia/qgeoroutexmlparser.h | 138 + .../nokia/qgeoroutingmanagerengine_nokia.cpp | 494 + .../nokia/qgeoroutingmanagerengine_nokia.h | 86 + .../nokia/qgeoserviceproviderplugin_nokia.cpp | 149 + .../nokia/qgeoserviceproviderplugin_nokia.h | 73 + .../geoservices/nokia/qgeotiledmap_nokia.cpp | 112 + .../geoservices/nokia/qgeotiledmap_nokia.h | 75 + .../qgeotiledmappingmanagerengine_nokia.cpp | 454 + .../qgeotiledmappingmanagerengine_nokia.h | 110 + .../nokia/qgeotilefetcher_nokia.cpp | 336 + .../geoservices/nokia/qgeotilefetcher_nokia.h | 96 + .../geoservices/nokia/qgeouriprovider.cpp | 98 + .../geoservices/nokia/qgeouriprovider.h | 76 + .../nokia/qplacemanagerengine_nokiav2.cpp | 866 + .../nokia/qplacemanagerengine_nokiav2.h | 134 + .../geoservices/nokia/uri_constants.cpp | 47 + src/plugins/geoservices/nokia/uri_constants.h | 53 + src/plugins/geoservices/osm/osm.pro | 46 + src/plugins/geoservices/osm/osm_plugin.json | 13 + .../geoservices/osm/providers/5.8/cycle | 8 + .../geoservices/osm/providers/5.8/hiking | 9 + .../osm/providers/5.8/night-transit | 9 + .../geoservices/osm/providers/5.8/satellite | 10 + .../geoservices/osm/providers/5.8/street | 10 + .../osm/providers/5.8/street-hires | 9 + .../geoservices/osm/providers/5.8/terrain | 9 + .../geoservices/osm/providers/5.8/transit | 9 + .../geoservices/osm/qgeocodereplyosm.cpp | 221 + .../geoservices/osm/qgeocodereplyosm.h | 77 + .../osm/qgeocodingmanagerengineosm.cpp | 198 + .../osm/qgeocodingmanagerengineosm.h | 80 + .../geoservices/osm/qgeofiletilecacheosm.cpp | 318 + .../geoservices/osm/qgeofiletilecacheosm.h | 87 + .../geoservices/osm/qgeomapreplyosm.cpp | 89 + src/plugins/geoservices/osm/qgeomapreplyosm.h | 63 + .../geoservices/osm/qgeoroutereplyosm.cpp | 103 + .../geoservices/osm/qgeoroutereplyosm.h | 65 + .../osm/qgeoroutingmanagerengineosm.cpp | 122 + .../osm/qgeoroutingmanagerengineosm.h | 78 + .../osm/qgeoserviceproviderpluginosm.cpp | 72 + .../osm/qgeoserviceproviderpluginosm.h | 72 + .../geoservices/osm/qgeotiledmaposm.cpp | 118 + src/plugins/geoservices/osm/qgeotiledmaposm.h | 77 + .../osm/qgeotiledmappingmanagerengineosm.cpp | 390 + .../osm/qgeotiledmappingmanagerengineosm.h | 82 + .../geoservices/osm/qgeotilefetcherosm.cpp | 171 + .../geoservices/osm/qgeotilefetcherosm.h | 90 + .../geoservices/osm/qgeotileproviderosm.cpp | 667 + .../geoservices/osm/qgeotileproviderosm.h | 194 + .../osm/qplacecategoriesreplyosm.cpp | 65 + .../osm/qplacecategoriesreplyosm.h | 61 + .../osm/qplacemanagerengineosm.cpp | 359 + .../geoservices/osm/qplacemanagerengineosm.h | 99 + .../geoservices/osm/qplacesearchreplyosm.cpp | 235 + .../geoservices/osm/qplacesearchreplyosm.h | 74 + src/plugins/plugins.pro | 3 + src/plugins/position/android/android.pro | 2 + .../position/android/jar/AndroidManifest.xml | 6 + src/plugins/position/android/jar/jar.pro | 16 + .../android/positioning/QtPositioning.java | 590 + .../position/android/src/jnipositioning.cpp | 653 + .../position/android/src/jnipositioning.h | 65 + src/plugins/position/android/src/plugin.json | 9 + .../android/src/positionfactory_android.cpp | 60 + .../android/src/positionfactory_android.h | 58 + .../src/qgeopositioninfosource_android.cpp | 267 + .../src/qgeopositioninfosource_android_p.h | 98 + .../src/qgeosatelliteinfosource_android.cpp | 216 + .../src/qgeosatelliteinfosource_android_p.h | 97 + src/plugins/position/android/src/src.pro | 21 + .../position/corelocation/corelocation.pro | 24 + src/plugins/position/corelocation/plugin.json | 9 + .../corelocation/qgeopositioninfosource_cl.mm | 323 + .../qgeopositioninfosource_cl_p.h | 107 + .../qgeopositioninfosourcefactory_cl.h | 58 + .../qgeopositioninfosourcefactory_cl.mm | 58 + src/plugins/position/geoclue/geoclue.pro | 38 + src/plugins/position/geoclue/geocluetypes.cpp | 105 + src/plugins/position/geoclue/geocluetypes.h | 93 + .../org.freedesktop.Geoclue.Master.xml | 10 + .../org.freedesktop.Geoclue.MasterClient.xml | 41 + .../org.freedesktop.Geoclue.Position.xml | 25 + .../org.freedesktop.Geoclue.Satellite.xml | 33 + .../org.freedesktop.Geoclue.Velocity.xml | 20 + .../geoclue/org.freedesktop.Geoclue.xml | 24 + src/plugins/position/geoclue/plugin.json | 9 + .../position/geoclue/qgeocluemaster.cpp | 137 + src/plugins/position/geoclue/qgeocluemaster.h | 90 + .../qgeopositioninfosource_geocluemaster.cpp | 495 + .../qgeopositioninfosource_geocluemaster.h | 143 + .../qgeopositioninfosourcefactory_geoclue.cpp | 68 + .../qgeopositioninfosourcefactory_geoclue.h | 70 + .../qgeosatelliteinfosource_geocluemaster.cpp | 310 + .../qgeosatelliteinfosource_geocluemaster.h | 105 + src/plugins/position/geoclue2/geoclue2.pro | 30 + .../position/geoclue2/geocluetypes.cpp | 62 + src/plugins/position/geoclue2/geocluetypes.h | 63 + .../org.freedesktop.GeoClue2.Client.xml | 122 + .../org.freedesktop.GeoClue2.Location.xml | 96 + .../org.freedesktop.GeoClue2.Manager.xml | 60 + src/plugins/position/geoclue2/plugin.json | 9 + .../qgeopositioninfosource_geoclue2.cpp | 446 + .../qgeopositioninfosource_geoclue2_p.h | 97 + ...qgeopositioninfosourcefactory_geoclue2.cpp | 66 + .../qgeopositioninfosourcefactory_geoclue2.h | 68 + src/plugins/position/gypsy/gypsy.pro | 20 + src/plugins/position/gypsy/plugin.json | 9 + .../qgeopositioninfosourcefactory_gypsy.cpp | 63 + .../qgeopositioninfosourcefactory_gypsy.h | 59 + .../gypsy/qgeosatelliteinfosource_gypsy.cpp | 373 + .../gypsy/qgeosatelliteinfosource_gypsy_p.h | 141 + src/plugins/position/position.pro | 15 + src/plugins/position/positionpoll/plugin.json | 9 + .../position/positionpoll/positionpoll.pro | 18 + .../positionpoll/positionpollfactory.cpp | 62 + .../positionpoll/positionpollfactory.h | 58 + .../positionpoll/qgeoareamonitor_polling.cpp | 499 + .../positionpoll/qgeoareamonitor_polling.h | 94 + src/plugins/position/serialnmea/plugin.json | 9 + ...eopositioninfosourcefactory_serialnmea.cpp | 269 + ...qgeopositioninfosourcefactory_serialnmea.h | 63 + src/plugins/position/serialnmea/qiopipe.cpp | 207 + src/plugins/position/serialnmea/qiopipe_p.h | 113 + .../serialnmea/qnmeasatelliteinfosource.cpp | 558 + .../serialnmea/qnmeasatelliteinfosource_p.h | 96 + .../position/serialnmea/serialnmea.pro | 16 + src/plugins/position/simulator/plugin.json | 9 + .../qgeopositioninfosource_simulator.cpp | 170 + .../qgeopositioninfosource_simulator_p.h | 95 + ...geopositioninfosourcefactory_simulator.cpp | 61 + .../qgeopositioninfosourcefactory_simulator.h | 61 + .../qgeosatelliteinfosource_simulator.cpp | 132 + .../qgeosatelliteinfosource_simulator_p.h | 94 + .../qlocationconnection_simulator.cpp | 126 + .../qlocationconnection_simulator_p.h | 97 + src/plugins/position/simulator/simulator.pro | 22 + src/plugins/position/winrt/plugin.json | 9 + .../winrt/qgeopositioninfosource_winrt.cpp | 673 + .../winrt/qgeopositioninfosource_winrt_p.h | 124 + .../qgeopositioninfosourcefactory_winrt.cpp | 67 + .../qgeopositioninfosourcefactory_winrt.h | 59 + src/plugins/position/winrt/winrt.pro | 16 + src/positioning/configure.json | 48 + src/positioning/doc/qtpositioning.qdocconf | 58 + src/positioning/doc/snippets/cpp/cpp.pro | 8 + src/positioning/doc/snippets/cpp/cppqml.cpp | 118 + src/positioning/doc/snippets/cpp/main.cpp | 55 + .../doc/snippets/doc_src_qtpositioning.qml | 57 + src/positioning/doc/snippets/snippets.pro | 2 + src/positioning/doc/src/cpp-position.qdoc | 191 + .../doc/src/cpp-qml-positioning.qdoc | 96 + .../doc/src/plugins/serialnmea.qdoc | 78 + src/positioning/doc/src/qml-position.qdoc | 119 + .../doc/src/qtpositioning-examples.qdoc | 37 + .../doc/src/qtpositioning-plugins.qdoc | 114 + .../doc/src/qtpositioning-qml.qdoc | 71 + src/positioning/doc/src/qtpositioning.qdoc | 143 + src/positioning/positioning.pro | 98 + src/positioning/qclipperutils.cpp | 100 + src/positioning/qclipperutils_p.h | 86 + src/positioning/qdoublematrix4x4.cpp | 1112 + src/positioning/qdoublematrix4x4_p.h | 946 + src/positioning/qdoublevector2d.cpp | 121 + src/positioning/qdoublevector2d_p.h | 262 + src/positioning/qdoublevector3d.cpp | 144 + src/positioning/qdoublevector3d_p.h | 302 + src/positioning/qgeoaddress.cpp | 635 + src/positioning/qgeoaddress.h | 106 + src/positioning/qgeoaddress_p.h | 80 + src/positioning/qgeoareamonitorinfo.cpp | 379 + src/positioning/qgeoareamonitorinfo.h | 103 + src/positioning/qgeoareamonitorsource.cpp | 389 + src/positioning/qgeoareamonitorsource.h | 108 + src/positioning/qgeocircle.cpp | 492 + src/positioning/qgeocircle.h | 96 + src/positioning/qgeocircle_p.h | 94 + src/positioning/qgeocoordinate.cpp | 792 + src/positioning/qgeocoordinate.h | 137 + src/positioning/qgeocoordinate_p.h | 92 + src/positioning/qgeocoordinateobject.cpp | 92 + src/positioning/qgeocoordinateobject_p.h | 94 + src/positioning/qgeolocation.cpp | 225 + src/positioning/qgeolocation.h | 90 + src/positioning/qgeolocation_p.h | 82 + src/positioning/qgeopath.cpp | 784 + src/positioning/qgeopath.h | 107 + src/positioning/qgeopath_p.h | 269 + src/positioning/qgeopolygon.cpp | 742 + src/positioning/qgeopolygon.h | 110 + src/positioning/qgeopolygon_p.h | 136 + src/positioning/qgeopositioninfo.cpp | 378 + src/positioning/qgeopositioninfo.h | 117 + src/positioning/qgeopositioninfo_p.h | 78 + src/positioning/qgeopositioninfosource.cpp | 619 + src/positioning/qgeopositioninfosource.h | 126 + src/positioning/qgeopositioninfosource_p.h | 89 + .../qgeopositioninfosourcefactory.cpp | 130 + .../qgeopositioninfosourcefactory.h | 81 + src/positioning/qgeorectangle.cpp | 1046 + src/positioning/qgeorectangle.h | 129 + src/positioning/qgeorectangle_p.h | 87 + src/positioning/qgeosatelliteinfo.cpp | 339 + src/positioning/qgeosatelliteinfo.h | 114 + src/positioning/qgeosatelliteinfo_p.h | 67 + src/positioning/qgeosatelliteinfosource.cpp | 388 + src/positioning/qgeosatelliteinfosource.h | 104 + src/positioning/qgeosatelliteinfosource_p.h | 70 + src/positioning/qgeoshape.cpp | 454 + src/positioning/qgeoshape.h | 114 + src/positioning/qgeoshape_p.h | 93 + src/positioning/qlocationdata_simulator.cpp | 119 + src/positioning/qlocationdata_simulator_p.h | 134 + src/positioning/qlocationutils.cpp | 518 + src/positioning/qlocationutils_p.h | 340 + src/positioning/qnmeapositioninfosource.cpp | 961 + src/positioning/qnmeapositioninfosource.h | 97 + src/positioning/qnmeapositioninfosource_p.h | 188 + src/positioning/qpositioningglobal.h | 60 + src/positioning/qpositioningglobal_p.h | 62 + src/positioning/qwebmercator.cpp | 136 + src/positioning/qwebmercator_p.h | 75 + src/positioningquick/positioningquick.pro | 10 + .../qdeclarativegeoaddress.cpp | 352 + .../qdeclarativegeoaddress_p.h | 121 + .../qdeclarativegeolocation.cpp | 200 + .../qdeclarativegeolocation_p.h | 104 + .../qdeclarativepluginparameter.cpp | 135 + .../qdeclarativepluginparameter_p.h | 94 + src/positioningquick/qdeclarativeposition.cpp | 474 + src/positioningquick/qdeclarativeposition_p.h | 149 + .../qdeclarativepositionsource.cpp | 925 + .../qdeclarativepositionsource_p.h | 194 + .../qpositioningquickglobal.h | 69 + .../qpositioningquickglobal_p.h | 61 + .../qquickgeocoordinateanimation.cpp | 296 + .../qquickgeocoordinateanimation_p.h | 100 + .../qquickgeocoordinateanimation_p_p.h | 69 + src/src.pro | 44 + sync.profile | 7 + .../positioning_backend/logwidget.cpp | 46 + .../positioning_backend/logwidget.h | 47 + .../applications/positioning_backend/main.cpp | 54 + .../positioning_backend.pro | 16 + .../positioning_backend/widget.cpp | 184 + .../applications/positioning_backend/widget.h | 70 + .../positioning_backend/widget.ui | 334 + tests/auto/auto.pro | 105 + .../QtPositioning.5.10.0.linux-gcc-amd64.txt | 4773 + .../QtPositioning.5.11.0.linux-gcc-amd64.txt | 4773 + .../QtPositioning.5.12.0.linux-gcc-amd64.txt | 4838 + .../QtPositioning.5.13.0.linux-gcc-amd64.txt | 5208 + .../QtPositioning.5.14.0.linux-gcc-amd64.txt | 5268 + .../QtPositioning.5.15.0.linux-gcc-amd64.txt | 5278 + .../QtPositioning.5.3.0.linux-gcc-amd64.txt | 3822 + .../QtPositioning.5.4.0.linux-gcc-amd64.txt | 3854 + .../QtPositioning.5.6.0.linux-gcc-amd64.txt | 4118 + .../QtPositioning.5.7.0.linux-gcc-amd64.txt | 4400 + .../QtPositioning.5.8.0.linux-gcc-amd64.txt | 4425 + .../QtPositioning.5.9.0.linux-gcc-amd64.txt | 4446 + tests/auto/cmake/CMakeLists.txt | 19 + tests/auto/cmake/cmake.pro | 7 + tests/auto/declarative_core/BLACKLIST | 10 + .../declarative_core/declarative_core.pro | 14 + tests/auto/declarative_core/main.cpp | 48 + tests/auto/declarative_core/tst_address.qml | 88 + tests/auto/declarative_core/tst_category.qml | 236 + .../declarative_core/tst_categorymodel.qml | 238 + .../declarative_core/tst_contactdetail.qml | 71 + .../auto/declarative_core/tst_coordinate.qml | 356 + .../declarative_core/tst_editorialmodel.qml | 186 + tests/auto/declarative_core/tst_geocoding.qml | 665 + .../auto/declarative_core/tst_imagemodel.qml | 186 + tests/auto/declarative_core/tst_place.qml | 627 + .../declarative_core/tst_placeattribute.qml | 53 + tests/auto/declarative_core/tst_placeicon.qml | 106 + .../declarative_core/tst_placesearchmodel.qml | 311 + .../tst_placesearchsuggestionmodel.qml | 153 + tests/auto/declarative_core/tst_plugin.qml | 150 + .../declarative_core/tst_plugin_error.qml | 61 + tests/auto/declarative_core/tst_position.qml | 99 + .../declarative_core/tst_positionsource.qml | 227 + tests/auto/declarative_core/tst_ratings.qml | 75 + .../auto/declarative_core/tst_reviewmodel.qml | 201 + tests/auto/declarative_core/tst_routing.qml | 971 + tests/auto/declarative_core/tst_supplier.qml | 100 + tests/auto/declarative_core/tst_user.qml | 71 + tests/auto/declarative_core/utils.js | 182 + .../declarative_geoshape.pro | 11 + tests/auto/declarative_geoshape/main.cpp | 30 + .../tst_locationsingleton.qml | 347 + tests/auto/declarative_ui/ItemGroup.qml | 62 + tests/auto/declarative_ui/declarative_ui.pro | 21 + tests/auto/declarative_ui/main.cpp | 48 + tests/auto/declarative_ui/tst_map.qml | 732 + .../tst_map_coordinateanimation.qml | 137 + tests/auto/declarative_ui/tst_map_error.qml | 215 + tests/auto/declarative_ui/tst_map_flick.qml | 364 + tests/auto/declarative_ui/tst_map_item.qml | 623 + .../declarative_ui/tst_map_item_details.qml | 651 + .../tst_map_item_fit_viewport.qml | 690 + .../auto/declarative_ui/tst_map_itemview.qml | 584 + .../auto/declarative_ui/tst_map_keepgrab.qml | 156 + tests/auto/declarative_ui/tst_map_maptype.qml | 222 + tests/auto/declarative_ui/tst_map_mouse.qml | 731 + .../tst_map_pinch.qml.QTBUG-47970 | 576 + tests/auto/doublevectors/doublevectors.pro | 7 + .../auto/doublevectors/tst_doublevectors.cpp | 293 + tests/auto/geotestplugin/geotestplugin.json | 20 + tests/auto/geotestplugin/geotestplugin.pro | 23 + tests/auto/geotestplugin/place_data.json | 146 + .../qgeocodingmanagerengine_test.h | 320 + .../qgeomappingmanagerengine_test.h | 175 + .../qgeoroutingmanagerengine_test.h | 231 + .../qgeoserviceproviderplugin_test.cpp | 93 + .../qgeoserviceproviderplugin_test.h | 64 + .../auto/geotestplugin/qgeotiledmap_test.cpp | 108 + tests/auto/geotestplugin/qgeotiledmap_test.h | 63 + .../qgeotiledmappingmanagerengine_test.h | 123 + .../auto/geotestplugin/qgeotilefetcher_test.h | 179 + .../geotestplugin/qplacemanagerengine_test.h | 727 + tests/auto/geotestplugin/testdata.qrc | 5 + tests/auto/maptype/maptype.pro | 7 + tests/auto/maptype/tst_maptype.cpp | 190 + tests/auto/nokia_services/nokia_services.pro | 2 + .../places_semiauto/places_semiauto.pro | 10 + .../places_semiauto/tst_places.cpp | 745 + .../nokia_services/routing/error-no-route.xml | 1 + .../invalid-response-half-way-through.xml | 150 + ...invalid-response-no-calculateroute-tag.xml | 1 + .../routing/invalid-response-no-route-tag.xml | 18 + .../routing/invalid-response-trash.xml | Bin 0 -> 785 bytes .../routing/littered-with-new-tags.xml | 648 + .../routing/multiple-routes-in-response.xml | 1 + .../nokia_services/routing/optim-fastest.xml | 628 + .../nokia_services/routing/optim-shortest.xml | 1 + tests/auto/nokia_services/routing/routing.pro | 13 + .../nokia_services/routing/travelmode-car.xml | 628 + .../routing/travelmode-pedestrian.xml | 798 + .../routing/travelmode-public-transport.xml | 343 + .../nokia_services/routing/tst_routing.cpp | 518 + .../placemanager_utils/placemanager_utils.cpp | 376 + .../placemanager_utils/placemanager_utils.h | 230 + .../placesplugin.json | 8 + .../placesplugin_unsupported.pro | 14 + .../qgeoserviceproviderplugin_test.cpp | 50 + .../qgeoserviceproviderplugin_test.h | 54 + tests/auto/positionplugin/plugin.cpp | 265 + tests/auto/positionplugin/plugin.json | 9 + tests/auto/positionplugin/positionplugin.pro | 12 + tests/auto/positionpluginV1/plugin.cpp | 212 + tests/auto/positionpluginV1/plugin.json | 9 + .../positionpluginV1/positionpluginV1.pro | 12 + .../positionplugintest/positionplugintest.pro | 9 + .../positionplugintest/tst_positionplugin.cpp | 110 + tests/auto/qgeoaddress/qgeoaddress.pro | 7 + tests/auto/qgeoaddress/tst_qgeoaddress.cpp | 559 + .../qgeoareamonitor/logfilepositionsource.cpp | 112 + .../qgeoareamonitor/logfilepositionsource.h | 66 + .../auto/qgeoareamonitor/qgeoareamonitor.pro | 14 + tests/auto/qgeoareamonitor/simplelog.txt | 87 + .../qgeoareamonitor/tst_qgeoareamonitor.cpp | 760 + .../qgeocameracapabilities.pro | 9 + .../tst_qgeocameracapabilities.cpp | 359 + tests/auto/qgeocameradata/qgeocameradata.pro | 9 + .../qgeocameradata/tst_qgeocameradata.cpp | 221 + .../auto/qgeocameratiles/qgeocameratiles.pro | 8 + .../qgeocameratiles/tst_qgeocameratiles.cpp | 1830 + tests/auto/qgeocircle/qgeocircle.pro | 8 + tests/auto/qgeocircle/tst_qgeocircle.cpp | 453 + tests/auto/qgeocodereply/qgeocodereply.pro | 10 + .../auto/qgeocodereply/tst_qgeocodereply.cpp | 275 + tests/auto/qgeocodereply/tst_qgeocodereply.h | 105 + .../qgeocodingmanager/qgeocodingmanager.pro | 12 + .../tst_qgeocodingmanager.cpp | 183 + .../qgeocodingmanager/tst_qgeocodingmanager.h | 76 + .../geocoding_plugin.json | 10 + .../qgeocodingmanagerengine_test.h | 107 + .../qgeocodingmanagerplugins.pro | 15 + .../qgeoserviceproviderplugin_test.cpp | 47 + .../qgeoserviceproviderplugin_test.h | 55 + tests/auto/qgeocoordinate/qgeocoordinate.pro | 8 + .../qgeocoordinate/tst_qgeocoordinate.cpp | 968 + tests/auto/qgeojson/01-point.json | 4 + tests/auto/qgeojson/02-linestring.json | 7 + tests/auto/qgeojson/03-multipoint.json | 8 + tests/auto/qgeojson/04-polygon.json | 12 + tests/auto/qgeojson/05-multilinestring.json | 7 + tests/auto/qgeojson/06-multipolygon.json | 21 + .../auto/qgeojson/07-geometrycollection.json | 39 + tests/auto/qgeojson/08-feature.json | 25 + tests/auto/qgeojson/09-featurecollection.json | 44 + tests/auto/qgeojson/10-countries.json | 45891 ++++++++ tests/auto/qgeojson/10-countries_LICENSE | 27 + tests/auto/qgeojson/11-full.json | 374 + tests/auto/qgeojson/qgeojson.pro | 9 + tests/auto/qgeojson/tst_qgeojson.cpp | 89 + tests/auto/qgeolocation/qgeolocation.pro | 9 + tests/auto/qgeolocation/tst_qgeolocation.cpp | 281 + tests/auto/qgeolocation/tst_qgeolocation.h | 86 + tests/auto/qgeomaneuver/qgeomaneuver.pro | 11 + tests/auto/qgeomaneuver/tst_qgeomaneuver.cpp | 301 + tests/auto/qgeomaneuver/tst_qgeomaneuver.h | 85 + tests/auto/qgeopath/qgeopath.pro | 8 + tests/auto/qgeopath/tst_qgeopath.cpp | 417 + tests/auto/qgeopolygon/qgeopolygon.pro | 8 + tests/auto/qgeopolygon/tst_qgeopolygon.cpp | 402 + .../qgeopositioninfo/qgeopositioninfo.pro | 7 + .../qgeopositioninfo/tst_qgeopositioninfo.cpp | 385 + .../qgeopositioninfosource.pro | 15 + .../testqgeopositioninfosource.cpp | 778 + .../testqgeopositioninfosource_p.h | 127 + .../tst_qgeopositioninfosource.cpp | 38 + tests/auto/qgeorectangle/qgeorectangle.pro | 8 + .../auto/qgeorectangle/tst_qgeorectangle.cpp | 2384 + tests/auto/qgeoroute/qgeoroute.pro | 9 + tests/auto/qgeoroute/tst_qgeoroute.cpp | 306 + tests/auto/qgeoroute/tst_qgeoroute.h | 90 + tests/auto/qgeoroutereply/qgeoroutereply.pro | 9 + .../qgeoroutereply/tst_qgeoroutereply.cpp | 242 + .../auto/qgeoroutereply/tst_qgeoroutereply.h | 96 + .../qgeorouterequest/qgeorouterequest.pro | 9 + .../qgeorouterequest/tst_qgeorouterequest.cpp | 367 + .../qgeorouterequest/tst_qgeorouterequest.h | 97 + .../qgeoroutesegment/qgeoroutesegment.pro | 9 + .../qgeoroutesegment/tst_qgeoroutesegment.cpp | 302 + .../qgeoroutesegment/tst_qgeoroutesegment.h | 82 + tests/auto/qgeoroutexmlparser/fixtures.qrc | 6 + .../qgeoroutexmlparser/qgeoroutexmlparser.pro | 13 + tests/auto/qgeoroutexmlparser/route1.xml | 1 + tests/auto/qgeoroutexmlparser/route2.xml | 1 + .../tst_qgeoroutexmlparser.cpp | 172 + .../qgeoroutingmanager/qgeoroutingmanager.pro | 11 + .../tst_qgeoroutingmanager.cpp | 165 + .../tst_qgeoroutingmanager.h | 74 + .../qgeoroutingmanagerengine_test.h | 76 + .../qgeoroutingmanagerplugins.pro | 15 + .../qgeoserviceproviderplugin_test.cpp | 47 + .../qgeoserviceproviderplugin_test.h | 55 + .../routing_plugin.json | 12 + .../qgeosatelliteinfo/qgeosatelliteinfo.pro | 7 + .../tst_qgeosatelliteinfo.cpp | 405 + .../qgeosatelliteinfosource.pro | 12 + .../testqgeosatelliteinfosource.cpp | 767 + .../testqgeosatelliteinfosource_p.h | 114 + .../tst_qgeosatelliteinfosource.cpp | 37 + .../qgeoserviceprovider.pro | 9 + .../tst_qgeoserviceprovider.cpp | 232 + tests/auto/qgeoshape/qgeoshape.pro | 5 + tests/auto/qgeoshape/tst_qgeoshape.cpp | 130 + tests/auto/qgeotiledmap/BLACKLIST | 2 + tests/auto/qgeotiledmap/qgeotiledmap.pro | 9 + tests/auto/qgeotiledmap/tst_qgeotiledmap.cpp | 211 + .../qgeotiledmapscene/qgeotiledmapscene.pro | 8 + .../tst_qgeotiledmapscene.cpp | 400 + tests/auto/qgeotilespec/qgeotilespec.pro | 9 + tests/auto/qgeotilespec/tst_qgeotilespec.cpp | 319 + tests/auto/qmlinterface/data/TestAddress.qml | 38 + tests/auto/qmlinterface/data/TestCategory.qml | 34 + .../qmlinterface/data/TestContactDetail.qml | 34 + tests/auto/qmlinterface/data/TestIcon.qml | 36 + tests/auto/qmlinterface/data/TestLocation.qml | 49 + tests/auto/qmlinterface/data/TestPlace.qml | 50 + .../qmlinterface/data/TestPlaceAttribute.qml | 34 + tests/auto/qmlinterface/data/TestRatings.qml | 35 + tests/auto/qmlinterface/data/TestSupplier.qml | 36 + tests/auto/qmlinterface/data/TestUser.qml | 34 + tests/auto/qmlinterface/qmlinterface.pro | 26 + tests/auto/qmlinterface/tst_qmlinterface.cpp | 353 + .../dummynmeapositioninfosource.pro | 17 + .../tst_dummynmeapositioninfosource.cpp | 148 + .../qnmeapositioninfosource.pro | 8 + .../qnmeapositioninfosource_realtime.pro | 19 + .../tst_qnmeapositioninfosource_realtime.cpp | 44 + ...meapositioninfosource_realtime_generic.pro | 22 + ...meapositioninfosource_realtime_generic.cpp | 76 + .../qnmeapositioninfosource_simulation.pro | 19 + ...tst_qnmeapositioninfosource_simulation.cpp | 43 + ...apositioninfosource_simulation_generic.pro | 22 + ...apositioninfosource_simulation_generic.cpp | 64 + .../qnmeapositioninfosourceproxyfactory.cpp | 95 + .../qnmeapositioninfosourceproxyfactory.h | 75 + .../tst_qnmeapositioninfosource.cpp | 582 + .../tst_qnmeapositioninfosource.h | 182 + tests/auto/qplace/qplace.pro | 7 + tests/auto/qplace/tst_qplace.cpp | 681 + .../auto/qplaceattribute/qplaceattribute.pro | 7 + .../qplaceattribute/tst_qplaceattribute.cpp | 95 + tests/auto/qplacecategory/qplacecategory.pro | 7 + .../qplacecategory/tst_qplacecategory.cpp | 142 + .../qplacecontactdetail.pro | 7 + .../tst_qplacecontactdetail.cpp | 146 + .../qplacecontentrequest.pro | 6 + .../tst_qplacecontentrequest.cpp | 90 + .../qplacedetailsreply/qplacedetailsreply.pro | 7 + .../tst_qplacedetailsreply.cpp | 89 + .../auto/qplaceeditorial/qplaceeditorial.pro | 7 + .../qplaceeditorial/tst_qplaceeditorial.cpp | 166 + tests/auto/qplaceimage/qplaceimage.pro | 7 + tests/auto/qplaceimage/tst_qplaceimage.cpp | 168 + tests/auto/qplacemanager/qplacemanager.pro | 9 + .../auto/qplacemanager/tst_qplacemanager.cpp | 236 + .../qplacemanager_nokia.pro | 7 + .../tst_qplacemanager_nokia.cpp | 200 + .../qplacemanager_unsupported.pro | 9 + .../tst_qplacemanager_unsupported.cpp | 279 + .../qplacematchreply/qplacematchreply.pro | 7 + .../qplacematchreply/tst_qplacematchreply.cpp | 111 + .../qplacematchrequest/qplacematchrequest.pro | 6 + .../tst_qplacematchrequest.cpp | 166 + tests/auto/qplaceperiod/qplaceperiod.pro | 8 + tests/auto/qplaceperiod/tst_qplaceperiod.cpp | 116 + tests/auto/qplaceratings/qplaceratings.pro | 7 + .../auto/qplaceratings/tst_qplaceratings.cpp | 119 + tests/auto/qplacereply/qplacereply.pro | 7 + tests/auto/qplacereply/tst_qplacereply.cpp | 109 + tests/auto/qplaceresult/qplaceresult.pro | 7 + tests/auto/qplaceresult/tst_qplaceresult.cpp | 270 + tests/auto/qplacereview/qplacereview.pro | 7 + tests/auto/qplacereview/tst_qplacereview.cpp | 220 + .../qplacesearchreply/qplacesearchreply.pro | 7 + .../tst_qplacesearchreply.cpp | 135 + .../qplacesearchrequest.pro | 6 + .../tst_qplacesearchrequest.cpp | 268 + .../qplacesearchresult/qplacesearchresult.pro | 7 + .../tst_qplacesearchresult.cpp | 112 + .../qplacesearchsuggestionreply.pro | 7 + .../tst_qplacesearchsuggestionreply.cpp | 95 + tests/auto/qplacesupplier/qplacesupplier.pro | 7 + .../qplacesupplier/tst_qplacesupplier.cpp | 167 + tests/auto/qplaceuser/qplaceuser.pro | 7 + tests/auto/qplaceuser/tst_qplaceuser.cpp | 139 + .../qproposedsearchresult.pro | 7 + .../tst_qproposedsearchresult.cpp | 221 + tests/auto/utils/qlocationtestutils.cpp | 86 + tests/auto/utils/qlocationtestutils_p.h | 170 + tests/global/global.cfg | 5 + tests/manual/mapitems_backends/main.cpp | 48 + tests/manual/mapitems_backends/main.qml | 552 + .../mapitems_backends/mapitems_backends.pro | 29 + tests/manual/mapitems_backends/qml.qrc | 6 + tests/manual/mapobjects_tester/main.cpp | 48 + tests/manual/mapobjects_tester/main.qml | 531 + .../mapobjects_tester/mapobjects_tester.pro | 29 + tests/manual/mapobjects_tester/qml.qrc | 6 + .../mappolyline_tester/LongPolyline.qml | 92745 ++++++++++++++++ tests/manual/mappolyline_tester/main.cpp | 56 + tests/manual/mappolyline_tester/main.qml | 327 + .../mappolyline_tester/mappolyline_tester.pro | 29 + tests/manual/mappolyline_tester/qml.qrc | 6 + .../declarativetestplugin.pro | 27 + .../declarativetestplugin/locationtest.cpp | 67 + .../qdeclarativelocationtestmodel.cpp | 245 + .../qdeclarativelocationtestmodel_p.h | 130 + .../qdeclarativepinchgenerator.cpp | 383 + .../qdeclarativepinchgenerator_p.h | 139 + tests/plugins/declarativetestplugin/qmldir | 3 + .../declarativetestplugin/testhelper.h | 62 + tests/plugins/imports.pri | 5 + tests/tests.pro | 3 + 2803 files changed, 600148 insertions(+) create mode 100644 .QT-ENTERPRISE-LICENSE-AGREEMENT create mode 100644 .gitmodules create mode 100644 .qmake.conf create mode 100644 .tag create mode 100644 LICENSE.FDL create mode 100644 LICENSE.GPL2 create mode 100644 LICENSE.GPL3 create mode 100644 LICENSE.GPL3-EXCEPT create mode 100644 LICENSE.GPLv3 create mode 100644 LICENSE.LGPL3 create mode 100644 LICENSE.LGPLv3 create mode 100644 config.tests/gypsy/gypsy.pro create mode 100644 config.tests/gypsy/main.cpp create mode 100644 config.tests/winrt/main.cpp create mode 100644 config.tests/winrt/winrt.pro create mode 100644 configure.json create mode 100644 dist/changes-5.10.0 create mode 100644 dist/changes-5.10.1 create mode 100644 dist/changes-5.11.0 create mode 100644 dist/changes-5.11.1 create mode 100644 dist/changes-5.11.2 create mode 100644 dist/changes-5.11.3 create mode 100644 dist/changes-5.12.0 create mode 100644 dist/changes-5.12.1 create mode 100644 dist/changes-5.12.2 create mode 100644 dist/changes-5.12.3 create mode 100644 dist/changes-5.12.4 create mode 100644 dist/changes-5.12.5 create mode 100644 dist/changes-5.13.0 create mode 100644 dist/changes-5.13.1 create mode 100644 dist/changes-5.13.2 create mode 100644 dist/changes-5.14.0 create mode 100644 dist/changes-5.14.1 create mode 100644 dist/changes-5.14.2 create mode 100644 dist/changes-5.15.0 create mode 100644 dist/changes-5.15.1 create mode 100644 dist/changes-5.15.2 create mode 100644 dist/changes-5.2.1 create mode 100644 dist/changes-5.3.0 create mode 100644 dist/changes-5.3.1 create mode 100644 dist/changes-5.3.2 create mode 100644 dist/changes-5.4.0 create mode 100644 dist/changes-5.4.1 create mode 100644 dist/changes-5.4.2 create mode 100644 dist/changes-5.5.0 create mode 100644 dist/changes-5.5.1 create mode 100644 dist/changes-5.6.0 create mode 100644 dist/changes-5.6.1 create mode 100644 dist/changes-5.6.2 create mode 100644 dist/changes-5.6.3 create mode 100644 dist/changes-5.7.0 create mode 100644 dist/changes-5.7.1 create mode 100644 dist/changes-5.8.0 create mode 100644 dist/changes-5.9.0 create mode 100644 dist/changes-5.9.1 create mode 100644 dist/changes-5.9.2 create mode 100644 dist/changes-5.9.3 create mode 100644 dist/changes-5.9.4 create mode 100644 examples/examples.pro create mode 100644 examples/location/geojson_viewer/GeoJsonDelegate.qml create mode 100644 examples/location/geojson_viewer/GeoJsonDelegateMapObject.qml create mode 100644 examples/location/geojson_viewer/data/01-point.json create mode 100644 examples/location/geojson_viewer/data/02-linestring.json create mode 100644 examples/location/geojson_viewer/data/03-multipoint.json create mode 100644 examples/location/geojson_viewer/data/04-polygon.json create mode 100644 examples/location/geojson_viewer/data/05-multilinestring.json create mode 100644 examples/location/geojson_viewer/data/06-multipolygon.json create mode 100644 examples/location/geojson_viewer/data/07-geometrycollection.json create mode 100644 examples/location/geojson_viewer/data/08-feature.json create mode 100644 examples/location/geojson_viewer/data/09-featurecollection.json create mode 100644 examples/location/geojson_viewer/data/10-countries.json create mode 100644 examples/location/geojson_viewer/data/10-countries_LICENSE create mode 100644 examples/location/geojson_viewer/data/11-full.json create mode 100644 examples/location/geojson_viewer/geojson_viewer.pro create mode 100644 examples/location/geojson_viewer/main.cpp create mode 100644 examples/location/geojson_viewer/main.qml create mode 100644 examples/location/geojson_viewer/qml.qrc create mode 100644 examples/location/itemview_transitions/OsloListModel.qml create mode 100644 examples/location/itemview_transitions/doc/images/itemview_transitions.jpg create mode 100644 examples/location/itemview_transitions/doc/src/itemview_transitions.qdoc create mode 100644 examples/location/itemview_transitions/itemview_transitions.pro create mode 100644 examples/location/itemview_transitions/main.cpp create mode 100644 examples/location/itemview_transitions/main.qml create mode 100644 examples/location/location.pro create mode 100644 examples/location/mapviewer/doc/images/mapviewer.png create mode 100644 examples/location/mapviewer/doc/src/mapviewer.qdoc create mode 100644 examples/location/mapviewer/forms/Geocode.qml create mode 100644 examples/location/mapviewer/forms/GeocodeForm.ui.qml create mode 100644 examples/location/mapviewer/forms/Locale.qml create mode 100644 examples/location/mapviewer/forms/LocaleForm.ui.qml create mode 100644 examples/location/mapviewer/forms/Message.qml create mode 100644 examples/location/mapviewer/forms/MessageForm.ui.qml create mode 100644 examples/location/mapviewer/forms/ReverseGeocode.qml create mode 100644 examples/location/mapviewer/forms/ReverseGeocodeForm.ui.qml create mode 100644 examples/location/mapviewer/forms/RouteAddress.qml create mode 100644 examples/location/mapviewer/forms/RouteAddressForm.ui.qml create mode 100644 examples/location/mapviewer/forms/RouteCoordinate.qml create mode 100644 examples/location/mapviewer/forms/RouteCoordinateForm.ui.qml create mode 100644 examples/location/mapviewer/forms/RouteList.qml create mode 100644 examples/location/mapviewer/forms/RouteListDelegate.qml create mode 100644 examples/location/mapviewer/forms/RouteListHeader.qml create mode 100644 examples/location/mapviewer/helper.js create mode 100644 examples/location/mapviewer/main.cpp create mode 100644 examples/location/mapviewer/map/CircleItem.qml create mode 100644 examples/location/mapviewer/map/ImageItem.qml create mode 100644 examples/location/mapviewer/map/MapComponent.qml create mode 100644 examples/location/mapviewer/map/MapSliders.qml create mode 100644 examples/location/mapviewer/map/Marker.qml create mode 100644 examples/location/mapviewer/map/MiniMap.qml create mode 100644 examples/location/mapviewer/map/PolygonItem.qml create mode 100644 examples/location/mapviewer/map/PolylineItem.qml create mode 100644 examples/location/mapviewer/map/RectangleItem.qml create mode 100644 examples/location/mapviewer/mapviewer.pro create mode 100644 examples/location/mapviewer/mapviewer.qml create mode 100644 examples/location/mapviewer/mapviewer.qrc create mode 100644 examples/location/mapviewer/menus/ItemPopupMenu.qml create mode 100644 examples/location/mapviewer/menus/MainMenu.qml create mode 100644 examples/location/mapviewer/menus/MapPopupMenu.qml create mode 100644 examples/location/mapviewer/menus/MarkerPopupMenu.qml create mode 100644 examples/location/mapviewer/resources/icon.png create mode 100644 examples/location/mapviewer/resources/marker.png create mode 100644 examples/location/mapviewer/resources/scale.png create mode 100644 examples/location/mapviewer/resources/scale_end.png create mode 100644 examples/location/minimal_map/doc/images/minimal_map.png create mode 100644 examples/location/minimal_map/doc/src/minimal_map.qdoc create mode 100644 examples/location/minimal_map/main.cpp create mode 100644 examples/location/minimal_map/main.qml create mode 100644 examples/location/minimal_map/minimal_map.pro create mode 100644 examples/location/minimal_map/qml.qrc create mode 100644 examples/location/places/doc/images/places.png create mode 100644 examples/location/places/doc/src/places.qdoc create mode 100644 examples/location/places/forms/Message.qml create mode 100644 examples/location/places/forms/MessageForm.ui.qml create mode 100644 examples/location/places/forms/PlaceDetails.qml create mode 100644 examples/location/places/forms/PlaceDetailsForm.ui.qml create mode 100644 examples/location/places/forms/SearchBoundingBox.qml create mode 100644 examples/location/places/forms/SearchBoundingBoxForm.ui.qml create mode 100644 examples/location/places/forms/SearchBoundingCircle.qml create mode 100644 examples/location/places/forms/SearchBoundingCircleForm.ui.qml create mode 100644 examples/location/places/forms/SearchCenter.qml create mode 100644 examples/location/places/forms/SearchCenterForm.ui.qml create mode 100644 examples/location/places/forms/SearchOptions.qml create mode 100644 examples/location/places/forms/SearchOptionsForm.ui.qml create mode 100644 examples/location/places/helper.js create mode 100644 examples/location/places/items/MainMenu.qml create mode 100644 examples/location/places/items/MapComponent.qml create mode 100644 examples/location/places/items/SearchBar.qml create mode 100644 examples/location/places/main.cpp create mode 100644 examples/location/places/places.pro create mode 100644 examples/location/places/places.qml create mode 100644 examples/location/places/places.qrc create mode 100644 examples/location/places/resources/categories.png create mode 100644 examples/location/places/resources/left.png create mode 100644 examples/location/places/resources/marker.png create mode 100644 examples/location/places/resources/right.png create mode 100644 examples/location/places/resources/scale.png create mode 100644 examples/location/places/resources/scale_end.png create mode 100644 examples/location/places/resources/search.png create mode 100644 examples/location/places/resources/star.png create mode 100644 examples/location/places/views/CategoryDelegate.qml create mode 100644 examples/location/places/views/CategoryView.qml create mode 100644 examples/location/places/views/EditorialDelegate.qml create mode 100644 examples/location/places/views/EditorialPage.qml create mode 100644 examples/location/places/views/EditorialView.qml create mode 100644 examples/location/places/views/ImageView.qml create mode 100644 examples/location/places/views/RatingView.qml create mode 100644 examples/location/places/views/ReviewDelegate.qml create mode 100644 examples/location/places/views/ReviewPage.qml create mode 100644 examples/location/places/views/ReviewView.qml create mode 100644 examples/location/places/views/SearchResultDelegate.qml create mode 100644 examples/location/places/views/SearchResultView.qml create mode 100644 examples/location/places/views/SuggestionView.qml create mode 100644 examples/location/places_list/Marker.qml create mode 100644 examples/location/places_list/doc/images/places_list.png create mode 100644 examples/location/places_list/doc/src/places_list.qdoc create mode 100644 examples/location/places_list/main.cpp create mode 100644 examples/location/places_list/marker.png create mode 100644 examples/location/places_list/places_list.pro create mode 100644 examples/location/places_list/places_list.qml create mode 100644 examples/location/places_list/places_list.qrc create mode 100644 examples/location/places_map/doc/images/places_map.png create mode 100644 examples/location/places_map/doc/src/places_map.qdoc create mode 100644 examples/location/places_map/main.cpp create mode 100644 examples/location/places_map/marker.png create mode 100644 examples/location/places_map/places_map.pro create mode 100644 examples/location/places_map/places_map.qml create mode 100644 examples/location/places_map/places_map.qrc create mode 100644 examples/location/planespotter/Plane.qml create mode 100644 examples/location/planespotter/airplane.png create mode 100644 examples/location/planespotter/doc/images/planespotter.png create mode 100644 examples/location/planespotter/doc/src/planespotter.qdoc create mode 100644 examples/location/planespotter/main.cpp create mode 100644 examples/location/planespotter/planespotter.pro create mode 100644 examples/location/planespotter/planespotter.qml create mode 100644 examples/location/planespotter/qml.qrc create mode 100644 examples/positioning/geoflickr/doc/images/qml-flickr-1.jpg create mode 100644 examples/positioning/geoflickr/doc/src/geoflickr.qdoc create mode 100644 examples/positioning/geoflickr/flickr-90.qml create mode 100644 examples/positioning/geoflickr/flickr.qml create mode 100644 examples/positioning/geoflickr/flickr.qrc create mode 100644 examples/positioning/geoflickr/flickrcommon/Progress.qml create mode 100644 examples/positioning/geoflickr/flickrcommon/RestModel.qml create mode 100644 examples/positioning/geoflickr/flickrcommon/ScrollBar.qml create mode 100644 examples/positioning/geoflickr/flickrcommon/Slider.qml create mode 100644 examples/positioning/geoflickr/flickrmobile/Button.qml create mode 100644 examples/positioning/geoflickr/flickrmobile/GeoTab.qml create mode 100644 examples/positioning/geoflickr/flickrmobile/GridDelegate.qml create mode 100644 examples/positioning/geoflickr/flickrmobile/ImageDetails.qml create mode 100644 examples/positioning/geoflickr/flickrmobile/ListDelegate.qml create mode 100644 examples/positioning/geoflickr/flickrmobile/TitleBar.qml create mode 100644 examples/positioning/geoflickr/flickrmobile/ToolBar.qml create mode 100644 examples/positioning/geoflickr/flickrmobile/images/gloss.png create mode 100644 examples/positioning/geoflickr/flickrmobile/images/lineedit.png create mode 100644 examples/positioning/geoflickr/flickrmobile/images/lineedit.sci create mode 100644 examples/positioning/geoflickr/flickrmobile/images/moon.png create mode 100644 examples/positioning/geoflickr/flickrmobile/images/quit.png create mode 100644 examples/positioning/geoflickr/flickrmobile/images/star.png create mode 100644 examples/positioning/geoflickr/flickrmobile/images/stripes.png create mode 100644 examples/positioning/geoflickr/flickrmobile/images/sun.png create mode 100644 examples/positioning/geoflickr/flickrmobile/images/titlebar.png create mode 100644 examples/positioning/geoflickr/flickrmobile/images/titlebar.sci create mode 100644 examples/positioning/geoflickr/flickrmobile/images/toolbutton.png create mode 100644 examples/positioning/geoflickr/flickrmobile/images/toolbutton.sci create mode 100644 examples/positioning/geoflickr/flickrmobile/nmealog.txt create mode 100644 examples/positioning/geoflickr/geoflickr.pro create mode 100644 examples/positioning/geoflickr/geoflickr.qmlproject create mode 100644 examples/positioning/geoflickr/qmllocationflickr.cpp create mode 100644 examples/positioning/logfilepositionsource/clientapplication.cpp create mode 100644 examples/positioning/logfilepositionsource/clientapplication.h create mode 100644 examples/positioning/logfilepositionsource/doc/src/logfilepositionsource.qdoc create mode 100644 examples/positioning/logfilepositionsource/logfile.qrc create mode 100644 examples/positioning/logfilepositionsource/logfilepositionsource.cpp create mode 100644 examples/positioning/logfilepositionsource/logfilepositionsource.h create mode 100644 examples/positioning/logfilepositionsource/logfilepositionsource.pro create mode 100644 examples/positioning/logfilepositionsource/main.cpp create mode 100644 examples/positioning/logfilepositionsource/simplelog.txt create mode 100644 examples/positioning/positioning.pro create mode 100644 examples/positioning/satelliteinfo/doc/images/example-satelliteinfo.png create mode 100644 examples/positioning/satelliteinfo/doc/src/satelliteinfo.qdoc create mode 100644 examples/positioning/satelliteinfo/main.cpp create mode 100644 examples/positioning/satelliteinfo/satelliteinfo.pro create mode 100644 examples/positioning/satelliteinfo/satelliteinfo.qml create mode 100644 examples/positioning/satelliteinfo/satelliteinfo.qrc create mode 100644 examples/positioning/satelliteinfo/satellitemodel.cpp create mode 100644 examples/positioning/satelliteinfo/satellitemodel.h create mode 100644 examples/positioning/weatherinfo/appmodel.cpp create mode 100644 examples/positioning/weatherinfo/appmodel.h create mode 100644 examples/positioning/weatherinfo/components/BigForecastIcon.qml create mode 100644 examples/positioning/weatherinfo/components/ForecastIcon.qml create mode 100644 examples/positioning/weatherinfo/components/WeatherIcon.qml create mode 100644 examples/positioning/weatherinfo/doc/images/example-weatherinfo.png create mode 100644 examples/positioning/weatherinfo/doc/src/weatherinfo.qdoc create mode 100644 examples/positioning/weatherinfo/icons/README.txt create mode 100644 examples/positioning/weatherinfo/icons/qt_attribution.json create mode 100644 examples/positioning/weatherinfo/icons/weather-few-clouds.png create mode 100644 examples/positioning/weatherinfo/icons/weather-fog.png create mode 100644 examples/positioning/weatherinfo/icons/weather-haze.png create mode 100644 examples/positioning/weatherinfo/icons/weather-icy.png create mode 100644 examples/positioning/weatherinfo/icons/weather-overcast.png create mode 100644 examples/positioning/weatherinfo/icons/weather-showers.png create mode 100644 examples/positioning/weatherinfo/icons/weather-sleet.png create mode 100644 examples/positioning/weatherinfo/icons/weather-snow.png create mode 100644 examples/positioning/weatherinfo/icons/weather-storm.png create mode 100644 examples/positioning/weatherinfo/icons/weather-sunny-very-few-clouds.png create mode 100644 examples/positioning/weatherinfo/icons/weather-sunny.png create mode 100644 examples/positioning/weatherinfo/icons/weather-thundershower.png create mode 100644 examples/positioning/weatherinfo/main.cpp create mode 100644 examples/positioning/weatherinfo/weatherinfo.pro create mode 100644 examples/positioning/weatherinfo/weatherinfo.qml create mode 100644 examples/positioning/weatherinfo/weatherinfo.qrc create mode 100644 include/QtLocation/5.15.8/QtLocation/private/error_messages_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/locationvaluetypehelper_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qabstractgeotilecache_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qcache3q_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qdeclarativecategory_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qdeclarativecirclemapitem_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qdeclarativecirclemapitem_p_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qdeclarativecontactdetail_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qdeclarativegeocodemodel_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qdeclarativegeomaneuver_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qdeclarativegeomap_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qdeclarativegeomapcopyrightsnotice_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qdeclarativegeomapitembase_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qdeclarativegeomapitemgroup_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qdeclarativegeomapitemtransitionmanager_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qdeclarativegeomapitemutils_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qdeclarativegeomapitemview_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qdeclarativegeomapparameter_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qdeclarativegeomapquickitem_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qdeclarativegeomaptype_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qdeclarativegeoroute_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qdeclarativegeoroutemodel_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qdeclarativegeoroutesegment_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qdeclarativegeoserviceprovider_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qdeclarativenavigator_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qdeclarativenavigator_p_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qdeclarativeperiod_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qdeclarativeplace_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qdeclarativeplaceattribute_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qdeclarativeplacecontentmodel_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qdeclarativeplaceeditorialmodel_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qdeclarativeplaceicon_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qdeclarativeplaceimagemodel_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qdeclarativeplaceuser_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qdeclarativepolygonmapitem_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qdeclarativepolygonmapitem_p_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qdeclarativepolylinemapitem_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qdeclarativepolylinemapitem_p_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qdeclarativeratings_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qdeclarativerectanglemapitem_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qdeclarativerectanglemapitem_p_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qdeclarativereviewmodel_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qdeclarativeroutemapitem_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qdeclarativesearchmodelbase_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qdeclarativesearchresultmodel_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qdeclarativesearchsuggestionmodel_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qdeclarativesupplier_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qdeclarativesupportedcategoriesmodel_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qgeocameracapabilities_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qgeocameradata_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qgeocameratiles_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qgeocameratiles_p_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qgeocodereply_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qgeocodingmanager_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qgeocodingmanagerengine_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qgeofiletilecache_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qgeojson_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qgeomaneuver_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qgeomap_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qgeomap_p_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qgeomapitemgeometry_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qgeomapobject_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qgeomapobject_p_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qgeomapobjectqsgsupport_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qgeomapparameter_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qgeomappingmanager_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qgeomappingmanager_p_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qgeomappingmanagerengine_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qgeomappingmanagerengine_p_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qgeomaptype_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qgeomaptype_p_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qgeoprojection_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qgeoroute_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qgeorouteparser_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qgeorouteparser_p_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qgeorouteparserosrmv4_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qgeorouteparserosrmv5_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qgeoroutereply_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qgeorouterequest_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qgeoroutesegment_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qgeoroutingmanager_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qgeoroutingmanagerengine_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qgeoserviceprovider_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qgeosimplify_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qgeotiledmap_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qgeotiledmap_p_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qgeotiledmaplabs_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qgeotiledmappingmanagerengine_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qgeotiledmappingmanagerengine_p_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qgeotiledmapreply_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qgeotiledmapreply_p_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qgeotiledmapscene_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qgeotiledmapscene_p_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qgeotilefetcher_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qgeotilefetcher_p_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qgeotilerequestmanager_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qgeotilespec_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qgeotilespec_p_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qlocationglobal_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qmapcircleobject_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qmapcircleobject_p_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qmapcircleobjectqsg_p_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qmapiconobject_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qmapiconobject_p_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qmapiconobjectqsg_p_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qmapobjectview_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qmapobjectview_p_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qmappolygonobject_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qmappolygonobject_p_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qmappolygonobjectqsg_p_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qmappolylineobject_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qmappolylineobject_p_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qmappolylineobjectqsg_p_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qmaprouteobject_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qmaprouteobject_p_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qmaprouteobjectqsg_p_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qnavigationmanager_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qnavigationmanagerengine_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qparameterizableobject_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qplace_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qplaceattribute_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qplacecategory_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qplacecontactdetail_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qplacecontent_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qplacecontentrequest_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qplaceeditorial_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qplaceicon_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qplaceimage_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qplacemanagerengine_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qplaceproposedsearchresult_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qplaceratings_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qplacereply_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qplaceresult_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qplacereview_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qplacesearchrequest_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qplacesearchresult_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qplacesupplier_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qplaceuser_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qqsgmapobject_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/qquickgeomapgesturearea_p.h create mode 100644 include/QtLocation/5.15.8/QtLocation/private/unsupportedreplies_p.h create mode 100644 include/QtLocation/QGeoCodeReply create mode 100644 include/QtLocation/QGeoCodingManager create mode 100644 include/QtLocation/QGeoCodingManagerEngine create mode 100644 include/QtLocation/QGeoManeuver create mode 100644 include/QtLocation/QGeoRoute create mode 100644 include/QtLocation/QGeoRouteLeg create mode 100644 include/QtLocation/QGeoRouteReply create mode 100644 include/QtLocation/QGeoRouteRequest create mode 100644 include/QtLocation/QGeoRouteSegment create mode 100644 include/QtLocation/QGeoRoutingManager create mode 100644 include/QtLocation/QGeoRoutingManagerEngine create mode 100644 include/QtLocation/QGeoServiceProvider create mode 100644 include/QtLocation/QGeoServiceProviderFactory create mode 100644 include/QtLocation/QLocation create mode 100644 include/QtLocation/QPlace create mode 100644 include/QtLocation/QPlaceAttribute create mode 100644 include/QtLocation/QPlaceCategory create mode 100644 include/QtLocation/QPlaceContactDetail create mode 100644 include/QtLocation/QPlaceContent create mode 100644 include/QtLocation/QPlaceContentReply create mode 100644 include/QtLocation/QPlaceContentRequest create mode 100644 include/QtLocation/QPlaceDetailsReply create mode 100644 include/QtLocation/QPlaceEditorial create mode 100644 include/QtLocation/QPlaceIcon create mode 100644 include/QtLocation/QPlaceIdReply create mode 100644 include/QtLocation/QPlaceImage create mode 100644 include/QtLocation/QPlaceManager create mode 100644 include/QtLocation/QPlaceManagerEngine create mode 100644 include/QtLocation/QPlaceMatchReply create mode 100644 include/QtLocation/QPlaceMatchRequest create mode 100644 include/QtLocation/QPlaceProposedSearchResult create mode 100644 include/QtLocation/QPlaceRatings create mode 100644 include/QtLocation/QPlaceReply create mode 100644 include/QtLocation/QPlaceResult create mode 100644 include/QtLocation/QPlaceReview create mode 100644 include/QtLocation/QPlaceSearchReply create mode 100644 include/QtLocation/QPlaceSearchRequest create mode 100644 include/QtLocation/QPlaceSearchResult create mode 100644 include/QtLocation/QPlaceSearchSuggestionReply create mode 100644 include/QtLocation/QPlaceSupplier create mode 100644 include/QtLocation/QPlaceUser create mode 100644 include/QtLocation/QtLocation create mode 100644 include/QtLocation/QtLocationVersion create mode 100644 include/QtLocation/headers.pri create mode 100644 include/QtLocation/placemacro.h create mode 100644 include/QtLocation/qgeocodereply.h create mode 100644 include/QtLocation/qgeocodingmanager.h create mode 100644 include/QtLocation/qgeocodingmanagerengine.h create mode 100644 include/QtLocation/qgeomaneuver.h create mode 100644 include/QtLocation/qgeoroute.h create mode 100644 include/QtLocation/qgeoroutereply.h create mode 100644 include/QtLocation/qgeorouterequest.h create mode 100644 include/QtLocation/qgeoroutesegment.h create mode 100644 include/QtLocation/qgeoroutingmanager.h create mode 100644 include/QtLocation/qgeoroutingmanagerengine.h create mode 100644 include/QtLocation/qgeoserviceprovider.h create mode 100644 include/QtLocation/qgeoserviceproviderfactory.h create mode 100644 include/QtLocation/qlocation.h create mode 100644 include/QtLocation/qlocationglobal.h create mode 100644 include/QtLocation/qplace.h create mode 100644 include/QtLocation/qplaceattribute.h create mode 100644 include/QtLocation/qplacecategory.h create mode 100644 include/QtLocation/qplacecontactdetail.h create mode 100644 include/QtLocation/qplacecontent.h create mode 100644 include/QtLocation/qplacecontentreply.h create mode 100644 include/QtLocation/qplacecontentrequest.h create mode 100644 include/QtLocation/qplacedetailsreply.h create mode 100644 include/QtLocation/qplaceeditorial.h create mode 100644 include/QtLocation/qplaceicon.h create mode 100644 include/QtLocation/qplaceidreply.h create mode 100644 include/QtLocation/qplaceimage.h create mode 100644 include/QtLocation/qplacemanager.h create mode 100644 include/QtLocation/qplacemanagerengine.h create mode 100644 include/QtLocation/qplacematchreply.h create mode 100644 include/QtLocation/qplacematchrequest.h create mode 100644 include/QtLocation/qplaceproposedsearchresult.h create mode 100644 include/QtLocation/qplaceratings.h create mode 100644 include/QtLocation/qplacereply.h create mode 100644 include/QtLocation/qplaceresult.h create mode 100644 include/QtLocation/qplacereview.h create mode 100644 include/QtLocation/qplacesearchreply.h create mode 100644 include/QtLocation/qplacesearchrequest.h create mode 100644 include/QtLocation/qplacesearchresult.h create mode 100644 include/QtLocation/qplacesearchsuggestionreply.h create mode 100644 include/QtLocation/qplacesupplier.h create mode 100644 include/QtLocation/qplaceuser.h create mode 100644 include/QtLocation/qtlocationversion.h create mode 100644 include/QtPositioning/5.15.8/QtPositioning/private/qclipperutils_p.h create mode 100644 include/QtPositioning/5.15.8/QtPositioning/private/qdoublematrix4x4_p.h create mode 100644 include/QtPositioning/5.15.8/QtPositioning/private/qdoublevector2d_p.h create mode 100644 include/QtPositioning/5.15.8/QtPositioning/private/qdoublevector3d_p.h create mode 100644 include/QtPositioning/5.15.8/QtPositioning/private/qgeoaddress_p.h create mode 100644 include/QtPositioning/5.15.8/QtPositioning/private/qgeocircle_p.h create mode 100644 include/QtPositioning/5.15.8/QtPositioning/private/qgeocoordinate_p.h create mode 100644 include/QtPositioning/5.15.8/QtPositioning/private/qgeocoordinateobject_p.h create mode 100644 include/QtPositioning/5.15.8/QtPositioning/private/qgeolocation_p.h create mode 100644 include/QtPositioning/5.15.8/QtPositioning/private/qgeopath_p.h create mode 100644 include/QtPositioning/5.15.8/QtPositioning/private/qgeopolygon_p.h create mode 100644 include/QtPositioning/5.15.8/QtPositioning/private/qgeopositioninfo_p.h create mode 100644 include/QtPositioning/5.15.8/QtPositioning/private/qgeopositioninfosource_p.h create mode 100644 include/QtPositioning/5.15.8/QtPositioning/private/qgeorectangle_p.h create mode 100644 include/QtPositioning/5.15.8/QtPositioning/private/qgeosatelliteinfo_p.h create mode 100644 include/QtPositioning/5.15.8/QtPositioning/private/qgeosatelliteinfosource_p.h create mode 100644 include/QtPositioning/5.15.8/QtPositioning/private/qgeoshape_p.h create mode 100644 include/QtPositioning/5.15.8/QtPositioning/private/qlocationdata_simulator_p.h create mode 100644 include/QtPositioning/5.15.8/QtPositioning/private/qlocationutils_p.h create mode 100644 include/QtPositioning/5.15.8/QtPositioning/private/qnmeapositioninfosource_p.h create mode 100644 include/QtPositioning/5.15.8/QtPositioning/private/qpositioningglobal_p.h create mode 100644 include/QtPositioning/5.15.8/QtPositioning/private/qwebmercator_p.h create mode 100644 include/QtPositioning/QGeoAddress create mode 100644 include/QtPositioning/QGeoAreaMonitorInfo create mode 100644 include/QtPositioning/QGeoAreaMonitorSource create mode 100644 include/QtPositioning/QGeoCircle create mode 100644 include/QtPositioning/QGeoCoordinate create mode 100644 include/QtPositioning/QGeoLocation create mode 100644 include/QtPositioning/QGeoPath create mode 100644 include/QtPositioning/QGeoPolygon create mode 100644 include/QtPositioning/QGeoPositionInfo create mode 100644 include/QtPositioning/QGeoPositionInfoSource create mode 100644 include/QtPositioning/QGeoPositionInfoSourceFactory create mode 100644 include/QtPositioning/QGeoRectangle create mode 100644 include/QtPositioning/QGeoSatelliteInfo create mode 100644 include/QtPositioning/QGeoSatelliteInfoSource create mode 100644 include/QtPositioning/QGeoShape create mode 100644 include/QtPositioning/QNmeaPositionInfoSource create mode 100644 include/QtPositioning/QtPositioning create mode 100644 include/QtPositioning/QtPositioningVersion create mode 100644 include/QtPositioning/headers.pri create mode 100644 include/QtPositioning/qgeoaddress.h create mode 100644 include/QtPositioning/qgeoareamonitorinfo.h create mode 100644 include/QtPositioning/qgeoareamonitorsource.h create mode 100644 include/QtPositioning/qgeocircle.h create mode 100644 include/QtPositioning/qgeocoordinate.h create mode 100644 include/QtPositioning/qgeolocation.h create mode 100644 include/QtPositioning/qgeopath.h create mode 100644 include/QtPositioning/qgeopolygon.h create mode 100644 include/QtPositioning/qgeopositioninfo.h create mode 100644 include/QtPositioning/qgeopositioninfosource.h create mode 100644 include/QtPositioning/qgeopositioninfosourcefactory.h create mode 100644 include/QtPositioning/qgeorectangle.h create mode 100644 include/QtPositioning/qgeosatelliteinfo.h create mode 100644 include/QtPositioning/qgeosatelliteinfosource.h create mode 100644 include/QtPositioning/qgeoshape.h create mode 100644 include/QtPositioning/qnmeapositioninfosource.h create mode 100644 include/QtPositioning/qpositioningglobal.h create mode 100644 include/QtPositioning/qtpositioningversion.h create mode 100644 include/QtPositioningQuick/5.15.8/QtPositioningQuick/private/qdeclarativegeoaddress_p.h create mode 100644 include/QtPositioningQuick/5.15.8/QtPositioningQuick/private/qdeclarativegeolocation_p.h create mode 100644 include/QtPositioningQuick/5.15.8/QtPositioningQuick/private/qdeclarativepluginparameter_p.h create mode 100644 include/QtPositioningQuick/5.15.8/QtPositioningQuick/private/qdeclarativeposition_p.h create mode 100644 include/QtPositioningQuick/5.15.8/QtPositioningQuick/private/qdeclarativepositionsource_p.h create mode 100644 include/QtPositioningQuick/5.15.8/QtPositioningQuick/private/qpositioningquickglobal_p.h create mode 100644 include/QtPositioningQuick/5.15.8/QtPositioningQuick/private/qquickgeocoordinateanimation_p.h create mode 100644 include/QtPositioningQuick/5.15.8/QtPositioningQuick/private/qquickgeocoordinateanimation_p_p.h create mode 100644 include/QtPositioningQuick/QtPositioningQuick create mode 100644 include/QtPositioningQuick/QtPositioningQuickVersion create mode 100644 include/QtPositioningQuick/headers.pri create mode 100644 include/QtPositioningQuick/qpositioningquickglobal.h create mode 100644 include/QtPositioningQuick/qtpositioningquickversion.h create mode 100644 qtlocation.pro create mode 100644 src/3rdparty/clip2tri/LICENSE create mode 100644 src/3rdparty/clip2tri/clip2tri.cpp create mode 100644 src/3rdparty/clip2tri/clip2tri.h create mode 100644 src/3rdparty/clip2tri/clip2tri.pro create mode 100644 src/3rdparty/clip2tri/qt_attribution.json create mode 100644 src/3rdparty/clipper/LICENSE create mode 100644 src/3rdparty/clipper/clipper.cpp create mode 100644 src/3rdparty/clipper/clipper.h create mode 100644 src/3rdparty/clipper/clipper.pro create mode 100644 src/3rdparty/clipper/qt_attribution.json create mode 100644 src/3rdparty/earcut/LICENSE create mode 100644 src/3rdparty/earcut/earcut.hpp create mode 100644 src/3rdparty/earcut/qt_attribution.json create mode 100644 src/3rdparty/geosimplify.js/LICENSE create mode 100644 src/3rdparty/geosimplify.js/qt_attribution.json create mode 100644 src/3rdparty/mapbox-gl-native/LICENSE.md create mode 100644 src/3rdparty/mapbox-gl-native/LICENSE_Boost.txt create mode 100644 src/3rdparty/mapbox-gl-native/LICENSE_CSSColorParser.txt create mode 100644 src/3rdparty/mapbox-gl-native/LICENSE_geojson.txt create mode 100644 src/3rdparty/mapbox-gl-native/LICENSE_geojson_vt_cpp.txt create mode 100644 src/3rdparty/mapbox-gl-native/LICENSE_geometry.txt create mode 100644 src/3rdparty/mapbox-gl-native/LICENSE_mapbox.txt create mode 100644 src/3rdparty/mapbox-gl-native/LICENSE_parsedate.txt create mode 100644 src/3rdparty/mapbox-gl-native/LICENSE_protozero.txt create mode 100644 src/3rdparty/mapbox-gl-native/LICENSE_rapidjson.txt create mode 100644 src/3rdparty/mapbox-gl-native/LICENSE_vectortile.txt create mode 100644 src/3rdparty/mapbox-gl-native/LICENSE_wagyu.txt create mode 100644 src/3rdparty/mapbox-gl-native/deps/earcut/0.12.4/LICENSE create mode 100644 src/3rdparty/mapbox-gl-native/deps/earcut/0.12.4/include/mapbox/earcut.hpp create mode 100644 src/3rdparty/mapbox-gl-native/deps/geojson/0.4.2/include/mapbox/geojson.hpp create mode 100644 src/3rdparty/mapbox-gl-native/deps/geojson/0.4.2/include/mapbox/geojson/rapidjson.hpp create mode 100644 src/3rdparty/mapbox-gl-native/deps/geojson/0.4.2/include/mapbox/geojson_impl.hpp create mode 100644 src/3rdparty/mapbox-gl-native/deps/geojsonvt/6.5.1/include/mapbox/geojsonvt.hpp create mode 100644 src/3rdparty/mapbox-gl-native/deps/geojsonvt/6.5.1/include/mapbox/geojsonvt/clip.hpp create mode 100644 src/3rdparty/mapbox-gl-native/deps/geojsonvt/6.5.1/include/mapbox/geojsonvt/convert.hpp create mode 100644 src/3rdparty/mapbox-gl-native/deps/geojsonvt/6.5.1/include/mapbox/geojsonvt/simplify.hpp create mode 100644 src/3rdparty/mapbox-gl-native/deps/geojsonvt/6.5.1/include/mapbox/geojsonvt/tile.hpp create mode 100644 src/3rdparty/mapbox-gl-native/deps/geojsonvt/6.5.1/include/mapbox/geojsonvt/types.hpp create mode 100644 src/3rdparty/mapbox-gl-native/deps/geojsonvt/6.5.1/include/mapbox/geojsonvt/wrap.hpp create mode 100644 src/3rdparty/mapbox-gl-native/deps/geometry/0.9.3/include/mapbox/geometry.hpp create mode 100644 src/3rdparty/mapbox-gl-native/deps/geometry/0.9.3/include/mapbox/geometry/box.hpp create mode 100644 src/3rdparty/mapbox-gl-native/deps/geometry/0.9.3/include/mapbox/geometry/envelope.hpp create mode 100644 src/3rdparty/mapbox-gl-native/deps/geometry/0.9.3/include/mapbox/geometry/feature.hpp create mode 100644 src/3rdparty/mapbox-gl-native/deps/geometry/0.9.3/include/mapbox/geometry/for_each_point.hpp create mode 100644 src/3rdparty/mapbox-gl-native/deps/geometry/0.9.3/include/mapbox/geometry/geometry.hpp create mode 100644 src/3rdparty/mapbox-gl-native/deps/geometry/0.9.3/include/mapbox/geometry/line_string.hpp create mode 100644 src/3rdparty/mapbox-gl-native/deps/geometry/0.9.3/include/mapbox/geometry/multi_line_string.hpp create mode 100644 src/3rdparty/mapbox-gl-native/deps/geometry/0.9.3/include/mapbox/geometry/multi_point.hpp create mode 100644 src/3rdparty/mapbox-gl-native/deps/geometry/0.9.3/include/mapbox/geometry/multi_polygon.hpp create mode 100644 src/3rdparty/mapbox-gl-native/deps/geometry/0.9.3/include/mapbox/geometry/point.hpp create mode 100644 src/3rdparty/mapbox-gl-native/deps/geometry/0.9.3/include/mapbox/geometry/point_arithmetic.hpp create mode 100644 src/3rdparty/mapbox-gl-native/deps/geometry/0.9.3/include/mapbox/geometry/polygon.hpp create mode 100644 src/3rdparty/mapbox-gl-native/deps/kdbush/0.1.1-1/LICENSE create mode 100644 src/3rdparty/mapbox-gl-native/deps/kdbush/0.1.1-1/include/kdbush.hpp create mode 100644 src/3rdparty/mapbox-gl-native/deps/optional/f27e7908/include/experimental/optional create mode 100644 src/3rdparty/mapbox-gl-native/deps/polylabel/1.0.3/LICENSE create mode 100644 src/3rdparty/mapbox-gl-native/deps/polylabel/1.0.3/include/mapbox/polylabel.hpp create mode 100644 src/3rdparty/mapbox-gl-native/deps/protozero/1.5.2/include/protozero/byteswap.hpp create mode 100644 src/3rdparty/mapbox-gl-native/deps/protozero/1.5.2/include/protozero/config.hpp create mode 100644 src/3rdparty/mapbox-gl-native/deps/protozero/1.5.2/include/protozero/exception.hpp create mode 100644 src/3rdparty/mapbox-gl-native/deps/protozero/1.5.2/include/protozero/iterators.hpp create mode 100644 src/3rdparty/mapbox-gl-native/deps/protozero/1.5.2/include/protozero/pbf_builder.hpp create mode 100644 src/3rdparty/mapbox-gl-native/deps/protozero/1.5.2/include/protozero/pbf_message.hpp create mode 100644 src/3rdparty/mapbox-gl-native/deps/protozero/1.5.2/include/protozero/pbf_reader.hpp create mode 100644 src/3rdparty/mapbox-gl-native/deps/protozero/1.5.2/include/protozero/pbf_writer.hpp create mode 100644 src/3rdparty/mapbox-gl-native/deps/protozero/1.5.2/include/protozero/types.hpp create mode 100644 src/3rdparty/mapbox-gl-native/deps/protozero/1.5.2/include/protozero/varint.hpp create mode 100644 src/3rdparty/mapbox-gl-native/deps/protozero/1.5.2/include/protozero/version.hpp create mode 100644 src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/allocators.h create mode 100644 src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/document.h create mode 100644 src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/encodedstream.h create mode 100644 src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/encodings.h create mode 100644 src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/error/en.h create mode 100644 src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/error/error.h create mode 100644 src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/filereadstream.h create mode 100644 src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/filewritestream.h create mode 100644 src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/fwd.h create mode 100644 src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/internal/biginteger.h create mode 100644 src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/internal/diyfp.h create mode 100644 src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/internal/dtoa.h create mode 100644 src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/internal/ieee754.h create mode 100644 src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/internal/itoa.h create mode 100644 src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/internal/meta.h create mode 100644 src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/internal/pow10.h create mode 100644 src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/internal/regex.h create mode 100644 src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/internal/stack.h create mode 100644 src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/internal/strfunc.h create mode 100644 src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/internal/strtod.h create mode 100644 src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/internal/swap.h create mode 100644 src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/istreamwrapper.h create mode 100644 src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/memorybuffer.h create mode 100644 src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/memorystream.h create mode 100644 src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/msinttypes/inttypes.h create mode 100644 src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/msinttypes/stdint.h create mode 100644 src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/ostreamwrapper.h create mode 100644 src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/pointer.h create mode 100644 src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/prettywriter.h create mode 100644 src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/rapidjson.h create mode 100644 src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/reader.h create mode 100644 src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/schema.h create mode 100644 src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/stream.h create mode 100644 src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/stringbuffer.h create mode 100644 src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/writer.h create mode 100644 src/3rdparty/mapbox-gl-native/deps/shelf-pack/2.1.1/LICENSE.md create mode 100644 src/3rdparty/mapbox-gl-native/deps/shelf-pack/2.1.1/include/mapbox/shelf-pack.hpp create mode 100644 src/3rdparty/mapbox-gl-native/deps/supercluster/0.2.2/LICENSE create mode 100644 src/3rdparty/mapbox-gl-native/deps/supercluster/0.2.2/include/supercluster.hpp create mode 100644 src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/LICENSE create mode 100644 src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/include/tao/seq/concatenate.hpp create mode 100644 src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/include/tao/seq/config.hpp create mode 100644 src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/include/tao/seq/exclusive_scan.hpp create mode 100644 src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/include/tao/seq/fold.hpp create mode 100644 src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/include/tao/seq/head.hpp create mode 100644 src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/include/tao/seq/inclusive_scan.hpp create mode 100644 src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/include/tao/seq/integer_sequence.hpp create mode 100644 src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/include/tao/seq/is_all.hpp create mode 100644 src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/include/tao/seq/is_any.hpp create mode 100644 src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/include/tao/seq/make_integer_sequence.hpp create mode 100644 src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/include/tao/seq/map.hpp create mode 100644 src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/include/tao/seq/max.hpp create mode 100644 src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/include/tao/seq/min.hpp create mode 100644 src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/include/tao/seq/minus.hpp create mode 100644 src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/include/tao/seq/partial_sum.hpp create mode 100644 src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/include/tao/seq/plus.hpp create mode 100644 src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/include/tao/seq/select.hpp create mode 100644 src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/include/tao/seq/sum.hpp create mode 100644 src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/include/tao/seq/tail.hpp create mode 100644 src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/include/tao/seq/type_by_index.hpp create mode 100644 src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/include/tao/seq/values.hpp create mode 100644 src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/include/tao/seq/zip.hpp create mode 100644 src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/include/tao/tuple/tuple.hpp create mode 100644 src/3rdparty/mapbox-gl-native/deps/unique_resource/cba309e/include/unique_resource.hpp create mode 100644 src/3rdparty/mapbox-gl-native/deps/variant/1.1.4/LICENSE create mode 100644 src/3rdparty/mapbox-gl-native/deps/variant/1.1.4/include/mapbox/optional.hpp create mode 100644 src/3rdparty/mapbox-gl-native/deps/variant/1.1.4/include/mapbox/recursive_wrapper.hpp create mode 100644 src/3rdparty/mapbox-gl-native/deps/variant/1.1.4/include/mapbox/variant.hpp create mode 100644 src/3rdparty/mapbox-gl-native/deps/variant/1.1.4/include/mapbox/variant_io.hpp create mode 100644 src/3rdparty/mapbox-gl-native/deps/variant/1.1.4/include/mapbox/variant_visitor.hpp create mode 100644 src/3rdparty/mapbox-gl-native/deps/vector-tile/1.0.2/include/mapbox/vector_tile.hpp create mode 100644 src/3rdparty/mapbox-gl-native/deps/vector-tile/1.0.2/include/mapbox/vector_tile/vector_tile_config.hpp create mode 100644 src/3rdparty/mapbox-gl-native/deps/vector-tile/1.0.2/include/mapbox/vector_tile/version.hpp create mode 100644 src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/active_bound_list.hpp create mode 100644 src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/bound.hpp create mode 100644 src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/bubble_sort.hpp create mode 100644 src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/build_edges.hpp create mode 100644 src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/build_local_minima_list.hpp create mode 100644 src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/build_result.hpp create mode 100644 src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/config.hpp create mode 100644 src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/edge.hpp create mode 100644 src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/intersect.hpp create mode 100644 src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/intersect_util.hpp create mode 100644 src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/local_minimum.hpp create mode 100644 src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/local_minimum_util.hpp create mode 100644 src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/point.hpp create mode 100644 src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/process_horizontal.hpp create mode 100644 src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/process_maxima.hpp create mode 100644 src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/quick_clip.hpp create mode 100644 src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/ring.hpp create mode 100644 src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/ring_util.hpp create mode 100644 src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/scanbeam.hpp create mode 100644 src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/snap_rounding.hpp create mode 100644 src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/topology_correction.hpp create mode 100644 src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/util.hpp create mode 100644 src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/vatti.hpp create mode 100644 src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/wagyu.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/actor/actor.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/actor/actor_ref.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/actor/aspiring_actor.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/actor/established_actor.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/actor/mailbox.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/actor/message.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/actor/scheduler.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/annotation/annotation.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/map/camera.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/map/change.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/map/map.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/map/map_observer.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/map/mode.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/math/clamp.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/math/log2.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/math/minmax.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/math/wrap.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/renderer/backend_scope.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/renderer/mode.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/renderer/query.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/renderer/renderer.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/renderer/renderer_backend.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/renderer/renderer_frontend.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/renderer/renderer_observer.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/storage/default_file_source.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/storage/file_source.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/storage/network_status.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/storage/offline.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/storage/online_file_source.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/storage/resource.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/storage/resource_transform.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/storage/response.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/style/color_ramp_property_value.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/style/conversion.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/style/conversion/color_ramp_property_value.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/style/conversion/constant.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/style/conversion/coordinate.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/style/conversion/custom_geometry_source_options.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/style/conversion/data_driven_property_value.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/style/conversion/filter.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/style/conversion/function.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/style/conversion/geojson.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/style/conversion/geojson_options.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/style/conversion/get_json_type.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/style/conversion/layer.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/style/conversion/light.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/style/conversion/position.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/style/conversion/property_value.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/style/conversion/source.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/style/conversion/tileset.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/style/conversion/transition_options.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/style/data_driven_property_value.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/array_assertion.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/assertion.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/at.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/boolean_operator.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/case.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/check_subtype.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/coalesce.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/coercion.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/collator.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/collator_expression.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/compound_expression.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/dsl.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/equals.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/error.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/expression.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/find_zoom_curve.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/get_covering_stops.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/interpolate.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/interpolator.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/is_constant.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/is_expression.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/length.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/let.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/literal.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/match.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/parsing_context.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/step.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/type.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/value.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/style/filter.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/style/image.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/style/layer.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/style/layer_type.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/style/layers/background_layer.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/style/layers/circle_layer.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/style/layers/custom_layer.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/style/layers/fill_extrusion_layer.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/style/layers/fill_layer.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/style/layers/heatmap_layer.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/style/layers/hillshade_layer.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/style/layers/layer.hpp.ejs create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/style/layers/line_layer.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/style/layers/raster_layer.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/style/layers/symbol_layer.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/style/light.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/style/light.hpp.ejs create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/style/position.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/style/property_expression.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/style/property_value.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/style/source.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/style/sources/custom_geometry_source.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/style/sources/geojson_source.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/style/sources/image_source.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/style/sources/raster_dem_source.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/style/sources/raster_source.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/style/sources/vector_source.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/style/style.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/style/transition_options.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/style/types.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/style/undefined.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/tile/tile_id.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/tile/tile_necessity.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/util/async_request.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/util/async_task.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/util/char_array_buffer.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/util/chrono.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/util/color.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/util/compression.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/util/constants.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/util/convert.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/util/enum.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/util/event.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/util/exception.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/util/feature.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/util/font_stack.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/util/geo.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/util/geojson.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/util/geometry.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/util/ignore.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/util/image.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/util/immutable.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/util/indexed_tuple.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/util/interpolate.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/util/logging.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/util/noncopyable.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/util/optional.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/util/platform.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/util/premultiply.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/util/projection.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/util/range.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/util/run_loop.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/util/size.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/util/string.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/util/thread.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/util/tileset.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/util/timer.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/util/traits.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/util/tuple.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/util/type_list.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/util/unique_any.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/util/unitbezier.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/util/util.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/util/variant.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/util/work_request.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/util/work_task.hpp create mode 100644 src/3rdparty/mapbox-gl-native/include/mbgl/util/work_task_impl.hpp create mode 100644 src/3rdparty/mapbox-gl-native/mapbox-gl-native.pro create mode 100644 src/3rdparty/mapbox-gl-native/platform/default/asset_file_source.cpp create mode 100644 src/3rdparty/mapbox-gl-native/platform/default/async_task.cpp create mode 100644 src/3rdparty/mapbox-gl-native/platform/default/bidi.cpp create mode 100644 src/3rdparty/mapbox-gl-native/platform/default/collator.cpp create mode 100644 src/3rdparty/mapbox-gl-native/platform/default/default_file_source.cpp create mode 100644 src/3rdparty/mapbox-gl-native/platform/default/file_source_request.cpp create mode 100644 src/3rdparty/mapbox-gl-native/platform/default/headless_backend_osmesa.cpp create mode 100644 src/3rdparty/mapbox-gl-native/platform/default/http_file_source.cpp create mode 100644 src/3rdparty/mapbox-gl-native/platform/default/image.cpp create mode 100644 src/3rdparty/mapbox-gl-native/platform/default/jpeg_reader.cpp create mode 100644 src/3rdparty/mapbox-gl-native/platform/default/local_file_source.cpp create mode 100644 src/3rdparty/mapbox-gl-native/platform/default/local_glyph_rasterizer.cpp create mode 100644 src/3rdparty/mapbox-gl-native/platform/default/logging_stderr.cpp create mode 100644 src/3rdparty/mapbox-gl-native/platform/default/mbgl/gl/headless_backend.cpp create mode 100644 src/3rdparty/mapbox-gl-native/platform/default/mbgl/gl/headless_backend.hpp create mode 100644 src/3rdparty/mapbox-gl-native/platform/default/mbgl/gl/headless_frontend.cpp create mode 100644 src/3rdparty/mapbox-gl-native/platform/default/mbgl/gl/headless_frontend.hpp create mode 100644 src/3rdparty/mapbox-gl-native/platform/default/mbgl/map/map_snapshotter.cpp create mode 100644 src/3rdparty/mapbox-gl-native/platform/default/mbgl/map/map_snapshotter.hpp create mode 100644 src/3rdparty/mapbox-gl-native/platform/default/mbgl/storage/.clang-tidy create mode 100644 src/3rdparty/mapbox-gl-native/platform/default/mbgl/storage/file_source_request.hpp create mode 100644 src/3rdparty/mapbox-gl-native/platform/default/mbgl/storage/offline.cpp create mode 100644 src/3rdparty/mapbox-gl-native/platform/default/mbgl/storage/offline_database.cpp create mode 100644 src/3rdparty/mapbox-gl-native/platform/default/mbgl/storage/offline_database.hpp create mode 100644 src/3rdparty/mapbox-gl-native/platform/default/mbgl/storage/offline_download.cpp create mode 100644 src/3rdparty/mapbox-gl-native/platform/default/mbgl/storage/offline_download.hpp create mode 100644 src/3rdparty/mapbox-gl-native/platform/default/mbgl/storage/offline_schema.hpp create mode 100644 src/3rdparty/mapbox-gl-native/platform/default/mbgl/storage/offline_schema.js create mode 100644 src/3rdparty/mapbox-gl-native/platform/default/mbgl/storage/offline_schema.sql create mode 100644 src/3rdparty/mapbox-gl-native/platform/default/mbgl/test/main.cpp create mode 100644 src/3rdparty/mapbox-gl-native/platform/default/mbgl/util/default_styles.hpp create mode 100644 src/3rdparty/mapbox-gl-native/platform/default/mbgl/util/default_thread_pool.cpp create mode 100644 src/3rdparty/mapbox-gl-native/platform/default/mbgl/util/default_thread_pool.hpp create mode 100644 src/3rdparty/mapbox-gl-native/platform/default/mbgl/util/shared_thread_pool.cpp create mode 100644 src/3rdparty/mapbox-gl-native/platform/default/mbgl/util/shared_thread_pool.hpp create mode 100644 src/3rdparty/mapbox-gl-native/platform/default/online_file_source.cpp create mode 100644 src/3rdparty/mapbox-gl-native/platform/default/png_reader.cpp create mode 100644 src/3rdparty/mapbox-gl-native/platform/default/png_writer.cpp create mode 100644 src/3rdparty/mapbox-gl-native/platform/default/run_loop.cpp create mode 100644 src/3rdparty/mapbox-gl-native/platform/default/sqlite3.cpp create mode 100644 src/3rdparty/mapbox-gl-native/platform/default/sqlite3.hpp create mode 100644 src/3rdparty/mapbox-gl-native/platform/default/string_stdlib.cpp create mode 100644 src/3rdparty/mapbox-gl-native/platform/default/thread.cpp create mode 100644 src/3rdparty/mapbox-gl-native/platform/default/thread_local.cpp create mode 100644 src/3rdparty/mapbox-gl-native/platform/default/timer.cpp create mode 100644 src/3rdparty/mapbox-gl-native/platform/default/unaccent.cpp create mode 100644 src/3rdparty/mapbox-gl-native/platform/default/unaccent.hpp create mode 100644 src/3rdparty/mapbox-gl-native/platform/default/utf.cpp create mode 100644 src/3rdparty/mapbox-gl-native/platform/default/webp_reader.cpp create mode 100644 src/3rdparty/mapbox-gl-native/platform/qt/include/QMapbox create mode 100644 src/3rdparty/mapbox-gl-native/platform/qt/include/QMapboxGL create mode 100644 src/3rdparty/mapbox-gl-native/platform/qt/include/qmapbox.hpp create mode 100644 src/3rdparty/mapbox-gl-native/platform/qt/include/qmapboxgl.hpp create mode 100644 src/3rdparty/mapbox-gl-native/platform/qt/mbgl/gl/gl_impl.hpp create mode 100644 src/3rdparty/mapbox-gl-native/platform/qt/src/async_task.cpp create mode 100644 src/3rdparty/mapbox-gl-native/platform/qt/src/async_task_impl.hpp create mode 100644 src/3rdparty/mapbox-gl-native/platform/qt/src/bidi.cpp create mode 100644 src/3rdparty/mapbox-gl-native/platform/qt/src/http_file_source.cpp create mode 100644 src/3rdparty/mapbox-gl-native/platform/qt/src/http_file_source.hpp create mode 100644 src/3rdparty/mapbox-gl-native/platform/qt/src/http_request.cpp create mode 100644 src/3rdparty/mapbox-gl-native/platform/qt/src/http_request.hpp create mode 100644 src/3rdparty/mapbox-gl-native/platform/qt/src/qmapbox.cpp create mode 100644 src/3rdparty/mapbox-gl-native/platform/qt/src/qmapboxgl.cpp create mode 100644 src/3rdparty/mapbox-gl-native/platform/qt/src/qmapboxgl_map_observer.cpp create mode 100644 src/3rdparty/mapbox-gl-native/platform/qt/src/qmapboxgl_map_observer.hpp create mode 100644 src/3rdparty/mapbox-gl-native/platform/qt/src/qmapboxgl_map_renderer.cpp create mode 100644 src/3rdparty/mapbox-gl-native/platform/qt/src/qmapboxgl_map_renderer.hpp create mode 100644 src/3rdparty/mapbox-gl-native/platform/qt/src/qmapboxgl_p.hpp create mode 100644 src/3rdparty/mapbox-gl-native/platform/qt/src/qmapboxgl_renderer_backend.cpp create mode 100644 src/3rdparty/mapbox-gl-native/platform/qt/src/qmapboxgl_renderer_backend.hpp create mode 100644 src/3rdparty/mapbox-gl-native/platform/qt/src/qmapboxgl_renderer_observer.hpp create mode 100644 src/3rdparty/mapbox-gl-native/platform/qt/src/qmapboxgl_scheduler.cpp create mode 100644 src/3rdparty/mapbox-gl-native/platform/qt/src/qmapboxgl_scheduler.hpp create mode 100644 src/3rdparty/mapbox-gl-native/platform/qt/src/qt_conversion.hpp create mode 100644 src/3rdparty/mapbox-gl-native/platform/qt/src/qt_geojson.cpp create mode 100644 src/3rdparty/mapbox-gl-native/platform/qt/src/qt_geojson.hpp create mode 100644 src/3rdparty/mapbox-gl-native/platform/qt/src/qt_image.cpp create mode 100644 src/3rdparty/mapbox-gl-native/platform/qt/src/qt_logging.cpp create mode 100644 src/3rdparty/mapbox-gl-native/platform/qt/src/run_loop.cpp create mode 100644 src/3rdparty/mapbox-gl-native/platform/qt/src/run_loop_impl.hpp create mode 100644 src/3rdparty/mapbox-gl-native/platform/qt/src/sqlite3.cpp create mode 100644 src/3rdparty/mapbox-gl-native/platform/qt/src/string_stdlib.cpp create mode 100644 src/3rdparty/mapbox-gl-native/platform/qt/src/thread.cpp create mode 100644 src/3rdparty/mapbox-gl-native/platform/qt/src/thread_local.cpp create mode 100644 src/3rdparty/mapbox-gl-native/platform/qt/src/timer.cpp create mode 100644 src/3rdparty/mapbox-gl-native/platform/qt/src/timer_impl.hpp create mode 100644 src/3rdparty/mapbox-gl-native/platform/qt/src/utf.cpp create mode 100644 src/3rdparty/mapbox-gl-native/qt_attribution.json create mode 100644 src/3rdparty/mapbox-gl-native/src/csscolorparser/csscolorparser.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/csscolorparser/csscolorparser.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/actor/mailbox.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/actor/scheduler.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/algorithm/covered_by_children.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/algorithm/generate_clip_ids.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/algorithm/generate_clip_ids.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/algorithm/generate_clip_ids_impl.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/algorithm/update_renderables.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/algorithm/update_tile_masks.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/annotation/annotation_manager.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/annotation/annotation_manager.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/annotation/annotation_source.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/annotation/annotation_source.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/annotation/annotation_tile.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/annotation/annotation_tile.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/annotation/fill_annotation_impl.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/annotation/fill_annotation_impl.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/annotation/line_annotation_impl.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/annotation/line_annotation_impl.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/annotation/render_annotation_source.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/annotation/render_annotation_source.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/annotation/shape_annotation_impl.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/annotation/shape_annotation_impl.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/annotation/symbol_annotation_impl.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/annotation/symbol_annotation_impl.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/geometry/anchor.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/geometry/debug_font_data.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/geometry/dem_data.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/geometry/dem_data.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/geometry/feature_index.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/geometry/feature_index.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/geometry/line_atlas.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/geometry/line_atlas.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/gl/attribute.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/gl/attribute.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/gl/color_mode.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/gl/color_mode.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/gl/context.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/gl/context.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/gl/debugging.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/gl/debugging.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/gl/debugging_extension.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/gl/debugging_extension.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/gl/depth_mode.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/gl/depth_mode.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/gl/draw_mode.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/gl/extension.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/gl/features.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/gl/framebuffer.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/gl/gl.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/gl/gl.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/gl/index_buffer.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/gl/object.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/gl/object.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/gl/primitives.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/gl/program.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/gl/program_binary_extension.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/gl/renderbuffer.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/gl/state.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/gl/stencil_mode.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/gl/stencil_mode.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/gl/texture.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/gl/types.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/gl/uniform.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/gl/uniform.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/gl/value.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/gl/value.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/gl/vertex_array.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/gl/vertex_array.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/gl/vertex_array_extension.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/gl/vertex_buffer.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/layout/clip_lines.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/layout/clip_lines.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/layout/merge_lines.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/layout/merge_lines.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/layout/symbol_feature.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/layout/symbol_instance.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/layout/symbol_instance.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/layout/symbol_layout.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/layout/symbol_layout.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/layout/symbol_projection.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/layout/symbol_projection.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/map/map.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/map/transform.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/map/transform.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/map/transform_state.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/map/transform_state.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/map/zoom_history.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/math/log2.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/programs/attributes.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/programs/background_program.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/programs/background_program.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/programs/binary_program.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/programs/binary_program.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/programs/circle_program.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/programs/circle_program.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/programs/clipping_mask_program.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/programs/collision_box_program.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/programs/collision_box_program.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/programs/debug_program.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/programs/extrusion_texture_program.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/programs/extrusion_texture_program.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/programs/fill_extrusion_program.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/programs/fill_extrusion_program.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/programs/fill_program.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/programs/fill_program.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/programs/heatmap_program.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/programs/heatmap_program.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/programs/heatmap_texture_program.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/programs/heatmap_texture_program.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/programs/hillshade_prepare_program.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/programs/hillshade_prepare_program.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/programs/hillshade_program.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/programs/hillshade_program.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/programs/line_program.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/programs/line_program.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/programs/program.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/programs/program_parameters.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/programs/program_parameters.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/programs/programs.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/programs/raster_program.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/programs/raster_program.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/programs/segment.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/programs/symbol_program.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/programs/symbol_program.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/programs/uniforms.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/renderer/backend_scope.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/renderer/bucket.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/renderer/bucket_parameters.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/renderer/bucket_parameters.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/renderer/buckets/circle_bucket.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/renderer/buckets/circle_bucket.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/renderer/buckets/debug_bucket.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/renderer/buckets/debug_bucket.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/renderer/buckets/fill_bucket.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/renderer/buckets/fill_bucket.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/renderer/buckets/fill_extrusion_bucket.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/renderer/buckets/fill_extrusion_bucket.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/renderer/buckets/heatmap_bucket.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/renderer/buckets/heatmap_bucket.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/renderer/buckets/hillshade_bucket.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/renderer/buckets/hillshade_bucket.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/renderer/buckets/line_bucket.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/renderer/buckets/line_bucket.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/renderer/buckets/raster_bucket.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/renderer/buckets/raster_bucket.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/renderer/buckets/symbol_bucket.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/renderer/buckets/symbol_bucket.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/renderer/cross_faded_property_evaluator.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/renderer/cross_faded_property_evaluator.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/renderer/data_driven_property_evaluator.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/renderer/group_by_layout.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/renderer/group_by_layout.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/renderer/image_atlas.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/renderer/image_atlas.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/renderer/image_manager.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/renderer/image_manager.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/renderer/layers/render_background_layer.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/renderer/layers/render_background_layer.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/renderer/layers/render_circle_layer.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/renderer/layers/render_circle_layer.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/renderer/layers/render_custom_layer.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/renderer/layers/render_custom_layer.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/renderer/layers/render_fill_extrusion_layer.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/renderer/layers/render_fill_extrusion_layer.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/renderer/layers/render_fill_layer.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/renderer/layers/render_fill_layer.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/renderer/layers/render_heatmap_layer.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/renderer/layers/render_heatmap_layer.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/renderer/layers/render_hillshade_layer.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/renderer/layers/render_hillshade_layer.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/renderer/layers/render_line_layer.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/renderer/layers/render_line_layer.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/renderer/layers/render_raster_layer.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/renderer/layers/render_raster_layer.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/renderer/layers/render_symbol_layer.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/renderer/layers/render_symbol_layer.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/renderer/paint_parameters.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/renderer/paint_parameters.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/renderer/paint_property_binder.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/renderer/paint_property_statistics.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/renderer/possibly_evaluated_property_value.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/renderer/property_evaluation_parameters.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/renderer/property_evaluator.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/renderer/render_layer.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/renderer/render_layer.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/renderer/render_light.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/renderer/render_light.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/renderer/render_pass.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/renderer/render_source.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/renderer/render_source.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/renderer/render_source_observer.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/renderer/render_static_data.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/renderer/render_static_data.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/renderer/render_tile.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/renderer/render_tile.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/renderer/renderer.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/renderer/renderer_backend.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/renderer/renderer_impl.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/renderer/renderer_impl.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/renderer/sources/render_custom_geometry_source.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/renderer/sources/render_custom_geometry_source.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/renderer/sources/render_geojson_source.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/renderer/sources/render_geojson_source.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/renderer/sources/render_image_source.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/renderer/sources/render_image_source.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/renderer/sources/render_raster_dem_source.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/renderer/sources/render_raster_dem_source.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/renderer/sources/render_raster_source.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/renderer/sources/render_raster_source.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/renderer/sources/render_vector_source.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/renderer/sources/render_vector_source.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/renderer/style_diff.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/renderer/style_diff.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/renderer/tile_mask.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/renderer/tile_parameters.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/renderer/tile_pyramid.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/renderer/tile_pyramid.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/renderer/transition_parameters.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/renderer/update_parameters.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/shaders/background.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/shaders/background.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/shaders/background_pattern.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/shaders/background_pattern.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/shaders/circle.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/shaders/circle.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/shaders/clipping_mask.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/shaders/clipping_mask.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/shaders/collision_box.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/shaders/collision_box.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/shaders/collision_circle.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/shaders/collision_circle.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/shaders/debug.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/shaders/debug.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/shaders/extrusion_texture.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/shaders/extrusion_texture.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/shaders/fill.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/shaders/fill.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/shaders/fill_extrusion.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/shaders/fill_extrusion.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/shaders/fill_extrusion_pattern.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/shaders/fill_extrusion_pattern.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/shaders/fill_outline.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/shaders/fill_outline.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/shaders/fill_outline_pattern.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/shaders/fill_outline_pattern.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/shaders/fill_pattern.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/shaders/fill_pattern.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/shaders/heatmap.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/shaders/heatmap.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/shaders/heatmap_texture.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/shaders/heatmap_texture.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/shaders/hillshade.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/shaders/hillshade.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/shaders/hillshade_prepare.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/shaders/hillshade_prepare.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/shaders/line.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/shaders/line.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/shaders/line_pattern.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/shaders/line_pattern.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/shaders/line_sdf.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/shaders/line_sdf.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/shaders/preludes.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/shaders/preludes.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/shaders/raster.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/shaders/raster.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/shaders/shaders.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/shaders/shaders.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/shaders/source.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/shaders/source.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/shaders/symbol_icon.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/shaders/symbol_icon.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/shaders/symbol_sdf.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/shaders/symbol_sdf.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/sprite/sprite_loader.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/sprite/sprite_loader.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/sprite/sprite_loader_observer.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/sprite/sprite_loader_worker.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/sprite/sprite_loader_worker.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/sprite/sprite_parser.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/sprite/sprite_parser.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/storage/asset_file_source.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/storage/http_file_source.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/storage/local_file_source.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/storage/network_status.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/storage/resource.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/storage/resource_transform.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/storage/response.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/collection.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/conversion/constant.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/conversion/coordinate.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/conversion/filter.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/conversion/function.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/conversion/geojson.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/conversion/geojson_options.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/conversion/get_json_type.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/conversion/json.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/conversion/layer.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/conversion/light.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/conversion/make_property_setters.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/conversion/make_property_setters.hpp.ejs create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/conversion/position.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/conversion/property_setter.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/conversion/source.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/conversion/stringify.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/conversion/tileset.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/conversion/transition_options.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/custom_tile_loader.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/custom_tile_loader.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/expression/array_assertion.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/expression/assertion.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/expression/at.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/expression/boolean_operator.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/expression/case.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/expression/check_subtype.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/expression/coalesce.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/expression/coercion.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/expression/collator_expression.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/expression/compound_expression.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/expression/dsl.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/expression/equals.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/expression/expression.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/expression/find_zoom_curve.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/expression/get_covering_stops.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/expression/interpolate.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/expression/is_constant.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/expression/is_expression.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/expression/length.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/expression/let.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/expression/literal.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/expression/match.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/expression/parsing_context.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/expression/step.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/expression/util.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/expression/util.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/expression/value.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/filter.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/image.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/image_impl.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/image_impl.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/layer.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/layer_impl.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/layer_impl.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/layer_observer.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/layers/background_layer.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/layers/background_layer_impl.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/layers/background_layer_impl.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/layers/background_layer_properties.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/layers/background_layer_properties.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/layers/circle_layer.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/layers/circle_layer_impl.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/layers/circle_layer_impl.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/layers/circle_layer_properties.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/layers/circle_layer_properties.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/layers/custom_layer.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/layers/custom_layer_impl.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/layers/custom_layer_impl.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/layers/fill_extrusion_layer.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/layers/fill_extrusion_layer_impl.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/layers/fill_extrusion_layer_impl.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/layers/fill_extrusion_layer_properties.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/layers/fill_extrusion_layer_properties.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/layers/fill_layer.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/layers/fill_layer_impl.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/layers/fill_layer_impl.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/layers/fill_layer_properties.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/layers/fill_layer_properties.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/layers/heatmap_layer.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/layers/heatmap_layer_impl.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/layers/heatmap_layer_impl.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/layers/heatmap_layer_properties.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/layers/heatmap_layer_properties.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/layers/hillshade_layer.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/layers/hillshade_layer_impl.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/layers/hillshade_layer_impl.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/layers/hillshade_layer_properties.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/layers/hillshade_layer_properties.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/layers/layer.cpp.ejs create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/layers/layer_properties.cpp.ejs create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/layers/layer_properties.hpp.ejs create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/layers/line_layer.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/layers/line_layer_impl.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/layers/line_layer_impl.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/layers/line_layer_properties.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/layers/line_layer_properties.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/layers/raster_layer.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/layers/raster_layer_impl.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/layers/raster_layer_impl.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/layers/raster_layer_properties.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/layers/raster_layer_properties.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/layers/symbol_layer.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/layers/symbol_layer_impl.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/layers/symbol_layer_impl.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/layers/symbol_layer_properties.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/layers/symbol_layer_properties.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/layout_property.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/light.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/light.cpp.ejs create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/light_impl.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/light_impl.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/light_observer.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/observer.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/paint_property.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/parser.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/parser.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/properties.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/rapidjson_conversion.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/source.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/source_impl.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/source_impl.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/source_observer.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/sources/custom_geometry_source.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/sources/custom_geometry_source_impl.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/sources/custom_geometry_source_impl.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/sources/geojson_source.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/sources/geojson_source_impl.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/sources/geojson_source_impl.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/sources/image_source.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/sources/image_source_impl.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/sources/image_source_impl.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/sources/raster_dem_source.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/sources/raster_source.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/sources/raster_source_impl.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/sources/raster_source_impl.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/sources/vector_source.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/sources/vector_source_impl.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/sources/vector_source_impl.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/style.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/style_impl.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/style_impl.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/style/types.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/text/bidi.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/text/check_max_angle.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/text/check_max_angle.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/text/collision_feature.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/text/collision_feature.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/text/collision_index.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/text/collision_index.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/text/cross_tile_symbol_index.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/text/cross_tile_symbol_index.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/text/get_anchors.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/text/get_anchors.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/text/glyph.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/text/glyph.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/text/glyph_atlas.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/text/glyph_atlas.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/text/glyph_manager.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/text/glyph_manager.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/text/glyph_manager_observer.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/text/glyph_pbf.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/text/glyph_pbf.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/text/glyph_range.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/text/language_tag.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/text/language_tag.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/text/local_glyph_rasterizer.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/text/placement.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/text/placement.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/text/quads.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/text/quads.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/text/shaping.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/text/shaping.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/tile/custom_geometry_tile.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/tile/custom_geometry_tile.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/tile/geojson_tile.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/tile/geojson_tile.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/tile/geojson_tile_data.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/tile/geometry_tile.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/tile/geometry_tile.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/tile/geometry_tile_data.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/tile/geometry_tile_data.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/tile/geometry_tile_worker.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/tile/geometry_tile_worker.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/tile/raster_dem_tile.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/tile/raster_dem_tile.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/tile/raster_dem_tile_worker.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/tile/raster_dem_tile_worker.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/tile/raster_tile.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/tile/raster_tile.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/tile/raster_tile_worker.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/tile/raster_tile_worker.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/tile/tile.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/tile/tile.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/tile/tile_cache.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/tile/tile_cache.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/tile/tile_id_hash.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/tile/tile_id_io.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/tile/tile_loader.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/tile/tile_loader_impl.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/tile/tile_observer.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/tile/vector_tile.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/tile/vector_tile.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/tile/vector_tile_data.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/tile/vector_tile_data.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/util/chrono.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/util/clip_id.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/util/clip_id.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/util/color.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/util/compression.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/util/constants.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/util/convert.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/util/dtoa.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/util/dtoa.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/util/event.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/util/font_stack.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/util/geo.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/util/geojson_impl.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/util/grid_index.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/util/grid_index.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/util/http_header.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/util/http_header.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/util/http_timeout.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/util/http_timeout.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/util/i18n.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/util/i18n.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/util/interpolate.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/util/intersection_tests.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/util/intersection_tests.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/util/io.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/util/io.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/util/logging.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/util/longest_common_subsequence.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/util/mapbox.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/util/mapbox.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/util/mat2.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/util/mat2.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/util/mat3.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/util/mat3.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/util/mat4.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/util/mat4.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/util/math.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/util/offscreen_texture.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/util/offscreen_texture.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/util/premultiply.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/util/rapidjson.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/util/rect.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/util/std.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/util/stopwatch.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/util/stopwatch.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/util/string.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/util/thread_local.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/util/tile_coordinate.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/util/tile_cover.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/util/tile_cover.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/util/tile_cover_impl.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/util/tile_cover_impl.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/util/tile_range.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/util/tiny_sdf.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/util/tiny_sdf.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/util/token.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/util/url.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/util/url.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/util/utf.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/util/version.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/util/version.hpp create mode 100644 src/3rdparty/mapbox-gl-native/src/mbgl/util/work_request.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/parsedate/parsedate.cpp create mode 100644 src/3rdparty/mapbox-gl-native/src/parsedate/parsedate.hpp create mode 100644 src/3rdparty/mapbox-gl-native/vendor/nunicode/LICENSE create mode 100644 src/3rdparty/mapbox-gl-native/vendor/nunicode/files.txt create mode 100644 src/3rdparty/mapbox-gl-native/vendor/nunicode/include/libnu/casemap.h create mode 100644 src/3rdparty/mapbox-gl-native/vendor/nunicode/include/libnu/casemap_internal.h create mode 100644 src/3rdparty/mapbox-gl-native/vendor/nunicode/include/libnu/config.h create mode 100644 src/3rdparty/mapbox-gl-native/vendor/nunicode/include/libnu/defines.h create mode 100644 src/3rdparty/mapbox-gl-native/vendor/nunicode/include/libnu/ducet.h create mode 100644 src/3rdparty/mapbox-gl-native/vendor/nunicode/include/libnu/mph.h create mode 100644 src/3rdparty/mapbox-gl-native/vendor/nunicode/include/libnu/strcoll.h create mode 100644 src/3rdparty/mapbox-gl-native/vendor/nunicode/include/libnu/strcoll_internal.h create mode 100644 src/3rdparty/mapbox-gl-native/vendor/nunicode/include/libnu/strings.h create mode 100644 src/3rdparty/mapbox-gl-native/vendor/nunicode/include/libnu/udb.h create mode 100644 src/3rdparty/mapbox-gl-native/vendor/nunicode/include/libnu/unaccent.h create mode 100644 src/3rdparty/mapbox-gl-native/vendor/nunicode/include/libnu/utf8.h create mode 100644 src/3rdparty/mapbox-gl-native/vendor/nunicode/include/libnu/utf8_internal.h create mode 100644 src/3rdparty/mapbox-gl-native/vendor/nunicode/src/libnu/ducet.c create mode 100644 src/3rdparty/mapbox-gl-native/vendor/nunicode/src/libnu/gen/_ducet.c create mode 100644 src/3rdparty/mapbox-gl-native/vendor/nunicode/src/libnu/gen/_ducet_switch.c create mode 100644 src/3rdparty/mapbox-gl-native/vendor/nunicode/src/libnu/gen/_tolower.c create mode 100644 src/3rdparty/mapbox-gl-native/vendor/nunicode/src/libnu/gen/_tounaccent.c create mode 100644 src/3rdparty/mapbox-gl-native/vendor/nunicode/src/libnu/gen/_toupper.c create mode 100644 src/3rdparty/mapbox-gl-native/vendor/nunicode/src/libnu/strcoll.c create mode 100644 src/3rdparty/mapbox-gl-native/vendor/nunicode/src/libnu/strings.c create mode 100644 src/3rdparty/mapbox-gl-native/vendor/nunicode/src/libnu/tolower.c create mode 100644 src/3rdparty/mapbox-gl-native/vendor/nunicode/src/libnu/tounaccent.c create mode 100644 src/3rdparty/mapbox-gl-native/vendor/nunicode/src/libnu/toupper.c create mode 100644 src/3rdparty/mapbox-gl-native/vendor/nunicode/src/libnu/utf8.c create mode 100644 src/3rdparty/mapbox-gl-native/vendor/nunicode/version.txt create mode 100644 src/3rdparty/poly2tri/AUTHORS create mode 100644 src/3rdparty/poly2tri/LICENSE create mode 100644 src/3rdparty/poly2tri/common/shapes.cpp create mode 100644 src/3rdparty/poly2tri/common/shapes.h create mode 100644 src/3rdparty/poly2tri/common/utils.h create mode 100644 src/3rdparty/poly2tri/poly2tri.h create mode 100644 src/3rdparty/poly2tri/poly2tri.pro create mode 100644 src/3rdparty/poly2tri/qt_attribution.json create mode 100644 src/3rdparty/poly2tri/sweep/advancing_front.cpp create mode 100644 src/3rdparty/poly2tri/sweep/advancing_front.h create mode 100644 src/3rdparty/poly2tri/sweep/cdt.cpp create mode 100644 src/3rdparty/poly2tri/sweep/cdt.h create mode 100644 src/3rdparty/poly2tri/sweep/sweep.cpp create mode 100644 src/3rdparty/poly2tri/sweep/sweep.h create mode 100644 src/3rdparty/poly2tri/sweep/sweep_context.cpp create mode 100644 src/3rdparty/poly2tri/sweep/sweep_context.h create mode 100644 src/3rdparty/zlib_dependency.pri create mode 100644 src/imports/imports.pro create mode 100644 src/imports/location/location.cpp create mode 100644 src/imports/location/location.pro create mode 100644 src/imports/location/plugin.json create mode 100644 src/imports/location/plugins.qmltypes create mode 100644 src/imports/location/qmldir create mode 100644 src/imports/locationlabs/locationlabs.cpp create mode 100644 src/imports/locationlabs/locationlabs.pro create mode 100644 src/imports/locationlabs/locationlabssingleton.cpp create mode 100644 src/imports/locationlabs/locationlabssingleton_p.h create mode 100644 src/imports/locationlabs/plugin.json create mode 100644 src/imports/locationlabs/plugins.qmltypes create mode 100644 src/imports/locationlabs/qmldir create mode 100644 src/imports/positioning/locationsingleton.cpp create mode 100644 src/imports/positioning/locationsingleton.h create mode 100644 src/imports/positioning/plugin.json create mode 100644 src/imports/positioning/plugins.qmltypes create mode 100644 src/imports/positioning/positioning.cpp create mode 100644 src/imports/positioning/positioning.pro create mode 100644 src/imports/positioning/qmldir create mode 100644 src/location/configure.json create mode 100644 src/location/declarativemaps/declarativemaps.pri create mode 100644 src/location/declarativemaps/error_messages.cpp create mode 100644 src/location/declarativemaps/error_messages_p.h create mode 100644 src/location/declarativemaps/locationvaluetypehelper.cpp create mode 100644 src/location/declarativemaps/locationvaluetypehelper_p.h create mode 100644 src/location/declarativemaps/qdeclarativecirclemapitem.cpp create mode 100644 src/location/declarativemaps/qdeclarativecirclemapitem_p.h create mode 100644 src/location/declarativemaps/qdeclarativecirclemapitem_p_p.h create mode 100644 src/location/declarativemaps/qdeclarativegeocodemodel.cpp create mode 100644 src/location/declarativemaps/qdeclarativegeocodemodel_p.h create mode 100644 src/location/declarativemaps/qdeclarativegeomaneuver.cpp create mode 100644 src/location/declarativemaps/qdeclarativegeomaneuver_p.h create mode 100644 src/location/declarativemaps/qdeclarativegeomap.cpp create mode 100644 src/location/declarativemaps/qdeclarativegeomap_p.h create mode 100644 src/location/declarativemaps/qdeclarativegeomapcopyrightsnotice.cpp create mode 100644 src/location/declarativemaps/qdeclarativegeomapcopyrightsnotice_p.h create mode 100644 src/location/declarativemaps/qdeclarativegeomapitembase.cpp create mode 100644 src/location/declarativemaps/qdeclarativegeomapitembase_p.h create mode 100644 src/location/declarativemaps/qdeclarativegeomapitemgroup.cpp create mode 100644 src/location/declarativemaps/qdeclarativegeomapitemgroup_p.h create mode 100644 src/location/declarativemaps/qdeclarativegeomapitemtransitionmanager.cpp create mode 100644 src/location/declarativemaps/qdeclarativegeomapitemtransitionmanager_p.h create mode 100644 src/location/declarativemaps/qdeclarativegeomapitemutils.cpp create mode 100644 src/location/declarativemaps/qdeclarativegeomapitemutils_p.h create mode 100644 src/location/declarativemaps/qdeclarativegeomapitemview.cpp create mode 100644 src/location/declarativemaps/qdeclarativegeomapitemview_p.h create mode 100644 src/location/declarativemaps/qdeclarativegeomapparameter.cpp create mode 100644 src/location/declarativemaps/qdeclarativegeomapparameter_p.h create mode 100644 src/location/declarativemaps/qdeclarativegeomapquickitem.cpp create mode 100644 src/location/declarativemaps/qdeclarativegeomapquickitem_p.h create mode 100644 src/location/declarativemaps/qdeclarativegeomaptype.cpp create mode 100644 src/location/declarativemaps/qdeclarativegeomaptype_p.h create mode 100644 src/location/declarativemaps/qdeclarativegeoroute.cpp create mode 100644 src/location/declarativemaps/qdeclarativegeoroute_p.h create mode 100644 src/location/declarativemaps/qdeclarativegeoroutemodel.cpp create mode 100644 src/location/declarativemaps/qdeclarativegeoroutemodel_p.h create mode 100644 src/location/declarativemaps/qdeclarativegeoroutesegment.cpp create mode 100644 src/location/declarativemaps/qdeclarativegeoroutesegment_p.h create mode 100644 src/location/declarativemaps/qdeclarativegeoserviceprovider.cpp create mode 100644 src/location/declarativemaps/qdeclarativegeoserviceprovider_p.h create mode 100644 src/location/declarativemaps/qdeclarativepolygonmapitem.cpp create mode 100644 src/location/declarativemaps/qdeclarativepolygonmapitem_p.h create mode 100644 src/location/declarativemaps/qdeclarativepolygonmapitem_p_p.h create mode 100644 src/location/declarativemaps/qdeclarativepolylinemapitem.cpp create mode 100644 src/location/declarativemaps/qdeclarativepolylinemapitem_p.h create mode 100644 src/location/declarativemaps/qdeclarativepolylinemapitem_p_p.h create mode 100644 src/location/declarativemaps/qdeclarativerectanglemapitem.cpp create mode 100644 src/location/declarativemaps/qdeclarativerectanglemapitem_p.h create mode 100644 src/location/declarativemaps/qdeclarativerectanglemapitem_p_p.h create mode 100644 src/location/declarativemaps/qdeclarativeroutemapitem.cpp create mode 100644 src/location/declarativemaps/qdeclarativeroutemapitem_p.h create mode 100644 src/location/declarativemaps/qgeomapitemgeometry.cpp create mode 100644 src/location/declarativemaps/qgeomapitemgeometry_p.h create mode 100644 src/location/declarativemaps/qgeomapobject.cpp create mode 100644 src/location/declarativemaps/qgeomapobject_p.h create mode 100644 src/location/declarativemaps/qgeomapobject_p_p.h create mode 100644 src/location/declarativemaps/qgeosimplify.cpp create mode 100644 src/location/declarativemaps/qgeosimplify_p.h create mode 100644 src/location/declarativemaps/qparameterizableobject.cpp create mode 100644 src/location/declarativemaps/qparameterizableobject_p.h create mode 100644 src/location/declarativemaps/qquickgeomapgesturearea.cpp create mode 100644 src/location/declarativemaps/qquickgeomapgesturearea_p.h create mode 100644 src/location/declarativeplaces/declarativeplaces.pri create mode 100644 src/location/declarativeplaces/qdeclarativecategory.cpp create mode 100644 src/location/declarativeplaces/qdeclarativecategory_p.h create mode 100644 src/location/declarativeplaces/qdeclarativecontactdetail.cpp create mode 100644 src/location/declarativeplaces/qdeclarativecontactdetail_p.h create mode 100644 src/location/declarativeplaces/qdeclarativeperiod_p.h create mode 100644 src/location/declarativeplaces/qdeclarativeplace.cpp create mode 100644 src/location/declarativeplaces/qdeclarativeplace_p.h create mode 100644 src/location/declarativeplaces/qdeclarativeplaceattribute.cpp create mode 100644 src/location/declarativeplaces/qdeclarativeplaceattribute_p.h create mode 100644 src/location/declarativeplaces/qdeclarativeplacecontentmodel.cpp create mode 100644 src/location/declarativeplaces/qdeclarativeplacecontentmodel_p.h create mode 100644 src/location/declarativeplaces/qdeclarativeplaceeditorialmodel.cpp create mode 100644 src/location/declarativeplaces/qdeclarativeplaceeditorialmodel_p.h create mode 100644 src/location/declarativeplaces/qdeclarativeplaceicon.cpp create mode 100644 src/location/declarativeplaces/qdeclarativeplaceicon_p.h create mode 100644 src/location/declarativeplaces/qdeclarativeplaceimagemodel.cpp create mode 100644 src/location/declarativeplaces/qdeclarativeplaceimagemodel_p.h create mode 100644 src/location/declarativeplaces/qdeclarativeplaceuser.cpp create mode 100644 src/location/declarativeplaces/qdeclarativeplaceuser_p.h create mode 100644 src/location/declarativeplaces/qdeclarativeratings.cpp create mode 100644 src/location/declarativeplaces/qdeclarativeratings_p.h create mode 100644 src/location/declarativeplaces/qdeclarativereviewmodel.cpp create mode 100644 src/location/declarativeplaces/qdeclarativereviewmodel_p.h create mode 100644 src/location/declarativeplaces/qdeclarativesearchmodelbase.cpp create mode 100644 src/location/declarativeplaces/qdeclarativesearchmodelbase_p.h create mode 100644 src/location/declarativeplaces/qdeclarativesearchresultmodel.cpp create mode 100644 src/location/declarativeplaces/qdeclarativesearchresultmodel_p.h create mode 100644 src/location/declarativeplaces/qdeclarativesearchsuggestionmodel.cpp create mode 100644 src/location/declarativeplaces/qdeclarativesearchsuggestionmodel_p.h create mode 100644 src/location/declarativeplaces/qdeclarativesupplier.cpp create mode 100644 src/location/declarativeplaces/qdeclarativesupplier_p.h create mode 100644 src/location/declarativeplaces/qdeclarativesupportedcategoriesmodel.cpp create mode 100644 src/location/declarativeplaces/qdeclarativesupportedcategoriesmodel_p.h create mode 100644 src/location/doc/images/api-mapcircle.png create mode 100644 src/location/doc/images/api-mapitemgroup.png create mode 100644 src/location/doc/images/api-mappolygon.png create mode 100644 src/location/doc/images/api-mappolyline.png create mode 100644 src/location/doc/images/api-mapquickitem-anchor.png create mode 100644 src/location/doc/images/api-mapquickitem.png create mode 100644 src/location/doc/images/api-maprectangle.png create mode 100644 src/location/doc/images/mapsdemo-finished.png create mode 100644 src/location/doc/images/mapsdemo-routing.png create mode 100644 src/location/doc/images/mapsdemo-searchgui.png create mode 100644 src/location/doc/images/mapsdemo-verybasic.png create mode 100644 src/location/doc/qtlocation.qdocconf create mode 100644 src/location/doc/snippets/cpp/cpp.pro create mode 100644 src/location/doc/snippets/cpp/cppqml.cpp create mode 100644 src/location/doc/snippets/cpp/main.cpp create mode 100644 src/location/doc/snippets/declarative/content/Cell.qml create mode 100644 src/location/doc/snippets/declarative/declarative-location.qml create mode 100644 src/location/doc/snippets/declarative/declarative.pro create mode 100644 src/location/doc/snippets/declarative/maps.qml create mode 100644 src/location/doc/snippets/declarative/marker.png create mode 100644 src/location/doc/snippets/declarative/nmealog.txt create mode 100644 src/location/doc/snippets/declarative/places.qml create mode 100644 src/location/doc/snippets/declarative/places_loader.qml create mode 100644 src/location/doc/snippets/declarative/plugin.qml create mode 100644 src/location/doc/snippets/declarative/routing.qml create mode 100644 src/location/doc/snippets/places/main.cpp create mode 100644 src/location/doc/snippets/places/places.pro create mode 100644 src/location/doc/snippets/places/requesthandler.h create mode 100644 src/location/doc/snippets/snippets.pro create mode 100644 src/location/doc/src/cpp-qml.qdoc create mode 100644 src/location/doc/src/example-parameters.qdocinc create mode 100644 src/location/doc/src/maps.qdoc create mode 100644 src/location/doc/src/place-caveats.qdocinc create mode 100644 src/location/doc/src/place-crossref.qdocinc create mode 100644 src/location/doc/src/place-definition.qdocinc create mode 100644 src/location/doc/src/places.qdoc create mode 100644 src/location/doc/src/plugins/esri.qdoc create mode 100644 src/location/doc/src/plugins/itemsoverlay.qdoc create mode 100644 src/location/doc/src/plugins/mapbox.qdoc create mode 100644 src/location/doc/src/plugins/mapboxgl.qdoc create mode 100644 src/location/doc/src/plugins/nokia.qdoc create mode 100644 src/location/doc/src/plugins/osm.qdoc create mode 100644 src/location/doc/src/plugins/places-backend.qdoc create mode 100644 src/location/doc/src/qml-maps.qdoc create mode 100644 src/location/doc/src/qtlocation-changes.qdoc create mode 100644 src/location/doc/src/qtlocation-cpp.qdoc create mode 100644 src/location/doc/src/qtlocation-examples.qdoc create mode 100644 src/location/doc/src/qtlocation-geoservices.qdoc create mode 100644 src/location/doc/src/qtlocation-qml.qdoc create mode 100644 src/location/doc/src/qtlocation.qdoc create mode 100644 src/location/doc/src/src.pro create mode 100644 src/location/labs/labs.pri create mode 100644 src/location/labs/qdeclarativenavigator.cpp create mode 100644 src/location/labs/qdeclarativenavigator_p.h create mode 100644 src/location/labs/qdeclarativenavigator_p_p.h create mode 100644 src/location/labs/qgeojson.cpp create mode 100644 src/location/labs/qgeojson_p.h create mode 100644 src/location/labs/qgeotiledmaplabs.cpp create mode 100644 src/location/labs/qgeotiledmaplabs_p.h create mode 100644 src/location/labs/qmapcircleobject.cpp create mode 100644 src/location/labs/qmapcircleobject_p.h create mode 100644 src/location/labs/qmapcircleobject_p_p.h create mode 100644 src/location/labs/qmapiconobject.cpp create mode 100644 src/location/labs/qmapiconobject_p.h create mode 100644 src/location/labs/qmapiconobject_p_p.h create mode 100644 src/location/labs/qmapobjectview.cpp create mode 100644 src/location/labs/qmapobjectview_p.h create mode 100644 src/location/labs/qmapobjectview_p_p.h create mode 100644 src/location/labs/qmappolygonobject.cpp create mode 100644 src/location/labs/qmappolygonobject_p.h create mode 100644 src/location/labs/qmappolygonobject_p_p.h create mode 100644 src/location/labs/qmappolylineobject.cpp create mode 100644 src/location/labs/qmappolylineobject_p.h create mode 100644 src/location/labs/qmappolylineobject_p_p.h create mode 100644 src/location/labs/qmaprouteobject.cpp create mode 100644 src/location/labs/qmaprouteobject_p.h create mode 100644 src/location/labs/qmaprouteobject_p_p.h create mode 100644 src/location/labs/qsg/qgeomapobjectqsgsupport.cpp create mode 100644 src/location/labs/qsg/qgeomapobjectqsgsupport_p.h create mode 100644 src/location/labs/qsg/qmapcircleobjectqsg.cpp create mode 100644 src/location/labs/qsg/qmapcircleobjectqsg_p_p.h create mode 100644 src/location/labs/qsg/qmapiconobjectqsg.cpp create mode 100644 src/location/labs/qsg/qmapiconobjectqsg_p_p.h create mode 100644 src/location/labs/qsg/qmappolygonobjectqsg.cpp create mode 100644 src/location/labs/qsg/qmappolygonobjectqsg_p_p.h create mode 100644 src/location/labs/qsg/qmappolylineobjectqsg.cpp create mode 100644 src/location/labs/qsg/qmappolylineobjectqsg_p_p.h create mode 100644 src/location/labs/qsg/qmaprouteobjectqsg.cpp create mode 100644 src/location/labs/qsg/qmaprouteobjectqsg_p_p.h create mode 100644 src/location/labs/qsg/qqsgmapobject.cpp create mode 100644 src/location/labs/qsg/qqsgmapobject_p.h create mode 100644 src/location/location.pro create mode 100644 src/location/maps/maps.pri create mode 100644 src/location/maps/qabstractgeotilecache.cpp create mode 100644 src/location/maps/qabstractgeotilecache_p.h create mode 100644 src/location/maps/qcache3q_p.h create mode 100644 src/location/maps/qgeocameracapabilities.cpp create mode 100644 src/location/maps/qgeocameracapabilities_p.h create mode 100644 src/location/maps/qgeocameradata.cpp create mode 100644 src/location/maps/qgeocameradata_p.h create mode 100644 src/location/maps/qgeocameratiles.cpp create mode 100644 src/location/maps/qgeocameratiles_p.h create mode 100644 src/location/maps/qgeocameratiles_p_p.h create mode 100644 src/location/maps/qgeocodereply.cpp create mode 100644 src/location/maps/qgeocodereply.h create mode 100644 src/location/maps/qgeocodereply_p.h create mode 100644 src/location/maps/qgeocodingmanager.cpp create mode 100644 src/location/maps/qgeocodingmanager.h create mode 100644 src/location/maps/qgeocodingmanager_p.h create mode 100644 src/location/maps/qgeocodingmanagerengine.cpp create mode 100644 src/location/maps/qgeocodingmanagerengine.h create mode 100644 src/location/maps/qgeocodingmanagerengine_p.h create mode 100644 src/location/maps/qgeofiletilecache.cpp create mode 100644 src/location/maps/qgeofiletilecache_p.h create mode 100644 src/location/maps/qgeomaneuver.cpp create mode 100644 src/location/maps/qgeomaneuver.h create mode 100644 src/location/maps/qgeomaneuver_p.h create mode 100644 src/location/maps/qgeomap.cpp create mode 100644 src/location/maps/qgeomap_p.h create mode 100644 src/location/maps/qgeomap_p_p.h create mode 100644 src/location/maps/qgeomapparameter.cpp create mode 100644 src/location/maps/qgeomapparameter_p.h create mode 100644 src/location/maps/qgeomappingmanager.cpp create mode 100644 src/location/maps/qgeomappingmanager_p.h create mode 100644 src/location/maps/qgeomappingmanager_p_p.h create mode 100644 src/location/maps/qgeomappingmanagerengine.cpp create mode 100644 src/location/maps/qgeomappingmanagerengine_p.h create mode 100644 src/location/maps/qgeomappingmanagerengine_p_p.h create mode 100644 src/location/maps/qgeomaptype.cpp create mode 100644 src/location/maps/qgeomaptype_p.h create mode 100644 src/location/maps/qgeomaptype_p_p.h create mode 100644 src/location/maps/qgeoprojection.cpp create mode 100644 src/location/maps/qgeoprojection_p.h create mode 100644 src/location/maps/qgeoroute.cpp create mode 100644 src/location/maps/qgeoroute.h create mode 100644 src/location/maps/qgeoroute_p.h create mode 100644 src/location/maps/qgeorouteparser.cpp create mode 100644 src/location/maps/qgeorouteparser_p.h create mode 100644 src/location/maps/qgeorouteparser_p_p.h create mode 100644 src/location/maps/qgeorouteparserosrmv4.cpp create mode 100644 src/location/maps/qgeorouteparserosrmv4_p.h create mode 100644 src/location/maps/qgeorouteparserosrmv5.cpp create mode 100644 src/location/maps/qgeorouteparserosrmv5_p.h create mode 100644 src/location/maps/qgeoroutereply.cpp create mode 100644 src/location/maps/qgeoroutereply.h create mode 100644 src/location/maps/qgeoroutereply_p.h create mode 100644 src/location/maps/qgeorouterequest.cpp create mode 100644 src/location/maps/qgeorouterequest.h create mode 100644 src/location/maps/qgeorouterequest_p.h create mode 100644 src/location/maps/qgeoroutesegment.cpp create mode 100644 src/location/maps/qgeoroutesegment.h create mode 100644 src/location/maps/qgeoroutesegment_p.h create mode 100644 src/location/maps/qgeoroutingmanager.cpp create mode 100644 src/location/maps/qgeoroutingmanager.h create mode 100644 src/location/maps/qgeoroutingmanager_p.h create mode 100644 src/location/maps/qgeoroutingmanagerengine.cpp create mode 100644 src/location/maps/qgeoroutingmanagerengine.h create mode 100644 src/location/maps/qgeoroutingmanagerengine_p.h create mode 100644 src/location/maps/qgeoserviceprovider.cpp create mode 100644 src/location/maps/qgeoserviceprovider.h create mode 100644 src/location/maps/qgeoserviceprovider_p.h create mode 100644 src/location/maps/qgeoserviceproviderfactory.cpp create mode 100644 src/location/maps/qgeoserviceproviderfactory.h create mode 100644 src/location/maps/qgeotiledmap.cpp create mode 100644 src/location/maps/qgeotiledmap_p.h create mode 100644 src/location/maps/qgeotiledmap_p_p.h create mode 100644 src/location/maps/qgeotiledmappingmanagerengine.cpp create mode 100644 src/location/maps/qgeotiledmappingmanagerengine_p.h create mode 100644 src/location/maps/qgeotiledmappingmanagerengine_p_p.h create mode 100644 src/location/maps/qgeotiledmapreply.cpp create mode 100644 src/location/maps/qgeotiledmapreply_p.h create mode 100644 src/location/maps/qgeotiledmapreply_p_p.h create mode 100644 src/location/maps/qgeotiledmapscene.cpp create mode 100644 src/location/maps/qgeotiledmapscene_p.h create mode 100644 src/location/maps/qgeotiledmapscene_p_p.h create mode 100644 src/location/maps/qgeotilefetcher.cpp create mode 100644 src/location/maps/qgeotilefetcher_p.h create mode 100644 src/location/maps/qgeotilefetcher_p_p.h create mode 100644 src/location/maps/qgeotilerequestmanager.cpp create mode 100644 src/location/maps/qgeotilerequestmanager_p.h create mode 100644 src/location/maps/qgeotilespec.cpp create mode 100644 src/location/maps/qgeotilespec_p.h create mode 100644 src/location/maps/qgeotilespec_p_p.h create mode 100644 src/location/maps/qnavigationmanager.cpp create mode 100644 src/location/maps/qnavigationmanager_p.h create mode 100644 src/location/maps/qnavigationmanagerengine.cpp create mode 100644 src/location/maps/qnavigationmanagerengine_p.h create mode 100644 src/location/places/placemacro.h create mode 100644 src/location/places/places.pri create mode 100644 src/location/places/qplace.cpp create mode 100644 src/location/places/qplace.h create mode 100644 src/location/places/qplace_p.h create mode 100644 src/location/places/qplaceattribute.cpp create mode 100644 src/location/places/qplaceattribute.h create mode 100644 src/location/places/qplaceattribute_p.h create mode 100644 src/location/places/qplacecategory.cpp create mode 100644 src/location/places/qplacecategory.h create mode 100644 src/location/places/qplacecategory_p.h create mode 100644 src/location/places/qplacecontactdetail.cpp create mode 100644 src/location/places/qplacecontactdetail.h create mode 100644 src/location/places/qplacecontactdetail_p.h create mode 100644 src/location/places/qplacecontent.cpp create mode 100644 src/location/places/qplacecontent.h create mode 100644 src/location/places/qplacecontent_p.h create mode 100644 src/location/places/qplacecontentreply.cpp create mode 100644 src/location/places/qplacecontentreply.h create mode 100644 src/location/places/qplacecontentrequest.cpp create mode 100644 src/location/places/qplacecontentrequest.h create mode 100644 src/location/places/qplacecontentrequest_p.h create mode 100644 src/location/places/qplacedetailsreply.cpp create mode 100644 src/location/places/qplacedetailsreply.h create mode 100644 src/location/places/qplaceeditorial.cpp create mode 100644 src/location/places/qplaceeditorial.h create mode 100644 src/location/places/qplaceeditorial_p.h create mode 100644 src/location/places/qplaceicon.cpp create mode 100644 src/location/places/qplaceicon.h create mode 100644 src/location/places/qplaceicon_p.h create mode 100644 src/location/places/qplaceidreply.cpp create mode 100644 src/location/places/qplaceidreply.h create mode 100644 src/location/places/qplaceimage.cpp create mode 100644 src/location/places/qplaceimage.h create mode 100644 src/location/places/qplaceimage_p.h create mode 100644 src/location/places/qplacemanager.cpp create mode 100644 src/location/places/qplacemanager.h create mode 100644 src/location/places/qplacemanagerengine.cpp create mode 100644 src/location/places/qplacemanagerengine.h create mode 100644 src/location/places/qplacemanagerengine_p.h create mode 100644 src/location/places/qplacematchreply.cpp create mode 100644 src/location/places/qplacematchreply.h create mode 100644 src/location/places/qplacematchrequest.cpp create mode 100644 src/location/places/qplacematchrequest.h create mode 100644 src/location/places/qplaceproposedsearchresult.cpp create mode 100644 src/location/places/qplaceproposedsearchresult.h create mode 100644 src/location/places/qplaceproposedsearchresult_p.h create mode 100644 src/location/places/qplaceratings.cpp create mode 100644 src/location/places/qplaceratings.h create mode 100644 src/location/places/qplaceratings_p.h create mode 100644 src/location/places/qplacereply.cpp create mode 100644 src/location/places/qplacereply.h create mode 100644 src/location/places/qplacereply_p.h create mode 100644 src/location/places/qplaceresult.cpp create mode 100644 src/location/places/qplaceresult.h create mode 100644 src/location/places/qplaceresult_p.h create mode 100644 src/location/places/qplacereview.cpp create mode 100644 src/location/places/qplacereview.h create mode 100644 src/location/places/qplacereview_p.h create mode 100644 src/location/places/qplacesearchreply.cpp create mode 100644 src/location/places/qplacesearchreply.h create mode 100644 src/location/places/qplacesearchrequest.cpp create mode 100644 src/location/places/qplacesearchrequest.h create mode 100644 src/location/places/qplacesearchrequest_p.h create mode 100644 src/location/places/qplacesearchresult.cpp create mode 100644 src/location/places/qplacesearchresult.h create mode 100644 src/location/places/qplacesearchresult_p.h create mode 100644 src/location/places/qplacesearchsuggestionreply.cpp create mode 100644 src/location/places/qplacesearchsuggestionreply.h create mode 100644 src/location/places/qplacesupplier.cpp create mode 100644 src/location/places/qplacesupplier.h create mode 100644 src/location/places/qplacesupplier_p.h create mode 100644 src/location/places/qplaceuser.cpp create mode 100644 src/location/places/qplaceuser.h create mode 100644 src/location/places/qplaceuser_p.h create mode 100644 src/location/places/unsupportedreplies_p.h create mode 100644 src/location/qlocation.cpp create mode 100644 src/location/qlocation.h create mode 100644 src/location/qlocationglobal.h create mode 100644 src/location/qlocationglobal_p.h create mode 100644 src/plugins/geoservices/esri/esri.pro create mode 100644 src/plugins/geoservices/esri/esri.qrc create mode 100644 src/plugins/geoservices/esri/esri_plugin.json create mode 100644 src/plugins/geoservices/esri/geocodereply_esri.cpp create mode 100644 src/plugins/geoservices/esri/geocodereply_esri.h create mode 100644 src/plugins/geoservices/esri/geocodingmanagerengine_esri.cpp create mode 100644 src/plugins/geoservices/esri/geocodingmanagerengine_esri.h create mode 100644 src/plugins/geoservices/esri/geomapsource.cpp create mode 100644 src/plugins/geoservices/esri/geomapsource.h create mode 100644 src/plugins/geoservices/esri/georoutejsonparser_esri.cpp create mode 100644 src/plugins/geoservices/esri/georoutejsonparser_esri.h create mode 100644 src/plugins/geoservices/esri/georoutereply_esri.cpp create mode 100644 src/plugins/geoservices/esri/georoutereply_esri.h create mode 100644 src/plugins/geoservices/esri/georoutingmanagerengine_esri.cpp create mode 100644 src/plugins/geoservices/esri/georoutingmanagerengine_esri.h create mode 100644 src/plugins/geoservices/esri/geoserviceproviderfactory_esri.cpp create mode 100644 src/plugins/geoservices/esri/geoserviceproviderfactory_esri.h create mode 100644 src/plugins/geoservices/esri/geotiledmap_esri.cpp create mode 100644 src/plugins/geoservices/esri/geotiledmap_esri.h create mode 100644 src/plugins/geoservices/esri/geotiledmappingmanagerengine_esri.cpp create mode 100644 src/plugins/geoservices/esri/geotiledmappingmanagerengine_esri.h create mode 100644 src/plugins/geoservices/esri/geotiledmapreply_esri.cpp create mode 100644 src/plugins/geoservices/esri/geotiledmapreply_esri.h create mode 100644 src/plugins/geoservices/esri/geotilefetcher_esri.cpp create mode 100644 src/plugins/geoservices/esri/geotilefetcher_esri.h create mode 100644 src/plugins/geoservices/esri/maps.json create mode 100644 src/plugins/geoservices/esri/placecategoriesreply_esri.cpp create mode 100644 src/plugins/geoservices/esri/placecategoriesreply_esri.h create mode 100644 src/plugins/geoservices/esri/placemanagerengine_esri.cpp create mode 100644 src/plugins/geoservices/esri/placemanagerengine_esri.h create mode 100644 src/plugins/geoservices/esri/placesearchreply_esri.cpp create mode 100644 src/plugins/geoservices/esri/placesearchreply_esri.h create mode 100644 src/plugins/geoservices/geoservices.pro create mode 100644 src/plugins/geoservices/itemsoverlay/itemsoverlay.pro create mode 100644 src/plugins/geoservices/itemsoverlay/itemsoverlay_plugin.json create mode 100644 src/plugins/geoservices/itemsoverlay/qgeomapitemsoverlay.cpp create mode 100644 src/plugins/geoservices/itemsoverlay/qgeomapitemsoverlay.h create mode 100644 src/plugins/geoservices/itemsoverlay/qgeomappingmanagerengineitemsoverlay.cpp create mode 100644 src/plugins/geoservices/itemsoverlay/qgeomappingmanagerengineitemsoverlay.h create mode 100644 src/plugins/geoservices/itemsoverlay/qgeoserviceproviderpluginitemsoverlay.cpp create mode 100644 src/plugins/geoservices/itemsoverlay/qgeoserviceproviderpluginitemsoverlay.h create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/LICENSE.txt create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/aerialway.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/airfield.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/airport.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/alcohol-shop.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/america-football.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/amusement-park.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/aquarium.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/art-gallery.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/attraction.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/bakery.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/bank.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/bar.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/barrier.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/baseball.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/basketball.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/bbq.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/beer.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/bicycle-share.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/bicycle.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/blood-bank.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/buddhism.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/building-alt1.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/building.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/bus.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/cafe.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/campsite.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/car.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/castle.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/cemetery.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/cinema.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/circle-stroked.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/circle.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/city.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/clothing-store.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/college.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/commercial.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/cricket.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/cross.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/dam.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/danger.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/defibrillator.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/dentist.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/doctor.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/dog-park.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/drinking-water.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/embassy.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/emergency-phone.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/entrance-alt1.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/entrance.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/farm.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/fast-food.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/fence.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/ferry.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/fire-station.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/florist.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/fuel.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/gaming.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/garden-center.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/garden.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/gift.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/golf.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/grocery.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/hairdresser.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/harbor.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/heart.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/heliport.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/home.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/horse-riding.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/hospital.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/ice-cream.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/industry.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/information.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/karaoke.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/landmark.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/landuse.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/laundry.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/library.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/lighthouse.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/lodging.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/logging.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/marker-stroked.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/marker.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/mobile-phone.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/monument.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/mountain.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/museum.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/music.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/natural.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/park-alt1.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/park.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/parking-garage.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/parking.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/pharmacy.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/picnic-site.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/pitch.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/place-of-worship.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/playground.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/police.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/post.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/prison.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/rail-light.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/rail-metro.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/rail.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/ranger-station.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/recycling.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/religious-christian.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/religious-jewish.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/religious-muslim.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/residential-community.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/restaurant.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/roadblock.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/rocket.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/school.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/scooter.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/shelter.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/shop.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/skiing.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/slaughterhouse.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/snowmobile.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/soccer.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/square-stroked.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/square.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/stadium.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/star-stroked.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/star.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/suitcase.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/sushi.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/swimming.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/teahouse.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/telephone.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/tennis.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/theatre.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/toilet.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/town-hall.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/town.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/triangle-stroked.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/triangle.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/veterinary.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/village.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/volcano.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/warehouse.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/waste-basket.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/water.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/wetland.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/wheelchair.svg create mode 100644 src/plugins/geoservices/mapbox/maki-4.0.0/zoo.svg create mode 100644 src/plugins/geoservices/mapbox/mapbox.pro create mode 100644 src/plugins/geoservices/mapbox/mapbox.qrc create mode 100644 src/plugins/geoservices/mapbox/mapbox_plugin.json create mode 100644 src/plugins/geoservices/mapbox/qgeocodereplymapbox.cpp create mode 100644 src/plugins/geoservices/mapbox/qgeocodereplymapbox.h create mode 100644 src/plugins/geoservices/mapbox/qgeocodingmanagerenginemapbox.cpp create mode 100644 src/plugins/geoservices/mapbox/qgeocodingmanagerenginemapbox.h create mode 100644 src/plugins/geoservices/mapbox/qgeofiletilecachemapbox.cpp create mode 100644 src/plugins/geoservices/mapbox/qgeofiletilecachemapbox.h create mode 100644 src/plugins/geoservices/mapbox/qgeomapreplymapbox.cpp create mode 100644 src/plugins/geoservices/mapbox/qgeomapreplymapbox.h create mode 100644 src/plugins/geoservices/mapbox/qgeoroutereplymapbox.cpp create mode 100644 src/plugins/geoservices/mapbox/qgeoroutereplymapbox.h create mode 100644 src/plugins/geoservices/mapbox/qgeoroutingmanagerenginemapbox.cpp create mode 100644 src/plugins/geoservices/mapbox/qgeoroutingmanagerenginemapbox.h create mode 100644 src/plugins/geoservices/mapbox/qgeoserviceproviderpluginmapbox.cpp create mode 100644 src/plugins/geoservices/mapbox/qgeoserviceproviderpluginmapbox.h create mode 100644 src/plugins/geoservices/mapbox/qgeotiledmappingmanagerenginemapbox.cpp create mode 100644 src/plugins/geoservices/mapbox/qgeotiledmappingmanagerenginemapbox.h create mode 100644 src/plugins/geoservices/mapbox/qgeotilefetchermapbox.cpp create mode 100644 src/plugins/geoservices/mapbox/qgeotilefetchermapbox.h create mode 100644 src/plugins/geoservices/mapbox/qmapboxcommon.cpp create mode 100644 src/plugins/geoservices/mapbox/qmapboxcommon.h create mode 100644 src/plugins/geoservices/mapbox/qplacecategoriesreplymapbox.cpp create mode 100644 src/plugins/geoservices/mapbox/qplacecategoriesreplymapbox.h create mode 100644 src/plugins/geoservices/mapbox/qplacemanagerenginemapbox.cpp create mode 100644 src/plugins/geoservices/mapbox/qplacemanagerenginemapbox.h create mode 100644 src/plugins/geoservices/mapbox/qplacesearchreplymapbox.cpp create mode 100644 src/plugins/geoservices/mapbox/qplacesearchreplymapbox.h create mode 100644 src/plugins/geoservices/mapbox/qplacesearchsuggestionreplymapbox.cpp create mode 100644 src/plugins/geoservices/mapbox/qplacesearchsuggestionreplymapbox.h create mode 100644 src/plugins/geoservices/mapboxgl/logo.png create mode 100644 src/plugins/geoservices/mapboxgl/mapboxgl.pro create mode 100644 src/plugins/geoservices/mapboxgl/mapboxgl.qrc create mode 100644 src/plugins/geoservices/mapboxgl/mapboxgl_plugin.json create mode 100644 src/plugins/geoservices/mapboxgl/qgeomapmapboxgl.cpp create mode 100644 src/plugins/geoservices/mapboxgl/qgeomapmapboxgl.h create mode 100644 src/plugins/geoservices/mapboxgl/qgeomapmapboxgl_p.h create mode 100644 src/plugins/geoservices/mapboxgl/qgeomappingmanagerenginemapboxgl.cpp create mode 100644 src/plugins/geoservices/mapboxgl/qgeomappingmanagerenginemapboxgl.h create mode 100644 src/plugins/geoservices/mapboxgl/qgeoserviceproviderpluginmapboxgl.cpp create mode 100644 src/plugins/geoservices/mapboxgl/qgeoserviceproviderpluginmapboxgl.h create mode 100644 src/plugins/geoservices/mapboxgl/qmapboxglstylechange.cpp create mode 100644 src/plugins/geoservices/mapboxgl/qmapboxglstylechange_p.h create mode 100644 src/plugins/geoservices/mapboxgl/qsgmapboxglnode.cpp create mode 100644 src/plugins/geoservices/mapboxgl/qsgmapboxglnode.h create mode 100644 src/plugins/geoservices/nokia/logo.png create mode 100644 src/plugins/geoservices/nokia/marclanguagecodes.h create mode 100644 src/plugins/geoservices/nokia/nokia.pro create mode 100644 src/plugins/geoservices/nokia/nokia.qrc create mode 100644 src/plugins/geoservices/nokia/nokia_plugin.json create mode 100644 src/plugins/geoservices/nokia/placesv2/jsonparserhelpers.cpp create mode 100644 src/plugins/geoservices/nokia/placesv2/jsonparserhelpers.h create mode 100644 src/plugins/geoservices/nokia/placesv2/placesv2.pri create mode 100644 src/plugins/geoservices/nokia/placesv2/qplacecategoriesreplyhere.cpp create mode 100644 src/plugins/geoservices/nokia/placesv2/qplacecategoriesreplyhere.h create mode 100644 src/plugins/geoservices/nokia/placesv2/qplacecontentreplyimpl.cpp create mode 100644 src/plugins/geoservices/nokia/placesv2/qplacecontentreplyimpl.h create mode 100644 src/plugins/geoservices/nokia/placesv2/qplacedetailsreplyimpl.cpp create mode 100644 src/plugins/geoservices/nokia/placesv2/qplacedetailsreplyimpl.h create mode 100644 src/plugins/geoservices/nokia/placesv2/qplaceidreplyimpl.cpp create mode 100644 src/plugins/geoservices/nokia/placesv2/qplaceidreplyimpl.h create mode 100644 src/plugins/geoservices/nokia/placesv2/qplacesearchreplyhere.cpp create mode 100644 src/plugins/geoservices/nokia/placesv2/qplacesearchreplyhere.h create mode 100644 src/plugins/geoservices/nokia/placesv2/qplacesearchsuggestionreplyimpl.cpp create mode 100644 src/plugins/geoservices/nokia/placesv2/qplacesearchsuggestionreplyimpl.h create mode 100644 src/plugins/geoservices/nokia/qgeocodejsonparser.cpp create mode 100644 src/plugins/geoservices/nokia/qgeocodejsonparser.h create mode 100644 src/plugins/geoservices/nokia/qgeocodereply_nokia.cpp create mode 100644 src/plugins/geoservices/nokia/qgeocodereply_nokia.h create mode 100644 src/plugins/geoservices/nokia/qgeocodingmanagerengine_nokia.cpp create mode 100644 src/plugins/geoservices/nokia/qgeocodingmanagerengine_nokia.h create mode 100644 src/plugins/geoservices/nokia/qgeoerror_messages.cpp create mode 100644 src/plugins/geoservices/nokia/qgeoerror_messages.h create mode 100644 src/plugins/geoservices/nokia/qgeofiletilecachenokia.cpp create mode 100644 src/plugins/geoservices/nokia/qgeofiletilecachenokia.h create mode 100644 src/plugins/geoservices/nokia/qgeointrinsicnetworkaccessmanager.cpp create mode 100644 src/plugins/geoservices/nokia/qgeointrinsicnetworkaccessmanager.h create mode 100644 src/plugins/geoservices/nokia/qgeomapreply_nokia.cpp create mode 100644 src/plugins/geoservices/nokia/qgeomapreply_nokia.h create mode 100644 src/plugins/geoservices/nokia/qgeomapversion.cpp create mode 100644 src/plugins/geoservices/nokia/qgeomapversion.h create mode 100644 src/plugins/geoservices/nokia/qgeonetworkaccessmanager.h create mode 100644 src/plugins/geoservices/nokia/qgeoroutereply_nokia.cpp create mode 100644 src/plugins/geoservices/nokia/qgeoroutereply_nokia.h create mode 100644 src/plugins/geoservices/nokia/qgeoroutexmlparser.cpp create mode 100644 src/plugins/geoservices/nokia/qgeoroutexmlparser.h create mode 100644 src/plugins/geoservices/nokia/qgeoroutingmanagerengine_nokia.cpp create mode 100644 src/plugins/geoservices/nokia/qgeoroutingmanagerengine_nokia.h create mode 100644 src/plugins/geoservices/nokia/qgeoserviceproviderplugin_nokia.cpp create mode 100644 src/plugins/geoservices/nokia/qgeoserviceproviderplugin_nokia.h create mode 100644 src/plugins/geoservices/nokia/qgeotiledmap_nokia.cpp create mode 100644 src/plugins/geoservices/nokia/qgeotiledmap_nokia.h create mode 100644 src/plugins/geoservices/nokia/qgeotiledmappingmanagerengine_nokia.cpp create mode 100644 src/plugins/geoservices/nokia/qgeotiledmappingmanagerengine_nokia.h create mode 100644 src/plugins/geoservices/nokia/qgeotilefetcher_nokia.cpp create mode 100644 src/plugins/geoservices/nokia/qgeotilefetcher_nokia.h create mode 100644 src/plugins/geoservices/nokia/qgeouriprovider.cpp create mode 100644 src/plugins/geoservices/nokia/qgeouriprovider.h create mode 100644 src/plugins/geoservices/nokia/qplacemanagerengine_nokiav2.cpp create mode 100644 src/plugins/geoservices/nokia/qplacemanagerengine_nokiav2.h create mode 100644 src/plugins/geoservices/nokia/uri_constants.cpp create mode 100644 src/plugins/geoservices/nokia/uri_constants.h create mode 100644 src/plugins/geoservices/osm/osm.pro create mode 100644 src/plugins/geoservices/osm/osm_plugin.json create mode 100644 src/plugins/geoservices/osm/providers/5.8/cycle create mode 100644 src/plugins/geoservices/osm/providers/5.8/hiking create mode 100644 src/plugins/geoservices/osm/providers/5.8/night-transit create mode 100644 src/plugins/geoservices/osm/providers/5.8/satellite create mode 100644 src/plugins/geoservices/osm/providers/5.8/street create mode 100644 src/plugins/geoservices/osm/providers/5.8/street-hires create mode 100644 src/plugins/geoservices/osm/providers/5.8/terrain create mode 100644 src/plugins/geoservices/osm/providers/5.8/transit create mode 100644 src/plugins/geoservices/osm/qgeocodereplyosm.cpp create mode 100644 src/plugins/geoservices/osm/qgeocodereplyosm.h create mode 100644 src/plugins/geoservices/osm/qgeocodingmanagerengineosm.cpp create mode 100644 src/plugins/geoservices/osm/qgeocodingmanagerengineosm.h create mode 100644 src/plugins/geoservices/osm/qgeofiletilecacheosm.cpp create mode 100644 src/plugins/geoservices/osm/qgeofiletilecacheosm.h create mode 100644 src/plugins/geoservices/osm/qgeomapreplyosm.cpp create mode 100644 src/plugins/geoservices/osm/qgeomapreplyosm.h create mode 100644 src/plugins/geoservices/osm/qgeoroutereplyosm.cpp create mode 100644 src/plugins/geoservices/osm/qgeoroutereplyosm.h create mode 100644 src/plugins/geoservices/osm/qgeoroutingmanagerengineosm.cpp create mode 100644 src/plugins/geoservices/osm/qgeoroutingmanagerengineosm.h create mode 100644 src/plugins/geoservices/osm/qgeoserviceproviderpluginosm.cpp create mode 100644 src/plugins/geoservices/osm/qgeoserviceproviderpluginosm.h create mode 100644 src/plugins/geoservices/osm/qgeotiledmaposm.cpp create mode 100644 src/plugins/geoservices/osm/qgeotiledmaposm.h create mode 100644 src/plugins/geoservices/osm/qgeotiledmappingmanagerengineosm.cpp create mode 100644 src/plugins/geoservices/osm/qgeotiledmappingmanagerengineosm.h create mode 100644 src/plugins/geoservices/osm/qgeotilefetcherosm.cpp create mode 100644 src/plugins/geoservices/osm/qgeotilefetcherosm.h create mode 100644 src/plugins/geoservices/osm/qgeotileproviderosm.cpp create mode 100644 src/plugins/geoservices/osm/qgeotileproviderosm.h create mode 100644 src/plugins/geoservices/osm/qplacecategoriesreplyosm.cpp create mode 100644 src/plugins/geoservices/osm/qplacecategoriesreplyosm.h create mode 100644 src/plugins/geoservices/osm/qplacemanagerengineosm.cpp create mode 100644 src/plugins/geoservices/osm/qplacemanagerengineosm.h create mode 100644 src/plugins/geoservices/osm/qplacesearchreplyosm.cpp create mode 100644 src/plugins/geoservices/osm/qplacesearchreplyosm.h create mode 100644 src/plugins/plugins.pro create mode 100644 src/plugins/position/android/android.pro create mode 100644 src/plugins/position/android/jar/AndroidManifest.xml create mode 100644 src/plugins/position/android/jar/jar.pro create mode 100644 src/plugins/position/android/jar/src/org/qtproject/qt5/android/positioning/QtPositioning.java create mode 100644 src/plugins/position/android/src/jnipositioning.cpp create mode 100644 src/plugins/position/android/src/jnipositioning.h create mode 100644 src/plugins/position/android/src/plugin.json create mode 100644 src/plugins/position/android/src/positionfactory_android.cpp create mode 100644 src/plugins/position/android/src/positionfactory_android.h create mode 100644 src/plugins/position/android/src/qgeopositioninfosource_android.cpp create mode 100644 src/plugins/position/android/src/qgeopositioninfosource_android_p.h create mode 100644 src/plugins/position/android/src/qgeosatelliteinfosource_android.cpp create mode 100644 src/plugins/position/android/src/qgeosatelliteinfosource_android_p.h create mode 100644 src/plugins/position/android/src/src.pro create mode 100644 src/plugins/position/corelocation/corelocation.pro create mode 100644 src/plugins/position/corelocation/plugin.json create mode 100644 src/plugins/position/corelocation/qgeopositioninfosource_cl.mm create mode 100644 src/plugins/position/corelocation/qgeopositioninfosource_cl_p.h create mode 100644 src/plugins/position/corelocation/qgeopositioninfosourcefactory_cl.h create mode 100644 src/plugins/position/corelocation/qgeopositioninfosourcefactory_cl.mm create mode 100644 src/plugins/position/geoclue/geoclue.pro create mode 100644 src/plugins/position/geoclue/geocluetypes.cpp create mode 100644 src/plugins/position/geoclue/geocluetypes.h create mode 100644 src/plugins/position/geoclue/org.freedesktop.Geoclue.Master.xml create mode 100644 src/plugins/position/geoclue/org.freedesktop.Geoclue.MasterClient.xml create mode 100644 src/plugins/position/geoclue/org.freedesktop.Geoclue.Position.xml create mode 100644 src/plugins/position/geoclue/org.freedesktop.Geoclue.Satellite.xml create mode 100644 src/plugins/position/geoclue/org.freedesktop.Geoclue.Velocity.xml create mode 100644 src/plugins/position/geoclue/org.freedesktop.Geoclue.xml create mode 100644 src/plugins/position/geoclue/plugin.json create mode 100644 src/plugins/position/geoclue/qgeocluemaster.cpp create mode 100644 src/plugins/position/geoclue/qgeocluemaster.h create mode 100644 src/plugins/position/geoclue/qgeopositioninfosource_geocluemaster.cpp create mode 100644 src/plugins/position/geoclue/qgeopositioninfosource_geocluemaster.h create mode 100644 src/plugins/position/geoclue/qgeopositioninfosourcefactory_geoclue.cpp create mode 100644 src/plugins/position/geoclue/qgeopositioninfosourcefactory_geoclue.h create mode 100644 src/plugins/position/geoclue/qgeosatelliteinfosource_geocluemaster.cpp create mode 100644 src/plugins/position/geoclue/qgeosatelliteinfosource_geocluemaster.h create mode 100644 src/plugins/position/geoclue2/geoclue2.pro create mode 100644 src/plugins/position/geoclue2/geocluetypes.cpp create mode 100644 src/plugins/position/geoclue2/geocluetypes.h create mode 100644 src/plugins/position/geoclue2/org.freedesktop.GeoClue2.Client.xml create mode 100644 src/plugins/position/geoclue2/org.freedesktop.GeoClue2.Location.xml create mode 100644 src/plugins/position/geoclue2/org.freedesktop.GeoClue2.Manager.xml create mode 100644 src/plugins/position/geoclue2/plugin.json create mode 100644 src/plugins/position/geoclue2/qgeopositioninfosource_geoclue2.cpp create mode 100644 src/plugins/position/geoclue2/qgeopositioninfosource_geoclue2_p.h create mode 100644 src/plugins/position/geoclue2/qgeopositioninfosourcefactory_geoclue2.cpp create mode 100644 src/plugins/position/geoclue2/qgeopositioninfosourcefactory_geoclue2.h create mode 100644 src/plugins/position/gypsy/gypsy.pro create mode 100644 src/plugins/position/gypsy/plugin.json create mode 100644 src/plugins/position/gypsy/qgeopositioninfosourcefactory_gypsy.cpp create mode 100644 src/plugins/position/gypsy/qgeopositioninfosourcefactory_gypsy.h create mode 100644 src/plugins/position/gypsy/qgeosatelliteinfosource_gypsy.cpp create mode 100644 src/plugins/position/gypsy/qgeosatelliteinfosource_gypsy_p.h create mode 100644 src/plugins/position/position.pro create mode 100644 src/plugins/position/positionpoll/plugin.json create mode 100644 src/plugins/position/positionpoll/positionpoll.pro create mode 100644 src/plugins/position/positionpoll/positionpollfactory.cpp create mode 100644 src/plugins/position/positionpoll/positionpollfactory.h create mode 100644 src/plugins/position/positionpoll/qgeoareamonitor_polling.cpp create mode 100644 src/plugins/position/positionpoll/qgeoareamonitor_polling.h create mode 100644 src/plugins/position/serialnmea/plugin.json create mode 100644 src/plugins/position/serialnmea/qgeopositioninfosourcefactory_serialnmea.cpp create mode 100644 src/plugins/position/serialnmea/qgeopositioninfosourcefactory_serialnmea.h create mode 100644 src/plugins/position/serialnmea/qiopipe.cpp create mode 100644 src/plugins/position/serialnmea/qiopipe_p.h create mode 100644 src/plugins/position/serialnmea/qnmeasatelliteinfosource.cpp create mode 100644 src/plugins/position/serialnmea/qnmeasatelliteinfosource_p.h create mode 100644 src/plugins/position/serialnmea/serialnmea.pro create mode 100644 src/plugins/position/simulator/plugin.json create mode 100644 src/plugins/position/simulator/qgeopositioninfosource_simulator.cpp create mode 100644 src/plugins/position/simulator/qgeopositioninfosource_simulator_p.h create mode 100644 src/plugins/position/simulator/qgeopositioninfosourcefactory_simulator.cpp create mode 100644 src/plugins/position/simulator/qgeopositioninfosourcefactory_simulator.h create mode 100644 src/plugins/position/simulator/qgeosatelliteinfosource_simulator.cpp create mode 100644 src/plugins/position/simulator/qgeosatelliteinfosource_simulator_p.h create mode 100644 src/plugins/position/simulator/qlocationconnection_simulator.cpp create mode 100644 src/plugins/position/simulator/qlocationconnection_simulator_p.h create mode 100644 src/plugins/position/simulator/simulator.pro create mode 100644 src/plugins/position/winrt/plugin.json create mode 100644 src/plugins/position/winrt/qgeopositioninfosource_winrt.cpp create mode 100644 src/plugins/position/winrt/qgeopositioninfosource_winrt_p.h create mode 100644 src/plugins/position/winrt/qgeopositioninfosourcefactory_winrt.cpp create mode 100644 src/plugins/position/winrt/qgeopositioninfosourcefactory_winrt.h create mode 100644 src/plugins/position/winrt/winrt.pro create mode 100644 src/positioning/configure.json create mode 100644 src/positioning/doc/qtpositioning.qdocconf create mode 100644 src/positioning/doc/snippets/cpp/cpp.pro create mode 100644 src/positioning/doc/snippets/cpp/cppqml.cpp create mode 100644 src/positioning/doc/snippets/cpp/main.cpp create mode 100644 src/positioning/doc/snippets/doc_src_qtpositioning.qml create mode 100644 src/positioning/doc/snippets/snippets.pro create mode 100644 src/positioning/doc/src/cpp-position.qdoc create mode 100644 src/positioning/doc/src/cpp-qml-positioning.qdoc create mode 100644 src/positioning/doc/src/plugins/serialnmea.qdoc create mode 100644 src/positioning/doc/src/qml-position.qdoc create mode 100644 src/positioning/doc/src/qtpositioning-examples.qdoc create mode 100644 src/positioning/doc/src/qtpositioning-plugins.qdoc create mode 100644 src/positioning/doc/src/qtpositioning-qml.qdoc create mode 100644 src/positioning/doc/src/qtpositioning.qdoc create mode 100644 src/positioning/positioning.pro create mode 100644 src/positioning/qclipperutils.cpp create mode 100644 src/positioning/qclipperutils_p.h create mode 100644 src/positioning/qdoublematrix4x4.cpp create mode 100644 src/positioning/qdoublematrix4x4_p.h create mode 100644 src/positioning/qdoublevector2d.cpp create mode 100644 src/positioning/qdoublevector2d_p.h create mode 100644 src/positioning/qdoublevector3d.cpp create mode 100644 src/positioning/qdoublevector3d_p.h create mode 100644 src/positioning/qgeoaddress.cpp create mode 100644 src/positioning/qgeoaddress.h create mode 100644 src/positioning/qgeoaddress_p.h create mode 100644 src/positioning/qgeoareamonitorinfo.cpp create mode 100644 src/positioning/qgeoareamonitorinfo.h create mode 100644 src/positioning/qgeoareamonitorsource.cpp create mode 100644 src/positioning/qgeoareamonitorsource.h create mode 100644 src/positioning/qgeocircle.cpp create mode 100644 src/positioning/qgeocircle.h create mode 100644 src/positioning/qgeocircle_p.h create mode 100644 src/positioning/qgeocoordinate.cpp create mode 100644 src/positioning/qgeocoordinate.h create mode 100644 src/positioning/qgeocoordinate_p.h create mode 100644 src/positioning/qgeocoordinateobject.cpp create mode 100644 src/positioning/qgeocoordinateobject_p.h create mode 100644 src/positioning/qgeolocation.cpp create mode 100644 src/positioning/qgeolocation.h create mode 100644 src/positioning/qgeolocation_p.h create mode 100644 src/positioning/qgeopath.cpp create mode 100644 src/positioning/qgeopath.h create mode 100644 src/positioning/qgeopath_p.h create mode 100644 src/positioning/qgeopolygon.cpp create mode 100644 src/positioning/qgeopolygon.h create mode 100644 src/positioning/qgeopolygon_p.h create mode 100644 src/positioning/qgeopositioninfo.cpp create mode 100644 src/positioning/qgeopositioninfo.h create mode 100644 src/positioning/qgeopositioninfo_p.h create mode 100644 src/positioning/qgeopositioninfosource.cpp create mode 100644 src/positioning/qgeopositioninfosource.h create mode 100644 src/positioning/qgeopositioninfosource_p.h create mode 100644 src/positioning/qgeopositioninfosourcefactory.cpp create mode 100644 src/positioning/qgeopositioninfosourcefactory.h create mode 100644 src/positioning/qgeorectangle.cpp create mode 100644 src/positioning/qgeorectangle.h create mode 100644 src/positioning/qgeorectangle_p.h create mode 100644 src/positioning/qgeosatelliteinfo.cpp create mode 100644 src/positioning/qgeosatelliteinfo.h create mode 100644 src/positioning/qgeosatelliteinfo_p.h create mode 100644 src/positioning/qgeosatelliteinfosource.cpp create mode 100644 src/positioning/qgeosatelliteinfosource.h create mode 100644 src/positioning/qgeosatelliteinfosource_p.h create mode 100644 src/positioning/qgeoshape.cpp create mode 100644 src/positioning/qgeoshape.h create mode 100644 src/positioning/qgeoshape_p.h create mode 100644 src/positioning/qlocationdata_simulator.cpp create mode 100644 src/positioning/qlocationdata_simulator_p.h create mode 100644 src/positioning/qlocationutils.cpp create mode 100644 src/positioning/qlocationutils_p.h create mode 100644 src/positioning/qnmeapositioninfosource.cpp create mode 100644 src/positioning/qnmeapositioninfosource.h create mode 100644 src/positioning/qnmeapositioninfosource_p.h create mode 100644 src/positioning/qpositioningglobal.h create mode 100644 src/positioning/qpositioningglobal_p.h create mode 100644 src/positioning/qwebmercator.cpp create mode 100644 src/positioning/qwebmercator_p.h create mode 100644 src/positioningquick/positioningquick.pro create mode 100644 src/positioningquick/qdeclarativegeoaddress.cpp create mode 100644 src/positioningquick/qdeclarativegeoaddress_p.h create mode 100644 src/positioningquick/qdeclarativegeolocation.cpp create mode 100644 src/positioningquick/qdeclarativegeolocation_p.h create mode 100644 src/positioningquick/qdeclarativepluginparameter.cpp create mode 100644 src/positioningquick/qdeclarativepluginparameter_p.h create mode 100644 src/positioningquick/qdeclarativeposition.cpp create mode 100644 src/positioningquick/qdeclarativeposition_p.h create mode 100644 src/positioningquick/qdeclarativepositionsource.cpp create mode 100644 src/positioningquick/qdeclarativepositionsource_p.h create mode 100644 src/positioningquick/qpositioningquickglobal.h create mode 100644 src/positioningquick/qpositioningquickglobal_p.h create mode 100644 src/positioningquick/qquickgeocoordinateanimation.cpp create mode 100644 src/positioningquick/qquickgeocoordinateanimation_p.h create mode 100644 src/positioningquick/qquickgeocoordinateanimation_p_p.h create mode 100644 src/src.pro create mode 100644 sync.profile create mode 100644 tests/applications/positioning_backend/logwidget.cpp create mode 100644 tests/applications/positioning_backend/logwidget.h create mode 100644 tests/applications/positioning_backend/main.cpp create mode 100644 tests/applications/positioning_backend/positioning_backend.pro create mode 100644 tests/applications/positioning_backend/widget.cpp create mode 100644 tests/applications/positioning_backend/widget.h create mode 100644 tests/applications/positioning_backend/widget.ui create mode 100644 tests/auto/auto.pro create mode 100644 tests/auto/bic/data/QtPositioning.5.10.0.linux-gcc-amd64.txt create mode 100644 tests/auto/bic/data/QtPositioning.5.11.0.linux-gcc-amd64.txt create mode 100644 tests/auto/bic/data/QtPositioning.5.12.0.linux-gcc-amd64.txt create mode 100644 tests/auto/bic/data/QtPositioning.5.13.0.linux-gcc-amd64.txt create mode 100644 tests/auto/bic/data/QtPositioning.5.14.0.linux-gcc-amd64.txt create mode 100644 tests/auto/bic/data/QtPositioning.5.15.0.linux-gcc-amd64.txt create mode 100644 tests/auto/bic/data/QtPositioning.5.3.0.linux-gcc-amd64.txt create mode 100644 tests/auto/bic/data/QtPositioning.5.4.0.linux-gcc-amd64.txt create mode 100644 tests/auto/bic/data/QtPositioning.5.6.0.linux-gcc-amd64.txt create mode 100644 tests/auto/bic/data/QtPositioning.5.7.0.linux-gcc-amd64.txt create mode 100644 tests/auto/bic/data/QtPositioning.5.8.0.linux-gcc-amd64.txt create mode 100644 tests/auto/bic/data/QtPositioning.5.9.0.linux-gcc-amd64.txt create mode 100644 tests/auto/cmake/CMakeLists.txt create mode 100644 tests/auto/cmake/cmake.pro create mode 100644 tests/auto/declarative_core/BLACKLIST create mode 100644 tests/auto/declarative_core/declarative_core.pro create mode 100644 tests/auto/declarative_core/main.cpp create mode 100644 tests/auto/declarative_core/tst_address.qml create mode 100644 tests/auto/declarative_core/tst_category.qml create mode 100644 tests/auto/declarative_core/tst_categorymodel.qml create mode 100644 tests/auto/declarative_core/tst_contactdetail.qml create mode 100644 tests/auto/declarative_core/tst_coordinate.qml create mode 100644 tests/auto/declarative_core/tst_editorialmodel.qml create mode 100644 tests/auto/declarative_core/tst_geocoding.qml create mode 100644 tests/auto/declarative_core/tst_imagemodel.qml create mode 100644 tests/auto/declarative_core/tst_place.qml create mode 100644 tests/auto/declarative_core/tst_placeattribute.qml create mode 100644 tests/auto/declarative_core/tst_placeicon.qml create mode 100644 tests/auto/declarative_core/tst_placesearchmodel.qml create mode 100644 tests/auto/declarative_core/tst_placesearchsuggestionmodel.qml create mode 100644 tests/auto/declarative_core/tst_plugin.qml create mode 100644 tests/auto/declarative_core/tst_plugin_error.qml create mode 100644 tests/auto/declarative_core/tst_position.qml create mode 100644 tests/auto/declarative_core/tst_positionsource.qml create mode 100644 tests/auto/declarative_core/tst_ratings.qml create mode 100644 tests/auto/declarative_core/tst_reviewmodel.qml create mode 100644 tests/auto/declarative_core/tst_routing.qml create mode 100644 tests/auto/declarative_core/tst_supplier.qml create mode 100644 tests/auto/declarative_core/tst_user.qml create mode 100644 tests/auto/declarative_core/utils.js create mode 100644 tests/auto/declarative_geoshape/declarative_geoshape.pro create mode 100644 tests/auto/declarative_geoshape/main.cpp create mode 100644 tests/auto/declarative_geoshape/tst_locationsingleton.qml create mode 100644 tests/auto/declarative_ui/ItemGroup.qml create mode 100644 tests/auto/declarative_ui/declarative_ui.pro create mode 100644 tests/auto/declarative_ui/main.cpp create mode 100644 tests/auto/declarative_ui/tst_map.qml create mode 100644 tests/auto/declarative_ui/tst_map_coordinateanimation.qml create mode 100644 tests/auto/declarative_ui/tst_map_error.qml create mode 100644 tests/auto/declarative_ui/tst_map_flick.qml create mode 100644 tests/auto/declarative_ui/tst_map_item.qml create mode 100644 tests/auto/declarative_ui/tst_map_item_details.qml create mode 100644 tests/auto/declarative_ui/tst_map_item_fit_viewport.qml create mode 100644 tests/auto/declarative_ui/tst_map_itemview.qml create mode 100644 tests/auto/declarative_ui/tst_map_keepgrab.qml create mode 100644 tests/auto/declarative_ui/tst_map_maptype.qml create mode 100644 tests/auto/declarative_ui/tst_map_mouse.qml create mode 100644 tests/auto/declarative_ui/tst_map_pinch.qml.QTBUG-47970 create mode 100644 tests/auto/doublevectors/doublevectors.pro create mode 100644 tests/auto/doublevectors/tst_doublevectors.cpp create mode 100644 tests/auto/geotestplugin/geotestplugin.json create mode 100644 tests/auto/geotestplugin/geotestplugin.pro create mode 100644 tests/auto/geotestplugin/place_data.json create mode 100644 tests/auto/geotestplugin/qgeocodingmanagerengine_test.h create mode 100644 tests/auto/geotestplugin/qgeomappingmanagerengine_test.h create mode 100644 tests/auto/geotestplugin/qgeoroutingmanagerengine_test.h create mode 100644 tests/auto/geotestplugin/qgeoserviceproviderplugin_test.cpp create mode 100644 tests/auto/geotestplugin/qgeoserviceproviderplugin_test.h create mode 100644 tests/auto/geotestplugin/qgeotiledmap_test.cpp create mode 100644 tests/auto/geotestplugin/qgeotiledmap_test.h create mode 100644 tests/auto/geotestplugin/qgeotiledmappingmanagerengine_test.h create mode 100644 tests/auto/geotestplugin/qgeotilefetcher_test.h create mode 100644 tests/auto/geotestplugin/qplacemanagerengine_test.h create mode 100644 tests/auto/geotestplugin/testdata.qrc create mode 100644 tests/auto/maptype/maptype.pro create mode 100644 tests/auto/maptype/tst_maptype.cpp create mode 100644 tests/auto/nokia_services/nokia_services.pro create mode 100644 tests/auto/nokia_services/places_semiauto/places_semiauto.pro create mode 100644 tests/auto/nokia_services/places_semiauto/tst_places.cpp create mode 100644 tests/auto/nokia_services/routing/error-no-route.xml create mode 100644 tests/auto/nokia_services/routing/invalid-response-half-way-through.xml create mode 100644 tests/auto/nokia_services/routing/invalid-response-no-calculateroute-tag.xml create mode 100644 tests/auto/nokia_services/routing/invalid-response-no-route-tag.xml create mode 100644 tests/auto/nokia_services/routing/invalid-response-trash.xml create mode 100644 tests/auto/nokia_services/routing/littered-with-new-tags.xml create mode 100644 tests/auto/nokia_services/routing/multiple-routes-in-response.xml create mode 100644 tests/auto/nokia_services/routing/optim-fastest.xml create mode 100644 tests/auto/nokia_services/routing/optim-shortest.xml create mode 100644 tests/auto/nokia_services/routing/routing.pro create mode 100644 tests/auto/nokia_services/routing/travelmode-car.xml create mode 100644 tests/auto/nokia_services/routing/travelmode-pedestrian.xml create mode 100644 tests/auto/nokia_services/routing/travelmode-public-transport.xml create mode 100644 tests/auto/nokia_services/routing/tst_routing.cpp create mode 100644 tests/auto/placemanager_utils/placemanager_utils.cpp create mode 100644 tests/auto/placemanager_utils/placemanager_utils.h create mode 100644 tests/auto/placesplugin_unsupported/placesplugin.json create mode 100644 tests/auto/placesplugin_unsupported/placesplugin_unsupported.pro create mode 100644 tests/auto/placesplugin_unsupported/qgeoserviceproviderplugin_test.cpp create mode 100644 tests/auto/placesplugin_unsupported/qgeoserviceproviderplugin_test.h create mode 100644 tests/auto/positionplugin/plugin.cpp create mode 100644 tests/auto/positionplugin/plugin.json create mode 100644 tests/auto/positionplugin/positionplugin.pro create mode 100644 tests/auto/positionpluginV1/plugin.cpp create mode 100644 tests/auto/positionpluginV1/plugin.json create mode 100644 tests/auto/positionpluginV1/positionpluginV1.pro create mode 100644 tests/auto/positionplugintest/positionplugintest.pro create mode 100644 tests/auto/positionplugintest/tst_positionplugin.cpp create mode 100644 tests/auto/qgeoaddress/qgeoaddress.pro create mode 100644 tests/auto/qgeoaddress/tst_qgeoaddress.cpp create mode 100644 tests/auto/qgeoareamonitor/logfilepositionsource.cpp create mode 100644 tests/auto/qgeoareamonitor/logfilepositionsource.h create mode 100644 tests/auto/qgeoareamonitor/qgeoareamonitor.pro create mode 100644 tests/auto/qgeoareamonitor/simplelog.txt create mode 100644 tests/auto/qgeoareamonitor/tst_qgeoareamonitor.cpp create mode 100644 tests/auto/qgeocameracapabilities/qgeocameracapabilities.pro create mode 100644 tests/auto/qgeocameracapabilities/tst_qgeocameracapabilities.cpp create mode 100644 tests/auto/qgeocameradata/qgeocameradata.pro create mode 100644 tests/auto/qgeocameradata/tst_qgeocameradata.cpp create mode 100644 tests/auto/qgeocameratiles/qgeocameratiles.pro create mode 100644 tests/auto/qgeocameratiles/tst_qgeocameratiles.cpp create mode 100644 tests/auto/qgeocircle/qgeocircle.pro create mode 100644 tests/auto/qgeocircle/tst_qgeocircle.cpp create mode 100644 tests/auto/qgeocodereply/qgeocodereply.pro create mode 100644 tests/auto/qgeocodereply/tst_qgeocodereply.cpp create mode 100644 tests/auto/qgeocodereply/tst_qgeocodereply.h create mode 100644 tests/auto/qgeocodingmanager/qgeocodingmanager.pro create mode 100644 tests/auto/qgeocodingmanager/tst_qgeocodingmanager.cpp create mode 100644 tests/auto/qgeocodingmanager/tst_qgeocodingmanager.h create mode 100644 tests/auto/qgeocodingmanagerplugins/geocoding_plugin.json create mode 100644 tests/auto/qgeocodingmanagerplugins/qgeocodingmanagerengine_test.h create mode 100644 tests/auto/qgeocodingmanagerplugins/qgeocodingmanagerplugins.pro create mode 100644 tests/auto/qgeocodingmanagerplugins/qgeoserviceproviderplugin_test.cpp create mode 100644 tests/auto/qgeocodingmanagerplugins/qgeoserviceproviderplugin_test.h create mode 100644 tests/auto/qgeocoordinate/qgeocoordinate.pro create mode 100644 tests/auto/qgeocoordinate/tst_qgeocoordinate.cpp create mode 100644 tests/auto/qgeojson/01-point.json create mode 100644 tests/auto/qgeojson/02-linestring.json create mode 100644 tests/auto/qgeojson/03-multipoint.json create mode 100644 tests/auto/qgeojson/04-polygon.json create mode 100644 tests/auto/qgeojson/05-multilinestring.json create mode 100644 tests/auto/qgeojson/06-multipolygon.json create mode 100644 tests/auto/qgeojson/07-geometrycollection.json create mode 100644 tests/auto/qgeojson/08-feature.json create mode 100644 tests/auto/qgeojson/09-featurecollection.json create mode 100644 tests/auto/qgeojson/10-countries.json create mode 100644 tests/auto/qgeojson/10-countries_LICENSE create mode 100644 tests/auto/qgeojson/11-full.json create mode 100644 tests/auto/qgeojson/qgeojson.pro create mode 100644 tests/auto/qgeojson/tst_qgeojson.cpp create mode 100644 tests/auto/qgeolocation/qgeolocation.pro create mode 100644 tests/auto/qgeolocation/tst_qgeolocation.cpp create mode 100644 tests/auto/qgeolocation/tst_qgeolocation.h create mode 100644 tests/auto/qgeomaneuver/qgeomaneuver.pro create mode 100644 tests/auto/qgeomaneuver/tst_qgeomaneuver.cpp create mode 100644 tests/auto/qgeomaneuver/tst_qgeomaneuver.h create mode 100644 tests/auto/qgeopath/qgeopath.pro create mode 100644 tests/auto/qgeopath/tst_qgeopath.cpp create mode 100644 tests/auto/qgeopolygon/qgeopolygon.pro create mode 100644 tests/auto/qgeopolygon/tst_qgeopolygon.cpp create mode 100644 tests/auto/qgeopositioninfo/qgeopositioninfo.pro create mode 100644 tests/auto/qgeopositioninfo/tst_qgeopositioninfo.cpp create mode 100644 tests/auto/qgeopositioninfosource/qgeopositioninfosource.pro create mode 100644 tests/auto/qgeopositioninfosource/testqgeopositioninfosource.cpp create mode 100644 tests/auto/qgeopositioninfosource/testqgeopositioninfosource_p.h create mode 100644 tests/auto/qgeopositioninfosource/tst_qgeopositioninfosource.cpp create mode 100644 tests/auto/qgeorectangle/qgeorectangle.pro create mode 100644 tests/auto/qgeorectangle/tst_qgeorectangle.cpp create mode 100644 tests/auto/qgeoroute/qgeoroute.pro create mode 100644 tests/auto/qgeoroute/tst_qgeoroute.cpp create mode 100644 tests/auto/qgeoroute/tst_qgeoroute.h create mode 100644 tests/auto/qgeoroutereply/qgeoroutereply.pro create mode 100644 tests/auto/qgeoroutereply/tst_qgeoroutereply.cpp create mode 100644 tests/auto/qgeoroutereply/tst_qgeoroutereply.h create mode 100644 tests/auto/qgeorouterequest/qgeorouterequest.pro create mode 100644 tests/auto/qgeorouterequest/tst_qgeorouterequest.cpp create mode 100644 tests/auto/qgeorouterequest/tst_qgeorouterequest.h create mode 100644 tests/auto/qgeoroutesegment/qgeoroutesegment.pro create mode 100644 tests/auto/qgeoroutesegment/tst_qgeoroutesegment.cpp create mode 100644 tests/auto/qgeoroutesegment/tst_qgeoroutesegment.h create mode 100644 tests/auto/qgeoroutexmlparser/fixtures.qrc create mode 100644 tests/auto/qgeoroutexmlparser/qgeoroutexmlparser.pro create mode 100644 tests/auto/qgeoroutexmlparser/route1.xml create mode 100644 tests/auto/qgeoroutexmlparser/route2.xml create mode 100644 tests/auto/qgeoroutexmlparser/tst_qgeoroutexmlparser.cpp create mode 100644 tests/auto/qgeoroutingmanager/qgeoroutingmanager.pro create mode 100644 tests/auto/qgeoroutingmanager/tst_qgeoroutingmanager.cpp create mode 100644 tests/auto/qgeoroutingmanager/tst_qgeoroutingmanager.h create mode 100644 tests/auto/qgeoroutingmanagerplugins/qgeoroutingmanagerengine_test.h create mode 100644 tests/auto/qgeoroutingmanagerplugins/qgeoroutingmanagerplugins.pro create mode 100644 tests/auto/qgeoroutingmanagerplugins/qgeoserviceproviderplugin_test.cpp create mode 100644 tests/auto/qgeoroutingmanagerplugins/qgeoserviceproviderplugin_test.h create mode 100644 tests/auto/qgeoroutingmanagerplugins/routing_plugin.json create mode 100644 tests/auto/qgeosatelliteinfo/qgeosatelliteinfo.pro create mode 100644 tests/auto/qgeosatelliteinfo/tst_qgeosatelliteinfo.cpp create mode 100644 tests/auto/qgeosatelliteinfosource/qgeosatelliteinfosource.pro create mode 100644 tests/auto/qgeosatelliteinfosource/testqgeosatelliteinfosource.cpp create mode 100644 tests/auto/qgeosatelliteinfosource/testqgeosatelliteinfosource_p.h create mode 100644 tests/auto/qgeosatelliteinfosource/tst_qgeosatelliteinfosource.cpp create mode 100644 tests/auto/qgeoserviceprovider/qgeoserviceprovider.pro create mode 100644 tests/auto/qgeoserviceprovider/tst_qgeoserviceprovider.cpp create mode 100644 tests/auto/qgeoshape/qgeoshape.pro create mode 100644 tests/auto/qgeoshape/tst_qgeoshape.cpp create mode 100644 tests/auto/qgeotiledmap/BLACKLIST create mode 100644 tests/auto/qgeotiledmap/qgeotiledmap.pro create mode 100644 tests/auto/qgeotiledmap/tst_qgeotiledmap.cpp create mode 100644 tests/auto/qgeotiledmapscene/qgeotiledmapscene.pro create mode 100644 tests/auto/qgeotiledmapscene/tst_qgeotiledmapscene.cpp create mode 100644 tests/auto/qgeotilespec/qgeotilespec.pro create mode 100644 tests/auto/qgeotilespec/tst_qgeotilespec.cpp create mode 100644 tests/auto/qmlinterface/data/TestAddress.qml create mode 100644 tests/auto/qmlinterface/data/TestCategory.qml create mode 100644 tests/auto/qmlinterface/data/TestContactDetail.qml create mode 100644 tests/auto/qmlinterface/data/TestIcon.qml create mode 100644 tests/auto/qmlinterface/data/TestLocation.qml create mode 100644 tests/auto/qmlinterface/data/TestPlace.qml create mode 100644 tests/auto/qmlinterface/data/TestPlaceAttribute.qml create mode 100644 tests/auto/qmlinterface/data/TestRatings.qml create mode 100644 tests/auto/qmlinterface/data/TestSupplier.qml create mode 100644 tests/auto/qmlinterface/data/TestUser.qml create mode 100644 tests/auto/qmlinterface/qmlinterface.pro create mode 100644 tests/auto/qmlinterface/tst_qmlinterface.cpp create mode 100644 tests/auto/qnmeapositioninfosource/dummynmeapositioninfosource/dummynmeapositioninfosource.pro create mode 100644 tests/auto/qnmeapositioninfosource/dummynmeapositioninfosource/tst_dummynmeapositioninfosource.cpp create mode 100644 tests/auto/qnmeapositioninfosource/qnmeapositioninfosource.pro create mode 100644 tests/auto/qnmeapositioninfosource/qnmeapositioninfosource_realtime/qnmeapositioninfosource_realtime.pro create mode 100644 tests/auto/qnmeapositioninfosource/qnmeapositioninfosource_realtime/tst_qnmeapositioninfosource_realtime.cpp create mode 100644 tests/auto/qnmeapositioninfosource/qnmeapositioninfosource_realtime_generic/qnmeapositioninfosource_realtime_generic.pro create mode 100644 tests/auto/qnmeapositioninfosource/qnmeapositioninfosource_realtime_generic/tst_qnmeapositioninfosource_realtime_generic.cpp create mode 100644 tests/auto/qnmeapositioninfosource/qnmeapositioninfosource_simulation/qnmeapositioninfosource_simulation.pro create mode 100644 tests/auto/qnmeapositioninfosource/qnmeapositioninfosource_simulation/tst_qnmeapositioninfosource_simulation.cpp create mode 100644 tests/auto/qnmeapositioninfosource/qnmeapositioninfosource_simulation_generic/qnmeapositioninfosource_simulation_generic.pro create mode 100644 tests/auto/qnmeapositioninfosource/qnmeapositioninfosource_simulation_generic/tst_qnmeapositioninfosource_simulation_generic.cpp create mode 100644 tests/auto/qnmeapositioninfosource/qnmeapositioninfosourceproxyfactory.cpp create mode 100644 tests/auto/qnmeapositioninfosource/qnmeapositioninfosourceproxyfactory.h create mode 100644 tests/auto/qnmeapositioninfosource/tst_qnmeapositioninfosource.cpp create mode 100644 tests/auto/qnmeapositioninfosource/tst_qnmeapositioninfosource.h create mode 100644 tests/auto/qplace/qplace.pro create mode 100644 tests/auto/qplace/tst_qplace.cpp create mode 100644 tests/auto/qplaceattribute/qplaceattribute.pro create mode 100644 tests/auto/qplaceattribute/tst_qplaceattribute.cpp create mode 100644 tests/auto/qplacecategory/qplacecategory.pro create mode 100644 tests/auto/qplacecategory/tst_qplacecategory.cpp create mode 100644 tests/auto/qplacecontactdetail/qplacecontactdetail.pro create mode 100644 tests/auto/qplacecontactdetail/tst_qplacecontactdetail.cpp create mode 100644 tests/auto/qplacecontentrequest/qplacecontentrequest.pro create mode 100644 tests/auto/qplacecontentrequest/tst_qplacecontentrequest.cpp create mode 100644 tests/auto/qplacedetailsreply/qplacedetailsreply.pro create mode 100644 tests/auto/qplacedetailsreply/tst_qplacedetailsreply.cpp create mode 100644 tests/auto/qplaceeditorial/qplaceeditorial.pro create mode 100644 tests/auto/qplaceeditorial/tst_qplaceeditorial.cpp create mode 100644 tests/auto/qplaceimage/qplaceimage.pro create mode 100644 tests/auto/qplaceimage/tst_qplaceimage.cpp create mode 100644 tests/auto/qplacemanager/qplacemanager.pro create mode 100644 tests/auto/qplacemanager/tst_qplacemanager.cpp create mode 100644 tests/auto/qplacemanager_nokia/qplacemanager_nokia.pro create mode 100644 tests/auto/qplacemanager_nokia/tst_qplacemanager_nokia.cpp create mode 100644 tests/auto/qplacemanager_unsupported/qplacemanager_unsupported.pro create mode 100644 tests/auto/qplacemanager_unsupported/tst_qplacemanager_unsupported.cpp create mode 100644 tests/auto/qplacematchreply/qplacematchreply.pro create mode 100644 tests/auto/qplacematchreply/tst_qplacematchreply.cpp create mode 100644 tests/auto/qplacematchrequest/qplacematchrequest.pro create mode 100644 tests/auto/qplacematchrequest/tst_qplacematchrequest.cpp create mode 100644 tests/auto/qplaceperiod/qplaceperiod.pro create mode 100644 tests/auto/qplaceperiod/tst_qplaceperiod.cpp create mode 100644 tests/auto/qplaceratings/qplaceratings.pro create mode 100644 tests/auto/qplaceratings/tst_qplaceratings.cpp create mode 100644 tests/auto/qplacereply/qplacereply.pro create mode 100644 tests/auto/qplacereply/tst_qplacereply.cpp create mode 100644 tests/auto/qplaceresult/qplaceresult.pro create mode 100644 tests/auto/qplaceresult/tst_qplaceresult.cpp create mode 100644 tests/auto/qplacereview/qplacereview.pro create mode 100644 tests/auto/qplacereview/tst_qplacereview.cpp create mode 100644 tests/auto/qplacesearchreply/qplacesearchreply.pro create mode 100644 tests/auto/qplacesearchreply/tst_qplacesearchreply.cpp create mode 100644 tests/auto/qplacesearchrequest/qplacesearchrequest.pro create mode 100644 tests/auto/qplacesearchrequest/tst_qplacesearchrequest.cpp create mode 100644 tests/auto/qplacesearchresult/qplacesearchresult.pro create mode 100644 tests/auto/qplacesearchresult/tst_qplacesearchresult.cpp create mode 100644 tests/auto/qplacesearchsuggestionreply/qplacesearchsuggestionreply.pro create mode 100644 tests/auto/qplacesearchsuggestionreply/tst_qplacesearchsuggestionreply.cpp create mode 100644 tests/auto/qplacesupplier/qplacesupplier.pro create mode 100644 tests/auto/qplacesupplier/tst_qplacesupplier.cpp create mode 100644 tests/auto/qplaceuser/qplaceuser.pro create mode 100644 tests/auto/qplaceuser/tst_qplaceuser.cpp create mode 100644 tests/auto/qproposedsearchresult/qproposedsearchresult.pro create mode 100644 tests/auto/qproposedsearchresult/tst_qproposedsearchresult.cpp create mode 100644 tests/auto/utils/qlocationtestutils.cpp create mode 100644 tests/auto/utils/qlocationtestutils_p.h create mode 100644 tests/global/global.cfg create mode 100644 tests/manual/mapitems_backends/main.cpp create mode 100644 tests/manual/mapitems_backends/main.qml create mode 100644 tests/manual/mapitems_backends/mapitems_backends.pro create mode 100644 tests/manual/mapitems_backends/qml.qrc create mode 100644 tests/manual/mapobjects_tester/main.cpp create mode 100644 tests/manual/mapobjects_tester/main.qml create mode 100644 tests/manual/mapobjects_tester/mapobjects_tester.pro create mode 100644 tests/manual/mapobjects_tester/qml.qrc create mode 100644 tests/manual/mappolyline_tester/LongPolyline.qml create mode 100644 tests/manual/mappolyline_tester/main.cpp create mode 100644 tests/manual/mappolyline_tester/main.qml create mode 100644 tests/manual/mappolyline_tester/mappolyline_tester.pro create mode 100644 tests/manual/mappolyline_tester/qml.qrc create mode 100644 tests/plugins/declarativetestplugin/declarativetestplugin.pro create mode 100644 tests/plugins/declarativetestplugin/locationtest.cpp create mode 100644 tests/plugins/declarativetestplugin/qdeclarativelocationtestmodel.cpp create mode 100644 tests/plugins/declarativetestplugin/qdeclarativelocationtestmodel_p.h create mode 100644 tests/plugins/declarativetestplugin/qdeclarativepinchgenerator.cpp create mode 100644 tests/plugins/declarativetestplugin/qdeclarativepinchgenerator_p.h create mode 100644 tests/plugins/declarativetestplugin/qmldir create mode 100644 tests/plugins/declarativetestplugin/testhelper.h create mode 100644 tests/plugins/imports.pri create mode 100644 tests/tests.pro diff --git a/.QT-ENTERPRISE-LICENSE-AGREEMENT b/.QT-ENTERPRISE-LICENSE-AGREEMENT new file mode 100644 index 0000000..8d68b15 --- /dev/null +++ b/.QT-ENTERPRISE-LICENSE-AGREEMENT @@ -0,0 +1,1977 @@ +QT LICENSE AGREEMENT +Agreement version 4.4.1 + +This Qt License Agreement ("Agreement") is a legal agreement for the licensing +of Licensed Software (as defined below) between The Qt Company (as defined +below) and the Licensee who has accepted the terms of this Agreement by signing +this Agreement or by downloading or using the Licensed Software or in any other +appropriate means. + +Capitalized terms used herein are defined in Section 1. + +WHEREAS: + (A) Licensee wishes to use the Licensed Software for the purpose of + developing and distributing Applications and/or Devices (each as defined + below); + (B) The Qt Company is willing to grant the Licensee a right to use Licensed + Software for such a purpose pursuant to term and conditions of this + Agreement; and + (C) Parties wish to enable that their respective Affiliates also can sell + and purchase licenses to serve Licensee Affiliates' needs to use Licensed + Software pursuant to terms of the Agreement. Any such license purchases by + Licensee Affiliates from The Qt Company or its Affiliates will create + contractual relationship directly between the relevant The Qt Company and + the respective ordering Licensee Affiliate "Acceding Agreement"). + Accordingly, Licensee shall not be a party to any such Acceding Agreement, + and no rights or obligations are created to the Licensee thereunder but all + rights and obligations under such Acceding Agreement are vested and borne + solely by the ordering Licensee Affiliate and the relevant The Qt Company + as a contracting parties under such Acceding Agreement. + +NOW, THEREFORE, THE PARTIES HEREBY AGREE AS FOLLOWS: + +1. DEFINITIONS + +"Affiliate" of a Party shall mean an entity + (i) which is directly or indirectly controlling such Party; + (ii) which is under the same direct or indirect ownership or control as + such Party; or + (iii) which is directly or indirectly owned or controlled by such Party. +For these purposes, an entity shall be treated as being controlled by another +if that other entity has fifty percent (50 %) or more of the votes in such +entity, is able to direct its affairs and/or to control the composition of its +board of directors or equivalent body. + +"Add-on Products" shall mean The Qt Company's specific add-on software products +which are not licensed as part of The Qt Company's standard product offering, +but shall be included into the scope of Licensed Software only if so +specifically agreed between the Parties. + +"Agreement Term" shall mean the validity period of this Agreement, as set forth +in Section 12. + +"Applications" shall mean software products created using the Licensed +Software, which include the Redistributables, or part thereof. + +"Contractor(s)" shall mean third party consultants, distributors and +contractors performing services to the Licensee under applicable contractual +arrangement. + +"Customer(s)" shall mean Licensee's customers to whom Licensee, directly or +indirectly, distributes copies of the Redistributables as integrated or +incorporated into Applications or Devices. + +"Data Protection Legislation" shall mean the General Data Protection Regulation +(EU 2016/679) (GDPR) and any national implementing laws, regulations and +secondary legislation, as may be amended or updated from time to time, as well +as any other data protection laws or regulations applicable in relevant +territory. + +"Deployment Platforms" shall mean target operating systems and/or hardware +specified in the License Certificate, on which the Redistributables can be +distributed pursuant to the terms and conditions of this Agreement. + +"Designated User(s)" shall mean the employee(s) of Licensee or Licensee's +Affiliates acting within the scope of their employment or Licensee's +Contractors acting within the scope of their services on behalf of Licensee. + +"Development License" shall mean the license needed by the Licensee for each +Designated User to use the Licensed Software under the license grant described +in Section 3.1 of this Agreement. Development Licenses are available per +respective Licensed Software products, each product having its designated scope +and purpose of use. + +"Development License Term" shall mean the agreed validity period of the +Development License or QA Tools license during which time the relevant Licensed +Software product can be used pursuant to this Agreement. Agreed Development +License Term, as ordered and paid for by the Licensee, shall be memorialized in +the applicable License Certificate. + +"Development Platforms" shall mean those host operating systems specified in +the License Certificate, in which the Licensed Software can be used under the +Development License. + +"Devices" shall mean + (1) hardware devices or products that + i. are manufactured and/or distributed by the Licensee, its Affiliates, + Contractors or Customers, and + ii. incorporate, integrate or link to Applications such that + substantial functionality of such unit, when used by an End User, + is provided by Application(s) or otherwise depends on the Licensed + Software, regardless of whether the Application is developed by + Licensee or its Contractors; or + (2) Applications designed for the hardware devices specified in item (1). + + Devices covered by this Agreement shall be specified in Appendix 2 or in a + quote. + +"Distribution License(s)" shall mean a royalty-bearing license required for any +kind of sale, trade, exchange, loan, lease, rental or other distribution by or +on behalf of Licensee to a third party of Redistributables in connection with +Devices pursuant to license grant described in Section 3.3 of this Agreement. +Distribution Licensed are sold separately for each type of Device respectively +and cannot be used for any type of Devices at Licensee's discretion. + +"Distribution License Packs" shall mean set of prepaid Distribution Licenses +for distribution of Redistributables, as defined in The Qt Company's standard +price list, quote, Purchase Order confirmation or in an Appendix 2 hereto, as +the case may be. + +"End User" shall mean the final end user of the Application or a Device. + +"Evaluation License Term" shall mean a time period specified in the License +Certificate for the Licensee to use the relevant Licensed Software for +evaluation purposes according to Section 3.6 herein. + +"Intellectual Property Rights" shall mean patents (including utility models), +design patents, and designs (whether or not capable of registration), chip +topography rights and other like protection, copyrights, trademarks, service +marks, trade names, logos or other words or symbols and any other form of +statutory protection of any kind and applications for any of the foregoing as +well as any trade secrets. + +"License Certificate" shall mean a certificate generated by The Qt Company for +each Designated User respectively upon them downloading the Licensed Software, +which will be available under respective Designated User's Qt Account at +account.qt.io. License Certificates will specify relevant information +pertaining the Licensed Software purchased by Licensee and Designated User's +license to the Licensed Software. + +"License Fee" shall mean the fee charged to the Licensee for rights granted +under the terms of this Agreement. + +"Licensed Software" shall mean specified product of commercially licensed +version of Qt Software and/or QA Tools defined in Appendix 1 and/or Appendix 3, +which Licensee has purchased and which is provided to Licensee under the terms +of this Agreement. Licensed Software shall include corresponding online or +electronic documentation, associated media and printed materials, including the +source code (where applicable), example programs and the documentation. +Licensed Software does not include Third Party Software (as defined in Section +4) or Open Source Qt. The Qt Company may, in the course of its development +activities, at its free and absolute discretion and without any obligation to +send or publish any notifications to the Licensee or in general, make changes, +additions or deletions in the components and functionalities of the Licensed +Software, provided that no such changes, additions or deletions will affect +the already released version of the Licensed Software, but only upcoming +version(s). + +"Licensee" shall mean the individual or legal entity that is party to this +Agreement. + +"Licensee's Records" shall mean books and records that contain information +bearing on Licensee's compliance with this Agreement, Licensee's use of Open +Source Qt and/or the payments due to The Qt Company under this Agreement, +including, but not limited to user information, assembly logs, sales records +and distribution records. + +"Modified Software" shall have the meaning as set forth in Section 2.3. + +"Online Services" shall mean any services or access to systems made available +by The Qt Company to the Licensee over the Internet relating to the Licensed +Software or for the purpose of use by the Licensee of the Licensed Software or +Support. Use of any such Online Services is discretionary for the Licensee and +some of them may be subject to additional fees. + +"Open Source Qt" shall mean Qt Software available under the terms of the GNU +Lesser General Public License, version 2.1 or later ("LGPL") or the GNU General +Public License, version 2.0 or later ("GPL"). For clarity, Open Source Qt shall +not be provided, governed or used under this Agreement. + +"Party" or "Parties" shall mean Licensee and/or The Qt Company. + +"Permitted Software" shall mean (i) third party open source software products +that are generally available for public in source code form and free of any +charge under any of the licenses approved by Open Source Initiative as listed +on https://opensource.org/licenses, which may include parts of Open Source Qt +or be developed using Open Source Qt; and (ii) software The Qt Company has made +available via its Qt Marketplace online distribution channel. + +"Pre-Release Code" shall have the meaning as set forth in Section 4. + +"Prohibited Combination" shall mean any effort to use, combine, incorporate, +link or integrate Licensed Software with any software created with or +incorporating Open Source Qt, or use Licensed Software for creation of any such +software. + +"Purchase Order" shall have the meaning as set forth in Section 10.2. + +"QA Tools" shall mean software libraries and tools as defined in Appendix 1 +depending on which product(s) the Licensee has purchased under the Agreement. + +"Qt Software" shall mean the software libraries and tools of The Qt Company, +which The Qt Company makes available under commercial and/or open source +licenses. + +"Redistributables" shall mean the portions of the Licensed Software set forth +in Appendix 1 that may be distributed pursuant to the terms of this Agreement +in object code form only, including any relevant documentation. Where relevant, +any reference to Licensed Software in this Agreement shall include and refer +also to Redistributables. + +"Renewal Term" shall mean an extension of previous Development License Term as +agreed between the Parties. + +"Submitted Modified Software" shall have the meaning as set forth in Section +2.3. + +"Support" shall mean standard developer support that is provided by The Qt +Company to assist Designated Users in using the Licensed Software in accordance +with this Agreement and the Support Terms. + +"Support Terms" shall mean The Qt Company's standard support terms specified in +Appendix 9 hereto. + +"Taxes" shall have the meaning set forth in Section 10.5. + +"The Qt Company" shall mean: + (i) in the event Licensee is an individual residing in the United States or + a legal entity incorporated in the United States or having its + headquarters in the United States, The Qt Company Inc., a Delaware + corporation with its office at 3031 Tisch Way, 110 Plaza West, + San Jose, CA 95128, USA.; or + (ii) in the event the Licensee is an individual residing outside of the + United States or a legal entity incorporated outside of the United + States or having its registered office outside of the United States, + The Qt Company Ltd., a Finnish company with its registered office at + Miestentie 7, 02150 Espoo, Finland. + +"Third-Party Software" shall have the meaning set forth in Section 4. + +"Updates" shall mean a release or version of the Licensed Software containing +bug fixes, error corrections and other changes that are generally made +available to users of the Licensed Software that have contracted for Support. +Updates are generally depicted as a change to the digits following the decimal +in the Licensed Software version number. The Qt Company shall make Updates +available to the Licensee under the Support. Updates shall be considered as +part of the Licensed Software hereunder. + +"Upgrades" shall mean a release or version of the Licensed Software containing +enhancements and new features and are generally depicted as a change to the +first digit of the Licensed Software version number. In the event Upgrades are +provided to the Licensee under this Agreement, they shall be considered as part +of the Licensed Software hereunder. + +2. OWNERSHIP + +2.1. Ownership of The Qt Company + +The Licensed Software is protected by copyright laws and international +copyright treaties, as well as other intellectual property laws and treaties. +The Licensed Software is licensed, not sold. + +All of The Qt Company's Intellectual Property Rights are and shall remain the +exclusive property of The Qt Company or its licensors respectively. No rights +to The Qt Company's Intellectual Property Rights are assigned or granted to +Licensee under this Agreement, except when and to the extent expressly +specified herein. + +2.2. Ownership of Licensee + +All the Licensee's Intellectual Property Rights are and shall remain the +exclusive property of the Licensee or its licensors respectively. + +All Intellectual Property Rights to the Modified Software, Applications and +Devices shall remain with the Licensee and no rights thereto shall be granted +by the Licensee to The Qt Company under this Agreement (except as set forth in +Section 2.3 below). + +2.3. Modified Software + +Licensee may create bug-fixes, error corrections, patches or modifications to +the Licensed Software ("Modified Software"). Such Modified Software may break +the source or binary compatibility with the Licensed Software (including +without limitation through changing the application programming interfaces +("API") or by adding, changing or deleting any variable, method, or class +signature in the Licensed Software and/or any inter-process protocols, +services or standards in the Licensed Software libraries). To the extent that +Licensee's Modified Software so breaks source or binary compatibility with the +Licensed Software, Licensee acknowledges that The Qt Company's ability to +provide Support may be prevented or limited and Licensee's ability to make use +of Updates may be restricted. + +Licensee may, at its sole and absolute discretion, choose to submit Modified +Software to The Qt Company ("Submitted Modified Software") in connection with +Licensee's Support request, service request or otherwise. In the event +Licensee does so, then, Licensee hereby grants The Qt Company a sublicensable, +assignable, irrevocable, perpetual, worldwide, non-exclusive, royalty-free and +fully paid-up license, under all of Licensee's Intellectual Property Rights, to +reproduce, adapt, translate, modify, and prepare derivative works of, publicly +display, publicly perform, sublicense, make available and distribute such +Submitted Modified Software as The Qt Company sees fit at its free and absolute +discretion. + +3. LICENSES GRANTED + +3.1. Development with Licensed Software + +Subject to the terms of this Agreement, The Qt Company grants to Licensee a +worldwide, non-exclusive, non-transferable license, valid for each Development +License Term, to use, modify and copy the Licensed Software by Designated +Users on the Development Platforms for the sole purposes of designing, +developing, demonstrating and testing Application(s) and/or Devices, and to +provide thereto related support and other related services to Customers. Each +Application and/or Device can only include, incorporate or integrate +contributions by such Designated Users who are duly licensed for the applicable +Development Platform(s) and Deployment Platform(s) (i.e have a valid license +for the appropriate Licensed Software product). + +Licensee may install copies of the Licensed Software on five (5) computers per +Designated User, provided that only the Designated Users who have a valid +Development License may use the Licensed Software. + +Licensee may at any time designate another Designated User to replace a +then-current Designated User by notifying The Qt Company in writing, where such +replacement is due to termination of employment, change of job duties, long +time absence or other such permanent reason affecting Designated User's need +for Licensed Software. + +Upon expiry of the initially agreed Development License Term, the respective +Development License Term shall be automatically extended to one or more Renewal +Term(s), unless and until either Party notifies the other Party in writing, or +any other method acceptable to The Qt Company (it being specifically +acknowledged and understood that verbal notification is explicitly deemed +inadequate in all circumstances), that it does not wish to continue the +Development License Term, such notification to be provided to the other Party +no less than thirty (30) days before expiry of the respective Development +License Term. The Qt Company shall, in good time before the due date for the +above notification, remind the Licensee on the coming Renewal Term. Unless +otherwise agreed between the Parties, Renewal Term shall be 12 months. + +Any such Renewal Term shall be subject to License Fees agreed between the +Parties or, if no advance agreement exists, subject to The Qt Company's +standard list pricing applicable at the commencement date of any such +Renewal Term. + +The Qt Company may either request the Licensee to place a purchase order +corresponding to a quote by The Qt Company, or use Licensee's stored Credit +Card information in the Qt Account to automatically charge the Licensee for the +relevant Renewal Term. + +3.2. Distribution of Applications + +Subject to the terms of this Agreement, The Qt Company grants to Licensee a +worldwide, non-exclusive, non-transferable, revocable (for cause pursuant to +this Agreement), right and license, valid for the Agreement Term, to + (i) distribute, by itself or through its Contractors, Redistributables as + installed, incorporated or integrated into Applications for execution + on the Deployment Platforms, and + (ii) grant perpetual and irrevocable sublicenses to Redistributables, as + distributed hereunder, for Customers solely to the extent necessary in + order for the Customers to use the Applications for their respective + intended purposes. + +Right to distribute the Redistributables as part of an Application as provided +herein is not royalty-bearing but is conditional upon the Application having +been created, updated and maintained under a valid and duly paid Development +Licenses. + +3.3. Distribution of Devices + +Subject to the terms of this Agreement, The Qt Company grants to Licensee a +worldwide, non-exclusive, non-transferable, revocable (for cause pursuant to +this Agreement), right and license, valid for the Agreement Term, to + (i) distribute, by itself or through one or more tiers of Contractors, + Redistributables as installed, incorporated or integrated, or intended + to be installed, incorporated or integrated into Devices for execution + on the Deployment Platforms, and + (ii) grant perpetual and irrevocable sublicenses to Redistributables, as + distributed hereunder, for Customers solely to the extent necessary in + order for the Customers to use the Devices for their respective + intended purposes. + +Right to distribute the Devices as provided herein is conditional upon + (i) the Devices having been created, updated and maintained under a valid + and duly paid Development Licenses, and + (ii) the Licensee having acquired corresponding Distribution Licenses at + the time of distribution of any Devices to Customers. + +3.4. Further Requirements + +The licenses granted above in this Section 3 by The Qt Company to Licensee are +conditional and subject to Licensee's compliance with the following terms: + (i) Licensee acknowledges that The Qt Company has separate products of + Licensed Software for the purpose of Applications and Devices + respectively, where development and distribution of Devices is only + allowed using the correct designated product. Licensee shall make sure + and bear the burden of proof that Licensee is using a correct product + of Licensed Software entitling Licensee to development and distribution + of Devices; + (ii) Licensee shall not remove or alter any copyright, trademark or other + proprietary rights notice(s) contained in any portion of the Licensed + Software; + (iii) Applications must add primary and substantial functionality to the + Licensed Software so as not to compete with the Licensed Software; + (iv) Applications may not pass on functionality which in any way makes it + possible for others to create software with the Licensed Software; + provided however that Licensee may use the Licensed Software's + scripting and QML ("Qt Quick") functionality solely in order to enable + scripting, themes and styles that augment the functionality and + appearance of the Application(s) without adding primary and substantial + functionality to the Application(s); + (v) Licensee shall not use Licensed Software in any manner or for any + purpose that infringes, misappropriates or otherwise violates any + Intellectual property or right of any third party, or that violates any + applicable law; + (vi) Licensee shall not use The Qt Company's or any of its suppliers' + names, logos, or trademarks to market Applications, except that + Licensee may use "Built with Qt" logo to indicate that Application(s) + or Device(s) was developed using the Licensed Software; + (vii) Licensee shall not distribute, sublicense or disclose source code of + Licensed Software to any third party (provided however that Licensee + may appoint employee(s) of Contractors and Affiliates as Designated + Users to use Licensed Software pursuant to this Agreement). Such right + may be available for the Licensee subject to a separate software + development kit ("SDK") license agreement to be concluded with The Qt + Company; + (viii) Licensee shall not grant the Customers a right to (a) make copies of + the Redistributables except when and to the extent required to use the + Applications and/or Devices for their intended purpose, (b) modify the + Redistributables or create derivative works thereof, (c) decompile, + disassemble or otherwise reverse engineer Redistributables, or (d) + redistribute any copy or portion of the Redistributables to any third + party, except as part of the onward sale of the Application or Device + on which the Redistributables are installed; + (ix) Licensee shall not and shall cause that its Affiliates or Contractors + shall not use Licensed Software in any Prohibited Combination, unless + Licensee has received an advance written permission from The Qt Company + to do so. Absent such written permission, any and all distribution by + the Licensee during the Agreement Term of a hardware device or product + a) which incorporate or integrate any part of Licensed Software or Open + Source Qt; or b) where substantial functionality is provided by + software built with Licensed Software or Open Source Qt or otherwise + depends on the Licensed Software or Open Source Qt, shall be considered + to be Device distribution under this Agreement and shall be dependent + on Licensee's compliance thereof (including but not limited to + obligation to pay applicable License Fees for such distribution). + Notwithstanding what is provided above in this sub-section (ix), + Licensee is entitled to use and combine Licensed Software with any + Permitted Software; + (x) Licensee shall cause all of its Affiliates, Contractors and Customers + entitled to make use of the licenses granted under this Agreement, to + be contractually bound to comply with the relevant terms of this + Agreement and not to use the Licensed Software beyond the terms hereof + and for any purposes other than operating within the scope of their + services for Licensee. Licensee shall be responsible for any and all + actions and omissions of its Affiliates and Contractors relating to the + Licensed Software and use thereof (including but not limited to payment + of all applicable License Fees); + (xi) Except when and to the extent explicitly provided in this Section 3, + Licensee shall not transfer, publish, disclose, display or otherwise + make available the Licensed Software; and + (xii) Licensee shall not attempt or enlist a third party to conduct or + attempt to conduct any of the above. + +Above terms shall not be applicable if and to the extent they conflict with any +mandatory provisions of any applicable laws. + +Any use of Licensed Software beyond the provisions of this Agreement is +strictly prohibited and requires an additional license from The Qt Company. + +3.5 QA Tools License + +Subject to the terms of this Agreement, The Qt Company grants to Licensee a +worldwide, non-exclusive, non-transferable license, valid for the Development +License Term, to use the QA Tools for Licensee's internal business purposes in +the manner provided below and in Appendix 1 hereto. + +Licensee may modify the QA Tools except for altering or removing any details of +ownership, copyright, trademark or other property right connected with the QA +Tools. + +Licensee shall not distribute the QA Tools or any part thereof, modified or +unmodified, separately or as part of any software package, Application or +Device. + +Upon expiry of the initially agreed Development License Term, the respective +Development License Term shall be automatically extended to one or more Renewal +Term(s), unless and until either Party notifies the other Party in writing, or +any other method acceptable to The Qt Company (it being specifically +acknowledged and understood that verbal notification is explicitly deemed +inadequate in all circumstances), that it does not wish to continue the +Development License Term, such notification to be provided to the other Party +no less than thirty (30) days before expiry of the respective Development +License Term. The Qt Company shall, in good time before the due date for the +above notification, remind the Licensee on the coming Renewal Term. Unless +otherwise agreed between the Parties, Renewal Term shall be 12 months. + +Any such Renewal Term shall be subject to License Fees agreed between the +Parties or, if no advance agreement exists, subject to The Qt Company's +standard list pricing applicable at the commencement date of any such +Renewal Term. + +3.6 Evaluation License + +Subject to the terms of this Agreement, The Qt Company grants to Licensee a +worldwide, non-exclusive, non-transferable license, valid for the Evaluation +License Term to use the Licensed Software solely for the Licensee's internal +use to evaluate and determine whether the Licensed Software meets Licensee's +business requirements, specifically excluding any commercial use of the +Licensed Software or any derived work thereof. + +Upon the expiry of the Evaluation License Term, Licensee must either +discontinue use of the relevant Licensed Software or acquire a commercial +Development License or QA Tools License specified herein. + +4. THIRD-PARTY SOFTWARE + +The Licensed Software may provide links or access to third party libraries or +code (collectively "Third-Party Software") to implement various functions. +Third-Party Software does not, however, comprise part of the Licensed Software, +but is provided to Licensee complimentary and use thereof is discretionary for +the Licensee. Third-Party Software will be listed in the ".../src/3rdparty" +source tree delivered with the Licensed Software or documented in the Licensed +Software, as such may be amended from time to time. Licensee acknowledges that +use or distribution of Third-Party Software is in all respects subject to +applicable license terms of applicable third-party right holders. + +5. PRE-RELEASE CODE + +The Licensed Software may contain pre-release code and functionality, or sample +code marked or otherwise stated with appropriate designation such as +"Technology Preview", "Alpha", "Beta", "Sample", "Example" etc. +("Pre-Release Code"). + +Such Pre-Release Code may be present complimentary for the Licensee, in order +to provide experimental support or information for new platforms or +preliminary versions of one or more new functionalities or for other similar +reasons. The Pre-Release Code may not be at the level of performance and +compatibility of a final, generally available, product offering. The +Pre-Release Code may not operate correctly, may contain errors and may be +substantially modified by The Qt Company prior to the first commercial +product release, if any. The Qt Company is under no obligation to make +Pre-Release Code commercially available, or provide any Support or Updates +relating thereto. The Qt Company assumes no liability whatsoever regarding +any Pre-Release Code, but any use thereof is exclusively at Licensee's own risk +and expense. + +For clarity, unless Licensed Software specifies different license terms for the +respective Pre-Release Code, the Licensee is entitled to use such pre-release +code pursuant to Section 3, just like other Licensed Software. + +6. LIMITED WARRANTY AND WARRANTY DISCLAIMER + +The Qt Company hereby represents and warrants that (i) it has the power and +authority to grant the rights and licenses granted to Licensee under this +Agreement, and (ii) Licensed Software will operate materially in accordance +with its specifications. + +Except as set forth above, the Licensed Software is licensed to Licensee "as +is" and Licensee's exclusive remedy and The Qt Company's entire liability for +errors in the Licensed Software shall be limited, at The Qt Company's option, +to correction of the error, replacement of the Licensed Software or return of +the applicable fees paid for the defective Licensed Software for the time +period during which the License is not able to utilize the Licensed Software +under the terms of this Agreement. + +TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, THE QT COMPANY ON BEHALF OF +ITSELF AND ITS LICENSORS, SUPPLIERS AND AFFILIATES, DISCLAIMS ALL OTHER +WARRANTIES, EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, ANY IMPLIED +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND +NON-INFRINGEMENT WITH REGARD TO THE LICENSED SOFTWARE. THE QT COMPANY DOES NOT +WARRANT THAT THE LICENSED SOFTWARE WILL SATISFY LICENSEE'S REQUIREMENTS OR THAT +IT WILL OPERATE WITHOUT DEFECT OR ERROR OR THAT THE OPERATION THEREOF WILL BE +UNINTERRUPTED. + +7. LIMITATION OF LIABILITY + +EXCEPT FOR (I) CASES OF GROSS NEGLIGENCE OR INTENTIONAL MISCONDUCT, AND (II) +BREACH OF CONFIDENTIALITY, AND TO THE EXTENT PERMITTED BY APPLICABLE LAW, IN NO +EVENT SHALL EITHER PARTY BE LIABLE TO THE OTHER PARTY FOR ANY LOSS OF PROFIT, +LOSS OF DATA, LOSS OF BUSINESS OR GOODWILL OR ANY OTHER INDIRECT, SPECIAL, +CONSEQUENTIAL, INCIDENTAL OR PUNITIVE COST, DAMAGES OR EXPENSE OF ANY KIND, +HOWSOEVER ARISING UNDER OR IN CONNECTION WITH THIS AGREEMENT. + +EXCEPT FOR (I) CASES OF GROSS NEGLIGENCE OR INTENTIONAL MISCONDUCT, AND (II) +BREACH OF CONFIDENTIALITY, AND TO THE EXTENT PERMITTED BY APPLICABLE LAW, IN NO +EVENT SHALL EITHER PARTY'S TOTAL AGGREGATE LIABILITY UNDER THIS AGREEMENT +EXCEED THE AGGREGATE LICENSE FEES PAID OR PAYABLE TO THE QT COMPANY BY LICENSEE +DURING THE DEVELOPMENT LICENSE TERM DURING WHICH THE EVENT RESULTING IN SUCH +LIABILITY OCCURRED. + +THE PROVISIONS OF THIS SECTION 7 ALLOCATE THE RISKS UNDER THIS AGREEMENT +BETWEEN THE QT COMPANY AND LICENSEE AND THE PARTIES HAVE RELIED UPON THE +LIMITATIONS SET FORTH HEREIN IN DETERMINING WHETHER TO ENTER INTO THIS +AGREEMENT. + +NOTWITHSTANDING ANYTHING TO THE CONTRARY IN THIS AGREEMENT, LICENSEE SHALL +ALWAYS BE LIABLE TO PAY THE APPLICABLE LICENSE FEES CORRESPONDING TO ITS +ACTUAL USE OF LICENSED SOFTWARE. + +8. SUPPORT, UPDATES AND ONLINE SERVICES + +Upon due payment of the agreed License Fees the Licensee will be eligible to +receive Support and Updates and to use the Online Services during the agreed +Development License Term or other agreed fixed time period. Support is +provided according to agreed support level and subject to applicable +requirements and restrictions, as specified in the Support Terms. + +Unless otherwise decided by The Qt Company at its free and absolute discretion, +Upgrades will not be included in the Support but may be available subject to +additional fees. + +From time to time The Qt Company may change the Support Terms, provided that +during the respective ongoing Support period the level of Support may not be +reduced without the consent of the Licensee. + +Unless otherwise agreed, The Qt Company shall not be responsible for providing +any service or support to Customers. + +9. CONFIDENTIALITY + +Each Party acknowledges that during the Agreement Term each Party may receive +information about the other Party's business, business methods, business plans, +customers, business relations, technology, and other information, including the +terms of this Agreement, that is confidential and of great value to the other +Party, and the value of which would be significantly reduced if disclosed to +third parties ("Confidential Information"). Accordingly, when a Party (the +"Receiving Party") receives Confidential Information from the other Party (the +"Disclosing Party"), the Receiving Party shall only disclose such information +to employees and Contractors on a need to know basis, and shall cause its +employees and employees of its Affiliates to: (i) maintain any and all +Confidential Information in confidence; (ii) not disclose the Confidential +Information to a third party without the Disclosing Party's prior written +approval; and (iii) not, directly or indirectly, use the Confidential +Information for any purpose other than for exercising its rights and +fulfilling its responsibilities pursuant to this Agreement. Each Party shall +take reasonable measures to protect the Confidential Information of the other +Party, which measures shall not be less than the measures taken by such Party +to protect its own confidential and proprietary information. + +Obligation of confidentiality shall not apply to information that (i) is or +becomes generally known to the public through no act or omission of the +Receiving Party; (ii) was in the Receiving Party's lawful possession prior to +the disclosure hereunder and was not subject to limitations on disclosure or +use; (iii) is developed independently by employees or Contractors of the +Receiving Party or other persons working for the Receiving Party who have not +had access to the Confidential Information of the Disclosing Party, as proven +by the written records of the Receiving Party; (iv) is lawfully disclosed to +the Receiving Party without restrictions, by a third party not under an +obligation of confidentiality; or (v) the Receiving Party is legally compelled +to disclose, in which case the Receiving Party shall notify the Disclosing +Party of such compelled disclosure and assert the privileged and confidential +nature of the information and cooperate fully with the Disclosing Party to +limit the scope of disclosure and the dissemination of disclosed Confidential +Information to the minimum extent necessary. + +The obligations under this Section 9 shall continue to remain in force for a +period of five (5) years after the last disclosure, and, with respect to trade +secrets, for so long as such trade secrets are protected under applicable trade +secret laws. + +10. FEES, DELIVERY AND PAYMENT + +10.1. License Fees + +License Fees are described in The Qt Company's standard price list, quote or +Purchase Order confirmation or in an Appendix 2 hereto, as the case may be. + +Unless otherwise expressly provided in this Agreement, the License Fees shall +not be refunded or claimed as a credit in any event or for any reason +whatsoever. + +10.2. Ordering Licenses + +Licensee may purchase Development Licenses, Distribution Licenses and QA Tools +Licenses pursuant to agreed pricing terms or, if no specific pricing terms have +been agreed upon, at The Qt Company's standard pricing terms applicable at the +time of purchase. + +Unless expressly otherwise agreed, any price or other term quoted to the +Licensee or specified herein shall only be valid for the thirty (30) days from +the effective date of this Agreement, Appendix 2 or the date of the quote, as +applicable. + +Licensee shall submit all purchase orders for Development Licenses and +Distribution Licenses to The Qt Company by email or any other method acceptable +to The Qt Company (each such order is referred to herein as a "Purchase Order") +for confirmation, whereupon the Purchase Order shall become binding between the +Parties. + +Licensee acknowledges and agrees that all Purchase Orders for Licensed Software +the Licensee makes during the Agreement Term shall be governed exclusively +under the terms of this Agreement. + +10.3. Distribution License Packs + +Unless otherwise agreed, Distribution Licenses shall be purchased by way of +Distribution License Packs. + +Upon due payment of the ordered Distribution License Pack(s), the Licensee will +have an account of Distribution Licenses available for distributing the +Redistributables in accordance with this Agreement. + +Each time Licensee distributes a copy of Redistributables, then one +Distribution License is used, and Licensee's account of available Distribution +Licenses is decreased accordingly. + +Licensee may distribute copies of the Redistributables so long as Licensee has +Distribution Licenses remaining on its account. + +10.4. Payment Terms + +License Fees and any other charges under this Agreement shall be paid by +Licensee no later than thirty (30) days from the date of the applicable invoice +from The Qt Company. + +The Qt Company will submit an invoice to Licensee after the date of this +Agreement and/or after The Qt Company receives a Purchase Order from Licensee. + +A late payment charge of the lower of (a) one percent per month; or (b) the +interest rate stipulated by applicable law, shall be charged on any unpaid +balances that remain past due and which have not been disputed by the Licensee +in good faith. + +10.5. Taxes + +All License Fees and other charges payable hereunder are gross amounts but +exclusive of any value added tax, use tax, sales tax, withholding tax and other +taxes, duties or tariffs ("Taxes") levied directly for the sale, delivery or +use of Licensed Software hereunder pursuant to any applicable law. Such +applicable Taxes shall be paid by Licensee to The Qt Company, or, where +applicable, in lieu of payment of such Taxes to The Qt Company, Licensee shall +provide an exemption certificate to The Qt Company and any applicable +authority. + +11. RECORD-KEEPING AND REPORTING OBLIGATIONS; AUDIT RIGHTS + +11.1. Licensee's Record-keeping + +Licensee shall at all times during the Agreement Term and for a period of two +(2) years thereafter maintain Licensee's Records in an accurate and up-to-date +form. Licensee's Records shall be adequate to reasonably enable The Qt Company +to determine Licensee's compliance with the provisions of this Agreement. The +records shall conform to general good accounting practices. + +Licensee shall, within thirty (30) days from receiving The Qt Company's request +to that effect, deliver to The Qt Company a report based on Licensee's Records, +such report to contain information, in sufficient detail, on (i) number and +identity of users working with Licensed Software or Open Source Qt, (ii) copies +of Redistributables distributed by Licensee during the most recent calendar +quarter and/or any other term specified by The Qt Company, , and (iii) any +other information pertaining to Licensee's compliance with the terms of this +Agreement (like e.g. information on products and/or projects relating to use of +Distribution Licenses), as The Qt Company may reasonably require from time to +time. + +11.2. The Qt Company's Audit Rights + +The Qt Company or an independent auditor acting on behalf of The Qt Company's, +may, upon at least thirty (30) days' prior written notice and at its expense, +audit Licensee with respect to the Licensee's use of the Licensed Software, but +not more frequently than once during each 6-month period. Such audit may be +conducted by mail, electronic means or through an in-person visit to Licensee's +place of business. Any possible in-person audit shall be conducted during +regular business hours at Licensee's facilities and shall not unreasonably +interfere with Licensee's business activities and shall be limited in scope to +verify Licensee's compliance with the terms of this Agreement. The Qt Company +or the independent auditor acting on behalf of The Qt Company shall be entitled +to inspect Licensee's Records and conduct necessary interviews of Licensee's +relevant employees and Contractors. All such Licensee's Records and use thereof +shall be subject to an obligation of confidentiality under this Agreement. + +If an audit reveals that Licensee is using the Licensed Software beyond scope +of the licenses Licensee has paid for, Licensee shall pay to The Qt Company any +amounts owed for such unauthorized use within 30 days from receipt of the +corresponding invoice from The Qt Company. + +In addition, in the event the audit reveals a material violation of the terms +of this Agreement (without limitation, either (i) underpayment of more than 10 +% of License Fees or 10,000 euros (whichever is more) or (ii) distribution of +products, which include or result from Prohibited Combination, shall be deemed +a material violation for purposes of this section), then the Licensee shall +pay The Qt Company's reasonable cost of conducting such audit. + +12. TERM AND TERMINATION + +12.1. Agreement Term + +This Agreement shall enter into force upon due acceptance by both Parties and +remain in force until terminated pursuant to the terms of this Section 12 +("Agreement Term"). + +12.2. Termination for breach and suspension of rights +Either Party shall have the right to terminate this Agreement upon thirty (30) +days prior written notice if the other Party commits a material breach of any +obligation of this Agreement and fails to remedy such breach within such notice +period. + +Instead of termination, The Qt Company shall have the right to suspend or +withhold grants of all rights to the Licensed Software hereunder, including but +not limited to the Development Licenses, Distribution License, and Support, +should Licensee fail to make payment in timely fashion or otherwise violates or +is reasonably suspected to violate its obligations or terms of this Agreement, +and where such violation or breach is not cured within ten (10) business days +following The Qt Company's written notice thereof. + +12.3. Termination for insolvency + +Either Party shall have the right to terminate this Agreement immediately upon +written notice in the event that the other Party becomes insolvent, files for +any form of bankruptcy, makes any assignment for the benefit of creditors, has +a receiver, administrative receiver or officer appointed over the whole or a +substantial part of its assets, ceases to conduct business, or an act +equivalent to any of the above occurs under the laws of the jurisdiction of the +other Party. + +12.4. Parties' Rights and Duties upon Termination + +Upon expiry or termination of the Agreement, Licensee shall cease and shall +cause all Designated Users (including those of its Affiliates' and +Contractors') to cease using the Licensed Software under this Agreement. For +clarity, a Development License of a Designated User or a QA Tools License, and +all rights relating thereto, shall always terminate at the expiry of the +respective Development License Term, even if the Agreement continues to remain +in force. + +Upon such termination the Licensee shall destroy or return to The Qt Company +all copies of the Licensed Software and all related materials and will certify +the same by Licensee's duly authorized officer to The Qt Company upon its +request, provided however that Licensee may retain and exploit such copies of +the Licensed Software as it may reasonably require in providing continued +support to Customers. + +Except when this Agreement is terminated by The Qt Company due to Licensee's +material breach as set forth in Section 12.2, the Licensee may continue +distribution of Applications and Devices under the terms of this Agreement +despite the termination of this Agreement. In such event the terms hereof will +continue to be applicable and govern any such distribution of Applications and +Devices beyond the expiry or termination of this Agreement. In case of +termination by The Qt Company due to Licensee's material breach, Licensee must +cease any distribution of Applications and Devices at the date of termination +of this Agreement. + +Expiry or termination of this Agreement for any reason whatsoever shall not +relieve Licensee of its obligation to pay any License Fees accrued or payable +to The Qt Company prior to the effective date of termination, and Licensee pay +to The Qt Company all such fees within 30 days from the effective date of +termination of this Agreement. + +Termination of this Agreement shall not affect any rights of Customers to +continue use of Applications and Devices (and therein incorporated +Redistributables). + +12.5. Extension of Rights under Special Circumstances + +In the event of The Qt Company choosing not to renew the Development License(s) +or QA Tools Licenses, as set forth in Section 3.1 and 3.5 respectively, and +where such decision of non-renewal is not due to any ongoing breach or alleged +breach (as reasonably determined by The Qt Company) by Licensee of the terms of +this Agreement or any applicable license terms of Open Source Qt, then all +valid and affected Development Licenses and QA Tools licenses possessed by the +Licensee at such date shall be extended to be valid in perpetuity under the +terms of this Agreement and Licensee is entitled to purchase additional +licenses as set forth in Section 10.2. + +In the event The Qt Company is declared bankrupt under a final, non-cancellable +decision by relevant court of law, and this Agreement is not, at the date of +expiry of the Development License(s) or QA Tools Licenses, assigned to party, +who has assumed The Qt Company's position as a legitimate licensor of Licensed +Software under this Agreement, then all valid Development Licenses and QA Tools +Licenses possessed by the Licensee at such date of expiry, and which the +Licensee has not notified for expiry, shall be extended to be valid in +perpetuity under the terms of this Agreement. + +For clarity, in case of an extension under this Section 12.5, any such +extension shall not apply to The Qt Company's Support obligations, but Support +shall be provided only up until the end of the respective fixed Development +License Term regardless of the extension of relevant Development License or QA +Tools License, unless otherwise agreed between the Parties. + +13. GOVERNING LAW AND LEGAL VENUE + +In the event this Agreement is in the name of The Qt Company Inc., a Delaware +Corporation, then: + (i) this Agreement shall be construed and interpreted in accordance with + the laws of the State of California, USA, excluding its choice of law + provisions; + (ii) the United Nations Convention on Contracts for the International Sale + of Goods will not apply to this Agreement; and + (iii) any dispute, claim or controversy arising out of or relating to this + Agreement or the breach, termination, enforcement, interpretation or + validity thereof, including the determination of the scope or + applicability of this Agreement to arbitrate, shall be determined by + arbitration in San Francisco, USA, before one arbitrator. The + arbitration shall be administered by JAMS pursuant to JAMS' Streamlined + Arbitration Rules and Procedures. Judgment on the Award may be entered + in any court having jurisdiction. This Section shall not preclude + parties from seeking provisional remedies in aid of arbitration from a + court of appropriate jurisdiction. + +In the event this Agreement is in the name of The Qt Company Ltd., a Finnish +Company, then: + (i) this Agreement shall be construed and interpreted in accordance with + the laws of Finland, excluding its choice of law provisions; + (ii) the United Nations Convention on Contracts for the International Sale + of Goods will not apply to this Agreement; and + (iii) any disputes, controversy or claim arising out of or relating to this + Agreement, or the breach, termination or validity thereof shall be + finally settled by arbitration in accordance with the Arbitration Rules + of International Chamber of Commerce. The arbitration tribunal shall + consist of one (1), or if either Party so requires, of three (3), + arbitrators. The award shall be final and binding and enforceable in + any court of competent jurisdiction. The arbitration shall be held in + Helsinki, Finland and the process shall be conducted in the English + language. This Section shall not preclude parties from seeking + provisional remedies in aid of arbitration from a court of appropriate + jurisdiction. + +14. GENERAL PROVISIONS + +14.1. No Assignment + +Except in the case of a merger or sale of substantially all of its corporate +assets, Licensee shall not be entitled to assign or transfer all or any of its +rights, benefits and obligations under this Agreement without the prior written +consent of The Qt Company, which shall not be unreasonably withheld or delayed. +The Qt Company shall be entitled to freely assign or transfer any of its +rights, benefits or obligations under this Agreement. + +14.2. No Third-Party Representations + +Licensee shall make no representations or warranties concerning the Licensed +Software on behalf of The Qt Company. Any representation or warranty Licensee +makes or purports to make on The Qt Company's behalf shall be void as to +The Qt Company. + +14.3. Surviving Sections + +Any terms and conditions that by their nature or otherwise reasonably should +survive termination of this Agreement shall so be deemed to survive. Such +sections include especially the following: 1, 2, 6, 7, 9, 11, 12.4, 13 and 14. + +14.4. Entire Agreement + +This Agreement, the Appendices hereto, the License Certificate and any +applicable quote and Purchase Order accepted by The Qt Company constitute the +complete agreement between the Parties and supersedes all prior or +contemporaneous discussions, representations, and proposals, written or oral, +with respect to the subject matters discussed herein. + +In the event of any conflict or inconsistency between this Agreement and any +Purchase Order, the terms of this Agreement will prevail over the terms of the +Purchase Order with respect to such conflict or inconsistency. + +Parties specifically acknowledge and agree that this Agreement prevails over +any click-to-accept or similar agreements the Designated Users may need to +accept online upon download of the Licensed Software, as may be required by +The Qt Company's applicable processes relating to Licensed Software. + +14.5. Modifications + +No modification of this Agreement shall be effective unless contained in a +writing executed by an authorized representative of each Party. No term or +condition contained in Licensee's Purchase Order ("Deviating Terms") shall +apply unless The Qt Company has expressly agreed such Deviating Terms in +writing. Unless and to the extent expressly agreed by The Qt Company, any such +Deviating Terms shall be deemed void and with no legal effect. For clarity, +delivery of the Licensed Software following the receipt of the Purchase Order +including Deviating Terms shall not constitute acceptance of such Deviating +Terms. + +14.6. Force Majeure + +Except for the payment obligations hereunder, neither Party shall be liable to +the other for any delay or non-performance of its obligations hereunder in the +event and to the extent that such delay or non-performance is due to an event +of act of God, terrorist attack or other similar unforeseeable catastrophic +event that prevents either Party for fulfilling its obligations under this +Agreement and which such Party cannot avoid or circumvent ("Force Majeure +Event"). If the Force Majeure Event results in a delay or non-performance of a +Party for a period of three (3) months or longer, then either Party shall have +the right to terminate this Agreement with immediate effect without any +liability (except for the obligations of payment arising prior to the event of +Force Majeure) towards the other Party. + +14.7. Notices + +Any notice given by one Party to the other shall be deemed properly given and +deemed received if specifically acknowledged by the receiving Party in writing +or when successfully delivered to the recipient by hand, fax, or special +courier during normal business hours on a business day to the addresses +specified for each Party on the signature page. Each communication and document +made or delivered by one Party to the other Party pursuant to this Agreement +shall be in the English language. + +14.8. Export Control + +Licensee acknowledges that the Redistributables, as incorporated in +Applications or Devices, may be subject to export control restrictions under +the applicable laws of respective countries. Licensee shall fully comply with +all applicable export license restrictions and requirements as well as with all +laws and regulations relating to the Redistributables and exercise of licenses +hereunder and shall procure all necessary governmental authorizations, +including without limitation, all necessary licenses, approvals, permissions or +consents, where necessary for the re-exportation of the Redistributables, +Applications and/or Devices. + +14.9. No Implied License + +There are no implied licenses or other implied rights granted under this +Agreement, and all rights, save for those expressly granted hereunder, shall +remain with The Qt Company and its licensors. In addition, no licenses or +immunities are granted to the combination of the Licensed Software with any +other software or hardware not delivered by The Qt Company under this +Agreement. + +14.10. Attorney Fees + +The prevailing Party in any action to enforce this Agreement shall be entitled +to recover its attorney's fees and costs in connection with such action, as to +be ordered by the relevant dispute resolution body. + +14.11. Privacy + +Licensee acknowledges and agrees that for the purpose of this Agreement, +The Qt Company may collect, use, transfer and disclose personal data pertaining +to Designated Users as well as any other employees and directors of the +Licensee and its Contractors relevant for carrying out the intent of this +Agreement. Such personal data will be primarily collected from the relevant +individuals but may be collected also from Licensee (e.g. in the course of +Licensee's reporting obligations). The Parties acknowledge that as +The Qt Company determines the purpose and means for such collection and +processing of the applicable personal data, The Qt Company shall be regarded as +the Data Controller under the applicable Data Protection Legislation. +The Qt Company shall process any such personal data in accordance with its +privacy and security policies and practices, which will comply with all +applicable requirements of the Data Protection Legislation. + +14.12. Severability + +If any provision of this Agreement shall be adjudged by any court of competent +jurisdiction to be unenforceable or invalid, that provision shall be limited or +eliminated to the minimum extent necessary so that this Agreement shall +otherwise remain in full force and effect and enforceable. + +14.13. Marketing Rights + +Parties have agreed upon Marketing Rights pursuant to Appendix 7, if any. + + + + +APPENDICES +The Agreement includes following Appendices 1-10, as applicable. +- Appendix 1: Licensed Software details +- Appendix 2: Pricing +- Appendix 3: Add-on Software details (optional) +- Appendix 4: Small business and startup Licenses (optional) +- Appendix 5: Non-commercial and educational Licenses (optional) +- Appendix 6: License Reporting (optional) +- Appendix 7: Marketing Rights (optional) +- Appendix 8: Intentionally left blank (optional) +- Appendix 9: Support Terms +- Appendix 10: Conversion from legacy Licenses to Subscription (optional) + + +APPENDIX 1: LICENSED SOFTWARE + +The modules and/or tools that are included in the latest publicly available +version of the respective product at the effective date of this Agreement- Qt +for Application Development Professional (ADP), Qt for Application Development +Enterprise (ADE), Qt for Device Creation Professional (DCP), Qt for Device +Creation Enterprise (DCE), - are marked with "X" in the below table. The +modules and tools are specific to each product version respectively and may +vary from version to version. Modules and tools included in the latest publicly +available version of the respective product at any given time are listed in +Appendix 1 of the latest version of this Agreement available at +www.qt.io/terms-conditions/. If a new version of Licensed Software does not +include a module or tool present in an older version which Licensee is entitled +to use under a valid license from The Qt Company, then Licensee will continue +to have such right during the Term of this Agreement. In the event a new +version of the Licensed Software adds modules or tools to any previous +version(s), Licensee's rights will extend to cover also such additional modules +and tools. + +Parts of the product that are permitted for distribution in object-code form +only ("Redistributables") are marked with "R" in the below table. + ++----------------------------------------------------------+ +| Modules / Tools | ADP | ADE | DCP | DCE | ++----------------------------------------------------------+ +| Active Qt | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt 3D | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt 5 Core Compatibility APIs | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Android Extras | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Bluetooth | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Canvas 3D | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Charts | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Concurrent | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Core | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Data Visualization | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt D-Bus | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt for Python | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt for WebAssembly | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Gamepad | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Graphical Effects | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt GUI | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Help | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Image Formats | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Location | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Lottie Animation | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Mac Extras | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Multimedia | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Multimedia Widgets | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Network | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Network Authorization | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt NFC | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt OpenGL | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt PDF | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Platform Headers | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Positioning | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Print Support | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Purchasing | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt QML | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Quick | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Quick 3D | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Quick Controls 1 | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Quick Controls | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Quick Dialogs | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Quick Extras | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Quick Layouts | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Quick Test | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Quick Timeline | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Quick WebGL | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Quick Widgets | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Remote Objects | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Script | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Script Tools | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt SCXML | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Sensors | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Serial Bus | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Serial Port | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Shader Tools | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Speech | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt State Machine | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt SQL | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt SVG | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Test | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt UI Tools | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Virtual Keyboard | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Wayland Compositor | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt WebChannel | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt WebEngine | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt WebSockets | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt WebView | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Widgets | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Windows Extras | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt X11 Extras | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt XML | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt XML Patterns | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Designer (Qt Widget Designer) | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Linguist | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt Assistant | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| lupdate | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| lrelease | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| lconvert | X,R | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt MQTT | | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt KNX | | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt OPC UA | | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Qt CoAP | | X,R | X,R | X,R | ++----------------------------------------------------------+ +| Boot 2 Qt stacks | | | X,R | X,R | ++----------------------------------------------------------+ +| Qt OTA | | | X,R | X,R | ++----------------------------------------------------------+ +| Device Utilities | | | X,R | X,R | ++----------------------------------------------------------+ +| Qt Debugging Bridge (QBD) Daemon | | | X,R | X,R | ++----------------------------------------------------------+ +| Qt Quick Ultralite Controls | | | X,R | X,R | ++----------------------------------------------------------+ +| Qt Quick Ultralite | | | X,R | X,R | ++----------------------------------------------------------+ +| Qt Safe Renderer (QSR) | | | | X,R | ++----------------------------------------------------------+ +| Qt Application Manager | | | | X,R | ++----------------------------------------------------------+ +| Qt Interface Framework | | | | X,R | ++----------------------------------------------------------+ +| Neptune Reference UI | | | | X,R | ++----------------------------------------------------------+ +| Qt for Android Automotive (QAA) | | | | X,R | ++----------------------------------------------------------+ +| Qt Creator | X | X | X | X | ++----------------------------------------------------------+ +| Qt Design Studio Professional | X | X | X | X | ++----------------------------------------------------------+ +| androiddeployqt | X | X | X | X | ++----------------------------------------------------------+ +| androidtestrunner | X | X | X | X | ++----------------------------------------------------------+ +| canbusutil | X | X | X | X | ++----------------------------------------------------------+ +| dumpcpp | X | X | X | X | ++----------------------------------------------------------+ +| dumpdoc | X | X | X | X | ++----------------------------------------------------------+ +| fixqt4headers.pl | X | X | X | X | ++----------------------------------------------------------+ +| idc | X | X | X | X | ++----------------------------------------------------------+ +| moc | X | X | X | X | ++----------------------------------------------------------+ +| pixeltool | X | X | X | X | ++----------------------------------------------------------+ +| qdbus | X | X | X | X | ++----------------------------------------------------------+ +| qdbuscpp2xml | X | X | X | X | ++----------------------------------------------------------+ +| qdbusviwer | X | X | X | X | ++----------------------------------------------------------+ +| qdbusxml2cpp | X | X | X | X | ++----------------------------------------------------------+ +| qdistancefieldgenerator | X | X | X | X | ++----------------------------------------------------------+ +| qdoc | X | X | X | X | ++----------------------------------------------------------+ +| qhelpgenerator | X | X | X | X | ++----------------------------------------------------------+ +| qlalr | X | X | X | X | ++----------------------------------------------------------+ +| qmake | X | X | X | X | ++----------------------------------------------------------+ +| qml | X | X | X | X | ++----------------------------------------------------------+ +| qmlcachegen | X | X | X | X | ++----------------------------------------------------------+ +| qmldom | X | X | X | X | ++----------------------------------------------------------+ +| qmleasing | X | X | X | X | ++----------------------------------------------------------+ +| qmlformat | X | X | X | X | ++----------------------------------------------------------+ +| qmllint | X | X | X | X | ++----------------------------------------------------------+ +| qmlpreview | X | X | X | X | ++----------------------------------------------------------+ +| qmlprofiler | X | X | X | X | ++----------------------------------------------------------+ +| qmlscene | X | X | X | X | ++----------------------------------------------------------+ +| qmltestrunner | X | X | X | X | ++----------------------------------------------------------+ +| qmltime | X | X | X | X | ++----------------------------------------------------------+ +| qmlviewer | X | X | X | X | ++----------------------------------------------------------+ +| qtdiag | X | X | X | X | ++----------------------------------------------------------+ +| qtpaths | X | X | X | X | ++----------------------------------------------------------+ +| qtplugininfo | X | X | X | X | ++----------------------------------------------------------+ +| qvkgen | X | X | X | X | ++----------------------------------------------------------+ +| rcc | X | X | X | X | ++----------------------------------------------------------+ +| tracegen | X | X | X | X | ++----------------------------------------------------------+ +| uic | X | X | X | X | ++----------------------------------------------------------+ +| windeployqt | X | X | X | X | ++----------------------------------------------------------+ +| Target toolchains | | | X | X | ++----------------------------------------------------------+ +| Qt Debugging Bridge Host Tools | | | X | X | ++----------------------------------------------------------+ +| qtconfig-gui | | | X | X | ++----------------------------------------------------------+ +| Qt Emulator | | | X | X | ++----------------------------------------------------------+ +| Qt Creator VxWorks plugin | | | X | X | ++----------------------------------------------------------+ +| Qt Creator plugin for Qt | | | | X | +| Application Manager | | | | | ++----------------------------------------------------------+ +| qmlinterfacegenerator | | | | X | ++----------------------------------------------------------+ +| qmltocpp | | | | X | ++----------------------------------------------------------+ +| qulfontcompiler | | | | X | ++----------------------------------------------------------+ +| Qt Deployment Server | | | | X | ++----------------------------------------------------------+ + + +Rights for Application and Device use cases + +Following table summarizes the rights afforded by different products of the +Licensed Software to create and distribute Applications and Devices as defined +in this Agreement (X marks for rights): + ++---------------------------------------------------------------+ +| | Applications | Devices | ++---------------------------------------------------------------+ +| ADP | X | | ++---------------------------------------------------------------+ +| ADE | X | | ++---------------------------------------------------------------+ +| DCP | X | X | ++---------------------------------------------------------------+ +| DCE | X | X | ++---------------------------------------------------------------+ + +Licensed Software: Designer tools and modules + +The modules and/or tools that are included in the respective product - Qt for +Design Studio Professional (DSP), Qt for Design Studio Enterprise (DSE) - are +marked with "X" in the below table. + +Designer tools provides no Redistributables. + ++---------------------------------------------+ +| | DSP | DSE | ++---------------------------------------------+ +| Qt Design Studio | X | X | ++---------------------------------------------+ +| Qt Design Bridges | | X | ++---------------------------------------------+ +| QML Live on host | X | X | ++---------------------------------------------+ +| QML Live on target | | X | ++---------------------------------------------+ +| Variant Management | | X | ++---------------------------------------------+ +| Shader creation tools | | X | ++---------------------------------------------+ +| Profiling tools | | X | ++---------------------------------------------+ +| Simulink support | | X | ++---------------------------------------------+ + + +Both DSP and DSE can be used to create an user interface for use cases covered +by ADP, ADE, DCP and DCE. + +Licensed Software: QA Tools + +The modules and/or tools that are included in the respective QA Tools product +- Squish (both Tester and execution Licenses), Coco or Test Center - are marked +with "X" in the below table. Optional features that will need additional +licenses are marked with "O". QA Tools include no Redistributables. + ++---------------------------------------------------------------------+ +| | Squish | Coco | Test Center | ++---------------------------------------------------------------------+ +| Squish IDE | X | | | ++---------------------------------------------------------------------+ +| QA Tool-specific command line tools | X | X | X | ++---------------------------------------------------------------------+ +| Coverage Browser | | X | | ++---------------------------------------------------------------------+ +| HTML interface | | | X | ++---------------------------------------------------------------------+ +| Qt Support Module | X | | | ++---------------------------------------------------------------------+ +| Java support module | X | | | ++---------------------------------------------------------------------+ +| Windows support module | X | | | ++---------------------------------------------------------------------+ +| iOS support module | X | | | ++---------------------------------------------------------------------+ +| Android support module | X | | | ++---------------------------------------------------------------------+ +| Web support module | X | | | ++---------------------------------------------------------------------+ +| macOS support module | X | | | ++---------------------------------------------------------------------+ +| VNC support module | X | | | ++---------------------------------------------------------------------+ +| MCU support module | X | | | ++---------------------------------------------------------------------+ +| C and C++ language module | | X | | ++---------------------------------------------------------------------+ +| C# language module | | X | | ++---------------------------------------------------------------------+ +| QML language module | | X | | ++---------------------------------------------------------------------+ +| Tester Cross-Compilation Add-On | O | O | | ++---------------------------------------------------------------------+ + +License capabilities for Squish + +License capabilities that are included in the Squish Tester and Execution +Licenses are marked with "X" in the below table. + ++-----------------------------------------------------------------------------+ +| | Squish Tester License | Squish Execution License | ++-----------------------------------------------------------------------------+ +| Ability to create, edit, | X | | +| and debug test cas | | | ++-----------------------------------------------------------------------------+ +| Ability to execute test | X | X | +| cases | | | ++-----------------------------------------------------------------------------+ + +Install and use capabilities for QA Tools + +Install and use capabilities that are included in the respective QA Tools +products are defined in the below table. + ++-----------------------------------------------------------------------------+ +| | Squish | Squish | Coco | Test | +| | Tester | Execution | License | Center | +| | License | License | | License | ++-----------------------------------------------------------------------------+ +| Number of installation | Unlimited | Unlimited | Unlimited | One(1) | +| instances per license | | | | | ++-----------------------------------------------------------------------------+ +| Number of concurrent | Limited by| Limited by | Limited by | Limited by | +| users | number of | number of | number of | number of | +| | Squish | Squish | Coco | Test Center | +| | Tester | Execution | Tester | Licenses | +| | Licenses | Licenses | Licenses | | ++-----------------------------------------------------------------------------+ + + +APPENDIX 2: PRICING + +Separate template + +APPENDIX 3: ADD-ON PRODUCTS TO LICENSED SOFTWARE + +Intentionally left blank. + +APPENDIX 4: SMALL BUSINESS AND STARTUP + +The provisions of this Appendix 4 are applicable for companies with an annual +revenue, including funding, equivalent to maximum of 250,000 USD (in applicable +currency) during the latest full calendar year, as evidenced by duly audited +records of the Licensee and approved by The Qt Company ("Start-up Company"). + +Start-up Companies are qualified for a discounted License Fee for maximum of +four (4) Development Licenses ("Start-up Development License") unless otherwise +agreed between the parties. + +Start-up Development License entitles the respective Designated User for +Support only for Install Support as defined in Appendix 9, Support Terms. + +Upon expiry of the respective Development License Term, the Start-up +Development Licenses shall be automatically extended, pursuant to Section 3.1 +of the Agreement, for a Renewal Term either as new Start-up Development +Licenses (if the Licensee still qualifies as a Start-up Company), or as normal +then standard list price Development Licenses (if the Licensee no longer +qualifies as a Start-up Company). + +APPENDIX 5: NON-COMMERCIAL AND EDUCATIONAL USE + +The provisions of this Appendix 5 are applicable for non-commercial use of the +Licensed Software by the Licensee. + +For the purpose of this Appendix 5, the following additional definitions +(replacing the relevant definition of the Agreement, where applicable) shall be +applicable: + +"Demo Units" shall mean (i) hardware development platform, which incorporates +the Licensed Software along with Licensee's software and/or hardware, and (ii) +prototype versions of Applications or Devices. + +"Designated User(s)" shall mean the employees and students of the Licensee. + +"Licensee Products" shall mean Applications and/or Devices. + +"Permitted Purpose" shall mean (i) Licensee's internal evaluation and testing +of Licensed Software, (ii) building Demo Units as well as (iii) educational +use. + +"Agreement Term" shall mean a period of twelve (12) months or any such other +period as may be agreed between the Parties. + +For the purpose of this Appendix 5, the following changes shall be agreed with +respect to relevant Sections of the Agreement: + I. Recital (A) shall be replaced in its entirety to read as follows: + "(A) Licensee wishes to use the Licensed Software for the Permitted + Purpose." + II. Section 3.1 shall be replaced in its entirety to read as follows: + "The Qt Company grants to Licensee a personal, non-exclusive, + non-transferable, revocable, royalty-free license, valid for the + Agreement Term, to use, modify and copy the Licensed Software solely + for the Permitted Purpose. Licensee may install copies of the Licensed + Software on five (5) computers per Designated User, provided that only + the Designated Users who have a valid Development License may use the + Licensed Software. Licensee may demonstrate the Demo Units, provided + that such demonstrations must be conducted by Licensee, and the Demo + Units must remain in Licensee's possession and under Licensee's control + at all times. + For clarity, this Agreement does not (i) entitle Licensee to use + Licensed Software to create Applications or Devices (other than + prototypes thereof) or (ii) carry any distribution rights to Licensee, + but such rights are subject to and conditional upon conclusion of a + separate license agreement with The Qt Company." + III. Sections 3.2, 3.3, 3.5, 3.6, 8 and 10 shall be deleted. + IV. Section 3.4 shall be replaced in its entirety to read as follows: + "Licensee shall not: + - remove or alter any copyright, trademark or other proprietary rights + notice contained in any portion of the Licensed Software; + - transfer, publish, sublicense, disclose, display or otherwise make + the Licensed Software available to any third party (except that + Licensee may demonstrate the Demo Units pursuant to Section 3.1); + - in any way combine, incorporate or integrate Licensed Software with, + or use Licensed Software for creation of, any software created with + or incorporating Open Source Qt; Licensee shall cause all Designated + Users who make use of the licenses granted under this Agreement, to + be contractually bound to comply with the relevant terms of this + Agreement and not to use the Licensed Software beyond the terms + hereof. Licensee shall be responsible for any and all actions and + omissions of its Designated Users relating to the Licensed Software + and use thereof. Any use of Licensed Software beyond the provisions + of this Agreement is strictly prohibited and requires an additional + license from The Qt Company." + V. Section 12 shall be replaced in its entirety to read as follows: + "This Agreement shall enter into force upon due acceptance by both + Parties and remain in force for the Agreement Term, unless and until + terminated pursuant to the terms of Section 12. + Upon termination of the Agreement, Licensee shall cease using the + Licensed Software. All other copies of Licensed Software in the + possession or control of Licensee must be erased or destroyed. An + officer of Licensee must, upon request, promptly deliver to The Qt + Company a written confirmation that this has occurred." + +Except for the modifications specified above, this Appendix carries no change +to the terms of the Agreement which shall remain in full force. + +APPENDIX 6: LICENSE REPORTING + +Separate template + +APPENDIX 7: MARKETING RIGHTS + +This Appendix 7 has the purpose to grant visibility through The Qt Company +marketing channels of the usage of Qt and related product and service in +Licensee product. Following related marketing right are agreed between the Qt +Company and the Licensee. + +1. LICENSEE NAME AND LICENSEE LOGO + +The Qt Company has the right to use Licensee name and Licensee logo in public +channel, in respect of the value proposition that the Qt company provided to +the Licensee. + +2. MARKETING CONTENT COOPERATION + +2.1. LICENSEE CASES + +The Licensee is open to collaborate on content creation for marketing and +communication purpose. The Licensee will nominate one responsible that will be +in charge to support The Qt company with this content creation, according to +content format paragraph, answering technical questions or sharing professional +picture or video of required content. The Qt Company will have the right to +advertise this in Content Format and Channel as mentioned in paragraph 3 and 4. + +2.2. FINAL PRODUCT REFERRAL + +Licensee agree that The Qt Company could connect their software product and +services with the Licensee device or application, that the Licensee has created +using The Qt Company technology and competence. Licensee will provide high +quality picture, and video of the created final product where the Qt technology +is running into. The Qt Company will have the right to advertise this in +Content Format and Channel as mentioned in paragraph 3 and 4. + +3. CONTENT FORMAT + +- Video +- Written Licensee case +- Press release +- Social media posts +- Emails +- Event booth Graphics +- Printed material + +4. CHANNELS + +- Social media +- The Qt Company resource center and website +- Email to the Qt company contact database +- Events +- Online webinars +- Public speech +- Public presentations + +APPENDIX 8: INTENTIONALLY LEFT BLANK + +APPENDIX 9: SUPPORT TERMS + +These Qt support terms and conditions ("Support Terms") set forth the legal +framework, where under The Qt Company ("The Qt Company") provides support +services (as herein defined) to the Licensee. + +1 DEFINITIONS + +"Application Code" shall mean a computer software program written strictly +using the Qt programming language, by or for the Licensee, with a user +interface, enabling the Licensee or their users to accomplish a specific task +and display any results of the task on the display monitor or screen. + +"Dedicated Contact" shall mean the employee of The Qt Company who will be the +first point of contact for all Designated Users' requests for Support. + +"Errors" shall mean an error, flaw, mistake, failure, or fault in Licensed +Software that prevents it from behaving as described in the relevant +documentation or as agreed between the Parties. + +"Extended Support" shall mean a continuation to the normal Support period, +which allows Designated Users to receive selected Support (Standard Support or +Premium Support) for a version of Licensed Software that is no longer generally +supported by The Qt Company. + +"Install Support" shall mean Support that is limited to installation related +Error(s) on Development Platforms specified as supported host platforms for +each Qt release under doc.qt.io. + +"Maintenance Release" shall mean a release or version of Licensed Software +containing bug fixes, error corrections and other changes targeted to +maintaining and improving product stability and quality. Maintenance Releases +are generally depicted as a change to the third digit of Licensed Software +version number. + +"Platforms" shall mean both Development Platforms and Deployment Platforms. +Supported host and target Platforms may vary from for each Qt release as +defined under doc.qt.io. + +"Premium Support" shall mean an upgraded level of Support that The Qt Company +provides pursuant to these Support Terms to Licensee if Licensee has purchased +Premium Support instead of Standard Support. Premium Support shall always be +purchased for all Designated User(s) in the respective development team of the +Licensee. + +"Response Time" shall mean the period of time from when Licensee notifies +TheQt Company about an Error or requests Support until The Qt Company provides +Licensee with a response that addresses (but not necessarily resolves) the +reported Error or provides the requested Support. + +"Standard Support" shall mean standard level of Support that The Qt Company +provides pursuant to these Support Terms to Licensee. + +"Support" shall mean developer assistance that is provided by The Qt Company +to assist eligible Designated Users in Licensed Software installation, usage +and functionality problem resolution for Error(s) and Error workarounds +pursuant to the terms of these Support Terms. Support for different products is +available as specified in the below table ("X" marking the Support that is +included in the license price, optional Add-on Support services are marked as +"O"): + ++-----------------------------------------------------------------------+ +| |ADP|ADE|DCP|DCE|DSP|DSE|Squish|Coco|Test Center| ++-----------------------------------------------------------------------+ +| Install Support | X | X | X | X | X | X | X | X | X | ++-----------------------------------------------------------------------+ +| Standard Support | | X | X | X | X | X | X | X | X | ++-----------------------------------------------------------------------+ +| Premium Support | | O | O | O | O | O | O | O | O | ++-----------------------------------------------------------------------+ +| Extended Support | | O | O | O | O | O | | | | ++-----------------------------------------------------------------------+ +| Tool Qualification Kit| | | | | | | O | O | | ++-----------------------------------------------------------------------+ + +"Support Validity Term" shall mean the Development License Term or any other +fixed time period agreed between the Parties during which time the Customer is +eligible to receive Support from The Qt Company. + +"Tool Qualification Kit" shall mean a customized set of documents and +validation test cases. + +2 SUPPORT SERVICES + +2.1 Support Services Provided by The Qt Company + +Subject to these Support Terms and during the Support Validity Term, The Qt +Company will via its web-based support user-interface, provide Designated +User(s) with Support for the Platforms which Customer has licensed under the +Agreement. +The Qt Company will make commercially reasonable efforts to solve any Errors +reported by Designated User(s). Resolution of an Error may be provided through +Designated User(s) themselves downloading of a later released version of the +applicable Licensed Software product(s) or providing the Designated User with a +temporary workaround addressing such Error. + +2.2 Licensee's Obligations + +To report an Error, the Designated User shall register the Error on The Qt +Company's web-based support user interface located at: +https://account.qt.io/login or at another location designated by The Qt Company. + +The Designated User must provide adequate information and documentation to The +Qt Company to enable it to recreate the Error or problem for which the +Designated User has sought assistance. +To ensure efficient handling of Errors, the Designated User must provide the +following information, where relevant: +- A clear, detailed description of the problem, question or suggestion; +- Identification of which Licensed Software product and version is affected; +- Identification of the operating environment (e.g. operating system, hardware + Platform, build tools, etc.) on which the problem exists; +- On Standard Support: A complete and compilable test case of not more than 500 + lines of code that demonstrates the problem; +- On Premium Support: A complete and compilable test case that demonstrates the + problem or access to Application Code source codes. + +Additional relevant content, such as screenshots, etc. +Additional content should be included as attachments. The preferred image +formats are JPEG and PNG. Compressed content should be included in zip or +tar.gz archives. Executable content and documents in platform specific formats +such as Microsoft Office' are not accepted. + +In order for The Qt Company to provide prompt handling of Errors, the +Designated User shall promptly respond to any requests from The Qt Company for +additional information. + +2.3 Support Limitations + +General limitations: + +Each version or release of the Licensed Software will be Supported under +Standard Support or Premium Support only for limited time period as set forth +in doc.qt.io. For example, regular releases of Qt Software are supported for +one (1) year from the release date of the version x.y.0 and Long Term Support +(LTS) Releases are supported for a period of three (3) years from the release +date of the LTS version x.y.0. + +The Qt Company shall only provide Support for Designated User(s). + +Support is made available for the entire development teams only: It is not +allowed to purchase Support only for some members of the development team, and +all Designated Users of the respective development team must be eligible for +the same level of Support. + +Support is not provided for snapshots, preview releases, beta releases or +release candidates. + +The Qt Company shall have no obligation to provide Support for hardware or +operating system specific problems or problems arising from improper use, +accident, neglect or modification of Qt. + +Limitations with Install Support: + +Support limited to Error(s) regarding installation and setting up of the Qt +development environment on host Platforms. + +Limitations with Standard Support: + +The Qt Company shall not provide Support for third-party software or problems +caused by third-party software even if such third-party software is distributed +together with Licensed Software product(s). + +The Qt Company shall only provide Support for Error(s) that are reported on and +can be reproduced on Platforms that are officially supported for the release of +the Licensed Software. + +Limitations with Premium support: + +The Qt Company shall not provide Support for third-party software or problems +caused by third-party software. However, if such third-party software is +distributed together with Licensed Software, The Qt Company will make +commercially reasonable efforts to solve such problems. + +The Qt Company shall only provide Support for Error(s) that can be reproduced +on Platforms that are officially supported for the release of the Licensed +Software. If the Error is on a Platform that is not supported, The Qt Company +will make commercially reasonable efforts to provide a solution on closest +corresponding supported Platform. + +Premium Support is optional and purchased for an agreed bucket of hours +("Bucket"). Hours can be used by any Designated User in the respective +development team. To encourage continuous usage of the Support, ten percent +(10%) of the purchased Bucket shall automatically expire (regardless of whether +such support hours are actually used or not by the Licensee) each month after +three (3) months from the purchase of the Premium Support. + +2.4 Extended Support + +Extended Support extends the Support Validity Term for a release of Licensed +Software that is no longer generally supported. + +Extended Support includes and is by default provided with Standard Support +rules and limitations, unless Extended Support is purchased with Premium +Support in which case Premium Support rules and limitations will apply. + +Extended Support is optional and purchased with annual fee and separately per +each Licensee product. Extended Support will need definition of (i) Licensee +product, (ii) used Platform(s) and (iii) Licensed Software version(s). + +2.5 Tool Qualification Kit + +The Qt Company shall provide set of customized documents and validation tests +that enable Licensee to qualify QA testing tool for the purpose of ISO 26262, +EN 50128, DO-330, IEC 61508, IEC 62304 or IEC 13485 certification Licensee end +to end solution. + +3 RESPONSE TIME + +In performing Support, The Qt Company shall commit to following, non-binding, +Response Times: + +Standard Support: Errors and Support requests will have a Response Time not to +exceed two (2) business days. + +Premium Support: Errors and Support requests will have a Response Time not to +exceed one (1) business day. + +For complex issues, The Qt Company may provide an initial response to the +Designated User and then follow up, without undue delay, with additional +communication before an Error is properly addressed or Support provided. + +4 ADDITIONAL SERVICES IN PREMIUM SUPPORT + +The Designated User(s) will be assigned a Dedicated Contact to handle requests +for Support. Dedicated Contact is subject to change in cases such as sick +leave, vacation and other similar reasons. + +The Designated User(s) can on request ask The Qt Company to access their +computer remotely in order to resolve problems directly. + +The Designated User(s) can request a session via Instant Messaging or phone +call in the support request to The Qt Company. + +Premium Support can assist Licensee in implementing new features, bug fixes +and accessing patches in Licensed Software or Application Code. + +All Support requests will be handled with high priority. + +5 MAINTENANCE RELEASES, UPDATES AND UPGRADES + +Under the Support the Customer is eligible for Maintenance Releases and Updates +that The Qt Company generally makes available to customers who has purchased +Support. Unless otherwise decided by The Company at its free and absolute +discretion, Upgrades will not be provided under the Support. + +The primary focus of Maintenance Releases is product quality. Therefore, each +Maintenance Release typically includes the following types of changes to the +previous version of Licensed Software: +- Bug fixes caused by changes to previously working code; +- Fixes related to build issues on supported Platforms; +- Error corrections specific to a single Platform that are not present on other + Platforms; +- Critical Error corrections such as crashes, data corruption, loss of data, + race conditions; and +- Updates to documentation and license information when deemed necessary by + The Qt Company. + +The primary focus of Updates is introducing new features to Licensed Software +and covering new platforms. Therefore, each Updates typically includes the +following types of changes to the previous version of Licensed Software: +- New platform support; +- New toolchain support; +- New features and Qt modules; + +6 WARRANTY DISCLAIMER + +The Qt Company makes no warranties that the Support provided will be successful +in resolving any difficulties or problems or in diagnosing faults reported by +Licensee. Support is provided to Licensee on an "as is" basis. To the maximum +extent permitted by applicable law, The Qt Company disclaims all warranties and +conditions, either express or implied, including, but not limited to, implied +warranties of merchantability and fitness for a particular purpose for the +Support provided by The Qt Company to Licensee. + +APPENDIX 10: CONVERSION TO SUBSCRIPTION + +Subject to the terms of this Appendix Licensee's current development licenses +("Current Licenses") for commercial version of Qt Software and the license +agreements governing such Current Licenses ("Existing Agreements") are being +replaced by this Agreement and subscription based Development Licenses +governed hereunder, as further specified below. + ++---------------------------------------------------------------------------+ +| Existing Agreement(s) | and | +| signing parties, version | | +| thereof | | ++---------------------------------------------------------------------------+ + +Parties hereby agree on conversion of Current Licenses listed in attached +Exhibit A to the subscription licenses listed in attached Exhibit B for use +through License Term. As of the date hereof, + +i. Licensee's Current Licenses as listed in Exhibit A shall terminate and be +replaced with the Subscription licenses listed in Exhibit B and; +ii. Existing Agreements are terminated. + +Prices for the conversion of Current Licenses are defined in Appendix 2 +Pricing or Quote. + +Notwithstanding anything in this Appendix to the contrary, and in addition to +any payments due pursuant to this Appendix, Licensee remains fully obligated to +fulfill any and all outstanding payment obligations to The Qt Company under any +applicable Existing Agreements. For the avoidance of doubt, if any payments +remain outstanding on the Current Licenses under the applicable terms Licensee +will continue to make such payments in accordance with the applicable order +documentation, notwithstanding the fact that the Current Licenses are being +converted to Development Licenses pursuant to this Appendix. diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..a5343bf --- /dev/null +++ b/.gitmodules @@ -0,0 +1,4 @@ +[submodule "src/3rdparty/mapbox-gl-native"] + path = src/3rdparty/mapbox-gl-native + url = ../qtlocation-mapboxgl.git + branch = upstream/qt-staging diff --git a/.qmake.conf b/.qmake.conf new file mode 100644 index 0000000..739075a --- /dev/null +++ b/.qmake.conf @@ -0,0 +1,11 @@ +load(qt_build_config) +CONFIG += warning_clean + +DEFINES += QT_NO_JAVA_STYLE_ITERATORS QT_NO_LINKED_LIST + +MODULE_VERSION = 5.15.8 + +# Adds a way to debug location. The define is needed for multiple subprojects as they +# include the essential headers. +# Alternatively, the define can be passed directly to qmake +# DEFINES+=QT_LOCATION_DEBUG diff --git a/.tag b/.tag new file mode 100644 index 0000000..c87c2e3 --- /dev/null +++ b/.tag @@ -0,0 +1 @@ +98a5c511ea753edc9a28a5610d6e2234df049293 diff --git a/LICENSE.FDL b/LICENSE.FDL new file mode 100644 index 0000000..938bb8d --- /dev/null +++ b/LICENSE.FDL @@ -0,0 +1,450 @@ + GNU Free Documentation License + Version 1.3, 3 November 2008 + + + Copyright (C) 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc. + + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +0. PREAMBLE + +The purpose of this License is to make a manual, textbook, or other +functional and useful document "free" in the sense of freedom: to +assure everyone the effective freedom to copy and redistribute it, +with or without modifying it, either commercially or noncommercially. +Secondarily, this License preserves for the author and publisher a way +to get credit for their work, while not being considered responsible +for modifications made by others. + +This License is a kind of "copyleft", which means that derivative +works of the document must themselves be free in the same sense. It +complements the GNU General Public License, which is a copyleft +license designed for free software. + +We have designed this License in order to use it for manuals for free +software, because free software needs free documentation: a free +program should come with manuals providing the same freedoms that the +software does. But this License is not limited to software manuals; +it can be used for any textual work, regardless of subject matter or +whether it is published as a printed book. We recommend this License +principally for works whose purpose is instruction or reference. + + +1. APPLICABILITY AND DEFINITIONS + +This License applies to any manual or other work, in any medium, that +contains a notice placed by the copyright holder saying it can be +distributed under the terms of this License. Such a notice grants a +world-wide, royalty-free license, unlimited in duration, to use that +work under the conditions stated herein. The "Document", below, +refers to any such manual or work. Any member of the public is a +licensee, and is addressed as "you". You accept the license if you +copy, modify or distribute the work in a way requiring permission +under copyright law. + +A "Modified Version" of the Document means any work containing the +Document or a portion of it, either copied verbatim, or with +modifications and/or translated into another language. + +A "Secondary Section" is a named appendix or a front-matter section of +the Document that deals exclusively with the relationship of the +publishers or authors of the Document to the Document's overall +subject (or to related matters) and contains nothing that could fall +directly within that overall subject. (Thus, if the Document is in +part a textbook of mathematics, a Secondary Section may not explain +any mathematics.) The relationship could be a matter of historical +connection with the subject or with related matters, or of legal, +commercial, philosophical, ethical or political position regarding +them. + +The "Invariant Sections" are certain Secondary Sections whose titles +are designated, as being those of Invariant Sections, in the notice +that says that the Document is released under this License. If a +section does not fit the above definition of Secondary then it is not +allowed to be designated as Invariant. The Document may contain zero +Invariant Sections. If the Document does not identify any Invariant +Sections then there are none. + +The "Cover Texts" are certain short passages of text that are listed, +as Front-Cover Texts or Back-Cover Texts, in the notice that says that +the Document is released under this License. A Front-Cover Text may +be at most 5 words, and a Back-Cover Text may be at most 25 words. + +A "Transparent" copy of the Document means a machine-readable copy, +represented in a format whose specification is available to the +general public, that is suitable for revising the document +straightforwardly with generic text editors or (for images composed of +pixels) generic paint programs or (for drawings) some widely available +drawing editor, and that is suitable for input to text formatters or +for automatic translation to a variety of formats suitable for input +to text formatters. A copy made in an otherwise Transparent file +format whose markup, or absence of markup, has been arranged to thwart +or discourage subsequent modification by readers is not Transparent. +An image format is not Transparent if used for any substantial amount +of text. A copy that is not "Transparent" is called "Opaque". + +Examples of suitable formats for Transparent copies include plain +ASCII without markup, Texinfo input format, LaTeX input format, SGML +or XML using a publicly available DTD, and standard-conforming simple +HTML, PostScript or PDF designed for human modification. Examples of +transparent image formats include PNG, XCF and JPG. Opaque formats +include proprietary formats that can be read and edited only by +proprietary word processors, SGML or XML for which the DTD and/or +processing tools are not generally available, and the +machine-generated HTML, PostScript or PDF produced by some word +processors for output purposes only. + +The "Title Page" means, for a printed book, the title page itself, +plus such following pages as are needed to hold, legibly, the material +this License requires to appear in the title page. For works in +formats which do not have any title page as such, "Title Page" means +the text near the most prominent appearance of the work's title, +preceding the beginning of the body of the text. + +The "publisher" means any person or entity that distributes copies of +the Document to the public. + +A section "Entitled XYZ" means a named subunit of the Document whose +title either is precisely XYZ or contains XYZ in parentheses following +text that translates XYZ in another language. (Here XYZ stands for a +specific section name mentioned below, such as "Acknowledgements", +"Dedications", "Endorsements", or "History".) To "Preserve the Title" +of such a section when you modify the Document means that it remains a +section "Entitled XYZ" according to this definition. + +The Document may include Warranty Disclaimers next to the notice which +states that this License applies to the Document. These Warranty +Disclaimers are considered to be included by reference in this +License, but only as regards disclaiming warranties: any other +implication that these Warranty Disclaimers may have is void and has +no effect on the meaning of this License. + +2. VERBATIM COPYING + +You may copy and distribute the Document in any medium, either +commercially or noncommercially, provided that this License, the +copyright notices, and the license notice saying this License applies +to the Document are reproduced in all copies, and that you add no +other conditions whatsoever to those of this License. You may not use +technical measures to obstruct or control the reading or further +copying of the copies you make or distribute. However, you may accept +compensation in exchange for copies. If you distribute a large enough +number of copies you must also follow the conditions in section 3. + +You may also lend copies, under the same conditions stated above, and +you may publicly display copies. + + +3. COPYING IN QUANTITY + +If you publish printed copies (or copies in media that commonly have +printed covers) of the Document, numbering more than 100, and the +Document's license notice requires Cover Texts, you must enclose the +copies in covers that carry, clearly and legibly, all these Cover +Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on +the back cover. Both covers must also clearly and legibly identify +you as the publisher of these copies. The front cover must present +the full title with all words of the title equally prominent and +visible. You may add other material on the covers in addition. +Copying with changes limited to the covers, as long as they preserve +the title of the Document and satisfy these conditions, can be treated +as verbatim copying in other respects. + +If the required texts for either cover are too voluminous to fit +legibly, you should put the first ones listed (as many as fit +reasonably) on the actual cover, and continue the rest onto adjacent +pages. + +If you publish or distribute Opaque copies of the Document numbering +more than 100, you must either include a machine-readable Transparent +copy along with each Opaque copy, or state in or with each Opaque copy +a computer-network location from which the general network-using +public has access to download using public-standard network protocols +a complete Transparent copy of the Document, free of added material. +If you use the latter option, you must take reasonably prudent steps, +when you begin distribution of Opaque copies in quantity, to ensure +that this Transparent copy will remain thus accessible at the stated +location until at least one year after the last time you distribute an +Opaque copy (directly or through your agents or retailers) of that +edition to the public. + +It is requested, but not required, that you contact the authors of the +Document well before redistributing any large number of copies, to +give them a chance to provide you with an updated version of the +Document. + + +4. MODIFICATIONS + +You may copy and distribute a Modified Version of the Document under +the conditions of sections 2 and 3 above, provided that you release +the Modified Version under precisely this License, with the Modified +Version filling the role of the Document, thus licensing distribution +and modification of the Modified Version to whoever possesses a copy +of it. In addition, you must do these things in the Modified Version: + +A. Use in the Title Page (and on the covers, if any) a title distinct + from that of the Document, and from those of previous versions + (which should, if there were any, be listed in the History section + of the Document). You may use the same title as a previous version + if the original publisher of that version gives permission. +B. List on the Title Page, as authors, one or more persons or entities + responsible for authorship of the modifications in the Modified + Version, together with at least five of the principal authors of the + Document (all of its principal authors, if it has fewer than five), + unless they release you from this requirement. +C. State on the Title page the name of the publisher of the + Modified Version, as the publisher. +D. Preserve all the copyright notices of the Document. +E. Add an appropriate copyright notice for your modifications + adjacent to the other copyright notices. +F. Include, immediately after the copyright notices, a license notice + giving the public permission to use the Modified Version under the + terms of this License, in the form shown in the Addendum below. +G. Preserve in that license notice the full lists of Invariant Sections + and required Cover Texts given in the Document's license notice. +H. Include an unaltered copy of this License. +I. Preserve the section Entitled "History", Preserve its Title, and add + to it an item stating at least the title, year, new authors, and + publisher of the Modified Version as given on the Title Page. If + there is no section Entitled "History" in the Document, create one + stating the title, year, authors, and publisher of the Document as + given on its Title Page, then add an item describing the Modified + Version as stated in the previous sentence. +J. Preserve the network location, if any, given in the Document for + public access to a Transparent copy of the Document, and likewise + the network locations given in the Document for previous versions + it was based on. These may be placed in the "History" section. + You may omit a network location for a work that was published at + least four years before the Document itself, or if the original + publisher of the version it refers to gives permission. +K. For any section Entitled "Acknowledgements" or "Dedications", + Preserve the Title of the section, and preserve in the section all + the substance and tone of each of the contributor acknowledgements + and/or dedications given therein. +L. Preserve all the Invariant Sections of the Document, + unaltered in their text and in their titles. Section numbers + or the equivalent are not considered part of the section titles. +M. Delete any section Entitled "Endorsements". Such a section + may not be included in the Modified Version. +N. Do not retitle any existing section to be Entitled "Endorsements" + or to conflict in title with any Invariant Section. +O. Preserve any Warranty Disclaimers. + +If the Modified Version includes new front-matter sections or +appendices that qualify as Secondary Sections and contain no material +copied from the Document, you may at your option designate some or all +of these sections as invariant. To do this, add their titles to the +list of Invariant Sections in the Modified Version's license notice. +These titles must be distinct from any other section titles. + +You may add a section Entitled "Endorsements", provided it contains +nothing but endorsements of your Modified Version by various +parties--for example, statements of peer review or that the text has +been approved by an organization as the authoritative definition of a +standard. + +You may add a passage of up to five words as a Front-Cover Text, and a +passage of up to 25 words as a Back-Cover Text, to the end of the list +of Cover Texts in the Modified Version. Only one passage of +Front-Cover Text and one of Back-Cover Text may be added by (or +through arrangements made by) any one entity. If the Document already +includes a cover text for the same cover, previously added by you or +by arrangement made by the same entity you are acting on behalf of, +you may not add another; but you may replace the old one, on explicit +permission from the previous publisher that added the old one. + +The author(s) and publisher(s) of the Document do not by this License +give permission to use their names for publicity for or to assert or +imply endorsement of any Modified Version. + + +5. COMBINING DOCUMENTS + +You may combine the Document with other documents released under this +License, under the terms defined in section 4 above for modified +versions, provided that you include in the combination all of the +Invariant Sections of all of the original documents, unmodified, and +list them all as Invariant Sections of your combined work in its +license notice, and that you preserve all their Warranty Disclaimers. + +The combined work need only contain one copy of this License, and +multiple identical Invariant Sections may be replaced with a single +copy. If there are multiple Invariant Sections with the same name but +different contents, make the title of each such section unique by +adding at the end of it, in parentheses, the name of the original +author or publisher of that section if known, or else a unique number. +Make the same adjustment to the section titles in the list of +Invariant Sections in the license notice of the combined work. + +In the combination, you must combine any sections Entitled "History" +in the various original documents, forming one section Entitled +"History"; likewise combine any sections Entitled "Acknowledgements", +and any sections Entitled "Dedications". You must delete all sections +Entitled "Endorsements". + + +6. COLLECTIONS OF DOCUMENTS + +You may make a collection consisting of the Document and other +documents released under this License, and replace the individual +copies of this License in the various documents with a single copy +that is included in the collection, provided that you follow the rules +of this License for verbatim copying of each of the documents in all +other respects. + +You may extract a single document from such a collection, and +distribute it individually under this License, provided you insert a +copy of this License into the extracted document, and follow this +License in all other respects regarding verbatim copying of that +document. + + +7. AGGREGATION WITH INDEPENDENT WORKS + +A compilation of the Document or its derivatives with other separate +and independent documents or works, in or on a volume of a storage or +distribution medium, is called an "aggregate" if the copyright +resulting from the compilation is not used to limit the legal rights +of the compilation's users beyond what the individual works permit. +When the Document is included in an aggregate, this License does not +apply to the other works in the aggregate which are not themselves +derivative works of the Document. + +If the Cover Text requirement of section 3 is applicable to these +copies of the Document, then if the Document is less than one half of +the entire aggregate, the Document's Cover Texts may be placed on +covers that bracket the Document within the aggregate, or the +electronic equivalent of covers if the Document is in electronic form. +Otherwise they must appear on printed covers that bracket the whole +aggregate. + + +8. TRANSLATION + +Translation is considered a kind of modification, so you may +distribute translations of the Document under the terms of section 4. +Replacing Invariant Sections with translations requires special +permission from their copyright holders, but you may include +translations of some or all Invariant Sections in addition to the +original versions of these Invariant Sections. You may include a +translation of this License, and all the license notices in the +Document, and any Warranty Disclaimers, provided that you also include +the original English version of this License and the original versions +of those notices and disclaimers. In case of a disagreement between +the translation and the original version of this License or a notice +or disclaimer, the original version will prevail. + +If a section in the Document is Entitled "Acknowledgements", +"Dedications", or "History", the requirement (section 4) to Preserve +its Title (section 1) will typically require changing the actual +title. + + +9. TERMINATION + +You may not copy, modify, sublicense, or distribute the Document +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense, or distribute it is void, and +will automatically terminate your rights under this License. + +However, if you cease all violation of this License, then your license +from a particular copyright holder is reinstated (a) provisionally, +unless and until the copyright holder explicitly and finally +terminates your license, and (b) permanently, if the copyright holder +fails to notify you of the violation by some reasonable means prior to +60 days after the cessation. + +Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + +Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, receipt of a copy of some or all of the same material does +not give you any rights to use it. + + +10. FUTURE REVISIONS OF THIS LICENSE + +The Free Software Foundation may publish new, revised versions of the +GNU Free Documentation License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in +detail to address new problems or concerns. See +http://www.gnu.org/copyleft/. + +Each version of the License is given a distinguishing version number. +If the Document specifies that a particular numbered version of this +License "or any later version" applies to it, you have the option of +following the terms and conditions either of that specified version or +of any later version that has been published (not as a draft) by the +Free Software Foundation. If the Document does not specify a version +number of this License, you may choose any version ever published (not +as a draft) by the Free Software Foundation. If the Document +specifies that a proxy can decide which future versions of this +License can be used, that proxy's public statement of acceptance of a +version permanently authorizes you to choose that version for the +Document. + +11. RELICENSING + +"Massive Multiauthor Collaboration Site" (or "MMC Site") means any +World Wide Web server that publishes copyrightable works and also +provides prominent facilities for anybody to edit those works. A +public wiki that anybody can edit is an example of such a server. A +"Massive Multiauthor Collaboration" (or "MMC") contained in the site +means any set of copyrightable works thus published on the MMC site. + +"CC-BY-SA" means the Creative Commons Attribution-Share Alike 3.0 +license published by Creative Commons Corporation, a not-for-profit +corporation with a principal place of business in San Francisco, +California, as well as future copyleft versions of that license +published by that same organization. + +"Incorporate" means to publish or republish a Document, in whole or in +part, as part of another Document. + +An MMC is "eligible for relicensing" if it is licensed under this +License, and if all works that were first published under this License +somewhere other than this MMC, and subsequently incorporated in whole or +in part into the MMC, (1) had no cover texts or invariant sections, and +(2) were thus incorporated prior to November 1, 2008. + +The operator of an MMC Site may republish an MMC contained in the site +under CC-BY-SA on the same site at any time before August 1, 2009, +provided the MMC is eligible for relicensing. + + +ADDENDUM: How to use this License for your documents + +To use this License in a document you have written, include a copy of +the License in the document and put the following copyright and +license notices just after the title page: + + Copyright (c) YEAR YOUR NAME. + Permission is granted to copy, distribute and/or modify this document + under the terms of the GNU Free Documentation License, Version 1.3 + or any later version published by the Free Software Foundation; + with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. + A copy of the license is included in the section entitled "GNU + Free Documentation License". + +If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, +replace the "with...Texts." line with this: + + with the Invariant Sections being LIST THEIR TITLES, with the + Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST. + +If you have Invariant Sections without Cover Texts, or some other +combination of the three, merge those two alternatives to suit the +situation. + +If your document contains nontrivial examples of program code, we +recommend releasing these examples in parallel under your choice of +free software license, such as the GNU General Public License, +to permit their use in free software. diff --git a/LICENSE.GPL2 b/LICENSE.GPL2 new file mode 100644 index 0000000..d159169 --- /dev/null +++ b/LICENSE.GPL2 @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/LICENSE.GPL3 b/LICENSE.GPL3 new file mode 100644 index 0000000..94a9ed0 --- /dev/null +++ b/LICENSE.GPL3 @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/LICENSE.GPL3-EXCEPT b/LICENSE.GPL3-EXCEPT new file mode 100644 index 0000000..b1cb1be --- /dev/null +++ b/LICENSE.GPL3-EXCEPT @@ -0,0 +1,704 @@ +This is the GNU General Public License version 3, annotated with The +Qt Company GPL Exception 1.0: + +------------------------------------------------------------------------- + +The Qt Company GPL Exception 1.0 + +Exception 1: + +As a special exception you may create a larger work which contains the +output of this application and distribute that work under terms of your +choice, so long as the work is not otherwise derived from or based on +this application and so long as the work does not in itself generate +output that contains the output from this application in its original +or modified form. + +Exception 2: + +As a special exception, you have permission to combine this application +with Plugins licensed under the terms of your choice, to produce an +executable, and to copy and distribute the resulting executable under +the terms of your choice. However, the executable must be accompanied +by a prominent notice offering all users of the executable the entire +source code to this application, excluding the source code of the +independent modules, but including any changes you have made to this +application, under the terms of this license. + + +------------------------------------------------------------------------- + + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/LICENSE.GPLv3 b/LICENSE.GPLv3 new file mode 100644 index 0000000..71c4ad4 --- /dev/null +++ b/LICENSE.GPLv3 @@ -0,0 +1,686 @@ + GNU GENERAL PUBLIC LICENSE + + The Qt Toolkit is Copyright (C) 2015 The Qt Company Ltd. + Contact: http://www.qt.io/licensing/ + + You may use, distribute and copy the Qt Toolkit under the terms of + GNU Lesser General Public License version 3. That license references + the General Public License version 3, that is displayed below. Other + portions of the Qt Toolkit may be licensed directly under this license. + +------------------------------------------------------------------------- + + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/LICENSE.LGPL3 b/LICENSE.LGPL3 new file mode 100644 index 0000000..65c5ca8 --- /dev/null +++ b/LICENSE.LGPL3 @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git a/LICENSE.LGPLv3 b/LICENSE.LGPLv3 new file mode 100644 index 0000000..6bf924c --- /dev/null +++ b/LICENSE.LGPLv3 @@ -0,0 +1,175 @@ + GNU LESSER GENERAL PUBLIC LICENSE + + The Qt Toolkit is Copyright (C) 2015 The Qt Company Ltd. + Contact: http://www.qt.io/licensing/ + + You may use, distribute and copy the Qt Toolkit under the terms of + GNU Lesser General Public License version 3, which is displayed below. + This license makes reference to the version 3 of the GNU General + Public License, which you can find in the LICENSE.GPLv3 file. + +------------------------------------------------------------------------- + + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright © 2007 Free Software Foundation, Inc. +Everyone is permitted to copy and distribute verbatim copies of this +licensedocument, but changing it is not allowed. + +This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + +0. Additional Definitions. + + As used herein, “this License” refers to version 3 of the GNU Lesser +General Public License, and the “GNU GPL” refers to version 3 of the +GNU General Public License. + + “The Library” refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An “Application” is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A “Combined Work” is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the “Linked +Version”. + + The “Minimal Corresponding Source” for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The “Corresponding Application Code” for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + +1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + +2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort + to ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + +3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this + license document. + +4. Combined Works. + + You may convey a Combined Work under terms of your choice that, taken +together, effectively do not restrict modification of the portions of +the Library contained in the Combined Work and reverse engineering for +debugging such modifications, if you also do each of the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this + license document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of + this License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with + the Library. A suitable mechanism is one that (a) uses at run + time a copy of the Library already present on the user's + computer system, and (b) will operate properly with a modified + version of the Library that is interface-compatible with the + Linked Version. + + e) Provide Installation Information, but only if you would + otherwise be required to provide such information under section 6 + of the GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the Application + with a modified version of the Linked Version. (If you use option + 4d0, the Installation Information must accompany the Minimal + Corresponding Source and Corresponding Application Code. If you + use option 4d1, you must provide the Installation Information in + the manner specified by section 6 of the GNU GPL for conveying + Corresponding Source.) + +5. Combined Libraries. + + You may place library facilities that are a work based on the Library +side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities, conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of + it is a work based on the Library, and explaining where to find + the accompanying uncombined form of the same work. + +6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +as you received it specifies that a certain numbered version of the +GNU Lesser General Public License “or any later version” applies to +it, you have the option of following the terms and conditions either +of that published version or of any later version published by the +Free Software Foundation. If the Library as you received it does not +specify a version number of the GNU Lesser General Public License, +you may choose any version of the GNU Lesser General Public License +ever published by the Free Software Foundation. + +If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the Library. + diff --git a/config.tests/gypsy/gypsy.pro b/config.tests/gypsy/gypsy.pro new file mode 100644 index 0000000..93d56eb --- /dev/null +++ b/config.tests/gypsy/gypsy.pro @@ -0,0 +1,2 @@ +TEMPLATE = app +SOURCES += main.cpp diff --git a/config.tests/gypsy/main.cpp b/config.tests/gypsy/main.cpp new file mode 100644 index 0000000..2b8d3ca --- /dev/null +++ b/config.tests/gypsy/main.cpp @@ -0,0 +1,44 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the QtLocation module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:GPL-EXCEPT$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include +#include +#include +#include + +int main() +{ + GypsyControl *control = gypsy_control_get_default(); + GypsyDevice *device = gypsy_device_new("test"); + GypsySatellite *satellite = gypsy_satellite_new("test"); + + GConfClient *client = gconf_client_get_default(); + g_object_unref(client); + + return 0; +} diff --git a/config.tests/winrt/main.cpp b/config.tests/winrt/main.cpp new file mode 100644 index 0000000..ff1eb81 --- /dev/null +++ b/config.tests/winrt/main.cpp @@ -0,0 +1,47 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the QtPositioning module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:GPL-EXCEPT$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include +#include +#include +#include +#include + +using namespace Microsoft::WRL::Wrappers; +using namespace ABI::Windows::Devices::Geolocation; +using namespace ABI::Windows::Foundation; + +typedef IAsyncOperationCompletedHandler AccessHandler; + +int main(int, char**) +{ + IGeolocator *locator; + RoActivateInstance(HString::MakeReference(RuntimeClass_Windows_Devices_Geolocation_Geolocator).Get(), + reinterpret_cast(&locator)); + return 0; +} diff --git a/config.tests/winrt/winrt.pro b/config.tests/winrt/winrt.pro new file mode 100644 index 0000000..06c2249 --- /dev/null +++ b/config.tests/winrt/winrt.pro @@ -0,0 +1,5 @@ +SOURCES += main.cpp +msvc { + LIBS += runtimeobject.lib + CONFIG += console +} diff --git a/configure.json b/configure.json new file mode 100644 index 0000000..379d8b4 --- /dev/null +++ b/configure.json @@ -0,0 +1,6 @@ +{ + "subconfigs": [ + "src/positioning", + "src/location" + ] +} diff --git a/dist/changes-5.10.0 b/dist/changes-5.10.0 new file mode 100644 index 0000000..1703cf6 --- /dev/null +++ b/dist/changes-5.10.0 @@ -0,0 +1,62 @@ +Qt 5.10 introduces many new features and improvements as well as bugfixes +over the 5.9.x series. For more details, refer to the online documentation +included in this distribution. The documentation is also available online: + +http://doc.qt.io/qt-5/index.html + +The Qt version 5.10 series is binary compatible with the 5.9.x series. +Applications compiled for 5.9 will continue to run with 5.10. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + +https://bugreports.qt.io/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + +**************************************************************************** +* Qt 5.10.0 Changes * +**************************************************************************** + + - This release contains only minor code improvements. + +QtLocation +---------- + + - Map: + * [QTBUG-55782] Added methods to add or remove MapItemViews at runtime. + * Visible region now returns a QGeoPolygon. + + - MapGestureArea: + * Added rotation and tilt scroll wheel actions. + + - MapPolyline: + * Added setPath overload taking a QGeoPath. + + - MapboxGL: + * Updated Mapbox GL Native to v1.1.0. + * [QTBUG-62002] Updated map styles. + * [QTBUG-61442] Fix MapParameter dynamic usage. + + - QDeclarativeGeoMap: + * Added setBearing overload to rotate the map around a given + QGeoCoordinate. + * Added alignCoordinateToPoint method to QDeclarativeGeoMap. + + - QDeclarativeGeoMapType: + * [QTBUG-58931] Added CameraCapabilities and metadata properties to + QDeclarativeGeoMapType. + + - QGeoRouteRequest/RouteQuery: + * Add TrafficFeature to the query features. + +QtPositioning +------------- + + - QGeoPath: + * Add ::size() to QGeoPath to retrieve the number of coordinates in the + path. + + - QGeoPolygon: + * Added QGeoPolygon shape. diff --git a/dist/changes-5.10.1 b/dist/changes-5.10.1 new file mode 100644 index 0000000..695c4e3 --- /dev/null +++ b/dist/changes-5.10.1 @@ -0,0 +1,26 @@ +Qt 5.10.1 is a bug-fix release. It maintains both forward and backward +compatibility (source and binary) with Qt 5.10.0. + +For more details, refer to the online documentation included in this +distribution. The documentation is also available online: + +http://doc.qt.io/qt-5/index.html + +The Qt version 5.10 series is binary compatible with the 5.9.x series. +Applications compiled for 5.9 will continue to run with 5.10. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + +https://bugreports.qt.io/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + +This release contains all fixes included in the Qt 5.9.4 release. + +**************************************************************************** +* Qt 5.10.1 Changes * +**************************************************************************** + + - This release contains only minor code improvements. diff --git a/dist/changes-5.11.0 b/dist/changes-5.11.0 new file mode 100644 index 0000000..aae6398 --- /dev/null +++ b/dist/changes-5.11.0 @@ -0,0 +1,116 @@ +Qt 5.11 introduces many new features and improvements as well as bugfixes +over the 5.10.x series. For more details, refer to the online documentation +included in this distribution. The documentation is also available online: + +http://doc.qt.io/qt-5/index.html + +The Qt version 5.11 series is binary compatible with the 5.10.x series. +Applications compiled for 5.10 will continue to run with 5.11. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + +https://bugreports.qt.io/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + +**************************************************************************** +* Qt 5.11.0 Changes * +**************************************************************************** + +QtLocation +---------- + + - Qt.labs.location + * A new experimental QML plugin introduced, Qt.labs.location, which + offers two new categories of QML elements: Map Objects and the + Navigator type. Both are experimental, not supposed to work in every + setup (check documentation). This plugin can be disabled at configure + time, through the location-labs-plugin feature. + * Map objects are supposed to be QQuickItem-less equivalents of + Map Items. They are supposed to be easy to implement in plugins, and + to introduce minimal overhead. They come with a reference + implementation based on QSGNodes, that is supposed to work in all of the + currently offered raster based plugins. + At the present, the MapboxGL plugin does not offer map objects support. + * The Navigator type is a new QML api to expose turn-by-turn navigation + functions present in plugins. It requires a plugin supporting + one of the Navigation capabilities to actually work. + At the present, none of the open source plugins have these capabilities. + + - MapParameter + * MapParameter type now deprecated and re-registered under the DynamicParameter + name. + + - QGeoServiceProvider/QGeoServiceProviderFactory + * Added QGeoServiceProviderFactoryV2, capable of producing + QNavigationManagerEngine objects. + Note: QNavigationManagerEngine is private API. + + - QGeoPath + * The path property changed type, from QList to + QVariantList. This is binary-compatible with the previous release, + and source-compatible in QML. + It may, however, introduce source incompatibilities when using + the QObject property API in C++ (::property and ::setProperty), for + example in the generation of language bindings. + For the regular user-code, the use case was deemed as rare enough + (since QGeoShape has a public setter/getter for the path) to not cause + any problem. + As the beta phase passed without issues, this change was therefore left in place. + + - QGeoRoute + * QGeoRoute, QGeoRouteSegment and QGeoManeuver private implementation are + now (privately) exported and can be subclassed in plugins to provide + custom private implementations. + * QGeoRouteRequest now allows to specify extra parameters in QVariantMap form. + * RouteQuery (QDeclarativeGeoRouteQuery) now allows to specify extra parameters + through Map/DynamicParameters. + * Added extended attributes to QGeoManeuver/QDeclarativeGeoManeuver. + * [QTBUG-64066] Introduced new Waypoint QML type, intended to replace + QGeoCoordinate as mean to specify waypoints in a RouteQuery. + + - QPlace + * QPlace private implementation is now (privately) exported and can be + subclassed in plugins to provide custom private implementations. + * QPlaceContent::Type has a new value, CustomType. + + - QDeclarativeGeoMap + * [QTBUG-66315] Fixed a crash calling Map.clearMapItems before Map is + initialized. + * Fixed MapGestureArea not emitting when controlled with scroll wheel. + * [QTBUG-66880] Fixed clearData not triggering scene update. + * [QTBUG-67580] Fixed crash in QQuickGeoMapGestureArea. + * [QTBUG-67759] Fixed crash when calling clearData at startup. + + - Map Items + * [QTBUG-66758] Fixed re-set map items rendering stale geometry. + * [QTBUG-38459] Fixed the geometry of map items so that, if layers.enabled + is set to true, the scene graph renderer will not cut the items borders + anymore. + * [QTBUG-66692, QTBUG-66830] Fixed polyline geometry generation. + * [QTBUG-62086, QTBUG-65833] Fixed MapItemView not setting context data + upon item deletion. + * [QTBUG-67765] Fixed interaction with Map Items borders. + + - Plugins + * Mapbox: Added OnlinePlacesFeature, PlaceRecommendationsFeature, SearchSuggestionsFeature + and LocalizedPlacesFeature. + * Mapbox: Added OnlineGeocodingFeature, ReverseGeocodingFeature and LocalizedGeocodingFeature. + * Mapbox/OSM: OSRM backend now returns extended attributes for the maneuvers, such as + bearing_before, bearing_after, instruction, type and modifier. + * Mapbox/OSM: OSRM backend now uses Waypoint's bearing when sending a route request. + * Mapbox/OSM: Added OSRM's {leg,step}_index extra attribute to QGeoManeuver. + * Mapbox: Supported Mapbox Directions API voice & banner instructions. + * MapboxGL: Added map margins support via 'margins' map parameter. + * HERE: the plugin now uses Waypoint's bearing when sending a route request. + * OSM: supported the query limit parameter in the nominatim backend. + + +QtPositioning +---------- + + * [QTBUG-65937] Metatype for QGeoPositionInfo is now declared and registered. + This change introduces a potential source incompatibility, as existing user code may + contain the type registration already. diff --git a/dist/changes-5.11.1 b/dist/changes-5.11.1 new file mode 100644 index 0000000..4ce6df8 --- /dev/null +++ b/dist/changes-5.11.1 @@ -0,0 +1,40 @@ +Qt 5.11.1 is a bug-fix release. It maintains both forward and backward +compatibility (source and binary) with Qt 5.11.0. + +For more details, refer to the online documentation included in this +distribution. The documentation is also available online: + +http://doc.qt.io/qt-5/index.html + +The Qt version 5.11 series is binary compatible with the 5.10.x series. +Applications compiled for 5.10 will continue to run with 5.11. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + +https://bugreports.qt.io/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + +**************************************************************************** +* Qt 5.11.1 Changes * +**************************************************************************** + +QtLocation +---------- + +* [QTBUG-63223] Fixed MapPolyline documentation. +* Fixed a crash in Map{Polyline,Polygon,Route}ObjectQsg. +* [QTBUG-68261] Changed nominatim default endpoint base URL to HTTPS. +* Bumped mapbox-gl-native to the latest version, fixing offline tiles support. +* [QTBUG-68121] Supported raster-dem source types in the MapboxGL plugin. +* [QTBUG-68358] Added missing route query parameters to the query in the mapbox plugin. +* [QTBUG-68366] Fixed MapItemView deleting wrong item after changing to use the delegate model internally. +* [QTBUG-68598] Supported dynamic QObject properties in QMapboxGLStyleChange. + + +QtPositioning +------------- + +* [QTBUG-64699] Fixed QGeoPositionInfo timestamp comparison in nmea source. diff --git a/dist/changes-5.11.2 b/dist/changes-5.11.2 new file mode 100644 index 0000000..ffc0b7d --- /dev/null +++ b/dist/changes-5.11.2 @@ -0,0 +1,38 @@ +Qt 5.11.2 is a bug-fix release. It maintains both forward and backward +compatibility (source and binary) with Qt 5.11.0 through 5.11.1. + +For more details, refer to the online documentation included in this +distribution. The documentation is also available online: + +http://doc.qt.io/qt-5/index.html + +The Qt version 5.11 series is binary compatible with the 5.10.x series. +Applications compiled for 5.10 will continue to run with 5.11. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + +https://bugreports.qt.io/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + +**************************************************************************** +* Qt 5.11.2 Changes * +**************************************************************************** + +QtLocation +---------- + +* [QTBUG-68086] Documented potential SSL dependency in OSM provider. +* [QTBUG-69031] Added Qt.labs.location::Navigator::trackPositionSource property. +* [QTBUG-69262] Improved the Clipper dependency attribution file. +* [QTBUG-59665] Removed indexing of offline data from OSM plugin. + + +QtPositioning +------------- + +* Reduced minimum NMEA update interval. +* [QTBUG-64699] NMEA sentences now combined by timestamp also in live mode. + diff --git a/dist/changes-5.11.3 b/dist/changes-5.11.3 new file mode 100644 index 0000000..9b09a0c --- /dev/null +++ b/dist/changes-5.11.3 @@ -0,0 +1,32 @@ +Qt 5.11.3 is a bug-fix release. It maintains both forward and backward +compatibility (source and binary) with Qt 5.11.0 through 5.11.2. + +For more details, refer to the online documentation included in this +distribution. The documentation is also available online: + +http://doc.qt.io/qt-5/index.html + +The Qt version 5.11 series is binary compatible with the 5.10.x series. +Applications compiled for 5.10 will continue to run with 5.11. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + +https://bugreports.qt.io/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + +**************************************************************************** +* Qt 5.11.3 Changes * +**************************************************************************** + + QtLocation + ---------- + + - [QTBUG-69617] Fixed Qt.labs.location not linking statically on iOS. + - [QTBUG-71355] Fixed crash when calling QGeoPath::length() on empty + QGeoPath instance. + - Fixed place search matching based on category in mapbox plugin. Previously, + the search results contained places which did not have any category set. + diff --git a/dist/changes-5.12.0 b/dist/changes-5.12.0 new file mode 100644 index 0000000..4fd5b69 --- /dev/null +++ b/dist/changes-5.12.0 @@ -0,0 +1,52 @@ +Qt 5.12 introduces many new features and improvements as well as bugfixes +over the 5.11.x series. For more details, refer to the online documentation +included in this distribution. The documentation is also available online: + +https://doc.qt.io/qt-5/index.html + +The Qt version 5.12 series is binary compatible with the 5.11.x series. +Applications compiled for 5.11 will continue to run with 5.12. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + +https://bugreports.qt.io/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + +**************************************************************************** +* QtLocation * +**************************************************************************** + + + - Added QDeclarativeGeoRoute::equals to perform deep comparisons in QML. + - MapItemView now exposes add and remove transitions, so that they can + be changed (defaults are none for add, and item fade out for remove). + - Enabled incremental updates in PlaceSearchModel, which prevents previousPage or + nextPage from resetting the model, but rather appending the new data to it. + - [QTBUG-68966] Added Map.visibleArea property. + - [QTBUG-62683][QTBUG-62397] Enabled nesting of MapItemView. This required + a behavioral change, as MapItemView is now a MapItemGroup, not anymore a + plain QObject. Due to a bug, MapItemView was previously not a Qt Quick + Item, making it possible to create it as a child of any QObject. This + has now been fixed, so if you happen to have a MapItemView in your scene + which is not a child of a Qt Quick Item, you will get an error message. + - Enabled asynchronous incremental updates of QPlaceReply. + - Changed QDeclarativeGeoMapItemBase::geoShape property from read-only into R/W. + - Added support for route legs. + - [QTBUG-70499] Fixed HERE plugin requesting the route incorrectly. + - Added ESRI place search manager to the ESRI plugin. + +**************************************************************************** +* QtPositioning * +**************************************************************************** + + - Exposed mercatorToCoord and coordToMercator to QML. + - [QTBUG-62875] QGeoPath can now be cleared directly using clearPath. + - Added QGeoPolygon::perimeter property. + - Added holes support to QGeoPolygon. Currently visualized only when using + in a MapPolygon with the MapboxGL plugin. + - [QTBUG-43435] Added Geoclue2 position plugin. + - [QTBUG-52660] QtPositioning now properly checks for authorization on iOS. + diff --git a/dist/changes-5.12.1 b/dist/changes-5.12.1 new file mode 100644 index 0000000..2ea2eda --- /dev/null +++ b/dist/changes-5.12.1 @@ -0,0 +1,56 @@ +Qt 5.12.1 is a bug-fix release. It maintains both forward and backward +compatibility (source and binary) with Qt 5.12.0. + +For more details, refer to the online documentation included in this +distribution. The documentation is also available online: + +http://doc.qt.io/qt-5/index.html + +The Qt version 5.12 series is binary compatible with the 5.11.x series. +Applications compiled for 5.11 will continue to run with 5.12. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + +https://bugreports.qt.io/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + +**************************************************************************** +* QtLocation * +**************************************************************************** + + + - Exposed support for chinese maps in the MapboxGL plugin. + - Fixed unstable rotation gesture on some platforms. + - [QTBUG-71607] Fixed MapPolyline drawing incorrectly at high zoom levels. + - [QTBUG-71607] Fixed missing geometry update when changing map items + border width. + - [QTBUG-71264] Fixed MapItemView removing wrong indices on model changes. + - Added QAbstractNavigator::setTrackPosition. + - [QTBUG-70254] Improved the initialization behavior of CategoryModel. + - [QTBUG-69512] Fixed compilation with GCC < 5.0. + - [QTBUG-72180] Fixed a regression in error handling inside + QGeoServiceProvider. + - [QTBUG-72462] Introduced a plugin parameter to decide U-Turn direction. + - Fixed MapItemView attempting to instantiate items when map not set. + +**************************************************************************** +* QtPositioning * +**************************************************************************** + + - [QTBUG-72291] Fixed horizontal accuracy comparison for competing position + results. + - [QTBUG-62682][QTBUG-68331] Enabled QVariant::save for QGeoCoordinate. + - Registered QGeoCoordinate debug streaming operator + + - [QTBUG-64689] Android: Implemented collection of vertical accuracy data. + - [QTBUG-66427] Android: Fixed + QGeoPositionInfoSource::supportedPositioningMethods(). + + - WinRT: Fixed setting of verticalAccuracy. + - [QTBUG-71194] WinRT: Made sure that Co(Un)Initialize is called. + - WinRT: Added categorized logging. + - WinRT: Fixed namespaced builds + - WinRT: Implemented minimumUpdateInterval. diff --git a/dist/changes-5.12.2 b/dist/changes-5.12.2 new file mode 100644 index 0000000..d9822a3 --- /dev/null +++ b/dist/changes-5.12.2 @@ -0,0 +1,33 @@ +Qt 5.12.2 is a bug-fix release. It maintains both forward and backward +compatibility (source and binary) with Qt 5.12.0 through 5.12.1. + +For more details, refer to the online documentation included in this +distribution. The documentation is also available online: + +https://doc.qt.io/qt-5/index.html + +The Qt version 5.12 series is binary compatible with the 5.11.x series. +Applications compiled for 5.11 will continue to run with 5.12. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + +https://bugreports.qt.io/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + +**************************************************************************** +* QtLocation * +**************************************************************************** + + - [QTBUG-61509] Fixed crash when assigning a Component to MapQuickItem.sourceItem. + - [QTBUG-72935] Fixed QGeoRectangle::operator|=-. + - [QTBUG-71264] Fixed MapObjectView removing wrong indices on model changes. + +**************************************************************************** +* QtPositioning * +**************************************************************************** + + - Several improvements in the WinRT positioning plugin. + - Geoclue plugin re-enabled on all *BSD. diff --git a/dist/changes-5.12.3 b/dist/changes-5.12.3 new file mode 100644 index 0000000..f66e469 --- /dev/null +++ b/dist/changes-5.12.3 @@ -0,0 +1,33 @@ +Qt 5.12.3 is a bug-fix release. It maintains both forward and backward +compatibility (source and binary) with Qt 5.12.0 through 5.12.2. + +For more details, refer to the online documentation included in this +distribution. The documentation is also available online: + +https://doc.qt.io/qt-5/index.html + +The Qt version 5.12 series is binary compatible with the 5.11.x series. +Applications compiled for 5.11 will continue to run with 5.12. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + +https://bugreports.qt.io/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + +**************************************************************************** +* QtPositioning * +**************************************************************************** + + - Documented QGeoPath::length behavior properly. + +**************************************************************************** +* UNSPECIFIED * +**************************************************************************** + + - Fixed incorrect indexing of Mapbox tiles in the cache. + - Fixed crash when destroying Maps containing MapItemViews. + - Added a notice to the MapViewer example to inform when a HTTPS-based map + is selected without SSL support. diff --git a/dist/changes-5.12.4 b/dist/changes-5.12.4 new file mode 100644 index 0000000..a285cd8 --- /dev/null +++ b/dist/changes-5.12.4 @@ -0,0 +1,20 @@ +Qt 5.12.4 is a bug-fix release. It maintains both forward and backward +compatibility (source and binary) with Qt 5.12.0 through 5.12.3. + +For more details, refer to the online documentation included in this +distribution. The documentation is also available online: + +https://doc.qt.io/qt-5/index.html + +The Qt version 5.12 series is binary compatible with the 5.11.x series. +Applications compiled for 5.11 will continue to run with 5.12. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + +https://bugreports.qt.io/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + + - This release contains only minor code improvements. diff --git a/dist/changes-5.12.5 b/dist/changes-5.12.5 new file mode 100644 index 0000000..e8be931 --- /dev/null +++ b/dist/changes-5.12.5 @@ -0,0 +1,20 @@ +Qt 5.12.5 is a bug-fix release. It maintains both forward and backward +compatibility (source and binary) with Qt 5.12.0 through 5.12.4. + +For more details, refer to the online documentation included in this +distribution. The documentation is also available online: + +https://doc.qt.io/qt-5/index.html + +The Qt version 5.12 series is binary compatible with the 5.11.x series. +Applications compiled for 5.11 will continue to run with 5.12. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + +https://bugreports.qt.io/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + + - This release contains only minor code improvements. diff --git a/dist/changes-5.13.0 b/dist/changes-5.13.0 new file mode 100644 index 0000000..564a37e --- /dev/null +++ b/dist/changes-5.13.0 @@ -0,0 +1,46 @@ +Qt 5.13 introduces many new features and improvements as well as bugfixes +over the 5.12.x series. For more details, refer to the online documentation +included in this distribution. The documentation is also available online: + +https://doc.qt.io/qt-5/index.html + +The Qt version 5.13 series is binary compatible with the 5.12.x series. +Applications compiled for 5.12 will continue to run with 5.13. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + +https://bugreports.qt.io/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + +**************************************************************************** +* QtLocation * +**************************************************************************** + + - Added a GeoJSON parser which can be used to annotate maps with tracks, + polygonal boundaries, etc. + - GeoJSON returned in Nominatim queries is now converted into the corresponding + geoshapes using QGeoJson. + - GeoJSON returned in Nominatim queries is now converted into the corresponding + geoshapes using QGeoJson. + - Introduced Qt.labs.location QtLocationLabs singleton type, offering tech-preview + map related API. + - Added departure time attribute to route queries. + - Introduced QGeoMapObject::geoShape property. + - Additional navigation information now exposed via Navigator. + - Fixed crash when removing items from MapboxGL maps. + - Renamed MapIconObject.size to MapIconObject.iconSize. + - Added Map.fitViewportToGeoShape(shape, margins). + - Added Navigator currentRouteLeg property. + - Introduced extendedAttributes property to Geo Location types. + - Introduced extendedAttributes property to Geo Routes types. + +**************************************************************************** +* QtPositioning * +**************************************************************************** + +- Added holes support to QGeoPolygon, currently rendered only when using the + MapboxGL backend. + diff --git a/dist/changes-5.13.1 b/dist/changes-5.13.1 new file mode 100644 index 0000000..57ebdbe --- /dev/null +++ b/dist/changes-5.13.1 @@ -0,0 +1,20 @@ +Qt 5.13.1 is a bug-fix release. It maintains both forward and backward +compatibility (source and binary) with Qt 5.13.0. + +For more details, refer to the online documentation included in this +distribution. The documentation is also available online: + +https://doc.qt.io/qt-5/index.html + +The Qt version 5.13 series is binary compatible with the 5.12.x series. +Applications compiled for 5.12 will continue to run with 5.13. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + +https://bugreports.qt.io/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + + - This release contains only minor code improvements. diff --git a/dist/changes-5.13.2 b/dist/changes-5.13.2 new file mode 100644 index 0000000..e3bb833 --- /dev/null +++ b/dist/changes-5.13.2 @@ -0,0 +1,20 @@ +Qt 5.13.2 is a bug-fix release. It maintains both forward and backward +compatibility (source and binary) with Qt 5.13.0 through 5.13.1. + +For more details, refer to the online documentation included in this +distribution. The documentation is also available online: + +https://doc.qt.io/qt-5/index.html + +The Qt version 5.13 series is binary compatible with the 5.12.x series. +Applications compiled for 5.12 will continue to run with 5.13. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + +https://bugreports.qt.io/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + + - This release contains only minor code improvements. diff --git a/dist/changes-5.14.0 b/dist/changes-5.14.0 new file mode 100644 index 0000000..a2748e5 --- /dev/null +++ b/dist/changes-5.14.0 @@ -0,0 +1,47 @@ +Qt 5.14 introduces many new features and improvements as well as bugfixes +over the 5.13.x series. For more details, refer to the online documentation +included in this distribution. The documentation is also available online: + +https://doc.qt.io/qt-5/index.html + +The Qt version 5.14 series is binary compatible with the 5.13.x series. +Applications compiled for 5.13 will continue to run with 5.14. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + +https://bugreports.qt.io/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + +**************************************************************************** +* QtLocation * +**************************************************************************** + + - [QTBUG-76867] Added property to disable the automatic fade-in/fade-out + behavior of MapItems on low zoom levels. + - Added QDeclarativeGeoServiceProviderRequirements + navigation property. + - Added notification signal to Map.visibleRegion property. + - Added automaticReroutingEnabled, isOnRoute and alternativeRoutes + properties to QDeclarativeNavigator. + - Added a recalculateRoutes invokable method to QDeclarativeNavigator. + + - Geoservice Plugins + * MapboxGL: Added support for image sources. + +**************************************************************************** +* QtPositioning * +**************************************************************************** + + - [QTBUG-66304] Exposed PluginParameter also from QtPositioning qml + plugin, to be used in PositionSource as replacement of environment + variables. + - [QTBUG-59274] Added Satellite info source capabilities to the serial nmea + plugin. + + + + + diff --git a/dist/changes-5.14.1 b/dist/changes-5.14.1 new file mode 100644 index 0000000..d008638 --- /dev/null +++ b/dist/changes-5.14.1 @@ -0,0 +1,20 @@ +Qt 5.14.1 is a bug-fix release. It maintains both forward and backward +compatibility (source and binary) with Qt 5.14.0. + +For more details, refer to the online documentation included in this +distribution. The documentation is also available online: + +https://doc.qt.io/qt-5/index.html + +The Qt version 5.14 series is binary compatible with the 5.13.x series. +Applications compiled for 5.13 will continue to run with 5.14. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + +https://bugreports.qt.io/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + + - This release contains only minor code improvements. diff --git a/dist/changes-5.14.2 b/dist/changes-5.14.2 new file mode 100644 index 0000000..68a0051 --- /dev/null +++ b/dist/changes-5.14.2 @@ -0,0 +1,20 @@ +Qt 5.14.2 is a bug-fix release. It maintains both forward and backward +compatibility (source and binary) with Qt 5.14.0 through 5.14.1. + +For more details, refer to the online documentation included in this +distribution. The documentation is also available online: + +https://doc.qt.io/qt-5/index.html + +The Qt version 5.14 series is binary compatible with the 5.13.x series. +Applications compiled for 5.13 will continue to run with 5.14. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + +https://bugreports.qt.io/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + + - This release contains only minor code improvements. diff --git a/dist/changes-5.15.0 b/dist/changes-5.15.0 new file mode 100644 index 0000000..f084e9e --- /dev/null +++ b/dist/changes-5.15.0 @@ -0,0 +1,51 @@ +Qt 5.15 introduces many new features and improvements as well as bugfixes +over the 5.14.x series. For more details, refer to the online documentation +included in this distribution. The documentation is also available online: + +https://doc.qt.io/qt-5/index.html + +The Qt version 5.15 series is binary compatible with the 5.14.x series. +Applications compiled for 5.14 will continue to run with 5.15. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + +https://bugreports.qt.io/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + +**************************************************************************** +* QtPositioning * +**************************************************************************** + + - QGeoPolygon: + * Fixed contains method. + + - serialnmea plugin: + * [QTBUG-82819] Fixed serialnmea plugin initialization when used with serial port. + + - [QTBUG-81069] Fixed a dangling pointer issue in QML PositionSource API. + + - Fixed QGeoCoordinate::CoordinateFormat missing Q_ENUM. + + - Removed the usage of deprecated APIs from other Qt modules. + + +**************************************************************************** +* QtLocation * +**************************************************************************** + + - Added optional Argument to Map.fitViewportToMapItems. + + - Fixed a memory leak related to MapObjects.border. + + - Updated the 3rdparty library earcut. + + - Fixed Map*ObjectsQSG implementation triggering QSGBatchRenderer crashes. + + - Ported Map*ObjectPrivateQSG to the shader-based projection geometries. + + - Fixed segmentation fault due to null pointer usage in qdeclarativepolylinemapitem.cpp. + + - Removed the usage of deprecated APIs from other Qt modules. diff --git a/dist/changes-5.15.1 b/dist/changes-5.15.1 new file mode 100644 index 0000000..332ee9d --- /dev/null +++ b/dist/changes-5.15.1 @@ -0,0 +1,20 @@ +Qt 5.15.1 is a bug-fix release. It maintains both forward and backward +compatibility (source and binary) with Qt 5.15.0. + +For more details, refer to the online documentation included in this +distribution. The documentation is also available online: + +https://doc.qt.io/qt-5/index.html + +The Qt version 5.15 series is binary compatible with the 5.14.x series. +Applications compiled for 5.14 will continue to run with 5.15. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + +https://bugreports.qt.io/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + + - This release contains only minor code improvements. diff --git a/dist/changes-5.15.2 b/dist/changes-5.15.2 new file mode 100644 index 0000000..1e66906 --- /dev/null +++ b/dist/changes-5.15.2 @@ -0,0 +1,48 @@ +Qt 5.15.2 is a bug-fix release. It maintains both forward and backward +compatibility (source and binary) with Qt 5.15.1. + +For more details, refer to the online documentation included in this +distribution. The documentation is also available online: + + https://doc.qt.io/qt-5.15/index.html + +The Qt version 5.15 series is binary compatible with the 5.14.x series. +Applications compiled for 5.14 will continue to run with 5.15. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + + https://bugreports.qt.io/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + +**************************************************************************** +* Important Behavior Changes * +**************************************************************************** + +**************************************************************************** +* Library * +**************************************************************************** + + +General +------- + + - [QTBUG-86248] The generated clipper2tri, clipper, poly2tri libraries have + been renamed to qt_clipper2tri, qt_clipper, qt_poly2tri. This avoids + conflicts for static builds. + +Third-Party Code +---------------- + + - Update and extend third-party documentation for Mapbox GL plugin + dependencies: libc++, Optional, Mapbox GL Native, Boost, CSS Color Parser, + cURL Parse Date, Earcut Polygon Triangulation Library, geojson-cpp, + geojson-vt-cpp, geometry.hpp, kdbush.hpp, polylabel, protozero, RapidJSON, + shelf-pack-cpp, supercluster.hpp, tao_tuple, unique_resource, variant, + Vector Tile Library, Wagyu Geometry Processing Library, nunicode. + + - Added actual license text of Boost Software License (used in Clipper Polygon + Clipping Library) + diff --git a/dist/changes-5.2.1 b/dist/changes-5.2.1 new file mode 100644 index 0000000..37a1f55 --- /dev/null +++ b/dist/changes-5.2.1 @@ -0,0 +1,53 @@ +Qt 5.2.1 is a bug-fix release. It maintains both forward and backward +compatibility (source and binary) with Qt 5.2.0. + +For more details, refer to the online documentation included in this +distribution. The documentation is also available online: + + http://qt-project.org/doc/qt-5.2 + +The Qt version 5.2 series is binary compatible with the 5.1.x series. +Applications compiled for 5.1 will continue to run with 5.2. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + + http://bugreports.qt-project.org/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + +**************************************************************************** +* General * +**************************************************************************** + +General Improvements +-------------------- + + - [QTBUG-34910] Fixed too long weather status string in weatherinfo + example (UI change). + - [QTBUG-36187] Byte order marker removed from positionpoll plugin + which caused compile errors on some older compilers. + - Fixed make install rules for all examples. + - declarative_core unit test was fixed and re-enabled. + +**************************************************************************** +* Library * +**************************************************************************** + +QtPositioning +------------- + + - [QTBUG-33220] Removed QtQml dependency from QtPositioning. + +**************************************************************************** +* Plugin Specific Changes * +**************************************************************************** + +GeoClue +------- + + - Delay satellite provider until requested. + - Sets the default preferred positioning method to AllPositioningMethods. + - Fix for incorrect accuracy values reported by the plug-in. + diff --git a/dist/changes-5.3.0 b/dist/changes-5.3.0 new file mode 100644 index 0000000..1bf445a --- /dev/null +++ b/dist/changes-5.3.0 @@ -0,0 +1,74 @@ +Qt 5.3 introduces many new features and improvements as well as bugfixes +over the 5.2.x series. For more details, refer to the online documentation +included in this distribution. The documentation is also available online: + + http://qt-project.org/doc/qt-5.3 + +The Qt version 5.3 series is binary compatible with the 5.2.x series. +Applications compiled for 5.2 will continue to run with 5.3. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + + http://bugreports.qt-project.org/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + +**************************************************************************** +* General * +**************************************************************************** + +General Improvements +-------------------- + + - New SatelliteInfo example added. The example displays the signal + strength of surrounding satellites. The example employs a demo mode on + those platforms which don't provide satellite information + + +**************************************************************************** +* Library * +**************************************************************************** + +QtPositioning +------------- + + - Position (QML): + * Added direction and vertical speed properties. + + - QGeoPositionInfoSource: + * iOS position backend added. + * [QTBUG-34102] Android backend added. Android devices can retrieve + their current position. Network- and Satellite-based providers are + supported. + + - QGeoSatelliteInfoSource: + * [QTBUG-34102] Android backend added. Android devices can retrieve + information about the currently accessible GPS and GLONASS satellites. + + - QGeoRectangle: + * Added QGeoRectangle(QList) constructor added. + * Improved class documentation. + + - QGeoShape: + * Added extendShape(QGeoCoordinate) function. + + - QNmeaPositionInfoSource: + * Added support for reporting position accuracy. + + +**************************************************************************** +* Plugin Specific Changes * +**************************************************************************** + +GeoClue +------- + - [QTBUG-36298] Reports direction of travel and + vertical speed attributes, if supported by the active Geoclue + provider. + - Fixed the emission of the updateTimeout() signal when + position updates do not arrive in a timely manner. + - Position info source provider no longer internally filters + position updates to the requested update interval. + diff --git a/dist/changes-5.3.1 b/dist/changes-5.3.1 new file mode 100644 index 0000000..8913770 --- /dev/null +++ b/dist/changes-5.3.1 @@ -0,0 +1,57 @@ +Qt 5.3.1 is a bug-fix release. It maintains both forward and backward +compatibility (source and binary) with Qt 5.3.0. + +For more details, refer to the online documentation included in this +distribution. The documentation is also available online: + + http://qt-project.org/doc/qt-5.3 + +The Qt version 5.3 series is binary compatible with the 5.2.x series. +Applications compiled for 5.2 will continue to run with 5.3. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + + http://bugreports.qt-project.org/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + +**************************************************************************** +* General * +**************************************************************************** + +General Improvements +-------------------- + + - Added PLUGIN_CLASS_NAME variable to all plug-in based projects. This + enables the automatic static linking and deployment of this plug-ins. + + +**************************************************************************** +* Library * +**************************************************************************** + +QtPositioning +------------- + + - QGeoPositionInfoSource: + * WinRT backend added + + +**************************************************************************** +* Platform Specific Changes * +**************************************************************************** + +Android +------- + + - [QTBUG-39082] Fixed crash on Galaxy S4 when running satellite and position + updates at the same time. + +iOS +--- + + - [QTBUG-38770] Added "classname" entry to all qmldir files enabling QML + plug-ins when doing static builds on iOS. + diff --git a/dist/changes-5.3.2 b/dist/changes-5.3.2 new file mode 100644 index 0000000..b1981f6 --- /dev/null +++ b/dist/changes-5.3.2 @@ -0,0 +1,50 @@ +Qt 5.3.2 is a bug-fix release. It maintains both forward and backward +compatibility (source and binary) with Qt 5.3.0 and Qt 5.3.1. + +For more details, refer to the online documentation included in this +distribution. The documentation is also available online: + + http://qt-project.org/doc/qt-5.3 + +The Qt version 5.3 series is binary compatible with the 5.2.x series. +Applications compiled for 5.2 will continue to run with 5.3. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + + http://bugreports.qt-project.org/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + +**************************************************************************** +* Library * +**************************************************************************** + +QtPositioning +------------- + + - [QTBUG-39843] [iOS] Fixed link error of positioncl and positionpoll + plug-in. + + - [QTBUG-40198] Fixed symbol clash between sensor and position plug-in. + This happened when using static builds of Qt (e.g. on iOS) and the + application used QtSensors and QtPositioning at the same time. + + - Improved weatherinfo example to not hang on the "Loading weather data" + screen if the current QGeoPositionInfoSource instance returned an error + during its startup. + +**************************************************************************** +* Platform Specific Changes * +**************************************************************************** + +[iOS] + + - [QTBUG-38300] Fixed wrong value of QGeoPositionInfo attributes if those + attributes were not provided by the platforms CoreLocation framework. + +[Linux] + + - [QTBUG-40425] Fixed missing error report when failing to connect to GeoClue. + diff --git a/dist/changes-5.4.0 b/dist/changes-5.4.0 new file mode 100644 index 0000000..3a14766 --- /dev/null +++ b/dist/changes-5.4.0 @@ -0,0 +1,54 @@ +Qt 5.4 introduces many new features and improvements as well as bugfixes +over the 5.3.x series. For more details, refer to the online documentation +included in this distribution. The documentation is also available online: + + http://qt-project.org/doc/qt-5.4 + +The Qt version 5.4 series is binary compatible with the 5.3.x series. +Applications compiled for 5.3 will continue to run with 5.4. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + + http://bugreports.qt-project.org/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + +**************************************************************************** +* Library * +**************************************************************************** + +QtPositioning +------------- + + - Position: + * [QTBUG-39547] Added magneticVariation and magneticVariationValid + property to the QML Position type. + + - General: + * Weatherinfo end Flickr example improved. + + - QGeoCircle: + * [QTBUG-41447] Fixed contains() when rounding errors occur + + - QGeoCoordinate: + * [QTBUG-41739] Fixed toString() output in cases when rounding + of longitude/latitude is necessary. + +**************************************************************************** +* Platform Specific Changes * +**************************************************************************** + +Android +------- + + - [QTBUG-41873] Fixed wrong initialization of QGeoPositionInfoSource::error() + after class instantiation. + +iOS +--- + + - [QTBUG-41827] Fixed position retrieval on iOS 8. This was required due + to the new authorization scheme in CLLocationManager. + diff --git a/dist/changes-5.4.1 b/dist/changes-5.4.1 new file mode 100644 index 0000000..4876ab3 --- /dev/null +++ b/dist/changes-5.4.1 @@ -0,0 +1,29 @@ +Qt 5.4.1 is a bug-fix release. It maintains both forward and backward +compatibility (source and binary) with Qt 5.4.0. + +For more details, refer to the online documentation included in this +distribution. The documentation is also available online: + + http://doc.qt.io/qt-5.4 + +The Qt version 5.4 series is binary compatible with the 5.3.x series. +Applications compiled for 5.3 will continue to run with 5.4. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + + http://bugreports.qt.io/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + +**************************************************************************** +* Library * +**************************************************************************** + +QtPositioning +------------- + + - PositionSource: + * Fixed a case where an NMEA source file, which is integrated + using qrc, was not loaded. diff --git a/dist/changes-5.4.2 b/dist/changes-5.4.2 new file mode 100644 index 0000000..4f256ef --- /dev/null +++ b/dist/changes-5.4.2 @@ -0,0 +1,28 @@ +Qt 5.4.2 is a bug-fix release. It maintains both forward and backward +compatibility (source and binary) with Qt 5.4.0 and Qt 5.4.1. + +For more details, refer to the online documentation included in this +distribution. The documentation is also available online: + + http://doc.qt.io/qt-5.4 + +The Qt version 5.4 series is binary compatible with the 5.3.x series. +Applications compiled for 5.3 will continue to run with 5.4. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + + http://bugreports.qt.io/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + +**************************************************************************** +* Library * +**************************************************************************** + +QtPositioning +------------- + + - [QTBUG-44572] Fixed issue where the default timeout for position update + requests was not set on WinRT. diff --git a/dist/changes-5.5.0 b/dist/changes-5.5.0 new file mode 100644 index 0000000..737ce13 --- /dev/null +++ b/dist/changes-5.5.0 @@ -0,0 +1,40 @@ +Qt 5.5 introduces many new features and improvements as well as bugfixes +over the 5.4.x series. For more details, refer to the online documentation +included in this distribution. The documentation is also available online: + + http://doc.qt.io/qt-5/index.html + +The Qt version 5.5 series is binary compatible with the 5.4.x series. +Applications compiled for 5.4 will continue to run with 5.5. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + + https://bugreports.qt.io/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + +**************************************************************************** +* Library * +**************************************************************************** + +QtPositioning +------------- + + - Added QGeoShape::center() function + - Converted QGeoShape, QGeoCircle, QGeoRectangle & QGeoCoordinate to Q_GADGET. + It simplifies the integration of the above classes into QML as the extensive + QML value type wrapper conversion is implicitly done by Qt QML. The existing + custom wrappers were removed. + - Fixed Debug stream operators for QGeoAreaMonitorInfo, QGeoCoordinate, + QGeoPositionInfo, QGeoSatelliteInfo & QGeoShape following a QDebug related + change in Qt Base. + - [QTBUG-44663] Added updateTimeout() signal to QML PositionSource type + - [QTBUG-44983] Fixed broken build of qtlocation repo when using qmake -r + on OS X + +QtLocation +---------- + + - First Technology Preview release of this module diff --git a/dist/changes-5.5.1 b/dist/changes-5.5.1 new file mode 100644 index 0000000..8b2ce35 --- /dev/null +++ b/dist/changes-5.5.1 @@ -0,0 +1,54 @@ +Qt 5.5.1 is a bug-fix release. It maintains both forward and backward +compatibility (source and binary) with Qt 5.5.0. + +For more details, refer to the online documentation included in this +distribution. The documentation is also available online: + + http://doc.qt.io/qt-5.5/ + +The Qt version 5.5 series is binary compatible with the 5.4.x series. +Applications compiled for 5.4 will continue to run with 5.5. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + + http://bugreports.qt.io/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + +**************************************************************************** +* Library * +**************************************************************************** + +QtLocation +----------- + + - Fixed change signal emission for Map.activeMapType property. + - Improved places-list and places-map examples. + - [QTBUG-47188] Fixed incorrect naming of OSM plugin's parameter. + The documentation mandates the osm prefix which was not used in + the case of the geocoding.host, useragent and routing.host parameters. + The required osm.places.host parameter was not handled at all. + - [QTBUG-47322] Added support for zoom level 19 to OSM plugin. + - Fixed an issue where the incorrect prefetch algorithm was used for map + tile fetching. + +QtPositioning +------------- + + - Improved minor documentation issues. + +**************************************************************************** +* Platform Specific Changes * +**************************************************************************** + +Windows +------- + + - Added missing QtQuick.Controls import to mapviewer example. + +Linux/gcc +--------- + + - [QTBUG-47427] Fixed compile issue in geoclue plugin when using gcc 4.5. diff --git a/dist/changes-5.6.0 b/dist/changes-5.6.0 new file mode 100644 index 0000000..1402343 --- /dev/null +++ b/dist/changes-5.6.0 @@ -0,0 +1,69 @@ +Qt 5.6 introduces many new features and improvements as well as bugfixes +over the 5.5.x series. For more details, refer to the online documentation +included in this distribution. The documentation is also available online: + + http://doc.qt.io/qt-5/index.html + +The Qt version 5.6 series is binary compatible with the 5.5.x series. +Applications compiled for 5.5 will continue to run with 5.6. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + + https://bugreports.qt.io/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + +**************************************************************************** +* Library * +**************************************************************************** + +QtPositioning +------------- + + - Removed Blackberry 10 support. + - [QTBUG-40702] Removed dependency towards libgeoclue. The plugin uses the + GeoClue DBus interface. + - Enabled Position plugin for OS X. Previously only the plugin was only working + for iOS. + - [QTBUG-48082] Added QtSerialPort based NMEA position plugin for Windows. + - Improved and fixed the WinRT position backend. Various changes on the WinRT + platform caused the necessity for such and update. + - Fixed endless requests towards Android's LocationManager when stopUpdates() was not + called in pair with startUpdates(). + +QtLocation +---------- + + - First stable release of the Qt Location API. The QML API changed significantly + compared to the Qt 5.5 release. The changes are documented in the official + module documentation under "API changes". + - Improved the Flick and Pinch implementation for QML Map. + - [QTBUG-44809] Fixed tile version handling + - Fixed crash during Map.setVisibleRegion while no plugin has been set. + - Improved error reporting in map, geocoding and routing model APIs. + - QTBUG[36919] Added means to prevent stealing of mouse/touch grabs on map. + - Improved coordinate related animation handling. Previously an animation along + the longitude always used a shortest path direction. Now it is possible to set + the direction for the animation. + - [QTBUG-46147] Fixed crash in QML Map element. + - [QTBUG-44311] Fixed bouncing Map flick on zoom level 2. + - [QTBUG-47020] & [QTBUG-47019] Improved Mouse and keyboard integration of QML Map + - [QTBUG-46388] Fixed Pinch when no MouseArea overlaps QML Map element. + - Fixed various unit test. + - Fixed a variety of minor documentation issues. + - Fixed dysfunctional tile cache for OSM plugin due to the server delivering JPEG + file when PNG files were expected. + - [QTBUG-41187] Unified the default tile cache location on disk. + - Fixed crash in gesture area while receiving wheel events. + - Fixed route requests with excluded areas for HERE plugin. + - Added support for custom map background color. + - Improved Map rendering performance throughout the QML API. + - [QTBUG-49772] Fixed weatherinfo example due to missing appid handling for + openweatermap.org. + - [QTBUG-47292] Added ability to clear the map cache. + - [QTBUG-50060] Improved performance of QML MapPolyline. + - [QTBUG-50240] Fixed OSM routing to handle changed server status code for a + successful route retrieval. + - [QTBUG-50519] Fixed map in mapviewer example when displaying the minimap. diff --git a/dist/changes-5.6.1 b/dist/changes-5.6.1 new file mode 100644 index 0000000..cd579b6 --- /dev/null +++ b/dist/changes-5.6.1 @@ -0,0 +1,38 @@ +Qt 5.6.1 is a bug-fix release. It maintains both forward and backward +compatibility (source and binary) with Qt 5.6.0. + +For more details, refer to the online documentation included in this +distribution. The documentation is also available online: + + http://doc.qt.io/qt-5.6/ + +The Qt version 5.6 series is binary compatible with the 5.5.x series. +Applications compiled for 5.5 will continue to run with 5.6. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + + http://bugreports.qt.io/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + +**************************************************************************** +* Library * +**************************************************************************** + +QtLocation +---------- + + - Improved the example and class documentation + - Consolidated various qmake project files across the module + - [QTBUG-51541] Fixed compile issue on linux/gcc-4.8 when using C++98 + - Improved compression rate of various screenshots throughout the documentation + +QtPositioning +------------- + + - [QTBUG-38802] Added default capability (location) for WinRT + - [QTBUG-53059] Fixed crash on iOS/OS X due to incorrectly initialized member + variable in the positioning backend + diff --git a/dist/changes-5.6.2 b/dist/changes-5.6.2 new file mode 100644 index 0000000..9f2a6f9 --- /dev/null +++ b/dist/changes-5.6.2 @@ -0,0 +1,55 @@ +Qt 5.6.2 is a bug-fix release. It maintains both forward and backward +compatibility (source and binary) with Qt 5.6.0. + +For more details, refer to the online documentation included in this +distribution. The documentation is also available online: + + http://doc.qt.io/qt-5/index.html + +The Qt version 5.6 series is binary compatible with the 5.5.x series. +Applications compiled for 5.5 will continue to run with 5.6. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + + https://bugreports.qt.io/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + +**************************************************************************** +* Library * +**************************************************************************** + +QtLocation +---------- + + - Fixed autotests containing bugs not showing in the tests + - [QTBUG-31797][QTBUG-53455] Fixed the QtLocation autotest framework by + replacing waitForRendering() with waitForPolished() + - Disabled explicit example installation + - [QTBUG-52514] Fixed QML Map not working with repeaters + - [QTBUG-53128] Fixed QML Map items not updating on window resize + - [QTBUG-52075] Fixed QML Map items losing focus during fast dragging + - [QTBUG-52301] Prevented flickering upon MapItemView's model reset + - [QTBUG-54141] Fixed QML Map setVisibleRegion failing in some cases + - Fixed a potential memory leak in QGeoTiledMappingManagerEngine + - [QTBUG-19929] Prevented generating MapCircles with invalid radius + - [QTBUG-54599] Added support for fetching OSM provider information from + a remote repository + - [QTBUG-54337] Fixed bounding calculation for QGeoCircle + - Added a minimal QML Map usage example + - Added support for dynamically remove unavailable providers from the OSM + plugin + - [QTBUG-55081] Fixed accessing MapPolyline before it is added to a Map + - [QTBUG-54964] Fixed invisible copyright notice on Android using Holo theme + - Improved macOS documentation + - Fixed the geocoding in the MapViewer example + - [QTBUG-55371] Fixed OSM plugin geocoding feature + +QtPositioning +------------- + + - [QTBUG-54026] Reduced Android minimum update interval + - Improved Android 5.0+ compatibility + diff --git a/dist/changes-5.6.3 b/dist/changes-5.6.3 new file mode 100644 index 0000000..4709ff2 --- /dev/null +++ b/dist/changes-5.6.3 @@ -0,0 +1,38 @@ +Qt 5.6.3 is a bug-fix release. It maintains both forward and backward +compatibility (source and binary) with Qt 5.6.0. + +For more details, refer to the online documentation included in this +distribution. The documentation is also available online: + + http://doc.qt.io/qt-5/index.html + +The Qt version 5.6 series is binary compatible with the 5.5.x series. +Applications compiled for 5.5 will continue to run with 5.6. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + + https://bugreports.qt.io/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + +**************************************************************************** +* Library * +**************************************************************************** + +QtLocation +---------- + + - [QTBUG-56099] Updated HERE plugin base address + - [QTBUG-56119] Added OSRMv5 support to the osm plugin + - [QTBUG-57027] Fixed fitViewportToGeoShape on rectangles crossing the date + line. + - Updated HERE plugin geocoding endpoints + + +QtPositioning +------------- + + - [QTBUG-54844] Fixed error status for QGeoPositionInfoSourceAndroid + - [QTBUG-56623] WinRT backend now uses backend-provided timestamps diff --git a/dist/changes-5.7.0 b/dist/changes-5.7.0 new file mode 100644 index 0000000..d1fdb43 --- /dev/null +++ b/dist/changes-5.7.0 @@ -0,0 +1,53 @@ +Qt 5.7 introduces many new features and improvements as well as bugfixes +over the 5.6.x series. Also, there is a change in the licensing terms. +For more details, refer to the online documentation included in this +distribution. The documentation is also available online: + + http://doc.qt.io/qt-5/index.html + +The Qt version 5.7 series is binary compatible with the 5.6.x series. +Applications compiled for 5.6 will continue to run with 5.7. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + + https://bugreports.qt.io/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + +**************************************************************************** +* Important License Changes * +**************************************************************************** + + This module is no longer available under LGPLv2.1. The libraries are + now available under the following licenses: + * Commercial License + * GNU General Public License v2.0 (LICENSE.GPL2) and later + * GNU Lesser General Public License v3.0 (LICENSE.LGPL3) + + The tools are now available under the following licenses: + * Commercial License + * GNU General Public License 3.0 (LICENSE.GPL3) with exceptions + described in The Qt Company GPL Exception 1.0 (LICENSE.GPL3-EXCEPT) + +**************************************************************************** +* Library * +**************************************************************************** + +QtPositioning +------------- + + - Added support for tvOs to iOS/OS X positioning engine + - Added qHash() function for QGeoCoordinate + - Fixed negative QGeoCoordinate.azimuthTo results + - Added experimental support for GeoPosition API on Windows desktop + running Windows 8 or later + +QtLocation +---------- + + - [QTBUG-47025] Added option to hide map data copyright information + - Adjusted minimum map zoom level to prevent gray bounds. It prevents the map + from being smaller than the canvas size. + - Fixed several internal performance issues diff --git a/dist/changes-5.7.1 b/dist/changes-5.7.1 new file mode 100644 index 0000000..2d111d5 --- /dev/null +++ b/dist/changes-5.7.1 @@ -0,0 +1,45 @@ +Qt 5.7.1 is a bug-fix release. It maintains both forward and backward +compatibility (source and binary) with Qt 5.7.0. + +Qt 5.7.1 contains a merge from Qt 5.6.2 and all changes in Qt 5.6.2 are +also in Qt 5.7.1. For more see changes-5.6.2. + +For more details, refer to the online documentation included in this +distribution. The documentation is also available online: + +http://doc.qt.io/qt-5/index.html + +The Qt version 5.7 series is binary compatible with the 5.6.x series. +Applications compiled for 5.6 will continue to run with 5.7. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + +https://bugreports.qt.io/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + +**************************************************************************** +* Library * +**************************************************************************** + +QtLocation +---------- + +- [QTBUG-55535] Fixed map polygon not working correctly when zooming. +- [QTBUG-55964] Fixed rendering of polylines and polygons at the edge + of the map. +- [QTBUG-52610] Fixed incorrect map polyline drawing. +- [QTBUG-52076] Fixed crashes on tessellation of self-intersecting + GeoPolygons. +- [QTBUG-52030] Fixed that map's center and zoom were not initialized when + used in a layout. +- [QTBUG-52514] Fixed not working MapPolygon inside Repeater. +- [QTBUG-53128] Fixed map objects moving incorrectly on map resize. +- [QTBUG-52075] Fixed losing map item focus while dragging. + +QtPositioning +------------- + +- [QTBUG-54506] Fixed unneeded dependency on Activity for Android Platform. diff --git a/dist/changes-5.8.0 b/dist/changes-5.8.0 new file mode 100644 index 0000000..1c2a5b4 --- /dev/null +++ b/dist/changes-5.8.0 @@ -0,0 +1,70 @@ +Qt 5.8 introduces many new features and improvements as well as bugfixes +over the 5.7.x series. For more details, refer to the online documentation +included in this distribution. The documentation is also available online: + + http://doc.qt.io/qt-5/index.html + +The Qt version 5.8 series is binary compatible with the 5.7.x series. +Applications compiled for 5.7 will continue to run with 5.8. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + + https://bugreports.qt.io/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + +**************************************************************************** +* Library * +**************************************************************************** + +QtLocation +----------- + + - Added geoservices plugin to support ESRI mapping, geocoding and routing + services. + - Improved HERE geoservice plugin code base (improved warning) and converted + the HERE endpoints to newer versions (away from Nokia endpoints. At the same time + China specific URLs were removed. + - Improved Mapbox plugin to cater for better cache customization and + to support the standard box map modes. + - Renamed various internal C++ functions to improve code readability + - Added better high DPI support in the various geoservice provider plugins. + For more details see QTBUG-53318, QTBUG-48868 and QTBUG-36949. + - [QTBUG-45284] Added offline data support and improved cache handling in OSM + geoservice plugin + - Added routing support to Mapbox plugin + - Added server side provider support for QtLocation. This enables the quicker + selection of alternative providers by already deployed OSM applications in case + an OSM based default provider changes T&Cs. + - Removed QtSystemInfo dependency from QtLocation + - [QTBUG-56213] Adapted map related mouse/touch behavior following + changes to general mouse/touch handling in Qt QML + - Adapted QtLocation and QtPositioning to the Qt Lite related build system changes + - Marked QGeoMapPrivate as private export + - Added support for unitary tile caching. This enables use cases whereby the cache + size can be defined in number of tiles rather then bytes. + +**************************************************************************** +* Platform Specific Changes * +**************************************************************************** + +Android +------- + + - [QTBUG-55988] Added capability to ask for Location permissions at runtime. This is + required since Android 7.0. + +WinRT +----- + + - Fixed a name space related compile problem in the positioning plugin for WinRT + - Migrated the QtLocation rendering code to the new scenegraph changes enabling + Direct3D 12 + - [QTBUG-54474] Added GeolocationAccessStatus existence check + - [QTBUG-56340] Added direction information to position updates + - [QTBUG-56623] Changed positioning plugin to use the platforms positioning time + stamp rather than a programmatically acquired time stamp at the time of the callback. + Effectively, this forwards time stamps from the GPS satellite to the user application. + - [QTBUG-53925] Enabled WinRT positioning backend for MSVC2013/2015 diff --git a/dist/changes-5.9.0 b/dist/changes-5.9.0 new file mode 100644 index 0000000..46faf68 --- /dev/null +++ b/dist/changes-5.9.0 @@ -0,0 +1,131 @@ +Qt 5.9 introduces many new features and improvements as well as bugfixes +over the 5.8.x series. For more details, refer to the online documentation +included in this distribution. The documentation is also available online: + +http://doc.qt.io/qt-5/index.html + +The Qt version 5.9 series is binary compatible with the 5.8.x series. +Applications compiled for 5.8 will continue to run with 5.9. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + +https://bugreports.qt.io/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + +**************************************************************************** +* General * +**************************************************************************** + +Third-Party Code +---------------- + + - Added Mapbox GL Native as a third-party component to + src/3rdparty/mapbox-gl-native. + +**************************************************************************** +* Library * +**************************************************************************** + +QtLocation +----------- + + - Added boundingGeoRectangle to QGeoShape to return a geographical bounding + box in form of a QGeoRectangle. + - Added QGeoPath as a new geo shape. + - Added a new QML type, MapParameter, to control plugin-specific map features + at runtime. + - Deprecated QGeoShape::extendShape. + - Renamed the QGeoProjection class into QWebMercator. + - Added new private API, QGeoProjection, for the coordinate <-> screen projection + conversion, removing it from QGeoTiledMapScene. + - Moved CacheAreas enum from QGeoFileTileCache into QAbstractGeoTileCache. + - Map.zoomLevel now always refers to a normalized tile size of 256x256 pixels. + Conversions to/from different tile sizes are performed internally by QGeoMap. + - Added clipping support to Clip2Tri 3rd party library through clipper, to protect Qt from + clipper invocations that throw. + - Updated clipper lib to version 6.4. + - QGeoProjectionWebMercator now uses a projection matrix to project to item position. + - [QTBUG-58124] Fixed a bug on destruction of the OSM plugin causing segfault. + - Added rotation, tilt and field of view properties to QDeclarativeGeoMap. + - Changed map items to be always positioned/wrapped based on their geo left bound. + - Changed the Map items opacity ramp values from 2.0 -> 3.0 to 1.5 -> 2.5. + - QDeclarativeGeoMap::setVisibleRegion now handles QGeoPath as well. + - Map Items geo data is now managed by a contained QGeoShape, which also handles geographical + transformations such as translations. + - Moved the declarative implementation from imports/ into location/declarativemaps and + location/declarativeplaces, privately exporting the classes. + - QQuickGeoMapGestureArea now correctly works with tilted/rotated maps. + - Added two new gestures to QQuickGeoMapGestureArea, two fingers rotation and two fingers tilting. + - Added the infrastructure to allow a QGeoMap to be responsible for drawing map items. + - Added a new QML type, MapCopyrightNotice, backed by the now exposed QDeclarativeGeoMapCopyrightNotice. + - MapCopyrightNotice can now be styled using CSS. + - Added a new plugin, MapboxGL, based on the mapbox-gl-native 3rd party library. + - The MapboxGL plugin now ships with a built-in development token. + - Added a new QML type, MapItemGroup, to group multiple map items in a new meta map item. + - Added the new mapItemOpacity method to QGeoMapItemBase, to account for the opacity of a MapItemGroup too. + - Added the new fitViewportToVisibleMapItems method to QDeclarativeGeoMap. + - Adapted mapviewer example to enable changing tilting/rotation/FoV. + - QGeoTiledMap now uses anisotropic filtering when available. + - Unblacklisted some previously blacklisted autotests now fixed in qtdeclarative. + - Blacklisted flick autotests on windows due to platform-induced flakiness. + - Added support to the MapboxGL plugin to natively renders map polylines, polygons and rectangles. + - Added support to the MapboxGL plugin to render both via FBO and via QSGRenderNode. + - QGeoCameraCapabilities are now specific to a QGeoMapType, and not any longer fixed to a plugin. + - DevicePixelRatio is now considered before enabling mipmapping so that mipmapping remains off if + tiles do not need to be minificated. + - Changed QGeoTiledMap default FoV from 90 to 45 degrees. + - [QTBUG-59417] Fixed QGeoTiledMapScene viewing frustum calculation. + - Added a new mapReady signal to QDeclarativeGeoMap to notify when the map becomes ready. + - Added ICU support to MapboxGL plugin, depending on its availability. + - [QTBUG-58821] Removed dependency on QtWidgets. + - Added a new plugin, itemsoverlay, to provide a transparent canvas to add only map items. + - MapQuickItem now correctly tilts and rotates when the zoomLevel property is set. + - [QTBUG-59259] Increased QGeoCoordinate debug operator precision. + - Improved the mapviewer example, also using QtQuick.Controls2 sliders. + - QtPositioning now also compiler-optimized when building in release. + - [QTBUG-59503] Flick autotests skipped on windows. + - [QTBUG-59479] Mercator-projected qgeocoordinates in map items are now cached. + - Removed pathPropertyChanged() from Polyline,Polygon. + - [QTBUG-23659] Enabled overzooming tiles in qgeotiledmapscene. + - [QTBUG-59416] keepTouchGrab now considered when handing mouse events in QDeclarativeGeoMap. + - Tile formats now proactively converted to ARGB32_Premultiplied. + - Added possibility to disable prefetching. + - Added parameter to control prefetching in tile-based geoservice plugins. + - Disabled warnings in third-party code. + - Improved flicking behavior of QQuickGeoMapGestureArea. + - [QTBUG-60021] Map update now triggered after initialization. + - QGeoMap pointers now protected with QPointer. + - QtLocation now marked as warning-free. + - [QTBUG-58801] Fixed copyright notice not showing before map type is changed. + - Added overzoomEnabled to QGeoCameraCapabilities. + - Various fixes for building with various QtLite configurations. + - QGeoTileFetcher::handleReply now virtual. + - [QTBUG-60266] declarative_ui autotests disabled for boot2qt. + + +**************************************************************************** +* Platform Specific Changes * +**************************************************************************** + +iOS +--- + + - [QTBUG-52014][QTBUG-59275] Allow background updates if such capability + is present in infoDict. + + +WinRT +----- + + - [QTBUG-57288] Remove support for WinRT 8.1 and Windows Phone 8.1. + - [QTBUG-60299] Added error handling for GeoPositionInfoSource creation. + + +Android +------- + + - [QTBUG-59010] Added guard against unprotected javaVM pointer usage. + - [QTBUG-59158] UTC flag for Android position timestamps now set. diff --git a/dist/changes-5.9.1 b/dist/changes-5.9.1 new file mode 100644 index 0000000..58b4ac7 --- /dev/null +++ b/dist/changes-5.9.1 @@ -0,0 +1,43 @@ +Qt 5.9.1 is a bug-fix release. It maintains both forward and backward +compatibility (source and binary) with Qt 5.9.0. + +For more details, refer to the online documentation included in this +distribution. The documentation is also available online: + +http://doc.qt.io/qt-5/index.html + +The Qt version 5.9 series is binary compatible with the 5.8.x series. +Applications compiled for 5.8 will continue to run with 5.9. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + +https://bugreports.qt.io/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + +**************************************************************************** +* Library * +**************************************************************************** + + - [QTBUG-60007] Fixed plugin resources not loading on static builds + - [QTBUG-60881] Fixed building on configurations without OpenGL + - Fixed an incorrect condition in QDeclarativeGeoMap::geometryChanged() + causing a crash in some scenarios + - MapItems can now be set to render under specific style layers with the + MapboxGL plugin + - [QTBUG-60821] Added detailed 3rd party attributions for the 3rd party + mapbox-gl-native library + - [QTBUG-61070] MapQuickItem's setCoordinate now checks for coordinate's + validity. + - [QTBUG-61087] OpenGL is now a requirement to build the MapboxGL plugin + - LocationSingleton now allows to create a qgeopath from a list of coordinates, + and not only empty qgeopaths + - Updated QtLocation qmltypes + - [QTBUG-61266] Updated QtPositioning qmltypes, adding 5.9 version + - [QTBUG-57690] Fixed Map.visibleRegion in the case that all the map is visible + - Various documentation fixes + - The MapboxGL plugin now uses the MapItem's objectName (if present) when creating + a mapbox layer name for it + diff --git a/dist/changes-5.9.2 b/dist/changes-5.9.2 new file mode 100644 index 0000000..ac6321d --- /dev/null +++ b/dist/changes-5.9.2 @@ -0,0 +1,56 @@ +Qt 5.9.2 is a bug-fix release. It maintains both forward and backward +compatibility (source and binary) with Qt 5.9.0. + +For more details, refer to the online documentation included in this +distribution. The documentation is also available online: + +http://doc.qt.io/qt-5/index.html + +The Qt version 5.9 series is binary compatible with the 5.8.x series. +Applications compiled for 5.8 will continue to run with 5.9. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + +https://bugreports.qt.io/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + +**************************************************************************** +* Qt 5.9.2 Changes * +**************************************************************************** + +QtLocation +---------- + - [QTBUG-61070] mapQuickItems aren't drawn any longer if coordinate is invalid + - [QTBUG-61813] Fixed Map.toCoordinate always clamping y values to 0 + - [QTBUG-61727] Fixed dragging items out of map bounds + - [QTBUG-62098] Fixed plugins build dependency + - [QTBUG-62122] Fixed potential memleak on QDeclarativeGeoMap destruction + - [QTBUG-62154] Fixed MapCircle artifacts with small radiuses + - Restored usage of setProperty on Map.fitViewportToGeoShape + - [QTBUG-57690] Fixed visible region computation in QGeoProjectionWebMercator + - Fixed QDeclarativeGeoMap::populateMap duplicating items + - Fixed GeocodeModel not autoUpdating if plugin attaches late + - [QTBUG-62075] Fixed PluginParameter not working with script as property values + - Added a configure feature for each geoservice plugin + - Fixed file tile cache not honoring disk cache size of 0 + - [QTBUG-63124] Fixed wrong clipper dependency due to incorrect qmake syntax + - [QTBUG-63251] Fixed Map.fromCoordinate returning wrong values during tilting + + - OSM + * [QTBUG-61637] Fixed OSM plugin not working with providersrepository.disabled = true + * [QTBUG-63033] Fixed disabling redirection for providers that have no local fallback + + - MapboxGL: + * [QTBUG-61442] Fixed MapParameter dynamic usage + * [QTBUG-62454] Bumped Mapbox GL to v1.1.0 to prevent a crash + * [QTBUG-62861] Fixed broken native text rendering with Mapbox GL plugin + * [QTBUG-58869] Fixed Mapbox GL not rendering circles natively + * Fixed Mapbox GL plugin not respecting MapItem visibility and opacity + + +QtPositioning +------------- + - [QTBUG-62778] Fixed PositionSource never turning active on Android in some cases diff --git a/dist/changes-5.9.3 b/dist/changes-5.9.3 new file mode 100644 index 0000000..98a9b30 --- /dev/null +++ b/dist/changes-5.9.3 @@ -0,0 +1,41 @@ +Qt 5.9.3 is a bug-fix release. It maintains both forward and backward +compatibility (source and binary) with Qt 5.9.0. + +For more details, refer to the online documentation included in this +distribution. The documentation is also available online: + +http://doc.qt.io/qt-5/index.html + +The Qt version 5.9 series is binary compatible with the 5.8.x series. +Applications compiled for 5.8 will continue to run with 5.9. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + +https://bugreports.qt.io/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + +**************************************************************************** +* Qt 5.9.3 Changes * +**************************************************************************** + +QtLocation +---------- + + - [QTBUG-63374] Fixed MapBoxGL crashing when no OpenGLContext can be created + - Updated all FDL and BSD license header throughout the module + - [QTBUG-62417] Forced MapBoxGL to only build on Windows when Qt is build + with Angle + - [QTBUG-63926] Added check to MapBoxGL handling corner cases of Polygon + placement + - [QTBUG-63928] Fixed missing consideration of alpha channel when + setting DeclarativeRectangleMapItem opacity. + +QtPositioning +------------- + + - Updated all FDL and BSD license header throughout the module + - Added missing null check to Android positioning plug-in + diff --git a/dist/changes-5.9.4 b/dist/changes-5.9.4 new file mode 100644 index 0000000..6393129 --- /dev/null +++ b/dist/changes-5.9.4 @@ -0,0 +1,31 @@ +Qt 5.9.4 is a bug-fix release. It maintains both forward and backward +compatibility (source and binary) with Qt 5.9.0. + +For more details, refer to the online documentation included in this +distribution. The documentation is also available online: + +http://doc.qt.io/qt-5/index.html + +The Qt version 5.9 series is binary compatible with the 5.8.x series. +Applications compiled for 5.8 will continue to run with 5.9. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + +https://bugreports.qt.io/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + +**************************************************************************** +* Qt 5.9.4 Changes * +**************************************************************************** + +QtLocation +---------- + + - [QTBUG-63013] Upgraded Mapbox GL to fix SQLite query binding. + - [QTBUG-58589] Added plugin dependencies to the mapviewer example. + - [QTBUG-64632] Upgraded Mapbox GL to fix remove GLES limitations on Windows. + This upgrade also fixed building Mapbox GL with MinGW. + - [QTBUG-57147] Fixed license headers. diff --git a/examples/examples.pro b/examples/examples.pro new file mode 100644 index 0000000..da770da --- /dev/null +++ b/examples/examples.pro @@ -0,0 +1,7 @@ +TEMPLATE = subdirs + +qtHaveModule(positioning) { + SUBDIRS += positioning + + qtHaveModule(location): SUBDIRS += location +} diff --git a/examples/location/geojson_viewer/GeoJsonDelegate.qml b/examples/location/geojson_viewer/GeoJsonDelegate.qml new file mode 100644 index 0000000..afbafe9 --- /dev/null +++ b/examples/location/geojson_viewer/GeoJsonDelegate.qml @@ -0,0 +1,170 @@ +/**************************************************************************** +** +** Copyright (C) 2019 Julian Sherollari +** Copyright (C) 2019 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.12 +import QtPositioning 5.12 +import QtLocation 5.15 +import Qt.labs.qmlmodels 1.0 + +DelegateChooser { + id: dc + role: "type" + property color defaultColor: "grey" + property real defaultOpacity: 0.6 + property bool openGLBackends: false + + DelegateChoice { + roleValue: "Point" + delegate: MapCircle { + property string geojsonType: "Point" + property var props: modelData.properties + geoShape: modelData.data + radius: 20*1000 + border.width: 3 + opacity: dc.defaultOpacity + /* The expression below is equivalent to: + ((props !== undefined && props["color"] !== undefined) ? props["color"] : + ((parent && parent.props !== undefined && parent.props["color"] !== undefined) ? parent.props["color"] : dc.defaultColor)) + */ + color: (props && props.color) || (parent && parent.props && parent.props.color) || dc.defaultColor + } + } + + DelegateChoice { + roleValue: "LineString" + delegate: MapPolyline { + property string geojsonType: "LineString" + property var props: modelData.properties + backend: (dc.openGLBackends) ? MapPolyline.OpenGLExtruded : MapPolyline.Software + geoShape: modelData.data + line.width: 4 + opacity: dc.defaultOpacity + line.color: (props && props.color) || (parent && parent.props && parent.props.color) || dc.defaultColor + } + } + + DelegateChoice { + roleValue: "Polygon" + delegate: MapPolygon { + property string geojsonType: "Polygon" + property var props: modelData.properties + geoShape: modelData.data + opacity: dc.defaultOpacity + color: (props && props.color) || (parent && parent.props && parent.props.color) || dc.defaultColor + border.width: 4 + border.color: 'black' + backend: (dc.openGLBackends) ? MapPolygon.OpenGL : MapPolygon.Software + MouseArea { + anchors.fill: parent + onClicked: { + if (props !== undefined) + console.log(props.name) + else if (parent.parent.geojsonType == "MultiPolygon") + console.log(parent.parent.props.name) + else + console.log("NO NAME!", props) + } + } + } + } + + DelegateChoice { + roleValue: "MultiPoint" + delegate: MapItemView { + property string geojsonType: "MultiPoint" + property var props: modelData.properties + model: modelData.data + delegate: dc + } + } + + DelegateChoice { + roleValue: "MultiLineString" + delegate: MapItemView { + property string geojsonType: "MultiLineString" + property var props: modelData.properties + model: modelData.data + delegate: dc + } + } + + DelegateChoice { + roleValue: "MultiPolygon" + delegate: MapItemView { + property string geojsonType: "MultiPolygon" + property var props: modelData.properties + model: modelData.data + delegate: dc + } + } + + DelegateChoice { + roleValue: "GeometryCollection" + delegate: MapItemView { + property string geojsonType: "GeometryCollection" + property var props: modelData.properties + model: modelData.data + delegate: dc + } + } + + // Features are explicitly not generated by the parser, but converted straight to their content + the properties. + + DelegateChoice { + roleValue: "FeatureCollection" + delegate: MapItemView { + property string geojsonType: "FeatureCollection" + property var props: modelData.properties + model: modelData.data + delegate: dc + } + } +} diff --git a/examples/location/geojson_viewer/GeoJsonDelegateMapObject.qml b/examples/location/geojson_viewer/GeoJsonDelegateMapObject.qml new file mode 100644 index 0000000..d1a144c --- /dev/null +++ b/examples/location/geojson_viewer/GeoJsonDelegateMapObject.qml @@ -0,0 +1,152 @@ +/**************************************************************************** +** +** Copyright (C) 2020 Paolo Angelelli +** Copyright (C) 2020 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.12 +import QtPositioning 5.12 +import Qt.labs.location 1.0 +import Qt.labs.qmlmodels 1.0 + +DelegateChooser { + id: dc + role: "type" + property color defaultColor: "grey" + + DelegateChoice { + roleValue: "Point" + delegate: MapCircleObject { + property string geojsonType: "Point" + property var props: modelData.properties + geoShape: modelData.data + radius: 20*1000 + border.width: 3 + /* The expression below is equivalent to: + ((props !== undefined && props["color"] !== undefined) ? props["color"] : + ((parent && parent.props !== undefined && parent.props["color"] !== undefined) ? parent.props["color"] : dc.defaultColor)) + */ + color: (props && props.color) || (parent && parent.props && parent.props.color) || dc.defaultColor + } + } + + DelegateChoice { + roleValue: "LineString" + delegate: MapPolylineObject { + property string geojsonType: "LineString" + property var props: modelData.properties + geoShape: modelData.data + line.width: 4 + line.color: (props && props.color) || (parent && parent.props && parent.props.color) || dc.defaultColor + } + } + + DelegateChoice { + roleValue: "Polygon" + delegate: MapPolygonObject { + property string geojsonType: "Polygon" + property var props: modelData.properties + geoShape: modelData.data + color: (props && props.color) || (parent && parent.props && parent.props.color) || dc.defaultColor + border.width: 4 + border.color: 'black' + } + } + + DelegateChoice { + roleValue: "MultiPoint" + delegate: MapObjectView { + property string geojsonType: "MultiPoint" + property var props: modelData.properties + model: modelData.data + delegate: dc + } + } + + DelegateChoice { + roleValue: "MultiLineString" + delegate: MapObjectView { + property string geojsonType: "MultiLineString" + property var props: modelData.properties + model: modelData.data + delegate: dc + } + } + + DelegateChoice { + roleValue: "MultiPolygon" + delegate: MapObjectView { + property string geojsonType: "MultiPolygon" + property var props: modelData.properties + model: modelData.data + delegate: dc + } + } + + DelegateChoice { + roleValue: "GeometryCollection" + delegate: MapObjectView { + property string geojsonType: "GeometryCollection" + property var props: modelData.properties + model: modelData.data + delegate: dc + } + } + + // Features are explicitly not generated by the parser, but converted straight to their content + the properties. + + DelegateChoice { + roleValue: "FeatureCollection" + delegate: MapObjectView { + property string geojsonType: "FeatureCollection" + property var props: modelData.properties + model: modelData.data + delegate: dc + } + } +} diff --git a/examples/location/geojson_viewer/data/01-point.json b/examples/location/geojson_viewer/data/01-point.json new file mode 100644 index 0000000..50e4fe0 --- /dev/null +++ b/examples/location/geojson_viewer/data/01-point.json @@ -0,0 +1,4 @@ +{ + "type" : "Point", + "coordinates" : [11,60] +} diff --git a/examples/location/geojson_viewer/data/02-linestring.json b/examples/location/geojson_viewer/data/02-linestring.json new file mode 100644 index 0000000..11db942 --- /dev/null +++ b/examples/location/geojson_viewer/data/02-linestring.json @@ -0,0 +1,7 @@ +{ + "type" : "LineString", + "coordinates" : [ + [13.5, 43], + [10.73, 59.92] + ] +} diff --git a/examples/location/geojson_viewer/data/03-multipoint.json b/examples/location/geojson_viewer/data/03-multipoint.json new file mode 100644 index 0000000..d4e74ee --- /dev/null +++ b/examples/location/geojson_viewer/data/03-multipoint.json @@ -0,0 +1,8 @@ +{ + "type" : "MultiPoint", + "coordinates" : [ + [11,60], + [5.5,60.3], + [5.7,58.90] + ] +} diff --git a/examples/location/geojson_viewer/data/04-polygon.json b/examples/location/geojson_viewer/data/04-polygon.json new file mode 100644 index 0000000..e3c4541 --- /dev/null +++ b/examples/location/geojson_viewer/data/04-polygon.json @@ -0,0 +1,12 @@ +{ + "type" : "Polygon", + "coordinates" : [ + [ + [17.13, 51.11], + [30.54, 50.42], + [26.70, 58.36], + [17.13, 51.11] + ] + ], + "bbox" : [50, -50, 10, -10] +} diff --git a/examples/location/geojson_viewer/data/05-multilinestring.json b/examples/location/geojson_viewer/data/05-multilinestring.json new file mode 100644 index 0000000..cbd31b6 --- /dev/null +++ b/examples/location/geojson_viewer/data/05-multilinestring.json @@ -0,0 +1,7 @@ +{ + "type" : "MultiLineString", + "coordinates" : [ + [[13.5, 43], [10.73, 59.92]], + [[9.15, 45], [-3.15, 58.90]] + ] +} diff --git a/examples/location/geojson_viewer/data/06-multipolygon.json b/examples/location/geojson_viewer/data/06-multipolygon.json new file mode 100644 index 0000000..b006eae --- /dev/null +++ b/examples/location/geojson_viewer/data/06-multipolygon.json @@ -0,0 +1,21 @@ +{ + "type" : "MultiPolygon", + "coordinates" : [ + [ + [ + [17.13, 51.11], + [30.54, 50.42], + [26.74, 58.36], + [17.13, 51.11] + ] + ], + [ + [ + [19.84, 41.33], + [30.45, 49.26], + [17.07, 50.10], + [19.84, 41.33] + ] + ] + ] +} diff --git a/examples/location/geojson_viewer/data/07-geometrycollection.json b/examples/location/geojson_viewer/data/07-geometrycollection.json new file mode 100644 index 0000000..962e617 --- /dev/null +++ b/examples/location/geojson_viewer/data/07-geometrycollection.json @@ -0,0 +1,39 @@ +{ + "type" : "GeometryCollection", + "geometries" : [ + { + "type" : "MultiPoint", + "coordinates" : [ + [11,60], [5.5,60.3], [5.7,58.90] + ] + }, + { + "type" : "MultiLineString", + "coordinates": [ + [[13.5, 43], [10.73, 59.92]], + [[9.15, 45], [-3.15, 58.90]] + ] + }, + { + "type" : "MultiPolygon", + "coordinates" : [ + [ + [ + [17.13, 51.11], + [30.54, 50.42], + [26.74, 58.36], + [17.13, 51.11] + ] + ], + [ + [ + [19.84, 41.33], + [30.45, 49.26], + [17.07, 50.10], + [19.84, 41.33] + ] + ] + ] + } + ] +} diff --git a/examples/location/geojson_viewer/data/08-feature.json b/examples/location/geojson_viewer/data/08-feature.json new file mode 100644 index 0000000..5d225ac --- /dev/null +++ b/examples/location/geojson_viewer/data/08-feature.json @@ -0,0 +1,27 @@ +{ + "type" : "Feature", + "id" : "Poly", + "properties" : { + "name" : "Poly", + "text" : "This is a Feature with a Polygon", + "color" : "limegreen" + }, + "geometry" : { + "type" : "Polygon", + "coordinates" : [ + [ + [17.13, 51.11], + [30.54, 50.42], + [26.70, 58.36], + [17.13, 51.11] + ], + [ + [23.46, 54.36], + [20.52, 51.91], + [28.25, 51.50], + [26.80, 54.36], + [23.46, 54.36] + ] + ] + } +} diff --git a/examples/location/geojson_viewer/data/09-featurecollection.json b/examples/location/geojson_viewer/data/09-featurecollection.json new file mode 100644 index 0000000..e3e9a2d --- /dev/null +++ b/examples/location/geojson_viewer/data/09-featurecollection.json @@ -0,0 +1,48 @@ +{ + "type" : "FeatureCollection", + "properties" : { + "color" : "crimson" + }, + "features" : [ + { + "type" : "Feature", + "id" : "Poly", + "properties" : { + "text" : "This is a Feature with a Polygon" + }, + "geometry" : { + "type" : "Polygon", + "coordinates" : [ + [ + [17.13, 51.11], + [30.54, 50.42], + [26.70, 58.36], + [17.13, 51.11] + ], + [ + [23.46, 54.36], + [20.52, 51.91], + [28.25, 51.50], + [26.80, 54.36], + [23.46, 54.36] + ] + ] + } + }, + { + "type" : "Feature", + "id" : "MultiLine", + "properties" : { + "text" : "This is a Feature with a MultiLineString", + "color" : "deepskyblue" + }, + "geometry" : { + "type" : "MultiLineString", + "coordinates" : [ + [[13.5, 43], [10.73, 59.92]], + [[9.15, 45], [-3.15, 58.90]] + ] + } + } + ] +} diff --git a/examples/location/geojson_viewer/data/10-countries.json b/examples/location/geojson_viewer/data/10-countries.json new file mode 100644 index 0000000..ece5ace --- /dev/null +++ b/examples/location/geojson_viewer/data/10-countries.json @@ -0,0 +1,45891 @@ +{ + "type":"FeatureCollection", + "features":[ + { + "type":"Feature", + "id":"AFG", + "properties":{ + "name":"Afghanistan" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 61.210817, + 35.650072 + ], + [ + 62.230651, + 35.270664 + ], + [ + 62.984662, + 35.404041 + ], + [ + 63.193538, + 35.857166 + ], + [ + 63.982896, + 36.007957 + ], + [ + 64.546479, + 36.312073 + ], + [ + 64.746105, + 37.111818 + ], + [ + 65.588948, + 37.305217 + ], + [ + 65.745631, + 37.661164 + ], + [ + 66.217385, + 37.39379 + ], + [ + 66.518607, + 37.362784 + ], + [ + 67.075782, + 37.356144 + ], + [ + 67.83, + 37.144994 + ], + [ + 68.135562, + 37.023115 + ], + [ + 68.859446, + 37.344336 + ], + [ + 69.196273, + 37.151144 + ], + [ + 69.518785, + 37.608997 + ], + [ + 70.116578, + 37.588223 + ], + [ + 70.270574, + 37.735165 + ], + [ + 70.376304, + 38.138396 + ], + [ + 70.806821, + 38.486282 + ], + [ + 71.348131, + 38.258905 + ], + [ + 71.239404, + 37.953265 + ], + [ + 71.541918, + 37.905774 + ], + [ + 71.448693, + 37.065645 + ], + [ + 71.844638, + 36.738171 + ], + [ + 72.193041, + 36.948288 + ], + [ + 72.63689, + 37.047558 + ], + [ + 73.260056, + 37.495257 + ], + [ + 73.948696, + 37.421566 + ], + [ + 74.980002, + 37.41999 + ], + [ + 75.158028, + 37.133031 + ], + [ + 74.575893, + 37.020841 + ], + [ + 74.067552, + 36.836176 + ], + [ + 72.920025, + 36.720007 + ], + [ + 71.846292, + 36.509942 + ], + [ + 71.262348, + 36.074388 + ], + [ + 71.498768, + 35.650563 + ], + [ + 71.613076, + 35.153203 + ], + [ + 71.115019, + 34.733126 + ], + [ + 71.156773, + 34.348911 + ], + [ + 70.881803, + 33.988856 + ], + [ + 69.930543, + 34.02012 + ], + [ + 70.323594, + 33.358533 + ], + [ + 69.687147, + 33.105499 + ], + [ + 69.262522, + 32.501944 + ], + [ + 69.317764, + 31.901412 + ], + [ + 68.926677, + 31.620189 + ], + [ + 68.556932, + 31.71331 + ], + [ + 67.792689, + 31.58293 + ], + [ + 67.683394, + 31.303154 + ], + [ + 66.938891, + 31.304911 + ], + [ + 66.381458, + 30.738899 + ], + [ + 66.346473, + 29.887943 + ], + [ + 65.046862, + 29.472181 + ], + [ + 64.350419, + 29.560031 + ], + [ + 64.148002, + 29.340819 + ], + [ + 63.550261, + 29.468331 + ], + [ + 62.549857, + 29.318572 + ], + [ + 60.874248, + 29.829239 + ], + [ + 61.781222, + 30.73585 + ], + [ + 61.699314, + 31.379506 + ], + [ + 60.941945, + 31.548075 + ], + [ + 60.863655, + 32.18292 + ], + [ + 60.536078, + 32.981269 + ], + [ + 60.9637, + 33.528832 + ], + [ + 60.52843, + 33.676446 + ], + [ + 60.803193, + 34.404102 + ], + [ + 61.210817, + 35.650072 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"AGO", + "properties":{ + "name":"Angola" + }, + "geometry":{ + "type":"MultiPolygon", + "coordinates":[ + [ + [ + [ + 16.326528, + -5.87747 + ], + [ + 16.57318, + -6.622645 + ], + [ + 16.860191, + -7.222298 + ], + [ + 17.089996, + -7.545689 + ], + [ + 17.47297, + -8.068551 + ], + [ + 18.134222, + -7.987678 + ], + [ + 18.464176, + -7.847014 + ], + [ + 19.016752, + -7.988246 + ], + [ + 19.166613, + -7.738184 + ], + [ + 19.417502, + -7.155429 + ], + [ + 20.037723, + -7.116361 + ], + [ + 20.091622, + -6.94309 + ], + [ + 20.601823, + -6.939318 + ], + [ + 20.514748, + -7.299606 + ], + [ + 21.728111, + -7.290872 + ], + [ + 21.746456, + -7.920085 + ], + [ + 21.949131, + -8.305901 + ], + [ + 21.801801, + -8.908707 + ], + [ + 21.875182, + -9.523708 + ], + [ + 22.208753, + -9.894796 + ], + [ + 22.155268, + -11.084801 + ], + [ + 22.402798, + -10.993075 + ], + [ + 22.837345, + -11.017622 + ], + [ + 23.456791, + -10.867863 + ], + [ + 23.912215, + -10.926826 + ], + [ + 24.017894, + -11.237298 + ], + [ + 23.904154, + -11.722282 + ], + [ + 24.079905, + -12.191297 + ], + [ + 23.930922, + -12.565848 + ], + [ + 24.016137, + -12.911046 + ], + [ + 21.933886, + -12.898437 + ], + [ + 21.887843, + -16.08031 + ], + [ + 22.562478, + -16.898451 + ], + [ + 23.215048, + -17.523116 + ], + [ + 21.377176, + -17.930636 + ], + [ + 18.956187, + -17.789095 + ], + [ + 18.263309, + -17.309951 + ], + [ + 14.209707, + -17.353101 + ], + [ + 14.058501, + -17.423381 + ], + [ + 13.462362, + -16.971212 + ], + [ + 12.814081, + -16.941343 + ], + [ + 12.215461, + -17.111668 + ], + [ + 11.734199, + -17.301889 + ], + [ + 11.640096, + -16.673142 + ], + [ + 11.778537, + -15.793816 + ], + [ + 12.123581, + -14.878316 + ], + [ + 12.175619, + -14.449144 + ], + [ + 12.500095, + -13.5477 + ], + [ + 12.738479, + -13.137906 + ], + [ + 13.312914, + -12.48363 + ], + [ + 13.633721, + -12.038645 + ], + [ + 13.738728, + -11.297863 + ], + [ + 13.686379, + -10.731076 + ], + [ + 13.387328, + -10.373578 + ], + [ + 13.120988, + -9.766897 + ], + [ + 12.87537, + -9.166934 + ], + [ + 12.929061, + -8.959091 + ], + [ + 13.236433, + -8.562629 + ], + [ + 12.93304, + -7.596539 + ], + [ + 12.728298, + -6.927122 + ], + [ + 12.227347, + -6.294448 + ], + [ + 12.322432, + -6.100092 + ], + [ + 12.735171, + -5.965682 + ], + [ + 13.024869, + -5.984389 + ], + [ + 13.375597, + -5.864241 + ], + [ + 16.326528, + -5.87747 + ] + ] + ], + [ + [ + [ + 12.436688, + -5.684304 + ], + [ + 12.182337, + -5.789931 + ], + [ + 11.914963, + -5.037987 + ], + [ + 12.318608, + -4.60623 + ], + [ + 12.62076, + -4.438023 + ], + [ + 12.995517, + -4.781103 + ], + [ + 12.631612, + -4.991271 + ], + [ + 12.468004, + -5.248362 + ], + [ + 12.436688, + -5.684304 + ] + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"ALB", + "properties":{ + "name":"Albania" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 20.590247, + 41.855404 + ], + [ + 20.463175, + 41.515089 + ], + [ + 20.605182, + 41.086226 + ], + [ + 21.02004, + 40.842727 + ], + [ + 20.99999, + 40.580004 + ], + [ + 20.674997, + 40.435 + ], + [ + 20.615, + 40.110007 + ], + [ + 20.150016, + 39.624998 + ], + [ + 19.98, + 39.694993 + ], + [ + 19.960002, + 39.915006 + ], + [ + 19.406082, + 40.250773 + ], + [ + 19.319059, + 40.72723 + ], + [ + 19.40355, + 41.409566 + ], + [ + 19.540027, + 41.719986 + ], + [ + 19.371769, + 41.877548 + ], + [ + 19.304486, + 42.195745 + ], + [ + 19.738051, + 42.688247 + ], + [ + 19.801613, + 42.500093 + ], + [ + 20.0707, + 42.58863 + ], + [ + 20.283755, + 42.32026 + ], + [ + 20.52295, + 42.21787 + ], + [ + 20.590247, + 41.855404 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"ARE", + "properties":{ + "name":"United Arab Emirates" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 51.579519, + 24.245497 + ], + [ + 51.757441, + 24.294073 + ], + [ + 51.794389, + 24.019826 + ], + [ + 52.577081, + 24.177439 + ], + [ + 53.404007, + 24.151317 + ], + [ + 54.008001, + 24.121758 + ], + [ + 54.693024, + 24.797892 + ], + [ + 55.439025, + 25.439145 + ], + [ + 56.070821, + 26.055464 + ], + [ + 56.261042, + 25.714606 + ], + [ + 56.396847, + 24.924732 + ], + [ + 55.886233, + 24.920831 + ], + [ + 55.804119, + 24.269604 + ], + [ + 55.981214, + 24.130543 + ], + [ + 55.528632, + 23.933604 + ], + [ + 55.525841, + 23.524869 + ], + [ + 55.234489, + 23.110993 + ], + [ + 55.208341, + 22.70833 + ], + [ + 55.006803, + 22.496948 + ], + [ + 52.000733, + 23.001154 + ], + [ + 51.617708, + 24.014219 + ], + [ + 51.579519, + 24.245497 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"ARG", + "properties":{ + "name":"Argentina" + }, + "geometry":{ + "type":"MultiPolygon", + "coordinates":[ + [ + [ + [ + -65.5, + -55.2 + ], + [ + -66.45, + -55.25 + ], + [ + -66.95992, + -54.89681 + ], + [ + -67.56244, + -54.87001 + ], + [ + -68.63335, + -54.8695 + ], + [ + -68.63401, + -52.63637 + ], + [ + -68.25, + -53.1 + ], + [ + -67.75, + -53.85 + ], + [ + -66.45, + -54.45 + ], + [ + -65.05, + -54.7 + ], + [ + -65.5, + -55.2 + ] + ] + ], + [ + [ + [ + -64.964892, + -22.075862 + ], + [ + -64.377021, + -22.798091 + ], + [ + -63.986838, + -21.993644 + ], + [ + -62.846468, + -22.034985 + ], + [ + -62.685057, + -22.249029 + ], + [ + -60.846565, + -23.880713 + ], + [ + -60.028966, + -24.032796 + ], + [ + -58.807128, + -24.771459 + ], + [ + -57.777217, + -25.16234 + ], + [ + -57.63366, + -25.603657 + ], + [ + -58.618174, + -27.123719 + ], + [ + -57.60976, + -27.395899 + ], + [ + -56.486702, + -27.548499 + ], + [ + -55.695846, + -27.387837 + ], + [ + -54.788795, + -26.621786 + ], + [ + -54.625291, + -25.739255 + ], + [ + -54.13005, + -25.547639 + ], + [ + -53.628349, + -26.124865 + ], + [ + -53.648735, + -26.923473 + ], + [ + -54.490725, + -27.474757 + ], + [ + -55.162286, + -27.881915 + ], + [ + -56.2909, + -28.852761 + ], + [ + -57.625133, + -30.216295 + ], + [ + -57.874937, + -31.016556 + ], + [ + -58.14244, + -32.044504 + ], + [ + -58.132648, + -33.040567 + ], + [ + -58.349611, + -33.263189 + ], + [ + -58.427074, + -33.909454 + ], + [ + -58.495442, + -34.43149 + ], + [ + -57.22583, + -35.288027 + ], + [ + -57.362359, + -35.97739 + ], + [ + -56.737487, + -36.413126 + ], + [ + -56.788285, + -36.901572 + ], + [ + -57.749157, + -38.183871 + ], + [ + -59.231857, + -38.72022 + ], + [ + -61.237445, + -38.928425 + ], + [ + -62.335957, + -38.827707 + ], + [ + -62.125763, + -39.424105 + ], + [ + -62.330531, + -40.172586 + ], + [ + -62.145994, + -40.676897 + ], + [ + -62.745803, + -41.028761 + ], + [ + -63.770495, + -41.166789 + ], + [ + -64.73209, + -40.802677 + ], + [ + -65.118035, + -41.064315 + ], + [ + -64.978561, + -42.058001 + ], + [ + -64.303408, + -42.359016 + ], + [ + -63.755948, + -42.043687 + ], + [ + -63.458059, + -42.563138 + ], + [ + -64.378804, + -42.873558 + ], + [ + -65.181804, + -43.495381 + ], + [ + -65.328823, + -44.501366 + ], + [ + -65.565269, + -45.036786 + ], + [ + -66.509966, + -45.039628 + ], + [ + -67.293794, + -45.551896 + ], + [ + -67.580546, + -46.301773 + ], + [ + -66.597066, + -47.033925 + ], + [ + -65.641027, + -47.236135 + ], + [ + -65.985088, + -48.133289 + ], + [ + -67.166179, + -48.697337 + ], + [ + -67.816088, + -49.869669 + ], + [ + -68.728745, + -50.264218 + ], + [ + -69.138539, + -50.73251 + ], + [ + -68.815561, + -51.771104 + ], + [ + -68.149995, + -52.349983 + ], + [ + -68.571545, + -52.299444 + ], + [ + -69.498362, + -52.142761 + ], + [ + -71.914804, + -52.009022 + ], + [ + -72.329404, + -51.425956 + ], + [ + -72.309974, + -50.67701 + ], + [ + -72.975747, + -50.74145 + ], + [ + -73.328051, + -50.378785 + ], + [ + -73.415436, + -49.318436 + ], + [ + -72.648247, + -48.878618 + ], + [ + -72.331161, + -48.244238 + ], + [ + -72.447355, + -47.738533 + ], + [ + -71.917258, + -46.884838 + ], + [ + -71.552009, + -45.560733 + ], + [ + -71.659316, + -44.973689 + ], + [ + -71.222779, + -44.784243 + ], + [ + -71.329801, + -44.407522 + ], + [ + -71.793623, + -44.207172 + ], + [ + -71.464056, + -43.787611 + ], + [ + -71.915424, + -43.408565 + ], + [ + -72.148898, + -42.254888 + ], + [ + -71.746804, + -42.051386 + ], + [ + -71.915734, + -40.832339 + ], + [ + -71.680761, + -39.808164 + ], + [ + -71.413517, + -38.916022 + ], + [ + -70.814664, + -38.552995 + ], + [ + -71.118625, + -37.576827 + ], + [ + -71.121881, + -36.658124 + ], + [ + -70.364769, + -36.005089 + ], + [ + -70.388049, + -35.169688 + ], + [ + -69.817309, + -34.193571 + ], + [ + -69.814777, + -33.273886 + ], + [ + -70.074399, + -33.09121 + ], + [ + -70.535069, + -31.36501 + ], + [ + -69.919008, + -30.336339 + ], + [ + -70.01355, + -29.367923 + ], + [ + -69.65613, + -28.459141 + ], + [ + -69.001235, + -27.521214 + ], + [ + -68.295542, + -26.89934 + ], + [ + -68.5948, + -26.506909 + ], + [ + -68.386001, + -26.185016 + ], + [ + -68.417653, + -24.518555 + ], + [ + -67.328443, + -24.025303 + ], + [ + -66.985234, + -22.986349 + ], + [ + -67.106674, + -22.735925 + ], + [ + -66.273339, + -21.83231 + ], + [ + -64.964892, + -22.075862 + ] + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"ARM", + "properties":{ + "name":"Armenia" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 43.582746, + 41.092143 + ], + [ + 44.97248, + 41.248129 + ], + [ + 45.179496, + 40.985354 + ], + [ + 45.560351, + 40.81229 + ], + [ + 45.359175, + 40.561504 + ], + [ + 45.891907, + 40.218476 + ], + [ + 45.610012, + 39.899994 + ], + [ + 46.034534, + 39.628021 + ], + [ + 46.483499, + 39.464155 + ], + [ + 46.50572, + 38.770605 + ], + [ + 46.143623, + 38.741201 + ], + [ + 45.735379, + 39.319719 + ], + [ + 45.739978, + 39.473999 + ], + [ + 45.298145, + 39.471751 + ], + [ + 45.001987, + 39.740004 + ], + [ + 44.79399, + 39.713003 + ], + [ + 44.400009, + 40.005 + ], + [ + 43.656436, + 40.253564 + ], + [ + 43.752658, + 40.740201 + ], + [ + 43.582746, + 41.092143 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"ATA", + "properties":{ + "name":"Antarctica" + }, + "geometry":{ + "type":"MultiPolygon", + "coordinates":[ + [ + [ + [ + -59.572095, + -80.040179 + ], + [ + -59.865849, + -80.549657 + ], + [ + -60.159656, + -81.000327 + ], + [ + -62.255393, + -80.863178 + ], + [ + -64.488125, + -80.921934 + ], + [ + -65.741666, + -80.588827 + ], + [ + -65.741666, + -80.549657 + ], + [ + -66.290031, + -80.255773 + ], + [ + -64.037688, + -80.294944 + ], + [ + -61.883246, + -80.39287 + ], + [ + -61.138976, + -79.981371 + ], + [ + -60.610119, + -79.628679 + ], + [ + -59.572095, + -80.040179 + ] + ] + ], + [ + [ + [ + -159.208184, + -79.497059 + ], + [ + -161.127601, + -79.634209 + ], + [ + -162.439847, + -79.281465 + ], + [ + -163.027408, + -78.928774 + ], + [ + -163.066604, + -78.869966 + ], + [ + -163.712896, + -78.595667 + ], + [ + -163.105801, + -78.223338 + ], + [ + -161.245113, + -78.380176 + ], + [ + -160.246208, + -78.693645 + ], + [ + -159.482405, + -79.046338 + ], + [ + -159.208184, + -79.497059 + ] + ] + ], + [ + [ + [ + -45.154758, + -78.04707 + ], + [ + -43.920828, + -78.478103 + ], + [ + -43.48995, + -79.08556 + ], + [ + -43.372438, + -79.516645 + ], + [ + -43.333267, + -80.026123 + ], + [ + -44.880537, + -80.339644 + ], + [ + -46.506174, + -80.594357 + ], + [ + -48.386421, + -80.829485 + ], + [ + -50.482107, + -81.025442 + ], + [ + -52.851988, + -80.966685 + ], + [ + -54.164259, + -80.633528 + ], + [ + -53.987991, + -80.222028 + ], + [ + -51.853134, + -79.94773 + ], + [ + -50.991326, + -79.614623 + ], + [ + -50.364595, + -79.183487 + ], + [ + -49.914131, + -78.811209 + ], + [ + -49.306959, + -78.458569 + ], + [ + -48.660616, + -78.047018 + ], + [ + -48.660616, + -78.047019 + ], + [ + -48.151396, + -78.04707 + ], + [ + -46.662857, + -77.831476 + ], + [ + -45.154758, + -78.04707 + ] + ] + ], + [ + [ + [ + -121.211511, + -73.50099 + ], + [ + -119.918851, + -73.657725 + ], + [ + -118.724143, + -73.481353 + ], + [ + -119.292119, + -73.834097 + ], + [ + -120.232217, + -74.08881 + ], + [ + -121.62283, + -74.010468 + ], + [ + -122.621735, + -73.657778 + ], + [ + -122.621735, + -73.657777 + ], + [ + -122.406245, + -73.324619 + ], + [ + -121.211511, + -73.50099 + ] + ] + ], + [ + [ + [ + -125.559566, + -73.481353 + ], + [ + -124.031882, + -73.873268 + ], + [ + -124.619469, + -73.834097 + ], + [ + -125.912181, + -73.736118 + ], + [ + -127.28313, + -73.461769 + ], + [ + -127.28313, + -73.461768 + ], + [ + -126.558472, + -73.246226 + ], + [ + -125.559566, + -73.481353 + ] + ] + ], + [ + [ + [ + -98.98155, + -71.933334 + ], + [ + -97.884743, + -72.070535 + ], + [ + -96.787937, + -71.952971 + ], + [ + -96.20035, + -72.521205 + ], + [ + -96.983765, + -72.442864 + ], + [ + -98.198083, + -72.482035 + ], + [ + -99.432013, + -72.442864 + ], + [ + -100.783455, + -72.50162 + ], + [ + -101.801868, + -72.305663 + ], + [ + -102.330725, + -71.894164 + ], + [ + -101.703967, + -71.717792 + ], + [ + -100.430919, + -71.854993 + ], + [ + -98.98155, + -71.933334 + ] + ] + ], + [ + [ + [ + -68.451346, + -70.955823 + ], + [ + -68.333834, + -71.406493 + ], + [ + -68.510128, + -71.798407 + ], + [ + -68.784297, + -72.170736 + ], + [ + -69.959471, + -72.307885 + ], + [ + -71.075889, + -72.503842 + ], + [ + -72.388134, + -72.484257 + ], + [ + -71.8985, + -72.092343 + ], + [ + -73.073622, + -72.229492 + ], + [ + -74.19004, + -72.366693 + ], + [ + -74.953895, + -72.072757 + ], + [ + -75.012625, + -71.661258 + ], + [ + -73.915819, + -71.269345 + ], + [ + -73.915819, + -71.269344 + ], + [ + -73.230331, + -71.15178 + ], + [ + -72.074717, + -71.190951 + ], + [ + -71.780962, + -70.681473 + ], + [ + -71.72218, + -70.309196 + ], + [ + -71.741791, + -69.505782 + ], + [ + -71.173815, + -69.035475 + ], + [ + -70.253252, + -68.87874 + ], + [ + -69.724447, + -69.251017 + ], + [ + -69.489422, + -69.623346 + ], + [ + -69.058518, + -70.074016 + ], + [ + -68.725541, + -70.505153 + ], + [ + -68.451346, + -70.955823 + ] + ] + ], + [ + [ + [ + -58.614143, + -64.152467 + ], + [ + -59.045073, + -64.36801 + ], + [ + -59.789342, + -64.211223 + ], + [ + -60.611928, + -64.309202 + ], + [ + -61.297416, + -64.54433 + ], + [ + -62.0221, + -64.799094 + ], + [ + -62.51176, + -65.09303 + ], + [ + -62.648858, + -65.484942 + ], + [ + -62.590128, + -65.857219 + ], + [ + -62.120079, + -66.190326 + ], + [ + -62.805567, + -66.425505 + ], + [ + -63.74569, + -66.503847 + ], + [ + -64.294106, + -66.837004 + ], + [ + -64.881693, + -67.150474 + ], + [ + -65.508425, + -67.58161 + ], + [ + -65.665082, + -67.953887 + ], + [ + -65.312545, + -68.365335 + ], + [ + -64.783715, + -68.678908 + ], + [ + -63.961103, + -68.913984 + ], + [ + -63.1973, + -69.227556 + ], + [ + -62.785955, + -69.619419 + ], + [ + -62.570516, + -69.991747 + ], + [ + -62.276736, + -70.383661 + ], + [ + -61.806661, + -70.716768 + ], + [ + -61.512906, + -71.089045 + ], + [ + -61.375809, + -72.010074 + ], + [ + -61.081977, + -72.382351 + ], + [ + -61.003661, + -72.774265 + ], + [ + -60.690269, + -73.166179 + ], + [ + -60.827367, + -73.695242 + ], + [ + -61.375809, + -74.106742 + ], + [ + -61.96337, + -74.439848 + ], + [ + -63.295201, + -74.576997 + ], + [ + -63.74569, + -74.92974 + ], + [ + -64.352836, + -75.262847 + ], + [ + -65.860987, + -75.635124 + ], + [ + -67.192818, + -75.79191 + ], + [ + -68.446282, + -76.007452 + ], + [ + -69.797724, + -76.222995 + ], + [ + -70.600724, + -76.634494 + ], + [ + -72.206776, + -76.673665 + ], + [ + -73.969536, + -76.634494 + ], + [ + -75.555977, + -76.712887 + ], + [ + -77.24037, + -76.712887 + ], + [ + -76.926979, + -77.104802 + ], + [ + -75.399294, + -77.28107 + ], + [ + -74.282876, + -77.55542 + ], + [ + -73.656119, + -77.908112 + ], + [ + -74.772536, + -78.221633 + ], + [ + -76.4961, + -78.123654 + ], + [ + -77.925858, + -78.378419 + ], + [ + -77.984666, + -78.789918 + ], + [ + -78.023785, + -79.181833 + ], + [ + -76.848637, + -79.514939 + ], + [ + -76.633224, + -79.887216 + ], + [ + -75.360097, + -80.259545 + ], + [ + -73.244852, + -80.416331 + ], + [ + -71.442946, + -80.69063 + ], + [ + -70.013163, + -81.004151 + ], + [ + -68.191646, + -81.317672 + ], + [ + -65.704279, + -81.474458 + ], + [ + -63.25603, + -81.748757 + ], + [ + -61.552026, + -82.042692 + ], + [ + -59.691416, + -82.37585 + ], + [ + -58.712121, + -82.846106 + ], + [ + -58.222487, + -83.218434 + ], + [ + -57.008117, + -82.865691 + ], + [ + -55.362894, + -82.571755 + ], + [ + -53.619771, + -82.258235 + ], + [ + -51.543644, + -82.003521 + ], + [ + -49.76135, + -81.729171 + ], + [ + -47.273931, + -81.709586 + ], + [ + -44.825708, + -81.846735 + ], + [ + -42.808363, + -82.081915 + ], + [ + -42.16202, + -81.65083 + ], + [ + -40.771433, + -81.356894 + ], + [ + -38.244818, + -81.337309 + ], + [ + -36.26667, + -81.121715 + ], + [ + -34.386397, + -80.906172 + ], + [ + -32.310296, + -80.769023 + ], + [ + -30.097098, + -80.592651 + ], + [ + -28.549802, + -80.337938 + ], + [ + -29.254901, + -79.985195 + ], + [ + -29.685805, + -79.632503 + ], + [ + -29.685805, + -79.260226 + ], + [ + -31.624808, + -79.299397 + ], + [ + -33.681324, + -79.456132 + ], + [ + -35.639912, + -79.456132 + ], + [ + -35.914107, + -79.083855 + ], + [ + -35.77701, + -78.339248 + ], + [ + -35.326546, + -78.123654 + ], + [ + -33.896763, + -77.888526 + ], + [ + -32.212369, + -77.65345 + ], + [ + -30.998051, + -77.359515 + ], + [ + -29.783732, + -77.065579 + ], + [ + -28.882779, + -76.673665 + ], + [ + -27.511752, + -76.497345 + ], + [ + -26.160336, + -76.360144 + ], + [ + -25.474822, + -76.281803 + ], + [ + -23.927552, + -76.24258 + ], + [ + -22.458598, + -76.105431 + ], + [ + -21.224694, + -75.909474 + ], + [ + -20.010375, + -75.674346 + ], + [ + -18.913543, + -75.439218 + ], + [ + -17.522982, + -75.125698 + ], + [ + -16.641589, + -74.79254 + ], + [ + -15.701491, + -74.498604 + ], + [ + -15.40771, + -74.106742 + ], + [ + -16.46532, + -73.871614 + ], + [ + -16.112784, + -73.460114 + ], + [ + -15.446855, + -73.146542 + ], + [ + -14.408805, + -72.950585 + ], + [ + -13.311973, + -72.715457 + ], + [ + -12.293508, + -72.401936 + ], + [ + -11.510067, + -72.010074 + ], + [ + -11.020433, + -71.539767 + ], + [ + -10.295774, + -71.265416 + ], + [ + -9.101015, + -71.324224 + ], + [ + -8.611381, + -71.65733 + ], + [ + -7.416622, + -71.696501 + ], + [ + -7.377451, + -71.324224 + ], + [ + -6.868232, + -70.93231 + ], + [ + -5.790985, + -71.030289 + ], + [ + -5.536375, + -71.402617 + ], + [ + -4.341667, + -71.461373 + ], + [ + -3.048981, + -71.285053 + ], + [ + -1.795492, + -71.167438 + ], + [ + -0.659489, + -71.226246 + ], + [ + -0.228637, + -71.637745 + ], + [ + 0.868195, + -71.304639 + ], + [ + 1.886686, + -71.128267 + ], + [ + 3.022638, + -70.991118 + ], + [ + 4.139055, + -70.853917 + ], + [ + 5.157546, + -70.618789 + ], + [ + 6.273912, + -70.462055 + ], + [ + 7.13572, + -70.246512 + ], + [ + 7.742866, + -69.893769 + ], + [ + 8.48711, + -70.148534 + ], + [ + 9.525135, + -70.011333 + ], + [ + 10.249845, + -70.48164 + ], + [ + 10.817821, + -70.834332 + ], + [ + 11.953824, + -70.638375 + ], + [ + 12.404287, + -70.246512 + ], + [ + 13.422778, + -69.972162 + ], + [ + 14.734998, + -70.030918 + ], + [ + 15.126757, + -70.403247 + ], + [ + 15.949342, + -70.030918 + ], + [ + 17.026589, + -69.913354 + ], + [ + 18.201711, + -69.874183 + ], + [ + 19.259373, + -69.893769 + ], + [ + 20.375739, + -70.011333 + ], + [ + 21.452985, + -70.07014 + ], + [ + 21.923034, + -70.403247 + ], + [ + 22.569403, + -70.697182 + ], + [ + 23.666184, + -70.520811 + ], + [ + 24.841357, + -70.48164 + ], + [ + 25.977309, + -70.48164 + ], + [ + 27.093726, + -70.462055 + ], + [ + 28.09258, + -70.324854 + ], + [ + 29.150242, + -70.20729 + ], + [ + 30.031583, + -69.93294 + ], + [ + 30.971733, + -69.75662 + ], + [ + 31.990172, + -69.658641 + ], + [ + 32.754053, + -69.384291 + ], + [ + 33.302443, + -68.835642 + ], + [ + 33.870419, + -68.502588 + ], + [ + 34.908495, + -68.659271 + ], + [ + 35.300202, + -69.012014 + ], + [ + 36.16201, + -69.247142 + ], + [ + 37.200035, + -69.168748 + ], + [ + 37.905108, + -69.52144 + ], + [ + 38.649404, + -69.776205 + ], + [ + 39.667894, + -69.541077 + ], + [ + 40.020431, + -69.109941 + ], + [ + 40.921358, + -68.933621 + ], + [ + 41.959434, + -68.600514 + ], + [ + 42.938702, + -68.463313 + ], + [ + 44.113876, + -68.267408 + ], + [ + 44.897291, + -68.051866 + ], + [ + 45.719928, + -67.816738 + ], + [ + 46.503343, + -67.601196 + ], + [ + 47.44344, + -67.718759 + ], + [ + 48.344419, + -67.366068 + ], + [ + 48.990736, + -67.091718 + ], + [ + 49.930885, + -67.111303 + ], + [ + 50.753471, + -66.876175 + ], + [ + 50.949325, + -66.523484 + ], + [ + 51.791547, + -66.249133 + ], + [ + 52.614133, + -66.053176 + ], + [ + 53.613038, + -65.89639 + ], + [ + 54.53355, + -65.818049 + ], + [ + 55.414943, + -65.876805 + ], + [ + 56.355041, + -65.974783 + ], + [ + 57.158093, + -66.249133 + ], + [ + 57.255968, + -66.680218 + ], + [ + 58.137361, + -67.013324 + ], + [ + 58.744508, + -67.287675 + ], + [ + 59.939318, + -67.405239 + ], + [ + 60.605221, + -67.679589 + ], + [ + 61.427806, + -67.953887 + ], + [ + 62.387489, + -68.012695 + ], + [ + 63.19049, + -67.816738 + ], + [ + 64.052349, + -67.405239 + ], + [ + 64.992447, + -67.620729 + ], + [ + 65.971715, + -67.738345 + ], + [ + 66.911864, + -67.855909 + ], + [ + 67.891133, + -67.934302 + ], + [ + 68.890038, + -67.934302 + ], + [ + 69.712624, + -68.972791 + ], + [ + 69.673453, + -69.227556 + ], + [ + 69.555941, + -69.678226 + ], + [ + 68.596258, + -69.93294 + ], + [ + 67.81274, + -70.305268 + ], + [ + 67.949889, + -70.697182 + ], + [ + 69.066307, + -70.677545 + ], + [ + 68.929157, + -71.069459 + ], + [ + 68.419989, + -71.441788 + ], + [ + 67.949889, + -71.853287 + ], + [ + 68.71377, + -72.166808 + ], + [ + 69.869307, + -72.264787 + ], + [ + 71.024895, + -72.088415 + ], + [ + 71.573285, + -71.696501 + ], + [ + 71.906288, + -71.324224 + ], + [ + 72.454627, + -71.010703 + ], + [ + 73.08141, + -70.716768 + ], + [ + 73.33602, + -70.364024 + ], + [ + 73.864877, + -69.874183 + ], + [ + 74.491557, + -69.776205 + ], + [ + 75.62756, + -69.737034 + ], + [ + 76.626465, + -69.619419 + ], + [ + 77.644904, + -69.462684 + ], + [ + 78.134539, + -69.07077 + ], + [ + 78.428371, + -68.698441 + ], + [ + 79.113859, + -68.326216 + ], + [ + 80.093127, + -68.071503 + ], + [ + 80.93535, + -67.875546 + ], + [ + 81.483792, + -67.542388 + ], + [ + 82.051767, + -67.366068 + ], + [ + 82.776426, + -67.209282 + ], + [ + 83.775331, + -67.30726 + ], + [ + 84.676206, + -67.209282 + ], + [ + 85.655527, + -67.091718 + ], + [ + 86.752359, + -67.150474 + ], + [ + 87.477017, + -66.876175 + ], + [ + 87.986289, + -66.209911 + ], + [ + 88.358411, + -66.484261 + ], + [ + 88.828408, + -66.954568 + ], + [ + 89.67063, + -67.150474 + ], + [ + 90.630365, + -67.228867 + ], + [ + 91.5901, + -67.111303 + ], + [ + 92.608539, + -67.189696 + ], + [ + 93.548637, + -67.209282 + ], + [ + 94.17542, + -67.111303 + ], + [ + 95.017591, + -67.170111 + ], + [ + 95.781472, + -67.385653 + ], + [ + 96.682399, + -67.248504 + ], + [ + 97.759646, + -67.248504 + ], + [ + 98.68021, + -67.111303 + ], + [ + 99.718182, + -67.248504 + ], + [ + 100.384188, + -66.915346 + ], + [ + 100.893356, + -66.58224 + ], + [ + 101.578896, + -66.30789 + ], + [ + 102.832411, + -65.563284 + ], + [ + 103.478676, + -65.700485 + ], + [ + 104.242557, + -65.974783 + ], + [ + 104.90846, + -66.327527 + ], + [ + 106.181561, + -66.934931 + ], + [ + 107.160881, + -66.954568 + ], + [ + 108.081393, + -66.954568 + ], + [ + 109.15864, + -66.837004 + ], + [ + 110.235835, + -66.699804 + ], + [ + 111.058472, + -66.425505 + ], + [ + 111.74396, + -66.13157 + ], + [ + 112.860378, + -66.092347 + ], + [ + 113.604673, + -65.876805 + ], + [ + 114.388088, + -66.072762 + ], + [ + 114.897308, + -66.386283 + ], + [ + 115.602381, + -66.699804 + ], + [ + 116.699161, + -66.660633 + ], + [ + 117.384701, + -66.915346 + ], + [ + 118.57946, + -67.170111 + ], + [ + 119.832924, + -67.268089 + ], + [ + 120.871, + -67.189696 + ], + [ + 121.654415, + -66.876175 + ], + [ + 122.320369, + -66.562654 + ], + [ + 123.221296, + -66.484261 + ], + [ + 124.122274, + -66.621462 + ], + [ + 125.160247, + -66.719389 + ], + [ + 126.100396, + -66.562654 + ], + [ + 127.001427, + -66.562654 + ], + [ + 127.882768, + -66.660633 + ], + [ + 128.80328, + -66.758611 + ], + [ + 129.704259, + -66.58224 + ], + [ + 130.781454, + -66.425505 + ], + [ + 131.799945, + -66.386283 + ], + [ + 132.935896, + -66.386283 + ], + [ + 133.85646, + -66.288304 + ], + [ + 134.757387, + -66.209963 + ], + [ + 135.031582, + -65.72007 + ], + [ + 135.070753, + -65.308571 + ], + [ + 135.697485, + -65.582869 + ], + [ + 135.873805, + -66.033591 + ], + [ + 136.206705, + -66.44509 + ], + [ + 136.618049, + -66.778197 + ], + [ + 137.460271, + -66.954568 + ], + [ + 138.596223, + -66.895761 + ], + [ + 139.908442, + -66.876175 + ], + [ + 140.809421, + -66.817367 + ], + [ + 142.121692, + -66.817367 + ], + [ + 143.061842, + -66.797782 + ], + [ + 144.374061, + -66.837004 + ], + [ + 145.490427, + -66.915346 + ], + [ + 146.195552, + -67.228867 + ], + [ + 145.999699, + -67.601196 + ], + [ + 146.646067, + -67.895131 + ], + [ + 147.723263, + -68.130259 + ], + [ + 148.839629, + -68.385024 + ], + [ + 150.132314, + -68.561292 + ], + [ + 151.483705, + -68.71813 + ], + [ + 152.502247, + -68.874813 + ], + [ + 153.638199, + -68.894502 + ], + [ + 154.284567, + -68.561292 + ], + [ + 155.165857, + -68.835642 + ], + [ + 155.92979, + -69.149215 + ], + [ + 156.811132, + -69.384291 + ], + [ + 158.025528, + -69.482269 + ], + [ + 159.181013, + -69.599833 + ], + [ + 159.670699, + -69.991747 + ], + [ + 160.80665, + -70.226875 + ], + [ + 161.570479, + -70.579618 + ], + [ + 162.686897, + -70.736353 + ], + [ + 163.842434, + -70.716768 + ], + [ + 164.919681, + -70.775524 + ], + [ + 166.11444, + -70.755938 + ], + [ + 167.309095, + -70.834332 + ], + [ + 168.425616, + -70.971481 + ], + [ + 169.463589, + -71.20666 + ], + [ + 170.501665, + -71.402617 + ], + [ + 171.20679, + -71.696501 + ], + [ + 171.089227, + -72.088415 + ], + [ + 170.560422, + -72.441159 + ], + [ + 170.109958, + -72.891829 + ], + [ + 169.75737, + -73.24452 + ], + [ + 169.287321, + -73.65602 + ], + [ + 167.975101, + -73.812806 + ], + [ + 167.387489, + -74.165498 + ], + [ + 166.094803, + -74.38104 + ], + [ + 165.644391, + -74.772954 + ], + [ + 164.958851, + -75.145283 + ], + [ + 164.234193, + -75.458804 + ], + [ + 163.822797, + -75.870303 + ], + [ + 163.568239, + -76.24258 + ], + [ + 163.47026, + -76.693302 + ], + [ + 163.489897, + -77.065579 + ], + [ + 164.057873, + -77.457442 + ], + [ + 164.273363, + -77.82977 + ], + [ + 164.743464, + -78.182514 + ], + [ + 166.604126, + -78.319611 + ], + [ + 166.995781, + -78.750748 + ], + [ + 165.193876, + -78.907483 + ], + [ + 163.666217, + -79.123025 + ], + [ + 161.766385, + -79.162248 + ], + [ + 160.924162, + -79.730482 + ], + [ + 160.747894, + -80.200737 + ], + [ + 160.316964, + -80.573066 + ], + [ + 159.788211, + -80.945395 + ], + [ + 161.120016, + -81.278501 + ], + [ + 161.629287, + -81.690001 + ], + [ + 162.490992, + -82.062278 + ], + [ + 163.705336, + -82.395435 + ], + [ + 165.095949, + -82.708956 + ], + [ + 166.604126, + -83.022477 + ], + [ + 168.895665, + -83.335998 + ], + [ + 169.404782, + -83.825891 + ], + [ + 172.283934, + -84.041433 + ], + [ + 172.477049, + -84.117914 + ], + [ + 173.224083, + -84.41371 + ], + [ + 175.985672, + -84.158997 + ], + [ + 178.277212, + -84.472518 + ], + [ + 180, + -84.71338 + ], + [ + -179.942499, + -84.721443 + ], + [ + -179.058677, + -84.139412 + ], + [ + -177.256772, + -84.452933 + ], + [ + -177.140807, + -84.417941 + ], + [ + -176.084673, + -84.099259 + ], + [ + -175.947235, + -84.110449 + ], + [ + -175.829882, + -84.117914 + ], + [ + -174.382503, + -84.534323 + ], + [ + -173.116559, + -84.117914 + ], + [ + -172.889106, + -84.061019 + ], + [ + -169.951223, + -83.884647 + ], + [ + -168.999989, + -84.117914 + ], + [ + -168.530199, + -84.23739 + ], + [ + -167.022099, + -84.570497 + ], + [ + -164.182144, + -84.82521 + ], + [ + -161.929775, + -85.138731 + ], + [ + -158.07138, + -85.37391 + ], + [ + -155.192253, + -85.09956 + ], + [ + -150.942099, + -85.295517 + ], + [ + -148.533073, + -85.609038 + ], + [ + -145.888918, + -85.315102 + ], + [ + -143.107718, + -85.040752 + ], + [ + -142.892279, + -84.570497 + ], + [ + -146.829068, + -84.531274 + ], + [ + -150.060732, + -84.296146 + ], + [ + -150.902928, + -83.904232 + ], + [ + -153.586201, + -83.68869 + ], + [ + -153.409907, + -83.23802 + ], + [ + -153.037759, + -82.82652 + ], + [ + -152.665637, + -82.454192 + ], + [ + -152.861517, + -82.042692 + ], + [ + -154.526299, + -81.768394 + ], + [ + -155.29018, + -81.41565 + ], + [ + -156.83745, + -81.102129 + ], + [ + -154.408787, + -81.160937 + ], + [ + -152.097662, + -81.004151 + ], + [ + -150.648293, + -81.337309 + ], + [ + -148.865998, + -81.043373 + ], + [ + -147.22075, + -80.671045 + ], + [ + -146.417749, + -80.337938 + ], + [ + -146.770286, + -79.926439 + ], + [ + -148.062947, + -79.652089 + ], + [ + -149.531901, + -79.358205 + ], + [ + -151.588416, + -79.299397 + ], + [ + -153.390322, + -79.162248 + ], + [ + -155.329376, + -79.064269 + ], + [ + -155.975668, + -78.69194 + ], + [ + -157.268302, + -78.378419 + ], + [ + -158.051768, + -78.025676 + ], + [ + -158.365134, + -76.889207 + ], + [ + -157.875474, + -76.987238 + ], + [ + -156.974573, + -77.300759 + ], + [ + -155.329376, + -77.202728 + ], + [ + -153.742832, + -77.065579 + ], + [ + -152.920247, + -77.496664 + ], + [ + -151.33378, + -77.398737 + ], + [ + -150.00195, + -77.183143 + ], + [ + -148.748486, + -76.908845 + ], + [ + -147.612483, + -76.575738 + ], + [ + -146.104409, + -76.47776 + ], + [ + -146.143528, + -76.105431 + ], + [ + -146.496091, + -75.733154 + ], + [ + -146.20231, + -75.380411 + ], + [ + -144.909624, + -75.204039 + ], + [ + -144.322037, + -75.537197 + ], + [ + -142.794353, + -75.34124 + ], + [ + -141.638764, + -75.086475 + ], + [ + -140.209007, + -75.06689 + ], + [ + -138.85759, + -74.968911 + ], + [ + -137.5062, + -74.733783 + ], + [ + -136.428901, + -74.518241 + ], + [ + -135.214583, + -74.302699 + ], + [ + -134.431194, + -74.361455 + ], + [ + -133.745654, + -74.439848 + ], + [ + -132.257168, + -74.302699 + ], + [ + -130.925311, + -74.479019 + ], + [ + -129.554284, + -74.459433 + ], + [ + -128.242038, + -74.322284 + ], + [ + -126.890622, + -74.420263 + ], + [ + -125.402082, + -74.518241 + ], + [ + -124.011496, + -74.479019 + ], + [ + -122.562152, + -74.498604 + ], + [ + -121.073613, + -74.518241 + ], + [ + -119.70256, + -74.479019 + ], + [ + -118.684145, + -74.185083 + ], + [ + -117.469801, + -74.028348 + ], + [ + -116.216312, + -74.243891 + ], + [ + -115.021552, + -74.067519 + ], + [ + -113.944331, + -73.714828 + ], + [ + -113.297988, + -74.028348 + ], + [ + -112.945452, + -74.38104 + ], + [ + -112.299083, + -74.714198 + ], + [ + -111.261059, + -74.420263 + ], + [ + -110.066325, + -74.79254 + ], + [ + -108.714909, + -74.910103 + ], + [ + -107.559346, + -75.184454 + ], + [ + -106.149148, + -75.125698 + ], + [ + -104.876074, + -74.949326 + ], + [ + -103.367949, + -74.988497 + ], + [ + -102.016507, + -75.125698 + ], + [ + -100.645531, + -75.302018 + ], + [ + -100.1167, + -74.870933 + ], + [ + -100.763043, + -74.537826 + ], + [ + -101.252703, + -74.185083 + ], + [ + -102.545337, + -74.106742 + ], + [ + -103.113313, + -73.734413 + ], + [ + -103.328752, + -73.362084 + ], + [ + -103.681289, + -72.61753 + ], + [ + -102.917485, + -72.754679 + ], + [ + -101.60524, + -72.813436 + ], + [ + -100.312528, + -72.754679 + ], + [ + -99.13738, + -72.911414 + ], + [ + -98.118889, + -73.20535 + ], + [ + -97.688037, + -73.558041 + ], + [ + -96.336595, + -73.616849 + ], + [ + -95.043961, + -73.4797 + ], + [ + -93.672907, + -73.283743 + ], + [ + -92.439003, + -73.166179 + ], + [ + -91.420564, + -73.401307 + ], + [ + -90.088733, + -73.322914 + ], + [ + -89.226951, + -72.558722 + ], + [ + -88.423951, + -73.009393 + ], + [ + -87.268337, + -73.185764 + ], + [ + -86.014822, + -73.087786 + ], + [ + -85.192236, + -73.4797 + ], + [ + -83.879991, + -73.518871 + ], + [ + -82.665646, + -73.636434 + ], + [ + -81.470913, + -73.851977 + ], + [ + -80.687447, + -73.4797 + ], + [ + -80.295791, + -73.126956 + ], + [ + -79.296886, + -73.518871 + ], + [ + -77.925858, + -73.420892 + ], + [ + -76.907367, + -73.636434 + ], + [ + -76.221879, + -73.969541 + ], + [ + -74.890049, + -73.871614 + ], + [ + -73.852024, + -73.65602 + ], + [ + -72.833533, + -73.401307 + ], + [ + -71.619215, + -73.264157 + ], + [ + -70.209042, + -73.146542 + ], + [ + -68.935916, + -73.009393 + ], + [ + -67.956622, + -72.79385 + ], + [ + -67.369061, + -72.480329 + ], + [ + -67.134036, + -72.049244 + ], + [ + -67.251548, + -71.637745 + ], + [ + -67.56494, + -71.245831 + ], + [ + -67.917477, + -70.853917 + ], + [ + -68.230843, + -70.462055 + ], + [ + -68.485452, + -70.109311 + ], + [ + -68.544209, + -69.717397 + ], + [ + -68.446282, + -69.325535 + ], + [ + -67.976233, + -68.953206 + ], + [ + -67.5845, + -68.541707 + ], + [ + -67.427843, + -68.149844 + ], + [ + -67.62367, + -67.718759 + ], + [ + -67.741183, + -67.326845 + ], + [ + -67.251548, + -66.876175 + ], + [ + -66.703184, + -66.58224 + ], + [ + -66.056815, + -66.209963 + ], + [ + -65.371327, + -65.89639 + ], + [ + -64.568276, + -65.602506 + ], + [ + -64.176542, + -65.171423 + ], + [ + -63.628152, + -64.897073 + ], + [ + -63.001394, + -64.642308 + ], + [ + -62.041686, + -64.583552 + ], + [ + -61.414928, + -64.270031 + ], + [ + -60.709855, + -64.074074 + ], + [ + -59.887269, + -63.95651 + ], + [ + -59.162585, + -63.701745 + ], + [ + -58.594557, + -63.388224 + ], + [ + -57.811143, + -63.27066 + ], + [ + -57.223582, + -63.525425 + ], + [ + -57.59573, + -63.858532 + ], + [ + -58.614143, + -64.152467 + ] + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"ATF", + "properties":{ + "name":"French Southern and Antarctic Lands" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 68.935, + -48.625 + ], + [ + 69.58, + -48.94 + ], + [ + 70.525, + -49.065 + ], + [ + 70.56, + -49.255 + ], + [ + 70.28, + -49.71 + ], + [ + 68.745, + -49.775 + ], + [ + 68.72, + -49.2425 + ], + [ + 68.8675, + -48.83 + ], + [ + 68.935, + -48.625 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"AUS", + "properties":{ + "name":"Australia" + }, + "geometry":{ + "type":"MultiPolygon", + "coordinates":[ + [ + [ + [ + 145.397978, + -40.792549 + ], + [ + 146.364121, + -41.137695 + ], + [ + 146.908584, + -41.000546 + ], + [ + 147.689259, + -40.808258 + ], + [ + 148.289068, + -40.875438 + ], + [ + 148.359865, + -42.062445 + ], + [ + 148.017301, + -42.407024 + ], + [ + 147.914052, + -43.211522 + ], + [ + 147.564564, + -42.937689 + ], + [ + 146.870343, + -43.634597 + ], + [ + 146.663327, + -43.580854 + ], + [ + 146.048378, + -43.549745 + ], + [ + 145.43193, + -42.693776 + ], + [ + 145.29509, + -42.03361 + ], + [ + 144.718071, + -41.162552 + ], + [ + 144.743755, + -40.703975 + ], + [ + 145.397978, + -40.792549 + ] + ] + ], + [ + [ + [ + 143.561811, + -13.763656 + ], + [ + 143.922099, + -14.548311 + ], + [ + 144.563714, + -14.171176 + ], + [ + 144.894908, + -14.594458 + ], + [ + 145.374724, + -14.984976 + ], + [ + 145.271991, + -15.428205 + ], + [ + 145.48526, + -16.285672 + ], + [ + 145.637033, + -16.784918 + ], + [ + 145.888904, + -16.906926 + ], + [ + 146.160309, + -17.761655 + ], + [ + 146.063674, + -18.280073 + ], + [ + 146.387478, + -18.958274 + ], + [ + 147.471082, + -19.480723 + ], + [ + 148.177602, + -19.955939 + ], + [ + 148.848414, + -20.39121 + ], + [ + 148.717465, + -20.633469 + ], + [ + 149.28942, + -21.260511 + ], + [ + 149.678337, + -22.342512 + ], + [ + 150.077382, + -22.122784 + ], + [ + 150.482939, + -22.556142 + ], + [ + 150.727265, + -22.402405 + ], + [ + 150.899554, + -23.462237 + ], + [ + 151.609175, + -24.076256 + ], + [ + 152.07354, + -24.457887 + ], + [ + 152.855197, + -25.267501 + ], + [ + 153.136162, + -26.071173 + ], + [ + 153.161949, + -26.641319 + ], + [ + 153.092909, + -27.2603 + ], + [ + 153.569469, + -28.110067 + ], + [ + 153.512108, + -28.995077 + ], + [ + 153.339095, + -29.458202 + ], + [ + 153.069241, + -30.35024 + ], + [ + 153.089602, + -30.923642 + ], + [ + 152.891578, + -31.640446 + ], + [ + 152.450002, + -32.550003 + ], + [ + 151.709117, + -33.041342 + ], + [ + 151.343972, + -33.816023 + ], + [ + 151.010555, + -34.31036 + ], + [ + 150.714139, + -35.17346 + ], + [ + 150.32822, + -35.671879 + ], + [ + 150.075212, + -36.420206 + ], + [ + 149.946124, + -37.109052 + ], + [ + 149.997284, + -37.425261 + ], + [ + 149.423882, + -37.772681 + ], + [ + 148.304622, + -37.809061 + ], + [ + 147.381733, + -38.219217 + ], + [ + 146.922123, + -38.606532 + ], + [ + 146.317922, + -39.035757 + ], + [ + 145.489652, + -38.593768 + ], + [ + 144.876976, + -38.417448 + ], + [ + 145.032212, + -37.896188 + ], + [ + 144.485682, + -38.085324 + ], + [ + 143.609974, + -38.809465 + ], + [ + 142.745427, + -38.538268 + ], + [ + 142.17833, + -38.380034 + ], + [ + 141.606582, + -38.308514 + ], + [ + 140.638579, + -38.019333 + ], + [ + 139.992158, + -37.402936 + ], + [ + 139.806588, + -36.643603 + ], + [ + 139.574148, + -36.138362 + ], + [ + 139.082808, + -35.732754 + ], + [ + 138.120748, + -35.612296 + ], + [ + 138.449462, + -35.127261 + ], + [ + 138.207564, + -34.384723 + ], + [ + 137.71917, + -35.076825 + ], + [ + 136.829406, + -35.260535 + ], + [ + 137.352371, + -34.707339 + ], + [ + 137.503886, + -34.130268 + ], + [ + 137.890116, + -33.640479 + ], + [ + 137.810328, + -32.900007 + ], + [ + 136.996837, + -33.752771 + ], + [ + 136.372069, + -34.094766 + ], + [ + 135.989043, + -34.890118 + ], + [ + 135.208213, + -34.47867 + ], + [ + 135.239218, + -33.947953 + ], + [ + 134.613417, + -33.222778 + ], + [ + 134.085904, + -32.848072 + ], + [ + 134.273903, + -32.617234 + ], + [ + 132.990777, + -32.011224 + ], + [ + 132.288081, + -31.982647 + ], + [ + 131.326331, + -31.495803 + ], + [ + 129.535794, + -31.590423 + ], + [ + 128.240938, + -31.948489 + ], + [ + 127.102867, + -32.282267 + ], + [ + 126.148714, + -32.215966 + ], + [ + 125.088623, + -32.728751 + ], + [ + 124.221648, + -32.959487 + ], + [ + 124.028947, + -33.483847 + ], + [ + 123.659667, + -33.890179 + ], + [ + 122.811036, + -33.914467 + ], + [ + 122.183064, + -34.003402 + ], + [ + 121.299191, + -33.821036 + ], + [ + 120.580268, + -33.930177 + ], + [ + 119.893695, + -33.976065 + ], + [ + 119.298899, + -34.509366 + ], + [ + 119.007341, + -34.464149 + ], + [ + 118.505718, + -34.746819 + ], + [ + 118.024972, + -35.064733 + ], + [ + 117.295507, + -35.025459 + ], + [ + 116.625109, + -35.025097 + ], + [ + 115.564347, + -34.386428 + ], + [ + 115.026809, + -34.196517 + ], + [ + 115.048616, + -33.623425 + ], + [ + 115.545123, + -33.487258 + ], + [ + 115.714674, + -33.259572 + ], + [ + 115.679379, + -32.900369 + ], + [ + 115.801645, + -32.205062 + ], + [ + 115.689611, + -31.612437 + ], + [ + 115.160909, + -30.601594 + ], + [ + 114.997043, + -30.030725 + ], + [ + 115.040038, + -29.461095 + ], + [ + 114.641974, + -28.810231 + ], + [ + 114.616498, + -28.516399 + ], + [ + 114.173579, + -28.118077 + ], + [ + 114.048884, + -27.334765 + ], + [ + 113.477498, + -26.543134 + ], + [ + 113.338953, + -26.116545 + ], + [ + 113.778358, + -26.549025 + ], + [ + 113.440962, + -25.621278 + ], + [ + 113.936901, + -25.911235 + ], + [ + 114.232852, + -26.298446 + ], + [ + 114.216161, + -25.786281 + ], + [ + 113.721255, + -24.998939 + ], + [ + 113.625344, + -24.683971 + ], + [ + 113.393523, + -24.384764 + ], + [ + 113.502044, + -23.80635 + ], + [ + 113.706993, + -23.560215 + ], + [ + 113.843418, + -23.059987 + ], + [ + 113.736552, + -22.475475 + ], + [ + 114.149756, + -21.755881 + ], + [ + 114.225307, + -22.517488 + ], + [ + 114.647762, + -21.82952 + ], + [ + 115.460167, + -21.495173 + ], + [ + 115.947373, + -21.068688 + ], + [ + 116.711615, + -20.701682 + ], + [ + 117.166316, + -20.623599 + ], + [ + 117.441545, + -20.746899 + ], + [ + 118.229559, + -20.374208 + ], + [ + 118.836085, + -20.263311 + ], + [ + 118.987807, + -20.044203 + ], + [ + 119.252494, + -19.952942 + ], + [ + 119.805225, + -19.976506 + ], + [ + 120.85622, + -19.683708 + ], + [ + 121.399856, + -19.239756 + ], + [ + 121.655138, + -18.705318 + ], + [ + 122.241665, + -18.197649 + ], + [ + 122.286624, + -17.798603 + ], + [ + 122.312772, + -17.254967 + ], + [ + 123.012574, + -16.4052 + ], + [ + 123.433789, + -17.268558 + ], + [ + 123.859345, + -17.069035 + ], + [ + 123.503242, + -16.596506 + ], + [ + 123.817073, + -16.111316 + ], + [ + 124.258287, + -16.327944 + ], + [ + 124.379726, + -15.56706 + ], + [ + 124.926153, + -15.0751 + ], + [ + 125.167275, + -14.680396 + ], + [ + 125.670087, + -14.51007 + ], + [ + 125.685796, + -14.230656 + ], + [ + 126.125149, + -14.347341 + ], + [ + 126.142823, + -14.095987 + ], + [ + 126.582589, + -13.952791 + ], + [ + 127.065867, + -13.817968 + ], + [ + 127.804633, + -14.276906 + ], + [ + 128.35969, + -14.86917 + ], + [ + 128.985543, + -14.875991 + ], + [ + 129.621473, + -14.969784 + ], + [ + 129.4096, + -14.42067 + ], + [ + 129.888641, + -13.618703 + ], + [ + 130.339466, + -13.357376 + ], + [ + 130.183506, + -13.10752 + ], + [ + 130.617795, + -12.536392 + ], + [ + 131.223495, + -12.183649 + ], + [ + 131.735091, + -12.302453 + ], + [ + 132.575298, + -12.114041 + ], + [ + 132.557212, + -11.603012 + ], + [ + 131.824698, + -11.273782 + ], + [ + 132.357224, + -11.128519 + ], + [ + 133.019561, + -11.376411 + ], + [ + 133.550846, + -11.786515 + ], + [ + 134.393068, + -12.042365 + ], + [ + 134.678632, + -11.941183 + ], + [ + 135.298491, + -12.248606 + ], + [ + 135.882693, + -11.962267 + ], + [ + 136.258381, + -12.049342 + ], + [ + 136.492475, + -11.857209 + ], + [ + 136.95162, + -12.351959 + ], + [ + 136.685125, + -12.887223 + ], + [ + 136.305407, + -13.29123 + ], + [ + 135.961758, + -13.324509 + ], + [ + 136.077617, + -13.724278 + ], + [ + 135.783836, + -14.223989 + ], + [ + 135.428664, + -14.715432 + ], + [ + 135.500184, + -14.997741 + ], + [ + 136.295175, + -15.550265 + ], + [ + 137.06536, + -15.870762 + ], + [ + 137.580471, + -16.215082 + ], + [ + 138.303217, + -16.807604 + ], + [ + 138.585164, + -16.806622 + ], + [ + 139.108543, + -17.062679 + ], + [ + 139.260575, + -17.371601 + ], + [ + 140.215245, + -17.710805 + ], + [ + 140.875463, + -17.369069 + ], + [ + 141.07111, + -16.832047 + ], + [ + 141.274095, + -16.38887 + ], + [ + 141.398222, + -15.840532 + ], + [ + 141.702183, + -15.044921 + ], + [ + 141.56338, + -14.561333 + ], + [ + 141.63552, + -14.270395 + ], + [ + 141.519869, + -13.698078 + ], + [ + 141.65092, + -12.944688 + ], + [ + 141.842691, + -12.741548 + ], + [ + 141.68699, + -12.407614 + ], + [ + 141.928629, + -11.877466 + ], + [ + 142.118488, + -11.328042 + ], + [ + 142.143706, + -11.042737 + ], + [ + 142.51526, + -10.668186 + ], + [ + 142.79731, + -11.157355 + ], + [ + 142.866763, + -11.784707 + ], + [ + 143.115947, + -11.90563 + ], + [ + 143.158632, + -12.325656 + ], + [ + 143.522124, + -12.834358 + ], + [ + 143.597158, + -13.400422 + ], + [ + 143.561811, + -13.763656 + ] + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"AUT", + "properties":{ + "name":"Austria" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 16.979667, + 48.123497 + ], + [ + 16.903754, + 47.714866 + ], + [ + 16.340584, + 47.712902 + ], + [ + 16.534268, + 47.496171 + ], + [ + 16.202298, + 46.852386 + ], + [ + 16.011664, + 46.683611 + ], + [ + 15.137092, + 46.658703 + ], + [ + 14.632472, + 46.431817 + ], + [ + 13.806475, + 46.509306 + ], + [ + 12.376485, + 46.767559 + ], + [ + 12.153088, + 47.115393 + ], + [ + 11.164828, + 46.941579 + ], + [ + 11.048556, + 46.751359 + ], + [ + 10.442701, + 46.893546 + ], + [ + 9.932448, + 46.920728 + ], + [ + 9.47997, + 47.10281 + ], + [ + 9.632932, + 47.347601 + ], + [ + 9.594226, + 47.525058 + ], + [ + 9.896068, + 47.580197 + ], + [ + 10.402084, + 47.302488 + ], + [ + 10.544504, + 47.566399 + ], + [ + 11.426414, + 47.523766 + ], + [ + 12.141357, + 47.703083 + ], + [ + 12.62076, + 47.672388 + ], + [ + 12.932627, + 47.467646 + ], + [ + 13.025851, + 47.637584 + ], + [ + 12.884103, + 48.289146 + ], + [ + 13.243357, + 48.416115 + ], + [ + 13.595946, + 48.877172 + ], + [ + 14.338898, + 48.555305 + ], + [ + 14.901447, + 48.964402 + ], + [ + 15.253416, + 49.039074 + ], + [ + 16.029647, + 48.733899 + ], + [ + 16.499283, + 48.785808 + ], + [ + 16.960288, + 48.596982 + ], + [ + 16.879983, + 48.470013 + ], + [ + 16.979667, + 48.123497 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"AZE", + "properties":{ + "name":"Azerbaijan" + }, + "geometry":{ + "type":"MultiPolygon", + "coordinates":[ + [ + [ + [ + 45.001987, + 39.740004 + ], + [ + 45.298145, + 39.471751 + ], + [ + 45.739978, + 39.473999 + ], + [ + 45.735379, + 39.319719 + ], + [ + 46.143623, + 38.741201 + ], + [ + 45.457722, + 38.874139 + ], + [ + 44.952688, + 39.335765 + ], + [ + 44.79399, + 39.713003 + ], + [ + 45.001987, + 39.740004 + ] + ] + ], + [ + [ + [ + 47.373315, + 41.219732 + ], + [ + 47.815666, + 41.151416 + ], + [ + 47.987283, + 41.405819 + ], + [ + 48.584353, + 41.80887 + ], + [ + 49.110264, + 41.282287 + ], + [ + 49.618915, + 40.572924 + ], + [ + 50.08483, + 40.526157 + ], + [ + 50.392821, + 40.256561 + ], + [ + 49.569202, + 40.176101 + ], + [ + 49.395259, + 39.399482 + ], + [ + 49.223228, + 39.049219 + ], + [ + 48.856532, + 38.815486 + ], + [ + 48.883249, + 38.320245 + ], + [ + 48.634375, + 38.270378 + ], + [ + 48.010744, + 38.794015 + ], + [ + 48.355529, + 39.288765 + ], + [ + 48.060095, + 39.582235 + ], + [ + 47.685079, + 39.508364 + ], + [ + 46.50572, + 38.770605 + ], + [ + 46.483499, + 39.464155 + ], + [ + 46.034534, + 39.628021 + ], + [ + 45.610012, + 39.899994 + ], + [ + 45.891907, + 40.218476 + ], + [ + 45.359175, + 40.561504 + ], + [ + 45.560351, + 40.81229 + ], + [ + 45.179496, + 40.985354 + ], + [ + 44.97248, + 41.248129 + ], + [ + 45.217426, + 41.411452 + ], + [ + 45.962601, + 41.123873 + ], + [ + 46.501637, + 41.064445 + ], + [ + 46.637908, + 41.181673 + ], + [ + 46.145432, + 41.722802 + ], + [ + 46.404951, + 41.860675 + ], + [ + 46.686071, + 41.827137 + ], + [ + 47.373315, + 41.219732 + ] + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"BDI", + "properties":{ + "name":"Burundi" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 29.339998, + -4.499983 + ], + [ + 29.276384, + -3.293907 + ], + [ + 29.024926, + -2.839258 + ], + [ + 29.632176, + -2.917858 + ], + [ + 29.938359, + -2.348487 + ], + [ + 30.469696, + -2.413858 + ], + [ + 30.527677, + -2.807632 + ], + [ + 30.743013, + -3.034285 + ], + [ + 30.752263, + -3.35933 + ], + [ + 30.50556, + -3.568567 + ], + [ + 30.116333, + -4.090138 + ], + [ + 29.753512, + -4.452389 + ], + [ + 29.339998, + -4.499983 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"BEL", + "properties":{ + "name":"Belgium" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 3.314971, + 51.345781 + ], + [ + 4.047071, + 51.267259 + ], + [ + 4.973991, + 51.475024 + ], + [ + 5.606976, + 51.037298 + ], + [ + 6.156658, + 50.803721 + ], + [ + 6.043073, + 50.128052 + ], + [ + 5.782417, + 50.090328 + ], + [ + 5.674052, + 49.529484 + ], + [ + 4.799222, + 49.985373 + ], + [ + 4.286023, + 49.907497 + ], + [ + 3.588184, + 50.378992 + ], + [ + 3.123252, + 50.780363 + ], + [ + 2.658422, + 50.796848 + ], + [ + 2.513573, + 51.148506 + ], + [ + 3.314971, + 51.345781 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"BEN", + "properties":{ + "name":"Benin" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 2.691702, + 6.258817 + ], + [ + 1.865241, + 6.142158 + ], + [ + 1.618951, + 6.832038 + ], + [ + 1.664478, + 9.12859 + ], + [ + 1.463043, + 9.334624 + ], + [ + 1.425061, + 9.825395 + ], + [ + 1.077795, + 10.175607 + ], + [ + 0.772336, + 10.470808 + ], + [ + 0.899563, + 10.997339 + ], + [ + 1.24347, + 11.110511 + ], + [ + 1.447178, + 11.547719 + ], + [ + 1.935986, + 11.64115 + ], + [ + 2.154474, + 11.94015 + ], + [ + 2.490164, + 12.233052 + ], + [ + 2.848643, + 12.235636 + ], + [ + 3.61118, + 11.660167 + ], + [ + 3.572216, + 11.327939 + ], + [ + 3.797112, + 10.734746 + ], + [ + 3.60007, + 10.332186 + ], + [ + 3.705438, + 10.06321 + ], + [ + 3.220352, + 9.444153 + ], + [ + 2.912308, + 9.137608 + ], + [ + 2.723793, + 8.506845 + ], + [ + 2.749063, + 7.870734 + ], + [ + 2.691702, + 6.258817 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"BFA", + "properties":{ + "name":"Burkina Faso" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + -2.827496, + 9.642461 + ], + [ + -3.511899, + 9.900326 + ], + [ + -3.980449, + 9.862344 + ], + [ + -4.330247, + 9.610835 + ], + [ + -4.779884, + 9.821985 + ], + [ + -4.954653, + 10.152714 + ], + [ + -5.404342, + 10.370737 + ], + [ + -5.470565, + 10.95127 + ], + [ + -5.197843, + 11.375146 + ], + [ + -5.220942, + 11.713859 + ], + [ + -4.427166, + 12.542646 + ], + [ + -4.280405, + 13.228444 + ], + [ + -4.006391, + 13.472485 + ], + [ + -3.522803, + 13.337662 + ], + [ + -3.103707, + 13.541267 + ], + [ + -2.967694, + 13.79815 + ], + [ + -2.191825, + 14.246418 + ], + [ + -2.001035, + 14.559008 + ], + [ + -1.066363, + 14.973815 + ], + [ + -0.515854, + 15.116158 + ], + [ + -0.266257, + 14.924309 + ], + [ + 0.374892, + 14.928908 + ], + [ + 0.295646, + 14.444235 + ], + [ + 0.429928, + 13.988733 + ], + [ + 0.993046, + 13.33575 + ], + [ + 1.024103, + 12.851826 + ], + [ + 2.177108, + 12.625018 + ], + [ + 2.154474, + 11.94015 + ], + [ + 1.935986, + 11.64115 + ], + [ + 1.447178, + 11.547719 + ], + [ + 1.24347, + 11.110511 + ], + [ + 0.899563, + 10.997339 + ], + [ + 0.023803, + 11.018682 + ], + [ + -0.438702, + 11.098341 + ], + [ + -0.761576, + 10.93693 + ], + [ + -1.203358, + 11.009819 + ], + [ + -2.940409, + 10.96269 + ], + [ + -2.963896, + 10.395335 + ], + [ + -2.827496, + 9.642461 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"BGD", + "properties":{ + "name":"Bangladesh" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 92.672721, + 22.041239 + ], + [ + 92.652257, + 21.324048 + ], + [ + 92.303234, + 21.475485 + ], + [ + 92.368554, + 20.670883 + ], + [ + 92.082886, + 21.192195 + ], + [ + 92.025215, + 21.70157 + ], + [ + 91.834891, + 22.182936 + ], + [ + 91.417087, + 22.765019 + ], + [ + 90.496006, + 22.805017 + ], + [ + 90.586957, + 22.392794 + ], + [ + 90.272971, + 21.836368 + ], + [ + 89.847467, + 22.039146 + ], + [ + 89.70205, + 21.857116 + ], + [ + 89.418863, + 21.966179 + ], + [ + 89.031961, + 22.055708 + ], + [ + 88.876312, + 22.879146 + ], + [ + 88.52977, + 23.631142 + ], + [ + 88.69994, + 24.233715 + ], + [ + 88.084422, + 24.501657 + ], + [ + 88.306373, + 24.866079 + ], + [ + 88.931554, + 25.238692 + ], + [ + 88.209789, + 25.768066 + ], + [ + 88.563049, + 26.446526 + ], + [ + 89.355094, + 26.014407 + ], + [ + 89.832481, + 25.965082 + ], + [ + 89.920693, + 25.26975 + ], + [ + 90.872211, + 25.132601 + ], + [ + 91.799596, + 25.147432 + ], + [ + 92.376202, + 24.976693 + ], + [ + 91.915093, + 24.130414 + ], + [ + 91.46773, + 24.072639 + ], + [ + 91.158963, + 23.503527 + ], + [ + 91.706475, + 22.985264 + ], + [ + 91.869928, + 23.624346 + ], + [ + 92.146035, + 23.627499 + ], + [ + 92.672721, + 22.041239 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"BGR", + "properties":{ + "name":"Bulgaria" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 22.65715, + 44.234923 + ], + [ + 22.944832, + 43.823785 + ], + [ + 23.332302, + 43.897011 + ], + [ + 24.100679, + 43.741051 + ], + [ + 25.569272, + 43.688445 + ], + [ + 26.065159, + 43.943494 + ], + [ + 27.2424, + 44.175986 + ], + [ + 27.970107, + 43.812468 + ], + [ + 28.558081, + 43.707462 + ], + [ + 28.039095, + 43.293172 + ], + [ + 27.673898, + 42.577892 + ], + [ + 27.99672, + 42.007359 + ], + [ + 27.135739, + 42.141485 + ], + [ + 26.117042, + 41.826905 + ], + [ + 26.106138, + 41.328899 + ], + [ + 25.197201, + 41.234486 + ], + [ + 24.492645, + 41.583896 + ], + [ + 23.692074, + 41.309081 + ], + [ + 22.952377, + 41.337994 + ], + [ + 22.881374, + 41.999297 + ], + [ + 22.380526, + 42.32026 + ], + [ + 22.545012, + 42.461362 + ], + [ + 22.436595, + 42.580321 + ], + [ + 22.604801, + 42.898519 + ], + [ + 22.986019, + 43.211161 + ], + [ + 22.500157, + 43.642814 + ], + [ + 22.410446, + 44.008063 + ], + [ + 22.65715, + 44.234923 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"BHS", + "properties":{ + "name":"The Bahamas" + }, + "geometry":{ + "type":"MultiPolygon", + "coordinates":[ + [ + [ + [ + -77.53466, + 23.75975 + ], + [ + -77.78, + 23.71 + ], + [ + -78.03405, + 24.28615 + ], + [ + -78.40848, + 24.57564 + ], + [ + -78.19087, + 25.2103 + ], + [ + -77.89, + 25.17 + ], + [ + -77.54, + 24.34 + ], + [ + -77.53466, + 23.75975 + ] + ] + ], + [ + [ + [ + -77.82, + 26.58 + ], + [ + -78.91, + 26.42 + ], + [ + -78.98, + 26.79 + ], + [ + -78.51, + 26.87 + ], + [ + -77.85, + 26.84 + ], + [ + -77.82, + 26.58 + ] + ] + ], + [ + [ + [ + -77, + 26.59 + ], + [ + -77.17255, + 25.87918 + ], + [ + -77.35641, + 26.00735 + ], + [ + -77.34, + 26.53 + ], + [ + -77.78802, + 26.92516 + ], + [ + -77.79, + 27.04 + ], + [ + -77, + 26.59 + ] + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"BIH", + "properties":{ + "name":"Bosnia and Herzegovina" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 19.005486, + 44.860234 + ], + [ + 19.36803, + 44.863 + ], + [ + 19.11761, + 44.42307 + ], + [ + 19.59976, + 44.03847 + ], + [ + 19.454, + 43.5681 + ], + [ + 19.21852, + 43.52384 + ], + [ + 19.03165, + 43.43253 + ], + [ + 18.70648, + 43.20011 + ], + [ + 18.56, + 42.65 + ], + [ + 17.674922, + 43.028563 + ], + [ + 17.297373, + 43.446341 + ], + [ + 16.916156, + 43.667722 + ], + [ + 16.456443, + 44.04124 + ], + [ + 16.23966, + 44.351143 + ], + [ + 15.750026, + 44.818712 + ], + [ + 15.959367, + 45.233777 + ], + [ + 16.318157, + 45.004127 + ], + [ + 16.534939, + 45.211608 + ], + [ + 17.002146, + 45.233777 + ], + [ + 17.861783, + 45.06774 + ], + [ + 18.553214, + 45.08159 + ], + [ + 19.005486, + 44.860234 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"BLR", + "properties":{ + "name":"Belarus" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 23.484128, + 53.912498 + ], + [ + 24.450684, + 53.905702 + ], + [ + 25.536354, + 54.282423 + ], + [ + 25.768433, + 54.846963 + ], + [ + 26.588279, + 55.167176 + ], + [ + 26.494331, + 55.615107 + ], + [ + 27.10246, + 55.783314 + ], + [ + 28.176709, + 56.16913 + ], + [ + 29.229513, + 55.918344 + ], + [ + 29.371572, + 55.670091 + ], + [ + 29.896294, + 55.789463 + ], + [ + 30.873909, + 55.550976 + ], + [ + 30.971836, + 55.081548 + ], + [ + 30.757534, + 54.811771 + ], + [ + 31.384472, + 54.157056 + ], + [ + 31.791424, + 53.974639 + ], + [ + 31.731273, + 53.794029 + ], + [ + 32.405599, + 53.618045 + ], + [ + 32.693643, + 53.351421 + ], + [ + 32.304519, + 53.132726 + ], + [ + 31.497644, + 53.167427 + ], + [ + 31.305201, + 53.073996 + ], + [ + 31.540018, + 52.742052 + ], + [ + 31.785998, + 52.101678 + ], + [ + 30.927549, + 52.042353 + ], + [ + 30.619454, + 51.822806 + ], + [ + 30.555117, + 51.319503 + ], + [ + 30.157364, + 51.416138 + ], + [ + 29.254938, + 51.368234 + ], + [ + 28.992835, + 51.602044 + ], + [ + 28.617613, + 51.427714 + ], + [ + 28.241615, + 51.572227 + ], + [ + 27.454066, + 51.592303 + ], + [ + 26.337959, + 51.832289 + ], + [ + 25.327788, + 51.910656 + ], + [ + 24.553106, + 51.888461 + ], + [ + 24.005078, + 51.617444 + ], + [ + 23.527071, + 51.578454 + ], + [ + 23.508002, + 52.023647 + ], + [ + 23.199494, + 52.486977 + ], + [ + 23.799199, + 52.691099 + ], + [ + 23.804935, + 53.089731 + ], + [ + 23.527536, + 53.470122 + ], + [ + 23.484128, + 53.912498 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"BLZ", + "properties":{ + "name":"Belize" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + -89.14308, + 17.808319 + ], + [ + -89.150909, + 17.955468 + ], + [ + -89.029857, + 18.001511 + ], + [ + -88.848344, + 17.883198 + ], + [ + -88.490123, + 18.486831 + ], + [ + -88.300031, + 18.499982 + ], + [ + -88.296336, + 18.353273 + ], + [ + -88.106813, + 18.348674 + ], + [ + -88.123479, + 18.076675 + ], + [ + -88.285355, + 17.644143 + ], + [ + -88.197867, + 17.489475 + ], + [ + -88.302641, + 17.131694 + ], + [ + -88.239518, + 17.036066 + ], + [ + -88.355428, + 16.530774 + ], + [ + -88.551825, + 16.265467 + ], + [ + -88.732434, + 16.233635 + ], + [ + -88.930613, + 15.887273 + ], + [ + -89.229122, + 15.886938 + ], + [ + -89.150806, + 17.015577 + ], + [ + -89.14308, + 17.808319 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"BMU", + "properties":{ + "name":"Bermuda" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + -64.7799734332998, + 32.3072000581802 + ], + [ + -64.7873319183061, + 32.3039237143428 + ], + [ + -64.7946942710173, + 32.3032682700388 + ], + [ + -64.8094297981283, + 32.3098175728414 + ], + [ + -64.8167896352437, + 32.3058845718466 + ], + [ + -64.8101968029642, + 32.3022833180511 + ], + [ + -64.7962291465484, + 32.2934409732427 + ], + [ + -64.7815086336978, + 32.2868973114514 + ], + [ + -64.7997025513437, + 32.2796896417328 + ], + [ + -64.8066707691087, + 32.2747767569465 + ], + [ + -64.8225587873683, + 32.2669111289395 + ], + [ + -64.8287548840306, + 32.2669075473817 + ], + [ + -64.8306732143498, + 32.2583944840235 + ], + [ + -64.8399924854972, + 32.254782282336 + ], + [ + -64.8566090462354, + 32.2547740387514 + ], + [ + -64.8682296789446, + 32.2616393614322 + ], + [ + -64.8628241459563, + 32.2724481933959 + ], + [ + -64.8748651338951, + 32.2757120264753 + ], + [ + -64.8717752856644, + 32.2819371582026 + ], + [ + -64.8671422127295, + 32.2930760547989 + ], + [ + -64.8559068764437, + 32.2960321186471 + ], + [ + -64.8597429072279, + 32.3015842021933 + ], + [ + -64.8439233486717, + 32.3140553852543 + ], + [ + -64.8350242329311, + 32.3242161760006 + ], + [ + -64.8338690593672, + 32.3294587561557 + ], + [ + -64.8520298651164, + 32.3110911879954 + ], + [ + -64.8635922932573, + 32.3048469433363 + ], + [ + -64.8686668994079, + 32.30910745083 + ], + [ + -64.8721354593415, + 32.3041908606301 + ], + [ + -64.8779667328485, + 32.3038632800462 + ], + [ + -64.8780046844321, + 32.2907757831692 + ], + [ + -64.8849776658292, + 32.2819261366004 + ], + [ + -64.8783230004629, + 32.2613001418681 + ], + [ + -64.863194968877, + 32.2465799485801 + ], + [ + -64.8519819555722, + 32.2485519134663 + ], + [ + -64.842311980074, + 32.2492123317296 + ], + [ + -64.8388242605209, + 32.2475773472534 + ], + [ + -64.8334002575532, + 32.2462714714698 + ], + [ + -64.8256389530584, + 32.2472637398594 + ], + [ + -64.8205697556026, + 32.2531698880328 + ], + [ + -64.8105087275579, + 32.2561208974156 + ], + [ + -64.7900177727338, + 32.2659446936992 + ], + [ + -64.7745415970416, + 32.2718413023427 + ], + [ + -64.7644742436426, + 32.2855931353214 + ], + [ + -64.7551803442276, + 32.2908326702531 + ], + [ + -64.7423982971436, + 32.2996734994024 + ], + [ + -64.7206991797682, + 32.3137542201258 + ], + [ + -64.7117851247134, + 32.3176823360806 + ], + [ + -64.6962778813133, + 32.3275029115532 + ], + [ + -64.6768921127452, + 32.3324095397555 + ], + [ + -64.6567136927777, + 32.3451776458469 + ], + [ + -64.6532168823499, + 32.3494356627941 + ], + [ + -64.6605720384429, + 32.3589423487763 + ], + [ + -64.65125819471, + 32.3615600906466 + ], + [ + -64.6462011670816, + 32.36975169749 + ], + [ + -64.6613227512832, + 32.3763135008721 + ], + [ + -64.6690666074397, + 32.388444543924 + ], + [ + -64.6834270548595, + 32.3854968316788 + ], + [ + -64.6954617672714, + 32.3763221285869 + ], + [ + -64.70438689565, + 32.3704254760469 + ], + [ + -64.7117569982798, + 32.368132600249 + ], + [ + -64.7061764744404, + 32.3600110593559 + ], + [ + -64.700531552697, + 32.3590601356818 + ], + [ + -64.6940348033967, + 32.3640708659835 + ], + [ + -64.6895164826082, + 32.3633598579866 + ], + [ + -64.6864150099255, + 32.3547797587266 + ], + [ + -64.6824635995504, + 32.3540628176846 + ], + [ + -64.6835876652835, + 32.3626447677968 + ], + [ + -64.6801998697415, + 32.3631199096979 + ], + [ + -64.6672170444687, + 32.3597751617473 + ], + [ + -64.6598811264978, + 32.3497625771755 + ], + [ + -64.6737331235384, + 32.3390281851635 + ], + [ + -64.6887090648183, + 32.3342439408053 + ], + [ + -64.706732854446, + 32.3429010723036 + ], + [ + -64.7149301576112, + 32.3552188753513 + ], + [ + -64.7185967666669, + 32.3552239212394 + ], + [ + -64.7214189847314, + 32.3518830231342 + ], + [ + -64.7270616067222, + 32.3466461715475 + ], + [ + -64.734962460882, + 32.3442819830499 + ], + [ + -64.7383521549094, + 32.3407216514918 + ], + [ + -64.7411729976333, + 32.3311790864627 + ], + [ + -64.7423019216485, + 32.323311561213 + ], + [ + -64.7462482354281, + 32.318538611581 + ], + [ + -64.7566773739613, + 32.3130509130175 + ], + [ + -64.768738200563, + 32.3088369816572 + ], + [ + -64.7799734332998, + 32.3072000581802 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"BOL", + "properties":{ + "name":"Bolivia" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + -62.846468, + -22.034985 + ], + [ + -63.986838, + -21.993644 + ], + [ + -64.377021, + -22.798091 + ], + [ + -64.964892, + -22.075862 + ], + [ + -66.273339, + -21.83231 + ], + [ + -67.106674, + -22.735925 + ], + [ + -67.82818, + -22.872919 + ], + [ + -68.219913, + -21.494347 + ], + [ + -68.757167, + -20.372658 + ], + [ + -68.442225, + -19.405068 + ], + [ + -68.966818, + -18.981683 + ], + [ + -69.100247, + -18.260125 + ], + [ + -69.590424, + -17.580012 + ], + [ + -68.959635, + -16.500698 + ], + [ + -69.389764, + -15.660129 + ], + [ + -69.160347, + -15.323974 + ], + [ + -69.339535, + -14.953195 + ], + [ + -68.948887, + -14.453639 + ], + [ + -68.929224, + -13.602684 + ], + [ + -68.88008, + -12.899729 + ], + [ + -68.66508, + -12.5613 + ], + [ + -69.529678, + -10.951734 + ], + [ + -68.786158, + -11.03638 + ], + [ + -68.271254, + -11.014521 + ], + [ + -68.048192, + -10.712059 + ], + [ + -67.173801, + -10.306812 + ], + [ + -66.646908, + -9.931331 + ], + [ + -65.338435, + -9.761988 + ], + [ + -65.444837, + -10.511451 + ], + [ + -65.321899, + -10.895872 + ], + [ + -65.402281, + -11.56627 + ], + [ + -64.316353, + -12.461978 + ], + [ + -63.196499, + -12.627033 + ], + [ + -62.80306, + -13.000653 + ], + [ + -62.127081, + -13.198781 + ], + [ + -61.713204, + -13.489202 + ], + [ + -61.084121, + -13.479384 + ], + [ + -60.503304, + -13.775955 + ], + [ + -60.459198, + -14.354007 + ], + [ + -60.264326, + -14.645979 + ], + [ + -60.251149, + -15.077219 + ], + [ + -60.542966, + -15.09391 + ], + [ + -60.15839, + -16.258284 + ], + [ + -58.24122, + -16.299573 + ], + [ + -58.388058, + -16.877109 + ], + [ + -58.280804, + -17.27171 + ], + [ + -57.734558, + -17.552468 + ], + [ + -57.498371, + -18.174188 + ], + [ + -57.676009, + -18.96184 + ], + [ + -57.949997, + -19.400004 + ], + [ + -57.853802, + -19.969995 + ], + [ + -58.166392, + -20.176701 + ], + [ + -58.183471, + -19.868399 + ], + [ + -59.115042, + -19.356906 + ], + [ + -60.043565, + -19.342747 + ], + [ + -61.786326, + -19.633737 + ], + [ + -62.265961, + -20.513735 + ], + [ + -62.291179, + -21.051635 + ], + [ + -62.685057, + -22.249029 + ], + [ + -62.846468, + -22.034985 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"BRA", + "properties":{ + "name":"Brazil" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + -57.625133, + -30.216295 + ], + [ + -56.2909, + -28.852761 + ], + [ + -55.162286, + -27.881915 + ], + [ + -54.490725, + -27.474757 + ], + [ + -53.648735, + -26.923473 + ], + [ + -53.628349, + -26.124865 + ], + [ + -54.13005, + -25.547639 + ], + [ + -54.625291, + -25.739255 + ], + [ + -54.428946, + -25.162185 + ], + [ + -54.293476, + -24.5708 + ], + [ + -54.29296, + -24.021014 + ], + [ + -54.652834, + -23.839578 + ], + [ + -55.027902, + -24.001274 + ], + [ + -55.400747, + -23.956935 + ], + [ + -55.517639, + -23.571998 + ], + [ + -55.610683, + -22.655619 + ], + [ + -55.797958, + -22.35693 + ], + [ + -56.473317, + -22.0863 + ], + [ + -56.88151, + -22.282154 + ], + [ + -57.937156, + -22.090176 + ], + [ + -57.870674, + -20.732688 + ], + [ + -58.166392, + -20.176701 + ], + [ + -57.853802, + -19.969995 + ], + [ + -57.949997, + -19.400004 + ], + [ + -57.676009, + -18.96184 + ], + [ + -57.498371, + -18.174188 + ], + [ + -57.734558, + -17.552468 + ], + [ + -58.280804, + -17.27171 + ], + [ + -58.388058, + -16.877109 + ], + [ + -58.24122, + -16.299573 + ], + [ + -60.15839, + -16.258284 + ], + [ + -60.542966, + -15.09391 + ], + [ + -60.251149, + -15.077219 + ], + [ + -60.264326, + -14.645979 + ], + [ + -60.459198, + -14.354007 + ], + [ + -60.503304, + -13.775955 + ], + [ + -61.084121, + -13.479384 + ], + [ + -61.713204, + -13.489202 + ], + [ + -62.127081, + -13.198781 + ], + [ + -62.80306, + -13.000653 + ], + [ + -63.196499, + -12.627033 + ], + [ + -64.316353, + -12.461978 + ], + [ + -65.402281, + -11.56627 + ], + [ + -65.321899, + -10.895872 + ], + [ + -65.444837, + -10.511451 + ], + [ + -65.338435, + -9.761988 + ], + [ + -66.646908, + -9.931331 + ], + [ + -67.173801, + -10.306812 + ], + [ + -68.048192, + -10.712059 + ], + [ + -68.271254, + -11.014521 + ], + [ + -68.786158, + -11.03638 + ], + [ + -69.529678, + -10.951734 + ], + [ + -70.093752, + -11.123972 + ], + [ + -70.548686, + -11.009147 + ], + [ + -70.481894, + -9.490118 + ], + [ + -71.302412, + -10.079436 + ], + [ + -72.184891, + -10.053598 + ], + [ + -72.563033, + -9.520194 + ], + [ + -73.226713, + -9.462213 + ], + [ + -73.015383, + -9.032833 + ], + [ + -73.571059, + -8.424447 + ], + [ + -73.987235, + -7.52383 + ], + [ + -73.723401, + -7.340999 + ], + [ + -73.724487, + -6.918595 + ], + [ + -73.120027, + -6.629931 + ], + [ + -73.219711, + -6.089189 + ], + [ + -72.964507, + -5.741251 + ], + [ + -72.891928, + -5.274561 + ], + [ + -71.748406, + -4.593983 + ], + [ + -70.928843, + -4.401591 + ], + [ + -70.794769, + -4.251265 + ], + [ + -69.893635, + -4.298187 + ], + [ + -69.444102, + -1.556287 + ], + [ + -69.420486, + -1.122619 + ], + [ + -69.577065, + -0.549992 + ], + [ + -70.020656, + -0.185156 + ], + [ + -70.015566, + 0.541414 + ], + [ + -69.452396, + 0.706159 + ], + [ + -69.252434, + 0.602651 + ], + [ + -69.218638, + 0.985677 + ], + [ + -69.804597, + 1.089081 + ], + [ + -69.816973, + 1.714805 + ], + [ + -67.868565, + 1.692455 + ], + [ + -67.53781, + 2.037163 + ], + [ + -67.259998, + 1.719999 + ], + [ + -67.065048, + 1.130112 + ], + [ + -66.876326, + 1.253361 + ], + [ + -66.325765, + 0.724452 + ], + [ + -65.548267, + 0.789254 + ], + [ + -65.354713, + 1.095282 + ], + [ + -64.611012, + 1.328731 + ], + [ + -64.199306, + 1.492855 + ], + [ + -64.083085, + 1.916369 + ], + [ + -63.368788, + 2.2009 + ], + [ + -63.422867, + 2.411068 + ], + [ + -64.269999, + 2.497006 + ], + [ + -64.408828, + 3.126786 + ], + [ + -64.368494, + 3.79721 + ], + [ + -64.816064, + 4.056445 + ], + [ + -64.628659, + 4.148481 + ], + [ + -63.888343, + 4.02053 + ], + [ + -63.093198, + 3.770571 + ], + [ + -62.804533, + 4.006965 + ], + [ + -62.08543, + 4.162124 + ], + [ + -60.966893, + 4.536468 + ], + [ + -60.601179, + 4.918098 + ], + [ + -60.733574, + 5.200277 + ], + [ + -60.213683, + 5.244486 + ], + [ + -59.980959, + 5.014061 + ], + [ + -60.111002, + 4.574967 + ], + [ + -59.767406, + 4.423503 + ], + [ + -59.53804, + 3.958803 + ], + [ + -59.815413, + 3.606499 + ], + [ + -59.974525, + 2.755233 + ], + [ + -59.718546, + 2.24963 + ], + [ + -59.646044, + 1.786894 + ], + [ + -59.030862, + 1.317698 + ], + [ + -58.540013, + 1.268088 + ], + [ + -58.429477, + 1.463942 + ], + [ + -58.11345, + 1.507195 + ], + [ + -57.660971, + 1.682585 + ], + [ + -57.335823, + 1.948538 + ], + [ + -56.782704, + 1.863711 + ], + [ + -56.539386, + 1.899523 + ], + [ + -55.995698, + 1.817667 + ], + [ + -55.9056, + 2.021996 + ], + [ + -56.073342, + 2.220795 + ], + [ + -55.973322, + 2.510364 + ], + [ + -55.569755, + 2.421506 + ], + [ + -55.097587, + 2.523748 + ], + [ + -54.524754, + 2.311849 + ], + [ + -54.088063, + 2.105557 + ], + [ + -53.778521, + 2.376703 + ], + [ + -53.554839, + 2.334897 + ], + [ + -53.418465, + 2.053389 + ], + [ + -52.939657, + 2.124858 + ], + [ + -52.556425, + 2.504705 + ], + [ + -52.249338, + 3.241094 + ], + [ + -51.657797, + 4.156232 + ], + [ + -51.317146, + 4.203491 + ], + [ + -51.069771, + 3.650398 + ], + [ + -50.508875, + 1.901564 + ], + [ + -49.974076, + 1.736483 + ], + [ + -49.947101, + 1.04619 + ], + [ + -50.699251, + 0.222984 + ], + [ + -50.388211, + -0.078445 + ], + [ + -48.620567, + -0.235489 + ], + [ + -48.584497, + -1.237805 + ], + [ + -47.824956, + -0.581618 + ], + [ + -46.566584, + -0.941028 + ], + [ + -44.905703, + -1.55174 + ], + [ + -44.417619, + -2.13775 + ], + [ + -44.581589, + -2.691308 + ], + [ + -43.418791, + -2.38311 + ], + [ + -41.472657, + -2.912018 + ], + [ + -39.978665, + -2.873054 + ], + [ + -38.500383, + -3.700652 + ], + [ + -37.223252, + -4.820946 + ], + [ + -36.452937, + -5.109404 + ], + [ + -35.597796, + -5.149504 + ], + [ + -35.235389, + -5.464937 + ], + [ + -34.89603, + -6.738193 + ], + [ + -34.729993, + -7.343221 + ], + [ + -35.128212, + -8.996401 + ], + [ + -35.636967, + -9.649282 + ], + [ + -37.046519, + -11.040721 + ], + [ + -37.683612, + -12.171195 + ], + [ + -38.423877, + -13.038119 + ], + [ + -38.673887, + -13.057652 + ], + [ + -38.953276, + -13.79337 + ], + [ + -38.882298, + -15.667054 + ], + [ + -39.161092, + -17.208407 + ], + [ + -39.267339, + -17.867746 + ], + [ + -39.583521, + -18.262296 + ], + [ + -39.760823, + -19.599113 + ], + [ + -40.774741, + -20.904512 + ], + [ + -40.944756, + -21.937317 + ], + [ + -41.754164, + -22.370676 + ], + [ + -41.988284, + -22.97007 + ], + [ + -43.074704, + -22.967693 + ], + [ + -44.647812, + -23.351959 + ], + [ + -45.352136, + -23.796842 + ], + [ + -46.472093, + -24.088969 + ], + [ + -47.648972, + -24.885199 + ], + [ + -48.495458, + -25.877025 + ], + [ + -48.641005, + -26.623698 + ], + [ + -48.474736, + -27.175912 + ], + [ + -48.66152, + -28.186135 + ], + [ + -48.888457, + -28.674115 + ], + [ + -49.587329, + -29.224469 + ], + [ + -50.696874, + -30.984465 + ], + [ + -51.576226, + -31.777698 + ], + [ + -52.256081, + -32.24537 + ], + [ + -52.7121, + -33.196578 + ], + [ + -53.373662, + -33.768378 + ], + [ + -53.650544, + -33.202004 + ], + [ + -53.209589, + -32.727666 + ], + [ + -53.787952, + -32.047243 + ], + [ + -54.572452, + -31.494511 + ], + [ + -55.60151, + -30.853879 + ], + [ + -55.973245, + -30.883076 + ], + [ + -56.976026, + -30.109686 + ], + [ + -57.625133, + -30.216295 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"BRN", + "properties":{ + "name":"Brunei" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 114.204017, + 4.525874 + ], + [ + 114.599961, + 4.900011 + ], + [ + 115.45071, + 5.44773 + ], + [ + 115.4057, + 4.955228 + ], + [ + 115.347461, + 4.316636 + ], + [ + 114.869557, + 4.348314 + ], + [ + 114.659596, + 4.007637 + ], + [ + 114.204017, + 4.525874 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"BTN", + "properties":{ + "name":"Bhutan" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 91.696657, + 27.771742 + ], + [ + 92.103712, + 27.452614 + ], + [ + 92.033484, + 26.83831 + ], + [ + 91.217513, + 26.808648 + ], + [ + 90.373275, + 26.875724 + ], + [ + 89.744528, + 26.719403 + ], + [ + 88.835643, + 27.098966 + ], + [ + 88.814248, + 27.299316 + ], + [ + 89.47581, + 28.042759 + ], + [ + 90.015829, + 28.296439 + ], + [ + 90.730514, + 28.064954 + ], + [ + 91.258854, + 28.040614 + ], + [ + 91.696657, + 27.771742 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"BWA", + "properties":{ + "name":"Botswana" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 25.649163, + -18.536026 + ], + [ + 25.850391, + -18.714413 + ], + [ + 26.164791, + -19.293086 + ], + [ + 27.296505, + -20.39152 + ], + [ + 27.724747, + -20.499059 + ], + [ + 27.727228, + -20.851802 + ], + [ + 28.02137, + -21.485975 + ], + [ + 28.794656, + -21.639454 + ], + [ + 29.432188, + -22.091313 + ], + [ + 28.017236, + -22.827754 + ], + [ + 27.11941, + -23.574323 + ], + [ + 26.786407, + -24.240691 + ], + [ + 26.485753, + -24.616327 + ], + [ + 25.941652, + -24.696373 + ], + [ + 25.765849, + -25.174845 + ], + [ + 25.664666, + -25.486816 + ], + [ + 25.025171, + -25.71967 + ], + [ + 24.211267, + -25.670216 + ], + [ + 23.73357, + -25.390129 + ], + [ + 23.312097, + -25.26869 + ], + [ + 22.824271, + -25.500459 + ], + [ + 22.579532, + -25.979448 + ], + [ + 22.105969, + -26.280256 + ], + [ + 21.605896, + -26.726534 + ], + [ + 20.889609, + -26.828543 + ], + [ + 20.66647, + -26.477453 + ], + [ + 20.758609, + -25.868136 + ], + [ + 20.165726, + -24.917962 + ], + [ + 19.895768, + -24.76779 + ], + [ + 19.895458, + -21.849157 + ], + [ + 20.881134, + -21.814327 + ], + [ + 20.910641, + -18.252219 + ], + [ + 21.65504, + -18.219146 + ], + [ + 23.196858, + -17.869038 + ], + [ + 23.579006, + -18.281261 + ], + [ + 24.217365, + -17.889347 + ], + [ + 24.520705, + -17.887125 + ], + [ + 25.084443, + -17.661816 + ], + [ + 25.264226, + -17.73654 + ], + [ + 25.649163, + -18.536026 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"CAF", + "properties":{ + "name":"Central African Republic" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 15.27946, + 7.421925 + ], + [ + 16.106232, + 7.497088 + ], + [ + 16.290562, + 7.754307 + ], + [ + 16.456185, + 7.734774 + ], + [ + 16.705988, + 7.508328 + ], + [ + 17.96493, + 7.890914 + ], + [ + 18.389555, + 8.281304 + ], + [ + 18.911022, + 8.630895 + ], + [ + 18.81201, + 8.982915 + ], + [ + 19.094008, + 9.074847 + ], + [ + 20.059685, + 9.012706 + ], + [ + 21.000868, + 9.475985 + ], + [ + 21.723822, + 10.567056 + ], + [ + 22.231129, + 10.971889 + ], + [ + 22.864165, + 11.142395 + ], + [ + 22.977544, + 10.714463 + ], + [ + 23.554304, + 10.089255 + ], + [ + 23.55725, + 9.681218 + ], + [ + 23.394779, + 9.265068 + ], + [ + 23.459013, + 8.954286 + ], + [ + 23.805813, + 8.666319 + ], + [ + 24.567369, + 8.229188 + ], + [ + 25.114932, + 7.825104 + ], + [ + 25.124131, + 7.500085 + ], + [ + 25.796648, + 6.979316 + ], + [ + 26.213418, + 6.546603 + ], + [ + 26.465909, + 5.946717 + ], + [ + 27.213409, + 5.550953 + ], + [ + 27.374226, + 5.233944 + ], + [ + 27.044065, + 5.127853 + ], + [ + 26.402761, + 5.150875 + ], + [ + 25.650455, + 5.256088 + ], + [ + 25.278798, + 5.170408 + ], + [ + 25.128833, + 4.927245 + ], + [ + 24.805029, + 4.897247 + ], + [ + 24.410531, + 5.108784 + ], + [ + 23.297214, + 4.609693 + ], + [ + 22.84148, + 4.710126 + ], + [ + 22.704124, + 4.633051 + ], + [ + 22.405124, + 4.02916 + ], + [ + 21.659123, + 4.224342 + ], + [ + 20.927591, + 4.322786 + ], + [ + 20.290679, + 4.691678 + ], + [ + 19.467784, + 5.031528 + ], + [ + 18.932312, + 4.709506 + ], + [ + 18.542982, + 4.201785 + ], + [ + 18.453065, + 3.504386 + ], + [ + 17.8099, + 3.560196 + ], + [ + 17.133042, + 3.728197 + ], + [ + 16.537058, + 3.198255 + ], + [ + 16.012852, + 2.26764 + ], + [ + 15.907381, + 2.557389 + ], + [ + 15.862732, + 3.013537 + ], + [ + 15.405396, + 3.335301 + ], + [ + 15.03622, + 3.851367 + ], + [ + 14.950953, + 4.210389 + ], + [ + 14.478372, + 4.732605 + ], + [ + 14.558936, + 5.030598 + ], + [ + 14.459407, + 5.451761 + ], + [ + 14.53656, + 6.226959 + ], + [ + 14.776545, + 6.408498 + ], + [ + 15.27946, + 7.421925 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"CAN", + "properties":{ + "name":"Canada" + }, + "geometry":{ + "type":"MultiPolygon", + "coordinates":[ + [ + [ + [ + -63.6645, + 46.55001 + ], + [ + -62.9393, + 46.41587 + ], + [ + -62.01208, + 46.44314 + ], + [ + -62.50391, + 46.03339 + ], + [ + -62.87433, + 45.96818 + ], + [ + -64.1428, + 46.39265 + ], + [ + -64.39261, + 46.72747 + ], + [ + -64.01486, + 47.03601 + ], + [ + -63.6645, + 46.55001 + ] + ] + ], + [ + [ + [ + -61.806305, + 49.10506 + ], + [ + -62.29318, + 49.08717 + ], + [ + -63.58926, + 49.40069 + ], + [ + -64.51912, + 49.87304 + ], + [ + -64.17322, + 49.95718 + ], + [ + -62.85829, + 49.70641 + ], + [ + -61.835585, + 49.28855 + ], + [ + -61.806305, + 49.10506 + ] + ] + ], + [ + [ + [ + -123.510002, + 48.510011 + ], + [ + -124.012891, + 48.370846 + ], + [ + -125.655013, + 48.825005 + ], + [ + -125.954994, + 49.179996 + ], + [ + -126.850004, + 49.53 + ], + [ + -127.029993, + 49.814996 + ], + [ + -128.059336, + 49.994959 + ], + [ + -128.444584, + 50.539138 + ], + [ + -128.358414, + 50.770648 + ], + [ + -127.308581, + 50.552574 + ], + [ + -126.695001, + 50.400903 + ], + [ + -125.755007, + 50.295018 + ], + [ + -125.415002, + 49.950001 + ], + [ + -124.920768, + 49.475275 + ], + [ + -123.922509, + 49.062484 + ], + [ + -123.510002, + 48.510011 + ] + ] + ], + [ + [ + [ + -56.134036, + 50.68701 + ], + [ + -56.795882, + 49.812309 + ], + [ + -56.143105, + 50.150117 + ], + [ + -55.471492, + 49.935815 + ], + [ + -55.822401, + 49.587129 + ], + [ + -54.935143, + 49.313011 + ], + [ + -54.473775, + 49.556691 + ], + [ + -53.476549, + 49.249139 + ], + [ + -53.786014, + 48.516781 + ], + [ + -53.086134, + 48.687804 + ], + [ + -52.958648, + 48.157164 + ], + [ + -52.648099, + 47.535548 + ], + [ + -53.069158, + 46.655499 + ], + [ + -53.521456, + 46.618292 + ], + [ + -54.178936, + 46.807066 + ], + [ + -53.961869, + 47.625207 + ], + [ + -54.240482, + 47.752279 + ], + [ + -55.400773, + 46.884994 + ], + [ + -55.997481, + 46.91972 + ], + [ + -55.291219, + 47.389562 + ], + [ + -56.250799, + 47.632545 + ], + [ + -57.325229, + 47.572807 + ], + [ + -59.266015, + 47.603348 + ], + [ + -59.419494, + 47.899454 + ], + [ + -58.796586, + 48.251525 + ], + [ + -59.231625, + 48.523188 + ], + [ + -58.391805, + 49.125581 + ], + [ + -57.35869, + 50.718274 + ], + [ + -56.73865, + 51.287438 + ], + [ + -55.870977, + 51.632094 + ], + [ + -55.406974, + 51.588273 + ], + [ + -55.600218, + 51.317075 + ], + [ + -56.134036, + 50.68701 + ] + ] + ], + [ + [ + [ + -132.710008, + 54.040009 + ], + [ + -131.74999, + 54.120004 + ], + [ + -132.04948, + 52.984621 + ], + [ + -131.179043, + 52.180433 + ], + [ + -131.57783, + 52.182371 + ], + [ + -132.180428, + 52.639707 + ], + [ + -132.549992, + 53.100015 + ], + [ + -133.054611, + 53.411469 + ], + [ + -133.239664, + 53.85108 + ], + [ + -133.180004, + 54.169975 + ], + [ + -132.710008, + 54.040009 + ] + ] + ], + [ + [ + [ + -79.26582, + 62.158675 + ], + [ + -79.65752, + 61.63308 + ], + [ + -80.09956, + 61.7181 + ], + [ + -80.36215, + 62.01649 + ], + [ + -80.315395, + 62.085565 + ], + [ + -79.92939, + 62.3856 + ], + [ + -79.52002, + 62.36371 + ], + [ + -79.26582, + 62.158675 + ] + ] + ], + [ + [ + [ + -81.89825, + 62.7108 + ], + [ + -83.06857, + 62.15922 + ], + [ + -83.77462, + 62.18231 + ], + [ + -83.99367, + 62.4528 + ], + [ + -83.25048, + 62.91409 + ], + [ + -81.87699, + 62.90458 + ], + [ + -81.89825, + 62.7108 + ] + ] + ], + [ + [ + [ + -85.161308, + 65.657285 + ], + [ + -84.975764, + 65.217518 + ], + [ + -84.464012, + 65.371772 + ], + [ + -83.882626, + 65.109618 + ], + [ + -82.787577, + 64.766693 + ], + [ + -81.642014, + 64.455136 + ], + [ + -81.55344, + 63.979609 + ], + [ + -80.817361, + 64.057486 + ], + [ + -80.103451, + 63.725981 + ], + [ + -80.99102, + 63.411246 + ], + [ + -82.547178, + 63.651722 + ], + [ + -83.108798, + 64.101876 + ], + [ + -84.100417, + 63.569712 + ], + [ + -85.523405, + 63.052379 + ], + [ + -85.866769, + 63.637253 + ], + [ + -87.221983, + 63.541238 + ], + [ + -86.35276, + 64.035833 + ], + [ + -86.224886, + 64.822917 + ], + [ + -85.883848, + 65.738778 + ], + [ + -85.161308, + 65.657285 + ] + ] + ], + [ + [ + [ + -75.86588, + 67.14886 + ], + [ + -76.98687, + 67.09873 + ], + [ + -77.2364, + 67.58809 + ], + [ + -76.81166, + 68.14856 + ], + [ + -75.89521, + 68.28721 + ], + [ + -75.1145, + 68.01036 + ], + [ + -75.10333, + 67.58202 + ], + [ + -75.21597, + 67.44425 + ], + [ + -75.86588, + 67.14886 + ] + ] + ], + [ + [ + [ + -95.647681, + 69.10769 + ], + [ + -96.269521, + 68.75704 + ], + [ + -97.617401, + 69.06003 + ], + [ + -98.431801, + 68.9507 + ], + [ + -99.797401, + 69.40003 + ], + [ + -98.917401, + 69.71003 + ], + [ + -98.218261, + 70.14354 + ], + [ + -97.157401, + 69.86003 + ], + [ + -96.557401, + 69.68003 + ], + [ + -96.257401, + 69.49003 + ], + [ + -95.647681, + 69.10769 + ] + ] + ], + [ + [ + [ + -90.5471, + 69.49766 + ], + [ + -90.55151, + 68.47499 + ], + [ + -89.21515, + 69.25873 + ], + [ + -88.01966, + 68.61508 + ], + [ + -88.31749, + 67.87338 + ], + [ + -87.35017, + 67.19872 + ], + [ + -86.30607, + 67.92146 + ], + [ + -85.57664, + 68.78456 + ], + [ + -85.52197, + 69.88211 + ], + [ + -84.10081, + 69.80539 + ], + [ + -82.62258, + 69.65826 + ], + [ + -81.28043, + 69.16202 + ], + [ + -81.2202, + 68.66567 + ], + [ + -81.96436, + 68.13253 + ], + [ + -81.25928, + 67.59716 + ], + [ + -81.38653, + 67.11078 + ], + [ + -83.34456, + 66.41154 + ], + [ + -84.73542, + 66.2573 + ], + [ + -85.76943, + 66.55833 + ], + [ + -86.0676, + 66.05625 + ], + [ + -87.03143, + 65.21297 + ], + [ + -87.32324, + 64.77563 + ], + [ + -88.48296, + 64.09897 + ], + [ + -89.91444, + 64.03273 + ], + [ + -90.70398, + 63.61017 + ], + [ + -90.77004, + 62.96021 + ], + [ + -91.93342, + 62.83508 + ], + [ + -93.15698, + 62.02469 + ], + [ + -94.24153, + 60.89865 + ], + [ + -94.62931, + 60.11021 + ], + [ + -94.6846, + 58.94882 + ], + [ + -93.21502, + 58.78212 + ], + [ + -92.76462, + 57.84571 + ], + [ + -92.29703, + 57.08709 + ], + [ + -90.89769, + 57.28468 + ], + [ + -89.03953, + 56.85172 + ], + [ + -88.03978, + 56.47162 + ], + [ + -87.32421, + 55.99914 + ], + [ + -86.07121, + 55.72383 + ], + [ + -85.01181, + 55.3026 + ], + [ + -83.36055, + 55.24489 + ], + [ + -82.27285, + 55.14832 + ], + [ + -82.4362, + 54.28227 + ], + [ + -82.12502, + 53.27703 + ], + [ + -81.40075, + 52.15788 + ], + [ + -79.91289, + 51.20842 + ], + [ + -79.14301, + 51.53393 + ], + [ + -78.60191, + 52.56208 + ], + [ + -79.12421, + 54.14145 + ], + [ + -79.82958, + 54.66772 + ], + [ + -78.22874, + 55.13645 + ], + [ + -77.0956, + 55.83741 + ], + [ + -76.54137, + 56.53423 + ], + [ + -76.62319, + 57.20263 + ], + [ + -77.30226, + 58.05209 + ], + [ + -78.51688, + 58.80458 + ], + [ + -77.33676, + 59.85261 + ], + [ + -77.77272, + 60.75788 + ], + [ + -78.10687, + 62.31964 + ], + [ + -77.41067, + 62.55053 + ], + [ + -75.69621, + 62.2784 + ], + [ + -74.6682, + 62.18111 + ], + [ + -73.83988, + 62.4438 + ], + [ + -72.90853, + 62.10507 + ], + [ + -71.67708, + 61.52535 + ], + [ + -71.37369, + 61.13717 + ], + [ + -69.59042, + 61.06141 + ], + [ + -69.62033, + 60.22125 + ], + [ + -69.2879, + 58.95736 + ], + [ + -68.37455, + 58.80106 + ], + [ + -67.64976, + 58.21206 + ], + [ + -66.20178, + 58.76731 + ], + [ + -65.24517, + 59.87071 + ], + [ + -64.58352, + 60.33558 + ], + [ + -63.80475, + 59.4426 + ], + [ + -62.50236, + 58.16708 + ], + [ + -61.39655, + 56.96745 + ], + [ + -61.79866, + 56.33945 + ], + [ + -60.46853, + 55.77548 + ], + [ + -59.56962, + 55.20407 + ], + [ + -57.97508, + 54.94549 + ], + [ + -57.3332, + 54.6265 + ], + [ + -56.93689, + 53.78032 + ], + [ + -56.15811, + 53.64749 + ], + [ + -55.75632, + 53.27036 + ], + [ + -55.68338, + 52.14664 + ], + [ + -56.40916, + 51.7707 + ], + [ + -57.12691, + 51.41972 + ], + [ + -58.77482, + 51.0643 + ], + [ + -60.03309, + 50.24277 + ], + [ + -61.72366, + 50.08046 + ], + [ + -63.86251, + 50.29099 + ], + [ + -65.36331, + 50.2982 + ], + [ + -66.39905, + 50.22897 + ], + [ + -67.23631, + 49.51156 + ], + [ + -68.51114, + 49.06836 + ], + [ + -69.95362, + 47.74488 + ], + [ + -71.10458, + 46.82171 + ], + [ + -70.25522, + 46.98606 + ], + [ + -68.65, + 48.3 + ], + [ + -66.55243, + 49.1331 + ], + [ + -65.05626, + 49.23278 + ], + [ + -64.17099, + 48.74248 + ], + [ + -65.11545, + 48.07085 + ], + [ + -64.79854, + 46.99297 + ], + [ + -64.47219, + 46.23849 + ], + [ + -63.17329, + 45.73902 + ], + [ + -61.52072, + 45.88377 + ], + [ + -60.51815, + 47.00793 + ], + [ + -60.4486, + 46.28264 + ], + [ + -59.80287, + 45.9204 + ], + [ + -61.03988, + 45.26525 + ], + [ + -63.25471, + 44.67014 + ], + [ + -64.24656, + 44.26553 + ], + [ + -65.36406, + 43.54523 + ], + [ + -66.1234, + 43.61867 + ], + [ + -66.16173, + 44.46512 + ], + [ + -64.42549, + 45.29204 + ], + [ + -66.02605, + 45.25931 + ], + [ + -67.13741, + 45.13753 + ], + [ + -67.79134, + 45.70281 + ], + [ + -67.79046, + 47.06636 + ], + [ + -68.23444, + 47.35486 + ], + [ + -68.905, + 47.185 + ], + [ + -69.237216, + 47.447781 + ], + [ + -69.99997, + 46.69307 + ], + [ + -70.305, + 45.915 + ], + [ + -70.66, + 45.46 + ], + [ + -71.08482, + 45.30524 + ], + [ + -71.405, + 45.255 + ], + [ + -71.50506, + 45.0082 + ], + [ + -73.34783, + 45.00738 + ], + [ + -74.867, + 45.00048 + ], + [ + -75.31821, + 44.81645 + ], + [ + -76.375, + 44.09631 + ], + [ + -76.5, + 44.018459 + ], + [ + -76.820034, + 43.628784 + ], + [ + -77.737885, + 43.629056 + ], + [ + -78.72028, + 43.625089 + ], + [ + -79.171674, + 43.466339 + ], + [ + -79.01, + 43.27 + ], + [ + -78.92, + 42.965 + ], + [ + -78.939362, + 42.863611 + ], + [ + -80.247448, + 42.3662 + ], + [ + -81.277747, + 42.209026 + ], + [ + -82.439278, + 41.675105 + ], + [ + -82.690089, + 41.675105 + ], + [ + -83.02981, + 41.832796 + ], + [ + -83.142, + 41.975681 + ], + [ + -83.12, + 42.08 + ], + [ + -82.9, + 42.43 + ], + [ + -82.43, + 42.98 + ], + [ + -82.137642, + 43.571088 + ], + [ + -82.337763, + 44.44 + ], + [ + -82.550925, + 45.347517 + ], + [ + -83.592851, + 45.816894 + ], + [ + -83.469551, + 45.994686 + ], + [ + -83.616131, + 46.116927 + ], + [ + -83.890765, + 46.116927 + ], + [ + -84.091851, + 46.275419 + ], + [ + -84.14212, + 46.512226 + ], + [ + -84.3367, + 46.40877 + ], + [ + -84.6049, + 46.4396 + ], + [ + -84.543749, + 46.538684 + ], + [ + -84.779238, + 46.637102 + ], + [ + -84.87608, + 46.900083 + ], + [ + -85.652363, + 47.220219 + ], + [ + -86.461991, + 47.553338 + ], + [ + -87.439793, + 47.94 + ], + [ + -88.378114, + 48.302918 + ], + [ + -89.272917, + 48.019808 + ], + [ + -89.6, + 48.01 + ], + [ + -90.83, + 48.27 + ], + [ + -91.64, + 48.14 + ], + [ + -92.61, + 48.45 + ], + [ + -93.63087, + 48.60926 + ], + [ + -94.32914, + 48.67074 + ], + [ + -94.64, + 48.84 + ], + [ + -94.81758, + 49.38905 + ], + [ + -95.15609, + 49.38425 + ], + [ + -95.15907, + 49 + ], + [ + -97.22872, + 49.0007 + ], + [ + -100.65, + 49 + ], + [ + -104.04826, + 48.99986 + ], + [ + -107.05, + 49 + ], + [ + -110.05, + 49 + ], + [ + -113, + 49 + ], + [ + -116.04818, + 49 + ], + [ + -117.03121, + 49 + ], + [ + -120, + 49 + ], + [ + -122.84, + 49 + ], + [ + -122.97421, + 49.002538 + ], + [ + -124.91024, + 49.98456 + ], + [ + -125.62461, + 50.41656 + ], + [ + -127.43561, + 50.83061 + ], + [ + -127.99276, + 51.71583 + ], + [ + -127.85032, + 52.32961 + ], + [ + -129.12979, + 52.75538 + ], + [ + -129.30523, + 53.56159 + ], + [ + -130.51497, + 54.28757 + ], + [ + -130.53611, + 54.80278 + ], + [ + -129.98, + 55.285 + ], + [ + -130.00778, + 55.91583 + ], + [ + -131.70781, + 56.55212 + ], + [ + -132.73042, + 57.69289 + ], + [ + -133.35556, + 58.41028 + ], + [ + -134.27111, + 58.86111 + ], + [ + -134.945, + 59.27056 + ], + [ + -135.47583, + 59.78778 + ], + [ + -136.47972, + 59.46389 + ], + [ + -137.4525, + 58.905 + ], + [ + -138.34089, + 59.56211 + ], + [ + -139.039, + 60 + ], + [ + -140.013, + 60.27682 + ], + [ + -140.99778, + 60.30639 + ], + [ + -140.9925, + 66.00003 + ], + [ + -140.986, + 69.712 + ], + [ + -139.12052, + 69.47102 + ], + [ + -137.54636, + 68.99002 + ], + [ + -136.50358, + 68.89804 + ], + [ + -135.62576, + 69.31512 + ], + [ + -134.41464, + 69.62743 + ], + [ + -132.92925, + 69.50534 + ], + [ + -131.43136, + 69.94451 + ], + [ + -129.79471, + 70.19369 + ], + [ + -129.10773, + 69.77927 + ], + [ + -128.36156, + 70.01286 + ], + [ + -128.13817, + 70.48384 + ], + [ + -127.44712, + 70.37721 + ], + [ + -125.75632, + 69.48058 + ], + [ + -124.42483, + 70.1584 + ], + [ + -124.28968, + 69.39969 + ], + [ + -123.06108, + 69.56372 + ], + [ + -122.6835, + 69.85553 + ], + [ + -121.47226, + 69.79778 + ], + [ + -119.94288, + 69.37786 + ], + [ + -117.60268, + 69.01128 + ], + [ + -116.22643, + 68.84151 + ], + [ + -115.2469, + 68.90591 + ], + [ + -113.89794, + 68.3989 + ], + [ + -115.30489, + 67.90261 + ], + [ + -113.49727, + 67.68815 + ], + [ + -110.798, + 67.80612 + ], + [ + -109.94619, + 67.98104 + ], + [ + -108.8802, + 67.38144 + ], + [ + -107.79239, + 67.88736 + ], + [ + -108.81299, + 68.31164 + ], + [ + -108.16721, + 68.65392 + ], + [ + -106.95, + 68.7 + ], + [ + -106.15, + 68.8 + ], + [ + -105.34282, + 68.56122 + ], + [ + -104.33791, + 68.018 + ], + [ + -103.22115, + 68.09775 + ], + [ + -101.45433, + 67.64689 + ], + [ + -99.90195, + 67.80566 + ], + [ + -98.4432, + 67.78165 + ], + [ + -98.5586, + 68.40394 + ], + [ + -97.66948, + 68.57864 + ], + [ + -96.11991, + 68.23939 + ], + [ + -96.12588, + 67.29338 + ], + [ + -95.48943, + 68.0907 + ], + [ + -94.685, + 68.06383 + ], + [ + -94.23282, + 69.06903 + ], + [ + -95.30408, + 69.68571 + ], + [ + -96.47131, + 70.08976 + ], + [ + -96.39115, + 71.19482 + ], + [ + -95.2088, + 71.92053 + ], + [ + -93.88997, + 71.76015 + ], + [ + -92.87818, + 71.31869 + ], + [ + -91.51964, + 70.19129 + ], + [ + -92.40692, + 69.69997 + ], + [ + -90.5471, + 69.49766 + ] + ] + ], + [ + [ + [ + -114.16717, + 73.12145 + ], + [ + -114.66634, + 72.65277 + ], + [ + -112.44102, + 72.9554 + ], + [ + -111.05039, + 72.4504 + ], + [ + -109.92035, + 72.96113 + ], + [ + -109.00654, + 72.63335 + ], + [ + -108.18835, + 71.65089 + ], + [ + -107.68599, + 72.06548 + ], + [ + -108.39639, + 73.08953 + ], + [ + -107.51645, + 73.23598 + ], + [ + -106.52259, + 73.07601 + ], + [ + -105.40246, + 72.67259 + ], + [ + -104.77484, + 71.6984 + ], + [ + -104.46476, + 70.99297 + ], + [ + -102.78537, + 70.49776 + ], + [ + -100.98078, + 70.02432 + ], + [ + -101.08929, + 69.58447 + ], + [ + -102.73116, + 69.50402 + ], + [ + -102.09329, + 69.11962 + ], + [ + -102.43024, + 68.75282 + ], + [ + -104.24, + 68.91 + ], + [ + -105.96, + 69.18 + ], + [ + -107.12254, + 69.11922 + ], + [ + -109, + 68.78 + ], + [ + -111.534149, + 68.630059 + ], + [ + -113.3132, + 68.53554 + ], + [ + -113.85496, + 69.00744 + ], + [ + -115.22, + 69.28 + ], + [ + -116.10794, + 69.16821 + ], + [ + -117.34, + 69.96 + ], + [ + -116.67473, + 70.06655 + ], + [ + -115.13112, + 70.2373 + ], + [ + -113.72141, + 70.19237 + ], + [ + -112.4161, + 70.36638 + ], + [ + -114.35, + 70.6 + ], + [ + -116.48684, + 70.52045 + ], + [ + -117.9048, + 70.54056 + ], + [ + -118.43238, + 70.9092 + ], + [ + -116.11311, + 71.30918 + ], + [ + -117.65568, + 71.2952 + ], + [ + -119.40199, + 71.55859 + ], + [ + -118.56267, + 72.30785 + ], + [ + -117.86642, + 72.70594 + ], + [ + -115.18909, + 73.31459 + ], + [ + -114.16717, + 73.12145 + ] + ] + ], + [ + [ + [ + -104.5, + 73.42 + ], + [ + -105.38, + 72.76 + ], + [ + -106.94, + 73.46 + ], + [ + -106.6, + 73.6 + ], + [ + -105.26, + 73.64 + ], + [ + -104.5, + 73.42 + ] + ] + ], + [ + [ + [ + -76.34, + 73.102685 + ], + [ + -76.251404, + 72.826385 + ], + [ + -77.314438, + 72.855545 + ], + [ + -78.39167, + 72.876656 + ], + [ + -79.486252, + 72.742203 + ], + [ + -79.775833, + 72.802902 + ], + [ + -80.876099, + 73.333183 + ], + [ + -80.833885, + 73.693184 + ], + [ + -80.353058, + 73.75972 + ], + [ + -78.064438, + 73.651932 + ], + [ + -76.34, + 73.102685 + ] + ] + ], + [ + [ + [ + -86.562179, + 73.157447 + ], + [ + -85.774371, + 72.534126 + ], + [ + -84.850112, + 73.340278 + ], + [ + -82.31559, + 73.750951 + ], + [ + -80.600088, + 72.716544 + ], + [ + -80.748942, + 72.061907 + ], + [ + -78.770639, + 72.352173 + ], + [ + -77.824624, + 72.749617 + ], + [ + -75.605845, + 72.243678 + ], + [ + -74.228616, + 71.767144 + ], + [ + -74.099141, + 71.33084 + ], + [ + -72.242226, + 71.556925 + ], + [ + -71.200015, + 70.920013 + ], + [ + -68.786054, + 70.525024 + ], + [ + -67.91497, + 70.121948 + ], + [ + -66.969033, + 69.186087 + ], + [ + -68.805123, + 68.720198 + ], + [ + -66.449866, + 68.067163 + ], + [ + -64.862314, + 67.847539 + ], + [ + -63.424934, + 66.928473 + ], + [ + -61.851981, + 66.862121 + ], + [ + -62.163177, + 66.160251 + ], + [ + -63.918444, + 64.998669 + ], + [ + -65.14886, + 65.426033 + ], + [ + -66.721219, + 66.388041 + ], + [ + -68.015016, + 66.262726 + ], + [ + -68.141287, + 65.689789 + ], + [ + -67.089646, + 65.108455 + ], + [ + -65.73208, + 64.648406 + ], + [ + -65.320168, + 64.382737 + ], + [ + -64.669406, + 63.392927 + ], + [ + -65.013804, + 62.674185 + ], + [ + -66.275045, + 62.945099 + ], + [ + -68.783186, + 63.74567 + ], + [ + -67.369681, + 62.883966 + ], + [ + -66.328297, + 62.280075 + ], + [ + -66.165568, + 61.930897 + ], + [ + -68.877367, + 62.330149 + ], + [ + -71.023437, + 62.910708 + ], + [ + -72.235379, + 63.397836 + ], + [ + -71.886278, + 63.679989 + ], + [ + -73.378306, + 64.193963 + ], + [ + -74.834419, + 64.679076 + ], + [ + -74.818503, + 64.389093 + ], + [ + -77.70998, + 64.229542 + ], + [ + -78.555949, + 64.572906 + ], + [ + -77.897281, + 65.309192 + ], + [ + -76.018274, + 65.326969 + ], + [ + -73.959795, + 65.454765 + ], + [ + -74.293883, + 65.811771 + ], + [ + -73.944912, + 66.310578 + ], + [ + -72.651167, + 67.284576 + ], + [ + -72.92606, + 67.726926 + ], + [ + -73.311618, + 68.069437 + ], + [ + -74.843307, + 68.554627 + ], + [ + -76.869101, + 68.894736 + ], + [ + -76.228649, + 69.147769 + ], + [ + -77.28737, + 69.76954 + ], + [ + -78.168634, + 69.826488 + ], + [ + -78.957242, + 70.16688 + ], + [ + -79.492455, + 69.871808 + ], + [ + -81.305471, + 69.743185 + ], + [ + -84.944706, + 69.966634 + ], + [ + -87.060003, + 70.260001 + ], + [ + -88.681713, + 70.410741 + ], + [ + -89.51342, + 70.762038 + ], + [ + -88.467721, + 71.218186 + ], + [ + -89.888151, + 71.222552 + ], + [ + -90.20516, + 72.235074 + ], + [ + -89.436577, + 73.129464 + ], + [ + -88.408242, + 73.537889 + ], + [ + -85.826151, + 73.803816 + ], + [ + -86.562179, + 73.157447 + ] + ] + ], + [ + [ + [ + -100.35642, + 73.84389 + ], + [ + -99.16387, + 73.63339 + ], + [ + -97.38, + 73.76 + ], + [ + -97.12, + 73.47 + ], + [ + -98.05359, + 72.99052 + ], + [ + -96.54, + 72.56 + ], + [ + -96.72, + 71.66 + ], + [ + -98.35966, + 71.27285 + ], + [ + -99.32286, + 71.35639 + ], + [ + -100.01482, + 71.73827 + ], + [ + -102.5, + 72.51 + ], + [ + -102.48, + 72.83 + ], + [ + -100.43836, + 72.70588 + ], + [ + -101.54, + 73.36 + ], + [ + -100.35642, + 73.84389 + ] + ] + ], + [ + [ + [ + -93.196296, + 72.771992 + ], + [ + -94.269047, + 72.024596 + ], + [ + -95.409856, + 72.061881 + ], + [ + -96.033745, + 72.940277 + ], + [ + -96.018268, + 73.43743 + ], + [ + -95.495793, + 73.862417 + ], + [ + -94.503658, + 74.134907 + ], + [ + -92.420012, + 74.100025 + ], + [ + -90.509793, + 73.856732 + ], + [ + -92.003965, + 72.966244 + ], + [ + -93.196296, + 72.771992 + ] + ] + ], + [ + [ + [ + -120.46, + 71.383602 + ], + [ + -123.09219, + 70.90164 + ], + [ + -123.62, + 71.34 + ], + [ + -125.928949, + 71.868688 + ], + [ + -125.5, + 72.292261 + ], + [ + -124.80729, + 73.02256 + ], + [ + -123.94, + 73.68 + ], + [ + -124.91775, + 74.29275 + ], + [ + -121.53788, + 74.44893 + ], + [ + -120.10978, + 74.24135 + ], + [ + -117.55564, + 74.18577 + ], + [ + -116.58442, + 73.89607 + ], + [ + -115.51081, + 73.47519 + ], + [ + -116.76794, + 73.22292 + ], + [ + -119.22, + 72.52 + ], + [ + -120.46, + 71.82 + ], + [ + -120.46, + 71.383602 + ] + ] + ], + [ + [ + [ + -93.612756, + 74.979997 + ], + [ + -94.156909, + 74.592347 + ], + [ + -95.608681, + 74.666864 + ], + [ + -96.820932, + 74.927623 + ], + [ + -96.288587, + 75.377828 + ], + [ + -94.85082, + 75.647218 + ], + [ + -93.977747, + 75.29649 + ], + [ + -93.612756, + 74.979997 + ] + ] + ], + [ + [ + [ + -98.5, + 76.72 + ], + [ + -97.735585, + 76.25656 + ], + [ + -97.704415, + 75.74344 + ], + [ + -98.16, + 75 + ], + [ + -99.80874, + 74.89744 + ], + [ + -100.88366, + 75.05736 + ], + [ + -100.86292, + 75.64075 + ], + [ + -102.50209, + 75.5638 + ], + [ + -102.56552, + 76.3366 + ], + [ + -101.48973, + 76.30537 + ], + [ + -99.98349, + 76.64634 + ], + [ + -98.57699, + 76.58859 + ], + [ + -98.5, + 76.72 + ] + ] + ], + [ + [ + [ + -108.21141, + 76.20168 + ], + [ + -107.81943, + 75.84552 + ], + [ + -106.92893, + 76.01282 + ], + [ + -105.881, + 75.9694 + ], + [ + -105.70498, + 75.47951 + ], + [ + -106.31347, + 75.00527 + ], + [ + -109.7, + 74.85 + ], + [ + -112.22307, + 74.41696 + ], + [ + -113.74381, + 74.39427 + ], + [ + -113.87135, + 74.72029 + ], + [ + -111.79421, + 75.1625 + ], + [ + -116.31221, + 75.04343 + ], + [ + -117.7104, + 75.2222 + ], + [ + -116.34602, + 76.19903 + ], + [ + -115.40487, + 76.47887 + ], + [ + -112.59056, + 76.14134 + ], + [ + -110.81422, + 75.54919 + ], + [ + -109.0671, + 75.47321 + ], + [ + -110.49726, + 76.42982 + ], + [ + -109.5811, + 76.79417 + ], + [ + -108.54859, + 76.67832 + ], + [ + -108.21141, + 76.20168 + ] + ] + ], + [ + [ + [ + -94.684086, + 77.097878 + ], + [ + -93.573921, + 76.776296 + ], + [ + -91.605023, + 76.778518 + ], + [ + -90.741846, + 76.449597 + ], + [ + -90.969661, + 76.074013 + ], + [ + -89.822238, + 75.847774 + ], + [ + -89.187083, + 75.610166 + ], + [ + -87.838276, + 75.566189 + ], + [ + -86.379192, + 75.482421 + ], + [ + -84.789625, + 75.699204 + ], + [ + -82.753445, + 75.784315 + ], + [ + -81.128531, + 75.713983 + ], + [ + -80.057511, + 75.336849 + ], + [ + -79.833933, + 74.923127 + ], + [ + -80.457771, + 74.657304 + ], + [ + -81.948843, + 74.442459 + ], + [ + -83.228894, + 74.564028 + ], + [ + -86.097452, + 74.410032 + ], + [ + -88.15035, + 74.392307 + ], + [ + -89.764722, + 74.515555 + ], + [ + -92.422441, + 74.837758 + ], + [ + -92.768285, + 75.38682 + ], + [ + -92.889906, + 75.882655 + ], + [ + -93.893824, + 76.319244 + ], + [ + -95.962457, + 76.441381 + ], + [ + -97.121379, + 76.751078 + ], + [ + -96.745123, + 77.161389 + ], + [ + -94.684086, + 77.097878 + ] + ] + ], + [ + [ + [ + -116.198587, + 77.645287 + ], + [ + -116.335813, + 76.876962 + ], + [ + -117.106051, + 76.530032 + ], + [ + -118.040412, + 76.481172 + ], + [ + -119.899318, + 76.053213 + ], + [ + -121.499995, + 75.900019 + ], + [ + -122.854924, + 76.116543 + ], + [ + -122.854925, + 76.116543 + ], + [ + -121.157535, + 76.864508 + ], + [ + -119.103939, + 77.51222 + ], + [ + -117.570131, + 77.498319 + ], + [ + -116.198587, + 77.645287 + ] + ] + ], + [ + [ + [ + -93.840003, + 77.519997 + ], + [ + -94.295608, + 77.491343 + ], + [ + -96.169654, + 77.555111 + ], + [ + -96.436304, + 77.834629 + ], + [ + -94.422577, + 77.820005 + ], + [ + -93.720656, + 77.634331 + ], + [ + -93.840003, + 77.519997 + ] + ] + ], + [ + [ + [ + -110.186938, + 77.697015 + ], + [ + -112.051191, + 77.409229 + ], + [ + -113.534279, + 77.732207 + ], + [ + -112.724587, + 78.05105 + ], + [ + -111.264443, + 78.152956 + ], + [ + -109.854452, + 77.996325 + ], + [ + -110.186938, + 77.697015 + ] + ] + ], + [ + [ + [ + -109.663146, + 78.601973 + ], + [ + -110.881314, + 78.40692 + ], + [ + -112.542091, + 78.407902 + ], + [ + -112.525891, + 78.550555 + ], + [ + -111.50001, + 78.849994 + ], + [ + -110.963661, + 78.804441 + ], + [ + -109.663146, + 78.601973 + ] + ] + ], + [ + [ + [ + -95.830295, + 78.056941 + ], + [ + -97.309843, + 77.850597 + ], + [ + -98.124289, + 78.082857 + ], + [ + -98.552868, + 78.458105 + ], + [ + -98.631984, + 78.87193 + ], + [ + -97.337231, + 78.831984 + ], + [ + -96.754399, + 78.765813 + ], + [ + -95.559278, + 78.418315 + ], + [ + -95.830295, + 78.056941 + ] + ] + ], + [ + [ + [ + -100.060192, + 78.324754 + ], + [ + -99.670939, + 77.907545 + ], + [ + -101.30394, + 78.018985 + ], + [ + -102.949809, + 78.343229 + ], + [ + -105.176133, + 78.380332 + ], + [ + -104.210429, + 78.67742 + ], + [ + -105.41958, + 78.918336 + ], + [ + -105.492289, + 79.301594 + ], + [ + -103.529282, + 79.165349 + ], + [ + -100.825158, + 78.800462 + ], + [ + -100.060192, + 78.324754 + ] + ] + ], + [ + [ + [ + -87.02, + 79.66 + ], + [ + -85.81435, + 79.3369 + ], + [ + -87.18756, + 79.0393 + ], + [ + -89.03535, + 78.28723 + ], + [ + -90.80436, + 78.21533 + ], + [ + -92.87669, + 78.34333 + ], + [ + -93.95116, + 78.75099 + ], + [ + -93.93574, + 79.11373 + ], + [ + -93.14524, + 79.3801 + ], + [ + -94.974, + 79.37248 + ], + [ + -96.07614, + 79.70502 + ], + [ + -96.70972, + 80.15777 + ], + [ + -96.01644, + 80.60233 + ], + [ + -95.32345, + 80.90729 + ], + [ + -94.29843, + 80.97727 + ], + [ + -94.73542, + 81.20646 + ], + [ + -92.40984, + 81.25739 + ], + [ + -91.13289, + 80.72345 + ], + [ + -89.45, + 80.509322 + ], + [ + -87.81, + 80.32 + ], + [ + -87.02, + 79.66 + ] + ] + ], + [ + [ + [ + -68.5, + 83.106322 + ], + [ + -65.82735, + 83.02801 + ], + [ + -63.68, + 82.9 + ], + [ + -61.85, + 82.6286 + ], + [ + -61.89388, + 82.36165 + ], + [ + -64.334, + 81.92775 + ], + [ + -66.75342, + 81.72527 + ], + [ + -67.65755, + 81.50141 + ], + [ + -65.48031, + 81.50657 + ], + [ + -67.84, + 80.9 + ], + [ + -69.4697, + 80.61683 + ], + [ + -71.18, + 79.8 + ], + [ + -73.2428, + 79.63415 + ], + [ + -73.88, + 79.430162 + ], + [ + -76.90773, + 79.32309 + ], + [ + -75.52924, + 79.19766 + ], + [ + -76.22046, + 79.01907 + ], + [ + -75.39345, + 78.52581 + ], + [ + -76.34354, + 78.18296 + ], + [ + -77.88851, + 77.89991 + ], + [ + -78.36269, + 77.50859 + ], + [ + -79.75951, + 77.20968 + ], + [ + -79.61965, + 76.98336 + ], + [ + -77.91089, + 77.022045 + ], + [ + -77.88911, + 76.777955 + ], + [ + -80.56125, + 76.17812 + ], + [ + -83.17439, + 76.45403 + ], + [ + -86.11184, + 76.29901 + ], + [ + -87.6, + 76.42 + ], + [ + -89.49068, + 76.47239 + ], + [ + -89.6161, + 76.95213 + ], + [ + -87.76739, + 77.17833 + ], + [ + -88.26, + 77.9 + ], + [ + -87.65, + 77.970222 + ], + [ + -84.97634, + 77.53873 + ], + [ + -86.34, + 78.18 + ], + [ + -87.96192, + 78.37181 + ], + [ + -87.15198, + 78.75867 + ], + [ + -85.37868, + 78.9969 + ], + [ + -85.09495, + 79.34543 + ], + [ + -86.50734, + 79.73624 + ], + [ + -86.93179, + 80.25145 + ], + [ + -84.19844, + 80.20836 + ], + [ + -83.408696, + 80.1 + ], + [ + -81.84823, + 80.46442 + ], + [ + -84.1, + 80.58 + ], + [ + -87.59895, + 80.51627 + ], + [ + -89.36663, + 80.85569 + ], + [ + -90.2, + 81.26 + ], + [ + -91.36786, + 81.5531 + ], + [ + -91.58702, + 81.89429 + ], + [ + -90.1, + 82.085 + ], + [ + -88.93227, + 82.11751 + ], + [ + -86.97024, + 82.27961 + ], + [ + -85.5, + 82.652273 + ], + [ + -84.260005, + 82.6 + ], + [ + -83.18, + 82.32 + ], + [ + -82.42, + 82.86 + ], + [ + -81.1, + 83.02 + ], + [ + -79.30664, + 83.13056 + ], + [ + -76.25, + 83.172059 + ], + [ + -75.71878, + 83.06404 + ], + [ + -72.83153, + 83.23324 + ], + [ + -70.665765, + 83.169781 + ], + [ + -68.5, + 83.106322 + ] + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"CHE", + "properties":{ + "name":"Switzerland" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 9.594226, + 47.525058 + ], + [ + 9.632932, + 47.347601 + ], + [ + 9.47997, + 47.10281 + ], + [ + 9.932448, + 46.920728 + ], + [ + 10.442701, + 46.893546 + ], + [ + 10.363378, + 46.483571 + ], + [ + 9.922837, + 46.314899 + ], + [ + 9.182882, + 46.440215 + ], + [ + 8.966306, + 46.036932 + ], + [ + 8.489952, + 46.005151 + ], + [ + 8.31663, + 46.163642 + ], + [ + 7.755992, + 45.82449 + ], + [ + 7.273851, + 45.776948 + ], + [ + 6.843593, + 45.991147 + ], + [ + 6.5001, + 46.429673 + ], + [ + 6.022609, + 46.27299 + ], + [ + 6.037389, + 46.725779 + ], + [ + 6.768714, + 47.287708 + ], + [ + 6.736571, + 47.541801 + ], + [ + 7.192202, + 47.449766 + ], + [ + 7.466759, + 47.620582 + ], + [ + 8.317301, + 47.61358 + ], + [ + 8.522612, + 47.830828 + ], + [ + 9.594226, + 47.525058 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"CHL", + "properties":{ + "name":"Chile" + }, + "geometry":{ + "type":"MultiPolygon", + "coordinates":[ + [ + [ + [ + -68.63401, + -52.63637 + ], + [ + -68.63335, + -54.8695 + ], + [ + -67.56244, + -54.87001 + ], + [ + -66.95992, + -54.89681 + ], + [ + -67.29103, + -55.30124 + ], + [ + -68.14863, + -55.61183 + ], + [ + -68.639991, + -55.580018 + ], + [ + -69.2321, + -55.49906 + ], + [ + -69.95809, + -55.19843 + ], + [ + -71.00568, + -55.05383 + ], + [ + -72.2639, + -54.49514 + ], + [ + -73.2852, + -53.95752 + ], + [ + -74.66253, + -52.83749 + ], + [ + -73.8381, + -53.04743 + ], + [ + -72.43418, + -53.7154 + ], + [ + -71.10773, + -54.07433 + ], + [ + -70.59178, + -53.61583 + ], + [ + -70.26748, + -52.93123 + ], + [ + -69.34565, + -52.5183 + ], + [ + -68.63401, + -52.63637 + ] + ] + ], + [ + [ + [ + -68.219913, + -21.494347 + ], + [ + -67.82818, + -22.872919 + ], + [ + -67.106674, + -22.735925 + ], + [ + -66.985234, + -22.986349 + ], + [ + -67.328443, + -24.025303 + ], + [ + -68.417653, + -24.518555 + ], + [ + -68.386001, + -26.185016 + ], + [ + -68.5948, + -26.506909 + ], + [ + -68.295542, + -26.89934 + ], + [ + -69.001235, + -27.521214 + ], + [ + -69.65613, + -28.459141 + ], + [ + -70.01355, + -29.367923 + ], + [ + -69.919008, + -30.336339 + ], + [ + -70.535069, + -31.36501 + ], + [ + -70.074399, + -33.09121 + ], + [ + -69.814777, + -33.273886 + ], + [ + -69.817309, + -34.193571 + ], + [ + -70.388049, + -35.169688 + ], + [ + -70.364769, + -36.005089 + ], + [ + -71.121881, + -36.658124 + ], + [ + -71.118625, + -37.576827 + ], + [ + -70.814664, + -38.552995 + ], + [ + -71.413517, + -38.916022 + ], + [ + -71.680761, + -39.808164 + ], + [ + -71.915734, + -40.832339 + ], + [ + -71.746804, + -42.051386 + ], + [ + -72.148898, + -42.254888 + ], + [ + -71.915424, + -43.408565 + ], + [ + -71.464056, + -43.787611 + ], + [ + -71.793623, + -44.207172 + ], + [ + -71.329801, + -44.407522 + ], + [ + -71.222779, + -44.784243 + ], + [ + -71.659316, + -44.973689 + ], + [ + -71.552009, + -45.560733 + ], + [ + -71.917258, + -46.884838 + ], + [ + -72.447355, + -47.738533 + ], + [ + -72.331161, + -48.244238 + ], + [ + -72.648247, + -48.878618 + ], + [ + -73.415436, + -49.318436 + ], + [ + -73.328051, + -50.378785 + ], + [ + -72.975747, + -50.74145 + ], + [ + -72.309974, + -50.67701 + ], + [ + -72.329404, + -51.425956 + ], + [ + -71.914804, + -52.009022 + ], + [ + -69.498362, + -52.142761 + ], + [ + -68.571545, + -52.299444 + ], + [ + -69.461284, + -52.291951 + ], + [ + -69.94278, + -52.537931 + ], + [ + -70.845102, + -52.899201 + ], + [ + -71.006332, + -53.833252 + ], + [ + -71.429795, + -53.856455 + ], + [ + -72.557943, + -53.53141 + ], + [ + -73.702757, + -52.835069 + ], + [ + -73.702757, + -52.83507 + ], + [ + -74.946763, + -52.262754 + ], + [ + -75.260026, + -51.629355 + ], + [ + -74.976632, + -51.043396 + ], + [ + -75.479754, + -50.378372 + ], + [ + -75.608015, + -48.673773 + ], + [ + -75.18277, + -47.711919 + ], + [ + -74.126581, + -46.939253 + ], + [ + -75.644395, + -46.647643 + ], + [ + -74.692154, + -45.763976 + ], + [ + -74.351709, + -44.103044 + ], + [ + -73.240356, + -44.454961 + ], + [ + -72.717804, + -42.383356 + ], + [ + -73.3889, + -42.117532 + ], + [ + -73.701336, + -43.365776 + ], + [ + -74.331943, + -43.224958 + ], + [ + -74.017957, + -41.794813 + ], + [ + -73.677099, + -39.942213 + ], + [ + -73.217593, + -39.258689 + ], + [ + -73.505559, + -38.282883 + ], + [ + -73.588061, + -37.156285 + ], + [ + -73.166717, + -37.12378 + ], + [ + -72.553137, + -35.50884 + ], + [ + -71.861732, + -33.909093 + ], + [ + -71.43845, + -32.418899 + ], + [ + -71.668721, + -30.920645 + ], + [ + -71.370083, + -30.095682 + ], + [ + -71.489894, + -28.861442 + ], + [ + -70.905124, + -27.64038 + ], + [ + -70.724954, + -25.705924 + ], + [ + -70.403966, + -23.628997 + ], + [ + -70.091246, + -21.393319 + ], + [ + -70.16442, + -19.756468 + ], + [ + -70.372572, + -18.347975 + ], + [ + -69.858444, + -18.092694 + ], + [ + -69.590424, + -17.580012 + ], + [ + -69.100247, + -18.260125 + ], + [ + -68.966818, + -18.981683 + ], + [ + -68.442225, + -19.405068 + ], + [ + -68.757167, + -20.372658 + ], + [ + -68.219913, + -21.494347 + ] + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"CHN", + "properties":{ + "name":"China" + }, + "geometry":{ + "type":"MultiPolygon", + "coordinates":[ + [ + [ + [ + 110.339188, + 18.678395 + ], + [ + 109.47521, + 18.197701 + ], + [ + 108.655208, + 18.507682 + ], + [ + 108.626217, + 19.367888 + ], + [ + 109.119056, + 19.821039 + ], + [ + 110.211599, + 20.101254 + ], + [ + 110.786551, + 20.077534 + ], + [ + 111.010051, + 19.69593 + ], + [ + 110.570647, + 19.255879 + ], + [ + 110.339188, + 18.678395 + ] + ] + ], + [ + [ + [ + 127.657407, + 49.76027 + ], + [ + 129.397818, + 49.4406 + ], + [ + 130.582293, + 48.729687 + ], + [ + 130.987282, + 47.790132 + ], + [ + 132.506672, + 47.78897 + ], + [ + 133.373596, + 48.183442 + ], + [ + 135.026311, + 48.47823 + ], + [ + 134.500814, + 47.57844 + ], + [ + 134.112362, + 47.212467 + ], + [ + 133.769644, + 46.116927 + ], + [ + 133.097127, + 45.144066 + ], + [ + 131.883454, + 45.321162 + ], + [ + 131.025212, + 44.967953 + ], + [ + 131.288555, + 44.11152 + ], + [ + 131.144688, + 42.92999 + ], + [ + 130.633866, + 42.903015 + ], + [ + 130.640016, + 42.395009 + ], + [ + 129.994267, + 42.985387 + ], + [ + 129.596669, + 42.424982 + ], + [ + 128.052215, + 41.994285 + ], + [ + 128.208433, + 41.466772 + ], + [ + 127.343783, + 41.503152 + ], + [ + 126.869083, + 41.816569 + ], + [ + 126.182045, + 41.107336 + ], + [ + 125.079942, + 40.569824 + ], + [ + 124.265625, + 39.928493 + ], + [ + 122.86757, + 39.637788 + ], + [ + 122.131388, + 39.170452 + ], + [ + 121.054554, + 38.897471 + ], + [ + 121.585995, + 39.360854 + ], + [ + 121.376757, + 39.750261 + ], + [ + 122.168595, + 40.422443 + ], + [ + 121.640359, + 40.94639 + ], + [ + 120.768629, + 40.593388 + ], + [ + 119.639602, + 39.898056 + ], + [ + 119.023464, + 39.252333 + ], + [ + 118.042749, + 39.204274 + ], + [ + 117.532702, + 38.737636 + ], + [ + 118.059699, + 38.061476 + ], + [ + 118.87815, + 37.897325 + ], + [ + 118.911636, + 37.448464 + ], + [ + 119.702802, + 37.156389 + ], + [ + 120.823457, + 37.870428 + ], + [ + 121.711259, + 37.481123 + ], + [ + 122.357937, + 37.454484 + ], + [ + 122.519995, + 36.930614 + ], + [ + 121.104164, + 36.651329 + ], + [ + 120.637009, + 36.11144 + ], + [ + 119.664562, + 35.609791 + ], + [ + 119.151208, + 34.909859 + ], + [ + 120.227525, + 34.360332 + ], + [ + 120.620369, + 33.376723 + ], + [ + 121.229014, + 32.460319 + ], + [ + 121.908146, + 31.692174 + ], + [ + 121.891919, + 30.949352 + ], + [ + 121.264257, + 30.676267 + ], + [ + 121.503519, + 30.142915 + ], + [ + 122.092114, + 29.83252 + ], + [ + 121.938428, + 29.018022 + ], + [ + 121.684439, + 28.225513 + ], + [ + 121.125661, + 28.135673 + ], + [ + 120.395473, + 27.053207 + ], + [ + 119.585497, + 25.740781 + ], + [ + 118.656871, + 24.547391 + ], + [ + 117.281606, + 23.624501 + ], + [ + 115.890735, + 22.782873 + ], + [ + 114.763827, + 22.668074 + ], + [ + 114.152547, + 22.22376 + ], + [ + 113.80678, + 22.54834 + ], + [ + 113.241078, + 22.051367 + ], + [ + 111.843592, + 21.550494 + ], + [ + 110.785466, + 21.397144 + ], + [ + 110.444039, + 20.341033 + ], + [ + 109.889861, + 20.282457 + ], + [ + 109.627655, + 21.008227 + ], + [ + 109.864488, + 21.395051 + ], + [ + 108.522813, + 21.715212 + ], + [ + 108.05018, + 21.55238 + ], + [ + 107.04342, + 21.811899 + ], + [ + 106.567273, + 22.218205 + ], + [ + 106.725403, + 22.794268 + ], + [ + 105.811247, + 22.976892 + ], + [ + 105.329209, + 23.352063 + ], + [ + 104.476858, + 22.81915 + ], + [ + 103.504515, + 22.703757 + ], + [ + 102.706992, + 22.708795 + ], + [ + 102.170436, + 22.464753 + ], + [ + 101.652018, + 22.318199 + ], + [ + 101.80312, + 21.174367 + ], + [ + 101.270026, + 21.201652 + ], + [ + 101.180005, + 21.436573 + ], + [ + 101.150033, + 21.849984 + ], + [ + 100.416538, + 21.558839 + ], + [ + 99.983489, + 21.742937 + ], + [ + 99.240899, + 22.118314 + ], + [ + 99.531992, + 22.949039 + ], + [ + 98.898749, + 23.142722 + ], + [ + 98.660262, + 24.063286 + ], + [ + 97.60472, + 23.897405 + ], + [ + 97.724609, + 25.083637 + ], + [ + 98.671838, + 25.918703 + ], + [ + 98.712094, + 26.743536 + ], + [ + 98.68269, + 27.508812 + ], + [ + 98.246231, + 27.747221 + ], + [ + 97.911988, + 28.335945 + ], + [ + 97.327114, + 28.261583 + ], + [ + 96.248833, + 28.411031 + ], + [ + 96.586591, + 28.83098 + ], + [ + 96.117679, + 29.452802 + ], + [ + 95.404802, + 29.031717 + ], + [ + 94.56599, + 29.277438 + ], + [ + 93.413348, + 28.640629 + ], + [ + 92.503119, + 27.896876 + ], + [ + 91.696657, + 27.771742 + ], + [ + 91.258854, + 28.040614 + ], + [ + 90.730514, + 28.064954 + ], + [ + 90.015829, + 28.296439 + ], + [ + 89.47581, + 28.042759 + ], + [ + 88.814248, + 27.299316 + ], + [ + 88.730326, + 28.086865 + ], + [ + 88.120441, + 27.876542 + ], + [ + 86.954517, + 27.974262 + ], + [ + 85.82332, + 28.203576 + ], + [ + 85.011638, + 28.642774 + ], + [ + 84.23458, + 28.839894 + ], + [ + 83.898993, + 29.320226 + ], + [ + 83.337115, + 29.463732 + ], + [ + 82.327513, + 30.115268 + ], + [ + 81.525804, + 30.422717 + ], + [ + 81.111256, + 30.183481 + ], + [ + 79.721367, + 30.882715 + ], + [ + 78.738894, + 31.515906 + ], + [ + 78.458446, + 32.618164 + ], + [ + 79.176129, + 32.48378 + ], + [ + 79.208892, + 32.994395 + ], + [ + 78.811086, + 33.506198 + ], + [ + 78.912269, + 34.321936 + ], + [ + 77.837451, + 35.49401 + ], + [ + 76.192848, + 35.898403 + ], + [ + 75.896897, + 36.666806 + ], + [ + 75.158028, + 37.133031 + ], + [ + 74.980002, + 37.41999 + ], + [ + 74.829986, + 37.990007 + ], + [ + 74.864816, + 38.378846 + ], + [ + 74.257514, + 38.606507 + ], + [ + 73.928852, + 38.505815 + ], + [ + 73.675379, + 39.431237 + ], + [ + 73.960013, + 39.660008 + ], + [ + 73.822244, + 39.893973 + ], + [ + 74.776862, + 40.366425 + ], + [ + 75.467828, + 40.562072 + ], + [ + 76.526368, + 40.427946 + ], + [ + 76.904484, + 41.066486 + ], + [ + 78.187197, + 41.185316 + ], + [ + 78.543661, + 41.582243 + ], + [ + 80.11943, + 42.123941 + ], + [ + 80.25999, + 42.349999 + ], + [ + 80.18015, + 42.920068 + ], + [ + 80.866206, + 43.180362 + ], + [ + 79.966106, + 44.917517 + ], + [ + 81.947071, + 45.317027 + ], + [ + 82.458926, + 45.53965 + ], + [ + 83.180484, + 47.330031 + ], + [ + 85.16429, + 47.000956 + ], + [ + 85.720484, + 47.452969 + ], + [ + 85.768233, + 48.455751 + ], + [ + 86.598776, + 48.549182 + ], + [ + 87.35997, + 49.214981 + ], + [ + 87.751264, + 49.297198 + ], + [ + 88.013832, + 48.599463 + ], + [ + 88.854298, + 48.069082 + ], + [ + 90.280826, + 47.693549 + ], + [ + 90.970809, + 46.888146 + ], + [ + 90.585768, + 45.719716 + ], + [ + 90.94554, + 45.286073 + ], + [ + 92.133891, + 45.115076 + ], + [ + 93.480734, + 44.975472 + ], + [ + 94.688929, + 44.352332 + ], + [ + 95.306875, + 44.241331 + ], + [ + 95.762455, + 43.319449 + ], + [ + 96.349396, + 42.725635 + ], + [ + 97.451757, + 42.74889 + ], + [ + 99.515817, + 42.524691 + ], + [ + 100.845866, + 42.663804 + ], + [ + 101.83304, + 42.514873 + ], + [ + 103.312278, + 41.907468 + ], + [ + 104.522282, + 41.908347 + ], + [ + 104.964994, + 41.59741 + ], + [ + 106.129316, + 42.134328 + ], + [ + 107.744773, + 42.481516 + ], + [ + 109.243596, + 42.519446 + ], + [ + 110.412103, + 42.871234 + ], + [ + 111.129682, + 43.406834 + ], + [ + 111.829588, + 43.743118 + ], + [ + 111.667737, + 44.073176 + ], + [ + 111.348377, + 44.457442 + ], + [ + 111.873306, + 45.102079 + ], + [ + 112.436062, + 45.011646 + ], + [ + 113.463907, + 44.808893 + ], + [ + 114.460332, + 45.339817 + ], + [ + 115.985096, + 45.727235 + ], + [ + 116.717868, + 46.388202 + ], + [ + 117.421701, + 46.672733 + ], + [ + 118.874326, + 46.805412 + ], + [ + 119.66327, + 46.69268 + ], + [ + 119.772824, + 47.048059 + ], + [ + 118.866574, + 47.74706 + ], + [ + 118.064143, + 48.06673 + ], + [ + 117.295507, + 47.697709 + ], + [ + 116.308953, + 47.85341 + ], + [ + 115.742837, + 47.726545 + ], + [ + 115.485282, + 48.135383 + ], + [ + 116.191802, + 49.134598 + ], + [ + 116.678801, + 49.888531 + ], + [ + 117.879244, + 49.510983 + ], + [ + 119.288461, + 50.142883 + ], + [ + 119.279366, + 50.582908 + ], + [ + 120.18205, + 51.643566 + ], + [ + 120.738191, + 51.964115 + ], + [ + 120.725789, + 52.516226 + ], + [ + 120.177089, + 52.753886 + ], + [ + 121.003085, + 53.251401 + ], + [ + 122.245748, + 53.431726 + ], + [ + 123.571507, + 53.458804 + ], + [ + 125.068211, + 53.161045 + ], + [ + 125.946349, + 52.792799 + ], + [ + 126.564399, + 51.784255 + ], + [ + 126.939157, + 51.353894 + ], + [ + 127.287456, + 50.739797 + ], + [ + 127.657407, + 49.76027 + ] + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"CIV", + "properties":{ + "name":"Ivory Coast" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + -2.856125, + 4.994476 + ], + [ + -3.311084, + 4.984296 + ], + [ + -4.00882, + 5.179813 + ], + [ + -4.649917, + 5.168264 + ], + [ + -5.834496, + 4.993701 + ], + [ + -6.528769, + 4.705088 + ], + [ + -7.518941, + 4.338288 + ], + [ + -7.712159, + 4.364566 + ], + [ + -7.635368, + 5.188159 + ], + [ + -7.539715, + 5.313345 + ], + [ + -7.570153, + 5.707352 + ], + [ + -7.993693, + 6.12619 + ], + [ + -8.311348, + 6.193033 + ], + [ + -8.60288, + 6.467564 + ], + [ + -8.385452, + 6.911801 + ], + [ + -8.485446, + 7.395208 + ], + [ + -8.439298, + 7.686043 + ], + [ + -8.280703, + 7.68718 + ], + [ + -8.221792, + 8.123329 + ], + [ + -8.299049, + 8.316444 + ], + [ + -8.203499, + 8.455453 + ], + [ + -7.8321, + 8.575704 + ], + [ + -8.079114, + 9.376224 + ], + [ + -8.309616, + 9.789532 + ], + [ + -8.229337, + 10.12902 + ], + [ + -8.029944, + 10.206535 + ], + [ + -7.89959, + 10.297382 + ], + [ + -7.622759, + 10.147236 + ], + [ + -6.850507, + 10.138994 + ], + [ + -6.666461, + 10.430811 + ], + [ + -6.493965, + 10.411303 + ], + [ + -6.205223, + 10.524061 + ], + [ + -6.050452, + 10.096361 + ], + [ + -5.816926, + 10.222555 + ], + [ + -5.404342, + 10.370737 + ], + [ + -4.954653, + 10.152714 + ], + [ + -4.779884, + 9.821985 + ], + [ + -4.330247, + 9.610835 + ], + [ + -3.980449, + 9.862344 + ], + [ + -3.511899, + 9.900326 + ], + [ + -2.827496, + 9.642461 + ], + [ + -2.56219, + 8.219628 + ], + [ + -2.983585, + 7.379705 + ], + [ + -3.24437, + 6.250472 + ], + [ + -2.810701, + 5.389051 + ], + [ + -2.856125, + 4.994476 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"CMR", + "properties":{ + "name":"Cameroon" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 13.075822, + 2.267097 + ], + [ + 12.951334, + 2.321616 + ], + [ + 12.35938, + 2.192812 + ], + [ + 11.751665, + 2.326758 + ], + [ + 11.276449, + 2.261051 + ], + [ + 9.649158, + 2.283866 + ], + [ + 9.795196, + 3.073404 + ], + [ + 9.404367, + 3.734527 + ], + [ + 8.948116, + 3.904129 + ], + [ + 8.744924, + 4.352215 + ], + [ + 8.488816, + 4.495617 + ], + [ + 8.500288, + 4.771983 + ], + [ + 8.757533, + 5.479666 + ], + [ + 9.233163, + 6.444491 + ], + [ + 9.522706, + 6.453482 + ], + [ + 10.118277, + 7.03877 + ], + [ + 10.497375, + 7.055358 + ], + [ + 11.058788, + 6.644427 + ], + [ + 11.745774, + 6.981383 + ], + [ + 11.839309, + 7.397042 + ], + [ + 12.063946, + 7.799808 + ], + [ + 12.218872, + 8.305824 + ], + [ + 12.753672, + 8.717763 + ], + [ + 12.955468, + 9.417772 + ], + [ + 13.1676, + 9.640626 + ], + [ + 13.308676, + 10.160362 + ], + [ + 13.57295, + 10.798566 + ], + [ + 14.415379, + 11.572369 + ], + [ + 14.468192, + 11.904752 + ], + [ + 14.577178, + 12.085361 + ], + [ + 14.181336, + 12.483657 + ], + [ + 14.213531, + 12.802035 + ], + [ + 14.495787, + 12.859396 + ], + [ + 14.893386, + 12.219048 + ], + [ + 14.960152, + 11.555574 + ], + [ + 14.923565, + 10.891325 + ], + [ + 15.467873, + 9.982337 + ], + [ + 14.909354, + 9.992129 + ], + [ + 14.627201, + 9.920919 + ], + [ + 14.171466, + 10.021378 + ], + [ + 13.954218, + 9.549495 + ], + [ + 14.544467, + 8.965861 + ], + [ + 14.979996, + 8.796104 + ], + [ + 15.120866, + 8.38215 + ], + [ + 15.436092, + 7.692812 + ], + [ + 15.27946, + 7.421925 + ], + [ + 14.776545, + 6.408498 + ], + [ + 14.53656, + 6.226959 + ], + [ + 14.459407, + 5.451761 + ], + [ + 14.558936, + 5.030598 + ], + [ + 14.478372, + 4.732605 + ], + [ + 14.950953, + 4.210389 + ], + [ + 15.03622, + 3.851367 + ], + [ + 15.405396, + 3.335301 + ], + [ + 15.862732, + 3.013537 + ], + [ + 15.907381, + 2.557389 + ], + [ + 16.012852, + 2.26764 + ], + [ + 15.940919, + 1.727673 + ], + [ + 15.146342, + 1.964015 + ], + [ + 14.337813, + 2.227875 + ], + [ + 13.075822, + 2.267097 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"COD", + "properties":{ + "name":"Democratic Republic of the Congo" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 30.83386, + 3.509166 + ], + [ + 30.773347, + 2.339883 + ], + [ + 31.174149, + 2.204465 + ], + [ + 30.85267, + 1.849396 + ], + [ + 30.468508, + 1.583805 + ], + [ + 30.086154, + 1.062313 + ], + [ + 29.875779, + 0.59738 + ], + [ + 29.819503, + -0.20531 + ], + [ + 29.587838, + -0.587406 + ], + [ + 29.579466, + -1.341313 + ], + [ + 29.291887, + -1.620056 + ], + [ + 29.254835, + -2.21511 + ], + [ + 29.117479, + -2.292211 + ], + [ + 29.024926, + -2.839258 + ], + [ + 29.276384, + -3.293907 + ], + [ + 29.339998, + -4.499983 + ], + [ + 29.519987, + -5.419979 + ], + [ + 29.419993, + -5.939999 + ], + [ + 29.620032, + -6.520015 + ], + [ + 30.199997, + -7.079981 + ], + [ + 30.740015, + -8.340007 + ], + [ + 30.346086, + -8.238257 + ], + [ + 29.002912, + -8.407032 + ], + [ + 28.734867, + -8.526559 + ], + [ + 28.449871, + -9.164918 + ], + [ + 28.673682, + -9.605925 + ], + [ + 28.49607, + -10.789884 + ], + [ + 28.372253, + -11.793647 + ], + [ + 28.642417, + -11.971569 + ], + [ + 29.341548, + -12.360744 + ], + [ + 29.616001, + -12.178895 + ], + [ + 29.699614, + -13.257227 + ], + [ + 28.934286, + -13.248958 + ], + [ + 28.523562, + -12.698604 + ], + [ + 28.155109, + -12.272481 + ], + [ + 27.388799, + -12.132747 + ], + [ + 27.16442, + -11.608748 + ], + [ + 26.553088, + -11.92444 + ], + [ + 25.75231, + -11.784965 + ], + [ + 25.418118, + -11.330936 + ], + [ + 24.78317, + -11.238694 + ], + [ + 24.314516, + -11.262826 + ], + [ + 24.257155, + -10.951993 + ], + [ + 23.912215, + -10.926826 + ], + [ + 23.456791, + -10.867863 + ], + [ + 22.837345, + -11.017622 + ], + [ + 22.402798, + -10.993075 + ], + [ + 22.155268, + -11.084801 + ], + [ + 22.208753, + -9.894796 + ], + [ + 21.875182, + -9.523708 + ], + [ + 21.801801, + -8.908707 + ], + [ + 21.949131, + -8.305901 + ], + [ + 21.746456, + -7.920085 + ], + [ + 21.728111, + -7.290872 + ], + [ + 20.514748, + -7.299606 + ], + [ + 20.601823, + -6.939318 + ], + [ + 20.091622, + -6.94309 + ], + [ + 20.037723, + -7.116361 + ], + [ + 19.417502, + -7.155429 + ], + [ + 19.166613, + -7.738184 + ], + [ + 19.016752, + -7.988246 + ], + [ + 18.464176, + -7.847014 + ], + [ + 18.134222, + -7.987678 + ], + [ + 17.47297, + -8.068551 + ], + [ + 17.089996, + -7.545689 + ], + [ + 16.860191, + -7.222298 + ], + [ + 16.57318, + -6.622645 + ], + [ + 16.326528, + -5.87747 + ], + [ + 13.375597, + -5.864241 + ], + [ + 13.024869, + -5.984389 + ], + [ + 12.735171, + -5.965682 + ], + [ + 12.322432, + -6.100092 + ], + [ + 12.182337, + -5.789931 + ], + [ + 12.436688, + -5.684304 + ], + [ + 12.468004, + -5.248362 + ], + [ + 12.631612, + -4.991271 + ], + [ + 12.995517, + -4.781103 + ], + [ + 13.25824, + -4.882957 + ], + [ + 13.600235, + -4.500138 + ], + [ + 14.144956, + -4.510009 + ], + [ + 14.209035, + -4.793092 + ], + [ + 14.582604, + -4.970239 + ], + [ + 15.170992, + -4.343507 + ], + [ + 15.75354, + -3.855165 + ], + [ + 16.00629, + -3.535133 + ], + [ + 15.972803, + -2.712392 + ], + [ + 16.407092, + -1.740927 + ], + [ + 16.865307, + -1.225816 + ], + [ + 17.523716, + -0.74383 + ], + [ + 17.638645, + -0.424832 + ], + [ + 17.663553, + -0.058084 + ], + [ + 17.82654, + 0.288923 + ], + [ + 17.774192, + 0.855659 + ], + [ + 17.898835, + 1.741832 + ], + [ + 18.094276, + 2.365722 + ], + [ + 18.393792, + 2.900443 + ], + [ + 18.453065, + 3.504386 + ], + [ + 18.542982, + 4.201785 + ], + [ + 18.932312, + 4.709506 + ], + [ + 19.467784, + 5.031528 + ], + [ + 20.290679, + 4.691678 + ], + [ + 20.927591, + 4.322786 + ], + [ + 21.659123, + 4.224342 + ], + [ + 22.405124, + 4.02916 + ], + [ + 22.704124, + 4.633051 + ], + [ + 22.84148, + 4.710126 + ], + [ + 23.297214, + 4.609693 + ], + [ + 24.410531, + 5.108784 + ], + [ + 24.805029, + 4.897247 + ], + [ + 25.128833, + 4.927245 + ], + [ + 25.278798, + 5.170408 + ], + [ + 25.650455, + 5.256088 + ], + [ + 26.402761, + 5.150875 + ], + [ + 27.044065, + 5.127853 + ], + [ + 27.374226, + 5.233944 + ], + [ + 27.979977, + 4.408413 + ], + [ + 28.428994, + 4.287155 + ], + [ + 28.696678, + 4.455077 + ], + [ + 29.159078, + 4.389267 + ], + [ + 29.715995, + 4.600805 + ], + [ + 29.9535, + 4.173699 + ], + [ + 30.83386, + 3.509166 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"COG", + "properties":{ + "name":"Republic of the Congo" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 12.995517, + -4.781103 + ], + [ + 12.62076, + -4.438023 + ], + [ + 12.318608, + -4.60623 + ], + [ + 11.914963, + -5.037987 + ], + [ + 11.093773, + -3.978827 + ], + [ + 11.855122, + -3.426871 + ], + [ + 11.478039, + -2.765619 + ], + [ + 11.820964, + -2.514161 + ], + [ + 12.495703, + -2.391688 + ], + [ + 12.575284, + -1.948511 + ], + [ + 13.109619, + -2.42874 + ], + [ + 13.992407, + -2.470805 + ], + [ + 14.29921, + -1.998276 + ], + [ + 14.425456, + -1.333407 + ], + [ + 14.316418, + -0.552627 + ], + [ + 13.843321, + 0.038758 + ], + [ + 14.276266, + 1.19693 + ], + [ + 14.026669, + 1.395677 + ], + [ + 13.282631, + 1.314184 + ], + [ + 13.003114, + 1.830896 + ], + [ + 13.075822, + 2.267097 + ], + [ + 14.337813, + 2.227875 + ], + [ + 15.146342, + 1.964015 + ], + [ + 15.940919, + 1.727673 + ], + [ + 16.012852, + 2.26764 + ], + [ + 16.537058, + 3.198255 + ], + [ + 17.133042, + 3.728197 + ], + [ + 17.8099, + 3.560196 + ], + [ + 18.453065, + 3.504386 + ], + [ + 18.393792, + 2.900443 + ], + [ + 18.094276, + 2.365722 + ], + [ + 17.898835, + 1.741832 + ], + [ + 17.774192, + 0.855659 + ], + [ + 17.82654, + 0.288923 + ], + [ + 17.663553, + -0.058084 + ], + [ + 17.638645, + -0.424832 + ], + [ + 17.523716, + -0.74383 + ], + [ + 16.865307, + -1.225816 + ], + [ + 16.407092, + -1.740927 + ], + [ + 15.972803, + -2.712392 + ], + [ + 16.00629, + -3.535133 + ], + [ + 15.75354, + -3.855165 + ], + [ + 15.170992, + -4.343507 + ], + [ + 14.582604, + -4.970239 + ], + [ + 14.209035, + -4.793092 + ], + [ + 14.144956, + -4.510009 + ], + [ + 13.600235, + -4.500138 + ], + [ + 13.25824, + -4.882957 + ], + [ + 12.995517, + -4.781103 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"COL", + "properties":{ + "name":"Colombia" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + -75.373223, + -0.152032 + ], + [ + -75.801466, + 0.084801 + ], + [ + -76.292314, + 0.416047 + ], + [ + -76.57638, + 0.256936 + ], + [ + -77.424984, + 0.395687 + ], + [ + -77.668613, + 0.825893 + ], + [ + -77.855061, + 0.809925 + ], + [ + -78.855259, + 1.380924 + ], + [ + -78.990935, + 1.69137 + ], + [ + -78.617831, + 1.766404 + ], + [ + -78.662118, + 2.267355 + ], + [ + -78.42761, + 2.629556 + ], + [ + -77.931543, + 2.696606 + ], + [ + -77.510431, + 3.325017 + ], + [ + -77.12769, + 3.849636 + ], + [ + -77.496272, + 4.087606 + ], + [ + -77.307601, + 4.667984 + ], + [ + -77.533221, + 5.582812 + ], + [ + -77.318815, + 5.845354 + ], + [ + -77.476661, + 6.691116 + ], + [ + -77.881571, + 7.223771 + ], + [ + -77.753414, + 7.70984 + ], + [ + -77.431108, + 7.638061 + ], + [ + -77.242566, + 7.935278 + ], + [ + -77.474723, + 8.524286 + ], + [ + -77.353361, + 8.670505 + ], + [ + -76.836674, + 8.638749 + ], + [ + -76.086384, + 9.336821 + ], + [ + -75.6746, + 9.443248 + ], + [ + -75.664704, + 9.774003 + ], + [ + -75.480426, + 10.61899 + ], + [ + -74.906895, + 11.083045 + ], + [ + -74.276753, + 11.102036 + ], + [ + -74.197223, + 11.310473 + ], + [ + -73.414764, + 11.227015 + ], + [ + -72.627835, + 11.731972 + ], + [ + -72.238195, + 11.95555 + ], + [ + -71.75409, + 12.437303 + ], + [ + -71.399822, + 12.376041 + ], + [ + -71.137461, + 12.112982 + ], + [ + -71.331584, + 11.776284 + ], + [ + -71.973922, + 11.608672 + ], + [ + -72.227575, + 11.108702 + ], + [ + -72.614658, + 10.821975 + ], + [ + -72.905286, + 10.450344 + ], + [ + -73.027604, + 9.73677 + ], + [ + -73.304952, + 9.152 + ], + [ + -72.78873, + 9.085027 + ], + [ + -72.660495, + 8.625288 + ], + [ + -72.439862, + 8.405275 + ], + [ + -72.360901, + 8.002638 + ], + [ + -72.479679, + 7.632506 + ], + [ + -72.444487, + 7.423785 + ], + [ + -72.198352, + 7.340431 + ], + [ + -71.960176, + 6.991615 + ], + [ + -70.674234, + 7.087785 + ], + [ + -70.093313, + 6.960376 + ], + [ + -69.38948, + 6.099861 + ], + [ + -68.985319, + 6.206805 + ], + [ + -68.265052, + 6.153268 + ], + [ + -67.695087, + 6.267318 + ], + [ + -67.34144, + 6.095468 + ], + [ + -67.521532, + 5.55687 + ], + [ + -67.744697, + 5.221129 + ], + [ + -67.823012, + 4.503937 + ], + [ + -67.621836, + 3.839482 + ], + [ + -67.337564, + 3.542342 + ], + [ + -67.303173, + 3.318454 + ], + [ + -67.809938, + 2.820655 + ], + [ + -67.447092, + 2.600281 + ], + [ + -67.181294, + 2.250638 + ], + [ + -66.876326, + 1.253361 + ], + [ + -67.065048, + 1.130112 + ], + [ + -67.259998, + 1.719999 + ], + [ + -67.53781, + 2.037163 + ], + [ + -67.868565, + 1.692455 + ], + [ + -69.816973, + 1.714805 + ], + [ + -69.804597, + 1.089081 + ], + [ + -69.218638, + 0.985677 + ], + [ + -69.252434, + 0.602651 + ], + [ + -69.452396, + 0.706159 + ], + [ + -70.015566, + 0.541414 + ], + [ + -70.020656, + -0.185156 + ], + [ + -69.577065, + -0.549992 + ], + [ + -69.420486, + -1.122619 + ], + [ + -69.444102, + -1.556287 + ], + [ + -69.893635, + -4.298187 + ], + [ + -70.394044, + -3.766591 + ], + [ + -70.692682, + -3.742872 + ], + [ + -70.047709, + -2.725156 + ], + [ + -70.813476, + -2.256865 + ], + [ + -71.413646, + -2.342802 + ], + [ + -71.774761, + -2.16979 + ], + [ + -72.325787, + -2.434218 + ], + [ + -73.070392, + -2.308954 + ], + [ + -73.659504, + -1.260491 + ], + [ + -74.122395, + -1.002833 + ], + [ + -74.441601, + -0.53082 + ], + [ + -75.106625, + -0.057205 + ], + [ + -75.373223, + -0.152032 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"CRI", + "properties":{ + "name":"Costa Rica" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + -82.965783, + 8.225028 + ], + [ + -83.508437, + 8.446927 + ], + [ + -83.711474, + 8.656836 + ], + [ + -83.596313, + 8.830443 + ], + [ + -83.632642, + 9.051386 + ], + [ + -83.909886, + 9.290803 + ], + [ + -84.303402, + 9.487354 + ], + [ + -84.647644, + 9.615537 + ], + [ + -84.713351, + 9.908052 + ], + [ + -84.97566, + 10.086723 + ], + [ + -84.911375, + 9.795992 + ], + [ + -85.110923, + 9.55704 + ], + [ + -85.339488, + 9.834542 + ], + [ + -85.660787, + 9.933347 + ], + [ + -85.797445, + 10.134886 + ], + [ + -85.791709, + 10.439337 + ], + [ + -85.659314, + 10.754331 + ], + [ + -85.941725, + 10.895278 + ], + [ + -85.71254, + 11.088445 + ], + [ + -85.561852, + 11.217119 + ], + [ + -84.903003, + 10.952303 + ], + [ + -84.673069, + 11.082657 + ], + [ + -84.355931, + 10.999226 + ], + [ + -84.190179, + 10.79345 + ], + [ + -83.895054, + 10.726839 + ], + [ + -83.655612, + 10.938764 + ], + [ + -83.40232, + 10.395438 + ], + [ + -83.015677, + 9.992982 + ], + [ + -82.546196, + 9.566135 + ], + [ + -82.932891, + 9.476812 + ], + [ + -82.927155, + 9.07433 + ], + [ + -82.719183, + 8.925709 + ], + [ + -82.868657, + 8.807266 + ], + [ + -82.829771, + 8.626295 + ], + [ + -82.913176, + 8.423517 + ], + [ + -82.965783, + 8.225028 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"CUB", + "properties":{ + "name":"Cuba" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + -82.268151, + 23.188611 + ], + [ + -81.404457, + 23.117271 + ], + [ + -80.618769, + 23.10598 + ], + [ + -79.679524, + 22.765303 + ], + [ + -79.281486, + 22.399202 + ], + [ + -78.347434, + 22.512166 + ], + [ + -77.993296, + 22.277194 + ], + [ + -77.146422, + 21.657851 + ], + [ + -76.523825, + 21.20682 + ], + [ + -76.19462, + 21.220565 + ], + [ + -75.598222, + 21.016624 + ], + [ + -75.67106, + 20.735091 + ], + [ + -74.933896, + 20.693905 + ], + [ + -74.178025, + 20.284628 + ], + [ + -74.296648, + 20.050379 + ], + [ + -74.961595, + 19.923435 + ], + [ + -75.63468, + 19.873774 + ], + [ + -76.323656, + 19.952891 + ], + [ + -77.755481, + 19.855481 + ], + [ + -77.085108, + 20.413354 + ], + [ + -77.492655, + 20.673105 + ], + [ + -78.137292, + 20.739949 + ], + [ + -78.482827, + 21.028613 + ], + [ + -78.719867, + 21.598114 + ], + [ + -79.285, + 21.559175 + ], + [ + -80.217475, + 21.827324 + ], + [ + -80.517535, + 22.037079 + ], + [ + -81.820943, + 22.192057 + ], + [ + -82.169992, + 22.387109 + ], + [ + -81.795002, + 22.636965 + ], + [ + -82.775898, + 22.68815 + ], + [ + -83.494459, + 22.168518 + ], + [ + -83.9088, + 22.154565 + ], + [ + -84.052151, + 21.910575 + ], + [ + -84.54703, + 21.801228 + ], + [ + -84.974911, + 21.896028 + ], + [ + -84.447062, + 22.20495 + ], + [ + -84.230357, + 22.565755 + ], + [ + -83.77824, + 22.788118 + ], + [ + -83.267548, + 22.983042 + ], + [ + -82.510436, + 23.078747 + ], + [ + -82.268151, + 23.188611 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"-99", + "properties":{ + "name":"Northern Cyprus" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 32.73178, + 35.140026 + ], + [ + 32.802474, + 35.145504 + ], + [ + 32.946961, + 35.386703 + ], + [ + 33.667227, + 35.373216 + ], + [ + 34.576474, + 35.671596 + ], + [ + 33.900804, + 35.245756 + ], + [ + 33.973617, + 35.058506 + ], + [ + 33.86644, + 35.093595 + ], + [ + 33.675392, + 35.017863 + ], + [ + 33.525685, + 35.038688 + ], + [ + 33.475817, + 35.000345 + ], + [ + 33.455922, + 35.101424 + ], + [ + 33.383833, + 35.162712 + ], + [ + 33.190977, + 35.173125 + ], + [ + 32.919572, + 35.087833 + ], + [ + 32.73178, + 35.140026 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"CYP", + "properties":{ + "name":"Cyprus" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 33.973617, + 35.058506 + ], + [ + 34.004881, + 34.978098 + ], + [ + 32.979827, + 34.571869 + ], + [ + 32.490296, + 34.701655 + ], + [ + 32.256667, + 35.103232 + ], + [ + 32.73178, + 35.140026 + ], + [ + 32.919572, + 35.087833 + ], + [ + 33.190977, + 35.173125 + ], + [ + 33.383833, + 35.162712 + ], + [ + 33.455922, + 35.101424 + ], + [ + 33.475817, + 35.000345 + ], + [ + 33.525685, + 35.038688 + ], + [ + 33.675392, + 35.017863 + ], + [ + 33.86644, + 35.093595 + ], + [ + 33.973617, + 35.058506 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"CZE", + "properties":{ + "name":"Czech Republic" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 16.960288, + 48.596982 + ], + [ + 16.499283, + 48.785808 + ], + [ + 16.029647, + 48.733899 + ], + [ + 15.253416, + 49.039074 + ], + [ + 14.901447, + 48.964402 + ], + [ + 14.338898, + 48.555305 + ], + [ + 13.595946, + 48.877172 + ], + [ + 13.031329, + 49.307068 + ], + [ + 12.521024, + 49.547415 + ], + [ + 12.415191, + 49.969121 + ], + [ + 12.240111, + 50.266338 + ], + [ + 12.966837, + 50.484076 + ], + [ + 13.338132, + 50.733234 + ], + [ + 14.056228, + 50.926918 + ], + [ + 14.307013, + 51.117268 + ], + [ + 14.570718, + 51.002339 + ], + [ + 15.016996, + 51.106674 + ], + [ + 15.490972, + 50.78473 + ], + [ + 16.238627, + 50.697733 + ], + [ + 16.176253, + 50.422607 + ], + [ + 16.719476, + 50.215747 + ], + [ + 16.868769, + 50.473974 + ], + [ + 17.554567, + 50.362146 + ], + [ + 17.649445, + 50.049038 + ], + [ + 18.392914, + 49.988629 + ], + [ + 18.853144, + 49.49623 + ], + [ + 18.554971, + 49.495015 + ], + [ + 18.399994, + 49.315001 + ], + [ + 18.170498, + 49.271515 + ], + [ + 18.104973, + 49.043983 + ], + [ + 17.913512, + 48.996493 + ], + [ + 17.886485, + 48.903475 + ], + [ + 17.545007, + 48.800019 + ], + [ + 17.101985, + 48.816969 + ], + [ + 16.960288, + 48.596982 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"DEU", + "properties":{ + "name":"Germany" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 9.921906, + 54.983104 + ], + [ + 9.93958, + 54.596642 + ], + [ + 10.950112, + 54.363607 + ], + [ + 10.939467, + 54.008693 + ], + [ + 11.956252, + 54.196486 + ], + [ + 12.51844, + 54.470371 + ], + [ + 13.647467, + 54.075511 + ], + [ + 14.119686, + 53.757029 + ], + [ + 14.353315, + 53.248171 + ], + [ + 14.074521, + 52.981263 + ], + [ + 14.4376, + 52.62485 + ], + [ + 14.685026, + 52.089947 + ], + [ + 14.607098, + 51.745188 + ], + [ + 15.016996, + 51.106674 + ], + [ + 14.570718, + 51.002339 + ], + [ + 14.307013, + 51.117268 + ], + [ + 14.056228, + 50.926918 + ], + [ + 13.338132, + 50.733234 + ], + [ + 12.966837, + 50.484076 + ], + [ + 12.240111, + 50.266338 + ], + [ + 12.415191, + 49.969121 + ], + [ + 12.521024, + 49.547415 + ], + [ + 13.031329, + 49.307068 + ], + [ + 13.595946, + 48.877172 + ], + [ + 13.243357, + 48.416115 + ], + [ + 12.884103, + 48.289146 + ], + [ + 13.025851, + 47.637584 + ], + [ + 12.932627, + 47.467646 + ], + [ + 12.62076, + 47.672388 + ], + [ + 12.141357, + 47.703083 + ], + [ + 11.426414, + 47.523766 + ], + [ + 10.544504, + 47.566399 + ], + [ + 10.402084, + 47.302488 + ], + [ + 9.896068, + 47.580197 + ], + [ + 9.594226, + 47.525058 + ], + [ + 8.522612, + 47.830828 + ], + [ + 8.317301, + 47.61358 + ], + [ + 7.466759, + 47.620582 + ], + [ + 7.593676, + 48.333019 + ], + [ + 8.099279, + 49.017784 + ], + [ + 6.65823, + 49.201958 + ], + [ + 6.18632, + 49.463803 + ], + [ + 6.242751, + 49.902226 + ], + [ + 6.043073, + 50.128052 + ], + [ + 6.156658, + 50.803721 + ], + [ + 5.988658, + 51.851616 + ], + [ + 6.589397, + 51.852029 + ], + [ + 6.84287, + 52.22844 + ], + [ + 7.092053, + 53.144043 + ], + [ + 6.90514, + 53.482162 + ], + [ + 7.100425, + 53.693932 + ], + [ + 7.936239, + 53.748296 + ], + [ + 8.121706, + 53.527792 + ], + [ + 8.800734, + 54.020786 + ], + [ + 8.572118, + 54.395646 + ], + [ + 8.526229, + 54.962744 + ], + [ + 9.282049, + 54.830865 + ], + [ + 9.921906, + 54.983104 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"DJI", + "properties":{ + "name":"Djibouti" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 43.081226, + 12.699639 + ], + [ + 43.317852, + 12.390148 + ], + [ + 43.286381, + 11.974928 + ], + [ + 42.715874, + 11.735641 + ], + [ + 43.145305, + 11.46204 + ], + [ + 42.776852, + 10.926879 + ], + [ + 42.55493, + 11.10511 + ], + [ + 42.31414, + 11.0342 + ], + [ + 41.75557, + 11.05091 + ], + [ + 41.73959, + 11.35511 + ], + [ + 41.66176, + 11.6312 + ], + [ + 42, + 12.1 + ], + [ + 42.35156, + 12.54223 + ], + [ + 42.779642, + 12.455416 + ], + [ + 43.081226, + 12.699639 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"DNK", + "properties":{ + "name":"Denmark" + }, + "geometry":{ + "type":"MultiPolygon", + "coordinates":[ + [ + [ + [ + 12.690006, + 55.609991 + ], + [ + 12.089991, + 54.800015 + ], + [ + 11.043543, + 55.364864 + ], + [ + 10.903914, + 55.779955 + ], + [ + 12.370904, + 56.111407 + ], + [ + 12.690006, + 55.609991 + ] + ] + ], + [ + [ + [ + 10.912182, + 56.458621 + ], + [ + 10.667804, + 56.081383 + ], + [ + 10.369993, + 56.190007 + ], + [ + 9.649985, + 55.469999 + ], + [ + 9.921906, + 54.983104 + ], + [ + 9.282049, + 54.830865 + ], + [ + 8.526229, + 54.962744 + ], + [ + 8.120311, + 55.517723 + ], + [ + 8.089977, + 56.540012 + ], + [ + 8.256582, + 56.809969 + ], + [ + 8.543438, + 57.110003 + ], + [ + 9.424469, + 57.172066 + ], + [ + 9.775559, + 57.447941 + ], + [ + 10.580006, + 57.730017 + ], + [ + 10.546106, + 57.215733 + ], + [ + 10.25, + 56.890016 + ], + [ + 10.369993, + 56.609982 + ], + [ + 10.912182, + 56.458621 + ] + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"DOM", + "properties":{ + "name":"Dominican Republic" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + -71.712361, + 19.714456 + ], + [ + -71.587304, + 19.884911 + ], + [ + -70.806706, + 19.880286 + ], + [ + -70.214365, + 19.622885 + ], + [ + -69.950815, + 19.648 + ], + [ + -69.76925, + 19.293267 + ], + [ + -69.222126, + 19.313214 + ], + [ + -69.254346, + 19.015196 + ], + [ + -68.809412, + 18.979074 + ], + [ + -68.317943, + 18.612198 + ], + [ + -68.689316, + 18.205142 + ], + [ + -69.164946, + 18.422648 + ], + [ + -69.623988, + 18.380713 + ], + [ + -69.952934, + 18.428307 + ], + [ + -70.133233, + 18.245915 + ], + [ + -70.517137, + 18.184291 + ], + [ + -70.669298, + 18.426886 + ], + [ + -70.99995, + 18.283329 + ], + [ + -71.40021, + 17.598564 + ], + [ + -71.657662, + 17.757573 + ], + [ + -71.708305, + 18.044997 + ], + [ + -71.687738, + 18.31666 + ], + [ + -71.945112, + 18.6169 + ], + [ + -71.701303, + 18.785417 + ], + [ + -71.624873, + 19.169838 + ], + [ + -71.712361, + 19.714456 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"DZA", + "properties":{ + "name":"Algeria" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 11.999506, + 23.471668 + ], + [ + 8.572893, + 21.565661 + ], + [ + 5.677566, + 19.601207 + ], + [ + 4.267419, + 19.155265 + ], + [ + 3.158133, + 19.057364 + ], + [ + 3.146661, + 19.693579 + ], + [ + 2.683588, + 19.85623 + ], + [ + 2.060991, + 20.142233 + ], + [ + 1.823228, + 20.610809 + ], + [ + -1.550055, + 22.792666 + ], + [ + -4.923337, + 24.974574 + ], + [ + -8.6844, + 27.395744 + ], + [ + -8.665124, + 27.589479 + ], + [ + -8.66559, + 27.656426 + ], + [ + -8.674116, + 28.841289 + ], + [ + -7.059228, + 29.579228 + ], + [ + -6.060632, + 29.7317 + ], + [ + -5.242129, + 30.000443 + ], + [ + -4.859646, + 30.501188 + ], + [ + -3.690441, + 30.896952 + ], + [ + -3.647498, + 31.637294 + ], + [ + -3.06898, + 31.724498 + ], + [ + -2.616605, + 32.094346 + ], + [ + -1.307899, + 32.262889 + ], + [ + -1.124551, + 32.651522 + ], + [ + -1.388049, + 32.864015 + ], + [ + -1.733455, + 33.919713 + ], + [ + -1.792986, + 34.527919 + ], + [ + -2.169914, + 35.168396 + ], + [ + -1.208603, + 35.714849 + ], + [ + -0.127454, + 35.888662 + ], + [ + 0.503877, + 36.301273 + ], + [ + 1.466919, + 36.605647 + ], + [ + 3.161699, + 36.783905 + ], + [ + 4.815758, + 36.865037 + ], + [ + 5.32012, + 36.716519 + ], + [ + 6.26182, + 37.110655 + ], + [ + 7.330385, + 37.118381 + ], + [ + 7.737078, + 36.885708 + ], + [ + 8.420964, + 36.946427 + ], + [ + 8.217824, + 36.433177 + ], + [ + 8.376368, + 35.479876 + ], + [ + 8.140981, + 34.655146 + ], + [ + 7.524482, + 34.097376 + ], + [ + 7.612642, + 33.344115 + ], + [ + 8.430473, + 32.748337 + ], + [ + 8.439103, + 32.506285 + ], + [ + 9.055603, + 32.102692 + ], + [ + 9.48214, + 30.307556 + ], + [ + 9.805634, + 29.424638 + ], + [ + 9.859998, + 28.95999 + ], + [ + 9.683885, + 28.144174 + ], + [ + 9.756128, + 27.688259 + ], + [ + 9.629056, + 27.140953 + ], + [ + 9.716286, + 26.512206 + ], + [ + 9.319411, + 26.094325 + ], + [ + 9.910693, + 25.365455 + ], + [ + 9.948261, + 24.936954 + ], + [ + 10.303847, + 24.379313 + ], + [ + 10.771364, + 24.562532 + ], + [ + 11.560669, + 24.097909 + ], + [ + 11.999506, + 23.471668 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"ECU", + "properties":{ + "name":"Ecuador" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + -80.302561, + -3.404856 + ], + [ + -79.770293, + -2.657512 + ], + [ + -79.986559, + -2.220794 + ], + [ + -80.368784, + -2.685159 + ], + [ + -80.967765, + -2.246943 + ], + [ + -80.764806, + -1.965048 + ], + [ + -80.933659, + -1.057455 + ], + [ + -80.58337, + -0.906663 + ], + [ + -80.399325, + -0.283703 + ], + [ + -80.020898, + 0.36034 + ], + [ + -80.09061, + 0.768429 + ], + [ + -79.542762, + 0.982938 + ], + [ + -78.855259, + 1.380924 + ], + [ + -77.855061, + 0.809925 + ], + [ + -77.668613, + 0.825893 + ], + [ + -77.424984, + 0.395687 + ], + [ + -76.57638, + 0.256936 + ], + [ + -76.292314, + 0.416047 + ], + [ + -75.801466, + 0.084801 + ], + [ + -75.373223, + -0.152032 + ], + [ + -75.233723, + -0.911417 + ], + [ + -75.544996, + -1.56161 + ], + [ + -76.635394, + -2.608678 + ], + [ + -77.837905, + -3.003021 + ], + [ + -78.450684, + -3.873097 + ], + [ + -78.639897, + -4.547784 + ], + [ + -79.205289, + -4.959129 + ], + [ + -79.624979, + -4.454198 + ], + [ + -80.028908, + -4.346091 + ], + [ + -80.442242, + -4.425724 + ], + [ + -80.469295, + -4.059287 + ], + [ + -80.184015, + -3.821162 + ], + [ + -80.302561, + -3.404856 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"EGY", + "properties":{ + "name":"Egypt" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 34.9226, + 29.50133 + ], + [ + 34.64174, + 29.09942 + ], + [ + 34.42655, + 28.34399 + ], + [ + 34.15451, + 27.8233 + ], + [ + 33.92136, + 27.6487 + ], + [ + 33.58811, + 27.97136 + ], + [ + 33.13676, + 28.41765 + ], + [ + 32.42323, + 29.85108 + ], + [ + 32.32046, + 29.76043 + ], + [ + 32.73482, + 28.70523 + ], + [ + 33.34876, + 27.69989 + ], + [ + 34.10455, + 26.14227 + ], + [ + 34.47387, + 25.59856 + ], + [ + 34.79507, + 25.03375 + ], + [ + 35.69241, + 23.92671 + ], + [ + 35.49372, + 23.75237 + ], + [ + 35.52598, + 23.10244 + ], + [ + 36.69069, + 22.20485 + ], + [ + 36.86623, + 22 + ], + [ + 32.9, + 22 + ], + [ + 29.02, + 22 + ], + [ + 25, + 22 + ], + [ + 25, + 25.6825 + ], + [ + 25, + 29.238655 + ], + [ + 24.70007, + 30.04419 + ], + [ + 24.95762, + 30.6616 + ], + [ + 24.80287, + 31.08929 + ], + [ + 25.16482, + 31.56915 + ], + [ + 26.49533, + 31.58568 + ], + [ + 27.45762, + 31.32126 + ], + [ + 28.45048, + 31.02577 + ], + [ + 28.91353, + 30.87005 + ], + [ + 29.68342, + 31.18686 + ], + [ + 30.09503, + 31.4734 + ], + [ + 30.97693, + 31.55586 + ], + [ + 31.68796, + 31.4296 + ], + [ + 31.96041, + 30.9336 + ], + [ + 32.19247, + 31.26034 + ], + [ + 32.99392, + 31.02407 + ], + [ + 33.7734, + 30.96746 + ], + [ + 34.26544, + 31.21936 + ], + [ + 34.9226, + 29.50133 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"ERI", + "properties":{ + "name":"Eritrea" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 42.35156, + 12.54223 + ], + [ + 42.00975, + 12.86582 + ], + [ + 41.59856, + 13.45209 + ], + [ + 41.155194, + 13.77332 + ], + [ + 40.8966, + 14.11864 + ], + [ + 40.026219, + 14.519579 + ], + [ + 39.34061, + 14.53155 + ], + [ + 39.0994, + 14.74064 + ], + [ + 38.51295, + 14.50547 + ], + [ + 37.90607, + 14.95943 + ], + [ + 37.59377, + 14.2131 + ], + [ + 36.42951, + 14.42211 + ], + [ + 36.323189, + 14.822481 + ], + [ + 36.75386, + 16.291874 + ], + [ + 36.85253, + 16.95655 + ], + [ + 37.16747, + 17.26314 + ], + [ + 37.904, + 17.42754 + ], + [ + 38.41009, + 17.998307 + ], + [ + 38.990623, + 16.840626 + ], + [ + 39.26611, + 15.922723 + ], + [ + 39.814294, + 15.435647 + ], + [ + 41.179275, + 14.49108 + ], + [ + 41.734952, + 13.921037 + ], + [ + 42.276831, + 13.343992 + ], + [ + 42.589576, + 13.000421 + ], + [ + 43.081226, + 12.699639 + ], + [ + 42.779642, + 12.455416 + ], + [ + 42.35156, + 12.54223 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"ESP", + "properties":{ + "name":"Spain" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + -9.034818, + 41.880571 + ], + [ + -8.984433, + 42.592775 + ], + [ + -9.392884, + 43.026625 + ], + [ + -7.97819, + 43.748338 + ], + [ + -6.754492, + 43.567909 + ], + [ + -5.411886, + 43.57424 + ], + [ + -4.347843, + 43.403449 + ], + [ + -3.517532, + 43.455901 + ], + [ + -1.901351, + 43.422802 + ], + [ + -1.502771, + 43.034014 + ], + [ + 0.338047, + 42.579546 + ], + [ + 0.701591, + 42.795734 + ], + [ + 1.826793, + 42.343385 + ], + [ + 2.985999, + 42.473015 + ], + [ + 3.039484, + 41.89212 + ], + [ + 2.091842, + 41.226089 + ], + [ + 0.810525, + 41.014732 + ], + [ + 0.721331, + 40.678318 + ], + [ + 0.106692, + 40.123934 + ], + [ + -0.278711, + 39.309978 + ], + [ + 0.111291, + 38.738514 + ], + [ + -0.467124, + 38.292366 + ], + [ + -0.683389, + 37.642354 + ], + [ + -1.438382, + 37.443064 + ], + [ + -2.146453, + 36.674144 + ], + [ + -3.415781, + 36.6589 + ], + [ + -4.368901, + 36.677839 + ], + [ + -4.995219, + 36.324708 + ], + [ + -5.37716, + 35.94685 + ], + [ + -5.866432, + 36.029817 + ], + [ + -6.236694, + 36.367677 + ], + [ + -6.520191, + 36.942913 + ], + [ + -7.453726, + 37.097788 + ], + [ + -7.537105, + 37.428904 + ], + [ + -7.166508, + 37.803894 + ], + [ + -7.029281, + 38.075764 + ], + [ + -7.374092, + 38.373059 + ], + [ + -7.098037, + 39.030073 + ], + [ + -7.498632, + 39.629571 + ], + [ + -7.066592, + 39.711892 + ], + [ + -7.026413, + 40.184524 + ], + [ + -6.86402, + 40.330872 + ], + [ + -6.851127, + 41.111083 + ], + [ + -6.389088, + 41.381815 + ], + [ + -6.668606, + 41.883387 + ], + [ + -7.251309, + 41.918346 + ], + [ + -7.422513, + 41.792075 + ], + [ + -8.013175, + 41.790886 + ], + [ + -8.263857, + 42.280469 + ], + [ + -8.671946, + 42.134689 + ], + [ + -9.034818, + 41.880571 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"EST", + "properties":{ + "name":"Estonia" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 24.312863, + 57.793424 + ], + [ + 24.428928, + 58.383413 + ], + [ + 24.061198, + 58.257375 + ], + [ + 23.42656, + 58.612753 + ], + [ + 23.339795, + 59.18724 + ], + [ + 24.604214, + 59.465854 + ], + [ + 25.864189, + 59.61109 + ], + [ + 26.949136, + 59.445803 + ], + [ + 27.981114, + 59.475388 + ], + [ + 28.131699, + 59.300825 + ], + [ + 27.420166, + 58.724581 + ], + [ + 27.716686, + 57.791899 + ], + [ + 27.288185, + 57.474528 + ], + [ + 26.463532, + 57.476389 + ], + [ + 25.60281, + 57.847529 + ], + [ + 25.164594, + 57.970157 + ], + [ + 24.312863, + 57.793424 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"ETH", + "properties":{ + "name":"Ethiopia" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 37.90607, + 14.95943 + ], + [ + 38.51295, + 14.50547 + ], + [ + 39.0994, + 14.74064 + ], + [ + 39.34061, + 14.53155 + ], + [ + 40.02625, + 14.51959 + ], + [ + 40.8966, + 14.11864 + ], + [ + 41.1552, + 13.77333 + ], + [ + 41.59856, + 13.45209 + ], + [ + 42.00975, + 12.86582 + ], + [ + 42.35156, + 12.54223 + ], + [ + 42, + 12.1 + ], + [ + 41.66176, + 11.6312 + ], + [ + 41.73959, + 11.35511 + ], + [ + 41.75557, + 11.05091 + ], + [ + 42.31414, + 11.0342 + ], + [ + 42.55493, + 11.10511 + ], + [ + 42.776852, + 10.926879 + ], + [ + 42.55876, + 10.57258 + ], + [ + 42.92812, + 10.02194 + ], + [ + 43.29699, + 9.54048 + ], + [ + 43.67875, + 9.18358 + ], + [ + 46.94834, + 7.99688 + ], + [ + 47.78942, + 8.003 + ], + [ + 44.9636, + 5.00162 + ], + [ + 43.66087, + 4.95755 + ], + [ + 42.76967, + 4.25259 + ], + [ + 42.12861, + 4.23413 + ], + [ + 41.855083, + 3.918912 + ], + [ + 41.1718, + 3.91909 + ], + [ + 40.76848, + 4.25702 + ], + [ + 39.85494, + 3.83879 + ], + [ + 39.559384, + 3.42206 + ], + [ + 38.89251, + 3.50074 + ], + [ + 38.67114, + 3.61607 + ], + [ + 38.43697, + 3.58851 + ], + [ + 38.120915, + 3.598605 + ], + [ + 36.855093, + 4.447864 + ], + [ + 36.159079, + 4.447864 + ], + [ + 35.817448, + 4.776966 + ], + [ + 35.817448, + 5.338232 + ], + [ + 35.298007, + 5.506 + ], + [ + 34.70702, + 6.59422 + ], + [ + 34.25032, + 6.82607 + ], + [ + 34.0751, + 7.22595 + ], + [ + 33.56829, + 7.71334 + ], + [ + 32.95418, + 7.78497 + ], + [ + 33.2948, + 8.35458 + ], + [ + 33.8255, + 8.37916 + ], + [ + 33.97498, + 8.68456 + ], + [ + 33.96162, + 9.58358 + ], + [ + 34.25745, + 10.63009 + ], + [ + 34.73115, + 10.91017 + ], + [ + 34.83163, + 11.31896 + ], + [ + 35.26049, + 12.08286 + ], + [ + 35.86363, + 12.57828 + ], + [ + 36.27022, + 13.56333 + ], + [ + 36.42951, + 14.42211 + ], + [ + 37.59377, + 14.2131 + ], + [ + 37.90607, + 14.95943 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"FIN", + "properties":{ + "name":"Finland" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 28.59193, + 69.064777 + ], + [ + 28.445944, + 68.364613 + ], + [ + 29.977426, + 67.698297 + ], + [ + 29.054589, + 66.944286 + ], + [ + 30.21765, + 65.80598 + ], + [ + 29.54443, + 64.948672 + ], + [ + 30.444685, + 64.204453 + ], + [ + 30.035872, + 63.552814 + ], + [ + 31.516092, + 62.867687 + ], + [ + 31.139991, + 62.357693 + ], + [ + 30.211107, + 61.780028 + ], + [ + 28.069998, + 60.503517 + ], + [ + 26.255173, + 60.423961 + ], + [ + 24.496624, + 60.057316 + ], + [ + 22.869695, + 59.846373 + ], + [ + 22.290764, + 60.391921 + ], + [ + 21.322244, + 60.72017 + ], + [ + 21.544866, + 61.705329 + ], + [ + 21.059211, + 62.607393 + ], + [ + 21.536029, + 63.189735 + ], + [ + 22.442744, + 63.81781 + ], + [ + 24.730512, + 64.902344 + ], + [ + 25.398068, + 65.111427 + ], + [ + 25.294043, + 65.534346 + ], + [ + 23.903379, + 66.006927 + ], + [ + 23.56588, + 66.396051 + ], + [ + 23.539473, + 67.936009 + ], + [ + 21.978535, + 68.616846 + ], + [ + 20.645593, + 69.106247 + ], + [ + 21.244936, + 69.370443 + ], + [ + 22.356238, + 68.841741 + ], + [ + 23.66205, + 68.891247 + ], + [ + 24.735679, + 68.649557 + ], + [ + 25.689213, + 69.092114 + ], + [ + 26.179622, + 69.825299 + ], + [ + 27.732292, + 70.164193 + ], + [ + 29.015573, + 69.766491 + ], + [ + 28.59193, + 69.064777 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"FJI", + "properties":{ + "name":"Fiji" + }, + "geometry":{ + "type":"MultiPolygon", + "coordinates":[ + [ + [ + [ + 178.3736, + -17.33992 + ], + [ + 178.71806, + -17.62846 + ], + [ + 178.55271, + -18.15059 + ], + [ + 177.93266, + -18.28799 + ], + [ + 177.38146, + -18.16432 + ], + [ + 177.28504, + -17.72465 + ], + [ + 177.67087, + -17.38114 + ], + [ + 178.12557, + -17.50481 + ], + [ + 178.3736, + -17.33992 + ] + ] + ], + [ + [ + [ + 179.364143, + -16.801354 + ], + [ + 178.725059, + -17.012042 + ], + [ + 178.596839, + -16.63915 + ], + [ + 179.096609, + -16.433984 + ], + [ + 179.413509, + -16.379054 + ], + [ + 180, + -16.067133 + ], + [ + 180, + -16.555217 + ], + [ + 179.364143, + -16.801354 + ] + ] + ], + [ + [ + [ + -179.917369, + -16.501783 + ], + [ + -180, + -16.555217 + ], + [ + -180, + -16.067133 + ], + [ + -179.79332, + -16.020882 + ], + [ + -179.917369, + -16.501783 + ] + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"FLK", + "properties":{ + "name":"Falkland Islands" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + -61.2, + -51.85 + ], + [ + -60, + -51.25 + ], + [ + -59.15, + -51.5 + ], + [ + -58.55, + -51.1 + ], + [ + -57.75, + -51.55 + ], + [ + -58.05, + -51.9 + ], + [ + -59.4, + -52.2 + ], + [ + -59.85, + -51.85 + ], + [ + -60.7, + -52.3 + ], + [ + -61.2, + -51.85 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"FRA", + "properties":{ + "name":"France" + }, + "geometry":{ + "type":"MultiPolygon", + "coordinates":[ + [ + [ + [ + 9.560016, + 42.152492 + ], + [ + 9.229752, + 41.380007 + ], + [ + 8.775723, + 41.583612 + ], + [ + 8.544213, + 42.256517 + ], + [ + 8.746009, + 42.628122 + ], + [ + 9.390001, + 43.009985 + ], + [ + 9.560016, + 42.152492 + ] + ] + ], + [ + [ + [ + 3.588184, + 50.378992 + ], + [ + 4.286023, + 49.907497 + ], + [ + 4.799222, + 49.985373 + ], + [ + 5.674052, + 49.529484 + ], + [ + 5.897759, + 49.442667 + ], + [ + 6.18632, + 49.463803 + ], + [ + 6.65823, + 49.201958 + ], + [ + 8.099279, + 49.017784 + ], + [ + 7.593676, + 48.333019 + ], + [ + 7.466759, + 47.620582 + ], + [ + 7.192202, + 47.449766 + ], + [ + 6.736571, + 47.541801 + ], + [ + 6.768714, + 47.287708 + ], + [ + 6.037389, + 46.725779 + ], + [ + 6.022609, + 46.27299 + ], + [ + 6.5001, + 46.429673 + ], + [ + 6.843593, + 45.991147 + ], + [ + 6.802355, + 45.70858 + ], + [ + 7.096652, + 45.333099 + ], + [ + 6.749955, + 45.028518 + ], + [ + 7.007562, + 44.254767 + ], + [ + 7.549596, + 44.127901 + ], + [ + 7.435185, + 43.693845 + ], + [ + 6.529245, + 43.128892 + ], + [ + 4.556963, + 43.399651 + ], + [ + 3.100411, + 43.075201 + ], + [ + 2.985999, + 42.473015 + ], + [ + 1.826793, + 42.343385 + ], + [ + 0.701591, + 42.795734 + ], + [ + 0.338047, + 42.579546 + ], + [ + -1.502771, + 43.034014 + ], + [ + -1.901351, + 43.422802 + ], + [ + -1.384225, + 44.02261 + ], + [ + -1.193798, + 46.014918 + ], + [ + -2.225724, + 47.064363 + ], + [ + -2.963276, + 47.570327 + ], + [ + -4.491555, + 47.954954 + ], + [ + -4.59235, + 48.68416 + ], + [ + -3.295814, + 48.901692 + ], + [ + -1.616511, + 48.644421 + ], + [ + -1.933494, + 49.776342 + ], + [ + -0.989469, + 49.347376 + ], + [ + 1.338761, + 50.127173 + ], + [ + 1.639001, + 50.946606 + ], + [ + 2.513573, + 51.148506 + ], + [ + 2.658422, + 50.796848 + ], + [ + 3.123252, + 50.780363 + ], + [ + 3.588184, + 50.378992 + ] + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"GAB", + "properties":{ + "name":"Gabon" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 11.093773, + -3.978827 + ], + [ + 10.066135, + -2.969483 + ], + [ + 9.405245, + -2.144313 + ], + [ + 8.797996, + -1.111301 + ], + [ + 8.830087, + -0.779074 + ], + [ + 9.04842, + -0.459351 + ], + [ + 9.291351, + 0.268666 + ], + [ + 9.492889, + 1.01012 + ], + [ + 9.830284, + 1.067894 + ], + [ + 11.285079, + 1.057662 + ], + [ + 11.276449, + 2.261051 + ], + [ + 11.751665, + 2.326758 + ], + [ + 12.35938, + 2.192812 + ], + [ + 12.951334, + 2.321616 + ], + [ + 13.075822, + 2.267097 + ], + [ + 13.003114, + 1.830896 + ], + [ + 13.282631, + 1.314184 + ], + [ + 14.026669, + 1.395677 + ], + [ + 14.276266, + 1.19693 + ], + [ + 13.843321, + 0.038758 + ], + [ + 14.316418, + -0.552627 + ], + [ + 14.425456, + -1.333407 + ], + [ + 14.29921, + -1.998276 + ], + [ + 13.992407, + -2.470805 + ], + [ + 13.109619, + -2.42874 + ], + [ + 12.575284, + -1.948511 + ], + [ + 12.495703, + -2.391688 + ], + [ + 11.820964, + -2.514161 + ], + [ + 11.478039, + -2.765619 + ], + [ + 11.855122, + -3.426871 + ], + [ + 11.093773, + -3.978827 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"GBR", + "properties":{ + "name":"United Kingdom" + }, + "geometry":{ + "type":"MultiPolygon", + "coordinates":[ + [ + [ + [ + -5.661949, + 54.554603 + ], + [ + -6.197885, + 53.867565 + ], + [ + -6.95373, + 54.073702 + ], + [ + -7.572168, + 54.059956 + ], + [ + -7.366031, + 54.595841 + ], + [ + -7.572168, + 55.131622 + ], + [ + -6.733847, + 55.17286 + ], + [ + -5.661949, + 54.554603 + ] + ] + ], + [ + [ + [ + -3.005005, + 58.635 + ], + [ + -4.073828, + 57.553025 + ], + [ + -3.055002, + 57.690019 + ], + [ + -1.959281, + 57.6848 + ], + [ + -2.219988, + 56.870017 + ], + [ + -3.119003, + 55.973793 + ], + [ + -2.085009, + 55.909998 + ], + [ + -2.005676, + 55.804903 + ], + [ + -1.114991, + 54.624986 + ], + [ + -0.430485, + 54.464376 + ], + [ + 0.184981, + 53.325014 + ], + [ + 0.469977, + 52.929999 + ], + [ + 1.681531, + 52.73952 + ], + [ + 1.559988, + 52.099998 + ], + [ + 1.050562, + 51.806761 + ], + [ + 1.449865, + 51.289428 + ], + [ + 0.550334, + 50.765739 + ], + [ + -0.787517, + 50.774989 + ], + [ + -2.489998, + 50.500019 + ], + [ + -2.956274, + 50.69688 + ], + [ + -3.617448, + 50.228356 + ], + [ + -4.542508, + 50.341837 + ], + [ + -5.245023, + 49.96 + ], + [ + -5.776567, + 50.159678 + ], + [ + -4.30999, + 51.210001 + ], + [ + -3.414851, + 51.426009 + ], + [ + -3.422719, + 51.426848 + ], + [ + -4.984367, + 51.593466 + ], + [ + -5.267296, + 51.9914 + ], + [ + -4.222347, + 52.301356 + ], + [ + -4.770013, + 52.840005 + ], + [ + -4.579999, + 53.495004 + ], + [ + -3.093831, + 53.404547 + ], + [ + -3.09208, + 53.404441 + ], + [ + -2.945009, + 53.985 + ], + [ + -3.614701, + 54.600937 + ], + [ + -3.630005, + 54.615013 + ], + [ + -4.844169, + 54.790971 + ], + [ + -5.082527, + 55.061601 + ], + [ + -4.719112, + 55.508473 + ], + [ + -5.047981, + 55.783986 + ], + [ + -5.586398, + 55.311146 + ], + [ + -5.644999, + 56.275015 + ], + [ + -6.149981, + 56.78501 + ], + [ + -5.786825, + 57.818848 + ], + [ + -5.009999, + 58.630013 + ], + [ + -4.211495, + 58.550845 + ], + [ + -3.005005, + 58.635 + ] + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"GEO", + "properties":{ + "name":"Georgia" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 41.554084, + 41.535656 + ], + [ + 41.703171, + 41.962943 + ], + [ + 41.45347, + 42.645123 + ], + [ + 40.875469, + 43.013628 + ], + [ + 40.321394, + 43.128634 + ], + [ + 39.955009, + 43.434998 + ], + [ + 40.076965, + 43.553104 + ], + [ + 40.922185, + 43.382159 + ], + [ + 42.394395, + 43.220308 + ], + [ + 43.756017, + 42.740828 + ], + [ + 43.9312, + 42.554974 + ], + [ + 44.537623, + 42.711993 + ], + [ + 45.470279, + 42.502781 + ], + [ + 45.77641, + 42.092444 + ], + [ + 46.404951, + 41.860675 + ], + [ + 46.145432, + 41.722802 + ], + [ + 46.637908, + 41.181673 + ], + [ + 46.501637, + 41.064445 + ], + [ + 45.962601, + 41.123873 + ], + [ + 45.217426, + 41.411452 + ], + [ + 44.97248, + 41.248129 + ], + [ + 43.582746, + 41.092143 + ], + [ + 42.619549, + 41.583173 + ], + [ + 41.554084, + 41.535656 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"GHA", + "properties":{ + "name":"Ghana" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 1.060122, + 5.928837 + ], + [ + -0.507638, + 5.343473 + ], + [ + -1.063625, + 5.000548 + ], + [ + -1.964707, + 4.710462 + ], + [ + -2.856125, + 4.994476 + ], + [ + -2.810701, + 5.389051 + ], + [ + -3.24437, + 6.250472 + ], + [ + -2.983585, + 7.379705 + ], + [ + -2.56219, + 8.219628 + ], + [ + -2.827496, + 9.642461 + ], + [ + -2.963896, + 10.395335 + ], + [ + -2.940409, + 10.96269 + ], + [ + -1.203358, + 11.009819 + ], + [ + -0.761576, + 10.93693 + ], + [ + -0.438702, + 11.098341 + ], + [ + 0.023803, + 11.018682 + ], + [ + -0.049785, + 10.706918 + ], + [ + 0.36758, + 10.191213 + ], + [ + 0.365901, + 9.465004 + ], + [ + 0.461192, + 8.677223 + ], + [ + 0.712029, + 8.312465 + ], + [ + 0.490957, + 7.411744 + ], + [ + 0.570384, + 6.914359 + ], + [ + 0.836931, + 6.279979 + ], + [ + 1.060122, + 5.928837 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"GIN", + "properties":{ + "name":"Guinea" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + -8.439298, + 7.686043 + ], + [ + -8.722124, + 7.711674 + ], + [ + -8.926065, + 7.309037 + ], + [ + -9.208786, + 7.313921 + ], + [ + -9.403348, + 7.526905 + ], + [ + -9.33728, + 7.928534 + ], + [ + -9.755342, + 8.541055 + ], + [ + -10.016567, + 8.428504 + ], + [ + -10.230094, + 8.406206 + ], + [ + -10.505477, + 8.348896 + ], + [ + -10.494315, + 8.715541 + ], + [ + -10.65477, + 8.977178 + ], + [ + -10.622395, + 9.26791 + ], + [ + -10.839152, + 9.688246 + ], + [ + -11.117481, + 10.045873 + ], + [ + -11.917277, + 10.046984 + ], + [ + -12.150338, + 9.858572 + ], + [ + -12.425929, + 9.835834 + ], + [ + -12.596719, + 9.620188 + ], + [ + -12.711958, + 9.342712 + ], + [ + -13.24655, + 8.903049 + ], + [ + -13.685154, + 9.494744 + ], + [ + -14.074045, + 9.886167 + ], + [ + -14.330076, + 10.01572 + ], + [ + -14.579699, + 10.214467 + ], + [ + -14.693232, + 10.656301 + ], + [ + -14.839554, + 10.876572 + ], + [ + -15.130311, + 11.040412 + ], + [ + -14.685687, + 11.527824 + ], + [ + -14.382192, + 11.509272 + ], + [ + -14.121406, + 11.677117 + ], + [ + -13.9008, + 11.678719 + ], + [ + -13.743161, + 11.811269 + ], + [ + -13.828272, + 12.142644 + ], + [ + -13.718744, + 12.247186 + ], + [ + -13.700476, + 12.586183 + ], + [ + -13.217818, + 12.575874 + ], + [ + -12.499051, + 12.33209 + ], + [ + -12.278599, + 12.35444 + ], + [ + -12.203565, + 12.465648 + ], + [ + -11.658301, + 12.386583 + ], + [ + -11.513943, + 12.442988 + ], + [ + -11.456169, + 12.076834 + ], + [ + -11.297574, + 12.077971 + ], + [ + -11.036556, + 12.211245 + ], + [ + -10.87083, + 12.177887 + ], + [ + -10.593224, + 11.923975 + ], + [ + -10.165214, + 11.844084 + ], + [ + -9.890993, + 12.060479 + ], + [ + -9.567912, + 12.194243 + ], + [ + -9.327616, + 12.334286 + ], + [ + -9.127474, + 12.30806 + ], + [ + -8.905265, + 12.088358 + ], + [ + -8.786099, + 11.812561 + ], + [ + -8.376305, + 11.393646 + ], + [ + -8.581305, + 11.136246 + ], + [ + -8.620321, + 10.810891 + ], + [ + -8.407311, + 10.909257 + ], + [ + -8.282357, + 10.792597 + ], + [ + -8.335377, + 10.494812 + ], + [ + -8.029944, + 10.206535 + ], + [ + -8.229337, + 10.12902 + ], + [ + -8.309616, + 9.789532 + ], + [ + -8.079114, + 9.376224 + ], + [ + -7.8321, + 8.575704 + ], + [ + -8.203499, + 8.455453 + ], + [ + -8.299049, + 8.316444 + ], + [ + -8.221792, + 8.123329 + ], + [ + -8.280703, + 7.68718 + ], + [ + -8.439298, + 7.686043 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"GMB", + "properties":{ + "name":"Gambia" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + -16.841525, + 13.151394 + ], + [ + -16.713729, + 13.594959 + ], + [ + -15.624596, + 13.623587 + ], + [ + -15.39877, + 13.860369 + ], + [ + -15.081735, + 13.876492 + ], + [ + -14.687031, + 13.630357 + ], + [ + -14.376714, + 13.62568 + ], + [ + -14.046992, + 13.794068 + ], + [ + -13.844963, + 13.505042 + ], + [ + -14.277702, + 13.280585 + ], + [ + -14.712197, + 13.298207 + ], + [ + -15.141163, + 13.509512 + ], + [ + -15.511813, + 13.27857 + ], + [ + -15.691001, + 13.270353 + ], + [ + -15.931296, + 13.130284 + ], + [ + -16.841525, + 13.151394 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"GNB", + "properties":{ + "name":"Guinea Bissau" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + -15.130311, + 11.040412 + ], + [ + -15.66418, + 11.458474 + ], + [ + -16.085214, + 11.524594 + ], + [ + -16.314787, + 11.806515 + ], + [ + -16.308947, + 11.958702 + ], + [ + -16.613838, + 12.170911 + ], + [ + -16.677452, + 12.384852 + ], + [ + -16.147717, + 12.547762 + ], + [ + -15.816574, + 12.515567 + ], + [ + -15.548477, + 12.62817 + ], + [ + -13.700476, + 12.586183 + ], + [ + -13.718744, + 12.247186 + ], + [ + -13.828272, + 12.142644 + ], + [ + -13.743161, + 11.811269 + ], + [ + -13.9008, + 11.678719 + ], + [ + -14.121406, + 11.677117 + ], + [ + -14.382192, + 11.509272 + ], + [ + -14.685687, + 11.527824 + ], + [ + -15.130311, + 11.040412 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"GNQ", + "properties":{ + "name":"Equatorial Guinea" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 9.492889, + 1.01012 + ], + [ + 9.305613, + 1.160911 + ], + [ + 9.649158, + 2.283866 + ], + [ + 11.276449, + 2.261051 + ], + [ + 11.285079, + 1.057662 + ], + [ + 9.830284, + 1.067894 + ], + [ + 9.492889, + 1.01012 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"GRC", + "properties":{ + "name":"Greece" + }, + "geometry":{ + "type":"MultiPolygon", + "coordinates":[ + [ + [ + [ + 23.69998, + 35.705004 + ], + [ + 24.246665, + 35.368022 + ], + [ + 25.025015, + 35.424996 + ], + [ + 25.769208, + 35.354018 + ], + [ + 25.745023, + 35.179998 + ], + [ + 26.290003, + 35.29999 + ], + [ + 26.164998, + 35.004995 + ], + [ + 24.724982, + 34.919988 + ], + [ + 24.735007, + 35.084991 + ], + [ + 23.514978, + 35.279992 + ], + [ + 23.69998, + 35.705004 + ] + ] + ], + [ + [ + [ + 26.604196, + 41.562115 + ], + [ + 26.294602, + 40.936261 + ], + [ + 26.056942, + 40.824123 + ], + [ + 25.447677, + 40.852545 + ], + [ + 24.925848, + 40.947062 + ], + [ + 23.714811, + 40.687129 + ], + [ + 24.407999, + 40.124993 + ], + [ + 23.899968, + 39.962006 + ], + [ + 23.342999, + 39.960998 + ], + [ + 22.813988, + 40.476005 + ], + [ + 22.626299, + 40.256561 + ], + [ + 22.849748, + 39.659311 + ], + [ + 23.350027, + 39.190011 + ], + [ + 22.973099, + 38.970903 + ], + [ + 23.530016, + 38.510001 + ], + [ + 24.025025, + 38.219993 + ], + [ + 24.040011, + 37.655015 + ], + [ + 23.115003, + 37.920011 + ], + [ + 23.409972, + 37.409991 + ], + [ + 22.774972, + 37.30501 + ], + [ + 23.154225, + 36.422506 + ], + [ + 22.490028, + 36.41 + ], + [ + 21.670026, + 36.844986 + ], + [ + 21.295011, + 37.644989 + ], + [ + 21.120034, + 38.310323 + ], + [ + 20.730032, + 38.769985 + ], + [ + 20.217712, + 39.340235 + ], + [ + 20.150016, + 39.624998 + ], + [ + 20.615, + 40.110007 + ], + [ + 20.674997, + 40.435 + ], + [ + 20.99999, + 40.580004 + ], + [ + 21.02004, + 40.842727 + ], + [ + 21.674161, + 40.931275 + ], + [ + 22.055378, + 41.149866 + ], + [ + 22.597308, + 41.130487 + ], + [ + 22.76177, + 41.3048 + ], + [ + 22.952377, + 41.337994 + ], + [ + 23.692074, + 41.309081 + ], + [ + 24.492645, + 41.583896 + ], + [ + 25.197201, + 41.234486 + ], + [ + 26.106138, + 41.328899 + ], + [ + 26.117042, + 41.826905 + ], + [ + 26.604196, + 41.562115 + ] + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"GRL", + "properties":{ + "name":"Greenland" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + -46.76379, + 82.62796 + ], + [ + -43.40644, + 83.22516 + ], + [ + -39.89753, + 83.18018 + ], + [ + -38.62214, + 83.54905 + ], + [ + -35.08787, + 83.64513 + ], + [ + -27.10046, + 83.51966 + ], + [ + -20.84539, + 82.72669 + ], + [ + -22.69182, + 82.34165 + ], + [ + -26.51753, + 82.29765 + ], + [ + -31.9, + 82.2 + ], + [ + -31.39646, + 82.02154 + ], + [ + -27.85666, + 82.13178 + ], + [ + -24.84448, + 81.78697 + ], + [ + -22.90328, + 82.09317 + ], + [ + -22.07175, + 81.73449 + ], + [ + -23.16961, + 81.15271 + ], + [ + -20.62363, + 81.52462 + ], + [ + -15.76818, + 81.91245 + ], + [ + -12.77018, + 81.71885 + ], + [ + -12.20855, + 81.29154 + ], + [ + -16.28533, + 80.58004 + ], + [ + -16.85, + 80.35 + ], + [ + -20.04624, + 80.17708 + ], + [ + -17.73035, + 80.12912 + ], + [ + -18.9, + 79.4 + ], + [ + -19.70499, + 78.75128 + ], + [ + -19.67353, + 77.63859 + ], + [ + -18.47285, + 76.98565 + ], + [ + -20.03503, + 76.94434 + ], + [ + -21.67944, + 76.62795 + ], + [ + -19.83407, + 76.09808 + ], + [ + -19.59896, + 75.24838 + ], + [ + -20.66818, + 75.15585 + ], + [ + -19.37281, + 74.29561 + ], + [ + -21.59422, + 74.22382 + ], + [ + -20.43454, + 73.81713 + ], + [ + -20.76234, + 73.46436 + ], + [ + -22.17221, + 73.30955 + ], + [ + -23.56593, + 73.30663 + ], + [ + -22.31311, + 72.62928 + ], + [ + -22.29954, + 72.18409 + ], + [ + -24.27834, + 72.59788 + ], + [ + -24.79296, + 72.3302 + ], + [ + -23.44296, + 72.08016 + ], + [ + -22.13281, + 71.46898 + ], + [ + -21.75356, + 70.66369 + ], + [ + -23.53603, + 70.471 + ], + [ + -24.30702, + 70.85649 + ], + [ + -25.54341, + 71.43094 + ], + [ + -25.20135, + 70.75226 + ], + [ + -26.36276, + 70.22646 + ], + [ + -23.72742, + 70.18401 + ], + [ + -22.34902, + 70.12946 + ], + [ + -25.02927, + 69.2588 + ], + [ + -27.74737, + 68.47046 + ], + [ + -30.67371, + 68.12503 + ], + [ + -31.77665, + 68.12078 + ], + [ + -32.81105, + 67.73547 + ], + [ + -34.20196, + 66.67974 + ], + [ + -36.35284, + 65.9789 + ], + [ + -37.04378, + 65.93768 + ], + [ + -38.37505, + 65.69213 + ], + [ + -39.81222, + 65.45848 + ], + [ + -40.66899, + 64.83997 + ], + [ + -40.68281, + 64.13902 + ], + [ + -41.1887, + 63.48246 + ], + [ + -42.81938, + 62.68233 + ], + [ + -42.41666, + 61.90093 + ], + [ + -42.86619, + 61.07404 + ], + [ + -43.3784, + 60.09772 + ], + [ + -44.7875, + 60.03676 + ], + [ + -46.26364, + 60.85328 + ], + [ + -48.26294, + 60.85843 + ], + [ + -49.23308, + 61.40681 + ], + [ + -49.90039, + 62.38336 + ], + [ + -51.63325, + 63.62691 + ], + [ + -52.14014, + 64.27842 + ], + [ + -52.27659, + 65.1767 + ], + [ + -53.66166, + 66.09957 + ], + [ + -53.30161, + 66.8365 + ], + [ + -53.96911, + 67.18899 + ], + [ + -52.9804, + 68.35759 + ], + [ + -51.47536, + 68.72958 + ], + [ + -51.08041, + 69.14781 + ], + [ + -50.87122, + 69.9291 + ], + [ + -52.013585, + 69.574925 + ], + [ + -52.55792, + 69.42616 + ], + [ + -53.45629, + 69.283625 + ], + [ + -54.68336, + 69.61003 + ], + [ + -54.75001, + 70.28932 + ], + [ + -54.35884, + 70.821315 + ], + [ + -53.431315, + 70.835755 + ], + [ + -51.39014, + 70.56978 + ], + [ + -53.10937, + 71.20485 + ], + [ + -54.00422, + 71.54719 + ], + [ + -55, + 71.406537 + ], + [ + -55.83468, + 71.65444 + ], + [ + -54.71819, + 72.58625 + ], + [ + -55.32634, + 72.95861 + ], + [ + -56.12003, + 73.64977 + ], + [ + -57.32363, + 74.71026 + ], + [ + -58.59679, + 75.09861 + ], + [ + -58.58516, + 75.51727 + ], + [ + -61.26861, + 76.10238 + ], + [ + -63.39165, + 76.1752 + ], + [ + -66.06427, + 76.13486 + ], + [ + -68.50438, + 76.06141 + ], + [ + -69.66485, + 76.37975 + ], + [ + -71.40257, + 77.00857 + ], + [ + -68.77671, + 77.32312 + ], + [ + -66.76397, + 77.37595 + ], + [ + -71.04293, + 77.63595 + ], + [ + -73.297, + 78.04419 + ], + [ + -73.15938, + 78.43271 + ], + [ + -69.37345, + 78.91388 + ], + [ + -65.7107, + 79.39436 + ], + [ + -65.3239, + 79.75814 + ], + [ + -68.02298, + 80.11721 + ], + [ + -67.15129, + 80.51582 + ], + [ + -63.68925, + 81.21396 + ], + [ + -62.23444, + 81.3211 + ], + [ + -62.65116, + 81.77042 + ], + [ + -60.28249, + 82.03363 + ], + [ + -57.20744, + 82.19074 + ], + [ + -54.13442, + 82.19962 + ], + [ + -53.04328, + 81.88833 + ], + [ + -50.39061, + 82.43883 + ], + [ + -48.00386, + 82.06481 + ], + [ + -46.59984, + 81.985945 + ], + [ + -44.523, + 81.6607 + ], + [ + -46.9007, + 82.19979 + ], + [ + -46.76379, + 82.62796 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"GTM", + "properties":{ + "name":"Guatemala" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + -90.095555, + 13.735338 + ], + [ + -90.608624, + 13.909771 + ], + [ + -91.23241, + 13.927832 + ], + [ + -91.689747, + 14.126218 + ], + [ + -92.22775, + 14.538829 + ], + [ + -92.20323, + 14.830103 + ], + [ + -92.087216, + 15.064585 + ], + [ + -92.229249, + 15.251447 + ], + [ + -91.74796, + 16.066565 + ], + [ + -90.464473, + 16.069562 + ], + [ + -90.438867, + 16.41011 + ], + [ + -90.600847, + 16.470778 + ], + [ + -90.711822, + 16.687483 + ], + [ + -91.08167, + 16.918477 + ], + [ + -91.453921, + 17.252177 + ], + [ + -91.002269, + 17.254658 + ], + [ + -91.00152, + 17.817595 + ], + [ + -90.067934, + 17.819326 + ], + [ + -89.14308, + 17.808319 + ], + [ + -89.150806, + 17.015577 + ], + [ + -89.229122, + 15.886938 + ], + [ + -88.930613, + 15.887273 + ], + [ + -88.604586, + 15.70638 + ], + [ + -88.518364, + 15.855389 + ], + [ + -88.225023, + 15.727722 + ], + [ + -88.68068, + 15.346247 + ], + [ + -89.154811, + 15.066419 + ], + [ + -89.22522, + 14.874286 + ], + [ + -89.145535, + 14.678019 + ], + [ + -89.353326, + 14.424133 + ], + [ + -89.587343, + 14.362586 + ], + [ + -89.534219, + 14.244816 + ], + [ + -89.721934, + 14.134228 + ], + [ + -90.064678, + 13.88197 + ], + [ + -90.095555, + 13.735338 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"GUF", + "properties":{ + "name":"French Guiana" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + -52.556425, + 2.504705 + ], + [ + -52.939657, + 2.124858 + ], + [ + -53.418465, + 2.053389 + ], + [ + -53.554839, + 2.334897 + ], + [ + -53.778521, + 2.376703 + ], + [ + -54.088063, + 2.105557 + ], + [ + -54.524754, + 2.311849 + ], + [ + -54.27123, + 2.738748 + ], + [ + -54.184284, + 3.194172 + ], + [ + -54.011504, + 3.62257 + ], + [ + -54.399542, + 4.212611 + ], + [ + -54.478633, + 4.896756 + ], + [ + -53.958045, + 5.756548 + ], + [ + -53.618453, + 5.646529 + ], + [ + -52.882141, + 5.409851 + ], + [ + -51.823343, + 4.565768 + ], + [ + -51.657797, + 4.156232 + ], + [ + -52.249338, + 3.241094 + ], + [ + -52.556425, + 2.504705 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"GUY", + "properties":{ + "name":"Guyana" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + -59.758285, + 8.367035 + ], + [ + -59.101684, + 7.999202 + ], + [ + -58.482962, + 7.347691 + ], + [ + -58.454876, + 6.832787 + ], + [ + -58.078103, + 6.809094 + ], + [ + -57.542219, + 6.321268 + ], + [ + -57.147436, + 5.97315 + ], + [ + -57.307246, + 5.073567 + ], + [ + -57.914289, + 4.812626 + ], + [ + -57.86021, + 4.576801 + ], + [ + -58.044694, + 4.060864 + ], + [ + -57.601569, + 3.334655 + ], + [ + -57.281433, + 3.333492 + ], + [ + -57.150098, + 2.768927 + ], + [ + -56.539386, + 1.899523 + ], + [ + -56.782704, + 1.863711 + ], + [ + -57.335823, + 1.948538 + ], + [ + -57.660971, + 1.682585 + ], + [ + -58.11345, + 1.507195 + ], + [ + -58.429477, + 1.463942 + ], + [ + -58.540013, + 1.268088 + ], + [ + -59.030862, + 1.317698 + ], + [ + -59.646044, + 1.786894 + ], + [ + -59.718546, + 2.24963 + ], + [ + -59.974525, + 2.755233 + ], + [ + -59.815413, + 3.606499 + ], + [ + -59.53804, + 3.958803 + ], + [ + -59.767406, + 4.423503 + ], + [ + -60.111002, + 4.574967 + ], + [ + -59.980959, + 5.014061 + ], + [ + -60.213683, + 5.244486 + ], + [ + -60.733574, + 5.200277 + ], + [ + -61.410303, + 5.959068 + ], + [ + -61.139415, + 6.234297 + ], + [ + -61.159336, + 6.696077 + ], + [ + -60.543999, + 6.856584 + ], + [ + -60.295668, + 7.043911 + ], + [ + -60.637973, + 7.415 + ], + [ + -60.550588, + 7.779603 + ], + [ + -59.758285, + 8.367035 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"HND", + "properties":{ + "name":"Honduras" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + -87.316654, + 12.984686 + ], + [ + -87.489409, + 13.297535 + ], + [ + -87.793111, + 13.38448 + ], + [ + -87.723503, + 13.78505 + ], + [ + -87.859515, + 13.893312 + ], + [ + -88.065343, + 13.964626 + ], + [ + -88.503998, + 13.845486 + ], + [ + -88.541231, + 13.980155 + ], + [ + -88.843073, + 14.140507 + ], + [ + -89.058512, + 14.340029 + ], + [ + -89.353326, + 14.424133 + ], + [ + -89.145535, + 14.678019 + ], + [ + -89.22522, + 14.874286 + ], + [ + -89.154811, + 15.066419 + ], + [ + -88.68068, + 15.346247 + ], + [ + -88.225023, + 15.727722 + ], + [ + -88.121153, + 15.688655 + ], + [ + -87.901813, + 15.864458 + ], + [ + -87.61568, + 15.878799 + ], + [ + -87.522921, + 15.797279 + ], + [ + -87.367762, + 15.84694 + ], + [ + -86.903191, + 15.756713 + ], + [ + -86.440946, + 15.782835 + ], + [ + -86.119234, + 15.893449 + ], + [ + -86.001954, + 16.005406 + ], + [ + -85.683317, + 15.953652 + ], + [ + -85.444004, + 15.885749 + ], + [ + -85.182444, + 15.909158 + ], + [ + -84.983722, + 15.995923 + ], + [ + -84.52698, + 15.857224 + ], + [ + -84.368256, + 15.835158 + ], + [ + -84.063055, + 15.648244 + ], + [ + -83.773977, + 15.424072 + ], + [ + -83.410381, + 15.270903 + ], + [ + -83.147219, + 14.995829 + ], + [ + -83.489989, + 15.016267 + ], + [ + -83.628585, + 14.880074 + ], + [ + -83.975721, + 14.749436 + ], + [ + -84.228342, + 14.748764 + ], + [ + -84.449336, + 14.621614 + ], + [ + -84.649582, + 14.666805 + ], + [ + -84.820037, + 14.819587 + ], + [ + -84.924501, + 14.790493 + ], + [ + -85.052787, + 14.551541 + ], + [ + -85.148751, + 14.560197 + ], + [ + -85.165365, + 14.35437 + ], + [ + -85.514413, + 14.079012 + ], + [ + -85.698665, + 13.960078 + ], + [ + -85.801295, + 13.836055 + ], + [ + -86.096264, + 14.038187 + ], + [ + -86.312142, + 13.771356 + ], + [ + -86.520708, + 13.778487 + ], + [ + -86.755087, + 13.754845 + ], + [ + -86.733822, + 13.263093 + ], + [ + -86.880557, + 13.254204 + ], + [ + -87.005769, + 13.025794 + ], + [ + -87.316654, + 12.984686 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"HRV", + "properties":{ + "name":"Croatia" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 18.829838, + 45.908878 + ], + [ + 19.072769, + 45.521511 + ], + [ + 19.390476, + 45.236516 + ], + [ + 19.005486, + 44.860234 + ], + [ + 18.553214, + 45.08159 + ], + [ + 17.861783, + 45.06774 + ], + [ + 17.002146, + 45.233777 + ], + [ + 16.534939, + 45.211608 + ], + [ + 16.318157, + 45.004127 + ], + [ + 15.959367, + 45.233777 + ], + [ + 15.750026, + 44.818712 + ], + [ + 16.23966, + 44.351143 + ], + [ + 16.456443, + 44.04124 + ], + [ + 16.916156, + 43.667722 + ], + [ + 17.297373, + 43.446341 + ], + [ + 17.674922, + 43.028563 + ], + [ + 18.56, + 42.65 + ], + [ + 18.450016, + 42.479991 + ], + [ + 17.50997, + 42.849995 + ], + [ + 16.930006, + 43.209998 + ], + [ + 16.015385, + 43.507215 + ], + [ + 15.174454, + 44.243191 + ], + [ + 15.37625, + 44.317915 + ], + [ + 14.920309, + 44.738484 + ], + [ + 14.901602, + 45.07606 + ], + [ + 14.258748, + 45.233777 + ], + [ + 13.952255, + 44.802124 + ], + [ + 13.656976, + 45.136935 + ], + [ + 13.679403, + 45.484149 + ], + [ + 13.71506, + 45.500324 + ], + [ + 14.411968, + 45.466166 + ], + [ + 14.595109, + 45.634941 + ], + [ + 14.935244, + 45.471695 + ], + [ + 15.327675, + 45.452316 + ], + [ + 15.323954, + 45.731783 + ], + [ + 15.67153, + 45.834154 + ], + [ + 15.768733, + 46.238108 + ], + [ + 16.564808, + 46.503751 + ], + [ + 16.882515, + 46.380632 + ], + [ + 17.630066, + 45.951769 + ], + [ + 18.456062, + 45.759481 + ], + [ + 18.829838, + 45.908878 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"HTI", + "properties":{ + "name":"Haiti" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + -73.189791, + 19.915684 + ], + [ + -72.579673, + 19.871501 + ], + [ + -71.712361, + 19.714456 + ], + [ + -71.624873, + 19.169838 + ], + [ + -71.701303, + 18.785417 + ], + [ + -71.945112, + 18.6169 + ], + [ + -71.687738, + 18.31666 + ], + [ + -71.708305, + 18.044997 + ], + [ + -72.372476, + 18.214961 + ], + [ + -72.844411, + 18.145611 + ], + [ + -73.454555, + 18.217906 + ], + [ + -73.922433, + 18.030993 + ], + [ + -74.458034, + 18.34255 + ], + [ + -74.369925, + 18.664908 + ], + [ + -73.449542, + 18.526053 + ], + [ + -72.694937, + 18.445799 + ], + [ + -72.334882, + 18.668422 + ], + [ + -72.79165, + 19.101625 + ], + [ + -72.784105, + 19.483591 + ], + [ + -73.415022, + 19.639551 + ], + [ + -73.189791, + 19.915684 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"HUN", + "properties":{ + "name":"Hungary" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 16.202298, + 46.852386 + ], + [ + 16.534268, + 47.496171 + ], + [ + 16.340584, + 47.712902 + ], + [ + 16.903754, + 47.714866 + ], + [ + 16.979667, + 48.123497 + ], + [ + 17.488473, + 47.867466 + ], + [ + 17.857133, + 47.758429 + ], + [ + 18.696513, + 47.880954 + ], + [ + 18.777025, + 48.081768 + ], + [ + 19.174365, + 48.111379 + ], + [ + 19.661364, + 48.266615 + ], + [ + 19.769471, + 48.202691 + ], + [ + 20.239054, + 48.327567 + ], + [ + 20.473562, + 48.56285 + ], + [ + 20.801294, + 48.623854 + ], + [ + 21.872236, + 48.319971 + ], + [ + 22.085608, + 48.422264 + ], + [ + 22.64082, + 48.15024 + ], + [ + 22.710531, + 47.882194 + ], + [ + 22.099768, + 47.672439 + ], + [ + 21.626515, + 46.994238 + ], + [ + 21.021952, + 46.316088 + ], + [ + 20.220192, + 46.127469 + ], + [ + 19.596045, + 46.17173 + ], + [ + 18.829838, + 45.908878 + ], + [ + 18.456062, + 45.759481 + ], + [ + 17.630066, + 45.951769 + ], + [ + 16.882515, + 46.380632 + ], + [ + 16.564808, + 46.503751 + ], + [ + 16.370505, + 46.841327 + ], + [ + 16.202298, + 46.852386 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"IDN", + "properties":{ + "name":"Indonesia" + }, + "geometry":{ + "type":"MultiPolygon", + "coordinates":[ + [ + [ + [ + 120.715609, + -10.239581 + ], + [ + 120.295014, + -10.25865 + ], + [ + 118.967808, + -9.557969 + ], + [ + 119.90031, + -9.36134 + ], + [ + 120.425756, + -9.665921 + ], + [ + 120.775502, + -9.969675 + ], + [ + 120.715609, + -10.239581 + ] + ] + ], + [ + [ + [ + 124.43595, + -10.140001 + ], + [ + 123.579982, + -10.359987 + ], + [ + 123.459989, + -10.239995 + ], + [ + 123.550009, + -9.900016 + ], + [ + 123.980009, + -9.290027 + ], + [ + 124.968682, + -8.89279 + ], + [ + 125.07002, + -9.089987 + ], + [ + 125.08852, + -9.393173 + ], + [ + 124.43595, + -10.140001 + ] + ] + ], + [ + [ + [ + 117.900018, + -8.095681 + ], + [ + 118.260616, + -8.362383 + ], + [ + 118.87846, + -8.280683 + ], + [ + 119.126507, + -8.705825 + ], + [ + 117.970402, + -8.906639 + ], + [ + 117.277731, + -9.040895 + ], + [ + 116.740141, + -9.032937 + ], + [ + 117.083737, + -8.457158 + ], + [ + 117.632024, + -8.449303 + ], + [ + 117.900018, + -8.095681 + ] + ] + ], + [ + [ + [ + 122.903537, + -8.094234 + ], + [ + 122.756983, + -8.649808 + ], + [ + 121.254491, + -8.933666 + ], + [ + 119.924391, + -8.810418 + ], + [ + 119.920929, + -8.444859 + ], + [ + 120.715092, + -8.236965 + ], + [ + 121.341669, + -8.53674 + ], + [ + 122.007365, + -8.46062 + ], + [ + 122.903537, + -8.094234 + ] + ] + ], + [ + [ + [ + 108.623479, + -6.777674 + ], + [ + 110.539227, + -6.877358 + ], + [ + 110.759576, + -6.465186 + ], + [ + 112.614811, + -6.946036 + ], + [ + 112.978768, + -7.594213 + ], + [ + 114.478935, + -7.776528 + ], + [ + 115.705527, + -8.370807 + ], + [ + 114.564511, + -8.751817 + ], + [ + 113.464734, + -8.348947 + ], + [ + 112.559672, + -8.376181 + ], + [ + 111.522061, + -8.302129 + ], + [ + 110.58615, + -8.122605 + ], + [ + 109.427667, + -7.740664 + ], + [ + 108.693655, + -7.6416 + ], + [ + 108.277763, + -7.766657 + ], + [ + 106.454102, + -7.3549 + ], + [ + 106.280624, + -6.9249 + ], + [ + 105.365486, + -6.851416 + ], + [ + 106.051646, + -5.895919 + ], + [ + 107.265009, + -5.954985 + ], + [ + 108.072091, + -6.345762 + ], + [ + 108.486846, + -6.421985 + ], + [ + 108.623479, + -6.777674 + ] + ] + ], + [ + [ + [ + 134.724624, + -6.214401 + ], + [ + 134.210134, + -6.895238 + ], + [ + 134.112776, + -6.142467 + ], + [ + 134.290336, + -5.783058 + ], + [ + 134.499625, + -5.445042 + ], + [ + 134.727002, + -5.737582 + ], + [ + 134.724624, + -6.214401 + ] + ] + ], + [ + [ + [ + 127.249215, + -3.459065 + ], + [ + 126.874923, + -3.790983 + ], + [ + 126.183802, + -3.607376 + ], + [ + 125.989034, + -3.177273 + ], + [ + 127.000651, + -3.129318 + ], + [ + 127.249215, + -3.459065 + ] + ] + ], + [ + [ + [ + 130.471344, + -3.093764 + ], + [ + 130.834836, + -3.858472 + ], + [ + 129.990547, + -3.446301 + ], + [ + 129.155249, + -3.362637 + ], + [ + 128.590684, + -3.428679 + ], + [ + 127.898891, + -3.393436 + ], + [ + 128.135879, + -2.84365 + ], + [ + 129.370998, + -2.802154 + ], + [ + 130.471344, + -3.093764 + ] + ] + ], + [ + [ + [ + 134.143368, + -1.151867 + ], + [ + 134.422627, + -2.769185 + ], + [ + 135.457603, + -3.367753 + ], + [ + 136.293314, + -2.307042 + ], + [ + 137.440738, + -1.703513 + ], + [ + 138.329727, + -1.702686 + ], + [ + 139.184921, + -2.051296 + ], + [ + 139.926684, + -2.409052 + ], + [ + 141.00021, + -2.600151 + ], + [ + 141.017057, + -5.859022 + ], + [ + 141.033852, + -9.117893 + ], + [ + 140.143415, + -8.297168 + ], + [ + 139.127767, + -8.096043 + ], + [ + 138.881477, + -8.380935 + ], + [ + 137.614474, + -8.411683 + ], + [ + 138.039099, + -7.597882 + ], + [ + 138.668621, + -7.320225 + ], + [ + 138.407914, + -6.232849 + ], + [ + 137.92784, + -5.393366 + ], + [ + 135.98925, + -4.546544 + ], + [ + 135.164598, + -4.462931 + ], + [ + 133.66288, + -3.538853 + ], + [ + 133.367705, + -4.024819 + ], + [ + 132.983956, + -4.112979 + ], + [ + 132.756941, + -3.746283 + ], + [ + 132.753789, + -3.311787 + ], + [ + 131.989804, + -2.820551 + ], + [ + 133.066845, + -2.460418 + ], + [ + 133.780031, + -2.479848 + ], + [ + 133.696212, + -2.214542 + ], + [ + 132.232373, + -2.212526 + ], + [ + 131.836222, + -1.617162 + ], + [ + 130.94284, + -1.432522 + ], + [ + 130.519558, + -0.93772 + ], + [ + 131.867538, + -0.695461 + ], + [ + 132.380116, + -0.369538 + ], + [ + 133.985548, + -0.78021 + ], + [ + 134.143368, + -1.151867 + ] + ] + ], + [ + [ + [ + 125.240501, + 1.419836 + ], + [ + 124.437035, + 0.427881 + ], + [ + 123.685505, + 0.235593 + ], + [ + 122.723083, + 0.431137 + ], + [ + 121.056725, + 0.381217 + ], + [ + 120.183083, + 0.237247 + ], + [ + 120.04087, + -0.519658 + ], + [ + 120.935905, + -1.408906 + ], + [ + 121.475821, + -0.955962 + ], + [ + 123.340565, + -0.615673 + ], + [ + 123.258399, + -1.076213 + ], + [ + 122.822715, + -0.930951 + ], + [ + 122.38853, + -1.516858 + ], + [ + 121.508274, + -1.904483 + ], + [ + 122.454572, + -3.186058 + ], + [ + 122.271896, + -3.5295 + ], + [ + 123.170963, + -4.683693 + ], + [ + 123.162333, + -5.340604 + ], + [ + 122.628515, + -5.634591 + ], + [ + 122.236394, + -5.282933 + ], + [ + 122.719569, + -4.464172 + ], + [ + 121.738234, + -4.851331 + ], + [ + 121.489463, + -4.574553 + ], + [ + 121.619171, + -4.188478 + ], + [ + 120.898182, + -3.602105 + ], + [ + 120.972389, + -2.627643 + ], + [ + 120.305453, + -2.931604 + ], + [ + 120.390047, + -4.097579 + ], + [ + 120.430717, + -5.528241 + ], + [ + 119.796543, + -5.6734 + ], + [ + 119.366906, + -5.379878 + ], + [ + 119.653606, + -4.459417 + ], + [ + 119.498835, + -3.494412 + ], + [ + 119.078344, + -3.487022 + ], + [ + 118.767769, + -2.801999 + ], + [ + 119.180974, + -2.147104 + ], + [ + 119.323394, + -1.353147 + ], + [ + 119.825999, + 0.154254 + ], + [ + 120.035702, + 0.566477 + ], + [ + 120.885779, + 1.309223 + ], + [ + 121.666817, + 1.013944 + ], + [ + 122.927567, + 0.875192 + ], + [ + 124.077522, + 0.917102 + ], + [ + 125.065989, + 1.643259 + ], + [ + 125.240501, + 1.419836 + ] + ] + ], + [ + [ + [ + 128.688249, + 1.132386 + ], + [ + 128.635952, + 0.258486 + ], + [ + 128.12017, + 0.356413 + ], + [ + 127.968034, + -0.252077 + ], + [ + 128.379999, + -0.780004 + ], + [ + 128.100016, + -0.899996 + ], + [ + 127.696475, + -0.266598 + ], + [ + 127.39949, + 1.011722 + ], + [ + 127.600512, + 1.810691 + ], + [ + 127.932378, + 2.174596 + ], + [ + 128.004156, + 1.628531 + ], + [ + 128.594559, + 1.540811 + ], + [ + 128.688249, + 1.132386 + ] + ] + ], + [ + [ + [ + 117.875627, + 1.827641 + ], + [ + 118.996747, + 0.902219 + ], + [ + 117.811858, + 0.784242 + ], + [ + 117.478339, + 0.102475 + ], + [ + 117.521644, + -0.803723 + ], + [ + 116.560048, + -1.487661 + ], + [ + 116.533797, + -2.483517 + ], + [ + 116.148084, + -4.012726 + ], + [ + 116.000858, + -3.657037 + ], + [ + 114.864803, + -4.106984 + ], + [ + 114.468652, + -3.495704 + ], + [ + 113.755672, + -3.43917 + ], + [ + 113.256994, + -3.118776 + ], + [ + 112.068126, + -3.478392 + ], + [ + 111.703291, + -2.994442 + ], + [ + 111.04824, + -3.049426 + ], + [ + 110.223846, + -2.934032 + ], + [ + 110.070936, + -1.592874 + ], + [ + 109.571948, + -1.314907 + ], + [ + 109.091874, + -0.459507 + ], + [ + 108.952658, + 0.415375 + ], + [ + 109.069136, + 1.341934 + ], + [ + 109.66326, + 2.006467 + ], + [ + 109.830227, + 1.338136 + ], + [ + 110.514061, + 0.773131 + ], + [ + 111.159138, + 0.976478 + ], + [ + 111.797548, + 0.904441 + ], + [ + 112.380252, + 1.410121 + ], + [ + 112.859809, + 1.49779 + ], + [ + 113.80585, + 1.217549 + ], + [ + 114.621355, + 1.430688 + ], + [ + 115.134037, + 2.821482 + ], + [ + 115.519078, + 3.169238 + ], + [ + 115.865517, + 4.306559 + ], + [ + 117.015214, + 4.306094 + ], + [ + 117.882035, + 4.137551 + ], + [ + 117.313232, + 3.234428 + ], + [ + 118.04833, + 2.28769 + ], + [ + 117.875627, + 1.827641 + ] + ] + ], + [ + [ + [ + 105.817655, + -5.852356 + ], + [ + 104.710384, + -5.873285 + ], + [ + 103.868213, + -5.037315 + ], + [ + 102.584261, + -4.220259 + ], + [ + 102.156173, + -3.614146 + ], + [ + 101.399113, + -2.799777 + ], + [ + 100.902503, + -2.050262 + ], + [ + 100.141981, + -0.650348 + ], + [ + 99.26374, + 0.183142 + ], + [ + 98.970011, + 1.042882 + ], + [ + 98.601351, + 1.823507 + ], + [ + 97.699598, + 2.453184 + ], + [ + 97.176942, + 3.308791 + ], + [ + 96.424017, + 3.86886 + ], + [ + 95.380876, + 4.970782 + ], + [ + 95.293026, + 5.479821 + ], + [ + 95.936863, + 5.439513 + ], + [ + 97.484882, + 5.246321 + ], + [ + 98.369169, + 4.26837 + ], + [ + 99.142559, + 3.59035 + ], + [ + 99.693998, + 3.174329 + ], + [ + 100.641434, + 2.099381 + ], + [ + 101.658012, + 2.083697 + ], + [ + 102.498271, + 1.3987 + ], + [ + 103.07684, + 0.561361 + ], + [ + 103.838396, + 0.104542 + ], + [ + 103.437645, + -0.711946 + ], + [ + 104.010789, + -1.059212 + ], + [ + 104.369991, + -1.084843 + ], + [ + 104.53949, + -1.782372 + ], + [ + 104.887893, + -2.340425 + ], + [ + 105.622111, + -2.428844 + ], + [ + 106.108593, + -3.061777 + ], + [ + 105.857446, + -4.305525 + ], + [ + 105.817655, + -5.852356 + ] + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"IND", + "properties":{ + "name":"India" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 77.837451, + 35.49401 + ], + [ + 78.912269, + 34.321936 + ], + [ + 78.811086, + 33.506198 + ], + [ + 79.208892, + 32.994395 + ], + [ + 79.176129, + 32.48378 + ], + [ + 78.458446, + 32.618164 + ], + [ + 78.738894, + 31.515906 + ], + [ + 79.721367, + 30.882715 + ], + [ + 81.111256, + 30.183481 + ], + [ + 80.476721, + 29.729865 + ], + [ + 80.088425, + 28.79447 + ], + [ + 81.057203, + 28.416095 + ], + [ + 81.999987, + 27.925479 + ], + [ + 83.304249, + 27.364506 + ], + [ + 84.675018, + 27.234901 + ], + [ + 85.251779, + 26.726198 + ], + [ + 86.024393, + 26.630985 + ], + [ + 87.227472, + 26.397898 + ], + [ + 88.060238, + 26.414615 + ], + [ + 88.174804, + 26.810405 + ], + [ + 88.043133, + 27.445819 + ], + [ + 88.120441, + 27.876542 + ], + [ + 88.730326, + 28.086865 + ], + [ + 88.814248, + 27.299316 + ], + [ + 88.835643, + 27.098966 + ], + [ + 89.744528, + 26.719403 + ], + [ + 90.373275, + 26.875724 + ], + [ + 91.217513, + 26.808648 + ], + [ + 92.033484, + 26.83831 + ], + [ + 92.103712, + 27.452614 + ], + [ + 91.696657, + 27.771742 + ], + [ + 92.503119, + 27.896876 + ], + [ + 93.413348, + 28.640629 + ], + [ + 94.56599, + 29.277438 + ], + [ + 95.404802, + 29.031717 + ], + [ + 96.117679, + 29.452802 + ], + [ + 96.586591, + 28.83098 + ], + [ + 96.248833, + 28.411031 + ], + [ + 97.327114, + 28.261583 + ], + [ + 97.402561, + 27.882536 + ], + [ + 97.051989, + 27.699059 + ], + [ + 97.133999, + 27.083774 + ], + [ + 96.419366, + 27.264589 + ], + [ + 95.124768, + 26.573572 + ], + [ + 95.155153, + 26.001307 + ], + [ + 94.603249, + 25.162495 + ], + [ + 94.552658, + 24.675238 + ], + [ + 94.106742, + 23.850741 + ], + [ + 93.325188, + 24.078556 + ], + [ + 93.286327, + 23.043658 + ], + [ + 93.060294, + 22.703111 + ], + [ + 93.166128, + 22.27846 + ], + [ + 92.672721, + 22.041239 + ], + [ + 92.146035, + 23.627499 + ], + [ + 91.869928, + 23.624346 + ], + [ + 91.706475, + 22.985264 + ], + [ + 91.158963, + 23.503527 + ], + [ + 91.46773, + 24.072639 + ], + [ + 91.915093, + 24.130414 + ], + [ + 92.376202, + 24.976693 + ], + [ + 91.799596, + 25.147432 + ], + [ + 90.872211, + 25.132601 + ], + [ + 89.920693, + 25.26975 + ], + [ + 89.832481, + 25.965082 + ], + [ + 89.355094, + 26.014407 + ], + [ + 88.563049, + 26.446526 + ], + [ + 88.209789, + 25.768066 + ], + [ + 88.931554, + 25.238692 + ], + [ + 88.306373, + 24.866079 + ], + [ + 88.084422, + 24.501657 + ], + [ + 88.69994, + 24.233715 + ], + [ + 88.52977, + 23.631142 + ], + [ + 88.876312, + 22.879146 + ], + [ + 89.031961, + 22.055708 + ], + [ + 88.888766, + 21.690588 + ], + [ + 88.208497, + 21.703172 + ], + [ + 86.975704, + 21.495562 + ], + [ + 87.033169, + 20.743308 + ], + [ + 86.499351, + 20.151638 + ], + [ + 85.060266, + 19.478579 + ], + [ + 83.941006, + 18.30201 + ], + [ + 83.189217, + 17.671221 + ], + [ + 82.192792, + 17.016636 + ], + [ + 82.191242, + 16.556664 + ], + [ + 81.692719, + 16.310219 + ], + [ + 80.791999, + 15.951972 + ], + [ + 80.324896, + 15.899185 + ], + [ + 80.025069, + 15.136415 + ], + [ + 80.233274, + 13.835771 + ], + [ + 80.286294, + 13.006261 + ], + [ + 79.862547, + 12.056215 + ], + [ + 79.857999, + 10.357275 + ], + [ + 79.340512, + 10.308854 + ], + [ + 78.885345, + 9.546136 + ], + [ + 79.18972, + 9.216544 + ], + [ + 78.277941, + 8.933047 + ], + [ + 77.941165, + 8.252959 + ], + [ + 77.539898, + 7.965535 + ], + [ + 76.592979, + 8.899276 + ], + [ + 76.130061, + 10.29963 + ], + [ + 75.746467, + 11.308251 + ], + [ + 75.396101, + 11.781245 + ], + [ + 74.864816, + 12.741936 + ], + [ + 74.616717, + 13.992583 + ], + [ + 74.443859, + 14.617222 + ], + [ + 73.534199, + 15.990652 + ], + [ + 73.119909, + 17.92857 + ], + [ + 72.820909, + 19.208234 + ], + [ + 72.824475, + 20.419503 + ], + [ + 72.630533, + 21.356009 + ], + [ + 71.175273, + 20.757441 + ], + [ + 70.470459, + 20.877331 + ], + [ + 69.16413, + 22.089298 + ], + [ + 69.644928, + 22.450775 + ], + [ + 69.349597, + 22.84318 + ], + [ + 68.176645, + 23.691965 + ], + [ + 68.842599, + 24.359134 + ], + [ + 71.04324, + 24.356524 + ], + [ + 70.844699, + 25.215102 + ], + [ + 70.282873, + 25.722229 + ], + [ + 70.168927, + 26.491872 + ], + [ + 69.514393, + 26.940966 + ], + [ + 70.616496, + 27.989196 + ], + [ + 71.777666, + 27.91318 + ], + [ + 72.823752, + 28.961592 + ], + [ + 73.450638, + 29.976413 + ], + [ + 74.42138, + 30.979815 + ], + [ + 74.405929, + 31.692639 + ], + [ + 75.258642, + 32.271105 + ], + [ + 74.451559, + 32.7649 + ], + [ + 74.104294, + 33.441473 + ], + [ + 73.749948, + 34.317699 + ], + [ + 74.240203, + 34.748887 + ], + [ + 75.757061, + 34.504923 + ], + [ + 76.871722, + 34.653544 + ], + [ + 77.837451, + 35.49401 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"IRL", + "properties":{ + "name":"Ireland" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + -6.197885, + 53.867565 + ], + [ + -6.032985, + 53.153164 + ], + [ + -6.788857, + 52.260118 + ], + [ + -8.561617, + 51.669301 + ], + [ + -9.977086, + 51.820455 + ], + [ + -9.166283, + 52.864629 + ], + [ + -9.688525, + 53.881363 + ], + [ + -8.327987, + 54.664519 + ], + [ + -7.572168, + 55.131622 + ], + [ + -7.366031, + 54.595841 + ], + [ + -7.572168, + 54.059956 + ], + [ + -6.95373, + 54.073702 + ], + [ + -6.197885, + 53.867565 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"IRN", + "properties":{ + "name":"Iran" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 53.921598, + 37.198918 + ], + [ + 54.800304, + 37.392421 + ], + [ + 55.511578, + 37.964117 + ], + [ + 56.180375, + 37.935127 + ], + [ + 56.619366, + 38.121394 + ], + [ + 57.330434, + 38.029229 + ], + [ + 58.436154, + 37.522309 + ], + [ + 59.234762, + 37.412988 + ], + [ + 60.377638, + 36.527383 + ], + [ + 61.123071, + 36.491597 + ], + [ + 61.210817, + 35.650072 + ], + [ + 60.803193, + 34.404102 + ], + [ + 60.52843, + 33.676446 + ], + [ + 60.9637, + 33.528832 + ], + [ + 60.536078, + 32.981269 + ], + [ + 60.863655, + 32.18292 + ], + [ + 60.941945, + 31.548075 + ], + [ + 61.699314, + 31.379506 + ], + [ + 61.781222, + 30.73585 + ], + [ + 60.874248, + 29.829239 + ], + [ + 61.369309, + 29.303276 + ], + [ + 61.771868, + 28.699334 + ], + [ + 62.72783, + 28.259645 + ], + [ + 62.755426, + 27.378923 + ], + [ + 63.233898, + 27.217047 + ], + [ + 63.316632, + 26.756532 + ], + [ + 61.874187, + 26.239975 + ], + [ + 61.497363, + 25.078237 + ], + [ + 59.616134, + 25.380157 + ], + [ + 58.525761, + 25.609962 + ], + [ + 57.397251, + 25.739902 + ], + [ + 56.970766, + 26.966106 + ], + [ + 56.492139, + 27.143305 + ], + [ + 55.72371, + 26.964633 + ], + [ + 54.71509, + 26.480658 + ], + [ + 53.493097, + 26.812369 + ], + [ + 52.483598, + 27.580849 + ], + [ + 51.520763, + 27.86569 + ], + [ + 50.852948, + 28.814521 + ], + [ + 50.115009, + 30.147773 + ], + [ + 49.57685, + 29.985715 + ], + [ + 48.941333, + 30.31709 + ], + [ + 48.567971, + 29.926778 + ], + [ + 48.014568, + 30.452457 + ], + [ + 48.004698, + 30.985137 + ], + [ + 47.685286, + 30.984853 + ], + [ + 47.849204, + 31.709176 + ], + [ + 47.334661, + 32.469155 + ], + [ + 46.109362, + 33.017287 + ], + [ + 45.416691, + 33.967798 + ], + [ + 45.64846, + 34.748138 + ], + [ + 46.151788, + 35.093259 + ], + [ + 46.07634, + 35.677383 + ], + [ + 45.420618, + 35.977546 + ], + [ + 44.77267, + 37.17045 + ], + [ + 44.225756, + 37.971584 + ], + [ + 44.421403, + 38.281281 + ], + [ + 44.109225, + 39.428136 + ], + [ + 44.79399, + 39.713003 + ], + [ + 44.952688, + 39.335765 + ], + [ + 45.457722, + 38.874139 + ], + [ + 46.143623, + 38.741201 + ], + [ + 46.50572, + 38.770605 + ], + [ + 47.685079, + 39.508364 + ], + [ + 48.060095, + 39.582235 + ], + [ + 48.355529, + 39.288765 + ], + [ + 48.010744, + 38.794015 + ], + [ + 48.634375, + 38.270378 + ], + [ + 48.883249, + 38.320245 + ], + [ + 49.199612, + 37.582874 + ], + [ + 50.147771, + 37.374567 + ], + [ + 50.842354, + 36.872814 + ], + [ + 52.264025, + 36.700422 + ], + [ + 53.82579, + 36.965031 + ], + [ + 53.921598, + 37.198918 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"IRQ", + "properties":{ + "name":"Iraq" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 45.420618, + 35.977546 + ], + [ + 46.07634, + 35.677383 + ], + [ + 46.151788, + 35.093259 + ], + [ + 45.64846, + 34.748138 + ], + [ + 45.416691, + 33.967798 + ], + [ + 46.109362, + 33.017287 + ], + [ + 47.334661, + 32.469155 + ], + [ + 47.849204, + 31.709176 + ], + [ + 47.685286, + 30.984853 + ], + [ + 48.004698, + 30.985137 + ], + [ + 48.014568, + 30.452457 + ], + [ + 48.567971, + 29.926778 + ], + [ + 47.974519, + 29.975819 + ], + [ + 47.302622, + 30.05907 + ], + [ + 46.568713, + 29.099025 + ], + [ + 44.709499, + 29.178891 + ], + [ + 41.889981, + 31.190009 + ], + [ + 40.399994, + 31.889992 + ], + [ + 39.195468, + 32.161009 + ], + [ + 38.792341, + 33.378686 + ], + [ + 41.006159, + 34.419372 + ], + [ + 41.383965, + 35.628317 + ], + [ + 41.289707, + 36.358815 + ], + [ + 41.837064, + 36.605854 + ], + [ + 42.349591, + 37.229873 + ], + [ + 42.779126, + 37.385264 + ], + [ + 43.942259, + 37.256228 + ], + [ + 44.293452, + 37.001514 + ], + [ + 44.772699, + 37.170445 + ], + [ + 45.420618, + 35.977546 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"ISL", + "properties":{ + "name":"Iceland" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + -14.508695, + 66.455892 + ], + [ + -14.739637, + 65.808748 + ], + [ + -13.609732, + 65.126671 + ], + [ + -14.909834, + 64.364082 + ], + [ + -17.794438, + 63.678749 + ], + [ + -18.656246, + 63.496383 + ], + [ + -19.972755, + 63.643635 + ], + [ + -22.762972, + 63.960179 + ], + [ + -21.778484, + 64.402116 + ], + [ + -23.955044, + 64.89113 + ], + [ + -22.184403, + 65.084968 + ], + [ + -22.227423, + 65.378594 + ], + [ + -24.326184, + 65.611189 + ], + [ + -23.650515, + 66.262519 + ], + [ + -22.134922, + 66.410469 + ], + [ + -20.576284, + 65.732112 + ], + [ + -19.056842, + 66.276601 + ], + [ + -17.798624, + 65.993853 + ], + [ + -16.167819, + 66.526792 + ], + [ + -14.508695, + 66.455892 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"ISR", + "properties":{ + "name":"Israel" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 35.719918, + 32.709192 + ], + [ + 35.545665, + 32.393992 + ], + [ + 35.18393, + 32.532511 + ], + [ + 34.974641, + 31.866582 + ], + [ + 35.225892, + 31.754341 + ], + [ + 34.970507, + 31.616778 + ], + [ + 34.927408, + 31.353435 + ], + [ + 35.397561, + 31.489086 + ], + [ + 35.420918, + 31.100066 + ], + [ + 34.922603, + 29.501326 + ], + [ + 34.265433, + 31.219361 + ], + [ + 34.556372, + 31.548824 + ], + [ + 34.488107, + 31.605539 + ], + [ + 34.752587, + 32.072926 + ], + [ + 34.955417, + 32.827376 + ], + [ + 35.098457, + 33.080539 + ], + [ + 35.126053, + 33.0909 + ], + [ + 35.460709, + 33.08904 + ], + [ + 35.552797, + 33.264275 + ], + [ + 35.821101, + 33.277426 + ], + [ + 35.836397, + 32.868123 + ], + [ + 35.700798, + 32.716014 + ], + [ + 35.719918, + 32.709192 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"ITA", + "properties":{ + "name":"Italy" + }, + "geometry":{ + "type":"MultiPolygon", + "coordinates":[ + [ + [ + [ + 15.520376, + 38.231155 + ], + [ + 15.160243, + 37.444046 + ], + [ + 15.309898, + 37.134219 + ], + [ + 15.099988, + 36.619987 + ], + [ + 14.335229, + 36.996631 + ], + [ + 13.826733, + 37.104531 + ], + [ + 12.431004, + 37.61295 + ], + [ + 12.570944, + 38.126381 + ], + [ + 13.741156, + 38.034966 + ], + [ + 14.761249, + 38.143874 + ], + [ + 15.520376, + 38.231155 + ] + ] + ], + [ + [ + [ + 9.210012, + 41.209991 + ], + [ + 9.809975, + 40.500009 + ], + [ + 9.669519, + 39.177376 + ], + [ + 9.214818, + 39.240473 + ], + [ + 8.806936, + 38.906618 + ], + [ + 8.428302, + 39.171847 + ], + [ + 8.388253, + 40.378311 + ], + [ + 8.159998, + 40.950007 + ], + [ + 8.709991, + 40.899984 + ], + [ + 9.210012, + 41.209991 + ] + ] + ], + [ + [ + [ + 12.376485, + 46.767559 + ], + [ + 13.806475, + 46.509306 + ], + [ + 13.69811, + 46.016778 + ], + [ + 13.93763, + 45.591016 + ], + [ + 13.141606, + 45.736692 + ], + [ + 12.328581, + 45.381778 + ], + [ + 12.383875, + 44.885374 + ], + [ + 12.261453, + 44.600482 + ], + [ + 12.589237, + 44.091366 + ], + [ + 13.526906, + 43.587727 + ], + [ + 14.029821, + 42.761008 + ], + [ + 15.14257, + 41.95514 + ], + [ + 15.926191, + 41.961315 + ], + [ + 16.169897, + 41.740295 + ], + [ + 15.889346, + 41.541082 + ], + [ + 16.785002, + 41.179606 + ], + [ + 17.519169, + 40.877143 + ], + [ + 18.376687, + 40.355625 + ], + [ + 18.480247, + 40.168866 + ], + [ + 18.293385, + 39.810774 + ], + [ + 17.73838, + 40.277671 + ], + [ + 16.869596, + 40.442235 + ], + [ + 16.448743, + 39.795401 + ], + [ + 17.17149, + 39.4247 + ], + [ + 17.052841, + 38.902871 + ], + [ + 16.635088, + 38.843572 + ], + [ + 16.100961, + 37.985899 + ], + [ + 15.684087, + 37.908849 + ], + [ + 15.687963, + 38.214593 + ], + [ + 15.891981, + 38.750942 + ], + [ + 16.109332, + 38.964547 + ], + [ + 15.718814, + 39.544072 + ], + [ + 15.413613, + 40.048357 + ], + [ + 14.998496, + 40.172949 + ], + [ + 14.703268, + 40.60455 + ], + [ + 14.060672, + 40.786348 + ], + [ + 13.627985, + 41.188287 + ], + [ + 12.888082, + 41.25309 + ], + [ + 12.106683, + 41.704535 + ], + [ + 11.191906, + 42.355425 + ], + [ + 10.511948, + 42.931463 + ], + [ + 10.200029, + 43.920007 + ], + [ + 9.702488, + 44.036279 + ], + [ + 8.888946, + 44.366336 + ], + [ + 8.428561, + 44.231228 + ], + [ + 7.850767, + 43.767148 + ], + [ + 7.435185, + 43.693845 + ], + [ + 7.549596, + 44.127901 + ], + [ + 7.007562, + 44.254767 + ], + [ + 6.749955, + 45.028518 + ], + [ + 7.096652, + 45.333099 + ], + [ + 6.802355, + 45.70858 + ], + [ + 6.843593, + 45.991147 + ], + [ + 7.273851, + 45.776948 + ], + [ + 7.755992, + 45.82449 + ], + [ + 8.31663, + 46.163642 + ], + [ + 8.489952, + 46.005151 + ], + [ + 8.966306, + 46.036932 + ], + [ + 9.182882, + 46.440215 + ], + [ + 9.922837, + 46.314899 + ], + [ + 10.363378, + 46.483571 + ], + [ + 10.442701, + 46.893546 + ], + [ + 11.048556, + 46.751359 + ], + [ + 11.164828, + 46.941579 + ], + [ + 12.153088, + 47.115393 + ], + [ + 12.376485, + 46.767559 + ] + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"JAM", + "properties":{ + "name":"Jamaica" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + -77.569601, + 18.490525 + ], + [ + -76.896619, + 18.400867 + ], + [ + -76.365359, + 18.160701 + ], + [ + -76.199659, + 17.886867 + ], + [ + -76.902561, + 17.868238 + ], + [ + -77.206341, + 17.701116 + ], + [ + -77.766023, + 17.861597 + ], + [ + -78.337719, + 18.225968 + ], + [ + -78.217727, + 18.454533 + ], + [ + -77.797365, + 18.524218 + ], + [ + -77.569601, + 18.490525 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"JOR", + "properties":{ + "name":"Jordan" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 35.545665, + 32.393992 + ], + [ + 35.719918, + 32.709192 + ], + [ + 36.834062, + 32.312938 + ], + [ + 38.792341, + 33.378686 + ], + [ + 39.195468, + 32.161009 + ], + [ + 39.004886, + 32.010217 + ], + [ + 37.002166, + 31.508413 + ], + [ + 37.998849, + 30.5085 + ], + [ + 37.66812, + 30.338665 + ], + [ + 37.503582, + 30.003776 + ], + [ + 36.740528, + 29.865283 + ], + [ + 36.501214, + 29.505254 + ], + [ + 36.068941, + 29.197495 + ], + [ + 34.956037, + 29.356555 + ], + [ + 34.922603, + 29.501326 + ], + [ + 35.420918, + 31.100066 + ], + [ + 35.397561, + 31.489086 + ], + [ + 35.545252, + 31.782505 + ], + [ + 35.545665, + 32.393992 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"JPN", + "properties":{ + "name":"Japan" + }, + "geometry":{ + "type":"MultiPolygon", + "coordinates":[ + [ + [ + [ + 134.638428, + 34.149234 + ], + [ + 134.766379, + 33.806335 + ], + [ + 134.203416, + 33.201178 + ], + [ + 133.79295, + 33.521985 + ], + [ + 133.280268, + 33.28957 + ], + [ + 133.014858, + 32.704567 + ], + [ + 132.363115, + 32.989382 + ], + [ + 132.371176, + 33.463642 + ], + [ + 132.924373, + 34.060299 + ], + [ + 133.492968, + 33.944621 + ], + [ + 133.904106, + 34.364931 + ], + [ + 134.638428, + 34.149234 + ] + ] + ], + [ + [ + [ + 140.976388, + 37.142074 + ], + [ + 140.59977, + 36.343983 + ], + [ + 140.774074, + 35.842877 + ], + [ + 140.253279, + 35.138114 + ], + [ + 138.975528, + 34.6676 + ], + [ + 137.217599, + 34.606286 + ], + [ + 135.792983, + 33.464805 + ], + [ + 135.120983, + 33.849071 + ], + [ + 135.079435, + 34.596545 + ], + [ + 133.340316, + 34.375938 + ], + [ + 132.156771, + 33.904933 + ], + [ + 130.986145, + 33.885761 + ], + [ + 132.000036, + 33.149992 + ], + [ + 131.33279, + 31.450355 + ], + [ + 130.686318, + 31.029579 + ], + [ + 130.20242, + 31.418238 + ], + [ + 130.447676, + 32.319475 + ], + [ + 129.814692, + 32.61031 + ], + [ + 129.408463, + 33.296056 + ], + [ + 130.353935, + 33.604151 + ], + [ + 130.878451, + 34.232743 + ], + [ + 131.884229, + 34.749714 + ], + [ + 132.617673, + 35.433393 + ], + [ + 134.608301, + 35.731618 + ], + [ + 135.677538, + 35.527134 + ], + [ + 136.723831, + 37.304984 + ], + [ + 137.390612, + 36.827391 + ], + [ + 138.857602, + 37.827485 + ], + [ + 139.426405, + 38.215962 + ], + [ + 140.05479, + 39.438807 + ], + [ + 139.883379, + 40.563312 + ], + [ + 140.305783, + 41.195005 + ], + [ + 141.368973, + 41.37856 + ], + [ + 141.914263, + 39.991616 + ], + [ + 141.884601, + 39.180865 + ], + [ + 140.959489, + 38.174001 + ], + [ + 140.976388, + 37.142074 + ] + ] + ], + [ + [ + [ + 143.910162, + 44.1741 + ], + [ + 144.613427, + 43.960883 + ], + [ + 145.320825, + 44.384733 + ], + [ + 145.543137, + 43.262088 + ], + [ + 144.059662, + 42.988358 + ], + [ + 143.18385, + 41.995215 + ], + [ + 141.611491, + 42.678791 + ], + [ + 141.067286, + 41.584594 + ], + [ + 139.955106, + 41.569556 + ], + [ + 139.817544, + 42.563759 + ], + [ + 140.312087, + 43.333273 + ], + [ + 141.380549, + 43.388825 + ], + [ + 141.671952, + 44.772125 + ], + [ + 141.967645, + 45.551483 + ], + [ + 143.14287, + 44.510358 + ], + [ + 143.910162, + 44.1741 + ] + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"KAZ", + "properties":{ + "name":"Kazakhstan" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 70.962315, + 42.266154 + ], + [ + 70.388965, + 42.081308 + ], + [ + 69.070027, + 41.384244 + ], + [ + 68.632483, + 40.668681 + ], + [ + 68.259896, + 40.662325 + ], + [ + 67.985856, + 41.135991 + ], + [ + 66.714047, + 41.168444 + ], + [ + 66.510649, + 41.987644 + ], + [ + 66.023392, + 41.994646 + ], + [ + 66.098012, + 42.99766 + ], + [ + 64.900824, + 43.728081 + ], + [ + 63.185787, + 43.650075 + ], + [ + 62.0133, + 43.504477 + ], + [ + 61.05832, + 44.405817 + ], + [ + 60.239972, + 44.784037 + ], + [ + 58.689989, + 45.500014 + ], + [ + 58.503127, + 45.586804 + ], + [ + 55.928917, + 44.995858 + ], + [ + 55.968191, + 41.308642 + ], + [ + 55.455251, + 41.259859 + ], + [ + 54.755345, + 42.043971 + ], + [ + 54.079418, + 42.324109 + ], + [ + 52.944293, + 42.116034 + ], + [ + 52.50246, + 41.783316 + ], + [ + 52.446339, + 42.027151 + ], + [ + 52.692112, + 42.443895 + ], + [ + 52.501426, + 42.792298 + ], + [ + 51.342427, + 43.132975 + ], + [ + 50.891292, + 44.031034 + ], + [ + 50.339129, + 44.284016 + ], + [ + 50.305643, + 44.609836 + ], + [ + 51.278503, + 44.514854 + ], + [ + 51.316899, + 45.245998 + ], + [ + 52.16739, + 45.408391 + ], + [ + 53.040876, + 45.259047 + ], + [ + 53.220866, + 46.234646 + ], + [ + 53.042737, + 46.853006 + ], + [ + 52.042023, + 46.804637 + ], + [ + 51.191945, + 47.048705 + ], + [ + 50.034083, + 46.60899 + ], + [ + 49.10116, + 46.39933 + ], + [ + 48.593241, + 46.561034 + ], + [ + 48.694734, + 47.075628 + ], + [ + 48.057253, + 47.743753 + ], + [ + 47.315231, + 47.715847 + ], + [ + 46.466446, + 48.394152 + ], + [ + 47.043672, + 49.152039 + ], + [ + 46.751596, + 49.356006 + ], + [ + 47.54948, + 50.454698 + ], + [ + 48.577841, + 49.87476 + ], + [ + 48.702382, + 50.605128 + ], + [ + 50.766648, + 51.692762 + ], + [ + 52.328724, + 51.718652 + ], + [ + 54.532878, + 51.02624 + ], + [ + 55.716941, + 50.621717 + ], + [ + 56.777961, + 51.043551 + ], + [ + 58.363291, + 51.063653 + ], + [ + 59.642282, + 50.545442 + ], + [ + 59.932807, + 50.842194 + ], + [ + 61.337424, + 50.79907 + ], + [ + 61.588003, + 51.272659 + ], + [ + 59.967534, + 51.96042 + ], + [ + 60.927269, + 52.447548 + ], + [ + 60.739993, + 52.719986 + ], + [ + 61.699986, + 52.979996 + ], + [ + 60.978066, + 53.664993 + ], + [ + 61.436591, + 54.006265 + ], + [ + 65.178534, + 54.354228 + ], + [ + 65.666876, + 54.601267 + ], + [ + 68.1691, + 54.970392 + ], + [ + 69.068167, + 55.38525 + ], + [ + 70.865267, + 55.169734 + ], + [ + 71.180131, + 54.133285 + ], + [ + 72.22415, + 54.376655 + ], + [ + 73.508516, + 54.035617 + ], + [ + 73.425679, + 53.48981 + ], + [ + 74.384845, + 53.546861 + ], + [ + 76.8911, + 54.490524 + ], + [ + 76.525179, + 54.177003 + ], + [ + 77.800916, + 53.404415 + ], + [ + 80.03556, + 50.864751 + ], + [ + 80.568447, + 51.388336 + ], + [ + 81.945986, + 50.812196 + ], + [ + 83.383004, + 51.069183 + ], + [ + 83.935115, + 50.889246 + ], + [ + 84.416377, + 50.3114 + ], + [ + 85.11556, + 50.117303 + ], + [ + 85.54127, + 49.692859 + ], + [ + 86.829357, + 49.826675 + ], + [ + 87.35997, + 49.214981 + ], + [ + 86.598776, + 48.549182 + ], + [ + 85.768233, + 48.455751 + ], + [ + 85.720484, + 47.452969 + ], + [ + 85.16429, + 47.000956 + ], + [ + 83.180484, + 47.330031 + ], + [ + 82.458926, + 45.53965 + ], + [ + 81.947071, + 45.317027 + ], + [ + 79.966106, + 44.917517 + ], + [ + 80.866206, + 43.180362 + ], + [ + 80.18015, + 42.920068 + ], + [ + 80.25999, + 42.349999 + ], + [ + 79.643645, + 42.496683 + ], + [ + 79.142177, + 42.856092 + ], + [ + 77.658392, + 42.960686 + ], + [ + 76.000354, + 42.988022 + ], + [ + 75.636965, + 42.8779 + ], + [ + 74.212866, + 43.298339 + ], + [ + 73.645304, + 43.091272 + ], + [ + 73.489758, + 42.500894 + ], + [ + 71.844638, + 42.845395 + ], + [ + 71.186281, + 42.704293 + ], + [ + 70.962315, + 42.266154 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"KEN", + "properties":{ + "name":"Kenya" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 40.993, + -0.85829 + ], + [ + 41.58513, + -1.68325 + ], + [ + 40.88477, + -2.08255 + ], + [ + 40.63785, + -2.49979 + ], + [ + 40.26304, + -2.57309 + ], + [ + 40.12119, + -3.27768 + ], + [ + 39.80006, + -3.68116 + ], + [ + 39.60489, + -4.34653 + ], + [ + 39.20222, + -4.67677 + ], + [ + 37.7669, + -3.67712 + ], + [ + 37.69869, + -3.09699 + ], + [ + 34.07262, + -1.05982 + ], + [ + 33.903711, + -0.95 + ], + [ + 33.893569, + 0.109814 + ], + [ + 34.18, + 0.515 + ], + [ + 34.6721, + 1.17694 + ], + [ + 35.03599, + 1.90584 + ], + [ + 34.59607, + 3.05374 + ], + [ + 34.47913, + 3.5556 + ], + [ + 34.005, + 4.249885 + ], + [ + 34.620196, + 4.847123 + ], + [ + 35.298007, + 5.506 + ], + [ + 35.817448, + 5.338232 + ], + [ + 35.817448, + 4.776966 + ], + [ + 36.159079, + 4.447864 + ], + [ + 36.855093, + 4.447864 + ], + [ + 38.120915, + 3.598605 + ], + [ + 38.43697, + 3.58851 + ], + [ + 38.67114, + 3.61607 + ], + [ + 38.89251, + 3.50074 + ], + [ + 39.559384, + 3.42206 + ], + [ + 39.85494, + 3.83879 + ], + [ + 40.76848, + 4.25702 + ], + [ + 41.1718, + 3.91909 + ], + [ + 41.855083, + 3.918912 + ], + [ + 40.98105, + 2.78452 + ], + [ + 40.993, + -0.85829 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"KGZ", + "properties":{ + "name":"Kyrgyzstan" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 70.962315, + 42.266154 + ], + [ + 71.186281, + 42.704293 + ], + [ + 71.844638, + 42.845395 + ], + [ + 73.489758, + 42.500894 + ], + [ + 73.645304, + 43.091272 + ], + [ + 74.212866, + 43.298339 + ], + [ + 75.636965, + 42.8779 + ], + [ + 76.000354, + 42.988022 + ], + [ + 77.658392, + 42.960686 + ], + [ + 79.142177, + 42.856092 + ], + [ + 79.643645, + 42.496683 + ], + [ + 80.25999, + 42.349999 + ], + [ + 80.11943, + 42.123941 + ], + [ + 78.543661, + 41.582243 + ], + [ + 78.187197, + 41.185316 + ], + [ + 76.904484, + 41.066486 + ], + [ + 76.526368, + 40.427946 + ], + [ + 75.467828, + 40.562072 + ], + [ + 74.776862, + 40.366425 + ], + [ + 73.822244, + 39.893973 + ], + [ + 73.960013, + 39.660008 + ], + [ + 73.675379, + 39.431237 + ], + [ + 71.784694, + 39.279463 + ], + [ + 70.549162, + 39.604198 + ], + [ + 69.464887, + 39.526683 + ], + [ + 69.55961, + 40.103211 + ], + [ + 70.648019, + 39.935754 + ], + [ + 71.014198, + 40.244366 + ], + [ + 71.774875, + 40.145844 + ], + [ + 73.055417, + 40.866033 + ], + [ + 71.870115, + 41.3929 + ], + [ + 71.157859, + 41.143587 + ], + [ + 70.420022, + 41.519998 + ], + [ + 71.259248, + 42.167711 + ], + [ + 70.962315, + 42.266154 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"KHM", + "properties":{ + "name":"Cambodia" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 103.49728, + 10.632555 + ], + [ + 103.09069, + 11.153661 + ], + [ + 102.584932, + 12.186595 + ], + [ + 102.348099, + 13.394247 + ], + [ + 102.988422, + 14.225721 + ], + [ + 104.281418, + 14.416743 + ], + [ + 105.218777, + 14.273212 + ], + [ + 106.043946, + 13.881091 + ], + [ + 106.496373, + 14.570584 + ], + [ + 107.382727, + 14.202441 + ], + [ + 107.614548, + 13.535531 + ], + [ + 107.491403, + 12.337206 + ], + [ + 105.810524, + 11.567615 + ], + [ + 106.24967, + 10.961812 + ], + [ + 105.199915, + 10.88931 + ], + [ + 104.334335, + 10.486544 + ], + [ + 103.49728, + 10.632555 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"KOR", + "properties":{ + "name":"South Korea" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 128.349716, + 38.612243 + ], + [ + 129.21292, + 37.432392 + ], + [ + 129.46045, + 36.784189 + ], + [ + 129.468304, + 35.632141 + ], + [ + 129.091377, + 35.082484 + ], + [ + 128.18585, + 34.890377 + ], + [ + 127.386519, + 34.475674 + ], + [ + 126.485748, + 34.390046 + ], + [ + 126.37392, + 34.93456 + ], + [ + 126.559231, + 35.684541 + ], + [ + 126.117398, + 36.725485 + ], + [ + 126.860143, + 36.893924 + ], + [ + 126.174759, + 37.749686 + ], + [ + 126.237339, + 37.840378 + ], + [ + 126.68372, + 37.804773 + ], + [ + 127.073309, + 38.256115 + ], + [ + 127.780035, + 38.304536 + ], + [ + 128.205746, + 38.370397 + ], + [ + 128.349716, + 38.612243 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"CS-KM", + "properties":{ + "name":"Kosovo" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 20.76216, + 42.05186 + ], + [ + 20.71731, + 41.84711 + ], + [ + 20.59023, + 41.85541 + ], + [ + 20.52295, + 42.21787 + ], + [ + 20.28374, + 42.32025 + ], + [ + 20.0707, + 42.58863 + ], + [ + 20.25758, + 42.81275 + ], + [ + 20.49679, + 42.88469 + ], + [ + 20.63508, + 43.21671 + ], + [ + 20.81448, + 43.27205 + ], + [ + 20.95651, + 43.13094 + ], + [ + 21.143395, + 43.068685 + ], + [ + 21.27421, + 42.90959 + ], + [ + 21.43866, + 42.86255 + ], + [ + 21.63302, + 42.67717 + ], + [ + 21.77505, + 42.6827 + ], + [ + 21.66292, + 42.43922 + ], + [ + 21.54332, + 42.32025 + ], + [ + 21.576636, + 42.245224 + ], + [ + 21.3527, + 42.2068 + ], + [ + 20.76216, + 42.05186 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"KWT", + "properties":{ + "name":"Kuwait" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 47.974519, + 29.975819 + ], + [ + 48.183189, + 29.534477 + ], + [ + 48.093943, + 29.306299 + ], + [ + 48.416094, + 28.552004 + ], + [ + 47.708851, + 28.526063 + ], + [ + 47.459822, + 29.002519 + ], + [ + 46.568713, + 29.099025 + ], + [ + 47.302622, + 30.05907 + ], + [ + 47.974519, + 29.975819 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"LAO", + "properties":{ + "name":"Laos" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 105.218777, + 14.273212 + ], + [ + 105.544338, + 14.723934 + ], + [ + 105.589039, + 15.570316 + ], + [ + 104.779321, + 16.441865 + ], + [ + 104.716947, + 17.428859 + ], + [ + 103.956477, + 18.240954 + ], + [ + 103.200192, + 18.309632 + ], + [ + 102.998706, + 17.961695 + ], + [ + 102.413005, + 17.932782 + ], + [ + 102.113592, + 18.109102 + ], + [ + 101.059548, + 17.512497 + ], + [ + 101.035931, + 18.408928 + ], + [ + 101.282015, + 19.462585 + ], + [ + 100.606294, + 19.508344 + ], + [ + 100.548881, + 20.109238 + ], + [ + 100.115988, + 20.41785 + ], + [ + 100.329101, + 20.786122 + ], + [ + 101.180005, + 21.436573 + ], + [ + 101.270026, + 21.201652 + ], + [ + 101.80312, + 21.174367 + ], + [ + 101.652018, + 22.318199 + ], + [ + 102.170436, + 22.464753 + ], + [ + 102.754896, + 21.675137 + ], + [ + 103.203861, + 20.766562 + ], + [ + 104.435, + 20.758733 + ], + [ + 104.822574, + 19.886642 + ], + [ + 104.183388, + 19.624668 + ], + [ + 103.896532, + 19.265181 + ], + [ + 105.094598, + 18.666975 + ], + [ + 105.925762, + 17.485315 + ], + [ + 106.556008, + 16.604284 + ], + [ + 107.312706, + 15.908538 + ], + [ + 107.564525, + 15.202173 + ], + [ + 107.382727, + 14.202441 + ], + [ + 106.496373, + 14.570584 + ], + [ + 106.043946, + 13.881091 + ], + [ + 105.218777, + 14.273212 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"LBN", + "properties":{ + "name":"Lebanon" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 35.821101, + 33.277426 + ], + [ + 35.552797, + 33.264275 + ], + [ + 35.460709, + 33.08904 + ], + [ + 35.126053, + 33.0909 + ], + [ + 35.482207, + 33.90545 + ], + [ + 35.979592, + 34.610058 + ], + [ + 35.998403, + 34.644914 + ], + [ + 36.448194, + 34.593935 + ], + [ + 36.61175, + 34.201789 + ], + [ + 36.06646, + 33.824912 + ], + [ + 35.821101, + 33.277426 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"LBR", + "properties":{ + "name":"Liberia" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + -7.712159, + 4.364566 + ], + [ + -7.974107, + 4.355755 + ], + [ + -9.004794, + 4.832419 + ], + [ + -9.91342, + 5.593561 + ], + [ + -10.765384, + 6.140711 + ], + [ + -11.438779, + 6.785917 + ], + [ + -11.199802, + 7.105846 + ], + [ + -11.146704, + 7.396706 + ], + [ + -10.695595, + 7.939464 + ], + [ + -10.230094, + 8.406206 + ], + [ + -10.016567, + 8.428504 + ], + [ + -9.755342, + 8.541055 + ], + [ + -9.33728, + 7.928534 + ], + [ + -9.403348, + 7.526905 + ], + [ + -9.208786, + 7.313921 + ], + [ + -8.926065, + 7.309037 + ], + [ + -8.722124, + 7.711674 + ], + [ + -8.439298, + 7.686043 + ], + [ + -8.485446, + 7.395208 + ], + [ + -8.385452, + 6.911801 + ], + [ + -8.60288, + 6.467564 + ], + [ + -8.311348, + 6.193033 + ], + [ + -7.993693, + 6.12619 + ], + [ + -7.570153, + 5.707352 + ], + [ + -7.539715, + 5.313345 + ], + [ + -7.635368, + 5.188159 + ], + [ + -7.712159, + 4.364566 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"LBY", + "properties":{ + "name":"Libya" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 14.8513, + 22.86295 + ], + [ + 14.143871, + 22.491289 + ], + [ + 13.581425, + 23.040506 + ], + [ + 11.999506, + 23.471668 + ], + [ + 11.560669, + 24.097909 + ], + [ + 10.771364, + 24.562532 + ], + [ + 10.303847, + 24.379313 + ], + [ + 9.948261, + 24.936954 + ], + [ + 9.910693, + 25.365455 + ], + [ + 9.319411, + 26.094325 + ], + [ + 9.716286, + 26.512206 + ], + [ + 9.629056, + 27.140953 + ], + [ + 9.756128, + 27.688259 + ], + [ + 9.683885, + 28.144174 + ], + [ + 9.859998, + 28.95999 + ], + [ + 9.805634, + 29.424638 + ], + [ + 9.48214, + 30.307556 + ], + [ + 9.970017, + 30.539325 + ], + [ + 10.056575, + 30.961831 + ], + [ + 9.950225, + 31.37607 + ], + [ + 10.636901, + 31.761421 + ], + [ + 10.94479, + 32.081815 + ], + [ + 11.432253, + 32.368903 + ], + [ + 11.488787, + 33.136996 + ], + [ + 12.66331, + 32.79278 + ], + [ + 13.08326, + 32.87882 + ], + [ + 13.91868, + 32.71196 + ], + [ + 15.24563, + 32.26508 + ], + [ + 15.71394, + 31.37626 + ], + [ + 16.61162, + 31.18218 + ], + [ + 18.02109, + 30.76357 + ], + [ + 19.08641, + 30.26639 + ], + [ + 19.57404, + 30.52582 + ], + [ + 20.05335, + 30.98576 + ], + [ + 19.82033, + 31.75179 + ], + [ + 20.13397, + 32.2382 + ], + [ + 20.85452, + 32.7068 + ], + [ + 21.54298, + 32.8432 + ], + [ + 22.89576, + 32.63858 + ], + [ + 23.2368, + 32.19149 + ], + [ + 23.60913, + 32.18726 + ], + [ + 23.9275, + 32.01667 + ], + [ + 24.92114, + 31.89936 + ], + [ + 25.16482, + 31.56915 + ], + [ + 24.80287, + 31.08929 + ], + [ + 24.95762, + 30.6616 + ], + [ + 24.70007, + 30.04419 + ], + [ + 25, + 29.238655 + ], + [ + 25, + 25.6825 + ], + [ + 25, + 22 + ], + [ + 25, + 20.00304 + ], + [ + 23.85, + 20 + ], + [ + 23.83766, + 19.58047 + ], + [ + 19.84926, + 21.49509 + ], + [ + 15.86085, + 23.40972 + ], + [ + 14.8513, + 22.86295 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"LKA", + "properties":{ + "name":"Sri Lanka" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 81.787959, + 7.523055 + ], + [ + 81.637322, + 6.481775 + ], + [ + 81.21802, + 6.197141 + ], + [ + 80.348357, + 5.96837 + ], + [ + 79.872469, + 6.763463 + ], + [ + 79.695167, + 8.200843 + ], + [ + 80.147801, + 9.824078 + ], + [ + 80.838818, + 9.268427 + ], + [ + 81.304319, + 8.564206 + ], + [ + 81.787959, + 7.523055 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"LSO", + "properties":{ + "name":"Lesotho" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 28.978263, + -28.955597 + ], + [ + 29.325166, + -29.257387 + ], + [ + 29.018415, + -29.743766 + ], + [ + 28.8484, + -30.070051 + ], + [ + 28.291069, + -30.226217 + ], + [ + 28.107205, + -30.545732 + ], + [ + 27.749397, + -30.645106 + ], + [ + 26.999262, + -29.875954 + ], + [ + 27.532511, + -29.242711 + ], + [ + 28.074338, + -28.851469 + ], + [ + 28.5417, + -28.647502 + ], + [ + 28.978263, + -28.955597 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"LTU", + "properties":{ + "name":"Lithuania" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 22.731099, + 54.327537 + ], + [ + 22.651052, + 54.582741 + ], + [ + 22.757764, + 54.856574 + ], + [ + 22.315724, + 55.015299 + ], + [ + 21.268449, + 55.190482 + ], + [ + 21.0558, + 56.031076 + ], + [ + 22.201157, + 56.337802 + ], + [ + 23.878264, + 56.273671 + ], + [ + 24.860684, + 56.372528 + ], + [ + 25.000934, + 56.164531 + ], + [ + 25.533047, + 56.100297 + ], + [ + 26.494331, + 55.615107 + ], + [ + 26.588279, + 55.167176 + ], + [ + 25.768433, + 54.846963 + ], + [ + 25.536354, + 54.282423 + ], + [ + 24.450684, + 53.905702 + ], + [ + 23.484128, + 53.912498 + ], + [ + 23.243987, + 54.220567 + ], + [ + 22.731099, + 54.327537 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"LUX", + "properties":{ + "name":"Luxembourg" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 6.043073, + 50.128052 + ], + [ + 6.242751, + 49.902226 + ], + [ + 6.18632, + 49.463803 + ], + [ + 5.897759, + 49.442667 + ], + [ + 5.674052, + 49.529484 + ], + [ + 5.782417, + 50.090328 + ], + [ + 6.043073, + 50.128052 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"LVA", + "properties":{ + "name":"Latvia" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 21.0558, + 56.031076 + ], + [ + 21.090424, + 56.783873 + ], + [ + 21.581866, + 57.411871 + ], + [ + 22.524341, + 57.753374 + ], + [ + 23.318453, + 57.006236 + ], + [ + 24.12073, + 57.025693 + ], + [ + 24.312863, + 57.793424 + ], + [ + 25.164594, + 57.970157 + ], + [ + 25.60281, + 57.847529 + ], + [ + 26.463532, + 57.476389 + ], + [ + 27.288185, + 57.474528 + ], + [ + 27.770016, + 57.244258 + ], + [ + 27.855282, + 56.759326 + ], + [ + 28.176709, + 56.16913 + ], + [ + 27.10246, + 55.783314 + ], + [ + 26.494331, + 55.615107 + ], + [ + 25.533047, + 56.100297 + ], + [ + 25.000934, + 56.164531 + ], + [ + 24.860684, + 56.372528 + ], + [ + 23.878264, + 56.273671 + ], + [ + 22.201157, + 56.337802 + ], + [ + 21.0558, + 56.031076 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"MAR", + "properties":{ + "name":"Morocco" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + -5.193863, + 35.755182 + ], + [ + -4.591006, + 35.330712 + ], + [ + -3.640057, + 35.399855 + ], + [ + -2.604306, + 35.179093 + ], + [ + -2.169914, + 35.168396 + ], + [ + -1.792986, + 34.527919 + ], + [ + -1.733455, + 33.919713 + ], + [ + -1.388049, + 32.864015 + ], + [ + -1.124551, + 32.651522 + ], + [ + -1.307899, + 32.262889 + ], + [ + -2.616605, + 32.094346 + ], + [ + -3.06898, + 31.724498 + ], + [ + -3.647498, + 31.637294 + ], + [ + -3.690441, + 30.896952 + ], + [ + -4.859646, + 30.501188 + ], + [ + -5.242129, + 30.000443 + ], + [ + -6.060632, + 29.7317 + ], + [ + -7.059228, + 29.579228 + ], + [ + -8.674116, + 28.841289 + ], + [ + -8.66559, + 27.656426 + ], + [ + -8.817809, + 27.656426 + ], + [ + -8.817828, + 27.656426 + ], + [ + -8.794884, + 27.120696 + ], + [ + -9.413037, + 27.088476 + ], + [ + -9.735343, + 26.860945 + ], + [ + -10.189424, + 26.860945 + ], + [ + -10.551263, + 26.990808 + ], + [ + -11.392555, + 26.883424 + ], + [ + -11.71822, + 26.104092 + ], + [ + -12.030759, + 26.030866 + ], + [ + -12.500963, + 24.770116 + ], + [ + -13.89111, + 23.691009 + ], + [ + -14.221168, + 22.310163 + ], + [ + -14.630833, + 21.86094 + ], + [ + -14.750955, + 21.5006 + ], + [ + -17.002962, + 21.420734 + ], + [ + -17.020428, + 21.42231 + ], + [ + -16.973248, + 21.885745 + ], + [ + -16.589137, + 22.158234 + ], + [ + -16.261922, + 22.67934 + ], + [ + -16.326414, + 23.017768 + ], + [ + -15.982611, + 23.723358 + ], + [ + -15.426004, + 24.359134 + ], + [ + -15.089332, + 24.520261 + ], + [ + -14.824645, + 25.103533 + ], + [ + -14.800926, + 25.636265 + ], + [ + -14.43994, + 26.254418 + ], + [ + -13.773805, + 26.618892 + ], + [ + -13.139942, + 27.640148 + ], + [ + -13.121613, + 27.654148 + ], + [ + -12.618837, + 28.038186 + ], + [ + -11.688919, + 28.148644 + ], + [ + -10.900957, + 28.832142 + ], + [ + -10.399592, + 29.098586 + ], + [ + -9.564811, + 29.933574 + ], + [ + -9.814718, + 31.177736 + ], + [ + -9.434793, + 32.038096 + ], + [ + -9.300693, + 32.564679 + ], + [ + -8.657476, + 33.240245 + ], + [ + -7.654178, + 33.697065 + ], + [ + -6.912544, + 34.110476 + ], + [ + -6.244342, + 35.145865 + ], + [ + -5.929994, + 35.759988 + ], + [ + -5.193863, + 35.755182 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"MDA", + "properties":{ + "name":"Moldova" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 26.619337, + 48.220726 + ], + [ + 26.857824, + 48.368211 + ], + [ + 27.522537, + 48.467119 + ], + [ + 28.259547, + 48.155562 + ], + [ + 28.670891, + 48.118149 + ], + [ + 29.122698, + 47.849095 + ], + [ + 29.050868, + 47.510227 + ], + [ + 29.415135, + 47.346645 + ], + [ + 29.559674, + 46.928583 + ], + [ + 29.908852, + 46.674361 + ], + [ + 29.83821, + 46.525326 + ], + [ + 30.024659, + 46.423937 + ], + [ + 29.759972, + 46.349988 + ], + [ + 29.170654, + 46.379262 + ], + [ + 29.072107, + 46.517678 + ], + [ + 28.862972, + 46.437889 + ], + [ + 28.933717, + 46.25883 + ], + [ + 28.659987, + 45.939987 + ], + [ + 28.485269, + 45.596907 + ], + [ + 28.233554, + 45.488283 + ], + [ + 28.054443, + 45.944586 + ], + [ + 28.160018, + 46.371563 + ], + [ + 28.12803, + 46.810476 + ], + [ + 27.551166, + 47.405117 + ], + [ + 27.233873, + 47.826771 + ], + [ + 26.924176, + 48.123264 + ], + [ + 26.619337, + 48.220726 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"MDG", + "properties":{ + "name":"Madagascar" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 49.543519, + -12.469833 + ], + [ + 49.808981, + -12.895285 + ], + [ + 50.056511, + -13.555761 + ], + [ + 50.217431, + -14.758789 + ], + [ + 50.476537, + -15.226512 + ], + [ + 50.377111, + -15.706069 + ], + [ + 50.200275, + -16.000263 + ], + [ + 49.860606, + -15.414253 + ], + [ + 49.672607, + -15.710204 + ], + [ + 49.863344, + -16.451037 + ], + [ + 49.774564, + -16.875042 + ], + [ + 49.498612, + -17.106036 + ], + [ + 49.435619, + -17.953064 + ], + [ + 49.041792, + -19.118781 + ], + [ + 48.548541, + -20.496888 + ], + [ + 47.930749, + -22.391501 + ], + [ + 47.547723, + -23.781959 + ], + [ + 47.095761, + -24.94163 + ], + [ + 46.282478, + -25.178463 + ], + [ + 45.409508, + -25.601434 + ], + [ + 44.833574, + -25.346101 + ], + [ + 44.03972, + -24.988345 + ], + [ + 43.763768, + -24.460677 + ], + [ + 43.697778, + -23.574116 + ], + [ + 43.345654, + -22.776904 + ], + [ + 43.254187, + -22.057413 + ], + [ + 43.433298, + -21.336475 + ], + [ + 43.893683, + -21.163307 + ], + [ + 43.89637, + -20.830459 + ], + [ + 44.374325, + -20.072366 + ], + [ + 44.464397, + -19.435454 + ], + [ + 44.232422, + -18.961995 + ], + [ + 44.042976, + -18.331387 + ], + [ + 43.963084, + -17.409945 + ], + [ + 44.312469, + -16.850496 + ], + [ + 44.446517, + -16.216219 + ], + [ + 44.944937, + -16.179374 + ], + [ + 45.502732, + -15.974373 + ], + [ + 45.872994, + -15.793454 + ], + [ + 46.312243, + -15.780018 + ], + [ + 46.882183, + -15.210182 + ], + [ + 47.70513, + -14.594303 + ], + [ + 48.005215, + -14.091233 + ], + [ + 47.869047, + -13.663869 + ], + [ + 48.293828, + -13.784068 + ], + [ + 48.84506, + -13.089175 + ], + [ + 48.863509, + -12.487868 + ], + [ + 49.194651, + -12.040557 + ], + [ + 49.543519, + -12.469833 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"MEX", + "properties":{ + "name":"Mexico" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + -97.140008, + 25.869997 + ], + [ + -97.528072, + 24.992144 + ], + [ + -97.702946, + 24.272343 + ], + [ + -97.776042, + 22.93258 + ], + [ + -97.872367, + 22.444212 + ], + [ + -97.699044, + 21.898689 + ], + [ + -97.38896, + 21.411019 + ], + [ + -97.189333, + 20.635433 + ], + [ + -96.525576, + 19.890931 + ], + [ + -96.292127, + 19.320371 + ], + [ + -95.900885, + 18.828024 + ], + [ + -94.839063, + 18.562717 + ], + [ + -94.42573, + 18.144371 + ], + [ + -93.548651, + 18.423837 + ], + [ + -92.786114, + 18.524839 + ], + [ + -92.037348, + 18.704569 + ], + [ + -91.407903, + 18.876083 + ], + [ + -90.77187, + 19.28412 + ], + [ + -90.53359, + 19.867418 + ], + [ + -90.451476, + 20.707522 + ], + [ + -90.278618, + 20.999855 + ], + [ + -89.601321, + 21.261726 + ], + [ + -88.543866, + 21.493675 + ], + [ + -87.658417, + 21.458846 + ], + [ + -87.05189, + 21.543543 + ], + [ + -86.811982, + 21.331515 + ], + [ + -86.845908, + 20.849865 + ], + [ + -87.383291, + 20.255405 + ], + [ + -87.621054, + 19.646553 + ], + [ + -87.43675, + 19.472403 + ], + [ + -87.58656, + 19.04013 + ], + [ + -87.837191, + 18.259816 + ], + [ + -88.090664, + 18.516648 + ], + [ + -88.300031, + 18.499982 + ], + [ + -88.490123, + 18.486831 + ], + [ + -88.848344, + 17.883198 + ], + [ + -89.029857, + 18.001511 + ], + [ + -89.150909, + 17.955468 + ], + [ + -89.14308, + 17.808319 + ], + [ + -90.067934, + 17.819326 + ], + [ + -91.00152, + 17.817595 + ], + [ + -91.002269, + 17.254658 + ], + [ + -91.453921, + 17.252177 + ], + [ + -91.08167, + 16.918477 + ], + [ + -90.711822, + 16.687483 + ], + [ + -90.600847, + 16.470778 + ], + [ + -90.438867, + 16.41011 + ], + [ + -90.464473, + 16.069562 + ], + [ + -91.74796, + 16.066565 + ], + [ + -92.229249, + 15.251447 + ], + [ + -92.087216, + 15.064585 + ], + [ + -92.20323, + 14.830103 + ], + [ + -92.22775, + 14.538829 + ], + [ + -93.359464, + 15.61543 + ], + [ + -93.875169, + 15.940164 + ], + [ + -94.691656, + 16.200975 + ], + [ + -95.250227, + 16.128318 + ], + [ + -96.053382, + 15.752088 + ], + [ + -96.557434, + 15.653515 + ], + [ + -97.263592, + 15.917065 + ], + [ + -98.01303, + 16.107312 + ], + [ + -98.947676, + 16.566043 + ], + [ + -99.697397, + 16.706164 + ], + [ + -100.829499, + 17.171071 + ], + [ + -101.666089, + 17.649026 + ], + [ + -101.918528, + 17.91609 + ], + [ + -102.478132, + 17.975751 + ], + [ + -103.50099, + 18.292295 + ], + [ + -103.917527, + 18.748572 + ], + [ + -104.99201, + 19.316134 + ], + [ + -105.493038, + 19.946767 + ], + [ + -105.731396, + 20.434102 + ], + [ + -105.397773, + 20.531719 + ], + [ + -105.500661, + 20.816895 + ], + [ + -105.270752, + 21.076285 + ], + [ + -105.265817, + 21.422104 + ], + [ + -105.603161, + 21.871146 + ], + [ + -105.693414, + 22.26908 + ], + [ + -106.028716, + 22.773752 + ], + [ + -106.90998, + 23.767774 + ], + [ + -107.915449, + 24.548915 + ], + [ + -108.401905, + 25.172314 + ], + [ + -109.260199, + 25.580609 + ], + [ + -109.444089, + 25.824884 + ], + [ + -109.291644, + 26.442934 + ], + [ + -109.801458, + 26.676176 + ], + [ + -110.391732, + 27.162115 + ], + [ + -110.641019, + 27.859876 + ], + [ + -111.178919, + 27.941241 + ], + [ + -111.759607, + 28.467953 + ], + [ + -112.228235, + 28.954409 + ], + [ + -112.271824, + 29.266844 + ], + [ + -112.809594, + 30.021114 + ], + [ + -113.163811, + 30.786881 + ], + [ + -113.148669, + 31.170966 + ], + [ + -113.871881, + 31.567608 + ], + [ + -114.205737, + 31.524045 + ], + [ + -114.776451, + 31.799532 + ], + [ + -114.9367, + 31.393485 + ], + [ + -114.771232, + 30.913617 + ], + [ + -114.673899, + 30.162681 + ], + [ + -114.330974, + 29.750432 + ], + [ + -113.588875, + 29.061611 + ], + [ + -113.424053, + 28.826174 + ], + [ + -113.271969, + 28.754783 + ], + [ + -113.140039, + 28.411289 + ], + [ + -112.962298, + 28.42519 + ], + [ + -112.761587, + 27.780217 + ], + [ + -112.457911, + 27.525814 + ], + [ + -112.244952, + 27.171727 + ], + [ + -111.616489, + 26.662817 + ], + [ + -111.284675, + 25.73259 + ], + [ + -110.987819, + 25.294606 + ], + [ + -110.710007, + 24.826004 + ], + [ + -110.655049, + 24.298595 + ], + [ + -110.172856, + 24.265548 + ], + [ + -109.771847, + 23.811183 + ], + [ + -109.409104, + 23.364672 + ], + [ + -109.433392, + 23.185588 + ], + [ + -109.854219, + 22.818272 + ], + [ + -110.031392, + 22.823078 + ], + [ + -110.295071, + 23.430973 + ], + [ + -110.949501, + 24.000964 + ], + [ + -111.670568, + 24.484423 + ], + [ + -112.182036, + 24.738413 + ], + [ + -112.148989, + 25.470125 + ], + [ + -112.300711, + 26.012004 + ], + [ + -112.777297, + 26.32196 + ], + [ + -113.464671, + 26.768186 + ], + [ + -113.59673, + 26.63946 + ], + [ + -113.848937, + 26.900064 + ], + [ + -114.465747, + 27.14209 + ], + [ + -115.055142, + 27.722727 + ], + [ + -114.982253, + 27.7982 + ], + [ + -114.570366, + 27.741485 + ], + [ + -114.199329, + 28.115003 + ], + [ + -114.162018, + 28.566112 + ], + [ + -114.931842, + 29.279479 + ], + [ + -115.518654, + 29.556362 + ], + [ + -115.887365, + 30.180794 + ], + [ + -116.25835, + 30.836464 + ], + [ + -116.721526, + 31.635744 + ], + [ + -117.12776, + 32.53534 + ], + [ + -115.99135, + 32.61239 + ], + [ + -114.72139, + 32.72083 + ], + [ + -114.815, + 32.52528 + ], + [ + -113.30498, + 32.03914 + ], + [ + -111.02361, + 31.33472 + ], + [ + -109.035, + 31.34194 + ], + [ + -108.24194, + 31.34222 + ], + [ + -108.24, + 31.754854 + ], + [ + -106.50759, + 31.75452 + ], + [ + -106.1429, + 31.39995 + ], + [ + -105.63159, + 31.08383 + ], + [ + -105.03737, + 30.64402 + ], + [ + -104.70575, + 30.12173 + ], + [ + -104.45697, + 29.57196 + ], + [ + -103.94, + 29.27 + ], + [ + -103.11, + 28.97 + ], + [ + -102.48, + 29.76 + ], + [ + -101.6624, + 29.7793 + ], + [ + -100.9576, + 29.38071 + ], + [ + -100.45584, + 28.69612 + ], + [ + -100.11, + 28.11 + ], + [ + -99.52, + 27.54 + ], + [ + -99.3, + 26.84 + ], + [ + -99.02, + 26.37 + ], + [ + -98.24, + 26.06 + ], + [ + -97.53, + 25.84 + ], + [ + -97.140008, + 25.869997 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"MKD", + "properties":{ + "name":"Macedonia" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 20.59023, + 41.85541 + ], + [ + 20.71731, + 41.84711 + ], + [ + 20.76216, + 42.05186 + ], + [ + 21.3527, + 42.2068 + ], + [ + 21.576636, + 42.245224 + ], + [ + 21.91708, + 42.30364 + ], + [ + 22.380526, + 42.32026 + ], + [ + 22.881374, + 41.999297 + ], + [ + 22.952377, + 41.337994 + ], + [ + 22.76177, + 41.3048 + ], + [ + 22.597308, + 41.130487 + ], + [ + 22.055378, + 41.149866 + ], + [ + 21.674161, + 40.931275 + ], + [ + 21.02004, + 40.842727 + ], + [ + 20.60518, + 41.08622 + ], + [ + 20.46315, + 41.51509 + ], + [ + 20.59023, + 41.85541 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"MLI", + "properties":{ + "name":"Mali" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + -12.17075, + 14.616834 + ], + [ + -11.834208, + 14.799097 + ], + [ + -11.666078, + 15.388208 + ], + [ + -11.349095, + 15.411256 + ], + [ + -10.650791, + 15.132746 + ], + [ + -10.086846, + 15.330486 + ], + [ + -9.700255, + 15.264107 + ], + [ + -9.550238, + 15.486497 + ], + [ + -5.537744, + 15.50169 + ], + [ + -5.315277, + 16.201854 + ], + [ + -5.488523, + 16.325102 + ], + [ + -5.971129, + 20.640833 + ], + [ + -6.453787, + 24.956591 + ], + [ + -4.923337, + 24.974574 + ], + [ + -1.550055, + 22.792666 + ], + [ + 1.823228, + 20.610809 + ], + [ + 2.060991, + 20.142233 + ], + [ + 2.683588, + 19.85623 + ], + [ + 3.146661, + 19.693579 + ], + [ + 3.158133, + 19.057364 + ], + [ + 4.267419, + 19.155265 + ], + [ + 4.27021, + 16.852227 + ], + [ + 3.723422, + 16.184284 + ], + [ + 3.638259, + 15.56812 + ], + [ + 2.749993, + 15.409525 + ], + [ + 1.385528, + 15.323561 + ], + [ + 1.015783, + 14.968182 + ], + [ + 0.374892, + 14.928908 + ], + [ + -0.266257, + 14.924309 + ], + [ + -0.515854, + 15.116158 + ], + [ + -1.066363, + 14.973815 + ], + [ + -2.001035, + 14.559008 + ], + [ + -2.191825, + 14.246418 + ], + [ + -2.967694, + 13.79815 + ], + [ + -3.103707, + 13.541267 + ], + [ + -3.522803, + 13.337662 + ], + [ + -4.006391, + 13.472485 + ], + [ + -4.280405, + 13.228444 + ], + [ + -4.427166, + 12.542646 + ], + [ + -5.220942, + 11.713859 + ], + [ + -5.197843, + 11.375146 + ], + [ + -5.470565, + 10.95127 + ], + [ + -5.404342, + 10.370737 + ], + [ + -5.816926, + 10.222555 + ], + [ + -6.050452, + 10.096361 + ], + [ + -6.205223, + 10.524061 + ], + [ + -6.493965, + 10.411303 + ], + [ + -6.666461, + 10.430811 + ], + [ + -6.850507, + 10.138994 + ], + [ + -7.622759, + 10.147236 + ], + [ + -7.89959, + 10.297382 + ], + [ + -8.029944, + 10.206535 + ], + [ + -8.335377, + 10.494812 + ], + [ + -8.282357, + 10.792597 + ], + [ + -8.407311, + 10.909257 + ], + [ + -8.620321, + 10.810891 + ], + [ + -8.581305, + 11.136246 + ], + [ + -8.376305, + 11.393646 + ], + [ + -8.786099, + 11.812561 + ], + [ + -8.905265, + 12.088358 + ], + [ + -9.127474, + 12.30806 + ], + [ + -9.327616, + 12.334286 + ], + [ + -9.567912, + 12.194243 + ], + [ + -9.890993, + 12.060479 + ], + [ + -10.165214, + 11.844084 + ], + [ + -10.593224, + 11.923975 + ], + [ + -10.87083, + 12.177887 + ], + [ + -11.036556, + 12.211245 + ], + [ + -11.297574, + 12.077971 + ], + [ + -11.456169, + 12.076834 + ], + [ + -11.513943, + 12.442988 + ], + [ + -11.467899, + 12.754519 + ], + [ + -11.553398, + 13.141214 + ], + [ + -11.927716, + 13.422075 + ], + [ + -12.124887, + 13.994727 + ], + [ + -12.17075, + 14.616834 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"MLT", + "properties":{ + "name":"Malta" + }, + "geometry":{ + "type":"MultiPolygon", + "coordinates":[ + [ + [ + [ + 14.566171, + 35.852721 + ], + [ + 14.532684, + 35.820191 + ], + [ + 14.436463, + 35.821664 + ], + [ + 14.352334, + 35.872281 + ], + [ + 14.3513, + 35.978399 + ], + [ + 14.448348, + 35.957444 + ], + [ + 14.537025, + 35.886285 + ], + [ + 14.566171, + 35.852721 + ] + ] + ], + [ + [ + [ + 14.313473, + 36.027569 + ], + [ + 14.253632, + 36.012143 + ], + [ + 14.194204, + 36.042245 + ], + [ + 14.180354, + 36.060383 + ], + [ + 14.263243, + 36.075809 + ], + [ + 14.303758, + 36.062295 + ], + [ + 14.320914, + 36.03625 + ], + [ + 14.313473, + 36.027569 + ] + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"MMR", + "properties":{ + "name":"Myanmar" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 99.543309, + 20.186598 + ], + [ + 98.959676, + 19.752981 + ], + [ + 98.253724, + 19.708203 + ], + [ + 97.797783, + 18.62708 + ], + [ + 97.375896, + 18.445438 + ], + [ + 97.859123, + 17.567946 + ], + [ + 98.493761, + 16.837836 + ], + [ + 98.903348, + 16.177824 + ], + [ + 98.537376, + 15.308497 + ], + [ + 98.192074, + 15.123703 + ], + [ + 98.430819, + 14.622028 + ], + [ + 99.097755, + 13.827503 + ], + [ + 99.212012, + 13.269294 + ], + [ + 99.196354, + 12.804748 + ], + [ + 99.587286, + 11.892763 + ], + [ + 99.038121, + 10.960546 + ], + [ + 98.553551, + 9.93296 + ], + [ + 98.457174, + 10.675266 + ], + [ + 98.764546, + 11.441292 + ], + [ + 98.428339, + 12.032987 + ], + [ + 98.509574, + 13.122378 + ], + [ + 98.103604, + 13.64046 + ], + [ + 97.777732, + 14.837286 + ], + [ + 97.597072, + 16.100568 + ], + [ + 97.16454, + 16.928734 + ], + [ + 96.505769, + 16.427241 + ], + [ + 95.369352, + 15.71439 + ], + [ + 94.808405, + 15.803454 + ], + [ + 94.188804, + 16.037936 + ], + [ + 94.533486, + 17.27724 + ], + [ + 94.324817, + 18.213514 + ], + [ + 93.540988, + 19.366493 + ], + [ + 93.663255, + 19.726962 + ], + [ + 93.078278, + 19.855145 + ], + [ + 92.368554, + 20.670883 + ], + [ + 92.303234, + 21.475485 + ], + [ + 92.652257, + 21.324048 + ], + [ + 92.672721, + 22.041239 + ], + [ + 93.166128, + 22.27846 + ], + [ + 93.060294, + 22.703111 + ], + [ + 93.286327, + 23.043658 + ], + [ + 93.325188, + 24.078556 + ], + [ + 94.106742, + 23.850741 + ], + [ + 94.552658, + 24.675238 + ], + [ + 94.603249, + 25.162495 + ], + [ + 95.155153, + 26.001307 + ], + [ + 95.124768, + 26.573572 + ], + [ + 96.419366, + 27.264589 + ], + [ + 97.133999, + 27.083774 + ], + [ + 97.051989, + 27.699059 + ], + [ + 97.402561, + 27.882536 + ], + [ + 97.327114, + 28.261583 + ], + [ + 97.911988, + 28.335945 + ], + [ + 98.246231, + 27.747221 + ], + [ + 98.68269, + 27.508812 + ], + [ + 98.712094, + 26.743536 + ], + [ + 98.671838, + 25.918703 + ], + [ + 97.724609, + 25.083637 + ], + [ + 97.60472, + 23.897405 + ], + [ + 98.660262, + 24.063286 + ], + [ + 98.898749, + 23.142722 + ], + [ + 99.531992, + 22.949039 + ], + [ + 99.240899, + 22.118314 + ], + [ + 99.983489, + 21.742937 + ], + [ + 100.416538, + 21.558839 + ], + [ + 101.150033, + 21.849984 + ], + [ + 101.180005, + 21.436573 + ], + [ + 100.329101, + 20.786122 + ], + [ + 100.115988, + 20.41785 + ], + [ + 99.543309, + 20.186598 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"MNE", + "properties":{ + "name":"Montenegro" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 19.801613, + 42.500093 + ], + [ + 19.738051, + 42.688247 + ], + [ + 19.30449, + 42.19574 + ], + [ + 19.37177, + 41.87755 + ], + [ + 19.16246, + 41.95502 + ], + [ + 18.88214, + 42.28151 + ], + [ + 18.45, + 42.48 + ], + [ + 18.56, + 42.65 + ], + [ + 18.70648, + 43.20011 + ], + [ + 19.03165, + 43.43253 + ], + [ + 19.21852, + 43.52384 + ], + [ + 19.48389, + 43.35229 + ], + [ + 19.63, + 43.21378 + ], + [ + 19.95857, + 43.10604 + ], + [ + 20.3398, + 42.89852 + ], + [ + 20.25758, + 42.81275 + ], + [ + 20.0707, + 42.58863 + ], + [ + 19.801613, + 42.500093 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"MNG", + "properties":{ + "name":"Mongolia" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 87.751264, + 49.297198 + ], + [ + 88.805567, + 49.470521 + ], + [ + 90.713667, + 50.331812 + ], + [ + 92.234712, + 50.802171 + ], + [ + 93.104219, + 50.49529 + ], + [ + 94.147566, + 50.480537 + ], + [ + 94.815949, + 50.013433 + ], + [ + 95.814028, + 49.977467 + ], + [ + 97.259728, + 49.726061 + ], + [ + 98.231762, + 50.422401 + ], + [ + 97.82574, + 51.010995 + ], + [ + 98.861491, + 52.047366 + ], + [ + 99.981732, + 51.634006 + ], + [ + 100.88948, + 51.516856 + ], + [ + 102.065223, + 51.259921 + ], + [ + 102.255909, + 50.510561 + ], + [ + 103.676545, + 50.089966 + ], + [ + 104.621552, + 50.275329 + ], + [ + 105.886591, + 50.406019 + ], + [ + 106.888804, + 50.274296 + ], + [ + 107.868176, + 49.793705 + ], + [ + 108.475167, + 49.282548 + ], + [ + 109.402449, + 49.292961 + ], + [ + 110.662011, + 49.130128 + ], + [ + 111.581231, + 49.377968 + ], + [ + 112.89774, + 49.543565 + ], + [ + 114.362456, + 50.248303 + ], + [ + 114.96211, + 50.140247 + ], + [ + 115.485695, + 49.805177 + ], + [ + 116.678801, + 49.888531 + ], + [ + 116.191802, + 49.134598 + ], + [ + 115.485282, + 48.135383 + ], + [ + 115.742837, + 47.726545 + ], + [ + 116.308953, + 47.85341 + ], + [ + 117.295507, + 47.697709 + ], + [ + 118.064143, + 48.06673 + ], + [ + 118.866574, + 47.74706 + ], + [ + 119.772824, + 47.048059 + ], + [ + 119.66327, + 46.69268 + ], + [ + 118.874326, + 46.805412 + ], + [ + 117.421701, + 46.672733 + ], + [ + 116.717868, + 46.388202 + ], + [ + 115.985096, + 45.727235 + ], + [ + 114.460332, + 45.339817 + ], + [ + 113.463907, + 44.808893 + ], + [ + 112.436062, + 45.011646 + ], + [ + 111.873306, + 45.102079 + ], + [ + 111.348377, + 44.457442 + ], + [ + 111.667737, + 44.073176 + ], + [ + 111.829588, + 43.743118 + ], + [ + 111.129682, + 43.406834 + ], + [ + 110.412103, + 42.871234 + ], + [ + 109.243596, + 42.519446 + ], + [ + 107.744773, + 42.481516 + ], + [ + 106.129316, + 42.134328 + ], + [ + 104.964994, + 41.59741 + ], + [ + 104.522282, + 41.908347 + ], + [ + 103.312278, + 41.907468 + ], + [ + 101.83304, + 42.514873 + ], + [ + 100.845866, + 42.663804 + ], + [ + 99.515817, + 42.524691 + ], + [ + 97.451757, + 42.74889 + ], + [ + 96.349396, + 42.725635 + ], + [ + 95.762455, + 43.319449 + ], + [ + 95.306875, + 44.241331 + ], + [ + 94.688929, + 44.352332 + ], + [ + 93.480734, + 44.975472 + ], + [ + 92.133891, + 45.115076 + ], + [ + 90.94554, + 45.286073 + ], + [ + 90.585768, + 45.719716 + ], + [ + 90.970809, + 46.888146 + ], + [ + 90.280826, + 47.693549 + ], + [ + 88.854298, + 48.069082 + ], + [ + 88.013832, + 48.599463 + ], + [ + 87.751264, + 49.297198 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"MOZ", + "properties":{ + "name":"Mozambique" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 34.559989, + -11.52002 + ], + [ + 35.312398, + -11.439146 + ], + [ + 36.514082, + -11.720938 + ], + [ + 36.775151, + -11.594537 + ], + [ + 37.471284, + -11.568751 + ], + [ + 37.827645, + -11.268769 + ], + [ + 38.427557, + -11.285202 + ], + [ + 39.52103, + -10.896854 + ], + [ + 40.316589, + -10.317096 + ], + [ + 40.478387, + -10.765441 + ], + [ + 40.437253, + -11.761711 + ], + [ + 40.560811, + -12.639177 + ], + [ + 40.59962, + -14.201975 + ], + [ + 40.775475, + -14.691764 + ], + [ + 40.477251, + -15.406294 + ], + [ + 40.089264, + -16.100774 + ], + [ + 39.452559, + -16.720891 + ], + [ + 38.538351, + -17.101023 + ], + [ + 37.411133, + -17.586368 + ], + [ + 36.281279, + -18.659688 + ], + [ + 35.896497, + -18.84226 + ], + [ + 35.1984, + -19.552811 + ], + [ + 34.786383, + -19.784012 + ], + [ + 34.701893, + -20.497043 + ], + [ + 35.176127, + -21.254361 + ], + [ + 35.373428, + -21.840837 + ], + [ + 35.385848, + -22.14 + ], + [ + 35.562546, + -22.09 + ], + [ + 35.533935, + -23.070788 + ], + [ + 35.371774, + -23.535359 + ], + [ + 35.60747, + -23.706563 + ], + [ + 35.458746, + -24.12261 + ], + [ + 35.040735, + -24.478351 + ], + [ + 34.215824, + -24.816314 + ], + [ + 33.01321, + -25.357573 + ], + [ + 32.574632, + -25.727318 + ], + [ + 32.660363, + -26.148584 + ], + [ + 32.915955, + -26.215867 + ], + [ + 32.83012, + -26.742192 + ], + [ + 32.071665, + -26.73382 + ], + [ + 31.985779, + -26.29178 + ], + [ + 31.837778, + -25.843332 + ], + [ + 31.752408, + -25.484284 + ], + [ + 31.930589, + -24.369417 + ], + [ + 31.670398, + -23.658969 + ], + [ + 31.191409, + -22.25151 + ], + [ + 32.244988, + -21.116489 + ], + [ + 32.508693, + -20.395292 + ], + [ + 32.659743, + -20.30429 + ], + [ + 32.772708, + -19.715592 + ], + [ + 32.611994, + -19.419383 + ], + [ + 32.654886, + -18.67209 + ], + [ + 32.849861, + -17.979057 + ], + [ + 32.847639, + -16.713398 + ], + [ + 32.328239, + -16.392074 + ], + [ + 31.852041, + -16.319417 + ], + [ + 31.636498, + -16.07199 + ], + [ + 31.173064, + -15.860944 + ], + [ + 30.338955, + -15.880839 + ], + [ + 30.274256, + -15.507787 + ], + [ + 30.179481, + -14.796099 + ], + [ + 33.214025, + -13.97186 + ], + [ + 33.7897, + -14.451831 + ], + [ + 34.064825, + -14.35995 + ], + [ + 34.459633, + -14.61301 + ], + [ + 34.517666, + -15.013709 + ], + [ + 34.307291, + -15.478641 + ], + [ + 34.381292, + -16.18356 + ], + [ + 35.03381, + -16.8013 + ], + [ + 35.339063, + -16.10744 + ], + [ + 35.771905, + -15.896859 + ], + [ + 35.686845, + -14.611046 + ], + [ + 35.267956, + -13.887834 + ], + [ + 34.907151, + -13.565425 + ], + [ + 34.559989, + -13.579998 + ], + [ + 34.280006, + -12.280025 + ], + [ + 34.559989, + -11.52002 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"MRT", + "properties":{ + "name":"Mauritania" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + -12.17075, + 14.616834 + ], + [ + -12.830658, + 15.303692 + ], + [ + -13.435738, + 16.039383 + ], + [ + -14.099521, + 16.304302 + ], + [ + -14.577348, + 16.598264 + ], + [ + -15.135737, + 16.587282 + ], + [ + -15.623666, + 16.369337 + ], + [ + -16.12069, + 16.455663 + ], + [ + -16.463098, + 16.135036 + ], + [ + -16.549708, + 16.673892 + ], + [ + -16.270552, + 17.166963 + ], + [ + -16.146347, + 18.108482 + ], + [ + -16.256883, + 19.096716 + ], + [ + -16.377651, + 19.593817 + ], + [ + -16.277838, + 20.092521 + ], + [ + -16.536324, + 20.567866 + ], + [ + -17.063423, + 20.999752 + ], + [ + -16.845194, + 21.333323 + ], + [ + -12.929102, + 21.327071 + ], + [ + -13.118754, + 22.77122 + ], + [ + -12.874222, + 23.284832 + ], + [ + -11.937224, + 23.374594 + ], + [ + -11.969419, + 25.933353 + ], + [ + -8.687294, + 25.881056 + ], + [ + -8.6844, + 27.395744 + ], + [ + -4.923337, + 24.974574 + ], + [ + -6.453787, + 24.956591 + ], + [ + -5.971129, + 20.640833 + ], + [ + -5.488523, + 16.325102 + ], + [ + -5.315277, + 16.201854 + ], + [ + -5.537744, + 15.50169 + ], + [ + -9.550238, + 15.486497 + ], + [ + -9.700255, + 15.264107 + ], + [ + -10.086846, + 15.330486 + ], + [ + -10.650791, + 15.132746 + ], + [ + -11.349095, + 15.411256 + ], + [ + -11.666078, + 15.388208 + ], + [ + -11.834208, + 14.799097 + ], + [ + -12.17075, + 14.616834 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"MWI", + "properties":{ + "name":"Malawi" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 34.559989, + -11.52002 + ], + [ + 34.280006, + -12.280025 + ], + [ + 34.559989, + -13.579998 + ], + [ + 34.907151, + -13.565425 + ], + [ + 35.267956, + -13.887834 + ], + [ + 35.686845, + -14.611046 + ], + [ + 35.771905, + -15.896859 + ], + [ + 35.339063, + -16.10744 + ], + [ + 35.03381, + -16.8013 + ], + [ + 34.381292, + -16.18356 + ], + [ + 34.307291, + -15.478641 + ], + [ + 34.517666, + -15.013709 + ], + [ + 34.459633, + -14.61301 + ], + [ + 34.064825, + -14.35995 + ], + [ + 33.7897, + -14.451831 + ], + [ + 33.214025, + -13.97186 + ], + [ + 32.688165, + -13.712858 + ], + [ + 32.991764, + -12.783871 + ], + [ + 33.306422, + -12.435778 + ], + [ + 33.114289, + -11.607198 + ], + [ + 33.31531, + -10.79655 + ], + [ + 33.485688, + -10.525559 + ], + [ + 33.231388, + -9.676722 + ], + [ + 32.759375, + -9.230599 + ], + [ + 33.739729, + -9.417151 + ], + [ + 33.940838, + -9.693674 + ], + [ + 34.280006, + -10.16 + ], + [ + 34.559989, + -11.52002 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"MYS", + "properties":{ + "name":"Malaysia" + }, + "geometry":{ + "type":"MultiPolygon", + "coordinates":[ + [ + [ + [ + 101.075516, + 6.204867 + ], + [ + 101.154219, + 5.691384 + ], + [ + 101.814282, + 5.810808 + ], + [ + 102.141187, + 6.221636 + ], + [ + 102.371147, + 6.128205 + ], + [ + 102.961705, + 5.524495 + ], + [ + 103.381215, + 4.855001 + ], + [ + 103.438575, + 4.181606 + ], + [ + 103.332122, + 3.726698 + ], + [ + 103.429429, + 3.382869 + ], + [ + 103.502448, + 2.791019 + ], + [ + 103.854674, + 2.515454 + ], + [ + 104.247932, + 1.631141 + ], + [ + 104.228811, + 1.293048 + ], + [ + 103.519707, + 1.226334 + ], + [ + 102.573615, + 1.967115 + ], + [ + 101.390638, + 2.760814 + ], + [ + 101.27354, + 3.270292 + ], + [ + 100.695435, + 3.93914 + ], + [ + 100.557408, + 4.76728 + ], + [ + 100.196706, + 5.312493 + ], + [ + 100.30626, + 6.040562 + ], + [ + 100.085757, + 6.464489 + ], + [ + 100.259596, + 6.642825 + ], + [ + 101.075516, + 6.204867 + ] + ] + ], + [ + [ + [ + 118.618321, + 4.478202 + ], + [ + 117.882035, + 4.137551 + ], + [ + 117.015214, + 4.306094 + ], + [ + 115.865517, + 4.306559 + ], + [ + 115.519078, + 3.169238 + ], + [ + 115.134037, + 2.821482 + ], + [ + 114.621355, + 1.430688 + ], + [ + 113.80585, + 1.217549 + ], + [ + 112.859809, + 1.49779 + ], + [ + 112.380252, + 1.410121 + ], + [ + 111.797548, + 0.904441 + ], + [ + 111.159138, + 0.976478 + ], + [ + 110.514061, + 0.773131 + ], + [ + 109.830227, + 1.338136 + ], + [ + 109.66326, + 2.006467 + ], + [ + 110.396135, + 1.663775 + ], + [ + 111.168853, + 1.850637 + ], + [ + 111.370081, + 2.697303 + ], + [ + 111.796928, + 2.885897 + ], + [ + 112.995615, + 3.102395 + ], + [ + 113.712935, + 3.893509 + ], + [ + 114.204017, + 4.525874 + ], + [ + 114.659596, + 4.007637 + ], + [ + 114.869557, + 4.348314 + ], + [ + 115.347461, + 4.316636 + ], + [ + 115.4057, + 4.955228 + ], + [ + 115.45071, + 5.44773 + ], + [ + 116.220741, + 6.143191 + ], + [ + 116.725103, + 6.924771 + ], + [ + 117.129626, + 6.928053 + ], + [ + 117.643393, + 6.422166 + ], + [ + 117.689075, + 5.98749 + ], + [ + 118.347691, + 5.708696 + ], + [ + 119.181904, + 5.407836 + ], + [ + 119.110694, + 5.016128 + ], + [ + 118.439727, + 4.966519 + ], + [ + 118.618321, + 4.478202 + ] + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"NAM", + "properties":{ + "name":"Namibia" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 16.344977, + -28.576705 + ], + [ + 15.601818, + -27.821247 + ], + [ + 15.210472, + -27.090956 + ], + [ + 14.989711, + -26.117372 + ], + [ + 14.743214, + -25.39292 + ], + [ + 14.408144, + -23.853014 + ], + [ + 14.385717, + -22.656653 + ], + [ + 14.257714, + -22.111208 + ], + [ + 13.868642, + -21.699037 + ], + [ + 13.352498, + -20.872834 + ], + [ + 12.826845, + -19.673166 + ], + [ + 12.608564, + -19.045349 + ], + [ + 11.794919, + -18.069129 + ], + [ + 11.734199, + -17.301889 + ], + [ + 12.215461, + -17.111668 + ], + [ + 12.814081, + -16.941343 + ], + [ + 13.462362, + -16.971212 + ], + [ + 14.058501, + -17.423381 + ], + [ + 14.209707, + -17.353101 + ], + [ + 18.263309, + -17.309951 + ], + [ + 18.956187, + -17.789095 + ], + [ + 21.377176, + -17.930636 + ], + [ + 23.215048, + -17.523116 + ], + [ + 24.033862, + -17.295843 + ], + [ + 24.682349, + -17.353411 + ], + [ + 25.07695, + -17.578823 + ], + [ + 25.084443, + -17.661816 + ], + [ + 24.520705, + -17.887125 + ], + [ + 24.217365, + -17.889347 + ], + [ + 23.579006, + -18.281261 + ], + [ + 23.196858, + -17.869038 + ], + [ + 21.65504, + -18.219146 + ], + [ + 20.910641, + -18.252219 + ], + [ + 20.881134, + -21.814327 + ], + [ + 19.895458, + -21.849157 + ], + [ + 19.895768, + -24.76779 + ], + [ + 19.894734, + -28.461105 + ], + [ + 19.002127, + -28.972443 + ], + [ + 18.464899, + -29.045462 + ], + [ + 17.836152, + -28.856378 + ], + [ + 17.387497, + -28.783514 + ], + [ + 17.218929, + -28.355943 + ], + [ + 16.824017, + -28.082162 + ], + [ + 16.344977, + -28.576705 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"NCL", + "properties":{ + "name":"New Caledonia" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 165.77999, + -21.080005 + ], + [ + 166.599991, + -21.700019 + ], + [ + 167.120011, + -22.159991 + ], + [ + 166.740035, + -22.399976 + ], + [ + 166.189732, + -22.129708 + ], + [ + 165.474375, + -21.679607 + ], + [ + 164.829815, + -21.14982 + ], + [ + 164.167995, + -20.444747 + ], + [ + 164.029606, + -20.105646 + ], + [ + 164.459967, + -20.120012 + ], + [ + 165.020036, + -20.459991 + ], + [ + 165.460009, + -20.800022 + ], + [ + 165.77999, + -21.080005 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"NER", + "properties":{ + "name":"Niger" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 2.154474, + 11.94015 + ], + [ + 2.177108, + 12.625018 + ], + [ + 1.024103, + 12.851826 + ], + [ + 0.993046, + 13.33575 + ], + [ + 0.429928, + 13.988733 + ], + [ + 0.295646, + 14.444235 + ], + [ + 0.374892, + 14.928908 + ], + [ + 1.015783, + 14.968182 + ], + [ + 1.385528, + 15.323561 + ], + [ + 2.749993, + 15.409525 + ], + [ + 3.638259, + 15.56812 + ], + [ + 3.723422, + 16.184284 + ], + [ + 4.27021, + 16.852227 + ], + [ + 4.267419, + 19.155265 + ], + [ + 5.677566, + 19.601207 + ], + [ + 8.572893, + 21.565661 + ], + [ + 11.999506, + 23.471668 + ], + [ + 13.581425, + 23.040506 + ], + [ + 14.143871, + 22.491289 + ], + [ + 14.8513, + 22.86295 + ], + [ + 15.096888, + 21.308519 + ], + [ + 15.471077, + 21.048457 + ], + [ + 15.487148, + 20.730415 + ], + [ + 15.903247, + 20.387619 + ], + [ + 15.685741, + 19.95718 + ], + [ + 15.300441, + 17.92795 + ], + [ + 15.247731, + 16.627306 + ], + [ + 13.972202, + 15.684366 + ], + [ + 13.540394, + 14.367134 + ], + [ + 13.956699, + 13.996691 + ], + [ + 13.954477, + 13.353449 + ], + [ + 14.595781, + 13.330427 + ], + [ + 14.495787, + 12.859396 + ], + [ + 14.213531, + 12.802035 + ], + [ + 14.181336, + 12.483657 + ], + [ + 13.995353, + 12.461565 + ], + [ + 13.318702, + 13.556356 + ], + [ + 13.083987, + 13.596147 + ], + [ + 12.302071, + 13.037189 + ], + [ + 11.527803, + 13.32898 + ], + [ + 10.989593, + 13.387323 + ], + [ + 10.701032, + 13.246918 + ], + [ + 10.114814, + 13.277252 + ], + [ + 9.524928, + 12.851102 + ], + [ + 9.014933, + 12.826659 + ], + [ + 7.804671, + 13.343527 + ], + [ + 7.330747, + 13.098038 + ], + [ + 6.820442, + 13.115091 + ], + [ + 6.445426, + 13.492768 + ], + [ + 5.443058, + 13.865924 + ], + [ + 4.368344, + 13.747482 + ], + [ + 4.107946, + 13.531216 + ], + [ + 3.967283, + 12.956109 + ], + [ + 3.680634, + 12.552903 + ], + [ + 3.61118, + 11.660167 + ], + [ + 2.848643, + 12.235636 + ], + [ + 2.490164, + 12.233052 + ], + [ + 2.154474, + 11.94015 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"NGA", + "properties":{ + "name":"Nigeria" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 8.500288, + 4.771983 + ], + [ + 7.462108, + 4.412108 + ], + [ + 7.082596, + 4.464689 + ], + [ + 6.698072, + 4.240594 + ], + [ + 5.898173, + 4.262453 + ], + [ + 5.362805, + 4.887971 + ], + [ + 5.033574, + 5.611802 + ], + [ + 4.325607, + 6.270651 + ], + [ + 3.57418, + 6.2583 + ], + [ + 2.691702, + 6.258817 + ], + [ + 2.749063, + 7.870734 + ], + [ + 2.723793, + 8.506845 + ], + [ + 2.912308, + 9.137608 + ], + [ + 3.220352, + 9.444153 + ], + [ + 3.705438, + 10.06321 + ], + [ + 3.60007, + 10.332186 + ], + [ + 3.797112, + 10.734746 + ], + [ + 3.572216, + 11.327939 + ], + [ + 3.61118, + 11.660167 + ], + [ + 3.680634, + 12.552903 + ], + [ + 3.967283, + 12.956109 + ], + [ + 4.107946, + 13.531216 + ], + [ + 4.368344, + 13.747482 + ], + [ + 5.443058, + 13.865924 + ], + [ + 6.445426, + 13.492768 + ], + [ + 6.820442, + 13.115091 + ], + [ + 7.330747, + 13.098038 + ], + [ + 7.804671, + 13.343527 + ], + [ + 9.014933, + 12.826659 + ], + [ + 9.524928, + 12.851102 + ], + [ + 10.114814, + 13.277252 + ], + [ + 10.701032, + 13.246918 + ], + [ + 10.989593, + 13.387323 + ], + [ + 11.527803, + 13.32898 + ], + [ + 12.302071, + 13.037189 + ], + [ + 13.083987, + 13.596147 + ], + [ + 13.318702, + 13.556356 + ], + [ + 13.995353, + 12.461565 + ], + [ + 14.181336, + 12.483657 + ], + [ + 14.577178, + 12.085361 + ], + [ + 14.468192, + 11.904752 + ], + [ + 14.415379, + 11.572369 + ], + [ + 13.57295, + 10.798566 + ], + [ + 13.308676, + 10.160362 + ], + [ + 13.1676, + 9.640626 + ], + [ + 12.955468, + 9.417772 + ], + [ + 12.753672, + 8.717763 + ], + [ + 12.218872, + 8.305824 + ], + [ + 12.063946, + 7.799808 + ], + [ + 11.839309, + 7.397042 + ], + [ + 11.745774, + 6.981383 + ], + [ + 11.058788, + 6.644427 + ], + [ + 10.497375, + 7.055358 + ], + [ + 10.118277, + 7.03877 + ], + [ + 9.522706, + 6.453482 + ], + [ + 9.233163, + 6.444491 + ], + [ + 8.757533, + 5.479666 + ], + [ + 8.500288, + 4.771983 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"NIC", + "properties":{ + "name":"Nicaragua" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + -85.71254, + 11.088445 + ], + [ + -86.058488, + 11.403439 + ], + [ + -86.52585, + 11.806877 + ], + [ + -86.745992, + 12.143962 + ], + [ + -87.167516, + 12.458258 + ], + [ + -87.668493, + 12.90991 + ], + [ + -87.557467, + 13.064552 + ], + [ + -87.392386, + 12.914018 + ], + [ + -87.316654, + 12.984686 + ], + [ + -87.005769, + 13.025794 + ], + [ + -86.880557, + 13.254204 + ], + [ + -86.733822, + 13.263093 + ], + [ + -86.755087, + 13.754845 + ], + [ + -86.520708, + 13.778487 + ], + [ + -86.312142, + 13.771356 + ], + [ + -86.096264, + 14.038187 + ], + [ + -85.801295, + 13.836055 + ], + [ + -85.698665, + 13.960078 + ], + [ + -85.514413, + 14.079012 + ], + [ + -85.165365, + 14.35437 + ], + [ + -85.148751, + 14.560197 + ], + [ + -85.052787, + 14.551541 + ], + [ + -84.924501, + 14.790493 + ], + [ + -84.820037, + 14.819587 + ], + [ + -84.649582, + 14.666805 + ], + [ + -84.449336, + 14.621614 + ], + [ + -84.228342, + 14.748764 + ], + [ + -83.975721, + 14.749436 + ], + [ + -83.628585, + 14.880074 + ], + [ + -83.489989, + 15.016267 + ], + [ + -83.147219, + 14.995829 + ], + [ + -83.233234, + 14.899866 + ], + [ + -83.284162, + 14.676624 + ], + [ + -83.182126, + 14.310703 + ], + [ + -83.4125, + 13.970078 + ], + [ + -83.519832, + 13.567699 + ], + [ + -83.552207, + 13.127054 + ], + [ + -83.498515, + 12.869292 + ], + [ + -83.473323, + 12.419087 + ], + [ + -83.626104, + 12.32085 + ], + [ + -83.719613, + 11.893124 + ], + [ + -83.650858, + 11.629032 + ], + [ + -83.85547, + 11.373311 + ], + [ + -83.808936, + 11.103044 + ], + [ + -83.655612, + 10.938764 + ], + [ + -83.895054, + 10.726839 + ], + [ + -84.190179, + 10.79345 + ], + [ + -84.355931, + 10.999226 + ], + [ + -84.673069, + 11.082657 + ], + [ + -84.903003, + 10.952303 + ], + [ + -85.561852, + 11.217119 + ], + [ + -85.71254, + 11.088445 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"NLD", + "properties":{ + "name":"Netherlands" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 6.074183, + 53.510403 + ], + [ + 6.90514, + 53.482162 + ], + [ + 7.092053, + 53.144043 + ], + [ + 6.84287, + 52.22844 + ], + [ + 6.589397, + 51.852029 + ], + [ + 5.988658, + 51.851616 + ], + [ + 6.156658, + 50.803721 + ], + [ + 5.606976, + 51.037298 + ], + [ + 4.973991, + 51.475024 + ], + [ + 4.047071, + 51.267259 + ], + [ + 3.314971, + 51.345755 + ], + [ + 3.830289, + 51.620545 + ], + [ + 4.705997, + 53.091798 + ], + [ + 6.074183, + 53.510403 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"NOR", + "properties":{ + "name":"Norway" + }, + "geometry":{ + "type":"MultiPolygon", + "coordinates":[ + [ + [ + [ + 28.165547, + 71.185474 + ], + [ + 31.293418, + 70.453788 + ], + [ + 30.005435, + 70.186259 + ], + [ + 31.101079, + 69.55808 + ], + [ + 29.399581, + 69.156916 + ], + [ + 28.59193, + 69.064777 + ], + [ + 29.015573, + 69.766491 + ], + [ + 27.732292, + 70.164193 + ], + [ + 26.179622, + 69.825299 + ], + [ + 25.689213, + 69.092114 + ], + [ + 24.735679, + 68.649557 + ], + [ + 23.66205, + 68.891247 + ], + [ + 22.356238, + 68.841741 + ], + [ + 21.244936, + 69.370443 + ], + [ + 20.645593, + 69.106247 + ], + [ + 20.025269, + 69.065139 + ], + [ + 19.87856, + 68.407194 + ], + [ + 17.993868, + 68.567391 + ], + [ + 17.729182, + 68.010552 + ], + [ + 16.768879, + 68.013937 + ], + [ + 16.108712, + 67.302456 + ], + [ + 15.108411, + 66.193867 + ], + [ + 13.55569, + 64.787028 + ], + [ + 13.919905, + 64.445421 + ], + [ + 13.571916, + 64.049114 + ], + [ + 12.579935, + 64.066219 + ], + [ + 11.930569, + 63.128318 + ], + [ + 11.992064, + 61.800362 + ], + [ + 12.631147, + 61.293572 + ], + [ + 12.300366, + 60.117933 + ], + [ + 11.468272, + 59.432393 + ], + [ + 11.027369, + 58.856149 + ], + [ + 10.356557, + 59.469807 + ], + [ + 8.382, + 58.313288 + ], + [ + 7.048748, + 58.078884 + ], + [ + 5.665835, + 58.588155 + ], + [ + 5.308234, + 59.663232 + ], + [ + 4.992078, + 61.970998 + ], + [ + 5.9129, + 62.614473 + ], + [ + 8.553411, + 63.454008 + ], + [ + 10.527709, + 64.486038 + ], + [ + 12.358347, + 65.879726 + ], + [ + 14.761146, + 67.810642 + ], + [ + 16.435927, + 68.563205 + ], + [ + 19.184028, + 69.817444 + ], + [ + 21.378416, + 70.255169 + ], + [ + 23.023742, + 70.202072 + ], + [ + 24.546543, + 71.030497 + ], + [ + 26.37005, + 70.986262 + ], + [ + 28.165547, + 71.185474 + ] + ] + ], + [ + [ + [ + 24.72412, + 77.85385 + ], + [ + 22.49032, + 77.44493 + ], + [ + 20.72601, + 77.67704 + ], + [ + 21.41611, + 77.93504 + ], + [ + 20.8119, + 78.25463 + ], + [ + 22.88426, + 78.45494 + ], + [ + 23.28134, + 78.07954 + ], + [ + 24.72412, + 77.85385 + ] + ] + ], + [ + [ + [ + 18.25183, + 79.70175 + ], + [ + 21.54383, + 78.95611 + ], + [ + 19.02737, + 78.5626 + ], + [ + 18.47172, + 77.82669 + ], + [ + 17.59441, + 77.63796 + ], + [ + 17.1182, + 76.80941 + ], + [ + 15.91315, + 76.77045 + ], + [ + 13.76259, + 77.38035 + ], + [ + 14.66956, + 77.73565 + ], + [ + 13.1706, + 78.02493 + ], + [ + 11.22231, + 78.8693 + ], + [ + 10.44453, + 79.65239 + ], + [ + 13.17077, + 80.01046 + ], + [ + 13.71852, + 79.66039 + ], + [ + 15.14282, + 79.67431 + ], + [ + 15.52255, + 80.01608 + ], + [ + 16.99085, + 80.05086 + ], + [ + 18.25183, + 79.70175 + ] + ] + ], + [ + [ + [ + 25.447625, + 80.40734 + ], + [ + 27.407506, + 80.056406 + ], + [ + 25.924651, + 79.517834 + ], + [ + 23.024466, + 79.400012 + ], + [ + 20.075188, + 79.566823 + ], + [ + 19.897266, + 79.842362 + ], + [ + 18.462264, + 79.85988 + ], + [ + 17.368015, + 80.318896 + ], + [ + 20.455992, + 80.598156 + ], + [ + 21.907945, + 80.357679 + ], + [ + 22.919253, + 80.657144 + ], + [ + 25.447625, + 80.40734 + ] + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"NPL", + "properties":{ + "name":"Nepal" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 88.120441, + 27.876542 + ], + [ + 88.043133, + 27.445819 + ], + [ + 88.174804, + 26.810405 + ], + [ + 88.060238, + 26.414615 + ], + [ + 87.227472, + 26.397898 + ], + [ + 86.024393, + 26.630985 + ], + [ + 85.251779, + 26.726198 + ], + [ + 84.675018, + 27.234901 + ], + [ + 83.304249, + 27.364506 + ], + [ + 81.999987, + 27.925479 + ], + [ + 81.057203, + 28.416095 + ], + [ + 80.088425, + 28.79447 + ], + [ + 80.476721, + 29.729865 + ], + [ + 81.111256, + 30.183481 + ], + [ + 81.525804, + 30.422717 + ], + [ + 82.327513, + 30.115268 + ], + [ + 83.337115, + 29.463732 + ], + [ + 83.898993, + 29.320226 + ], + [ + 84.23458, + 28.839894 + ], + [ + 85.011638, + 28.642774 + ], + [ + 85.82332, + 28.203576 + ], + [ + 86.954517, + 27.974262 + ], + [ + 88.120441, + 27.876542 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"NZL", + "properties":{ + "name":"New Zealand" + }, + "geometry":{ + "type":"MultiPolygon", + "coordinates":[ + [ + [ + [ + 173.020375, + -40.919052 + ], + [ + 173.247234, + -41.331999 + ], + [ + 173.958405, + -40.926701 + ], + [ + 174.247587, + -41.349155 + ], + [ + 174.248517, + -41.770008 + ], + [ + 173.876447, + -42.233184 + ], + [ + 173.22274, + -42.970038 + ], + [ + 172.711246, + -43.372288 + ], + [ + 173.080113, + -43.853344 + ], + [ + 172.308584, + -43.865694 + ], + [ + 171.452925, + -44.242519 + ], + [ + 171.185138, + -44.897104 + ], + [ + 170.616697, + -45.908929 + ], + [ + 169.831422, + -46.355775 + ], + [ + 169.332331, + -46.641235 + ], + [ + 168.411354, + -46.619945 + ], + [ + 167.763745, + -46.290197 + ], + [ + 166.676886, + -46.219917 + ], + [ + 166.509144, + -45.852705 + ], + [ + 167.046424, + -45.110941 + ], + [ + 168.303763, + -44.123973 + ], + [ + 168.949409, + -43.935819 + ], + [ + 169.667815, + -43.555326 + ], + [ + 170.52492, + -43.031688 + ], + [ + 171.12509, + -42.512754 + ], + [ + 171.569714, + -41.767424 + ], + [ + 171.948709, + -41.514417 + ], + [ + 172.097227, + -40.956104 + ], + [ + 172.79858, + -40.493962 + ], + [ + 173.020375, + -40.919052 + ] + ] + ], + [ + [ + [ + 174.612009, + -36.156397 + ], + [ + 175.336616, + -37.209098 + ], + [ + 175.357596, + -36.526194 + ], + [ + 175.808887, + -36.798942 + ], + [ + 175.95849, + -37.555382 + ], + [ + 176.763195, + -37.881253 + ], + [ + 177.438813, + -37.961248 + ], + [ + 178.010354, + -37.579825 + ], + [ + 178.517094, + -37.695373 + ], + [ + 178.274731, + -38.582813 + ], + [ + 177.97046, + -39.166343 + ], + [ + 177.206993, + -39.145776 + ], + [ + 176.939981, + -39.449736 + ], + [ + 177.032946, + -39.879943 + ], + [ + 176.885824, + -40.065978 + ], + [ + 176.508017, + -40.604808 + ], + [ + 176.01244, + -41.289624 + ], + [ + 175.239567, + -41.688308 + ], + [ + 175.067898, + -41.425895 + ], + [ + 174.650973, + -41.281821 + ], + [ + 175.22763, + -40.459236 + ], + [ + 174.900157, + -39.908933 + ], + [ + 173.824047, + -39.508854 + ], + [ + 173.852262, + -39.146602 + ], + [ + 174.574802, + -38.797683 + ], + [ + 174.743474, + -38.027808 + ], + [ + 174.697017, + -37.381129 + ], + [ + 174.292028, + -36.711092 + ], + [ + 174.319004, + -36.534824 + ], + [ + 173.840997, + -36.121981 + ], + [ + 173.054171, + -35.237125 + ], + [ + 172.636005, + -34.529107 + ], + [ + 173.007042, + -34.450662 + ], + [ + 173.551298, + -35.006183 + ], + [ + 174.32939, + -35.265496 + ], + [ + 174.612009, + -36.156397 + ] + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"OMN", + "properties":{ + "name":"Oman" + }, + "geometry":{ + "type":"MultiPolygon", + "coordinates":[ + [ + [ + [ + 58.861141, + 21.114035 + ], + [ + 58.487986, + 20.428986 + ], + [ + 58.034318, + 20.481437 + ], + [ + 57.826373, + 20.243002 + ], + [ + 57.665762, + 19.736005 + ], + [ + 57.7887, + 19.06757 + ], + [ + 57.694391, + 18.94471 + ], + [ + 57.234264, + 18.947991 + ], + [ + 56.609651, + 18.574267 + ], + [ + 56.512189, + 18.087113 + ], + [ + 56.283521, + 17.876067 + ], + [ + 55.661492, + 17.884128 + ], + [ + 55.269939, + 17.632309 + ], + [ + 55.2749, + 17.228354 + ], + [ + 54.791002, + 16.950697 + ], + [ + 54.239253, + 17.044981 + ], + [ + 53.570508, + 16.707663 + ], + [ + 53.108573, + 16.651051 + ], + [ + 52.782184, + 17.349742 + ], + [ + 52.00001, + 19.000003 + ], + [ + 54.999982, + 19.999994 + ], + [ + 55.666659, + 22.000001 + ], + [ + 55.208341, + 22.70833 + ], + [ + 55.234489, + 23.110993 + ], + [ + 55.525841, + 23.524869 + ], + [ + 55.528632, + 23.933604 + ], + [ + 55.981214, + 24.130543 + ], + [ + 55.804119, + 24.269604 + ], + [ + 55.886233, + 24.920831 + ], + [ + 56.396847, + 24.924732 + ], + [ + 56.84514, + 24.241673 + ], + [ + 57.403453, + 23.878594 + ], + [ + 58.136948, + 23.747931 + ], + [ + 58.729211, + 23.565668 + ], + [ + 59.180502, + 22.992395 + ], + [ + 59.450098, + 22.660271 + ], + [ + 59.80806, + 22.533612 + ], + [ + 59.806148, + 22.310525 + ], + [ + 59.442191, + 21.714541 + ], + [ + 59.282408, + 21.433886 + ], + [ + 58.861141, + 21.114035 + ] + ] + ], + [ + [ + [ + 56.391421, + 25.895991 + ], + [ + 56.261042, + 25.714606 + ], + [ + 56.070821, + 26.055464 + ], + [ + 56.362017, + 26.395934 + ], + [ + 56.485679, + 26.309118 + ], + [ + 56.391421, + 25.895991 + ] + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"PAK", + "properties":{ + "name":"Pakistan" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 75.158028, + 37.133031 + ], + [ + 75.896897, + 36.666806 + ], + [ + 76.192848, + 35.898403 + ], + [ + 77.837451, + 35.49401 + ], + [ + 76.871722, + 34.653544 + ], + [ + 75.757061, + 34.504923 + ], + [ + 74.240203, + 34.748887 + ], + [ + 73.749948, + 34.317699 + ], + [ + 74.104294, + 33.441473 + ], + [ + 74.451559, + 32.7649 + ], + [ + 75.258642, + 32.271105 + ], + [ + 74.405929, + 31.692639 + ], + [ + 74.42138, + 30.979815 + ], + [ + 73.450638, + 29.976413 + ], + [ + 72.823752, + 28.961592 + ], + [ + 71.777666, + 27.91318 + ], + [ + 70.616496, + 27.989196 + ], + [ + 69.514393, + 26.940966 + ], + [ + 70.168927, + 26.491872 + ], + [ + 70.282873, + 25.722229 + ], + [ + 70.844699, + 25.215102 + ], + [ + 71.04324, + 24.356524 + ], + [ + 68.842599, + 24.359134 + ], + [ + 68.176645, + 23.691965 + ], + [ + 67.443667, + 23.944844 + ], + [ + 67.145442, + 24.663611 + ], + [ + 66.372828, + 25.425141 + ], + [ + 64.530408, + 25.237039 + ], + [ + 62.905701, + 25.218409 + ], + [ + 61.497363, + 25.078237 + ], + [ + 61.874187, + 26.239975 + ], + [ + 63.316632, + 26.756532 + ], + [ + 63.233898, + 27.217047 + ], + [ + 62.755426, + 27.378923 + ], + [ + 62.72783, + 28.259645 + ], + [ + 61.771868, + 28.699334 + ], + [ + 61.369309, + 29.303276 + ], + [ + 60.874248, + 29.829239 + ], + [ + 62.549857, + 29.318572 + ], + [ + 63.550261, + 29.468331 + ], + [ + 64.148002, + 29.340819 + ], + [ + 64.350419, + 29.560031 + ], + [ + 65.046862, + 29.472181 + ], + [ + 66.346473, + 29.887943 + ], + [ + 66.381458, + 30.738899 + ], + [ + 66.938891, + 31.304911 + ], + [ + 67.683394, + 31.303154 + ], + [ + 67.792689, + 31.58293 + ], + [ + 68.556932, + 31.71331 + ], + [ + 68.926677, + 31.620189 + ], + [ + 69.317764, + 31.901412 + ], + [ + 69.262522, + 32.501944 + ], + [ + 69.687147, + 33.105499 + ], + [ + 70.323594, + 33.358533 + ], + [ + 69.930543, + 34.02012 + ], + [ + 70.881803, + 33.988856 + ], + [ + 71.156773, + 34.348911 + ], + [ + 71.115019, + 34.733126 + ], + [ + 71.613076, + 35.153203 + ], + [ + 71.498768, + 35.650563 + ], + [ + 71.262348, + 36.074388 + ], + [ + 71.846292, + 36.509942 + ], + [ + 72.920025, + 36.720007 + ], + [ + 74.067552, + 36.836176 + ], + [ + 74.575893, + 37.020841 + ], + [ + 75.158028, + 37.133031 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"PAN", + "properties":{ + "name":"Panama" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + -77.881571, + 7.223771 + ], + [ + -78.214936, + 7.512255 + ], + [ + -78.429161, + 8.052041 + ], + [ + -78.182096, + 8.319182 + ], + [ + -78.435465, + 8.387705 + ], + [ + -78.622121, + 8.718124 + ], + [ + -79.120307, + 8.996092 + ], + [ + -79.557877, + 8.932375 + ], + [ + -79.760578, + 8.584515 + ], + [ + -80.164481, + 8.333316 + ], + [ + -80.382659, + 8.298409 + ], + [ + -80.480689, + 8.090308 + ], + [ + -80.00369, + 7.547524 + ], + [ + -80.276671, + 7.419754 + ], + [ + -80.421158, + 7.271572 + ], + [ + -80.886401, + 7.220541 + ], + [ + -81.059543, + 7.817921 + ], + [ + -81.189716, + 7.647906 + ], + [ + -81.519515, + 7.70661 + ], + [ + -81.721311, + 8.108963 + ], + [ + -82.131441, + 8.175393 + ], + [ + -82.390934, + 8.292362 + ], + [ + -82.820081, + 8.290864 + ], + [ + -82.850958, + 8.073823 + ], + [ + -82.965783, + 8.225028 + ], + [ + -82.913176, + 8.423517 + ], + [ + -82.829771, + 8.626295 + ], + [ + -82.868657, + 8.807266 + ], + [ + -82.719183, + 8.925709 + ], + [ + -82.927155, + 9.07433 + ], + [ + -82.932891, + 9.476812 + ], + [ + -82.546196, + 9.566135 + ], + [ + -82.187123, + 9.207449 + ], + [ + -82.207586, + 8.995575 + ], + [ + -81.808567, + 8.950617 + ], + [ + -81.714154, + 9.031955 + ], + [ + -81.439287, + 8.786234 + ], + [ + -80.947302, + 8.858504 + ], + [ + -80.521901, + 9.111072 + ], + [ + -79.9146, + 9.312765 + ], + [ + -79.573303, + 9.61161 + ], + [ + -79.021192, + 9.552931 + ], + [ + -79.05845, + 9.454565 + ], + [ + -78.500888, + 9.420459 + ], + [ + -78.055928, + 9.24773 + ], + [ + -77.729514, + 8.946844 + ], + [ + -77.353361, + 8.670505 + ], + [ + -77.474723, + 8.524286 + ], + [ + -77.242566, + 7.935278 + ], + [ + -77.431108, + 7.638061 + ], + [ + -77.753414, + 7.70984 + ], + [ + -77.881571, + 7.223771 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"PER", + "properties":{ + "name":"Peru" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + -69.590424, + -17.580012 + ], + [ + -69.858444, + -18.092694 + ], + [ + -70.372572, + -18.347975 + ], + [ + -71.37525, + -17.773799 + ], + [ + -71.462041, + -17.363488 + ], + [ + -73.44453, + -16.359363 + ], + [ + -75.237883, + -15.265683 + ], + [ + -76.009205, + -14.649286 + ], + [ + -76.423469, + -13.823187 + ], + [ + -76.259242, + -13.535039 + ], + [ + -77.106192, + -12.222716 + ], + [ + -78.092153, + -10.377712 + ], + [ + -79.036953, + -8.386568 + ], + [ + -79.44592, + -7.930833 + ], + [ + -79.760578, + -7.194341 + ], + [ + -80.537482, + -6.541668 + ], + [ + -81.249996, + -6.136834 + ], + [ + -80.926347, + -5.690557 + ], + [ + -81.410943, + -4.736765 + ], + [ + -81.09967, + -4.036394 + ], + [ + -80.302561, + -3.404856 + ], + [ + -80.184015, + -3.821162 + ], + [ + -80.469295, + -4.059287 + ], + [ + -80.442242, + -4.425724 + ], + [ + -80.028908, + -4.346091 + ], + [ + -79.624979, + -4.454198 + ], + [ + -79.205289, + -4.959129 + ], + [ + -78.639897, + -4.547784 + ], + [ + -78.450684, + -3.873097 + ], + [ + -77.837905, + -3.003021 + ], + [ + -76.635394, + -2.608678 + ], + [ + -75.544996, + -1.56161 + ], + [ + -75.233723, + -0.911417 + ], + [ + -75.373223, + -0.152032 + ], + [ + -75.106625, + -0.057205 + ], + [ + -74.441601, + -0.53082 + ], + [ + -74.122395, + -1.002833 + ], + [ + -73.659504, + -1.260491 + ], + [ + -73.070392, + -2.308954 + ], + [ + -72.325787, + -2.434218 + ], + [ + -71.774761, + -2.16979 + ], + [ + -71.413646, + -2.342802 + ], + [ + -70.813476, + -2.256865 + ], + [ + -70.047709, + -2.725156 + ], + [ + -70.692682, + -3.742872 + ], + [ + -70.394044, + -3.766591 + ], + [ + -69.893635, + -4.298187 + ], + [ + -70.794769, + -4.251265 + ], + [ + -70.928843, + -4.401591 + ], + [ + -71.748406, + -4.593983 + ], + [ + -72.891928, + -5.274561 + ], + [ + -72.964507, + -5.741251 + ], + [ + -73.219711, + -6.089189 + ], + [ + -73.120027, + -6.629931 + ], + [ + -73.724487, + -6.918595 + ], + [ + -73.723401, + -7.340999 + ], + [ + -73.987235, + -7.52383 + ], + [ + -73.571059, + -8.424447 + ], + [ + -73.015383, + -9.032833 + ], + [ + -73.226713, + -9.462213 + ], + [ + -72.563033, + -9.520194 + ], + [ + -72.184891, + -10.053598 + ], + [ + -71.302412, + -10.079436 + ], + [ + -70.481894, + -9.490118 + ], + [ + -70.548686, + -11.009147 + ], + [ + -70.093752, + -11.123972 + ], + [ + -69.529678, + -10.951734 + ], + [ + -68.66508, + -12.5613 + ], + [ + -68.88008, + -12.899729 + ], + [ + -68.929224, + -13.602684 + ], + [ + -68.948887, + -14.453639 + ], + [ + -69.339535, + -14.953195 + ], + [ + -69.160347, + -15.323974 + ], + [ + -69.389764, + -15.660129 + ], + [ + -68.959635, + -16.500698 + ], + [ + -69.590424, + -17.580012 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"PHL", + "properties":{ + "name":"Philippines" + }, + "geometry":{ + "type":"MultiPolygon", + "coordinates":[ + [ + [ + [ + 126.376814, + 8.414706 + ], + [ + 126.478513, + 7.750354 + ], + [ + 126.537424, + 7.189381 + ], + [ + 126.196773, + 6.274294 + ], + [ + 125.831421, + 7.293715 + ], + [ + 125.363852, + 6.786485 + ], + [ + 125.683161, + 6.049657 + ], + [ + 125.396512, + 5.581003 + ], + [ + 124.219788, + 6.161355 + ], + [ + 123.93872, + 6.885136 + ], + [ + 124.243662, + 7.36061 + ], + [ + 123.610212, + 7.833527 + ], + [ + 123.296071, + 7.418876 + ], + [ + 122.825506, + 7.457375 + ], + [ + 122.085499, + 6.899424 + ], + [ + 121.919928, + 7.192119 + ], + [ + 122.312359, + 8.034962 + ], + [ + 122.942398, + 8.316237 + ], + [ + 123.487688, + 8.69301 + ], + [ + 123.841154, + 8.240324 + ], + [ + 124.60147, + 8.514158 + ], + [ + 124.764612, + 8.960409 + ], + [ + 125.471391, + 8.986997 + ], + [ + 125.412118, + 9.760335 + ], + [ + 126.222714, + 9.286074 + ], + [ + 126.306637, + 8.782487 + ], + [ + 126.376814, + 8.414706 + ] + ] + ], + [ + [ + [ + 123.982438, + 10.278779 + ], + [ + 123.623183, + 9.950091 + ], + [ + 123.309921, + 9.318269 + ], + [ + 122.995883, + 9.022189 + ], + [ + 122.380055, + 9.713361 + ], + [ + 122.586089, + 9.981045 + ], + [ + 122.837081, + 10.261157 + ], + [ + 122.947411, + 10.881868 + ], + [ + 123.49885, + 10.940624 + ], + [ + 123.337774, + 10.267384 + ], + [ + 124.077936, + 11.232726 + ], + [ + 123.982438, + 10.278779 + ] + ] + ], + [ + [ + [ + 118.504581, + 9.316383 + ], + [ + 117.174275, + 8.3675 + ], + [ + 117.664477, + 9.066889 + ], + [ + 118.386914, + 9.6845 + ], + [ + 118.987342, + 10.376292 + ], + [ + 119.511496, + 11.369668 + ], + [ + 119.689677, + 10.554291 + ], + [ + 119.029458, + 10.003653 + ], + [ + 118.504581, + 9.316383 + ] + ] + ], + [ + [ + [ + 121.883548, + 11.891755 + ], + [ + 122.483821, + 11.582187 + ], + [ + 123.120217, + 11.58366 + ], + [ + 123.100838, + 11.165934 + ], + [ + 122.637714, + 10.741308 + ], + [ + 122.00261, + 10.441017 + ], + [ + 121.967367, + 10.905691 + ], + [ + 122.03837, + 11.415841 + ], + [ + 121.883548, + 11.891755 + ] + ] + ], + [ + [ + [ + 125.502552, + 12.162695 + ], + [ + 125.783465, + 11.046122 + ], + [ + 125.011884, + 11.311455 + ], + [ + 125.032761, + 10.975816 + ], + [ + 125.277449, + 10.358722 + ], + [ + 124.801819, + 10.134679 + ], + [ + 124.760168, + 10.837995 + ], + [ + 124.459101, + 10.88993 + ], + [ + 124.302522, + 11.495371 + ], + [ + 124.891013, + 11.415583 + ], + [ + 124.87799, + 11.79419 + ], + [ + 124.266762, + 12.557761 + ], + [ + 125.227116, + 12.535721 + ], + [ + 125.502552, + 12.162695 + ] + ] + ], + [ + [ + [ + 121.527394, + 13.06959 + ], + [ + 121.26219, + 12.20556 + ], + [ + 120.833896, + 12.704496 + ], + [ + 120.323436, + 13.466413 + ], + [ + 121.180128, + 13.429697 + ], + [ + 121.527394, + 13.06959 + ] + ] + ], + [ + [ + [ + 121.321308, + 18.504065 + ], + [ + 121.937601, + 18.218552 + ], + [ + 122.246006, + 18.47895 + ], + [ + 122.336957, + 18.224883 + ], + [ + 122.174279, + 17.810283 + ], + [ + 122.515654, + 17.093505 + ], + [ + 122.252311, + 16.262444 + ], + [ + 121.662786, + 15.931018 + ], + [ + 121.50507, + 15.124814 + ], + [ + 121.728829, + 14.328376 + ], + [ + 122.258925, + 14.218202 + ], + [ + 122.701276, + 14.336541 + ], + [ + 123.950295, + 13.782131 + ], + [ + 123.855107, + 13.237771 + ], + [ + 124.181289, + 12.997527 + ], + [ + 124.077419, + 12.536677 + ], + [ + 123.298035, + 13.027526 + ], + [ + 122.928652, + 13.55292 + ], + [ + 122.671355, + 13.185836 + ], + [ + 122.03465, + 13.784482 + ], + [ + 121.126385, + 13.636687 + ], + [ + 120.628637, + 13.857656 + ], + [ + 120.679384, + 14.271016 + ], + [ + 120.991819, + 14.525393 + ], + [ + 120.693336, + 14.756671 + ], + [ + 120.564145, + 14.396279 + ], + [ + 120.070429, + 14.970869 + ], + [ + 119.920929, + 15.406347 + ], + [ + 119.883773, + 16.363704 + ], + [ + 120.286488, + 16.034629 + ], + [ + 120.390047, + 17.599081 + ], + [ + 120.715867, + 18.505227 + ], + [ + 121.321308, + 18.504065 + ] + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"PNG", + "properties":{ + "name":"Papua New Guinea" + }, + "geometry":{ + "type":"MultiPolygon", + "coordinates":[ + [ + [ + [ + 155.880026, + -6.819997 + ], + [ + 155.599991, + -6.919991 + ], + [ + 155.166994, + -6.535931 + ], + [ + 154.729192, + -5.900828 + ], + [ + 154.514114, + -5.139118 + ], + [ + 154.652504, + -5.042431 + ], + [ + 154.759991, + -5.339984 + ], + [ + 155.062918, + -5.566792 + ], + [ + 155.547746, + -6.200655 + ], + [ + 156.019965, + -6.540014 + ], + [ + 155.880026, + -6.819997 + ] + ] + ], + [ + [ + [ + 151.982796, + -5.478063 + ], + [ + 151.459107, + -5.56028 + ], + [ + 151.30139, + -5.840728 + ], + [ + 150.754447, + -6.083763 + ], + [ + 150.241197, + -6.317754 + ], + [ + 149.709963, + -6.316513 + ], + [ + 148.890065, + -6.02604 + ], + [ + 148.318937, + -5.747142 + ], + [ + 148.401826, + -5.437756 + ], + [ + 149.298412, + -5.583742 + ], + [ + 149.845562, + -5.505503 + ], + [ + 149.99625, + -5.026101 + ], + [ + 150.139756, + -5.001348 + ], + [ + 150.236908, + -5.53222 + ], + [ + 150.807467, + -5.455842 + ], + [ + 151.089672, + -5.113693 + ], + [ + 151.647881, + -4.757074 + ], + [ + 151.537862, + -4.167807 + ], + [ + 152.136792, + -4.14879 + ], + [ + 152.338743, + -4.312966 + ], + [ + 152.318693, + -4.867661 + ], + [ + 151.982796, + -5.478063 + ] + ] + ], + [ + [ + [ + 147.191874, + -7.388024 + ], + [ + 148.084636, + -8.044108 + ], + [ + 148.734105, + -9.104664 + ], + [ + 149.306835, + -9.071436 + ], + [ + 149.266631, + -9.514406 + ], + [ + 150.038728, + -9.684318 + ], + [ + 149.738798, + -9.872937 + ], + [ + 150.801628, + -10.293687 + ], + [ + 150.690575, + -10.582713 + ], + [ + 150.028393, + -10.652476 + ], + [ + 149.78231, + -10.393267 + ], + [ + 148.923138, + -10.280923 + ], + [ + 147.913018, + -10.130441 + ], + [ + 147.135443, + -9.492444 + ], + [ + 146.567881, + -8.942555 + ], + [ + 146.048481, + -8.067414 + ], + [ + 144.744168, + -7.630128 + ], + [ + 143.897088, + -7.91533 + ], + [ + 143.286376, + -8.245491 + ], + [ + 143.413913, + -8.983069 + ], + [ + 142.628431, + -9.326821 + ], + [ + 142.068259, + -9.159596 + ], + [ + 141.033852, + -9.117893 + ], + [ + 141.017057, + -5.859022 + ], + [ + 141.00021, + -2.600151 + ], + [ + 142.735247, + -3.289153 + ], + [ + 144.583971, + -3.861418 + ], + [ + 145.27318, + -4.373738 + ], + [ + 145.829786, + -4.876498 + ], + [ + 145.981922, + -5.465609 + ], + [ + 147.648073, + -6.083659 + ], + [ + 147.891108, + -6.614015 + ], + [ + 146.970905, + -6.721657 + ], + [ + 147.191874, + -7.388024 + ] + ] + ], + [ + [ + [ + 153.140038, + -4.499983 + ], + [ + 152.827292, + -4.766427 + ], + [ + 152.638673, + -4.176127 + ], + [ + 152.406026, + -3.789743 + ], + [ + 151.953237, + -3.462062 + ], + [ + 151.384279, + -3.035422 + ], + [ + 150.66205, + -2.741486 + ], + [ + 150.939965, + -2.500002 + ], + [ + 151.479984, + -2.779985 + ], + [ + 151.820015, + -2.999972 + ], + [ + 152.239989, + -3.240009 + ], + [ + 152.640017, + -3.659983 + ], + [ + 153.019994, + -3.980015 + ], + [ + 153.140038, + -4.499983 + ] + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"POL", + "properties":{ + "name":"Poland" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 15.016996, + 51.106674 + ], + [ + 14.607098, + 51.745188 + ], + [ + 14.685026, + 52.089947 + ], + [ + 14.4376, + 52.62485 + ], + [ + 14.074521, + 52.981263 + ], + [ + 14.353315, + 53.248171 + ], + [ + 14.119686, + 53.757029 + ], + [ + 14.8029, + 54.050706 + ], + [ + 16.363477, + 54.513159 + ], + [ + 17.622832, + 54.851536 + ], + [ + 18.620859, + 54.682606 + ], + [ + 18.696255, + 54.438719 + ], + [ + 19.66064, + 54.426084 + ], + [ + 20.892245, + 54.312525 + ], + [ + 22.731099, + 54.327537 + ], + [ + 23.243987, + 54.220567 + ], + [ + 23.484128, + 53.912498 + ], + [ + 23.527536, + 53.470122 + ], + [ + 23.804935, + 53.089731 + ], + [ + 23.799199, + 52.691099 + ], + [ + 23.199494, + 52.486977 + ], + [ + 23.508002, + 52.023647 + ], + [ + 23.527071, + 51.578454 + ], + [ + 24.029986, + 50.705407 + ], + [ + 23.922757, + 50.424881 + ], + [ + 23.426508, + 50.308506 + ], + [ + 22.51845, + 49.476774 + ], + [ + 22.776419, + 49.027395 + ], + [ + 22.558138, + 49.085738 + ], + [ + 21.607808, + 49.470107 + ], + [ + 20.887955, + 49.328772 + ], + [ + 20.415839, + 49.431453 + ], + [ + 19.825023, + 49.217125 + ], + [ + 19.320713, + 49.571574 + ], + [ + 18.909575, + 49.435846 + ], + [ + 18.853144, + 49.49623 + ], + [ + 18.392914, + 49.988629 + ], + [ + 17.649445, + 50.049038 + ], + [ + 17.554567, + 50.362146 + ], + [ + 16.868769, + 50.473974 + ], + [ + 16.719476, + 50.215747 + ], + [ + 16.176253, + 50.422607 + ], + [ + 16.238627, + 50.697733 + ], + [ + 15.490972, + 50.78473 + ], + [ + 15.016996, + 51.106674 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"PRI", + "properties":{ + "name":"Puerto Rico" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + -66.282434, + 18.514762 + ], + [ + -65.771303, + 18.426679 + ], + [ + -65.591004, + 18.228035 + ], + [ + -65.847164, + 17.975906 + ], + [ + -66.599934, + 17.981823 + ], + [ + -67.184162, + 17.946553 + ], + [ + -67.242428, + 18.37446 + ], + [ + -67.100679, + 18.520601 + ], + [ + -66.282434, + 18.514762 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"PRK", + "properties":{ + "name":"North Korea" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 130.640016, + 42.395009 + ], + [ + 130.780007, + 42.220007 + ], + [ + 130.400031, + 42.280004 + ], + [ + 129.965949, + 41.941368 + ], + [ + 129.667362, + 41.601104 + ], + [ + 129.705189, + 40.882828 + ], + [ + 129.188115, + 40.661808 + ], + [ + 129.0104, + 40.485436 + ], + [ + 128.633368, + 40.189847 + ], + [ + 127.967414, + 40.025413 + ], + [ + 127.533436, + 39.75685 + ], + [ + 127.50212, + 39.323931 + ], + [ + 127.385434, + 39.213472 + ], + [ + 127.783343, + 39.050898 + ], + [ + 128.349716, + 38.612243 + ], + [ + 128.205746, + 38.370397 + ], + [ + 127.780035, + 38.304536 + ], + [ + 127.073309, + 38.256115 + ], + [ + 126.68372, + 37.804773 + ], + [ + 126.237339, + 37.840378 + ], + [ + 126.174759, + 37.749686 + ], + [ + 125.689104, + 37.94001 + ], + [ + 125.568439, + 37.752089 + ], + [ + 125.27533, + 37.669071 + ], + [ + 125.240087, + 37.857224 + ], + [ + 124.981033, + 37.948821 + ], + [ + 124.712161, + 38.108346 + ], + [ + 124.985994, + 38.548474 + ], + [ + 125.221949, + 38.665857 + ], + [ + 125.132859, + 38.848559 + ], + [ + 125.38659, + 39.387958 + ], + [ + 125.321116, + 39.551385 + ], + [ + 124.737482, + 39.660344 + ], + [ + 124.265625, + 39.928493 + ], + [ + 125.079942, + 40.569824 + ], + [ + 126.182045, + 41.107336 + ], + [ + 126.869083, + 41.816569 + ], + [ + 127.343783, + 41.503152 + ], + [ + 128.208433, + 41.466772 + ], + [ + 128.052215, + 41.994285 + ], + [ + 129.596669, + 42.424982 + ], + [ + 129.994267, + 42.985387 + ], + [ + 130.640016, + 42.395009 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"PRT", + "properties":{ + "name":"Portugal" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + -9.034818, + 41.880571 + ], + [ + -8.671946, + 42.134689 + ], + [ + -8.263857, + 42.280469 + ], + [ + -8.013175, + 41.790886 + ], + [ + -7.422513, + 41.792075 + ], + [ + -7.251309, + 41.918346 + ], + [ + -6.668606, + 41.883387 + ], + [ + -6.389088, + 41.381815 + ], + [ + -6.851127, + 41.111083 + ], + [ + -6.86402, + 40.330872 + ], + [ + -7.026413, + 40.184524 + ], + [ + -7.066592, + 39.711892 + ], + [ + -7.498632, + 39.629571 + ], + [ + -7.098037, + 39.030073 + ], + [ + -7.374092, + 38.373059 + ], + [ + -7.029281, + 38.075764 + ], + [ + -7.166508, + 37.803894 + ], + [ + -7.537105, + 37.428904 + ], + [ + -7.453726, + 37.097788 + ], + [ + -7.855613, + 36.838269 + ], + [ + -8.382816, + 36.97888 + ], + [ + -8.898857, + 36.868809 + ], + [ + -8.746101, + 37.651346 + ], + [ + -8.839998, + 38.266243 + ], + [ + -9.287464, + 38.358486 + ], + [ + -9.526571, + 38.737429 + ], + [ + -9.446989, + 39.392066 + ], + [ + -9.048305, + 39.755093 + ], + [ + -8.977353, + 40.159306 + ], + [ + -8.768684, + 40.760639 + ], + [ + -8.790853, + 41.184334 + ], + [ + -8.990789, + 41.543459 + ], + [ + -9.034818, + 41.880571 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"PRY", + "properties":{ + "name":"Paraguay" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + -62.685057, + -22.249029 + ], + [ + -62.291179, + -21.051635 + ], + [ + -62.265961, + -20.513735 + ], + [ + -61.786326, + -19.633737 + ], + [ + -60.043565, + -19.342747 + ], + [ + -59.115042, + -19.356906 + ], + [ + -58.183471, + -19.868399 + ], + [ + -58.166392, + -20.176701 + ], + [ + -57.870674, + -20.732688 + ], + [ + -57.937156, + -22.090176 + ], + [ + -56.88151, + -22.282154 + ], + [ + -56.473317, + -22.0863 + ], + [ + -55.797958, + -22.35693 + ], + [ + -55.610683, + -22.655619 + ], + [ + -55.517639, + -23.571998 + ], + [ + -55.400747, + -23.956935 + ], + [ + -55.027902, + -24.001274 + ], + [ + -54.652834, + -23.839578 + ], + [ + -54.29296, + -24.021014 + ], + [ + -54.293476, + -24.5708 + ], + [ + -54.428946, + -25.162185 + ], + [ + -54.625291, + -25.739255 + ], + [ + -54.788795, + -26.621786 + ], + [ + -55.695846, + -27.387837 + ], + [ + -56.486702, + -27.548499 + ], + [ + -57.60976, + -27.395899 + ], + [ + -58.618174, + -27.123719 + ], + [ + -57.63366, + -25.603657 + ], + [ + -57.777217, + -25.16234 + ], + [ + -58.807128, + -24.771459 + ], + [ + -60.028966, + -24.032796 + ], + [ + -60.846565, + -23.880713 + ], + [ + -62.685057, + -22.249029 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"QAT", + "properties":{ + "name":"Qatar" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 50.810108, + 24.754743 + ], + [ + 50.743911, + 25.482424 + ], + [ + 51.013352, + 26.006992 + ], + [ + 51.286462, + 26.114582 + ], + [ + 51.589079, + 25.801113 + ], + [ + 51.6067, + 25.21567 + ], + [ + 51.389608, + 24.627386 + ], + [ + 51.112415, + 24.556331 + ], + [ + 50.810108, + 24.754743 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"ROU", + "properties":{ + "name":"Romania" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 22.710531, + 47.882194 + ], + [ + 23.142236, + 48.096341 + ], + [ + 23.760958, + 47.985598 + ], + [ + 24.402056, + 47.981878 + ], + [ + 24.866317, + 47.737526 + ], + [ + 25.207743, + 47.891056 + ], + [ + 25.945941, + 47.987149 + ], + [ + 26.19745, + 48.220881 + ], + [ + 26.619337, + 48.220726 + ], + [ + 26.924176, + 48.123264 + ], + [ + 27.233873, + 47.826771 + ], + [ + 27.551166, + 47.405117 + ], + [ + 28.12803, + 46.810476 + ], + [ + 28.160018, + 46.371563 + ], + [ + 28.054443, + 45.944586 + ], + [ + 28.233554, + 45.488283 + ], + [ + 28.679779, + 45.304031 + ], + [ + 29.149725, + 45.464925 + ], + [ + 29.603289, + 45.293308 + ], + [ + 29.626543, + 45.035391 + ], + [ + 29.141612, + 44.82021 + ], + [ + 28.837858, + 44.913874 + ], + [ + 28.558081, + 43.707462 + ], + [ + 27.970107, + 43.812468 + ], + [ + 27.2424, + 44.175986 + ], + [ + 26.065159, + 43.943494 + ], + [ + 25.569272, + 43.688445 + ], + [ + 24.100679, + 43.741051 + ], + [ + 23.332302, + 43.897011 + ], + [ + 22.944832, + 43.823785 + ], + [ + 22.65715, + 44.234923 + ], + [ + 22.474008, + 44.409228 + ], + [ + 22.705726, + 44.578003 + ], + [ + 22.459022, + 44.702517 + ], + [ + 22.145088, + 44.478422 + ], + [ + 21.562023, + 44.768947 + ], + [ + 21.483526, + 45.18117 + ], + [ + 20.874313, + 45.416375 + ], + [ + 20.762175, + 45.734573 + ], + [ + 20.220192, + 46.127469 + ], + [ + 21.021952, + 46.316088 + ], + [ + 21.626515, + 46.994238 + ], + [ + 22.099768, + 47.672439 + ], + [ + 22.710531, + 47.882194 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"RUS", + "properties":{ + "name":"Russia" + }, + "geometry":{ + "type":"MultiPolygon", + "coordinates":[ + [ + [ + [ + 143.648007, + 50.7476 + ], + [ + 144.654148, + 48.976391 + ], + [ + 143.173928, + 49.306551 + ], + [ + 142.558668, + 47.861575 + ], + [ + 143.533492, + 46.836728 + ], + [ + 143.505277, + 46.137908 + ], + [ + 142.747701, + 46.740765 + ], + [ + 142.09203, + 45.966755 + ], + [ + 141.906925, + 46.805929 + ], + [ + 142.018443, + 47.780133 + ], + [ + 141.904445, + 48.859189 + ], + [ + 142.1358, + 49.615163 + ], + [ + 142.179983, + 50.952342 + ], + [ + 141.594076, + 51.935435 + ], + [ + 141.682546, + 53.301966 + ], + [ + 142.606934, + 53.762145 + ], + [ + 142.209749, + 54.225476 + ], + [ + 142.654786, + 54.365881 + ], + [ + 142.914616, + 53.704578 + ], + [ + 143.260848, + 52.74076 + ], + [ + 143.235268, + 51.75666 + ], + [ + 143.648007, + 50.7476 + ] + ] + ], + [ + [ + [ + 22.731099, + 54.327537 + ], + [ + 20.892245, + 54.312525 + ], + [ + 19.66064, + 54.426084 + ], + [ + 19.888481, + 54.86616 + ], + [ + 21.268449, + 55.190482 + ], + [ + 22.315724, + 55.015299 + ], + [ + 22.757764, + 54.856574 + ], + [ + 22.651052, + 54.582741 + ], + [ + 22.731099, + 54.327537 + ] + ] + ], + [ + [ + [ + -175.01425, + 66.58435 + ], + [ + -174.33983, + 66.33556 + ], + [ + -174.57182, + 67.06219 + ], + [ + -171.85731, + 66.91308 + ], + [ + -169.89958, + 65.97724 + ], + [ + -170.89107, + 65.54139 + ], + [ + -172.53025, + 65.43791 + ], + [ + -172.555, + 64.46079 + ], + [ + -172.95533, + 64.25269 + ], + [ + -173.89184, + 64.2826 + ], + [ + -174.65392, + 64.63125 + ], + [ + -175.98353, + 64.92288 + ], + [ + -176.20716, + 65.35667 + ], + [ + -177.22266, + 65.52024 + ], + [ + -178.35993, + 65.39052 + ], + [ + -178.90332, + 65.74044 + ], + [ + -178.68611, + 66.11211 + ], + [ + -179.88377, + 65.87456 + ], + [ + -179.43268, + 65.40411 + ], + [ + -180, + 64.979709 + ], + [ + -180, + 68.963636 + ], + [ + -177.55, + 68.2 + ], + [ + -174.92825, + 67.20589 + ], + [ + -175.01425, + 66.58435 + ] + ] + ], + [ + [ + [ + 180, + 70.832199 + ], + [ + 178.903425, + 70.78114 + ], + [ + 178.7253, + 71.0988 + ], + [ + 180, + 71.515714 + ], + [ + 180, + 70.832199 + ] + ] + ], + [ + [ + [ + -178.69378, + 70.89302 + ], + [ + -180, + 70.832199 + ], + [ + -180, + 71.515714 + ], + [ + -179.871875, + 71.55762 + ], + [ + -179.02433, + 71.55553 + ], + [ + -177.577945, + 71.26948 + ], + [ + -177.663575, + 71.13277 + ], + [ + -178.69378, + 70.89302 + ] + ] + ], + [ + [ + [ + 143.60385, + 73.21244 + ], + [ + 142.08763, + 73.20544 + ], + [ + 140.038155, + 73.31692 + ], + [ + 139.86312, + 73.36983 + ], + [ + 140.81171, + 73.76506 + ], + [ + 142.06207, + 73.85758 + ], + [ + 143.48283, + 73.47525 + ], + [ + 143.60385, + 73.21244 + ] + ] + ], + [ + [ + [ + 150.73167, + 75.08406 + ], + [ + 149.575925, + 74.68892 + ], + [ + 147.977465, + 74.778355 + ], + [ + 146.11919, + 75.17298 + ], + [ + 146.358485, + 75.49682 + ], + [ + 148.22223, + 75.345845 + ], + [ + 150.73167, + 75.08406 + ] + ] + ], + [ + [ + [ + 145.086285, + 75.562625 + ], + [ + 144.3, + 74.82 + ], + [ + 140.61381, + 74.84768 + ], + [ + 138.95544, + 74.61148 + ], + [ + 136.97439, + 75.26167 + ], + [ + 137.51176, + 75.94917 + ], + [ + 138.831075, + 76.13676 + ], + [ + 141.471615, + 76.09289 + ], + [ + 145.086285, + 75.562625 + ] + ] + ], + [ + [ + [ + 57.535693, + 70.720464 + ], + [ + 56.944979, + 70.632743 + ], + [ + 53.677375, + 70.762658 + ], + [ + 53.412017, + 71.206662 + ], + [ + 51.601895, + 71.474759 + ], + [ + 51.455754, + 72.014881 + ], + [ + 52.478275, + 72.229442 + ], + [ + 52.444169, + 72.774731 + ], + [ + 54.427614, + 73.627548 + ], + [ + 53.50829, + 73.749814 + ], + [ + 55.902459, + 74.627486 + ], + [ + 55.631933, + 75.081412 + ], + [ + 57.868644, + 75.60939 + ], + [ + 61.170044, + 76.251883 + ], + [ + 64.498368, + 76.439055 + ], + [ + 66.210977, + 76.809782 + ], + [ + 68.15706, + 76.939697 + ], + [ + 68.852211, + 76.544811 + ], + [ + 68.180573, + 76.233642 + ], + [ + 64.637326, + 75.737755 + ], + [ + 61.583508, + 75.260885 + ], + [ + 58.477082, + 74.309056 + ], + [ + 56.986786, + 73.333044 + ], + [ + 55.419336, + 72.371268 + ], + [ + 55.622838, + 71.540595 + ], + [ + 57.535693, + 70.720464 + ] + ] + ], + [ + [ + [ + 106.97013, + 76.97419 + ], + [ + 107.24, + 76.48 + ], + [ + 108.1538, + 76.72335 + ], + [ + 111.07726, + 76.71 + ], + [ + 113.33151, + 76.22224 + ], + [ + 114.13417, + 75.84764 + ], + [ + 113.88539, + 75.32779 + ], + [ + 112.77918, + 75.03186 + ], + [ + 110.15125, + 74.47673 + ], + [ + 109.4, + 74.18 + ], + [ + 110.64, + 74.04 + ], + [ + 112.11919, + 73.78774 + ], + [ + 113.01954, + 73.97693 + ], + [ + 113.52958, + 73.33505 + ], + [ + 113.96881, + 73.59488 + ], + [ + 115.56782, + 73.75285 + ], + [ + 118.77633, + 73.58772 + ], + [ + 119.02, + 73.12 + ], + [ + 123.20066, + 72.97122 + ], + [ + 123.25777, + 73.73503 + ], + [ + 125.38, + 73.56 + ], + [ + 126.97644, + 73.56549 + ], + [ + 128.59126, + 73.03871 + ], + [ + 129.05157, + 72.39872 + ], + [ + 128.46, + 71.98 + ], + [ + 129.71599, + 71.19304 + ], + [ + 131.28858, + 70.78699 + ], + [ + 132.2535, + 71.8363 + ], + [ + 133.85766, + 71.38642 + ], + [ + 135.56193, + 71.65525 + ], + [ + 137.49755, + 71.34763 + ], + [ + 138.23409, + 71.62803 + ], + [ + 139.86983, + 71.48783 + ], + [ + 139.14791, + 72.41619 + ], + [ + 140.46817, + 72.84941 + ], + [ + 149.5, + 72.2 + ], + [ + 150.35118, + 71.60643 + ], + [ + 152.9689, + 70.84222 + ], + [ + 157.00688, + 71.03141 + ], + [ + 158.99779, + 70.86672 + ], + [ + 159.83031, + 70.45324 + ], + [ + 159.70866, + 69.72198 + ], + [ + 160.94053, + 69.43728 + ], + [ + 162.27907, + 69.64204 + ], + [ + 164.05248, + 69.66823 + ], + [ + 165.94037, + 69.47199 + ], + [ + 167.83567, + 69.58269 + ], + [ + 169.57763, + 68.6938 + ], + [ + 170.81688, + 69.01363 + ], + [ + 170.0082, + 69.65276 + ], + [ + 170.45345, + 70.09703 + ], + [ + 173.64391, + 69.81743 + ], + [ + 175.72403, + 69.87725 + ], + [ + 178.6, + 69.4 + ], + [ + 180, + 68.963636 + ], + [ + 180, + 64.979709 + ], + [ + 179.99281, + 64.97433 + ], + [ + 178.7072, + 64.53493 + ], + [ + 177.41128, + 64.60821 + ], + [ + 178.313, + 64.07593 + ], + [ + 178.90825, + 63.25197 + ], + [ + 179.37034, + 62.98262 + ], + [ + 179.48636, + 62.56894 + ], + [ + 179.22825, + 62.3041 + ], + [ + 177.3643, + 62.5219 + ], + [ + 174.56929, + 61.76915 + ], + [ + 173.68013, + 61.65261 + ], + [ + 172.15, + 60.95 + ], + [ + 170.6985, + 60.33618 + ], + [ + 170.33085, + 59.88177 + ], + [ + 168.90046, + 60.57355 + ], + [ + 166.29498, + 59.78855 + ], + [ + 165.84, + 60.16 + ], + [ + 164.87674, + 59.7316 + ], + [ + 163.53929, + 59.86871 + ], + [ + 163.21711, + 59.21101 + ], + [ + 162.01733, + 58.24328 + ], + [ + 162.05297, + 57.83912 + ], + [ + 163.19191, + 57.61503 + ], + [ + 163.05794, + 56.15924 + ], + [ + 162.12958, + 56.12219 + ], + [ + 161.70146, + 55.28568 + ], + [ + 162.11749, + 54.85514 + ], + [ + 160.36877, + 54.34433 + ], + [ + 160.02173, + 53.20257 + ], + [ + 158.53094, + 52.95868 + ], + [ + 158.23118, + 51.94269 + ], + [ + 156.78979, + 51.01105 + ], + [ + 156.42, + 51.7 + ], + [ + 155.99182, + 53.15895 + ], + [ + 155.43366, + 55.38103 + ], + [ + 155.91442, + 56.76792 + ], + [ + 156.75815, + 57.3647 + ], + [ + 156.81035, + 57.83204 + ], + [ + 158.36433, + 58.05575 + ], + [ + 160.15064, + 59.31477 + ], + [ + 161.87204, + 60.343 + ], + [ + 163.66969, + 61.1409 + ], + [ + 164.47355, + 62.55061 + ], + [ + 163.25842, + 62.46627 + ], + [ + 162.65791, + 61.6425 + ], + [ + 160.12148, + 60.54423 + ], + [ + 159.30232, + 61.77396 + ], + [ + 156.72068, + 61.43442 + ], + [ + 154.21806, + 59.75818 + ], + [ + 155.04375, + 59.14495 + ], + [ + 152.81185, + 58.88385 + ], + [ + 151.26573, + 58.78089 + ], + [ + 151.33815, + 59.50396 + ], + [ + 149.78371, + 59.65573 + ], + [ + 148.54481, + 59.16448 + ], + [ + 145.48722, + 59.33637 + ], + [ + 142.19782, + 59.03998 + ], + [ + 138.95848, + 57.08805 + ], + [ + 135.12619, + 54.72959 + ], + [ + 136.70171, + 54.60355 + ], + [ + 137.19342, + 53.97732 + ], + [ + 138.1647, + 53.75501 + ], + [ + 138.80463, + 54.25455 + ], + [ + 139.90151, + 54.18968 + ], + [ + 141.34531, + 53.08957 + ], + [ + 141.37923, + 52.23877 + ], + [ + 140.59742, + 51.23967 + ], + [ + 140.51308, + 50.04553 + ], + [ + 140.06193, + 48.44671 + ], + [ + 138.55472, + 46.99965 + ], + [ + 138.21971, + 46.30795 + ], + [ + 136.86232, + 45.1435 + ], + [ + 135.51535, + 43.989 + ], + [ + 134.86939, + 43.39821 + ], + [ + 133.53687, + 42.81147 + ], + [ + 132.90627, + 42.79849 + ], + [ + 132.27807, + 43.28456 + ], + [ + 130.93587, + 42.55274 + ], + [ + 130.78, + 42.22 + ], + [ + 130.64, + 42.395 + ], + [ + 130.633866, + 42.903015 + ], + [ + 131.144688, + 42.92999 + ], + [ + 131.288555, + 44.11152 + ], + [ + 131.02519, + 44.96796 + ], + [ + 131.883454, + 45.321162 + ], + [ + 133.09712, + 45.14409 + ], + [ + 133.769644, + 46.116927 + ], + [ + 134.11235, + 47.21248 + ], + [ + 134.50081, + 47.57845 + ], + [ + 135.026311, + 48.47823 + ], + [ + 133.373596, + 48.183442 + ], + [ + 132.50669, + 47.78896 + ], + [ + 130.98726, + 47.79013 + ], + [ + 130.582293, + 48.729687 + ], + [ + 129.397818, + 49.4406 + ], + [ + 127.6574, + 49.76027 + ], + [ + 127.287456, + 50.739797 + ], + [ + 126.939157, + 51.353894 + ], + [ + 126.564399, + 51.784255 + ], + [ + 125.946349, + 52.792799 + ], + [ + 125.068211, + 53.161045 + ], + [ + 123.57147, + 53.4588 + ], + [ + 122.245748, + 53.431726 + ], + [ + 121.003085, + 53.251401 + ], + [ + 120.177089, + 52.753886 + ], + [ + 120.725789, + 52.516226 + ], + [ + 120.7382, + 51.96411 + ], + [ + 120.18208, + 51.64355 + ], + [ + 119.27939, + 50.58292 + ], + [ + 119.288461, + 50.142883 + ], + [ + 117.879244, + 49.510983 + ], + [ + 116.678801, + 49.888531 + ], + [ + 115.485695, + 49.805177 + ], + [ + 114.96211, + 50.140247 + ], + [ + 114.362456, + 50.248303 + ], + [ + 112.89774, + 49.543565 + ], + [ + 111.581231, + 49.377968 + ], + [ + 110.662011, + 49.130128 + ], + [ + 109.402449, + 49.292961 + ], + [ + 108.475167, + 49.282548 + ], + [ + 107.868176, + 49.793705 + ], + [ + 106.888804, + 50.274296 + ], + [ + 105.886591, + 50.406019 + ], + [ + 104.62158, + 50.27532 + ], + [ + 103.676545, + 50.089966 + ], + [ + 102.25589, + 50.51056 + ], + [ + 102.06521, + 51.25991 + ], + [ + 100.88948, + 51.516856 + ], + [ + 99.981732, + 51.634006 + ], + [ + 98.861491, + 52.047366 + ], + [ + 97.82574, + 51.010995 + ], + [ + 98.231762, + 50.422401 + ], + [ + 97.25976, + 49.72605 + ], + [ + 95.81402, + 49.97746 + ], + [ + 94.815949, + 50.013433 + ], + [ + 94.147566, + 50.480537 + ], + [ + 93.10421, + 50.49529 + ], + [ + 92.234712, + 50.802171 + ], + [ + 90.713667, + 50.331812 + ], + [ + 88.805567, + 49.470521 + ], + [ + 87.751264, + 49.297198 + ], + [ + 87.35997, + 49.214981 + ], + [ + 86.829357, + 49.826675 + ], + [ + 85.54127, + 49.692859 + ], + [ + 85.11556, + 50.117303 + ], + [ + 84.416377, + 50.3114 + ], + [ + 83.935115, + 50.889246 + ], + [ + 83.383004, + 51.069183 + ], + [ + 81.945986, + 50.812196 + ], + [ + 80.568447, + 51.388336 + ], + [ + 80.03556, + 50.864751 + ], + [ + 77.800916, + 53.404415 + ], + [ + 76.525179, + 54.177003 + ], + [ + 76.8911, + 54.490524 + ], + [ + 74.38482, + 53.54685 + ], + [ + 73.425679, + 53.48981 + ], + [ + 73.508516, + 54.035617 + ], + [ + 72.22415, + 54.376655 + ], + [ + 71.180131, + 54.133285 + ], + [ + 70.865267, + 55.169734 + ], + [ + 69.068167, + 55.38525 + ], + [ + 68.1691, + 54.970392 + ], + [ + 65.66687, + 54.60125 + ], + [ + 65.178534, + 54.354228 + ], + [ + 61.4366, + 54.00625 + ], + [ + 60.978066, + 53.664993 + ], + [ + 61.699986, + 52.979996 + ], + [ + 60.739993, + 52.719986 + ], + [ + 60.927269, + 52.447548 + ], + [ + 59.967534, + 51.96042 + ], + [ + 61.588003, + 51.272659 + ], + [ + 61.337424, + 50.79907 + ], + [ + 59.932807, + 50.842194 + ], + [ + 59.642282, + 50.545442 + ], + [ + 58.36332, + 51.06364 + ], + [ + 56.77798, + 51.04355 + ], + [ + 55.71694, + 50.62171 + ], + [ + 54.532878, + 51.02624 + ], + [ + 52.328724, + 51.718652 + ], + [ + 50.766648, + 51.692762 + ], + [ + 48.702382, + 50.605128 + ], + [ + 48.577841, + 49.87476 + ], + [ + 47.54948, + 50.454698 + ], + [ + 46.751596, + 49.356006 + ], + [ + 47.043672, + 49.152039 + ], + [ + 46.466446, + 48.394152 + ], + [ + 47.31524, + 47.71585 + ], + [ + 48.05725, + 47.74377 + ], + [ + 48.694734, + 47.075628 + ], + [ + 48.59325, + 46.56104 + ], + [ + 49.10116, + 46.39933 + ], + [ + 48.64541, + 45.80629 + ], + [ + 47.67591, + 45.64149 + ], + [ + 46.68201, + 44.6092 + ], + [ + 47.59094, + 43.66016 + ], + [ + 47.49252, + 42.98658 + ], + [ + 48.58437, + 41.80888 + ], + [ + 47.987283, + 41.405819 + ], + [ + 47.815666, + 41.151416 + ], + [ + 47.373315, + 41.219732 + ], + [ + 46.686071, + 41.827137 + ], + [ + 46.404951, + 41.860675 + ], + [ + 45.7764, + 42.09244 + ], + [ + 45.470279, + 42.502781 + ], + [ + 44.537623, + 42.711993 + ], + [ + 43.93121, + 42.55496 + ], + [ + 43.75599, + 42.74083 + ], + [ + 42.3944, + 43.2203 + ], + [ + 40.92219, + 43.38215 + ], + [ + 40.076965, + 43.553104 + ], + [ + 39.955009, + 43.434998 + ], + [ + 38.68, + 44.28 + ], + [ + 37.53912, + 44.65721 + ], + [ + 36.67546, + 45.24469 + ], + [ + 37.40317, + 45.40451 + ], + [ + 38.23295, + 46.24087 + ], + [ + 37.67372, + 46.63657 + ], + [ + 39.14767, + 47.04475 + ], + [ + 39.1212, + 47.26336 + ], + [ + 38.223538, + 47.10219 + ], + [ + 38.255112, + 47.5464 + ], + [ + 38.77057, + 47.82562 + ], + [ + 39.738278, + 47.898937 + ], + [ + 39.89562, + 48.23241 + ], + [ + 39.67465, + 48.78382 + ], + [ + 40.080789, + 49.30743 + ], + [ + 40.06904, + 49.60105 + ], + [ + 38.594988, + 49.926462 + ], + [ + 38.010631, + 49.915662 + ], + [ + 37.39346, + 50.383953 + ], + [ + 36.626168, + 50.225591 + ], + [ + 35.356116, + 50.577197 + ], + [ + 35.37791, + 50.77394 + ], + [ + 35.022183, + 51.207572 + ], + [ + 34.224816, + 51.255993 + ], + [ + 34.141978, + 51.566413 + ], + [ + 34.391731, + 51.768882 + ], + [ + 33.7527, + 52.335075 + ], + [ + 32.715761, + 52.238465 + ], + [ + 32.412058, + 52.288695 + ], + [ + 32.15944, + 52.06125 + ], + [ + 31.78597, + 52.10168 + ], + [ + 31.540018, + 52.742052 + ], + [ + 31.305201, + 53.073996 + ], + [ + 31.49764, + 53.16743 + ], + [ + 32.304519, + 53.132726 + ], + [ + 32.693643, + 53.351421 + ], + [ + 32.405599, + 53.618045 + ], + [ + 31.731273, + 53.794029 + ], + [ + 31.791424, + 53.974639 + ], + [ + 31.384472, + 54.157056 + ], + [ + 30.757534, + 54.811771 + ], + [ + 30.971836, + 55.081548 + ], + [ + 30.873909, + 55.550976 + ], + [ + 29.896294, + 55.789463 + ], + [ + 29.371572, + 55.670091 + ], + [ + 29.229513, + 55.918344 + ], + [ + 28.176709, + 56.16913 + ], + [ + 27.855282, + 56.759326 + ], + [ + 27.770016, + 57.244258 + ], + [ + 27.288185, + 57.474528 + ], + [ + 27.716686, + 57.791899 + ], + [ + 27.42015, + 58.72457 + ], + [ + 28.131699, + 59.300825 + ], + [ + 27.98112, + 59.47537 + ], + [ + 29.1177, + 60.02805 + ], + [ + 28.07, + 60.50352 + ], + [ + 30.211107, + 61.780028 + ], + [ + 31.139991, + 62.357693 + ], + [ + 31.516092, + 62.867687 + ], + [ + 30.035872, + 63.552814 + ], + [ + 30.444685, + 64.204453 + ], + [ + 29.54443, + 64.948672 + ], + [ + 30.21765, + 65.80598 + ], + [ + 29.054589, + 66.944286 + ], + [ + 29.977426, + 67.698297 + ], + [ + 28.445944, + 68.364613 + ], + [ + 28.59193, + 69.064777 + ], + [ + 29.39955, + 69.15692 + ], + [ + 31.10108, + 69.55811 + ], + [ + 32.13272, + 69.90595 + ], + [ + 33.77547, + 69.30142 + ], + [ + 36.51396, + 69.06342 + ], + [ + 40.29234, + 67.9324 + ], + [ + 41.05987, + 67.45713 + ], + [ + 41.12595, + 66.79158 + ], + [ + 40.01583, + 66.26618 + ], + [ + 38.38295, + 65.99953 + ], + [ + 33.91871, + 66.75961 + ], + [ + 33.18444, + 66.63253 + ], + [ + 34.81477, + 65.90015 + ], + [ + 34.878574, + 65.436213 + ], + [ + 34.94391, + 64.41437 + ], + [ + 36.23129, + 64.10945 + ], + [ + 37.01273, + 63.84983 + ], + [ + 37.14197, + 64.33471 + ], + [ + 36.539579, + 64.76446 + ], + [ + 37.17604, + 65.14322 + ], + [ + 39.59345, + 64.52079 + ], + [ + 40.4356, + 64.76446 + ], + [ + 39.7626, + 65.49682 + ], + [ + 42.09309, + 66.47623 + ], + [ + 43.01604, + 66.41858 + ], + [ + 43.94975, + 66.06908 + ], + [ + 44.53226, + 66.75634 + ], + [ + 43.69839, + 67.35245 + ], + [ + 44.18795, + 67.95051 + ], + [ + 43.45282, + 68.57079 + ], + [ + 46.25, + 68.25 + ], + [ + 46.82134, + 67.68997 + ], + [ + 45.55517, + 67.56652 + ], + [ + 45.56202, + 67.01005 + ], + [ + 46.34915, + 66.66767 + ], + [ + 47.89416, + 66.88455 + ], + [ + 48.13876, + 67.52238 + ], + [ + 50.22766, + 67.99867 + ], + [ + 53.71743, + 68.85738 + ], + [ + 54.47171, + 68.80815 + ], + [ + 53.48582, + 68.20131 + ], + [ + 54.72628, + 68.09702 + ], + [ + 55.44268, + 68.43866 + ], + [ + 57.31702, + 68.46628 + ], + [ + 58.802, + 68.88082 + ], + [ + 59.94142, + 68.27844 + ], + [ + 61.07784, + 68.94069 + ], + [ + 60.03, + 69.52 + ], + [ + 60.55, + 69.85 + ], + [ + 63.504, + 69.54739 + ], + [ + 64.888115, + 69.234835 + ], + [ + 68.51216, + 68.09233 + ], + [ + 69.18068, + 68.61563 + ], + [ + 68.16444, + 69.14436 + ], + [ + 68.13522, + 69.35649 + ], + [ + 66.93008, + 69.45461 + ], + [ + 67.25976, + 69.92873 + ], + [ + 66.72492, + 70.70889 + ], + [ + 66.69466, + 71.02897 + ], + [ + 68.54006, + 71.9345 + ], + [ + 69.19636, + 72.84336 + ], + [ + 69.94, + 73.04 + ], + [ + 72.58754, + 72.77629 + ], + [ + 72.79603, + 72.22006 + ], + [ + 71.84811, + 71.40898 + ], + [ + 72.47011, + 71.09019 + ], + [ + 72.79188, + 70.39114 + ], + [ + 72.5647, + 69.02085 + ], + [ + 73.66787, + 68.4079 + ], + [ + 73.2387, + 67.7404 + ], + [ + 71.28, + 66.32 + ], + [ + 72.42301, + 66.17267 + ], + [ + 72.82077, + 66.53267 + ], + [ + 73.92099, + 66.78946 + ], + [ + 74.18651, + 67.28429 + ], + [ + 75.052, + 67.76047 + ], + [ + 74.46926, + 68.32899 + ], + [ + 74.93584, + 68.98918 + ], + [ + 73.84236, + 69.07146 + ], + [ + 73.60187, + 69.62763 + ], + [ + 74.3998, + 70.63175 + ], + [ + 73.1011, + 71.44717 + ], + [ + 74.89082, + 72.12119 + ], + [ + 74.65926, + 72.83227 + ], + [ + 75.15801, + 72.85497 + ], + [ + 75.68351, + 72.30056 + ], + [ + 75.28898, + 71.33556 + ], + [ + 76.35911, + 71.15287 + ], + [ + 75.90313, + 71.87401 + ], + [ + 77.57665, + 72.26717 + ], + [ + 79.65202, + 72.32011 + ], + [ + 81.5, + 71.75 + ], + [ + 80.61071, + 72.58285 + ], + [ + 80.51109, + 73.6482 + ], + [ + 82.25, + 73.85 + ], + [ + 84.65526, + 73.80591 + ], + [ + 86.8223, + 73.93688 + ], + [ + 86.00956, + 74.45967 + ], + [ + 87.16682, + 75.11643 + ], + [ + 88.31571, + 75.14393 + ], + [ + 90.26, + 75.64 + ], + [ + 92.90058, + 75.77333 + ], + [ + 93.23421, + 76.0472 + ], + [ + 95.86, + 76.14 + ], + [ + 96.67821, + 75.91548 + ], + [ + 98.92254, + 76.44689 + ], + [ + 100.75967, + 76.43028 + ], + [ + 101.03532, + 76.86189 + ], + [ + 101.99084, + 77.28754 + ], + [ + 104.3516, + 77.69792 + ], + [ + 106.06664, + 77.37389 + ], + [ + 104.705, + 77.1274 + ], + [ + 106.97013, + 76.97419 + ] + ] + ], + [ + [ + [ + 105.07547, + 78.30689 + ], + [ + 99.43814, + 77.921 + ], + [ + 101.2649, + 79.23399 + ], + [ + 102.08635, + 79.34641 + ], + [ + 102.837815, + 79.28129 + ], + [ + 105.37243, + 78.71334 + ], + [ + 105.07547, + 78.30689 + ] + ] + ], + [ + [ + [ + 51.136187, + 80.54728 + ], + [ + 49.793685, + 80.415428 + ], + [ + 48.894411, + 80.339567 + ], + [ + 48.754937, + 80.175468 + ], + [ + 47.586119, + 80.010181 + ], + [ + 46.502826, + 80.247247 + ], + [ + 47.072455, + 80.559424 + ], + [ + 44.846958, + 80.58981 + ], + [ + 46.799139, + 80.771918 + ], + [ + 48.318477, + 80.78401 + ], + [ + 48.522806, + 80.514569 + ], + [ + 49.09719, + 80.753986 + ], + [ + 50.039768, + 80.918885 + ], + [ + 51.522933, + 80.699726 + ], + [ + 51.136187, + 80.54728 + ] + ] + ], + [ + [ + [ + 99.93976, + 78.88094 + ], + [ + 97.75794, + 78.7562 + ], + [ + 94.97259, + 79.044745 + ], + [ + 93.31288, + 79.4265 + ], + [ + 92.5454, + 80.14379 + ], + [ + 91.18107, + 80.34146 + ], + [ + 93.77766, + 81.0246 + ], + [ + 95.940895, + 81.2504 + ], + [ + 97.88385, + 80.746975 + ], + [ + 100.186655, + 79.780135 + ], + [ + 99.93976, + 78.88094 + ] + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"RWA", + "properties":{ + "name":"Rwanda" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 30.419105, + -1.134659 + ], + [ + 30.816135, + -1.698914 + ], + [ + 30.758309, + -2.28725 + ], + [ + 30.469696, + -2.413858 + ], + [ + 29.938359, + -2.348487 + ], + [ + 29.632176, + -2.917858 + ], + [ + 29.024926, + -2.839258 + ], + [ + 29.117479, + -2.292211 + ], + [ + 29.254835, + -2.21511 + ], + [ + 29.291887, + -1.620056 + ], + [ + 29.579466, + -1.341313 + ], + [ + 29.821519, + -1.443322 + ], + [ + 30.419105, + -1.134659 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"ESH", + "properties":{ + "name":"Western Sahara" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + -8.794884, + 27.120696 + ], + [ + -8.817828, + 27.656426 + ], + [ + -8.66559, + 27.656426 + ], + [ + -8.665124, + 27.589479 + ], + [ + -8.6844, + 27.395744 + ], + [ + -8.687294, + 25.881056 + ], + [ + -11.969419, + 25.933353 + ], + [ + -11.937224, + 23.374594 + ], + [ + -12.874222, + 23.284832 + ], + [ + -13.118754, + 22.77122 + ], + [ + -12.929102, + 21.327071 + ], + [ + -16.845194, + 21.333323 + ], + [ + -17.063423, + 20.999752 + ], + [ + -17.020428, + 21.42231 + ], + [ + -17.002962, + 21.420734 + ], + [ + -14.750955, + 21.5006 + ], + [ + -14.630833, + 21.86094 + ], + [ + -14.221168, + 22.310163 + ], + [ + -13.89111, + 23.691009 + ], + [ + -12.500963, + 24.770116 + ], + [ + -12.030759, + 26.030866 + ], + [ + -11.71822, + 26.104092 + ], + [ + -11.392555, + 26.883424 + ], + [ + -10.551263, + 26.990808 + ], + [ + -10.189424, + 26.860945 + ], + [ + -9.735343, + 26.860945 + ], + [ + -9.413037, + 27.088476 + ], + [ + -8.794884, + 27.120696 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"SAU", + "properties":{ + "name":"Saudi Arabia" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 42.779332, + 16.347891 + ], + [ + 42.649573, + 16.774635 + ], + [ + 42.347989, + 17.075806 + ], + [ + 42.270888, + 17.474722 + ], + [ + 41.754382, + 17.833046 + ], + [ + 41.221391, + 18.6716 + ], + [ + 40.939341, + 19.486485 + ], + [ + 40.247652, + 20.174635 + ], + [ + 39.801685, + 20.338862 + ], + [ + 39.139399, + 21.291905 + ], + [ + 39.023696, + 21.986875 + ], + [ + 39.066329, + 22.579656 + ], + [ + 38.492772, + 23.688451 + ], + [ + 38.02386, + 24.078686 + ], + [ + 37.483635, + 24.285495 + ], + [ + 37.154818, + 24.858483 + ], + [ + 37.209491, + 25.084542 + ], + [ + 36.931627, + 25.602959 + ], + [ + 36.639604, + 25.826228 + ], + [ + 36.249137, + 26.570136 + ], + [ + 35.640182, + 27.37652 + ], + [ + 35.130187, + 28.063352 + ], + [ + 34.632336, + 28.058546 + ], + [ + 34.787779, + 28.607427 + ], + [ + 34.83222, + 28.957483 + ], + [ + 34.956037, + 29.356555 + ], + [ + 36.068941, + 29.197495 + ], + [ + 36.501214, + 29.505254 + ], + [ + 36.740528, + 29.865283 + ], + [ + 37.503582, + 30.003776 + ], + [ + 37.66812, + 30.338665 + ], + [ + 37.998849, + 30.5085 + ], + [ + 37.002166, + 31.508413 + ], + [ + 39.004886, + 32.010217 + ], + [ + 39.195468, + 32.161009 + ], + [ + 40.399994, + 31.889992 + ], + [ + 41.889981, + 31.190009 + ], + [ + 44.709499, + 29.178891 + ], + [ + 46.568713, + 29.099025 + ], + [ + 47.459822, + 29.002519 + ], + [ + 47.708851, + 28.526063 + ], + [ + 48.416094, + 28.552004 + ], + [ + 48.807595, + 27.689628 + ], + [ + 49.299554, + 27.461218 + ], + [ + 49.470914, + 27.109999 + ], + [ + 50.152422, + 26.689663 + ], + [ + 50.212935, + 26.277027 + ], + [ + 50.113303, + 25.943972 + ], + [ + 50.239859, + 25.60805 + ], + [ + 50.527387, + 25.327808 + ], + [ + 50.660557, + 24.999896 + ], + [ + 50.810108, + 24.754743 + ], + [ + 51.112415, + 24.556331 + ], + [ + 51.389608, + 24.627386 + ], + [ + 51.579519, + 24.245497 + ], + [ + 51.617708, + 24.014219 + ], + [ + 52.000733, + 23.001154 + ], + [ + 55.006803, + 22.496948 + ], + [ + 55.208341, + 22.70833 + ], + [ + 55.666659, + 22.000001 + ], + [ + 54.999982, + 19.999994 + ], + [ + 52.00001, + 19.000003 + ], + [ + 49.116672, + 18.616668 + ], + [ + 48.183344, + 18.166669 + ], + [ + 47.466695, + 17.116682 + ], + [ + 47.000005, + 16.949999 + ], + [ + 46.749994, + 17.283338 + ], + [ + 46.366659, + 17.233315 + ], + [ + 45.399999, + 17.333335 + ], + [ + 45.216651, + 17.433329 + ], + [ + 44.062613, + 17.410359 + ], + [ + 43.791519, + 17.319977 + ], + [ + 43.380794, + 17.579987 + ], + [ + 43.115798, + 17.08844 + ], + [ + 43.218375, + 16.66689 + ], + [ + 42.779332, + 16.347891 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"SDN", + "properties":{ + "name":"Sudan" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 33.963393, + 9.464285 + ], + [ + 33.824963, + 9.484061 + ], + [ + 33.842131, + 9.981915 + ], + [ + 33.721959, + 10.325262 + ], + [ + 33.206938, + 10.720112 + ], + [ + 33.086766, + 11.441141 + ], + [ + 33.206938, + 12.179338 + ], + [ + 32.743419, + 12.248008 + ], + [ + 32.67475, + 12.024832 + ], + [ + 32.073892, + 11.97333 + ], + [ + 32.314235, + 11.681484 + ], + [ + 32.400072, + 11.080626 + ], + [ + 31.850716, + 10.531271 + ], + [ + 31.352862, + 9.810241 + ], + [ + 30.837841, + 9.707237 + ], + [ + 29.996639, + 10.290927 + ], + [ + 29.618957, + 10.084919 + ], + [ + 29.515953, + 9.793074 + ], + [ + 29.000932, + 9.604232 + ], + [ + 28.966597, + 9.398224 + ], + [ + 27.97089, + 9.398224 + ], + [ + 27.833551, + 9.604232 + ], + [ + 27.112521, + 9.638567 + ], + [ + 26.752006, + 9.466893 + ], + [ + 26.477328, + 9.55273 + ], + [ + 25.962307, + 10.136421 + ], + [ + 25.790633, + 10.411099 + ], + [ + 25.069604, + 10.27376 + ], + [ + 24.794926, + 9.810241 + ], + [ + 24.537415, + 8.917538 + ], + [ + 24.194068, + 8.728696 + ], + [ + 23.88698, + 8.61973 + ], + [ + 23.805813, + 8.666319 + ], + [ + 23.459013, + 8.954286 + ], + [ + 23.394779, + 9.265068 + ], + [ + 23.55725, + 9.681218 + ], + [ + 23.554304, + 10.089255 + ], + [ + 22.977544, + 10.714463 + ], + [ + 22.864165, + 11.142395 + ], + [ + 22.87622, + 11.38461 + ], + [ + 22.50869, + 11.67936 + ], + [ + 22.49762, + 12.26024 + ], + [ + 22.28801, + 12.64605 + ], + [ + 21.93681, + 12.58818 + ], + [ + 22.03759, + 12.95546 + ], + [ + 22.29658, + 13.37232 + ], + [ + 22.18329, + 13.78648 + ], + [ + 22.51202, + 14.09318 + ], + [ + 22.30351, + 14.32682 + ], + [ + 22.56795, + 14.94429 + ], + [ + 23.02459, + 15.68072 + ], + [ + 23.88689, + 15.61084 + ], + [ + 23.83766, + 19.58047 + ], + [ + 23.85, + 20 + ], + [ + 25, + 20.00304 + ], + [ + 25, + 22 + ], + [ + 29.02, + 22 + ], + [ + 32.9, + 22 + ], + [ + 36.86623, + 22 + ], + [ + 37.18872, + 21.01885 + ], + [ + 36.96941, + 20.83744 + ], + [ + 37.1147, + 19.80796 + ], + [ + 37.48179, + 18.61409 + ], + [ + 37.86276, + 18.36786 + ], + [ + 38.41009, + 17.998307 + ], + [ + 37.904, + 17.42754 + ], + [ + 37.16747, + 17.26314 + ], + [ + 36.85253, + 16.95655 + ], + [ + 36.75389, + 16.29186 + ], + [ + 36.32322, + 14.82249 + ], + [ + 36.42951, + 14.42211 + ], + [ + 36.27022, + 13.56333 + ], + [ + 35.86363, + 12.57828 + ], + [ + 35.26049, + 12.08286 + ], + [ + 34.83163, + 11.31896 + ], + [ + 34.73115, + 10.91017 + ], + [ + 34.25745, + 10.63009 + ], + [ + 33.96162, + 9.58358 + ], + [ + 33.963393, + 9.464285 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"SSD", + "properties":{ + "name":"South Sudan" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 33.963393, + 9.464285 + ], + [ + 33.97498, + 8.68456 + ], + [ + 33.8255, + 8.37916 + ], + [ + 33.2948, + 8.35458 + ], + [ + 32.95418, + 7.78497 + ], + [ + 33.56829, + 7.71334 + ], + [ + 34.0751, + 7.22595 + ], + [ + 34.25032, + 6.82607 + ], + [ + 34.70702, + 6.59422 + ], + [ + 35.298007, + 5.506 + ], + [ + 34.620196, + 4.847123 + ], + [ + 34.005, + 4.249885 + ], + [ + 33.39, + 3.79 + ], + [ + 32.68642, + 3.79232 + ], + [ + 31.88145, + 3.55827 + ], + [ + 31.24556, + 3.7819 + ], + [ + 30.83385, + 3.50917 + ], + [ + 29.95349, + 4.1737 + ], + [ + 29.715995, + 4.600805 + ], + [ + 29.159078, + 4.389267 + ], + [ + 28.696678, + 4.455077 + ], + [ + 28.428994, + 4.287155 + ], + [ + 27.979977, + 4.408413 + ], + [ + 27.374226, + 5.233944 + ], + [ + 27.213409, + 5.550953 + ], + [ + 26.465909, + 5.946717 + ], + [ + 26.213418, + 6.546603 + ], + [ + 25.796648, + 6.979316 + ], + [ + 25.124131, + 7.500085 + ], + [ + 25.114932, + 7.825104 + ], + [ + 24.567369, + 8.229188 + ], + [ + 23.88698, + 8.61973 + ], + [ + 24.194068, + 8.728696 + ], + [ + 24.537415, + 8.917538 + ], + [ + 24.794926, + 9.810241 + ], + [ + 25.069604, + 10.27376 + ], + [ + 25.790633, + 10.411099 + ], + [ + 25.962307, + 10.136421 + ], + [ + 26.477328, + 9.55273 + ], + [ + 26.752006, + 9.466893 + ], + [ + 27.112521, + 9.638567 + ], + [ + 27.833551, + 9.604232 + ], + [ + 27.97089, + 9.398224 + ], + [ + 28.966597, + 9.398224 + ], + [ + 29.000932, + 9.604232 + ], + [ + 29.515953, + 9.793074 + ], + [ + 29.618957, + 10.084919 + ], + [ + 29.996639, + 10.290927 + ], + [ + 30.837841, + 9.707237 + ], + [ + 31.352862, + 9.810241 + ], + [ + 31.850716, + 10.531271 + ], + [ + 32.400072, + 11.080626 + ], + [ + 32.314235, + 11.681484 + ], + [ + 32.073892, + 11.97333 + ], + [ + 32.67475, + 12.024832 + ], + [ + 32.743419, + 12.248008 + ], + [ + 33.206938, + 12.179338 + ], + [ + 33.086766, + 11.441141 + ], + [ + 33.206938, + 10.720112 + ], + [ + 33.721959, + 10.325262 + ], + [ + 33.842131, + 9.981915 + ], + [ + 33.824963, + 9.484061 + ], + [ + 33.963393, + 9.464285 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"SEN", + "properties":{ + "name":"Senegal" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + -16.713729, + 13.594959 + ], + [ + -17.126107, + 14.373516 + ], + [ + -17.625043, + 14.729541 + ], + [ + -17.185173, + 14.919477 + ], + [ + -16.700706, + 15.621527 + ], + [ + -16.463098, + 16.135036 + ], + [ + -16.12069, + 16.455663 + ], + [ + -15.623666, + 16.369337 + ], + [ + -15.135737, + 16.587282 + ], + [ + -14.577348, + 16.598264 + ], + [ + -14.099521, + 16.304302 + ], + [ + -13.435738, + 16.039383 + ], + [ + -12.830658, + 15.303692 + ], + [ + -12.17075, + 14.616834 + ], + [ + -12.124887, + 13.994727 + ], + [ + -11.927716, + 13.422075 + ], + [ + -11.553398, + 13.141214 + ], + [ + -11.467899, + 12.754519 + ], + [ + -11.513943, + 12.442988 + ], + [ + -11.658301, + 12.386583 + ], + [ + -12.203565, + 12.465648 + ], + [ + -12.278599, + 12.35444 + ], + [ + -12.499051, + 12.33209 + ], + [ + -13.217818, + 12.575874 + ], + [ + -13.700476, + 12.586183 + ], + [ + -15.548477, + 12.62817 + ], + [ + -15.816574, + 12.515567 + ], + [ + -16.147717, + 12.547762 + ], + [ + -16.677452, + 12.384852 + ], + [ + -16.841525, + 13.151394 + ], + [ + -15.931296, + 13.130284 + ], + [ + -15.691001, + 13.270353 + ], + [ + -15.511813, + 13.27857 + ], + [ + -15.141163, + 13.509512 + ], + [ + -14.712197, + 13.298207 + ], + [ + -14.277702, + 13.280585 + ], + [ + -13.844963, + 13.505042 + ], + [ + -14.046992, + 13.794068 + ], + [ + -14.376714, + 13.62568 + ], + [ + -14.687031, + 13.630357 + ], + [ + -15.081735, + 13.876492 + ], + [ + -15.39877, + 13.860369 + ], + [ + -15.624596, + 13.623587 + ], + [ + -16.713729, + 13.594959 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"SLB", + "properties":{ + "name":"Solomon Islands" + }, + "geometry":{ + "type":"MultiPolygon", + "coordinates":[ + [ + [ + [ + 162.119025, + -10.482719 + ], + [ + 162.398646, + -10.826367 + ], + [ + 161.700032, + -10.820011 + ], + [ + 161.319797, + -10.204751 + ], + [ + 161.917383, + -10.446701 + ], + [ + 162.119025, + -10.482719 + ] + ] + ], + [ + [ + [ + 160.852229, + -9.872937 + ], + [ + 160.462588, + -9.89521 + ], + [ + 159.849447, + -9.794027 + ], + [ + 159.640003, + -9.63998 + ], + [ + 159.702945, + -9.24295 + ], + [ + 160.362956, + -9.400304 + ], + [ + 160.688518, + -9.610162 + ], + [ + 160.852229, + -9.872937 + ] + ] + ], + [ + [ + [ + 161.679982, + -9.599982 + ], + [ + 161.529397, + -9.784312 + ], + [ + 160.788253, + -8.917543 + ], + [ + 160.579997, + -8.320009 + ], + [ + 160.920028, + -8.320009 + ], + [ + 161.280006, + -9.120011 + ], + [ + 161.679982, + -9.599982 + ] + ] + ], + [ + [ + [ + 159.875027, + -8.33732 + ], + [ + 159.917402, + -8.53829 + ], + [ + 159.133677, + -8.114181 + ], + [ + 158.586114, + -7.754824 + ], + [ + 158.21115, + -7.421872 + ], + [ + 158.359978, + -7.320018 + ], + [ + 158.820001, + -7.560003 + ], + [ + 159.640003, + -8.020027 + ], + [ + 159.875027, + -8.33732 + ] + ] + ], + [ + [ + [ + 157.538426, + -7.34782 + ], + [ + 157.33942, + -7.404767 + ], + [ + 156.90203, + -7.176874 + ], + [ + 156.491358, + -6.765943 + ], + [ + 156.542828, + -6.599338 + ], + [ + 157.14, + -7.021638 + ], + [ + 157.538426, + -7.34782 + ] + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"SLE", + "properties":{ + "name":"Sierra Leone" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + -11.438779, + 6.785917 + ], + [ + -11.708195, + 6.860098 + ], + [ + -12.428099, + 7.262942 + ], + [ + -12.949049, + 7.798646 + ], + [ + -13.124025, + 8.163946 + ], + [ + -13.24655, + 8.903049 + ], + [ + -12.711958, + 9.342712 + ], + [ + -12.596719, + 9.620188 + ], + [ + -12.425929, + 9.835834 + ], + [ + -12.150338, + 9.858572 + ], + [ + -11.917277, + 10.046984 + ], + [ + -11.117481, + 10.045873 + ], + [ + -10.839152, + 9.688246 + ], + [ + -10.622395, + 9.26791 + ], + [ + -10.65477, + 8.977178 + ], + [ + -10.494315, + 8.715541 + ], + [ + -10.505477, + 8.348896 + ], + [ + -10.230094, + 8.406206 + ], + [ + -10.695595, + 7.939464 + ], + [ + -11.146704, + 7.396706 + ], + [ + -11.199802, + 7.105846 + ], + [ + -11.438779, + 6.785917 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"SLV", + "properties":{ + "name":"El Salvador" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + -87.793111, + 13.38448 + ], + [ + -87.904112, + 13.149017 + ], + [ + -88.483302, + 13.163951 + ], + [ + -88.843228, + 13.259734 + ], + [ + -89.256743, + 13.458533 + ], + [ + -89.812394, + 13.520622 + ], + [ + -90.095555, + 13.735338 + ], + [ + -90.064678, + 13.88197 + ], + [ + -89.721934, + 14.134228 + ], + [ + -89.534219, + 14.244816 + ], + [ + -89.587343, + 14.362586 + ], + [ + -89.353326, + 14.424133 + ], + [ + -89.058512, + 14.340029 + ], + [ + -88.843073, + 14.140507 + ], + [ + -88.541231, + 13.980155 + ], + [ + -88.503998, + 13.845486 + ], + [ + -88.065343, + 13.964626 + ], + [ + -87.859515, + 13.893312 + ], + [ + -87.723503, + 13.78505 + ], + [ + -87.793111, + 13.38448 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"-99", + "properties":{ + "name":"Somaliland" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 48.93813, + 9.451749 + ], + [ + 48.486736, + 8.837626 + ], + [ + 47.78942, + 8.003 + ], + [ + 46.948328, + 7.996877 + ], + [ + 43.67875, + 9.18358 + ], + [ + 43.296975, + 9.540477 + ], + [ + 42.92812, + 10.02194 + ], + [ + 42.55876, + 10.57258 + ], + [ + 42.776852, + 10.926879 + ], + [ + 43.145305, + 11.46204 + ], + [ + 43.47066, + 11.27771 + ], + [ + 43.666668, + 10.864169 + ], + [ + 44.117804, + 10.445538 + ], + [ + 44.614259, + 10.442205 + ], + [ + 45.556941, + 10.698029 + ], + [ + 46.645401, + 10.816549 + ], + [ + 47.525658, + 11.127228 + ], + [ + 48.021596, + 11.193064 + ], + [ + 48.378784, + 11.375482 + ], + [ + 48.948206, + 11.410622 + ], + [ + 48.942005, + 11.394266 + ], + [ + 48.938491, + 10.982327 + ], + [ + 48.938233, + 9.9735 + ], + [ + 48.93813, + 9.451749 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"SOM", + "properties":{ + "name":"Somalia" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 49.72862, + 11.5789 + ], + [ + 50.25878, + 11.67957 + ], + [ + 50.73202, + 12.0219 + ], + [ + 51.1112, + 12.02464 + ], + [ + 51.13387, + 11.74815 + ], + [ + 51.04153, + 11.16651 + ], + [ + 51.04531, + 10.6409 + ], + [ + 50.83418, + 10.27972 + ], + [ + 50.55239, + 9.19874 + ], + [ + 50.07092, + 8.08173 + ], + [ + 49.4527, + 6.80466 + ], + [ + 48.59455, + 5.33911 + ], + [ + 47.74079, + 4.2194 + ], + [ + 46.56476, + 2.85529 + ], + [ + 45.56399, + 2.04576 + ], + [ + 44.06815, + 1.05283 + ], + [ + 43.13597, + 0.2922 + ], + [ + 42.04157, + -0.91916 + ], + [ + 41.81095, + -1.44647 + ], + [ + 41.58513, + -1.68325 + ], + [ + 40.993, + -0.85829 + ], + [ + 40.98105, + 2.78452 + ], + [ + 41.855083, + 3.918912 + ], + [ + 42.12861, + 4.23413 + ], + [ + 42.76967, + 4.25259 + ], + [ + 43.66087, + 4.95755 + ], + [ + 44.9636, + 5.00162 + ], + [ + 47.78942, + 8.003 + ], + [ + 48.486736, + 8.837626 + ], + [ + 48.93813, + 9.451749 + ], + [ + 48.938233, + 9.9735 + ], + [ + 48.938491, + 10.982327 + ], + [ + 48.942005, + 11.394266 + ], + [ + 48.948205, + 11.410617 + ], + [ + 49.26776, + 11.43033 + ], + [ + 49.72862, + 11.5789 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"SRB", + "properties":{ + "name":"Republic of Serbia" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 20.874313, + 45.416375 + ], + [ + 21.483526, + 45.18117 + ], + [ + 21.562023, + 44.768947 + ], + [ + 22.145088, + 44.478422 + ], + [ + 22.459022, + 44.702517 + ], + [ + 22.705726, + 44.578003 + ], + [ + 22.474008, + 44.409228 + ], + [ + 22.65715, + 44.234923 + ], + [ + 22.410446, + 44.008063 + ], + [ + 22.500157, + 43.642814 + ], + [ + 22.986019, + 43.211161 + ], + [ + 22.604801, + 42.898519 + ], + [ + 22.436595, + 42.580321 + ], + [ + 22.545012, + 42.461362 + ], + [ + 22.380526, + 42.32026 + ], + [ + 21.91708, + 42.30364 + ], + [ + 21.576636, + 42.245224 + ], + [ + 21.54332, + 42.32025 + ], + [ + 21.66292, + 42.43922 + ], + [ + 21.77505, + 42.6827 + ], + [ + 21.63302, + 42.67717 + ], + [ + 21.43866, + 42.86255 + ], + [ + 21.27421, + 42.90959 + ], + [ + 21.143395, + 43.068685 + ], + [ + 20.95651, + 43.13094 + ], + [ + 20.81448, + 43.27205 + ], + [ + 20.63508, + 43.21671 + ], + [ + 20.49679, + 42.88469 + ], + [ + 20.25758, + 42.81275 + ], + [ + 20.3398, + 42.89852 + ], + [ + 19.95857, + 43.10604 + ], + [ + 19.63, + 43.21378 + ], + [ + 19.48389, + 43.35229 + ], + [ + 19.21852, + 43.52384 + ], + [ + 19.454, + 43.5681 + ], + [ + 19.59976, + 44.03847 + ], + [ + 19.11761, + 44.42307 + ], + [ + 19.36803, + 44.863 + ], + [ + 19.00548, + 44.86023 + ], + [ + 19.390476, + 45.236516 + ], + [ + 19.072769, + 45.521511 + ], + [ + 18.82982, + 45.90888 + ], + [ + 19.596045, + 46.17173 + ], + [ + 20.220192, + 46.127469 + ], + [ + 20.762175, + 45.734573 + ], + [ + 20.874313, + 45.416375 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"SUR", + "properties":{ + "name":"Suriname" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + -57.147436, + 5.97315 + ], + [ + -55.949318, + 5.772878 + ], + [ + -55.84178, + 5.953125 + ], + [ + -55.03325, + 6.025291 + ], + [ + -53.958045, + 5.756548 + ], + [ + -54.478633, + 4.896756 + ], + [ + -54.399542, + 4.212611 + ], + [ + -54.006931, + 3.620038 + ], + [ + -54.181726, + 3.18978 + ], + [ + -54.269705, + 2.732392 + ], + [ + -54.524754, + 2.311849 + ], + [ + -55.097587, + 2.523748 + ], + [ + -55.569755, + 2.421506 + ], + [ + -55.973322, + 2.510364 + ], + [ + -56.073342, + 2.220795 + ], + [ + -55.9056, + 2.021996 + ], + [ + -55.995698, + 1.817667 + ], + [ + -56.539386, + 1.899523 + ], + [ + -57.150098, + 2.768927 + ], + [ + -57.281433, + 3.333492 + ], + [ + -57.601569, + 3.334655 + ], + [ + -58.044694, + 4.060864 + ], + [ + -57.86021, + 4.576801 + ], + [ + -57.914289, + 4.812626 + ], + [ + -57.307246, + 5.073567 + ], + [ + -57.147436, + 5.97315 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"SVK", + "properties":{ + "name":"Slovakia" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 18.853144, + 49.49623 + ], + [ + 18.909575, + 49.435846 + ], + [ + 19.320713, + 49.571574 + ], + [ + 19.825023, + 49.217125 + ], + [ + 20.415839, + 49.431453 + ], + [ + 20.887955, + 49.328772 + ], + [ + 21.607808, + 49.470107 + ], + [ + 22.558138, + 49.085738 + ], + [ + 22.280842, + 48.825392 + ], + [ + 22.085608, + 48.422264 + ], + [ + 21.872236, + 48.319971 + ], + [ + 20.801294, + 48.623854 + ], + [ + 20.473562, + 48.56285 + ], + [ + 20.239054, + 48.327567 + ], + [ + 19.769471, + 48.202691 + ], + [ + 19.661364, + 48.266615 + ], + [ + 19.174365, + 48.111379 + ], + [ + 18.777025, + 48.081768 + ], + [ + 18.696513, + 47.880954 + ], + [ + 17.857133, + 47.758429 + ], + [ + 17.488473, + 47.867466 + ], + [ + 16.979667, + 48.123497 + ], + [ + 16.879983, + 48.470013 + ], + [ + 16.960288, + 48.596982 + ], + [ + 17.101985, + 48.816969 + ], + [ + 17.545007, + 48.800019 + ], + [ + 17.886485, + 48.903475 + ], + [ + 17.913512, + 48.996493 + ], + [ + 18.104973, + 49.043983 + ], + [ + 18.170498, + 49.271515 + ], + [ + 18.399994, + 49.315001 + ], + [ + 18.554971, + 49.495015 + ], + [ + 18.853144, + 49.49623 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"SVN", + "properties":{ + "name":"Slovenia" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 13.806475, + 46.509306 + ], + [ + 14.632472, + 46.431817 + ], + [ + 15.137092, + 46.658703 + ], + [ + 16.011664, + 46.683611 + ], + [ + 16.202298, + 46.852386 + ], + [ + 16.370505, + 46.841327 + ], + [ + 16.564808, + 46.503751 + ], + [ + 15.768733, + 46.238108 + ], + [ + 15.67153, + 45.834154 + ], + [ + 15.323954, + 45.731783 + ], + [ + 15.327675, + 45.452316 + ], + [ + 14.935244, + 45.471695 + ], + [ + 14.595109, + 45.634941 + ], + [ + 14.411968, + 45.466166 + ], + [ + 13.71506, + 45.500324 + ], + [ + 13.93763, + 45.591016 + ], + [ + 13.69811, + 46.016778 + ], + [ + 13.806475, + 46.509306 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"SWE", + "properties":{ + "name":"Sweden" + }, + "geometry":{ + "type":"MultiPolygon", + "coordinates":[ + [ + [ + [ + 22.183173, + 65.723741 + ], + [ + 21.213517, + 65.026005 + ], + [ + 21.369631, + 64.413588 + ], + [ + 19.778876, + 63.609554 + ], + [ + 17.847779, + 62.7494 + ], + [ + 17.119555, + 61.341166 + ], + [ + 17.831346, + 60.636583 + ], + [ + 18.787722, + 60.081914 + ], + [ + 17.869225, + 58.953766 + ], + [ + 16.829185, + 58.719827 + ], + [ + 16.44771, + 57.041118 + ], + [ + 15.879786, + 56.104302 + ], + [ + 14.666681, + 56.200885 + ], + [ + 14.100721, + 55.407781 + ], + [ + 12.942911, + 55.361737 + ], + [ + 12.625101, + 56.30708 + ], + [ + 11.787942, + 57.441817 + ], + [ + 11.027369, + 58.856149 + ], + [ + 11.468272, + 59.432393 + ], + [ + 12.300366, + 60.117933 + ], + [ + 12.631147, + 61.293572 + ], + [ + 11.992064, + 61.800362 + ], + [ + 11.930569, + 63.128318 + ], + [ + 12.579935, + 64.066219 + ], + [ + 13.571916, + 64.049114 + ], + [ + 13.919905, + 64.445421 + ], + [ + 13.55569, + 64.787028 + ], + [ + 15.108411, + 66.193867 + ], + [ + 16.108712, + 67.302456 + ], + [ + 16.768879, + 68.013937 + ], + [ + 17.729182, + 68.010552 + ], + [ + 17.993868, + 68.567391 + ], + [ + 19.87856, + 68.407194 + ], + [ + 20.025269, + 69.065139 + ], + [ + 20.645593, + 69.106247 + ], + [ + 21.978535, + 68.616846 + ], + [ + 23.539473, + 67.936009 + ], + [ + 23.56588, + 66.396051 + ], + [ + 23.903379, + 66.006927 + ], + [ + 22.183173, + 65.723741 + ] + ] + ], + [ + [ + [ + 17.061767, + 57.385783 + ], + [ + 17.210083, + 57.326521 + ], + [ + 16.430053, + 56.179196 + ], + [ + 16.364135, + 56.556455 + ], + [ + 17.061767, + 57.385783 + ] + ] + ], + [ + [ + [ + 19.357910, + 57.958588 + ], + [ + 18.803100, + 57.651279 + ], + [ + 18.825073, + 57.444949 + ], + [ + 18.995361, + 57.441993 + ], + [ + 18.951416, + 57.370976 + ], + [ + 18.693237, + 57.305756 + ], + [ + 18.709716, + 57.204734 + ], + [ + 18.462524, + 57.127295 + ], + [ + 18.319702, + 56.926992 + ], + [ + 18.105468, + 56.891003 + ], + [ + 18.187866, + 57.109402 + ], + [ + 18.072509, + 57.267163 + ], + [ + 18.154907, + 57.394664 + ], + [ + 18.094482, + 57.545312 + ], + [ + 18.660278, + 57.929434 + ], + [ + 19.039306, + 57.941098 + ], + [ + 19.105224, + 57.993543 + ], + [ + 19.374389, + 57.996454 + ], + [ + 19.357910, + 57.958588 + ] + ] + ], + [ + [ + [ + 20.846557, + 63.823710 + ], + [ + 21.066284, + 63.829768 + ], + [ + 20.972900, + 63.715670 + ], + [ + 20.824584, + 63.579121 + ], + [ + 20.695495, + 63.591340 + ], + [ + 20.819091, + 63.714454 + ], + [ + 20.799865, + 63.780059 + ], + [ + 20.846557, + 63.823710 + ] + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"SWZ", + "properties":{ + "name":"Swaziland" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 32.071665, + -26.73382 + ], + [ + 31.86806, + -27.177927 + ], + [ + 31.282773, + -27.285879 + ], + [ + 30.685962, + -26.743845 + ], + [ + 30.676609, + -26.398078 + ], + [ + 30.949667, + -26.022649 + ], + [ + 31.04408, + -25.731452 + ], + [ + 31.333158, + -25.660191 + ], + [ + 31.837778, + -25.843332 + ], + [ + 31.985779, + -26.29178 + ], + [ + 32.071665, + -26.73382 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"SYR", + "properties":{ + "name":"Syria" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 38.792341, + 33.378686 + ], + [ + 36.834062, + 32.312938 + ], + [ + 35.719918, + 32.709192 + ], + [ + 35.700798, + 32.716014 + ], + [ + 35.836397, + 32.868123 + ], + [ + 35.821101, + 33.277426 + ], + [ + 36.06646, + 33.824912 + ], + [ + 36.61175, + 34.201789 + ], + [ + 36.448194, + 34.593935 + ], + [ + 35.998403, + 34.644914 + ], + [ + 35.905023, + 35.410009 + ], + [ + 36.149763, + 35.821535 + ], + [ + 36.41755, + 36.040617 + ], + [ + 36.685389, + 36.259699 + ], + [ + 36.739494, + 36.81752 + ], + [ + 37.066761, + 36.623036 + ], + [ + 38.167727, + 36.90121 + ], + [ + 38.699891, + 36.712927 + ], + [ + 39.52258, + 36.716054 + ], + [ + 40.673259, + 37.091276 + ], + [ + 41.212089, + 37.074352 + ], + [ + 42.349591, + 37.229873 + ], + [ + 41.837064, + 36.605854 + ], + [ + 41.289707, + 36.358815 + ], + [ + 41.383965, + 35.628317 + ], + [ + 41.006159, + 34.419372 + ], + [ + 38.792341, + 33.378686 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"TCD", + "properties":{ + "name":"Chad" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 14.495787, + 12.859396 + ], + [ + 14.595781, + 13.330427 + ], + [ + 13.954477, + 13.353449 + ], + [ + 13.956699, + 13.996691 + ], + [ + 13.540394, + 14.367134 + ], + [ + 13.97217, + 15.68437 + ], + [ + 15.247731, + 16.627306 + ], + [ + 15.300441, + 17.92795 + ], + [ + 15.685741, + 19.95718 + ], + [ + 15.903247, + 20.387619 + ], + [ + 15.487148, + 20.730415 + ], + [ + 15.47106, + 21.04845 + ], + [ + 15.096888, + 21.308519 + ], + [ + 14.8513, + 22.86295 + ], + [ + 15.86085, + 23.40972 + ], + [ + 19.84926, + 21.49509 + ], + [ + 23.83766, + 19.58047 + ], + [ + 23.88689, + 15.61084 + ], + [ + 23.02459, + 15.68072 + ], + [ + 22.56795, + 14.94429 + ], + [ + 22.30351, + 14.32682 + ], + [ + 22.51202, + 14.09318 + ], + [ + 22.18329, + 13.78648 + ], + [ + 22.29658, + 13.37232 + ], + [ + 22.03759, + 12.95546 + ], + [ + 21.93681, + 12.58818 + ], + [ + 22.28801, + 12.64605 + ], + [ + 22.49762, + 12.26024 + ], + [ + 22.50869, + 11.67936 + ], + [ + 22.87622, + 11.38461 + ], + [ + 22.864165, + 11.142395 + ], + [ + 22.231129, + 10.971889 + ], + [ + 21.723822, + 10.567056 + ], + [ + 21.000868, + 9.475985 + ], + [ + 20.059685, + 9.012706 + ], + [ + 19.094008, + 9.074847 + ], + [ + 18.81201, + 8.982915 + ], + [ + 18.911022, + 8.630895 + ], + [ + 18.389555, + 8.281304 + ], + [ + 17.96493, + 7.890914 + ], + [ + 16.705988, + 7.508328 + ], + [ + 16.456185, + 7.734774 + ], + [ + 16.290562, + 7.754307 + ], + [ + 16.106232, + 7.497088 + ], + [ + 15.27946, + 7.421925 + ], + [ + 15.436092, + 7.692812 + ], + [ + 15.120866, + 8.38215 + ], + [ + 14.979996, + 8.796104 + ], + [ + 14.544467, + 8.965861 + ], + [ + 13.954218, + 9.549495 + ], + [ + 14.171466, + 10.021378 + ], + [ + 14.627201, + 9.920919 + ], + [ + 14.909354, + 9.992129 + ], + [ + 15.467873, + 9.982337 + ], + [ + 14.923565, + 10.891325 + ], + [ + 14.960152, + 11.555574 + ], + [ + 14.89336, + 12.21905 + ], + [ + 14.495787, + 12.859396 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"TGO", + "properties":{ + "name":"Togo" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 1.865241, + 6.142158 + ], + [ + 1.060122, + 5.928837 + ], + [ + 0.836931, + 6.279979 + ], + [ + 0.570384, + 6.914359 + ], + [ + 0.490957, + 7.411744 + ], + [ + 0.712029, + 8.312465 + ], + [ + 0.461192, + 8.677223 + ], + [ + 0.365901, + 9.465004 + ], + [ + 0.36758, + 10.191213 + ], + [ + -0.049785, + 10.706918 + ], + [ + 0.023803, + 11.018682 + ], + [ + 0.899563, + 10.997339 + ], + [ + 0.772336, + 10.470808 + ], + [ + 1.077795, + 10.175607 + ], + [ + 1.425061, + 9.825395 + ], + [ + 1.463043, + 9.334624 + ], + [ + 1.664478, + 9.12859 + ], + [ + 1.618951, + 6.832038 + ], + [ + 1.865241, + 6.142158 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"THA", + "properties":{ + "name":"Thailand" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 102.584932, + 12.186595 + ], + [ + 101.687158, + 12.64574 + ], + [ + 100.83181, + 12.627085 + ], + [ + 100.978467, + 13.412722 + ], + [ + 100.097797, + 13.406856 + ], + [ + 100.018733, + 12.307001 + ], + [ + 99.478921, + 10.846367 + ], + [ + 99.153772, + 9.963061 + ], + [ + 99.222399, + 9.239255 + ], + [ + 99.873832, + 9.207862 + ], + [ + 100.279647, + 8.295153 + ], + [ + 100.459274, + 7.429573 + ], + [ + 101.017328, + 6.856869 + ], + [ + 101.623079, + 6.740622 + ], + [ + 102.141187, + 6.221636 + ], + [ + 101.814282, + 5.810808 + ], + [ + 101.154219, + 5.691384 + ], + [ + 101.075516, + 6.204867 + ], + [ + 100.259596, + 6.642825 + ], + [ + 100.085757, + 6.464489 + ], + [ + 99.690691, + 6.848213 + ], + [ + 99.519642, + 7.343454 + ], + [ + 98.988253, + 7.907993 + ], + [ + 98.503786, + 8.382305 + ], + [ + 98.339662, + 7.794512 + ], + [ + 98.150009, + 8.350007 + ], + [ + 98.25915, + 8.973923 + ], + [ + 98.553551, + 9.93296 + ], + [ + 99.038121, + 10.960546 + ], + [ + 99.587286, + 11.892763 + ], + [ + 99.196354, + 12.804748 + ], + [ + 99.212012, + 13.269294 + ], + [ + 99.097755, + 13.827503 + ], + [ + 98.430819, + 14.622028 + ], + [ + 98.192074, + 15.123703 + ], + [ + 98.537376, + 15.308497 + ], + [ + 98.903348, + 16.177824 + ], + [ + 98.493761, + 16.837836 + ], + [ + 97.859123, + 17.567946 + ], + [ + 97.375896, + 18.445438 + ], + [ + 97.797783, + 18.62708 + ], + [ + 98.253724, + 19.708203 + ], + [ + 98.959676, + 19.752981 + ], + [ + 99.543309, + 20.186598 + ], + [ + 100.115988, + 20.41785 + ], + [ + 100.548881, + 20.109238 + ], + [ + 100.606294, + 19.508344 + ], + [ + 101.282015, + 19.462585 + ], + [ + 101.035931, + 18.408928 + ], + [ + 101.059548, + 17.512497 + ], + [ + 102.113592, + 18.109102 + ], + [ + 102.413005, + 17.932782 + ], + [ + 102.998706, + 17.961695 + ], + [ + 103.200192, + 18.309632 + ], + [ + 103.956477, + 18.240954 + ], + [ + 104.716947, + 17.428859 + ], + [ + 104.779321, + 16.441865 + ], + [ + 105.589039, + 15.570316 + ], + [ + 105.544338, + 14.723934 + ], + [ + 105.218777, + 14.273212 + ], + [ + 104.281418, + 14.416743 + ], + [ + 102.988422, + 14.225721 + ], + [ + 102.348099, + 13.394247 + ], + [ + 102.584932, + 12.186595 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"TJK", + "properties":{ + "name":"Tajikistan" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 71.014198, + 40.244366 + ], + [ + 70.648019, + 39.935754 + ], + [ + 69.55961, + 40.103211 + ], + [ + 69.464887, + 39.526683 + ], + [ + 70.549162, + 39.604198 + ], + [ + 71.784694, + 39.279463 + ], + [ + 73.675379, + 39.431237 + ], + [ + 73.928852, + 38.505815 + ], + [ + 74.257514, + 38.606507 + ], + [ + 74.864816, + 38.378846 + ], + [ + 74.829986, + 37.990007 + ], + [ + 74.980002, + 37.41999 + ], + [ + 73.948696, + 37.421566 + ], + [ + 73.260056, + 37.495257 + ], + [ + 72.63689, + 37.047558 + ], + [ + 72.193041, + 36.948288 + ], + [ + 71.844638, + 36.738171 + ], + [ + 71.448693, + 37.065645 + ], + [ + 71.541918, + 37.905774 + ], + [ + 71.239404, + 37.953265 + ], + [ + 71.348131, + 38.258905 + ], + [ + 70.806821, + 38.486282 + ], + [ + 70.376304, + 38.138396 + ], + [ + 70.270574, + 37.735165 + ], + [ + 70.116578, + 37.588223 + ], + [ + 69.518785, + 37.608997 + ], + [ + 69.196273, + 37.151144 + ], + [ + 68.859446, + 37.344336 + ], + [ + 68.135562, + 37.023115 + ], + [ + 67.83, + 37.144994 + ], + [ + 68.392033, + 38.157025 + ], + [ + 68.176025, + 38.901553 + ], + [ + 67.44222, + 39.140144 + ], + [ + 67.701429, + 39.580478 + ], + [ + 68.536416, + 39.533453 + ], + [ + 69.011633, + 40.086158 + ], + [ + 69.329495, + 40.727824 + ], + [ + 70.666622, + 40.960213 + ], + [ + 70.45816, + 40.496495 + ], + [ + 70.601407, + 40.218527 + ], + [ + 71.014198, + 40.244366 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"TKM", + "properties":{ + "name":"Turkmenistan" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 61.210817, + 35.650072 + ], + [ + 61.123071, + 36.491597 + ], + [ + 60.377638, + 36.527383 + ], + [ + 59.234762, + 37.412988 + ], + [ + 58.436154, + 37.522309 + ], + [ + 57.330434, + 38.029229 + ], + [ + 56.619366, + 38.121394 + ], + [ + 56.180375, + 37.935127 + ], + [ + 55.511578, + 37.964117 + ], + [ + 54.800304, + 37.392421 + ], + [ + 53.921598, + 37.198918 + ], + [ + 53.735511, + 37.906136 + ], + [ + 53.880929, + 38.952093 + ], + [ + 53.101028, + 39.290574 + ], + [ + 53.357808, + 39.975286 + ], + [ + 52.693973, + 40.033629 + ], + [ + 52.915251, + 40.876523 + ], + [ + 53.858139, + 40.631034 + ], + [ + 54.736845, + 40.951015 + ], + [ + 54.008311, + 41.551211 + ], + [ + 53.721713, + 42.123191 + ], + [ + 52.91675, + 41.868117 + ], + [ + 52.814689, + 41.135371 + ], + [ + 52.50246, + 41.783316 + ], + [ + 52.944293, + 42.116034 + ], + [ + 54.079418, + 42.324109 + ], + [ + 54.755345, + 42.043971 + ], + [ + 55.455251, + 41.259859 + ], + [ + 55.968191, + 41.308642 + ], + [ + 57.096391, + 41.32231 + ], + [ + 56.932215, + 41.826026 + ], + [ + 57.78653, + 42.170553 + ], + [ + 58.629011, + 42.751551 + ], + [ + 59.976422, + 42.223082 + ], + [ + 60.083341, + 41.425146 + ], + [ + 60.465953, + 41.220327 + ], + [ + 61.547179, + 41.26637 + ], + [ + 61.882714, + 41.084857 + ], + [ + 62.37426, + 40.053886 + ], + [ + 63.518015, + 39.363257 + ], + [ + 64.170223, + 38.892407 + ], + [ + 65.215999, + 38.402695 + ], + [ + 66.54615, + 37.974685 + ], + [ + 66.518607, + 37.362784 + ], + [ + 66.217385, + 37.39379 + ], + [ + 65.745631, + 37.661164 + ], + [ + 65.588948, + 37.305217 + ], + [ + 64.746105, + 37.111818 + ], + [ + 64.546479, + 36.312073 + ], + [ + 63.982896, + 36.007957 + ], + [ + 63.193538, + 35.857166 + ], + [ + 62.984662, + 35.404041 + ], + [ + 62.230651, + 35.270664 + ], + [ + 61.210817, + 35.650072 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"TLS", + "properties":{ + "name":"East Timor" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 124.968682, + -8.89279 + ], + [ + 125.086246, + -8.656887 + ], + [ + 125.947072, + -8.432095 + ], + [ + 126.644704, + -8.398247 + ], + [ + 126.957243, + -8.273345 + ], + [ + 127.335928, + -8.397317 + ], + [ + 126.967992, + -8.668256 + ], + [ + 125.925885, + -9.106007 + ], + [ + 125.08852, + -9.393173 + ], + [ + 125.07002, + -9.089987 + ], + [ + 124.968682, + -8.89279 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"TTO", + "properties":{ + "name":"Trinidad and Tobago" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + -61.68, + 10.76 + ], + [ + -61.105, + 10.89 + ], + [ + -60.895, + 10.855 + ], + [ + -60.935, + 10.11 + ], + [ + -61.77, + 10 + ], + [ + -61.95, + 10.09 + ], + [ + -61.66, + 10.365 + ], + [ + -61.68, + 10.76 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"TUN", + "properties":{ + "name":"Tunisia" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 9.48214, + 30.307556 + ], + [ + 9.055603, + 32.102692 + ], + [ + 8.439103, + 32.506285 + ], + [ + 8.430473, + 32.748337 + ], + [ + 7.612642, + 33.344115 + ], + [ + 7.524482, + 34.097376 + ], + [ + 8.140981, + 34.655146 + ], + [ + 8.376368, + 35.479876 + ], + [ + 8.217824, + 36.433177 + ], + [ + 8.420964, + 36.946427 + ], + [ + 9.509994, + 37.349994 + ], + [ + 10.210002, + 37.230002 + ], + [ + 10.18065, + 36.724038 + ], + [ + 11.028867, + 37.092103 + ], + [ + 11.100026, + 36.899996 + ], + [ + 10.600005, + 36.41 + ], + [ + 10.593287, + 35.947444 + ], + [ + 10.939519, + 35.698984 + ], + [ + 10.807847, + 34.833507 + ], + [ + 10.149593, + 34.330773 + ], + [ + 10.339659, + 33.785742 + ], + [ + 10.856836, + 33.76874 + ], + [ + 11.108501, + 33.293343 + ], + [ + 11.488787, + 33.136996 + ], + [ + 11.432253, + 32.368903 + ], + [ + 10.94479, + 32.081815 + ], + [ + 10.636901, + 31.761421 + ], + [ + 9.950225, + 31.37607 + ], + [ + 10.056575, + 30.961831 + ], + [ + 9.970017, + 30.539325 + ], + [ + 9.48214, + 30.307556 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"TUR", + "properties":{ + "name":"Turkey" + }, + "geometry":{ + "type":"MultiPolygon", + "coordinates":[ + [ + [ + [ + 36.913127, + 41.335358 + ], + [ + 38.347665, + 40.948586 + ], + [ + 39.512607, + 41.102763 + ], + [ + 40.373433, + 41.013673 + ], + [ + 41.554084, + 41.535656 + ], + [ + 42.619549, + 41.583173 + ], + [ + 43.582746, + 41.092143 + ], + [ + 43.752658, + 40.740201 + ], + [ + 43.656436, + 40.253564 + ], + [ + 44.400009, + 40.005 + ], + [ + 44.79399, + 39.713003 + ], + [ + 44.109225, + 39.428136 + ], + [ + 44.421403, + 38.281281 + ], + [ + 44.225756, + 37.971584 + ], + [ + 44.772699, + 37.170445 + ], + [ + 44.293452, + 37.001514 + ], + [ + 43.942259, + 37.256228 + ], + [ + 42.779126, + 37.385264 + ], + [ + 42.349591, + 37.229873 + ], + [ + 41.212089, + 37.074352 + ], + [ + 40.673259, + 37.091276 + ], + [ + 39.52258, + 36.716054 + ], + [ + 38.699891, + 36.712927 + ], + [ + 38.167727, + 36.90121 + ], + [ + 37.066761, + 36.623036 + ], + [ + 36.739494, + 36.81752 + ], + [ + 36.685389, + 36.259699 + ], + [ + 36.41755, + 36.040617 + ], + [ + 36.149763, + 35.821535 + ], + [ + 35.782085, + 36.274995 + ], + [ + 36.160822, + 36.650606 + ], + [ + 35.550936, + 36.565443 + ], + [ + 34.714553, + 36.795532 + ], + [ + 34.026895, + 36.21996 + ], + [ + 32.509158, + 36.107564 + ], + [ + 31.699595, + 36.644275 + ], + [ + 30.621625, + 36.677865 + ], + [ + 30.391096, + 36.262981 + ], + [ + 29.699976, + 36.144357 + ], + [ + 28.732903, + 36.676831 + ], + [ + 27.641187, + 36.658822 + ], + [ + 27.048768, + 37.653361 + ], + [ + 26.318218, + 38.208133 + ], + [ + 26.8047, + 38.98576 + ], + [ + 26.170785, + 39.463612 + ], + [ + 27.28002, + 40.420014 + ], + [ + 28.819978, + 40.460011 + ], + [ + 29.240004, + 41.219991 + ], + [ + 31.145934, + 41.087622 + ], + [ + 32.347979, + 41.736264 + ], + [ + 33.513283, + 42.01896 + ], + [ + 35.167704, + 42.040225 + ], + [ + 36.913127, + 41.335358 + ] + ] + ], + [ + [ + [ + 27.192377, + 40.690566 + ], + [ + 26.358009, + 40.151994 + ], + [ + 26.043351, + 40.617754 + ], + [ + 26.056942, + 40.824123 + ], + [ + 26.294602, + 40.936261 + ], + [ + 26.604196, + 41.562115 + ], + [ + 26.117042, + 41.826905 + ], + [ + 27.135739, + 42.141485 + ], + [ + 27.99672, + 42.007359 + ], + [ + 28.115525, + 41.622886 + ], + [ + 28.988443, + 41.299934 + ], + [ + 28.806438, + 41.054962 + ], + [ + 27.619017, + 40.999823 + ], + [ + 27.192377, + 40.690566 + ] + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"TWN", + "properties":{ + "name":"Taiwan" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 121.777818, + 24.394274 + ], + [ + 121.175632, + 22.790857 + ], + [ + 120.74708, + 21.970571 + ], + [ + 120.220083, + 22.814861 + ], + [ + 120.106189, + 23.556263 + ], + [ + 120.69468, + 24.538451 + ], + [ + 121.495044, + 25.295459 + ], + [ + 121.951244, + 24.997596 + ], + [ + 121.777818, + 24.394274 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"TZA", + "properties":{ + "name":"United Republic of Tanzania" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 33.903711, + -0.95 + ], + [ + 34.07262, + -1.05982 + ], + [ + 37.69869, + -3.09699 + ], + [ + 37.7669, + -3.67712 + ], + [ + 39.20222, + -4.67677 + ], + [ + 38.74054, + -5.90895 + ], + [ + 38.79977, + -6.47566 + ], + [ + 39.44, + -6.84 + ], + [ + 39.47, + -7.1 + ], + [ + 39.19469, + -7.7039 + ], + [ + 39.25203, + -8.00781 + ], + [ + 39.18652, + -8.48551 + ], + [ + 39.53574, + -9.11237 + ], + [ + 39.9496, + -10.0984 + ], + [ + 40.31659, + -10.3171 + ], + [ + 39.521, + -10.89688 + ], + [ + 38.427557, + -11.285202 + ], + [ + 37.82764, + -11.26879 + ], + [ + 37.47129, + -11.56876 + ], + [ + 36.775151, + -11.594537 + ], + [ + 36.514082, + -11.720938 + ], + [ + 35.312398, + -11.439146 + ], + [ + 34.559989, + -11.52002 + ], + [ + 34.28, + -10.16 + ], + [ + 33.940838, + -9.693674 + ], + [ + 33.73972, + -9.41715 + ], + [ + 32.759375, + -9.230599 + ], + [ + 32.191865, + -8.930359 + ], + [ + 31.556348, + -8.762049 + ], + [ + 31.157751, + -8.594579 + ], + [ + 30.74, + -8.34 + ], + [ + 30.2, + -7.08 + ], + [ + 29.62, + -6.52 + ], + [ + 29.419993, + -5.939999 + ], + [ + 29.519987, + -5.419979 + ], + [ + 29.339998, + -4.499983 + ], + [ + 29.753512, + -4.452389 + ], + [ + 30.11632, + -4.09012 + ], + [ + 30.50554, + -3.56858 + ], + [ + 30.75224, + -3.35931 + ], + [ + 30.74301, + -3.03431 + ], + [ + 30.52766, + -2.80762 + ], + [ + 30.46967, + -2.41383 + ], + [ + 30.758309, + -2.28725 + ], + [ + 30.816135, + -1.698914 + ], + [ + 30.419105, + -1.134659 + ], + [ + 30.76986, + -1.01455 + ], + [ + 31.86617, + -1.02736 + ], + [ + 33.903711, + -0.95 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"UGA", + "properties":{ + "name":"Uganda" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 31.86617, + -1.02736 + ], + [ + 30.76986, + -1.01455 + ], + [ + 30.419105, + -1.134659 + ], + [ + 29.821519, + -1.443322 + ], + [ + 29.579466, + -1.341313 + ], + [ + 29.587838, + -0.587406 + ], + [ + 29.8195, + -0.2053 + ], + [ + 29.875779, + 0.59738 + ], + [ + 30.086154, + 1.062313 + ], + [ + 30.468508, + 1.583805 + ], + [ + 30.85267, + 1.849396 + ], + [ + 31.174149, + 2.204465 + ], + [ + 30.77332, + 2.33989 + ], + [ + 30.83385, + 3.50917 + ], + [ + 31.24556, + 3.7819 + ], + [ + 31.88145, + 3.55827 + ], + [ + 32.68642, + 3.79232 + ], + [ + 33.39, + 3.79 + ], + [ + 34.005, + 4.249885 + ], + [ + 34.47913, + 3.5556 + ], + [ + 34.59607, + 3.05374 + ], + [ + 35.03599, + 1.90584 + ], + [ + 34.6721, + 1.17694 + ], + [ + 34.18, + 0.515 + ], + [ + 33.893569, + 0.109814 + ], + [ + 33.903711, + -0.95 + ], + [ + 31.86617, + -1.02736 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"UKR", + "properties":{ + "name":"Ukraine" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 31.785998, + 52.101678 + ], + [ + 32.159412, + 52.061267 + ], + [ + 32.412058, + 52.288695 + ], + [ + 32.715761, + 52.238465 + ], + [ + 33.7527, + 52.335075 + ], + [ + 34.391731, + 51.768882 + ], + [ + 34.141978, + 51.566413 + ], + [ + 34.224816, + 51.255993 + ], + [ + 35.022183, + 51.207572 + ], + [ + 35.377924, + 50.773955 + ], + [ + 35.356116, + 50.577197 + ], + [ + 36.626168, + 50.225591 + ], + [ + 37.39346, + 50.383953 + ], + [ + 38.010631, + 49.915662 + ], + [ + 38.594988, + 49.926462 + ], + [ + 40.069058, + 49.601055 + ], + [ + 40.080789, + 49.30743 + ], + [ + 39.674664, + 48.783818 + ], + [ + 39.895632, + 48.232405 + ], + [ + 39.738278, + 47.898937 + ], + [ + 38.770585, + 47.825608 + ], + [ + 38.255112, + 47.5464 + ], + [ + 38.223538, + 47.10219 + ], + [ + 37.425137, + 47.022221 + ], + [ + 36.759855, + 46.6987 + ], + [ + 35.823685, + 46.645964 + ], + [ + 34.962342, + 46.273197 + ], + [ + 35.020788, + 45.651219 + ], + [ + 35.510009, + 45.409993 + ], + [ + 36.529998, + 45.46999 + ], + [ + 36.334713, + 45.113216 + ], + [ + 35.239999, + 44.939996 + ], + [ + 33.882511, + 44.361479 + ], + [ + 33.326421, + 44.564877 + ], + [ + 33.546924, + 45.034771 + ], + [ + 32.454174, + 45.327466 + ], + [ + 32.630804, + 45.519186 + ], + [ + 33.588162, + 45.851569 + ], + [ + 33.298567, + 46.080598 + ], + [ + 31.74414, + 46.333348 + ], + [ + 31.675307, + 46.706245 + ], + [ + 30.748749, + 46.5831 + ], + [ + 30.377609, + 46.03241 + ], + [ + 29.603289, + 45.293308 + ], + [ + 29.149725, + 45.464925 + ], + [ + 28.679779, + 45.304031 + ], + [ + 28.233554, + 45.488283 + ], + [ + 28.485269, + 45.596907 + ], + [ + 28.659987, + 45.939987 + ], + [ + 28.933717, + 46.25883 + ], + [ + 28.862972, + 46.437889 + ], + [ + 29.072107, + 46.517678 + ], + [ + 29.170654, + 46.379262 + ], + [ + 29.759972, + 46.349988 + ], + [ + 30.024659, + 46.423937 + ], + [ + 29.83821, + 46.525326 + ], + [ + 29.908852, + 46.674361 + ], + [ + 29.559674, + 46.928583 + ], + [ + 29.415135, + 47.346645 + ], + [ + 29.050868, + 47.510227 + ], + [ + 29.122698, + 47.849095 + ], + [ + 28.670891, + 48.118149 + ], + [ + 28.259547, + 48.155562 + ], + [ + 27.522537, + 48.467119 + ], + [ + 26.857824, + 48.368211 + ], + [ + 26.619337, + 48.220726 + ], + [ + 26.19745, + 48.220881 + ], + [ + 25.945941, + 47.987149 + ], + [ + 25.207743, + 47.891056 + ], + [ + 24.866317, + 47.737526 + ], + [ + 24.402056, + 47.981878 + ], + [ + 23.760958, + 47.985598 + ], + [ + 23.142236, + 48.096341 + ], + [ + 22.710531, + 47.882194 + ], + [ + 22.64082, + 48.15024 + ], + [ + 22.085608, + 48.422264 + ], + [ + 22.280842, + 48.825392 + ], + [ + 22.558138, + 49.085738 + ], + [ + 22.776419, + 49.027395 + ], + [ + 22.51845, + 49.476774 + ], + [ + 23.426508, + 50.308506 + ], + [ + 23.922757, + 50.424881 + ], + [ + 24.029986, + 50.705407 + ], + [ + 23.527071, + 51.578454 + ], + [ + 24.005078, + 51.617444 + ], + [ + 24.553106, + 51.888461 + ], + [ + 25.327788, + 51.910656 + ], + [ + 26.337959, + 51.832289 + ], + [ + 27.454066, + 51.592303 + ], + [ + 28.241615, + 51.572227 + ], + [ + 28.617613, + 51.427714 + ], + [ + 28.992835, + 51.602044 + ], + [ + 29.254938, + 51.368234 + ], + [ + 30.157364, + 51.416138 + ], + [ + 30.555117, + 51.319503 + ], + [ + 30.619454, + 51.822806 + ], + [ + 30.927549, + 52.042353 + ], + [ + 31.785998, + 52.101678 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"URY", + "properties":{ + "name":"Uruguay" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + -57.625133, + -30.216295 + ], + [ + -56.976026, + -30.109686 + ], + [ + -55.973245, + -30.883076 + ], + [ + -55.60151, + -30.853879 + ], + [ + -54.572452, + -31.494511 + ], + [ + -53.787952, + -32.047243 + ], + [ + -53.209589, + -32.727666 + ], + [ + -53.650544, + -33.202004 + ], + [ + -53.373662, + -33.768378 + ], + [ + -53.806426, + -34.396815 + ], + [ + -54.935866, + -34.952647 + ], + [ + -55.67409, + -34.752659 + ], + [ + -56.215297, + -34.859836 + ], + [ + -57.139685, + -34.430456 + ], + [ + -57.817861, + -34.462547 + ], + [ + -58.427074, + -33.909454 + ], + [ + -58.349611, + -33.263189 + ], + [ + -58.132648, + -33.040567 + ], + [ + -58.14244, + -32.044504 + ], + [ + -57.874937, + -31.016556 + ], + [ + -57.625133, + -30.216295 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"USA", + "properties":{ + "name":"United States of America" + }, + "geometry":{ + "type":"MultiPolygon", + "coordinates":[ + [ + [ + [ + -155.54211, + 19.08348 + ], + [ + -155.68817, + 18.91619 + ], + [ + -155.93665, + 19.05939 + ], + [ + -155.90806, + 19.33888 + ], + [ + -156.07347, + 19.70294 + ], + [ + -156.02368, + 19.81422 + ], + [ + -155.85008, + 19.97729 + ], + [ + -155.91907, + 20.17395 + ], + [ + -155.86108, + 20.26721 + ], + [ + -155.78505, + 20.2487 + ], + [ + -155.40214, + 20.07975 + ], + [ + -155.22452, + 19.99302 + ], + [ + -155.06226, + 19.8591 + ], + [ + -154.80741, + 19.50871 + ], + [ + -154.83147, + 19.45328 + ], + [ + -155.22217, + 19.23972 + ], + [ + -155.54211, + 19.08348 + ] + ] + ], + [ + [ + [ + -156.07926, + 20.64397 + ], + [ + -156.41445, + 20.57241 + ], + [ + -156.58673, + 20.783 + ], + [ + -156.70167, + 20.8643 + ], + [ + -156.71055, + 20.92676 + ], + [ + -156.61258, + 21.01249 + ], + [ + -156.25711, + 20.91745 + ], + [ + -155.99566, + 20.76404 + ], + [ + -156.07926, + 20.64397 + ] + ] + ], + [ + [ + [ + -156.75824, + 21.17684 + ], + [ + -156.78933, + 21.06873 + ], + [ + -157.32521, + 21.09777 + ], + [ + -157.25027, + 21.21958 + ], + [ + -156.75824, + 21.17684 + ] + ] + ], + [ + [ + [ + -157.65283, + 21.32217 + ], + [ + -157.70703, + 21.26442 + ], + [ + -157.7786, + 21.27729 + ], + [ + -158.12667, + 21.31244 + ], + [ + -158.2538, + 21.53919 + ], + [ + -158.29265, + 21.57912 + ], + [ + -158.0252, + 21.71696 + ], + [ + -157.94161, + 21.65272 + ], + [ + -157.65283, + 21.32217 + ] + ] + ], + [ + [ + [ + -159.34512, + 21.982 + ], + [ + -159.46372, + 21.88299 + ], + [ + -159.80051, + 22.06533 + ], + [ + -159.74877, + 22.1382 + ], + [ + -159.5962, + 22.23618 + ], + [ + -159.36569, + 22.21494 + ], + [ + -159.34512, + 21.982 + ] + ] + ], + [ + [ + [ + -94.81758, + 49.38905 + ], + [ + -94.64, + 48.84 + ], + [ + -94.32914, + 48.67074 + ], + [ + -93.63087, + 48.60926 + ], + [ + -92.61, + 48.45 + ], + [ + -91.64, + 48.14 + ], + [ + -90.83, + 48.27 + ], + [ + -89.6, + 48.01 + ], + [ + -89.272917, + 48.019808 + ], + [ + -88.378114, + 48.302918 + ], + [ + -87.439793, + 47.94 + ], + [ + -86.461991, + 47.553338 + ], + [ + -85.652363, + 47.220219 + ], + [ + -84.87608, + 46.900083 + ], + [ + -84.779238, + 46.637102 + ], + [ + -84.543749, + 46.538684 + ], + [ + -84.6049, + 46.4396 + ], + [ + -84.3367, + 46.40877 + ], + [ + -84.14212, + 46.512226 + ], + [ + -84.091851, + 46.275419 + ], + [ + -83.890765, + 46.116927 + ], + [ + -83.616131, + 46.116927 + ], + [ + -83.469551, + 45.994686 + ], + [ + -83.592851, + 45.816894 + ], + [ + -82.550925, + 45.347517 + ], + [ + -82.337763, + 44.44 + ], + [ + -82.137642, + 43.571088 + ], + [ + -82.43, + 42.98 + ], + [ + -82.9, + 42.43 + ], + [ + -83.12, + 42.08 + ], + [ + -83.142, + 41.975681 + ], + [ + -83.02981, + 41.832796 + ], + [ + -82.690089, + 41.675105 + ], + [ + -82.439278, + 41.675105 + ], + [ + -81.277747, + 42.209026 + ], + [ + -80.247448, + 42.3662 + ], + [ + -78.939362, + 42.863611 + ], + [ + -78.92, + 42.965 + ], + [ + -79.01, + 43.27 + ], + [ + -79.171674, + 43.466339 + ], + [ + -78.72028, + 43.625089 + ], + [ + -77.737885, + 43.629056 + ], + [ + -76.820034, + 43.628784 + ], + [ + -76.5, + 44.018459 + ], + [ + -76.375, + 44.09631 + ], + [ + -75.31821, + 44.81645 + ], + [ + -74.867, + 45.00048 + ], + [ + -73.34783, + 45.00738 + ], + [ + -71.50506, + 45.0082 + ], + [ + -71.405, + 45.255 + ], + [ + -71.08482, + 45.30524 + ], + [ + -70.66, + 45.46 + ], + [ + -70.305, + 45.915 + ], + [ + -69.99997, + 46.69307 + ], + [ + -69.237216, + 47.447781 + ], + [ + -68.905, + 47.185 + ], + [ + -68.23444, + 47.35486 + ], + [ + -67.79046, + 47.06636 + ], + [ + -67.79134, + 45.70281 + ], + [ + -67.13741, + 45.13753 + ], + [ + -66.96466, + 44.8097 + ], + [ + -68.03252, + 44.3252 + ], + [ + -69.06, + 43.98 + ], + [ + -70.11617, + 43.68405 + ], + [ + -70.645476, + 43.090238 + ], + [ + -70.81489, + 42.8653 + ], + [ + -70.825, + 42.335 + ], + [ + -70.495, + 41.805 + ], + [ + -70.08, + 41.78 + ], + [ + -70.185, + 42.145 + ], + [ + -69.88497, + 41.92283 + ], + [ + -69.96503, + 41.63717 + ], + [ + -70.64, + 41.475 + ], + [ + -71.12039, + 41.49445 + ], + [ + -71.86, + 41.32 + ], + [ + -72.295, + 41.27 + ], + [ + -72.87643, + 41.22065 + ], + [ + -73.71, + 40.931102 + ], + [ + -72.24126, + 41.11948 + ], + [ + -71.945, + 40.93 + ], + [ + -73.345, + 40.63 + ], + [ + -73.982, + 40.628 + ], + [ + -73.952325, + 40.75075 + ], + [ + -74.25671, + 40.47351 + ], + [ + -73.96244, + 40.42763 + ], + [ + -74.17838, + 39.70926 + ], + [ + -74.90604, + 38.93954 + ], + [ + -74.98041, + 39.1964 + ], + [ + -75.20002, + 39.24845 + ], + [ + -75.52805, + 39.4985 + ], + [ + -75.32, + 38.96 + ], + [ + -75.071835, + 38.782032 + ], + [ + -75.05673, + 38.40412 + ], + [ + -75.37747, + 38.01551 + ], + [ + -75.94023, + 37.21689 + ], + [ + -76.03127, + 37.2566 + ], + [ + -75.72205, + 37.93705 + ], + [ + -76.23287, + 38.319215 + ], + [ + -76.35, + 39.15 + ], + [ + -76.542725, + 38.717615 + ], + [ + -76.32933, + 38.08326 + ], + [ + -76.989998, + 38.239992 + ], + [ + -76.30162, + 37.917945 + ], + [ + -76.25874, + 36.9664 + ], + [ + -75.9718, + 36.89726 + ], + [ + -75.86804, + 36.55125 + ], + [ + -75.72749, + 35.55074 + ], + [ + -76.36318, + 34.80854 + ], + [ + -77.397635, + 34.51201 + ], + [ + -78.05496, + 33.92547 + ], + [ + -78.55435, + 33.86133 + ], + [ + -79.06067, + 33.49395 + ], + [ + -79.20357, + 33.15839 + ], + [ + -80.301325, + 32.509355 + ], + [ + -80.86498, + 32.0333 + ], + [ + -81.33629, + 31.44049 + ], + [ + -81.49042, + 30.72999 + ], + [ + -81.31371, + 30.03552 + ], + [ + -80.98, + 29.18 + ], + [ + -80.535585, + 28.47213 + ], + [ + -80.53, + 28.04 + ], + [ + -80.056539, + 26.88 + ], + [ + -80.088015, + 26.205765 + ], + [ + -80.13156, + 25.816775 + ], + [ + -80.38103, + 25.20616 + ], + [ + -80.68, + 25.08 + ], + [ + -81.17213, + 25.20126 + ], + [ + -81.33, + 25.64 + ], + [ + -81.71, + 25.87 + ], + [ + -82.24, + 26.73 + ], + [ + -82.70515, + 27.49504 + ], + [ + -82.85526, + 27.88624 + ], + [ + -82.65, + 28.55 + ], + [ + -82.93, + 29.1 + ], + [ + -83.70959, + 29.93656 + ], + [ + -84.1, + 30.09 + ], + [ + -85.10882, + 29.63615 + ], + [ + -85.28784, + 29.68612 + ], + [ + -85.7731, + 30.15261 + ], + [ + -86.4, + 30.4 + ], + [ + -87.53036, + 30.27433 + ], + [ + -88.41782, + 30.3849 + ], + [ + -89.18049, + 30.31598 + ], + [ + -89.593831, + 30.159994 + ], + [ + -89.413735, + 29.89419 + ], + [ + -89.43, + 29.48864 + ], + [ + -89.21767, + 29.29108 + ], + [ + -89.40823, + 29.15961 + ], + [ + -89.77928, + 29.30714 + ], + [ + -90.15463, + 29.11743 + ], + [ + -90.880225, + 29.148535 + ], + [ + -91.626785, + 29.677 + ], + [ + -92.49906, + 29.5523 + ], + [ + -93.22637, + 29.78375 + ], + [ + -93.84842, + 29.71363 + ], + [ + -94.69, + 29.48 + ], + [ + -95.60026, + 28.73863 + ], + [ + -96.59404, + 28.30748 + ], + [ + -97.14, + 27.83 + ], + [ + -97.37, + 27.38 + ], + [ + -97.38, + 26.69 + ], + [ + -97.33, + 26.21 + ], + [ + -97.14, + 25.87 + ], + [ + -97.53, + 25.84 + ], + [ + -98.24, + 26.06 + ], + [ + -99.02, + 26.37 + ], + [ + -99.3, + 26.84 + ], + [ + -99.52, + 27.54 + ], + [ + -100.11, + 28.11 + ], + [ + -100.45584, + 28.69612 + ], + [ + -100.9576, + 29.38071 + ], + [ + -101.6624, + 29.7793 + ], + [ + -102.48, + 29.76 + ], + [ + -103.11, + 28.97 + ], + [ + -103.94, + 29.27 + ], + [ + -104.45697, + 29.57196 + ], + [ + -104.70575, + 30.12173 + ], + [ + -105.03737, + 30.64402 + ], + [ + -105.63159, + 31.08383 + ], + [ + -106.1429, + 31.39995 + ], + [ + -106.50759, + 31.75452 + ], + [ + -108.24, + 31.754854 + ], + [ + -108.24194, + 31.34222 + ], + [ + -109.035, + 31.34194 + ], + [ + -111.02361, + 31.33472 + ], + [ + -113.30498, + 32.03914 + ], + [ + -114.815, + 32.52528 + ], + [ + -114.72139, + 32.72083 + ], + [ + -115.99135, + 32.61239 + ], + [ + -117.12776, + 32.53534 + ], + [ + -117.295938, + 33.046225 + ], + [ + -117.944, + 33.621236 + ], + [ + -118.410602, + 33.740909 + ], + [ + -118.519895, + 34.027782 + ], + [ + -119.081, + 34.078 + ], + [ + -119.438841, + 34.348477 + ], + [ + -120.36778, + 34.44711 + ], + [ + -120.62286, + 34.60855 + ], + [ + -120.74433, + 35.15686 + ], + [ + -121.71457, + 36.16153 + ], + [ + -122.54747, + 37.55176 + ], + [ + -122.51201, + 37.78339 + ], + [ + -122.95319, + 38.11371 + ], + [ + -123.7272, + 38.95166 + ], + [ + -123.86517, + 39.76699 + ], + [ + -124.39807, + 40.3132 + ], + [ + -124.17886, + 41.14202 + ], + [ + -124.2137, + 41.99964 + ], + [ + -124.53284, + 42.76599 + ], + [ + -124.14214, + 43.70838 + ], + [ + -124.020535, + 44.615895 + ], + [ + -123.89893, + 45.52341 + ], + [ + -124.079635, + 46.86475 + ], + [ + -124.39567, + 47.72017 + ], + [ + -124.68721, + 48.184433 + ], + [ + -124.566101, + 48.379715 + ], + [ + -123.12, + 48.04 + ], + [ + -122.58736, + 47.096 + ], + [ + -122.34, + 47.36 + ], + [ + -122.5, + 48.18 + ], + [ + -122.84, + 49 + ], + [ + -120, + 49 + ], + [ + -117.03121, + 49 + ], + [ + -116.04818, + 49 + ], + [ + -113, + 49 + ], + [ + -110.05, + 49 + ], + [ + -107.05, + 49 + ], + [ + -104.04826, + 48.99986 + ], + [ + -100.65, + 49 + ], + [ + -97.22872, + 49.0007 + ], + [ + -95.15907, + 49 + ], + [ + -95.15609, + 49.38425 + ], + [ + -94.81758, + 49.38905 + ] + ] + ], + [ + [ + [ + -153.006314, + 57.115842 + ], + [ + -154.00509, + 56.734677 + ], + [ + -154.516403, + 56.992749 + ], + [ + -154.670993, + 57.461196 + ], + [ + -153.76278, + 57.816575 + ], + [ + -153.228729, + 57.968968 + ], + [ + -152.564791, + 57.901427 + ], + [ + -152.141147, + 57.591059 + ], + [ + -153.006314, + 57.115842 + ] + ] + ], + [ + [ + [ + -165.579164, + 59.909987 + ], + [ + -166.19277, + 59.754441 + ], + [ + -166.848337, + 59.941406 + ], + [ + -167.455277, + 60.213069 + ], + [ + -166.467792, + 60.38417 + ], + [ + -165.67443, + 60.293607 + ], + [ + -165.579164, + 59.909987 + ] + ] + ], + [ + [ + [ + -171.731657, + 63.782515 + ], + [ + -171.114434, + 63.592191 + ], + [ + -170.491112, + 63.694975 + ], + [ + -169.682505, + 63.431116 + ], + [ + -168.689439, + 63.297506 + ], + [ + -168.771941, + 63.188598 + ], + [ + -169.52944, + 62.976931 + ], + [ + -170.290556, + 63.194438 + ], + [ + -170.671386, + 63.375822 + ], + [ + -171.553063, + 63.317789 + ], + [ + -171.791111, + 63.405846 + ], + [ + -171.731657, + 63.782515 + ] + ] + ], + [ + [ + [ + -155.06779, + 71.147776 + ], + [ + -154.344165, + 70.696409 + ], + [ + -153.900006, + 70.889989 + ], + [ + -152.210006, + 70.829992 + ], + [ + -152.270002, + 70.600006 + ], + [ + -150.739992, + 70.430017 + ], + [ + -149.720003, + 70.53001 + ], + [ + -147.613362, + 70.214035 + ], + [ + -145.68999, + 70.12001 + ], + [ + -144.920011, + 69.989992 + ], + [ + -143.589446, + 70.152514 + ], + [ + -142.07251, + 69.851938 + ], + [ + -140.985988, + 69.711998 + ], + [ + -140.992499, + 66.000029 + ], + [ + -140.99777, + 60.306397 + ], + [ + -140.012998, + 60.276838 + ], + [ + -139.039, + 60.000007 + ], + [ + -138.34089, + 59.56211 + ], + [ + -137.4525, + 58.905 + ], + [ + -136.47972, + 59.46389 + ], + [ + -135.47583, + 59.78778 + ], + [ + -134.945, + 59.27056 + ], + [ + -134.27111, + 58.86111 + ], + [ + -133.355549, + 58.410285 + ], + [ + -132.73042, + 57.69289 + ], + [ + -131.70781, + 56.55212 + ], + [ + -130.00778, + 55.91583 + ], + [ + -129.979994, + 55.284998 + ], + [ + -130.53611, + 54.802753 + ], + [ + -131.085818, + 55.178906 + ], + [ + -131.967211, + 55.497776 + ], + [ + -132.250011, + 56.369996 + ], + [ + -133.539181, + 57.178887 + ], + [ + -134.078063, + 58.123068 + ], + [ + -135.038211, + 58.187715 + ], + [ + -136.628062, + 58.212209 + ], + [ + -137.800006, + 58.499995 + ], + [ + -139.867787, + 59.537762 + ], + [ + -140.825274, + 59.727517 + ], + [ + -142.574444, + 60.084447 + ], + [ + -143.958881, + 59.99918 + ], + [ + -145.925557, + 60.45861 + ], + [ + -147.114374, + 60.884656 + ], + [ + -148.224306, + 60.672989 + ], + [ + -148.018066, + 59.978329 + ], + [ + -148.570823, + 59.914173 + ], + [ + -149.727858, + 59.705658 + ], + [ + -150.608243, + 59.368211 + ], + [ + -151.716393, + 59.155821 + ], + [ + -151.859433, + 59.744984 + ], + [ + -151.409719, + 60.725803 + ], + [ + -150.346941, + 61.033588 + ], + [ + -150.621111, + 61.284425 + ], + [ + -151.895839, + 60.727198 + ], + [ + -152.57833, + 60.061657 + ], + [ + -154.019172, + 59.350279 + ], + [ + -153.287511, + 58.864728 + ], + [ + -154.232492, + 58.146374 + ], + [ + -155.307491, + 57.727795 + ], + [ + -156.308335, + 57.422774 + ], + [ + -156.556097, + 56.979985 + ], + [ + -158.117217, + 56.463608 + ], + [ + -158.433321, + 55.994154 + ], + [ + -159.603327, + 55.566686 + ], + [ + -160.28972, + 55.643581 + ], + [ + -161.223048, + 55.364735 + ], + [ + -162.237766, + 55.024187 + ], + [ + -163.069447, + 54.689737 + ], + [ + -164.785569, + 54.404173 + ], + [ + -164.942226, + 54.572225 + ], + [ + -163.84834, + 55.039431 + ], + [ + -162.870001, + 55.348043 + ], + [ + -161.804175, + 55.894986 + ], + [ + -160.563605, + 56.008055 + ], + [ + -160.07056, + 56.418055 + ], + [ + -158.684443, + 57.016675 + ], + [ + -158.461097, + 57.216921 + ], + [ + -157.72277, + 57.570001 + ], + [ + -157.550274, + 58.328326 + ], + [ + -157.041675, + 58.918885 + ], + [ + -158.194731, + 58.615802 + ], + [ + -158.517218, + 58.787781 + ], + [ + -159.058606, + 58.424186 + ], + [ + -159.711667, + 58.93139 + ], + [ + -159.981289, + 58.572549 + ], + [ + -160.355271, + 59.071123 + ], + [ + -161.355003, + 58.670838 + ], + [ + -161.968894, + 58.671665 + ], + [ + -162.054987, + 59.266925 + ], + [ + -161.874171, + 59.633621 + ], + [ + -162.518059, + 59.989724 + ], + [ + -163.818341, + 59.798056 + ], + [ + -164.662218, + 60.267484 + ], + [ + -165.346388, + 60.507496 + ], + [ + -165.350832, + 61.073895 + ], + [ + -166.121379, + 61.500019 + ], + [ + -165.734452, + 62.074997 + ], + [ + -164.919179, + 62.633076 + ], + [ + -164.562508, + 63.146378 + ], + [ + -163.753332, + 63.219449 + ], + [ + -163.067224, + 63.059459 + ], + [ + -162.260555, + 63.541936 + ], + [ + -161.53445, + 63.455817 + ], + [ + -160.772507, + 63.766108 + ], + [ + -160.958335, + 64.222799 + ], + [ + -161.518068, + 64.402788 + ], + [ + -160.777778, + 64.788604 + ], + [ + -161.391926, + 64.777235 + ], + [ + -162.45305, + 64.559445 + ], + [ + -162.757786, + 64.338605 + ], + [ + -163.546394, + 64.55916 + ], + [ + -164.96083, + 64.446945 + ], + [ + -166.425288, + 64.686672 + ], + [ + -166.845004, + 65.088896 + ], + [ + -168.11056, + 65.669997 + ], + [ + -166.705271, + 66.088318 + ], + [ + -164.47471, + 66.57666 + ], + [ + -163.652512, + 66.57666 + ], + [ + -163.788602, + 66.077207 + ], + [ + -161.677774, + 66.11612 + ], + [ + -162.489715, + 66.735565 + ], + [ + -163.719717, + 67.116395 + ], + [ + -164.430991, + 67.616338 + ], + [ + -165.390287, + 68.042772 + ], + [ + -166.764441, + 68.358877 + ], + [ + -166.204707, + 68.883031 + ], + [ + -164.430811, + 68.915535 + ], + [ + -163.168614, + 69.371115 + ], + [ + -162.930566, + 69.858062 + ], + [ + -161.908897, + 70.33333 + ], + [ + -160.934797, + 70.44769 + ], + [ + -159.039176, + 70.891642 + ], + [ + -158.119723, + 70.824721 + ], + [ + -156.580825, + 71.357764 + ], + [ + -155.06779, + 71.147776 + ] + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"UZB", + "properties":{ + "name":"Uzbekistan" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 66.518607, + 37.362784 + ], + [ + 66.54615, + 37.974685 + ], + [ + 65.215999, + 38.402695 + ], + [ + 64.170223, + 38.892407 + ], + [ + 63.518015, + 39.363257 + ], + [ + 62.37426, + 40.053886 + ], + [ + 61.882714, + 41.084857 + ], + [ + 61.547179, + 41.26637 + ], + [ + 60.465953, + 41.220327 + ], + [ + 60.083341, + 41.425146 + ], + [ + 59.976422, + 42.223082 + ], + [ + 58.629011, + 42.751551 + ], + [ + 57.78653, + 42.170553 + ], + [ + 56.932215, + 41.826026 + ], + [ + 57.096391, + 41.32231 + ], + [ + 55.968191, + 41.308642 + ], + [ + 55.928917, + 44.995858 + ], + [ + 58.503127, + 45.586804 + ], + [ + 58.689989, + 45.500014 + ], + [ + 60.239972, + 44.784037 + ], + [ + 61.05832, + 44.405817 + ], + [ + 62.0133, + 43.504477 + ], + [ + 63.185787, + 43.650075 + ], + [ + 64.900824, + 43.728081 + ], + [ + 66.098012, + 42.99766 + ], + [ + 66.023392, + 41.994646 + ], + [ + 66.510649, + 41.987644 + ], + [ + 66.714047, + 41.168444 + ], + [ + 67.985856, + 41.135991 + ], + [ + 68.259896, + 40.662325 + ], + [ + 68.632483, + 40.668681 + ], + [ + 69.070027, + 41.384244 + ], + [ + 70.388965, + 42.081308 + ], + [ + 70.962315, + 42.266154 + ], + [ + 71.259248, + 42.167711 + ], + [ + 70.420022, + 41.519998 + ], + [ + 71.157859, + 41.143587 + ], + [ + 71.870115, + 41.3929 + ], + [ + 73.055417, + 40.866033 + ], + [ + 71.774875, + 40.145844 + ], + [ + 71.014198, + 40.244366 + ], + [ + 70.601407, + 40.218527 + ], + [ + 70.45816, + 40.496495 + ], + [ + 70.666622, + 40.960213 + ], + [ + 69.329495, + 40.727824 + ], + [ + 69.011633, + 40.086158 + ], + [ + 68.536416, + 39.533453 + ], + [ + 67.701429, + 39.580478 + ], + [ + 67.44222, + 39.140144 + ], + [ + 68.176025, + 38.901553 + ], + [ + 68.392033, + 38.157025 + ], + [ + 67.83, + 37.144994 + ], + [ + 67.075782, + 37.356144 + ], + [ + 66.518607, + 37.362784 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"VEN", + "properties":{ + "name":"Venezuela" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + -71.331584, + 11.776284 + ], + [ + -71.360006, + 11.539994 + ], + [ + -71.94705, + 11.423282 + ], + [ + -71.620868, + 10.96946 + ], + [ + -71.633064, + 10.446494 + ], + [ + -72.074174, + 9.865651 + ], + [ + -71.695644, + 9.072263 + ], + [ + -71.264559, + 9.137195 + ], + [ + -71.039999, + 9.859993 + ], + [ + -71.350084, + 10.211935 + ], + [ + -71.400623, + 10.968969 + ], + [ + -70.155299, + 11.375482 + ], + [ + -70.293843, + 11.846822 + ], + [ + -69.943245, + 12.162307 + ], + [ + -69.5843, + 11.459611 + ], + [ + -68.882999, + 11.443385 + ], + [ + -68.233271, + 10.885744 + ], + [ + -68.194127, + 10.554653 + ], + [ + -67.296249, + 10.545868 + ], + [ + -66.227864, + 10.648627 + ], + [ + -65.655238, + 10.200799 + ], + [ + -64.890452, + 10.077215 + ], + [ + -64.329479, + 10.389599 + ], + [ + -64.318007, + 10.641418 + ], + [ + -63.079322, + 10.701724 + ], + [ + -61.880946, + 10.715625 + ], + [ + -62.730119, + 10.420269 + ], + [ + -62.388512, + 9.948204 + ], + [ + -61.588767, + 9.873067 + ], + [ + -60.830597, + 9.38134 + ], + [ + -60.671252, + 8.580174 + ], + [ + -60.150096, + 8.602757 + ], + [ + -59.758285, + 8.367035 + ], + [ + -60.550588, + 7.779603 + ], + [ + -60.637973, + 7.415 + ], + [ + -60.295668, + 7.043911 + ], + [ + -60.543999, + 6.856584 + ], + [ + -61.159336, + 6.696077 + ], + [ + -61.139415, + 6.234297 + ], + [ + -61.410303, + 5.959068 + ], + [ + -60.733574, + 5.200277 + ], + [ + -60.601179, + 4.918098 + ], + [ + -60.966893, + 4.536468 + ], + [ + -62.08543, + 4.162124 + ], + [ + -62.804533, + 4.006965 + ], + [ + -63.093198, + 3.770571 + ], + [ + -63.888343, + 4.02053 + ], + [ + -64.628659, + 4.148481 + ], + [ + -64.816064, + 4.056445 + ], + [ + -64.368494, + 3.79721 + ], + [ + -64.408828, + 3.126786 + ], + [ + -64.269999, + 2.497006 + ], + [ + -63.422867, + 2.411068 + ], + [ + -63.368788, + 2.2009 + ], + [ + -64.083085, + 1.916369 + ], + [ + -64.199306, + 1.492855 + ], + [ + -64.611012, + 1.328731 + ], + [ + -65.354713, + 1.095282 + ], + [ + -65.548267, + 0.789254 + ], + [ + -66.325765, + 0.724452 + ], + [ + -66.876326, + 1.253361 + ], + [ + -67.181294, + 2.250638 + ], + [ + -67.447092, + 2.600281 + ], + [ + -67.809938, + 2.820655 + ], + [ + -67.303173, + 3.318454 + ], + [ + -67.337564, + 3.542342 + ], + [ + -67.621836, + 3.839482 + ], + [ + -67.823012, + 4.503937 + ], + [ + -67.744697, + 5.221129 + ], + [ + -67.521532, + 5.55687 + ], + [ + -67.34144, + 6.095468 + ], + [ + -67.695087, + 6.267318 + ], + [ + -68.265052, + 6.153268 + ], + [ + -68.985319, + 6.206805 + ], + [ + -69.38948, + 6.099861 + ], + [ + -70.093313, + 6.960376 + ], + [ + -70.674234, + 7.087785 + ], + [ + -71.960176, + 6.991615 + ], + [ + -72.198352, + 7.340431 + ], + [ + -72.444487, + 7.423785 + ], + [ + -72.479679, + 7.632506 + ], + [ + -72.360901, + 8.002638 + ], + [ + -72.439862, + 8.405275 + ], + [ + -72.660495, + 8.625288 + ], + [ + -72.78873, + 9.085027 + ], + [ + -73.304952, + 9.152 + ], + [ + -73.027604, + 9.73677 + ], + [ + -72.905286, + 10.450344 + ], + [ + -72.614658, + 10.821975 + ], + [ + -72.227575, + 11.108702 + ], + [ + -71.973922, + 11.608672 + ], + [ + -71.331584, + 11.776284 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"VNM", + "properties":{ + "name":"Vietnam" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 108.05018, + 21.55238 + ], + [ + 106.715068, + 20.696851 + ], + [ + 105.881682, + 19.75205 + ], + [ + 105.662006, + 19.058165 + ], + [ + 106.426817, + 18.004121 + ], + [ + 107.361954, + 16.697457 + ], + [ + 108.269495, + 16.079742 + ], + [ + 108.877107, + 15.276691 + ], + [ + 109.33527, + 13.426028 + ], + [ + 109.200136, + 11.666859 + ], + [ + 108.36613, + 11.008321 + ], + [ + 107.220929, + 10.364484 + ], + [ + 106.405113, + 9.53084 + ], + [ + 105.158264, + 8.59976 + ], + [ + 104.795185, + 9.241038 + ], + [ + 105.076202, + 9.918491 + ], + [ + 104.334335, + 10.486544 + ], + [ + 105.199915, + 10.88931 + ], + [ + 106.24967, + 10.961812 + ], + [ + 105.810524, + 11.567615 + ], + [ + 107.491403, + 12.337206 + ], + [ + 107.614548, + 13.535531 + ], + [ + 107.382727, + 14.202441 + ], + [ + 107.564525, + 15.202173 + ], + [ + 107.312706, + 15.908538 + ], + [ + 106.556008, + 16.604284 + ], + [ + 105.925762, + 17.485315 + ], + [ + 105.094598, + 18.666975 + ], + [ + 103.896532, + 19.265181 + ], + [ + 104.183388, + 19.624668 + ], + [ + 104.822574, + 19.886642 + ], + [ + 104.435, + 20.758733 + ], + [ + 103.203861, + 20.766562 + ], + [ + 102.754896, + 21.675137 + ], + [ + 102.170436, + 22.464753 + ], + [ + 102.706992, + 22.708795 + ], + [ + 103.504515, + 22.703757 + ], + [ + 104.476858, + 22.81915 + ], + [ + 105.329209, + 23.352063 + ], + [ + 105.811247, + 22.976892 + ], + [ + 106.725403, + 22.794268 + ], + [ + 106.567273, + 22.218205 + ], + [ + 107.04342, + 21.811899 + ], + [ + 108.05018, + 21.55238 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"VUT", + "properties":{ + "name":"Vanuatu" + }, + "geometry":{ + "type":"MultiPolygon", + "coordinates":[ + [ + [ + [ + 167.844877, + -16.466333 + ], + [ + 167.515181, + -16.59785 + ], + [ + 167.180008, + -16.159995 + ], + [ + 167.216801, + -15.891846 + ], + [ + 167.844877, + -16.466333 + ] + ] + ], + [ + [ + [ + 167.107712, + -14.93392 + ], + [ + 167.270028, + -15.740021 + ], + [ + 167.001207, + -15.614602 + ], + [ + 166.793158, + -15.668811 + ], + [ + 166.649859, + -15.392704 + ], + [ + 166.629137, + -14.626497 + ], + [ + 167.107712, + -14.93392 + ] + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"PSE", + "properties":{ + "name":"West Bank" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 35.545665, + 32.393992 + ], + [ + 35.545252, + 31.782505 + ], + [ + 35.397561, + 31.489086 + ], + [ + 34.927408, + 31.353435 + ], + [ + 34.970507, + 31.616778 + ], + [ + 35.225892, + 31.754341 + ], + [ + 34.974641, + 31.866582 + ], + [ + 35.18393, + 32.532511 + ], + [ + 35.545665, + 32.393992 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"YEM", + "properties":{ + "name":"Yemen" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 53.108573, + 16.651051 + ], + [ + 52.385206, + 16.382411 + ], + [ + 52.191729, + 15.938433 + ], + [ + 52.168165, + 15.59742 + ], + [ + 51.172515, + 15.17525 + ], + [ + 49.574576, + 14.708767 + ], + [ + 48.679231, + 14.003202 + ], + [ + 48.238947, + 13.94809 + ], + [ + 47.938914, + 14.007233 + ], + [ + 47.354454, + 13.59222 + ], + [ + 46.717076, + 13.399699 + ], + [ + 45.877593, + 13.347764 + ], + [ + 45.62505, + 13.290946 + ], + [ + 45.406459, + 13.026905 + ], + [ + 45.144356, + 12.953938 + ], + [ + 44.989533, + 12.699587 + ], + [ + 44.494576, + 12.721653 + ], + [ + 44.175113, + 12.58595 + ], + [ + 43.482959, + 12.6368 + ], + [ + 43.222871, + 13.22095 + ], + [ + 43.251448, + 13.767584 + ], + [ + 43.087944, + 14.06263 + ], + [ + 42.892245, + 14.802249 + ], + [ + 42.604873, + 15.213335 + ], + [ + 42.805015, + 15.261963 + ], + [ + 42.702438, + 15.718886 + ], + [ + 42.823671, + 15.911742 + ], + [ + 42.779332, + 16.347891 + ], + [ + 43.218375, + 16.66689 + ], + [ + 43.115798, + 17.08844 + ], + [ + 43.380794, + 17.579987 + ], + [ + 43.791519, + 17.319977 + ], + [ + 44.062613, + 17.410359 + ], + [ + 45.216651, + 17.433329 + ], + [ + 45.399999, + 17.333335 + ], + [ + 46.366659, + 17.233315 + ], + [ + 46.749994, + 17.283338 + ], + [ + 47.000005, + 16.949999 + ], + [ + 47.466695, + 17.116682 + ], + [ + 48.183344, + 18.166669 + ], + [ + 49.116672, + 18.616668 + ], + [ + 52.00001, + 19.000003 + ], + [ + 52.782184, + 17.349742 + ], + [ + 53.108573, + 16.651051 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"ZAF", + "properties":{ + "name":"South Africa" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 31.521001, + -29.257387 + ], + [ + 31.325561, + -29.401978 + ], + [ + 30.901763, + -29.909957 + ], + [ + 30.622813, + -30.423776 + ], + [ + 30.055716, + -31.140269 + ], + [ + 28.925553, + -32.172041 + ], + [ + 28.219756, + -32.771953 + ], + [ + 27.464608, + -33.226964 + ], + [ + 26.419452, + -33.61495 + ], + [ + 25.909664, + -33.66704 + ], + [ + 25.780628, + -33.944646 + ], + [ + 25.172862, + -33.796851 + ], + [ + 24.677853, + -33.987176 + ], + [ + 23.594043, + -33.794474 + ], + [ + 22.988189, + -33.916431 + ], + [ + 22.574157, + -33.864083 + ], + [ + 21.542799, + -34.258839 + ], + [ + 20.689053, + -34.417175 + ], + [ + 20.071261, + -34.795137 + ], + [ + 19.616405, + -34.819166 + ], + [ + 19.193278, + -34.462599 + ], + [ + 18.855315, + -34.444306 + ], + [ + 18.424643, + -33.997873 + ], + [ + 18.377411, + -34.136521 + ], + [ + 18.244499, + -33.867752 + ], + [ + 18.25008, + -33.281431 + ], + [ + 17.92519, + -32.611291 + ], + [ + 18.24791, + -32.429131 + ], + [ + 18.221762, + -31.661633 + ], + [ + 17.566918, + -30.725721 + ], + [ + 17.064416, + -29.878641 + ], + [ + 17.062918, + -29.875954 + ], + [ + 16.344977, + -28.576705 + ], + [ + 16.824017, + -28.082162 + ], + [ + 17.218929, + -28.355943 + ], + [ + 17.387497, + -28.783514 + ], + [ + 17.836152, + -28.856378 + ], + [ + 18.464899, + -29.045462 + ], + [ + 19.002127, + -28.972443 + ], + [ + 19.894734, + -28.461105 + ], + [ + 19.895768, + -24.76779 + ], + [ + 20.165726, + -24.917962 + ], + [ + 20.758609, + -25.868136 + ], + [ + 20.66647, + -26.477453 + ], + [ + 20.889609, + -26.828543 + ], + [ + 21.605896, + -26.726534 + ], + [ + 22.105969, + -26.280256 + ], + [ + 22.579532, + -25.979448 + ], + [ + 22.824271, + -25.500459 + ], + [ + 23.312097, + -25.26869 + ], + [ + 23.73357, + -25.390129 + ], + [ + 24.211267, + -25.670216 + ], + [ + 25.025171, + -25.71967 + ], + [ + 25.664666, + -25.486816 + ], + [ + 25.765849, + -25.174845 + ], + [ + 25.941652, + -24.696373 + ], + [ + 26.485753, + -24.616327 + ], + [ + 26.786407, + -24.240691 + ], + [ + 27.11941, + -23.574323 + ], + [ + 28.017236, + -22.827754 + ], + [ + 29.432188, + -22.091313 + ], + [ + 29.839037, + -22.102216 + ], + [ + 30.322883, + -22.271612 + ], + [ + 30.659865, + -22.151567 + ], + [ + 31.191409, + -22.25151 + ], + [ + 31.670398, + -23.658969 + ], + [ + 31.930589, + -24.369417 + ], + [ + 31.752408, + -25.484284 + ], + [ + 31.837778, + -25.843332 + ], + [ + 31.333158, + -25.660191 + ], + [ + 31.04408, + -25.731452 + ], + [ + 30.949667, + -26.022649 + ], + [ + 30.676609, + -26.398078 + ], + [ + 30.685962, + -26.743845 + ], + [ + 31.282773, + -27.285879 + ], + [ + 31.86806, + -27.177927 + ], + [ + 32.071665, + -26.73382 + ], + [ + 32.83012, + -26.742192 + ], + [ + 32.580265, + -27.470158 + ], + [ + 32.462133, + -28.301011 + ], + [ + 32.203389, + -28.752405 + ], + [ + 31.521001, + -29.257387 + ] + ], + [ + [ + 28.978263, + -28.955597 + ], + [ + 28.5417, + -28.647502 + ], + [ + 28.074338, + -28.851469 + ], + [ + 27.532511, + -29.242711 + ], + [ + 26.999262, + -29.875954 + ], + [ + 27.749397, + -30.645106 + ], + [ + 28.107205, + -30.545732 + ], + [ + 28.291069, + -30.226217 + ], + [ + 28.8484, + -30.070051 + ], + [ + 29.018415, + -29.743766 + ], + [ + 29.325166, + -29.257387 + ], + [ + 28.978263, + -28.955597 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"ZMB", + "properties":{ + "name":"Zambia" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 32.759375, + -9.230599 + ], + [ + 33.231388, + -9.676722 + ], + [ + 33.485688, + -10.525559 + ], + [ + 33.31531, + -10.79655 + ], + [ + 33.114289, + -11.607198 + ], + [ + 33.306422, + -12.435778 + ], + [ + 32.991764, + -12.783871 + ], + [ + 32.688165, + -13.712858 + ], + [ + 33.214025, + -13.97186 + ], + [ + 30.179481, + -14.796099 + ], + [ + 30.274256, + -15.507787 + ], + [ + 29.516834, + -15.644678 + ], + [ + 28.947463, + -16.043051 + ], + [ + 28.825869, + -16.389749 + ], + [ + 28.467906, + -16.4684 + ], + [ + 27.598243, + -17.290831 + ], + [ + 27.044427, + -17.938026 + ], + [ + 26.706773, + -17.961229 + ], + [ + 26.381935, + -17.846042 + ], + [ + 25.264226, + -17.73654 + ], + [ + 25.084443, + -17.661816 + ], + [ + 25.07695, + -17.578823 + ], + [ + 24.682349, + -17.353411 + ], + [ + 24.033862, + -17.295843 + ], + [ + 23.215048, + -17.523116 + ], + [ + 22.562478, + -16.898451 + ], + [ + 21.887843, + -16.08031 + ], + [ + 21.933886, + -12.898437 + ], + [ + 24.016137, + -12.911046 + ], + [ + 23.930922, + -12.565848 + ], + [ + 24.079905, + -12.191297 + ], + [ + 23.904154, + -11.722282 + ], + [ + 24.017894, + -11.237298 + ], + [ + 23.912215, + -10.926826 + ], + [ + 24.257155, + -10.951993 + ], + [ + 24.314516, + -11.262826 + ], + [ + 24.78317, + -11.238694 + ], + [ + 25.418118, + -11.330936 + ], + [ + 25.75231, + -11.784965 + ], + [ + 26.553088, + -11.92444 + ], + [ + 27.16442, + -11.608748 + ], + [ + 27.388799, + -12.132747 + ], + [ + 28.155109, + -12.272481 + ], + [ + 28.523562, + -12.698604 + ], + [ + 28.934286, + -13.248958 + ], + [ + 29.699614, + -13.257227 + ], + [ + 29.616001, + -12.178895 + ], + [ + 29.341548, + -12.360744 + ], + [ + 28.642417, + -11.971569 + ], + [ + 28.372253, + -11.793647 + ], + [ + 28.49607, + -10.789884 + ], + [ + 28.673682, + -9.605925 + ], + [ + 28.449871, + -9.164918 + ], + [ + 28.734867, + -8.526559 + ], + [ + 29.002912, + -8.407032 + ], + [ + 30.346086, + -8.238257 + ], + [ + 30.740015, + -8.340007 + ], + [ + 31.157751, + -8.594579 + ], + [ + 31.556348, + -8.762049 + ], + [ + 32.191865, + -8.930359 + ], + [ + 32.759375, + -9.230599 + ] + ] + ] + } + }, + { + "type":"Feature", + "id":"ZWE", + "properties":{ + "name":"Zimbabwe" + }, + "geometry":{ + "type":"Polygon", + "coordinates":[ + [ + [ + 31.191409, + -22.25151 + ], + [ + 30.659865, + -22.151567 + ], + [ + 30.322883, + -22.271612 + ], + [ + 29.839037, + -22.102216 + ], + [ + 29.432188, + -22.091313 + ], + [ + 28.794656, + -21.639454 + ], + [ + 28.02137, + -21.485975 + ], + [ + 27.727228, + -20.851802 + ], + [ + 27.724747, + -20.499059 + ], + [ + 27.296505, + -20.39152 + ], + [ + 26.164791, + -19.293086 + ], + [ + 25.850391, + -18.714413 + ], + [ + 25.649163, + -18.536026 + ], + [ + 25.264226, + -17.73654 + ], + [ + 26.381935, + -17.846042 + ], + [ + 26.706773, + -17.961229 + ], + [ + 27.044427, + -17.938026 + ], + [ + 27.598243, + -17.290831 + ], + [ + 28.467906, + -16.4684 + ], + [ + 28.825869, + -16.389749 + ], + [ + 28.947463, + -16.043051 + ], + [ + 29.516834, + -15.644678 + ], + [ + 30.274256, + -15.507787 + ], + [ + 30.338955, + -15.880839 + ], + [ + 31.173064, + -15.860944 + ], + [ + 31.636498, + -16.07199 + ], + [ + 31.852041, + -16.319417 + ], + [ + 32.328239, + -16.392074 + ], + [ + 32.847639, + -16.713398 + ], + [ + 32.849861, + -17.979057 + ], + [ + 32.654886, + -18.67209 + ], + [ + 32.611994, + -19.419383 + ], + [ + 32.772708, + -19.715592 + ], + [ + 32.659743, + -20.30429 + ], + [ + 32.508693, + -20.395292 + ], + [ + 32.244988, + -21.116489 + ], + [ + 31.191409, + -22.25151 + ] + ] + ] + } + } + ] +} diff --git a/examples/location/geojson_viewer/data/10-countries_LICENSE b/examples/location/geojson_viewer/data/10-countries_LICENSE new file mode 100644 index 0000000..48c1d90 --- /dev/null +++ b/examples/location/geojson_viewer/data/10-countries_LICENSE @@ -0,0 +1,27 @@ +source: https://github.com/johan/world.geo.json +license: +Unless otherwise noted in individual files or directories, this is +free and unencumbered software released into the public domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or +distribute this software, either in source code form or as a compiled +binary, for any purpose, commercial or non-commercial, and by any +means. + +In jurisdictions that recognize copyright laws, the author or authors +of this software dedicate any and all copyright interest in the +software to the public domain. We make this dedication for the benefit +of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of +relinquishment in perpetuity of all present and future rights to this +software under copyright law. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +For more information, please refer to diff --git a/examples/location/geojson_viewer/data/11-full.json b/examples/location/geojson_viewer/data/11-full.json new file mode 100644 index 0000000..acfe4f2 --- /dev/null +++ b/examples/location/geojson_viewer/data/11-full.json @@ -0,0 +1,380 @@ +{ + "type" : "FeatureCollection", + "features" : [ + { + "type" : "Feature", + "geometry" : { + "type" : "Point", + "coordinates" : [ + 3, + 11 + ] + }, + "properties" : { + "name" : null, + "color" : "darkviolet" + } + }, + { + "type" : "Feature", + "geometry" : { + "type" : "MultiPoint", + "coordinates" : [ + [ + 3, + 11 + ], + [ + 3, + 11.5 + ], + [ + 3, + 12 + ] + ] + }, + "properties" : { + "name" : null, + "color" : "deeppink" + } + }, + { + "type" : "Feature", + "geometry" : { + "type" : "LineString", + "coordinates" : [ + [ + 1, + 11 + ], + [ + 3, + 13 + ], + [ + 3, + 15 + ] + ] + }, + "properties" : { + "color" : "red", + "thickness":1.1 + } + }, + { + "type" : "Feature", + "geometry" : { + "type" : "MultiLineString", + "coordinates" : [ + [ + [ + 6, + 11 + ], + [ + 8, + 13 + ], + [ + 8, + 15 + ] + ], + [ + [ + 6, + 14 + ], + [ + 8, + 14 + ], + [ + 8, + 16 + ] + ] + ] + }, + "properties" : { + "color" : "green", + "happyness" : "a lot", + "hope" : "a wee" + } + }, + { + "type" : "Feature", + "geometry" : { + "type" : "Polygon", + "coordinates" : [ + [ + [ + 1, + 5 + ], + [ + 5, + 5 + ], + [ + 5, + 1 + ], + [ + 1, + 1 + ], + [ + 1, + 5 + ] + ] + ] + }, + "properties" : { + "name" : null, + "color" : "red" + } + }, + { + "type" : "Feature", + "geometry" : { + "type" : "Polygon", + "coordinates" : [ + [ + [ + 6, + 8 + ], + [ + 12, + 8 + ], + [ + 12, + 1 + ], + [ + 6, + 1 + ], + [ + 6, + 8 + ] + ], + [ + [ + 7, + 7 + ], + [ + 9, + 7 + ], + [ + 9, + 5 + ], + [ + 7, + 5 + ], + [ + 7, + 7 + ] + ], + [ + [ + 7, + 4 + ], + [ + 8, + 4 + ], + [ + 8, + 3 + ], + [ + 7, + 3 + ], + [ + 7, + 4 + ] + ], + [ + [ + 10, + 5 + ], + [ + 11, + 5 + ], + [ + 11, + 2 + ], + [ + 9, + 2 + ], + [ + 9, + 4 + ], + [ + 9, + 4 + ], + [ + 10, + 5 + ] + ], + [ + [ + 10, + 7 + ], + [ + 11, + 7 + ], + [ + 11, + 6 + ], + [ + 10, + 6 + ], + [ + 10, + 7 + ] + ] + ] + }, + "properties" : { + "name" : "MiX creation", + "implemented by" : "Julian Sherollari", + "creation quality":10, + "implementation quality":3.14159 + } + }, + { + "type" : "Feature", + "geometry" : { + "type" : "MultiPolygon", + "coordinates" : [ + [ + [ + [ + 4, + 10 + ], + [ + 5, + 10 + ], + [ + 5, + 9 + ], + [ + 4, + 9 + ], + [ + 4, + 10 + ] + ] + ], + [ + [ + [ + 1, + 8 + ], + [ + 5, + 8 + ], + [ + 5, + 6 + ], + [ + 1, + 6 + ], + [ + 1, + 8 + ] + ] + ] + ] + }, + "properties" : { + "color" : "yellow", + "name" : null + } + }, + { + "type" : "Feature", + "geometry" : { + "type" : "GeometryCollection", + "geometries" : [ + { + "type" : "Point", + "coordinates" : [ + 14, + 2 + ] + }, + { + "type" : "Polygon", + "coordinates" : [ + [ + [ + 12, + 2 + ], + [ + 13, + 2 + ], + [ + 13, + 1 + ], + [ + 12, + 1 + ], + [ + 12, + 2 + ] + ] + ] + } + ] + }, + "properties" : { + "color" : "dodgerblue", + "name" : null + } + } + ] +} diff --git a/examples/location/geojson_viewer/geojson_viewer.pro b/examples/location/geojson_viewer/geojson_viewer.pro new file mode 100644 index 0000000..08b2814 --- /dev/null +++ b/examples/location/geojson_viewer/geojson_viewer.pro @@ -0,0 +1,22 @@ +TARGET = qml_location_geojsonviewer +TEMPLATE = app + +QT += core qml network quick positioning location-private widgets +android: QT += androidextras + +SOURCES += main.cpp +CONFIG += c++11 +CONFIG += install_ok + +QT_FOR_CONFIG += location-private + + +RESOURCES += \ + qml.qrc + +OTHER_FILES += \ + $$files(data/*.json) + +target.path = $$[QT_INSTALL_EXAMPLES]/location/geojsonviewer +INSTALLS += target +DEFINES += $$shell_quote(SRC_PATH=$$PWD) diff --git a/examples/location/geojson_viewer/main.cpp b/examples/location/geojson_viewer/main.cpp new file mode 100644 index 0000000..61f7d23 --- /dev/null +++ b/examples/location/geojson_viewer/main.cpp @@ -0,0 +1,296 @@ +/**************************************************************************** +** +** Copyright (C) 2019 Julian Sherollari +** Copyright (C) 2019 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef Q_OS_ANDROID +#include +#endif + +class extractor +{ +public: + extractor(); + + static bool hasProperties(QQuickItem *item) + { + QVariant props = item->property("props"); + return !props.isNull(); + } + + static bool isFeatureCollection(QQuickItem *item) + { + QVariant geoJsonType = item->property("geojsonType"); + return geoJsonType.toString() == QStringLiteral("FeatureCollection"); + } + + static bool isGeoJsonEntry(QQuickItem *item) + { + QVariant geoJsonType = item->property("geojsonType"); + return !geoJsonType.toString().isEmpty(); + } + + static QVariantMap toVariant(QDeclarativePolygonMapItem *mapPolygon) + { + QVariantMap ls; + ls["type"] = "Polygon"; + ls["data"] = QVariant::fromValue(mapPolygon->geoShape()); + if (hasProperties(mapPolygon)) + ls["properties"] = mapPolygon->property("props").toMap(); + return ls; + } + static QVariantMap toVariant(QDeclarativePolylineMapItem *mapPolyline) + { + QVariantMap ls; + ls["type"] = "LineString"; + ls["data"] = QVariant::fromValue(mapPolyline->geoShape()); + if (hasProperties(mapPolyline)) + ls["properties"] = mapPolyline->property("props").toMap(); + return ls; + } + static QVariantMap toVariant(QDeclarativeCircleMapItem *mapCircle) + { + QVariantMap pt; + pt["type"] = "Point"; + pt["data"] = QVariant::fromValue(mapCircle->geoShape()); + if (hasProperties(mapCircle)) + pt["properties"] = mapCircle->property("props").toMap(); + return pt; + } + + static QVariantMap toVariant(QDeclarativeGeoMapItemView *mapItemView) + { + // bool featureCollecton = isFeatureCollection(mapItemView); + + // If not a feature collection, this must be a geometry collection, + // or a multilinestring/multipoint/multipolygon. + // To disambiguate, one could check for heterogeneity. + // For simplicity, in this example, we expect the property "geojsonType" to be injected in the mapItemView + // by the delegate, and to be correct. + + QString nodeType = mapItemView->property("geojsonType").toString(); + QVariantMap root; + if (!nodeType.isEmpty()) // Empty nodeType can happen only for the root MIV + root["type"] = nodeType; + if (hasProperties(mapItemView)) // Features are converted to regular types w properties. + root["properties"] = mapItemView->property("props").toMap(); + + QVariantList features; + const QList &quickChildren = mapItemView->childItems(); + for (auto kid : quickChildren) { + QVariant entry; + if (QDeclarativeGeoMapItemView *miv = qobject_cast(kid)) { + // Handle nested miv + entry = toVariant(miv); + } else if (QDeclarativePolylineMapItem *polyline = qobject_cast(kid)) { + entry = toVariant(polyline); + } else if (QDeclarativePolygonMapItem *polygon = qobject_cast(kid)) { + entry = toVariant(polygon); + } else if (QDeclarativeCircleMapItem *circle = qobject_cast(kid)) { + entry = toVariant(circle); // If GeoJSON Point type is visualized in other ways, handle those types here instead. + } + features.append(entry); + } + if (nodeType.isEmpty()) // Dirty hack to handle (=skip) the first MIV used to process the fictitious list with 1 element + return features.first().toMap(); + root["data"] = features; + return root; + } +}; + +class GeoJsoner: public QObject +{ + Q_OBJECT + Q_PROPERTY(QVariant model MEMBER m_importedGeoJson NOTIFY modelChanged) + +public: + GeoJsoner(QObject *parent = nullptr) : QObject(parent) + { + + } + +public slots: + + Q_INVOKABLE bool load(QUrl url) + { + // Reading GeoJSON file + QFile loadFile(url.toLocalFile()); + if (!loadFile.open(QIODevice::ReadOnly)) { + qWarning() << "Error while opening the file: " << url; + qWarning() << loadFile.error() << loadFile.errorString(); + return false; + } + + // Load the GeoJSON file using Qt's API + QJsonParseError err; + QJsonDocument loadDoc(QJsonDocument::fromJson(loadFile.readAll(), &err)); + if (err.error) { + qWarning() << "Parsing while importing the JSON document:\n" << err.errorString(); + return false; + } + + // Import geographic data to a QVariantList + QVariantList modelList = QGeoJson::importGeoJson(loadDoc); + m_importedGeoJson = modelList; + emit modelChanged(); + return true; + } + + // Used by the MapItemView Extractor to identify a Feature + Q_INVOKABLE QVariantList toGeoJson(QDeclarativeGeoMapItemView *mapItemView) + { + QVariantList res; + QDeclarativeGeoMapItemView *root = mapItemView; + QVariantMap miv = extractor::toVariant(root); + if (!miv.isEmpty()) + res.append(miv); + return res; + } + + Q_INVOKABLE void dumpGeoJSON(QVariantList geoJson, QUrl url) + { + QJsonDocument json = QGeoJson::exportGeoJson(geoJson); + QFile jsonFile(url.toLocalFile()); + jsonFile.open(QIODevice::WriteOnly); + jsonFile.write(json.toJson()); + jsonFile.close(); + } + + Q_INVOKABLE void writeDebug(QVariantList geoJson, QUrl url) + { + QString prettyPrint = QGeoJson::toString(geoJson); + QFile debugFile(url.toLocalFile()); + debugFile.open(QIODevice::WriteOnly); + debugFile.write(prettyPrint.toUtf8()); + debugFile.close(); + } + + Q_INVOKABLE void print(QDeclarativeGeoMapItemView *view) + { + QVariantList list; + list.append(extractor::toVariant(view)); + QString prettyPrint = + QGeoJson::toString(list); + qDebug().noquote() << prettyPrint; + } + +signals: + void modelChanged(); + +public: + QVariant m_importedGeoJson; +}; + +#include "main.moc" + +#ifdef Q_OS_ANDROID +// Request permissions because we're using QStandardPaths::writableLocation() +bool requestStoragePermissions() { + using namespace QtAndroid; + + QString permission = QStringLiteral("android.permission.WRITE_EXTERNAL_STORAGE"); + const QHash results = requestPermissionsSync(QStringList({permission})); + if (!results.contains(permission) || results[permission] == PermissionResult::Denied) { + qWarning() << "Couldn't get permission: " << permission; + return false; + } + + return true; +} +#endif + +int main(int argc, char *argv[]) +{ + QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); + QApplication app(argc, argv); +#ifdef Q_OS_ANDROID + if (!requestStoragePermissions()) + return -1; +#endif + + QQmlApplicationEngine engine; + QUrl absoluteFilePath = argc > 1 ? + QUrl(QStringLiteral("file://") + QFileInfo(argv[1]).absoluteFilePath()) : + QUrl(); + engine.rootContext()->setContextProperty("dataPath", QUrl(QStringLiteral("file://") + + qPrintable(QT_STRINGIFY(SRC_PATH)) + + QStringLiteral("/data"))); + qmlRegisterType("Qt.GeoJson", 1, 0, "GeoJsoner"); + engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); + + if (engine.rootObjects().isEmpty()) + return -1; + if (!absoluteFilePath.isEmpty()) { + GeoJsoner *geoJsoner = engine.rootObjects().first()->findChild(); + QMetaObject::invokeMethod(geoJsoner, "load", Qt::QueuedConnection, Q_ARG(QUrl, absoluteFilePath)); + } + + return app.exec(); +} diff --git a/examples/location/geojson_viewer/main.qml b/examples/location/geojson_viewer/main.qml new file mode 100644 index 0000000..1b55ef8 --- /dev/null +++ b/examples/location/geojson_viewer/main.qml @@ -0,0 +1,215 @@ +/**************************************************************************** +** +** Copyright (C) 2019 Julian Sherollari +** Copyright (C) 2019 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.11 +import QtQuick.Controls 1.4 as C1 +import QtQuick.Controls.Styles 1.4 +import Qt.labs.platform 1.1 +import QtQuick.Layouts 1.11 +import QtQuick.Window 2.11 +import QtPositioning 5.12 +import QtLocation 5.12 +import Qt.labs.qmlmodels 1.0 +import Qt.labs.location 1.0 +import Qt.GeoJson 1.0 + +C1.ApplicationWindow { + id: win + visible: true + width: 1024 + height: 1024 + menuBar: mainMenu + title: qsTr("GeoJSON Viewer") + property bool openGLBackends: glBackendSelector.checked + + FileDialog { + visible: false + id: fileDialog + title: "Choose a GeoJSON file" + fileMode: FileDialog.OpenFile + folder: dataPath + onAccepted: { + geoJsoner.load(fileDialog.file) + } + } + + FileDialog { + visible: false + id: fileWriteDialog + title: "Write your geometry to a file" + fileMode: FileDialog.SaveFile + folder: StandardPaths.writableLocation(StandardPaths.TempLocation) + onAccepted: { + geoJsoner.dumpGeoJSON(geoJsoner.toGeoJson(miv), fileWriteDialog.file); + } + } + + FileDialog { + visible: false + id: debugWriteDialog + title: "Write Qvariant debug view" + fileMode: FileDialog.SaveFile + folder: StandardPaths.writableLocation(StandardPaths.TempLocation) + onAccepted: { + geoJsoner.writeDebug(geoJsoner.toGeoJson(miv), debugWriteDialog.file); + } + } + + C1.MenuBar { + id: mainMenu + + C1.Menu { + title: "&File" + id : geoJsonMenu + C1.MenuItem { + text: "&Open" + shortcut: StandardKey.Open + onTriggered: { + fileDialog.open() + } + } + C1.MenuItem { + text: "&Export" + shortcut: StandardKey.Save + onTriggered: { + fileWriteDialog.open() + } + } + C1.MenuItem { + text: "E&xit" + shortcut: StandardKey.Quit + onTriggered: Qt.quit() + } + } + C1.Menu { + title: "&Debug" + id : debugMenu + C1.MenuItem { + text: "Print debug data to &file" + onTriggered: { + debugWriteDialog.open() + } + } + C1.MenuItem { + text: "&Print debug data" + onTriggered: { + geoJsoner.print(miv) + } + } + C1.MenuItem { + text: "OpenGL Item backends" + id: glBackendSelector + checkable: true + checked: false + } + + C1.MenuItem { + text: "Map Object Delegates" + id: mapObjectsSelector + checkable: true + checked: false + + onCheckedChanged: { + if (checked) { + miv.model = undefined + map.removeMapItemView(miv) + rootMoV.addMapObject(mov) + mov.model = geoJsoner.model + } else { + mov.model = undefined + rootMoV.removeMapObject(mov) + map.addMapItemView(miv) + miv.model = geoJsoner.model + } + } + } + } + + } + + GeoJsoner { + id: geoJsoner + } + + Shortcut { + sequence: "Ctrl+P" + onActivated: { + + console.log("Center : QtPositioning.coordinate(",map.center.latitude,",",map.center.longitude,")") + console.log("Zoom : ",map.zoomLevel) + } + } + + MapObjectView { + id: mov + delegate: GeoJsonDelegateMapObject {} + } + + Map { + id: map + anchors.fill: parent + center: QtPositioning.coordinate(43.59, 13.50) // Starting coordinates: Ancona, the city where I am studying :) + plugin: Plugin { name: "osm" } + zoomLevel: 4 + + MapObjectView { + id: rootMoV + } + + MapItemView { + id: miv + model: geoJsoner.model + delegate: GeoJsonDelegate { + openGLBackends: win.openGLBackends + } + } + } +} diff --git a/examples/location/geojson_viewer/qml.qrc b/examples/location/geojson_viewer/qml.qrc new file mode 100644 index 0000000..794a209 --- /dev/null +++ b/examples/location/geojson_viewer/qml.qrc @@ -0,0 +1,7 @@ + + + main.qml + GeoJsonDelegate.qml + GeoJsonDelegateMapObject.qml + + diff --git a/examples/location/itemview_transitions/OsloListModel.qml b/examples/location/itemview_transitions/OsloListModel.qml new file mode 100644 index 0000000..38e5799 --- /dev/null +++ b/examples/location/itemview_transitions/OsloListModel.qml @@ -0,0 +1,13460 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.0 + + +ListModel { + id: boundariesModel + property var geometries: { + 'Alna_9' : [ + Qt.point(0.530021277778,0.290828950269) + , Qt.point(0.530022955556,0.290828551201) + , Qt.point(0.530027338889,0.290827143373) + , Qt.point(0.530029541667,0.290826638991) + , Qt.point(0.530033122222,0.290825979412) + , Qt.point(0.530034466667,0.290825785418) + , Qt.point(0.530036788889,0.290825513826) + , Qt.point(0.530038238889,0.290825391887) + , Qt.point(0.530039372222,0.290825319831) + , Qt.point(0.530041136111,0.290825170178) + , Qt.point(0.530042533333,0.290825136922) + , Qt.point(0.530043458333,0.290825170178) + , Qt.point(0.530048294444,0.29082521452) + , Qt.point(0.530049658333,0.290825281032) + , Qt.point(0.530051683333,0.29082548057) + , Qt.point(0.530069769444,0.290827481474) + , Qt.point(0.530070558333,0.290827426048) + , Qt.point(0.530071777778,0.290827315195) + , Qt.point(0.530072419444,0.290827226513) + , Qt.point(0.530074752778,0.290826733216) + , Qt.point(0.530076475,0.290826184492) + , Qt.point(0.530078977778,0.290825297661) + , Qt.point(0.530080127778,0.290824859786) + , Qt.point(0.530080844444,0.290824615906) + , Qt.point(0.530081627778,0.29082429997) + , Qt.point(0.530083302778,0.290823762324) + , Qt.point(0.530084494444,0.290823429759) + , Qt.point(0.530085716667,0.290823135992) + , Qt.point(0.530087986111,0.290822736912) + , Qt.point(0.530088702778,0.290822631599) + , Qt.point(0.530089663889,0.290822548457) + , Qt.point(0.530090355556,0.290822531829) + , Qt.point(0.530090752778,0.290822631599) + , Qt.point(0.530091308333,0.290822820054) + , Qt.point(0.530091497222,0.290823374331) + , Qt.point(0.530093608333,0.290823219133) + , Qt.point(0.530093772222,0.290822509657) + , Qt.point(0.530094013889,0.290821450981) + , Qt.point(0.530094336111,0.29081987127) + , Qt.point(0.530095177778,0.290815370403) + , Qt.point(0.530095355556,0.290812515732) + , Qt.point(0.530095361111,0.29080954461) + , Qt.point(0.530095086111,0.290806551267) + , Qt.point(0.530093761111,0.290795968855) + , Qt.point(0.530093536111,0.290793623901) + , Qt.point(0.530093575,0.290791977426) + , Qt.point(0.530093716667,0.29078979319) + , Qt.point(0.530094016667,0.290787836226) + , Qt.point(0.530094291667,0.290786416998) + , Qt.point(0.530095408333,0.290781887593) + , Qt.point(0.530096830556,0.290776920087) + , Qt.point(0.530098691667,0.290771592067) + , Qt.point(0.530099741667,0.290768986215) + , Qt.point(0.530101730556,0.290764384301) + , Qt.point(0.530102705556,0.290762343897) + , Qt.point(0.530103822222,0.290760303471) + , Qt.point(0.530104861111,0.290758545803) + , Qt.point(0.530106363889,0.290756427708) + , Qt.point(0.530107658333,0.290754636734) + , Qt.point(0.530107808333,0.290754470389) + , Qt.point(0.530108397222,0.290753793917) + , Qt.point(0.530110247222,0.290751753396) + , Qt.point(0.530111933333,0.29075023408) + , Qt.point(0.530114875,0.290747833092) + , Qt.point(0.530118308333,0.29074554852) + , Qt.point(0.530121641667,0.290743513453) + , Qt.point(0.530126066667,0.290741334187) + , Qt.point(0.5301293,0.290740042142) + , Qt.point(0.530132183333,0.290739104987) + , Qt.point(0.530136558333,0.290737918288) + , Qt.point(0.530145358333,0.290735844319) + , Qt.point(0.530149483333,0.290734907143) + , Qt.point(0.530153033333,0.290734069781) + , Qt.point(0.530153363889,0.290733969962) + , Qt.point(0.530158677778,0.290732838685) + , Qt.point(0.530160338889,0.290732300771) + , Qt.point(0.530161511111,0.29073186822) + , Qt.point(0.530164166667,0.29073078684) + , Qt.point(0.530167244444,0.290729322807) + , Qt.point(0.5301948,0.290713350782) + , Qt.point(0.530198633333,0.290711165612) + , Qt.point(0.530201019444,0.290709579407) + , Qt.point(0.530204155556,0.290707444109) + , Qt.point(0.530212188889,0.290701365306) + , Qt.point(0.530215847222,0.29069847004) + , Qt.point(0.53021765,0.290697144414) + , Qt.point(0.530219638889,0.290695779952) + , Qt.point(0.530221763889,0.290694387747) + , Qt.point(0.530223827778,0.290693306146) + , Qt.point(0.530226558333,0.29069205259) + , Qt.point(0.530230963889,0.29069013896) + , Qt.point(0.530233169444,0.290688951945) + , Qt.point(0.530235308333,0.290686977267) + , Qt.point(0.530237827778,0.290685479603) + , Qt.point(0.530239336111,0.290683909817) + , Qt.point(0.530241297222,0.290681546793) + , Qt.point(0.530242744444,0.290679305774) + , Qt.point(0.530243861111,0.290677253332) + , Qt.point(0.530244280556,0.290676343593) + , Qt.point(0.5302453,0.290674352138) + , Qt.point(0.530245563889,0.290673703107) + , Qt.point(0.5302466,0.290671589582) + , Qt.point(0.530247530556,0.290669819971) + , Qt.point(0.530248794444,0.290667811803) + , Qt.point(0.530249863889,0.290666325079) + , Qt.point(0.530250547222,0.290665487404) + , Qt.point(0.530251547222,0.290664372348) + , Qt.point(0.530252438889,0.290663479188) + , Qt.point(0.530253019444,0.290662868953) + , Qt.point(0.530254647222,0.29066154307) + , Qt.point(0.530255558333,0.290660844065) + , Qt.point(0.530256205556,0.29066042799) + , Qt.point(0.530256836111,0.290659956437) + , Qt.point(0.530257377778,0.290659623575) + , Qt.point(0.530258708333,0.290658874633) + , Qt.point(0.530260405556,0.290658092402) + , Qt.point(0.530261105556,0.290657815014) + , Qt.point(0.530262138889,0.290657432219) + , Qt.point(0.530263011111,0.290657138187) + , Qt.point(0.530264097222,0.290656860797) + , Qt.point(0.530264605556,0.290656738746) + , Qt.point(0.530265163889,0.29065657786) + , Qt.point(0.530267386111,0.29065620061) + , Qt.point(0.530268958333,0.290656084106) + , Qt.point(0.530269780556,0.290656050819) + , Qt.point(0.530270741667,0.290656050819) + , Qt.point(0.530273258333,0.290656183966) + , Qt.point(0.530275247222,0.290656539025) + , Qt.point(0.530276766667,0.290656871893) + , Qt.point(0.530277519444,0.290657088257) + , Qt.point(0.530278513889,0.29065740448) + , Qt.point(0.530280383333,0.290658125688) + , Qt.point(0.530281047222,0.290658425267) + , Qt.point(0.530281969444,0.290658863538) + , Qt.point(0.530284397222,0.29066011732) + , Qt.point(0.530287225,0.290661648475) + , Qt.point(0.530290122222,0.290663162975) + , Qt.point(0.530291586111,0.290663917447) + , Qt.point(0.5302926,0.290664444466) + , Qt.point(0.530293961111,0.290665198932) + , Qt.point(0.530296227778,0.290666363911) + , Qt.point(0.530297902778,0.290667279246) + , Qt.point(0.530300583333,0.290668655014) + , Qt.point(0.530301969444,0.290669409463) + , Qt.point(0.530304602778,0.290671045942) + , Qt.point(0.530303705556,0.290671356594) + , Qt.point(0.530302711111,0.290671750455) + , Qt.point(0.530301516667,0.290672244167) + , Qt.point(0.530298380556,0.290673597709) + , Qt.point(0.530298430556,0.2906741247) + , Qt.point(0.530297919444,0.290674174626) + , Qt.point(0.530297552778,0.290674313307) + , Qt.point(0.530296413889,0.290675117658) + , Qt.point(0.530295694444,0.290675561436) + , Qt.point(0.530295097222,0.290676110611) + , Qt.point(0.53029445,0.290676754086) + , Qt.point(0.530294119444,0.290677192313) + , Qt.point(0.530294102778,0.290677508501) + , Qt.point(0.530294136111,0.29067786352) + , Qt.point(0.53029375,0.290677846878) + , Qt.point(0.530293333333,0.290677996651) + , Qt.point(0.530293208333,0.290678662308) + , Qt.point(0.530293013889,0.290679133813) + , Qt.point(0.530292225,0.290680165574) + , Qt.point(0.5302917,0.290680736923) + , Qt.point(0.530290997222,0.290681580075) + , Qt.point(0.530289705556,0.290683760049) + , Qt.point(0.530288908333,0.290684802877) + , Qt.point(0.530288138889,0.29068561273) + , Qt.point(0.530287891667,0.290685784684) + , Qt.point(0.530287472222,0.29068615078) + , Qt.point(0.530286438889,0.290686905157) + , Qt.point(0.530285461111,0.290687393282) + , Qt.point(0.530286063889,0.2906883307) + , Qt.point(0.530286708333,0.290689379049) + , Qt.point(0.530287302778,0.290690527235) + , Qt.point(0.530287927778,0.290691614399) + , Qt.point(0.530288416667,0.290691775254) + , Qt.point(0.530289861111,0.290694143694) + , Qt.point(0.530289841667,0.29069464844) + , Qt.point(0.530290502778,0.290695791045) + , Qt.point(0.530290744444,0.290696312426) + , Qt.point(0.530290513889,0.290697205426) + , Qt.point(0.530290322222,0.290697821094) + , Qt.point(0.530290127778,0.290698813924) + , Qt.point(0.530290072222,0.290699396308) + , Qt.point(0.530290088889,0.290699828935) + , Qt.point(0.530290255556,0.290700344758) + , Qt.point(0.530290333333,0.290700688639) + , Qt.point(0.530289011111,0.290700788475) + , Qt.point(0.530286908333,0.290700888312) + , Qt.point(0.530284858333,0.290702019786) + , Qt.point(0.530284263889,0.290702385849) + , Qt.point(0.530283755556,0.290703334284) + , Qt.point(0.530283280556,0.290703816818) + , Qt.point(0.530282911111,0.290703927746) + , Qt.point(0.530282525,0.290703988756) + , Qt.point(0.530281833333,0.290703988756) + , Qt.point(0.530281080556,0.290703955478) + , Qt.point(0.530279958333,0.290703999849) + , Qt.point(0.53027935,0.290703949931) + , Qt.point(0.530278686111,0.290703927746) + , Qt.point(0.530278222222,0.290703961024) + , Qt.point(0.530277111111,0.290704432465) + , Qt.point(0.530276588889,0.290704521206) + , Qt.point(0.530276722222,0.290705286601) + , Qt.point(0.530277072222,0.290706601075) + , Qt.point(0.530277419444,0.290707621589) + , Qt.point(0.530277608333,0.290708497896) + , Qt.point(0.530278177778,0.290710827297) + , Qt.point(0.530279077778,0.290714293614) + , Qt.point(0.530279283333,0.290714997961) + , Qt.point(0.530279627778,0.290715796588) + , Qt.point(0.530279788889,0.290716129349) + , Qt.point(0.530279997222,0.290716412194) + , Qt.point(0.530280272222,0.290716844781) + , Qt.point(0.530280619444,0.290717244091) + , Qt.point(0.530281163889,0.290717942881) + , Qt.point(0.530281561111,0.290718392102) + , Qt.point(0.530282105556,0.290718941149) + , Qt.point(0.530282947222,0.290719883952) + , Qt.point(0.530283838889,0.290720782383) + , Qt.point(0.530284355556,0.290721303693) + , Qt.point(0.530284527778,0.290721497797) + , Qt.point(0.530285066667,0.290722057926) + , Qt.point(0.530286113889,0.290722956347) + , Qt.point(0.530287361111,0.290723732756) + , Qt.point(0.530288105556,0.290724281787) + , Qt.point(0.530289047222,0.290724930639) + , Qt.point(0.530290186111,0.290725779134) + , Qt.point(0.530290533333,0.290726128513) + , Qt.point(0.530290830556,0.290726477892) + , Qt.point(0.530290930556,0.290726777359) + , Qt.point(0.530291077778,0.290727076825) + , Qt.point(0.530291175,0.290727675756) + , Qt.point(0.530291175,0.2907278754) + , Qt.point(0.530291125,0.290728224775) + , Qt.point(0.530291122222,0.290728568604) + , Qt.point(0.530290822222,0.290729317262) + , Qt.point(0.530290425,0.290729810819) + , Qt.point(0.530290175,0.290730060371) + , Qt.point(0.530289655556,0.29073038756) + , Qt.point(0.530289255556,0.290730526199) + , Qt.point(0.530288588889,0.290730609382) + , Qt.point(0.530287491667,0.290730454106) + , Qt.point(0.530287141667,0.290730448561) + , Qt.point(0.530286511111,0.290730675929) + , Qt.point(0.530286197222,0.290730997571) + , Qt.point(0.530285997222,0.29073139685) + , Qt.point(0.530285947222,0.290731690764) + , Qt.point(0.530285947222,0.290731940312) + , Qt.point(0.530286319444,0.290734818416) + , Qt.point(0.530286919444,0.290734774052) + , Qt.point(0.530289138889,0.29073474078) + , Qt.point(0.530290061111,0.290734840598) + , Qt.point(0.530290902778,0.290734835052) + , Qt.point(0.530292697222,0.290734945961) + , Qt.point(0.530293488889,0.290735051324) + , Qt.point(0.530294325,0.290735123415) + , Qt.point(0.530296683333,0.290735411776) + , Qt.point(0.530298308333,0.290735711229) + , Qt.point(0.530299252778,0.290735761137) + , Qt.point(0.530300247222,0.290735860955) + , Qt.point(0.530301388889,0.290736016226) + , Qt.point(0.530302236111,0.290736021771) + , Qt.point(0.530303441667,0.290736077225) + , Qt.point(0.530304402778,0.290736099407) + , Qt.point(0.530306708333,0.290736088316) + , Qt.point(0.530307530556,0.290735982954) + , Qt.point(0.530308630556,0.290735916409) + , Qt.point(0.530310727778,0.290735677956) + , Qt.point(0.530311897222,0.290735489412) + , Qt.point(0.530313513889,0.290735106778) + , Qt.point(0.530314311111,0.290734857234) + , Qt.point(0.530315008333,0.290734713053) + , Qt.point(0.530316163889,0.29073436369) + , Qt.point(0.530317544444,0.290734019871) + , Qt.point(0.530318561111,0.290733725962) + , Qt.point(0.530319733333,0.290733282324) + , Qt.point(0.530322686111,0.290732583592) + , Qt.point(0.530323213889,0.290732395045) + , Qt.point(0.530324258333,0.290732200952) + , Qt.point(0.530326147222,0.29073180722) + , Qt.point(0.530326941667,0.290731762856) + , Qt.point(0.530327688889,0.290731663036) + , Qt.point(0.530328716667,0.290731635308) + , Qt.point(0.530329188889,0.290731602035) + , Qt.point(0.530331352778,0.290731663036) + , Qt.point(0.530332705556,0.290731929221) + , Qt.point(0.530335686111,0.290732334044) + , Qt.point(0.530338963889,0.290732944049) + , Qt.point(0.530340402778,0.290733293415) + , Qt.point(0.530341986111,0.290733653871) + , Qt.point(0.53034375,0.29073400878) + , Qt.point(0.530345738889,0.290734469053) + , Qt.point(0.530346769444,0.290734685325) + , Qt.point(0.530347522222,0.290734807325) + , Qt.point(0.530347719444,0.290738134556) + , Qt.point(0.530347822222,0.290739043989) + , Qt.point(0.530347875,0.290739310164) + , Qt.point(0.530347991667,0.290740252862) + , Qt.point(0.530348269444,0.29074117892) + , Qt.point(0.530348477778,0.290741744534) + , Qt.point(0.530348791667,0.290742249149) + , Qt.point(0.530348872222,0.290742576316) + , Qt.point(0.530349169444,0.29074297557) + , Qt.point(0.530349433333,0.29074342473) + , Qt.point(0.530349761111,0.290743873889) + , Qt.point(0.530350258333,0.290744622484) + , Qt.point(0.530350602778,0.290745021734) + , Qt.point(0.530351447222,0.290745670513) + , Qt.point(0.530351844444,0.290745925588) + , Qt.point(0.530352191667,0.290746175117) + , Qt.point(0.530352686111,0.290746474552) + , Qt.point(0.530353405556,0.290746846072) + , Qt.point(0.530355166667,0.290747677831) + , Qt.point(0.530355866667,0.290747855272) + , Qt.point(0.530356511111,0.290748065984) + , Qt.point(0.530358591667,0.290748831197) + , Qt.point(0.530359188889,0.290749080723) + , Qt.point(0.530359808333,0.290749391243) + , Qt.point(0.530361238889,0.290750145361) + , Qt.point(0.530361883333,0.290750500239) + , Qt.point(0.530362580556,0.29075093829) + , Qt.point(0.530364027778,0.290751958558) + , Qt.point(0.530365341667,0.290752917826) + , Qt.point(0.530365186111,0.290753122987) + , Qt.point(0.530365083333,0.290753250519) + , Qt.point(0.530365061111,0.290753272699) + , Qt.point(0.530364997222,0.290753350327) + , Qt.point(0.530362219444,0.29075662732) + , Qt.point(0.530361975,0.290756915648) + , Qt.point(0.530361491667,0.290757481214) + , Qt.point(0.530361033333,0.290757824988) + , Qt.point(0.530360058333,0.290759294339) + , Qt.point(0.530359077778,0.290760680508) + , Qt.point(0.530358641667,0.29076127933) + , Qt.point(0.530358427778,0.290761318142) + , Qt.point(0.5303578,0.290762881723) + , Qt.point(0.530357444444,0.29076409044) + , Qt.point(0.530353766667,0.290774813292) + , Qt.point(0.530353458333,0.290775672646) + , Qt.point(0.530352916667,0.290776548628) + , Qt.point(0.530348772222,0.29078274137) + , Qt.point(0.530346719444,0.290785807171) + , Qt.point(0.530346655556,0.290785956856) + , Qt.point(0.530346530556,0.290786250682) + , Qt.point(0.530343536111,0.29079316932) + , Qt.point(0.5303403,0.290793418785) + , Qt.point(0.53033525,0.290793646076) + , Qt.point(0.5303277,0.290794072937) + , Qt.point(0.5303199,0.290794599583) + , Qt.point(0.530316719444,0.290794738174) + , Qt.point(0.53031385,0.290790502792) + , Qt.point(0.530310983333,0.290786311665) + , Qt.point(0.530308508333,0.29078257505) + , Qt.point(0.530306975,0.290780329718) + , Qt.point(0.530306927778,0.290779830751) + , Qt.point(0.530306880556,0.290778738565) + , Qt.point(0.530306688889,0.290776398935) + , Qt.point(0.530306591667,0.290775600571) + , Qt.point(0.530306444444,0.290774852102) + , Qt.point(0.530306347222,0.290774109174) + , Qt.point(0.530306252778,0.290772811814) + , Qt.point(0.530306105556,0.290772113233) + , Qt.point(0.530306008333,0.290771370293) + , Qt.point(0.530305811111,0.290770571908) + , Qt.point(0.530305563889,0.290769723619) + , Qt.point(0.530304972222,0.290768132374) + , Qt.point(0.530304627778,0.290767483675) + , Qt.point(0.530303986111,0.290766186269) + , Qt.point(0.530303738889,0.290765787065) + , Qt.point(0.530303491667,0.290765437761) + , Qt.point(0.530302994444,0.290764888854) + , Qt.point(0.5303025,0.290764489647) + , Qt.point(0.530301855556,0.290763890836) + , Qt.point(0.530301408333,0.290763441726) + , Qt.point(0.530300913889,0.290763042516) + , Qt.point(0.530300416667,0.290762693207) + , Qt.point(0.530299625,0.290762194193) + , Qt.point(0.530298880556,0.290761844882) + , Qt.point(0.530298236111,0.290761445669) + , Qt.point(0.53029745,0.290761101901) + , Qt.point(0.530296627778,0.290760697142) + , Qt.point(0.530295755556,0.290760142676) + , Qt.point(0.530294433333,0.290759044827) + , Qt.point(0.530293961111,0.290758922844) + , Qt.point(0.530292844444,0.290758778681) + , Qt.point(0.530292319444,0.290758745413) + , Qt.point(0.530291586111,0.290758723234) + , Qt.point(0.530289961111,0.290758928389) + , Qt.point(0.530287955556,0.290759377509) + , Qt.point(0.530287161111,0.290759521671) + , Qt.point(0.530285591667,0.290759865442) + , Qt.point(0.530284283333,0.290760103863) + , Qt.point(0.530282305556,0.290761445669) + , Qt.point(0.530281683333,0.290759222258) + , Qt.point(0.530281008333,0.290757342595) + , Qt.point(0.53027705,0.290760608428) + , Qt.point(0.530275894444,0.290761584285) + , Qt.point(0.530275333333,0.29076202231) + , Qt.point(0.530274983333,0.290762354986) + , Qt.point(0.530271763889,0.290764988655) + , Qt.point(0.530271394444,0.290765249248) + , Qt.point(0.530268175,0.290767949408) + , Qt.point(0.530267788889,0.290768298707) + , Qt.point(0.530266722222,0.290769135914) + , Qt.point(0.530266022222,0.290769751341) + , Qt.point(0.530265005556,0.29077054973) + , Qt.point(0.53026455,0.290770954468) + , Qt.point(0.530262869444,0.290772312828) + , Qt.point(0.530262294444,0.290772817359) + , Qt.point(0.530259963889,0.290774735673) + , Qt.point(0.530258986111,0.29077557285) + , Qt.point(0.530258686111,0.29077578353) + , Qt.point(0.530257444444,0.290776825836) + , Qt.point(0.530257111111,0.29077706978) + , Qt.point(0.530256394444,0.290777701813) + , Qt.point(0.530256377778,0.290777474503) + , Qt.point(0.530255519444,0.290776310228) + , Qt.point(0.530254655556,0.290775001796) + , Qt.point(0.53025465,0.290777324811) + , Qt.point(0.530253355556,0.290778322756) + , Qt.point(0.530252555556,0.290783534158) + , Qt.point(0.530251561111,0.290783317944) + , Qt.point(0.530250880556,0.290783018569) + , Qt.point(0.530250655556,0.290782475258) + , Qt.point(0.530249394444,0.290783329032) + , Qt.point(0.530246069444,0.290785845978) + , Qt.point(0.530243919444,0.290787376087) + , Qt.point(0.530242502778,0.290788440503) + , Qt.point(0.530242675,0.290788950534) + , Qt.point(0.530242761111,0.290789438388) + , Qt.point(0.530242741667,0.290789965047) + , Qt.point(0.530242425,0.290790979555) + , Qt.point(0.530242491667,0.290792764631) + , Qt.point(0.530242430556,0.290795525367) + , Qt.point(0.530242177778,0.2907988515) + , Qt.point(0.530231194444,0.29079918411) + , Qt.point(0.530230438889,0.290800725195) + , Qt.point(0.530230333333,0.290801584428) + , Qt.point(0.530230444444,0.29080529294) + , Qt.point(0.530230266667,0.290807044618) + , Qt.point(0.530230552778,0.290809184303) + , Qt.point(0.530231061111,0.290810420431) + , Qt.point(0.530231511111,0.290812294008) + , Qt.point(0.530230963889,0.290813724123) + , Qt.point(0.530231027778,0.290816911352) + , Qt.point(0.530230475,0.290820131784) + , Qt.point(0.5302304,0.290823767867) + , Qt.point(0.530230238889,0.290824937384) + , Qt.point(0.530229861111,0.29082899461) + , Qt.point(0.530228366667,0.290828290698) + , Qt.point(0.530227211111,0.290827414963) + , Qt.point(0.530224694444,0.290828839417) + , Qt.point(0.530224972222,0.290835944894) + , Qt.point(0.530224216667,0.290837851465) + , Qt.point(0.530223619444,0.290839491988) + , Qt.point(0.530220861111,0.290839818982) + , Qt.point(0.530219827778,0.290841110326) + , Qt.point(0.530219213889,0.290841913948) + , Qt.point(0.530218655556,0.290841825273) + , Qt.point(0.530217661111,0.290840982855) + , Qt.point(0.530216211111,0.290841398522) + , Qt.point(0.530216038889,0.290840733454) + , Qt.point(0.530214508333,0.290838089785) + , Qt.point(0.5302129,0.290838749321) + , Qt.point(0.530211958333,0.290838644017) + , Qt.point(0.5302114,0.29083855534) + , Qt.point(0.530210194444,0.290838461121) + , Qt.point(0.530209347222,0.290835484875) + , Qt.point(0.530208580556,0.29083434868) + , Qt.point(0.530207119444,0.290832248085) + , Qt.point(0.530200394444,0.290833539482) + , Qt.point(0.530195697222,0.290834370849) + , Qt.point(0.530195625,0.290835540299) + , Qt.point(0.530195622222,0.290836504674) + , Qt.point(0.530195219444,0.290836731911) + , Qt.point(0.530194730556,0.290836887097) + , Qt.point(0.53019445,0.290836936979) + , Qt.point(0.530194241667,0.290837042283) + , Qt.point(0.530194394444,0.290837990024) + , Qt.point(0.530194516667,0.29083896547) + , Qt.point(0.530194841667,0.290840999482) + , Qt.point(0.530194841667,0.290841470571) + , Qt.point(0.530193463889,0.290841609126) + , Qt.point(0.530189130556,0.29084211901) + , Qt.point(0.530189338889,0.290842839494) + , Qt.point(0.530183663889,0.290843997806) + , Qt.point(0.530183555556,0.290845167195) + , Qt.point(0.5301816,0.290846231277) + , Qt.point(0.530182222222,0.290848032443) + , Qt.point(0.530180713889,0.290851246788) + , Qt.point(0.530180030556,0.290852643348) + , Qt.point(0.530175922222,0.290855087302) + , Qt.point(0.530175161111,0.29085550848) + , Qt.point(0.530174286111,0.29085603495) + , Qt.point(0.530173413889,0.290856589127) + , Qt.point(0.530172730556,0.290857409306) + , Qt.point(0.530172747222,0.290858201773) + , Qt.point(0.530172761111,0.290858778111) + , Qt.point(0.530173494444,0.290859476364) + , Qt.point(0.530174486111,0.290860562529) + , Qt.point(0.530174033333,0.290861033569) + , Qt.point(0.530173366667,0.290861593272) + , Qt.point(0.530172841667,0.290862080934) + , Qt.point(0.530173611111,0.290863527286) + , Qt.point(0.530173988889,0.290864303102) + , Qt.point(0.530173830556,0.29086528395) + , Qt.point(0.530173475,0.290868132261) + , Qt.point(0.530173313889,0.290869650603) + , Qt.point(0.530173188889,0.290870420852) + , Qt.point(0.530172561111,0.290870753333) + , Qt.point(0.530171441667,0.290871379503) + , Qt.point(0.530168138889,0.29087334666) + , Qt.point(0.530169775,0.290874698723) + , Qt.point(0.530170138889,0.290876588269) + , Qt.point(0.530169861111,0.290877031561) + , Qt.point(0.530169927778,0.290877652169) + , Qt.point(0.530170183333,0.290878821344) + , Qt.point(0.530171138889,0.290880782881) + , Qt.point(0.530171211111,0.290881137507) + , Qt.point(0.530171872222,0.290882256791) + , Qt.point(0.530173055556,0.290884074227) + , Qt.point(0.530173472222,0.290885171329) + , Qt.point(0.530173825,0.290885769746) + , Qt.point(0.530173811111,0.290885958136) + , Qt.point(0.530174769444,0.290887819862) + , Qt.point(0.530175277778,0.29088946548) + , Qt.point(0.530175738889,0.290890141453) + , Qt.point(0.530176355556,0.290890933779) + , Qt.point(0.530176444444,0.290891332711) + , Qt.point(0.530178286111,0.290894402243) + , Qt.point(0.530179855556,0.290897831859) + , Qt.point(0.530180422222,0.290899377658) + , Qt.point(0.530182213889,0.290903710259) + , Qt.point(0.53018155,0.290904098083) + , Qt.point(0.530180002778,0.290903737961) + , Qt.point(0.530178369444,0.290902929069) + , Qt.point(0.530175933333,0.290901538431) + , Qt.point(0.530174958333,0.29090112844) + , Qt.point(0.530173663889,0.290900258592) + , Qt.point(0.530172691667,0.290900591018) + , Qt.point(0.530172227778,0.290901067495) + , Qt.point(0.530171463889,0.290901466406) + , Qt.point(0.530170538889,0.290901494108) + , Qt.point(0.530170002778,0.290901715724) + , Qt.point(0.530169211111,0.290902103552) + , Qt.point(0.530163369444,0.290904535769) + , Qt.point(0.530163602778,0.290906602297) + , Qt.point(0.530162508333,0.290906580136) + , Qt.point(0.530162052778,0.29090508426) + , Qt.point(0.530160375,0.290905765716) + , Qt.point(0.5301591,0.29090625326) + , Qt.point(0.530157127778,0.290907139701) + , Qt.point(0.530156597222,0.290906707562) + , Qt.point(0.5301551,0.290905200606) + , Qt.point(0.530154577778,0.290904641035) + , Qt.point(0.530154158333,0.290904253212) + , Qt.point(0.530153725,0.290903782284) + , Qt.point(0.530152955556,0.290903028795) + , Qt.point(0.530152911111,0.290902585566) + , Qt.point(0.530152544444,0.290902236521) + , Qt.point(0.530152161111,0.290901920719) + , Qt.point(0.530151116667,0.290901233708) + , Qt.point(0.530150344444,0.290900829257) + , Qt.point(0.530149547222,0.290900325077) + , Qt.point(0.530147786111,0.29089928901) + , Qt.point(0.530147052778,0.290898762664) + , Qt.point(0.530146480556,0.290898186452) + , Qt.point(0.530146097222,0.290897709967) + , Qt.point(0.530145625,0.290897083887) + , Qt.point(0.530145155556,0.29089671267) + , Qt.point(0.530144794444,0.290896540912) + , Qt.point(0.530144247222,0.290896463345) + , Qt.point(0.530144391667,0.290895261038) + , Qt.point(0.530144497222,0.29089393129) + , Qt.point(0.530144430556,0.290892413148) + , Qt.point(0.530144355556,0.290891720561) + , Qt.point(0.530144058333,0.290890374164) + , Qt.point(0.530143958333,0.290889725896) + , Qt.point(0.530143713889,0.290888944646) + , Qt.point(0.530143166667,0.290888534627) + , Qt.point(0.530142980556,0.290888174475) + , Qt.point(0.530140333333,0.290888711933) + , Qt.point(0.530136363889,0.29088946548) + , Qt.point(0.530135072222,0.29088975914) + , Qt.point(0.530133997222,0.290889925363) + , Qt.point(0.530133138889,0.290890800801) + , Qt.point(0.530131044444,0.290893233168) + , Qt.point(0.530130602778,0.290893643176) + , Qt.point(0.53013025,0.290893183302) + , Qt.point(0.530129661111,0.290892224765) + , Qt.point(0.530128027778,0.2908897536) + , Qt.point(0.530127575,0.290889144114) + , Qt.point(0.530126947222,0.290888235424) + , Qt.point(0.530126355556,0.290887498494) + , Qt.point(0.5301258,0.290886728317) + , Qt.point(0.530125258333,0.29088604679) + , Qt.point(0.530124558333,0.290885066052) + , Qt.point(0.530123988889,0.290884207209) + , Qt.point(0.530122544444,0.290881735937) + , Qt.point(0.530121441667,0.290879635883) + , Qt.point(0.530121083333,0.290879131645) + , Qt.point(0.530120019444,0.290879652506) + , Qt.point(0.530119213889,0.29087998497) + , Qt.point(0.530118622222,0.290880173366) + , Qt.point(0.530117625,0.290880539075) + , Qt.point(0.530117030556,0.290880733012) + , Qt.point(0.530113241667,0.290881758101) + , Qt.point(0.530112719444,0.290881929872) + , Qt.point(0.530111688889,0.290882367611) + , Qt.point(0.530110972222,0.290882749938) + , Qt.point(0.530110186111,0.290883254167) + , Qt.point(0.530109416667,0.290883830426) + , Qt.point(0.530108944444,0.290884318028) + , Qt.point(0.530108386111,0.290884827793) + , Qt.point(0.530107427778,0.290886179771) + , Qt.point(0.530106669444,0.290887132799) + , Qt.point(0.530105427778,0.290888983432) + , Qt.point(0.530104902778,0.290889714814) + , Qt.point(0.530104327778,0.29089041295) + , Qt.point(0.530103922222,0.290890850668) + , Qt.point(0.530103258333,0.290891532177) + , Qt.point(0.530102561111,0.290892174898) + , Qt.point(0.530101930556,0.290892662479) + , Qt.point(0.530100863889,0.290893449253) + , Qt.point(0.530099955556,0.290894008859) + , Qt.point(0.530098627778,0.290894668193) + , Qt.point(0.530097633333,0.290895072658) + , Qt.point(0.530096166667,0.290895504825) + , Qt.point(0.530095136111,0.290895715367) + , Qt.point(0.530093930556,0.290895903747) + , Qt.point(0.530092955556,0.290896009018) + , Qt.point(0.53009175,0.290896075505) + , Qt.point(0.5300903,0.290896092126) + , Qt.point(0.530088869444,0.290896053342) + , Qt.point(0.5300877,0.290895909287) + , Qt.point(0.530086547222,0.290895715367) + , Qt.point(0.530085605556,0.290895576852) + , Qt.point(0.530084472222,0.290895222254) + , Qt.point(0.530083058333,0.290894574003) + , Qt.point(0.530082116667,0.290894031021) + , Qt.point(0.530081333333,0.290893488038) + , Qt.point(0.530080044444,0.290892224765) + , Qt.point(0.530076838889,0.290888723014) + , Qt.point(0.530076197222,0.290888069199) + , Qt.point(0.53007555,0.290887553902) + , Qt.point(0.530074877778,0.290887071849) + , Qt.point(0.530073997222,0.290886445733) + , Qt.point(0.530073469444,0.290887564984) + , Qt.point(0.530073119444,0.29088821326) + , Qt.point(0.530071966667,0.290890274431) + , Qt.point(0.5300713,0.290891393659) + , Qt.point(0.530070811111,0.290892141654) + , Qt.point(0.530070513889,0.290892546124) + , Qt.point(0.530068438889,0.290895565771) + , Qt.point(0.530067766667,0.290896491047) + , Qt.point(0.530066997222,0.290897416319) + , Qt.point(0.530064147222,0.290900718448) + , Qt.point(0.530063255556,0.290901571673) + , Qt.point(0.530062363889,0.29090235841) + , Qt.point(0.530060808333,0.290903593912) + , Qt.point(0.530059044444,0.290904884809) + , Qt.point(0.530058013889,0.290905688152) + , Qt.point(0.530056894444,0.290906386226) + , Qt.point(0.530055497222,0.290907134161) + , Qt.point(0.530053775,0.290907970735) + , Qt.point(0.530052286111,0.29090861894) + , Qt.point(0.530050894444,0.290909161878) + , Qt.point(0.53004985,0.290909505369) + , Qt.point(0.530046577778,0.290910413955) + , Qt.point(0.530045755556,0.290909006753) + , Qt.point(0.530044955556,0.290907854391) + , Qt.point(0.530043702778,0.290906280961) + , Qt.point(0.530042858333,0.290905422218) + , Qt.point(0.530041916667,0.290904574551) + , Qt.point(0.53004065,0.290903632694) + , Qt.point(0.530039586111,0.290902729615) + , Qt.point(0.530038647222,0.290901588295) + , Qt.point(0.530038175,0.290900884661) + , Qt.point(0.530037827778,0.29090023643) + , Qt.point(0.530036541667,0.290897438481) + , Qt.point(0.530035947222,0.290896302668) + , Qt.point(0.530035233333,0.290895338607) + , Qt.point(0.530035775,0.290893177761) + , Qt.point(0.530036175,0.290891088919) + , Qt.point(0.530037075,0.290887060768) + , Qt.point(0.530037772222,0.290884079768) + , Qt.point(0.530038661111,0.290879802115) + , Qt.point(0.530037091667,0.290877873814) + , Qt.point(0.530027597222,0.290866353457) + , Qt.point(0.530025636111,0.290863870862) + , Qt.point(0.530024766667,0.290863139376) + , Qt.point(0.530025725,0.290862202849) + , Qt.point(0.530026352778,0.290861554481) + , Qt.point(0.530027122222,0.290860889486) + , Qt.point(0.530029027778,0.290859321197) + , Qt.point(0.530029830556,0.290858744861) + , Qt.point(0.530030841667,0.290858085397) + , Qt.point(0.530029952778,0.290857315097) + , Qt.point(0.530029741667,0.290857121136) + , Qt.point(0.530029427778,0.290856893924) + , Qt.point(0.530028538889,0.290856084826) + , Qt.point(0.530028052778,0.290855597148) + , Qt.point(0.530027202778,0.290854854546) + , Qt.point(0.530026883333,0.290854477702) + , Qt.point(0.530026638889,0.290854145192) + , Qt.point(0.530025977778,0.290853319456) + , Qt.point(0.530025661111,0.290852881649) + , Qt.point(0.530025069444,0.290851956153) + , Qt.point(0.530024791667,0.290851485091) + , Qt.point(0.530024269444,0.290850448749) + , Qt.point(0.530024130556,0.290850138399) + , Qt.point(0.530024063889,0.290849855759) + , Qt.point(0.530023816667,0.29084915747) + , Qt.point(0.530023661111,0.290848647606) + , Qt.point(0.530023555556,0.290848143283) + , Qt.point(0.530023416667,0.290847666669) + , Qt.point(0.530023347222,0.290847267642) + , Qt.point(0.530023261111,0.290846968371) + , Qt.point(0.530023088889,0.290845532974) + , Qt.point(0.53002295,0.290844729368) + , Qt.point(0.530022933333,0.290844485514) + , Qt.point(0.530022794444,0.290843504555) + , Qt.point(0.530022761111,0.29084303347) + , Qt.point(0.530022655556,0.290842174432) + , Qt.point(0.530022586111,0.290841088157) + , Qt.point(0.530022241667,0.290837552179) + , Qt.point(0.530021277778,0.290828950269) + ] + , 'Bjerke_9' : [ + Qt.point(0.529957852778,0.290746208387) + , Qt.point(0.529958988889,0.290745176997) + , Qt.point(0.529962241667,0.29074227133) + , Qt.point(0.529963202778,0.290741450637) + , Qt.point(0.529965177778,0.290740086504) + , Qt.point(0.529967030556,0.290738933083) + , Qt.point(0.529968166667,0.29073827319) + , Qt.point(0.529969547222,0.290737557841) + , Qt.point(0.5299721,0.290736282405) + , Qt.point(0.529976013889,0.290734552235) + , Qt.point(0.529977133333,0.290734097508) + , Qt.point(0.529981336111,0.290732555864) + , Qt.point(0.529991377778,0.290729034436) + , Qt.point(0.529993316667,0.290728429963) + , Qt.point(0.529995938889,0.29072745393) + , Qt.point(0.529996916667,0.290727137827) + , Qt.point(0.529999347222,0.290726217244) + , Qt.point(0.530006438889,0.290713256499) + , Qt.point(0.530009486111,0.290707449655) + , Qt.point(0.530009727778,0.290705192313) + , Qt.point(0.530008836111,0.290705685936) + , Qt.point(0.530009072222,0.290702668716) + , Qt.point(0.530008952778,0.290698714087) + , Qt.point(0.530007977778,0.290695247476) + , Qt.point(0.530006444444,0.2906923743) + , Qt.point(0.530006002778,0.290692313286) + , Qt.point(0.530006166667,0.290691553384) + , Qt.point(0.530006427778,0.290691020897) + , Qt.point(0.530007091667,0.290691553384) + , Qt.point(0.530007755556,0.290691886189) + , Qt.point(0.530008872222,0.290692590622) + , Qt.point(0.5300087,0.290692113604) + , Qt.point(0.530008752778,0.290691802988) + , Qt.point(0.530008944444,0.290691658772) + , Qt.point(0.530008455556,0.290690172241) + , Qt.point(0.530009366667,0.290689861621) + , Qt.point(0.530011794444,0.290689334675) + , Qt.point(0.530011863889,0.290689894902) + , Qt.point(0.530015063889,0.290688990773) + , Qt.point(0.530016163889,0.290688713431) + , Qt.point(0.530017127778,0.290688430543) + , Qt.point(0.530019363889,0.290687210235) + , Qt.point(0.530021130556,0.290686056483) + , Qt.point(0.530022491667,0.290684919363) + , Qt.point(0.530022811111,0.290684503342) + , Qt.point(0.530024944444,0.290683893176) + , Qt.point(0.530026777778,0.29068372122) + , Qt.point(0.530029575,0.290683355119) + , Qt.point(0.530030552778,0.290683144334) + , Qt.point(0.530031411111,0.290682900266) + , Qt.point(0.530032336111,0.290683011206) + , Qt.point(0.530033488889,0.290682767138) + , Qt.point(0.530034311111,0.290682556351) + , Qt.point(0.530034697222,0.290682206889) + , Qt.point(0.530035222222,0.29068166328) + , Qt.point(0.5300355,0.29068141921) + , Qt.point(0.530037322222,0.290678412687) + , Qt.point(0.530038047222,0.290676798463) + , Qt.point(0.530038311111,0.290675994119) + , Qt.point(0.530038958333,0.290673287061) + , Qt.point(0.530038997222,0.290672893203) + , Qt.point(0.530041116667,0.290673142831) + , Qt.point(0.530041075,0.290673281514) + , Qt.point(0.530041091667,0.290673930546) + , Qt.point(0.530041247222,0.290674296665) + , Qt.point(0.530041491667,0.290674585123) + , Qt.point(0.530041741667,0.29067503445) + , Qt.point(0.530042069444,0.290675400567) + , Qt.point(0.530042191667,0.290674895769) + , Qt.point(0.530041966667,0.290674385421) + , Qt.point(0.530041897222,0.290673947188) + , Qt.point(0.530041808333,0.290672970865) + , Qt.point(0.530042197222,0.290671062584) + , Qt.point(0.530042236111,0.29066857735) + , Qt.point(0.530041922222,0.290666541431) + , Qt.point(0.530041819444,0.290665337621) + , Qt.point(0.530040583333,0.29066226981) + , Qt.point(0.530040027778,0.29065898004) + , Qt.point(0.530039472222,0.290656283827) + , Qt.point(0.530039580556,0.29065517981) + , Qt.point(0.530039411111,0.290652394775) + , Qt.point(0.530040080556,0.29064878859) + , Qt.point(0.530040155556,0.290644899379) + , Qt.point(0.530040402778,0.290642591335) + , Qt.point(0.530040230556,0.290641331886) + , Qt.point(0.530040216667,0.290639156957) + , Qt.point(0.530040341667,0.29063698755) + , Qt.point(0.530040222222,0.290634080173) + , Qt.point(0.530040572222,0.29063390817) + , Qt.point(0.530041275,0.290632260264) + , Qt.point(0.530041433333,0.290630579052) + , Qt.point(0.530041452778,0.29062842619) + , Qt.point(0.530041769444,0.290626994634) + , Qt.point(0.530041894444,0.290625712883) + , Qt.point(0.530041947222,0.29062533002) + , Qt.point(0.5300423,0.290623332463) + , Qt.point(0.530042458333,0.290621950807) + , Qt.point(0.530042338889,0.290620025349) + , Qt.point(0.530043861111,0.290619797844) + , Qt.point(0.530045586111,0.290622305933) + , Qt.point(0.530047286111,0.290633164672) + , Qt.point(0.530048275,0.290636737873) + , Qt.point(0.530050211111,0.290640765963) + , Qt.point(0.530052891667,0.290648666533) + , Qt.point(0.530062341667,0.290652372583) + , Qt.point(0.530062444444,0.290652078543) + , Qt.point(0.530063719444,0.290652816416) + , Qt.point(0.530064436111,0.290653637505) + , Qt.point(0.530065325,0.290654952349) + , Qt.point(0.530066566667,0.290652993949) + , Qt.point(0.530066491667,0.290658314312) + , Qt.point(0.530066613889,0.29065917421) + , Qt.point(0.530066236111,0.290661315616) + , Qt.point(0.530065463889,0.290663079761) + , Qt.point(0.530064013889,0.2906637954) + , Qt.point(0.530066213889,0.290665409738) + , Qt.point(0.530067575,0.290666375006) + , Qt.point(0.530069480556,0.290665382001) + , Qt.point(0.53007135,0.290666386101) + , Qt.point(0.530072222222,0.290666630191) + , Qt.point(0.530072658333,0.290666718951) + , Qt.point(0.530073913889,0.290668821437) + , Qt.point(0.530073963889,0.290670779668) + , Qt.point(0.530081458333,0.290670757479) + , Qt.point(0.530084027778,0.290670729742) + , Qt.point(0.530083955556,0.290672760068) + , Qt.point(0.530084963889,0.290675999667) + , Qt.point(0.5300861,0.29067491241) + , Qt.point(0.530086625,0.290674845843) + , Qt.point(0.530087411111,0.290674951241) + , Qt.point(0.530086780556,0.290675722306) + , Qt.point(0.530086447222,0.290676227102) + , Qt.point(0.530086061111,0.290677048086) + , Qt.point(0.530085833333,0.290677924538) + , Qt.point(0.530085552778,0.290679150455) + , Qt.point(0.530085375,0.290681108576) + , Qt.point(0.530085161111,0.290682284548) + , Qt.point(0.530084880556,0.290683438324) + , Qt.point(0.530084422222,0.290685046943) + , Qt.point(0.530084319444,0.2906853964) + , Qt.point(0.530083986111,0.290686100858) + , Qt.point(0.530083633333,0.290686694376) + , Qt.point(0.530083177778,0.290687565235) + , Qt.point(0.530082741667,0.290688352887) + , Qt.point(0.530082913889,0.290690089039) + , Qt.point(0.530083052778,0.290690366378) + , Qt.point(0.530082888889,0.290693062092) + , Qt.point(0.530084052778,0.290697649151) + , Qt.point(0.530084763889,0.290700588803) + , Qt.point(0.530085075,0.290702114075) + , Qt.point(0.530085986111,0.290701642628) + , Qt.point(0.530086647222,0.290702518963) + , Qt.point(0.530087380556,0.2907035395) + , Qt.point(0.530094369444,0.290703633788) + , Qt.point(0.530098344444,0.290701897764) + , Qt.point(0.530105397222,0.290698719633) + , Qt.point(0.530106891667,0.290698070689) + , Qt.point(0.53010775,0.290697948665) + , Qt.point(0.530108552778,0.290698176073) + , Qt.point(0.530109341667,0.290698558784) + , Qt.point(0.530110094444,0.290696184854) + , Qt.point(0.530113830556,0.290695840965) + , Qt.point(0.530114430556,0.290693522467) + , Qt.point(0.530114580556,0.290692773663) + , Qt.point(0.530114536111,0.290692535155) + , Qt.point(0.530110522222,0.290690394112) + , Qt.point(0.530112905556,0.290686966173) + , Qt.point(0.530114130556,0.290685673746) + , Qt.point(0.530114669444,0.29068607867) + , Qt.point(0.530114688889,0.290685374212) + , Qt.point(0.530114863889,0.290684730767) + , Qt.point(0.530115197222,0.290684275917) + , Qt.point(0.530115669444,0.290683909817) + , Qt.point(0.530116144444,0.290682733856) + , Qt.point(0.530116269444,0.290680809034) + , Qt.point(0.530116322222,0.29068028761) + , Qt.point(0.530121902778,0.290677741482) + , Qt.point(0.530129983333,0.290674096964) + , Qt.point(0.530133041667,0.290673137284) + , Qt.point(0.530131647222,0.290672105484) + , Qt.point(0.530133008333,0.290671694982) + , Qt.point(0.530135541667,0.290672177599) + , Qt.point(0.530143980556,0.290673913904) + , Qt.point(0.530145727778,0.290674230098) + , Qt.point(0.530147036111,0.290674285571) + , Qt.point(0.530148313889,0.290674202362) + , Qt.point(0.530148977778,0.290673852884) + , Qt.point(0.530149405556,0.290674618406) + , Qt.point(0.530149969444,0.290675411661) + , Qt.point(0.530150630556,0.290677025897) + , Qt.point(0.530151136111,0.290679449999) + , Qt.point(0.530152222222,0.29068253971) + , Qt.point(0.530153541667,0.290680320892) + , Qt.point(0.530154066667,0.29067950547) + , Qt.point(0.530155366667,0.290677841331) + , Qt.point(0.530156461111,0.290676870576) + , Qt.point(0.53015785,0.290675744495) + , Qt.point(0.530159180556,0.290674856938) + , Qt.point(0.530161138889,0.290673797411) + , Qt.point(0.530162013889,0.290673409101) + , Qt.point(0.530162530556,0.290673148379) + , Qt.point(0.530163227778,0.290672904298) + , Qt.point(0.530164969444,0.290672360661) + , Qt.point(0.530166752778,0.290671950159) + , Qt.point(0.530168658333,0.290671600677) + , Qt.point(0.530168883333,0.290672582554) + , Qt.point(0.530168988889,0.290673037433) + , Qt.point(0.530169291667,0.290673464574) + , Qt.point(0.530169755556,0.290673863978) + , Qt.point(0.530170183333,0.290674463083) + , Qt.point(0.530170680556,0.290675062186) + , Qt.point(0.530171125,0.290675860986) + , Qt.point(0.530172072222,0.290677208954) + , Qt.point(0.530172908333,0.290678823175) + , Qt.point(0.530172694444,0.290680781299) + , Qt.point(0.530172833333,0.290682062667) + , Qt.point(0.530172622222,0.290682900266) + , Qt.point(0.530172372222,0.290684281464) + , Qt.point(0.530172544444,0.290686650001) + , Qt.point(0.530172472222,0.290687260157) + , Qt.point(0.53017205,0.290688691244) + , Qt.point(0.530171961111,0.290689606468) + , Qt.point(0.530172047222,0.29069081012) + , Qt.point(0.530172322222,0.290692529608) + , Qt.point(0.530172897222,0.290693738787) + , Qt.point(0.530173452778,0.290694387747) + , Qt.point(0.530173872222,0.290694947958) + , Qt.point(0.530174316667,0.290695829872) + , Qt.point(0.530174761111,0.290696329066) + , Qt.point(0.530175455556,0.290696578663) + , Qt.point(0.530175277778,0.290698447853) + , Qt.point(0.530175083333,0.290699762377) + , Qt.point(0.530174958333,0.290700533338) + , Qt.point(0.530174697222,0.290701753557) + , Qt.point(0.530174255556,0.290703018139) + , Qt.point(0.5301738,0.29070439364) + , Qt.point(0.5301732,0.290705835686) + , Qt.point(0.5301725,0.290707078055) + , Qt.point(0.530171602778,0.290708569997) + , Qt.point(0.530170258333,0.290710211672) + , Qt.point(0.530168513889,0.290711947618) + , Qt.point(0.530166522222,0.290714032949) + , Qt.point(0.530165027778,0.290715774404) + , Qt.point(0.530163980556,0.290717316189) + , Qt.point(0.530163183333,0.290719107526) + , Qt.point(0.530162913889,0.290720582732) + , Qt.point(0.530162383333,0.290723815943) + , Qt.point(0.530162063889,0.290726056419) + , Qt.point(0.53016185,0.290727792215) + , Qt.point(0.530161719444,0.290729156439) + , Qt.point(0.530161583333,0.290730570563) + , Qt.point(0.530161511111,0.29073186822) + , Qt.point(0.530160338889,0.290732300771) + , Qt.point(0.530158677778,0.290732838685) + , Qt.point(0.530153363889,0.290733969962) + , Qt.point(0.530153033333,0.290734069781) + , Qt.point(0.530149483333,0.290734907143) + , Qt.point(0.530145358333,0.290735844319) + , Qt.point(0.530136558333,0.290737918288) + , Qt.point(0.530132183333,0.290739104987) + , Qt.point(0.5301293,0.290740042142) + , Qt.point(0.530126066667,0.290741334187) + , Qt.point(0.530121641667,0.290743513453) + , Qt.point(0.530118308333,0.29074554852) + , Qt.point(0.530114875,0.290747833092) + , Qt.point(0.530111933333,0.29075023408) + , Qt.point(0.530110247222,0.290751753396) + , Qt.point(0.530108397222,0.290753793917) + , Qt.point(0.530107808333,0.290754470389) + , Qt.point(0.530107658333,0.290754636734) + , Qt.point(0.530106363889,0.290756427708) + , Qt.point(0.530104861111,0.290758545803) + , Qt.point(0.530103822222,0.290760303471) + , Qt.point(0.530102705556,0.290762343897) + , Qt.point(0.530101730556,0.290764384301) + , Qt.point(0.530099741667,0.290768986215) + , Qt.point(0.530098691667,0.290771592067) + , Qt.point(0.530096830556,0.290776920087) + , Qt.point(0.530095408333,0.290781887593) + , Qt.point(0.530094291667,0.290786416998) + , Qt.point(0.530094016667,0.290787836226) + , Qt.point(0.530093716667,0.29078979319) + , Qt.point(0.530093575,0.290791977426) + , Qt.point(0.530093536111,0.290793623901) + , Qt.point(0.530093761111,0.290795968855) + , Qt.point(0.530095086111,0.290806551267) + , Qt.point(0.530095361111,0.29080954461) + , Qt.point(0.530095355556,0.290812515732) + , Qt.point(0.530095177778,0.290815370403) + , Qt.point(0.530094336111,0.29081987127) + , Qt.point(0.530094013889,0.290821450981) + , Qt.point(0.530093772222,0.290822509657) + , Qt.point(0.530093608333,0.290823219133) + , Qt.point(0.530091497222,0.290823374331) + , Qt.point(0.530091308333,0.290822820054) + , Qt.point(0.530090752778,0.290822631599) + , Qt.point(0.530090355556,0.290822531829) + , Qt.point(0.530089663889,0.290822548457) + , Qt.point(0.530088702778,0.290822631599) + , Qt.point(0.530087986111,0.290822736912) + , Qt.point(0.530085716667,0.290823135992) + , Qt.point(0.530084494444,0.290823429759) + , Qt.point(0.530083302778,0.290823762324) + , Qt.point(0.530081627778,0.29082429997) + , Qt.point(0.530080844444,0.290824615906) + , Qt.point(0.530080127778,0.290824859786) + , Qt.point(0.530078977778,0.290825297661) + , Qt.point(0.530076475,0.290826184492) + , Qt.point(0.530074752778,0.290826733216) + , Qt.point(0.530072419444,0.290827226513) + , Qt.point(0.530071777778,0.290827315195) + , Qt.point(0.530070558333,0.290827426048) + , Qt.point(0.530069769444,0.290827481474) + , Qt.point(0.530051683333,0.29082548057) + , Qt.point(0.530049658333,0.290825281032) + , Qt.point(0.530048294444,0.29082521452) + , Qt.point(0.530043458333,0.290825170178) + , Qt.point(0.530042533333,0.290825136922) + , Qt.point(0.530041136111,0.290825170178) + , Qt.point(0.530039372222,0.290825319831) + , Qt.point(0.530038238889,0.290825391887) + , Qt.point(0.530036788889,0.290825513826) + , Qt.point(0.530034466667,0.290825785418) + , Qt.point(0.530033122222,0.290825979412) + , Qt.point(0.530029541667,0.290826638991) + , Qt.point(0.530027338889,0.290827143373) + , Qt.point(0.530022955556,0.290828551201) + , Qt.point(0.530021277778,0.290828950269) + , Qt.point(0.530021088889,0.290827520273) + , Qt.point(0.530020811111,0.29082576879) + , Qt.point(0.530020638889,0.29082482653) + , Qt.point(0.530020255556,0.290823479643) + , Qt.point(0.5300197,0.290822044062) + , Qt.point(0.530019263889,0.290821062983) + , Qt.point(0.530019113889,0.290820730413) + , Qt.point(0.5300189,0.29082025927) + , Qt.point(0.530018655556,0.29081987127) + , Qt.point(0.530018411111,0.290819416754) + , Qt.point(0.530017016667,0.290817454562) + , Qt.point(0.530015536111,0.290815775042) + , Qt.point(0.530014680556,0.290814932505) + , Qt.point(0.530012658333,0.29081279843) + , Qt.point(0.530009319444,0.290809328426) + , Qt.point(0.530008177778,0.290807931537) + , Qt.point(0.530007411111,0.290806950383) + , Qt.point(0.530006938889,0.290806041286) + , Qt.point(0.530006711111,0.290805531302) + , Qt.point(0.530006444444,0.290804794042) + , Qt.point(0.530006175,0.2908032031) + , Qt.point(0.53000595,0.290801612145) + , Qt.point(0.530005966667,0.290800442479) + , Qt.point(0.530005608333,0.290796833653) + , Qt.point(0.530005397222,0.290793812385) + , Qt.point(0.530006308333,0.29079300301) + , Qt.point(0.530006919444,0.290792620495) + , Qt.point(0.530007463889,0.29079234331) + , Qt.point(0.530008144444,0.29079204395) + , Qt.point(0.530008755556,0.290791872095) + , Qt.point(0.530009436111,0.290791750133) + , Qt.point(0.530010275,0.290791678065) + , Qt.point(0.530011094444,0.29079170024) + , Qt.point(0.530011636111,0.290791772308) + , Qt.point(0.530012683333,0.290791999601) + , Qt.point(0.530014308333,0.290792842243) + , Qt.point(0.530015272222,0.290793435416) + , Qt.point(0.530015847222,0.290792930942) + , Qt.point(0.530014397222,0.290791666978) + , Qt.point(0.530012877778,0.290790475074) + , Qt.point(0.530012672222,0.290789576983) + , Qt.point(0.530012341667,0.290789133479) + , Qt.point(0.530012275,0.290789028147) + , Qt.point(0.530011977778,0.290788728782) + , Qt.point(0.530011480556,0.290788185488) + , Qt.point(0.530010191667,0.290786988017) + , Qt.point(0.530008702778,0.290785391378) + , Qt.point(0.530006408333,0.290783207064) + , Qt.point(0.530004980556,0.290781804433) + , Qt.point(0.530004,0.290780651273) + , Qt.point(0.530003286111,0.290779864016) + , Qt.point(0.530002711111,0.290779265255) + , Qt.point(0.530002402778,0.290779065667) + , Qt.point(0.530002255556,0.290778849447) + , Qt.point(0.530001558333,0.290778017829) + , Qt.point(0.530000744444,0.290777247193) + , Qt.point(0.5299999,0.290776448833) + , Qt.point(0.529999133333,0.290775994209) + , Qt.point(0.529998086111,0.290775306728) + , Qt.point(0.529996480556,0.290774220059) + , Qt.point(0.529989708333,0.290769840051) + , Qt.point(0.529988783333,0.290769296701) + , Qt.point(0.529988783333,0.290769296701) + , Qt.point(0.529982219444,0.290765110635) + , Qt.point(0.529981380556,0.290764600538) + , Qt.point(0.529979233333,0.290763214398) + , Qt.point(0.529975969444,0.290760780312) + , Qt.point(0.529973208333,0.290758479267) + , Qt.point(0.529970627778,0.290756388895) + , Qt.point(0.529966802778,0.290753400231) + , Qt.point(0.529964322222,0.290751503874) + , Qt.point(0.529960016667,0.290748115889) + , Qt.point(0.529957852778,0.290746208387) + ] + , 'Frogner_9' : [ + Qt.point(0.5295729,0.290900153323) + , Qt.point(0.529585925,0.290892939512) + , Qt.point(0.529600383333,0.290882949413) + , Qt.point(0.529626213889,0.290867168052) + , Qt.point(0.529653413889,0.290853369333) + , Qt.point(0.529653786111,0.290851618097) + , Qt.point(0.529653625,0.290850997401) + , Qt.point(0.529652861111,0.290850044186) + , Qt.point(0.529654275,0.29084879724) + , Qt.point(0.529655191667,0.290848176535) + , Qt.point(0.529656369444,0.290847644501) + , Qt.point(0.529658133333,0.290847361857) + , Qt.point(0.529658916667,0.290847134633) + , Qt.point(0.529659877778,0.290846746689) + , Qt.point(0.529660697222,0.290845859957) + , Qt.point(0.529661377778,0.290844740452) + , Qt.point(0.529662388889,0.290842612265) + , Qt.point(0.529662788889,0.290841586957) + , Qt.point(0.529664458333,0.290842268649) + , Qt.point(0.529667,0.290843199736) + , Qt.point(0.529668472222,0.290843886963) + , Qt.point(0.529669591667,0.290844596357) + , Qt.point(0.529669811111,0.290844712741) + , Qt.point(0.529670211111,0.290845045268) + , Qt.point(0.529670783333,0.290845588395) + , Qt.point(0.529672127778,0.290847034876) + , Qt.point(0.529674633333,0.290850343452) + , Qt.point(0.529676205556,0.290852072533) + , Qt.point(0.529676869444,0.29085256022) + , Qt.point(0.529677094444,0.290852754186) + , Qt.point(0.529677691667,0.290853147659) + , Qt.point(0.529678475,0.290853574382) + , Qt.point(0.529679261111,0.290853906893) + , Qt.point(0.529679836111,0.290854117483) + , Qt.point(0.529680472222,0.290854239404) + , Qt.point(0.529681319444,0.290854438909) + , Qt.point(0.529681986111,0.290854555288) + , Qt.point(0.529682808333,0.290854638415) + , Qt.point(0.529684497222,0.290854638415) + , Qt.point(0.52968635,0.290854516495) + , Qt.point(0.529686908333,0.290854394575) + , Qt.point(0.529686908333,0.290853834849) + , Qt.point(0.529686313889,0.290852610097) + , Qt.point(0.529686297222,0.290852155661) + , Qt.point(0.529686016667,0.290850038644) + , Qt.point(0.529686225,0.29084860327) + , Qt.point(0.529686502778,0.290848220871) + , Qt.point(0.529686816667,0.290847711005) + , Qt.point(0.529688386111,0.290844928884) + , Qt.point(0.529689138889,0.290845261411) + , Qt.point(0.529689591667,0.290845416589) + , Qt.point(0.529689911111,0.290845555142) + , Qt.point(0.529690969444,0.29084398118) + , Qt.point(0.529692469444,0.290841675633) + , Qt.point(0.529693483333,0.290840223567) + , Qt.point(0.529694386111,0.290839259212) + , Qt.point(0.529693638889,0.290838405697) + , Qt.point(0.529694966667,0.290838261597) + , Qt.point(0.529695638889,0.290838167378) + , Qt.point(0.529696555556,0.290837762788) + , Qt.point(0.5296972,0.290837369282) + , Qt.point(0.529697944444,0.290836770708) + , Qt.point(0.529698508333,0.290836083454) + , Qt.point(0.529699369444,0.290835390655) + , Qt.point(0.529700047222,0.290834991601) + , Qt.point(0.529700572222,0.290834775447) + , Qt.point(0.529701766667,0.290834381934) + , Qt.point(0.529702255556,0.290834387477) + , Qt.point(0.529704072222,0.290834032761) + , Qt.point(0.529704633333,0.290833700214) + , Qt.point(0.529705233333,0.290833267902) + , Qt.point(0.529705833333,0.290833605992) + , Qt.point(0.529706141667,0.290833866487) + , Qt.point(0.529706402778,0.290834265543) + , Qt.point(0.52970645,0.290834620259) + , Qt.point(0.529706588889,0.290834758819) + , Qt.point(0.529706805556,0.290834792074) + , Qt.point(0.529707405556,0.290834930634) + , Qt.point(0.529707883333,0.290834991601) + , Qt.point(0.529708097222,0.290834853041) + , Qt.point(0.529708236111,0.290834575919) + , Qt.point(0.529708266667,0.290834126982) + , Qt.point(0.529708113889,0.290833833233) + , Qt.point(0.529707827778,0.290833678044) + , Qt.point(0.529707575,0.290833478515) + , Qt.point(0.52970745,0.290833323326) + , Qt.point(0.529707380556,0.290832985236) + , Qt.point(0.529707380556,0.290832636059) + , Qt.point(0.529707402778,0.29083232568) + , Qt.point(0.529707611111,0.290831582984) + , Qt.point(0.529708027778,0.290831283688) + , Qt.point(0.529708272222,0.290830945593) + , Qt.point(0.529708425,0.290830646296) + , Qt.point(0.529708641667,0.290830164094) + , Qt.point(0.529708619444,0.290829898051) + , Qt.point(0.529708755556,0.290829493443) + , Qt.point(0.529709016667,0.290829426932) + , Qt.point(0.529709711111,0.290829598752) + , Qt.point(0.529710241667,0.2908294879) + , Qt.point(0.529710680556,0.290829149802) + , Qt.point(0.52971145,0.29082850686) + , Qt.point(0.529711925,0.290828035738) + , Qt.point(0.52971225,0.290827636668) + , Qt.point(0.529712633333,0.290827110117) + , Qt.point(0.529713080556,0.29082661682) + , Qt.point(0.529713583333,0.290826262089) + , Qt.point(0.529713833333,0.290826068095) + , Qt.point(0.529714072222,0.290825818674) + , Qt.point(0.529714180556,0.290825269947) + , Qt.point(0.529714241667,0.290824815444) + , Qt.point(0.529714180556,0.290824527223) + , Qt.point(0.529714030556,0.2908242778) + , Qt.point(0.529713733333,0.290823679183) + , Qt.point(0.529713805556,0.290823429759) + , Qt.point(0.529713930556,0.290823280104) + , Qt.point(0.529714725,0.290823280104) + , Qt.point(0.529715397222,0.290823457472) + , Qt.point(0.529715719444,0.290823629298) + , Qt.point(0.529715869444,0.290823778952) + , Qt.point(0.529716216667,0.290823828837) + , Qt.point(0.529716413889,0.290823828837) + , Qt.point(0.529716663889,0.290823629298) + , Qt.point(0.529716961111,0.290823579413) + , Qt.point(0.529717905556,0.290823030679) + , Qt.point(0.529718152778,0.290822531829) + , Qt.point(0.5297187,0.290821689322) + , Qt.point(0.529719597222,0.290820447727) + , Qt.point(0.529720425,0.290819433382) + , Qt.point(0.529721027778,0.290818613033) + , Qt.point(0.529721813889,0.290818452289) + , Qt.point(0.529722547222,0.290818053199) + , Qt.point(0.529723105556,0.290817349246) + , Qt.point(0.529723977778,0.290816861466) + , Qt.point(0.529724536111,0.290816650833) + , Qt.point(0.529726497222,0.290815520064) + , Qt.point(0.529728244444,0.290814383745) + , Qt.point(0.529729702778,0.290813291764) + , Qt.point(0.529730758333,0.290811795129) + , Qt.point(0.529731305556,0.290810808452) + , Qt.point(0.529732252778,0.290809677647) + , Qt.point(0.529733491667,0.29080846923) + , Qt.point(0.529734825,0.290807111137) + , Qt.point(0.529735625,0.290806129978) + , Qt.point(0.529736680556,0.290803424835) + , Qt.point(0.529737538889,0.290801379321) + , Qt.point(0.529738269444,0.290800425849) + , Qt.point(0.529738669444,0.29079951672) + , Qt.point(0.529738991667,0.290798524433) + , Qt.point(0.529738275,0.290797193985) + , Qt.point(0.529738433333,0.290796778218) + , Qt.point(0.52973885,0.290796356906) + , Qt.point(0.529739636111,0.290795863527) + , Qt.point(0.529740475,0.290794638388) + , Qt.point(0.529741313889,0.290793629445) + , Qt.point(0.529741241667,0.290792980835) + , Qt.point(0.529741330556,0.290792027319) + , Qt.point(0.529741361111,0.290791888726) + , Qt.point(0.529741452778,0.290791456316) + , Qt.point(0.529741730556,0.290790253323) + , Qt.point(0.529741869444,0.290789848628) + , Qt.point(0.529742133333,0.290789255443) + , Qt.point(0.529742377778,0.290788623449) + , Qt.point(0.529742586111,0.290787941559) + , Qt.point(0.529742638889,0.290787575666) + , Qt.point(0.529743216667,0.290787309561) + , Qt.point(0.5297436,0.29078687714) + , Qt.point(0.529744036111,0.290786489069) + , Qt.point(0.529744752778,0.290786245138) + , Qt.point(0.529745222222,0.290786228506) + , Qt.point(0.529745847222,0.290786344928) + , Qt.point(0.529745555556,0.290786123173) + , Qt.point(0.529745938889,0.290785701837) + , Qt.point(0.529746236111,0.290785175165) + , Qt.point(0.529746288889,0.290784654036) + , Qt.point(0.529746166667,0.290783251416) + , Qt.point(0.529746269444,0.29078251961) + , Qt.point(0.529746077778,0.290780473863) + , Qt.point(0.529746275,0.290779963809) + , Qt.point(0.529747230556,0.29077772399) + , Qt.point(0.529748152778,0.290775517408) + , Qt.point(0.529749375,0.290774558257) + , Qt.point(0.529751361111,0.290772906067) + , Qt.point(0.529752677778,0.29077189146) + , Qt.point(0.529752513889,0.290771675232) + , Qt.point(0.529751869444,0.290770826948) + , Qt.point(0.529752861111,0.29076953511) + , Qt.point(0.529753605556,0.290768537117) + , Qt.point(0.529754252778,0.290767744264) + , Qt.point(0.529754805556,0.290766929229) + , Qt.point(0.529755208333,0.290766230625) + , Qt.point(0.529755766667,0.290765426672) + , Qt.point(0.529756658333,0.290763918558) + , Qt.point(0.529757119444,0.290762937169) + , Qt.point(0.529757791667,0.290763203309) + , Qt.point(0.529758325,0.29076251578) + , Qt.point(0.529759022222,0.290761672999) + , Qt.point(0.529760133333,0.290760209212) + , Qt.point(0.529760661111,0.290759482859) + , Qt.point(0.529761144444,0.290758917299) + , Qt.point(0.529761405556,0.290758551348) + , Qt.point(0.529761844444,0.290758007965) + , Qt.point(0.529762488889,0.290757974696) + , Qt.point(0.529763486111,0.290758762047) + , Qt.point(0.529765408333,0.290760370007) + , Qt.point(0.529766525,0.290761368044) + , Qt.point(0.529767975,0.290762576771) + , Qt.point(0.529772969444,0.290766846062) + , Qt.point(0.529777966667,0.290770987734) + , Qt.point(0.529779575,0.290772335005) + , Qt.point(0.529781877778,0.290774258868) + , Qt.point(0.529783938889,0.29077606074) + , Qt.point(0.529784777778,0.290777091956) + , Qt.point(0.529785808333,0.290778505712) + , Qt.point(0.529786455556,0.290779259711) + , Qt.point(0.529788375,0.290782181426) + , Qt.point(0.529791186111,0.290786222963) + , Qt.point(0.5297933,0.290789283162) + , Qt.point(0.529796147222,0.290793762492) + , Qt.point(0.529797025,0.290795153945) + , Qt.point(0.529798522222,0.290797277138) + , Qt.point(0.529800147222,0.290799206284) + , Qt.point(0.529800636111,0.290799766176) + , Qt.point(0.529800897222,0.290800237371) + , Qt.point(0.529801055556,0.29080060324) + , Qt.point(0.5298013,0.290801479103) + , Qt.point(0.529802802778,0.29080529294) + , Qt.point(0.529804477778,0.290808441514) + , Qt.point(0.529805569444,0.290809882744) + , Qt.point(0.529807447222,0.290812499103) + , Qt.point(0.529807805556,0.29081287049) + , Qt.point(0.529807855556,0.290813419254) + , Qt.point(0.529807883333,0.290814805015) + , Qt.point(0.529807952778,0.290815996762) + , Qt.point(0.529808475,0.290817953426) + , Qt.point(0.529808813889,0.290819328067) + , Qt.point(0.529809558333,0.290822343374) + , Qt.point(0.529810169444,0.290824566022) + , Qt.point(0.529810936111,0.290827154458) + , Qt.point(0.529811030556,0.290827947056) + , Qt.point(0.529811213889,0.290829970104) + , Qt.point(0.529811213889,0.290830635211) + , Qt.point(0.529811377778,0.290832270255) + , Qt.point(0.529812172222,0.290834958347) + , Qt.point(0.529812766667,0.290836848301) + , Qt.point(0.529813163889,0.290837646399) + , Qt.point(0.529813411111,0.290838095328) + , Qt.point(0.529813908333,0.290838494374) + , Qt.point(0.529814752778,0.290838987639) + , Qt.point(0.529815944444,0.290839885489) + , Qt.point(0.529816641667,0.29084042863) + , Qt.point(0.529819719444,0.29084252359) + , Qt.point(0.529820463889,0.290843122145) + , Qt.point(0.529818922222,0.290845555142) + , Qt.point(0.529818675,0.29084605393) + , Qt.point(0.529818327778,0.290846253445) + , Qt.point(0.529816936111,0.290848791698) + , Qt.point(0.529816638889,0.290849190722) + , Qt.point(0.529813394444,0.290855275724) + , Qt.point(0.529812819444,0.290856339747) + , Qt.point(0.529811563889,0.29085861186) + , Qt.point(0.529811283333,0.29085774181) + , Qt.point(0.529811072222,0.290856794172) + , Qt.point(0.529810494444,0.290854505411) + , Qt.point(0.529810355556,0.290853823765) + , Qt.point(0.52981025,0.290853020196) + , Qt.point(0.529810133333,0.290851873024) + , Qt.point(0.529810233333,0.290851307749) + , Qt.point(0.529810025,0.290850626091) + , Qt.point(0.529809588889,0.290850132857) + , Qt.point(0.529808047222,0.29084874182) + , Qt.point(0.529800963889,0.290842944796) + , Qt.point(0.529800127778,0.290842285275) + , Qt.point(0.529799705556,0.290841825273) + , Qt.point(0.529797669444,0.290844513225) + , Qt.point(0.529792208333,0.290851873024) + , Qt.point(0.529786297222,0.290859681406) + , Qt.point(0.529786141667,0.290859980656) + , Qt.point(0.529786,0.29086032978) + , Qt.point(0.529785880556,0.290860817445) + , Qt.point(0.529785861111,0.290861133318) + , Qt.point(0.529785758333,0.290861886978) + , Qt.point(0.529785272222,0.290866358999) + , Qt.point(0.529785008333,0.290868215382) + , Qt.point(0.529784938889,0.290868946847) + , Qt.point(0.529784938889,0.290869789137) + , Qt.point(0.529786858333,0.290869595189) + , Qt.point(0.529789625,0.290869379076) + , Qt.point(0.529795552778,0.290869578565) + , Qt.point(0.529799208333,0.29086967831) + , Qt.point(0.529798263889,0.29087136842) + , Qt.point(0.529797022222,0.290873313413) + , Qt.point(0.529795683333,0.290874804006) + , Qt.point(0.529794936111,0.290876095105) + , Qt.point(0.529793744444,0.290877541346) + , Qt.point(0.52979315,0.290878134247) + , Qt.point(0.529796177778,0.29088072193) + , Qt.point(0.5297977,0.290881553084) + , Qt.point(0.529791852778,0.29088517687) + , Qt.point(0.529795794444,0.290888501382) + , Qt.point(0.529800825,0.29088356446) + , Qt.point(0.529806358333,0.290886246261) + , Qt.point(0.529808591667,0.290887343351) + , Qt.point(0.529810652778,0.290888290832) + , Qt.point(0.529809833333,0.290890324298) + , Qt.point(0.529808788889,0.290892357741) + , Qt.point(0.529806569444,0.290894972927) + , Qt.point(0.529804455556,0.290898352667) + , Qt.point(0.529802594444,0.290901765588) + , Qt.point(0.529802313889,0.290906729723) + , Qt.point(0.529801697222,0.290911394558) + , Qt.point(0.529798230556,0.290926230385) + , Qt.point(0.529795775,0.290942289179) + , Qt.point(0.529792361111,0.290941336437) + , Qt.point(0.529790425,0.290941702024) + , Qt.point(0.529778486111,0.290944322048) + , Qt.point(0.529768205556,0.290946194262) + , Qt.point(0.529757761111,0.29094870898) + , Qt.point(0.529749572222,0.290950387287) + , Qt.point(0.529743936111,0.290951334443) + , Qt.point(0.529743683333,0.290957249905) + , Qt.point(0.529740972222,0.290964239653) + , Qt.point(0.529736622222,0.290967263662) + , Qt.point(0.529719269444,0.290977808534) + , Qt.point(0.529681188889,0.29100299969) + , Qt.point(0.529613758333,0.291045023422) + , Qt.point(0.529605786111,0.291040683075) + , Qt.point(0.529577127778,0.290902242062) + , Qt.point(0.5295729,0.290900153323) + ] + , 'Gamle Oslo_9' : [ + Qt.point(0.529613758333,0.291045023422) + , Qt.point(0.529681188889,0.29100299969) + , Qt.point(0.529719269444,0.290977808534) + , Qt.point(0.529736622222,0.290967263662) + , Qt.point(0.529740972222,0.290964239653) + , Qt.point(0.529743683333,0.290957249905) + , Qt.point(0.529743936111,0.290951334443) + , Qt.point(0.529749572222,0.290950387287) + , Qt.point(0.529757761111,0.29094870898) + , Qt.point(0.529768205556,0.290946194262) + , Qt.point(0.529778486111,0.290944322048) + , Qt.point(0.529790425,0.290941702024) + , Qt.point(0.529792361111,0.290941336437) + , Qt.point(0.529795775,0.290942289179) + , Qt.point(0.529823652778,0.290949235184) + , Qt.point(0.529844961111,0.290954768536) + , Qt.point(0.529851233333,0.290956180926) + , Qt.point(0.529867622222,0.290934545237) + , Qt.point(0.529870722222,0.290930174585) + , Qt.point(0.529870955556,0.290929459982) + , Qt.point(0.529871938889,0.290926440892) + , Qt.point(0.529873086111,0.29092390371) + , Qt.point(0.529873905556,0.290921034103) + , Qt.point(0.529874902778,0.290917715719) + , Qt.point(0.529876055556,0.290913150765) + , Qt.point(0.529876388889,0.290911106472) + , Qt.point(0.529876425,0.290909621713) + , Qt.point(0.529876894444,0.290908447193) + , Qt.point(0.529878730556,0.290903117441) + , Qt.point(0.529879938889,0.290900009271) + , Qt.point(0.529880575,0.290898252938) + , Qt.point(0.529881669444,0.290894956305) + , Qt.point(0.529881791667,0.290894169537) + , Qt.point(0.529881861111,0.290893576688) + , Qt.point(0.529882066667,0.290891437985) + , Qt.point(0.529882108333,0.290890185779) + , Qt.point(0.5298823,0.290889293716) + , Qt.point(0.529882422222,0.290888628821) + , Qt.point(0.529882597222,0.290887947301) + , Qt.point(0.529883175,0.290886373701) + , Qt.point(0.529885813889,0.290880378385) + , Qt.point(0.529884852778,0.290880045922) + , Qt.point(0.529883702778,0.290879696835) + , Qt.point(0.529885077778,0.290875967658) + , Qt.point(0.529885930556,0.290874299755) + , Qt.point(0.529886511111,0.290873396532) + , Qt.point(0.52988745,0.290872166368) + , Qt.point(0.529888175,0.290871152308) + , Qt.point(0.529888627778,0.290870254611) + , Qt.point(0.529889316667,0.290868575574) + , Qt.point(0.529890836111,0.290865029041) + , Qt.point(0.529891341667,0.290864236603) + , Qt.point(0.529891869444,0.290863610409) + , Qt.point(0.5298927,0.290862817965) + , Qt.point(0.529893244444,0.29086234693) + , Qt.point(0.529893433333,0.290862108642) + , Qt.point(0.52989375,0.29086100586) + , Qt.point(0.529893802778,0.290860324238) + , Qt.point(0.529893188889,0.290859204821) + , Qt.point(0.529892502778,0.290858390192) + , Qt.point(0.529891563889,0.290857608809) + , Qt.point(0.529890502778,0.290856949341) + , Qt.point(0.529889502778,0.290856727671) + , Qt.point(0.529888502778,0.290856633461) + , Qt.point(0.529887002778,0.290856101451) + , Qt.point(0.529886597222,0.29085581882) + , Qt.point(0.529887272222,0.290855059593) + , Qt.point(0.529888530556,0.290854200611) + , Qt.point(0.529893352778,0.290851601471) + , Qt.point(0.529896366667,0.290856783089) + , Qt.point(0.529897052778,0.290855990615) + , Qt.point(0.529897766667,0.290855275724) + , Qt.point(0.529898586111,0.290854400117) + , Qt.point(0.529899302778,0.290853773889) + , Qt.point(0.529901305556,0.290851911818) + , Qt.point(0.529902202778,0.290850980775) + , Qt.point(0.529902761111,0.290851956153) + , Qt.point(0.52990545,0.290856345289) + , Qt.point(0.529906983333,0.290858916653) + , Qt.point(0.529910175,0.290863288999) + , Qt.point(0.529911833333,0.290865671855) + , Qt.point(0.529915983333,0.290870797663) + , Qt.point(0.52992035,0.290866985184) + , Qt.point(0.529923338889,0.290864364059) + , Qt.point(0.529924683333,0.290863067336) + , Qt.point(0.529924961111,0.290862740383) + , Qt.point(0.529925086111,0.290862463304) + , Qt.point(0.529925138889,0.290862130808) + , Qt.point(0.529925286111,0.29086182602) + , Qt.point(0.529925483333,0.290861526773) + , Qt.point(0.529925683333,0.290860928278) + , Qt.point(0.529927813889,0.290855768944) + , Qt.point(0.529928019444,0.290855209222) + , Qt.point(0.529928369444,0.290854815754) + , Qt.point(0.529928616667,0.290854616248) + , Qt.point(0.529928963889,0.290854416742) + , Qt.point(0.529929311111,0.290854316989) + , Qt.point(0.529929708333,0.29085416736) + , Qt.point(0.529930158333,0.29085416736) + , Qt.point(0.529930505556,0.290854217236) + , Qt.point(0.529931272222,0.290854244945) + , Qt.point(0.529931391667,0.290854826837) + , Qt.point(0.529931533333,0.290855281266) + , Qt.point(0.529931741667,0.290855840987) + , Qt.point(0.529933883333,0.290862995295) + , Qt.point(0.529935508333,0.290868847102) + , Qt.point(0.529936269444,0.290868575574) + , Qt.point(0.5299369,0.290868365) + , Qt.point(0.529937947222,0.290868137802) + , Qt.point(0.529939880556,0.290867844107) + , Qt.point(0.529940872222,0.290867655698) + , Qt.point(0.529941716667,0.290867472831) + , Qt.point(0.529942361111,0.290867262256) + , Qt.point(0.529942858333,0.290867062764) + , Qt.point(0.529943255556,0.290866813399) + , Qt.point(0.529943702778,0.290866464287) + , Qt.point(0.52994415,0.290866015427) + , Qt.point(0.529944511111,0.290865416946) + , Qt.point(0.529944722222,0.290864979168) + , Qt.point(0.529944880556,0.290864485972) + , Qt.point(0.529945072222,0.290863981693) + , Qt.point(0.529945158333,0.290863438621) + , Qt.point(0.529945875,0.29086372124) + , Qt.point(0.529946677778,0.290863948443) + , Qt.point(0.529947533333,0.290864070357) + , Qt.point(0.529948266667,0.290864070357) + , Qt.point(0.529948894444,0.290863965068) + , Qt.point(0.529949419444,0.29086379328) + , Qt.point(0.529950727778,0.290863178167) + , Qt.point(0.529950361111,0.290862042143) + , Qt.point(0.529949813889,0.29086070107) + , Qt.point(0.529949219444,0.290858911112) + , Qt.point(0.529949088889,0.290858251649) + , Qt.point(0.529949630556,0.290858113106) + , Qt.point(0.529958175,0.290852820688) + , Qt.point(0.529963936111,0.290850360078) + , Qt.point(0.529964444444,0.290850099606) + , Qt.point(0.529967708333,0.290848736278) + , Qt.point(0.529972922222,0.290846552717) + , Qt.point(0.529982888889,0.290842202143) + , Qt.point(0.529985416667,0.290841110326) + , Qt.point(0.529990397222,0.290838954386) + , Qt.point(0.529996511111,0.29083635503) + , Qt.point(0.529998241667,0.290835640063) + , Qt.point(0.530002730556,0.290833689129) + , Qt.point(0.530009086111,0.29083234785) + , Qt.point(0.530012441667,0.290831671664) + , Qt.point(0.530015933333,0.290831028731) + , Qt.point(0.530019269444,0.290830474477) + , Qt.point(0.5300192,0.290829493443) + , Qt.point(0.530021277778,0.290828950269) + , Qt.point(0.530022241667,0.290837552179) + , Qt.point(0.530022586111,0.290841088157) + , Qt.point(0.530022655556,0.290842174432) + , Qt.point(0.530022761111,0.29084303347) + , Qt.point(0.530022794444,0.290843504555) + , Qt.point(0.530022933333,0.290844485514) + , Qt.point(0.53002295,0.290844729368) + , Qt.point(0.530023088889,0.290845532974) + , Qt.point(0.530023261111,0.290846968371) + , Qt.point(0.530023347222,0.290847267642) + , Qt.point(0.530023416667,0.290847666669) + , Qt.point(0.530023555556,0.290848143283) + , Qt.point(0.530023661111,0.290848647606) + , Qt.point(0.530023816667,0.29084915747) + , Qt.point(0.530024063889,0.290849855759) + , Qt.point(0.530024130556,0.290850138399) + , Qt.point(0.530024269444,0.290850448749) + , Qt.point(0.530024791667,0.290851485091) + , Qt.point(0.530025069444,0.290851956153) + , Qt.point(0.530025661111,0.290852881649) + , Qt.point(0.530025977778,0.290853319456) + , Qt.point(0.530026638889,0.290854145192) + , Qt.point(0.530026883333,0.290854477702) + , Qt.point(0.530027202778,0.290854854546) + , Qt.point(0.530028052778,0.290855597148) + , Qt.point(0.530028538889,0.290856084826) + , Qt.point(0.530029427778,0.290856893924) + , Qt.point(0.530029741667,0.290857121136) + , Qt.point(0.530029952778,0.290857315097) + , Qt.point(0.530030841667,0.290858085397) + , Qt.point(0.530029830556,0.290858744861) + , Qt.point(0.530029027778,0.290859321197) + , Qt.point(0.530027122222,0.290860889486) + , Qt.point(0.530026352778,0.290861554481) + , Qt.point(0.530025725,0.290862202849) + , Qt.point(0.530024766667,0.290863139376) + , Qt.point(0.530025636111,0.290863870862) + , Qt.point(0.530027597222,0.290866353457) + , Qt.point(0.530037091667,0.290877873814) + , Qt.point(0.530038661111,0.290879802115) + , Qt.point(0.530037772222,0.290884079768) + , Qt.point(0.530037075,0.290887060768) + , Qt.point(0.530036175,0.290891088919) + , Qt.point(0.530035775,0.290893177761) + , Qt.point(0.530035233333,0.290895338607) + , Qt.point(0.530035947222,0.290896302668) + , Qt.point(0.530036541667,0.290897438481) + , Qt.point(0.530037827778,0.29090023643) + , Qt.point(0.530038175,0.290900884661) + , Qt.point(0.530038647222,0.290901588295) + , Qt.point(0.530039586111,0.290902729615) + , Qt.point(0.53004065,0.290903632694) + , Qt.point(0.530041916667,0.290904574551) + , Qt.point(0.530042858333,0.290905422218) + , Qt.point(0.530043702778,0.290906280961) + , Qt.point(0.530044955556,0.290907854391) + , Qt.point(0.530045755556,0.290909006753) + , Qt.point(0.530046577778,0.290910413955) + , Qt.point(0.530046172222,0.290910546918) + , Qt.point(0.530045819444,0.290910657721) + , Qt.point(0.530045666667,0.290910702042) + , Qt.point(0.530045133333,0.290910890407) + , Qt.point(0.530044652778,0.29091101783) + , Qt.point(0.530039075,0.29091272418) + , Qt.point(0.530034555556,0.290914159054) + , Qt.point(0.530030183333,0.290915499736) + , Qt.point(0.530027155556,0.290916485852) + , Qt.point(0.5300206,0.290918469147) + , Qt.point(0.530016877778,0.290919654682) + , Qt.point(0.530015833333,0.290919953835) + , Qt.point(0.530014491667,0.290920302845) + , Qt.point(0.5300134,0.290920546598) + , Qt.point(0.530010075,0.29092113936) + , Qt.point(0.530008336111,0.290921388652) + , Qt.point(0.530007986111,0.290922430134) + , Qt.point(0.530007738889,0.290922978571) + , Qt.point(0.530007291667,0.290923576865) + , Qt.point(0.530006680556,0.290924297031) + , Qt.point(0.53000625,0.290924668192) + , Qt.point(0.53000605,0.29092508367) + , Qt.point(0.530005963889,0.29092562102) + , Qt.point(0.530006030556,0.290926512907) + , Qt.point(0.5300056,0.290926756652) + , Qt.point(0.530004208333,0.290927648534) + , Qt.point(0.530003413889,0.290928191416) + , Qt.point(0.530002669444,0.290928640124) + , Qt.point(0.530001527778,0.290929282716) + , Qt.point(0.530000136111,0.290930279837) + , Qt.point(0.529999936111,0.29093047926) + , Qt.point(0.529999688889,0.290930573432) + , Qt.point(0.529999488889,0.290930623288) + , Qt.point(0.529999241667,0.290930623288) + , Qt.point(0.529998611111,0.290930457102) + , Qt.point(0.529998436111,0.290930490339) + , Qt.point(0.529998191667,0.290930490339) + , Qt.point(0.529998033333,0.290930628828) + , Qt.point(0.529997825,0.290930662065) + , Qt.point(0.529997633333,0.290930750697) + , Qt.point(0.529996688889,0.29093141544) + , Qt.point(0.529999180556,0.290935403845) + , Qt.point(0.529998113889,0.290937253992) + , Qt.point(0.529995686111,0.290939768833) + , Qt.point(0.529995061111,0.290940466778) + , Qt.point(0.529994511111,0.290941042858) + , Qt.point(0.529993416667,0.290941846043) + , Qt.point(0.529992716667,0.290942267022) + , Qt.point(0.529990080556,0.290943507795) + , Qt.point(0.529989502778,0.290943817987) + , Qt.point(0.529988944444,0.290944061709) + , Qt.point(0.529983952778,0.290945734518) + , Qt.point(0.529977983333,0.290947833818) + , Qt.point(0.529975994444,0.290948199392) + , Qt.point(0.529973758333,0.290948393258) + , Qt.point(0.529969736111,0.29094865359) + , Qt.point(0.529970075,0.290951838483) + , Qt.point(0.529968975,0.290952115428) + , Qt.point(0.529966547222,0.290952652699) + , Qt.point(0.529965041667,0.290952935181) + , Qt.point(0.529963175,0.290953333979) + , Qt.point(0.529960677778,0.290953821397) + , Qt.point(0.529959002778,0.290954203577) + , Qt.point(0.529955058333,0.290955056554) + , Qt.point(0.529954361111,0.290955039937) + , Qt.point(0.529952963889,0.290954967933) + , Qt.point(0.529951988889,0.290954951316) + , Qt.point(0.529950416667,0.290954862696) + , Qt.point(0.529945880556,0.290954696531) + , Qt.point(0.529944991667,0.290954696531) + , Qt.point(0.529942063889,0.290953123503) + , Qt.point(0.529940997222,0.290952702549) + , Qt.point(0.529941336111,0.290951932644) + , Qt.point(0.529937927778,0.290951423066) + , Qt.point(0.529937177778,0.290951345521) + , Qt.point(0.529935886111,0.29095114612) + , Qt.point(0.529934547222,0.290950996569) + , Qt.point(0.529933327778,0.290950913485) + , Qt.point(0.529932583333,0.290951101809) + , Qt.point(0.529931327778,0.290950979952) + , Qt.point(0.529926930556,0.290950470371) + , Qt.point(0.529923677778,0.290950143573) + , Qt.point(0.529921988889,0.290949994022) + , Qt.point(0.529919827778,0.290949678301) + , Qt.point(0.529917263889,0.290949240723) + , Qt.point(0.529912902778,0.290949412431) + , Qt.point(0.529910511111,0.290949512132) + , Qt.point(0.529905661111,0.290949999561) + , Qt.point(0.529900755556,0.290951832944) + , Qt.point(0.529898766667,0.290952530844) + , Qt.point(0.529897388889,0.290953982023) + , Qt.point(0.529894805556,0.290956596333) + , Qt.point(0.529894691667,0.290956978507) + , Qt.point(0.529894838889,0.290957460377) + , Qt.point(0.529894527778,0.290957554535) + , Qt.point(0.529894327778,0.290958224719) + , Qt.point(0.529894519444,0.290958274568) + , Qt.point(0.529894269444,0.290959138603) + , Qt.point(0.529893291667,0.290958894901) + , Qt.point(0.529891380556,0.290962733169) + , Qt.point(0.529890347222,0.290966643357) + , Qt.point(0.529890016667,0.290968066733) + , Qt.point(0.529889666667,0.290969451329) + , Qt.point(0.529889569444,0.290969755939) + , Qt.point(0.529889194444,0.290971190368) + , Qt.point(0.52988825,0.290977060887) + , Qt.point(0.529887725,0.290979453346) + , Qt.point(0.529887113889,0.290982056218) + , Qt.point(0.529888175,0.290986935119) + , Qt.point(0.529889252778,0.290990324246) + , Qt.point(0.529886497222,0.290991581308) + , Qt.point(0.529885536111,0.29099198556) + , Qt.point(0.5298843,0.290988768135) + , Qt.point(0.529883238889,0.29098639241) + , Qt.point(0.529882052778,0.290983977889) + , Qt.point(0.529880972222,0.290982089446) + , Qt.point(0.529879491667,0.290979309356) + , Qt.point(0.529878113889,0.290976307698) + , Qt.point(0.529876205556,0.290976778441) + , Qt.point(0.529876041667,0.290976418462) + , Qt.point(0.529875830556,0.290976407385) + , Qt.point(0.52987445,0.29097672306) + , Qt.point(0.529873852778,0.290976939048) + , Qt.point(0.529872922222,0.290977371022) + , Qt.point(0.529872436111,0.290977537166) + , Qt.point(0.529872275,0.290977625776) + , Qt.point(0.529872033333,0.290977714386) + , Qt.point(0.529871827778,0.2909778473) + , Qt.point(0.529870972222,0.290978234968) + , Qt.point(0.529870563889,0.290978467568) + , Qt.point(0.529870297222,0.290978539563) + , Qt.point(0.529869725,0.290978534025) + , Qt.point(0.529869313889,0.29097860602) + , Qt.point(0.529868316667,0.290978495258) + , Qt.point(0.529859197222,0.290982443877) + , Qt.point(0.529865844444,0.291004616591) + , Qt.point(0.529840044444,0.291024726992) + , Qt.point(0.529825413889,0.29104308578) + , Qt.point(0.529808083333,0.291064310153) + , Qt.point(0.529795161111,0.291081497112) + , Qt.point(0.529772494444,0.291082836575) + , Qt.point(0.529691563889,0.291087640852) + , Qt.point(0.529613758333,0.291045023422) + ] + , 'Grorud_9' : [ + Qt.point(0.530128586111,0.290647390481) + , Qt.point(0.530128711111,0.290645870303) + , Qt.point(0.530129025,0.2906457316) + , Qt.point(0.530128836111,0.29064420586) + , Qt.point(0.530129708333,0.290641620395) + , Qt.point(0.530130216667,0.290641060021) + , Qt.point(0.530131002778,0.290641220921) + , Qt.point(0.530131425,0.290640416421) + , Qt.point(0.530133102778,0.290640261069) + , Qt.point(0.530134552778,0.29064035539) + , Qt.point(0.530135327778,0.290640349842) + , Qt.point(0.530135519444,0.290640227779) + , Qt.point(0.530142380556,0.290644228052) + , Qt.point(0.530148186111,0.290644222504) + , Qt.point(0.530149144444,0.290644749579) + , Qt.point(0.530151327778,0.290646541624) + , Qt.point(0.530151066667,0.290645509675) + , Qt.point(0.530151261111,0.290644194763) + , Qt.point(0.530153061111,0.290644216956) + , Qt.point(0.530156172222,0.290645359875) + , Qt.point(0.530156677778,0.29064582037) + , Qt.point(0.530156641667,0.29064555406) + , Qt.point(0.530156713889,0.290645309942) + , Qt.point(0.530156994444,0.290645204527) + , Qt.point(0.530157341667,0.290645293298) + , Qt.point(0.530157463889,0.290645082468) + , Qt.point(0.530157572222,0.290644228052) + , Qt.point(0.530160019444,0.290644250245) + , Qt.point(0.530159341667,0.290641903355) + , Qt.point(0.530159205556,0.290640200038) + , Qt.point(0.53015825,0.290637203937) + , Qt.point(0.530157727778,0.290635156573) + , Qt.point(0.530162097222,0.290635655933) + , Qt.point(0.530164927778,0.290636748969) + , Qt.point(0.530165330556,0.290637009744) + , Qt.point(0.530165783333,0.290636432711) + , Qt.point(0.530165383333,0.2906355949) + , Qt.point(0.530165244444,0.290634807021) + , Qt.point(0.530165458333,0.290633963655) + , Qt.point(0.530165913889,0.290633386612) + , Qt.point(0.530166772222,0.290632848407) + , Qt.point(0.530169952778,0.290632171487) + , Qt.point(0.530169502778,0.290629963158) + , Qt.point(0.530171216667,0.290629619145) + , Qt.point(0.530171683333,0.290631844124) + , Qt.point(0.530173116667,0.290631616633) + , Qt.point(0.530173433333,0.290631738701) + , Qt.point(0.530173875,0.290629169707) + , Qt.point(0.530173419444,0.290628992151) + , Qt.point(0.530172811111,0.290628570455) + , Qt.point(0.53017575,0.290627227679) + , Qt.point(0.530176386111,0.290626983537) + , Qt.point(0.530176158333,0.290626772686) + , Qt.point(0.530175791667,0.290626650615) + , Qt.point(0.530176825,0.290625895991) + , Qt.point(0.530176344444,0.290618366221) + , Qt.point(0.530175302778,0.290616440726) + , Qt.point(0.530174413889,0.290615541785) + , Qt.point(0.530172902778,0.290615031273) + , Qt.point(0.530172747222,0.290613089095) + , Qt.point(0.530172672222,0.290612844934) + , Qt.point(0.530172666667,0.29061230112) + , Qt.point(0.530172577778,0.290611862738) + , Qt.point(0.530172252778,0.290608549869) + , Qt.point(0.530172727778,0.290608483278) + , Qt.point(0.530173083333,0.29060817252) + , Qt.point(0.530173638889,0.29060764534) + , Qt.point(0.530174813889,0.290606668665) + , Qt.point(0.530176236111,0.290605386772) + , Qt.point(0.530175191667,0.290601185873) + , Qt.point(0.530175016667,0.290600558782) + , Qt.point(0.530173122222,0.290600508837) + , Qt.point(0.530171522222,0.290599759655) + , Qt.point(0.530170580556,0.29059958207) + , Qt.point(0.530169516667,0.290598583155) + , Qt.point(0.530168958333,0.290597845064) + , Qt.point(0.530168783333,0.290597550936) + , Qt.point(0.530168436111,0.290597040374) + , Qt.point(0.530168555556,0.290596812841) + , Qt.point(0.530168822222,0.290596180186) + , Qt.point(0.530169005556,0.29059566962) + , Qt.point(0.530169155556,0.29059536994) + , Qt.point(0.530169355556,0.290594870471) + , Qt.point(0.530169630556,0.290594326604) + , Qt.point(0.530169752778,0.290594010272) + , Qt.point(0.530169858333,0.290593660642) + , Qt.point(0.530170280556,0.290592667244) + , Qt.point(0.530170005556,0.290592434155) + , Qt.point(0.530170011111,0.290590941271) + , Qt.point(0.530169961111,0.290590491739) + , Qt.point(0.530169475,0.290590497289) + , Qt.point(0.530169047222,0.290590341894) + , Qt.point(0.530168619444,0.290590086604) + , Qt.point(0.530168266667,0.29058960932) + , Qt.point(0.530167525,0.290589037688) + , Qt.point(0.530166677778,0.290588671399) + , Qt.point(0.530166513889,0.290588488254) + , Qt.point(0.530166063889,0.290586579095) + , Qt.point(0.530166011111,0.290585685558) + , Qt.point(0.530165841667,0.29058379302) + , Qt.point(0.5301664,0.29058369312) + , Qt.point(0.530166647222,0.29058339342) + , Qt.point(0.530166977778,0.29058360432) + , Qt.point(0.530167502778,0.29058360432) + , Qt.point(0.530168130556,0.29058388737) + , Qt.point(0.530168269444,0.290584203719) + , Qt.point(0.530168688889,0.290584570017) + , Qt.point(0.530168897222,0.290585258212) + , Qt.point(0.530169858333,0.290585996354) + , Qt.point(0.530170119444,0.290585868705) + , Qt.point(0.530170313889,0.290585557909) + , Qt.point(0.530171013889,0.290585241562) + , Qt.point(0.530170755556,0.29058377082) + , Qt.point(0.530171191667,0.29058378747) + , Qt.point(0.530172608333,0.29058316032) + , Qt.point(0.530173430556,0.290582655268) + , Qt.point(0.530174272222,0.290581767262) + , Qt.point(0.530174711111,0.290581434258) + , Qt.point(0.530174588889,0.290581117904) + , Qt.point(0.530174641667,0.290580873701) + , Qt.point(0.5301748,0.290580590647) + , Qt.point(0.530175691667,0.29058020769) + , Qt.point(0.530176688889,0.290580068937) + , Qt.point(0.530177547222,0.290580074488) + , Qt.point(0.530178366667,0.290580302042) + , Qt.point(0.530178908333,0.290580635047) + , Qt.point(0.530179086111,0.290579619378) + , Qt.point(0.530180397222,0.290579641579) + , Qt.point(0.5301812,0.290579852483) + , Qt.point(0.530182319444,0.290579785882) + , Qt.point(0.530182705556,0.290579280821) + , Qt.point(0.530182913889,0.290579508376) + , Qt.point(0.530183002778,0.290579769232) + , Qt.point(0.530183316667,0.290579763681) + , Qt.point(0.530184347222,0.290579758131) + , Qt.point(0.530185675,0.290579741481) + , Qt.point(0.530185875,0.29057716621) + , Qt.point(0.530186316667,0.29057562325) + , Qt.point(0.530185802778,0.290570783378) + , Qt.point(0.5301868,0.290570422602) + , Qt.point(0.530186563889,0.290566465127) + , Qt.point(0.530186688889,0.290565488234) + , Qt.point(0.530188677778,0.290567258849) + , Qt.point(0.530190663889,0.290569945268) + , Qt.point(0.530190433333,0.29057096099) + , Qt.point(0.530192641667,0.290569406877) + , Qt.point(0.530193133333,0.290569034998) + , Qt.point(0.530193516667,0.290568862934) + , Qt.point(0.530193675,0.290568407797) + , Qt.point(0.530193841667,0.290568130274) + , Qt.point(0.530194133333,0.290567514172) + , Qt.point(0.530194502778,0.290566553935) + , Qt.point(0.530195608333,0.290564244908) + , Qt.point(0.530197452778,0.290562829504) + , Qt.point(0.530197680556,0.290562685187) + , Qt.point(0.530199169444,0.290561464045) + , Qt.point(0.530199644444,0.290561131004) + , Qt.point(0.5302001,0.290560764659) + , Qt.point(0.530200325,0.290560625892) + , Qt.point(0.530200677778,0.29056029285) + , Qt.point(0.530201658333,0.290559576808) + , Qt.point(0.530202252778,0.290559193808) + , Qt.point(0.530202777778,0.290558705343) + , Qt.point(0.530203336111,0.290559338127) + , Qt.point(0.530203338889,0.290559127199) + , Qt.point(0.530203391667,0.290558932923) + , Qt.point(0.530203497222,0.290558721995) + , Qt.point(0.530203847222,0.290558477762) + , Qt.point(0.530204177778,0.290558427805) + , Qt.point(0.530204597222,0.290558605429) + , Qt.point(0.530204938889,0.290558799706) + , Qt.point(0.530205344444,0.290558083658) + , Qt.point(0.530206013889,0.290556823629) + , Qt.point(0.530205497222,0.290556407318) + , Qt.point(0.530205175,0.290556068718) + , Qt.point(0.530204916667,0.290555768973) + , Qt.point(0.530203383333,0.29055452003) + , Qt.point(0.530202583333,0.290555069566) + , Qt.point(0.530201647222,0.290555091769) + , Qt.point(0.530200858333,0.29055548588) + , Qt.point(0.530200166667,0.290555963252) + , Qt.point(0.530196297222,0.290556723714) + , Qt.point(0.5301957,0.290556868035) + , Qt.point(0.53019535,0.290556868035) + , Qt.point(0.530189494444,0.290551822284) + , Qt.point(0.530188302778,0.290550873068) + , Qt.point(0.530188352778,0.290550523356) + , Qt.point(0.530188702778,0.290549279928) + , Qt.point(0.530189002778,0.290548086452) + , Qt.point(0.530189805556,0.290545893766) + , Qt.point(0.530190205556,0.290544650307) + , Qt.point(0.530190655556,0.290543506762) + , Qt.point(0.530191055556,0.290542357658) + , Qt.point(0.530191358333,0.290541413944) + , Qt.point(0.530191558333,0.290540120493) + , Qt.point(0.530192413889,0.290536084646) + , Qt.point(0.530192769444,0.290533147914) + , Qt.point(0.530193277778,0.29052796272) + , Qt.point(0.530207458333,0.290527146621) + , Qt.point(0.530207608333,0.290527252104) + , Qt.point(0.530207755556,0.290527746204) + , Qt.point(0.530207952778,0.29052859561) + , Qt.point(0.53020815,0.290529295118) + , Qt.point(0.530208247222,0.290529889142) + , Qt.point(0.530208594444,0.290530938395) + , Qt.point(0.530208838889,0.290531887714) + , Qt.point(0.530209086111,0.290532581658) + , Qt.point(0.530209186111,0.290533181223) + , Qt.point(0.530209383333,0.290533730823) + , Qt.point(0.530210313889,0.290539515399) + , Qt.point(0.530210655556,0.29054250199) + , Qt.point(0.530210752778,0.290543201445) + , Qt.point(0.530210591667,0.290547986532) + , Qt.point(0.530210591667,0.290548580496) + , Qt.point(0.530210638889,0.290548780334) + , Qt.point(0.53020855,0.29055043454) + , Qt.point(0.530206625,0.29055139486) + , Qt.point(0.530205469444,0.290552055424) + , Qt.point(0.530206930556,0.290555297151) + , Qt.point(0.530208041667,0.290554703209) + , Qt.point(0.530208330556,0.290554597742) + , Qt.point(0.530208883333,0.290555519185) + , Qt.point(0.530209052778,0.290555746769) + , Qt.point(0.530209522222,0.290555996557) + , Qt.point(0.530210102778,0.290556207488) + , Qt.point(0.530210680556,0.290556618249) + , Qt.point(0.530210616667,0.290557356506) + , Qt.point(0.530210613889,0.290558039252) + , Qt.point(0.530210597222,0.290558178021) + , Qt.point(0.530210675,0.290558622082) + , Qt.point(0.530210719444,0.290559010634) + , Qt.point(0.530210811111,0.290559449142) + , Qt.point(0.530210908333,0.290559660069) + , Qt.point(0.530211405556,0.290561641666) + , Qt.point(0.530212255556,0.290563268003) + , Qt.point(0.530212594444,0.290564250458) + , Qt.point(0.530215497222,0.290563201395) + , Qt.point(0.530215397222,0.290562613029) + , Qt.point(0.530215541667,0.29056093118) + , Qt.point(0.530215941667,0.290558128064) + , Qt.point(0.530216922222,0.290556679308) + , Qt.point(0.530216530556,0.290555724566) + , Qt.point(0.530216355556,0.29055535821) + , Qt.point(0.530216077778,0.290554986303) + , Qt.point(0.530215625,0.290554320198) + , Qt.point(0.530215380556,0.290553776211) + , Qt.point(0.530215305556,0.29055352642) + , Qt.point(0.530215155556,0.290553376546) + , Qt.point(0.530214841667,0.290552671579) + , Qt.point(0.530215261111,0.290552044322) + , Qt.point(0.530215425,0.290549751765) + , Qt.point(0.530215688889,0.290549662949) + , Qt.point(0.530215916667,0.290549501969) + , Qt.point(0.530216247222,0.29054934654) + , Qt.point(0.530216352778,0.290549224418) + , Qt.point(0.530216877778,0.290548930212) + , Qt.point(0.530217141667,0.290548808089) + , Qt.point(0.530220394444,0.290548780334) + , Qt.point(0.530221744444,0.290554808675) + , Qt.point(0.5302219,0.290555402617) + , Qt.point(0.530221216667,0.290556029862) + , Qt.point(0.530220236111,0.290556873586) + , Qt.point(0.530221841667,0.290557889381) + , Qt.point(0.530222158333,0.290558327891) + , Qt.point(0.530222816667,0.290559082793) + , Qt.point(0.530222869444,0.290559837692) + , Qt.point(0.530222883333,0.290560537081) + , Qt.point(0.530222936111,0.290561186511) + , Qt.point(0.530223072222,0.29056192475) + , Qt.point(0.530223386111,0.290562590827) + , Qt.point(0.530224238889,0.290564799965) + , Qt.point(0.530224380556,0.290565005336) + , Qt.point(0.530225075,0.29056555484) + , Qt.point(0.530223413889,0.290568940641) + , Qt.point(0.530223122222,0.290569490133) + , Qt.point(0.530223772222,0.290569739902) + , Qt.point(0.530224119444,0.290569939717) + , Qt.point(0.530224416667,0.290570039625) + , Qt.point(0.530224627778,0.290570178385) + , Qt.point(0.530224994444,0.290570472556) + , Qt.point(0.530225272222,0.290570650168) + , Qt.point(0.530225605556,0.290570894385) + , Qt.point(0.530225744444,0.290571022044) + , Qt.point(0.530225988889,0.290571299563) + , Qt.point(0.530226355556,0.290571632585) + , Qt.point(0.530226441667,0.290571810196) + , Qt.point(0.530226791667,0.290572143217) + , Qt.point(0.530227102778,0.29057268715) + , Qt.point(0.530228283333,0.290574984971) + , Qt.point(0.530230333333,0.290575101527) + , Qt.point(0.530230622222,0.290575145929) + , Qt.point(0.530230644444,0.290575584398) + , Qt.point(0.5302311,0.290578387248) + , Qt.point(0.530231222222,0.29057883681) + , Qt.point(0.530231305556,0.290579352973) + , Qt.point(0.530230575,0.290579547227) + , Qt.point(0.530233425,0.290580446344) + , Qt.point(0.5302341,0.290581711761) + , Qt.point(0.530234186111,0.290582133565) + , Qt.point(0.530234444444,0.290582660818) + , Qt.point(0.530234716667,0.29058333792) + , Qt.point(0.530234738889,0.29058379302) + , Qt.point(0.530234852778,0.290584320269) + , Qt.point(0.530234605556,0.290585680008) + , Qt.point(0.530234358333,0.290587661324) + , Qt.point(0.530234508333,0.290588449405) + , Qt.point(0.530234561111,0.290589348478) + , Qt.point(0.5302347,0.290590097703) + , Qt.point(0.5302346,0.290591324205) + , Qt.point(0.530234102778,0.29059211227) + , Qt.point(0.530234330556,0.290593111221) + , Qt.point(0.530235058333,0.290594354352) + , Qt.point(0.530235302778,0.29059488157) + , Qt.point(0.530235877778,0.290595109106) + , Qt.point(0.530236558333,0.290595652971) + , Qt.point(0.530237061111,0.290596724047) + , Qt.point(0.530237211111,0.290597395548) + , Qt.point(0.530237302778,0.290598227983) + , Qt.point(0.530237897222,0.290598316776) + , Qt.point(0.530238072222,0.290598416668) + , Qt.point(0.530238566667,0.290598788488) + , Qt.point(0.530238908333,0.290599371189) + , Qt.point(0.530239008333,0.290599826249) + , Qt.point(0.530239033333,0.290600264659) + , Qt.point(0.530238866667,0.290601102631) + , Qt.point(0.530238830556,0.290601474445) + , Qt.point(0.530238733333,0.290601685325) + , Qt.point(0.530238733333,0.290601979445) + , Qt.point(0.530238675,0.290602206972) + , Qt.point(0.530237697222,0.290603888444) + , Qt.point(0.530238366667,0.290604754146) + , Qt.point(0.530238969444,0.290605159249) + , Qt.point(0.530239202778,0.290605669788) + , Qt.point(0.530239358333,0.290606135931) + , Qt.point(0.530239622222,0.290606618721) + , Qt.point(0.530241144444,0.290605841817) + , Qt.point(0.530241447222,0.290606546581) + , Qt.point(0.530241702778,0.290607079313) + , Qt.point(0.530241930556,0.290607428918) + , Qt.point(0.530242030556,0.290607617593) + , Qt.point(0.530242333333,0.290607539904) + , Qt.point(0.530243155556,0.290607157003) + , Qt.point(0.530244188889,0.290606724158) + , Qt.point(0.530244711111,0.29060734013) + , Qt.point(0.530247308333,0.290610125848) + , Qt.point(0.530247605556,0.290610530939) + , Qt.point(0.530247888889,0.290610048159) + , Qt.point(0.530248238889,0.290609654165) + , Qt.point(0.530248438889,0.290609304565) + , Qt.point(0.530248738889,0.29060890502) + , Qt.point(0.530249286111,0.290608111478) + , Qt.point(0.530249552778,0.290607767424) + , Qt.point(0.530249975,0.29060679075) + , Qt.point(0.530250283333,0.29060565314) + , Qt.point(0.530250347222,0.290605164798) + , Qt.point(0.5302504,0.290604149265) + , Qt.point(0.53025035,0.290603549931) + , Qt.point(0.530250280556,0.290603078232) + , Qt.point(0.530249852778,0.290600986092) + , Qt.point(0.530249555556,0.290599942788) + , Qt.point(0.530249361111,0.290599093712) + , Qt.point(0.530249141667,0.290597928307) + , Qt.point(0.530248966667,0.290597051474) + , Qt.point(0.530248722222,0.290595503131) + , Qt.point(0.530248625,0.290594409849) + , Qt.point(0.530248541667,0.290593144519) + , Qt.point(0.530248616667,0.290590935721) + , Qt.point(0.530248672222,0.290589870161) + , Qt.point(0.530248744444,0.290588926691) + , Qt.point(0.530249041667,0.290587683523) + , Qt.point(0.530249494444,0.290585596759) + , Qt.point(0.530249963889,0.29058362097) + , Qt.point(0.5302502,0.290582161315) + , Qt.point(0.53025035,0.290581012453) + , Qt.point(0.530250452778,0.290580068937) + , Qt.point(0.530250555556,0.290578720257) + , Qt.point(0.530250611111,0.290577277214) + , Qt.point(0.530250913889,0.290575234733) + , Qt.point(0.530251113889,0.290574590902) + , Qt.point(0.530252197222,0.290571943404) + , Qt.point(0.530251025,0.290571538228) + , Qt.point(0.530250083333,0.290571166354) + , Qt.point(0.530249680556,0.290571044246) + , Qt.point(0.530248438889,0.290571355066) + , Qt.point(0.530248466667,0.290569689948) + , Qt.point(0.530248547222,0.290568735274) + , Qt.point(0.530249244444,0.290567186693) + , Qt.point(0.530251527778,0.290567231097) + , Qt.point(0.530252172222,0.290567547475) + , Qt.point(0.530254286111,0.290568885136) + , Qt.point(0.530255233333,0.290567891604) + , Qt.point(0.530256213889,0.290566981324) + , Qt.point(0.530256983333,0.290566315263) + , Qt.point(0.530258797222,0.290564894325) + , Qt.point(0.530259644444,0.290564294863) + , Qt.point(0.530260491667,0.290563750905) + , Qt.point(0.530261786111,0.29056315699) + , Qt.point(0.530262633333,0.29056271294) + , Qt.point(0.530264216667,0.290562063516) + , Qt.point(0.530265408333,0.290561641666) + , Qt.point(0.530266716667,0.290561225366) + , Qt.point(0.530268508333,0.29056093118) + , Qt.point(0.530270747222,0.290560487125) + , Qt.point(0.530271591667,0.290560093025) + , Qt.point(0.530272388889,0.290559499098) + , Qt.point(0.530273038889,0.290558949576) + , Qt.point(0.530273686111,0.290558255732) + , Qt.point(0.530274583333,0.290557362056) + , Qt.point(0.530274933333,0.290556862485) + , Qt.point(0.530275316667,0.290556468377) + , Qt.point(0.530276030556,0.290555968803) + , Qt.point(0.530276977778,0.290555624651) + , Qt.point(0.530278369444,0.290555280498) + , Qt.point(0.530279463889,0.290555280498) + , Qt.point(0.530280458333,0.290555535837) + , Qt.point(0.530281202778,0.29055568571) + , Qt.point(0.530282147222,0.290555985455) + , Qt.point(0.530282794444,0.290556235243) + , Qt.point(0.530283638889,0.290556390666) + , Qt.point(0.530284336111,0.290556590495) + , Qt.point(0.530284833333,0.290556590495) + , Qt.point(0.530286111111,0.290555830032) + , Qt.point(0.530287013889,0.290555019608) + , Qt.point(0.530287738889,0.290554608844) + , Qt.point(0.530288441667,0.290553976043) + , Qt.point(0.530289483333,0.290553309935) + , Qt.point(0.530289966667,0.29055291582) + , Qt.point(0.530290344444,0.290552233055) + , Qt.point(0.530290922222,0.290551938854) + , Qt.point(0.530291022222,0.290551744571) + , Qt.point(0.530291522222,0.290551250535) + , Qt.point(0.530291775,0.290550784252) + , Qt.point(0.530292108333,0.290550234703) + , Qt.point(0.530292458333,0.290549546377) + , Qt.point(0.530293022222,0.290548880253) + , Qt.point(0.530293613889,0.290548741477) + , Qt.point(0.530294055556,0.290548835845) + , Qt.point(0.530294511111,0.290549196662) + , Qt.point(0.530295230556,0.290549329887) + , Qt.point(0.530295952778,0.290549279928) + , Qt.point(0.530296419444,0.290548980172) + , Qt.point(0.530296883333,0.290547936573) + , Qt.point(0.530296972222,0.290546737537) + , Qt.point(0.530297369444,0.290546054749) + , Qt.point(0.530297688889,0.290545172117) + , Qt.point(0.530297727778,0.290544478221) + , Qt.point(0.530298663889,0.290542835064) + , Qt.point(0.530299308333,0.290542085647) + , Qt.point(0.530299291667,0.290541669302) + , Qt.point(0.530299483333,0.290541380636) + , Qt.point(0.530299677778,0.290540980944) + , Qt.point(0.530299711111,0.290540481328) + , Qt.point(0.530299955556,0.29053989844) + , Qt.point(0.530299863889,0.290539570912) + , Qt.point(0.5303001,0.290539049087) + , Qt.point(0.530300522222,0.290538360719) + , Qt.point(0.530300994444,0.290538238589) + , Qt.point(0.530301830556,0.29053680633) + , Qt.point(0.530302077778,0.290536501003) + , Qt.point(0.530302586111,0.290535729354) + , Qt.point(0.530302747222,0.29053517976) + , Qt.point(0.530302688889,0.290534452517) + , Qt.point(0.530302694444,0.290532981368) + , Qt.point(0.530302772222,0.290532664931) + , Qt.point(0.530302944444,0.290531654549) + , Qt.point(0.530303144444,0.290530821812) + , Qt.point(0.530303488889,0.290528745505) + , Qt.point(0.530303741667,0.290528018237) + , Qt.point(0.530304416667,0.290527107759) + , Qt.point(0.530305305556,0.290526152864) + , Qt.point(0.530305927778,0.290525586586) + , Qt.point(0.530306544444,0.290524986996) + , Qt.point(0.530306672222,0.290524431819) + , Qt.point(0.530307238889,0.290523560186) + , Qt.point(0.530307813889,0.290522571961) + , Qt.point(0.53030885,0.290521472693) + , Qt.point(0.530309225,0.290521272826) + , Qt.point(0.530310327778,0.290520911953) + , Qt.point(0.530310691667,0.290521328345) + , Qt.point(0.530310588889,0.290521805806) + , Qt.point(0.530310111111,0.29052274962) + , Qt.point(0.530310238889,0.290523904398) + , Qt.point(0.530309708333,0.290524398508) + , Qt.point(0.530309730556,0.290524626131) + , Qt.point(0.530310069444,0.290524792684) + , Qt.point(0.530310155556,0.290526225036) + , Qt.point(0.530309197222,0.290527296517) + , Qt.point(0.530308863889,0.290527712894) + , Qt.point(0.530308436111,0.290528356889) + , Qt.point(0.530308094444,0.290529239601) + , Qt.point(0.530308183333,0.290530144516) + , Qt.point(0.530309030556,0.290532681586) + , Qt.point(0.530309163889,0.290533636447) + , Qt.point(0.530309808333,0.290535107591) + , Qt.point(0.530309911111,0.29053602358) + , Qt.point(0.530310075,0.290536328908) + , Qt.point(0.530310302778,0.290536928461) + , Qt.point(0.530310625,0.290537505807) + , Qt.point(0.530310983333,0.290537533564) + , Qt.point(0.530311319444,0.290537361471) + , Qt.point(0.530311583333,0.290537328162) + , Qt.point(0.530312427778,0.290538044291) + , Qt.point(0.530312775,0.290538144216) + , Qt.point(0.530313283333,0.290538466195) + , Qt.point(0.530313586111,0.290538116459) + , Qt.point(0.530314608333,0.290537250443) + , Qt.point(0.530315547222,0.290534885532) + , Qt.point(0.530315786111,0.290534080567) + , Qt.point(0.530315719444,0.290533486557) + , Qt.point(0.530315738889,0.29053298692) + , Qt.point(0.530315886111,0.290532509488) + , Qt.point(0.530316175,0.290532009849) + , Qt.point(0.530316536111,0.290531549069) + , Qt.point(0.5303168,0.290530838467) + , Qt.point(0.530316794444,0.290530427648) + , Qt.point(0.530317080556,0.290529961313) + , Qt.point(0.530316975,0.290529450564) + , Qt.point(0.530316761111,0.290528878744) + , Qt.point(0.530316772222,0.290528434612) + , Qt.point(0.530317025,0.290528018237) + , Qt.point(0.530317302778,0.290527762859) + , Qt.point(0.530317561111,0.290527662929) + , Qt.point(0.530318361111,0.290527179932) + , Qt.point(0.530319644444,0.290526874588) + , Qt.point(0.530319975,0.290526674726) + , Qt.point(0.530320372222,0.290526863484) + , Qt.point(0.530320647222,0.290527135518) + , Qt.point(0.530321430556,0.290527529688) + , Qt.point(0.530322019444,0.290527463068) + , Qt.point(0.530322669444,0.290526974518) + , Qt.point(0.530323266667,0.290526208381) + , Qt.point(0.530323633333,0.290525469999) + , Qt.point(0.530324358333,0.290524609476) + , Qt.point(0.530324730556,0.29052351022) + , Qt.point(0.530324883333,0.290523288147) + , Qt.point(0.530324822222,0.290522927279) + , Qt.point(0.530324941667,0.290522316576) + , Qt.point(0.530325158333,0.290521722528) + , Qt.point(0.530325166667,0.290520795364) + , Qt.point(0.530325,0.29051965167) + , Qt.point(0.530325366667,0.290519007645) + , Qt.point(0.530325425,0.290518707839) + , Qt.point(0.530325708333,0.290517897252) + , Qt.point(0.530325713889,0.290517153285) + , Qt.point(0.530324952778,0.290515493228) + , Qt.point(0.530324380556,0.290514777011) + , Qt.point(0.530323830556,0.290514493855) + , Qt.point(0.530323611111,0.290513944198) + , Qt.point(0.530323675,0.29051355555) + , Qt.point(0.530323566667,0.290512867087) + , Qt.point(0.530323736111,0.290512611689) + , Qt.point(0.530324055556,0.290512728284) + , Qt.point(0.530324458333,0.290513094724) + , Qt.point(0.530324888889,0.290513522238) + , Qt.point(0.530325325,0.290513722114) + , Qt.point(0.530325644444,0.290513944198) + , Qt.point(0.530326,0.290514527168) + , Qt.point(0.530326241667,0.290515382187) + , Qt.point(0.530326388889,0.290515504332) + , Qt.point(0.530326669444,0.290515348874) + , Qt.point(0.530326833333,0.290514860292) + , Qt.point(0.530326897222,0.290513461164) + , Qt.point(0.530326897222,0.290512672762) + , Qt.point(0.530326627778,0.290512111995) + , Qt.point(0.530326688889,0.290511551226) + , Qt.point(0.530326277778,0.290510668429) + , Qt.point(0.530326505556,0.290509796731) + , Qt.point(0.530326208333,0.290509430284) + , Qt.point(0.530324441667,0.290504899602) + , Qt.point(0.530324197222,0.290503800228) + , Qt.point(0.530324080556,0.290502550932) + , Qt.point(0.530322972222,0.290498608654) + , Qt.point(0.530322186111,0.290492628444) + , Qt.point(0.530322538889,0.290489385612) + , Qt.point(0.530323030556,0.290488608212) + , Qt.point(0.530327261111,0.290485592981) + , Qt.point(0.530328338889,0.290485409733) + , Qt.point(0.530338758333,0.290487075615) + , Qt.point(0.530341941667,0.290487614246) + , Qt.point(0.53034315,0.29048794742) + , Qt.point(0.530343872222,0.29048798629) + , Qt.point(0.5303444,0.290488158429) + , Qt.point(0.530344975,0.290488624871) + , Qt.point(0.530349027778,0.290490040846) + , Qt.point(0.530349063889,0.290490379568) + , Qt.point(0.530349211111,0.290491767766) + , Qt.point(0.530349391667,0.290493461354) + , Qt.point(0.530349430556,0.290493816728) + , Qt.point(0.530349458333,0.290494099916) + , Qt.point(0.5303495,0.290494505262) + , Qt.point(0.530349994444,0.290496598614) + , Qt.point(0.530350944444,0.290498419866) + , Qt.point(0.530351077778,0.290498675284) + , Qt.point(0.530352116667,0.290500679749) + , Qt.point(0.530353563889,0.290503439321) + , Qt.point(0.530355547222,0.290509929985) + , Qt.point(0.530356238889,0.290512167517) + , Qt.point(0.530356186111,0.290515093479) + , Qt.point(0.530356080556,0.290516537011) + , Qt.point(0.530356227778,0.290517936116) + , Qt.point(0.530356569444,0.290518979885) + , Qt.point(0.530356866667,0.290519779364) + , Qt.point(0.530358033333,0.29052202788) + , Qt.point(0.530358086111,0.290522188884) + , Qt.point(0.530358347222,0.290522732965) + , Qt.point(0.530358519444,0.290523365873) + , Qt.point(0.530358658333,0.290524026538) + , Qt.point(0.530358688889,0.290525308999) + , Qt.point(0.530358527778,0.290526286105) + , Qt.point(0.530358136111,0.290527307621) + , Qt.point(0.530357627778,0.290528617817) + , Qt.point(0.530357233333,0.290529550493) + , Qt.point(0.530356783333,0.290530244445) + , Qt.point(0.530356286111,0.290530943947) + , Qt.point(0.530355786111,0.290531687858) + , Qt.point(0.530355386111,0.290532137534) + , Qt.point(0.530354736111,0.290532781513) + , Qt.point(0.530353938889,0.290533125708) + , Qt.point(0.530353341667,0.290533475454) + , Qt.point(0.530352594444,0.290533969537) + , Qt.point(0.530352047222,0.290534219355) + , Qt.point(0.53035105,0.290534713437) + , Qt.point(0.530350402778,0.290535107591) + , Qt.point(0.530349905556,0.29053525748) + , Qt.point(0.530349755556,0.290535357406) + , Qt.point(0.530348808333,0.290535751559) + , Qt.point(0.530348161111,0.290535751559) + , Qt.point(0.530347761111,0.290535995823) + , Qt.point(0.530346666667,0.290536240086) + , Qt.point(0.530346119444,0.290536389974) + , Qt.point(0.530345375,0.290536689751) + , Qt.point(0.530344627778,0.29053688405) + , Qt.point(0.530343980556,0.290537233789) + , Qt.point(0.530342883333,0.2905376779) + , Qt.point(0.530341813889,0.290538327411) + , Qt.point(0.530340391667,0.290539459886) + , Qt.point(0.530339694444,0.290539959505) + , Qt.point(0.530338897222,0.290540603456) + , Qt.point(0.530338,0.290541097521) + , Qt.point(0.530337252778,0.290541547174) + , Qt.point(0.530336802778,0.290541941314) + , Qt.point(0.530335111111,0.290543084869) + , Qt.point(0.530333813889,0.290544028574) + , Qt.point(0.530333016667,0.290544572591) + , Qt.point(0.530332566667,0.290545016684) + , Qt.point(0.530331919444,0.290545616209) + , Qt.point(0.530331369444,0.29054616022) + , Qt.point(0.530331072222,0.290546509941) + , Qt.point(0.530330369444,0.290547209381) + , Qt.point(0.530328275,0.290549590786) + , Qt.point(0.530327975,0.290550084826) + , Qt.point(0.530327755556,0.290550373479) + , Qt.point(0.530327633333,0.290550584416) + , Qt.point(0.530326477778,0.290552277462) + , Qt.point(0.530325777778,0.290553071245) + , Qt.point(0.530325527778,0.290553520869) + , Qt.point(0.530324530556,0.290554808675) + , Qt.point(0.530323680556,0.290556301852) + , Qt.point(0.530323330556,0.290557001255) + , Qt.point(0.530322930556,0.290557495275) + , Qt.point(0.530322530556,0.290558094759) + , Qt.point(0.530322230556,0.290558688691) + , Qt.point(0.530321430556,0.290559782185) + , Qt.point(0.530320883333,0.290560331705) + , Qt.point(0.530320633333,0.290560631443) + , Qt.point(0.530319986111,0.29056117541) + , Qt.point(0.530319436111,0.290561519551) + , Qt.point(0.530318977778,0.290561874794) + , Qt.point(0.530318538889,0.290562168978) + , Qt.point(0.530317891667,0.290562513118) + , Qt.point(0.530317391667,0.290562912763) + , Qt.point(0.530316147222,0.290563756456) + , Qt.point(0.530315647222,0.290564156098) + , Qt.point(0.530315277778,0.290564594594) + , Qt.point(0.5303148,0.29056504419) + , Qt.point(0.53031445,0.29056534392) + , Qt.point(0.530313752778,0.290566087692) + , Qt.point(0.530313302778,0.290566687148) + , Qt.point(0.530312752778,0.290567480869) + , Qt.point(0.530312105556,0.290568274586) + , Qt.point(0.530311655556,0.290569023897) + , Qt.point(0.530311005556,0.290569917515) + , Qt.point(0.530310455556,0.29057081113) + , Qt.point(0.530308308333,0.290573797212) + , Qt.point(0.530307958333,0.29057434114) + , Qt.point(0.530307411111,0.290575140378) + , Qt.point(0.530307061111,0.290575734254) + , Qt.point(0.530306511111,0.290576527936) + , Qt.point(0.530306011111,0.290577327165) + , Qt.point(0.530305113889,0.290578670306) + , Qt.point(0.530304413889,0.290579513926) + , Qt.point(0.530303913889,0.290580263191) + , Qt.point(0.530303366667,0.290580857051) + , Qt.point(0.530303066667,0.290581201155) + , Qt.point(0.530302616667,0.290581700661) + , Qt.point(0.530301072222,0.29058329352) + , Qt.point(0.530300422222,0.290584137119) + , Qt.point(0.530299675,0.290584830866) + , Qt.point(0.530299175,0.29058543026) + , Qt.point(0.530298727778,0.290585874255) + , Qt.point(0.530298427778,0.29058627385) + , Qt.point(0.530298027778,0.290586667894) + , Qt.point(0.530297727778,0.290587017537) + , Qt.point(0.530296330556,0.290588860093) + , Qt.point(0.530295733333,0.290589354028) + , Qt.point(0.530294686111,0.290590047755) + , Qt.point(0.530294038889,0.29059044734) + , Qt.point(0.530293391667,0.290590791427) + , Qt.point(0.530292794444,0.290591191011) + , Qt.point(0.530291847222,0.290591634992) + , Qt.point(0.5302911,0.290592084522) + , Qt.point(0.530290105556,0.290592478553) + , Qt.point(0.530289408333,0.290592822636) + , Qt.point(0.530288611111,0.290593172268) + , Qt.point(0.530287266667,0.290594015822) + , Qt.point(0.530286619444,0.290594459796) + , Qt.point(0.530286022222,0.290594909319) + , Qt.point(0.530285522222,0.290595403237) + , Qt.point(0.530285222222,0.290595852758) + , Qt.point(0.530284375,0.290597195763) + , Qt.point(0.530283975,0.290598039298) + , Qt.point(0.530283525,0.290598688596) + , Qt.point(0.530283225,0.290599182505) + , Qt.point(0.530282627778,0.290599881744) + , Qt.point(0.530282227778,0.290600425595) + , Qt.point(0.530281777778,0.290600974993) + , Qt.point(0.530281508333,0.290601479995) + , Qt.point(0.530280130556,0.290603261362) + , Qt.point(0.530279633333,0.290603705314) + , Qt.point(0.530279483333,0.290604054925) + , Qt.point(0.530279133333,0.290604554369) + , Qt.point(0.530278586111,0.290605098206) + , Qt.point(0.530278036111,0.290605747479) + , Qt.point(0.530277438889,0.290606541031) + , Qt.point(0.530276488889,0.290607634241) + , Qt.point(0.530275891667,0.290608377842) + , Qt.point(0.530275291667,0.290609027103) + , Qt.point(0.530274744444,0.290609570927) + , Qt.point(0.530274244444,0.290610170241) + , Qt.point(0.530273597222,0.290610764004) + , Qt.point(0.5302732,0.290611213487) + , Qt.point(0.53027285,0.290611557535) + , Qt.point(0.5302723,0.290612206785) + , Qt.point(0.530271802778,0.290612700657) + , Qt.point(0.530271302778,0.290613150135) + , Qt.point(0.530270158333,0.290614443073) + , Qt.point(0.530269658333,0.290614936939) + , Qt.point(0.530272269444,0.290617445093) + , Qt.point(0.530272883333,0.290618033284) + , Qt.point(0.530269391667,0.290621612328) + , Qt.point(0.530266702778,0.290624536549) + , Qt.point(0.530268886111,0.290624747402) + , Qt.point(0.530267738889,0.290626040257) + , Qt.point(0.530266819444,0.29062975786) + , Qt.point(0.530266225,0.290630157359) + , Qt.point(0.530265611111,0.290630701121) + , Qt.point(0.530264927778,0.290631450177) + , Qt.point(0.530264577778,0.290631988386) + , Qt.point(0.530264141667,0.290632504399) + , Qt.point(0.530263911111,0.290632881698) + , Qt.point(0.530263627778,0.290633497582) + , Qt.point(0.5302634,0.290634107915) + , Qt.point(0.530263119444,0.290635073347) + , Qt.point(0.530259461111,0.290636427162) + , Qt.point(0.530259738889,0.290636865486) + , Qt.point(0.530259952778,0.290637326001) + , Qt.point(0.530260547222,0.290638424577) + , Qt.point(0.530260794444,0.290639118118) + , Qt.point(0.530260941667,0.290639717336) + , Qt.point(0.530261038889,0.290640216683) + , Qt.point(0.530261038889,0.290640466356) + , Qt.point(0.530261088889,0.290640765963) + , Qt.point(0.530261136111,0.290641259758) + , Qt.point(0.530261108333,0.290641609298) + , Qt.point(0.530261133333,0.290641858969) + , Qt.point(0.530260983333,0.290642707848) + , Qt.point(0.530260538889,0.290644866091) + , Qt.point(0.530260427778,0.290645243364) + , Qt.point(0.530260277778,0.290646092227) + , Qt.point(0.530260075,0.290646985471) + , Qt.point(0.530259672222,0.290649027155) + , Qt.point(0.530259572222,0.290649371132) + , Qt.point(0.530259166667,0.290651068816) + , Qt.point(0.5302589,0.290652378131) + , Qt.point(0.530259458333,0.290652156214) + , Qt.point(0.5302603,0.290651856625) + , Qt.point(0.530261680556,0.290651618064) + , Qt.point(0.530261944444,0.290651618064) + , Qt.point(0.530262397222,0.290651568132) + , Qt.point(0.530263113889,0.290651551489) + , Qt.point(0.530267080556,0.290651734571) + , Qt.point(0.530267483333,0.290651717927) + , Qt.point(0.530267044444,0.290652821964) + , Qt.point(0.530266833333,0.290653121551) + , Qt.point(0.530266622222,0.290653471068) + , Qt.point(0.530266377778,0.29065378175) + , Qt.point(0.530265833333,0.290654342085) + , Qt.point(0.530264958333,0.290654985636) + , Qt.point(0.530263891667,0.290655545967) + , Qt.point(0.530264097222,0.290656860797) + , Qt.point(0.530263011111,0.290657138187) + , Qt.point(0.530262138889,0.290657432219) + , Qt.point(0.530261105556,0.290657815014) + , Qt.point(0.530260405556,0.290658092402) + , Qt.point(0.530258708333,0.290658874633) + , Qt.point(0.530257377778,0.290659623575) + , Qt.point(0.530256836111,0.290659956437) + , Qt.point(0.530256205556,0.29066042799) + , Qt.point(0.530255558333,0.290660844065) + , Qt.point(0.530254647222,0.29066154307) + , Qt.point(0.530253019444,0.290662868953) + , Qt.point(0.530252438889,0.290663479188) + , Qt.point(0.530251547222,0.290664372348) + , Qt.point(0.530250547222,0.290665487404) + , Qt.point(0.530249863889,0.290666325079) + , Qt.point(0.530248794444,0.290667811803) + , Qt.point(0.530247530556,0.290669819971) + , Qt.point(0.5302466,0.290671589582) + , Qt.point(0.530245563889,0.290673703107) + , Qt.point(0.5302453,0.290674352138) + , Qt.point(0.530244280556,0.290676343593) + , Qt.point(0.530243861111,0.290677253332) + , Qt.point(0.530242744444,0.290679305774) + , Qt.point(0.530241297222,0.290681546793) + , Qt.point(0.530239336111,0.290683909817) + , Qt.point(0.530237827778,0.290685479603) + , Qt.point(0.530235308333,0.290686977267) + , Qt.point(0.530233169444,0.290688951945) + , Qt.point(0.530230963889,0.29069013896) + , Qt.point(0.530226558333,0.29069205259) + , Qt.point(0.530223827778,0.290693306146) + , Qt.point(0.530221763889,0.290694387747) + , Qt.point(0.530219638889,0.290695779952) + , Qt.point(0.53021765,0.290697144414) + , Qt.point(0.530215847222,0.29069847004) + , Qt.point(0.530212188889,0.290701365306) + , Qt.point(0.530204155556,0.290707444109) + , Qt.point(0.530201019444,0.290709579407) + , Qt.point(0.530198633333,0.290711165612) + , Qt.point(0.5301948,0.290713350782) + , Qt.point(0.530167244444,0.290729322807) + , Qt.point(0.530164166667,0.29073078684) + , Qt.point(0.530161511111,0.29073186822) + , Qt.point(0.530161583333,0.290730570563) + , Qt.point(0.530161719444,0.290729156439) + , Qt.point(0.53016185,0.290727792215) + , Qt.point(0.530162063889,0.290726056419) + , Qt.point(0.530162383333,0.290723815943) + , Qt.point(0.530162913889,0.290720582732) + , Qt.point(0.530163183333,0.290719107526) + , Qt.point(0.530163980556,0.290717316189) + , Qt.point(0.530165027778,0.290715774404) + , Qt.point(0.530166522222,0.290714032949) + , Qt.point(0.530168513889,0.290711947618) + , Qt.point(0.530170258333,0.290710211672) + , Qt.point(0.530171602778,0.290708569997) + , Qt.point(0.5301725,0.290707078055) + , Qt.point(0.5301732,0.290705835686) + , Qt.point(0.5301738,0.29070439364) + , Qt.point(0.530174255556,0.290703018139) + , Qt.point(0.530174697222,0.290701753557) + , Qt.point(0.530174958333,0.290700533338) + , Qt.point(0.530175083333,0.290699762377) + , Qt.point(0.530175277778,0.290698447853) + , Qt.point(0.530175455556,0.290696578663) + , Qt.point(0.530174761111,0.290696329066) + , Qt.point(0.530174316667,0.290695829872) + , Qt.point(0.530173872222,0.290694947958) + , Qt.point(0.530173452778,0.290694387747) + , Qt.point(0.530172897222,0.290693738787) + , Qt.point(0.530172322222,0.290692529608) + , Qt.point(0.530172047222,0.29069081012) + , Qt.point(0.530171961111,0.290689606468) + , Qt.point(0.53017205,0.290688691244) + , Qt.point(0.530172472222,0.290687260157) + , Qt.point(0.530172544444,0.290686650001) + , Qt.point(0.530172372222,0.290684281464) + , Qt.point(0.530172622222,0.290682900266) + , Qt.point(0.530172833333,0.290682062667) + , Qt.point(0.530172694444,0.290680781299) + , Qt.point(0.530172908333,0.290678823175) + , Qt.point(0.530172072222,0.290677208954) + , Qt.point(0.530171125,0.290675860986) + , Qt.point(0.530170680556,0.290675062186) + , Qt.point(0.530170183333,0.290674463083) + , Qt.point(0.530169755556,0.290673863978) + , Qt.point(0.530169291667,0.290673464574) + , Qt.point(0.530168988889,0.290673037433) + , Qt.point(0.530168883333,0.290672582554) + , Qt.point(0.530168658333,0.290671600677) + , Qt.point(0.530166752778,0.290671950159) + , Qt.point(0.530164969444,0.290672360661) + , Qt.point(0.530163227778,0.290672904298) + , Qt.point(0.530162530556,0.290673148379) + , Qt.point(0.530162013889,0.290673409101) + , Qt.point(0.530161138889,0.290673797411) + , Qt.point(0.530159180556,0.290674856938) + , Qt.point(0.53015785,0.290675744495) + , Qt.point(0.530156461111,0.290676870576) + , Qt.point(0.530155366667,0.290677841331) + , Qt.point(0.530154066667,0.29067950547) + , Qt.point(0.530153541667,0.290680320892) + , Qt.point(0.530152222222,0.29068253971) + , Qt.point(0.530151136111,0.290679449999) + , Qt.point(0.530150630556,0.290677025897) + , Qt.point(0.530149969444,0.290675411661) + , Qt.point(0.530149405556,0.290674618406) + , Qt.point(0.530148977778,0.290673852884) + , Qt.point(0.530148313889,0.290674202362) + , Qt.point(0.530147036111,0.290674285571) + , Qt.point(0.530145727778,0.290674230098) + , Qt.point(0.530143980556,0.290673913904) + , Qt.point(0.530135541667,0.290672177599) + , Qt.point(0.530133008333,0.290671694982) + , Qt.point(0.530131647222,0.290672105484) + , Qt.point(0.530131422222,0.290669581433) + , Qt.point(0.530132119444,0.290661426569) + , Qt.point(0.530133136111,0.290659573645) + , Qt.point(0.530132783333,0.290652061899) + , Qt.point(0.530131583333,0.290648455708) + , Qt.point(0.530128586111,0.290647390481) + ] + , 'Grünerløkka_9' : [ + Qt.point(0.529855525,0.290845571768) + , Qt.point(0.529856133333,0.290845200447) + , Qt.point(0.529858008333,0.290842784072) + , Qt.point(0.529858802778,0.290841786477) + , Qt.point(0.5298595,0.290841043819) + , Qt.point(0.529860294444,0.290840295616) + , Qt.point(0.529861138889,0.290839403311) + , Qt.point(0.529861983333,0.290838704982) + , Qt.point(0.529862727778,0.290837812669) + , Qt.point(0.529863919444,0.290837014572) + , Qt.point(0.529864272222,0.290836754081) + , Qt.point(0.529864047222,0.290836476962) + , Qt.point(0.529863436111,0.290835301976) + , Qt.point(0.529863225,0.290834725565) + , Qt.point(0.529863052778,0.290834149152) + , Qt.point(0.529862722222,0.290831455506) + , Qt.point(0.529862686111,0.290831017646) + , Qt.point(0.529863052778,0.290829726231) + , Qt.point(0.529863211111,0.290829022323) + , Qt.point(0.529863666667,0.290827414963) + , Qt.point(0.529863666667,0.290825874101) + , Qt.point(0.529863602778,0.29082399512) + , Qt.point(0.529863291667,0.290822088405) + , Qt.point(0.529862144444,0.290815819386) + , Qt.point(0.529862083333,0.29081564201) + , Qt.point(0.529861525,0.290813652063) + , Qt.point(0.529861202778,0.290808308476) + , Qt.point(0.529861052778,0.290806617787) + , Qt.point(0.529860755556,0.290802088879) + , Qt.point(0.529860361111,0.290798258344) + , Qt.point(0.529860708333,0.290798358128) + , Qt.point(0.529864411111,0.29079831378) + , Qt.point(0.529865477778,0.290798258344) + , Qt.point(0.529874852778,0.290797737252) + , Qt.point(0.529875466667,0.290797753883) + , Qt.point(0.529877352778,0.290797703991) + , Qt.point(0.529878394444,0.290797659643) + , Qt.point(0.529880072222,0.290797587577) + , Qt.point(0.529880461111,0.290797565403) + , Qt.point(0.529886469444,0.290797288225) + , Qt.point(0.529886986111,0.290797171811) + , Qt.point(0.5298919,0.290796451147) + , Qt.point(0.52989185,0.290791589366) + , Qt.point(0.529891713889,0.290785729556) + , Qt.point(0.529894125,0.29078004697) + , Qt.point(0.529895175,0.290777457871) + , Qt.point(0.529897969444,0.290778805094) + , Qt.point(0.529899994444,0.290779803031) + , Qt.point(0.529900866667,0.290780279821) + , Qt.point(0.529902822222,0.290781627024) + , Qt.point(0.529904533333,0.290783029657) + , Qt.point(0.529907044444,0.290785286044) + , Qt.point(0.529907830556,0.290786023383) + , Qt.point(0.529912816667,0.290790375286) + , Qt.point(0.529913416667,0.290789787646) + , Qt.point(0.529915533333,0.290787475876) + , Qt.point(0.529916616667,0.290786167524) + , Qt.point(0.529917191667,0.290785518888) + , Qt.point(0.529917594444,0.290785014392) + , Qt.point(0.529917786111,0.290784803722) + , Qt.point(0.529918136111,0.29078450435) + , Qt.point(0.529918608333,0.290783999851) + , Qt.point(0.529918994444,0.290783805813) + , Qt.point(0.529919394444,0.290783511983) + , Qt.point(0.529919877778,0.290783218152) + , Qt.point(0.529920425,0.290783018569) + , Qt.point(0.529921002778,0.290782863337) + , Qt.point(0.529921841667,0.290782669298) + , Qt.point(0.529924322222,0.29078232557) + , Qt.point(0.529925630556,0.290782098265) + , Qt.point(0.529927972222,0.290781344279) + , Qt.point(0.529928391667,0.290781189046) + , Qt.point(0.529928827778,0.290780911844) + , Qt.point(0.529929419444,0.290780634641) + , Qt.point(0.529931588889,0.290779370592) + , Qt.point(0.529932391667,0.290778727477) + , Qt.point(0.529933372222,0.29077788477) + , Qt.point(0.529936447222,0.290774635877) + , Qt.point(0.5299397,0.290771264951) + , Qt.point(0.529940591667,0.290770616263) + , Qt.point(0.529940819444,0.290769252346) + , Qt.point(0.529941275,0.290767167641) + , Qt.point(0.529942325,0.290763935192) + , Qt.point(0.529943272222,0.290761623097) + , Qt.point(0.529943813889,0.290760503079) + , Qt.point(0.529944688889,0.290758900665) + , Qt.point(0.529945583333,0.290757758451) + , Qt.point(0.529946727778,0.290756366715) + , Qt.point(0.529948019444,0.290754925066) + , Qt.point(0.529951152778,0.290751880929) + , Qt.point(0.529951369444,0.290751642497) + , Qt.point(0.52995165,0.29075144288) + , Qt.point(0.529952713889,0.290750472514) + , Qt.point(0.529957852778,0.290746208387) + , Qt.point(0.529960016667,0.290748115889) + , Qt.point(0.529964322222,0.290751503874) + , Qt.point(0.529966802778,0.290753400231) + , Qt.point(0.529970627778,0.290756388895) + , Qt.point(0.529973208333,0.290758479267) + , Qt.point(0.529975969444,0.290760780312) + , Qt.point(0.529979233333,0.290763214398) + , Qt.point(0.529981380556,0.290764600538) + , Qt.point(0.529982219444,0.290765110635) + , Qt.point(0.529988783333,0.290769296701) + , Qt.point(0.529988783333,0.290769296701) + , Qt.point(0.529989708333,0.290769840051) + , Qt.point(0.529996480556,0.290774220059) + , Qt.point(0.529998086111,0.290775306728) + , Qt.point(0.529999133333,0.290775994209) + , Qt.point(0.5299999,0.290776448833) + , Qt.point(0.530000744444,0.290777247193) + , Qt.point(0.530001558333,0.290778017829) + , Qt.point(0.530002255556,0.290778849447) + , Qt.point(0.530002402778,0.290779065667) + , Qt.point(0.530002711111,0.290779265255) + , Qt.point(0.530003286111,0.290779864016) + , Qt.point(0.530004,0.290780651273) + , Qt.point(0.530004980556,0.290781804433) + , Qt.point(0.530006408333,0.290783207064) + , Qt.point(0.530008702778,0.290785391378) + , Qt.point(0.530010191667,0.290786988017) + , Qt.point(0.530011480556,0.290788185488) + , Qt.point(0.530011977778,0.290788728782) + , Qt.point(0.530012275,0.290789028147) + , Qt.point(0.530012341667,0.290789133479) + , Qt.point(0.530012672222,0.290789576983) + , Qt.point(0.530012877778,0.290790475074) + , Qt.point(0.530014397222,0.290791666978) + , Qt.point(0.530015847222,0.290792930942) + , Qt.point(0.530015272222,0.290793435416) + , Qt.point(0.530014308333,0.290792842243) + , Qt.point(0.530012683333,0.290791999601) + , Qt.point(0.530011636111,0.290791772308) + , Qt.point(0.530011094444,0.29079170024) + , Qt.point(0.530010275,0.290791678065) + , Qt.point(0.530009436111,0.290791750133) + , Qt.point(0.530008755556,0.290791872095) + , Qt.point(0.530008144444,0.29079204395) + , Qt.point(0.530007463889,0.29079234331) + , Qt.point(0.530006919444,0.290792620495) + , Qt.point(0.530006308333,0.29079300301) + , Qt.point(0.530005397222,0.290793812385) + , Qt.point(0.530005608333,0.290796833653) + , Qt.point(0.530005966667,0.290800442479) + , Qt.point(0.53000595,0.290801612145) + , Qt.point(0.530006175,0.2908032031) + , Qt.point(0.530006444444,0.290804794042) + , Qt.point(0.530006711111,0.290805531302) + , Qt.point(0.530006938889,0.290806041286) + , Qt.point(0.530007411111,0.290806950383) + , Qt.point(0.530008177778,0.290807931537) + , Qt.point(0.530009319444,0.290809328426) + , Qt.point(0.530012658333,0.29081279843) + , Qt.point(0.530014680556,0.290814932505) + , Qt.point(0.530015536111,0.290815775042) + , Qt.point(0.530017016667,0.290817454562) + , Qt.point(0.530018411111,0.290819416754) + , Qt.point(0.530018655556,0.29081987127) + , Qt.point(0.5300189,0.29082025927) + , Qt.point(0.530019113889,0.290820730413) + , Qt.point(0.530019263889,0.290821062983) + , Qt.point(0.5300197,0.290822044062) + , Qt.point(0.530020255556,0.290823479643) + , Qt.point(0.530020638889,0.29082482653) + , Qt.point(0.530020811111,0.29082576879) + , Qt.point(0.530021088889,0.290827520273) + , Qt.point(0.530021277778,0.290828950269) + , Qt.point(0.5300192,0.290829493443) + , Qt.point(0.530019269444,0.290830474477) + , Qt.point(0.530015933333,0.290831028731) + , Qt.point(0.530012441667,0.290831671664) + , Qt.point(0.530009086111,0.29083234785) + , Qt.point(0.530002730556,0.290833689129) + , Qt.point(0.529998241667,0.290835640063) + , Qt.point(0.529996511111,0.29083635503) + , Qt.point(0.529990397222,0.290838954386) + , Qt.point(0.529985416667,0.290841110326) + , Qt.point(0.529982888889,0.290842202143) + , Qt.point(0.529972922222,0.290846552717) + , Qt.point(0.529967708333,0.290848736278) + , Qt.point(0.529964444444,0.290850099606) + , Qt.point(0.529963936111,0.290850360078) + , Qt.point(0.529958175,0.290852820688) + , Qt.point(0.529949630556,0.290858113106) + , Qt.point(0.529949088889,0.290858251649) + , Qt.point(0.529949219444,0.290858911112) + , Qt.point(0.529949813889,0.29086070107) + , Qt.point(0.529950361111,0.290862042143) + , Qt.point(0.529950727778,0.290863178167) + , Qt.point(0.529949419444,0.29086379328) + , Qt.point(0.529948894444,0.290863965068) + , Qt.point(0.529948266667,0.290864070357) + , Qt.point(0.529947533333,0.290864070357) + , Qt.point(0.529946677778,0.290863948443) + , Qt.point(0.529945875,0.29086372124) + , Qt.point(0.529945158333,0.290863438621) + , Qt.point(0.529945072222,0.290863981693) + , Qt.point(0.529944880556,0.290864485972) + , Qt.point(0.529944722222,0.290864979168) + , Qt.point(0.529944511111,0.290865416946) + , Qt.point(0.52994415,0.290866015427) + , Qt.point(0.529943702778,0.290866464287) + , Qt.point(0.529943255556,0.290866813399) + , Qt.point(0.529942858333,0.290867062764) + , Qt.point(0.529942361111,0.290867262256) + , Qt.point(0.529941716667,0.290867472831) + , Qt.point(0.529940872222,0.290867655698) + , Qt.point(0.529939880556,0.290867844107) + , Qt.point(0.529937947222,0.290868137802) + , Qt.point(0.5299369,0.290868365) + , Qt.point(0.529936269444,0.290868575574) + , Qt.point(0.529935508333,0.290868847102) + , Qt.point(0.529933883333,0.290862995295) + , Qt.point(0.529931741667,0.290855840987) + , Qt.point(0.529931533333,0.290855281266) + , Qt.point(0.529931391667,0.290854826837) + , Qt.point(0.529931272222,0.290854244945) + , Qt.point(0.529930505556,0.290854217236) + , Qt.point(0.529930158333,0.29085416736) + , Qt.point(0.529929708333,0.29085416736) + , Qt.point(0.529929311111,0.290854316989) + , Qt.point(0.529928963889,0.290854416742) + , Qt.point(0.529928616667,0.290854616248) + , Qt.point(0.529928369444,0.290854815754) + , Qt.point(0.529928019444,0.290855209222) + , Qt.point(0.529927813889,0.290855768944) + , Qt.point(0.529925683333,0.290860928278) + , Qt.point(0.529925483333,0.290861526773) + , Qt.point(0.529925286111,0.29086182602) + , Qt.point(0.529925138889,0.290862130808) + , Qt.point(0.529925086111,0.290862463304) + , Qt.point(0.529924961111,0.290862740383) + , Qt.point(0.529924683333,0.290863067336) + , Qt.point(0.529923338889,0.290864364059) + , Qt.point(0.52992035,0.290866985184) + , Qt.point(0.529915983333,0.290870797663) + , Qt.point(0.529911833333,0.290865671855) + , Qt.point(0.529910175,0.290863288999) + , Qt.point(0.529906983333,0.290858916653) + , Qt.point(0.52990545,0.290856345289) + , Qt.point(0.529902761111,0.290851956153) + , Qt.point(0.529902202778,0.290850980775) + , Qt.point(0.529901305556,0.290851911818) + , Qt.point(0.529899302778,0.290853773889) + , Qt.point(0.529898586111,0.290854400117) + , Qt.point(0.529897766667,0.290855275724) + , Qt.point(0.529897052778,0.290855990615) + , Qt.point(0.529896366667,0.290856783089) + , Qt.point(0.529893352778,0.290851601471) + , Qt.point(0.529888530556,0.290854200611) + , Qt.point(0.529887272222,0.290855059593) + , Qt.point(0.529886597222,0.29085581882) + , Qt.point(0.529887002778,0.290856101451) + , Qt.point(0.529888502778,0.290856633461) + , Qt.point(0.529889502778,0.290856727671) + , Qt.point(0.529890502778,0.290856949341) + , Qt.point(0.529891563889,0.290857608809) + , Qt.point(0.529892502778,0.290858390192) + , Qt.point(0.529893188889,0.290859204821) + , Qt.point(0.529893802778,0.290860324238) + , Qt.point(0.52989375,0.29086100586) + , Qt.point(0.529893433333,0.290862108642) + , Qt.point(0.529893244444,0.29086234693) + , Qt.point(0.5298927,0.290862817965) + , Qt.point(0.529891869444,0.290863610409) + , Qt.point(0.529891341667,0.290864236603) + , Qt.point(0.529890836111,0.290865029041) + , Qt.point(0.529889316667,0.290868575574) + , Qt.point(0.529888627778,0.290870254611) + , Qt.point(0.529888175,0.290871152308) + , Qt.point(0.52988745,0.290872166368) + , Qt.point(0.529886511111,0.290873396532) + , Qt.point(0.529885930556,0.290874299755) + , Qt.point(0.529885077778,0.290875967658) + , Qt.point(0.529883702778,0.290879696835) + , Qt.point(0.529881875,0.290879153809) + , Qt.point(0.529879791667,0.290878361432) + , Qt.point(0.529869913889,0.290874127976) + , Qt.point(0.5298716,0.290872986478) + , Qt.point(0.529873686111,0.290871490329) + , Qt.point(0.529876672222,0.290869235) + , Qt.point(0.529878452778,0.2908678164) + , Qt.point(0.529879013889,0.290867345378) + , Qt.point(0.529880566667,0.290865300575) + , Qt.point(0.529876847222,0.290861122235) + , Qt.point(0.529873483333,0.290856855131) + , Qt.point(0.529870863889,0.290853724012) + , Qt.point(0.529869975,0.290852953693) + , Qt.point(0.529869538889,0.290852482633) + , Qt.point(0.529867725,0.290850343452) + , Qt.point(0.529866136111,0.290848331712) + , Qt.point(0.529865822222,0.290848054611) + , Qt.point(0.529865491667,0.29084791606) + , Qt.point(0.529864897222,0.290847810762) + , Qt.point(0.529860888889,0.290846912951) + , Qt.point(0.529855525,0.290845571768) + ] + , 'Marka_9' : [ + Qt.point(0.529136569444,0.290303726946) + , Qt.point(0.529137886111,0.290302148337) + , Qt.point(0.529139522222,0.290300002742) + , Qt.point(0.529141169444,0.290297884915) + , Qt.point(0.529142858333,0.290295705918) + , Qt.point(0.529144519444,0.290293560248) + , Qt.point(0.529146177778,0.290291436788) + , Qt.point(0.529147852778,0.290289313304) + , Qt.point(0.529149525,0.290287123087) + , Qt.point(0.529151225,0.29028501623) + , Qt.point(0.529152827778,0.290282853758) + , Qt.point(0.529154519444,0.290280674582) + , Qt.point(0.529156175,0.29027857321) + , Qt.point(0.529157805556,0.290276438459) + , Qt.point(0.529159452778,0.290274281445) + , Qt.point(0.529162811111,0.2902699729) + , Qt.point(0.529164436111,0.290267810251) + , Qt.point(0.529166088889,0.290265625338) + , Qt.point(0.529167763889,0.290263501555) + , Qt.point(0.529171088889,0.290259198317) + , Qt.point(0.529174338889,0.290255022858) + , Qt.point(0.529178538889,0.290249607406) + , Qt.point(0.529183486111,0.290243207627) + , Qt.point(0.529191822222,0.290232470399) + , Qt.point(0.529203375,0.290217522865) + , Qt.point(0.529211644444,0.290206956539) + , Qt.point(0.529219486111,0.290196778923) + , Qt.point(0.529227813889,0.290186000047) + , Qt.point(0.529234491667,0.290177412089) + , Qt.point(0.529239441667,0.290170965294) + , Qt.point(0.529244413889,0.290164618402) + , Qt.point(0.529249327778,0.290158276853) + , Qt.point(0.529252647222,0.290154004528) + , Qt.point(0.529257608333,0.290147612544) + , Qt.point(0.529260994444,0.290143306591) + , Qt.point(0.529264347222,0.29013897272) + , Qt.point(0.529267433333,0.290134928052) + , Qt.point(0.529270502778,0.290130983442) + , Qt.point(0.529273805556,0.290126688227) + , Qt.point(0.52927545,0.290124601784) + , Qt.point(0.529278772222,0.290120373188) + , Qt.point(0.529282111111,0.29011611111) + , Qt.point(0.529285436111,0.290111798854) + , Qt.point(0.529290408333,0.290105433223) + , Qt.point(0.529293752778,0.290100976038) + , Qt.point(0.529297663889,0.290096023482) + , Qt.point(0.529301044444,0.290091621717) + , Qt.point(0.529302702778,0.290089518181) + , Qt.point(0.529306033333,0.290085233127) + , Qt.point(0.529309536111,0.290080680842) + , Qt.point(0.529312861111,0.290076412278) + , Qt.point(0.529316202778,0.290072093524) + , Qt.point(0.529317902778,0.290069922979) + , Qt.point(0.529321222222,0.290065648598) + , Qt.point(0.529324502778,0.290061418644) + , Qt.point(0.52932785,0.290057132934) + , Qt.point(0.529331155556,0.290052902784) + , Qt.point(0.52933445,0.290048644706) + , Qt.point(0.529336108333,0.290046512847) + , Qt.point(0.529339402778,0.290042232355) + , Qt.point(0.529342694444,0.290038007429) + , Qt.point(0.529346066667,0.290033676639) + , Qt.point(0.529349419444,0.290029368014) + , Qt.point(0.529352686111,0.290025081556) + , Qt.point(0.529355991667,0.290020822833) + , Qt.point(0.529359294444,0.290016569578) + , Qt.point(0.529360713889,0.290014804782) + , Qt.point(0.529363158333,0.290011592477) + , Qt.point(0.529366452778,0.290007305604) + , Qt.point(0.529371308333,0.290001075541) + , Qt.point(0.529376205556,0.289994706071) + , Qt.point(0.529381147222,0.289988325245) + , Qt.point(0.529384469444,0.289984037828) + , Qt.point(0.529387813889,0.289979728039) + , Qt.point(0.529390819444,0.289975852483) + , Qt.point(0.529391013889,0.289975607474) + , Qt.point(0.529396091667,0.289974928128) + , Qt.point(0.529396311111,0.289974905855) + , Qt.point(0.529401397222,0.289974276623) + , Qt.point(0.529406730556,0.289973591704) + , Qt.point(0.529412102778,0.289972895646) + , Qt.point(0.529417411111,0.289972238564) + , Qt.point(0.529422697222,0.289971581481) + , Qt.point(0.529427961111,0.289970929963) + , Qt.point(0.529430644444,0.289970579145) + , Qt.point(0.529433244444,0.289970284012) + , Qt.point(0.529436955556,0.289969805116) + , Qt.point(0.529435858333,0.289967310379) + , Qt.point(0.529434838889,0.289964882434) + , Qt.point(0.529432775,0.289959920638) + , Qt.point(0.529430688889,0.289954936432) + , Qt.point(0.529428730556,0.289950302949) + , Qt.point(0.529427161111,0.289946632835) + , Qt.point(0.529425044444,0.289941703963) + , Qt.point(0.529424608333,0.289940668047) + , Qt.point(0.529424391667,0.289938735437) + , Qt.point(0.529423875,0.289933410906) + , Qt.point(0.52942345,0.289928013813) + , Qt.point(0.529423191667,0.28992542939) + , Qt.point(0.529422977778,0.289923056591) + , Qt.point(0.529422711111,0.289916511739) + , Qt.point(0.529422433333,0.289908451502) + , Qt.point(0.529422238889,0.289903053676) + , Qt.point(0.52942215,0.289900385342) + , Qt.point(0.529421927778,0.289894708736) + , Qt.point(0.529421825,0.289890057019) + , Qt.point(0.529421783333,0.289887009663) + , Qt.point(0.529422055556,0.289882870303) + , Qt.point(0.529422563889,0.289876998157) + , Qt.point(0.529420522222,0.289869549064) + , Qt.point(0.529418425,0.289861782074) + , Qt.point(0.529416286111,0.289853964606) + , Qt.point(0.529414897222,0.289848804784) + , Qt.point(0.529413486111,0.289843600238) + , Qt.point(0.529412936111,0.289841599736) + , Qt.point(0.529412102778,0.289839454326) + , Qt.point(0.529408947222,0.289832026001) + , Qt.point(0.529405766667,0.289824597375) + , Qt.point(0.529402611111,0.28981722418) + , Qt.point(0.529400552778,0.289812247246) + , Qt.point(0.529398475,0.289807320338) + , Qt.point(0.529397391667,0.289804801099) + , Qt.point(0.529396697222,0.289803011972) + , Qt.point(0.529395461111,0.289800866112) + , Qt.point(0.529394255556,0.289798597604) + , Qt.point(0.529391813889,0.289793965747) + , Qt.point(0.529388861111,0.289788447497) + , Qt.point(0.529386297222,0.289783653732) + , Qt.point(0.52938375,0.289778882139) + , Qt.point(0.529381530556,0.289774745915) + , Qt.point(0.529379222222,0.289770392187) + , Qt.point(0.529376216667,0.289764672537) + , Qt.point(0.529374580556,0.28976103216) + , Qt.point(0.529372372222,0.289756522006) + , Qt.point(0.529369944444,0.289751649354) + , Qt.point(0.529368841667,0.289749686876) + , Qt.point(0.529370405556,0.28974804217) + , Qt.point(0.529374083333,0.289744039061) + , Qt.point(0.529381438889,0.289736238881) + , Qt.point(0.529390580556,0.289726431035) + , Qt.point(0.529397955556,0.289718591073) + , Qt.point(0.529405383333,0.289710695012) + , Qt.point(0.529412702778,0.289702832071) + , Qt.point(0.529420111111,0.289694952062) + , Qt.point(0.529425608333,0.289689168712) + , Qt.point(0.529431158333,0.28968322344) + , Qt.point(0.529436702778,0.289677328171) + , Qt.point(0.529440369444,0.289673401606) + , Qt.point(0.529444044444,0.289669447068) + , Qt.point(0.5294459,0.289667494867) + , Qt.point(0.529446444444,0.28966701518) + , Qt.point(0.529446747222,0.289666825536) + , Qt.point(0.529452638889,0.289663049348) + , Qt.point(0.529455413889,0.289654464787) + , Qt.point(0.529470508333,0.289651140183) + , Qt.point(0.529473527778,0.289650470793) + , Qt.point(0.529473605556,0.289650454058) + , Qt.point(0.529496994444,0.289647514289) + , Qt.point(0.5295446,0.289655067225) + , Qt.point(0.529561547222,0.289657181322) + , Qt.point(0.529575755556,0.289659931286) + , Qt.point(0.529667555556,0.289656305565) + , Qt.point(0.529701611111,0.289686547462) + , Qt.point(0.529707152778,0.289691354918) + , Qt.point(0.529707483333,0.289691343764) + , Qt.point(0.529707677778,0.289691366072) + , Qt.point(0.529707783333,0.289691349341) + , Qt.point(0.529708033333,0.289691466458) + , Qt.point(0.529708263889,0.289691723001) + , Qt.point(0.529708472222,0.289692091084) + , Qt.point(0.529708569444,0.289692369933) + , Qt.point(0.529709119444,0.289693423982) + , Qt.point(0.529709413889,0.289693753022) + , Qt.point(0.529709702778,0.289694199177) + , Qt.point(0.529709969444,0.289694528216) + , Qt.point(0.529710147222,0.289694913024) + , Qt.point(0.52971025,0.289695041293) + , Qt.point(0.529710302778,0.289695186292) + , Qt.point(0.5297104,0.289695331292) + , Qt.point(0.529710477778,0.289695760713) + , Qt.point(0.52971055,0.289695900135) + , Qt.point(0.529710858333,0.289696156671) + , Qt.point(0.529711,0.289696363016) + , Qt.point(0.529711188889,0.289696881664) + , Qt.point(0.529711375,0.289697768381) + , Qt.point(0.529711438889,0.289697896648) + , Qt.point(0.529711738889,0.289698253565) + , Qt.point(0.529711988889,0.289698621634) + , Qt.point(0.529712044444,0.289698671825) + , Qt.point(0.529712144444,0.289698844706) + , Qt.point(0.529712238889,0.289698867013) + , Qt.point(0.529712627778,0.28969887259) + , Qt.point(0.529712825,0.289698805668) + , Qt.point(0.529713127778,0.289698744324) + , Qt.point(0.529713222222,0.289698744324) + , Qt.point(0.529713297222,0.289698777784) + , Qt.point(0.52971335,0.289698833552) + , Qt.point(0.529713558333,0.289699151429) + , Qt.point(0.529714113889,0.289699290849) + , Qt.point(0.529714458333,0.289699424692) + , Qt.point(0.529714641667,0.289699458152) + , Qt.point(0.529714766667,0.289699458152) + , Qt.point(0.529715188889,0.289699385654) + , Qt.point(0.529715897222,0.289699095662) + , Qt.point(0.529716033333,0.289699084508) + , Qt.point(0.529716172222,0.289699117969) + , Qt.point(0.529716322222,0.289699117969) + , Qt.point(0.529716480556,0.289699078931) + , Qt.point(0.529716972222,0.28969885586) + , Qt.point(0.529717091667,0.289698844706) + , Qt.point(0.529717286111,0.28969887259) + , Qt.point(0.529717641667,0.289698967395) + , Qt.point(0.529717980556,0.289699140276) + , Qt.point(0.529718216667,0.28969934104) + , Qt.point(0.529718266667,0.289699525074) + , Qt.point(0.529718316667,0.289699948908) + , Qt.point(0.529718386111,0.289700233323) + , Qt.point(0.5297185,0.289700361588) + , Qt.point(0.529718761111,0.289700573504) + , Qt.point(0.529718847222,0.289700796574) + , Qt.point(0.529718866667,0.289701030796) + , Qt.point(0.5297189,0.289701136754) + , Qt.point(0.529718961111,0.289701220405) + , Qt.point(0.529719077778,0.28970134867) + , Qt.point(0.529719225,0.28970143232) + , Qt.point(0.529719380556,0.289701460204) + , Qt.point(0.5297197,0.289701449051) + , Qt.point(0.529719841667,0.289701577315) + , Qt.point(0.529719866667,0.289701688849) + , Qt.point(0.529719930556,0.289701800383) + , Qt.point(0.529720066667,0.289701973261) + , Qt.point(0.529720191667,0.289702034605) + , Qt.point(0.529720441667,0.289702062488) + , Qt.point(0.529720591667,0.289702056912) + , Qt.point(0.52972075,0.289702012298) + , Qt.point(0.5297209,0.289702001145) + , Qt.point(0.529721311111,0.289702079218) + , Qt.point(0.529721486111,0.289702134985) + , Qt.point(0.529721641667,0.289702157292) + , Qt.point(0.529721836111,0.289702140562) + , Qt.point(0.529722044444,0.289702073642) + , Qt.point(0.529722558333,0.289701733463) + , Qt.point(0.529723363889,0.28970183942) + , Qt.point(0.529723638889,0.289701923071) + , Qt.point(0.52972395,0.289701956531) + , Qt.point(0.529724402778,0.289702101525) + , Qt.point(0.529724588889,0.289702045758) + , Qt.point(0.529724752778,0.289701967684) + , Qt.point(0.529724977778,0.289701917494) + , Qt.point(0.529725133333,0.289701989991) + , Qt.point(0.529725322222,0.289702051335) + , Qt.point(0.529725447222,0.289702062488) + , Qt.point(0.529725977778,0.289701973261) + , Qt.point(0.529726236111,0.289701984414) + , Qt.point(0.529726355556,0.289702079218) + , Qt.point(0.529726458333,0.289702112678) + , Qt.point(0.529726622222,0.289702201906) + , Qt.point(0.529726919444,0.289702112678) + , Qt.point(0.529734644444,0.289702826494) + , Qt.point(0.529736066667,0.289708782285) + , Qt.point(0.529735911111,0.28971578065) + , Qt.point(0.529733622222,0.289722215564) + , Qt.point(0.529732911111,0.289725237777) + , Qt.point(0.529734097222,0.289727384521) + , Qt.point(0.529735677778,0.289729765427) + , Qt.point(0.529737152778,0.28973095308) + , Qt.point(0.529737322222,0.289731293205) + , Qt.point(0.529738052778,0.289731705814) + , Qt.point(0.529738788889,0.289732079392) + , Qt.point(0.529738897222,0.28973234703) + , Qt.point(0.529739141667,0.289732514303) + , Qt.point(0.529739702778,0.289732759637) + , Qt.point(0.529740097222,0.289733021698) + , Qt.point(0.529740283333,0.289733289334) + , Qt.point(0.529740452778,0.289733607151) + , Qt.point(0.529740791667,0.289734120118) + , Qt.point(0.529742397222,0.289735090291) + , Qt.point(0.529746266667,0.289735168351) + , Qt.point(0.529753536111,0.289734292966) + , Qt.point(0.529760963889,0.289732146302) + , Qt.point(0.529763255556,0.289732224363) + , Qt.point(0.529764677778,0.289732938061) + , Qt.point(0.529765547222,0.289733813453) + , Qt.point(0.5297671,0.289733618303) + , Qt.point(0.529767236111,0.289733378546) + , Qt.point(0.529767286111,0.289733322788) + , Qt.point(0.529767675,0.28973300497) + , Qt.point(0.529768244444,0.289732687152) + , Qt.point(0.529768380556,0.28973263697) + , Qt.point(0.529768894444,0.28973253103) + , Qt.point(0.529769,0.289732391636) + , Qt.point(0.529769125,0.289731984604) + , Qt.point(0.529769330556,0.289731705814) + , Qt.point(0.529769525,0.289731237447) + , Qt.point(0.529769555556,0.289731092476) + , Qt.point(0.529769563889,0.289730830412) + , Qt.point(0.529769519444,0.289730573924) + , Qt.point(0.529769433333,0.289730339739) + , Qt.point(0.529769333333,0.289730116706) + , Qt.point(0.529769013889,0.289729514513) + , Qt.point(0.529768958333,0.289729313782) + , Qt.point(0.529768933333,0.289729113051) + , Qt.point(0.529768955556,0.289728906743) + , Qt.point(0.529769019444,0.289728689284) + , Qt.point(0.529769119444,0.289728466248) + , Qt.point(0.529769277778,0.289728187453) + , Qt.point(0.529769355556,0.289728120542) + , Qt.point(0.52976945,0.289728148422) + , Qt.point(0.5297696,0.28972825994) + , Qt.point(0.529769669444,0.289728271092) + , Qt.point(0.529769813889,0.289728226485) + , Qt.point(0.529769897222,0.289728170726) + , Qt.point(0.529770125,0.289728009024) + , Qt.point(0.529771525,0.289726269333) + , Qt.point(0.529772405556,0.289725170865) + , Qt.point(0.529773855556,0.289723832621) + , Qt.point(0.529774263889,0.289723564971) + , Qt.point(0.529775458333,0.289723169072) + , Qt.point(0.529776527778,0.289723079855) + , Qt.point(0.529777213889,0.289723180224) + , Qt.point(0.529778297222,0.289723503635) + , Qt.point(0.529778711111,0.289723570547) + , Qt.point(0.529779522222,0.2897235817) + , Qt.point(0.529781338889,0.289723308473) + , Qt.point(0.529782722222,0.28972336981) + , Qt.point(0.529784616667,0.289723576123) + , Qt.point(0.529787111111,0.289723559395) + , Qt.point(0.529787886111,0.289723525939) + , Qt.point(0.529788861111,0.289723336353) + , Qt.point(0.529790008333,0.28972302967) + , Qt.point(0.529791061111,0.289722499944) + , Qt.point(0.529792711111,0.289721440487) + , Qt.point(0.529796255556,0.289720130096) + , Qt.point(0.529797708333,0.289719170997) + , Qt.point(0.529800511111,0.289717420069) + , Qt.point(0.529806091667,0.289713299188) + , Qt.point(0.529810130556,0.289711364183) + , Qt.point(0.529811163889,0.289707120482) + , Qt.point(0.529812141667,0.289704092395) + , Qt.point(0.529812438889,0.289703629533) + , Qt.point(0.529813447222,0.289702759574) + , Qt.point(0.529815394444,0.28970185615) + , Qt.point(0.529817916667,0.289700975029) + , Qt.point(0.529823358333,0.289700105057) + , Qt.point(0.529825330556,0.289699787182) + , Qt.point(0.529829691667,0.289700316974) + , Qt.point(0.529834055556,0.289702419396) + , Qt.point(0.529838691667,0.289706629746) + , Qt.point(0.5298405,0.289708007151) + , Qt.point(0.529840775,0.289708291553) + , Qt.point(0.529840791667,0.289708364047) + , Qt.point(0.529840725,0.289708642872) + , Qt.point(0.529840722222,0.289708804591) + , Qt.point(0.52984075,0.289708882662) + , Qt.point(0.529840930556,0.289709083415) + , Qt.point(0.529841119444,0.289709501651) + , Qt.point(0.529841286111,0.289709769321) + , Qt.point(0.529841375,0.289709830662) + , Qt.point(0.529841661111,0.289709953345) + , Qt.point(0.529841736111,0.289710098332) + , Qt.point(0.529841844444,0.289710393884) + , Qt.point(0.529842005556,0.289710633671) + , Qt.point(0.529842258333,0.289710906916) + , Qt.point(0.529842494444,0.289711224772) + , Qt.point(0.529842944444,0.289711955282) + , Qt.point(0.529843013889,0.289712122573) + , Qt.point(0.529843033333,0.289712239678) + , Qt.point(0.529842994444,0.289712669059) + , Qt.point(0.529843002778,0.289712780586) + , Qt.point(0.529843072222,0.289712841927) + , Qt.point(0.529843158333,0.289712841927) + , Qt.point(0.529843308333,0.28971289769) + , Qt.point(0.529843447222,0.289713053828) + , Qt.point(0.529843658333,0.289713215543) + , Qt.point(0.529843772222,0.289713221119) + , Qt.point(0.529844133333,0.289713382834) + , Qt.point(0.529845105556,0.289713594735) + , Qt.point(0.5298458,0.289713611464) + , Qt.point(0.52984625,0.289713689533) + , Qt.point(0.529846530556,0.289713672804) + , Qt.point(0.529846811111,0.289713700685) + , Qt.point(0.529846913889,0.289713734143) + , Qt.point(0.52984715,0.289713873552) + , Qt.point(0.529847394444,0.289714096605) + , Qt.point(0.529847488889,0.289714208132) + , Qt.point(0.52984775,0.289714325235) + , Qt.point(0.529847883333,0.289714353116) + , Qt.point(0.529848413889,0.289714247166) + , Qt.point(0.52984855,0.289714247166) + , Qt.point(0.529848675,0.289714224861) + , Qt.point(0.529848825,0.289714157945) + , Qt.point(0.529848958333,0.289714141216) + , Qt.point(0.529849727778,0.289714291777) + , Qt.point(0.529850113889,0.289714325235) + , Qt.point(0.529850352778,0.289714314082) + , Qt.point(0.529850638889,0.289714146792) + , Qt.point(0.529850877778,0.289714124487) + , Qt.point(0.529851038889,0.289714163521) + , Qt.point(0.529851166667,0.289714185827) + , Qt.point(0.529851661111,0.289714475795) + , Qt.point(0.529851836111,0.289714537135) + , Qt.point(0.529851922222,0.289714604051) + , Qt.point(0.529852486111,0.289714827103) + , Qt.point(0.529852611111,0.289714888443) + , Qt.point(0.529852691667,0.289714955358) + , Qt.point(0.529852861111,0.28971528436) + , Qt.point(0.529852930556,0.28971558548) + , Qt.point(0.529853086111,0.28971582526) + , Qt.point(0.529853216667,0.289715953514) + , Qt.point(0.529853475,0.289716092921) + , Qt.point(0.529853755556,0.289716360582) + , Qt.point(0.529853794444,0.289716421921) + , Qt.point(0.529853819444,0.289716499988) + , Qt.point(0.529853819444,0.289716762072) + , Qt.point(0.529853869444,0.289716996275) + , Qt.point(0.529853925,0.289717052037) + , Qt.point(0.529854213889,0.289717197019) + , Qt.point(0.529854288889,0.289717258358) + , Qt.point(0.52985435,0.289717381035) + , Qt.point(0.529854344444,0.289717587355) + , Qt.point(0.5298542,0.289718044605) + , Qt.point(0.529854075,0.289718328992) + , Qt.point(0.529854052778,0.289718446092) + , Qt.point(0.529854052778,0.289718613378) + , Qt.point(0.529854125,0.289718836426) + , Qt.point(0.529854138889,0.289719031592) + , Qt.point(0.529854083333,0.289719332706) + , Qt.point(0.529854008333,0.289719589209) + , Qt.point(0.529854033333,0.289719728613) + , Qt.point(0.529854588889,0.289720381023) + , Qt.point(0.529854591667,0.289720425632) + , Qt.point(0.529854697222,0.289720598492) + , Qt.point(0.529854972222,0.289720910756) + , Qt.point(0.529855077778,0.289721156105) + , Qt.point(0.529855183333,0.289721613346) + , Qt.point(0.529855286111,0.289721931183) + , Qt.point(0.52985545,0.289722226716) + , Qt.point(0.529855566667,0.289722332662) + , Qt.point(0.529855952778,0.289722527824) + , Qt.point(0.529856105556,0.289722578009) + , Qt.point(0.529856275,0.289722695107) + , Qt.point(0.52985675,0.289722873541) + , Qt.point(0.529856894444,0.289722906997) + , Qt.point(0.529857594444,0.289722856813) + , Qt.point(0.529858038889,0.289722756443) + , Qt.point(0.529858519444,0.28972268953) + , Qt.point(0.529858691667,0.28972250552) + , Qt.point(0.529859308333,0.289723196952) + , Qt.point(0.529860708333,0.2897242564) + , Qt.point(0.529862169444,0.289725332569) + , Qt.point(0.529864158333,0.289726877111) + , Qt.point(0.529864519444,0.289727233971) + , Qt.point(0.529864941667,0.289729614879) + , Qt.point(0.529865469444,0.289732832122) + , Qt.point(0.529866008333,0.289735876463) + , Qt.point(0.529866722222,0.289740147376) + , Qt.point(0.529866880556,0.289740626872) + , Qt.point(0.529869183333,0.289742143408) + , Qt.point(0.529870091667,0.289742868219) + , Qt.point(0.529870711111,0.289743269651) + , Qt.point(0.529879705556,0.289749575371) + , Qt.point(0.529883819444,0.289752429879) + , Qt.point(0.529885133333,0.289753327479) + , Qt.point(0.52990485,0.289766835545) + , Qt.point(0.529906422222,0.289768156751) + , Qt.point(0.52990915,0.289769723232) + , Qt.point(0.529910155556,0.289770470232) + , Qt.point(0.5299104,0.289770882753) + , Qt.point(0.529910702778,0.289771596302) + , Qt.point(0.529911,0.289772516106) + , Qt.point(0.529911194444,0.289772867302) + , Qt.point(0.529911652778,0.289773463778) + , Qt.point(0.529912147222,0.289774322253) + , Qt.point(0.529912233333,0.289775331235) + , Qt.point(0.529911041667,0.289775860809) + , Qt.point(0.529910080556,0.289776256595) + , Qt.point(0.529907819444,0.289776145106) + , Qt.point(0.529907308333,0.28977631234) + , Qt.point(0.529906688889,0.289776596636) + , Qt.point(0.52990615,0.289777449522) + , Qt.point(0.529906119444,0.289777744965) + , Qt.point(0.529906133333,0.289778107301) + , Qt.point(0.529906080556,0.289778346999) + , Qt.point(0.529906075,0.289778469636) + , Qt.point(0.529905988889,0.289778536528) + , Qt.point(0.529905908333,0.289778648016) + , Qt.point(0.529905908333,0.289778726057) + , Qt.point(0.529905969444,0.289778915585) + , Qt.point(0.529905980556,0.289779010349) + , Qt.point(0.529905933333,0.289779361534) + , Qt.point(0.529904819444,0.289780465251) + , Qt.point(0.529902894444,0.289782683816) + , Qt.point(0.529900686111,0.289785978166) + , Qt.point(0.52989095,0.289797220879) + , Qt.point(0.529880863889,0.289809271053) + , Qt.point(0.529877591667,0.289815574506) + , Qt.point(0.529875952778,0.289822145249) + , Qt.point(0.529874858333,0.289832828475) + , Qt.point(0.529874311111,0.289837487215) + , Qt.point(0.529874583333,0.289841867213) + , Qt.point(0.529875941667,0.289845706592) + , Qt.point(0.529879222222,0.289846514579) + , Qt.point(0.529879480556,0.289846536868) + , Qt.point(0.529880247222,0.289846531296) + , Qt.point(0.529880838889,0.289846570302) + , Qt.point(0.529881269444,0.28984654244) + , Qt.point(0.529881377778,0.289846570302) + , Qt.point(0.529881508333,0.28984675976) + , Qt.point(0.529881577778,0.289846804339) + , Qt.point(0.529881913889,0.289846876779) + , Qt.point(0.529882072222,0.289847021658) + , Qt.point(0.529882188889,0.289847183255) + , Qt.point(0.529882297222,0.289847473014) + , Qt.point(0.529882305556,0.289847601176) + , Qt.point(0.529882261111,0.28984800238) + , Qt.point(0.529882266667,0.289848392438) + , Qt.point(0.529882291667,0.289848526172) + , Qt.point(0.529882347222,0.28984867105) + , Qt.point(0.529882422222,0.289849038818) + , Qt.point(0.529882566667,0.289849283996) + , Qt.point(0.529882605556,0.28984941773) + , Qt.point(0.529882616667,0.289849607185) + , Qt.point(0.529882675,0.289849891368) + , Qt.point(0.529882805556,0.289850253561) + , Qt.point(0.529882838889,0.289850420727) + , Qt.point(0.529882838889,0.289850966801) + , Qt.point(0.529882888889,0.28985101695) + , Qt.point(0.529883458333,0.289851072672) + , Qt.point(0.529883558333,0.289851156255) + , Qt.point(0.529883694444,0.289851496157) + , Qt.point(0.529883741667,0.289851568595) + , Qt.point(0.529883802778,0.289851568595) + , Qt.point(0.529883858333,0.289851551878) + , Qt.point(0.529883922222,0.289851507301) + , Qt.point(0.529883983333,0.289851423719) + , Qt.point(0.529884102778,0.289851340136) + , Qt.point(0.529884241667,0.289851284414) + , Qt.point(0.529884422222,0.289851250981) + , Qt.point(0.529884805556,0.28985127327) + , Qt.point(0.529885025,0.289851206404) + , Qt.point(0.529885141667,0.289851072672) + , Qt.point(0.529885252778,0.28985088879) + , Qt.point(0.529885430556,0.289850777347) + , Qt.point(0.529885511111,0.289850749486) + , Qt.point(0.529885816667,0.289850827496) + , Qt.point(0.529886094444,0.28985093894) + , Qt.point(0.529886233333,0.289851022522) + , Qt.point(0.5298864,0.289851156255) + , Qt.point(0.5298865,0.289851206404) + , Qt.point(0.529886758333,0.289851395858) + , Qt.point(0.529886988889,0.289851674466) + , Qt.point(0.529887133333,0.289851908496) + , Qt.point(0.529887297222,0.289852237252) + , Qt.point(0.529887522222,0.289852593869) + , Qt.point(0.529887597222,0.289852644018) + , Qt.point(0.529887836111,0.289852705311) + , Qt.point(0.529887930556,0.289852705311) + , Qt.point(0.529888066667,0.289852749888) + , Qt.point(0.529888136111,0.289852805609) + , Qt.point(0.529888275,0.289852983917) + , Qt.point(0.529888441667,0.28985312322) + , Qt.point(0.529888594444,0.289853201229) + , Qt.point(0.529889138889,0.289853307099) + , Qt.point(0.529889463889,0.289853329388) + , Qt.point(0.529889677778,0.289853301527) + , Qt.point(0.529890541667,0.289853301527) + , Qt.point(0.529890758333,0.289853268095) + , Qt.point(0.529891030556,0.289853284811) + , Qt.point(0.529891211111,0.289853396253) + , Qt.point(0.529891305556,0.289853490979) + , Qt.point(0.529891461111,0.289853719435) + , Qt.point(0.529891525,0.289853764011) + , Qt.point(0.529891666667,0.289853803016) + , Qt.point(0.529892286111,0.289853881025) + , Qt.point(0.529892775,0.289854020327) + , Qt.point(0.529892877778,0.289854009183) + , Qt.point(0.529893069444,0.28985392003) + , Qt.point(0.529893191667,0.289853836448) + , Qt.point(0.529893272222,0.289853803016) + , Qt.point(0.529893319444,0.289853808588) + , Qt.point(0.529893416667,0.289853875453) + , Qt.point(0.529893477778,0.289854009183) + , Qt.point(0.529893516667,0.289854048188) + , Qt.point(0.529893638889,0.289854059332) + , Qt.point(0.529893741667,0.289854131769) + , Qt.point(0.529893908333,0.289854460521) + , Qt.point(0.529894041667,0.289854610967) + , Qt.point(0.529894166667,0.28985467226) + , Qt.point(0.529894255556,0.28985467226) + , Qt.point(0.529894447222,0.289854739124) + , Qt.point(0.529894730556,0.289855118024) + , Qt.point(0.529894836111,0.289855335334) + , Qt.point(0.529894594444,0.289855641796) + , Qt.point(0.529894594444,0.289855719805) + , Qt.point(0.5298947,0.289856048554) + , Qt.point(0.5298947,0.289856154422) + , Qt.point(0.529894638889,0.289856360587) + , Qt.point(0.529894541667,0.289856527747) + , Qt.point(0.52989455,0.289856745055) + , Qt.point(0.529894580556,0.289856817491) + , Qt.point(0.529894663889,0.289856884355) + , Qt.point(0.529895008333,0.289857034799) + , Qt.point(0.529895269444,0.289857213103) + , Qt.point(0.529895427778,0.28985729111) + , Qt.point(0.529895433333,0.289857307826) + , Qt.point(0.529895638889,0.289857424838) + , Qt.point(0.529895847222,0.289857675577) + , Qt.point(0.529895983333,0.2898579096) + , Qt.point(0.529896002778,0.289858015467) + , Qt.point(0.529895972222,0.289858327496) + , Qt.point(0.529895880556,0.28985876768) + , Qt.point(0.529895897222,0.289859012845) + , Qt.point(0.529895961111,0.289859107568) + , Qt.point(0.529896055556,0.289859180003) + , Qt.point(0.529896080556,0.289859252438) + , Qt.point(0.529896147222,0.289859631328) + , Qt.point(0.529896144444,0.289859937783) + , Qt.point(0.529896175,0.289860077081) + , Qt.point(0.529896275,0.289860199663) + , Qt.point(0.529896311111,0.2898603111) + , Qt.point(0.529896363889,0.289860885004) + , Qt.point(0.529896361111,0.289861046589) + , Qt.point(0.529896394444,0.289861213745) + , Qt.point(0.529896458333,0.289861336326) + , Qt.point(0.529896452778,0.289861314038) + , Qt.point(0.529896483333,0.289861353041) + , Qt.point(0.529896708333,0.289861481194) + , Qt.point(0.529896763889,0.289861581487) + , Qt.point(0.529896863889,0.289862082953) + , Qt.point(0.529897008333,0.289862166531) + , Qt.point(0.529897147222,0.289862283539) + , Qt.point(0.529897322222,0.289862617849) + , Qt.point(0.529897483333,0.289862757144) + , Qt.point(0.529897830556,0.289862818434) + , Qt.point(0.529897930556,0.289862818434) + , Qt.point(0.529898247222,0.289862729285) + , Qt.point(0.529898605556,0.289862734857) + , Qt.point(0.529898866667,0.289862634564) + , Qt.point(0.529899011111,0.289862545415) + , Qt.point(0.529899225,0.289862305827) + , Qt.point(0.529899275,0.289862294683) + , Qt.point(0.529899325,0.289862322542) + , Qt.point(0.52989955,0.289862628993) + , Qt.point(0.529899725,0.289862706998) + , Qt.point(0.529899758333,0.289862801719) + , Qt.point(0.529899713889,0.289862980017) + , Qt.point(0.529899702778,0.289863214033) + , Qt.point(0.529899916667,0.289863620774) + , Qt.point(0.529900008333,0.289863748925) + , Qt.point(0.529900072222,0.289863804643) + , Qt.point(0.529900108333,0.289863810215) + , Qt.point(0.529900286111,0.289863787928) + , Qt.point(0.529900372222,0.28986382693) + , Qt.point(0.529900502778,0.289863955081) + , Qt.point(0.529900597222,0.289863994084) + , Qt.point(0.529900666667,0.289864010799) + , Qt.point(0.529900836111,0.289863971797) + , Qt.point(0.529900911111,0.289863977368) + , Qt.point(0.529901030556,0.289864033086) + , Qt.point(0.529901080556,0.289864166809) + , Qt.point(0.529901094444,0.289864356249) + , Qt.point(0.529901205556,0.289864645981) + , Qt.point(0.529901161111,0.289864735129) + , Qt.point(0.529901086111,0.289864807562) + , Qt.point(0.529900869444,0.289864952427) + , Qt.point(0.52990085,0.289865041575) + , Qt.point(0.529900897222,0.289865102865) + , Qt.point(0.529900966667,0.289865130723) + , Qt.point(0.529901061111,0.289865214299) + , Qt.point(0.529901125,0.289865353593) + , Qt.point(0.529901111111,0.289865465028) + , Qt.point(0.529901141667,0.289865509602) + , Qt.point(0.529901288889,0.289865587606) + , Qt.point(0.529901355556,0.289865660038) + , Qt.point(0.529901433333,0.289865994342) + , Qt.point(0.529901425,0.289866317501) + , Qt.point(0.5299014,0.289866395505) + , Qt.point(0.5299014,0.2898665738) + , Qt.point(0.529901413889,0.289866601658) + , Qt.point(0.529901533333,0.289866701949) + , Qt.point(0.529901702778,0.289866774381) + , Qt.point(0.529901797222,0.289866757666) + , Qt.point(0.529901991667,0.289866796668) + , Qt.point(0.529902072222,0.289866846813) + , Qt.point(0.529902158333,0.289866952675) + , Qt.point(0.529902236111,0.289867353836) + , Qt.point(0.529902177778,0.289867872001) + , Qt.point(0.529902177778,0.289868111583) + , Qt.point(0.529902202778,0.289868206301) + , Qt.point(0.529902347222,0.28986850717) + , Qt.point(0.529902330556,0.289868952901) + , Qt.point(0.529903338889,0.289870953105) + , Qt.point(0.529907002778,0.289879716973) + , Qt.point(0.529908625,0.289884023539) + , Qt.point(0.5299118,0.289893588992) + , Qt.point(0.529913527778,0.28990095912) + , Qt.point(0.529914766667,0.28990581667) + , Qt.point(0.529915363889,0.289908267678) + , Qt.point(0.529916061111,0.289910701943) + , Qt.point(0.529916752778,0.289912957926) + , Qt.point(0.529917372222,0.289915380987) + , Qt.point(0.529918427778,0.289916277791) + , Qt.point(0.529920769444,0.289917130028) + , Qt.point(0.529923144444,0.289917948841) + , Qt.point(0.529924305556,0.289920171315) + , Qt.point(0.529927358333,0.289925574208) + , Qt.point(0.529930027778,0.289932191143) + , Qt.point(0.529932177778,0.289939559723) + , Qt.point(0.529932266667,0.289939827058) + , Qt.point(0.529932325,0.289940038698) + , Qt.point(0.529932525,0.289940378435) + , Qt.point(0.529932763889,0.289940690325) + , Qt.point(0.529932919444,0.289941035631) + , Qt.point(0.529933133333,0.289941403213) + , Qt.point(0.529933486111,0.28994257836) + , Qt.point(0.529933505556,0.289942723164) + , Qt.point(0.529933675,0.289943129729) + , Qt.point(0.529933869444,0.289943419336) + , Qt.point(0.5299339,0.289943508446) + , Qt.point(0.529933955556,0.289943731221) + , Qt.point(0.529933988889,0.289944015258) + , Qt.point(0.529933983333,0.289944238032) + , Qt.point(0.52993405,0.289944544346) + , Qt.point(0.529934077778,0.289945240511) + , Qt.point(0.529934927778,0.289947607455) + , Qt.point(0.529935,0.289947802378) + , Qt.point(0.529935058333,0.289947947178) + , Qt.point(0.529935327778,0.289948398286) + , Qt.point(0.529935413889,0.289948598777) + , Qt.point(0.529935511111,0.289948916222) + , Qt.point(0.529935602778,0.289949333912) + , Qt.point(0.529935716667,0.289949662494) + , Qt.point(0.529935780556,0.289949985506) + , Qt.point(0.529935786111,0.289950325225) + , Qt.point(0.529935697222,0.289950642667) + , Qt.point(0.529935644444,0.289950742912) + , Qt.point(0.529935636111,0.289950937832) + , Qt.point(0.5299357,0.289951104906) + , Qt.point(0.529935738889,0.289951288688) + , Qt.point(0.529935780556,0.289951689665) + , Qt.point(0.529935833333,0.28995190686) + , Qt.point(0.529935905556,0.289952352389) + , Qt.point(0.529935908333,0.289952547307) + , Qt.point(0.5299359,0.289952641982) + , Qt.point(0.529935863889,0.289952725518) + , Qt.point(0.529935758333,0.28995289259) + , Qt.point(0.529935569444,0.289953098646) + , Qt.point(0.529935563889,0.289953148768) + , Qt.point(0.529935827778,0.289953772503) + , Qt.point(0.529935861111,0.289954167906) + , Qt.point(0.529935977778,0.289954630136) + , Qt.point(0.529935986111,0.289954897449) + , Qt.point(0.529935941667,0.2899551759) + , Qt.point(0.529935955556,0.289955387523) + , Qt.point(0.529935947222,0.289955688249) + , Qt.point(0.529936030556,0.28995612263) + , Qt.point(0.529936069444,0.289956239579) + , Qt.point(0.529936361111,0.289956796476) + , Qt.point(0.529936619444,0.289957587267) + , Qt.point(0.529936697222,0.289957754335) + , Qt.point(0.529936958333,0.289957965955) + , Qt.point(0.529937080556,0.289958272245) + , Qt.point(0.529937097222,0.289958433744) + , Qt.point(0.529937130556,0.289958517278) + , Qt.point(0.529937202778,0.289958578536) + , Qt.point(0.529937380556,0.289958673207) + , Qt.point(0.529937494444,0.289958767879) + , Qt.point(0.529937711111,0.289958901532) + , Qt.point(0.5299378,0.289958990635) + , Qt.point(0.529937913889,0.289959152133) + , Qt.point(0.529938133333,0.289959319199) + , Qt.point(0.529938263889,0.28995951411) + , Qt.point(0.529938288889,0.289959597644) + , Qt.point(0.529938277778,0.289959681177) + , Qt.point(0.529938152778,0.289959981896) + , Qt.point(0.529938147222,0.289960098842) + , Qt.point(0.529938163889,0.289960126686) + , Qt.point(0.529938386111,0.289960343872) + , Qt.point(0.529938552778,0.289960477524) + , Qt.point(0.529938655556,0.289960538782) + , Qt.point(0.529939269444,0.289960822793) + , Qt.point(0.529939386111,0.289960923032) + , Qt.point(0.529939969444,0.289961307282) + , Qt.point(0.529940094444,0.289961435365) + , Qt.point(0.529940208333,0.289961730512) + , Qt.point(0.529940233333,0.289961875301) + , Qt.point(0.529940297222,0.289962031228) + , Qt.point(0.529940391667,0.289962181585) + , Qt.point(0.529940711111,0.289962504576) + , Qt.point(0.529941086111,0.289963000197) + , Qt.point(0.529941244444,0.289963161692) + , Qt.point(0.52994155,0.289963674018) + , Qt.point(0.529941694444,0.289964047124) + , Qt.point(0.529941738889,0.289964247599) + , Qt.point(0.529941716667,0.289964498192) + , Qt.point(0.529941627778,0.289965032789) + , Qt.point(0.529941472222,0.289965595229) + , Qt.point(0.529941313889,0.289965996174) + , Qt.point(0.529941233333,0.289966285746) + , Qt.point(0.529941166667,0.289966424963) + , Qt.point(0.529941147222,0.289966558611) + , Qt.point(0.529941016667,0.289966848181) + , Qt.point(0.529940952778,0.289967048653) + , Qt.point(0.529940672222,0.289967583243) + , Qt.point(0.529940636111,0.289967711321) + , Qt.point(0.529940561111,0.289967861674) + , Qt.point(0.529940516667,0.289968112263) + , Qt.point(0.529940511111,0.289968468654) + , Qt.point(0.529940486111,0.289968669124) + , Qt.point(0.529940522222,0.289968780496) + , Qt.point(0.529940566667,0.289969448727) + , Qt.point(0.529940497222,0.289969799547) + , Qt.point(0.529940425,0.289970038995) + , Qt.point(0.529940430556,0.289970178209) + , Qt.point(0.529940469444,0.289970311855) + , Qt.point(0.529940661111,0.289970579145) + , Qt.point(0.529941452778,0.289971553638) + , Qt.point(0.529942430556,0.289972823256) + , Qt.point(0.529943386111,0.289974404697) + , Qt.point(0.529944113889,0.289975880325) + , Qt.point(0.529945633333,0.289977784703) + , Qt.point(0.529948047222,0.289979622242) + , Qt.point(0.529949722222,0.289981264875) + , Qt.point(0.529950902778,0.289983391923) + , Qt.point(0.529951544444,0.28998583076) + , Qt.point(0.529952822222,0.289989990072) + , Qt.point(0.529953197222,0.289990363124) + , Qt.point(0.529953741667,0.28999078072) + , Qt.point(0.529954163889,0.289991047981) + , Qt.point(0.529954402778,0.289991281833) + , Qt.point(0.529954716667,0.289991755106) + , Qt.point(0.529954822222,0.289992022365) + , Qt.point(0.529954911111,0.289992367574) + , Qt.point(0.529955213889,0.289993380927) + , Qt.point(0.5299553,0.28999412145) + , Qt.point(0.529955408333,0.289994778453) + , Qt.point(0.529955686111,0.289996192672) + , Qt.point(0.529955886111,0.289996827396) + , Qt.point(0.529955988889,0.28999726168) + , Qt.point(0.529956033333,0.289997612448) + , Qt.point(0.529956227778,0.289999772713) + , Qt.point(0.529956205556,0.290000273802) + , Qt.point(0.52995605,0.290000580022) + , Qt.point(0.529955872222,0.290000808295) + , Qt.point(0.529955677778,0.290000902944) + , Qt.point(0.529955636111,0.290000941918) + , Qt.point(0.529955616667,0.290001008729) + , Qt.point(0.529955766667,0.290001593329) + , Qt.point(0.529955911111,0.290001927385) + , Qt.point(0.529956116667,0.290002272576) + , Qt.point(0.529956225,0.290002601063) + , Qt.point(0.529956288889,0.290002962955) + , Qt.point(0.529956241667,0.290004427218) + , Qt.point(0.529956397222,0.290005017375) + , Qt.point(0.529957133333,0.290006542864) + , Qt.point(0.529957502778,0.290006960423) + , Qt.point(0.529957891667,0.290007244362) + , Qt.point(0.529958244444,0.290007355711) + , Qt.point(0.529958502778,0.290007862346) + , Qt.point(0.529958530556,0.290007901318) + , Qt.point(0.529959319444,0.29000966618) + , Qt.point(0.529959958333,0.290014376107) + , Qt.point(0.529960397222,0.290015367069) + , Qt.point(0.529960972222,0.290015678832) + , Qt.point(0.529961483333,0.29001591822) + , Qt.point(0.529961861111,0.290016385862) + , Qt.point(0.529962605556,0.290017644035) + , Qt.point(0.529962827778,0.290018172911) + , Qt.point(0.529962908333,0.29001850137) + , Qt.point(0.529962916667,0.290018657248) + , Qt.point(0.529962927778,0.290018801992) + , Qt.point(0.529962986111,0.290018963438) + , Qt.point(0.529963169444,0.290019330865) + , Qt.point(0.529963227778,0.290019553547) + , Qt.point(0.529963288889,0.290020104686) + , Qt.point(0.529963369444,0.290020221593) + , Qt.point(0.52996355,0.290020388605) + , Qt.point(0.529963752778,0.29002052778) + , Qt.point(0.529963894444,0.290020672523) + , Qt.point(0.529964013889,0.290020895204) + , Qt.point(0.529964075,0.290021095617) + , Qt.point(0.529964075,0.29002125706) + , Qt.point(0.529964094444,0.290021318297) + , Qt.point(0.529964197222,0.29002142407) + , Qt.point(0.529964336111,0.290021463039) + , Qt.point(0.529964477778,0.290021585513) + , Qt.point(0.529964588889,0.290021724688) + , Qt.point(0.529964922222,0.290022214583) + , Qt.point(0.529965519444,0.290022921589) + , Qt.point(0.529966725,0.29002395704) + , Qt.point(0.529968472222,0.290024686306) + , Qt.point(0.529971180556,0.290025354334) + , Qt.point(0.529974375,0.290025660512) + , Qt.point(0.529977388889,0.290026089161) + , Qt.point(0.529979977778,0.290026634713) + , Qt.point(0.529982930556,0.290027608909) + , Qt.point(0.5299854,0.290029006174) + , Qt.point(0.529987869444,0.290030342195) + , Qt.point(0.529989794444,0.290031616973) + , Qt.point(0.529990577778,0.290031978808) + , Qt.point(0.529991422222,0.290032040042) + , Qt.point(0.529992083333,0.290031800674) + , Qt.point(0.529992244444,0.290031694907) + , Qt.point(0.529992369444,0.290031611407) + , Qt.point(0.529992527778,0.290031539039) + , Qt.point(0.529993194444,0.290031388739) + , Qt.point(0.529993691667,0.290031344205) + , Qt.point(0.529993911111,0.290031344205) + , Qt.point(0.529994166667,0.290031394305) + , Qt.point(0.5299947,0.290031455539) + , Qt.point(0.529995075,0.290031527906) + , Qt.point(0.529995366667,0.290031628107) + , Qt.point(0.529996202778,0.290031989941) + , Qt.point(0.529996519444,0.290032201475) + , Qt.point(0.529996869444,0.290032541042) + , Qt.point(0.529997213889,0.290032925142) + , Qt.point(0.529997547222,0.290033403874) + , Qt.point(0.529997763889,0.29003355974) + , Qt.point(0.529998022222,0.290033682206) + , Qt.point(0.529998177778,0.290033682206) + , Qt.point(0.529998613889,0.290033520773) + , Qt.point(0.529998791667,0.29003352634) + , Qt.point(0.529999008333,0.290033565306) + , Qt.point(0.529999244444,0.290033682206) + , Qt.point(0.529999519444,0.290033704472) + , Qt.point(0.529999913889,0.290033682206) + , Qt.point(0.530000880556,0.29003342614) + , Qt.point(0.530001177778,0.290033325941) + , Qt.point(0.530001494444,0.290033209041) + , Qt.point(0.530001986111,0.290032952975) + , Qt.point(0.530002341667,0.290032875042) + , Qt.point(0.530002933333,0.290032836076) + , Qt.point(0.530003208333,0.290032852776) + , Qt.point(0.530003386111,0.290032891742) + , Qt.point(0.530003977778,0.290033270274) + , Qt.point(0.530004175,0.290033431707) + , Qt.point(0.530004369444,0.29003398837) + , Qt.point(0.530004666667,0.29003495696) + , Qt.point(0.530004802778,0.290035174057) + , Qt.point(0.530004961111,0.290035357755) + , Qt.point(0.530005177778,0.290035435687) + , Qt.point(0.530005711111,0.290035418987) + , Qt.point(0.530006105556,0.290035457953) + , Qt.point(0.530006302778,0.290035418987) + , Qt.point(0.530006619444,0.29003521859) + , Qt.point(0.530006755556,0.290035179624) + , Qt.point(0.530006933333,0.290035157358) + , Qt.point(0.530007211111,0.29003520189) + , Qt.point(0.530008805556,0.290035719582) + , Qt.point(0.530009477778,0.290036020177) + , Qt.point(0.530009930556,0.290036298505) + , Qt.point(0.530010875,0.290036816193) + , Qt.point(0.530011722222,0.290037194718) + , Qt.point(0.530012097222,0.290037333881) + , Qt.point(0.530012925,0.290037489743) + , Qt.point(0.530013438889,0.290037634473) + , Qt.point(0.530013833333,0.290037812601) + , Qt.point(0.530015744444,0.290039181957) + , Qt.point(0.530016275,0.290039482546) + , Qt.point(0.530016947222,0.290039738603) + , Qt.point(0.530017755556,0.290039938995) + , Qt.point(0.530018483333,0.290040083722) + , Qt.point(0.530018936111,0.290040245149) + , Qt.point(0.530019527778,0.290040640365) + , Qt.point(0.530020966667,0.290041553256) + , Qt.point(0.530021419444,0.290041714682) + , Qt.point(0.530021655556,0.290041876107) + , Qt.point(0.530021913889,0.290041993001) + , Qt.point(0.530022269444,0.290042015267) + , Qt.point(0.530023036111,0.290041892806) + , Qt.point(0.530023213889,0.290041892806) + , Qt.point(0.53002345,0.290041915072) + , Qt.point(0.530023786111,0.290041993001) + , Qt.point(0.530024522222,0.290041998567) + , Qt.point(0.530024586111,0.290042043098) + , Qt.point(0.530024883333,0.290042093196) + , Qt.point(0.530024963889,0.290042154426) + , Qt.point(0.530025008333,0.290042221223) + , Qt.point(0.530025030556,0.290042315851) + , Qt.point(0.530025038889,0.290042532939) + , Qt.point(0.530025191667,0.290042744461) + , Qt.point(0.530025341667,0.290042878054) + , Qt.point(0.530025461111,0.290042911452) + , Qt.point(0.530025697222,0.290042905885) + , Qt.point(0.530025905556,0.290042839089) + , Qt.point(0.530025997222,0.290042733328) + , Qt.point(0.530026105556,0.290042382647) + , Qt.point(0.530026419444,0.290041942904) + , Qt.point(0.530026755556,0.290041386264) + , Qt.point(0.530026813889,0.290041247104) + , Qt.point(0.530026913889,0.290041169175) + , Qt.point(0.530028394444,0.290040278548) + , Qt.point(0.530028788889,0.290040078156) + , Qt.point(0.530029044444,0.290040000226) + , Qt.point(0.530029733333,0.290039961261) + , Qt.point(0.530029972222,0.290040039191) + , Qt.point(0.530030088889,0.290040161652) + , Qt.point(0.530030088889,0.290040278548) + , Qt.point(0.530029991667,0.290040478939) + , Qt.point(0.53002995,0.290040673764) + , Qt.point(0.530029930556,0.290040857456) + , Qt.point(0.53002995,0.29004097435) + , Qt.point(0.530030186111,0.290041453061) + , Qt.point(0.530030344444,0.290041670151) + , Qt.point(0.530030541667,0.290041770346) + , Qt.point(0.530030777778,0.290041770346) + , Qt.point(0.53003135,0.290041514292) + , Qt.point(0.530031588889,0.290041464194) + , Qt.point(0.530031844444,0.290041430796) + , Qt.point(0.530032197222,0.290041453061) + , Qt.point(0.530033005556,0.290041692416) + , Qt.point(0.530033577778,0.290041714682) + , Qt.point(0.530033991667,0.290041653451) + , Qt.point(0.530034583333,0.290041096811) + , Qt.point(0.530034902778,0.290040874155) + , Qt.point(0.530034955556,0.290040863022) + , Qt.point(0.530035030556,0.290040885288) + , Qt.point(0.530035094444,0.290040901987) + , Qt.point(0.530035316667,0.290040829624) + , Qt.point(0.530035405556,0.290040751694) + , Qt.point(0.530035488889,0.290040568002) + , Qt.point(0.53003555,0.29004028968) + , Qt.point(0.530035719444,0.290039950128) + , Qt.point(0.530035916667,0.290039755302) + , Qt.point(0.530036094444,0.290039515945) + , Qt.point(0.530036175,0.290039360084) + , Qt.point(0.530036275,0.290038842402) + , Qt.point(0.530036352778,0.290038725506) + , Qt.point(0.530037083333,0.290038090926) + , Qt.point(0.530037280556,0.290037790335) + , Qt.point(0.530037458333,0.290037634473) + , Qt.point(0.530037636111,0.290037556542) + , Qt.point(0.530037852778,0.290037573241) + , Qt.point(0.530038405556,0.290037812601) + , Qt.point(0.530038758333,0.290037935064) + , Qt.point(0.530039075,0.290037896099) + , Qt.point(0.530039469444,0.290037756936) + , Qt.point(0.530039705556,0.290037556542) + , Qt.point(0.530039983333,0.290037556542) + , Qt.point(0.530040594444,0.290037756936) + , Qt.point(0.530040758333,0.290037723537) + , Qt.point(0.530040969444,0.290037679005) + , Qt.point(0.530041661111,0.290037545409) + , Qt.point(0.530043363889,0.290037311615) + , Qt.point(0.530045780556,0.290037244816) + , Qt.point(0.530048983333,0.29003735058) + , Qt.point(0.530051127778,0.290037662305) + , Qt.point(0.530052080556,0.290038040828) + , Qt.point(0.530053544444,0.290038764472) + , Qt.point(0.530054530556,0.290039760869) + , Qt.point(0.530054802778,0.290040785092) + , Qt.point(0.530054902778,0.29004208763) + , Qt.point(0.530054458333,0.290043974622) + , Qt.point(0.530053875,0.290046607473) + , Qt.point(0.530053752778,0.29004765949) + , Qt.point(0.530053761111,0.290048461022) + , Qt.point(0.530051741667,0.290062576326) + , Qt.point(0.530046463889,0.290084910352) + , Qt.point(0.530046433333,0.290085628246) + , Qt.point(0.530046447222,0.290086112406) + , Qt.point(0.530046183333,0.290087453577) + , Qt.point(0.530046158333,0.290087954426) + , Qt.point(0.530046172222,0.290088243805) + , Qt.point(0.530046147222,0.290088588834) + , Qt.point(0.530046047222,0.290089445837) + , Qt.point(0.530045955556,0.29009002459) + , Qt.point(0.53004595,0.290090425265) + , Qt.point(0.530045905556,0.290091104183) + , Qt.point(0.5300459,0.290091788663) + , Qt.point(0.530045858333,0.290092250547) + , Qt.point(0.530045880556,0.290093413599) + , Qt.point(0.530045830556,0.290093958951) + , Qt.point(0.530045841667,0.290094559949) + , Qt.point(0.530045894444,0.290095183204) + , Qt.point(0.530045858333,0.290095227722) + , Qt.point(0.5300458,0.290095567173) + , Qt.point(0.530045758333,0.290095912187) + , Qt.point(0.530045747222,0.290096285025) + , Qt.point(0.530045480556,0.290097509263) + , Qt.point(0.530045491667,0.290097815321) + , Qt.point(0.530045661111,0.290098199284) + , Qt.point(0.530045716667,0.290098371789) + , Qt.point(0.530045708333,0.290099000596) + , Qt.point(0.530045827778,0.290100035619) + , Qt.point(0.530045805556,0.290100631033) + , Qt.point(0.530045827778,0.290100925956) + , Qt.point(0.530045869444,0.290100998296) + , Qt.point(0.530046019444,0.29010101499) + , Qt.point(0.530046144444,0.290101059507) + , Qt.point(0.530046255556,0.290101126282) + , Qt.point(0.530046522222,0.290101421205) + , Qt.point(0.530046802778,0.290101916452) + , Qt.point(0.530046980556,0.290102166857) + , Qt.point(0.530047169444,0.290102534117) + , Qt.point(0.530047313889,0.2901029292) + , Qt.point(0.530047477778,0.29010322412) + , Qt.point(0.530047608333,0.290103546862) + , Qt.point(0.530047666667,0.290103908555) + , Qt.point(0.530047675,0.29010407549) + , Qt.point(0.530047622222,0.290104459441) + , Qt.point(0.530047505556,0.290104932421) + , Qt.point(0.530047508333,0.290105900637) + , Qt.point(0.530047483333,0.290106062006) + , Qt.point(0.530047472222,0.290106685222) + , Qt.point(0.53004745,0.290106841026) + , Qt.point(0.530047266667,0.290107191584) + , Qt.point(0.530047138889,0.290107575528) + , Qt.point(0.530047141667,0.290107792539) + , Qt.point(0.530047275,0.290108699532) + , Qt.point(0.530047244444,0.290109038957) + , Qt.point(0.530047255556,0.290109478541) + , Qt.point(0.530047333333,0.290110797284) + , Qt.point(0.530047347222,0.290111476126) + , Qt.point(0.530047444444,0.290112193917) + , Qt.point(0.530047425,0.290112238431) + , Qt.point(0.530047463889,0.290112583414) + , Qt.point(0.530047430556,0.290112872754) + , Qt.point(0.530047430556,0.290113061938) + , Qt.point(0.530047527778,0.290114030111) + , Qt.point(0.530047486111,0.290114742327) + , Qt.point(0.530047619444,0.290115899673) + , Qt.point(0.530047719444,0.290116211264) + , Qt.point(0.530047897222,0.290116489471) + , Qt.point(0.530047933333,0.290116667523) + , Qt.point(0.530047836111,0.290117084831) + , Qt.point(0.530047816667,0.290117457626) + , Qt.point(0.530047825,0.290117635677) + , Qt.point(0.53004795,0.290118264418) + , Qt.point(0.530047988889,0.290118904285) + , Qt.point(0.530048108333,0.290119905811) + , Qt.point(0.530048097222,0.290120122808) + , Qt.point(0.530048136111,0.290120873948) + , Qt.point(0.530048130556,0.290121469294) + , Qt.point(0.530048102778,0.290121769748) + , Qt.point(0.530048147222,0.290122520882) + , Qt.point(0.530048141667,0.290122726748) + , Qt.point(0.530047977778,0.290124000884) + , Qt.point(0.530047877778,0.290124318026) + , Qt.point(0.5300478,0.290124785392) + , Qt.point(0.530047861111,0.290125052458) + , Qt.point(0.530048019444,0.290125514258) + , Qt.point(0.530048133333,0.290126209738) + , Qt.point(0.530048147222,0.290126615897) + , Qt.point(0.530048252778,0.290126938598) + , Qt.point(0.530048286111,0.29012711664) + , Qt.point(0.530048311111,0.290127572871) + , Qt.point(0.530048238889,0.290128240525) + , Qt.point(0.530048213889,0.290128680062) + , Qt.point(0.530048244444,0.290129164108) + , Qt.point(0.530048227778,0.29012942004) + , Qt.point(0.530048163889,0.290129759427) + , Qt.point(0.530048108333,0.290130282416) + , Qt.point(0.530047952778,0.290130727512) + , Qt.point(0.530047941667,0.290130777585) + , Qt.point(0.530047972222,0.290130816531) + , Qt.point(0.530047902778,0.290130899987) + , Qt.point(0.530047830556,0.29013122268) + , Qt.point(0.530047822222,0.290131367336) + , Qt.point(0.530047830556,0.290131895884) + , Qt.point(0.530047783333,0.290132769376) + , Qt.point(0.5300478,0.290132925158) + , Qt.point(0.530047780556,0.290133108757) + , Qt.point(0.530047772222,0.290133737445) + , Qt.point(0.530047702778,0.290134071261) + , Qt.point(0.530047708333,0.290134188096) + , Qt.point(0.530047769444,0.290134377258) + , Qt.point(0.530047816667,0.290134966997) + , Qt.point(0.530047816667,0.290135261866) + , Qt.point(0.530047775,0.290135668005) + , Qt.point(0.530047833333,0.290136035198) + , Qt.point(0.530047808333,0.290136530352) + , Qt.point(0.530047888889,0.290136992123) + , Qt.point(0.530048022222,0.29013733706) + , Qt.point(0.5300482,0.2901375596) + , Qt.point(0.530048366667,0.290137670869) + , Qt.point(0.530048405556,0.290137882282) + , Qt.point(0.530048388889,0.290138282852) + , Qt.point(0.530048413889,0.290138727928) + , Qt.point(0.530048363889,0.290139083989) + , Qt.point(0.530048402778,0.290139412231) + , Qt.point(0.530048383333,0.290139673712) + , Qt.point(0.530048127778,0.290140447026) + , Qt.point(0.530048141667,0.290140836464) + , Qt.point(0.5300482,0.290141186957) + , Qt.point(0.530048275,0.290141576393) + , Qt.point(0.530048388889,0.290141960264) + , Qt.point(0.530048408333,0.290142527725) + , Qt.point(0.530048313889,0.290143195324) + , Qt.point(0.530048252778,0.290144374743) + , Qt.point(0.530048291667,0.290144914381) + , Qt.point(0.530048583333,0.290146449835) + , Qt.point(0.530048769444,0.290146922708) + , Qt.point(0.530048905556,0.290147406706) + , Qt.point(0.530049033333,0.290148113229) + , Qt.point(0.530049047222,0.290148385824) + , Qt.point(0.530049205556,0.290148697361) + , Qt.point(0.530049255556,0.290149153538) + , Qt.point(0.530049225,0.290149559647) + , Qt.point(0.530049288889,0.290150360735) + , Qt.point(0.530049388889,0.290150672268) + , Qt.point(0.530049438889,0.290151017179) + , Qt.point(0.530049611111,0.29015161799) + , Qt.point(0.530049911111,0.290152140917) + , Qt.point(0.530050058333,0.290152469137) + , Qt.point(0.530050133333,0.29015306438) + , Qt.point(0.530050177778,0.29015585143) + , Qt.point(0.530050097222,0.29016007921) + , Qt.point(0.530049233333,0.29016438477) + , Qt.point(0.530048608333,0.290166498573) + , Qt.point(0.530047116667,0.290174247125) + , Qt.point(0.530048241667,0.290177556708) + , Qt.point(0.530048447222,0.290177629018) + , Qt.point(0.530049225,0.290177918255) + , Qt.point(0.530048741667,0.290178463356) + , Qt.point(0.530047808333,0.29017952018) + , Qt.point(0.530047944444,0.290180198769) + , Qt.point(0.530048133333,0.290180971913) + , Qt.point(0.530048038889,0.290181745053) + , Qt.point(0.530048130556,0.290182618308) + , Qt.point(0.530048205556,0.29018309665) + , Qt.point(0.530048369444,0.290183435938) + , Qt.point(0.530048802778,0.290184142323) + , Qt.point(0.530049475,0.290185015567) + , Qt.point(0.530049811111,0.290185421596) + , Qt.point(0.53005,0.290185616267) + , Qt.point(0.530050144444,0.290186139097) + , Qt.point(0.530050361111,0.290188408385) + , Qt.point(0.530050280556,0.290189309418) + , Qt.point(0.530049730556,0.290189982409) + , Qt.point(0.530045688889,0.290191022481) + , Qt.point(0.530042686111,0.29019249637) + , Qt.point(0.530040666667,0.290194337324) + , Qt.point(0.530038947222,0.290196428536) + , Qt.point(0.530036986111,0.290198953532) + , Qt.point(0.530035575,0.290201595286) + , Qt.point(0.5300349,0.290203992297) + , Qt.point(0.5300341,0.290206394838) + , Qt.point(0.530033483333,0.290208730612) + , Qt.point(0.530033236111,0.290210271094) + , Qt.point(0.530033175,0.290211500134) + , Qt.point(0.530033261111,0.290213407631) + , Qt.point(0.530033825,0.290215476382) + , Qt.point(0.530033955556,0.290215604288) + , Qt.point(0.530033891667,0.290215704388) + , Qt.point(0.530033969444,0.290215826733) + , Qt.point(0.530034169444,0.290216026933) + , Qt.point(0.530034541667,0.290217305984) + , Qt.point(0.530034994444,0.290218423756) + , Qt.point(0.530035194444,0.290218790784) + , Qt.point(0.530035222222,0.290219224543) + , Qt.point(0.530035858333,0.290221398886) + , Qt.point(0.530036097222,0.290221693616) + , Qt.point(0.530036055556,0.290221921615) + , Qt.point(0.530035616667,0.290222377611) + , Qt.point(0.530035702778,0.290222472146) + , Qt.point(0.530035738889,0.290223656617) + , Qt.point(0.530034986111,0.290224596403) + , Qt.point(0.530035013889,0.290224863324) + , Qt.point(0.530035155556,0.290225680766) + , Qt.point(0.530035525,0.290226531569) + , Qt.point(0.530035747222,0.290226915263) + , Qt.point(0.530036155556,0.290226859656) + , Qt.point(0.530036377778,0.290227004236) + , Qt.point(0.530036561111,0.290227026479) + , Qt.point(0.530036591667,0.290227271153) + , Qt.point(0.530036575,0.29022768821) + , Qt.point(0.530036183333,0.290228121949) + , Qt.point(0.530036141667,0.290228861526) + , Qt.point(0.530036175,0.290229139562) + , Qt.point(0.53003625,0.290229662268) + , Qt.point(0.530036141667,0.290229979228) + , Qt.point(0.530036558333,0.290230969027) + , Qt.point(0.530036561111,0.290231469486) + , Qt.point(0.530034683333,0.29023265946) + , Qt.point(0.530034466667,0.290234227544) + , Qt.point(0.530035822222,0.290235573194) + , Qt.point(0.530036788889,0.290235606557) + , Qt.point(0.530037036111,0.290235612118) + , Qt.point(0.530037572222,0.290236590766) + , Qt.point(0.530037511111,0.290237013363) + , Qt.point(0.530036333333,0.29023966013) + , Qt.point(0.530036358333,0.290240043797) + , Qt.point(0.530035883333,0.290241133628) + , Qt.point(0.530035783333,0.290242290178) + , Qt.point(0.530035413889,0.290242940733) + , Qt.point(0.530034430556,0.290244052789) + , Qt.point(0.53003465,0.290244414206) + , Qt.point(0.530034569444,0.290245075874) + , Qt.point(0.53003415,0.290245020272) + , Qt.point(0.5300336,0.290245031392) + , Qt.point(0.530033422222,0.290245337205) + , Qt.point(0.530033708333,0.290245976629) + , Qt.point(0.530033013889,0.290247488999) + , Qt.point(0.530033261111,0.290247633563) + , Qt.point(0.530033630556,0.290247561281) + , Qt.point(0.530034111111,0.290247666923) + , Qt.point(0.530034005556,0.290248489824) + , Qt.point(0.530033613889,0.290249051396) + , Qt.point(0.53003335,0.290249435043) + , Qt.point(0.530033266667,0.290249963252) + , Qt.point(0.53003285,0.290250875103) + , Qt.point(0.53003255,0.290251264307) + , Qt.point(0.530032322222,0.29025171467) + , Qt.point(0.530032344444,0.290252081631) + , Qt.point(0.530032638889,0.290252676552) + , Qt.point(0.530033169444,0.290253026832) + , Qt.point(0.530033361111,0.290253343751) + , Qt.point(0.530033297222,0.29025358839) + , Qt.point(0.530032697222,0.290254316745) + , Qt.point(0.5300328,0.290254956138) + , Qt.point(0.530032683333,0.290255378693) + , Qt.point(0.530032608333,0.29025556217) + , Qt.point(0.530032588889,0.290255723407) + , Qt.point(0.530032713889,0.290255756767) + , Qt.point(0.530033047222,0.290255667808) + , Qt.point(0.530033252778,0.290255673368) + , Qt.point(0.530033311111,0.290255906884) + , Qt.point(0.530033172222,0.290256006963) + , Qt.point(0.530033036111,0.290256296077) + , Qt.point(0.530033166667,0.290256907664) + , Qt.point(0.530033069444,0.290257057781) + , Qt.point(0.530032777778,0.290257124499) + , Qt.point(0.530032558333,0.290257257936) + , Qt.point(0.530032477778,0.290257724964) + , Qt.point(0.530032516667,0.290258103033) + , Qt.point(0.530032661111,0.29025821423) + , Qt.point(0.530033008333,0.290258303187) + , Qt.point(0.530033202778,0.290258642336) + , Qt.point(0.530033355556,0.290259087121) + , Qt.point(0.530033516667,0.290259365111) + , Qt.point(0.530033608333,0.290259909971) + , Qt.point(0.530033819444,0.290260232438) + , Qt.point(0.530033936111,0.290260844012) + , Qt.point(0.530033941667,0.290261511181) + , Qt.point(0.530034011111,0.290261761369) + , Qt.point(0.530034,0.290261844765) + , Qt.point(0.530033891667,0.290262005997) + , Qt.point(0.530033894444,0.290262161669) + , Qt.point(0.530034266667,0.290262834393) + , Qt.point(0.530034561111,0.29026324025) + , Qt.point(0.530034805556,0.290263634987) + , Qt.point(0.530035027778,0.290264057521) + , Qt.point(0.530035247222,0.290264663523) + , Qt.point(0.530035425,0.290265430751) + , Qt.point(0.530035583333,0.290265847722) + , Qt.point(0.530035722222,0.290266387002) + , Qt.point(0.530035761111,0.290267026354) + , Qt.point(0.530035875,0.290267465559) + , Qt.point(0.530036097222,0.290268116025) + , Qt.point(0.530036322222,0.290268577466) + , Qt.point(0.5300365,0.290269016668) + , Qt.point(0.530036947222,0.290269928424) + , Qt.point(0.530037197222,0.29027049549) + , Qt.point(0.530037363889,0.290270951366) + , Qt.point(0.53003755,0.290271290492) + , Qt.point(0.530037841667,0.290271646295) + , Qt.point(0.530038205556,0.290272508004) + , Qt.point(0.530038358333,0.290272997231) + , Qt.point(0.530038433333,0.290273347472) + , Qt.point(0.5300386,0.290273781103) + , Qt.point(0.53003895,0.290274275885) + , Qt.point(0.530039361111,0.290274920768) + , Qt.point(0.530039569444,0.290275532293) + , Qt.point(0.530039625,0.290275615683) + , Qt.point(0.530040136111,0.290276727541) + , Qt.point(0.530040455556,0.290277289027) + , Qt.point(0.530040986111,0.290278400874) + , Qt.point(0.530041344444,0.290278873408) + , Qt.point(0.530041691667,0.290279507156) + , Qt.point(0.530041880556,0.290279735083) + , Qt.point(0.530042080556,0.290279851826) + , Qt.point(0.530042319444,0.290280046397) + , Qt.point(0.530042527778,0.290280474453) + , Qt.point(0.530042630556,0.290280763529) + , Qt.point(0.530042605556,0.290280863593) + , Qt.point(0.530042308333,0.290280924744) + , Qt.point(0.530041991667,0.29028095254) + , Qt.point(0.530041852778,0.290281124873) + , Qt.point(0.530041927778,0.290281502894) + , Qt.point(0.530042105556,0.290281997656) + , Qt.point(0.530042413889,0.290282342321) + , Qt.point(0.530042658333,0.290282425707) + , Qt.point(0.530042838889,0.290282358998) + , Qt.point(0.5300431,0.290282447944) + , Qt.point(0.530043380556,0.290282681426) + , Qt.point(0.530043533333,0.290282720339) + , Qt.point(0.530043713889,0.290282992735) + , Qt.point(0.530043866667,0.290283315161) + , Qt.point(0.530044022222,0.290283581997) + , Qt.point(0.530044325,0.290283954454) + , Qt.point(0.530044475,0.290284254642) + , Qt.point(0.530044508333,0.290284521476) + , Qt.point(0.530044383333,0.290284832782) + , Qt.point(0.530044341667,0.290285027348) + , Qt.point(0.530044452778,0.290285199677) + , Qt.point(0.530044666667,0.290285105174) + , Qt.point(0.530044905556,0.290285372007) + , Qt.point(0.530045213889,0.290285533218) + , Qt.point(0.530045458333,0.290285711106) + , Qt.point(0.53004585,0.290286650575) + , Qt.point(0.53004585,0.290286850698) + , Qt.point(0.530045952778,0.29028721203) + , Qt.point(0.530046094444,0.290287273179) + , Qt.point(0.53004635,0.290287812397) + , Qt.point(0.530046480556,0.290287973606) + , Qt.point(0.530046875,0.290288284906) + , Qt.point(0.53004745,0.290289174331) + , Qt.point(0.530047708333,0.290289446717) + , Qt.point(0.530047908333,0.290289702426) + , Qt.point(0.530048041667,0.290290130459) + , Qt.point(0.5300481,0.290290580727) + , Qt.point(0.530048283333,0.290290958728) + , Qt.point(0.530048816667,0.290291520171) + , Qt.point(0.530049755556,0.290292670844) + , Qt.point(0.530050122222,0.290293204487) + , Qt.point(0.530050361111,0.290293699217) + , Qt.point(0.530050511111,0.290294277327) + , Qt.point(0.530050530556,0.290294627528) + , Qt.point(0.530050725,0.290294833201) + , Qt.point(0.530050838889,0.290295233428) + , Qt.point(0.530051047222,0.290295505805) + , Qt.point(0.530051369444,0.290295594744) + , Qt.point(0.530051688889,0.290295917149) + , Qt.point(0.530051897222,0.290296328492) + , Qt.point(0.530052044444,0.290296889917) + , Qt.point(0.530051966667,0.290297317934) + , Qt.point(0.53005195,0.290297623659) + , Qt.point(0.530051969444,0.290297762625) + , Qt.point(0.530052083333,0.290298073909) + , Qt.point(0.530052625,0.290298702033) + , Qt.point(0.530052930556,0.290298868791) + , Qt.point(0.530053366667,0.290298863232) + , Qt.point(0.530053697222,0.290298768736) + , Qt.point(0.53005395,0.290298618653) + , Qt.point(0.530054219444,0.290298374074) + , Qt.point(0.530054772222,0.290298424102) + , Qt.point(0.530055147222,0.290298507481) + , Qt.point(0.530055580556,0.290298702033) + , Qt.point(0.530055822222,0.290298896584) + , Qt.point(0.530056041667,0.290299013314) + , Qt.point(0.530056255556,0.2902990689) + , Qt.point(0.530056536111,0.290299191189) + , Qt.point(0.530056802778,0.29029950247) + , Qt.point(0.530056897222,0.290299569173) + , Qt.point(0.530057097222,0.290299835985) + , Qt.point(0.530057155556,0.290300002742) + , Qt.point(0.530057338889,0.29030028067) + , Qt.point(0.530057405556,0.290300680886) + , Qt.point(0.530057502778,0.290301120011) + , Qt.point(0.530057641667,0.290301509108) + , Qt.point(0.530057736111,0.290301659188) + , Qt.point(0.530057869444,0.29030224839) + , Qt.point(0.53005795,0.290302459613) + , Qt.point(0.530058119444,0.29030269307) + , Qt.point(0.530058561111,0.290302926526) + , Qt.point(0.530058736111,0.290303071047) + , Qt.point(0.530059069444,0.290303198891) + , Qt.point(0.530059416667,0.290303293385) + , Qt.point(0.530059791667,0.290303232242) + , Qt.point(0.530059916667,0.290303182216) + , Qt.point(0.530060155556,0.290302865383) + , Qt.point(0.530060211111,0.290302659719) + , Qt.point(0.530060369444,0.290302459613) + , Qt.point(0.530060511111,0.29030217613) + , Qt.point(0.53006065,0.290301792593) + , Qt.point(0.530060963889,0.290301325677) + , Qt.point(0.530061113889,0.290300953255) + , Qt.point(0.530061469444,0.290300525247) + , Qt.point(0.530061588889,0.290300113914) + , Qt.point(0.530061511111,0.290299646993) + , Qt.point(0.530061322222,0.290299380181) + , Qt.point(0.530061227778,0.290299124486) + , Qt.point(0.530061247222,0.290298924377) + , Qt.point(0.530061427778,0.290298674239) + , Qt.point(0.530061527778,0.290298412985) + , Qt.point(0.530061591667,0.290297912709) + , Qt.point(0.530061625,0.290297067795) + , Qt.point(0.530061436111,0.290296589749) + , Qt.point(0.530061675,0.290295722594) + , Qt.point(0.530061797222,0.290295433542) + , Qt.point(0.530061805556,0.290295316809) + , Qt.point(0.530061825,0.290295300133) + , Qt.point(0.530061805556,0.29029522787) + , Qt.point(0.530061897222,0.290294305121) + , Qt.point(0.530061933333,0.290293471308) + , Qt.point(0.530062033333,0.290292626373) + , Qt.point(0.530061916667,0.290291942641) + , Qt.point(0.530061947222,0.290291247788) + , Qt.point(0.530061877778,0.290291119935) + , Qt.point(0.530061769444,0.29029075861) + , Qt.point(0.530061763889,0.290290358372) + , Qt.point(0.530061844444,0.290289746897) + , Qt.point(0.530061922222,0.290288840797) + , Qt.point(0.530061994444,0.290288334936) + , Qt.point(0.530062033333,0.290287884663) + , Qt.point(0.530062177778,0.290287401035) + , Qt.point(0.530062191667,0.290286906288) + , Qt.point(0.530062144444,0.290286506042) + , Qt.point(0.530062205556,0.290286128031) + , Qt.point(0.530062305556,0.290285777814) + , Qt.point(0.530062458333,0.290285383125) + , Qt.point(0.530062575,0.290284821664) + , Qt.point(0.530062594444,0.29028461598) + , Qt.point(0.530062780556,0.290284376941) + , Qt.point(0.530063063889,0.290283609792) + , Qt.point(0.530063419444,0.290282553567) + , Qt.point(0.530063775,0.290281875356) + , Qt.point(0.530063875,0.290281525131) + , Qt.point(0.530063913889,0.290281269411) + , Qt.point(0.530063886111,0.290280969217) + , Qt.point(0.530064011111,0.290280652346) + , Qt.point(0.530064102778,0.290280318796) + , Qt.point(0.530064147222,0.290280007483) + , Qt.point(0.530064480556,0.290279318144) + , Qt.point(0.530064711111,0.29027878446) + , Qt.point(0.530064811111,0.290278295249) + , Qt.point(0.530064797222,0.290277894985) + , Qt.point(0.530064758333,0.290277528074) + , Qt.point(0.530064883333,0.290277194519) + , Qt.point(0.530065058333,0.290276866523) + , Qt.point(0.530065286111,0.290276766456) + , Qt.point(0.530065505556,0.290276777574) + , Qt.point(0.530065697222,0.290276766456) + , Qt.point(0.530065930556,0.290276488492) + , Qt.point(0.530066075,0.290276127138) + , Qt.point(0.530066180556,0.290275793581) + , Qt.point(0.530066386111,0.290275493378) + , Qt.point(0.530066327778,0.290274970802) + , Qt.point(0.530066391667,0.290274603886) + , Qt.point(0.530066477778,0.29027432036) + , Qt.point(0.530066766667,0.290273708831) + , Qt.point(0.530066833333,0.2902734531) + , Qt.point(0.530067027778,0.290273280759) + , Qt.point(0.530067683333,0.290273236284) + , Qt.point(0.530067825,0.290272997231) + , Qt.point(0.530067983333,0.290272808212) + , Qt.point(0.530067980556,0.290272558039) + , Qt.point(0.530068247222,0.290272513564) + , Qt.point(0.5300686,0.290272669227) + , Qt.point(0.530068866667,0.290272685905) + , Qt.point(0.530069036111,0.290272241153) + , Qt.point(0.530069036111,0.290271979861) + , Qt.point(0.530069241667,0.290271685211) + , Qt.point(0.530069469444,0.290271423918) + , Qt.point(0.530069405556,0.290270784582) + , Qt.point(0.530069455556,0.290270539966) + , Qt.point(0.530069661111,0.290270417658) + , Qt.point(0.530069755556,0.290270261993) + , Qt.point(0.530070180556,0.29027029535) + , Qt.point(0.530071225,0.290270628917) + , Qt.point(0.530071480556,0.290270662274) + , Qt.point(0.530071752778,0.290270634477) + , Qt.point(0.530071897222,0.290270489931) + , Qt.point(0.530072216667,0.29027007853) + , Qt.point(0.530072311111,0.290270028495) + , Qt.point(0.530072541667,0.290269950662) + , Qt.point(0.530072905556,0.29027007853) + , Qt.point(0.530072930556,0.290270156363) + , Qt.point(0.530073072222,0.290270362063) + , Qt.point(0.530073316667,0.290270456574) + , Qt.point(0.530073522222,0.290270451015) + , Qt.point(0.530073805556,0.290270528847) + , Qt.point(0.53007415,0.290270884652) + , Qt.point(0.530074238889,0.290270912449) + , Qt.point(0.530074533333,0.290270918009) + , Qt.point(0.530074730556,0.290271001401) + , Qt.point(0.530074822222,0.290270979163) + , Qt.point(0.530075113889,0.290271179303) + , Qt.point(0.530075352778,0.290271290492) + , Qt.point(0.530075447222,0.29027150175) + , Qt.point(0.530075222222,0.2902717964) + , Qt.point(0.530075233333,0.290272007658) + , Qt.point(0.530075522222,0.290272313425) + , Qt.point(0.530075811111,0.290272574717) + , Qt.point(0.530076094444,0.290272897162) + , Qt.point(0.530076444444,0.290273164012) + , Qt.point(0.530077233333,0.290274097986) + , Qt.point(0.530077469444,0.290274387072) + , Qt.point(0.530078708333,0.290276532966) + , Qt.point(0.530079744444,0.290279256993) + , Qt.point(0.530081147222,0.290289291068) + , Qt.point(0.530082861111,0.290292815372) + , Qt.point(0.530084525,0.290294544147) + , Qt.point(0.530086480556,0.290296372961) + , Qt.point(0.530087072222,0.290297495811) + , Qt.point(0.530087961111,0.290299063342) + , Qt.point(0.530088997222,0.290300719796) + , Qt.point(0.530089344444,0.290303109956) + , Qt.point(0.530089691667,0.29030819589) + , Qt.point(0.530089477778,0.290312514654) + , Qt.point(0.530089397222,0.290314849079) + , Qt.point(0.530089511111,0.290315577192) + , Qt.point(0.530089622222,0.290317127894) + , Qt.point(0.530089736111,0.290317994948) + , Qt.point(0.530089869444,0.290319223267) + , Qt.point(0.530090086111,0.29032052939) + , Qt.point(0.530090325,0.290321885524) + , Qt.point(0.530090563889,0.290323814108) + , Qt.point(0.530091152778,0.29032657078) + , Qt.point(0.530091505556,0.290327843504) + , Qt.point(0.530092152778,0.290330172176) + , Qt.point(0.530092475,0.290331328165) + , Qt.point(0.530092519444,0.290331767217) + , Qt.point(0.530092486111,0.29033288985) + , Qt.point(0.530092508333,0.290333478952) + , Qt.point(0.530092597222,0.290334345929) + , Qt.point(0.530092597222,0.290334529327) + , Qt.point(0.530092686111,0.290334851663) + , Qt.point(0.530092722222,0.290335224016) + , Qt.point(0.530092838889,0.290336052082) + , Qt.point(0.530092933333,0.290336418876) + , Qt.point(0.530093052778,0.290336691191) + , Qt.point(0.530093091667,0.290336902375) + , Qt.point(0.530093130556,0.290337269166) + , Qt.point(0.530093094444,0.290337824909) + , Qt.point(0.530092877778,0.290339508801) + , Qt.point(0.530092872222,0.290340231258) + , Qt.point(0.530092836111,0.290340420208) + , Qt.point(0.530092797222,0.29034054247) + , Qt.point(0.530092469444,0.290340931483) + , Qt.point(0.530092383333,0.290341370512) + , Qt.point(0.530092227778,0.290341576133) + , Qt.point(0.530092133333,0.290341670607) + , Qt.point(0.530091908333,0.290342142978) + , Qt.point(0.530091697222,0.290342376384) + , Qt.point(0.530091563889,0.290342459743) + , Qt.point(0.530091330556,0.290342659805) + , Qt.point(0.530091275,0.290342859867) + , Qt.point(0.530091352778,0.290343465609) + , Qt.point(0.530091311111,0.290344082463) + , Qt.point(0.530091327778,0.290344271409) + , Qt.point(0.530091411111,0.29034444924) + , Qt.point(0.530091494444,0.290344577056) + , Qt.point(0.530091563889,0.2903446493) + , Qt.point(0.530091605556,0.290344771559) + , Qt.point(0.530091633333,0.290345232807) + , Qt.point(0.530091861111,0.290345649597) + , Qt.point(0.530092055556,0.290345777412) + , Qt.point(0.530092666667,0.290346066385) + , Qt.point(0.530092777778,0.290346149743) + , Qt.point(0.530093027778,0.290346472059) + , Qt.point(0.530093211111,0.290346811045) + , Qt.point(0.530093319444,0.290346961088) + , Qt.point(0.530093897222,0.290347455674) + , Qt.point(0.530094011111,0.290347594602) + , Qt.point(0.530094313889,0.290347866901) + , Qt.point(0.530094597222,0.290348161429) + , Qt.point(0.530095030556,0.290348517083) + , Qt.point(0.530095163889,0.290348661568) + , Qt.point(0.530095447222,0.290349145035) + , Qt.point(0.530095763889,0.290349511802) + , Qt.point(0.530095988889,0.290349728527) + , Qt.point(0.530096738889,0.29035028979) + , Qt.point(0.530096794444,0.290350356475) + , Qt.point(0.530096869444,0.290350406488) + , Qt.point(0.530097077778,0.290350462059) + , Qt.point(0.530097277778,0.290350634327) + , Qt.point(0.530097436111,0.290350845494) + , Qt.point(0.530097494444,0.290350884393) + , Qt.point(0.530097636111,0.290350917735) + , Qt.point(0.530097908333,0.290350895507) + , Qt.point(0.530098019444,0.290350962192) + , Qt.point(0.530098347222,0.290351440095) + , Qt.point(0.530098430556,0.290351529008) + , Qt.point(0.530098808333,0.290352051366) + , Qt.point(0.530098911111,0.290352240304) + , Qt.point(0.530099205556,0.290352634849) + , Qt.point(0.530100316667,0.290355274394) + , Qt.point(0.530100825,0.290356313531) + , Qt.point(0.530101338889,0.290357035922) + , Qt.point(0.530102822222,0.290360697846) + , Qt.point(0.530102947222,0.290362937195) + , Qt.point(0.5301029,0.290365737733) + , Qt.point(0.53010425,0.290369205007) + , Qt.point(0.53010455,0.290373122281) + , Qt.point(0.530104780556,0.290373611239) + , Qt.point(0.530104755556,0.290373722366) + , Qt.point(0.530104544444,0.290374005739) + , Qt.point(0.530104522222,0.290374411351) + , Qt.point(0.530104580556,0.290374955869) + , Qt.point(0.530104602778,0.290375789313) + , Qt.point(0.530104702778,0.290376200477) + , Qt.point(0.530104816667,0.290377045027) + , Qt.point(0.530105088889,0.290377695106) + , Qt.point(0.530105622222,0.290379334183) + , Qt.point(0.530105736111,0.290379789788) + , Qt.point(0.530105769444,0.29038055098) + , Qt.point(0.530105966667,0.290381351062) + , Qt.point(0.53010615,0.29038192334) + , Qt.point(0.530106336111,0.290383751285) + , Qt.point(0.530106483333,0.290386029245) + , Qt.point(0.530106561111,0.290386862638) + , Qt.point(0.530106697222,0.29038780159) + , Qt.point(0.530106791667,0.290388940549) + , Qt.point(0.530106819444,0.290390096168) + , Qt.point(0.530107033333,0.290392346271) + , Qt.point(0.530106894444,0.290393574094) + , Qt.point(0.530106922222,0.290394107444) + , Qt.point(0.530106861111,0.290394446343) + , Qt.point(0.53010675,0.290394685238) + , Qt.point(0.530106677778,0.290395074137) + , Qt.point(0.530106675,0.29039554637) + , Qt.point(0.530106730556,0.290395801932) + , Qt.point(0.5301067,0.2903958686) + , Qt.point(0.530106683333,0.290397257512) + , Qt.point(0.530106477778,0.290398324189) + , Qt.point(0.530106327778,0.290398857526) + , Qt.point(0.53010625,0.290399529749) + , Qt.point(0.530106155556,0.290400113082) + , Qt.point(0.530105980556,0.290400601969) + , Qt.point(0.530105994444,0.290400951967) + , Qt.point(0.530105913889,0.29040170196) + , Qt.point(0.530105911111,0.290402418617) + , Qt.point(0.530105936111,0.290403724148) + , Qt.point(0.530105983333,0.290404324134) + , Qt.point(0.530106027778,0.290404568572) + , Qt.point(0.530105977778,0.290404913007) + , Qt.point(0.530105591667,0.290406501844) + , Qt.point(0.530105480556,0.290407074044) + , Qt.point(0.530105311111,0.29040834621) + , Qt.point(0.530105205556,0.290408779522) + , Qt.point(0.530105094444,0.290409457265) + , Qt.point(0.530105008333,0.290409785025) + , Qt.point(0.530104838889,0.290410040566) + , Qt.point(0.530104777778,0.290410201668) + , Qt.point(0.530104675,0.290410357215) + , Qt.point(0.530104663889,0.290410451654) + , Qt.point(0.530104691667,0.290410551648) + , Qt.point(0.530104902778,0.290410529427) + , Qt.point(0.530105175,0.290410646087) + , Qt.point(0.530105469444,0.290410729415) + , Qt.point(0.530105783333,0.290410773857) + , Qt.point(0.530105916667,0.290410879406) + , Qt.point(0.530106152778,0.290410884961) + , Qt.point(0.530106461111,0.290410746081) + , Qt.point(0.530106669444,0.290410546093) + , Qt.point(0.530106744444,0.290410290552) + , Qt.point(0.530106886111,0.29041001279) + , Qt.point(0.530107094444,0.290409890575) + , Qt.point(0.530107275,0.290409740583) + , Qt.point(0.530107472222,0.290409535039) + , Qt.point(0.530107766667,0.290409351715) + , Qt.point(0.530108144444,0.290409329494) + , Qt.point(0.530108261111,0.290409490597) + , Qt.point(0.530108313889,0.290409651699) + , Qt.point(0.530108472222,0.290409818356) + , Qt.point(0.530108622222,0.290409929461) + , Qt.point(0.530108836111,0.290409940572) + , Qt.point(0.530109030556,0.290410007235) + , Qt.point(0.530109225,0.290410162782) + , Qt.point(0.530109477778,0.29041049054) + , Qt.point(0.5301099,0.290410540537) + , Qt.point(0.530110036111,0.290410534982) + , Qt.point(0.530110275,0.290410462764) + , Qt.point(0.530110388889,0.290410284997) + , Qt.point(0.530110519444,0.290410218334) + , Qt.point(0.530110822222,0.290410334994) + , Qt.point(0.530111219444,0.290410334994) + , Qt.point(0.530111475,0.290410557203) + , Qt.point(0.530111563889,0.290410712749) + , Qt.point(0.530111691667,0.290411229384) + , Qt.point(0.530111838889,0.290411551586) + , Qt.point(0.530112238889,0.290411996001) + , Qt.point(0.530112461111,0.290412212653) + , Qt.point(0.530112655556,0.290412468191) + , Qt.point(0.530113022222,0.290413190361) + , Qt.point(0.530113072222,0.290413240357) + , Qt.point(0.530113230556,0.290413290354) + , Qt.point(0.530113386111,0.290413395901) + , Qt.point(0.530113627778,0.290413495894) + , Qt.point(0.530114061111,0.290413612552) + , Qt.point(0.530114325,0.290413656993) + , Qt.point(0.530114708333,0.290413890308) + , Qt.point(0.530115216667,0.290414156954) + , Qt.point(0.530115552778,0.290414301387) + , Qt.point(0.53011625,0.290414529146) + , Qt.point(0.530116647222,0.29041470691) + , Qt.point(0.530116861111,0.290414879118) + , Qt.point(0.530118111111,0.290415512397) + , Qt.point(0.530118358333,0.290413318129) + , Qt.point(0.530118594444,0.290411934894) + , Qt.point(0.530118744444,0.29041085163) + , Qt.point(0.530118958333,0.290409646144) + , Qt.point(0.530119166667,0.29040924061) + , Qt.point(0.530119227778,0.290408979512) + , Qt.point(0.530119252778,0.29040788512) + , Qt.point(0.530119238889,0.290407424029) + , Qt.point(0.530119311111,0.290406729613) + , Qt.point(0.530119413889,0.290405207443) + , Qt.point(0.530119525,0.290404701902) + , Qt.point(0.530119544444,0.290403863034) + , Qt.point(0.530119452778,0.290403585263) + , Qt.point(0.530119327778,0.290403457488) + , Qt.point(0.530119141667,0.290403418599) + , Qt.point(0.530118944444,0.290403324157) + , Qt.point(0.530118786111,0.290403285269) + , Qt.point(0.5301187,0.290403218603) + , Qt.point(0.530118591667,0.290403079717) + , Qt.point(0.530118530556,0.290402679724) + , Qt.point(0.530118655556,0.290402340841) + , Qt.point(0.5301189,0.290402068622) + , Qt.point(0.530119044444,0.29040198529) + , Qt.point(0.530119236111,0.290401824181) + , Qt.point(0.530119769444,0.290401601961) + , Qt.point(0.530121127778,0.290400785301) + , Qt.point(0.530121911111,0.290400174193) + , Qt.point(0.530121955556,0.29040014086) + , Qt.point(0.530122644444,0.290399601972) + , Qt.point(0.53012355,0.290398985304) + , Qt.point(0.530124008333,0.290398729747) + , Qt.point(0.530125091667,0.290397929741) + , Qt.point(0.530125494444,0.290397385291) + , Qt.point(0.530126383333,0.290396307497) + , Qt.point(0.530127713889,0.290396029714) + , Qt.point(0.530129447222,0.290395113027) + , Qt.point(0.530130463889,0.290394451898) + , Qt.point(0.530131397222,0.290393796323) + , Qt.point(0.530132394444,0.290392940738) + , Qt.point(0.5301333,0.290392235156) + , Qt.point(0.530133880556,0.290391757358) + , Qt.point(0.530134616667,0.29039094621) + , Qt.point(0.530135391667,0.290390029498) + , Qt.point(0.5301362,0.290389118337) + , Qt.point(0.530136883333,0.290388401628) + , Qt.point(0.530137427778,0.290389246122) + , Qt.point(0.530137769444,0.290389701703) + , Qt.point(0.530140358333,0.290392929627) + , Qt.point(0.530140488889,0.290393290751) + , Qt.point(0.530141038889,0.29039434634) + , Qt.point(0.530141763889,0.290395407478) + , Qt.point(0.530142075,0.29039595749) + , Qt.point(0.530142825,0.290397207511) + , Qt.point(0.530143122222,0.290397579738) + , Qt.point(0.53014345,0.290398068632) + , Qt.point(0.530143827778,0.290398729747) + , Qt.point(0.530143966667,0.290399235305) + , Qt.point(0.530144358333,0.290399774194) + , Qt.point(0.530144655556,0.290400235304) + , Qt.point(0.53014495,0.290400618636) + , Qt.point(0.530145302778,0.290400840857) + , Qt.point(0.530145622222,0.290401007522) + , Qt.point(0.530146497222,0.290401374186) + , Qt.point(0.530146680556,0.290401563073) + , Qt.point(0.530146902778,0.290401846403) + , Qt.point(0.530147105556,0.29040221862) + , Qt.point(0.530147955556,0.290403363045) + , Qt.point(0.530148186111,0.290403546375) + , Qt.point(0.530154225,0.29040968503) + , Qt.point(0.530154616667,0.290410968289) + , Qt.point(0.530154905556,0.290411579362) + , Qt.point(0.530155486111,0.290412695952) + , Qt.point(0.53015615,0.290413723654) + , Qt.point(0.530157097222,0.29041500133) + , Qt.point(0.530158213889,0.290416923381) + , Qt.point(0.53015885,0.290417817739) + , Qt.point(0.53015945,0.290418812083) + , Qt.point(0.530160011111,0.290419978624) + , Qt.point(0.530160561111,0.290420739649) + , Qt.point(0.530163,0.290421206262) + , Qt.point(0.530164208333,0.290421372909) + , Qt.point(0.530164616667,0.290421445123) + , Qt.point(0.530164869444,0.290421495117) + , Qt.point(0.530165883333,0.290421761751) + , Qt.point(0.530166552778,0.290421811745) + , Qt.point(0.530168102778,0.290422156148) + , Qt.point(0.530168636111,0.290422200587) + , Qt.point(0.530169061111,0.290422367233) + , Qt.point(0.530169191667,0.290422456111) + , Qt.point(0.530169255556,0.290422533879) + , Qt.point(0.530169441667,0.290422761628) + , Qt.point(0.530169686111,0.290422817177) + , Qt.point(0.530169875,0.290422767183) + , Qt.point(0.530170247222,0.290422828287) + , Qt.point(0.530171122222,0.290423322668) + , Qt.point(0.530171613889,0.290423661513) + , Qt.point(0.530172052778,0.290423878151) + , Qt.point(0.530172780556,0.290424094789) + , Qt.point(0.530173252778,0.290424316982) + , Qt.point(0.530173538889,0.290424589167) + , Qt.point(0.530173833333,0.290424711373) + , Qt.point(0.530174241667,0.290424722482) + , Qt.point(0.530174563889,0.290424622496) + , Qt.point(0.530174894444,0.290424600277) + , Qt.point(0.530175302778,0.290424605831) + , Qt.point(0.530175544444,0.29042463916) + , Qt.point(0.530175883333,0.290424528064) + , Qt.point(0.530176172222,0.290424355865) + , Qt.point(0.530176847222,0.290424000357) + , Qt.point(0.530177036111,0.290423994802) + , Qt.point(0.530177269444,0.290424133673) + , Qt.point(0.530177408333,0.290424294762) + , Qt.point(0.530177586111,0.290424316982) + , Qt.point(0.530177736111,0.290424244769) + , Qt.point(0.530177925,0.290424105899) + , Qt.point(0.530178061111,0.290423933699) + , Qt.point(0.530178280556,0.290423728171) + , Qt.point(0.530178405556,0.290423667068) + , Qt.point(0.530178788889,0.290423733726) + , Qt.point(0.530178922222,0.290423839267) + , Qt.point(0.530179305556,0.290424272543) + , Qt.point(0.530179402778,0.290424355865) + , Qt.point(0.530179583333,0.290424466961) + , Qt.point(0.530179822222,0.290424483626) + , Qt.point(0.530180016667,0.290424522509) + , Qt.point(0.530180561111,0.290425194639) + , Qt.point(0.530180836111,0.290425450159) + , Qt.point(0.530181580556,0.29042624449) + , Qt.point(0.530181802778,0.290426211162) + , Qt.point(0.530182066667,0.290426227826) + , Qt.point(0.530182319444,0.290426277819) + , Qt.point(0.530182755556,0.290426411133) + , Qt.point(0.530182936111,0.290426516673) + , Qt.point(0.530183077778,0.290426633323) + , Qt.point(0.53018325,0.290426922169) + , Qt.point(0.530183383333,0.290427322109) + , Qt.point(0.530183480556,0.290427933127) + , Qt.point(0.530183505556,0.290428510815) + , Qt.point(0.530183583333,0.290428949634) + , Qt.point(0.530183561111,0.290430382734) + , Qt.point(0.530183638889,0.290431038178) + , Qt.point(0.530183861111,0.290432010232) + , Qt.point(0.530183988889,0.290432671225) + , Qt.point(0.530184027778,0.290432993389) + , Qt.point(0.530184119444,0.290433376653) + , Qt.point(0.530184266667,0.290433887669) + , Qt.point(0.530184519444,0.290434370912) + , Qt.point(0.530184975,0.290435359611) + , Qt.point(0.530185194444,0.290435676216) + , Qt.point(0.530185447222,0.290435976157) + , Qt.point(0.530185644444,0.290436176118) + , Qt.point(0.530185830556,0.290436414959) + , Qt.point(0.530185913889,0.290436576038) + , Qt.point(0.530186013889,0.290436814878) + , Qt.point(0.530186280556,0.290437770238) + , Qt.point(0.530186508333,0.290438431211) + , Qt.point(0.530188511111,0.290448301085) + , Qt.point(0.530195166667,0.290453216384) + , Qt.point(0.530198925,0.290456348777) + , Qt.point(0.530198977778,0.290456509839) + , Qt.point(0.530199005556,0.290456609808) + , Qt.point(0.530199169444,0.290456965253) + , Qt.point(0.530199308333,0.290457476204) + , Qt.point(0.530199430556,0.290457709464) + , Qt.point(0.530199694444,0.290458020476) + , Qt.point(0.530199902778,0.290458242628) + , Qt.point(0.530200172222,0.29045843701) + , Qt.point(0.530200952778,0.290458609177) + , Qt.point(0.530201161111,0.290458692484) + , Qt.point(0.530201363889,0.290458892419) + , Qt.point(0.53020205,0.290460036491) + , Qt.point(0.530202366667,0.290460375268) + , Qt.point(0.530202605556,0.290460669615) + , Qt.point(0.530203027778,0.290461091697) + , Qt.point(0.530203180556,0.290461313845) + , Qt.point(0.530203433333,0.290461996948) + , Qt.point(0.530203580556,0.290462335721) + , Qt.point(0.530204205556,0.290463463111) + , Qt.point(0.530204566667,0.290463940722) + , Qt.point(0.530204988889,0.290464729333) + , Qt.point(0.530205197222,0.290465162513) + , Qt.point(0.530205669444,0.290465884476) + , Qt.point(0.530205930556,0.290466151046) + , Qt.point(0.530206180556,0.290466289885) + , Qt.point(0.530206636111,0.290466634204) + , Qt.point(0.530207272222,0.29046719511) + , Qt.point(0.530207319444,0.290467139575) + , Qt.point(0.530207477778,0.290467361715) + , Qt.point(0.530207561111,0.290467517214) + , Qt.point(0.530207625,0.290467722693) + , Qt.point(0.530207705556,0.29046782821) + , Qt.point(0.530207844444,0.290467867084) + , Qt.point(0.530207972222,0.290468055903) + , Qt.point(0.530208275,0.290469072188) + , Qt.point(0.530208402778,0.290469577552) + , Qt.point(0.530208486111,0.290470177323) + , Qt.point(0.530208622222,0.290470799305) + , Qt.point(0.530208686111,0.290471676741) + , Qt.point(0.53020865,0.290472237631) + , Qt.point(0.530208713889,0.29047274854) + , Qt.point(0.530208791667,0.290473115061) + , Qt.point(0.530208791667,0.29047339828) + , Qt.point(0.530208661111,0.290473725926) + , Qt.point(0.530208275,0.290474397876) + , Qt.point(0.530208072222,0.290474942099) + , Qt.point(0.530208125,0.290475286402) + , Qt.point(0.530209011111,0.290477085652) + , Qt.point(0.530209238889,0.290477629866) + , Qt.point(0.530209383333,0.290478057462) + , Qt.point(0.530209486111,0.290478418419) + , Qt.point(0.530209569444,0.290478918204) + , Qt.point(0.530209569444,0.290479490179) + , Qt.point(0.530209425,0.290479690092) + , Qt.point(0.530211413889,0.290480323148) + , Qt.point(0.530216175,0.290480339807) + , Qt.point(0.530217763889,0.290480267617) + , Qt.point(0.530223147222,0.290483393996) + , Qt.point(0.530225813889,0.290484349114) + , Qt.point(0.530229627778,0.29048530978) + , Qt.point(0.530232088889,0.290487447659) + , Qt.point(0.530234644444,0.290489713229) + , Qt.point(0.530234833333,0.290490057505) + , Qt.point(0.530234883333,0.290490090822) + , Qt.point(0.530235536111,0.2904905406) + , Qt.point(0.530236127778,0.290491045905) + , Qt.point(0.530237283333,0.290491762214) + , Qt.point(0.530238422222,0.29049225641) + , Qt.point(0.530238786111,0.29049247852) + , Qt.point(0.530239463889,0.290492861659) + , Qt.point(0.530239536111,0.290492900528) + , Qt.point(0.530240947222,0.290493744542) + , Qt.point(0.530241316667,0.29049394444) + , Qt.point(0.530250108333,0.290500091182) + , Qt.point(0.530250327778,0.290500268863) + , Qt.point(0.530250783333,0.290500735274) + , Qt.point(0.530251697222,0.290501590357) + , Qt.point(0.530252575,0.290502301072) + , Qt.point(0.530253255556,0.290502889631) + , Qt.point(0.530254144444,0.29050355037) + , Qt.point(0.530255022222,0.290504249973) + , Qt.point(0.530255852778,0.290504749688) + , Qt.point(0.530256711111,0.290505249401) + , Qt.point(0.530257794444,0.290505771323) + , Qt.point(0.530258763889,0.290506265481) + , Qt.point(0.530259375,0.290506370975) + , Qt.point(0.530261880556,0.29050685958) + , Qt.point(0.530262591667,0.290507059463) + , Qt.point(0.530263880556,0.290507192718) + , Qt.point(0.530265480556,0.29050741481) + , Qt.point(0.530266719444,0.290507403706) + , Qt.point(0.53026845,0.29050802001) + , Qt.point(0.530269072222,0.290508108846) + , Qt.point(0.530271408333,0.290508547476) + , Qt.point(0.530273308333,0.290508775119) + , Qt.point(0.530274327778,0.290508875059) + , Qt.point(0.530275533333,0.290508913925) + , Qt.point(0.530276825,0.290508941686) + , Qt.point(0.530278697222,0.290508969448) + , Qt.point(0.530279866667,0.290509058284) + , Qt.point(0.530280797222,0.290508969448) + , Qt.point(0.530283080556,0.290508686282) + , Qt.point(0.530284977778,0.290508436431) + , Qt.point(0.530286116667,0.290508375356) + , Qt.point(0.530287419444,0.290508225444) + , Qt.point(0.530288619444,0.290508031115) + , Qt.point(0.530289658333,0.290507792366) + , Qt.point(0.530289825,0.290507759053) + , Qt.point(0.530294202778,0.290506698562) + , Qt.point(0.530296422222,0.290508164369) + , Qt.point(0.530298361111,0.290509446941) + , Qt.point(0.530300975,0.290509613508) + , Qt.point(0.530302513889,0.290509707896) + , Qt.point(0.530303144444,0.290509574642) + , Qt.point(0.530306822222,0.290508797328) + , Qt.point(0.530308183333,0.290508058876) + , Qt.point(0.530308725,0.290507731291) + , Qt.point(0.530309683333,0.290507131643) + , Qt.point(0.530310769444,0.290506348766) + , Qt.point(0.5303119,0.290505782427) + , Qt.point(0.530312991667,0.290505232744) + , Qt.point(0.530313702778,0.290504138925) + , Qt.point(0.530314425,0.290503078414) + , Qt.point(0.530315,0.290502062316) + , Qt.point(0.530315936111,0.290500207785) + , Qt.point(0.530316322222,0.29049966919) + , Qt.point(0.530317711111,0.290497575874) + , Qt.point(0.530318886111,0.290495271532) + , Qt.point(0.530319680556,0.290494160995) + , Qt.point(0.530320783333,0.290492273068) + , Qt.point(0.530322011111,0.290490257406) + , Qt.point(0.530322538889,0.290489385612) + , Qt.point(0.530322186111,0.290492628444) + , Qt.point(0.530322972222,0.290498608654) + , Qt.point(0.530324080556,0.290502550932) + , Qt.point(0.530324197222,0.290503800228) + , Qt.point(0.530324441667,0.290504899602) + , Qt.point(0.530326208333,0.290509430284) + , Qt.point(0.530326505556,0.290509796731) + , Qt.point(0.530326277778,0.290510668429) + , Qt.point(0.530326688889,0.290511551226) + , Qt.point(0.530326627778,0.290512111995) + , Qt.point(0.530326897222,0.290512672762) + , Qt.point(0.530326897222,0.290513461164) + , Qt.point(0.530326833333,0.290514860292) + , Qt.point(0.530326669444,0.290515348874) + , Qt.point(0.530326388889,0.290515504332) + , Qt.point(0.530326241667,0.290515382187) + , Qt.point(0.530326,0.290514527168) + , Qt.point(0.530325644444,0.290513944198) + , Qt.point(0.530325325,0.290513722114) + , Qt.point(0.530324888889,0.290513522238) + , Qt.point(0.530324458333,0.290513094724) + , Qt.point(0.530324055556,0.290512728284) + , Qt.point(0.530323736111,0.290512611689) + , Qt.point(0.530323566667,0.290512867087) + , Qt.point(0.530323675,0.29051355555) + , Qt.point(0.530323611111,0.290513944198) + , Qt.point(0.530323830556,0.290514493855) + , Qt.point(0.530324380556,0.290514777011) + , Qt.point(0.530324952778,0.290515493228) + , Qt.point(0.530325713889,0.290517153285) + , Qt.point(0.530325708333,0.290517897252) + , Qt.point(0.530325425,0.290518707839) + , Qt.point(0.530325366667,0.290519007645) + , Qt.point(0.530325,0.29051965167) + , Qt.point(0.530325166667,0.290520795364) + , Qt.point(0.530325158333,0.290521722528) + , Qt.point(0.530324941667,0.290522316576) + , Qt.point(0.530324822222,0.290522927279) + , Qt.point(0.530324883333,0.290523288147) + , Qt.point(0.530324730556,0.29052351022) + , Qt.point(0.530324358333,0.290524609476) + , Qt.point(0.530323633333,0.290525469999) + , Qt.point(0.530323266667,0.290526208381) + , Qt.point(0.530322669444,0.290526974518) + , Qt.point(0.530322019444,0.290527463068) + , Qt.point(0.530321430556,0.290527529688) + , Qt.point(0.530320647222,0.290527135518) + , Qt.point(0.530320372222,0.290526863484) + , Qt.point(0.530319975,0.290526674726) + , Qt.point(0.530319644444,0.290526874588) + , Qt.point(0.530318361111,0.290527179932) + , Qt.point(0.530317561111,0.290527662929) + , Qt.point(0.530317302778,0.290527762859) + , Qt.point(0.530317025,0.290528018237) + , Qt.point(0.530316772222,0.290528434612) + , Qt.point(0.530316761111,0.290528878744) + , Qt.point(0.530316975,0.290529450564) + , Qt.point(0.530317080556,0.290529961313) + , Qt.point(0.530316794444,0.290530427648) + , Qt.point(0.5303168,0.290530838467) + , Qt.point(0.530316536111,0.290531549069) + , Qt.point(0.530316175,0.290532009849) + , Qt.point(0.530315886111,0.290532509488) + , Qt.point(0.530315738889,0.29053298692) + , Qt.point(0.530315719444,0.290533486557) + , Qt.point(0.530315786111,0.290534080567) + , Qt.point(0.530315547222,0.290534885532) + , Qt.point(0.530314608333,0.290537250443) + , Qt.point(0.530313586111,0.290538116459) + , Qt.point(0.530313283333,0.290538466195) + , Qt.point(0.530312775,0.290538144216) + , Qt.point(0.530312427778,0.290538044291) + , Qt.point(0.530311583333,0.290537328162) + , Qt.point(0.530311319444,0.290537361471) + , Qt.point(0.530310983333,0.290537533564) + , Qt.point(0.530310625,0.290537505807) + , Qt.point(0.530310302778,0.290536928461) + , Qt.point(0.530310075,0.290536328908) + , Qt.point(0.530309911111,0.29053602358) + , Qt.point(0.530309808333,0.290535107591) + , Qt.point(0.530309163889,0.290533636447) + , Qt.point(0.530309030556,0.290532681586) + , Qt.point(0.530308183333,0.290530144516) + , Qt.point(0.530308094444,0.290529239601) + , Qt.point(0.530308436111,0.290528356889) + , Qt.point(0.530308863889,0.290527712894) + , Qt.point(0.530309197222,0.290527296517) + , Qt.point(0.530310155556,0.290526225036) + , Qt.point(0.530310069444,0.290524792684) + , Qt.point(0.530309730556,0.290524626131) + , Qt.point(0.530309708333,0.290524398508) + , Qt.point(0.530310238889,0.290523904398) + , Qt.point(0.530310111111,0.29052274962) + , Qt.point(0.530310588889,0.290521805806) + , Qt.point(0.530310691667,0.290521328345) + , Qt.point(0.530310327778,0.290520911953) + , Qt.point(0.530309225,0.290521272826) + , Qt.point(0.53030885,0.290521472693) + , Qt.point(0.530307813889,0.290522571961) + , Qt.point(0.530307238889,0.290523560186) + , Qt.point(0.530306672222,0.290524431819) + , Qt.point(0.530306544444,0.290524986996) + , Qt.point(0.530305927778,0.290525586586) + , Qt.point(0.530305305556,0.290526152864) + , Qt.point(0.530304416667,0.290527107759) + , Qt.point(0.530303741667,0.290528018237) + , Qt.point(0.530303488889,0.290528745505) + , Qt.point(0.530303144444,0.290530821812) + , Qt.point(0.530302944444,0.290531654549) + , Qt.point(0.530302772222,0.290532664931) + , Qt.point(0.530302694444,0.290532981368) + , Qt.point(0.530302688889,0.290534452517) + , Qt.point(0.530302747222,0.29053517976) + , Qt.point(0.530302586111,0.290535729354) + , Qt.point(0.530302077778,0.290536501003) + , Qt.point(0.530301830556,0.29053680633) + , Qt.point(0.530300994444,0.290538238589) + , Qt.point(0.530300522222,0.290538360719) + , Qt.point(0.5303001,0.290539049087) + , Qt.point(0.530299863889,0.290539570912) + , Qt.point(0.530299955556,0.29053989844) + , Qt.point(0.530299711111,0.290540481328) + , Qt.point(0.530299677778,0.290540980944) + , Qt.point(0.530299483333,0.290541380636) + , Qt.point(0.530299291667,0.290541669302) + , Qt.point(0.530299308333,0.290542085647) + , Qt.point(0.530298663889,0.290542835064) + , Qt.point(0.530297727778,0.290544478221) + , Qt.point(0.530297688889,0.290545172117) + , Qt.point(0.530297369444,0.290546054749) + , Qt.point(0.530296972222,0.290546737537) + , Qt.point(0.530296883333,0.290547936573) + , Qt.point(0.530296419444,0.290548980172) + , Qt.point(0.530295952778,0.290549279928) + , Qt.point(0.530295230556,0.290549329887) + , Qt.point(0.530294511111,0.290549196662) + , Qt.point(0.530294055556,0.290548835845) + , Qt.point(0.530293613889,0.290548741477) + , Qt.point(0.530293022222,0.290548880253) + , Qt.point(0.530292458333,0.290549546377) + , Qt.point(0.530292108333,0.290550234703) + , Qt.point(0.530291775,0.290550784252) + , Qt.point(0.530291522222,0.290551250535) + , Qt.point(0.530291022222,0.290551744571) + , Qt.point(0.530290922222,0.290551938854) + , Qt.point(0.530290344444,0.290552233055) + , Qt.point(0.530289966667,0.29055291582) + , Qt.point(0.530289483333,0.290553309935) + , Qt.point(0.530288441667,0.290553976043) + , Qt.point(0.530287738889,0.290554608844) + , Qt.point(0.530287013889,0.290555019608) + , Qt.point(0.530286111111,0.290555830032) + , Qt.point(0.530284833333,0.290556590495) + , Qt.point(0.530284336111,0.290556590495) + , Qt.point(0.530283638889,0.290556390666) + , Qt.point(0.530282794444,0.290556235243) + , Qt.point(0.530282147222,0.290555985455) + , Qt.point(0.530281202778,0.29055568571) + , Qt.point(0.530280458333,0.290555535837) + , Qt.point(0.530279463889,0.290555280498) + , Qt.point(0.530278369444,0.290555280498) + , Qt.point(0.530276977778,0.290555624651) + , Qt.point(0.530276030556,0.290555968803) + , Qt.point(0.530275316667,0.290556468377) + , Qt.point(0.530274933333,0.290556862485) + , Qt.point(0.530274583333,0.290557362056) + , Qt.point(0.530273686111,0.290558255732) + , Qt.point(0.530273038889,0.290558949576) + , Qt.point(0.530272388889,0.290559499098) + , Qt.point(0.530271591667,0.290560093025) + , Qt.point(0.530270747222,0.290560487125) + , Qt.point(0.530268508333,0.29056093118) + , Qt.point(0.530266716667,0.290561225366) + , Qt.point(0.530265408333,0.290561641666) + , Qt.point(0.530264216667,0.290562063516) + , Qt.point(0.530262633333,0.29056271294) + , Qt.point(0.530261786111,0.29056315699) + , Qt.point(0.530260491667,0.290563750905) + , Qt.point(0.530259644444,0.290564294863) + , Qt.point(0.530258797222,0.290564894325) + , Qt.point(0.530256983333,0.290566315263) + , Qt.point(0.530256213889,0.290566981324) + , Qt.point(0.530255233333,0.290567891604) + , Qt.point(0.530254286111,0.290568885136) + , Qt.point(0.530252172222,0.290567547475) + , Qt.point(0.530251527778,0.290567231097) + , Qt.point(0.530249244444,0.290567186693) + , Qt.point(0.530248547222,0.290568735274) + , Qt.point(0.530248466667,0.290569689948) + , Qt.point(0.530248438889,0.290571355066) + , Qt.point(0.530249680556,0.290571044246) + , Qt.point(0.530250083333,0.290571166354) + , Qt.point(0.530251025,0.290571538228) + , Qt.point(0.530252197222,0.290571943404) + , Qt.point(0.530251113889,0.290574590902) + , Qt.point(0.530250913889,0.290575234733) + , Qt.point(0.530250611111,0.290577277214) + , Qt.point(0.530250555556,0.290578720257) + , Qt.point(0.530250452778,0.290580068937) + , Qt.point(0.53025035,0.290581012453) + , Qt.point(0.5302502,0.290582161315) + , Qt.point(0.530249963889,0.29058362097) + , Qt.point(0.530249494444,0.290585596759) + , Qt.point(0.530249041667,0.290587683523) + , Qt.point(0.530248744444,0.290588926691) + , Qt.point(0.530248672222,0.290589870161) + , Qt.point(0.530248616667,0.290590935721) + , Qt.point(0.530248541667,0.290593144519) + , Qt.point(0.530248625,0.290594409849) + , Qt.point(0.530248722222,0.290595503131) + , Qt.point(0.530248966667,0.290597051474) + , Qt.point(0.530249141667,0.290597928307) + , Qt.point(0.530249361111,0.290599093712) + , Qt.point(0.530249555556,0.290599942788) + , Qt.point(0.530249852778,0.290600986092) + , Qt.point(0.530250280556,0.290603078232) + , Qt.point(0.53025035,0.290603549931) + , Qt.point(0.5302504,0.290604149265) + , Qt.point(0.530250347222,0.290605164798) + , Qt.point(0.530250283333,0.29060565314) + , Qt.point(0.530249975,0.29060679075) + , Qt.point(0.530249552778,0.290607767424) + , Qt.point(0.530249286111,0.290608111478) + , Qt.point(0.530248738889,0.29060890502) + , Qt.point(0.530248438889,0.290609304565) + , Qt.point(0.530248238889,0.290609654165) + , Qt.point(0.530247888889,0.290610048159) + , Qt.point(0.530247605556,0.290610530939) + , Qt.point(0.530247308333,0.290610125848) + , Qt.point(0.530244711111,0.29060734013) + , Qt.point(0.530244188889,0.290606724158) + , Qt.point(0.530243155556,0.290607157003) + , Qt.point(0.530242333333,0.290607539904) + , Qt.point(0.530242030556,0.290607617593) + , Qt.point(0.530241930556,0.290607428918) + , Qt.point(0.530241702778,0.290607079313) + , Qt.point(0.530241447222,0.290606546581) + , Qt.point(0.530241144444,0.290605841817) + , Qt.point(0.530239622222,0.290606618721) + , Qt.point(0.530239358333,0.290606135931) + , Qt.point(0.530239202778,0.290605669788) + , Qt.point(0.530238969444,0.290605159249) + , Qt.point(0.530238366667,0.290604754146) + , Qt.point(0.530237697222,0.290603888444) + , Qt.point(0.530238675,0.290602206972) + , Qt.point(0.530238733333,0.290601979445) + , Qt.point(0.530238733333,0.290601685325) + , Qt.point(0.530238830556,0.290601474445) + , Qt.point(0.530238866667,0.290601102631) + , Qt.point(0.530239033333,0.290600264659) + , Qt.point(0.530239008333,0.290599826249) + , Qt.point(0.530238908333,0.290599371189) + , Qt.point(0.530238566667,0.290598788488) + , Qt.point(0.530238072222,0.290598416668) + , Qt.point(0.530237897222,0.290598316776) + , Qt.point(0.530237302778,0.290598227983) + , Qt.point(0.530237211111,0.290597395548) + , Qt.point(0.530237061111,0.290596724047) + , Qt.point(0.530236558333,0.290595652971) + , Qt.point(0.530235877778,0.290595109106) + , Qt.point(0.530235302778,0.29059488157) + , Qt.point(0.530235058333,0.290594354352) + , Qt.point(0.530234330556,0.290593111221) + , Qt.point(0.530234102778,0.29059211227) + , Qt.point(0.5302346,0.290591324205) + , Qt.point(0.5302347,0.290590097703) + , Qt.point(0.530234561111,0.290589348478) + , Qt.point(0.530234508333,0.290588449405) + , Qt.point(0.530234358333,0.290587661324) + , Qt.point(0.530234605556,0.290585680008) + , Qt.point(0.530234852778,0.290584320269) + , Qt.point(0.530234738889,0.29058379302) + , Qt.point(0.530234716667,0.29058333792) + , Qt.point(0.530234444444,0.290582660818) + , Qt.point(0.530234186111,0.290582133565) + , Qt.point(0.5302341,0.290581711761) + , Qt.point(0.530233425,0.290580446344) + , Qt.point(0.530230575,0.290579547227) + , Qt.point(0.530231305556,0.290579352973) + , Qt.point(0.530231222222,0.29057883681) + , Qt.point(0.5302311,0.290578387248) + , Qt.point(0.530230644444,0.290575584398) + , Qt.point(0.530230622222,0.290575145929) + , Qt.point(0.530230333333,0.290575101527) + , Qt.point(0.530228283333,0.290574984971) + , Qt.point(0.530227102778,0.29057268715) + , Qt.point(0.530226791667,0.290572143217) + , Qt.point(0.530226441667,0.290571810196) + , Qt.point(0.530226355556,0.290571632585) + , Qt.point(0.530225988889,0.290571299563) + , Qt.point(0.530225744444,0.290571022044) + , Qt.point(0.530225605556,0.290570894385) + , Qt.point(0.530225272222,0.290570650168) + , Qt.point(0.530224994444,0.290570472556) + , Qt.point(0.530224627778,0.290570178385) + , Qt.point(0.530224416667,0.290570039625) + , Qt.point(0.530224119444,0.290569939717) + , Qt.point(0.530223772222,0.290569739902) + , Qt.point(0.530223122222,0.290569490133) + , Qt.point(0.530223413889,0.290568940641) + , Qt.point(0.530225075,0.29056555484) + , Qt.point(0.530224380556,0.290565005336) + , Qt.point(0.530224238889,0.290564799965) + , Qt.point(0.530223386111,0.290562590827) + , Qt.point(0.530223072222,0.29056192475) + , Qt.point(0.530222936111,0.290561186511) + , Qt.point(0.530222883333,0.290560537081) + , Qt.point(0.530222869444,0.290559837692) + , Qt.point(0.530222816667,0.290559082793) + , Qt.point(0.530222158333,0.290558327891) + , Qt.point(0.530221841667,0.290557889381) + , Qt.point(0.530220236111,0.290556873586) + , Qt.point(0.530221216667,0.290556029862) + , Qt.point(0.5302219,0.290555402617) + , Qt.point(0.530221744444,0.290554808675) + , Qt.point(0.530220394444,0.290548780334) + , Qt.point(0.530217141667,0.290548808089) + , Qt.point(0.530216877778,0.290548930212) + , Qt.point(0.530216352778,0.290549224418) + , Qt.point(0.530216247222,0.29054934654) + , Qt.point(0.530215916667,0.290549501969) + , Qt.point(0.530215688889,0.290549662949) + , Qt.point(0.530215425,0.290549751765) + , Qt.point(0.530215261111,0.290552044322) + , Qt.point(0.530214841667,0.290552671579) + , Qt.point(0.530215155556,0.290553376546) + , Qt.point(0.530215305556,0.29055352642) + , Qt.point(0.530215380556,0.290553776211) + , Qt.point(0.530215625,0.290554320198) + , Qt.point(0.530216077778,0.290554986303) + , Qt.point(0.530216355556,0.29055535821) + , Qt.point(0.530216530556,0.290555724566) + , Qt.point(0.530216922222,0.290556679308) + , Qt.point(0.530215941667,0.290558128064) + , Qt.point(0.530215541667,0.29056093118) + , Qt.point(0.530215397222,0.290562613029) + , Qt.point(0.530215497222,0.290563201395) + , Qt.point(0.530212594444,0.290564250458) + , Qt.point(0.530212255556,0.290563268003) + , Qt.point(0.530211405556,0.290561641666) + , Qt.point(0.530210908333,0.290559660069) + , Qt.point(0.530210811111,0.290559449142) + , Qt.point(0.530210719444,0.290559010634) + , Qt.point(0.530210675,0.290558622082) + , Qt.point(0.530210597222,0.290558178021) + , Qt.point(0.530210613889,0.290558039252) + , Qt.point(0.530210616667,0.290557356506) + , Qt.point(0.530210680556,0.290556618249) + , Qt.point(0.530210102778,0.290556207488) + , Qt.point(0.530209522222,0.290555996557) + , Qt.point(0.530209052778,0.290555746769) + , Qt.point(0.530208883333,0.290555519185) + , Qt.point(0.530208330556,0.290554597742) + , Qt.point(0.530208041667,0.290554703209) + , Qt.point(0.530206930556,0.290555297151) + , Qt.point(0.530205469444,0.290552055424) + , Qt.point(0.530206625,0.29055139486) + , Qt.point(0.53020855,0.29055043454) + , Qt.point(0.530210638889,0.290548780334) + , Qt.point(0.530210591667,0.290548580496) + , Qt.point(0.530210591667,0.290547986532) + , Qt.point(0.530210752778,0.290543201445) + , Qt.point(0.530210655556,0.29054250199) + , Qt.point(0.530210313889,0.290539515399) + , Qt.point(0.530209383333,0.290533730823) + , Qt.point(0.530209186111,0.290533181223) + , Qt.point(0.530209086111,0.290532581658) + , Qt.point(0.530208838889,0.290531887714) + , Qt.point(0.530208594444,0.290530938395) + , Qt.point(0.530208247222,0.290529889142) + , Qt.point(0.53020815,0.290529295118) + , Qt.point(0.530207952778,0.29052859561) + , Qt.point(0.530207755556,0.290527746204) + , Qt.point(0.530207608333,0.290527252104) + , Qt.point(0.530207458333,0.290527146621) + , Qt.point(0.530193277778,0.29052796272) + , Qt.point(0.530192769444,0.290533147914) + , Qt.point(0.530192413889,0.290536084646) + , Qt.point(0.530191558333,0.290540120493) + , Qt.point(0.530191358333,0.290541413944) + , Qt.point(0.530191055556,0.290542357658) + , Qt.point(0.530190655556,0.290543506762) + , Qt.point(0.530190205556,0.290544650307) + , Qt.point(0.530189805556,0.290545893766) + , Qt.point(0.530189002778,0.290548086452) + , Qt.point(0.530188702778,0.290549279928) + , Qt.point(0.530188352778,0.290550523356) + , Qt.point(0.530188302778,0.290550873068) + , Qt.point(0.530189494444,0.290551822284) + , Qt.point(0.53019535,0.290556868035) + , Qt.point(0.5301957,0.290556868035) + , Qt.point(0.530196297222,0.290556723714) + , Qt.point(0.530200166667,0.290555963252) + , Qt.point(0.530200858333,0.29055548588) + , Qt.point(0.530201647222,0.290555091769) + , Qt.point(0.530202583333,0.290555069566) + , Qt.point(0.530203383333,0.29055452003) + , Qt.point(0.530204916667,0.290555768973) + , Qt.point(0.530205175,0.290556068718) + , Qt.point(0.530205497222,0.290556407318) + , Qt.point(0.530206013889,0.290556823629) + , Qt.point(0.530205344444,0.290558083658) + , Qt.point(0.530204938889,0.290558799706) + , Qt.point(0.530204597222,0.290558605429) + , Qt.point(0.530204177778,0.290558427805) + , Qt.point(0.530203847222,0.290558477762) + , Qt.point(0.530203497222,0.290558721995) + , Qt.point(0.530203391667,0.290558932923) + , Qt.point(0.530203338889,0.290559127199) + , Qt.point(0.530203336111,0.290559338127) + , Qt.point(0.530202777778,0.290558705343) + , Qt.point(0.530202252778,0.290559193808) + , Qt.point(0.530201658333,0.290559576808) + , Qt.point(0.530200677778,0.29056029285) + , Qt.point(0.530200325,0.290560625892) + , Qt.point(0.5302001,0.290560764659) + , Qt.point(0.530199644444,0.290561131004) + , Qt.point(0.530199169444,0.290561464045) + , Qt.point(0.530197680556,0.290562685187) + , Qt.point(0.530197452778,0.290562829504) + , Qt.point(0.530195608333,0.290564244908) + , Qt.point(0.530194502778,0.290566553935) + , Qt.point(0.530194133333,0.290567514172) + , Qt.point(0.530193841667,0.290568130274) + , Qt.point(0.530193675,0.290568407797) + , Qt.point(0.530193516667,0.290568862934) + , Qt.point(0.530193133333,0.290569034998) + , Qt.point(0.530192641667,0.290569406877) + , Qt.point(0.530190433333,0.29057096099) + , Qt.point(0.530190663889,0.290569945268) + , Qt.point(0.530188677778,0.290567258849) + , Qt.point(0.530186688889,0.290565488234) + , Qt.point(0.530186563889,0.290566465127) + , Qt.point(0.5301868,0.290570422602) + , Qt.point(0.530185802778,0.290570783378) + , Qt.point(0.530186316667,0.29057562325) + , Qt.point(0.530185875,0.29057716621) + , Qt.point(0.530185675,0.290579741481) + , Qt.point(0.530184347222,0.290579758131) + , Qt.point(0.530183316667,0.290579763681) + , Qt.point(0.530183002778,0.290579769232) + , Qt.point(0.530182913889,0.290579508376) + , Qt.point(0.530182705556,0.290579280821) + , Qt.point(0.530182319444,0.290579785882) + , Qt.point(0.5301812,0.290579852483) + , Qt.point(0.530180397222,0.290579641579) + , Qt.point(0.530179086111,0.290579619378) + , Qt.point(0.530178908333,0.290580635047) + , Qt.point(0.530178366667,0.290580302042) + , Qt.point(0.530177547222,0.290580074488) + , Qt.point(0.530176688889,0.290580068937) + , Qt.point(0.530175691667,0.29058020769) + , Qt.point(0.5301748,0.290580590647) + , Qt.point(0.530174641667,0.290580873701) + , Qt.point(0.530174588889,0.290581117904) + , Qt.point(0.530174711111,0.290581434258) + , Qt.point(0.530174272222,0.290581767262) + , Qt.point(0.530173430556,0.290582655268) + , Qt.point(0.530172608333,0.29058316032) + , Qt.point(0.530171191667,0.29058378747) + , Qt.point(0.530170755556,0.29058377082) + , Qt.point(0.530171013889,0.290585241562) + , Qt.point(0.530170313889,0.290585557909) + , Qt.point(0.530170119444,0.290585868705) + , Qt.point(0.530169858333,0.290585996354) + , Qt.point(0.530168897222,0.290585258212) + , Qt.point(0.530168688889,0.290584570017) + , Qt.point(0.530168269444,0.290584203719) + , Qt.point(0.530168130556,0.29058388737) + , Qt.point(0.530167502778,0.29058360432) + , Qt.point(0.530166977778,0.29058360432) + , Qt.point(0.530166647222,0.29058339342) + , Qt.point(0.5301664,0.29058369312) + , Qt.point(0.530165841667,0.29058379302) + , Qt.point(0.530166011111,0.290585685558) + , Qt.point(0.530166063889,0.290586579095) + , Qt.point(0.530166513889,0.290588488254) + , Qt.point(0.530166677778,0.290588671399) + , Qt.point(0.530167525,0.290589037688) + , Qt.point(0.530168266667,0.29058960932) + , Qt.point(0.530168619444,0.290590086604) + , Qt.point(0.530169047222,0.290590341894) + , Qt.point(0.530169475,0.290590497289) + , Qt.point(0.530169961111,0.290590491739) + , Qt.point(0.530170011111,0.290590941271) + , Qt.point(0.530170005556,0.290592434155) + , Qt.point(0.530170280556,0.290592667244) + , Qt.point(0.530169858333,0.290593660642) + , Qt.point(0.530169752778,0.290594010272) + , Qt.point(0.530169630556,0.290594326604) + , Qt.point(0.530169355556,0.290594870471) + , Qt.point(0.530169155556,0.29059536994) + , Qt.point(0.530169005556,0.29059566962) + , Qt.point(0.530168822222,0.290596180186) + , Qt.point(0.530168555556,0.290596812841) + , Qt.point(0.530168436111,0.290597040374) + , Qt.point(0.530168783333,0.290597550936) + , Qt.point(0.530168958333,0.290597845064) + , Qt.point(0.530169516667,0.290598583155) + , Qt.point(0.530170580556,0.29059958207) + , Qt.point(0.530171522222,0.290599759655) + , Qt.point(0.530173122222,0.290600508837) + , Qt.point(0.530175016667,0.290600558782) + , Qt.point(0.530175191667,0.290601185873) + , Qt.point(0.530176236111,0.290605386772) + , Qt.point(0.530174813889,0.290606668665) + , Qt.point(0.530173638889,0.29060764534) + , Qt.point(0.530173083333,0.29060817252) + , Qt.point(0.530172727778,0.290608483278) + , Qt.point(0.530172252778,0.290608549869) + , Qt.point(0.530172577778,0.290611862738) + , Qt.point(0.530172666667,0.29061230112) + , Qt.point(0.530172672222,0.290612844934) + , Qt.point(0.530172747222,0.290613089095) + , Qt.point(0.530172902778,0.290615031273) + , Qt.point(0.530174413889,0.290615541785) + , Qt.point(0.530175302778,0.290616440726) + , Qt.point(0.530176344444,0.290618366221) + , Qt.point(0.530176825,0.290625895991) + , Qt.point(0.530175791667,0.290626650615) + , Qt.point(0.530176158333,0.290626772686) + , Qt.point(0.530176386111,0.290626983537) + , Qt.point(0.53017575,0.290627227679) + , Qt.point(0.530172811111,0.290628570455) + , Qt.point(0.530173419444,0.290628992151) + , Qt.point(0.530173875,0.290629169707) + , Qt.point(0.530173433333,0.290631738701) + , Qt.point(0.530173116667,0.290631616633) + , Qt.point(0.530171683333,0.290631844124) + , Qt.point(0.530171216667,0.290629619145) + , Qt.point(0.530169502778,0.290629963158) + , Qt.point(0.530169952778,0.290632171487) + , Qt.point(0.530166772222,0.290632848407) + , Qt.point(0.530165913889,0.290633386612) + , Qt.point(0.530165458333,0.290633963655) + , Qt.point(0.530165244444,0.290634807021) + , Qt.point(0.530165383333,0.2906355949) + , Qt.point(0.530165783333,0.290636432711) + , Qt.point(0.530165330556,0.290637009744) + , Qt.point(0.530164927778,0.290636748969) + , Qt.point(0.530162097222,0.290635655933) + , Qt.point(0.530157727778,0.290635156573) + , Qt.point(0.53015825,0.290637203937) + , Qt.point(0.530159205556,0.290640200038) + , Qt.point(0.530159341667,0.290641903355) + , Qt.point(0.530160019444,0.290644250245) + , Qt.point(0.530157572222,0.290644228052) + , Qt.point(0.530157463889,0.290645082468) + , Qt.point(0.530157341667,0.290645293298) + , Qt.point(0.530156994444,0.290645204527) + , Qt.point(0.530156713889,0.290645309942) + , Qt.point(0.530156641667,0.29064555406) + , Qt.point(0.530156677778,0.29064582037) + , Qt.point(0.530156172222,0.290645359875) + , Qt.point(0.530153061111,0.290644216956) + , Qt.point(0.530151261111,0.290644194763) + , Qt.point(0.530151066667,0.290645509675) + , Qt.point(0.530151327778,0.290646541624) + , Qt.point(0.530149144444,0.290644749579) + , Qt.point(0.530148186111,0.290644222504) + , Qt.point(0.530142380556,0.290644228052) + , Qt.point(0.530135519444,0.290640227779) + , Qt.point(0.530135327778,0.290640349842) + , Qt.point(0.530134552778,0.29064035539) + , Qt.point(0.530133102778,0.290640261069) + , Qt.point(0.530131425,0.290640416421) + , Qt.point(0.530131002778,0.290641220921) + , Qt.point(0.530130216667,0.290641060021) + , Qt.point(0.530129708333,0.290641620395) + , Qt.point(0.530128836111,0.29064420586) + , Qt.point(0.530129025,0.2906457316) + , Qt.point(0.530128711111,0.290645870303) + , Qt.point(0.530128586111,0.290647390481) + , Qt.point(0.530131583333,0.290648455708) + , Qt.point(0.530132783333,0.290652061899) + , Qt.point(0.530133136111,0.290659573645) + , Qt.point(0.530132119444,0.290661426569) + , Qt.point(0.530131422222,0.290669581433) + , Qt.point(0.530131647222,0.290672105484) + , Qt.point(0.530133041667,0.290673137284) + , Qt.point(0.530129983333,0.290674096964) + , Qt.point(0.530121902778,0.290677741482) + , Qt.point(0.530116322222,0.29068028761) + , Qt.point(0.530116269444,0.290680809034) + , Qt.point(0.530116144444,0.290682733856) + , Qt.point(0.530115669444,0.290683909817) + , Qt.point(0.530115197222,0.290684275917) + , Qt.point(0.530114863889,0.290684730767) + , Qt.point(0.530114688889,0.290685374212) + , Qt.point(0.530114669444,0.29068607867) + , Qt.point(0.530114130556,0.290685673746) + , Qt.point(0.530112905556,0.290686966173) + , Qt.point(0.530110522222,0.290690394112) + , Qt.point(0.530114536111,0.290692535155) + , Qt.point(0.530114580556,0.290692773663) + , Qt.point(0.530114430556,0.290693522467) + , Qt.point(0.530113830556,0.290695840965) + , Qt.point(0.530110094444,0.290696184854) + , Qt.point(0.530109341667,0.290698558784) + , Qt.point(0.530108552778,0.290698176073) + , Qt.point(0.53010775,0.290697948665) + , Qt.point(0.530106891667,0.290698070689) + , Qt.point(0.530105397222,0.290698719633) + , Qt.point(0.530098344444,0.290701897764) + , Qt.point(0.530094369444,0.290703633788) + , Qt.point(0.530087380556,0.2907035395) + , Qt.point(0.530086647222,0.290702518963) + , Qt.point(0.530085986111,0.290701642628) + , Qt.point(0.530085075,0.290702114075) + , Qt.point(0.530084763889,0.290700588803) + , Qt.point(0.530084052778,0.290697649151) + , Qt.point(0.530082888889,0.290693062092) + , Qt.point(0.530083052778,0.290690366378) + , Qt.point(0.530082913889,0.290690089039) + , Qt.point(0.530082741667,0.290688352887) + , Qt.point(0.530083177778,0.290687565235) + , Qt.point(0.530083633333,0.290686694376) + , Qt.point(0.530083986111,0.290686100858) + , Qt.point(0.530084319444,0.2906853964) + , Qt.point(0.530084422222,0.290685046943) + , Qt.point(0.530084880556,0.290683438324) + , Qt.point(0.530085161111,0.290682284548) + , Qt.point(0.530085375,0.290681108576) + , Qt.point(0.530085552778,0.290679150455) + , Qt.point(0.530085833333,0.290677924538) + , Qt.point(0.530086061111,0.290677048086) + , Qt.point(0.530086447222,0.290676227102) + , Qt.point(0.530086780556,0.290675722306) + , Qt.point(0.530087411111,0.290674951241) + , Qt.point(0.530086625,0.290674845843) + , Qt.point(0.5300861,0.29067491241) + , Qt.point(0.530084963889,0.290675999667) + , Qt.point(0.530083955556,0.290672760068) + , Qt.point(0.530084027778,0.290670729742) + , Qt.point(0.530081458333,0.290670757479) + , Qt.point(0.530073963889,0.290670779668) + , Qt.point(0.530073913889,0.290668821437) + , Qt.point(0.530072658333,0.290666718951) + , Qt.point(0.530072222222,0.290666630191) + , Qt.point(0.53007135,0.290666386101) + , Qt.point(0.530069480556,0.290665382001) + , Qt.point(0.530067575,0.290666375006) + , Qt.point(0.530066213889,0.290665409738) + , Qt.point(0.530064013889,0.2906637954) + , Qt.point(0.530065463889,0.290663079761) + , Qt.point(0.530066236111,0.290661315616) + , Qt.point(0.530066613889,0.29065917421) + , Qt.point(0.530066491667,0.290658314312) + , Qt.point(0.530066566667,0.290652993949) + , Qt.point(0.530065325,0.290654952349) + , Qt.point(0.530064436111,0.290653637505) + , Qt.point(0.530063719444,0.290652816416) + , Qt.point(0.530062444444,0.290652078543) + , Qt.point(0.530062341667,0.290652372583) + , Qt.point(0.530052891667,0.290648666533) + , Qt.point(0.530050211111,0.290640765963) + , Qt.point(0.530048275,0.290636737873) + , Qt.point(0.530047286111,0.290633164672) + , Qt.point(0.530045586111,0.290622305933) + , Qt.point(0.530043861111,0.290619797844) + , Qt.point(0.530042338889,0.290620025349) + , Qt.point(0.530042458333,0.290621950807) + , Qt.point(0.5300423,0.290623332463) + , Qt.point(0.530041947222,0.29062533002) + , Qt.point(0.530041894444,0.290625712883) + , Qt.point(0.530041769444,0.290626994634) + , Qt.point(0.530041452778,0.29062842619) + , Qt.point(0.530041433333,0.290630579052) + , Qt.point(0.530041275,0.290632260264) + , Qt.point(0.530040572222,0.29063390817) + , Qt.point(0.530040222222,0.290634080173) + , Qt.point(0.530040341667,0.29063698755) + , Qt.point(0.530040216667,0.290639156957) + , Qt.point(0.530040230556,0.290641331886) + , Qt.point(0.530040402778,0.290642591335) + , Qt.point(0.530040155556,0.290644899379) + , Qt.point(0.530040080556,0.29064878859) + , Qt.point(0.530039411111,0.290652394775) + , Qt.point(0.530039580556,0.29065517981) + , Qt.point(0.530039472222,0.290656283827) + , Qt.point(0.530040027778,0.29065898004) + , Qt.point(0.530040583333,0.29066226981) + , Qt.point(0.530041819444,0.290665337621) + , Qt.point(0.530041922222,0.290666541431) + , Qt.point(0.530042236111,0.29066857735) + , Qt.point(0.530042197222,0.290671062584) + , Qt.point(0.530041808333,0.290672970865) + , Qt.point(0.530041897222,0.290673947188) + , Qt.point(0.530041966667,0.290674385421) + , Qt.point(0.530042191667,0.290674895769) + , Qt.point(0.530042069444,0.290675400567) + , Qt.point(0.530041741667,0.29067503445) + , Qt.point(0.530041491667,0.290674585123) + , Qt.point(0.530041247222,0.290674296665) + , Qt.point(0.530041091667,0.290673930546) + , Qt.point(0.530041075,0.290673281514) + , Qt.point(0.530041116667,0.290673142831) + , Qt.point(0.530038997222,0.290672893203) + , Qt.point(0.530038958333,0.290673287061) + , Qt.point(0.530038311111,0.290675994119) + , Qt.point(0.530038047222,0.290676798463) + , Qt.point(0.530037322222,0.290678412687) + , Qt.point(0.5300355,0.29068141921) + , Qt.point(0.530035222222,0.29068166328) + , Qt.point(0.530034697222,0.290682206889) + , Qt.point(0.530034311111,0.290682556351) + , Qt.point(0.530033488889,0.290682767138) + , Qt.point(0.530032336111,0.290683011206) + , Qt.point(0.530031411111,0.290682900266) + , Qt.point(0.530030552778,0.290683144334) + , Qt.point(0.530029575,0.290683355119) + , Qt.point(0.530026777778,0.29068372122) + , Qt.point(0.530024944444,0.290683893176) + , Qt.point(0.530022811111,0.290684503342) + , Qt.point(0.530022491667,0.290684919363) + , Qt.point(0.530021130556,0.290686056483) + , Qt.point(0.530019363889,0.290687210235) + , Qt.point(0.530017127778,0.290688430543) + , Qt.point(0.530016163889,0.290688713431) + , Qt.point(0.530015063889,0.290688990773) + , Qt.point(0.530011863889,0.290689894902) + , Qt.point(0.530011794444,0.290689334675) + , Qt.point(0.530011258333,0.290685191163) + , Qt.point(0.530011730556,0.290684697486) + , Qt.point(0.530011716667,0.290683177616) + , Qt.point(0.530011808333,0.290682367753) + , Qt.point(0.530011163889,0.290681319364) + , Qt.point(0.530010358333,0.290679655241) + , Qt.point(0.530006580556,0.290681385928) + , Qt.point(0.530006108333,0.290681141858) + , Qt.point(0.530004744444,0.29068196282) + , Qt.point(0.530004302778,0.290681014276) + , Qt.point(0.530003263889,0.290677774765) + , Qt.point(0.530002325,0.290674990072) + , Qt.point(0.530001975,0.290674285571) + , Qt.point(0.530001430556,0.2906726935) + , Qt.point(0.530001280556,0.290672344019) + , Qt.point(0.530001180556,0.290671944612) + , Qt.point(0.530000388889,0.290670435731) + , Qt.point(0.529999447222,0.290668710489) + , Qt.point(0.5299988,0.290667662022) + , Qt.point(0.529998405556,0.290667112822) + , Qt.point(0.529997958333,0.290666813258) + , Qt.point(0.529997511111,0.290666563621) + , Qt.point(0.529997163889,0.290666114273) + , Qt.point(0.529996866667,0.290665670472) + , Qt.point(0.529996666667,0.290665221122) + , Qt.point(0.529996519444,0.290664771772) + , Qt.point(0.529996369444,0.290664522132) + , Qt.point(0.529996027778,0.290664217016) + , Qt.point(0.52999545,0.290664289134) + , Qt.point(0.529994875,0.290664777319) + , Qt.point(0.529992205556,0.290662402953) + , Qt.point(0.529992294444,0.290662175501) + , Qt.point(0.529992894444,0.29065963467) + , Qt.point(0.529993325,0.290657981447) + , Qt.point(0.529993905556,0.290655917671) + , Qt.point(0.529993991667,0.290655373984) + , Qt.point(0.529995741667,0.290655745689) + , Qt.point(0.529995722222,0.29065620061) + , Qt.point(0.529997452778,0.290656483547) + , Qt.point(0.529998,0.290652333747) + , Qt.point(0.529997266667,0.290651595872) + , Qt.point(0.529996811111,0.29065162916) + , Qt.point(0.529995522222,0.290649753945) + , Qt.point(0.529995808333,0.290648211594) + , Qt.point(0.529995844444,0.290646092227) + , Qt.point(0.529995747222,0.290644006125) + , Qt.point(0.52999555,0.290642308376) + , Qt.point(0.529995397222,0.290640488549) + , Qt.point(0.529995086111,0.290638274771) + , Qt.point(0.529994897222,0.290636305097) + , Qt.point(0.529994847222,0.290634130109) + , Qt.point(0.529994966667,0.29063204942) + , Qt.point(0.529994991667,0.290630246137) + , Qt.point(0.529994969444,0.29062955811) + , Qt.point(0.529995069444,0.290628714719) + , Qt.point(0.529995136111,0.290626656164) + , Qt.point(0.529995136111,0.290625185753) + , Qt.point(0.529995188889,0.290623571062) + , Qt.point(0.529994927778,0.290621640072) + , Qt.point(0.529995080556,0.290619697964) + , Qt.point(0.529995427778,0.290618704707) + , Qt.point(0.529995827778,0.290617655954) + , Qt.point(0.529996077778,0.290616263158) + , Qt.point(0.529996627778,0.290614720526) + , Qt.point(0.529997177778,0.29061361626) + , Qt.point(0.529997388889,0.290613016957) + , Qt.point(0.529997575,0.290612084704) + , Qt.point(0.529997825,0.290610392209) + , Qt.point(0.529997977778,0.29060810038) + , Qt.point(0.529997938889,0.290607118158) + , Qt.point(0.529995144444,0.290605525505) + , Qt.point(0.5299931,0.290604310197) + , Qt.point(0.529993366667,0.290601213621) + , Qt.point(0.529993386111,0.290599565422) + , Qt.point(0.529993508333,0.290597956055) + , Qt.point(0.529993441667,0.290595436535) + , Qt.point(0.529993513889,0.290593055724) + , Qt.point(0.529993608333,0.29058736163) + , Qt.point(0.529994047222,0.290585419161) + , Qt.point(0.529994205556,0.290584420168) + , Qt.point(0.529995430556,0.29058355992) + , Qt.point(0.529996183333,0.290582949419) + , Qt.point(0.529996727778,0.290581950413) + , Qt.point(0.529997341667,0.290578015387) + , Qt.point(0.52999465,0.290577521422) + , Qt.point(0.529993830556,0.290574418844) + , Qt.point(0.529996630556,0.290574069176) + , Qt.point(0.529995811111,0.29057268715) + , Qt.point(0.529993430556,0.290572892512) + , Qt.point(0.529993238889,0.290571754692) + , Qt.point(0.529993833333,0.29057203776) + , Qt.point(0.529994497222,0.290572209821) + , Qt.point(0.529995197222,0.290572143217) + , Qt.point(0.529995916667,0.290571915653) + , Qt.point(0.529996475,0.290571638135) + , Qt.point(0.529997052778,0.290571060897) + , Qt.point(0.529996108333,0.290570267191) + , Qt.point(0.529992719444,0.29056693692) + , Qt.point(0.529990361111,0.290564428077) + , Qt.point(0.529989977778,0.290562907212) + , Qt.point(0.52998725,0.290562674086) + , Qt.point(0.529985327778,0.2905610977) + , Qt.point(0.529984577778,0.290560392763) + , Qt.point(0.529983966667,0.290559626765) + , Qt.point(0.529983213889,0.290559149402) + , Qt.point(0.529982847222,0.290559166054) + , Qt.point(0.529982638889,0.290559465794) + , Qt.point(0.529982391667,0.290559987562) + , Qt.point(0.529982216667,0.290560692501) + , Qt.point(0.529981830556,0.290561441842) + , Qt.point(0.529981533333,0.290561969155) + , Qt.point(0.529981305556,0.290562474263) + , Qt.point(0.529981811111,0.290563179193) + , Qt.point(0.529982005556,0.290563650994) + , Qt.point(0.529982161111,0.29056436702) + , Qt.point(0.529982211111,0.290564966482) + , Qt.point(0.529982125,0.290565527088) + , Qt.point(0.529982125,0.290565910075) + , Qt.point(0.529982052778,0.290567064582) + , Qt.point(0.529981861111,0.290568047017) + , Qt.point(0.529981455556,0.290569429079) + , Qt.point(0.52998135,0.290569917515) + , Qt.point(0.529980930556,0.290570339346) + , Qt.point(0.529980458333,0.290570689021) + , Qt.point(0.529980016667,0.29057096654) + , Qt.point(0.529978797222,0.290571232958) + , Qt.point(0.529978377778,0.290571127501) + , Qt.point(0.529977836111,0.290570861083) + , Qt.point(0.529977430556,0.290570516959) + , Qt.point(0.529975702778,0.290569351373) + , Qt.point(0.529975144444,0.29056931807) + , Qt.point(0.529974830556,0.290569456831) + , Qt.point(0.529974602778,0.290569667747) + , Qt.point(0.529974338889,0.290570544711) + , Qt.point(0.529974269444,0.290570983191) + , Qt.point(0.529974147222,0.290571382818) + , Qt.point(0.529973761111,0.290571998908) + , Qt.point(0.52997305,0.290572653848) + , Qt.point(0.529972575,0.29057321443) + , Qt.point(0.529972955556,0.290571960056) + , Qt.point(0.529973186111,0.290570067377) + , Qt.point(0.529973275,0.29056856321) + , Qt.point(0.529973486111,0.290567475318) + , Qt.point(0.529973975,0.290566182051) + , Qt.point(0.529973925,0.290564955381) + , Qt.point(0.529973802778,0.290564378122) + , Qt.point(0.529973577778,0.290563484476) + , Qt.point(0.529972388889,0.290563534432) + , Qt.point(0.529969677778,0.29056351778) + , Qt.point(0.529968875,0.290563323509) + , Qt.point(0.529968344444,0.290563351262) + , Qt.point(0.529965952778,0.290563478926) + , Qt.point(0.529965766667,0.290563850816) + , Qt.point(0.529965355556,0.290563628792) + , Qt.point(0.529965227778,0.290564111694) + , Qt.point(0.529965911111,0.290564566841) + , Qt.point(0.529965941667,0.290564905426) + , Qt.point(0.529966041667,0.290565199605) + , Qt.point(0.529966038889,0.290565671402) + , Qt.point(0.529966116667,0.290565982232) + , Qt.point(0.529966036111,0.290566304162) + , Qt.point(0.529966163889,0.290566642744) + , Qt.point(0.529966255556,0.290568513256) + , Qt.point(0.529966475,0.290568729724) + , Qt.point(0.529966625,0.290568973943) + , Qt.point(0.529966341667,0.290569001695) + , Qt.point(0.529965147222,0.290569606692) + , Qt.point(0.529964958333,0.290569778755) + , Qt.point(0.529963827778,0.290570084028) + , Qt.point(0.529963152778,0.29057011178) + , Qt.point(0.529962344444,0.290569778755) + , Qt.point(0.529961447222,0.29056945128) + , Qt.point(0.529959377778,0.290568846283) + , Qt.point(0.529958691667,0.290568668669) + , Qt.point(0.529957361111,0.29056808032) + , Qt.point(0.529956763889,0.290567641833) + , Qt.point(0.529956013889,0.290566814809) + , Qt.point(0.529955211111,0.290565849019) + , Qt.point(0.52995495,0.290565565942) + , Qt.point(0.529954594444,0.290565355021) + , Qt.point(0.529954122222,0.290565216257) + , Qt.point(0.529953552778,0.290565121898) + , Qt.point(0.529953269444,0.290564994235) + , Qt.point(0.529952927778,0.290564716707) + , Qt.point(0.529952561111,0.290564550189) + , Qt.point(0.529951552778,0.290564322616) + , Qt.point(0.529950847222,0.290564389223) + , Qt.point(0.529950177778,0.290564638999) + , Qt.point(0.529949377778,0.290564527987) + , Qt.point(0.529948427778,0.290564688954) + , Qt.point(0.529947680556,0.290564638999) + , Qt.point(0.529947230556,0.290564400324) + , Qt.point(0.529946947222,0.290564222705) + , Qt.point(0.529946930556,0.290563617691) + , Qt.point(0.529946836111,0.290563367914) + , Qt.point(0.529946427778,0.290563811962) + , Qt.point(0.529945880556,0.290564000682) + , Qt.point(0.529945422222,0.290564089491) + , Qt.point(0.529945130556,0.290564256009) + , Qt.point(0.529944233333,0.290564827718) + , Qt.point(0.529943544444,0.290565132999) + , Qt.point(0.529942569444,0.290565427178) + , Qt.point(0.529941469444,0.290565571492) + , Qt.point(0.529940577778,0.290565604795) + , Qt.point(0.529939788889,0.290565577043) + , Qt.point(0.529939477778,0.290565488234) + , Qt.point(0.529938916667,0.290565610346) + , Qt.point(0.529938444444,0.290565638099) + , Qt.point(0.529937780556,0.290565588144) + , Qt.point(0.529937208333,0.290565299515) + , Qt.point(0.529936852778,0.29056554929) + , Qt.point(0.529936327778,0.290565499335) + , Qt.point(0.529935591667,0.290565288414) + , Qt.point(0.529934652778,0.290564916527) + , Qt.point(0.529933963889,0.290564489133) + , Qt.point(0.529933630556,0.290564239357) + , Qt.point(0.529931627778,0.290564394773) + , Qt.point(0.529925755556,0.290565937828) + , Qt.point(0.529924,0.290566986875) + , Qt.point(0.529922902778,0.290566986875) + , Qt.point(0.529921097222,0.290567253299) + , Qt.point(0.529920622222,0.290567353208) + , Qt.point(0.529920180556,0.290567519722) + , Qt.point(0.529918330556,0.290568418898) + , Qt.point(0.529917030556,0.290569290318) + , Qt.point(0.529915861111,0.290570206137) + , Qt.point(0.529914936111,0.290570877734) + , Qt.point(0.529912422222,0.290572592794) + , Qt.point(0.529910533333,0.290573747259) + , Qt.point(0.529907875,0.290575112627) + , Qt.point(0.529906511111,0.290575778656) + , Qt.point(0.52990665,0.290576672242) + , Qt.point(0.529906858333,0.290578753558) + , Qt.point(0.529906897222,0.290581018003) + , Qt.point(0.529906994444,0.29058365982) + , Qt.point(0.529905561111,0.29058362097) + , Qt.point(0.529904913889,0.29058365427) + , Qt.point(0.529903811111,0.29058365427) + , Qt.point(0.529903672222,0.29058367092) + , Qt.point(0.529903444444,0.290584248119) + , Qt.point(0.529903147222,0.290584792016) + , Qt.point(0.529902163889,0.290586773342) + , Qt.point(0.529901536111,0.290588366157) + , Qt.point(0.5299008,0.290591340855) + , Qt.point(0.52989975,0.29059212892) + , Qt.point(0.529898525,0.290591252058) + , Qt.point(0.529897844444,0.290590796977) + , Qt.point(0.529897177778,0.290591812584) + , Qt.point(0.529894627778,0.290590425141) + , Qt.point(0.529893072222,0.290589448375) + , Qt.point(0.529892844444,0.290587994316) + , Qt.point(0.529892369444,0.290588133063) + , Qt.point(0.529891830556,0.290588216311) + , Qt.point(0.529880347222,0.290589226382) + , Qt.point(0.529879855556,0.290589226382) + , Qt.point(0.529878825,0.29058929853) + , Qt.point(0.529877705556,0.290589470575) + , Qt.point(0.529876097222,0.290589942309) + , Qt.point(0.529875502778,0.29059019205) + , Qt.point(0.529874402778,0.29059071373) + , Qt.point(0.529873125,0.290591462949) + , Qt.point(0.529872147222,0.290592289862) + , Qt.point(0.529870275,0.290594054669) + , Qt.point(0.529868230556,0.290590519488) + , Qt.point(0.529867602778,0.290589381777) + , Qt.point(0.529866675,0.290588221861) + , Qt.point(0.529865855556,0.290587117435) + , Qt.point(0.529864422222,0.290585735507) + , Qt.point(0.529863966667,0.290586434797) + , Qt.point(0.529862725,0.290588188561) + , Qt.point(0.529862163889,0.290588083114) + , Qt.point(0.529860383333,0.290587622475) + , Qt.point(0.529859858333,0.290587467078) + , Qt.point(0.529858913889,0.290587272832) + , Qt.point(0.529856536111,0.290586695643) + , Qt.point(0.529856588889,0.290582594218) + , Qt.point(0.529856555556,0.290581456458) + , Qt.point(0.529855561111,0.290576150522) + , Qt.point(0.5298546,0.290576150522) + , Qt.point(0.529852761111,0.290576095019) + , Qt.point(0.529852711111,0.290575695403) + , Qt.point(0.529852308333,0.290575306886) + , Qt.point(0.529849038889,0.290575029373) + , Qt.point(0.529848811111,0.290575745355) + , Qt.point(0.529848530556,0.290576444683) + , Qt.point(0.529847411111,0.290579458425) + , Qt.point(0.529846780556,0.290581262206) + , Qt.point(0.529846430556,0.290582189065) + , Qt.point(0.529846169444,0.29058313257) + , Qt.point(0.529846641667,0.290586534696) + , Qt.point(0.529845713889,0.290588194111) + , Qt.point(0.529845363889,0.290588915592) + , Qt.point(0.529845188889,0.290589193083) + , Qt.point(0.529844891667,0.290589792464) + , Qt.point(0.529843286111,0.290592861484) + , Qt.point(0.529839977778,0.290592606197) + , Qt.point(0.529837580556,0.290592728291) + , Qt.point(0.529836391667,0.290592833735) + , Qt.point(0.529832336111,0.290591396352) + , Qt.point(0.529833211111,0.290588016516) + , Qt.point(0.529832111111,0.290586651244) + , Qt.point(0.529831480556,0.290586579095) + , Qt.point(0.529830327778,0.290586529146) + , Qt.point(0.529829436111,0.290586612395) + , Qt.point(0.529828594444,0.290586456997) + , Qt.point(0.52982795,0.2905862794) + , Qt.point(0.529826113889,0.290587000888) + , Qt.point(0.529825308333,0.290584930765) + , Qt.point(0.529824436111,0.290582777369) + , Qt.point(0.529823597222,0.290582216815) + , Qt.point(0.529823230556,0.290582039214) + , Qt.point(0.529822058333,0.290581323257) + , Qt.point(0.529821008333,0.290581251106) + , Qt.point(0.529820677778,0.290581040203) + , Qt.point(0.52981975,0.290581184505) + , Qt.point(0.52981905,0.290581828312) + , Qt.point(0.529818175,0.290582144665) + , Qt.point(0.529817580556,0.290582566468) + , Qt.point(0.529817355556,0.290582233466) + , Qt.point(0.529817127778,0.290582144665) + , Qt.point(0.529817127778,0.29058156746) + , Qt.point(0.5298169,0.290580146639) + , Qt.point(0.529816847222,0.290579641579) + , Qt.point(0.529816783333,0.290578481601) + , Qt.point(0.529815538889,0.29057320333) + , Qt.point(0.529815091667,0.290570711223) + , Qt.point(0.529814197222,0.290563140338) + , Qt.point(0.529814,0.290562141225) + , Qt.point(0.5298139,0.290561147657) + , Qt.point(0.529813502778,0.290559604562) + , Qt.point(0.529813005556,0.290558005947) + , Qt.point(0.529812408333,0.290556962399) + , Qt.point(0.529812011111,0.290556063167) + , Qt.point(0.529811513889,0.290555069566) + , Qt.point(0.529810519444,0.290553970492) + , Qt.point(0.529810469444,0.290553776211) + , Qt.point(0.529810069444,0.290553626337) + , Qt.point(0.529809975,0.290553765109) + , Qt.point(0.529809825,0.290554342402) + , Qt.point(0.529809605556,0.290555014057) + , Qt.point(0.529809486111,0.290555447024) + , Qt.point(0.5298094,0.290555985455) + , Qt.point(0.529809272222,0.290556340708) + , Qt.point(0.529809247222,0.290556668206) + , Qt.point(0.529808969444,0.290557906033) + , Qt.point(0.529809075,0.290558427805) + , Qt.point(0.529808975,0.290558783053) + , Qt.point(0.529808747222,0.290558616531) + , Qt.point(0.529808594444,0.290558616531) + , Qt.point(0.529808211111,0.290558944025) + , Qt.point(0.529808388889,0.290559782185) + , Qt.point(0.529808552778,0.290560076373) + , Qt.point(0.529808788889,0.290560392763) + , Qt.point(0.529808897222,0.290560864572) + , Qt.point(0.529808830556,0.290561208714) + , Qt.point(0.529808611111,0.290561319727) + , Qt.point(0.529808588889,0.290561480697) + , Qt.point(0.529808441667,0.290561280873) + , Qt.point(0.529808436111,0.290561125454) + , Qt.point(0.529808191667,0.290561158758) + , Qt.point(0.529807947222,0.29056125867) + , Qt.point(0.529807491667,0.290561269771) + , Qt.point(0.529807269444,0.290561069947) + , Qt.point(0.529806852778,0.290561208714) + , Qt.point(0.529806666667,0.290561108802) + , Qt.point(0.5298064,0.290561269771) + , Qt.point(0.529806233333,0.290561464045) + , Qt.point(0.529805675,0.290561835939) + , Qt.point(0.529804888889,0.290562002459) + , Qt.point(0.529804663889,0.2905619303) + , Qt.point(0.529804277778,0.290562335497) + , Qt.point(0.529803963889,0.290562757346) + , Qt.point(0.529803736111,0.290562946067) + , Qt.point(0.529803822222,0.29056315699) + , Qt.point(0.529803891667,0.290563595488) + , Qt.point(0.529803561111,0.290564000682) + , Qt.point(0.529803333333,0.290564333717) + , Qt.point(0.529803280556,0.29056524401) + , Qt.point(0.529803316667,0.290565504886) + , Qt.point(0.529803175,0.290565926726) + , Qt.point(0.529802913889,0.29056606549) + , Qt.point(0.529801863889,0.290566154298) + , Qt.point(0.529801725,0.290566431824) + , Qt.point(0.529801830556,0.290566992425) + , Qt.point(0.529801563889,0.290567625181) + , Qt.point(0.529801463889,0.290567969311) + , Qt.point(0.529801416667,0.290568269036) + , Qt.point(0.529801216667,0.290568568761) + , Qt.point(0.529800877778,0.290568585412) + , Qt.point(0.529800519444,0.290568718623) + , Qt.point(0.529800222222,0.290568768577) + , Qt.point(0.529799527778,0.290568968393) + , Qt.point(0.529799127778,0.290568918439) + , Qt.point(0.529798333333,0.290568918439) + , Qt.point(0.529797983333,0.290568868485) + , Qt.point(0.529797188889,0.290568868485) + , Qt.point(0.529796791667,0.290568968393) + , Qt.point(0.529796344444,0.290569018347) + , Qt.point(0.529796094444,0.290569068301) + , Qt.point(0.529795597222,0.290568818531) + , Qt.point(0.529795347222,0.290568768577) + , Qt.point(0.529795,0.290568768577) + , Qt.point(0.529794802778,0.290568618715) + , Qt.point(0.529794652778,0.290568418898) + , Qt.point(0.529794497222,0.290568263485) + , Qt.point(0.529794225,0.290568185779) + , Qt.point(0.529793911111,0.290568257935) + , Qt.point(0.529793525,0.290568380045) + , Qt.point(0.529793105556,0.290568763026) + , Qt.point(0.529793019444,0.290569356923) + , Qt.point(0.529793105556,0.290570078477) + , Qt.point(0.529793072222,0.290570988742) + , Qt.point(0.529793194444,0.290571671437) + , Qt.point(0.529791830556,0.290573020169) + , Qt.point(0.5297912,0.290573475295) + , Qt.point(0.529790063889,0.290573985922) + , Qt.point(0.529788472222,0.290574280087) + , Qt.point(0.529786847222,0.290574629754) + , Qt.point(0.529785833333,0.290574651955) + , Qt.point(0.52978405,0.290576172723) + , Qt.point(0.529783472222,0.290576960852) + , Qt.point(0.529783105556,0.290577748979) + , Qt.point(0.529782772222,0.290582738518) + , Qt.point(0.529782580556,0.290588133063) + , Qt.point(0.529782719444,0.290595242298) + , Qt.point(0.529782702778,0.290599482179) + , Qt.point(0.529782825,0.290603877345) + , Qt.point(0.529783,0.290606185875) + , Qt.point(0.529783016667,0.290607956099) + , Qt.point(0.529782791667,0.290609304565) + , Qt.point(0.529782319444,0.290610425504) + , Qt.point(0.529781672222,0.290611352216) + , Qt.point(0.529780816667,0.290613682849) + , Qt.point(0.529780797222,0.29061562502) + , Qt.point(0.529780938889,0.290617273075) + , Qt.point(0.529780380556,0.290617089959) + , Qt.point(0.529779469444,0.290617395153) + , Qt.point(0.529778541667,0.290617933403) + , Qt.point(0.529777647222,0.290619181915) + , Qt.point(0.529776952778,0.290620369381) + , Qt.point(0.529775308333,0.290622894108) + , Qt.point(0.529774591667,0.290624186976) + , Qt.point(0.529773666667,0.290625396605) + , Qt.point(0.529772475,0.290627199935) + , Qt.point(0.529772027778,0.290628043333) + , Qt.point(0.529771827778,0.29062834296) + , Qt.point(0.529771463889,0.290628775754) + , Qt.point(0.529771061111,0.290629141964) + , Qt.point(0.529770119444,0.290629530367) + , Qt.point(0.529769786111,0.29062975786) + , Qt.point(0.529769277778,0.290629968707) + , Qt.point(0.529768702778,0.290630334914) + , Qt.point(0.529768141667,0.290630756606) + , Qt.point(0.529767933333,0.290631194943) + , Qt.point(0.529767652778,0.290631649925) + , Qt.point(0.529766866667,0.290632609821) + , Qt.point(0.529766622222,0.290632981571) + , Qt.point(0.529766111111,0.290633675133) + , Qt.point(0.529765872222,0.290633958106) + , Qt.point(0.529765563889,0.290634418629) + , Qt.point(0.529765258333,0.290634923539) + , Qt.point(0.529764525,0.290634535147) + , Qt.point(0.529764036111,0.290634224433) + , Qt.point(0.529763616667,0.290634013591) + , Qt.point(0.52976325,0.290633786103) + , Qt.point(0.529762391667,0.290633314481) + , Qt.point(0.529761344444,0.290634557341) + , Qt.point(0.529760366667,0.290635517222) + , Qt.point(0.529759702778,0.290636094258) + , Qt.point(0.529758775,0.29063684884) + , Qt.point(0.529757655556,0.29063767) + , Qt.point(0.529756433333,0.290638652059) + , Qt.point(0.529755297222,0.290639667401) + , Qt.point(0.529754658333,0.290640283262) + , Qt.point(0.529754305556,0.290639978106) + , Qt.point(0.529754197222,0.290639406631) + , Qt.point(0.529754055556,0.290639107022) + , Qt.point(0.529753969444,0.290638496705) + , Qt.point(0.529753794444,0.290638163804) + , Qt.point(0.529753705556,0.290637936322) + , Qt.point(0.529753530556,0.290637692194) + , Qt.point(0.529753236111,0.290637658904) + , Qt.point(0.529752836111,0.29063780871) + , Qt.point(0.529752688889,0.290637758774) + , Qt.point(0.529752538889,0.290637509098) + , Qt.point(0.529752388889,0.29063715955) + , Qt.point(0.529752338889,0.290636959808) + , Qt.point(0.529752288889,0.290636515937) + , Qt.point(0.529752116667,0.290636183032) + , Qt.point(0.529752011111,0.290635800192) + , Qt.point(0.529752188889,0.290635217606) + , Qt.point(0.529752241667,0.290634818118) + , Qt.point(0.529752338889,0.290634374241) + , Qt.point(0.529752338889,0.290633974751) + , Qt.point(0.529752219444,0.290633297836) + , Qt.point(0.529752113889,0.290632909441) + , Qt.point(0.529751922222,0.290632720791) + , Qt.point(0.529751958333,0.290632437817) + , Qt.point(0.529751494444,0.290631882964) + , Qt.point(0.529751275,0.290631544502) + , Qt.point(0.529751147222,0.29063128372) + , Qt.point(0.529751222222,0.290631039583) + , Qt.point(0.529750947222,0.2906305846) + , Qt.point(0.529750802778,0.290630107422) + , Qt.point(0.529750647222,0.290629791152) + , Qt.point(0.5297505,0.290629341714) + , Qt.point(0.529750416667,0.290628920019) + , Qt.point(0.52975045,0.290628598198) + , Qt.point(0.529750419444,0.290628059979) + , Qt.point(0.529750655556,0.290627738157) + , Qt.point(0.529750838889,0.290627438529) + , Qt.point(0.529751205556,0.290627044572) + , Qt.point(0.529751430556,0.290626661712) + , Qt.point(0.529751691667,0.290625907088) + , Qt.point(0.529751988889,0.290624908315) + , Qt.point(0.529752375,0.29062475295) + , Qt.point(0.529752586111,0.290624087098) + , Qt.point(0.529752933333,0.290623926184) + , Qt.point(0.529753183333,0.290623915086) + , Qt.point(0.529753458333,0.290623820757) + , Qt.point(0.529753530556,0.290623465634) + , Qt.point(0.529753388889,0.290622999535) + , Qt.point(0.529753380556,0.290622566727) + , Qt.point(0.529753336111,0.29062231703) + , Qt.point(0.5297536,0.290622228249) + , Qt.point(0.529753730556,0.290621567937) + , Qt.point(0.529753686111,0.29062116287) + , Qt.point(0.529753755556,0.290620952013) + , Qt.point(0.529753772222,0.290620724509) + , Qt.point(0.529753719444,0.290620480359) + , Qt.point(0.529754077778,0.290620180719) + , Qt.point(0.529754275,0.290619881078) + , Qt.point(0.529754675,0.290619131975) + , Qt.point(0.529754575,0.290618732452) + , Qt.point(0.529754263889,0.290618588179) + , Qt.point(0.529754016667,0.290618416162) + , Qt.point(0.529753633333,0.290618205302) + , Qt.point(0.5297529,0.290617922305) + , Qt.point(0.529752794444,0.290617483936) + , Qt.point(0.529752636111,0.290617206487) + , Qt.point(0.529752602778,0.290616784764) + , Qt.point(0.529752138889,0.290616046746) + , Qt.point(0.529751744444,0.290615613922) + , Qt.point(0.529751691667,0.290615453) + , Qt.point(0.529751272222,0.290615192195) + , Qt.point(0.529751116667,0.290614859252) + , Qt.point(0.529751044444,0.290614487465) + , Qt.point(0.529750502778,0.290613965852) + , Qt.point(0.529750469444,0.290613422041) + , Qt.point(0.529750869444,0.290613105743) + , Qt.point(0.529751308333,0.290612406554) + , Qt.point(0.529750030556,0.290610886086) + , Qt.point(0.529750247222,0.290610170241) + , Qt.point(0.529750694444,0.290608377842) + , Qt.point(0.529751202778,0.290606962778) + , Qt.point(0.529751936111,0.290605336828) + , Qt.point(0.529752425,0.290603422295) + , Qt.point(0.529752705556,0.290602057138) + , Qt.point(0.529750438889,0.290601574336) + , Qt.point(0.529748911111,0.29060121917) + , Qt.point(0.529745588889,0.290602268016) + , Qt.point(0.529739280556,0.290605142601) + , Qt.point(0.529738197222,0.290605769676) + , Qt.point(0.529737319444,0.290606535482) + , Qt.point(0.529736291667,0.290607367876) + , Qt.point(0.529735180556,0.290608727445) + , Qt.point(0.529732952778,0.290611357765) + , Qt.point(0.529731752778,0.290612961466) + , Qt.point(0.529731433333,0.29061349418) + , Qt.point(0.529731105556,0.290613854871) + , Qt.point(0.529730733333,0.290614426425) + , Qt.point(0.529730541667,0.290614759369) + , Qt.point(0.529730280556,0.290615070116) + , Qt.point(0.529730016667,0.290615441902) + , Qt.point(0.529729813889,0.290615652765) + , Qt.point(0.529729563889,0.290615946864) + , Qt.point(0.529729416667,0.29061619657) + , Qt.point(0.529729127778,0.290616490667) + , Qt.point(0.529728719444,0.290616745921) + , Qt.point(0.529728094444,0.290617311918) + , Qt.point(0.529727177778,0.290617994441) + , Qt.point(0.529726780556,0.290618338477) + , Qt.point(0.529726533333,0.290618438358) + , Qt.point(0.529724941667,0.290618338477) + , Qt.point(0.529724652778,0.290618277438) + , Qt.point(0.529724197222,0.290618260791) + , Qt.point(0.529724047222,0.290617744738) + , Qt.point(0.5297239,0.290617334114) + , Qt.point(0.529723777778,0.29061686245) + , Qt.point(0.529723697222,0.29061669598) + , Qt.point(0.529723586111,0.290616246511) + , Qt.point(0.52972315,0.290616202119) + , Qt.point(0.529722802778,0.290616202119) + , Qt.point(0.529722205556,0.290616102236) + , Qt.point(0.529721558333,0.290616052295) + , Qt.point(0.529720805556,0.290616019001) + , Qt.point(0.529720577778,0.290615896923) + , Qt.point(0.529720066667,0.290615552883) + , Qt.point(0.529719230556,0.290615147803) + , Qt.point(0.529718691667,0.290617700346) + , Qt.point(0.529718533333,0.290617073312) + , Qt.point(0.529718175,0.290615863628) + , Qt.point(0.529718130556,0.290615425255) + , Qt.point(0.529718147222,0.290614692781) + , Qt.point(0.529718130556,0.290614215561) + , Qt.point(0.529718061111,0.290613621809) + , Qt.point(0.529717919444,0.290612767247) + , Qt.point(0.529720105556,0.290612484242) + , Qt.point(0.529719963889,0.290608350096) + , Qt.point(0.529717952778,0.290608721895) + , Qt.point(0.529717927778,0.290608333448) + , Qt.point(0.529714347222,0.290609826191) + , Qt.point(0.529712497222,0.290605098206) + , Qt.point(0.529711463889,0.290602401203) + , Qt.point(0.529710763889,0.290600508837) + , Qt.point(0.529710116667,0.290598866181) + , Qt.point(0.529709908333,0.290598954974) + , Qt.point(0.52970905,0.290597062573) + , Qt.point(0.529708019444,0.290595014762) + , Qt.point(0.529707247222,0.290593333209) + , Qt.point(0.529705638889,0.290589920109) + , Qt.point(0.529703697222,0.290588782395) + , Qt.point(0.529702752778,0.290590147651) + , Qt.point(0.529700113889,0.290588571501) + , Qt.point(0.529699625,0.290588993289) + , Qt.point(0.529699536111,0.290589220832) + , Qt.point(0.529699694444,0.290590025556) + , Qt.point(0.529698975,0.290592051223) + , Qt.point(0.529698122222,0.290595159053) + , Qt.point(0.529699627778,0.290595858307) + , Qt.point(0.529696675,0.290598943875) + , Qt.point(0.529697058333,0.290599188054) + , Qt.point(0.529696569444,0.290600359001) + , Qt.point(0.529695958333,0.290602023841) + , Qt.point(0.529695797222,0.290602367906) + , Qt.point(0.529695847222,0.290603061584) + , Qt.point(0.529696063889,0.290604054925) + , Qt.point(0.529696244444,0.290604704202) + , Qt.point(0.529696327778,0.290606085988) + , Qt.point(0.529694036111,0.290604021629) + , Qt.point(0.529689422222,0.290604110419) + , Qt.point(0.529689825,0.290605214742) + , Qt.point(0.529690191667,0.290605758577) + , Qt.point(0.529690522222,0.290606141481) + , Qt.point(0.529690366667,0.290606896186) + , Qt.point(0.529690402778,0.290607456664) + , Qt.point(0.529690736111,0.290608577615) + , Qt.point(0.529689738889,0.290608871725) + , Qt.point(0.529688602778,0.290609626419) + , Qt.point(0.529687780556,0.29061059198) + , Qt.point(0.529686602778,0.290612978113) + , Qt.point(0.529686155556,0.290613577416) + , Qt.point(0.529685708333,0.290614026892) + , Qt.point(0.529685211111,0.290614476367) + , Qt.point(0.529684763889,0.290614820409) + , Qt.point(0.529684116667,0.290615169999) + , Qt.point(0.529683522222,0.290615419706) + , Qt.point(0.529682775,0.290615519589) + , Qt.point(0.529681530556,0.290615619471) + , Qt.point(0.529679969444,0.29061521994) + , Qt.point(0.529678797222,0.290614726075) + , Qt.point(0.529677786111,0.290614393131) + , Qt.point(0.529677205556,0.290614276601) + , Qt.point(0.529676558333,0.290614232208) + , Qt.point(0.529675316667,0.290614232208) + , Qt.point(0.529674669444,0.290614332091) + , Qt.point(0.52967405,0.290614554054) + , Qt.point(0.529673886111,0.290614082383) + , Qt.point(0.529674427778,0.290612384357) + , Qt.point(0.529673291667,0.290611701813) + , Qt.point(0.529671875,0.290611529789) + , Qt.point(0.529667,0.290614315444) + , Qt.point(0.529666494444,0.290614509661) + , Qt.point(0.529665636111,0.290614437524) + , Qt.point(0.529665041667,0.290614071285) + , Qt.point(0.529664569444,0.290613355452) + , Qt.point(0.529664219444,0.290611496494) + , Qt.point(0.529662469444,0.290609870584) + , Qt.point(0.529661894444,0.290609837289) + , Qt.point(0.529660180556,0.290609681911) + , Qt.point(0.529646930556,0.290608671952) + , Qt.point(0.529639066667,0.290608128126) + , Qt.point(0.529638416667,0.290609465492) + , Qt.point(0.529636741667,0.290612217883) + , Qt.point(0.529636147222,0.290613144586) + , Qt.point(0.529635763889,0.290613549671) + , Qt.point(0.529635588889,0.290613671751) + , Qt.point(0.52963515,0.290614076834) + , Qt.point(0.529634644444,0.290614309895) + , Qt.point(0.529634297222,0.290614409778) + , Qt.point(0.52963395,0.290614609545) + , Qt.point(0.529632855556,0.290614609545) + , Qt.point(0.529632408333,0.290614559603) + , Qt.point(0.529631461111,0.290614565152) + , Qt.point(0.529631113889,0.290613954754) + , Qt.point(0.529630919444,0.29061343314) + , Qt.point(0.529630866667,0.290612573028) + , Qt.point(0.529630969444,0.290611313372) + , Qt.point(0.529630913889,0.290610331168) + , Qt.point(0.529630663889,0.290609532083) + , Qt.point(0.529630413889,0.29060898271) + , Qt.point(0.529630116667,0.290608438884) + , Qt.point(0.529629716667,0.290608189168) + , Qt.point(0.529629169444,0.290607889508) + , Qt.point(0.529628822222,0.290607839564) + , Qt.point(0.52962845,0.29060786731) + , Qt.point(0.5296281,0.290607972747) + , Qt.point(0.529627769444,0.290608161421) + , Qt.point(0.529627558333,0.290608533221) + , Qt.point(0.529627036111,0.2906097596) + , Qt.point(0.529626583333,0.290610142495) + , Qt.point(0.529626091667,0.290610231282) + , Qt.point(0.529625655556,0.29061024793) + , Qt.point(0.529625130556,0.290610003765) + , Qt.point(0.529624797222,0.290609565378) + , Qt.point(0.529624622222,0.290609043751) + , Qt.point(0.529624711111,0.290608444433) + , Qt.point(0.529626002778,0.290606235819) + , Qt.point(0.529628686111,0.290599054865) + , Qt.point(0.529628461111,0.29059888283) + , Qt.point(0.5296279,0.290599948338) + , Qt.point(0.529627288889,0.290600547683) + , Qt.point(0.529623597222,0.29060271197) + , Qt.point(0.529621733333,0.290603844049) + , Qt.point(0.529619547222,0.290603777456) + , Qt.point(0.529619372222,0.290602900651) + , Qt.point(0.529618341667,0.290602062687) + , Qt.point(0.529617569444,0.29060111373) + , Qt.point(0.529616311111,0.29060111928) + , Qt.point(0.529616013889,0.2906009084) + , Qt.point(0.529616291667,0.290599243549) + , Qt.point(0.529616380556,0.290598893929) + , Qt.point(0.529616744444,0.290597700775) + , Qt.point(0.529617147222,0.290596596407) + , Qt.point(0.529617355556,0.290595392138) + , Qt.point(0.529617686111,0.290593849331) + , Qt.point(0.529617947222,0.290592395307) + , Qt.point(0.529618433333,0.290589415076) + , Qt.point(0.529618572222,0.290588754646) + , Qt.point(0.529618730556,0.290587156285) + , Qt.point(0.529619936111,0.290587295032) + , Qt.point(0.529620563889,0.290587317231) + , Qt.point(0.529620808333,0.290584719866) + , Qt.point(0.529620741667,0.290580901451) + , Qt.point(0.529620791667,0.290579852483) + , Qt.point(0.52962075,0.29057885346) + , Qt.point(0.52962075,0.290577682377) + , Qt.point(0.529620152778,0.290576683342) + , Qt.point(0.529619261111,0.290576561238) + , Qt.point(0.529618947222,0.290575739805) + , Qt.point(0.529619591667,0.290573358738) + , Qt.point(0.529620341667,0.290572182069) + , Qt.point(0.529620569444,0.290571904552) + , Qt.point(0.529621180556,0.290571271811) + , Qt.point(0.529622788889,0.290572093264) + , Qt.point(0.529624363889,0.290572737103) + , Qt.point(0.529624872222,0.290574368891) + , Qt.point(0.529625922222,0.290574996072) + , Qt.point(0.529626527778,0.290575051574) + , Qt.point(0.529628019444,0.290574452146) + , Qt.point(0.529631011111,0.290575817508) + , Qt.point(0.529632969444,0.290576583439) + , Qt.point(0.529636172222,0.290578070889) + , Qt.point(0.529637622222,0.290578648105) + , Qt.point(0.529638794444,0.290579153168) + , Qt.point(0.529638830556,0.290578315096) + , Qt.point(0.529639719444,0.290575773106) + , Qt.point(0.529640066667,0.290573092323) + , Qt.point(0.529640047222,0.290571849048) + , Qt.point(0.529640711111,0.290570095129) + , Qt.point(0.529640883333,0.290569168208) + , Qt.point(0.529641441667,0.290566576138) + , Qt.point(0.529641719444,0.290565632548) + , Qt.point(0.529642769444,0.290565910075) + , Qt.point(0.529643358333,0.290566032187) + , Qt.point(0.529643905556,0.290565982232) + , Qt.point(0.529644252778,0.290565832367) + , Qt.point(0.5296447,0.290565582593) + , Qt.point(0.529645347222,0.290564938729) + , Qt.point(0.529646241667,0.29056388967) + , Qt.point(0.529646836111,0.290562890561) + , Qt.point(0.529647013889,0.290562318845) + , Qt.point(0.529647036111,0.29056184704) + , Qt.point(0.529646936111,0.290561247569) + , Qt.point(0.529646736111,0.290560648095) + , Qt.point(0.529646736111,0.290560253995) + , Qt.point(0.529646941667,0.290559865446) + , Qt.point(0.529647625,0.290559599011) + , Qt.point(0.529648866667,0.290559671171) + , Qt.point(0.529648883333,0.290558583226) + , Qt.point(0.529649022222,0.290557511928) + , Qt.point(0.529649219444,0.290556662656) + , Qt.point(0.529649719444,0.290555219439) + , Qt.point(0.529649511111,0.290555169481) + , Qt.point(0.529648994444,0.290554564437) + , Qt.point(0.529648213889,0.290553226671) + , Qt.point(0.529647338889,0.290551861141) + , Qt.point(0.529646277778,0.290549241071) + , Qt.point(0.529646025,0.29054849723) + , Qt.point(0.529645530556,0.29054635451) + , Qt.point(0.52964415,0.290543051562) + , Qt.point(0.529643783333,0.290542107852) + , Qt.point(0.529641525,0.290538727109) + , Qt.point(0.529638338889,0.290534119428) + , Qt.point(0.529636938889,0.290532331839) + , Qt.point(0.529635397222,0.290530072345) + , Qt.point(0.529634941667,0.290529061949) + , Qt.point(0.529633822222,0.290527624067) + , Qt.point(0.529633433333,0.290526258347) + , Qt.point(0.529632611111,0.290524803788) + , Qt.point(0.529631527778,0.290524243058) + , Qt.point(0.529629780556,0.290525542172) + , Qt.point(0.529629497222,0.290524137574) + , Qt.point(0.529628947222,0.290521600387) + , Qt.point(0.529628566667,0.290519412937) + , Qt.point(0.529628372222,0.290517258773) + , Qt.point(0.529627897222,0.290516031776) + , Qt.point(0.529627266667,0.290515137896) + , Qt.point(0.529625744444,0.290513649936) + , Qt.point(0.529623113889,0.290510440788) + , Qt.point(0.529621980556,0.290509835597) + , Qt.point(0.529622266667,0.290509097149) + , Qt.point(0.529618691667,0.290507348183) + , Qt.point(0.529617516667,0.290506670801) + , Qt.point(0.529613211111,0.290503517055) + , Qt.point(0.529612661111,0.290503078414) + , Qt.point(0.529612213889,0.290502778582) + , Qt.point(0.529611763889,0.290502428778) + , Qt.point(0.5296112,0.290501906847) + , Qt.point(0.529610719444,0.29050148486) + , Qt.point(0.5296098,0.290500507621) + , Qt.point(0.529608888889,0.290499685848) + , Qt.point(0.529608013889,0.290499213882) + , Qt.point(0.529607313889,0.290499002885) + , Qt.point(0.529606238889,0.29049894736) + , Qt.point(0.529605044444,0.290499197224) + , Qt.point(0.529604252778,0.290499619218) + , Qt.point(0.529602758333,0.290500646434) + , Qt.point(0.529602063889,0.290500946268) + , Qt.point(0.529601466667,0.290501246103) + , Qt.point(0.529600372222,0.290501445992) + , Qt.point(0.529599227778,0.290501296075) + , Qt.point(0.529598833333,0.290501223893) + , Qt.point(0.529598133333,0.290501046213) + , Qt.point(0.529597636111,0.290500901849) + , Qt.point(0.529596938889,0.290500651986) + , Qt.point(0.529596291667,0.290500452096) + , Qt.point(0.529595441667,0.29050026331) + , Qt.point(0.529595822222,0.290497192744) + , Qt.point(0.529596794444,0.290490712737) + , Qt.point(0.529597108333,0.290490024188) + , Qt.point(0.529595602778,0.290489502222) + , Qt.point(0.529596177778,0.290488225064) + , Qt.point(0.529596458333,0.290487170014) + , Qt.point(0.529596647222,0.290485631851) + , Qt.point(0.529594186111,0.290484704505) + , Qt.point(0.5295883,0.290482411108) + , Qt.point(0.5295875,0.290484604552) + , Qt.point(0.529585422222,0.290487203332) + , Qt.point(0.529584130556,0.290491162513) + , Qt.point(0.529583641667,0.290492389676) + , Qt.point(0.529583730556,0.290493000478) + , Qt.point(0.529583652778,0.290493289219) + , Qt.point(0.529583261111,0.290494266497) + , Qt.point(0.529583013889,0.290494477499) + , Qt.point(0.529582405556,0.29049642093) + , Qt.point(0.529582422222,0.290496648588) + , Qt.point(0.529582177778,0.290497348217) + , Qt.point(0.529581586111,0.290498614206) + , Qt.point(0.529581097222,0.290499030648) + , Qt.point(0.529581061111,0.290499241645) + , Qt.point(0.529580225,0.290500962926) + , Qt.point(0.529579525,0.290502872974) + , Qt.point(0.529579386111,0.290503417112) + , Qt.point(0.529579369444,0.290503572579) + , Qt.point(0.529578844444,0.290503750257) + , Qt.point(0.529578477778,0.290504205554) + , Qt.point(0.529577936111,0.290504272182) + , Qt.point(0.529576766667,0.290505310477) + , Qt.point(0.529576555556,0.290505960102) + , Qt.point(0.529576066667,0.290506798504) + , Qt.point(0.529576177778,0.290507320421) + , Qt.point(0.529576261111,0.290507709082) + , Qt.point(0.529576330556,0.290508014458) + , Qt.point(0.529576341667,0.290508464192) + , Qt.point(0.52957625,0.290509097149) + , Qt.point(0.529575877778,0.290510090999) + , Qt.point(0.529575636111,0.290511057082) + , Qt.point(0.529575011111,0.290512833774) + , Qt.point(0.529574516667,0.290515026854) + , Qt.point(0.529574330556,0.290515981808) + , Qt.point(0.529574022222,0.290517169941) + , Qt.point(0.529573675,0.290519113132) + , Qt.point(0.529573513889,0.29052029014) + , Qt.point(0.529573513889,0.290520539976) + , Qt.point(0.529572708333,0.290521994569) + , Qt.point(0.529571991667,0.290522188884) + , Qt.point(0.529571416667,0.290522383199) + , Qt.point(0.529570383333,0.290522610824) + , Qt.point(0.529569580556,0.290522821794) + , Qt.point(0.529567627778,0.290529972416) + , Qt.point(0.529567802778,0.290530322168) + , Qt.point(0.529567611111,0.290530671919) + , Qt.point(0.529567472222,0.29053109384) + , Qt.point(0.529567297222,0.290531987642) + , Qt.point(0.529567283333,0.290532825926) + , Qt.point(0.5295673,0.290533264496) + , Qt.point(0.529567441667,0.290534402554) + , Qt.point(0.529567686111,0.290535118694) + , Qt.point(0.529567827778,0.290535435127) + , Qt.point(0.52956795,0.290535818177) + , Qt.point(0.529568091667,0.2905361013) + , Qt.point(0.529567705556,0.290536273394) + , Qt.point(0.529567497222,0.29053645104) + , Qt.point(0.529567269444,0.290536817433) + , Qt.point(0.529567216667,0.290537383676) + , Qt.point(0.529567444444,0.290537766722) + , Qt.point(0.529567744444,0.290538066496) + , Qt.point(0.529568005556,0.290538360719) + , Qt.point(0.529568041667,0.290538765968) + , Qt.point(0.529567883333,0.290539082395) + , Qt.point(0.529568052778,0.290539198973) + , Qt.point(0.529567969444,0.29053931) + , Qt.point(0.529567813889,0.290539554258) + , Qt.point(0.529567744444,0.290539781863) + , Qt.point(0.529567536111,0.290540098288) + , Qt.point(0.529567255556,0.290540847713) + , Qt.point(0.529567063889,0.290541286265) + , Qt.point(0.529566925,0.290541691507) + , Qt.point(0.529566872222,0.290541846943) + , Qt.point(0.529566838889,0.290542268838) + , Qt.point(0.529566733333,0.290542934986) + , Qt.point(0.529566805556,0.290543773219) + , Qt.point(0.529566927778,0.290544128496) + , Qt.point(0.529567102778,0.290544755779) + , Qt.point(0.529567227778,0.290545438572) + , Qt.point(0.529567402778,0.290546049198) + , Qt.point(0.529567472222,0.290546593208) + , Qt.point(0.529567455556,0.290547209381) + , Qt.point(0.529567541667,0.29054896907) + , Qt.point(0.529567244444,0.29055066213) + , Qt.point(0.529567163889,0.290552060975) + , Qt.point(0.529567169444,0.290555807829) + , Qt.point(0.529566980556,0.290559238214) + , Qt.point(0.529563763889,0.290560470473) + , Qt.point(0.529562488889,0.290561069947) + , Qt.point(0.529561372222,0.290561874794) + , Qt.point(0.529560252778,0.290562996022) + , Qt.point(0.529559433333,0.290564189402) + , Qt.point(0.529558630556,0.290566015535) + , Qt.point(0.529557963889,0.290567358758) + , Qt.point(0.529556880556,0.290564211604) + , Qt.point(0.529556177778,0.290562318845) + , Qt.point(0.529555983333,0.290561458494) + , Qt.point(0.529555825,0.2905602873) + , Qt.point(0.529555808333,0.290559798837) + , Qt.point(0.529555438889,0.290559271518) + , Qt.point(0.529554525,0.29056109215) + , Qt.point(0.529554113889,0.290561763781) + , Qt.point(0.529553580556,0.290562735143) + , Qt.point(0.529553347222,0.290563218047) + , Qt.point(0.529552927778,0.290563934075) + , Qt.point(0.529552561111,0.290564494684) + , Qt.point(0.529552352778,0.290564883224) + , Qt.point(0.529551097222,0.290564783313) + , Qt.point(0.5295506,0.290564833268) + , Qt.point(0.529549902778,0.290564955381) + , Qt.point(0.529550533333,0.290565582593) + , Qt.point(0.529551269444,0.290566898067) + , Qt.point(0.529551358333,0.290568141375) + , Qt.point(0.529551044444,0.290569245915) + , Qt.point(0.529546075,0.290566082141) + , Qt.point(0.529543275,0.290564211604) + , Qt.point(0.529543680556,0.290565804615) + , Qt.point(0.529543961111,0.290566642744) + , Qt.point(0.529544311111,0.290567819448) + , Qt.point(0.529541863889,0.290569384675) + , Qt.point(0.529540027778,0.290571227408) + , Qt.point(0.529538922222,0.290571782444) + , Qt.point(0.529537361111,0.290572798156) + , Qt.point(0.5295358,0.290573536348) + , Qt.point(0.529533775,0.290574274537) + , Qt.point(0.529532027778,0.29057474076) + , Qt.point(0.529530466667,0.290575018273) + , Qt.point(0.529527797222,0.290575023823) + , Qt.point(0.529526233333,0.290574929469) + , Qt.point(0.529524486111,0.290574657506) + , Qt.point(0.529522647222,0.290574291188) + , Qt.point(0.529521358333,0.290574108028) + , Qt.point(0.529518138889,0.290573930419) + , Qt.point(0.529515563889,0.290573747259) + , Qt.point(0.529509491667,0.2905735752) + , Qt.point(0.529506733333,0.290573669555) + , Qt.point(0.529502988889,0.290573647354) + , Qt.point(0.529497772222,0.290573497496) + , Qt.point(0.529494933333,0.290563390116) + , Qt.point(0.529483211111,0.29054223553) + , Qt.point(0.529473488889,0.29052953939) + , Qt.point(0.529456036111,0.290527363138) + , Qt.point(0.529455602778,0.29052727431) + , Qt.point(0.529455155556,0.29052746862) + , Qt.point(0.529454841667,0.29052862892) + , Qt.point(0.529454741667,0.290529000881) + , Qt.point(0.529454505556,0.290529045294) + , Qt.point(0.529454116667,0.29052913412) + , Qt.point(0.529453838889,0.290529117465) + , Qt.point(0.529453202778,0.29052916743) + , Qt.point(0.529452866667,0.290529117465) + , Qt.point(0.529452355556,0.290529117465) + , Qt.point(0.529451872222,0.290529089707) + , Qt.point(0.529451441667,0.290528989777) + , Qt.point(0.529451227778,0.290528884296) + , Qt.point(0.529451013889,0.290528739953) + , Qt.point(0.529450786111,0.290528556748) + , Qt.point(0.529450541667,0.290528467922) + , Qt.point(0.529449958333,0.290528284717) + , Qt.point(0.52944965,0.29052826251) + , Qt.point(0.529449233333,0.29052832913) + , Qt.point(0.529448627778,0.290528173683) + , Qt.point(0.529448452778,0.29052802934) + , Qt.point(0.529448291667,0.290527907203) + , Qt.point(0.529448119444,0.290527812824) + , Qt.point(0.529447780556,0.290527635171) + , Qt.point(0.529447522222,0.290527429758) + , Qt.point(0.529447308333,0.290527246552) + , Qt.point(0.529447072222,0.290527102208) + , Qt.point(0.529446688889,0.290526902346) + , Qt.point(0.529446469444,0.290526791312) + , Qt.point(0.529446325,0.290526713588) + , Qt.point(0.529446141667,0.290526619209) + , Qt.point(0.529445936111,0.290526535933) + , Qt.point(0.529445763889,0.290526497071) + , Qt.point(0.5294456,0.290526474864) + , Qt.point(0.529445380556,0.290526441554) + , Qt.point(0.529445205556,0.290526391588) + , Qt.point(0.529444922222,0.290526302761) + , Qt.point(0.529444783333,0.290526247243) + , Qt.point(0.5294444,0.290526030726) + , Qt.point(0.52944425,0.290525975208) + , Qt.point(0.529444186111,0.29052594745) + , Qt.point(0.529443997222,0.290525936346) + , Qt.point(0.529443663889,0.290525891932) + , Qt.point(0.529443380556,0.290525858622) + , Qt.point(0.529443186111,0.290525814208) + , Qt.point(0.529442905556,0.290525769794) + , Qt.point(0.529442627778,0.290525730932) + , Qt.point(0.529442305556,0.290525669862) + , Qt.point(0.529442080556,0.290525619897) + , Qt.point(0.529441816667,0.290525569931) + , Qt.point(0.529441563889,0.290525553276) + , Qt.point(0.529441244444,0.290525542172) + , Qt.point(0.529441025,0.29052553662) + , Qt.point(0.529440852778,0.29052550331) + , Qt.point(0.529440697222,0.290525414482) + , Qt.point(0.529440522222,0.290525270136) + , Qt.point(0.529440358333,0.290525159101) + , Qt.point(0.529440169444,0.290525075825) + , Qt.point(0.529440019444,0.290524986996) + , Qt.point(0.529439844444,0.29052490372) + , Qt.point(0.529439577778,0.29052480934) + , Qt.point(0.529439372222,0.290524742718) + , Qt.point(0.529439119444,0.290524670545) + , Qt.point(0.529438908333,0.290524615027) + , Qt.point(0.529438819444,0.29052459282) + , Qt.point(0.529438716667,0.29052459282) + , Qt.point(0.529438522222,0.290524576165) + , Qt.point(0.529438347222,0.29052459282) + , Qt.point(0.529438194444,0.29052459282) + , Qt.point(0.529438013889,0.290524581717) + , Qt.point(0.529437836111,0.290524542854) + , Qt.point(0.529437730556,0.290524531751) + , Qt.point(0.529437322222,0.290524354094) + , Qt.point(0.529436983333,0.290524093159) + , Qt.point(0.529436777778,0.290523898846) + , Qt.point(0.5294365,0.290523643463) + , Qt.point(0.529436388889,0.290523171559) + , Qt.point(0.529436172222,0.290522916175) + , Qt.point(0.529435875,0.290522782931) + , Qt.point(0.529435497222,0.290522816242) + , Qt.point(0.529435116667,0.290522927279) + , Qt.point(0.529434513889,0.290522888416) + , Qt.point(0.529434205556,0.290523054971) + , Qt.point(0.529433941667,0.290523454702) + , Qt.point(0.529433788889,0.290523798914) + , Qt.point(0.529433580556,0.290524170885) + , Qt.point(0.529433533333,0.29052424861) + , Qt.point(0.529433447222,0.290524387404) + , Qt.point(0.529433383333,0.290524520647) + , Qt.point(0.529433263889,0.290524720511) + , Qt.point(0.529433194444,0.290524820443) + , Qt.point(0.529433144444,0.290524881513) + , Qt.point(0.529433080556,0.29052493703) + , Qt.point(0.529433025,0.290524975893) + , Qt.point(0.529432980556,0.290525009203) + , Qt.point(0.529432927778,0.290525036962) + , Qt.point(0.52943285,0.290525070273) + , Qt.point(0.529432708333,0.290525114687) + , Qt.point(0.529432594444,0.290525159101) + , Qt.point(0.529432475,0.290525197963) + , Qt.point(0.529432261111,0.29052528124) + , Qt.point(0.529432041667,0.290525370068) + , Qt.point(0.529431833333,0.290525492206) + , Qt.point(0.529431658333,0.290525642104) + , Qt.point(0.529431511111,0.290525808656) + , Qt.point(0.529431461111,0.290525858622) + , Qt.point(0.529431347222,0.290526064036) + , Qt.point(0.529431291667,0.290526119553) + , Qt.point(0.529431136111,0.290526291657) + , Qt.point(0.529431063889,0.290526330519) + , Qt.point(0.529430908333,0.290526419347) + , Qt.point(0.529430755556,0.290526513726) + , Qt.point(0.529430591667,0.290526613657) + , Qt.point(0.529430452778,0.290526708036) + , Qt.point(0.529430283333,0.290526791312) + , Qt.point(0.529430197222,0.290526852381) + , Qt.point(0.529430169444,0.290526869036) + , Qt.point(0.529430063889,0.29052701338) + , Qt.point(0.529430038889,0.290527063346) + , Qt.point(0.529430011111,0.290527157725) + , Qt.point(0.529429988889,0.29052720769) + , Qt.point(0.529429975,0.290527252104) + , Qt.point(0.529429947222,0.290527357586) + , Qt.point(0.529429911111,0.290527440861) + , Qt.point(0.529429866667,0.290527557447) + , Qt.point(0.529429841667,0.290527674032) + , Qt.point(0.5294296,0.290528084857) + , Qt.point(0.529429169444,0.290528417957) + , Qt.point(0.529428708333,0.290528634472) + , Qt.point(0.529428247222,0.290528756608) + , Qt.point(0.529427963889,0.290528806573) + , Qt.point(0.529427658333,0.29052882878) + , Qt.point(0.529426622222,0.290528812125) + , Qt.point(0.529426275,0.290528773263) + , Qt.point(0.529425744444,0.290528706643) + , Qt.point(0.529425375,0.290528623368) + , Qt.point(0.529424772222,0.290528512335) + , Qt.point(0.529424422222,0.290528512335) + , Qt.point(0.529424036111,0.290528512335) + , Qt.point(0.529423727778,0.290528545645) + , Qt.point(0.529423247222,0.290528556748) + , Qt.point(0.529422719444,0.290528573403) + , Qt.point(0.529422277778,0.290528623368) + , Qt.point(0.529422122222,0.29052862892) + , Qt.point(0.529421925,0.290528617817) + , Qt.point(0.529421825,0.29052859561) + , Qt.point(0.529421666667,0.290528545645) + , Qt.point(0.529421494444,0.290528351337) + , Qt.point(0.529421255556,0.29052812927) + , Qt.point(0.529421077778,0.290527951616) + , Qt.point(0.529420863889,0.290527723998) + , Qt.point(0.529420697222,0.290527529688) + , Qt.point(0.529420475,0.290527307621) + , Qt.point(0.529420219444,0.290527146621) + , Qt.point(0.529419991667,0.290527024484) + , Qt.point(0.529419747222,0.290526963415) + , Qt.point(0.529419558333,0.290526941208) + , Qt.point(0.529419319444,0.290526891243) + , Qt.point(0.529419094444,0.290526813519) + , Qt.point(0.529418811111,0.290526663623) + , Qt.point(0.529418483333,0.29052643045) + , Qt.point(0.529418291667,0.290526280554) + , Qt.point(0.5294181,0.290526030726) + , Qt.point(0.529417977778,0.290525825311) + , Qt.point(0.529417788889,0.290525492206) + , Qt.point(0.529417719444,0.290525303447) + , Qt.point(0.529417619444,0.290524992548) + , Qt.point(0.52941755,0.29052474827) + , Qt.point(0.529417475,0.29052449844) + , Qt.point(0.529417433333,0.290524392956) + , Qt.point(0.529417363889,0.290524137574) + , Qt.point(0.529417319444,0.29052397102) + , Qt.point(0.529417322222,0.290523743396) + , Qt.point(0.529417291667,0.29052351022) + , Qt.point(0.529417291667,0.290523243733) + , Qt.point(0.529417297222,0.290523032763) + , Qt.point(0.529417322222,0.290522727413) + , Qt.point(0.529417344444,0.290522566409) + , Qt.point(0.529417363889,0.290522338784) + , Qt.point(0.529417502778,0.290522083399) + , Qt.point(0.529417616667,0.29052178915) + , Qt.point(0.529417711111,0.290521506005) + , Qt.point(0.529417791667,0.290521245066) + , Qt.point(0.529417841667,0.290521034095) + , Qt.point(0.529417913889,0.290520651014) + , Qt.point(0.529417919444,0.290520512217) + , Qt.point(0.529417919444,0.290520367867) + , Qt.point(0.529417897222,0.290520123583) + , Qt.point(0.529417877778,0.290519773812) + , Qt.point(0.529417791667,0.290519385177) + , Qt.point(0.529417736111,0.290519146443) + , Qt.point(0.529417622222,0.29051882443) + , Qt.point(0.529417458333,0.290518591248) + , Qt.point(0.529417358333,0.290518480209) + , Qt.point(0.529417247222,0.290518380274) + , Qt.point(0.529417138889,0.290518252578) + , Qt.point(0.529417038889,0.290518135987) + , Qt.point(0.529416966667,0.290518063811) + , Qt.point(0.529416952778,0.290518047155) + , Qt.point(0.529416822222,0.290517941668) + , Qt.point(0.5294168,0.290517925012) + , Qt.point(0.529416663889,0.290517786212) + , Qt.point(0.529416613889,0.290517741796) + , Qt.point(0.529416275,0.290517347605) + , Qt.point(0.529416033333,0.290517081109) + , Qt.point(0.529415836111,0.290516797956) + , Qt.point(0.529415555556,0.290516337138) + , Qt.point(0.529415327778,0.290515992912) + , Qt.point(0.529415163889,0.290515576508) + , Qt.point(0.529415,0.290515265593) + , Qt.point(0.529414675,0.290514765907) + , Qt.point(0.529414477778,0.290514449438) + , Qt.point(0.52941435,0.290514166282) + , Qt.point(0.529414261111,0.290513866468) + , Qt.point(0.529414183333,0.29051352779) + , Qt.point(0.529414086111,0.290513233527) + , Qt.point(0.529413925,0.290513028099) + , Qt.point(0.529413652778,0.290512878191) + , Qt.point(0.529413230556,0.290512855983) + , Qt.point(0.529412927778,0.290512839326) + , Qt.point(0.529412897222,0.290512833774) + , Qt.point(0.529412819444,0.290512794909) + , Qt.point(0.5294127,0.290512722731) + , Qt.point(0.52941265,0.290512672762) + , Qt.point(0.529412536111,0.290512567272) + , Qt.point(0.529412461111,0.290512489541) + , Qt.point(0.529412380556,0.290512417364) + , Qt.point(0.529412269444,0.290512345186) + , Qt.point(0.529412091667,0.29051222859) + , Qt.point(0.529411872222,0.290512062026) + , Qt.point(0.529411652778,0.290511923222) + , Qt.point(0.529411519444,0.290511862148) + , Qt.point(0.529411402778,0.290511801074) + , Qt.point(0.52941125,0.290511728896) + , Qt.point(0.529411194444,0.290511695583) + , Qt.point(0.529411069444,0.290511640061) + , Qt.point(0.52941095,0.290511562331) + , Qt.point(0.529410836111,0.2905114846) + , Qt.point(0.529410622222,0.290511368005) + , Qt.point(0.529410408333,0.290511290274) + , Qt.point(0.529410233333,0.290511262513) + , Qt.point(0.529410025,0.2905112292) + , Qt.point(0.529409880556,0.290511212544) + , Qt.point(0.529409725,0.290511162574) + , Qt.point(0.529409536111,0.290511107052) + , Qt.point(0.529409366667,0.290511018217) + , Qt.point(0.529409247222,0.290510901621) + , Qt.point(0.529409147222,0.290510707294) + , Qt.point(0.529409066667,0.290510535176) + , Qt.point(0.529408922222,0.290510235357) + , Qt.point(0.529408872222,0.290510052133) + , Qt.point(0.529408822222,0.290509824492) + , Qt.point(0.529408741667,0.290509596851) + , Qt.point(0.529408697222,0.290509424732) + , Qt.point(0.529408513889,0.290508664073) + , Qt.point(0.529408375,0.290508342042) + , Qt.point(0.529408238889,0.290508014458) + , Qt.point(0.529408097222,0.290507764605) + , Qt.point(0.529407875,0.290507542513) + , Qt.point(0.529407663889,0.290507287107) + , Qt.point(0.529407425,0.290506909551) + , Qt.point(0.5294073,0.290506631935) + , Qt.point(0.529407244444,0.290506337661) + , Qt.point(0.529407202778,0.290506043387) + , Qt.point(0.529407102778,0.290505749113) + , Qt.point(0.529406908333,0.290505243849) + , Qt.point(0.529406838889,0.290504910707) + , Qt.point(0.529406697222,0.290504533145) + , Qt.point(0.5294066,0.29050412782) + , Qt.point(0.5294065,0.290503900172) + , Qt.point(0.529406247222,0.290503511503) + , Qt.point(0.529405969444,0.290503145043) + , Qt.point(0.529405552778,0.290502806345) + , Qt.point(0.529405033333,0.290502417674) + , Qt.point(0.529404641667,0.290502112289) + , Qt.point(0.529404461111,0.290501945715) + , Qt.point(0.529404236111,0.290501679196) + , Qt.point(0.529403927778,0.290501257208) + , Qt.point(0.529403747222,0.290501079528) + , Qt.point(0.52940355,0.290500879639) + , Qt.point(0.529403369444,0.290500757484) + , Qt.point(0.529403144444,0.290500602014) + , Qt.point(0.529402908333,0.290500391018) + , Qt.point(0.529402586111,0.290499930159) + , Qt.point(0.529402294444,0.29049953593) + , Qt.point(0.529401802778,0.290498980675) + , Qt.point(0.529401483333,0.290498603101) + , Qt.point(0.529401202778,0.290498336578) + , Qt.point(0.529401116667,0.290498114475) + , Qt.point(0.529401130556,0.290497581426) + , Qt.point(0.529401102778,0.290497259375) + , Qt.point(0.529401047222,0.290497042824) + , Qt.point(0.529400991667,0.290496848482) + , Qt.point(0.529400880556,0.290496693009) + , Qt.point(0.529400655556,0.290496387614) + , Qt.point(0.529400475,0.290496193272) + , Qt.point(0.529400319444,0.290495982272) + , Qt.point(0.529400038889,0.290495715744) + , Qt.point(0.529399872222,0.290495510296) + , Qt.point(0.529399675,0.290495199347) + , Qt.point(0.529399413889,0.290494877292) + , Qt.point(0.529399175,0.29049449971) + , Qt.point(0.529399033333,0.290494344234) + , Qt.point(0.529398825,0.290494177653) + , Qt.point(0.529398347222,0.290493672357) + , Qt.point(0.5293979,0.290493283667) + , Qt.point(0.529397425,0.290492961608) + , Qt.point(0.529397019444,0.290492572916) + , Qt.point(0.529396491667,0.29049231749) + , Qt.point(0.5293961,0.29049209538) + , Qt.point(0.529395722222,0.290491801083) + , Qt.point(0.529394658333,0.290490851557) + , Qt.point(0.529394113889,0.290490307382) + , Qt.point(0.529393413889,0.290489407823) + , Qt.point(0.529393163889,0.290489174604) + , Qt.point(0.529392588889,0.29048879701) + , Qt.point(0.529392394444,0.290488569342) + , Qt.point(0.529391958333,0.290487381025) + , Qt.point(0.529391761111,0.290487175567) + , Qt.point(0.529391136111,0.290486847945) + , Qt.point(0.529390925,0.290486698016) + , Qt.point(0.529390686111,0.290486403711) + , Qt.point(0.529390266667,0.29048564851) + , Qt.point(0.529390013889,0.29048525425) + , Qt.point(0.529389747222,0.290484876648) + , Qt.point(0.529389036111,0.290484010381) + , Qt.point(0.529388336111,0.29048332736) + , Qt.point(0.529388041667,0.290482921989) + , Qt.point(0.529387680556,0.290482472192) + , Qt.point(0.529387175,0.290481927992) + , Qt.point(0.529386519444,0.290481033946) + , Qt.point(0.529386238889,0.290480678547) + , Qt.point(0.529385916667,0.290480300936) + , Qt.point(0.529384797222,0.290479579029) + , Qt.point(0.529384433333,0.290479301372) + , Qt.point(0.529384111111,0.290479045927) + , Qt.point(0.529383663889,0.290478951523) + , Qt.point(0.529383413889,0.290478657205) + , Qt.point(0.529383147222,0.290478207398) + , Qt.point(0.529382894444,0.290477974164) + , Qt.point(0.529382477778,0.290477607654) + , Qt.point(0.529382155556,0.290477385526) + , Qt.point(0.52938175,0.290477174504) + , Qt.point(0.529381427778,0.290477146738) + , Qt.point(0.529381066667,0.290477174504) + , Qt.point(0.529380716667,0.290477218929) + , Qt.point(0.529380480556,0.290477246695) + , Qt.point(0.529380283333,0.290477191163) + , Qt.point(0.529380002778,0.290476924609) + , Qt.point(0.529379475,0.290476086071) + , Qt.point(0.529379291667,0.290475652917) + , Qt.point(0.529379108333,0.290475330828) + , Qt.point(0.529378744444,0.290475047611) + , Qt.point(0.529378144444,0.290474647775) + , Qt.point(0.529377472222,0.290474214618) + , Qt.point(0.529377066667,0.290473959165) + , Qt.point(0.529376663889,0.290473592647) + , Qt.point(0.529375655556,0.290472382019) + , Qt.point(0.529375191667,0.290471821129) + , Qt.point(0.529374605556,0.290471221364) + , Qt.point(0.529374102778,0.290470727111) + , Qt.point(0.529373333333,0.290470127342) + , Qt.point(0.529372241667,0.290469177704) + , Qt.point(0.529371419444,0.29046808367) + , Qt.point(0.529371180556,0.290467778228) + , Qt.point(0.529370719444,0.290467328394) + , Qt.point(0.529370452778,0.290467067379) + , Qt.point(0.529370213889,0.29046680081) + , Qt.point(0.529370002778,0.290466589776) + , Qt.point(0.529369569444,0.290466267671) + , Qt.point(0.529369122222,0.290465978886) + , Qt.point(0.529368675,0.290465612352) + , Qt.point(0.529368161111,0.290465123638) + , Qt.point(0.529367963889,0.290464868173) + , Qt.point(0.529367780556,0.290464434993) + , Qt.point(0.529367541667,0.290463935168) + , Qt.point(0.529367247222,0.290463624166) + , Qt.point(0.529366858333,0.290462991052) + , Qt.point(0.529365947222,0.290461902535) + , Qt.point(0.529365625,0.290461458241) + , Qt.point(0.529365136111,0.290460814012) + , Qt.point(0.529364966667,0.290460647401) + , Qt.point(0.529364716667,0.290460508558) + , Qt.point(0.529364338889,0.290460397483) + , Qt.point(0.529364141667,0.290460286409) + , Qt.point(0.529364047222,0.290460142012) + , Qt.point(0.529363877778,0.290459625515) + , Qt.point(0.5293635,0.290459109016) + , Qt.point(0.529363094444,0.29045868693) + , Qt.point(0.529362897222,0.29045839258) + , Qt.point(0.5293627,0.290458014922) + , Qt.point(0.529362477778,0.290457737233) + , Qt.point(0.529362283333,0.290457509527) + , Qt.point(0.529362058333,0.290457370681) + , Qt.point(0.529361697222,0.290457298482) + , Qt.point(0.529361486111,0.290457259605) + , Qt.point(0.529361305556,0.29045712076) + , Qt.point(0.529360772222,0.290456115516) + , Qt.point(0.529360238889,0.290455399068) + , Qt.point(0.529359486111,0.290454388261) + , Qt.point(0.529359261111,0.290453899517) + , Qt.point(0.529358966667,0.290453410772) + , Qt.point(0.529358433333,0.290452799838) + , Qt.point(0.529358322222,0.29045263322) + , Qt.point(0.529358211111,0.290452138917) + , Qt.point(0.529358044444,0.290451855665) + , Qt.point(0.529357777778,0.290451550196) + , Qt.point(0.529357566667,0.290451283604) + , Qt.point(0.529357161111,0.290450433841) + , Qt.point(0.529357005556,0.290450233896) + , Qt.point(0.529356697222,0.290449983965) + , Qt.point(0.529356222222,0.290449778465) + , Qt.point(0.529355875,0.29044955075) + , Qt.point(0.529355608333,0.290449311925) + , Qt.point(0.529355358333,0.290449006452) + , Qt.point(0.52935505,0.290448601005) + , Qt.point(0.529354725,0.290448040043) + , Qt.point(0.529354544444,0.29044759016) + , Qt.point(0.529354305556,0.290447284684) + , Qt.point(0.529354066667,0.290447173602) + , Qt.point(0.529353591667,0.290447134723) + , Qt.point(0.529353355556,0.290447079182) + , Qt.point(0.529353091667,0.290446851463) + , Qt.point(0.529352613889,0.290446134979) + , Qt.point(0.529351916667,0.290445607334) + , Qt.point(0.529351636111,0.290445396275) + , Qt.point(0.529351019444,0.290444657569) + , Qt.point(0.529350472222,0.290444224341) + , Qt.point(0.529349166667,0.290442780241) + , Qt.point(0.5293326,0.290433493298) + , Qt.point(0.529331894444,0.290432821198) + , Qt.point(0.529331686111,0.290432076887) + , Qt.point(0.529331469444,0.290431721394) + , Qt.point(0.529330683333,0.290430449389) + , Qt.point(0.529328080556,0.290425983417) + , Qt.point(0.529324786111,0.290419667547) + , Qt.point(0.529323347222,0.290418623213) + , Qt.point(0.529321819444,0.290417823294) + , Qt.point(0.529313730556,0.290426677761) + , Qt.point(0.529311611111,0.290429543983) + , Qt.point(0.529303108333,0.290434876371) + , Qt.point(0.5293013,0.290433787688) + , Qt.point(0.529296844444,0.290430327187) + , Qt.point(0.529295886111,0.29042958842) + , Qt.point(0.529294908333,0.290428877424) + , Qt.point(0.529294611111,0.290428594135) + , Qt.point(0.529294116667,0.290428010893) + , Qt.point(0.529293425,0.29042719435) + , Qt.point(0.529293072222,0.290426777746) + , Qt.point(0.529292897222,0.29042657222) + , Qt.point(0.529292691667,0.290425744562) + , Qt.point(0.529292483333,0.2904249169) + , Qt.point(0.529292388889,0.290424539174) + , Qt.point(0.529291677778,0.290421695093) + , Qt.point(0.529289602778,0.290413412567) + , Qt.point(0.529289152778,0.290411612693) + , Qt.point(0.529288883333,0.290410534982) + , Qt.point(0.529284263889,0.290408129553) + , Qt.point(0.529278477778,0.290405113001) + , Qt.point(0.529277194444,0.290404446353) + , Qt.point(0.529271580556,0.290401524184) + , Qt.point(0.529269638889,0.290400296415) + , Qt.point(0.529267008333,0.290399001971) + , Qt.point(0.529265691667,0.290397968631) + , Qt.point(0.529265611111,0.290397863074) + , Qt.point(0.52926465,0.290396574168) + , Qt.point(0.529263863889,0.290396390832) + , Qt.point(0.52926255,0.29039629083) + , Qt.point(0.529261377778,0.290396063048) + , Qt.point(0.529260575,0.290396063048) + , Qt.point(0.529258811111,0.290396640836) + , Qt.point(0.529256513889,0.29039755196) + , Qt.point(0.529255311111,0.290397740851) + , Qt.point(0.529253836111,0.290398446412) + , Qt.point(0.529252663889,0.290398735303) + , Qt.point(0.529251522222,0.290399018637) + , Qt.point(0.529250680556,0.290399035304) + , Qt.point(0.529249666667,0.290398918637) + , Qt.point(0.529249122222,0.29039885197) + , Qt.point(0.529247108333,0.290401601961) + , Qt.point(0.529247027778,0.290401774181) + , Qt.point(0.529246722222,0.290402418617) + , Qt.point(0.529246638889,0.290402679724) + , Qt.point(0.529246422222,0.290403163049) + , Qt.point(0.529246286111,0.29040335749) + , Qt.point(0.529245947222,0.290403413044) + , Qt.point(0.529245588889,0.290403390822) + , Qt.point(0.529245088889,0.290403140827) + , Qt.point(0.529244952778,0.290403063051) + , Qt.point(0.529244861111,0.290402913054) + , Qt.point(0.529243877778,0.290401279742) + , Qt.point(0.529243586111,0.290401013078) + , Qt.point(0.529243183333,0.290400896412) + , Qt.point(0.529241891667,0.290400940856) + , Qt.point(0.529240897222,0.290400751968) + , Qt.point(0.529239772222,0.290400251971) + , Qt.point(0.529237755556,0.29039924086) + , Qt.point(0.529237419444,0.290398846414) + , Qt.point(0.529236786111,0.290399068637) + , Qt.point(0.529233775,0.290399101971) + , Qt.point(0.529232538889,0.290399368638) + , Qt.point(0.529232205556,0.290399690861) + , Qt.point(0.529231775,0.290399551972) + , Qt.point(0.529231219444,0.290399624194) + , Qt.point(0.529231108333,0.290399735305) + , Qt.point(0.529231055556,0.29039979086) + , Qt.point(0.529230558333,0.290399868638) + , Qt.point(0.529230541667,0.290399868638) + , Qt.point(0.529230522222,0.290399874194) + , Qt.point(0.529224697222,0.290401451963) + , Qt.point(0.529217472222,0.290403413044) + , Qt.point(0.5292174,0.290403435266) + , Qt.point(0.529216861111,0.290403579707) + , Qt.point(0.529216547222,0.290403163049) + , Qt.point(0.529215083333,0.290401151965) + , Qt.point(0.529212819444,0.290398079743) + , Qt.point(0.529211419444,0.290396396387) + , Qt.point(0.529210702778,0.290395046359) + , Qt.point(0.529209822222,0.290393624095) + , Qt.point(0.529208102778,0.290392590725) + , Qt.point(0.529206483333,0.290390396184) + , Qt.point(0.529204891667,0.290388251619) + , Qt.point(0.529203272222,0.290386162588) + , Qt.point(0.529202513889,0.290385106952) + , Qt.point(0.529201822222,0.290384206879) + , Qt.point(0.529200883333,0.290382867873) + , Qt.point(0.529200422222,0.290382245593) + , Qt.point(0.529199816667,0.290381423291) + , Qt.point(0.529199183333,0.29038062321) + , Qt.point(0.529198608333,0.290379912024) + , Qt.point(0.529197861111,0.290379395301) + , Qt.point(0.529197058333,0.290377706218) + , Qt.point(0.529195633333,0.290376072683) + , Qt.point(0.529194775,0.29037468361) + , Qt.point(0.529193813889,0.290373789042) + , Qt.point(0.529192694444,0.290372666659) + , Qt.point(0.529192219444,0.290372005449) + , Qt.point(0.529191097222,0.290369882896) + , Qt.point(0.529189888889,0.29036837709) + , Qt.point(0.529188483333,0.29036650454) + , Qt.point(0.529186341667,0.290363876269) + , Qt.point(0.529185077778,0.290362398198) + , Qt.point(0.529184363889,0.2903614869) + , Qt.point(0.529182966667,0.290359503144) + , Qt.point(0.529182369444,0.290358797433) + , Qt.point(0.529180997222,0.290357002581) + , Qt.point(0.529180852778,0.290356819205) + , Qt.point(0.529180366667,0.290356241292) + , Qt.point(0.529179069444,0.290354818728) + , Qt.point(0.529177288889,0.290352807115) + , Qt.point(0.529176830556,0.290352401456) + , Qt.point(0.529175266667,0.290350784367) + , Qt.point(0.529173152778,0.290349022779) + , Qt.point(0.529171488889,0.29034728896) + , Qt.point(0.52916985,0.290345632925) + , Qt.point(0.5291693,0.29034498829) + , Qt.point(0.529168275,0.290343593426) + , Qt.point(0.52916785,0.290343032142) + , Qt.point(0.529166477778,0.290341759524) + , Qt.point(0.529165691667,0.290340648059) + , Qt.point(0.529163688889,0.290338108338) + , Qt.point(0.529162916667,0.290337441447) + , Qt.point(0.529162052778,0.290336935719) + , Qt.point(0.529161786111,0.290336335514) + , Qt.point(0.529160397222,0.290334929468) + , Qt.point(0.529160047222,0.290334473752) + , Qt.point(0.529158333333,0.290332600856) + , Qt.point(0.529157602778,0.290331767217) + , Qt.point(0.529156308333,0.290330466732) + , Qt.point(0.529155583333,0.290329705333) + , Qt.point(0.52915455,0.290328616026) + , Qt.point(0.529153233333,0.290327059862) + , Qt.point(0.529152652778,0.290326253987) + , Qt.point(0.529151772222,0.290324847865) + , Qt.point(0.529150836111,0.290323597351) + , Qt.point(0.529148963889,0.290321924429) + , Qt.point(0.529147352778,0.290320218145) + , Qt.point(0.529146,0.290318711932) + , Qt.point(0.529144325,0.290316944479) + , Qt.point(0.529142686111,0.290315343751) + , Qt.point(0.5291416,0.290314276592) + , Qt.point(0.529140241667,0.290312753656) + , Qt.point(0.529139480556,0.290311897694) + , Qt.point(0.529138833333,0.290309529882) + , Qt.point(0.529138361111,0.290308101398) + , Qt.point(0.529137852778,0.290306500594) + , Qt.point(0.529137325,0.290305383358) + , Qt.point(0.529136569444,0.290303726946) + ] + , 'Nordre Aker_9' : [ + Qt.point(0.529754294444,0.290697887653) + , Qt.point(0.529754866667,0.290697321904) + , Qt.point(0.529755441667,0.29069653429) + , Qt.point(0.529755775,0.290696284693) + , Qt.point(0.529756263889,0.29069560246) + , Qt.point(0.529756491667,0.290694953505) + , Qt.point(0.529756527778,0.290694626253) + , Qt.point(0.5297567,0.290693838627) + , Qt.point(0.529756891667,0.290693344973) + , Qt.point(0.52975705,0.290693050998) + , Qt.point(0.529757175,0.290692435314) + , Qt.point(0.529757661111,0.290691298234) + , Qt.point(0.529758166667,0.290690771292) + , Qt.point(0.529758219444,0.290690405206) + , Qt.point(0.529758133333,0.29068984498) + , Qt.point(0.529758011111,0.290689512173) + , Qt.point(0.529757747222,0.290689090615) + , Qt.point(0.529757502778,0.290688918664) + , Qt.point(0.529757294444,0.290688619135) + , Qt.point(0.529757013889,0.290688341794) + , Qt.point(0.529756944444,0.290686572344) + , Qt.point(0.529756647222,0.290685906716) + , Qt.point(0.529756280556,0.290685418587) + , Qt.point(0.529756366667,0.290684908269) + , Qt.point(0.529756386111,0.290684370215) + , Qt.point(0.529756227778,0.290683804425) + , Qt.point(0.529756211111,0.290683388401) + , Qt.point(0.529756402778,0.290682478693) + , Qt.point(0.529756277778,0.290682073761) + , Qt.point(0.529756330556,0.290681796409) + , Qt.point(0.529756122222,0.290681091934) + , Qt.point(0.529755680556,0.290680781299) + , Qt.point(0.529755680556,0.290680331986) + , Qt.point(0.529755780556,0.290680032444) + , Qt.point(0.529755980556,0.290679688524) + , Qt.point(0.529756077778,0.290679438904) + , Qt.point(0.529756177778,0.290679039512) + , Qt.point(0.529756177778,0.290678340574) + , Qt.point(0.529756227778,0.290678090953) + , Qt.point(0.529756177778,0.29067764718) + , Qt.point(0.529756297222,0.290677380917) + , Qt.point(0.529756838889,0.290676892765) + , Qt.point(0.529756855556,0.290676526651) + , Qt.point(0.529757116667,0.290676049591) + , Qt.point(0.529757569444,0.290675849892) + , Qt.point(0.529758063889,0.290675505964) + , Qt.point(0.529758413889,0.290675206414) + , Qt.point(0.529758563889,0.290675106564) + , Qt.point(0.529759061111,0.290674906863) + , Qt.point(0.529759208333,0.290674757087) + , Qt.point(0.529758961111,0.290674407611) + , Qt.point(0.529758811111,0.290674108058) + , Qt.point(0.529758611111,0.290673808506) + , Qt.point(0.529758313889,0.290673614351) + , Qt.point(0.529758063889,0.290673414649) + , Qt.point(0.529757916667,0.290673115095) + , Qt.point(0.529758063889,0.290672865466) + , Qt.point(0.529758711111,0.290672216431) + , Qt.point(0.529758861111,0.290671916875) + , Qt.point(0.529759108333,0.290671073678) + , Qt.point(0.529759422222,0.290670485658) + , Qt.point(0.529759358333,0.290670125078) + , Qt.point(0.529759544444,0.290669714571) + , Qt.point(0.529759633333,0.2906693318) + , Qt.point(0.529759563889,0.29066857735) + , Qt.point(0.529759719444,0.290668366548) + , Qt.point(0.52976035,0.290667634284) + , Qt.point(0.529760541667,0.290667179392) + , Qt.point(0.529760558333,0.290666807711) + , Qt.point(0.529760611111,0.290666369459) + , Qt.point(0.52976075,0.29066583135) + , Qt.point(0.529760925,0.29066527105) + , Qt.point(0.529761047222,0.290665060244) + , Qt.point(0.529761344444,0.290664450013) + , Qt.point(0.529761494444,0.290664200373) + , Qt.point(0.529761588889,0.290663762115) + , Qt.point(0.529761938889,0.290663484736) + , Qt.point(0.529762236111,0.290663168523) + , Qt.point(0.529762358333,0.290662624858) + , Qt.point(0.529762486111,0.290662264263) + , Qt.point(0.529762744444,0.290661853738) + , Qt.point(0.529763383333,0.290661310069) + , Qt.point(0.529763877778,0.290661049329) + , Qt.point(0.529764105556,0.290660788589) + , Qt.point(0.529763966667,0.290660333679) + , Qt.point(0.529763897222,0.290660017461) + , Qt.point(0.529763983333,0.290659457143) + , Qt.point(0.529764141667,0.290658774774) + , Qt.point(0.529764227778,0.290658225548) + , Qt.point(0.529764244444,0.290657637486) + , Qt.point(0.529764227778,0.290657321263) + , Qt.point(0.529764277778,0.290656733198) + , Qt.point(0.529764377778,0.290656433617) + , Qt.point(0.529764366667,0.290655901028) + , Qt.point(0.529764419444,0.29065525748) + , Qt.point(0.529764577778,0.290654430851) + , Qt.point(0.529764663889,0.290654081335) + , Qt.point(0.529764541667,0.290653820585) + , Qt.point(0.529763563889,0.290653365658) + , Qt.point(0.529762836111,0.290653543191) + , Qt.point(0.529762338889,0.290653393398) + , Qt.point(0.529762025,0.290653188126) + , Qt.point(0.529761741667,0.290653093811) + , Qt.point(0.529761611111,0.29065272765) + , Qt.point(0.529761627778,0.290652466898) + , Qt.point(0.529761591667,0.290652061899) + , Qt.point(0.529761591667,0.290651801146) + , Qt.point(0.529761908333,0.290651362858) + , Qt.point(0.529762238889,0.290651152036) + , Qt.point(0.529762486111,0.290650808062) + , Qt.point(0.529762536111,0.29065048628) + , Qt.point(0.529762586111,0.290649959221) + , Qt.point(0.529762536111,0.290649010511) + , Qt.point(0.529762397222,0.290648666533) + , Qt.point(0.529762238889,0.290647828778) + , Qt.point(0.529762255556,0.290647440414) + , Qt.point(0.529762430556,0.290646846769) + , Qt.point(0.529762486111,0.29064652498) + , Qt.point(0.529762633333,0.290645975717) + , Qt.point(0.529762605556,0.290645814822) + , Qt.point(0.529762691667,0.29064546529) + , Qt.point(0.529762675,0.290644954861) + , Qt.point(0.5297632,0.290644549846) + , Qt.point(0.529763444444,0.290644216956) + , Qt.point(0.529763897222,0.290642907584) + , Qt.point(0.529764125,0.290642685655) + , Qt.point(0.5297643,0.290642258442) + , Qt.point(0.529764438889,0.290641820132) + , Qt.point(0.529764230556,0.290640754866) + , Qt.point(0.529764316667,0.290640277714) + , Qt.point(0.529764736111,0.29063996701) + , Qt.point(0.529765033333,0.290639700691) + , Qt.point(0.529765313889,0.290639406631) + , Qt.point(0.529765713889,0.290638529995) + , Qt.point(0.529765888889,0.29063824703) + , Qt.point(0.529766111111,0.29063800845) + , Qt.point(0.529766161111,0.290637608968) + , Qt.point(0.529766238889,0.290637270518) + , Qt.point(0.529765994444,0.290636793357) + , Qt.point(0.52976575,0.290636466001) + , Qt.point(0.529765522222,0.290636011032) + , Qt.point(0.529765363889,0.290635589351) + , Qt.point(0.529765294444,0.290635289736) + , Qt.point(0.529765258333,0.290634923539) + , Qt.point(0.529765563889,0.290634418629) + , Qt.point(0.529765872222,0.290633958106) + , Qt.point(0.529766111111,0.290633675133) + , Qt.point(0.529766622222,0.290632981571) + , Qt.point(0.529766866667,0.290632609821) + , Qt.point(0.529767652778,0.290631649925) + , Qt.point(0.529767933333,0.290631194943) + , Qt.point(0.529768141667,0.290630756606) + , Qt.point(0.529768702778,0.290630334914) + , Qt.point(0.529769277778,0.290629968707) + , Qt.point(0.529769786111,0.29062975786) + , Qt.point(0.529770119444,0.290629530367) + , Qt.point(0.529771061111,0.290629141964) + , Qt.point(0.529771463889,0.290628775754) + , Qt.point(0.529771827778,0.29062834296) + , Qt.point(0.529772027778,0.290628043333) + , Qt.point(0.529772475,0.290627199935) + , Qt.point(0.529773666667,0.290625396605) + , Qt.point(0.529774591667,0.290624186976) + , Qt.point(0.529775308333,0.290622894108) + , Qt.point(0.529776952778,0.290620369381) + , Qt.point(0.529777647222,0.290619181915) + , Qt.point(0.529778541667,0.290617933403) + , Qt.point(0.529779469444,0.290617395153) + , Qt.point(0.529780380556,0.290617089959) + , Qt.point(0.529780938889,0.290617273075) + , Qt.point(0.529780797222,0.29061562502) + , Qt.point(0.529780816667,0.290613682849) + , Qt.point(0.529781672222,0.290611352216) + , Qt.point(0.529782319444,0.290610425504) + , Qt.point(0.529782791667,0.290609304565) + , Qt.point(0.529783016667,0.290607956099) + , Qt.point(0.529783,0.290606185875) + , Qt.point(0.529782825,0.290603877345) + , Qt.point(0.529782702778,0.290599482179) + , Qt.point(0.529782719444,0.290595242298) + , Qt.point(0.529782580556,0.290588133063) + , Qt.point(0.529782772222,0.290582738518) + , Qt.point(0.529783105556,0.290577748979) + , Qt.point(0.529783472222,0.290576960852) + , Qt.point(0.52978405,0.290576172723) + , Qt.point(0.529785833333,0.290574651955) + , Qt.point(0.529786847222,0.290574629754) + , Qt.point(0.529788472222,0.290574280087) + , Qt.point(0.529790063889,0.290573985922) + , Qt.point(0.5297912,0.290573475295) + , Qt.point(0.529791830556,0.290573020169) + , Qt.point(0.529793194444,0.290571671437) + , Qt.point(0.529793072222,0.290570988742) + , Qt.point(0.529793105556,0.290570078477) + , Qt.point(0.529793019444,0.290569356923) + , Qt.point(0.529793105556,0.290568763026) + , Qt.point(0.529793525,0.290568380045) + , Qt.point(0.529793911111,0.290568257935) + , Qt.point(0.529794225,0.290568185779) + , Qt.point(0.529794497222,0.290568263485) + , Qt.point(0.529794652778,0.290568418898) + , Qt.point(0.529794802778,0.290568618715) + , Qt.point(0.529795,0.290568768577) + , Qt.point(0.529795347222,0.290568768577) + , Qt.point(0.529795597222,0.290568818531) + , Qt.point(0.529796094444,0.290569068301) + , Qt.point(0.529796344444,0.290569018347) + , Qt.point(0.529796791667,0.290568968393) + , Qt.point(0.529797188889,0.290568868485) + , Qt.point(0.529797983333,0.290568868485) + , Qt.point(0.529798333333,0.290568918439) + , Qt.point(0.529799127778,0.290568918439) + , Qt.point(0.529799527778,0.290568968393) + , Qt.point(0.529800222222,0.290568768577) + , Qt.point(0.529800519444,0.290568718623) + , Qt.point(0.529800877778,0.290568585412) + , Qt.point(0.529801216667,0.290568568761) + , Qt.point(0.529801416667,0.290568269036) + , Qt.point(0.529801463889,0.290567969311) + , Qt.point(0.529801563889,0.290567625181) + , Qt.point(0.529801830556,0.290566992425) + , Qt.point(0.529801725,0.290566431824) + , Qt.point(0.529801863889,0.290566154298) + , Qt.point(0.529802913889,0.29056606549) + , Qt.point(0.529803175,0.290565926726) + , Qt.point(0.529803316667,0.290565504886) + , Qt.point(0.529803280556,0.29056524401) + , Qt.point(0.529803333333,0.290564333717) + , Qt.point(0.529803561111,0.290564000682) + , Qt.point(0.529803891667,0.290563595488) + , Qt.point(0.529803822222,0.29056315699) + , Qt.point(0.529803736111,0.290562946067) + , Qt.point(0.529803963889,0.290562757346) + , Qt.point(0.529804277778,0.290562335497) + , Qt.point(0.529804663889,0.2905619303) + , Qt.point(0.529804888889,0.290562002459) + , Qt.point(0.529805675,0.290561835939) + , Qt.point(0.529806233333,0.290561464045) + , Qt.point(0.5298064,0.290561269771) + , Qt.point(0.529806666667,0.290561108802) + , Qt.point(0.529806852778,0.290561208714) + , Qt.point(0.529807269444,0.290561069947) + , Qt.point(0.529807491667,0.290561269771) + , Qt.point(0.529807947222,0.29056125867) + , Qt.point(0.529808191667,0.290561158758) + , Qt.point(0.529808436111,0.290561125454) + , Qt.point(0.529808441667,0.290561280873) + , Qt.point(0.529808588889,0.290561480697) + , Qt.point(0.529808611111,0.290561319727) + , Qt.point(0.529808830556,0.290561208714) + , Qt.point(0.529808897222,0.290560864572) + , Qt.point(0.529808788889,0.290560392763) + , Qt.point(0.529808552778,0.290560076373) + , Qt.point(0.529808388889,0.290559782185) + , Qt.point(0.529808211111,0.290558944025) + , Qt.point(0.529808594444,0.290558616531) + , Qt.point(0.529808747222,0.290558616531) + , Qt.point(0.529808975,0.290558783053) + , Qt.point(0.529809075,0.290558427805) + , Qt.point(0.529808969444,0.290557906033) + , Qt.point(0.529809247222,0.290556668206) + , Qt.point(0.529809272222,0.290556340708) + , Qt.point(0.5298094,0.290555985455) + , Qt.point(0.529809486111,0.290555447024) + , Qt.point(0.529809605556,0.290555014057) + , Qt.point(0.529809825,0.290554342402) + , Qt.point(0.529809975,0.290553765109) + , Qt.point(0.529810069444,0.290553626337) + , Qt.point(0.529810469444,0.290553776211) + , Qt.point(0.529810519444,0.290553970492) + , Qt.point(0.529811513889,0.290555069566) + , Qt.point(0.529812011111,0.290556063167) + , Qt.point(0.529812408333,0.290556962399) + , Qt.point(0.529813005556,0.290558005947) + , Qt.point(0.529813502778,0.290559604562) + , Qt.point(0.5298139,0.290561147657) + , Qt.point(0.529814,0.290562141225) + , Qt.point(0.529814197222,0.290563140338) + , Qt.point(0.529815091667,0.290570711223) + , Qt.point(0.529815538889,0.29057320333) + , Qt.point(0.529816783333,0.290578481601) + , Qt.point(0.529816847222,0.290579641579) + , Qt.point(0.5298169,0.290580146639) + , Qt.point(0.529817127778,0.29058156746) + , Qt.point(0.529817127778,0.290582144665) + , Qt.point(0.529817355556,0.290582233466) + , Qt.point(0.529817580556,0.290582566468) + , Qt.point(0.529818175,0.290582144665) + , Qt.point(0.52981905,0.290581828312) + , Qt.point(0.52981975,0.290581184505) + , Qt.point(0.529820677778,0.290581040203) + , Qt.point(0.529821008333,0.290581251106) + , Qt.point(0.529822058333,0.290581323257) + , Qt.point(0.529823230556,0.290582039214) + , Qt.point(0.529823597222,0.290582216815) + , Qt.point(0.529824436111,0.290582777369) + , Qt.point(0.529825308333,0.290584930765) + , Qt.point(0.529826113889,0.290587000888) + , Qt.point(0.52982795,0.2905862794) + , Qt.point(0.529828594444,0.290586456997) + , Qt.point(0.529829436111,0.290586612395) + , Qt.point(0.529830327778,0.290586529146) + , Qt.point(0.529831480556,0.290586579095) + , Qt.point(0.529832111111,0.290586651244) + , Qt.point(0.529833211111,0.290588016516) + , Qt.point(0.529832336111,0.290591396352) + , Qt.point(0.529836391667,0.290592833735) + , Qt.point(0.529837580556,0.290592728291) + , Qt.point(0.529839977778,0.290592606197) + , Qt.point(0.529843286111,0.290592861484) + , Qt.point(0.529844891667,0.290589792464) + , Qt.point(0.529845188889,0.290589193083) + , Qt.point(0.529845363889,0.290588915592) + , Qt.point(0.529845713889,0.290588194111) + , Qt.point(0.529846641667,0.290586534696) + , Qt.point(0.529846169444,0.29058313257) + , Qt.point(0.529846430556,0.290582189065) + , Qt.point(0.529846780556,0.290581262206) + , Qt.point(0.529847411111,0.290579458425) + , Qt.point(0.529848530556,0.290576444683) + , Qt.point(0.529848811111,0.290575745355) + , Qt.point(0.529849038889,0.290575029373) + , Qt.point(0.529852308333,0.290575306886) + , Qt.point(0.529852711111,0.290575695403) + , Qt.point(0.529852761111,0.290576095019) + , Qt.point(0.5298546,0.290576150522) + , Qt.point(0.529855561111,0.290576150522) + , Qt.point(0.529856555556,0.290581456458) + , Qt.point(0.529856588889,0.290582594218) + , Qt.point(0.529856536111,0.290586695643) + , Qt.point(0.529858913889,0.290587272832) + , Qt.point(0.529859858333,0.290587467078) + , Qt.point(0.529860383333,0.290587622475) + , Qt.point(0.529862163889,0.290588083114) + , Qt.point(0.529862725,0.290588188561) + , Qt.point(0.529863966667,0.290586434797) + , Qt.point(0.529864422222,0.290585735507) + , Qt.point(0.529865855556,0.290587117435) + , Qt.point(0.529866675,0.290588221861) + , Qt.point(0.529867602778,0.290589381777) + , Qt.point(0.529868230556,0.290590519488) + , Qt.point(0.529870275,0.290594054669) + , Qt.point(0.529872147222,0.290592289862) + , Qt.point(0.529873125,0.290591462949) + , Qt.point(0.529874402778,0.29059071373) + , Qt.point(0.529875502778,0.29059019205) + , Qt.point(0.529876097222,0.290589942309) + , Qt.point(0.529877705556,0.290589470575) + , Qt.point(0.529878825,0.29058929853) + , Qt.point(0.529879855556,0.290589226382) + , Qt.point(0.529880347222,0.290589226382) + , Qt.point(0.529891830556,0.290588216311) + , Qt.point(0.529892369444,0.290588133063) + , Qt.point(0.529892844444,0.290587994316) + , Qt.point(0.529893072222,0.290589448375) + , Qt.point(0.529894627778,0.290590425141) + , Qt.point(0.529897177778,0.290591812584) + , Qt.point(0.529897844444,0.290590796977) + , Qt.point(0.529898525,0.290591252058) + , Qt.point(0.52989975,0.29059212892) + , Qt.point(0.5299008,0.290591340855) + , Qt.point(0.529901536111,0.290588366157) + , Qt.point(0.529902163889,0.290586773342) + , Qt.point(0.529903147222,0.290584792016) + , Qt.point(0.529903444444,0.290584248119) + , Qt.point(0.529903672222,0.29058367092) + , Qt.point(0.529903811111,0.29058365427) + , Qt.point(0.529904913889,0.29058365427) + , Qt.point(0.529905561111,0.29058362097) + , Qt.point(0.529906994444,0.29058365982) + , Qt.point(0.529906897222,0.290581018003) + , Qt.point(0.529906858333,0.290578753558) + , Qt.point(0.52990665,0.290576672242) + , Qt.point(0.529906511111,0.290575778656) + , Qt.point(0.529907875,0.290575112627) + , Qt.point(0.529910533333,0.290573747259) + , Qt.point(0.529912422222,0.290572592794) + , Qt.point(0.529914936111,0.290570877734) + , Qt.point(0.529915861111,0.290570206137) + , Qt.point(0.529917030556,0.290569290318) + , Qt.point(0.529918330556,0.290568418898) + , Qt.point(0.529920180556,0.290567519722) + , Qt.point(0.529920622222,0.290567353208) + , Qt.point(0.529921097222,0.290567253299) + , Qt.point(0.529922902778,0.290566986875) + , Qt.point(0.529924,0.290566986875) + , Qt.point(0.529925755556,0.290565937828) + , Qt.point(0.529931627778,0.290564394773) + , Qt.point(0.529933630556,0.290564239357) + , Qt.point(0.529933963889,0.290564489133) + , Qt.point(0.529934652778,0.290564916527) + , Qt.point(0.529935591667,0.290565288414) + , Qt.point(0.529936327778,0.290565499335) + , Qt.point(0.529936852778,0.29056554929) + , Qt.point(0.529937208333,0.290565299515) + , Qt.point(0.529937780556,0.290565588144) + , Qt.point(0.529938444444,0.290565638099) + , Qt.point(0.529938916667,0.290565610346) + , Qt.point(0.529939477778,0.290565488234) + , Qt.point(0.529939788889,0.290565577043) + , Qt.point(0.529940577778,0.290565604795) + , Qt.point(0.529941469444,0.290565571492) + , Qt.point(0.529942569444,0.290565427178) + , Qt.point(0.529943544444,0.290565132999) + , Qt.point(0.529944233333,0.290564827718) + , Qt.point(0.529945130556,0.290564256009) + , Qt.point(0.529945422222,0.290564089491) + , Qt.point(0.529945880556,0.290564000682) + , Qt.point(0.529946427778,0.290563811962) + , Qt.point(0.529946836111,0.290563367914) + , Qt.point(0.529946930556,0.290563617691) + , Qt.point(0.529946947222,0.290564222705) + , Qt.point(0.529947230556,0.290564400324) + , Qt.point(0.529947680556,0.290564638999) + , Qt.point(0.529948427778,0.290564688954) + , Qt.point(0.529949377778,0.290564527987) + , Qt.point(0.529950177778,0.290564638999) + , Qt.point(0.529950847222,0.290564389223) + , Qt.point(0.529951552778,0.290564322616) + , Qt.point(0.529952561111,0.290564550189) + , Qt.point(0.529952927778,0.290564716707) + , Qt.point(0.529953269444,0.290564994235) + , Qt.point(0.529953552778,0.290565121898) + , Qt.point(0.529954122222,0.290565216257) + , Qt.point(0.529954594444,0.290565355021) + , Qt.point(0.52995495,0.290565565942) + , Qt.point(0.529955211111,0.290565849019) + , Qt.point(0.529956013889,0.290566814809) + , Qt.point(0.529956763889,0.290567641833) + , Qt.point(0.529957361111,0.29056808032) + , Qt.point(0.529958691667,0.290568668669) + , Qt.point(0.529959377778,0.290568846283) + , Qt.point(0.529961447222,0.29056945128) + , Qt.point(0.529962344444,0.290569778755) + , Qt.point(0.529963152778,0.29057011178) + , Qt.point(0.529963827778,0.290570084028) + , Qt.point(0.529964958333,0.290569778755) + , Qt.point(0.529965147222,0.290569606692) + , Qt.point(0.529966341667,0.290569001695) + , Qt.point(0.529966625,0.290568973943) + , Qt.point(0.529966475,0.290568729724) + , Qt.point(0.529966255556,0.290568513256) + , Qt.point(0.529966163889,0.290566642744) + , Qt.point(0.529966036111,0.290566304162) + , Qt.point(0.529966116667,0.290565982232) + , Qt.point(0.529966038889,0.290565671402) + , Qt.point(0.529966041667,0.290565199605) + , Qt.point(0.529965941667,0.290564905426) + , Qt.point(0.529965911111,0.290564566841) + , Qt.point(0.529965227778,0.290564111694) + , Qt.point(0.529965355556,0.290563628792) + , Qt.point(0.529965766667,0.290563850816) + , Qt.point(0.529965952778,0.290563478926) + , Qt.point(0.529968344444,0.290563351262) + , Qt.point(0.529968875,0.290563323509) + , Qt.point(0.529969677778,0.29056351778) + , Qt.point(0.529972388889,0.290563534432) + , Qt.point(0.529973577778,0.290563484476) + , Qt.point(0.529973802778,0.290564378122) + , Qt.point(0.529973925,0.290564955381) + , Qt.point(0.529973975,0.290566182051) + , Qt.point(0.529973486111,0.290567475318) + , Qt.point(0.529973275,0.29056856321) + , Qt.point(0.529973186111,0.290570067377) + , Qt.point(0.529972955556,0.290571960056) + , Qt.point(0.529972575,0.29057321443) + , Qt.point(0.52997305,0.290572653848) + , Qt.point(0.529973761111,0.290571998908) + , Qt.point(0.529974147222,0.290571382818) + , Qt.point(0.529974269444,0.290570983191) + , Qt.point(0.529974338889,0.290570544711) + , Qt.point(0.529974602778,0.290569667747) + , Qt.point(0.529974830556,0.290569456831) + , Qt.point(0.529975144444,0.29056931807) + , Qt.point(0.529975702778,0.290569351373) + , Qt.point(0.529977430556,0.290570516959) + , Qt.point(0.529977836111,0.290570861083) + , Qt.point(0.529978377778,0.290571127501) + , Qt.point(0.529978797222,0.290571232958) + , Qt.point(0.529980016667,0.29057096654) + , Qt.point(0.529980458333,0.290570689021) + , Qt.point(0.529980930556,0.290570339346) + , Qt.point(0.52998135,0.290569917515) + , Qt.point(0.529981455556,0.290569429079) + , Qt.point(0.529981861111,0.290568047017) + , Qt.point(0.529982052778,0.290567064582) + , Qt.point(0.529982125,0.290565910075) + , Qt.point(0.529982125,0.290565527088) + , Qt.point(0.529982211111,0.290564966482) + , Qt.point(0.529982161111,0.29056436702) + , Qt.point(0.529982005556,0.290563650994) + , Qt.point(0.529981811111,0.290563179193) + , Qt.point(0.529981305556,0.290562474263) + , Qt.point(0.529981533333,0.290561969155) + , Qt.point(0.529981830556,0.290561441842) + , Qt.point(0.529982216667,0.290560692501) + , Qt.point(0.529982391667,0.290559987562) + , Qt.point(0.529982638889,0.290559465794) + , Qt.point(0.529982847222,0.290559166054) + , Qt.point(0.529983213889,0.290559149402) + , Qt.point(0.529983966667,0.290559626765) + , Qt.point(0.529984577778,0.290560392763) + , Qt.point(0.529985327778,0.2905610977) + , Qt.point(0.52998725,0.290562674086) + , Qt.point(0.529989977778,0.290562907212) + , Qt.point(0.529990361111,0.290564428077) + , Qt.point(0.529992719444,0.29056693692) + , Qt.point(0.529996108333,0.290570267191) + , Qt.point(0.529997052778,0.290571060897) + , Qt.point(0.529996475,0.290571638135) + , Qt.point(0.529995916667,0.290571915653) + , Qt.point(0.529995197222,0.290572143217) + , Qt.point(0.529994497222,0.290572209821) + , Qt.point(0.529993833333,0.29057203776) + , Qt.point(0.529993238889,0.290571754692) + , Qt.point(0.529993430556,0.290572892512) + , Qt.point(0.529995811111,0.29057268715) + , Qt.point(0.529996630556,0.290574069176) + , Qt.point(0.529993830556,0.290574418844) + , Qt.point(0.52999465,0.290577521422) + , Qt.point(0.529997341667,0.290578015387) + , Qt.point(0.529996727778,0.290581950413) + , Qt.point(0.529996183333,0.290582949419) + , Qt.point(0.529995430556,0.29058355992) + , Qt.point(0.529994205556,0.290584420168) + , Qt.point(0.529994047222,0.290585419161) + , Qt.point(0.529993608333,0.29058736163) + , Qt.point(0.529993513889,0.290593055724) + , Qt.point(0.529993441667,0.290595436535) + , Qt.point(0.529993508333,0.290597956055) + , Qt.point(0.529993386111,0.290599565422) + , Qt.point(0.529993366667,0.290601213621) + , Qt.point(0.5299931,0.290604310197) + , Qt.point(0.529995144444,0.290605525505) + , Qt.point(0.529997938889,0.290607118158) + , Qt.point(0.529997977778,0.29060810038) + , Qt.point(0.529997825,0.290610392209) + , Qt.point(0.529997575,0.290612084704) + , Qt.point(0.529997388889,0.290613016957) + , Qt.point(0.529997177778,0.29061361626) + , Qt.point(0.529996627778,0.290614720526) + , Qt.point(0.529996077778,0.290616263158) + , Qt.point(0.529995827778,0.290617655954) + , Qt.point(0.529995427778,0.290618704707) + , Qt.point(0.529995080556,0.290619697964) + , Qt.point(0.529994927778,0.290621640072) + , Qt.point(0.529995188889,0.290623571062) + , Qt.point(0.529995136111,0.290625185753) + , Qt.point(0.529995136111,0.290626656164) + , Qt.point(0.529995069444,0.290628714719) + , Qt.point(0.529994969444,0.29062955811) + , Qt.point(0.529994991667,0.290630246137) + , Qt.point(0.529994966667,0.29063204942) + , Qt.point(0.529994847222,0.290634130109) + , Qt.point(0.529994897222,0.290636305097) + , Qt.point(0.529995086111,0.290638274771) + , Qt.point(0.529995397222,0.290640488549) + , Qt.point(0.52999555,0.290642308376) + , Qt.point(0.529995747222,0.290644006125) + , Qt.point(0.529995844444,0.290646092227) + , Qt.point(0.529995808333,0.290648211594) + , Qt.point(0.529995522222,0.290649753945) + , Qt.point(0.529996811111,0.29065162916) + , Qt.point(0.529997266667,0.290651595872) + , Qt.point(0.529998,0.290652333747) + , Qt.point(0.529997452778,0.290656483547) + , Qt.point(0.529995722222,0.29065620061) + , Qt.point(0.529995741667,0.290655745689) + , Qt.point(0.529993991667,0.290655373984) + , Qt.point(0.529993905556,0.290655917671) + , Qt.point(0.529993325,0.290657981447) + , Qt.point(0.529992894444,0.29065963467) + , Qt.point(0.529992294444,0.290662175501) + , Qt.point(0.529992205556,0.290662402953) + , Qt.point(0.529994875,0.290664777319) + , Qt.point(0.52999545,0.290664289134) + , Qt.point(0.529996027778,0.290664217016) + , Qt.point(0.529996369444,0.290664522132) + , Qt.point(0.529996519444,0.290664771772) + , Qt.point(0.529996666667,0.290665221122) + , Qt.point(0.529996866667,0.290665670472) + , Qt.point(0.529997163889,0.290666114273) + , Qt.point(0.529997511111,0.290666563621) + , Qt.point(0.529997958333,0.290666813258) + , Qt.point(0.529998405556,0.290667112822) + , Qt.point(0.5299988,0.290667662022) + , Qt.point(0.529999447222,0.290668710489) + , Qt.point(0.530000388889,0.290670435731) + , Qt.point(0.530001180556,0.290671944612) + , Qt.point(0.530001280556,0.290672344019) + , Qt.point(0.530001430556,0.2906726935) + , Qt.point(0.530001975,0.290674285571) + , Qt.point(0.530002325,0.290674990072) + , Qt.point(0.530003263889,0.290677774765) + , Qt.point(0.530004302778,0.290681014276) + , Qt.point(0.530004744444,0.29068196282) + , Qt.point(0.530006108333,0.290681141858) + , Qt.point(0.530006580556,0.290681385928) + , Qt.point(0.530010358333,0.290679655241) + , Qt.point(0.530011163889,0.290681319364) + , Qt.point(0.530011808333,0.290682367753) + , Qt.point(0.530011716667,0.290683177616) + , Qt.point(0.530011730556,0.290684697486) + , Qt.point(0.530011258333,0.290685191163) + , Qt.point(0.530011794444,0.290689334675) + , Qt.point(0.530009366667,0.290689861621) + , Qt.point(0.530008455556,0.290690172241) + , Qt.point(0.530008944444,0.290691658772) + , Qt.point(0.530008752778,0.290691802988) + , Qt.point(0.5300087,0.290692113604) + , Qt.point(0.530008872222,0.290692590622) + , Qt.point(0.530007755556,0.290691886189) + , Qt.point(0.530007091667,0.290691553384) + , Qt.point(0.530006427778,0.290691020897) + , Qt.point(0.530006166667,0.290691553384) + , Qt.point(0.530006002778,0.290692313286) + , Qt.point(0.530006444444,0.2906923743) + , Qt.point(0.530007977778,0.290695247476) + , Qt.point(0.530008952778,0.290698714087) + , Qt.point(0.530009072222,0.290702668716) + , Qt.point(0.530008836111,0.290705685936) + , Qt.point(0.530009727778,0.290705192313) + , Qt.point(0.530009486111,0.290707449655) + , Qt.point(0.530006438889,0.290713256499) + , Qt.point(0.529999347222,0.290726217244) + , Qt.point(0.529996916667,0.290727137827) + , Qt.point(0.529995938889,0.29072745393) + , Qt.point(0.529993316667,0.290728429963) + , Qt.point(0.529991377778,0.290729034436) + , Qt.point(0.529981336111,0.290732555864) + , Qt.point(0.529977133333,0.290734097508) + , Qt.point(0.529976013889,0.290734552235) + , Qt.point(0.5299721,0.290736282405) + , Qt.point(0.529969547222,0.290737557841) + , Qt.point(0.529968166667,0.29073827319) + , Qt.point(0.529967030556,0.290738933083) + , Qt.point(0.529965177778,0.290740086504) + , Qt.point(0.529963202778,0.290741450637) + , Qt.point(0.529962241667,0.29074227133) + , Qt.point(0.529958988889,0.290745176997) + , Qt.point(0.529957852778,0.290746208387) + , Qt.point(0.529952713889,0.290750472514) + , Qt.point(0.52995165,0.29075144288) + , Qt.point(0.529951369444,0.290751642497) + , Qt.point(0.529951,0.290750417064) + , Qt.point(0.529948130556,0.290738251008) + , Qt.point(0.529947280556,0.290732827594) + , Qt.point(0.529946652778,0.290729089892) + , Qt.point(0.529940411111,0.290703450758) + , Qt.point(0.529939477778,0.290699817842) + , Qt.point(0.529939077778,0.290699917679) + , Qt.point(0.529938188889,0.290696489917) + , Qt.point(0.529938030556,0.290696523197) + , Qt.point(0.529937544444,0.290694387747) + , Qt.point(0.529936319444,0.290694737186) + , Qt.point(0.529935102778,0.290693239586) + , Qt.point(0.529933247222,0.29069144245) + , Qt.point(0.529932530556,0.290690848947) + , Qt.point(0.529931588889,0.290690183334) + , Qt.point(0.52992965,0.290689079522) + , Qt.point(0.529926558333,0.290687864765) + , Qt.point(0.529924619444,0.290687482032) + , Qt.point(0.529923938889,0.290687376641) + , Qt.point(0.529922766667,0.290687271251) + , Qt.point(0.529922016667,0.290687287892) + , Qt.point(0.529920216667,0.290687581875) + , Qt.point(0.529917122222,0.29068864687) + , Qt.point(0.529914797222,0.290689556547) + , Qt.point(0.529912388889,0.290690427393) + , Qt.point(0.529909808333,0.290691425809) + , Qt.point(0.529905975,0.290692751476) + , Qt.point(0.529904541667,0.290693206306) + , Qt.point(0.529904313889,0.290694171427) + , Qt.point(0.529903505556,0.290694010574) + , Qt.point(0.529902666667,0.29069787656) + , Qt.point(0.529902611111,0.290699557157) + , Qt.point(0.529902858333,0.290701459596) + , Qt.point(0.529902247222,0.290701587164) + , Qt.point(0.529901705556,0.290701659268) + , Qt.point(0.529901180556,0.290701570525) + , Qt.point(0.529900238889,0.290701343121) + , Qt.point(0.529900044444,0.290701781289) + , Qt.point(0.529898916667,0.290701071345) + , Qt.point(0.529896341667,0.290699973144) + , Qt.point(0.529895138889,0.290699745737) + , Qt.point(0.529894227778,0.290699779016) + , Qt.point(0.529893580556,0.290699917679) + , Qt.point(0.529892952778,0.290700200549) + , Qt.point(0.529892591667,0.290700505605) + , Qt.point(0.529891808333,0.290701287656) + , Qt.point(0.529891138889,0.290702130714) + , Qt.point(0.529890697222,0.290702768551) + , Qt.point(0.5298904,0.290702979315) + , Qt.point(0.529889841667,0.290703084696) + , Qt.point(0.529889369444,0.290703084696) + , Qt.point(0.529889327778,0.290701221099) + , Qt.point(0.529889458333,0.290699901039) + , Qt.point(0.529882905556,0.290696905911) + , Qt.point(0.529876055556,0.290702696448) + , Qt.point(0.529874797222,0.290703306552) + , Qt.point(0.529865341667,0.290707360915) + , Qt.point(0.529863858333,0.290708287139) + , Qt.point(0.529863158333,0.290708586635) + , Qt.point(0.529861586111,0.29070934092) + , Qt.point(0.529860608333,0.290709740247) + , Qt.point(0.529859175,0.290710372511) + , Qt.point(0.529858563889,0.290709058064) + , Qt.point(0.529858127778,0.290707954364) + , Qt.point(0.529856677778,0.290707954364) + , Qt.point(0.529856361111,0.29070970697) + , Qt.point(0.529856222222,0.290710816205) + , Qt.point(0.529856202778,0.290711770142) + , Qt.point(0.529856325,0.290713151123) + , Qt.point(0.529856830556,0.290715197618) + , Qt.point(0.529858313889,0.290719595565) + , Qt.point(0.529861313889,0.290728169319) + , Qt.point(0.529852577778,0.290725751405) + , Qt.point(0.529852438889,0.290726416889) + , Qt.point(0.529852247222,0.290727553752) + , Qt.point(0.529851966667,0.290729649997) + , Qt.point(0.529851719444,0.290731208302) + , Qt.point(0.529843344444,0.290726538894) + , Qt.point(0.529842866667,0.290726256064) + , Qt.point(0.529843305556,0.290725379842) + , Qt.point(0.529844438889,0.290722756698) + , Qt.point(0.5298396,0.290720915484) + , Qt.point(0.529838875,0.290720416356) + , Qt.point(0.529838080556,0.290719601111) + , Qt.point(0.529837069444,0.290717238545) + , Qt.point(0.529836841667,0.290716767137) + , Qt.point(0.529836369444,0.290716329005) + , Qt.point(0.529836161111,0.290716012883) + , Qt.point(0.529835269444,0.290716118257) + , Qt.point(0.529832038889,0.290719146347) + , Qt.point(0.5298264,0.290724143143) + , Qt.point(0.529824138889,0.290726178424) + , Qt.point(0.529818077778,0.29073235068) + , Qt.point(0.529810497222,0.290739470977) + , Qt.point(0.529809427778,0.290743097565) + , Qt.point(0.52980885,0.290744184418) + , Qt.point(0.529808572222,0.290744356317) + , Qt.point(0.529808186111,0.290744533762) + , Qt.point(0.529807961111,0.290744672391) + , Qt.point(0.529806788889,0.290744955192) + , Qt.point(0.529806458333,0.290745038369) + , Qt.point(0.529806025,0.290743452456) + , Qt.point(0.529805925,0.290742759308) + , Qt.point(0.529803538889,0.290744400679) + , Qt.point(0.529800758333,0.290746291564) + , Qt.point(0.529790702778,0.290753278244) + , Qt.point(0.529789636111,0.290752091636) + , Qt.point(0.529788886111,0.290751320891) + , Qt.point(0.529788063889,0.290750760852) + , Qt.point(0.529787347222,0.290750306165) + , Qt.point(0.529786316667,0.290749380153) + , Qt.point(0.529785602778,0.290748631577) + , Qt.point(0.529785461111,0.290748992003) + , Qt.point(0.529778491667,0.290750655497) + , Qt.point(0.529776341667,0.290751237717) + , Qt.point(0.529774838889,0.290750028916) + , Qt.point(0.529773777778,0.290751320891) + , Qt.point(0.529772272222,0.290753333693) + , Qt.point(0.529771241667,0.290754653369) + , Qt.point(0.529771030556,0.290755013783) + , Qt.point(0.529770716667,0.290755368651) + , Qt.point(0.52977035,0.290755451824) + , Qt.point(0.529768602778,0.29075756993) + , Qt.point(0.529765408333,0.290760370007) + , Qt.point(0.529763486111,0.290758762047) + , Qt.point(0.529762488889,0.290757974696) + , Qt.point(0.529761844444,0.290758007965) + , Qt.point(0.529762447222,0.290757093081) + , Qt.point(0.529762794444,0.290756643955) + , Qt.point(0.529763047222,0.290756222551) + , Qt.point(0.529763094444,0.290755801146) + , Qt.point(0.529763083333,0.29075493061) + , Qt.point(0.5297631,0.290754470389) + , Qt.point(0.529763188889,0.290753860455) + , Qt.point(0.52976345,0.290752585133) + , Qt.point(0.529764008333,0.29075093829) + , Qt.point(0.529764272222,0.290750272895) + , Qt.point(0.529764930556,0.290748831197) + , Qt.point(0.529765427778,0.290747583565) + , Qt.point(0.529766819444,0.29074463912) + , Qt.point(0.529767275,0.290743607721) + , Qt.point(0.529767572222,0.290742853576) + , Qt.point(0.529768041667,0.290741788896) + , Qt.point(0.529768236111,0.29074140073) + , Qt.point(0.529768391667,0.290740790753) + , Qt.point(0.5297682,0.290740247317) + , Qt.point(0.529767955556,0.290739759332) + , Qt.point(0.529767763889,0.290739443251) + , Qt.point(0.529767536111,0.290738933083) + , Qt.point(0.529768233333,0.290737674293) + , Qt.point(0.529768602778,0.290736604037) + , Qt.point(0.529769141667,0.290735256505) + , Qt.point(0.529770155556,0.290732616865) + , Qt.point(0.529764722222,0.290729677725) + , Qt.point(0.529762269444,0.290728640697) + , Qt.point(0.529762119444,0.290728540876) + , Qt.point(0.529762697222,0.290728136045) + , Qt.point(0.529762791667,0.290726283793) + , Qt.point(0.529762958333,0.290725324385) + , Qt.point(0.529763202778,0.290724847453) + , Qt.point(0.529764033333,0.290723843672) + , Qt.point(0.529764730556,0.290722950801) + , Qt.point(0.529765127778,0.290721752906) + , Qt.point(0.529765525,0.290720360897) + , Qt.point(0.529766569444,0.290716329005) + , Qt.point(0.529767961111,0.290711148974) + , Qt.point(0.529769302778,0.290706024261) + , Qt.point(0.529770905556,0.290700322572) + , Qt.point(0.52976965,0.290700644267) + , Qt.point(0.529768011111,0.290700943776) + , Qt.point(0.529766419444,0.290700993694) + , Qt.point(0.529765425,0.290700993694) + , Qt.point(0.5297639,0.290700904951) + , Qt.point(0.529763080556,0.290700766289) + , Qt.point(0.529762152778,0.290700505605) + , Qt.point(0.529761822222,0.290700450141) + , Qt.point(0.529760861111,0.290700156178) + , Qt.point(0.529759305556,0.290699629261) + , Qt.point(0.529758169444,0.290699296471) + , Qt.point(0.529756211111,0.290698525505) + , Qt.point(0.529754883333,0.29069803741) + , Qt.point(0.529754294444,0.290697887653) + ] + , 'Nordstrand_9' : [ + Qt.point(0.529795161111,0.291081497112) + , Qt.point(0.529808083333,0.291064310153) + , Qt.point(0.529825413889,0.29104308578) + , Qt.point(0.529840044444,0.291024726992) + , Qt.point(0.529865844444,0.291004616591) + , Qt.point(0.529859197222,0.290982443877) + , Qt.point(0.529868316667,0.290978495258) + , Qt.point(0.529869313889,0.29097860602) + , Qt.point(0.529869725,0.290978534025) + , Qt.point(0.529870297222,0.290978539563) + , Qt.point(0.529870563889,0.290978467568) + , Qt.point(0.529870972222,0.290978234968) + , Qt.point(0.529871827778,0.2909778473) + , Qt.point(0.529872033333,0.290977714386) + , Qt.point(0.529872275,0.290977625776) + , Qt.point(0.529872436111,0.290977537166) + , Qt.point(0.529872922222,0.290977371022) + , Qt.point(0.529873852778,0.290976939048) + , Qt.point(0.52987445,0.29097672306) + , Qt.point(0.529875830556,0.290976407385) + , Qt.point(0.529876041667,0.290976418462) + , Qt.point(0.529876205556,0.290976778441) + , Qt.point(0.529878113889,0.290976307698) + , Qt.point(0.529879491667,0.290979309356) + , Qt.point(0.529880972222,0.290982089446) + , Qt.point(0.529882052778,0.290983977889) + , Qt.point(0.529883238889,0.29098639241) + , Qt.point(0.5298843,0.290988768135) + , Qt.point(0.529885536111,0.29099198556) + , Qt.point(0.529886497222,0.290991581308) + , Qt.point(0.529889252778,0.290990324246) + , Qt.point(0.529888175,0.290986935119) + , Qt.point(0.529887113889,0.290982056218) + , Qt.point(0.529887725,0.290979453346) + , Qt.point(0.52988825,0.290977060887) + , Qt.point(0.529889194444,0.290971190368) + , Qt.point(0.529889569444,0.290969755939) + , Qt.point(0.529889666667,0.290969451329) + , Qt.point(0.529890016667,0.290968066733) + , Qt.point(0.529890347222,0.290966643357) + , Qt.point(0.529891380556,0.290962733169) + , Qt.point(0.529893291667,0.290958894901) + , Qt.point(0.529894269444,0.290959138603) + , Qt.point(0.529894519444,0.290958274568) + , Qt.point(0.529894327778,0.290958224719) + , Qt.point(0.529894527778,0.290957554535) + , Qt.point(0.529894838889,0.290957460377) + , Qt.point(0.529894691667,0.290956978507) + , Qt.point(0.529894805556,0.290956596333) + , Qt.point(0.529897388889,0.290953982023) + , Qt.point(0.529898766667,0.290952530844) + , Qt.point(0.529900755556,0.290951832944) + , Qt.point(0.529905661111,0.290949999561) + , Qt.point(0.529910511111,0.290949512132) + , Qt.point(0.529912902778,0.290949412431) + , Qt.point(0.529917263889,0.290949240723) + , Qt.point(0.529919827778,0.290949678301) + , Qt.point(0.529921988889,0.290949994022) + , Qt.point(0.529923677778,0.290950143573) + , Qt.point(0.529926930556,0.290950470371) + , Qt.point(0.529931327778,0.290950979952) + , Qt.point(0.529932583333,0.290951101809) + , Qt.point(0.529933327778,0.290950913485) + , Qt.point(0.529934547222,0.290950996569) + , Qt.point(0.529935886111,0.29095114612) + , Qt.point(0.529937177778,0.290951345521) + , Qt.point(0.529937927778,0.290951423066) + , Qt.point(0.529941336111,0.290951932644) + , Qt.point(0.529940997222,0.290952702549) + , Qt.point(0.529942063889,0.290953123503) + , Qt.point(0.529944991667,0.290954696531) + , Qt.point(0.529945880556,0.290954696531) + , Qt.point(0.529950416667,0.290954862696) + , Qt.point(0.529951988889,0.290954951316) + , Qt.point(0.529952963889,0.290954967933) + , Qt.point(0.529954361111,0.290955039937) + , Qt.point(0.529955058333,0.290955056554) + , Qt.point(0.529959002778,0.290954203577) + , Qt.point(0.529960677778,0.290953821397) + , Qt.point(0.529963175,0.290953333979) + , Qt.point(0.529965041667,0.290952935181) + , Qt.point(0.529966547222,0.290952652699) + , Qt.point(0.529968975,0.290952115428) + , Qt.point(0.529970075,0.290951838483) + , Qt.point(0.529969736111,0.29094865359) + , Qt.point(0.529973758333,0.290948393258) + , Qt.point(0.529975994444,0.290948199392) + , Qt.point(0.529977983333,0.290947833818) + , Qt.point(0.529983952778,0.290945734518) + , Qt.point(0.529988944444,0.290944061709) + , Qt.point(0.529989502778,0.290943817987) + , Qt.point(0.529990080556,0.290943507795) + , Qt.point(0.529992716667,0.290942267022) + , Qt.point(0.529993416667,0.290941846043) + , Qt.point(0.529994511111,0.290941042858) + , Qt.point(0.529995061111,0.290940466778) + , Qt.point(0.529995686111,0.290939768833) + , Qt.point(0.529998113889,0.290937253992) + , Qt.point(0.529999180556,0.290935403845) + , Qt.point(0.53,0.29093659481) + , Qt.point(0.530002697222,0.290940948691) + , Qt.point(0.530004127778,0.290943136672) + , Qt.point(0.530005294444,0.290944887037) + , Qt.point(0.530008708333,0.290949855548) + , Qt.point(0.530008688889,0.290950725162) + , Qt.point(0.530008647222,0.290951417527) + , Qt.point(0.530008672222,0.290951827405) + , Qt.point(0.530008744444,0.290952514227) + , Qt.point(0.530008844444,0.290953156736) + , Qt.point(0.530008941667,0.290954103878) + , Qt.point(0.530009188889,0.290954951316) + , Qt.point(0.530009733333,0.290956441248) + , Qt.point(0.530009980556,0.290957338525) + , Qt.point(0.530011436111,0.29096210731) + , Qt.point(0.530011747222,0.290962771939) + , Qt.point(0.5300125,0.290966637818) + , Qt.point(0.530012647222,0.290968027964) + , Qt.point(0.530012891667,0.290969667326) + , Qt.point(0.530013038889,0.290971356517) + , Qt.point(0.530013041667,0.290972946005) + , Qt.point(0.530013075,0.290974131189) + , Qt.point(0.530013072222,0.29097527206) + , Qt.point(0.530013108333,0.290976163706) + , Qt.point(0.530013105556,0.290976983353) + , Qt.point(0.530013088889,0.290977664542) + , Qt.point(0.530013016667,0.290978312501) + , Qt.point(0.530013,0.290978921691) + , Qt.point(0.530012763889,0.290982100522) + , Qt.point(0.530012577778,0.29098373422) + , Qt.point(0.530012433333,0.29098535129) + , Qt.point(0.530011977778,0.290986541932) + , Qt.point(0.530011591667,0.290987727029) + , Qt.point(0.530011172222,0.290989931066) + , Qt.point(0.530011063889,0.290991941258) + , Qt.point(0.530011358333,0.290994699006) + , Qt.point(0.530011788889,0.290998004927) + , Qt.point(0.530012327778,0.291001620883) + , Qt.point(0.530012361111,0.291002213384) + , Qt.point(0.530012811111,0.291003979799) + , Qt.point(0.530013211111,0.29100564099) + , Qt.point(0.530013766667,0.291007595638) + , Qt.point(0.530014427778,0.291009611174) + , Qt.point(0.530015558333,0.291012562455) + , Qt.point(0.530016391667,0.291014345383) + , Qt.point(0.530017194444,0.291015973258) + , Qt.point(0.530017836111,0.291017196923) + , Qt.point(0.530018516667,0.29101833199) + , Qt.point(0.530019855556,0.291020463682) + , Qt.point(0.530020394444,0.291021272057) + , Qt.point(0.530021352778,0.291022578739) + , Qt.point(0.530024138889,0.291026199749) + , Qt.point(0.530026369444,0.291028774276) + , Qt.point(0.530027519444,0.291030014466) + , Qt.point(0.530029905556,0.291032411774) + , Qt.point(0.530033911111,0.291036647125) + , Qt.point(0.530036297222,0.291039376522) + , Qt.point(0.530038230556,0.291041945329) + , Qt.point(0.530039605556,0.2910441155) + , Qt.point(0.530040197222,0.291045250401) + , Qt.point(0.530041397222,0.291047542326) + , Qt.point(0.530042102778,0.291049031508) + , Qt.point(0.530043308333,0.291052242343) + , Qt.point(0.530045288889,0.291057274384) + , Qt.point(0.530046908333,0.29106116042) + , Qt.point(0.530049133333,0.291065588851) + , Qt.point(0.530051705556,0.291070310549) + , Qt.point(0.530053369444,0.291073072658) + , Qt.point(0.530053438889,0.291073194433) + , Qt.point(0.53005475,0.291075109618) + , Qt.point(0.530057827778,0.291079460223) + , Qt.point(0.530059133333,0.291081242502) + , Qt.point(0.530060802778,0.291083622537) + , Qt.point(0.530062491667,0.29108606896) + , Qt.point(0.530063291667,0.291087380716) + , Qt.point(0.530063794444,0.291088343772) + , Qt.point(0.530064769444,0.291090452514) + , Qt.point(0.530065066667,0.291091000451) + , Qt.point(0.530066158333,0.291093585142) + , Qt.point(0.530066872222,0.291095439233) + , Qt.point(0.530067305556,0.291096678974) + , Qt.point(0.530068588889,0.291099999666) + , Qt.point(0.530069413889,0.29110227984) + , Qt.point(0.530070308333,0.291104416094) + , Qt.point(0.530071341667,0.291106707282) + , Qt.point(0.530071983333,0.291107897139) + , Qt.point(0.530072463889,0.29110887669) + , Qt.point(0.530073169444,0.291110132942) + , Qt.point(0.530073813889,0.291111378118) + , Qt.point(0.530074863889,0.291112982998) + , Qt.point(0.530076236111,0.291115207672) + , Qt.point(0.530076730556,0.291115954758) + , Qt.point(0.530077575,0.291117371445) + , Qt.point(0.530078341667,0.29111852803) + , Qt.point(0.530079644444,0.291120918651) + , Qt.point(0.530079991667,0.291121759788) + , Qt.point(0.530080722222,0.291123525056) + , Qt.point(0.530081497222,0.291126164626) + , Qt.point(0.530081791667,0.291127664239) + , Qt.point(0.530082169444,0.291129811266) + , Qt.point(0.5300825,0.29113143812) + , Qt.point(0.530083266667,0.291135720993) + , Qt.point(0.530083441667,0.291136479062) + , Qt.point(0.530083844444,0.291139594306) + , Qt.point(0.530084152778,0.291143710996) + , Qt.point(0.530084305556,0.291145321127) + , Qt.point(0.5300846,0.291146820584) + , Qt.point(0.530084841667,0.291148198304) + , Qt.point(0.530085033333,0.291148983986) + , Qt.point(0.530085236111,0.291151446139) + , Qt.point(0.530085394444,0.291154456007) + , Qt.point(0.530085386111,0.291158467243) + , Qt.point(0.530085394444,0.291162218361) + , Qt.point(0.530085375,0.291163109102) + , Qt.point(0.530085375,0.291163529575) + , Qt.point(0.530085408333,0.291164193477) + , Qt.point(0.530085388889,0.291164525427) + , Qt.point(0.530085405556,0.291165051013) + , Qt.point(0.530085452778,0.291168835192) + , Qt.point(0.530085433333,0.291169465881) + , Qt.point(0.530085486111,0.291170810236) + , Qt.point(0.530085622222,0.291172049469) + , Qt.point(0.530085725,0.29117372574) + , Qt.point(0.530085913889,0.291175944147) + , Qt.point(0.530083608333,0.291178367214) + , Qt.point(0.530081836111,0.291179578736) + , Qt.point(0.530081191667,0.291179827678) + , Qt.point(0.530079336111,0.291180403009) + , Qt.point(0.530078219444,0.29118067961) + , Qt.point(0.530075988889,0.291181116638) + , Qt.point(0.530074038889,0.291181022594) + , Qt.point(0.530071058333,0.291180093216) + , Qt.point(0.530069319444,0.291178394875) + , Qt.point(0.530067558333,0.291177764217) + , Qt.point(0.530067036111,0.291178046353) + , Qt.point(0.530063794444,0.291178560837) + , Qt.point(0.530061911111,0.291178383811) + , Qt.point(0.530060972222,0.291178383811) + , Qt.point(0.530060272222,0.291178643818) + , Qt.point(0.530059733333,0.29117894255) + , Qt.point(0.530059122222,0.291179501288) + , Qt.point(0.530058041667,0.291180685142) + , Qt.point(0.530057811111,0.291181277066) + , Qt.point(0.530057672222,0.291181885584) + , Qt.point(0.530057636111,0.291182272822) + , Qt.point(0.530057738889,0.291183406871) + , Qt.point(0.530058105556,0.291184330701) + , Qt.point(0.530058869444,0.291185575375) + , Qt.point(0.530059130556,0.291186394089) + , Qt.point(0.530059441667,0.291187915339) + , Qt.point(0.530059977778,0.291189431044) + , Qt.point(0.530060394444,0.291190238677) + , Qt.point(0.530060986111,0.29119128417) + , Qt.point(0.530061488889,0.291192628367) + , Qt.point(0.530061802778,0.291193834263) + , Qt.point(0.530062061111,0.291195477146) + , Qt.point(0.530062213889,0.291197518283) + , Qt.point(0.530061619444,0.291197639976) + , Qt.point(0.530061377778,0.291198054838) + , Qt.point(0.530060730556,0.29119873521) + , Qt.point(0.530060016667,0.291199205384) + , Qt.point(0.530059475,0.291199310482) + , Qt.point(0.530059091667,0.291199100286) + , Qt.point(0.530058972222,0.291198807119) + , Qt.point(0.530059008333,0.291198370132) + , Qt.point(0.530060002778,0.291197059167) + , Qt.point(0.530060036111,0.291196749402) + , Qt.point(0.530059219444,0.29119524482) + , Qt.point(0.530058525,0.29119444274) + , Qt.point(0.530057183333,0.291191953504) + , Qt.point(0.530056541667,0.291190216551) + , Qt.point(0.530055863889,0.291190631429) + , Qt.point(0.530052130556,0.291192739) + , Qt.point(0.530051,0.291192351784) + , Qt.point(0.530050561111,0.291194083186) + , Qt.point(0.530050211111,0.291194901862) + , Qt.point(0.530050122222,0.291195443956) + , Qt.point(0.530049669444,0.291196577924) + , Qt.point(0.530049738889,0.291197274896) + , Qt.point(0.530049963889,0.291197833578) + , Qt.point(0.530049686111,0.291199293887) + , Qt.point(0.530049663889,0.29120038358) + , Qt.point(0.530049558333,0.291201008629) + , Qt.point(0.530049469444,0.291201810681) + , Qt.point(0.530049172222,0.291202302973) + , Qt.point(0.530049086111,0.291203613901) + , Qt.point(0.530049311111,0.291203956842) + , Qt.point(0.530049083333,0.291204620599) + , Qt.point(0.530048977778,0.291205007789) + , Qt.point(0.530049186111,0.29120540604) + , Qt.point(0.530049952778,0.291205793229) + , Qt.point(0.530050263889,0.291207397286) + , Qt.point(0.530051169444,0.291207889563) + , Qt.point(0.530051255556,0.29120977569) + , Qt.point(0.530051533333,0.29121026243) + , Qt.point(0.5300516,0.291211119752) + , Qt.point(0.5300518,0.291211623081) + , Qt.point(0.530052452778,0.291212983722) + , Qt.point(0.530053183333,0.29121366957) + , Qt.point(0.530053136111,0.291214045679) + , Qt.point(0.530053530556,0.291215483735) + , Qt.point(0.530053827778,0.291216130857) + , Qt.point(0.530053972222,0.291217270229) + , Qt.point(0.530054675,0.291218785692) + , Qt.point(0.530054777778,0.29121967616) + , Qt.point(0.530054863889,0.291219902924) + , Qt.point(0.530055175,0.291221191603) + , Qt.point(0.530054688889,0.291221578758) + , Qt.point(0.530053625,0.291221346465) + , Qt.point(0.530053013889,0.291221556635) + , Qt.point(0.530052613889,0.291221606412) + , Qt.point(0.530052194444,0.291221971444) + , Qt.point(0.530051566667,0.291222795527) + , Qt.point(0.530051236111,0.291223055471) + , Qt.point(0.530050297222,0.291223072064) + , Qt.point(0.530049372222,0.291223138432) + , Qt.point(0.530048811111,0.291223320947) + , Qt.point(0.530048377778,0.29122373022) + , Qt.point(0.530047663889,0.291223763405) + , Qt.point(0.530047019444,0.291224216923) + , Qt.point(0.530046547222,0.291225002281) + , Qt.point(0.530045955556,0.291224969097) + , Qt.point(0.530045141667,0.291225400489) + , Qt.point(0.530046005556,0.291226064168) + , Qt.point(0.530046441667,0.291226241149) + , Qt.point(0.530045619444,0.291228127088) + , Qt.point(0.530044902778,0.291229692237) + , Qt.point(0.530043541667,0.291230217638) + , Qt.point(0.530043419444,0.29123056606) + , Qt.point(0.530042616667,0.291230947665) + , Qt.point(0.53003915,0.291231467532) + , Qt.point(0.530038175,0.29123145094) + , Qt.point(0.530037127778,0.291231323739) + , Qt.point(0.530036205556,0.291231102519) + , Qt.point(0.530035666667,0.29123088683) + , Qt.point(0.530035125,0.291230588182) + , Qt.point(0.530035075,0.291230101497) + , Qt.point(0.530034858333,0.291229841562) + , Qt.point(0.530034152778,0.291229244263) + , Qt.point(0.530033541667,0.291228945613) + , Qt.point(0.530033125,0.291228807349) + , Qt.point(0.530032322222,0.29122871886) + , Qt.point(0.530031869444,0.291228735452) + , Qt.point(0.530031258333,0.291228807349) + , Qt.point(0.530029655556,0.291229183427) + , Qt.point(0.530029302778,0.291229305099) + , Qt.point(0.530027983333,0.29122962034) + , Qt.point(0.530027563889,0.291229775195) + , Qt.point(0.530027269444,0.29123003513) + , Qt.point(0.530026952778,0.291230405675) + , Qt.point(0.5300265,0.291231063806) + , Qt.point(0.530026133333,0.291231710873) + , Qt.point(0.530025294444,0.291232844617) + , Qt.point(0.530024611111,0.291233563574) + , Qt.point(0.530023080556,0.291234448439) + , Qt.point(0.530022069444,0.29123517845) + , Qt.point(0.5300216,0.291235421786) + , Qt.point(0.530021091667,0.291235593227) + , Qt.point(0.530019852778,0.291235692774) + , Qt.point(0.530019002778,0.291235803381) + , Qt.point(0.530018341667,0.291235819972) + , Qt.point(0.530017722222,0.29123578679) + , Qt.point(0.530013547222,0.291235355422) + , Qt.point(0.530013283333,0.291236234748) + , Qt.point(0.530012533333,0.291236682705) + , Qt.point(0.530012175,0.29123676013) + , Qt.point(0.530011922222,0.291236820963) + , Qt.point(0.530010883333,0.291237219146) + , Qt.point(0.530009816667,0.291237213616) + , Qt.point(0.530009352778,0.29123710854) + , Qt.point(0.530008736111,0.291236870736) + , Qt.point(0.530008277778,0.291236898388) + , Qt.point(0.530007913889,0.291237058767) + , Qt.point(0.530007788889,0.29123782748) + , Qt.point(0.530007702778,0.2912382146) + , Qt.point(0.530007555556,0.291238496644) + , Qt.point(0.530007338889,0.29123860725) + , Qt.point(0.530006936111,0.291238662552) + , Qt.point(0.530006588889,0.291238662552) + , Qt.point(0.530006261111,0.291238590659) + , Qt.point(0.530005875,0.291238386039) + , Qt.point(0.530005486111,0.291238048691) + , Qt.point(0.530005380556,0.291237910434) + , Qt.point(0.530005355556,0.291238435811) + , Qt.point(0.530005294444,0.291238745506) + , Qt.point(0.530005525,0.291238994368) + , Qt.point(0.530005822222,0.291239447849) + , Qt.point(0.530006069444,0.291239890268) + , Qt.point(0.530006366667,0.291240338216) + , Qt.point(0.530007158333,0.291241731826) + , Qt.point(0.530007502778,0.291242622182) + , Qt.point(0.530007847222,0.291243717149) + , Qt.point(0.530008044444,0.291244214859) + , Qt.point(0.530008430556,0.291246155914) + , Qt.point(0.530008536111,0.291247040719) + , Qt.point(0.530008633333,0.291248384508) + , Qt.point(0.530008583333,0.291249175293) + , Qt.point(0.530008383333,0.291251508919) + , Qt.point(0.530008161111,0.291253062809) + , Qt.point(0.530007916667,0.291254179833) + , Qt.point(0.530007086111,0.29125721567) + , Qt.point(0.530006638889,0.291259051525) + , Qt.point(0.530006216667,0.291260550056) + , Qt.point(0.530005816667,0.291261733389) + , Qt.point(0.530005641667,0.291262275286) + , Qt.point(0.530005097222,0.291263712966) + , Qt.point(0.530004202778,0.291265399461) + , Qt.point(0.530002963889,0.29126708594) + , Qt.point(0.530001525,0.291268523583) + , Qt.point(0.530000680556,0.291269469103) + , Qt.point(0.529999194444,0.291270757435) + , Qt.point(0.5299984,0.291271398834) + , Qt.point(0.529997211111,0.291271697415) + , Qt.point(0.529996269444,0.291271946232) + , Qt.point(0.529995822222,0.29127196282) + , Qt.point(0.529995283333,0.2912720347) + , Qt.point(0.529994744444,0.2912720347) + , Qt.point(0.529993694444,0.291272139756) + , Qt.point(0.529992236111,0.291272399632) + , Qt.point(0.5299899,0.291272902793) + , Qt.point(0.529989152778,0.291273002319) + , Qt.point(0.52998875,0.291273041024) + , Qt.point(0.529988561111,0.29127248257) + , Qt.point(0.529988283333,0.291271819059) + , Qt.point(0.529987936111,0.291270840375) + , Qt.point(0.529987797222,0.291269651571) + , Qt.point(0.529990930556,0.291269811922) + , Qt.point(0.529991002778,0.291268960402) + , Qt.point(0.529990922222,0.291268512524) + , Qt.point(0.529990925,0.291267821351) + , Qt.point(0.529990047222,0.29126621782) + , Qt.point(0.529990222222,0.291265957936) + , Qt.point(0.529989841667,0.29126077124) + , Qt.point(0.529990636111,0.291259925208) + , Qt.point(0.529990486111,0.291259433071) + , Qt.point(0.529989655556,0.291257176962) + , Qt.point(0.529987880556,0.291255744761) + , Qt.point(0.529987372222,0.291254168773) + , Qt.point(0.529988372222,0.291253566024) + , Qt.point(0.529987077778,0.291251188185) + , Qt.point(0.529986947222,0.291250983579) + , Qt.point(0.529986461111,0.291249639809) + , Qt.point(0.529989475,0.291248976215) + , Qt.point(0.529989025,0.291247024129) + , Qt.point(0.529989958333,0.291246775278) + , Qt.point(0.529989513889,0.291243894112) + , Qt.point(0.529988786111,0.291241471908) + , Qt.point(0.529993319444,0.291239663528) + , Qt.point(0.529994925,0.291236820963) + , Qt.point(0.529992830556,0.29123474155) + , Qt.point(0.529992030556,0.291234830036) + , Qt.point(0.529991088889,0.291234830036) + , Qt.point(0.529990316667,0.291234763671) + , Qt.point(0.5299893,0.291234719428) + , Qt.point(0.529988497222,0.291235067842) + , Qt.point(0.529988163889,0.291235454968) + , Qt.point(0.529987969444,0.291236395128) + , Qt.point(0.529987794444,0.291236693766) + , Qt.point(0.529987305556,0.291236898388) + , Qt.point(0.529986452778,0.291237373995) + , Qt.point(0.529985930556,0.291237617328) + , Qt.point(0.529985527778,0.291237700283) + , Qt.point(0.529984269444,0.291236992403) + , Qt.point(0.529983925,0.291237020055) + , Qt.point(0.529983647222,0.291237213616) + , Qt.point(0.529983194444,0.291237943616) + , Qt.point(0.529982861111,0.291238867172) + , Qt.point(0.529982738889,0.291239514212) + , Qt.point(0.529982755556,0.291240249733) + , Qt.point(0.529982216667,0.291240752982) + , Qt.point(0.529981675,0.291241156687) + , Qt.point(0.529980994444,0.291241704175) + , Qt.point(0.52998035,0.291242058106) + , Qt.point(0.529979802778,0.29124219636) + , Qt.point(0.529979355556,0.291242235071) + , Qt.point(0.529978902778,0.291242218481) + , Qt.point(0.529978519444,0.291242340144) + , Qt.point(0.529978294444,0.29124254476) + , Qt.point(0.529978119444,0.291242771496) + , Qt.point(0.529977838889,0.291243418522) + , Qt.point(0.529977594444,0.291244148497) + , Qt.point(0.529977002778,0.291244812109) + , Qt.point(0.529977,0.291245320876) + , Qt.point(0.529977191667,0.291245807521) + , Qt.point(0.529977436111,0.291246139324) + , Qt.point(0.529978305556,0.291246437946) + , Qt.point(0.529978077778,0.291246979889) + , Qt.point(0.529977591667,0.29124758819) + , Qt.point(0.529977022222,0.291248699717) + , Qt.point(0.529976369444,0.291249296952) + , Qt.point(0.529975683333,0.291249888656) + , Qt.point(0.529975136111,0.291250480358) + , Qt.point(0.529974641667,0.291251127357) + , Qt.point(0.529974044444,0.291252067436) + , Qt.point(0.529973805556,0.291252504295) + , Qt.point(0.529973525,0.291254423144) + , Qt.point(0.529971347222,0.291254876587) + , Qt.point(0.529970369444,0.291255208373) + , Qt.point(0.529969916667,0.291255623106) + , Qt.point(0.529969741667,0.291257265437) + , Qt.point(0.529968975,0.291258083832) + , Qt.point(0.529967441667,0.291258869046) + , Qt.point(0.529966519444,0.291259427541) + , Qt.point(0.529966080556,0.291259842264) + , Qt.point(0.529965994444,0.291260328871) + , Qt.point(0.529966202778,0.291260699355) + , Qt.point(0.529965766667,0.291261257845) + , Qt.point(0.52996535,0.291261307611) + , Qt.point(0.529964775,0.291260749122) + , Qt.point(0.529964322222,0.291260815477) + , Qt.point(0.529963955556,0.291261130664) + , Qt.point(0.529963291667,0.291262280816) + , Qt.point(0.529962341667,0.291263270604) + , Qt.point(0.5299616,0.291263923088) + , Qt.point(0.529961461111,0.291264216152) + , Qt.point(0.529961444444,0.291264636393) + , Qt.point(0.529961877778,0.29126572017) + , Qt.point(0.529961702778,0.291266521939) + , Qt.point(0.529961216667,0.29126670994) + , Qt.point(0.52996045,0.291267096999) + , Qt.point(0.529959211111,0.291267600175) + , Qt.point(0.529958252778,0.291267893233) + , Qt.point(0.529957713889,0.291268086762) + , Qt.point(0.529957016667,0.29126828029) + , Qt.point(0.529956111111,0.291268678405) + , Qt.point(0.529955397222,0.291271752707) + , Qt.point(0.529954852778,0.29127270927) + , Qt.point(0.529956927778,0.291274434386) + , Qt.point(0.529957372222,0.291276916978) + , Qt.point(0.529955091667,0.291278503828) + , Qt.point(0.529955288889,0.291279449297) + , Qt.point(0.529954566667,0.291280333942) + , Qt.point(0.529954297222,0.291280538516) + , Qt.point(0.529954133333,0.291281865473) + , Qt.point(0.529954591667,0.29128257318) + , Qt.point(0.529954269444,0.29128361262) + , Qt.point(0.529953886111,0.291284591236) + , Qt.point(0.529952683333,0.291286260953) + , Qt.point(0.529952002778,0.291286852538) + , Qt.point(0.529951416667,0.2912876321) + , Qt.point(0.529950772222,0.291288621752) + , Qt.point(0.529950425,0.291289119341) + , Qt.point(0.529949666667,0.291290324605) + , Qt.point(0.529948761111,0.291291297657) + , Qt.point(0.529948219444,0.29129170125) + , Qt.point(0.529947155556,0.291292431034) + , Qt.point(0.529946158333,0.291293149758) + , Qt.point(0.529944577778,0.291294194666) + , Qt.point(0.529943969444,0.291294697768) + , Qt.point(0.5299428,0.291295742668) + , Qt.point(0.529943188889,0.291292187773) + , Qt.point(0.529943141667,0.291289064053) + , Qt.point(0.52994255,0.291286283068) + , Qt.point(0.529942019444,0.291284856623) + , Qt.point(0.52994115,0.291283186893) + , Qt.point(0.529940211111,0.291281876531) + , Qt.point(0.529939391667,0.291281732778) + , Qt.point(0.529938363889,0.291281854416) + , Qt.point(0.529937825,0.291281959466) + , Qt.point(0.529936380556,0.291280842611) + , Qt.point(0.529935997222,0.291280267594) + , Qt.point(0.529935527778,0.291279653872) + , Qt.point(0.529935286111,0.291279565407) + , Qt.point(0.529934122222,0.291278188671) + , Qt.point(0.5299328,0.291277453302) + , Qt.point(0.529932136111,0.291276911449) + , Qt.point(0.529931544444,0.291275894088) + , Qt.point(0.529930311111,0.291274362507) + , Qt.point(0.529926963889,0.291271697415) + , Qt.point(0.529922022222,0.29127111684) + , Qt.point(0.529915077778,0.291271277189) + , Qt.point(0.529840094444,0.291264802278) + , Qt.point(0.529830597222,0.291209687192) + , Qt.point(0.529810038889,0.291090502327) + , Qt.point(0.529808352778,0.291080716676) + , Qt.point(0.529795161111,0.291081497112) + ] + , 'Østensjø_9' : [ + Qt.point(0.529996688889,0.29093141544) + , Qt.point(0.529997633333,0.290930750697) + , Qt.point(0.529997825,0.290930662065) + , Qt.point(0.529998033333,0.290930628828) + , Qt.point(0.529998191667,0.290930490339) + , Qt.point(0.529998436111,0.290930490339) + , Qt.point(0.529998611111,0.290930457102) + , Qt.point(0.529999241667,0.290930623288) + , Qt.point(0.529999488889,0.290930623288) + , Qt.point(0.529999688889,0.290930573432) + , Qt.point(0.529999936111,0.29093047926) + , Qt.point(0.530000136111,0.290930279837) + , Qt.point(0.530001527778,0.290929282716) + , Qt.point(0.530002669444,0.290928640124) + , Qt.point(0.530003413889,0.290928191416) + , Qt.point(0.530004208333,0.290927648534) + , Qt.point(0.5300056,0.290926756652) + , Qt.point(0.530006030556,0.290926512907) + , Qt.point(0.530005963889,0.29092562102) + , Qt.point(0.53000605,0.29092508367) + , Qt.point(0.53000625,0.290924668192) + , Qt.point(0.530006680556,0.290924297031) + , Qt.point(0.530007291667,0.290923576865) + , Qt.point(0.530007738889,0.290922978571) + , Qt.point(0.530007986111,0.290922430134) + , Qt.point(0.530008336111,0.290921388652) + , Qt.point(0.530010075,0.29092113936) + , Qt.point(0.5300134,0.290920546598) + , Qt.point(0.530014491667,0.290920302845) + , Qt.point(0.530015833333,0.290919953835) + , Qt.point(0.530016877778,0.290919654682) + , Qt.point(0.5300206,0.290918469147) + , Qt.point(0.530027155556,0.290916485852) + , Qt.point(0.530030183333,0.290915499736) + , Qt.point(0.530034555556,0.290914159054) + , Qt.point(0.530039075,0.29091272418) + , Qt.point(0.530044652778,0.29091101783) + , Qt.point(0.530045133333,0.290910890407) + , Qt.point(0.530045666667,0.290910702042) + , Qt.point(0.530045819444,0.290910657721) + , Qt.point(0.530046172222,0.290910546918) + , Qt.point(0.530046577778,0.290910413955) + , Qt.point(0.53004985,0.290909505369) + , Qt.point(0.530050894444,0.290909161878) + , Qt.point(0.530052286111,0.29090861894) + , Qt.point(0.530053775,0.290907970735) + , Qt.point(0.530055497222,0.290907134161) + , Qt.point(0.530056894444,0.290906386226) + , Qt.point(0.530058013889,0.290905688152) + , Qt.point(0.530059044444,0.290904884809) + , Qt.point(0.530060808333,0.290903593912) + , Qt.point(0.530062363889,0.29090235841) + , Qt.point(0.530063255556,0.290901571673) + , Qt.point(0.530064147222,0.290900718448) + , Qt.point(0.530066997222,0.290897416319) + , Qt.point(0.530067766667,0.290896491047) + , Qt.point(0.530068438889,0.290895565771) + , Qt.point(0.530070513889,0.290892546124) + , Qt.point(0.530070811111,0.290892141654) + , Qt.point(0.5300713,0.290891393659) + , Qt.point(0.530071966667,0.290890274431) + , Qt.point(0.530073119444,0.29088821326) + , Qt.point(0.530073469444,0.290887564984) + , Qt.point(0.530073997222,0.290886445733) + , Qt.point(0.530074877778,0.290887071849) + , Qt.point(0.53007555,0.290887553902) + , Qt.point(0.530076197222,0.290888069199) + , Qt.point(0.530076838889,0.290888723014) + , Qt.point(0.530080044444,0.290892224765) + , Qt.point(0.530081333333,0.290893488038) + , Qt.point(0.530082116667,0.290894031021) + , Qt.point(0.530083058333,0.290894574003) + , Qt.point(0.530084472222,0.290895222254) + , Qt.point(0.530085605556,0.290895576852) + , Qt.point(0.530086547222,0.290895715367) + , Qt.point(0.5300877,0.290895909287) + , Qt.point(0.530088869444,0.290896053342) + , Qt.point(0.5300903,0.290896092126) + , Qt.point(0.53009175,0.290896075505) + , Qt.point(0.530092955556,0.290896009018) + , Qt.point(0.530093930556,0.290895903747) + , Qt.point(0.530095136111,0.290895715367) + , Qt.point(0.530096166667,0.290895504825) + , Qt.point(0.530097633333,0.290895072658) + , Qt.point(0.530098627778,0.290894668193) + , Qt.point(0.530099955556,0.290894008859) + , Qt.point(0.530100863889,0.290893449253) + , Qt.point(0.530101930556,0.290892662479) + , Qt.point(0.530102561111,0.290892174898) + , Qt.point(0.530103258333,0.290891532177) + , Qt.point(0.530103922222,0.290890850668) + , Qt.point(0.530104327778,0.29089041295) + , Qt.point(0.530104902778,0.290889714814) + , Qt.point(0.530105427778,0.290888983432) + , Qt.point(0.530106669444,0.290887132799) + , Qt.point(0.530107427778,0.290886179771) + , Qt.point(0.530108386111,0.290884827793) + , Qt.point(0.530108944444,0.290884318028) + , Qt.point(0.530109416667,0.290883830426) + , Qt.point(0.530110186111,0.290883254167) + , Qt.point(0.530110972222,0.290882749938) + , Qt.point(0.530111688889,0.290882367611) + , Qt.point(0.530112719444,0.290881929872) + , Qt.point(0.530113241667,0.290881758101) + , Qt.point(0.530117030556,0.290880733012) + , Qt.point(0.530117625,0.290880539075) + , Qt.point(0.530118622222,0.290880173366) + , Qt.point(0.530119213889,0.29087998497) + , Qt.point(0.530120019444,0.290879652506) + , Qt.point(0.530121083333,0.290879131645) + , Qt.point(0.530121441667,0.290879635883) + , Qt.point(0.530122544444,0.290881735937) + , Qt.point(0.530123988889,0.290884207209) + , Qt.point(0.530124558333,0.290885066052) + , Qt.point(0.530125258333,0.29088604679) + , Qt.point(0.5301258,0.290886728317) + , Qt.point(0.530126355556,0.290887498494) + , Qt.point(0.530126947222,0.290888235424) + , Qt.point(0.530127575,0.290889144114) + , Qt.point(0.530128027778,0.2908897536) + , Qt.point(0.530129661111,0.290892224765) + , Qt.point(0.53013025,0.290893183302) + , Qt.point(0.530130602778,0.290893643176) + , Qt.point(0.530131044444,0.290893233168) + , Qt.point(0.530133138889,0.290890800801) + , Qt.point(0.530133997222,0.290889925363) + , Qt.point(0.530135072222,0.29088975914) + , Qt.point(0.530136363889,0.29088946548) + , Qt.point(0.530140333333,0.290888711933) + , Qt.point(0.530142980556,0.290888174475) + , Qt.point(0.530143166667,0.290888534627) + , Qt.point(0.530143713889,0.290888944646) + , Qt.point(0.530143958333,0.290889725896) + , Qt.point(0.530144058333,0.290890374164) + , Qt.point(0.530144355556,0.290891720561) + , Qt.point(0.530144430556,0.290892413148) + , Qt.point(0.530144497222,0.29089393129) + , Qt.point(0.530144391667,0.290895261038) + , Qt.point(0.530144247222,0.290896463345) + , Qt.point(0.530144794444,0.290896540912) + , Qt.point(0.530145155556,0.29089671267) + , Qt.point(0.530145625,0.290897083887) + , Qt.point(0.530146097222,0.290897709967) + , Qt.point(0.530146480556,0.290898186452) + , Qt.point(0.530147052778,0.290898762664) + , Qt.point(0.530147786111,0.29089928901) + , Qt.point(0.530149547222,0.290900325077) + , Qt.point(0.530150344444,0.290900829257) + , Qt.point(0.530151116667,0.290901233708) + , Qt.point(0.530152161111,0.290901920719) + , Qt.point(0.530152544444,0.290902236521) + , Qt.point(0.530152911111,0.290902585566) + , Qt.point(0.530152955556,0.290903028795) + , Qt.point(0.530152991667,0.290903327975) + , Qt.point(0.530153183333,0.290904009438) + , Qt.point(0.530153358333,0.290904768462) + , Qt.point(0.530153477778,0.290905145203) + , Qt.point(0.530153755556,0.290905882062) + , Qt.point(0.530154102778,0.290906214478) + , Qt.point(0.530154397222,0.290906790665) + , Qt.point(0.530154875,0.290906979034) + , Qt.point(0.530155461111,0.290907438874) + , Qt.point(0.530156036111,0.290907810069) + , Qt.point(0.530156433333,0.290909976283) + , Qt.point(0.530156852778,0.290910292072) + , Qt.point(0.530157061111,0.290910729743) + , Qt.point(0.530156727778,0.29091151644) + , Qt.point(0.530157144444,0.290912530278) + , Qt.point(0.530157763889,0.290912535818) + , Qt.point(0.530157797222,0.290912912543) + , Qt.point(0.53015695,0.290914242154) + , Qt.point(0.530156686111,0.290914851556) + , Qt.point(0.530156336111,0.290915815515) + , Qt.point(0.530155375,0.290915654856) + , Qt.point(0.530155130556,0.290915704716) + , Qt.point(0.530155416667,0.290916219934) + , Qt.point(0.53015625,0.29091972116) + , Qt.point(0.530155375,0.290919211492) + , Qt.point(0.530155611111,0.29092430811) + , Qt.point(0.530152847222,0.290924219474) + , Qt.point(0.530151194444,0.290924202855) + , Qt.point(0.530149725,0.290924119759) + , Qt.point(0.530145708333,0.290923981266) + , Qt.point(0.530146266667,0.290926258083) + , Qt.point(0.5301467,0.290927919975) + , Qt.point(0.530147241667,0.29093422949) + , Qt.point(0.530148397222,0.290934777892) + , Qt.point(0.530148675,0.29093580822) + , Qt.point(0.530149030556,0.290936877317) + , Qt.point(0.530148202778,0.290937049036) + , Qt.point(0.530146716667,0.290937253992) + , Qt.point(0.530147741667,0.290938068272) + , Qt.point(0.530148394444,0.290942804322) + , Qt.point(0.530148483333,0.290944510378) + , Qt.point(0.530148405556,0.290948321251) + , Qt.point(0.530149833333,0.29095037067) + , Qt.point(0.530149866667,0.290951650161) + , Qt.point(0.530149705556,0.290953466911) + , Qt.point(0.530149927778,0.2909535223) + , Qt.point(0.530149925,0.290954447285) + , Qt.point(0.530150758333,0.290959343534) + , Qt.point(0.530147422222,0.29095998048) + , Qt.point(0.530147316667,0.290962533781) + , Qt.point(0.530147611111,0.290962500549) + , Qt.point(0.530148572222,0.290962661168) + , Qt.point(0.530150827778,0.290962622398) + , Qt.point(0.530152658333,0.290968227347) + , Qt.point(0.530156033333,0.29096924641) + , Qt.point(0.530156872222,0.290972475252) + , Qt.point(0.530155997222,0.290974978535) + , Qt.point(0.530156433333,0.290975416053) + , Qt.point(0.530156588889,0.290976008638) + , Qt.point(0.530156552778,0.290976567992) + , Qt.point(0.530157094444,0.290977498399) + , Qt.point(0.530157719444,0.290978196201) + , Qt.point(0.530158416667,0.290978234968) + , Qt.point(0.530158413889,0.290979685945) + , Qt.point(0.530158569444,0.290980051456) + , Qt.point(0.530158430556,0.290980976308) + , Qt.point(0.530158447222,0.290981535647) + , Qt.point(0.530158375,0.290981746091) + , Qt.point(0.530158583333,0.290982045142) + , Qt.point(0.530158772222,0.290983828365) + , Qt.point(0.530158194444,0.290984875031) + , Qt.point(0.530158194444,0.290985467586) + , Qt.point(0.530158472222,0.290985960457) + , Qt.point(0.530158213889,0.290986608386) + , Qt.point(0.530158497222,0.290987533205) + , Qt.point(0.530158252778,0.290988474632) + , Qt.point(0.530158391667,0.290989017335) + , Qt.point(0.530158791667,0.290989211157) + , Qt.point(0.530159041667,0.290989366215) + , Qt.point(0.530160766667,0.290990296557) + , Qt.point(0.530161161111,0.290990545755) + , Qt.point(0.530161280556,0.290991121678) + , Qt.point(0.530161061111,0.290991415177) + , Qt.point(0.530159958333,0.290992500564) + , Qt.point(0.530159922222,0.290993669009) + , Qt.point(0.530159788889,0.290995662547) + , Qt.point(0.530159913889,0.290997146612) + , Qt.point(0.530160069444,0.290998597439) + , Qt.point(0.530160136111,0.291000031643) + , Qt.point(0.53016015,0.291001111442) + , Qt.point(0.530160430556,0.291001759318) + , Qt.point(0.530160636111,0.291002146935) + , Qt.point(0.530160616667,0.291003769381) + , Qt.point(0.530160633333,0.291004815934) + , Qt.point(0.530160627778,0.291007423984) + , Qt.point(0.530159825,0.29100731324) + , Qt.point(0.530160188889,0.291007977706) + , Qt.point(0.530160136111,0.291008381921) + , Qt.point(0.530160380556,0.291009168201) + , Qt.point(0.530160638889,0.291009727455) + , Qt.point(0.530160586111,0.291010198112) + , Qt.point(0.530160863889,0.29101114496) + , Qt.point(0.530161002778,0.291011964451) + , Qt.point(0.530161363889,0.291013204754) + , Qt.point(0.530161758333,0.291014816028) + , Qt.point(0.530161633333,0.291015408486) + , Qt.point(0.530161425,0.291015319894) + , Qt.point(0.530160744444,0.291015159322) + , Qt.point(0.530159716667,0.291014965527) + , Qt.point(0.530159297222,0.291014932305) + , Qt.point(0.530159069444,0.291015209155) + , Qt.point(0.530158475,0.291016012016) + , Qt.point(0.530158038889,0.291016554638) + , Qt.point(0.530157530556,0.291017340883) + , Qt.point(0.530159644444,0.291018005313) + , Qt.point(0.530159763889,0.291019544566) + , Qt.point(0.530159886111,0.291020491366) + , Qt.point(0.530159866667,0.291020890017) + , Qt.point(0.530160138889,0.291023879874) + , Qt.point(0.53016185,0.29102405705) + , Qt.point(0.530162372222,0.291024145637) + , Qt.point(0.530162541667,0.291026714657) + , Qt.point(0.530162797222,0.291028862862) + , Qt.point(0.530162866667,0.291029997856) + , Qt.point(0.530162566667,0.291030839409) + , Qt.point(0.530161711111,0.291030905847) + , Qt.point(0.530161519444,0.29103170864) + , Qt.point(0.530161097222,0.29103279379) + , Qt.point(0.530160522222,0.29103354121) + , Qt.point(0.530160188889,0.291033873396) + , Qt.point(0.530159944444,0.2910342388) + , Qt.point(0.530159155556,0.291035722553) + , Qt.point(0.530158963889,0.291036121172) + , Qt.point(0.530158105556,0.291037643664) + , Qt.point(0.530157597222,0.291038601444) + , Qt.point(0.530157144444,0.291039526001) + , Qt.point(0.530156622222,0.291040433945) + , Qt.point(0.530156322222,0.29104102632) + , Qt.point(0.530156197222,0.291041341884) + , Qt.point(0.530155619444,0.291042388223) + , Qt.point(0.5301552,0.29104308578) + , Qt.point(0.530154691667,0.291043855303) + , Qt.point(0.530154605556,0.291044237295) + , Qt.point(0.530154655556,0.291044552853) + , Qt.point(0.530156086111,0.291045571494) + , Qt.point(0.530156169444,0.291046496016) + , Qt.point(0.53015615,0.291048035031) + , Qt.point(0.530157958333,0.291050448711) + , Qt.point(0.530158008333,0.291056582417) + , Qt.point(0.530158380556,0.29105782242) + , Qt.point(0.5301593,0.291060446326) + , Qt.point(0.5301593,0.29106093346) + , Qt.point(0.530159158333,0.291061282203) + , Qt.point(0.530158111111,0.291061979688) + , Qt.point(0.530158122222,0.291073980436) + , Qt.point(0.530158169444,0.29108471845) + , Qt.point(0.530156652778,0.291084751659) + , Qt.point(0.530154230556,0.291084762729) + , Qt.point(0.530145213889,0.291084779334) + , Qt.point(0.530139180556,0.291084840218) + , Qt.point(0.530139319444,0.291087159323) + , Qt.point(0.530136530556,0.291088520885) + , Qt.point(0.530136438889,0.291090474653) + , Qt.point(0.530135641667,0.291093740111) + , Qt.point(0.530134922222,0.29109599269) + , Qt.point(0.530134572222,0.291096651301) + , Qt.point(0.530134569444,0.291097669653) + , Qt.point(0.530135052778,0.291100514368) + , Qt.point(0.530135552778,0.291102750261) + , Qt.point(0.530136508333,0.291104393957) + , Qt.point(0.530137119444,0.291105495281) + , Qt.point(0.53013735,0.291105379061) + , Qt.point(0.530137694444,0.291105257307) + , Qt.point(0.530139341667,0.291105705583) + , Qt.point(0.530140275,0.291105904816) + , Qt.point(0.530141952778,0.29110576646) + , Qt.point(0.530142986111,0.291105340321) + , Qt.point(0.53014425,0.291104897578) + , Qt.point(0.530145175,0.291104670672) + , Qt.point(0.530144947222,0.291104880975) + , Qt.point(0.530144005556,0.29110515769) + , Qt.point(0.530143341667,0.291105489746) + , Qt.point(0.530142730556,0.29110606531) + , Qt.point(0.530142294444,0.291106657474) + , Qt.point(0.530142013889,0.291107410129) + , Qt.point(0.530140905556,0.291111737834) + , Qt.point(0.530139991667,0.291115628254) + , Qt.point(0.530137902778,0.291118317742) + , Qt.point(0.530137311111,0.291119784217) + , Qt.point(0.5301368,0.291120514682) + , Qt.point(0.530135338889,0.291122445975) + , Qt.point(0.530134002778,0.291123879214) + , Qt.point(0.530133566667,0.291125207302) + , Qt.point(0.530133391667,0.291125555924) + , Qt.point(0.530133022222,0.291125871343) + , Qt.point(0.5301321,0.291126042886) + , Qt.point(0.530128702778,0.291124344046) + , Qt.point(0.530126466667,0.291128383607) + , Qt.point(0.530125558333,0.291129888735) + , Qt.point(0.530124105556,0.29113250608) + , Qt.point(0.530123547222,0.291133551901) + , Qt.point(0.530122477778,0.291135903593) + , Qt.point(0.530121969444,0.291137596793) + , Qt.point(0.530121725,0.291138874983) + , Qt.point(0.530121563889,0.291139865435) + , Qt.point(0.530121491667,0.291141387069) + , Qt.point(0.530121538889,0.291144983609) + , Qt.point(0.530121888889,0.291152176479) + , Qt.point(0.530122058333,0.291156403542) + , Qt.point(0.530121927778,0.291157991432) + , Qt.point(0.530121158333,0.291159037108) + , Qt.point(0.530120825,0.291160193431) + , Qt.point(0.530120230556,0.291161167171) + , Qt.point(0.530119616667,0.29116191407) + , Qt.point(0.530118244444,0.291163020582) + , Qt.point(0.530117372222,0.29116347425) + , Qt.point(0.530116077778,0.291163916851) + , Qt.point(0.53011545,0.291164038567) + , Qt.point(0.530114438889,0.291164104957) + , Qt.point(0.530113341667,0.291163966644) + , Qt.point(0.530112138889,0.291163684486) + , Qt.point(0.530111477778,0.291163695551) + , Qt.point(0.530111775,0.291165875351) + , Qt.point(0.530111497222,0.291165880884) + , Qt.point(0.5301097,0.291165814494) + , Qt.point(0.530108916667,0.291165454884) + , Qt.point(0.530108380556,0.291165421689) + , Qt.point(0.5301074,0.291165228053) + , Qt.point(0.530105972222,0.291165294443) + , Qt.point(0.530104888889,0.291165521274) + , Qt.point(0.5301032,0.29116569278) + , Qt.point(0.530101911111,0.291165565534) + , Qt.point(0.530100011111,0.291165510209) + , Qt.point(0.530099033333,0.291165438287) + , Qt.point(0.530097675,0.291165139533) + , Qt.point(0.530097030556,0.291165277845) + , Qt.point(0.530096036111,0.291165925143) + , Qt.point(0.530095425,0.291166080052) + , Qt.point(0.530095077778,0.291166080052) + , Qt.point(0.530094988889,0.291167297187) + , Qt.point(0.530093975,0.291168082788) + , Qt.point(0.530093333333,0.291167524016) + , Qt.point(0.530092563889,0.291167889155) + , Qt.point(0.530092441667,0.291167678923) + , Qt.point(0.530092566667,0.291166981839) + , Qt.point(0.530092069444,0.291165991533) + , Qt.point(0.530091188889,0.291166544777) + , Qt.point(0.530090830556,0.291166185169) + , Qt.point(0.530090702778,0.291165914079) + , Qt.point(0.530090147222,0.291165543404) + , Qt.point(0.530089902778,0.291165111871) + , Qt.point(0.530088527778,0.291164093892) + , Qt.point(0.530088266667,0.291164807584) + , Qt.point(0.530087202778,0.291165067611) + , Qt.point(0.530086222222,0.291165084208) + , Qt.point(0.530085405556,0.291165051013) + , Qt.point(0.530085388889,0.291164525427) + , Qt.point(0.530085408333,0.291164193477) + , Qt.point(0.530085375,0.291163529575) + , Qt.point(0.530085375,0.291163109102) + , Qt.point(0.530085394444,0.291162218361) + , Qt.point(0.530085386111,0.291158467243) + , Qt.point(0.530085394444,0.291154456007) + , Qt.point(0.530085236111,0.291151446139) + , Qt.point(0.530085033333,0.291148983986) + , Qt.point(0.530084841667,0.291148198304) + , Qt.point(0.5300846,0.291146820584) + , Qt.point(0.530084305556,0.291145321127) + , Qt.point(0.530084152778,0.291143710996) + , Qt.point(0.530083844444,0.291139594306) + , Qt.point(0.530083441667,0.291136479062) + , Qt.point(0.530083266667,0.291135720993) + , Qt.point(0.5300825,0.29113143812) + , Qt.point(0.530082169444,0.291129811266) + , Qt.point(0.530081791667,0.291127664239) + , Qt.point(0.530081497222,0.291126164626) + , Qt.point(0.530080722222,0.291123525056) + , Qt.point(0.530079991667,0.291121759788) + , Qt.point(0.530079644444,0.291120918651) + , Qt.point(0.530078341667,0.29111852803) + , Qt.point(0.530077575,0.291117371445) + , Qt.point(0.530076730556,0.291115954758) + , Qt.point(0.530076236111,0.291115207672) + , Qt.point(0.530074863889,0.291112982998) + , Qt.point(0.530073813889,0.291111378118) + , Qt.point(0.530073169444,0.291110132942) + , Qt.point(0.530072463889,0.29110887669) + , Qt.point(0.530071983333,0.291107897139) + , Qt.point(0.530071341667,0.291106707282) + , Qt.point(0.530070308333,0.291104416094) + , Qt.point(0.530069413889,0.29110227984) + , Qt.point(0.530068588889,0.291099999666) + , Qt.point(0.530067305556,0.291096678974) + , Qt.point(0.530066872222,0.291095439233) + , Qt.point(0.530066158333,0.291093585142) + , Qt.point(0.530065066667,0.291091000451) + , Qt.point(0.530064769444,0.291090452514) + , Qt.point(0.530063794444,0.291088343772) + , Qt.point(0.530063291667,0.291087380716) + , Qt.point(0.530062491667,0.29108606896) + , Qt.point(0.530060802778,0.291083622537) + , Qt.point(0.530059133333,0.291081242502) + , Qt.point(0.530057827778,0.291079460223) + , Qt.point(0.53005475,0.291075109618) + , Qt.point(0.530053438889,0.291073194433) + , Qt.point(0.530053369444,0.291073072658) + , Qt.point(0.530051705556,0.291070310549) + , Qt.point(0.530049133333,0.291065588851) + , Qt.point(0.530046908333,0.29106116042) + , Qt.point(0.530045288889,0.291057274384) + , Qt.point(0.530043308333,0.291052242343) + , Qt.point(0.530042102778,0.291049031508) + , Qt.point(0.530041397222,0.291047542326) + , Qt.point(0.530040197222,0.291045250401) + , Qt.point(0.530039605556,0.2910441155) + , Qt.point(0.530038230556,0.291041945329) + , Qt.point(0.530036297222,0.291039376522) + , Qt.point(0.530033911111,0.291036647125) + , Qt.point(0.530029905556,0.291032411774) + , Qt.point(0.530027519444,0.291030014466) + , Qt.point(0.530026369444,0.291028774276) + , Qt.point(0.530024138889,0.291026199749) + , Qt.point(0.530021352778,0.291022578739) + , Qt.point(0.530020394444,0.291021272057) + , Qt.point(0.530019855556,0.291020463682) + , Qt.point(0.530018516667,0.29101833199) + , Qt.point(0.530017836111,0.291017196923) + , Qt.point(0.530017194444,0.291015973258) + , Qt.point(0.530016391667,0.291014345383) + , Qt.point(0.530015558333,0.291012562455) + , Qt.point(0.530014427778,0.291009611174) + , Qt.point(0.530013766667,0.291007595638) + , Qt.point(0.530013211111,0.29100564099) + , Qt.point(0.530012811111,0.291003979799) + , Qt.point(0.530012361111,0.291002213384) + , Qt.point(0.530012327778,0.291001620883) + , Qt.point(0.530011788889,0.290998004927) + , Qt.point(0.530011358333,0.290994699006) + , Qt.point(0.530011063889,0.290991941258) + , Qt.point(0.530011172222,0.290989931066) + , Qt.point(0.530011591667,0.290987727029) + , Qt.point(0.530011977778,0.290986541932) + , Qt.point(0.530012433333,0.29098535129) + , Qt.point(0.530012577778,0.29098373422) + , Qt.point(0.530012763889,0.290982100522) + , Qt.point(0.530013,0.290978921691) + , Qt.point(0.530013016667,0.290978312501) + , Qt.point(0.530013088889,0.290977664542) + , Qt.point(0.530013105556,0.290976983353) + , Qt.point(0.530013108333,0.290976163706) + , Qt.point(0.530013072222,0.29097527206) + , Qt.point(0.530013075,0.290974131189) + , Qt.point(0.530013041667,0.290972946005) + , Qt.point(0.530013038889,0.290971356517) + , Qt.point(0.530012891667,0.290969667326) + , Qt.point(0.530012647222,0.290968027964) + , Qt.point(0.5300125,0.290966637818) + , Qt.point(0.530011747222,0.290962771939) + , Qt.point(0.530011436111,0.29096210731) + , Qt.point(0.530009980556,0.290957338525) + , Qt.point(0.530009733333,0.290956441248) + , Qt.point(0.530009188889,0.290954951316) + , Qt.point(0.530008941667,0.290954103878) + , Qt.point(0.530008844444,0.290953156736) + , Qt.point(0.530008744444,0.290952514227) + , Qt.point(0.530008672222,0.290951827405) + , Qt.point(0.530008647222,0.290951417527) + , Qt.point(0.530008688889,0.290950725162) + , Qt.point(0.530008708333,0.290949855548) + , Qt.point(0.530005294444,0.290944887037) + , Qt.point(0.530004127778,0.290943136672) + , Qt.point(0.530002697222,0.290940948691) + , Qt.point(0.53,0.29093659481) + , Qt.point(0.529999180556,0.290935403845) + , Qt.point(0.529996688889,0.29093141544) + ] + , 'Sagene_9' : [ + Qt.point(0.529856202778,0.290711770142) + , Qt.point(0.529856222222,0.290710816205) + , Qt.point(0.529856361111,0.29070970697) + , Qt.point(0.529856677778,0.290707954364) + , Qt.point(0.529858127778,0.290707954364) + , Qt.point(0.529858563889,0.290709058064) + , Qt.point(0.529859175,0.290710372511) + , Qt.point(0.529860608333,0.290709740247) + , Qt.point(0.529861586111,0.29070934092) + , Qt.point(0.529863158333,0.290708586635) + , Qt.point(0.529863858333,0.290708287139) + , Qt.point(0.529865341667,0.290707360915) + , Qt.point(0.529874797222,0.290703306552) + , Qt.point(0.529876055556,0.290702696448) + , Qt.point(0.529882905556,0.290696905911) + , Qt.point(0.529889458333,0.290699901039) + , Qt.point(0.529889327778,0.290701221099) + , Qt.point(0.529889369444,0.290703084696) + , Qt.point(0.529889841667,0.290703084696) + , Qt.point(0.5298904,0.290702979315) + , Qt.point(0.529890697222,0.290702768551) + , Qt.point(0.529891138889,0.290702130714) + , Qt.point(0.529891808333,0.290701287656) + , Qt.point(0.529892591667,0.290700505605) + , Qt.point(0.529892952778,0.290700200549) + , Qt.point(0.529893580556,0.290699917679) + , Qt.point(0.529894227778,0.290699779016) + , Qt.point(0.529895138889,0.290699745737) + , Qt.point(0.529896341667,0.290699973144) + , Qt.point(0.529898916667,0.290701071345) + , Qt.point(0.529900044444,0.290701781289) + , Qt.point(0.529900238889,0.290701343121) + , Qt.point(0.529901180556,0.290701570525) + , Qt.point(0.529901705556,0.290701659268) + , Qt.point(0.529902247222,0.290701587164) + , Qt.point(0.529902858333,0.290701459596) + , Qt.point(0.529902611111,0.290699557157) + , Qt.point(0.529902666667,0.29069787656) + , Qt.point(0.529903505556,0.290694010574) + , Qt.point(0.529904313889,0.290694171427) + , Qt.point(0.529904541667,0.290693206306) + , Qt.point(0.529905975,0.290692751476) + , Qt.point(0.529909808333,0.290691425809) + , Qt.point(0.529912388889,0.290690427393) + , Qt.point(0.529914797222,0.290689556547) + , Qt.point(0.529917122222,0.29068864687) + , Qt.point(0.529920216667,0.290687581875) + , Qt.point(0.529922016667,0.290687287892) + , Qt.point(0.529922766667,0.290687271251) + , Qt.point(0.529923938889,0.290687376641) + , Qt.point(0.529924619444,0.290687482032) + , Qt.point(0.529926558333,0.290687864765) + , Qt.point(0.52992965,0.290689079522) + , Qt.point(0.529931588889,0.290690183334) + , Qt.point(0.529932530556,0.290690848947) + , Qt.point(0.529933247222,0.29069144245) + , Qt.point(0.529935102778,0.290693239586) + , Qt.point(0.529936319444,0.290694737186) + , Qt.point(0.529937544444,0.290694387747) + , Qt.point(0.529938030556,0.290696523197) + , Qt.point(0.529938188889,0.290696489917) + , Qt.point(0.529939077778,0.290699917679) + , Qt.point(0.529939477778,0.290699817842) + , Qt.point(0.529940411111,0.290703450758) + , Qt.point(0.529946652778,0.290729089892) + , Qt.point(0.529947280556,0.290732827594) + , Qt.point(0.529948130556,0.290738251008) + , Qt.point(0.529951,0.290750417064) + , Qt.point(0.529951369444,0.290751642497) + , Qt.point(0.529951152778,0.290751880929) + , Qt.point(0.529948019444,0.290754925066) + , Qt.point(0.529946727778,0.290756366715) + , Qt.point(0.529945583333,0.290757758451) + , Qt.point(0.529944688889,0.290758900665) + , Qt.point(0.529943813889,0.290760503079) + , Qt.point(0.529943272222,0.290761623097) + , Qt.point(0.529942325,0.290763935192) + , Qt.point(0.529941275,0.290767167641) + , Qt.point(0.529940819444,0.290769252346) + , Qt.point(0.529940591667,0.290770616263) + , Qt.point(0.5299397,0.290771264951) + , Qt.point(0.529936447222,0.290774635877) + , Qt.point(0.529933372222,0.29077788477) + , Qt.point(0.529932391667,0.290778727477) + , Qt.point(0.529931588889,0.290779370592) + , Qt.point(0.529929419444,0.290780634641) + , Qt.point(0.529928827778,0.290780911844) + , Qt.point(0.529928391667,0.290781189046) + , Qt.point(0.529927972222,0.290781344279) + , Qt.point(0.529925630556,0.290782098265) + , Qt.point(0.529924322222,0.29078232557) + , Qt.point(0.529921841667,0.290782669298) + , Qt.point(0.529921002778,0.290782863337) + , Qt.point(0.529920425,0.290783018569) + , Qt.point(0.529919877778,0.290783218152) + , Qt.point(0.529919394444,0.290783511983) + , Qt.point(0.529918994444,0.290783805813) + , Qt.point(0.529918608333,0.290783999851) + , Qt.point(0.529918136111,0.29078450435) + , Qt.point(0.529917786111,0.290784803722) + , Qt.point(0.529917594444,0.290785014392) + , Qt.point(0.529917191667,0.290785518888) + , Qt.point(0.529916616667,0.290786167524) + , Qt.point(0.529915533333,0.290787475876) + , Qt.point(0.529913416667,0.290789787646) + , Qt.point(0.529912816667,0.290790375286) + , Qt.point(0.529907830556,0.290786023383) + , Qt.point(0.529907044444,0.290785286044) + , Qt.point(0.529904533333,0.290783029657) + , Qt.point(0.529902822222,0.290781627024) + , Qt.point(0.529900866667,0.290780279821) + , Qt.point(0.529899994444,0.290779803031) + , Qt.point(0.529897969444,0.290778805094) + , Qt.point(0.529895175,0.290777457871) + , Qt.point(0.529894125,0.29078004697) + , Qt.point(0.529891713889,0.290785729556) + , Qt.point(0.52989185,0.290791589366) + , Qt.point(0.5298919,0.290796451147) + , Qt.point(0.529886986111,0.290797171811) + , Qt.point(0.529886469444,0.290797288225) + , Qt.point(0.529880461111,0.290797565403) + , Qt.point(0.529880072222,0.290797587577) + , Qt.point(0.529878394444,0.290797659643) + , Qt.point(0.529877352778,0.290797703991) + , Qt.point(0.529875466667,0.290797753883) + , Qt.point(0.529874852778,0.290797737252) + , Qt.point(0.529865477778,0.290798258344) + , Qt.point(0.529864411111,0.29079831378) + , Qt.point(0.529860708333,0.290798358128) + , Qt.point(0.529860361111,0.290798258344) + , Qt.point(0.529860111111,0.290796966699) + , Qt.point(0.529858675,0.290789100217) + , Qt.point(0.529858227778,0.290785419097) + , Qt.point(0.529858077778,0.290783966587) + , Qt.point(0.529858080556,0.290781438527) + , Qt.point(0.529858061111,0.290780778786) + , Qt.point(0.529858180556,0.290779098932) + , Qt.point(0.529858530556,0.290776110637) + , Qt.point(0.529858777778,0.290774619244) + , Qt.point(0.529858952778,0.29077372662) + , Qt.point(0.529859175,0.290772878346) + , Qt.point(0.529859625,0.290771636421) + , Qt.point(0.529859872222,0.290770339045) + , Qt.point(0.529860022222,0.290768548206) + , Qt.point(0.529860058333,0.290766119735) + , Qt.point(0.529860163889,0.290764667072) + , Qt.point(0.529860197222,0.290763685687) + , Qt.point(0.529860372222,0.290761706267) + , Qt.point(0.529860425,0.290760503079) + , Qt.point(0.529860619444,0.290755917587) + , Qt.point(0.529860675,0.290752973275) + , Qt.point(0.529860936111,0.290747433849) + , Qt.point(0.529860936111,0.290746729625) + , Qt.point(0.529861175,0.290743069839) + , Qt.point(0.529861219444,0.290741428456) + , Qt.point(0.529861380556,0.290736814762) + , Qt.point(0.529861627778,0.290732467136) + , Qt.point(0.529861644444,0.290729461447) + , Qt.point(0.529861430556,0.290728635151) + , Qt.point(0.529861313889,0.290728169319) + , Qt.point(0.529858313889,0.290719595565) + , Qt.point(0.529856830556,0.290715197618) + , Qt.point(0.529856325,0.290713151123) + , Qt.point(0.529856202778,0.290711770142) + ] + , 'Sentrum_9' : [ + Qt.point(0.529784938889,0.290869789137) + , Qt.point(0.529784938889,0.290868946847) + , Qt.point(0.529785008333,0.290868215382) + , Qt.point(0.529785272222,0.290866358999) + , Qt.point(0.529785758333,0.290861886978) + , Qt.point(0.529785861111,0.290861133318) + , Qt.point(0.529785880556,0.290860817445) + , Qt.point(0.529786,0.29086032978) + , Qt.point(0.529786141667,0.290859980656) + , Qt.point(0.529786297222,0.290859681406) + , Qt.point(0.529792208333,0.290851873024) + , Qt.point(0.529797669444,0.290844513225) + , Qt.point(0.529799705556,0.290841825273) + , Qt.point(0.529800127778,0.290842285275) + , Qt.point(0.529800963889,0.290842944796) + , Qt.point(0.529808047222,0.29084874182) + , Qt.point(0.529809588889,0.290850132857) + , Qt.point(0.529810025,0.290850626091) + , Qt.point(0.529810233333,0.290851307749) + , Qt.point(0.529810133333,0.290851873024) + , Qt.point(0.52981025,0.290853020196) + , Qt.point(0.529810355556,0.290853823765) + , Qt.point(0.529810494444,0.290854505411) + , Qt.point(0.529811072222,0.290856794172) + , Qt.point(0.529811283333,0.29085774181) + , Qt.point(0.529811563889,0.29085861186) + , Qt.point(0.529812819444,0.290856339747) + , Qt.point(0.529813394444,0.290855275724) + , Qt.point(0.529816638889,0.290849190722) + , Qt.point(0.529816936111,0.290848791698) + , Qt.point(0.529818327778,0.290846253445) + , Qt.point(0.529818675,0.29084605393) + , Qt.point(0.529818922222,0.290845555142) + , Qt.point(0.529820463889,0.290843122145) + , Qt.point(0.529820797222,0.290843354916) + , Qt.point(0.529820961111,0.290843565518) + , Qt.point(0.529821208333,0.290843964553) + , Qt.point(0.529821655556,0.290844812499) + , Qt.point(0.529822997222,0.290847788594) + , Qt.point(0.529824147222,0.290849877927) + , Qt.point(0.529824652778,0.290851014027) + , Qt.point(0.529824988889,0.290851413046) + , Qt.point(0.529825427778,0.290851878566) + , Qt.point(0.529827358333,0.290854389033) + , Qt.point(0.529828216667,0.290855087302) + , Qt.point(0.529831413889,0.290858600776) + , Qt.point(0.529834919444,0.290862712675) + , Qt.point(0.529835319444,0.290863588243) + , Qt.point(0.529835752778,0.290864713175) + , Qt.point(0.529835852778,0.290865112164) + , Qt.point(0.529835902778,0.290865605357) + , Qt.point(0.529836,0.290865998803) + , Qt.point(0.529836227778,0.29086659174) + , Qt.point(0.529836733333,0.290869584106) + , Qt.point(0.529837272222,0.290872188533) + , Qt.point(0.529837622222,0.290874238801) + , Qt.point(0.529838563889,0.290875180808) + , Qt.point(0.529839725,0.290876056317) + , Qt.point(0.529840516667,0.290876604893) + , Qt.point(0.529842594444,0.290877962472) + , Qt.point(0.529844288889,0.290879137186) + , Qt.point(0.529845491667,0.290880134579) + , Qt.point(0.5298468,0.290881165212) + , Qt.point(0.5298498,0.290883348363) + , Qt.point(0.529850361111,0.29088333174) + , Qt.point(0.529850791667,0.290883071315) + , Qt.point(0.529851530556,0.290882616955) + , Qt.point(0.529852019444,0.290882495053) + , Qt.point(0.529852472222,0.290882495053) + , Qt.point(0.529853413889,0.290882722233) + , Qt.point(0.529853922222,0.290882877381) + , Qt.point(0.529854358333,0.290883071315) + , Qt.point(0.529854725,0.290883087938) + , Qt.point(0.529854933333,0.290883071315) + , Qt.point(0.529860869444,0.290879597096) + , Qt.point(0.529866436111,0.29087626134) + , Qt.point(0.529868361111,0.290875086608) + , Qt.point(0.529869913889,0.290874127976) + , Qt.point(0.529879791667,0.290878361432) + , Qt.point(0.529881875,0.290879153809) + , Qt.point(0.529883702778,0.290879696835) + , Qt.point(0.529884852778,0.290880045922) + , Qt.point(0.529885813889,0.290880378385) + , Qt.point(0.529883175,0.290886373701) + , Qt.point(0.529882597222,0.290887947301) + , Qt.point(0.529882422222,0.290888628821) + , Qt.point(0.5298823,0.290889293716) + , Qt.point(0.529882108333,0.290890185779) + , Qt.point(0.529882066667,0.290891437985) + , Qt.point(0.529881861111,0.290893576688) + , Qt.point(0.529881791667,0.290894169537) + , Qt.point(0.529881669444,0.290894956305) + , Qt.point(0.529880575,0.290898252938) + , Qt.point(0.529879938889,0.290900009271) + , Qt.point(0.529878730556,0.290903117441) + , Qt.point(0.529876894444,0.290908447193) + , Qt.point(0.529876425,0.290909621713) + , Qt.point(0.529876388889,0.290911106472) + , Qt.point(0.529876055556,0.290913150765) + , Qt.point(0.529874902778,0.290917715719) + , Qt.point(0.529873905556,0.290921034103) + , Qt.point(0.529873086111,0.29092390371) + , Qt.point(0.529871938889,0.290926440892) + , Qt.point(0.529870955556,0.290929459982) + , Qt.point(0.529870722222,0.290930174585) + , Qt.point(0.529867622222,0.290934545237) + , Qt.point(0.529851233333,0.290956180926) + , Qt.point(0.529844961111,0.290954768536) + , Qt.point(0.529823652778,0.290949235184) + , Qt.point(0.529795775,0.290942289179) + , Qt.point(0.529798230556,0.290926230385) + , Qt.point(0.529801697222,0.290911394558) + , Qt.point(0.529802313889,0.290906729723) + , Qt.point(0.529802594444,0.290901765588) + , Qt.point(0.529804455556,0.290898352667) + , Qt.point(0.529806569444,0.290894972927) + , Qt.point(0.529808788889,0.290892357741) + , Qt.point(0.529809833333,0.290890324298) + , Qt.point(0.529810652778,0.290888290832) + , Qt.point(0.529808591667,0.290887343351) + , Qt.point(0.529806358333,0.290886246261) + , Qt.point(0.529800825,0.29088356446) + , Qt.point(0.529795794444,0.290888501382) + , Qt.point(0.529791852778,0.29088517687) + , Qt.point(0.5297977,0.290881553084) + , Qt.point(0.529796177778,0.29088072193) + , Qt.point(0.52979315,0.290878134247) + , Qt.point(0.529793744444,0.290877541346) + , Qt.point(0.529794936111,0.290876095105) + , Qt.point(0.529795683333,0.290874804006) + , Qt.point(0.529797022222,0.290873313413) + , Qt.point(0.529798263889,0.29087136842) + , Qt.point(0.529799208333,0.29086967831) + , Qt.point(0.529795552778,0.290869578565) + , Qt.point(0.529789625,0.290869379076) + , Qt.point(0.529786858333,0.290869595189) + , Qt.point(0.529784938889,0.290869789137) + ] + , 'Søndre Nordstrand_9' : [ + Qt.point(0.529840094444,0.291264802278) + , Qt.point(0.529915077778,0.291271277189) + , Qt.point(0.529922022222,0.29127111684) + , Qt.point(0.529926963889,0.291271697415) + , Qt.point(0.529930311111,0.291274362507) + , Qt.point(0.529931544444,0.291275894088) + , Qt.point(0.529932136111,0.291276911449) + , Qt.point(0.5299328,0.291277453302) + , Qt.point(0.529934122222,0.291278188671) + , Qt.point(0.529935286111,0.291279565407) + , Qt.point(0.529935527778,0.291279653872) + , Qt.point(0.529935997222,0.291280267594) + , Qt.point(0.529936380556,0.291280842611) + , Qt.point(0.529937825,0.291281959466) + , Qt.point(0.529938363889,0.291281854416) + , Qt.point(0.529939391667,0.291281732778) + , Qt.point(0.529940211111,0.291281876531) + , Qt.point(0.52994115,0.291283186893) + , Qt.point(0.529942019444,0.291284856623) + , Qt.point(0.52994255,0.291286283068) + , Qt.point(0.529943141667,0.291289064053) + , Qt.point(0.529943188889,0.291292187773) + , Qt.point(0.5299428,0.291295742668) + , Qt.point(0.529943969444,0.291294697768) + , Qt.point(0.529944577778,0.291294194666) + , Qt.point(0.529946158333,0.291293149758) + , Qt.point(0.529947155556,0.291292431034) + , Qt.point(0.529948219444,0.29129170125) + , Qt.point(0.529948761111,0.291291297657) + , Qt.point(0.529949666667,0.291290324605) + , Qt.point(0.529950425,0.291289119341) + , Qt.point(0.529950772222,0.291288621752) + , Qt.point(0.529951416667,0.2912876321) + , Qt.point(0.529952002778,0.291286852538) + , Qt.point(0.529952683333,0.291286260953) + , Qt.point(0.529953886111,0.291284591236) + , Qt.point(0.529954269444,0.29128361262) + , Qt.point(0.529954591667,0.29128257318) + , Qt.point(0.529954133333,0.291281865473) + , Qt.point(0.529954297222,0.291280538516) + , Qt.point(0.529954566667,0.291280333942) + , Qt.point(0.529955288889,0.291279449297) + , Qt.point(0.529955091667,0.291278503828) + , Qt.point(0.529957372222,0.291276916978) + , Qt.point(0.529956927778,0.291274434386) + , Qt.point(0.529954852778,0.29127270927) + , Qt.point(0.529955397222,0.291271752707) + , Qt.point(0.529956111111,0.291268678405) + , Qt.point(0.529957016667,0.29126828029) + , Qt.point(0.529957713889,0.291268086762) + , Qt.point(0.529958252778,0.291267893233) + , Qt.point(0.529959211111,0.291267600175) + , Qt.point(0.52996045,0.291267096999) + , Qt.point(0.529961216667,0.29126670994) + , Qt.point(0.529961702778,0.291266521939) + , Qt.point(0.529961877778,0.29126572017) + , Qt.point(0.529961444444,0.291264636393) + , Qt.point(0.529961461111,0.291264216152) + , Qt.point(0.5299616,0.291263923088) + , Qt.point(0.529962341667,0.291263270604) + , Qt.point(0.529963291667,0.291262280816) + , Qt.point(0.529963955556,0.291261130664) + , Qt.point(0.529964322222,0.291260815477) + , Qt.point(0.529964775,0.291260749122) + , Qt.point(0.52996535,0.291261307611) + , Qt.point(0.529965766667,0.291261257845) + , Qt.point(0.529966202778,0.291260699355) + , Qt.point(0.529965994444,0.291260328871) + , Qt.point(0.529966080556,0.291259842264) + , Qt.point(0.529966519444,0.291259427541) + , Qt.point(0.529967441667,0.291258869046) + , Qt.point(0.529968975,0.291258083832) + , Qt.point(0.529969741667,0.291257265437) + , Qt.point(0.529969916667,0.291255623106) + , Qt.point(0.529970369444,0.291255208373) + , Qt.point(0.529971347222,0.291254876587) + , Qt.point(0.529973525,0.291254423144) + , Qt.point(0.529973805556,0.291252504295) + , Qt.point(0.529974044444,0.291252067436) + , Qt.point(0.529974641667,0.291251127357) + , Qt.point(0.529975136111,0.291250480358) + , Qt.point(0.529975683333,0.291249888656) + , Qt.point(0.529976369444,0.291249296952) + , Qt.point(0.529977022222,0.291248699717) + , Qt.point(0.529977591667,0.29124758819) + , Qt.point(0.529978077778,0.291246979889) + , Qt.point(0.529978305556,0.291246437946) + , Qt.point(0.529977436111,0.291246139324) + , Qt.point(0.529977191667,0.291245807521) + , Qt.point(0.529977,0.291245320876) + , Qt.point(0.529977002778,0.291244812109) + , Qt.point(0.529977594444,0.291244148497) + , Qt.point(0.529977838889,0.291243418522) + , Qt.point(0.529978119444,0.291242771496) + , Qt.point(0.529978294444,0.29124254476) + , Qt.point(0.529978519444,0.291242340144) + , Qt.point(0.529978902778,0.291242218481) + , Qt.point(0.529979355556,0.291242235071) + , Qt.point(0.529979802778,0.29124219636) + , Qt.point(0.52998035,0.291242058106) + , Qt.point(0.529980994444,0.291241704175) + , Qt.point(0.529981675,0.291241156687) + , Qt.point(0.529982216667,0.291240752982) + , Qt.point(0.529982755556,0.291240249733) + , Qt.point(0.529982738889,0.291239514212) + , Qt.point(0.529982861111,0.291238867172) + , Qt.point(0.529983194444,0.291237943616) + , Qt.point(0.529983647222,0.291237213616) + , Qt.point(0.529983925,0.291237020055) + , Qt.point(0.529984269444,0.291236992403) + , Qt.point(0.529985527778,0.291237700283) + , Qt.point(0.529985930556,0.291237617328) + , Qt.point(0.529986452778,0.291237373995) + , Qt.point(0.529987305556,0.291236898388) + , Qt.point(0.529987794444,0.291236693766) + , Qt.point(0.529987969444,0.291236395128) + , Qt.point(0.529988163889,0.291235454968) + , Qt.point(0.529988497222,0.291235067842) + , Qt.point(0.5299893,0.291234719428) + , Qt.point(0.529990316667,0.291234763671) + , Qt.point(0.529991088889,0.291234830036) + , Qt.point(0.529992030556,0.291234830036) + , Qt.point(0.529992830556,0.29123474155) + , Qt.point(0.529994925,0.291236820963) + , Qt.point(0.529993319444,0.291239663528) + , Qt.point(0.529988786111,0.291241471908) + , Qt.point(0.529989513889,0.291243894112) + , Qt.point(0.529989958333,0.291246775278) + , Qt.point(0.529989025,0.291247024129) + , Qt.point(0.529989475,0.291248976215) + , Qt.point(0.529986461111,0.291249639809) + , Qt.point(0.529986947222,0.291250983579) + , Qt.point(0.529987077778,0.291251188185) + , Qt.point(0.529988372222,0.291253566024) + , Qt.point(0.529987372222,0.291254168773) + , Qt.point(0.529987880556,0.291255744761) + , Qt.point(0.529989655556,0.291257176962) + , Qt.point(0.529990486111,0.291259433071) + , Qt.point(0.529990636111,0.291259925208) + , Qt.point(0.529989841667,0.29126077124) + , Qt.point(0.529990222222,0.291265957936) + , Qt.point(0.529990047222,0.29126621782) + , Qt.point(0.529990925,0.291267821351) + , Qt.point(0.529990922222,0.291268512524) + , Qt.point(0.529991002778,0.291268960402) + , Qt.point(0.529990930556,0.291269811922) + , Qt.point(0.529987797222,0.291269651571) + , Qt.point(0.529987936111,0.291270840375) + , Qt.point(0.529988283333,0.291271819059) + , Qt.point(0.529988561111,0.29127248257) + , Qt.point(0.52998875,0.291273041024) + , Qt.point(0.529989152778,0.291273002319) + , Qt.point(0.5299899,0.291272902793) + , Qt.point(0.529992236111,0.291272399632) + , Qt.point(0.529993694444,0.291272139756) + , Qt.point(0.529994744444,0.2912720347) + , Qt.point(0.529995283333,0.2912720347) + , Qt.point(0.529995822222,0.29127196282) + , Qt.point(0.529996269444,0.291271946232) + , Qt.point(0.529997211111,0.291271697415) + , Qt.point(0.5299984,0.291271398834) + , Qt.point(0.529999194444,0.291270757435) + , Qt.point(0.530000680556,0.291269469103) + , Qt.point(0.530001525,0.291268523583) + , Qt.point(0.530002963889,0.29126708594) + , Qt.point(0.530004202778,0.291265399461) + , Qt.point(0.530005097222,0.291263712966) + , Qt.point(0.530005641667,0.291262275286) + , Qt.point(0.530005816667,0.291261733389) + , Qt.point(0.530006216667,0.291260550056) + , Qt.point(0.530006638889,0.291259051525) + , Qt.point(0.530007086111,0.29125721567) + , Qt.point(0.530007916667,0.291254179833) + , Qt.point(0.530008161111,0.291253062809) + , Qt.point(0.530008383333,0.291251508919) + , Qt.point(0.530008583333,0.291249175293) + , Qt.point(0.530008633333,0.291248384508) + , Qt.point(0.530008536111,0.291247040719) + , Qt.point(0.530008430556,0.291246155914) + , Qt.point(0.530008044444,0.291244214859) + , Qt.point(0.530007847222,0.291243717149) + , Qt.point(0.530007502778,0.291242622182) + , Qt.point(0.530007158333,0.291241731826) + , Qt.point(0.530006366667,0.291240338216) + , Qt.point(0.530006069444,0.291239890268) + , Qt.point(0.530005822222,0.291239447849) + , Qt.point(0.530005525,0.291238994368) + , Qt.point(0.530005294444,0.291238745506) + , Qt.point(0.530005355556,0.291238435811) + , Qt.point(0.530005380556,0.291237910434) + , Qt.point(0.530005486111,0.291238048691) + , Qt.point(0.530005875,0.291238386039) + , Qt.point(0.530006261111,0.291238590659) + , Qt.point(0.530006588889,0.291238662552) + , Qt.point(0.530006936111,0.291238662552) + , Qt.point(0.530007338889,0.29123860725) + , Qt.point(0.530007555556,0.291238496644) + , Qt.point(0.530007702778,0.2912382146) + , Qt.point(0.530007788889,0.29123782748) + , Qt.point(0.530007913889,0.291237058767) + , Qt.point(0.530008277778,0.291236898388) + , Qt.point(0.530008736111,0.291236870736) + , Qt.point(0.530009352778,0.29123710854) + , Qt.point(0.530009816667,0.291237213616) + , Qt.point(0.530010883333,0.291237219146) + , Qt.point(0.530011922222,0.291236820963) + , Qt.point(0.530012175,0.29123676013) + , Qt.point(0.530012533333,0.291236682705) + , Qt.point(0.530013283333,0.291236234748) + , Qt.point(0.530013547222,0.291235355422) + , Qt.point(0.530017722222,0.29123578679) + , Qt.point(0.530018341667,0.291235819972) + , Qt.point(0.530019002778,0.291235803381) + , Qt.point(0.530019852778,0.291235692774) + , Qt.point(0.530021091667,0.291235593227) + , Qt.point(0.5300216,0.291235421786) + , Qt.point(0.530022069444,0.29123517845) + , Qt.point(0.530023080556,0.291234448439) + , Qt.point(0.530024611111,0.291233563574) + , Qt.point(0.530025294444,0.291232844617) + , Qt.point(0.530026133333,0.291231710873) + , Qt.point(0.5300265,0.291231063806) + , Qt.point(0.530026952778,0.291230405675) + , Qt.point(0.530027269444,0.29123003513) + , Qt.point(0.530027563889,0.291229775195) + , Qt.point(0.530027983333,0.29122962034) + , Qt.point(0.530029302778,0.291229305099) + , Qt.point(0.530029655556,0.291229183427) + , Qt.point(0.530031258333,0.291228807349) + , Qt.point(0.530031869444,0.291228735452) + , Qt.point(0.530032322222,0.29122871886) + , Qt.point(0.530033125,0.291228807349) + , Qt.point(0.530033541667,0.291228945613) + , Qt.point(0.530034152778,0.291229244263) + , Qt.point(0.530034858333,0.291229841562) + , Qt.point(0.530035075,0.291230101497) + , Qt.point(0.530035125,0.291230588182) + , Qt.point(0.530035666667,0.29123088683) + , Qt.point(0.530036205556,0.291231102519) + , Qt.point(0.530037127778,0.291231323739) + , Qt.point(0.530038175,0.29123145094) + , Qt.point(0.53003915,0.291231467532) + , Qt.point(0.530042616667,0.291230947665) + , Qt.point(0.530043419444,0.29123056606) + , Qt.point(0.530043541667,0.291230217638) + , Qt.point(0.530044902778,0.291229692237) + , Qt.point(0.530045619444,0.291228127088) + , Qt.point(0.530046441667,0.291226241149) + , Qt.point(0.530046005556,0.291226064168) + , Qt.point(0.530045141667,0.291225400489) + , Qt.point(0.530045955556,0.291224969097) + , Qt.point(0.530046547222,0.291225002281) + , Qt.point(0.530047019444,0.291224216923) + , Qt.point(0.530047663889,0.291223763405) + , Qt.point(0.530048377778,0.29122373022) + , Qt.point(0.530048811111,0.291223320947) + , Qt.point(0.530049372222,0.291223138432) + , Qt.point(0.530050297222,0.291223072064) + , Qt.point(0.530051236111,0.291223055471) + , Qt.point(0.530051566667,0.291222795527) + , Qt.point(0.530052194444,0.291221971444) + , Qt.point(0.530052613889,0.291221606412) + , Qt.point(0.530053013889,0.291221556635) + , Qt.point(0.530053625,0.291221346465) + , Qt.point(0.530054688889,0.291221578758) + , Qt.point(0.530055175,0.291221191603) + , Qt.point(0.530054863889,0.291219902924) + , Qt.point(0.530054777778,0.29121967616) + , Qt.point(0.530054675,0.291218785692) + , Qt.point(0.530053972222,0.291217270229) + , Qt.point(0.530053827778,0.291216130857) + , Qt.point(0.530053530556,0.291215483735) + , Qt.point(0.530053136111,0.291214045679) + , Qt.point(0.530053183333,0.29121366957) + , Qt.point(0.530052452778,0.291212983722) + , Qt.point(0.5300518,0.291211623081) + , Qt.point(0.5300516,0.291211119752) + , Qt.point(0.530051533333,0.29121026243) + , Qt.point(0.530051255556,0.29120977569) + , Qt.point(0.530051169444,0.291207889563) + , Qt.point(0.530050263889,0.291207397286) + , Qt.point(0.530049952778,0.291205793229) + , Qt.point(0.530049186111,0.29120540604) + , Qt.point(0.530048977778,0.291205007789) + , Qt.point(0.530049083333,0.291204620599) + , Qt.point(0.530049311111,0.291203956842) + , Qt.point(0.530049086111,0.291203613901) + , Qt.point(0.530049172222,0.291202302973) + , Qt.point(0.530049469444,0.291201810681) + , Qt.point(0.530049558333,0.291201008629) + , Qt.point(0.530049663889,0.29120038358) + , Qt.point(0.530049686111,0.291199293887) + , Qt.point(0.530049963889,0.291197833578) + , Qt.point(0.530049738889,0.291197274896) + , Qt.point(0.530049669444,0.291196577924) + , Qt.point(0.530050122222,0.291195443956) + , Qt.point(0.530050211111,0.291194901862) + , Qt.point(0.530050561111,0.291194083186) + , Qt.point(0.530051,0.291192351784) + , Qt.point(0.530052130556,0.291192739) + , Qt.point(0.530055863889,0.291190631429) + , Qt.point(0.530056541667,0.291190216551) + , Qt.point(0.530057183333,0.291191953504) + , Qt.point(0.530058525,0.29119444274) + , Qt.point(0.530059219444,0.29119524482) + , Qt.point(0.530060036111,0.291196749402) + , Qt.point(0.530060002778,0.291197059167) + , Qt.point(0.530059008333,0.291198370132) + , Qt.point(0.530058972222,0.291198807119) + , Qt.point(0.530059091667,0.291199100286) + , Qt.point(0.530059475,0.291199310482) + , Qt.point(0.530060016667,0.291199205384) + , Qt.point(0.530060730556,0.29119873521) + , Qt.point(0.530061377778,0.291198054838) + , Qt.point(0.530061619444,0.291197639976) + , Qt.point(0.530062213889,0.291197518283) + , Qt.point(0.530062061111,0.291195477146) + , Qt.point(0.530061802778,0.291193834263) + , Qt.point(0.530061488889,0.291192628367) + , Qt.point(0.530060986111,0.29119128417) + , Qt.point(0.530060394444,0.291190238677) + , Qt.point(0.530059977778,0.291189431044) + , Qt.point(0.530059441667,0.291187915339) + , Qt.point(0.530059130556,0.291186394089) + , Qt.point(0.530058869444,0.291185575375) + , Qt.point(0.530058105556,0.291184330701) + , Qt.point(0.530057738889,0.291183406871) + , Qt.point(0.530057636111,0.291182272822) + , Qt.point(0.530057672222,0.291181885584) + , Qt.point(0.530057811111,0.291181277066) + , Qt.point(0.530058041667,0.291180685142) + , Qt.point(0.530059122222,0.291179501288) + , Qt.point(0.530059733333,0.29117894255) + , Qt.point(0.530060272222,0.291178643818) + , Qt.point(0.530060972222,0.291178383811) + , Qt.point(0.530061911111,0.291178383811) + , Qt.point(0.530063794444,0.291178560837) + , Qt.point(0.530067036111,0.291178046353) + , Qt.point(0.530067558333,0.291177764217) + , Qt.point(0.530069319444,0.291178394875) + , Qt.point(0.530071058333,0.291180093216) + , Qt.point(0.530074038889,0.291181022594) + , Qt.point(0.530075988889,0.291181116638) + , Qt.point(0.530078219444,0.29118067961) + , Qt.point(0.530079336111,0.291180403009) + , Qt.point(0.530081191667,0.291179827678) + , Qt.point(0.530081836111,0.291179578736) + , Qt.point(0.530083608333,0.291178367214) + , Qt.point(0.530085913889,0.291175944147) + , Qt.point(0.530085725,0.29117372574) + , Qt.point(0.530085622222,0.291172049469) + , Qt.point(0.530085486111,0.291170810236) + , Qt.point(0.530085433333,0.291169465881) + , Qt.point(0.530085452778,0.291168835192) + , Qt.point(0.530085405556,0.291165051013) + , Qt.point(0.530086222222,0.291165084208) + , Qt.point(0.530087202778,0.291165067611) + , Qt.point(0.530088266667,0.291164807584) + , Qt.point(0.530088527778,0.291164093892) + , Qt.point(0.530089902778,0.291165111871) + , Qt.point(0.530090147222,0.291165543404) + , Qt.point(0.530090702778,0.291165914079) + , Qt.point(0.530090830556,0.291166185169) + , Qt.point(0.530091188889,0.291166544777) + , Qt.point(0.530092069444,0.291165991533) + , Qt.point(0.530092566667,0.291166981839) + , Qt.point(0.530092441667,0.291167678923) + , Qt.point(0.530092563889,0.291167889155) + , Qt.point(0.530093333333,0.291167524016) + , Qt.point(0.530093975,0.291168082788) + , Qt.point(0.530094988889,0.291167297187) + , Qt.point(0.530095077778,0.291166080052) + , Qt.point(0.530095425,0.291166080052) + , Qt.point(0.530096036111,0.291165925143) + , Qt.point(0.530097030556,0.291165277845) + , Qt.point(0.530097675,0.291165139533) + , Qt.point(0.530099033333,0.291165438287) + , Qt.point(0.530100011111,0.291165510209) + , Qt.point(0.530101911111,0.291165565534) + , Qt.point(0.5301032,0.29116569278) + , Qt.point(0.530104888889,0.291165521274) + , Qt.point(0.530105972222,0.291165294443) + , Qt.point(0.5301074,0.291165228053) + , Qt.point(0.530108380556,0.291165421689) + , Qt.point(0.530108916667,0.291165454884) + , Qt.point(0.5301097,0.291165814494) + , Qt.point(0.530111497222,0.291165880884) + , Qt.point(0.530111775,0.291165875351) + , Qt.point(0.530112416667,0.291165847689) + , Qt.point(0.530112769444,0.291166102182) + , Qt.point(0.530113258333,0.291166113247) + , Qt.point(0.530114266667,0.291165820027) + , Qt.point(0.530115327778,0.2911657813) + , Qt.point(0.530116594444,0.291165687248) + , Qt.point(0.530117136111,0.291165454884) + , Qt.point(0.5301176,0.291165465949) + , Qt.point(0.530119338889,0.291165228053) + , Qt.point(0.530120297222,0.291165366365) + , Qt.point(0.530120802778,0.291165322105) + , Qt.point(0.530121002778,0.291165067611) + , Qt.point(0.530121397222,0.291164259867) + , Qt.point(0.530122572222,0.291163767473) + , Qt.point(0.530122825,0.29116230135) + , Qt.point(0.53012315,0.291161786821) + , Qt.point(0.530123805556,0.291161117377) + , Qt.point(0.530125663889,0.291160326214) + , Qt.point(0.530126741667,0.291160071713) + , Qt.point(0.530127977778,0.291159922332) + , Qt.point(0.530128622222,0.291159872538) + , Qt.point(0.530129075,0.291159651232) + , Qt.point(0.530130369444,0.29115893752) + , Qt.point(0.530131272222,0.291158334459) + , Qt.point(0.530133088889,0.291158262534) + , Qt.point(0.530133697222,0.291158079955) + , Qt.point(0.530131405556,0.291162091112) + , Qt.point(0.530129705556,0.291165775767) + , Qt.point(0.530128847222,0.291169133939) + , Qt.point(0.530128497222,0.291171070255) + , Qt.point(0.530128144444,0.291174395137) + , Qt.point(0.530127575,0.291187655344) + , Qt.point(0.530127716667,0.291190681215) + , Qt.point(0.53012845,0.291196295816) + , Qt.point(0.530128836111,0.291201307325) + , Qt.point(0.530129030556,0.291204537629) + , Qt.point(0.530128522222,0.291209996936) + , Qt.point(0.530127416667,0.291218536803) + , Qt.point(0.530126763889,0.291223846365) + , Qt.point(0.530126961111,0.291224543234) + , Qt.point(0.530127505556,0.291225090772) + , Qt.point(0.530128591667,0.291226678069) + , Qt.point(0.530128608333,0.29123325387) + , Qt.point(0.530129208333,0.291237091949) + , Qt.point(0.530129380556,0.291238402629) + , Qt.point(0.530130638889,0.291246067434) + , Qt.point(0.530130163889,0.29124765455) + , Qt.point(0.53013015,0.291250004785) + , Qt.point(0.530134358333,0.291251044408) + , Qt.point(0.530134302778,0.29125268678) + , Qt.point(0.530134252778,0.291260262516) + , Qt.point(0.530133644444,0.291268650758) + , Qt.point(0.530134791667,0.291270171328) + , Qt.point(0.530134805556,0.291272736916) + , Qt.point(0.530131880556,0.291272266929) + , Qt.point(0.530133247222,0.291285542203) + , Qt.point(0.530133152778,0.291289849135) + , Qt.point(0.530133222222,0.291294537439) + , Qt.point(0.530133158333,0.291296339751) + , Qt.point(0.530133013889,0.291297041874) + , Qt.point(0.530132819444,0.291298009361) + , Qt.point(0.530132272222,0.29129984481) + , Qt.point(0.530131625,0.291301729995) + , Qt.point(0.530130877778,0.291303714671) + , Qt.point(0.530129802778,0.291306053133) + , Qt.point(0.530129411111,0.291307026101) + , Qt.point(0.530127663889,0.291310597294) + , Qt.point(0.530128547222,0.291312885917) + , Qt.point(0.530128944444,0.291313969409) + , Qt.point(0.530130730556,0.29131852443) + , Qt.point(0.530133547222,0.291321144622) + , Qt.point(0.530137191667,0.291317662081) + , Qt.point(0.530139372222,0.29131660625) + , Qt.point(0.530152263889,0.291313681953) + , Qt.point(0.530149611111,0.291317496244) + , Qt.point(0.530148211111,0.291320735565) + , Qt.point(0.530147819444,0.291324643681) + , Qt.point(0.530148827778,0.291324997453) + , Qt.point(0.530149855556,0.291325273836) + , Qt.point(0.530151422222,0.291325472832) + , Qt.point(0.530154544444,0.291323212005) + , Qt.point(0.530156772222,0.291322968784) + , Qt.point(0.530157208333,0.291322482343) + , Qt.point(0.530157108333,0.291320475758) + , Qt.point(0.53015885,0.29132032098) + , Qt.point(0.530158869444,0.291320514453) + , Qt.point(0.530162177778,0.291320641593) + , Qt.point(0.530161736111,0.291322841646) + , Qt.point(0.530162677778,0.291322769786) + , Qt.point(0.530166194444,0.291323057228) + , Qt.point(0.530168897222,0.291320414952) + , Qt.point(0.530174458333,0.291320387313) + , Qt.point(0.530174472222,0.291320061172) + , Qt.point(0.530174455556,0.29131948075) + , Qt.point(0.530174783333,0.291318933492) + , Qt.point(0.530175397222,0.291318751073) + , Qt.point(0.530175875,0.291318684739) + , Qt.point(0.530176791667,0.291318773184) + , Qt.point(0.530177755556,0.291319088272) + , Qt.point(0.530178252778,0.291319138023) + , Qt.point(0.530178647222,0.291318988771) + , Qt.point(0.530179044444,0.291318695794) + , Qt.point(0.530179736111,0.291318065617) + , Qt.point(0.530180586111,0.291318607349) + , Qt.point(0.530181872222,0.291319845587) + , Qt.point(0.530182238889,0.291320160673) + , Qt.point(0.530182933333,0.29132054762) + , Qt.point(0.530183247222,0.291320685815) + , Qt.point(0.530184638889,0.291321144622) + , Qt.point(0.530185825,0.291321139094) + , Qt.point(0.530186519444,0.291321089344) + , Qt.point(0.530187461111,0.29132092351) + , Qt.point(0.53018875,0.291320508925) + , Qt.point(0.530192269444,0.291318922437) + , Qt.point(0.530193063889,0.291318623932) + , Qt.point(0.530193955556,0.291318430457) + , Qt.point(0.5301945,0.291318330955) + , Qt.point(0.530194847222,0.291318330955) + , Qt.point(0.530195269444,0.291318463624) + , Qt.point(0.530195588889,0.291318734489) + , Qt.point(0.530195833333,0.291320265701) + , Qt.point(0.530195869444,0.291321514984) + , Qt.point(0.530195277778,0.291321514984) + , Qt.point(0.530194511111,0.291321636595) + , Qt.point(0.530194111111,0.291321636595) + , Qt.point(0.530193641667,0.291321531567) + , Qt.point(0.530193705556,0.291323969302) + , Qt.point(0.530194602778,0.291327429614) + , Qt.point(0.530196802778,0.291332890804) + , Qt.point(0.530196980556,0.291339484921) + , Qt.point(0.530197261111,0.291346703356) + , Qt.point(0.530203475,0.291346896801) + , Qt.point(0.530204780556,0.291347073666) + , Qt.point(0.530205419444,0.291349654763) + , Qt.point(0.530206216667,0.291351522858) + , Qt.point(0.530207533333,0.291354993705) + , Qt.point(0.530197825,0.291358934254) + , Qt.point(0.530198019444,0.291361448865) + , Qt.point(0.530197922222,0.2913624547) + , Qt.point(0.530198244444,0.291365665599) + , Qt.point(0.530198491667,0.29137209828) + , Qt.point(0.530198555556,0.291374369559) + , Qt.point(0.530201216667,0.291375994253) + , Qt.point(0.530202147222,0.291376635285) + , Qt.point(0.53020285,0.2913769558) + , Qt.point(0.530205016667,0.29137773498) + , Qt.point(0.530206433333,0.29137855284) + , Qt.point(0.530207147222,0.291379392801) + , Qt.point(0.530207491667,0.291380089081) + , Qt.point(0.530207583333,0.291381161126) + , Qt.point(0.530207555556,0.291382686293) + , Qt.point(0.530207555556,0.291383365982) + , Qt.point(0.530207577778,0.291383890944) + , Qt.point(0.530207422222,0.291386963323) + , Qt.point(0.530207422222,0.29138769273) + , Qt.point(0.530207475,0.291387952442) + , Qt.point(0.530207475,0.291388250834) + , Qt.point(0.530207561111,0.291388792359) + , Qt.point(0.530207802778,0.291389715159) + , Qt.point(0.530208425,0.291391267883) + , Qt.point(0.530208597222,0.2913918094) + , Qt.point(0.530208725,0.291392262504) + , Qt.point(0.530208855556,0.291392875851) + , Qt.point(0.530209038889,0.29139411359) + , Qt.point(0.530209183333,0.291394550112) + , Qt.point(0.530209425,0.291395124772) + , Qt.point(0.530209530556,0.291395246335) + , Qt.point(0.530210225,0.291395876248) + , Qt.point(0.530211005556,0.29139650616) + , Qt.point(0.530211283333,0.291396682976) + , Qt.point(0.530211705556,0.291396992405) + , Qt.point(0.530213238889,0.291397893062) + , Qt.point(0.530214227778,0.291398340626) + , Qt.point(0.530215216667,0.291398837918) + , Qt.point(0.530215958333,0.291399235751) + , Qt.point(0.530217294444,0.291399832498) + , Qt.point(0.530218036111,0.291400136396) + , Qt.point(0.530218680556,0.291400434769) + , Qt.point(0.530220905556,0.291401628254) + , Qt.point(0.530222536111,0.291402672547) + , Qt.point(0.530223227778,0.291403169827) + , Qt.point(0.530223766667,0.291403600802) + , Qt.point(0.530224216667,0.291404103605) + , Qt.point(0.530224611111,0.291404611932) + , Qt.point(0.530225136111,0.291405623057) + , Qt.point(0.530225430556,0.29140613138) + , Qt.point(0.530226125,0.291406866235) + , Qt.point(0.530226786111,0.291407214324) + , Qt.point(0.530227097222,0.291407335878) + , Qt.point(0.530227672222,0.291407462958) + , Qt.point(0.530228488889,0.291407512685) + , Qt.point(0.530229011111,0.291407451907) + , Qt.point(0.530229902778,0.291407203273) + , Qt.point(0.530233816667,0.291405827491) + , Qt.point(0.530234511111,0.291405628582) + , Qt.point(0.530235091667,0.291405280491) + , Qt.point(0.53023565,0.291404987651) + , Qt.point(0.5302364,0.291404534578) + , Qt.point(0.530237288889,0.291403893644) + , Qt.point(0.530238091667,0.291403352163) + , Qt.point(0.53023865,0.291403147726) + , Qt.point(0.530239205556,0.291403026168) + , Qt.point(0.530240161111,0.291403015118) + , Qt.point(0.530240558333,0.291403114574) + , Qt.point(0.530241397222,0.291403412941) + , Qt.point(0.530242138889,0.291403860492) + , Qt.point(0.530242536111,0.291404208586) + , Qt.point(0.530243136111,0.291404622983) + , Qt.point(0.530244891667,0.291406125854) + , Qt.point(0.530245516667,0.291406739155) + , Qt.point(0.530246241667,0.291407346928) + , Qt.point(0.530247672222,0.291408137031) + , Qt.point(0.530248219444,0.291408490642) + , Qt.point(0.530249616667,0.29140912051) + , Qt.point(0.530250625,0.291409645399) + , Qt.point(0.530250997222,0.291409899555) + , Qt.point(0.530250902778,0.291410037683) + , Qt.point(0.530250705556,0.291410319464) + , Qt.point(0.530250488889,0.291410584669) + , Qt.point(0.530248536111,0.291414043354) + , Qt.point(0.530246669444,0.291416899758) + , Qt.point(0.530246588889,0.291417048931) + , Qt.point(0.530246311111,0.291417573797) + , Qt.point(0.530245425,0.291419253358) + , Qt.point(0.530244088889,0.291420231253) + , Qt.point(0.530241830556,0.291421137321) + , Qt.point(0.530239033333,0.291423369322) + , Qt.point(0.530238630556,0.291423606885) + , Qt.point(0.530237166667,0.291424468739) + , Qt.point(0.5302356,0.291425253243) + , Qt.point(0.530232936111,0.291426341599) + , Qt.point(0.530231430556,0.291426468666) + , Qt.point(0.530231197222,0.291426717274) + , Qt.point(0.530231105556,0.291426816717) + , Qt.point(0.530230975,0.291427026653) + , Qt.point(0.530230172222,0.291427833244) + , Qt.point(0.530229813889,0.29142834703) + , Qt.point(0.530228922222,0.291430054116) + , Qt.point(0.530228725,0.291432037409) + , Qt.point(0.530228747222,0.291432982089) + , Qt.point(0.530228569444,0.291433772082) + , Qt.point(0.530228477778,0.291434291376) + , Qt.point(0.530228438889,0.291435037167) + , Qt.point(0.530228536111,0.291435910016) + , Qt.point(0.530228252778,0.291436401682) + , Qt.point(0.530228055556,0.291436407207) + , Qt.point(0.530228241667,0.291437246903) + , Qt.point(0.530227905556,0.29143816946) + , Qt.point(0.530225869444,0.291441533715) + , Qt.point(0.530225375,0.29144220214) + , Qt.point(0.530223825,0.291443798614) + , Qt.point(0.530223047222,0.291444505699) + , Qt.point(0.530222780556,0.291444997342) + , Qt.point(0.530222261111,0.291446626937) + , Qt.point(0.530222072222,0.291446582745) + , Qt.point(0.530220452778,0.291446207111) + , Qt.point(0.530220986111,0.291444306832) + , Qt.point(0.530221080556,0.291443969862) + , Qt.point(0.530220586111,0.291443179913) + , Qt.point(0.530220586111,0.291442958948) + , Qt.point(0.530220455556,0.291442981044) + , Qt.point(0.530220311111,0.291442732458) + , Qt.point(0.530220225,0.291442704837) + , Qt.point(0.530219988889,0.291442423106) + , Qt.point(0.530220027778,0.291442262905) + , Qt.point(0.530219911111,0.291441815448) + , Qt.point(0.530219788889,0.291441572385) + , Qt.point(0.53021955,0.291441296176) + , Qt.point(0.530219602778,0.291441135974) + , Qt.point(0.530219258333,0.291440876337) + , Qt.point(0.530219169444,0.291440837668) + , Qt.point(0.530218980556,0.291440826619) + , Qt.point(0.530218541667,0.291440776901) + , Qt.point(0.530218491667,0.291440147141) + , Qt.point(0.530218122222,0.291440163714) + , Qt.point(0.530217469444,0.291440572506) + , Qt.point(0.530217358333,0.291440627748) + , Qt.point(0.530215163889,0.291440699563) + , Qt.point(0.530215011111,0.291440495167) + , Qt.point(0.530215097222,0.291440080851) + , Qt.point(0.530214161111,0.291439545001) + , Qt.point(0.530213672222,0.291439500807) + , Qt.point(0.530213516667,0.291439020197) + , Qt.point(0.530213197222,0.291438898664) + , Qt.point(0.530212636111,0.291438992576) + , Qt.point(0.530212236111,0.291438782654) + , Qt.point(0.53021205,0.291438467771) + , Qt.point(0.530211708333,0.291438279946) + , Qt.point(0.530211516667,0.291438379383) + , Qt.point(0.530211225,0.291438412528) + , Qt.point(0.530210802778,0.29143813079) + , Qt.point(0.530210727778,0.291437992683) + , Qt.point(0.530210497222,0.291437810382) + , Qt.point(0.5302102,0.29143766675) + , Qt.point(0.530210091667,0.291437086698) + , Qt.point(0.530209936111,0.291437108796) + , Qt.point(0.530209866667,0.291436965163) + , Qt.point(0.530209744444,0.291436755239) + , Qt.point(0.530209483333,0.291436843628) + , Qt.point(0.530209308333,0.291436749715) + , Qt.point(0.530209033333,0.29143683258) + , Qt.point(0.530208811111,0.291436766288) + , Qt.point(0.530208488889,0.291436804958) + , Qt.point(0.5302084,0.291437020407) + , Qt.point(0.530208266667,0.291437136417) + , Qt.point(0.530208213889,0.291437335292) + , Qt.point(0.530208041667,0.291437561789) + , Qt.point(0.530207941667,0.291437931916) + , Qt.point(0.530207594444,0.291438119742) + , Qt.point(0.530207247222,0.291437920867) + , Qt.point(0.530206952778,0.291437108796) + , Qt.point(0.530206730556,0.291436976212) + , Qt.point(0.530206675,0.291436760764) + , Qt.point(0.530206297222,0.291436782861) + , Qt.point(0.530205980556,0.291436556364) + , Qt.point(0.530205941667,0.291436318817) + , Qt.point(0.530205744444,0.291435987357) + , Qt.point(0.530204794444,0.291435738761) + , Qt.point(0.5302044,0.291436059174) + , Qt.point(0.530204088889,0.29143587687) + , Qt.point(0.530203405556,0.291435970784) + , Qt.point(0.530203205556,0.291436031552) + , Qt.point(0.530202716667,0.291435887919) + , Qt.point(0.530202477778,0.291435954211) + , Qt.point(0.530202294444,0.291435700091) + , Qt.point(0.530202241667,0.291435556458) + , Qt.point(0.530202119444,0.291435468068) + , Qt.point(0.53020195,0.29143549569) + , Qt.point(0.5302014,0.29143536863) + , Qt.point(0.530201177778,0.29143528024) + , Qt.point(0.530200755556,0.291435589604) + , Qt.point(0.530198313889,0.291434937729) + , Qt.point(0.530195294444,0.29143420851) + , Qt.point(0.530193522222,0.291434412912) + , Qt.point(0.530191388889,0.291435313386) + , Qt.point(0.530186616667,0.291437324244) + , Qt.point(0.530182805556,0.291437252428) + , Qt.point(0.530180047222,0.291437379487) + , Qt.point(0.530179030556,0.291437882197) + , Qt.point(0.530176925,0.291438550635) + , Qt.point(0.530175425,0.291439324031) + , Qt.point(0.530174822222,0.291440202384) + , Qt.point(0.530173922222,0.291441318272) + , Qt.point(0.530173566667,0.291441959077) + , Qt.point(0.530173255556,0.291442213188) + , Qt.point(0.53017205,0.291443279347) + , Qt.point(0.530168719444,0.291444737711) + , Qt.point(0.530167663889,0.291445013915) + , Qt.point(0.530167241667,0.291445936433) + , Qt.point(0.530166722222,0.291446389404) + , Qt.point(0.5301663,0.291446499884) + , Qt.point(0.530165697222,0.291446997046) + , Qt.point(0.530164730556,0.291447427919) + , Qt.point(0.53016385,0.291447621259) + , Qt.point(0.530163597222,0.291449212163) + , Qt.point(0.530159344444,0.291452255833) + , Qt.point(0.530158236111,0.291454023458) + , Qt.point(0.530158069444,0.2914542886) + , Qt.point(0.530157869444,0.291454636599) + , Qt.point(0.530157875,0.291454840979) + , Qt.point(0.530157594444,0.291455211072) + , Qt.point(0.530157627778,0.291455332595) + , Qt.point(0.53015755,0.291455476213) + , Qt.point(0.530157308333,0.291455570117) + , Qt.point(0.530157005556,0.291455857352) + , Qt.point(0.530156672222,0.291455818685) + , Qt.point(0.530156388889,0.291455984398) + , Qt.point(0.5301562,0.291455802114) + , Qt.point(0.530155686111,0.2914553105) + , Qt.point(0.53015345,0.291454736027) + , Qt.point(0.530150261111,0.291453791458) + , Qt.point(0.530149475,0.291453592601) + , Qt.point(0.530148613889,0.291453305362) + , Qt.point(0.530146702778,0.291452559644) + , Qt.point(0.530144977778,0.291451222869) + , Qt.point(0.530142280556,0.291449328165) + , Qt.point(0.530141138889,0.29144794165) + , Qt.point(0.530139625,0.291446908662) + , Qt.point(0.530138941667,0.291446091106) + , Qt.point(0.530137183333,0.291444864765) + , Qt.point(0.530135252778,0.291442953424) + , Qt.point(0.530133086111,0.291441561336) + , Qt.point(0.530133016667,0.291439484234) + , Qt.point(0.530132402778,0.291438202606) + , Qt.point(0.530131783333,0.291436744191) + , Qt.point(0.53013105,0.291434910107) + , Qt.point(0.530130133333,0.291431849577) + , Qt.point(0.530129875,0.291430440832) + , Qt.point(0.53012915,0.291428755848) + , Qt.point(0.530128377778,0.291426236631) + , Qt.point(0.530127805556,0.291423153858) + , Qt.point(0.530127897222,0.291420634564) + , Qt.point(0.53012825,0.291419745068) + , Qt.point(0.530127958333,0.291416010244) + , Qt.point(0.530127572222,0.291414170429) + , Qt.point(0.530126888889,0.291414374854) + , Qt.point(0.530124280556,0.291415153876) + , Qt.point(0.530123183333,0.291415402499) + , Qt.point(0.530122175,0.291415634548) + , Qt.point(0.530120258333,0.291416076543) + , Qt.point(0.530120108333,0.291416115218) + , Qt.point(0.530119091667,0.29141637489) + , Qt.point(0.530115161111,0.291417441199) + , Qt.point(0.530113827778,0.291417739543) + , Qt.point(0.530111844444,0.291418220208) + , Qt.point(0.530110286111,0.29141789424) + , Qt.point(0.530108841667,0.291417855566) + , Qt.point(0.530107077778,0.291418198109) + , Qt.point(0.530105955556,0.291418579325) + , Qt.point(0.530104858333,0.291418838994) + , Qt.point(0.530102391667,0.291417695344) + , Qt.point(0.530100875,0.291416082068) + , Qt.point(0.530100452778,0.29141536935) + , Qt.point(0.530100038889,0.291413717378) + , Qt.point(0.530098677778,0.291413612403) + , Qt.point(0.53009725,0.291413540578) + , Qt.point(0.530097122222,0.291413551628) + , Qt.point(0.530095383333,0.291414004679) + , Qt.point(0.530093905556,0.291414159379) + , Qt.point(0.530093622222,0.291414032304) + , Qt.point(0.530092511111,0.291413546103) + , Qt.point(0.530090808333,0.291412816799) + , Qt.point(0.530089969444,0.291412595797) + , Qt.point(0.530088625,0.291411927265) + , Qt.point(0.530087313889,0.291411684162) + , Qt.point(0.530079930556,0.291410883025) + , Qt.point(0.530075836111,0.291410413391) + , Qt.point(0.530073966667,0.291410225537) + , Qt.point(0.530071725,0.291409982432) + , Qt.point(0.530067419444,0.291409512796) + , Qt.point(0.530062386111,0.291408965806) + , Qt.point(0.530058725,0.291408567994) + , Qt.point(0.530055655556,0.291408230959) + , Qt.point(0.530053627778,0.291408009952) + , Qt.point(0.530048186111,0.291407418756) + , Qt.point(0.530047944444,0.291407269576) + , Qt.point(0.530047583333,0.291405998774) + , Qt.point(0.530046719444,0.291403528973) + , Qt.point(0.530045744444,0.291400876801) + , Qt.point(0.530045519444,0.291400241379) + , Qt.point(0.530045091667,0.291399047885) + , Qt.point(0.5300444,0.291397119492) + , Qt.point(0.530044116667,0.291396318291) + , Qt.point(0.530043858333,0.291395599971) + , Qt.point(0.530043258333,0.291394080436) + , Qt.point(0.530042894444,0.291393025043) + , Qt.point(0.530042788889,0.291392052529) + , Qt.point(0.530042702778,0.291391146318) + , Qt.point(0.530042741667,0.29138868737) + , Qt.point(0.53004265,0.291385769743) + , Qt.point(0.530042622222,0.291384647992) + , Qt.point(0.530042405556,0.291383034427) + , Qt.point(0.530042297222,0.29138203423) + , Qt.point(0.530042111111,0.291381094814) + , Qt.point(0.530041938889,0.291380315647) + , Qt.point(0.530041541667,0.291379442535) + , Qt.point(0.530040944444,0.29137808865) + , Qt.point(0.530040469444,0.291377033165) + , Qt.point(0.530040166667,0.291376458448) + , Qt.point(0.530039566667,0.291375325588) + , Qt.point(0.530039558333,0.291375314536) + , Qt.point(0.5300394,0.291375060332) + , Qt.point(0.530038655556,0.291373855622) + , Qt.point(0.530037997222,0.291372789061) + , Qt.point(0.530037344444,0.291371739072) + , Qt.point(0.530036747222,0.291370771972) + , Qt.point(0.530035833333,0.291369296444) + , Qt.point(0.5300346,0.291367301422) + , Qt.point(0.530033369444,0.291367400897) + , Qt.point(0.530032383333,0.291367478267) + , Qt.point(0.530032080556,0.291367511425) + , Qt.point(0.530031836111,0.291367539057) + , Qt.point(0.530030438889,0.291367743534) + , Qt.point(0.530028816667,0.291367986695) + , Qt.point(0.5300282,0.291368080644) + , Qt.point(0.530027861111,0.291368130381) + , Qt.point(0.530026416667,0.29136834591) + , Qt.point(0.530026194444,0.291368379068) + , Qt.point(0.530025702778,0.291368439858) + , Qt.point(0.530025575,0.291368450911) + , Qt.point(0.530023169444,0.291368732755) + , Qt.point(0.530022741667,0.291368782493) + , Qt.point(0.530022544444,0.291368804598) + , Qt.point(0.530018855556,0.291369230127) + , Qt.point(0.530016702778,0.291369191443) + , Qt.point(0.530016397222,0.291369185917) + , Qt.point(0.530015827778,0.291369230127) + , Qt.point(0.530015122222,0.291369307496) + , Qt.point(0.530014958333,0.291369324075) + , Qt.point(0.530014644444,0.291369357233) + , Qt.point(0.530014113889,0.291369539603) + , Qt.point(0.530013072222,0.291369904341) + , Qt.point(0.530012991667,0.291369931972) + , Qt.point(0.530012758333,0.29137007013) + , Qt.point(0.530012536111,0.291370169604) + , Qt.point(0.530010877778,0.291370882498) + , Qt.point(0.530010205556,0.291371175392) + , Qt.point(0.530009911111,0.291371302496) + , Qt.point(0.530009233333,0.291371589863) + , Qt.point(0.530008727778,0.291371799861) + , Qt.point(0.530008391667,0.291371943544) + , Qt.point(0.53000795,0.291372131437) + , Qt.point(0.530007061111,0.291372440908) + , Qt.point(0.530007055556,0.291372446434) + , Qt.point(0.530006158333,0.291373225634) + , Qt.point(0.530005286111,0.29137384457) + , Qt.point(0.530004266667,0.291374728761) + , Qt.point(0.530003069444,0.291375817416) + , Qt.point(0.530000888889,0.29137773498) + , Qt.point(0.529999502778,0.291378751778) + , Qt.point(0.529997658333,0.291379879092) + , Qt.point(0.529996502778,0.291380470376) + , Qt.point(0.529995911111,0.29138046485) + , Qt.point(0.529995680556,0.291380459324) + , Qt.point(0.529995227778,0.291380393012) + , Qt.point(0.529994711111,0.291380315647) + , Qt.point(0.529994683333,0.291380310121) + , Qt.point(0.529993533333,0.291380188549) + , Qt.point(0.529990380556,0.291380061451) + , Qt.point(0.529989316667,0.291380017242) + , Qt.point(0.529989022222,0.29138000619) + , Qt.point(0.529988291667,0.291379586212) + , Qt.point(0.529987130556,0.291379381748) + , Qt.point(0.529986036111,0.291379149655) + , Qt.point(0.529985780556,0.291379110972) + , Qt.point(0.529984297222,0.291378912034) + , Qt.point(0.529978563889,0.291378873352) + , Qt.point(0.529973366667,0.291377602354) + , Qt.point(0.529972147222,0.291378221276) + , Qt.point(0.529970033333,0.291377983654) + , Qt.point(0.529968591667,0.29137715474) + , Qt.point(0.529967888889,0.291376806594) + , Qt.point(0.529967125,0.291376419766) + , Qt.point(0.529966313889,0.291375767681) + , Qt.point(0.529965483333,0.291375414007) + , Qt.point(0.529964961111,0.291375242696) + , Qt.point(0.529964422222,0.291374911125) + , Qt.point(0.529963455556,0.291374259035) + , Qt.point(0.529963269444,0.291374131933) + , Qt.point(0.529960091667,0.291373380368) + , Qt.point(0.529959105556,0.291373203529) + , Qt.point(0.529957222222,0.291372612221) + , Qt.point(0.529956411111,0.291372258541) + , Qt.point(0.529954633333,0.291371506969) + , Qt.point(0.529954397222,0.291371407496) + , Qt.point(0.529953413889,0.291370711183) + , Qt.point(0.529951725,0.291369628024) + , Qt.point(0.529951208333,0.291369064337) + , Qt.point(0.529950961111,0.291368793545) + , Qt.point(0.529950533333,0.291368329331) + , Qt.point(0.529950380556,0.291368185645) + , Qt.point(0.529949863889,0.291367704849) + , Qt.point(0.529948230556,0.291365886657) + , Qt.point(0.529947008333,0.291364427669) + , Qt.point(0.529943366667,0.291364201082) + , Qt.point(0.529942236111,0.291364129238) + , Qt.point(0.529937563889,0.291362449174) + , Qt.point(0.529937080556,0.291362504439) + , Qt.point(0.529935455556,0.291362675762) + , Qt.point(0.529935063889,0.291363167624) + , Qt.point(0.529933088889,0.291365626913) + , Qt.point(0.529932405556,0.291366544303) + , Qt.point(0.529932155556,0.291366804045) + , Qt.point(0.529931647222,0.291367461688) + , Qt.point(0.529931416667,0.291367682744) + , Qt.point(0.529931175,0.291368014327) + , Qt.point(0.529931186111,0.291368290646) + , Qt.point(0.529930875,0.291368660913) + , Qt.point(0.529930336111,0.291368848809) + , Qt.point(0.5299302,0.291369285391) + , Qt.point(0.529930177778,0.291369771709) + , Qt.point(0.529929922222,0.291369954078) + , Qt.point(0.529929894444,0.291370302236) + , Qt.point(0.529929308333,0.291371258286) + , Qt.point(0.529929102778,0.291371755651) + , Qt.point(0.529928847222,0.291371993281) + , Qt.point(0.529928483333,0.291372092753) + , Qt.point(0.529928341667,0.29137245196) + , Qt.point(0.529928222222,0.291372568011) + , Qt.point(0.529928152778,0.29137271722) + , Qt.point(0.529928105556,0.291372744851) + , Qt.point(0.529927938889,0.291373247738) + , Qt.point(0.529927963889,0.291373601417) + , Qt.point(0.529927880556,0.291373695362) + , Qt.point(0.529927916667,0.291373761677) + , Qt.point(0.529927533333,0.291374087723) + , Qt.point(0.529927291667,0.291374529819) + , Qt.point(0.529927036111,0.29137481718) + , Qt.point(0.529926711111,0.291375065858) + , Qt.point(0.529926436111,0.2913752648) + , Qt.point(0.529926222222,0.291375502425) + , Qt.point(0.529925986111,0.291375579792) + , Qt.point(0.529925633333,0.29137588373) + , Qt.point(0.529925225,0.291375977674) + , Qt.point(0.529924316667,0.291376336874) + , Qt.point(0.529924302778,0.2913763424) + , Qt.point(0.529923755556,0.291376568971) + , Qt.point(0.529923722222,0.291376574497) + , Qt.point(0.529923483333,0.291376646337) + , Qt.point(0.529923061111,0.291376762385) + , Qt.point(0.529922516667,0.291376861856) + , Qt.point(0.529922269444,0.291377038691) + , Qt.point(0.529921922222,0.291377110531) + , Qt.point(0.5299218,0.291377337101) + , Qt.point(0.529921522222,0.291377408941) + , Qt.point(0.529920980556,0.291377558145) + , Qt.point(0.529920091667,0.291375325588) + , Qt.point(0.529919844444,0.291374330876) + , Qt.point(0.529918658333,0.291371551179) + , Qt.point(0.529918955556,0.291370141973) + , Qt.point(0.529918841667,0.291369733024) + , Qt.point(0.529918808333,0.291369616971) + , Qt.point(0.529918819444,0.29136942355) + , Qt.point(0.529918858333,0.291368699597) + , Qt.point(0.529918488889,0.291368091696) + , Qt.point(0.529918327778,0.291367831956) + , Qt.point(0.529918266667,0.291367732481) + , Qt.point(0.529918116667,0.291367483793) + , Qt.point(0.529916755556,0.291365798233) + , Qt.point(0.529915988889,0.291364184503) + , Qt.point(0.529915344444,0.291363018408) + , Qt.point(0.52991505,0.291362200479) + , Qt.point(0.529913538889,0.291360636456) + , Qt.point(0.529912822222,0.291359895889) + , Qt.point(0.529912625,0.291359249273) + , Qt.point(0.529912130556,0.291358829247) + , Qt.point(0.529911288889,0.291357734965) + , Qt.point(0.529911313889,0.291357237562) + , Qt.point(0.529910225,0.29135666831) + , Qt.point(0.529908566667,0.291354098365) + , Qt.point(0.529907477778,0.2913523132) + , Qt.point(0.529906836111,0.291351019911) + , Qt.point(0.529906216667,0.291350179821) + , Qt.point(0.529904483333,0.291348787032) + , Qt.point(0.529903197222,0.291346631504) + , Qt.point(0.529902202778,0.29134419407) + , Qt.point(0.529893325,0.291338794014) + , Qt.point(0.5298445,0.291290352249) + , Qt.point(0.529840094444,0.291264802278) + ] + , 'St. Hanshaugen_9' : [ + Qt.point(0.529765408333,0.290760370007) + , Qt.point(0.529768602778,0.29075756993) + , Qt.point(0.52977035,0.290755451824) + , Qt.point(0.529770716667,0.290755368651) + , Qt.point(0.529771030556,0.290755013783) + , Qt.point(0.529771241667,0.290754653369) + , Qt.point(0.529772272222,0.290753333693) + , Qt.point(0.529773777778,0.290751320891) + , Qt.point(0.529774838889,0.290750028916) + , Qt.point(0.529776341667,0.290751237717) + , Qt.point(0.529778491667,0.290750655497) + , Qt.point(0.529785461111,0.290748992003) + , Qt.point(0.529785602778,0.290748631577) + , Qt.point(0.529786316667,0.290749380153) + , Qt.point(0.529787347222,0.290750306165) + , Qt.point(0.529788063889,0.290750760852) + , Qt.point(0.529788886111,0.290751320891) + , Qt.point(0.529789636111,0.290752091636) + , Qt.point(0.529790702778,0.290753278244) + , Qt.point(0.529800758333,0.290746291564) + , Qt.point(0.529803538889,0.290744400679) + , Qt.point(0.529805925,0.290742759308) + , Qt.point(0.529806025,0.290743452456) + , Qt.point(0.529806458333,0.290745038369) + , Qt.point(0.529806788889,0.290744955192) + , Qt.point(0.529807961111,0.290744672391) + , Qt.point(0.529808186111,0.290744533762) + , Qt.point(0.529808572222,0.290744356317) + , Qt.point(0.52980885,0.290744184418) + , Qt.point(0.529809427778,0.290743097565) + , Qt.point(0.529810497222,0.290739470977) + , Qt.point(0.529818077778,0.29073235068) + , Qt.point(0.529824138889,0.290726178424) + , Qt.point(0.5298264,0.290724143143) + , Qt.point(0.529832038889,0.290719146347) + , Qt.point(0.529835269444,0.290716118257) + , Qt.point(0.529836161111,0.290716012883) + , Qt.point(0.529836369444,0.290716329005) + , Qt.point(0.529836841667,0.290716767137) + , Qt.point(0.529837069444,0.290717238545) + , Qt.point(0.529838080556,0.290719601111) + , Qt.point(0.529838875,0.290720416356) + , Qt.point(0.5298396,0.290720915484) + , Qt.point(0.529844438889,0.290722756698) + , Qt.point(0.529843305556,0.290725379842) + , Qt.point(0.529842866667,0.290726256064) + , Qt.point(0.529843344444,0.290726538894) + , Qt.point(0.529851719444,0.290731208302) + , Qt.point(0.529851966667,0.290729649997) + , Qt.point(0.529852247222,0.290727553752) + , Qt.point(0.529852438889,0.290726416889) + , Qt.point(0.529852577778,0.290725751405) + , Qt.point(0.529861313889,0.290728169319) + , Qt.point(0.529861430556,0.290728635151) + , Qt.point(0.529861644444,0.290729461447) + , Qt.point(0.529861627778,0.290732467136) + , Qt.point(0.529861380556,0.290736814762) + , Qt.point(0.529861219444,0.290741428456) + , Qt.point(0.529861175,0.290743069839) + , Qt.point(0.529860936111,0.290746729625) + , Qt.point(0.529860936111,0.290747433849) + , Qt.point(0.529860675,0.290752973275) + , Qt.point(0.529860619444,0.290755917587) + , Qt.point(0.529860425,0.290760503079) + , Qt.point(0.529860372222,0.290761706267) + , Qt.point(0.529860197222,0.290763685687) + , Qt.point(0.529860163889,0.290764667072) + , Qt.point(0.529860058333,0.290766119735) + , Qt.point(0.529860022222,0.290768548206) + , Qt.point(0.529859872222,0.290770339045) + , Qt.point(0.529859625,0.290771636421) + , Qt.point(0.529859175,0.290772878346) + , Qt.point(0.529858952778,0.29077372662) + , Qt.point(0.529858777778,0.290774619244) + , Qt.point(0.529858530556,0.290776110637) + , Qt.point(0.529858180556,0.290779098932) + , Qt.point(0.529858061111,0.290780778786) + , Qt.point(0.529858080556,0.290781438527) + , Qt.point(0.529858077778,0.290783966587) + , Qt.point(0.529858227778,0.290785419097) + , Qt.point(0.529858675,0.290789100217) + , Qt.point(0.529860111111,0.290796966699) + , Qt.point(0.529860361111,0.290798258344) + , Qt.point(0.529860755556,0.290802088879) + , Qt.point(0.529861052778,0.290806617787) + , Qt.point(0.529861202778,0.290808308476) + , Qt.point(0.529861525,0.290813652063) + , Qt.point(0.529862083333,0.29081564201) + , Qt.point(0.529862144444,0.290815819386) + , Qt.point(0.529863291667,0.290822088405) + , Qt.point(0.529863602778,0.29082399512) + , Qt.point(0.529863666667,0.290825874101) + , Qt.point(0.529863666667,0.290827414963) + , Qt.point(0.529863211111,0.290829022323) + , Qt.point(0.529863052778,0.290829726231) + , Qt.point(0.529862686111,0.290831017646) + , Qt.point(0.529862722222,0.290831455506) + , Qt.point(0.529863052778,0.290834149152) + , Qt.point(0.529863225,0.290834725565) + , Qt.point(0.529863436111,0.290835301976) + , Qt.point(0.529864047222,0.290836476962) + , Qt.point(0.529864272222,0.290836754081) + , Qt.point(0.529863919444,0.290837014572) + , Qt.point(0.529862727778,0.290837812669) + , Qt.point(0.529861983333,0.290838704982) + , Qt.point(0.529861138889,0.290839403311) + , Qt.point(0.529860294444,0.290840295616) + , Qt.point(0.5298595,0.290841043819) + , Qt.point(0.529858802778,0.290841786477) + , Qt.point(0.529858008333,0.290842784072) + , Qt.point(0.529856133333,0.290845200447) + , Qt.point(0.529855525,0.290845571768) + , Qt.point(0.529860888889,0.290846912951) + , Qt.point(0.529864897222,0.290847810762) + , Qt.point(0.529865491667,0.29084791606) + , Qt.point(0.529865822222,0.290848054611) + , Qt.point(0.529866136111,0.290848331712) + , Qt.point(0.529867725,0.290850343452) + , Qt.point(0.529869538889,0.290852482633) + , Qt.point(0.529869975,0.290852953693) + , Qt.point(0.529870863889,0.290853724012) + , Qt.point(0.529873483333,0.290856855131) + , Qt.point(0.529876847222,0.290861122235) + , Qt.point(0.529880566667,0.290865300575) + , Qt.point(0.529879013889,0.290867345378) + , Qt.point(0.529878452778,0.2908678164) + , Qt.point(0.529876672222,0.290869235) + , Qt.point(0.529873686111,0.290871490329) + , Qt.point(0.5298716,0.290872986478) + , Qt.point(0.529869913889,0.290874127976) + , Qt.point(0.529868361111,0.290875086608) + , Qt.point(0.529866436111,0.29087626134) + , Qt.point(0.529860869444,0.290879597096) + , Qt.point(0.529854933333,0.290883071315) + , Qt.point(0.529854725,0.290883087938) + , Qt.point(0.529854358333,0.290883071315) + , Qt.point(0.529853922222,0.290882877381) + , Qt.point(0.529853413889,0.290882722233) + , Qt.point(0.529852472222,0.290882495053) + , Qt.point(0.529852019444,0.290882495053) + , Qt.point(0.529851530556,0.290882616955) + , Qt.point(0.529850791667,0.290883071315) + , Qt.point(0.529850361111,0.29088333174) + , Qt.point(0.5298498,0.290883348363) + , Qt.point(0.5298468,0.290881165212) + , Qt.point(0.529845491667,0.290880134579) + , Qt.point(0.529844288889,0.290879137186) + , Qt.point(0.529842594444,0.290877962472) + , Qt.point(0.529840516667,0.290876604893) + , Qt.point(0.529839725,0.290876056317) + , Qt.point(0.529838563889,0.290875180808) + , Qt.point(0.529837622222,0.290874238801) + , Qt.point(0.529837272222,0.290872188533) + , Qt.point(0.529836733333,0.290869584106) + , Qt.point(0.529836227778,0.29086659174) + , Qt.point(0.529836,0.290865998803) + , Qt.point(0.529835902778,0.290865605357) + , Qt.point(0.529835852778,0.290865112164) + , Qt.point(0.529835752778,0.290864713175) + , Qt.point(0.529835319444,0.290863588243) + , Qt.point(0.529834919444,0.290862712675) + , Qt.point(0.529831413889,0.290858600776) + , Qt.point(0.529828216667,0.290855087302) + , Qt.point(0.529827358333,0.290854389033) + , Qt.point(0.529825427778,0.290851878566) + , Qt.point(0.529824988889,0.290851413046) + , Qt.point(0.529824652778,0.290851014027) + , Qt.point(0.529824147222,0.290849877927) + , Qt.point(0.529822997222,0.290847788594) + , Qt.point(0.529821655556,0.290844812499) + , Qt.point(0.529821208333,0.290843964553) + , Qt.point(0.529820961111,0.290843565518) + , Qt.point(0.529820797222,0.290843354916) + , Qt.point(0.529820463889,0.290843122145) + , Qt.point(0.529819719444,0.29084252359) + , Qt.point(0.529816641667,0.29084042863) + , Qt.point(0.529815944444,0.290839885489) + , Qt.point(0.529814752778,0.290838987639) + , Qt.point(0.529813908333,0.290838494374) + , Qt.point(0.529813411111,0.290838095328) + , Qt.point(0.529813163889,0.290837646399) + , Qt.point(0.529812766667,0.290836848301) + , Qt.point(0.529812172222,0.290834958347) + , Qt.point(0.529811377778,0.290832270255) + , Qt.point(0.529811213889,0.290830635211) + , Qt.point(0.529811213889,0.290829970104) + , Qt.point(0.529811030556,0.290827947056) + , Qt.point(0.529810936111,0.290827154458) + , Qt.point(0.529810169444,0.290824566022) + , Qt.point(0.529809558333,0.290822343374) + , Qt.point(0.529808813889,0.290819328067) + , Qt.point(0.529808475,0.290817953426) + , Qt.point(0.529807952778,0.290815996762) + , Qt.point(0.529807883333,0.290814805015) + , Qt.point(0.529807855556,0.290813419254) + , Qt.point(0.529807805556,0.29081287049) + , Qt.point(0.529807447222,0.290812499103) + , Qt.point(0.529805569444,0.290809882744) + , Qt.point(0.529804477778,0.290808441514) + , Qt.point(0.529802802778,0.29080529294) + , Qt.point(0.5298013,0.290801479103) + , Qt.point(0.529801055556,0.29080060324) + , Qt.point(0.529800897222,0.290800237371) + , Qt.point(0.529800636111,0.290799766176) + , Qt.point(0.529800147222,0.290799206284) + , Qt.point(0.529798522222,0.290797277138) + , Qt.point(0.529797025,0.290795153945) + , Qt.point(0.529796147222,0.290793762492) + , Qt.point(0.5297933,0.290789283162) + , Qt.point(0.529791186111,0.290786222963) + , Qt.point(0.529788375,0.290782181426) + , Qt.point(0.529786455556,0.290779259711) + , Qt.point(0.529785808333,0.290778505712) + , Qt.point(0.529784777778,0.290777091956) + , Qt.point(0.529783938889,0.29077606074) + , Qt.point(0.529781877778,0.290774258868) + , Qt.point(0.529779575,0.290772335005) + , Qt.point(0.529777966667,0.290770987734) + , Qt.point(0.529772969444,0.290766846062) + , Qt.point(0.529767975,0.290762576771) + , Qt.point(0.529766525,0.290761368044) + , Qt.point(0.529765408333,0.290760370007) + ] + , 'Stovner_9' : [ + Qt.point(0.5302589,0.290652378131) + , Qt.point(0.530259166667,0.290651068816) + , Qt.point(0.530259572222,0.290649371132) + , Qt.point(0.530259672222,0.290649027155) + , Qt.point(0.530260075,0.290646985471) + , Qt.point(0.530260277778,0.290646092227) + , Qt.point(0.530260427778,0.290645243364) + , Qt.point(0.530260538889,0.290644866091) + , Qt.point(0.530260983333,0.290642707848) + , Qt.point(0.530261133333,0.290641858969) + , Qt.point(0.530261108333,0.290641609298) + , Qt.point(0.530261136111,0.290641259758) + , Qt.point(0.530261088889,0.290640765963) + , Qt.point(0.530261038889,0.290640466356) + , Qt.point(0.530261038889,0.290640216683) + , Qt.point(0.530260941667,0.290639717336) + , Qt.point(0.530260794444,0.290639118118) + , Qt.point(0.530260547222,0.290638424577) + , Qt.point(0.530259952778,0.290637326001) + , Qt.point(0.530259738889,0.290636865486) + , Qt.point(0.530259461111,0.290636427162) + , Qt.point(0.530263119444,0.290635073347) + , Qt.point(0.5302634,0.290634107915) + , Qt.point(0.530263627778,0.290633497582) + , Qt.point(0.530263911111,0.290632881698) + , Qt.point(0.530264141667,0.290632504399) + , Qt.point(0.530264577778,0.290631988386) + , Qt.point(0.530264927778,0.290631450177) + , Qt.point(0.530265611111,0.290630701121) + , Qt.point(0.530266225,0.290630157359) + , Qt.point(0.530266819444,0.29062975786) + , Qt.point(0.530267738889,0.290626040257) + , Qt.point(0.530268886111,0.290624747402) + , Qt.point(0.530266702778,0.290624536549) + , Qt.point(0.530269391667,0.290621612328) + , Qt.point(0.530272883333,0.290618033284) + , Qt.point(0.530272269444,0.290617445093) + , Qt.point(0.530269658333,0.290614936939) + , Qt.point(0.530270158333,0.290614443073) + , Qt.point(0.530271302778,0.290613150135) + , Qt.point(0.530271802778,0.290612700657) + , Qt.point(0.5302723,0.290612206785) + , Qt.point(0.53027285,0.290611557535) + , Qt.point(0.5302732,0.290611213487) + , Qt.point(0.530273597222,0.290610764004) + , Qt.point(0.530274244444,0.290610170241) + , Qt.point(0.530274744444,0.290609570927) + , Qt.point(0.530275291667,0.290609027103) + , Qt.point(0.530275891667,0.290608377842) + , Qt.point(0.530276488889,0.290607634241) + , Qt.point(0.530277438889,0.290606541031) + , Qt.point(0.530278036111,0.290605747479) + , Qt.point(0.530278586111,0.290605098206) + , Qt.point(0.530279133333,0.290604554369) + , Qt.point(0.530279483333,0.290604054925) + , Qt.point(0.530279633333,0.290603705314) + , Qt.point(0.530280130556,0.290603261362) + , Qt.point(0.530281508333,0.290601479995) + , Qt.point(0.530281777778,0.290600974993) + , Qt.point(0.530282227778,0.290600425595) + , Qt.point(0.530282627778,0.290599881744) + , Qt.point(0.530283225,0.290599182505) + , Qt.point(0.530283525,0.290598688596) + , Qt.point(0.530283975,0.290598039298) + , Qt.point(0.530284375,0.290597195763) + , Qt.point(0.530285222222,0.290595852758) + , Qt.point(0.530285522222,0.290595403237) + , Qt.point(0.530286022222,0.290594909319) + , Qt.point(0.530286619444,0.290594459796) + , Qt.point(0.530287266667,0.290594015822) + , Qt.point(0.530288611111,0.290593172268) + , Qt.point(0.530289408333,0.290592822636) + , Qt.point(0.530290105556,0.290592478553) + , Qt.point(0.5302911,0.290592084522) + , Qt.point(0.530291847222,0.290591634992) + , Qt.point(0.530292794444,0.290591191011) + , Qt.point(0.530293391667,0.290590791427) + , Qt.point(0.530294038889,0.29059044734) + , Qt.point(0.530294686111,0.290590047755) + , Qt.point(0.530295733333,0.290589354028) + , Qt.point(0.530296330556,0.290588860093) + , Qt.point(0.530297727778,0.290587017537) + , Qt.point(0.530298027778,0.290586667894) + , Qt.point(0.530298427778,0.29058627385) + , Qt.point(0.530298727778,0.290585874255) + , Qt.point(0.530299175,0.29058543026) + , Qt.point(0.530299675,0.290584830866) + , Qt.point(0.530300422222,0.290584137119) + , Qt.point(0.530301072222,0.29058329352) + , Qt.point(0.530302616667,0.290581700661) + , Qt.point(0.530303066667,0.290581201155) + , Qt.point(0.530303366667,0.290580857051) + , Qt.point(0.530303913889,0.290580263191) + , Qt.point(0.530304413889,0.290579513926) + , Qt.point(0.530305113889,0.290578670306) + , Qt.point(0.530306011111,0.290577327165) + , Qt.point(0.530306511111,0.290576527936) + , Qt.point(0.530307061111,0.290575734254) + , Qt.point(0.530307411111,0.290575140378) + , Qt.point(0.530307958333,0.29057434114) + , Qt.point(0.530308308333,0.290573797212) + , Qt.point(0.530310455556,0.29057081113) + , Qt.point(0.530311005556,0.290569917515) + , Qt.point(0.530311655556,0.290569023897) + , Qt.point(0.530312105556,0.290568274586) + , Qt.point(0.530312752778,0.290567480869) + , Qt.point(0.530313302778,0.290566687148) + , Qt.point(0.530313752778,0.290566087692) + , Qt.point(0.53031445,0.29056534392) + , Qt.point(0.5303148,0.29056504419) + , Qt.point(0.530315277778,0.290564594594) + , Qt.point(0.530315647222,0.290564156098) + , Qt.point(0.530316147222,0.290563756456) + , Qt.point(0.530317391667,0.290562912763) + , Qt.point(0.530317891667,0.290562513118) + , Qt.point(0.530318538889,0.290562168978) + , Qt.point(0.530318977778,0.290561874794) + , Qt.point(0.530319436111,0.290561519551) + , Qt.point(0.530319986111,0.29056117541) + , Qt.point(0.530320633333,0.290560631443) + , Qt.point(0.530320883333,0.290560331705) + , Qt.point(0.530321430556,0.290559782185) + , Qt.point(0.530322230556,0.290558688691) + , Qt.point(0.530322530556,0.290558094759) + , Qt.point(0.530322930556,0.290557495275) + , Qt.point(0.530323330556,0.290557001255) + , Qt.point(0.530323680556,0.290556301852) + , Qt.point(0.530324530556,0.290554808675) + , Qt.point(0.530325527778,0.290553520869) + , Qt.point(0.530325777778,0.290553071245) + , Qt.point(0.530326477778,0.290552277462) + , Qt.point(0.530327633333,0.290550584416) + , Qt.point(0.530327755556,0.290550373479) + , Qt.point(0.530327975,0.290550084826) + , Qt.point(0.530328275,0.290549590786) + , Qt.point(0.530330369444,0.290547209381) + , Qt.point(0.530331072222,0.290546509941) + , Qt.point(0.530331369444,0.29054616022) + , Qt.point(0.530331919444,0.290545616209) + , Qt.point(0.530332566667,0.290545016684) + , Qt.point(0.530333016667,0.290544572591) + , Qt.point(0.530333813889,0.290544028574) + , Qt.point(0.530335111111,0.290543084869) + , Qt.point(0.530336802778,0.290541941314) + , Qt.point(0.530337252778,0.290541547174) + , Qt.point(0.530338,0.290541097521) + , Qt.point(0.530338897222,0.290540603456) + , Qt.point(0.530339694444,0.290539959505) + , Qt.point(0.530340391667,0.290539459886) + , Qt.point(0.530341813889,0.290538327411) + , Qt.point(0.530342883333,0.2905376779) + , Qt.point(0.530343980556,0.290537233789) + , Qt.point(0.530344627778,0.29053688405) + , Qt.point(0.530345375,0.290536689751) + , Qt.point(0.530346119444,0.290536389974) + , Qt.point(0.530346666667,0.290536240086) + , Qt.point(0.530347761111,0.290535995823) + , Qt.point(0.530348161111,0.290535751559) + , Qt.point(0.530348808333,0.290535751559) + , Qt.point(0.530349755556,0.290535357406) + , Qt.point(0.530349905556,0.29053525748) + , Qt.point(0.530350402778,0.290535107591) + , Qt.point(0.53035105,0.290534713437) + , Qt.point(0.530352047222,0.290534219355) + , Qt.point(0.530352594444,0.290533969537) + , Qt.point(0.530353341667,0.290533475454) + , Qt.point(0.530353938889,0.290533125708) + , Qt.point(0.530354736111,0.290532781513) + , Qt.point(0.530355386111,0.290532137534) + , Qt.point(0.530355786111,0.290531687858) + , Qt.point(0.530356286111,0.290530943947) + , Qt.point(0.530356783333,0.290530244445) + , Qt.point(0.530357233333,0.290529550493) + , Qt.point(0.530357627778,0.290528617817) + , Qt.point(0.530358136111,0.290527307621) + , Qt.point(0.530358527778,0.290526286105) + , Qt.point(0.530358688889,0.290525308999) + , Qt.point(0.530358658333,0.290524026538) + , Qt.point(0.530358519444,0.290523365873) + , Qt.point(0.530358347222,0.290522732965) + , Qt.point(0.530358086111,0.290522188884) + , Qt.point(0.530358033333,0.29052202788) + , Qt.point(0.530356866667,0.290519779364) + , Qt.point(0.530356569444,0.290518979885) + , Qt.point(0.530356227778,0.290517936116) + , Qt.point(0.530356080556,0.290516537011) + , Qt.point(0.530356186111,0.290515093479) + , Qt.point(0.530356238889,0.290512167517) + , Qt.point(0.530357030556,0.29051266721) + , Qt.point(0.5303571,0.290512972578) + , Qt.point(0.530357213889,0.290513277944) + , Qt.point(0.53035715,0.29051366104) + , Qt.point(0.530357477778,0.290515326666) + , Qt.point(0.530357577778,0.290516542563) + , Qt.point(0.530357733333,0.290517070004) + , Qt.point(0.530357936111,0.290517214357) + , Qt.point(0.530357955556,0.290517386469) + , Qt.point(0.530358080556,0.290517514165) + , Qt.point(0.530358280556,0.290518208162) + , Qt.point(0.530358286111,0.290518563488) + , Qt.point(0.530358177778,0.290518668976) + , Qt.point(0.530358266667,0.290518968781) + , Qt.point(0.530358455556,0.290519013197) + , Qt.point(0.530358894444,0.290519873747) + , Qt.point(0.530359425,0.290520384523) + , Qt.point(0.530359483333,0.290520362315) + , Qt.point(0.530359769444,0.290520984128) + , Qt.point(0.530360758333,0.290523116041) + , Qt.point(0.530360933333,0.290523521324) + , Qt.point(0.530360966667,0.290523671222) + , Qt.point(0.530361480556,0.29052480934) + , Qt.point(0.530362169444,0.290526097346) + , Qt.point(0.530362308333,0.290526358278) + , Qt.point(0.530362136111,0.290526535933) + , Qt.point(0.530362130556,0.290526547036) + , Qt.point(0.530362625,0.290526708036) + , Qt.point(0.530362702778,0.290526730243) + , Qt.point(0.530364063889,0.290527107759) + , Qt.point(0.530364169444,0.29052849568) + , Qt.point(0.530364227778,0.29052926736) + , Qt.point(0.530364475,0.290529828074) + , Qt.point(0.530364502778,0.290529889142) + , Qt.point(0.530364511111,0.290529894694) + , Qt.point(0.530364575,0.290530033484) + , Qt.point(0.530364619444,0.290530449855) + , Qt.point(0.530364738889,0.290530549784) + , Qt.point(0.530365463889,0.290531110494) + , Qt.point(0.530366294444,0.290531898818) + , Qt.point(0.530367333333,0.290533925126) + , Qt.point(0.530367247222,0.290534435863) + , Qt.point(0.530367736111,0.290534768951) + , Qt.point(0.530368713889,0.290535440678) + , Qt.point(0.530369172222,0.290536156814) + , Qt.point(0.530369236111,0.290536573171) + , Qt.point(0.530369480556,0.290537211583) + , Qt.point(0.530369808333,0.290537711208) + , Qt.point(0.530369894444,0.290537938815) + , Qt.point(0.530370625,0.290539737452) + , Qt.point(0.530371483333,0.290543129279) + , Qt.point(0.530371655556,0.290543828731) + , Qt.point(0.530371794444,0.290544394953) + , Qt.point(0.5303722,0.290545149912) + , Qt.point(0.530374736111,0.290549357642) + , Qt.point(0.530375325,0.290551095107) + , Qt.point(0.530376730556,0.290554753166) + , Qt.point(0.530377786111,0.290556362911) + , Qt.point(0.530378352778,0.290557539682) + , Qt.point(0.530379033333,0.290559787736) + , Qt.point(0.530379391667,0.290560975585) + , Qt.point(0.530380702778,0.290564028435) + , Qt.point(0.5303815,0.290566082141) + , Qt.point(0.530381986111,0.290568707522) + , Qt.point(0.530382266667,0.290571882351) + , Qt.point(0.530383008333,0.290575784207) + , Qt.point(0.530383197222,0.290579824733) + , Qt.point(0.530383111111,0.290583032669) + , Qt.point(0.530383191667,0.29058782782) + , Qt.point(0.530383541667,0.290591096665) + , Qt.point(0.530382891667,0.290593238864) + , Qt.point(0.530382361111,0.290597567585) + , Qt.point(0.530380744444,0.290601563237) + , Qt.point(0.530380411111,0.290605059361) + , Qt.point(0.530380711111,0.290605830719) + , Qt.point(0.530381175,0.290606951679) + , Qt.point(0.530381847222,0.290607212496) + , Qt.point(0.530382097222,0.290609959372) + , Qt.point(0.530382791667,0.29061236771) + , Qt.point(0.530382858333,0.290614431975) + , Qt.point(0.530382383333,0.290615253235) + , Qt.point(0.530381880556,0.290616984528) + , Qt.point(0.530382861111,0.290618887822) + , Qt.point(0.530383786111,0.290620602434) + , Qt.point(0.530384372222,0.290621756598) + , Qt.point(0.530385280556,0.290623626549) + , Qt.point(0.53038615,0.290625907088) + , Qt.point(0.53038715,0.290628925567) + , Qt.point(0.53038835,0.290631028486) + , Qt.point(0.5303894,0.290633447645) + , Qt.point(0.530389461111,0.290633969203) + , Qt.point(0.530389691667,0.290635883418) + , Qt.point(0.530389808333,0.290636460453) + , Qt.point(0.530390336111,0.290637420324) + , Qt.point(0.530390533333,0.29063924573) + , Qt.point(0.530390297222,0.290640438614) + , Qt.point(0.530390408333,0.290641836776) + , Qt.point(0.530391608333,0.290644261341) + , Qt.point(0.530392141667,0.290645481934) + , Qt.point(0.530392627778,0.290646918894) + , Qt.point(0.53039295,0.290648128373) + , Qt.point(0.530392886111,0.290648710918) + , Qt.point(0.530392891667,0.290649615245) + , Qt.point(0.530392494444,0.290650330936) + , Qt.point(0.530391980556,0.290650536211) + , Qt.point(0.530391925,0.290650830254) + , Qt.point(0.530392388889,0.290650957857) + , Qt.point(0.530392347222,0.29065132957) + , Qt.point(0.530392127778,0.29065144053) + , Qt.point(0.530392213889,0.290651706831) + , Qt.point(0.530392491667,0.290651651352) + , Qt.point(0.530392766667,0.290652439158) + , Qt.point(0.530392597222,0.290652816416) + , Qt.point(0.530393102778,0.290653054976) + , Qt.point(0.530393244444,0.290653232509) + , Qt.point(0.530393113889,0.290653515451) + , Qt.point(0.530393461111,0.290653759558) + , Qt.point(0.530393680556,0.290654136814) + , Qt.point(0.530393916667,0.290654070239) + , Qt.point(0.530394252778,0.290654497425) + , Qt.point(0.530394497222,0.290654486329) + , Qt.point(0.530394516667,0.290654608382) + , Qt.point(0.530394661111,0.29065476927) + , Qt.point(0.530394883333,0.290654686052) + , Qt.point(0.530394941667,0.290654802557) + , Qt.point(0.53039475,0.290654968992) + , Qt.point(0.530395069444,0.29065546275) + , Qt.point(0.530395088889,0.290655773428) + , Qt.point(0.53039525,0.290655978697) + , Qt.point(0.530395186111,0.290656583408) + , Qt.point(0.530395447222,0.29065685525) + , Qt.point(0.530395227778,0.290656949562) + , Qt.point(0.530395297222,0.29065735455) + , Qt.point(0.530395077778,0.29065762639) + , Qt.point(0.530395113889,0.290657720702) + , Qt.point(0.530395122222,0.290657859396) + , Qt.point(0.530395205556,0.290658036924) + , Qt.point(0.530395247222,0.290658336503) + , Qt.point(0.530395325,0.290658525126) + , Qt.point(0.530395566667,0.290658691558) + , Qt.point(0.530395705556,0.290659207496) + , Qt.point(0.53039565,0.290659323998) + , Qt.point(0.530395936111,0.290659945341) + , Qt.point(0.530395994444,0.290660178344) + , Qt.point(0.530396183333,0.290660250464) + , Qt.point(0.530396352778,0.290660450181) + , Qt.point(0.530396505556,0.290660771946) + , Qt.point(0.530396475,0.290660949471) + , Qt.point(0.5303962,0.290661215759) + , Qt.point(0.530396169444,0.290661348902) + , Qt.point(0.530396169444,0.290661554165) + , Qt.point(0.530396372222,0.29066175388) + , Qt.point(0.530396725,0.290661703952) + , Qt.point(0.530397105556,0.290661764976) + , Qt.point(0.53039735,0.290661881476) + , Qt.point(0.530397541667,0.290662147762) + , Qt.point(0.5303978,0.290662608215) + , Qt.point(0.530397958333,0.290662813477) + , Qt.point(0.530397977778,0.290663024285) + , Qt.point(0.530398844444,0.290661875928) + , Qt.point(0.530399797222,0.290660749755) + , Qt.point(0.530400936111,0.290659401666) + , Qt.point(0.530401716667,0.290660034104) + , Qt.point(0.530402602778,0.290660755303) + , Qt.point(0.530403444444,0.290661437665) + , Qt.point(0.530403675,0.290661626285) + , Qt.point(0.530404697222,0.290662458429) + , Qt.point(0.530405252778,0.290662907786) + , Qt.point(0.530409497222,0.290668050343) + , Qt.point(0.530418766667,0.290679278038) + , Qt.point(0.530419030556,0.290679594223) + , Qt.point(0.530420525,0.290681408116) + , Qt.point(0.530419216667,0.290682550804) + , Qt.point(0.530417397222,0.290683793331) + , Qt.point(0.530416977778,0.290684630922) + , Qt.point(0.530415275,0.290685202257) + , Qt.point(0.530412852778,0.290687199142) + , Qt.point(0.530410805556,0.290687881406) + , Qt.point(0.530410538889,0.290687975702) + , Qt.point(0.530410105556,0.29068811992) + , Qt.point(0.530409908333,0.29068941233) + , Qt.point(0.530409791667,0.290690183334) + , Qt.point(0.530409697222,0.290690793479) + , Qt.point(0.530409294444,0.290691847361) + , Qt.point(0.530408475,0.290693156385) + , Qt.point(0.530408069444,0.290693544653) + , Qt.point(0.530407633333,0.290693810894) + , Qt.point(0.530407022222,0.290694082681) + , Qt.point(0.53040645,0.290694143694) + , Qt.point(0.53040575,0.290694199161) + , Qt.point(0.530404958333,0.290693905187) + , Qt.point(0.530404633333,0.290693655587) + , Qt.point(0.530404358333,0.290693455907) + , Qt.point(0.530403844444,0.290693050998) + , Qt.point(0.530403488889,0.290692535155) + , Qt.point(0.530403186111,0.29069200267) + , Qt.point(0.5304032,0.290691281594) + , Qt.point(0.530403338889,0.290690715825) + , Qt.point(0.530403447222,0.290690260989) + , Qt.point(0.530402772222,0.290689517719) + , Qt.point(0.530400958333,0.290690338644) + , Qt.point(0.530399138889,0.290691342608) + , Qt.point(0.530397313889,0.29069239094) + , Qt.point(0.530396561111,0.290693139745) + , Qt.point(0.530396125,0.2906936334) + , Qt.point(0.530395683333,0.290694604066) + , Qt.point(0.530395880556,0.290694781559) + , Qt.point(0.530395927778,0.290695042251) + , Qt.point(0.530395747222,0.290695269663) + , Qt.point(0.530395852778,0.290695868698) + , Qt.point(0.530396058333,0.290696234774) + , Qt.point(0.530396325,0.290696756153) + , Qt.point(0.5303964,0.290697055669) + , Qt.point(0.530396988889,0.290697826641) + , Qt.point(0.530397008333,0.290697926479) + , Qt.point(0.530397069444,0.290698225992) + , Qt.point(0.530397230556,0.290698464493) + , Qt.point(0.530397241667,0.290698730726) + , Qt.point(0.530397038889,0.290699451773) + , Qt.point(0.530396813889,0.290699812295) + , Qt.point(0.530396516667,0.290699934318) + , Qt.point(0.530396313889,0.290700067434) + , Qt.point(0.530395941667,0.290700045248) + , Qt.point(0.530395736111,0.290700156178) + , Qt.point(0.530395277778,0.29070016727) + , Qt.point(0.530395180556,0.290702391396) + , Qt.point(0.530395747222,0.290703184531) + , Qt.point(0.530396072222,0.290703650427) + , Qt.point(0.530396188889,0.290703789087) + , Qt.point(0.530396855556,0.290704188425) + , Qt.point(0.530398061111,0.29070490945) + , Qt.point(0.530397983333,0.290705369796) + , Qt.point(0.530397877778,0.29070534761) + , Qt.point(0.530397916667,0.290705475176) + , Qt.point(0.53039795,0.290705575009) + , Qt.point(0.530397911111,0.290705941066) + , Qt.point(0.530397894444,0.290705985437) + , Qt.point(0.530397925,0.290706418048) + , Qt.point(0.53039805,0.290706700908) + , Qt.point(0.530398472222,0.290707155703) + , Qt.point(0.530399113889,0.290707715876) + , Qt.point(0.530399330556,0.290708104113) + , Qt.point(0.530400066667,0.290708714198) + , Qt.point(0.530400675,0.290709213358) + , Qt.point(0.530401055556,0.290709535037) + , Qt.point(0.530401977778,0.290710122934) + , Qt.point(0.530402672222,0.290710622089) + , Qt.point(0.530403044444,0.290710971497) + , Qt.point(0.530403561111,0.290711670311) + , Qt.point(0.530405488889,0.290714814942) + , Qt.point(0.530405522222,0.290715092244) + , Qt.point(0.530403325,0.290715347361) + , Qt.point(0.530401777778,0.290716251361) + , Qt.point(0.530401094444,0.290716650672) + , Qt.point(0.530400463889,0.290717321735) + , Qt.point(0.530400436111,0.290717427108) + , Qt.point(0.53040025,0.290718131443) + , Qt.point(0.530400130556,0.290718841322) + , Qt.point(0.530400619444,0.290719939411) + , Qt.point(0.530400622222,0.290720122425) + , Qt.point(0.530400711111,0.29072050509) + , Qt.point(0.5304004,0.290720577186) + , Qt.point(0.530399886111,0.290720516182) + , Qt.point(0.530399802778,0.290720610461) + , Qt.point(0.530399652778,0.290720677012) + , Qt.point(0.530399516667,0.290721070767) + , Qt.point(0.530398236111,0.290721336968) + , Qt.point(0.530397466667,0.29072168081) + , Qt.point(0.530397269444,0.29072181391) + , Qt.point(0.53039715,0.290722030197) + , Qt.point(0.5303971,0.290722163297) + , Qt.point(0.530397211111,0.290722462771) + , Qt.point(0.530397502778,0.290722789973) + , Qt.point(0.530397791667,0.290723028442) + , Qt.point(0.530397808333,0.290723455468) + , Qt.point(0.530397794444,0.290723821489) + , Qt.point(0.530397697222,0.290724109868) + , Qt.point(0.530397422222,0.290724326153) + , Qt.point(0.530397180556,0.290724531345) + , Qt.point(0.530397083333,0.290724442613) + , Qt.point(0.530395911111,0.290725906685) + , Qt.point(0.530395688889,0.290726045328) + , Qt.point(0.530395511111,0.290726156242) + , Qt.point(0.530394169444,0.290726688628) + , Qt.point(0.530394144444,0.290726705265) + , Qt.point(0.530393694444,0.29072695482) + , Qt.point(0.530393138889,0.290727265378) + , Qt.point(0.530392722222,0.29072758148) + , Qt.point(0.530392308333,0.29072814159) + , Qt.point(0.530391163889,0.290729805274) + , Qt.point(0.530391113889,0.290729816365) + , Qt.point(0.530390647222,0.290729955005) + , Qt.point(0.530389938889,0.29073019901) + , Qt.point(0.530389588889,0.290730465197) + , Qt.point(0.530388980556,0.290731302576) + , Qt.point(0.530387947222,0.290731779492) + , Qt.point(0.530386694444,0.290732090041) + , Qt.point(0.530385627778,0.29073267232) + , Qt.point(0.530385011111,0.290733010595) + , Qt.point(0.530384747222,0.290733154778) + , Qt.point(0.530383658333,0.290733986599) + , Qt.point(0.530382972222,0.290734369235) + , Qt.point(0.530381680556,0.290735284232) + , Qt.point(0.530380336111,0.290736714945) + , Qt.point(0.530379658333,0.290737313845) + , Qt.point(0.530379158333,0.29073770202) + , Qt.point(0.530378530556,0.290738184464) + , Qt.point(0.530378513889,0.290738195555) + , Qt.point(0.530378294444,0.290738400732) + , Qt.point(0.530377511111,0.290739110533) + , Qt.point(0.530376127778,0.290740469128) + , Qt.point(0.530375922222,0.290740674302) + , Qt.point(0.530375416667,0.290741162285) + , Qt.point(0.530374361111,0.290742071702) + , Qt.point(0.530372811111,0.290743774076) + , Qt.point(0.530372147222,0.290744478311) + , Qt.point(0.530371841667,0.290744860925) + , Qt.point(0.530371516667,0.290745260174) + , Qt.point(0.530369177778,0.290748154704) + , Qt.point(0.530368788889,0.290748698117) + , Qt.point(0.530368063889,0.290749585318) + , Qt.point(0.530365802778,0.290752346702) + , Qt.point(0.530365577778,0.290752612857) + , Qt.point(0.530365341667,0.290752917826) + , Qt.point(0.530364027778,0.290751958558) + , Qt.point(0.530362580556,0.29075093829) + , Qt.point(0.530361883333,0.290750500239) + , Qt.point(0.530361238889,0.290750145361) + , Qt.point(0.530359808333,0.290749391243) + , Qt.point(0.530359188889,0.290749080723) + , Qt.point(0.530358591667,0.290748831197) + , Qt.point(0.530356511111,0.290748065984) + , Qt.point(0.530355866667,0.290747855272) + , Qt.point(0.530355166667,0.290747677831) + , Qt.point(0.530353405556,0.290746846072) + , Qt.point(0.530352686111,0.290746474552) + , Qt.point(0.530352191667,0.290746175117) + , Qt.point(0.530351844444,0.290745925588) + , Qt.point(0.530351447222,0.290745670513) + , Qt.point(0.530350602778,0.290745021734) + , Qt.point(0.530350258333,0.290744622484) + , Qt.point(0.530349761111,0.290743873889) + , Qt.point(0.530349433333,0.29074342473) + , Qt.point(0.530349169444,0.29074297557) + , Qt.point(0.530348872222,0.290742576316) + , Qt.point(0.530348791667,0.290742249149) + , Qt.point(0.530348477778,0.290741744534) + , Qt.point(0.530348269444,0.29074117892) + , Qt.point(0.530347991667,0.290740252862) + , Qt.point(0.530347875,0.290739310164) + , Qt.point(0.530347822222,0.290739043989) + , Qt.point(0.530347719444,0.290738134556) + , Qt.point(0.530347522222,0.290734807325) + , Qt.point(0.530346769444,0.290734685325) + , Qt.point(0.530345738889,0.290734469053) + , Qt.point(0.53034375,0.29073400878) + , Qt.point(0.530341986111,0.290733653871) + , Qt.point(0.530340402778,0.290733293415) + , Qt.point(0.530338963889,0.290732944049) + , Qt.point(0.530335686111,0.290732334044) + , Qt.point(0.530332705556,0.290731929221) + , Qt.point(0.530331352778,0.290731663036) + , Qt.point(0.530329188889,0.290731602035) + , Qt.point(0.530328716667,0.290731635308) + , Qt.point(0.530327688889,0.290731663036) + , Qt.point(0.530326941667,0.290731762856) + , Qt.point(0.530326147222,0.29073180722) + , Qt.point(0.530324258333,0.290732200952) + , Qt.point(0.530323213889,0.290732395045) + , Qt.point(0.530322686111,0.290732583592) + , Qt.point(0.530319733333,0.290733282324) + , Qt.point(0.530318561111,0.290733725962) + , Qt.point(0.530317544444,0.290734019871) + , Qt.point(0.530316163889,0.29073436369) + , Qt.point(0.530315008333,0.290734713053) + , Qt.point(0.530314311111,0.290734857234) + , Qt.point(0.530313513889,0.290735106778) + , Qt.point(0.530311897222,0.290735489412) + , Qt.point(0.530310727778,0.290735677956) + , Qt.point(0.530308630556,0.290735916409) + , Qt.point(0.530307530556,0.290735982954) + , Qt.point(0.530306708333,0.290736088316) + , Qt.point(0.530304402778,0.290736099407) + , Qt.point(0.530303441667,0.290736077225) + , Qt.point(0.530302236111,0.290736021771) + , Qt.point(0.530301388889,0.290736016226) + , Qt.point(0.530300247222,0.290735860955) + , Qt.point(0.530299252778,0.290735761137) + , Qt.point(0.530298308333,0.290735711229) + , Qt.point(0.530296683333,0.290735411776) + , Qt.point(0.530294325,0.290735123415) + , Qt.point(0.530293488889,0.290735051324) + , Qt.point(0.530292697222,0.290734945961) + , Qt.point(0.530290902778,0.290734835052) + , Qt.point(0.530290061111,0.290734840598) + , Qt.point(0.530289138889,0.29073474078) + , Qt.point(0.530286919444,0.290734774052) + , Qt.point(0.530286319444,0.290734818416) + , Qt.point(0.530285947222,0.290731940312) + , Qt.point(0.530285947222,0.290731690764) + , Qt.point(0.530285997222,0.29073139685) + , Qt.point(0.530286197222,0.290730997571) + , Qt.point(0.530286511111,0.290730675929) + , Qt.point(0.530287141667,0.290730448561) + , Qt.point(0.530287491667,0.290730454106) + , Qt.point(0.530288588889,0.290730609382) + , Qt.point(0.530289255556,0.290730526199) + , Qt.point(0.530289655556,0.29073038756) + , Qt.point(0.530290175,0.290730060371) + , Qt.point(0.530290425,0.290729810819) + , Qt.point(0.530290822222,0.290729317262) + , Qt.point(0.530291122222,0.290728568604) + , Qt.point(0.530291125,0.290728224775) + , Qt.point(0.530291175,0.2907278754) + , Qt.point(0.530291175,0.290727675756) + , Qt.point(0.530291077778,0.290727076825) + , Qt.point(0.530290930556,0.290726777359) + , Qt.point(0.530290830556,0.290726477892) + , Qt.point(0.530290533333,0.290726128513) + , Qt.point(0.530290186111,0.290725779134) + , Qt.point(0.530289047222,0.290724930639) + , Qt.point(0.530288105556,0.290724281787) + , Qt.point(0.530287361111,0.290723732756) + , Qt.point(0.530286113889,0.290722956347) + , Qt.point(0.530285066667,0.290722057926) + , Qt.point(0.530284527778,0.290721497797) + , Qt.point(0.530284355556,0.290721303693) + , Qt.point(0.530283838889,0.290720782383) + , Qt.point(0.530282947222,0.290719883952) + , Qt.point(0.530282105556,0.290718941149) + , Qt.point(0.530281561111,0.290718392102) + , Qt.point(0.530281163889,0.290717942881) + , Qt.point(0.530280619444,0.290717244091) + , Qt.point(0.530280272222,0.290716844781) + , Qt.point(0.530279997222,0.290716412194) + , Qt.point(0.530279788889,0.290716129349) + , Qt.point(0.530279627778,0.290715796588) + , Qt.point(0.530279283333,0.290714997961) + , Qt.point(0.530279077778,0.290714293614) + , Qt.point(0.530278177778,0.290710827297) + , Qt.point(0.530277608333,0.290708497896) + , Qt.point(0.530277419444,0.290707621589) + , Qt.point(0.530277072222,0.290706601075) + , Qt.point(0.530276722222,0.290705286601) + , Qt.point(0.530276588889,0.290704521206) + , Qt.point(0.530277111111,0.290704432465) + , Qt.point(0.530278222222,0.290703961024) + , Qt.point(0.530278686111,0.290703927746) + , Qt.point(0.53027935,0.290703949931) + , Qt.point(0.530279958333,0.290703999849) + , Qt.point(0.530281080556,0.290703955478) + , Qt.point(0.530281833333,0.290703988756) + , Qt.point(0.530282525,0.290703988756) + , Qt.point(0.530282911111,0.290703927746) + , Qt.point(0.530283280556,0.290703816818) + , Qt.point(0.530283755556,0.290703334284) + , Qt.point(0.530284263889,0.290702385849) + , Qt.point(0.530284858333,0.290702019786) + , Qt.point(0.530286908333,0.290700888312) + , Qt.point(0.530289011111,0.290700788475) + , Qt.point(0.530290333333,0.290700688639) + , Qt.point(0.530290255556,0.290700344758) + , Qt.point(0.530290088889,0.290699828935) + , Qt.point(0.530290072222,0.290699396308) + , Qt.point(0.530290127778,0.290698813924) + , Qt.point(0.530290322222,0.290697821094) + , Qt.point(0.530290513889,0.290697205426) + , Qt.point(0.530290744444,0.290696312426) + , Qt.point(0.530290502778,0.290695791045) + , Qt.point(0.530289841667,0.29069464844) + , Qt.point(0.530289861111,0.290694143694) + , Qt.point(0.530288416667,0.290691775254) + , Qt.point(0.530287927778,0.290691614399) + , Qt.point(0.530287302778,0.290690527235) + , Qt.point(0.530286708333,0.290689379049) + , Qt.point(0.530286063889,0.2906883307) + , Qt.point(0.530285461111,0.290687393282) + , Qt.point(0.530286438889,0.290686905157) + , Qt.point(0.530287472222,0.29068615078) + , Qt.point(0.530287891667,0.290685784684) + , Qt.point(0.530288138889,0.29068561273) + , Qt.point(0.530288908333,0.290684802877) + , Qt.point(0.530289705556,0.290683760049) + , Qt.point(0.530290997222,0.290681580075) + , Qt.point(0.5302917,0.290680736923) + , Qt.point(0.530292225,0.290680165574) + , Qt.point(0.530293013889,0.290679133813) + , Qt.point(0.530293208333,0.290678662308) + , Qt.point(0.530293333333,0.290677996651) + , Qt.point(0.53029375,0.290677846878) + , Qt.point(0.530294136111,0.29067786352) + , Qt.point(0.530294102778,0.290677508501) + , Qt.point(0.530294119444,0.290677192313) + , Qt.point(0.53029445,0.290676754086) + , Qt.point(0.530295097222,0.290676110611) + , Qt.point(0.530295694444,0.290675561436) + , Qt.point(0.530296413889,0.290675117658) + , Qt.point(0.530297552778,0.290674313307) + , Qt.point(0.530297919444,0.290674174626) + , Qt.point(0.530298430556,0.2906741247) + , Qt.point(0.530298380556,0.290673597709) + , Qt.point(0.530301516667,0.290672244167) + , Qt.point(0.530302711111,0.290671750455) + , Qt.point(0.530303705556,0.290671356594) + , Qt.point(0.530304602778,0.290671045942) + , Qt.point(0.530301969444,0.290669409463) + , Qt.point(0.530300583333,0.290668655014) + , Qt.point(0.530297902778,0.290667279246) + , Qt.point(0.530296227778,0.290666363911) + , Qt.point(0.530293961111,0.290665198932) + , Qt.point(0.5302926,0.290664444466) + , Qt.point(0.530291586111,0.290663917447) + , Qt.point(0.530290122222,0.290663162975) + , Qt.point(0.530287225,0.290661648475) + , Qt.point(0.530284397222,0.29066011732) + , Qt.point(0.530281969444,0.290658863538) + , Qt.point(0.530281047222,0.290658425267) + , Qt.point(0.530280383333,0.290658125688) + , Qt.point(0.530278513889,0.29065740448) + , Qt.point(0.530277519444,0.290657088257) + , Qt.point(0.530276766667,0.290656871893) + , Qt.point(0.530275247222,0.290656539025) + , Qt.point(0.530273258333,0.290656183966) + , Qt.point(0.530270741667,0.290656050819) + , Qt.point(0.530269780556,0.290656050819) + , Qt.point(0.530268958333,0.290656084106) + , Qt.point(0.530267386111,0.29065620061) + , Qt.point(0.530265163889,0.29065657786) + , Qt.point(0.530264605556,0.290656738746) + , Qt.point(0.530264097222,0.290656860797) + , Qt.point(0.530263891667,0.290655545967) + , Qt.point(0.530264958333,0.290654985636) + , Qt.point(0.530265833333,0.290654342085) + , Qt.point(0.530266377778,0.29065378175) + , Qt.point(0.530266622222,0.290653471068) + , Qt.point(0.530266833333,0.290653121551) + , Qt.point(0.530267044444,0.290652821964) + , Qt.point(0.530267483333,0.290651717927) + , Qt.point(0.530267080556,0.290651734571) + , Qt.point(0.530263113889,0.290651551489) + , Qt.point(0.530262397222,0.290651568132) + , Qt.point(0.530261944444,0.290651618064) + , Qt.point(0.530261680556,0.290651618064) + , Qt.point(0.5302603,0.290651856625) + , Qt.point(0.530259458333,0.290652156214) + , Qt.point(0.5302589,0.290652378131) + ] + , 'Ullern_9' : [ + Qt.point(0.529514794444,0.290824161402) + , Qt.point(0.529515338889,0.290822093948) + , Qt.point(0.529516575,0.29081908418) + , Qt.point(0.529518275,0.290817277188) + , Qt.point(0.529520519444,0.290815830472) + , Qt.point(0.529520741667,0.290814827187) + , Qt.point(0.529520491667,0.290813009067) + , Qt.point(0.529519369444,0.290810586726) + , Qt.point(0.529519047222,0.290810448147) + , Qt.point(0.529518325,0.290809588956) + , Qt.point(0.529518166667,0.290808812909) + , Qt.point(0.529516336111,0.290806678763) + , Qt.point(0.529516322222,0.290806667676) + , Qt.point(0.529515780556,0.290806019112) + , Qt.point(0.529515722222,0.290805952593) + , Qt.point(0.529515602778,0.290805814011) + , Qt.point(0.529515366667,0.290805542389) + , Qt.point(0.529515088889,0.290804261881) + , Qt.point(0.529518288889,0.290801617688) + , Qt.point(0.529519677778,0.290799949111) + , Qt.point(0.529520494444,0.29079803106) + , Qt.point(0.529520477778,0.290796539844) + , Qt.point(0.529520241667,0.290795697219) + , Qt.point(0.529519794444,0.290795048617) + , Qt.point(0.529519469444,0.290793978695) + , Qt.point(0.529517925,0.290791267829) + , Qt.point(0.529517972222,0.290790147992) + , Qt.point(0.529518641667,0.290789200005) + , Qt.point(0.529520777778,0.290787680999) + , Qt.point(0.529523136111,0.290786660929) + , Qt.point(0.529524252778,0.29078653342) + , Qt.point(0.529526883333,0.290784737195) + , Qt.point(0.5295278,0.290783439911) + , Qt.point(0.529530752778,0.290781272206) + , Qt.point(0.529533902778,0.290777685181) + , Qt.point(0.529535,0.290775777986) + , Qt.point(0.529536083333,0.290773998289) + , Qt.point(0.529536144444,0.290771625333) + , Qt.point(0.529537063889,0.290770111725) + , Qt.point(0.529537275,0.290769036114) + , Qt.point(0.529537388889,0.29076846504) + , Qt.point(0.529538766667,0.290766557749) + , Qt.point(0.529539158333,0.290765565285) + , Qt.point(0.529538958333,0.290762671029) + , Qt.point(0.529540255556,0.290760780312) + , Qt.point(0.529541502778,0.290758146583) + , Qt.point(0.52954255,0.290756034028) + , Qt.point(0.529542352778,0.290754980514) + , Qt.point(0.529541627778,0.290753405776) + , Qt.point(0.529540836111,0.290751692402) + , Qt.point(0.529539188889,0.290749064088) + , Qt.point(0.529537661111,0.290747306312) + , Qt.point(0.529536144444,0.29074407906) + , Qt.point(0.529533908333,0.290742703856) + , Qt.point(0.529533555556,0.290742243604) + , Qt.point(0.529533052778,0.290741583723) + , Qt.point(0.529532327778,0.290740530126) + , Qt.point(0.529532261111,0.290739543066) + , Qt.point(0.529532394444,0.290738766723) + , Qt.point(0.529532413889,0.290738639181) + , Qt.point(0.529532519444,0.290738029195) + , Qt.point(0.529532255556,0.290736842489) + , Qt.point(0.529532633333,0.290735345231) + , Qt.point(0.529532719444,0.29073493487) + , Qt.point(0.529533966667,0.290734962597) + , Qt.point(0.529535308333,0.29073526205) + , Qt.point(0.5295368,0.290735506049) + , Qt.point(0.529536608333,0.290736127134) + , Qt.point(0.529536538889,0.290736631764) + , Qt.point(0.529536713889,0.290737014395) + , Qt.point(0.529536958333,0.290737369298) + , Qt.point(0.529537291667,0.290737646566) + , Qt.point(0.529537694444,0.290737801836) + , Qt.point(0.529537944444,0.290737846199) + , Qt.point(0.529538344444,0.290737846199) + , Qt.point(0.529538688889,0.2907377852) + , Qt.point(0.529539091667,0.290737541204) + , Qt.point(0.529539511111,0.290736925669) + , Qt.point(0.529539563889,0.290736714945) + , Qt.point(0.529539788889,0.290736088316) + , Qt.point(0.52954695,0.290734591053) + , Qt.point(0.529549047222,0.290734324871) + , Qt.point(0.529550391667,0.29073474078) + , Qt.point(0.529551058333,0.290736016226) + , Qt.point(0.529552419444,0.290734951506) + , Qt.point(0.52955305,0.290735544866) + , Qt.point(0.52955415,0.29073545614) + , Qt.point(0.529555861111,0.290736398858) + , Qt.point(0.529555758333,0.290737064303) + , Qt.point(0.529556283333,0.290737885016) + , Qt.point(0.529558105556,0.290737801836) + , Qt.point(0.529557777778,0.290741999615) + , Qt.point(0.529557166667,0.290746141846) + , Qt.point(0.529556577778,0.290748698117) + , Qt.point(0.529558619444,0.290747189866) + , Qt.point(0.529559666667,0.290746785076) + , Qt.point(0.529561238889,0.29074667972) + , Qt.point(0.529561808333,0.290745925588) + , Qt.point(0.529562669444,0.290745138182) + , Qt.point(0.529562894444,0.290745138182) + , Qt.point(0.529563261111,0.290744999553) + , Qt.point(0.529563663889,0.29074406797) + , Qt.point(0.529563891667,0.290745886772) + , Qt.point(0.529565516667,0.290746707445) + , Qt.point(0.529566827778,0.290746779531) + , Qt.point(0.529567177778,0.290747006879) + , Qt.point(0.529568175,0.290746846072) + , Qt.point(0.52956805,0.290747195411) + , Qt.point(0.529570355556,0.290746391375) + , Qt.point(0.529571561111,0.290745598426) + , Qt.point(0.529573219444,0.290745825776) + , Qt.point(0.529572836111,0.290743973702) + , Qt.point(0.529573977778,0.290742726037) + , Qt.point(0.529577358333,0.290743319372) + , Qt.point(0.529577658333,0.290743618811) + , Qt.point(0.529578055556,0.290744267595) + , Qt.point(0.529578477778,0.290745415438) + , Qt.point(0.529578916667,0.290746308199) + , Qt.point(0.529579441667,0.290747306312) + , Qt.point(0.529579966667,0.290748443046) + , Qt.point(0.529580580556,0.290749596407) + , Qt.point(0.529581894444,0.290752257983) + , Qt.point(0.529583927778,0.290751076914) + , Qt.point(0.529583794444,0.290750483604) + , Qt.point(0.529584983333,0.290750150906) + , Qt.point(0.529586411111,0.290749635222) + , Qt.point(0.529587044444,0.290749241528) + , Qt.point(0.529587847222,0.290748664847) + , Qt.point(0.529588,0.290748736932) + , Qt.point(0.529588316667,0.290748748022) + , Qt.point(0.529588877778,0.290748731387) + , Qt.point(0.529589175,0.290748681482) + , Qt.point(0.529589383333,0.290748504041) + , Qt.point(0.529589733333,0.290748065984) + , Qt.point(0.529594294444,0.290751354161) + , Qt.point(0.529600408333,0.290752374426) + , Qt.point(0.529600236111,0.290752041732) + , Qt.point(0.529600075,0.290751509419) + , Qt.point(0.529599627778,0.290750516873) + , Qt.point(0.529599227778,0.290749518778) + , Qt.point(0.529598694444,0.290748687027) + , Qt.point(0.529598397222,0.290747971718) + , Qt.point(0.529597994444,0.290747622381) + , Qt.point(0.529613622222,0.290741672446) + , Qt.point(0.529615297222,0.290741056925) + , Qt.point(0.529616222222,0.290740690938) + , Qt.point(0.529619086111,0.2907396207) + , Qt.point(0.529619313889,0.290740108685) + , Qt.point(0.529620552778,0.290739565247) + , Qt.point(0.529621688889,0.2907389719) + , Qt.point(0.529622719444,0.290738495003) + , Qt.point(0.529623172222,0.290735750047) + , Qt.point(0.529623780556,0.290733559598) + , Qt.point(0.529627555556,0.290734607689) + , Qt.point(0.529628427778,0.290734097508) + , Qt.point(0.529629144444,0.29073388678) + , Qt.point(0.529629702778,0.290733781416) + , Qt.point(0.529630436111,0.290733781416) + , Qt.point(0.529632988889,0.290734236144) + , Qt.point(0.529634294444,0.290734258326) + , Qt.point(0.529635258333,0.29073418069) + , Qt.point(0.529636202778,0.290734003235) + , Qt.point(0.529636977778,0.290733753689) + , Qt.point(0.529638438889,0.290733038322) + , Qt.point(0.529639083333,0.290732517046) + , Qt.point(0.529639938889,0.290731463397) + , Qt.point(0.529640305556,0.290730675929) + , Qt.point(0.529641194444,0.290728435509) + , Qt.point(0.529641280556,0.290728102771) + , Qt.point(0.529641666667,0.290727104553) + , Qt.point(0.529642047222,0.290723571929) + , Qt.point(0.529642186111,0.290722107838) + , Qt.point(0.529644491667,0.290722396221) + , Qt.point(0.529646691667,0.290722673511) + , Qt.point(0.529647705556,0.290722745607) + , Qt.point(0.529649033333,0.290722917526) + , Qt.point(0.529649802778,0.290723039534) + , Qt.point(0.529650336111,0.290724137597) + , Qt.point(0.529650586111,0.290724836361) + , Qt.point(0.529650886111,0.290726527803) + , Qt.point(0.529651036111,0.290727526024) + , Qt.point(0.529651236111,0.290728568604) + , Qt.point(0.529651433333,0.290729367172) + , Qt.point(0.529651783333,0.290730210101) + , Qt.point(0.529652130556,0.290730908842) + , Qt.point(0.529652480556,0.290731457851) + , Qt.point(0.529652827778,0.290731901494) + , Qt.point(0.529653477778,0.290732578046) + , Qt.point(0.529653811111,0.290732822048) + , Qt.point(0.529654194444,0.290733171414) + , Qt.point(0.529654527778,0.290733365506) + , Qt.point(0.529654963889,0.290733676053) + , Qt.point(0.529655513889,0.290733942235) + , Qt.point(0.529656258333,0.290734291599) + , Qt.point(0.529656763889,0.290734446871) + , Qt.point(0.529657305556,0.290734568871) + , Qt.point(0.529658633333,0.290734707507) + , Qt.point(0.529659247222,0.290734829507) + , Qt.point(0.529661427778,0.290735134505) + , Qt.point(0.529662122222,0.290735284232) + , Qt.point(0.529663752778,0.29073573341) + , Qt.point(0.529665255556,0.290736470948) + , Qt.point(0.529665466667,0.290736676127) + , Qt.point(0.5296659,0.290736920124) + , Qt.point(0.529666061111,0.29073708094) + , Qt.point(0.529666672222,0.290737519023) + , Qt.point(0.529666794444,0.290737668748) + , Qt.point(0.529666944444,0.290737768564) + , Qt.point(0.5296676,0.290738389642) + , Qt.point(0.529668288889,0.290739310164) + , Qt.point(0.529668833333,0.290739953417) + , Qt.point(0.529668983333,0.290740252862) + , Qt.point(0.529669183333,0.290740502399) + , Qt.point(0.529669383333,0.290740702029) + , Qt.point(0.529671519444,0.290743485727) + , Qt.point(0.529671966667,0.290743929341) + , Qt.point(0.529672711111,0.290744528217) + , Qt.point(0.529673061111,0.290744727842) + , Qt.point(0.529673258333,0.290744877561) + , Qt.point(0.529674252778,0.290745426528) + , Qt.point(0.52967485,0.290745720419) + , Qt.point(0.529675655556,0.290746014309) + , Qt.point(0.529677136111,0.290746768441) + , Qt.point(0.529679133333,0.29074758911) + , Qt.point(0.529691844444,0.290753827186) + , Qt.point(0.529696777778,0.290756294633) + , Qt.point(0.529698719444,0.290757198431) + , Qt.point(0.5296998,0.290757797265) + , Qt.point(0.529701355556,0.290758512535) + , Qt.point(0.529702730556,0.290759244437) + , Qt.point(0.529703922222,0.290759793361) + , Qt.point(0.529705413889,0.290760353373) + , Qt.point(0.529707211111,0.290760852392) + , Qt.point(0.529708116667,0.290761063089) + , Qt.point(0.529710183333,0.290761584285) + , Qt.point(0.529711027778,0.29076173399) + , Qt.point(0.529712083333,0.290762044488) + , Qt.point(0.529712763889,0.290762216371) + , Qt.point(0.529714266667,0.290762549048) + , Qt.point(0.529715052778,0.290762776376) + , Qt.point(0.529715747222,0.290763025882) + , Qt.point(0.529716816667,0.290763441726) + , Qt.point(0.529717252778,0.290763635786) + , Qt.point(0.5297179,0.290763840935) + , Qt.point(0.529718775,0.290764195786) + , Qt.point(0.529728572222,0.290768282074) + , Qt.point(0.529730441667,0.290769385411) + , Qt.point(0.529731055556,0.290769873317) + , Qt.point(0.529731455556,0.290770222613) + , Qt.point(0.529732086111,0.290770821404) + , Qt.point(0.529732494444,0.29077148118) + , Qt.point(0.529733238889,0.290772224119) + , Qt.point(0.529733972222,0.29077307794) + , Qt.point(0.529734461111,0.290773582469) + , Qt.point(0.529736469444,0.290775212476) + , Qt.point(0.529737238889,0.290775872237) + , Qt.point(0.529738008333,0.29077660407) + , Qt.point(0.529738986111,0.29077693672) + , Qt.point(0.529740155556,0.290777413517) + , Qt.point(0.529740680556,0.29077765746) + , Qt.point(0.529741483333,0.290777973476) + , Qt.point(0.529742619444,0.290778494624) + , Qt.point(0.529743161111,0.290778721932) + , Qt.point(0.529746275,0.290779963809) + , Qt.point(0.529746077778,0.290780473863) + , Qt.point(0.529746269444,0.29078251961) + , Qt.point(0.529746166667,0.290783251416) + , Qt.point(0.529746288889,0.290784654036) + , Qt.point(0.529746236111,0.290785175165) + , Qt.point(0.529745938889,0.290785701837) + , Qt.point(0.529745555556,0.290786123173) + , Qt.point(0.529745847222,0.290786344928) + , Qt.point(0.529745222222,0.290786228506) + , Qt.point(0.529744752778,0.290786245138) + , Qt.point(0.529744036111,0.290786489069) + , Qt.point(0.5297436,0.29078687714) + , Qt.point(0.529743216667,0.290787309561) + , Qt.point(0.529742638889,0.290787575666) + , Qt.point(0.529742586111,0.290787941559) + , Qt.point(0.529742377778,0.290788623449) + , Qt.point(0.529742133333,0.290789255443) + , Qt.point(0.529741869444,0.290789848628) + , Qt.point(0.529741730556,0.290790253323) + , Qt.point(0.529741452778,0.290791456316) + , Qt.point(0.529741361111,0.290791888726) + , Qt.point(0.529741330556,0.290792027319) + , Qt.point(0.529741241667,0.290792980835) + , Qt.point(0.529741313889,0.290793629445) + , Qt.point(0.529740475,0.290794638388) + , Qt.point(0.529739636111,0.290795863527) + , Qt.point(0.52973885,0.290796356906) + , Qt.point(0.529738433333,0.290796778218) + , Qt.point(0.529738275,0.290797193985) + , Qt.point(0.529738991667,0.290798524433) + , Qt.point(0.529738669444,0.29079951672) + , Qt.point(0.529738269444,0.290800425849) + , Qt.point(0.529737538889,0.290801379321) + , Qt.point(0.529736680556,0.290803424835) + , Qt.point(0.529735625,0.290806129978) + , Qt.point(0.529734825,0.290807111137) + , Qt.point(0.529733491667,0.29080846923) + , Qt.point(0.529732252778,0.290809677647) + , Qt.point(0.529731305556,0.290810808452) + , Qt.point(0.529730758333,0.290811795129) + , Qt.point(0.529729702778,0.290813291764) + , Qt.point(0.529728244444,0.290814383745) + , Qt.point(0.529726497222,0.290815520064) + , Qt.point(0.529724536111,0.290816650833) + , Qt.point(0.529723977778,0.290816861466) + , Qt.point(0.529723105556,0.290817349246) + , Qt.point(0.529722547222,0.290818053199) + , Qt.point(0.529721813889,0.290818452289) + , Qt.point(0.529721027778,0.290818613033) + , Qt.point(0.529720425,0.290819433382) + , Qt.point(0.529719597222,0.290820447727) + , Qt.point(0.5297187,0.290821689322) + , Qt.point(0.529718152778,0.290822531829) + , Qt.point(0.529717905556,0.290823030679) + , Qt.point(0.529716961111,0.290823579413) + , Qt.point(0.529716663889,0.290823629298) + , Qt.point(0.529716413889,0.290823828837) + , Qt.point(0.529716216667,0.290823828837) + , Qt.point(0.529715869444,0.290823778952) + , Qt.point(0.529715719444,0.290823629298) + , Qt.point(0.529715397222,0.290823457472) + , Qt.point(0.529714725,0.290823280104) + , Qt.point(0.529713930556,0.290823280104) + , Qt.point(0.529713805556,0.290823429759) + , Qt.point(0.529713733333,0.290823679183) + , Qt.point(0.529714030556,0.2908242778) + , Qt.point(0.529714180556,0.290824527223) + , Qt.point(0.529714241667,0.290824815444) + , Qt.point(0.529714180556,0.290825269947) + , Qt.point(0.529714072222,0.290825818674) + , Qt.point(0.529713833333,0.290826068095) + , Qt.point(0.529713583333,0.290826262089) + , Qt.point(0.529713080556,0.29082661682) + , Qt.point(0.529712633333,0.290827110117) + , Qt.point(0.52971225,0.290827636668) + , Qt.point(0.529711925,0.290828035738) + , Qt.point(0.52971145,0.29082850686) + , Qt.point(0.529710680556,0.290829149802) + , Qt.point(0.529710241667,0.2908294879) + , Qt.point(0.529709711111,0.290829598752) + , Qt.point(0.529709016667,0.290829426932) + , Qt.point(0.529708755556,0.290829493443) + , Qt.point(0.529708619444,0.290829898051) + , Qt.point(0.529708641667,0.290830164094) + , Qt.point(0.529708425,0.290830646296) + , Qt.point(0.529708272222,0.290830945593) + , Qt.point(0.529708027778,0.290831283688) + , Qt.point(0.529707611111,0.290831582984) + , Qt.point(0.529707402778,0.29083232568) + , Qt.point(0.529707380556,0.290832636059) + , Qt.point(0.529707380556,0.290832985236) + , Qt.point(0.52970745,0.290833323326) + , Qt.point(0.529707575,0.290833478515) + , Qt.point(0.529707827778,0.290833678044) + , Qt.point(0.529708113889,0.290833833233) + , Qt.point(0.529708266667,0.290834126982) + , Qt.point(0.529708236111,0.290834575919) + , Qt.point(0.529708097222,0.290834853041) + , Qt.point(0.529707883333,0.290834991601) + , Qt.point(0.529707405556,0.290834930634) + , Qt.point(0.529706805556,0.290834792074) + , Qt.point(0.529706588889,0.290834758819) + , Qt.point(0.52970645,0.290834620259) + , Qt.point(0.529706402778,0.290834265543) + , Qt.point(0.529706141667,0.290833866487) + , Qt.point(0.529705833333,0.290833605992) + , Qt.point(0.529705233333,0.290833267902) + , Qt.point(0.529704633333,0.290833700214) + , Qt.point(0.529704072222,0.290834032761) + , Qt.point(0.529702255556,0.290834387477) + , Qt.point(0.529701766667,0.290834381934) + , Qt.point(0.529700572222,0.290834775447) + , Qt.point(0.529700047222,0.290834991601) + , Qt.point(0.529699369444,0.290835390655) + , Qt.point(0.529698508333,0.290836083454) + , Qt.point(0.529697944444,0.290836770708) + , Qt.point(0.5296972,0.290837369282) + , Qt.point(0.529696555556,0.290837762788) + , Qt.point(0.529695638889,0.290838167378) + , Qt.point(0.529694966667,0.290838261597) + , Qt.point(0.529693638889,0.290838405697) + , Qt.point(0.529694386111,0.290839259212) + , Qt.point(0.529693483333,0.290840223567) + , Qt.point(0.529692469444,0.290841675633) + , Qt.point(0.529690969444,0.29084398118) + , Qt.point(0.529689911111,0.290845555142) + , Qt.point(0.529689591667,0.290845416589) + , Qt.point(0.529689138889,0.290845261411) + , Qt.point(0.529688386111,0.290844928884) + , Qt.point(0.529686816667,0.290847711005) + , Qt.point(0.529686502778,0.290848220871) + , Qt.point(0.529686225,0.29084860327) + , Qt.point(0.529686016667,0.290850038644) + , Qt.point(0.529686297222,0.290852155661) + , Qt.point(0.529686313889,0.290852610097) + , Qt.point(0.529686908333,0.290853834849) + , Qt.point(0.529686908333,0.290854394575) + , Qt.point(0.52968635,0.290854516495) + , Qt.point(0.529684497222,0.290854638415) + , Qt.point(0.529682808333,0.290854638415) + , Qt.point(0.529681986111,0.290854555288) + , Qt.point(0.529681319444,0.290854438909) + , Qt.point(0.529680472222,0.290854239404) + , Qt.point(0.529679836111,0.290854117483) + , Qt.point(0.529679261111,0.290853906893) + , Qt.point(0.529678475,0.290853574382) + , Qt.point(0.529677691667,0.290853147659) + , Qt.point(0.529677094444,0.290852754186) + , Qt.point(0.529676869444,0.29085256022) + , Qt.point(0.529676205556,0.290852072533) + , Qt.point(0.529674633333,0.290850343452) + , Qt.point(0.529672127778,0.290847034876) + , Qt.point(0.529670783333,0.290845588395) + , Qt.point(0.529670211111,0.290845045268) + , Qt.point(0.529669811111,0.290844712741) + , Qt.point(0.529669591667,0.290844596357) + , Qt.point(0.529668472222,0.290843886963) + , Qt.point(0.529667,0.290843199736) + , Qt.point(0.529664458333,0.290842268649) + , Qt.point(0.529662788889,0.290841586957) + , Qt.point(0.529662388889,0.290842612265) + , Qt.point(0.529661377778,0.290844740452) + , Qt.point(0.529660697222,0.290845859957) + , Qt.point(0.529659877778,0.290846746689) + , Qt.point(0.529658916667,0.290847134633) + , Qt.point(0.529658133333,0.290847361857) + , Qt.point(0.529656369444,0.290847644501) + , Qt.point(0.529655191667,0.290848176535) + , Qt.point(0.529654275,0.29084879724) + , Qt.point(0.529652861111,0.290850044186) + , Qt.point(0.529653625,0.290850997401) + , Qt.point(0.529653786111,0.290851618097) + , Qt.point(0.529653413889,0.290853369333) + , Qt.point(0.529626213889,0.290867168052) + , Qt.point(0.529600383333,0.290882949413) + , Qt.point(0.529585925,0.290892939512) + , Qt.point(0.5295729,0.290900153323) + , Qt.point(0.529562572222,0.290895050495) + , Qt.point(0.529561316667,0.290891377037) + , Qt.point(0.529561186111,0.290890994727) + , Qt.point(0.529558469444,0.2908829882) + , Qt.point(0.529558461111,0.290882966036) + , Qt.point(0.529558277778,0.290882434102) + , Qt.point(0.52955805,0.290881780265) + , Qt.point(0.529557505556,0.290880228777) + , Qt.point(0.529557425,0.290880001593) + , Qt.point(0.529557333333,0.290879785492) + , Qt.point(0.529557280556,0.290879674671) + , Qt.point(0.529557236111,0.290879236926) + , Qt.point(0.529557177778,0.290879098398) + , Qt.point(0.529556680556,0.290877895979) + , Qt.point(0.529556636111,0.290877796238) + , Qt.point(0.529555936111,0.290876987232) + , Qt.point(0.529555661111,0.290876699092) + , Qt.point(0.529555688889,0.290876671386) + , Qt.point(0.529555113889,0.290876416493) + , Qt.point(0.529553525,0.290876017528) + , Qt.point(0.529552583333,0.290875923328) + , Qt.point(0.529552455556,0.290875906705) + , Qt.point(0.529551911111,0.290875845752) + , Qt.point(0.529551341667,0.290875823587) + , Qt.point(0.529550397222,0.290875640728) + , Qt.point(0.529550322222,0.290875624104) + , Qt.point(0.529548716667,0.290874621146) + , Qt.point(0.529547452778,0.290873828749) + , Qt.point(0.529547258333,0.290873706842) + , Qt.point(0.529547238889,0.29087369576) + , Qt.point(0.529546991667,0.290873540604) + , Qt.point(0.529545775,0.290872969854) + , Qt.point(0.529545477778,0.290872881194) + , Qt.point(0.529544725,0.290872642919) + , Qt.point(0.529544566667,0.290872543176) + , Qt.point(0.529544338889,0.290872476681) + , Qt.point(0.529544086111,0.290872460057) + , Qt.point(0.529543727778,0.290872526552) + , Qt.point(0.529543430556,0.290872665084) + , Qt.point(0.529543152778,0.290872914442) + , Qt.point(0.529542930556,0.290873235835) + , Qt.point(0.529542752778,0.290873640347) + , Qt.point(0.52954265,0.2908741446) + , Qt.point(0.529542625,0.290874604522) + , Qt.point(0.52954265,0.290874953619) + , Qt.point(0.5295428,0.290875385833) + , Qt.point(0.529542688889,0.290875834669) + , Qt.point(0.529542425,0.290876111728) + , Qt.point(0.529542380556,0.290876156058) + , Qt.point(0.529542244444,0.290876344458) + , Qt.point(0.529541833333,0.29087654394) + , Qt.point(0.529540813889,0.290876494069) + , Qt.point(0.529539797222,0.290876089564) + , Qt.point(0.529538702778,0.290875502198) + , Qt.point(0.529537075,0.290874349626) + , Qt.point(0.529536875,0.290874033775) + , Qt.point(0.529536222222,0.290873003102) + , Qt.point(0.529535508333,0.290870598175) + , Qt.point(0.529535488889,0.290870021874) + , Qt.point(0.529535441667,0.290868581115) + , Qt.point(0.5295355,0.290867273339) + , Qt.point(0.529535519444,0.290866857731) + , Qt.point(0.529535666667,0.290865322741) + , Qt.point(0.529536072222,0.290863915194) + , Qt.point(0.529536377778,0.290863089502) + , Qt.point(0.529537588889,0.290863095044) + , Qt.point(0.529538225,0.290862718217) + , Qt.point(0.529538636111,0.29086241343) + , Qt.point(0.529539072222,0.290861299567) + , Qt.point(0.529539569444,0.290859947406) + , Qt.point(0.529539580556,0.290859875364) + , Qt.point(0.529539677778,0.29085919928) + , Qt.point(0.529539638889,0.290858423442) + , Qt.point(0.529539522222,0.290857769519) + , Qt.point(0.529539236111,0.290857376056) + , Qt.point(0.529538658333,0.290856578043) + , Qt.point(0.529537569444,0.290855497396) + , Qt.point(0.529536988889,0.290855159346) + , Qt.point(0.529536872222,0.290855087302) + , Qt.point(0.529536366667,0.290854810212) + , Qt.point(0.529536166667,0.290854649499) + , Qt.point(0.529535863889,0.290854599622) + , Qt.point(0.529535208333,0.290854954299) + , Qt.point(0.529534988889,0.290855031884) + , Qt.point(0.529534588889,0.290855419811) + , Qt.point(0.529534472222,0.290855331142) + , Qt.point(0.529534538889,0.290855419811) + , Qt.point(0.529533877778,0.290855719068) + , Qt.point(0.529533102778,0.290855796653) + , Qt.point(0.529532213889,0.290856001699) + , Qt.point(0.529531194444,0.290856245537) + , Qt.point(0.5295305,0.290855502938) + , Qt.point(0.529528813889,0.290853712928) + , Qt.point(0.529528605556,0.290853108866) + , Qt.point(0.529527872222,0.290851008485) + , Qt.point(0.529527947222,0.290850421039) + , Qt.point(0.529528327778,0.290849805882) + , Qt.point(0.529527883333,0.290848071237) + , Qt.point(0.529527386111,0.290847539202) + , Qt.point(0.529526972222,0.290846286697) + , Qt.point(0.529526863889,0.290845915378) + , Qt.point(0.529526666667,0.290844912258) + , Qt.point(0.529526477778,0.29084465732) + , Qt.point(0.529526388889,0.290844352503) + , Qt.point(0.529526327778,0.290843870337) + , Qt.point(0.529526277778,0.29084303347) + , Qt.point(0.529526997222,0.290842545758) + , Qt.point(0.529526886111,0.290841947201) + , Qt.point(0.529526894444,0.290841598042) + , Qt.point(0.529526822222,0.290840932975) + , Qt.point(0.529526922222,0.290840367666) + , Qt.point(0.529526841667,0.29083986332) + , Qt.point(0.529526872222,0.290839309092) + , Qt.point(0.529527013889,0.290839004266) + , Qt.point(0.5295271,0.290838660644) + , Qt.point(0.529527013889,0.290838488832) + , Qt.point(0.529527269444,0.290837773873) + , Qt.point(0.529527302778,0.290837507841) + , Qt.point(0.529527147222,0.290836864928) + , Qt.point(0.529527280556,0.290836022487) + , Qt.point(0.529527080556,0.290835617893) + , Qt.point(0.529526972222,0.290834958347) + , Qt.point(0.529526955556,0.29083471448) + , Qt.point(0.529526547222,0.290834160237) + , Qt.point(0.529526430556,0.290833689129) + , Qt.point(0.529526180556,0.290833594907) + , Qt.point(0.529525825,0.290833229104) + , Qt.point(0.529525494444,0.290833079458) + , Qt.point(0.529525055556,0.290832564007) + , Qt.point(0.529524755556,0.290832419902) + , Qt.point(0.529524708333,0.290831987587) + , Qt.point(0.529524225,0.290831704919) + , Qt.point(0.529523663889,0.290831732632) + , Qt.point(0.529523663889,0.290831533101) + , Qt.point(0.529523391667,0.29083124489) + , Qt.point(0.529522769444,0.290831361283) + , Qt.point(0.529522352778,0.290831328028) + , Qt.point(0.5295218,0.290831095242) + , Qt.point(0.529521755556,0.290831156209) + , Qt.point(0.529521530556,0.290831106327) + , Qt.point(0.529521255556,0.29083087354) + , Qt.point(0.529520311111,0.290830657381) + , Qt.point(0.529519788889,0.290830596413) + , Qt.point(0.529516438889,0.290829931306) + , Qt.point(0.529516330556,0.290829837082) + , Qt.point(0.529516288889,0.290829559953) + , Qt.point(0.529515863889,0.290828711937) + , Qt.point(0.529515805556,0.290828540116) + , Qt.point(0.529515872222,0.290827996939) + , Qt.point(0.529516025,0.29082762004) + , Qt.point(0.529515933333,0.290826899496) + , Qt.point(0.529515752778,0.290826494882) + , Qt.point(0.529515366667,0.290826666704) + , Qt.point(0.529514794444,0.290824161402) + ] + , 'Vestre Aker_9' : [ + Qt.point(0.529497772222,0.290573497496) + , Qt.point(0.529502988889,0.290573647354) + , Qt.point(0.529506733333,0.290573669555) + , Qt.point(0.529509491667,0.2905735752) + , Qt.point(0.529515563889,0.290573747259) + , Qt.point(0.529518138889,0.290573930419) + , Qt.point(0.529521358333,0.290574108028) + , Qt.point(0.529522647222,0.290574291188) + , Qt.point(0.529524486111,0.290574657506) + , Qt.point(0.529526233333,0.290574929469) + , Qt.point(0.529527797222,0.290575023823) + , Qt.point(0.529530466667,0.290575018273) + , Qt.point(0.529532027778,0.29057474076) + , Qt.point(0.529533775,0.290574274537) + , Qt.point(0.5295358,0.290573536348) + , Qt.point(0.529537361111,0.290572798156) + , Qt.point(0.529538922222,0.290571782444) + , Qt.point(0.529540027778,0.290571227408) + , Qt.point(0.529541863889,0.290569384675) + , Qt.point(0.529544311111,0.290567819448) + , Qt.point(0.529543961111,0.290566642744) + , Qt.point(0.529543680556,0.290565804615) + , Qt.point(0.529543275,0.290564211604) + , Qt.point(0.529546075,0.290566082141) + , Qt.point(0.529551044444,0.290569245915) + , Qt.point(0.529551358333,0.290568141375) + , Qt.point(0.529551269444,0.290566898067) + , Qt.point(0.529550533333,0.290565582593) + , Qt.point(0.529549902778,0.290564955381) + , Qt.point(0.5295506,0.290564833268) + , Qt.point(0.529551097222,0.290564783313) + , Qt.point(0.529552352778,0.290564883224) + , Qt.point(0.529552561111,0.290564494684) + , Qt.point(0.529552927778,0.290563934075) + , Qt.point(0.529553347222,0.290563218047) + , Qt.point(0.529553580556,0.290562735143) + , Qt.point(0.529554113889,0.290561763781) + , Qt.point(0.529554525,0.29056109215) + , Qt.point(0.529555438889,0.290559271518) + , Qt.point(0.529555808333,0.290559798837) + , Qt.point(0.529555825,0.2905602873) + , Qt.point(0.529555983333,0.290561458494) + , Qt.point(0.529556177778,0.290562318845) + , Qt.point(0.529556880556,0.290564211604) + , Qt.point(0.529557963889,0.290567358758) + , Qt.point(0.529558630556,0.290566015535) + , Qt.point(0.529559433333,0.290564189402) + , Qt.point(0.529560252778,0.290562996022) + , Qt.point(0.529561372222,0.290561874794) + , Qt.point(0.529562488889,0.290561069947) + , Qt.point(0.529563763889,0.290560470473) + , Qt.point(0.529566980556,0.290559238214) + , Qt.point(0.529567169444,0.290555807829) + , Qt.point(0.529567163889,0.290552060975) + , Qt.point(0.529567244444,0.29055066213) + , Qt.point(0.529567541667,0.29054896907) + , Qt.point(0.529567455556,0.290547209381) + , Qt.point(0.529567472222,0.290546593208) + , Qt.point(0.529567402778,0.290546049198) + , Qt.point(0.529567227778,0.290545438572) + , Qt.point(0.529567102778,0.290544755779) + , Qt.point(0.529566927778,0.290544128496) + , Qt.point(0.529566805556,0.290543773219) + , Qt.point(0.529566733333,0.290542934986) + , Qt.point(0.529566838889,0.290542268838) + , Qt.point(0.529566872222,0.290541846943) + , Qt.point(0.529566925,0.290541691507) + , Qt.point(0.529567063889,0.290541286265) + , Qt.point(0.529567255556,0.290540847713) + , Qt.point(0.529567536111,0.290540098288) + , Qt.point(0.529567744444,0.290539781863) + , Qt.point(0.529567813889,0.290539554258) + , Qt.point(0.529567969444,0.29053931) + , Qt.point(0.529568052778,0.290539198973) + , Qt.point(0.529567883333,0.290539082395) + , Qt.point(0.529568041667,0.290538765968) + , Qt.point(0.529568005556,0.290538360719) + , Qt.point(0.529567744444,0.290538066496) + , Qt.point(0.529567444444,0.290537766722) + , Qt.point(0.529567216667,0.290537383676) + , Qt.point(0.529567269444,0.290536817433) + , Qt.point(0.529567497222,0.29053645104) + , Qt.point(0.529567705556,0.290536273394) + , Qt.point(0.529568091667,0.2905361013) + , Qt.point(0.52956795,0.290535818177) + , Qt.point(0.529567827778,0.290535435127) + , Qt.point(0.529567686111,0.290535118694) + , Qt.point(0.529567441667,0.290534402554) + , Qt.point(0.5295673,0.290533264496) + , Qt.point(0.529567283333,0.290532825926) + , Qt.point(0.529567297222,0.290531987642) + , Qt.point(0.529567472222,0.29053109384) + , Qt.point(0.529567611111,0.290530671919) + , Qt.point(0.529567802778,0.290530322168) + , Qt.point(0.529567627778,0.290529972416) + , Qt.point(0.529569580556,0.290522821794) + , Qt.point(0.529570383333,0.290522610824) + , Qt.point(0.529571416667,0.290522383199) + , Qt.point(0.529571991667,0.290522188884) + , Qt.point(0.529572708333,0.290521994569) + , Qt.point(0.529573513889,0.290520539976) + , Qt.point(0.529573513889,0.29052029014) + , Qt.point(0.529573675,0.290519113132) + , Qt.point(0.529574022222,0.290517169941) + , Qt.point(0.529574330556,0.290515981808) + , Qt.point(0.529574516667,0.290515026854) + , Qt.point(0.529575011111,0.290512833774) + , Qt.point(0.529575636111,0.290511057082) + , Qt.point(0.529575877778,0.290510090999) + , Qt.point(0.52957625,0.290509097149) + , Qt.point(0.529576341667,0.290508464192) + , Qt.point(0.529576330556,0.290508014458) + , Qt.point(0.529576261111,0.290507709082) + , Qt.point(0.529576177778,0.290507320421) + , Qt.point(0.529576066667,0.290506798504) + , Qt.point(0.529576555556,0.290505960102) + , Qt.point(0.529576766667,0.290505310477) + , Qt.point(0.529577936111,0.290504272182) + , Qt.point(0.529578477778,0.290504205554) + , Qt.point(0.529578844444,0.290503750257) + , Qt.point(0.529579369444,0.290503572579) + , Qt.point(0.529579386111,0.290503417112) + , Qt.point(0.529579525,0.290502872974) + , Qt.point(0.529580225,0.290500962926) + , Qt.point(0.529581061111,0.290499241645) + , Qt.point(0.529581097222,0.290499030648) + , Qt.point(0.529581586111,0.290498614206) + , Qt.point(0.529582177778,0.290497348217) + , Qt.point(0.529582422222,0.290496648588) + , Qt.point(0.529582405556,0.29049642093) + , Qt.point(0.529583013889,0.290494477499) + , Qt.point(0.529583261111,0.290494266497) + , Qt.point(0.529583652778,0.290493289219) + , Qt.point(0.529583730556,0.290493000478) + , Qt.point(0.529583641667,0.290492389676) + , Qt.point(0.529584130556,0.290491162513) + , Qt.point(0.529585422222,0.290487203332) + , Qt.point(0.5295875,0.290484604552) + , Qt.point(0.5295883,0.290482411108) + , Qt.point(0.529594186111,0.290484704505) + , Qt.point(0.529596647222,0.290485631851) + , Qt.point(0.529596458333,0.290487170014) + , Qt.point(0.529596177778,0.290488225064) + , Qt.point(0.529595602778,0.290489502222) + , Qt.point(0.529597108333,0.290490024188) + , Qt.point(0.529596794444,0.290490712737) + , Qt.point(0.529595822222,0.290497192744) + , Qt.point(0.529595441667,0.29050026331) + , Qt.point(0.529596291667,0.290500452096) + , Qt.point(0.529596938889,0.290500651986) + , Qt.point(0.529597636111,0.290500901849) + , Qt.point(0.529598133333,0.290501046213) + , Qt.point(0.529598833333,0.290501223893) + , Qt.point(0.529599227778,0.290501296075) + , Qt.point(0.529600372222,0.290501445992) + , Qt.point(0.529601466667,0.290501246103) + , Qt.point(0.529602063889,0.290500946268) + , Qt.point(0.529602758333,0.290500646434) + , Qt.point(0.529604252778,0.290499619218) + , Qt.point(0.529605044444,0.290499197224) + , Qt.point(0.529606238889,0.29049894736) + , Qt.point(0.529607313889,0.290499002885) + , Qt.point(0.529608013889,0.290499213882) + , Qt.point(0.529608888889,0.290499685848) + , Qt.point(0.5296098,0.290500507621) + , Qt.point(0.529610719444,0.29050148486) + , Qt.point(0.5296112,0.290501906847) + , Qt.point(0.529611763889,0.290502428778) + , Qt.point(0.529612213889,0.290502778582) + , Qt.point(0.529612661111,0.290503078414) + , Qt.point(0.529613211111,0.290503517055) + , Qt.point(0.529617516667,0.290506670801) + , Qt.point(0.529618691667,0.290507348183) + , Qt.point(0.529622266667,0.290509097149) + , Qt.point(0.529621980556,0.290509835597) + , Qt.point(0.529623113889,0.290510440788) + , Qt.point(0.529625744444,0.290513649936) + , Qt.point(0.529627266667,0.290515137896) + , Qt.point(0.529627897222,0.290516031776) + , Qt.point(0.529628372222,0.290517258773) + , Qt.point(0.529628566667,0.290519412937) + , Qt.point(0.529628947222,0.290521600387) + , Qt.point(0.529629497222,0.290524137574) + , Qt.point(0.529629780556,0.290525542172) + , Qt.point(0.529631527778,0.290524243058) + , Qt.point(0.529632611111,0.290524803788) + , Qt.point(0.529633433333,0.290526258347) + , Qt.point(0.529633822222,0.290527624067) + , Qt.point(0.529634941667,0.290529061949) + , Qt.point(0.529635397222,0.290530072345) + , Qt.point(0.529636938889,0.290532331839) + , Qt.point(0.529638338889,0.290534119428) + , Qt.point(0.529641525,0.290538727109) + , Qt.point(0.529643783333,0.290542107852) + , Qt.point(0.52964415,0.290543051562) + , Qt.point(0.529645530556,0.29054635451) + , Qt.point(0.529646025,0.29054849723) + , Qt.point(0.529646277778,0.290549241071) + , Qt.point(0.529647338889,0.290551861141) + , Qt.point(0.529648213889,0.290553226671) + , Qt.point(0.529648994444,0.290554564437) + , Qt.point(0.529649511111,0.290555169481) + , Qt.point(0.529649719444,0.290555219439) + , Qt.point(0.529649219444,0.290556662656) + , Qt.point(0.529649022222,0.290557511928) + , Qt.point(0.529648883333,0.290558583226) + , Qt.point(0.529648866667,0.290559671171) + , Qt.point(0.529647625,0.290559599011) + , Qt.point(0.529646941667,0.290559865446) + , Qt.point(0.529646736111,0.290560253995) + , Qt.point(0.529646736111,0.290560648095) + , Qt.point(0.529646936111,0.290561247569) + , Qt.point(0.529647036111,0.29056184704) + , Qt.point(0.529647013889,0.290562318845) + , Qt.point(0.529646836111,0.290562890561) + , Qt.point(0.529646241667,0.29056388967) + , Qt.point(0.529645347222,0.290564938729) + , Qt.point(0.5296447,0.290565582593) + , Qt.point(0.529644252778,0.290565832367) + , Qt.point(0.529643905556,0.290565982232) + , Qt.point(0.529643358333,0.290566032187) + , Qt.point(0.529642769444,0.290565910075) + , Qt.point(0.529641719444,0.290565632548) + , Qt.point(0.529641441667,0.290566576138) + , Qt.point(0.529640883333,0.290569168208) + , Qt.point(0.529640711111,0.290570095129) + , Qt.point(0.529640047222,0.290571849048) + , Qt.point(0.529640066667,0.290573092323) + , Qt.point(0.529639719444,0.290575773106) + , Qt.point(0.529638830556,0.290578315096) + , Qt.point(0.529638794444,0.290579153168) + , Qt.point(0.529637622222,0.290578648105) + , Qt.point(0.529636172222,0.290578070889) + , Qt.point(0.529632969444,0.290576583439) + , Qt.point(0.529631011111,0.290575817508) + , Qt.point(0.529628019444,0.290574452146) + , Qt.point(0.529626527778,0.290575051574) + , Qt.point(0.529625922222,0.290574996072) + , Qt.point(0.529624872222,0.290574368891) + , Qt.point(0.529624363889,0.290572737103) + , Qt.point(0.529622788889,0.290572093264) + , Qt.point(0.529621180556,0.290571271811) + , Qt.point(0.529620569444,0.290571904552) + , Qt.point(0.529620341667,0.290572182069) + , Qt.point(0.529619591667,0.290573358738) + , Qt.point(0.529618947222,0.290575739805) + , Qt.point(0.529619261111,0.290576561238) + , Qt.point(0.529620152778,0.290576683342) + , Qt.point(0.52962075,0.290577682377) + , Qt.point(0.52962075,0.29057885346) + , Qt.point(0.529620791667,0.290579852483) + , Qt.point(0.529620741667,0.290580901451) + , Qt.point(0.529620808333,0.290584719866) + , Qt.point(0.529620563889,0.290587317231) + , Qt.point(0.529619936111,0.290587295032) + , Qt.point(0.529618730556,0.290587156285) + , Qt.point(0.529618572222,0.290588754646) + , Qt.point(0.529618433333,0.290589415076) + , Qt.point(0.529617947222,0.290592395307) + , Qt.point(0.529617686111,0.290593849331) + , Qt.point(0.529617355556,0.290595392138) + , Qt.point(0.529617147222,0.290596596407) + , Qt.point(0.529616744444,0.290597700775) + , Qt.point(0.529616380556,0.290598893929) + , Qt.point(0.529616291667,0.290599243549) + , Qt.point(0.529616013889,0.2906009084) + , Qt.point(0.529616311111,0.29060111928) + , Qt.point(0.529617569444,0.29060111373) + , Qt.point(0.529618341667,0.290602062687) + , Qt.point(0.529619372222,0.290602900651) + , Qt.point(0.529619547222,0.290603777456) + , Qt.point(0.529621733333,0.290603844049) + , Qt.point(0.529623597222,0.29060271197) + , Qt.point(0.529627288889,0.290600547683) + , Qt.point(0.5296279,0.290599948338) + , Qt.point(0.529628461111,0.29059888283) + , Qt.point(0.529628686111,0.290599054865) + , Qt.point(0.529626002778,0.290606235819) + , Qt.point(0.529624711111,0.290608444433) + , Qt.point(0.529624622222,0.290609043751) + , Qt.point(0.529624797222,0.290609565378) + , Qt.point(0.529625130556,0.290610003765) + , Qt.point(0.529625655556,0.29061024793) + , Qt.point(0.529626091667,0.290610231282) + , Qt.point(0.529626583333,0.290610142495) + , Qt.point(0.529627036111,0.2906097596) + , Qt.point(0.529627558333,0.290608533221) + , Qt.point(0.529627769444,0.290608161421) + , Qt.point(0.5296281,0.290607972747) + , Qt.point(0.52962845,0.29060786731) + , Qt.point(0.529628822222,0.290607839564) + , Qt.point(0.529629169444,0.290607889508) + , Qt.point(0.529629716667,0.290608189168) + , Qt.point(0.529630116667,0.290608438884) + , Qt.point(0.529630413889,0.29060898271) + , Qt.point(0.529630663889,0.290609532083) + , Qt.point(0.529630913889,0.290610331168) + , Qt.point(0.529630969444,0.290611313372) + , Qt.point(0.529630866667,0.290612573028) + , Qt.point(0.529630919444,0.29061343314) + , Qt.point(0.529631113889,0.290613954754) + , Qt.point(0.529631461111,0.290614565152) + , Qt.point(0.529632408333,0.290614559603) + , Qt.point(0.529632855556,0.290614609545) + , Qt.point(0.52963395,0.290614609545) + , Qt.point(0.529634297222,0.290614409778) + , Qt.point(0.529634644444,0.290614309895) + , Qt.point(0.52963515,0.290614076834) + , Qt.point(0.529635588889,0.290613671751) + , Qt.point(0.529635763889,0.290613549671) + , Qt.point(0.529636147222,0.290613144586) + , Qt.point(0.529636741667,0.290612217883) + , Qt.point(0.529638416667,0.290609465492) + , Qt.point(0.529639066667,0.290608128126) + , Qt.point(0.529646930556,0.290608671952) + , Qt.point(0.529660180556,0.290609681911) + , Qt.point(0.529661894444,0.290609837289) + , Qt.point(0.529662469444,0.290609870584) + , Qt.point(0.529664219444,0.290611496494) + , Qt.point(0.529664569444,0.290613355452) + , Qt.point(0.529665041667,0.290614071285) + , Qt.point(0.529665636111,0.290614437524) + , Qt.point(0.529666494444,0.290614509661) + , Qt.point(0.529667,0.290614315444) + , Qt.point(0.529671875,0.290611529789) + , Qt.point(0.529673291667,0.290611701813) + , Qt.point(0.529674427778,0.290612384357) + , Qt.point(0.529673886111,0.290614082383) + , Qt.point(0.52967405,0.290614554054) + , Qt.point(0.529674669444,0.290614332091) + , Qt.point(0.529675316667,0.290614232208) + , Qt.point(0.529676558333,0.290614232208) + , Qt.point(0.529677205556,0.290614276601) + , Qt.point(0.529677786111,0.290614393131) + , Qt.point(0.529678797222,0.290614726075) + , Qt.point(0.529679969444,0.29061521994) + , Qt.point(0.529681530556,0.290615619471) + , Qt.point(0.529682775,0.290615519589) + , Qt.point(0.529683522222,0.290615419706) + , Qt.point(0.529684116667,0.290615169999) + , Qt.point(0.529684763889,0.290614820409) + , Qt.point(0.529685211111,0.290614476367) + , Qt.point(0.529685708333,0.290614026892) + , Qt.point(0.529686155556,0.290613577416) + , Qt.point(0.529686602778,0.290612978113) + , Qt.point(0.529687780556,0.29061059198) + , Qt.point(0.529688602778,0.290609626419) + , Qt.point(0.529689738889,0.290608871725) + , Qt.point(0.529690736111,0.290608577615) + , Qt.point(0.529690402778,0.290607456664) + , Qt.point(0.529690366667,0.290606896186) + , Qt.point(0.529690522222,0.290606141481) + , Qt.point(0.529690191667,0.290605758577) + , Qt.point(0.529689825,0.290605214742) + , Qt.point(0.529689422222,0.290604110419) + , Qt.point(0.529694036111,0.290604021629) + , Qt.point(0.529696327778,0.290606085988) + , Qt.point(0.529696244444,0.290604704202) + , Qt.point(0.529696063889,0.290604054925) + , Qt.point(0.529695847222,0.290603061584) + , Qt.point(0.529695797222,0.290602367906) + , Qt.point(0.529695958333,0.290602023841) + , Qt.point(0.529696569444,0.290600359001) + , Qt.point(0.529697058333,0.290599188054) + , Qt.point(0.529696675,0.290598943875) + , Qt.point(0.529699627778,0.290595858307) + , Qt.point(0.529698122222,0.290595159053) + , Qt.point(0.529698975,0.290592051223) + , Qt.point(0.529699694444,0.290590025556) + , Qt.point(0.529699536111,0.290589220832) + , Qt.point(0.529699625,0.290588993289) + , Qt.point(0.529700113889,0.290588571501) + , Qt.point(0.529702752778,0.290590147651) + , Qt.point(0.529703697222,0.290588782395) + , Qt.point(0.529705638889,0.290589920109) + , Qt.point(0.529707247222,0.290593333209) + , Qt.point(0.529708019444,0.290595014762) + , Qt.point(0.52970905,0.290597062573) + , Qt.point(0.529709908333,0.290598954974) + , Qt.point(0.529710116667,0.290598866181) + , Qt.point(0.529710763889,0.290600508837) + , Qt.point(0.529711463889,0.290602401203) + , Qt.point(0.529712497222,0.290605098206) + , Qt.point(0.529714347222,0.290609826191) + , Qt.point(0.529717927778,0.290608333448) + , Qt.point(0.529717952778,0.290608721895) + , Qt.point(0.529719963889,0.290608350096) + , Qt.point(0.529720105556,0.290612484242) + , Qt.point(0.529717919444,0.290612767247) + , Qt.point(0.529718061111,0.290613621809) + , Qt.point(0.529718130556,0.290614215561) + , Qt.point(0.529718147222,0.290614692781) + , Qt.point(0.529718130556,0.290615425255) + , Qt.point(0.529718175,0.290615863628) + , Qt.point(0.529718533333,0.290617073312) + , Qt.point(0.529718691667,0.290617700346) + , Qt.point(0.529719230556,0.290615147803) + , Qt.point(0.529720066667,0.290615552883) + , Qt.point(0.529720577778,0.290615896923) + , Qt.point(0.529720805556,0.290616019001) + , Qt.point(0.529721558333,0.290616052295) + , Qt.point(0.529722205556,0.290616102236) + , Qt.point(0.529722802778,0.290616202119) + , Qt.point(0.52972315,0.290616202119) + , Qt.point(0.529723586111,0.290616246511) + , Qt.point(0.529723697222,0.29061669598) + , Qt.point(0.529723777778,0.29061686245) + , Qt.point(0.5297239,0.290617334114) + , Qt.point(0.529724047222,0.290617744738) + , Qt.point(0.529724197222,0.290618260791) + , Qt.point(0.529724652778,0.290618277438) + , Qt.point(0.529724941667,0.290618338477) + , Qt.point(0.529726533333,0.290618438358) + , Qt.point(0.529726780556,0.290618338477) + , Qt.point(0.529727177778,0.290617994441) + , Qt.point(0.529728094444,0.290617311918) + , Qt.point(0.529728719444,0.290616745921) + , Qt.point(0.529729127778,0.290616490667) + , Qt.point(0.529729416667,0.29061619657) + , Qt.point(0.529729563889,0.290615946864) + , Qt.point(0.529729813889,0.290615652765) + , Qt.point(0.529730016667,0.290615441902) + , Qt.point(0.529730280556,0.290615070116) + , Qt.point(0.529730541667,0.290614759369) + , Qt.point(0.529730733333,0.290614426425) + , Qt.point(0.529731105556,0.290613854871) + , Qt.point(0.529731433333,0.29061349418) + , Qt.point(0.529731752778,0.290612961466) + , Qt.point(0.529732952778,0.290611357765) + , Qt.point(0.529735180556,0.290608727445) + , Qt.point(0.529736291667,0.290607367876) + , Qt.point(0.529737319444,0.290606535482) + , Qt.point(0.529738197222,0.290605769676) + , Qt.point(0.529739280556,0.290605142601) + , Qt.point(0.529745588889,0.290602268016) + , Qt.point(0.529748911111,0.29060121917) + , Qt.point(0.529750438889,0.290601574336) + , Qt.point(0.529752705556,0.290602057138) + , Qt.point(0.529752425,0.290603422295) + , Qt.point(0.529751936111,0.290605336828) + , Qt.point(0.529751202778,0.290606962778) + , Qt.point(0.529750694444,0.290608377842) + , Qt.point(0.529750247222,0.290610170241) + , Qt.point(0.529750030556,0.290610886086) + , Qt.point(0.529751308333,0.290612406554) + , Qt.point(0.529750869444,0.290613105743) + , Qt.point(0.529750469444,0.290613422041) + , Qt.point(0.529750502778,0.290613965852) + , Qt.point(0.529751044444,0.290614487465) + , Qt.point(0.529751116667,0.290614859252) + , Qt.point(0.529751272222,0.290615192195) + , Qt.point(0.529751691667,0.290615453) + , Qt.point(0.529751744444,0.290615613922) + , Qt.point(0.529752138889,0.290616046746) + , Qt.point(0.529752602778,0.290616784764) + , Qt.point(0.529752636111,0.290617206487) + , Qt.point(0.529752794444,0.290617483936) + , Qt.point(0.5297529,0.290617922305) + , Qt.point(0.529753633333,0.290618205302) + , Qt.point(0.529754016667,0.290618416162) + , Qt.point(0.529754263889,0.290618588179) + , Qt.point(0.529754575,0.290618732452) + , Qt.point(0.529754675,0.290619131975) + , Qt.point(0.529754275,0.290619881078) + , Qt.point(0.529754077778,0.290620180719) + , Qt.point(0.529753719444,0.290620480359) + , Qt.point(0.529753772222,0.290620724509) + , Qt.point(0.529753755556,0.290620952013) + , Qt.point(0.529753686111,0.29062116287) + , Qt.point(0.529753730556,0.290621567937) + , Qt.point(0.5297536,0.290622228249) + , Qt.point(0.529753336111,0.29062231703) + , Qt.point(0.529753380556,0.290622566727) + , Qt.point(0.529753388889,0.290622999535) + , Qt.point(0.529753530556,0.290623465634) + , Qt.point(0.529753458333,0.290623820757) + , Qt.point(0.529753183333,0.290623915086) + , Qt.point(0.529752933333,0.290623926184) + , Qt.point(0.529752586111,0.290624087098) + , Qt.point(0.529752375,0.29062475295) + , Qt.point(0.529751988889,0.290624908315) + , Qt.point(0.529751691667,0.290625907088) + , Qt.point(0.529751430556,0.290626661712) + , Qt.point(0.529751205556,0.290627044572) + , Qt.point(0.529750838889,0.290627438529) + , Qt.point(0.529750655556,0.290627738157) + , Qt.point(0.529750419444,0.290628059979) + , Qt.point(0.52975045,0.290628598198) + , Qt.point(0.529750416667,0.290628920019) + , Qt.point(0.5297505,0.290629341714) + , Qt.point(0.529750647222,0.290629791152) + , Qt.point(0.529750802778,0.290630107422) + , Qt.point(0.529750947222,0.2906305846) + , Qt.point(0.529751222222,0.290631039583) + , Qt.point(0.529751147222,0.29063128372) + , Qt.point(0.529751275,0.290631544502) + , Qt.point(0.529751494444,0.290631882964) + , Qt.point(0.529751958333,0.290632437817) + , Qt.point(0.529751922222,0.290632720791) + , Qt.point(0.529752113889,0.290632909441) + , Qt.point(0.529752219444,0.290633297836) + , Qt.point(0.529752338889,0.290633974751) + , Qt.point(0.529752338889,0.290634374241) + , Qt.point(0.529752241667,0.290634818118) + , Qt.point(0.529752188889,0.290635217606) + , Qt.point(0.529752011111,0.290635800192) + , Qt.point(0.529752116667,0.290636183032) + , Qt.point(0.529752288889,0.290636515937) + , Qt.point(0.529752338889,0.290636959808) + , Qt.point(0.529752388889,0.29063715955) + , Qt.point(0.529752538889,0.290637509098) + , Qt.point(0.529752688889,0.290637758774) + , Qt.point(0.529752836111,0.29063780871) + , Qt.point(0.529753236111,0.290637658904) + , Qt.point(0.529753530556,0.290637692194) + , Qt.point(0.529753705556,0.290637936322) + , Qt.point(0.529753794444,0.290638163804) + , Qt.point(0.529753969444,0.290638496705) + , Qt.point(0.529754055556,0.290639107022) + , Qt.point(0.529754197222,0.290639406631) + , Qt.point(0.529754305556,0.290639978106) + , Qt.point(0.529754658333,0.290640283262) + , Qt.point(0.529755297222,0.290639667401) + , Qt.point(0.529756433333,0.290638652059) + , Qt.point(0.529757655556,0.29063767) + , Qt.point(0.529758775,0.29063684884) + , Qt.point(0.529759702778,0.290636094258) + , Qt.point(0.529760366667,0.290635517222) + , Qt.point(0.529761344444,0.290634557341) + , Qt.point(0.529762391667,0.290633314481) + , Qt.point(0.52976325,0.290633786103) + , Qt.point(0.529763616667,0.290634013591) + , Qt.point(0.529764036111,0.290634224433) + , Qt.point(0.529764525,0.290634535147) + , Qt.point(0.529765258333,0.290634923539) + , Qt.point(0.529765294444,0.290635289736) + , Qt.point(0.529765363889,0.290635589351) + , Qt.point(0.529765522222,0.290636011032) + , Qt.point(0.52976575,0.290636466001) + , Qt.point(0.529765994444,0.290636793357) + , Qt.point(0.529766238889,0.290637270518) + , Qt.point(0.529766161111,0.290637608968) + , Qt.point(0.529766111111,0.29063800845) + , Qt.point(0.529765888889,0.29063824703) + , Qt.point(0.529765713889,0.290638529995) + , Qt.point(0.529765313889,0.290639406631) + , Qt.point(0.529765033333,0.290639700691) + , Qt.point(0.529764736111,0.29063996701) + , Qt.point(0.529764316667,0.290640277714) + , Qt.point(0.529764230556,0.290640754866) + , Qt.point(0.529764438889,0.290641820132) + , Qt.point(0.5297643,0.290642258442) + , Qt.point(0.529764125,0.290642685655) + , Qt.point(0.529763897222,0.290642907584) + , Qt.point(0.529763444444,0.290644216956) + , Qt.point(0.5297632,0.290644549846) + , Qt.point(0.529762675,0.290644954861) + , Qt.point(0.529762691667,0.29064546529) + , Qt.point(0.529762605556,0.290645814822) + , Qt.point(0.529762633333,0.290645975717) + , Qt.point(0.529762486111,0.29064652498) + , Qt.point(0.529762430556,0.290646846769) + , Qt.point(0.529762255556,0.290647440414) + , Qt.point(0.529762238889,0.290647828778) + , Qt.point(0.529762397222,0.290648666533) + , Qt.point(0.529762536111,0.290649010511) + , Qt.point(0.529762586111,0.290649959221) + , Qt.point(0.529762536111,0.29065048628) + , Qt.point(0.529762486111,0.290650808062) + , Qt.point(0.529762238889,0.290651152036) + , Qt.point(0.529761908333,0.290651362858) + , Qt.point(0.529761591667,0.290651801146) + , Qt.point(0.529761591667,0.290652061899) + , Qt.point(0.529761627778,0.290652466898) + , Qt.point(0.529761611111,0.29065272765) + , Qt.point(0.529761741667,0.290653093811) + , Qt.point(0.529762025,0.290653188126) + , Qt.point(0.529762338889,0.290653393398) + , Qt.point(0.529762836111,0.290653543191) + , Qt.point(0.529763563889,0.290653365658) + , Qt.point(0.529764541667,0.290653820585) + , Qt.point(0.529764663889,0.290654081335) + , Qt.point(0.529764577778,0.290654430851) + , Qt.point(0.529764419444,0.29065525748) + , Qt.point(0.529764366667,0.290655901028) + , Qt.point(0.529764377778,0.290656433617) + , Qt.point(0.529764277778,0.290656733198) + , Qt.point(0.529764227778,0.290657321263) + , Qt.point(0.529764244444,0.290657637486) + , Qt.point(0.529764227778,0.290658225548) + , Qt.point(0.529764141667,0.290658774774) + , Qt.point(0.529763983333,0.290659457143) + , Qt.point(0.529763897222,0.290660017461) + , Qt.point(0.529763966667,0.290660333679) + , Qt.point(0.529764105556,0.290660788589) + , Qt.point(0.529763877778,0.290661049329) + , Qt.point(0.529763383333,0.290661310069) + , Qt.point(0.529762744444,0.290661853738) + , Qt.point(0.529762486111,0.290662264263) + , Qt.point(0.529762358333,0.290662624858) + , Qt.point(0.529762236111,0.290663168523) + , Qt.point(0.529761938889,0.290663484736) + , Qt.point(0.529761588889,0.290663762115) + , Qt.point(0.529761494444,0.290664200373) + , Qt.point(0.529761344444,0.290664450013) + , Qt.point(0.529761047222,0.290665060244) + , Qt.point(0.529760925,0.29066527105) + , Qt.point(0.52976075,0.29066583135) + , Qt.point(0.529760611111,0.290666369459) + , Qt.point(0.529760558333,0.290666807711) + , Qt.point(0.529760541667,0.290667179392) + , Qt.point(0.52976035,0.290667634284) + , Qt.point(0.529759719444,0.290668366548) + , Qt.point(0.529759563889,0.29066857735) + , Qt.point(0.529759633333,0.2906693318) + , Qt.point(0.529759544444,0.290669714571) + , Qt.point(0.529759358333,0.290670125078) + , Qt.point(0.529759422222,0.290670485658) + , Qt.point(0.529759108333,0.290671073678) + , Qt.point(0.529758861111,0.290671916875) + , Qt.point(0.529758711111,0.290672216431) + , Qt.point(0.529758063889,0.290672865466) + , Qt.point(0.529757916667,0.290673115095) + , Qt.point(0.529758063889,0.290673414649) + , Qt.point(0.529758313889,0.290673614351) + , Qt.point(0.529758611111,0.290673808506) + , Qt.point(0.529758811111,0.290674108058) + , Qt.point(0.529758961111,0.290674407611) + , Qt.point(0.529759208333,0.290674757087) + , Qt.point(0.529759061111,0.290674906863) + , Qt.point(0.529758563889,0.290675106564) + , Qt.point(0.529758413889,0.290675206414) + , Qt.point(0.529758063889,0.290675505964) + , Qt.point(0.529757569444,0.290675849892) + , Qt.point(0.529757116667,0.290676049591) + , Qt.point(0.529756855556,0.290676526651) + , Qt.point(0.529756838889,0.290676892765) + , Qt.point(0.529756297222,0.290677380917) + , Qt.point(0.529756177778,0.29067764718) + , Qt.point(0.529756227778,0.290678090953) + , Qt.point(0.529756177778,0.290678340574) + , Qt.point(0.529756177778,0.290679039512) + , Qt.point(0.529756077778,0.290679438904) + , Qt.point(0.529755980556,0.290679688524) + , Qt.point(0.529755780556,0.290680032444) + , Qt.point(0.529755680556,0.290680331986) + , Qt.point(0.529755680556,0.290680781299) + , Qt.point(0.529756122222,0.290681091934) + , Qt.point(0.529756330556,0.290681796409) + , Qt.point(0.529756277778,0.290682073761) + , Qt.point(0.529756402778,0.290682478693) + , Qt.point(0.529756211111,0.290683388401) + , Qt.point(0.529756227778,0.290683804425) + , Qt.point(0.529756386111,0.290684370215) + , Qt.point(0.529756366667,0.290684908269) + , Qt.point(0.529756280556,0.290685418587) + , Qt.point(0.529756647222,0.290685906716) + , Qt.point(0.529756944444,0.290686572344) + , Qt.point(0.529757013889,0.290688341794) + , Qt.point(0.529757294444,0.290688619135) + , Qt.point(0.529757502778,0.290688918664) + , Qt.point(0.529757747222,0.290689090615) + , Qt.point(0.529758011111,0.290689512173) + , Qt.point(0.529758133333,0.29068984498) + , Qt.point(0.529758219444,0.290690405206) + , Qt.point(0.529758166667,0.290690771292) + , Qt.point(0.529757661111,0.290691298234) + , Qt.point(0.529757175,0.290692435314) + , Qt.point(0.52975705,0.290693050998) + , Qt.point(0.529756891667,0.290693344973) + , Qt.point(0.5297567,0.290693838627) + , Qt.point(0.529756527778,0.290694626253) + , Qt.point(0.529756491667,0.290694953505) + , Qt.point(0.529756263889,0.29069560246) + , Qt.point(0.529755775,0.290696284693) + , Qt.point(0.529755441667,0.29069653429) + , Qt.point(0.529754866667,0.290697321904) + , Qt.point(0.529754294444,0.290697887653) + , Qt.point(0.529754883333,0.29069803741) + , Qt.point(0.529756211111,0.290698525505) + , Qt.point(0.529758169444,0.290699296471) + , Qt.point(0.529759305556,0.290699629261) + , Qt.point(0.529760861111,0.290700156178) + , Qt.point(0.529761822222,0.290700450141) + , Qt.point(0.529762152778,0.290700505605) + , Qt.point(0.529763080556,0.290700766289) + , Qt.point(0.5297639,0.290700904951) + , Qt.point(0.529765425,0.290700993694) + , Qt.point(0.529766419444,0.290700993694) + , Qt.point(0.529768011111,0.290700943776) + , Qt.point(0.52976965,0.290700644267) + , Qt.point(0.529770905556,0.290700322572) + , Qt.point(0.529769302778,0.290706024261) + , Qt.point(0.529767961111,0.290711148974) + , Qt.point(0.529766569444,0.290716329005) + , Qt.point(0.529765525,0.290720360897) + , Qt.point(0.529765127778,0.290721752906) + , Qt.point(0.529764730556,0.290722950801) + , Qt.point(0.529764033333,0.290723843672) + , Qt.point(0.529763202778,0.290724847453) + , Qt.point(0.529762958333,0.290725324385) + , Qt.point(0.529762791667,0.290726283793) + , Qt.point(0.529762697222,0.290728136045) + , Qt.point(0.529762119444,0.290728540876) + , Qt.point(0.529762269444,0.290728640697) + , Qt.point(0.529764722222,0.290729677725) + , Qt.point(0.529770155556,0.290732616865) + , Qt.point(0.529769141667,0.290735256505) + , Qt.point(0.529768602778,0.290736604037) + , Qt.point(0.529768233333,0.290737674293) + , Qt.point(0.529767536111,0.290738933083) + , Qt.point(0.529767763889,0.290739443251) + , Qt.point(0.529767955556,0.290739759332) + , Qt.point(0.5297682,0.290740247317) + , Qt.point(0.529768391667,0.290740790753) + , Qt.point(0.529768236111,0.29074140073) + , Qt.point(0.529768041667,0.290741788896) + , Qt.point(0.529767572222,0.290742853576) + , Qt.point(0.529767275,0.290743607721) + , Qt.point(0.529766819444,0.29074463912) + , Qt.point(0.529765427778,0.290747583565) + , Qt.point(0.529764930556,0.290748831197) + , Qt.point(0.529764272222,0.290750272895) + , Qt.point(0.529764008333,0.29075093829) + , Qt.point(0.52976345,0.290752585133) + , Qt.point(0.529763188889,0.290753860455) + , Qt.point(0.5297631,0.290754470389) + , Qt.point(0.529763083333,0.29075493061) + , Qt.point(0.529763094444,0.290755801146) + , Qt.point(0.529763047222,0.290756222551) + , Qt.point(0.529762794444,0.290756643955) + , Qt.point(0.529762447222,0.290757093081) + , Qt.point(0.529761844444,0.290758007965) + , Qt.point(0.529761405556,0.290758551348) + , Qt.point(0.529761144444,0.290758917299) + , Qt.point(0.529760661111,0.290759482859) + , Qt.point(0.529760133333,0.290760209212) + , Qt.point(0.529759022222,0.290761672999) + , Qt.point(0.529758325,0.29076251578) + , Qt.point(0.529757791667,0.290763203309) + , Qt.point(0.529757119444,0.290762937169) + , Qt.point(0.529756658333,0.290763918558) + , Qt.point(0.529755766667,0.290765426672) + , Qt.point(0.529755208333,0.290766230625) + , Qt.point(0.529754805556,0.290766929229) + , Qt.point(0.529754252778,0.290767744264) + , Qt.point(0.529753605556,0.290768537117) + , Qt.point(0.529752861111,0.29076953511) + , Qt.point(0.529751869444,0.290770826948) + , Qt.point(0.529752513889,0.290771675232) + , Qt.point(0.529752677778,0.29077189146) + , Qt.point(0.529751361111,0.290772906067) + , Qt.point(0.529749375,0.290774558257) + , Qt.point(0.529748152778,0.290775517408) + , Qt.point(0.529747230556,0.29077772399) + , Qt.point(0.529746275,0.290779963809) + , Qt.point(0.529743161111,0.290778721932) + , Qt.point(0.529742619444,0.290778494624) + , Qt.point(0.529741483333,0.290777973476) + , Qt.point(0.529740680556,0.29077765746) + , Qt.point(0.529740155556,0.290777413517) + , Qt.point(0.529738986111,0.29077693672) + , Qt.point(0.529738008333,0.29077660407) + , Qt.point(0.529737238889,0.290775872237) + , Qt.point(0.529736469444,0.290775212476) + , Qt.point(0.529734461111,0.290773582469) + , Qt.point(0.529733972222,0.29077307794) + , Qt.point(0.529733238889,0.290772224119) + , Qt.point(0.529732494444,0.29077148118) + , Qt.point(0.529732086111,0.290770821404) + , Qt.point(0.529731455556,0.290770222613) + , Qt.point(0.529731055556,0.290769873317) + , Qt.point(0.529730441667,0.290769385411) + , Qt.point(0.529728572222,0.290768282074) + , Qt.point(0.529718775,0.290764195786) + , Qt.point(0.5297179,0.290763840935) + , Qt.point(0.529717252778,0.290763635786) + , Qt.point(0.529716816667,0.290763441726) + , Qt.point(0.529715747222,0.290763025882) + , Qt.point(0.529715052778,0.290762776376) + , Qt.point(0.529714266667,0.290762549048) + , Qt.point(0.529712763889,0.290762216371) + , Qt.point(0.529712083333,0.290762044488) + , Qt.point(0.529711027778,0.29076173399) + , Qt.point(0.529710183333,0.290761584285) + , Qt.point(0.529708116667,0.290761063089) + , Qt.point(0.529707211111,0.290760852392) + , Qt.point(0.529705413889,0.290760353373) + , Qt.point(0.529703922222,0.290759793361) + , Qt.point(0.529702730556,0.290759244437) + , Qt.point(0.529701355556,0.290758512535) + , Qt.point(0.5296998,0.290757797265) + , Qt.point(0.529698719444,0.290757198431) + , Qt.point(0.529696777778,0.290756294633) + , Qt.point(0.529691844444,0.290753827186) + , Qt.point(0.529679133333,0.29074758911) + , Qt.point(0.529677136111,0.290746768441) + , Qt.point(0.529675655556,0.290746014309) + , Qt.point(0.52967485,0.290745720419) + , Qt.point(0.529674252778,0.290745426528) + , Qt.point(0.529673258333,0.290744877561) + , Qt.point(0.529673061111,0.290744727842) + , Qt.point(0.529672711111,0.290744528217) + , Qt.point(0.529671966667,0.290743929341) + , Qt.point(0.529671519444,0.290743485727) + , Qt.point(0.529669383333,0.290740702029) + , Qt.point(0.529669183333,0.290740502399) + , Qt.point(0.529668983333,0.290740252862) + , Qt.point(0.529668833333,0.290739953417) + , Qt.point(0.529668288889,0.290739310164) + , Qt.point(0.5296676,0.290738389642) + , Qt.point(0.529666944444,0.290737768564) + , Qt.point(0.529666794444,0.290737668748) + , Qt.point(0.529666672222,0.290737519023) + , Qt.point(0.529666061111,0.29073708094) + , Qt.point(0.5296659,0.290736920124) + , Qt.point(0.529665466667,0.290736676127) + , Qt.point(0.529665255556,0.290736470948) + , Qt.point(0.529663752778,0.29073573341) + , Qt.point(0.529662122222,0.290735284232) + , Qt.point(0.529661427778,0.290735134505) + , Qt.point(0.529659247222,0.290734829507) + , Qt.point(0.529658633333,0.290734707507) + , Qt.point(0.529657305556,0.290734568871) + , Qt.point(0.529656763889,0.290734446871) + , Qt.point(0.529656258333,0.290734291599) + , Qt.point(0.529655513889,0.290733942235) + , Qt.point(0.529654963889,0.290733676053) + , Qt.point(0.529654527778,0.290733365506) + , Qt.point(0.529654194444,0.290733171414) + , Qt.point(0.529653811111,0.290732822048) + , Qt.point(0.529653477778,0.290732578046) + , Qt.point(0.529652827778,0.290731901494) + , Qt.point(0.529652480556,0.290731457851) + , Qt.point(0.529652130556,0.290730908842) + , Qt.point(0.529651783333,0.290730210101) + , Qt.point(0.529651433333,0.290729367172) + , Qt.point(0.529651236111,0.290728568604) + , Qt.point(0.529651036111,0.290727526024) + , Qt.point(0.529650886111,0.290726527803) + , Qt.point(0.529650586111,0.290724836361) + , Qt.point(0.529650336111,0.290724137597) + , Qt.point(0.529649802778,0.290723039534) + , Qt.point(0.529649033333,0.290722917526) + , Qt.point(0.529647705556,0.290722745607) + , Qt.point(0.529646691667,0.290722673511) + , Qt.point(0.529644491667,0.290722396221) + , Qt.point(0.529642186111,0.290722107838) + , Qt.point(0.529642047222,0.290723571929) + , Qt.point(0.529641666667,0.290727104553) + , Qt.point(0.529641280556,0.290728102771) + , Qt.point(0.529641194444,0.290728435509) + , Qt.point(0.529640305556,0.290730675929) + , Qt.point(0.529639938889,0.290731463397) + , Qt.point(0.529639083333,0.290732517046) + , Qt.point(0.529638438889,0.290733038322) + , Qt.point(0.529636977778,0.290733753689) + , Qt.point(0.529636202778,0.290734003235) + , Qt.point(0.529635258333,0.29073418069) + , Qt.point(0.529634294444,0.290734258326) + , Qt.point(0.529632988889,0.290734236144) + , Qt.point(0.529630436111,0.290733781416) + , Qt.point(0.529629702778,0.290733781416) + , Qt.point(0.529629144444,0.29073388678) + , Qt.point(0.529628427778,0.290734097508) + , Qt.point(0.529627555556,0.290734607689) + , Qt.point(0.529623780556,0.290733559598) + , Qt.point(0.529623172222,0.290735750047) + , Qt.point(0.529622719444,0.290738495003) + , Qt.point(0.529621688889,0.2907389719) + , Qt.point(0.529620552778,0.290739565247) + , Qt.point(0.529619313889,0.290740108685) + , Qt.point(0.529619086111,0.2907396207) + , Qt.point(0.529616222222,0.290740690938) + , Qt.point(0.529615297222,0.290741056925) + , Qt.point(0.529613622222,0.290741672446) + , Qt.point(0.529597994444,0.290747622381) + , Qt.point(0.529598397222,0.290747971718) + , Qt.point(0.529598694444,0.290748687027) + , Qt.point(0.529599227778,0.290749518778) + , Qt.point(0.529599627778,0.290750516873) + , Qt.point(0.529600075,0.290751509419) + , Qt.point(0.529600236111,0.290752041732) + , Qt.point(0.529600408333,0.290752374426) + , Qt.point(0.529594294444,0.290751354161) + , Qt.point(0.529589733333,0.290748065984) + , Qt.point(0.529589383333,0.290748504041) + , Qt.point(0.529589175,0.290748681482) + , Qt.point(0.529588877778,0.290748731387) + , Qt.point(0.529588316667,0.290748748022) + , Qt.point(0.529588,0.290748736932) + , Qt.point(0.529587847222,0.290748664847) + , Qt.point(0.529587044444,0.290749241528) + , Qt.point(0.529586411111,0.290749635222) + , Qt.point(0.529584983333,0.290750150906) + , Qt.point(0.529583794444,0.290750483604) + , Qt.point(0.529583927778,0.290751076914) + , Qt.point(0.529581894444,0.290752257983) + , Qt.point(0.529580580556,0.290749596407) + , Qt.point(0.529579966667,0.290748443046) + , Qt.point(0.529579441667,0.290747306312) + , Qt.point(0.529578916667,0.290746308199) + , Qt.point(0.529578477778,0.290745415438) + , Qt.point(0.529578055556,0.290744267595) + , Qt.point(0.529577658333,0.290743618811) + , Qt.point(0.529577358333,0.290743319372) + , Qt.point(0.529573977778,0.290742726037) + , Qt.point(0.529572836111,0.290743973702) + , Qt.point(0.529573219444,0.290745825776) + , Qt.point(0.529571561111,0.290745598426) + , Qt.point(0.529570355556,0.290746391375) + , Qt.point(0.52956805,0.290747195411) + , Qt.point(0.529568175,0.290746846072) + , Qt.point(0.529567177778,0.290747006879) + , Qt.point(0.529566827778,0.290746779531) + , Qt.point(0.529565516667,0.290746707445) + , Qt.point(0.529563891667,0.290745886772) + , Qt.point(0.529563663889,0.29074406797) + , Qt.point(0.529563261111,0.290744999553) + , Qt.point(0.529562894444,0.290745138182) + , Qt.point(0.529562669444,0.290745138182) + , Qt.point(0.529561808333,0.290745925588) + , Qt.point(0.529561238889,0.29074667972) + , Qt.point(0.529559666667,0.290746785076) + , Qt.point(0.529558619444,0.290747189866) + , Qt.point(0.529556577778,0.290748698117) + , Qt.point(0.529557166667,0.290746141846) + , Qt.point(0.529557777778,0.290741999615) + , Qt.point(0.529558105556,0.290737801836) + , Qt.point(0.529556283333,0.290737885016) + , Qt.point(0.529555758333,0.290737064303) + , Qt.point(0.529555861111,0.290736398858) + , Qt.point(0.52955415,0.29073545614) + , Qt.point(0.52955305,0.290735544866) + , Qt.point(0.529552419444,0.290734951506) + , Qt.point(0.529551058333,0.290736016226) + , Qt.point(0.529550391667,0.29073474078) + , Qt.point(0.529549047222,0.290734324871) + , Qt.point(0.52954695,0.290734591053) + , Qt.point(0.529539788889,0.290736088316) + , Qt.point(0.529539563889,0.290736714945) + , Qt.point(0.529539511111,0.290736925669) + , Qt.point(0.529539091667,0.290737541204) + , Qt.point(0.529538688889,0.2907377852) + , Qt.point(0.529538344444,0.290737846199) + , Qt.point(0.529537944444,0.290737846199) + , Qt.point(0.529537694444,0.290737801836) + , Qt.point(0.529537291667,0.290737646566) + , Qt.point(0.529536958333,0.290737369298) + , Qt.point(0.529536713889,0.290737014395) + , Qt.point(0.529536538889,0.290736631764) + , Qt.point(0.529536608333,0.290736127134) + , Qt.point(0.5295368,0.290735506049) + , Qt.point(0.529535308333,0.29073526205) + , Qt.point(0.529533966667,0.290734962597) + , Qt.point(0.529532719444,0.29073493487) + , Qt.point(0.529532961111,0.290733371051) + , Qt.point(0.529533813889,0.2907324505) + , Qt.point(0.529534075,0.290731857129) + , Qt.point(0.529533877778,0.290731263757) + , Qt.point(0.529533480556,0.290730077007) + , Qt.point(0.529534466667,0.290729550177) + , Qt.point(0.529534727778,0.290728036223) + , Qt.point(0.529534855556,0.290725729222) + , Qt.point(0.529535436111,0.290723960133) + , Qt.point(0.529535627778,0.290723377827) + , Qt.point(0.529535888889,0.290721597622) + , Qt.point(0.529537069444,0.290720283255) + , Qt.point(0.529537263889,0.290719357092) + , Qt.point(0.529536541667,0.290718702674) + , Qt.point(0.529535816667,0.29071712208) + , Qt.point(0.529536275,0.290715741128) + , Qt.point(0.529537258333,0.290714554278) + , Qt.point(0.529538752778,0.2907123303) + , Qt.point(0.529539538889,0.290710616543) + , Qt.point(0.529540788889,0.290710217219) + , Qt.point(0.529541575,0.290708769661) + , Qt.point(0.529542033333,0.290706268298) + , Qt.point(0.529544,0.290702907211) + , Qt.point(0.529543933333,0.290701259924) + , Qt.point(0.529543733333,0.29069921882) + , Qt.point(0.529543322222,0.290698248178) + , Qt.point(0.529543516667,0.290694959051) + , Qt.point(0.529543377778,0.290691070817) + , Qt.point(0.529543375,0.290689162724) + , Qt.point(0.529542519444,0.290687315626) + , Qt.point(0.529542372222,0.290685956638) + , Qt.point(0.529542566667,0.290684370215) + , Qt.point(0.529541575,0.29068108084) + , Qt.point(0.529541375,0.290678839816) + , Qt.point(0.529540255556,0.290676670878) + , Qt.point(0.529539511111,0.290672538175) + , Qt.point(0.529539508333,0.29067003632) + , Qt.point(0.529539380556,0.290669692381) + , Qt.point(0.529539252778,0.290669348442) + , Qt.point(0.529539211111,0.290668971218) + , Qt.point(0.529539233333,0.290667922752) + , Qt.point(0.529538522222,0.290666840995) + , Qt.point(0.529536333333,0.290665509594) + , Qt.point(0.529536233333,0.290664416728) + , Qt.point(0.529538797222,0.290662763548) + , Qt.point(0.529539027778,0.29066215331) + , Qt.point(0.529539111111,0.290661509784) + , Qt.point(0.529538991667,0.290660405799) + , Qt.point(0.529538861111,0.290659229687) + , Qt.point(0.529538566667,0.290658231096) + , Qt.point(0.529537594444,0.290657587556) + , Qt.point(0.529535019444,0.290657249142) + , Qt.point(0.529534261111,0.290656960658) + , Qt.point(0.529533480556,0.290656622242) + , Qt.point(0.5295332,0.290654680504) + , Qt.point(0.529532802778,0.290653881612) + , Qt.point(0.529532347222,0.29065304388) + , Qt.point(0.529531255556,0.290651351762) + , Qt.point(0.529531166667,0.290649842713) + , Qt.point(0.529530983333,0.290648644341) + , Qt.point(0.529530361111,0.290647346096) + , Qt.point(0.529530208333,0.29064623093) + , Qt.point(0.5295301,0.290642463726) + , Qt.point(0.529532238889,0.290638923927) + , Qt.point(0.529532525,0.290638241481) + , Qt.point(0.529532644444,0.290637092969) + , Qt.point(0.529532477778,0.290636626905) + , Qt.point(0.529531988889,0.290635689223) + , Qt.point(0.529530694444,0.290633597455) + , Qt.point(0.529529747222,0.290632526593) + , Qt.point(0.529528627778,0.29063170541) + , Qt.point(0.529527655556,0.290629691277) + , Qt.point(0.529527202778,0.290627177741) + , Qt.point(0.529527027778,0.290625585262) + , Qt.point(0.529526752778,0.290624336793) + , Qt.point(0.529526202778,0.290622944047) + , Qt.point(0.529525308333,0.290622050686) + , Qt.point(0.529525033333,0.290621928612) + , Qt.point(0.529523863889,0.29062140702) + , Qt.point(0.529522569444,0.290619964312) + , Qt.point(0.529522558333,0.290619648024) + , Qt.point(0.529522519444,0.290618715805) + , Qt.point(0.529522269444,0.290617822423) + , Qt.point(0.529522275,0.290615924668) + , Qt.point(0.5295221,0.290614498563) + , Qt.point(0.529522058333,0.290614165619) + , Qt.point(0.529521791667,0.290613766085) + , Qt.point(0.529521052778,0.290612650715) + , Qt.point(0.529520069444,0.290612117999) + , Qt.point(0.529518986111,0.290612062507) + , Qt.point(0.529518405556,0.290612267825) + , Qt.point(0.529517930556,0.29061139661) + , Qt.point(0.529516636111,0.290609853937) + , Qt.point(0.529514794444,0.290608888373) + , Qt.point(0.529512058333,0.290607789621) + , Qt.point(0.529509919444,0.290606923933) + , Qt.point(0.529509147222,0.290605508857) + , Qt.point(0.529509541667,0.290603988333) + , Qt.point(0.529510683333,0.290602517741) + , Qt.point(0.5295116,0.290600325704) + , Qt.point(0.529512244444,0.290598033749) + , Qt.point(0.529512388889,0.290596585307) + , Qt.point(0.529512338889,0.290594942617) + , Qt.point(0.529511416667,0.290594448697) + , Qt.point(0.529510222222,0.290594198961) + , Qt.point(0.529509636111,0.290593560747) + , Qt.point(0.529505669444,0.290590769228) + , Qt.point(0.529501436111,0.290586540246) + , Qt.point(0.529497772222,0.290573497496) + ] + } + property var centroids: { + 'Alna_9' : Qt.point(0.530204752066,0.290792761669) + , 'Bjerke_9' : Qt.point(0.530069965683,0.290723899717) + , 'Frogner_9' : Qt.point(0.529740776778,0.290833967368) + , 'Gamle Oslo_9' : Qt.point(0.529938090799,0.290907612709) + , 'Grorud_9' : Qt.point(0.530246434362,0.29058573104) + , 'Grünerløkka_9' : Qt.point(0.529934059459,0.290822058013) + , 'Marka_9' : Qt.point(0.529870446884,0.290338138774) + , 'Nordre Aker_9' : Qt.point(0.529863998766,0.290637161772) + , 'Nordstrand_9' : Qt.point(0.529997569082,0.291151209069) + , 'Østensjø_9' : Qt.point(0.530102063863,0.291003236789) + , 'Sagene_9' : Qt.point(0.529897779167,0.290743071408) + , 'Sentrum_9' : Qt.point(0.529830543978,0.290877477294) + , 'Søndre Nordstrand_9' : Qt.point(0.530075364635,0.291320177881) + , 'St. Hanshaugen_9' : Qt.point(0.529832387012,0.290804043195) + , 'Stovner_9' : Qt.point(0.530340528709,0.290651094456) + , 'Ullern_9' : Qt.point(0.529617258254,0.290802159641) + , 'Vestre Aker_9' : Qt.point(0.52965746825,0.290641295686) + } + ListElement { + name: 'Alna' + adminLevel: 9 + } + ListElement { + name: 'Bjerke' + adminLevel: 9 + } + ListElement { + name: 'Frogner' + adminLevel: 9 + } + ListElement { + name: 'Gamle Oslo' + adminLevel: 9 + } + ListElement { + name: 'Grorud' + adminLevel: 9 + } + ListElement { + name: 'Grünerløkka' + adminLevel: 9 + } + ListElement { + name: 'Marka' + adminLevel: 9 + } + ListElement { + name: 'Nordre Aker' + adminLevel: 9 + } + ListElement { + name: 'Nordstrand' + adminLevel: 9 + } + ListElement { + name: 'Østensjø' + adminLevel: 9 + } + ListElement { + name: 'Sagene' + adminLevel: 9 + } + ListElement { + name: 'Sentrum' + adminLevel: 9 + } + ListElement { + name: 'Søndre Nordstrand' + adminLevel: 9 + } + ListElement { + name: 'St. Hanshaugen' + adminLevel: 9 + } + ListElement { + name: 'Stovner' + adminLevel: 9 + } + ListElement { + name: 'Ullern' + adminLevel: 9 + } + ListElement { + name: 'Vestre Aker' + adminLevel: 9 + } +} + diff --git a/examples/location/itemview_transitions/doc/images/itemview_transitions.jpg b/examples/location/itemview_transitions/doc/images/itemview_transitions.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f177e1424c76865640c936e28e1ac3ba3f349725 GIT binary patch literal 87618 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 +#include + +int main(int argc, char *argv[]) +{ + QGuiApplication app(argc, argv); + + QQmlApplicationEngine engine; + engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); + + return app.exec(); +} + diff --git a/examples/location/itemview_transitions/main.qml b/examples/location/itemview_transitions/main.qml new file mode 100644 index 0000000..d386a6d --- /dev/null +++ b/examples/location/itemview_transitions/main.qml @@ -0,0 +1,209 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.0 +import QtQuick.Window 2.0 +import QtLocation 5.12 +import QtPositioning 5.12 +import QtQuick.Shapes 1.1 + +Window { + width: 512 + height: 512 + visible: true + + Plugin { + id: mapPlugin + name: "osm" + } + + Map { + id: map + visible: true + anchors.fill: parent + plugin: mapPlugin + center: QtPositioning.coordinate(59.91, 10.75) // Oslo + zoomLevel: 9.5 + + onMapReadyChanged: miv.model = osloListModel + + Text { + anchors.top: parent.top + anchors.topMargin: 20 + anchors.horizontalCenter: parent.horizontalCenter + text: "Long press to drop a marker" + color: "grey" + font.pixelSize: 24 + opacity: 0.8 + z: parent.z + 10 + } + + MouseArea { + anchors.fill: parent + onPressAndHold: { + var crd = map.toCoordinate(Qt.point(mouseX, mouseY)) + console.log(crd) + markerModel.clear() + markerModel.append({ "latitude": crd.latitude, "longitude": crd.longitude}) + } + } + + //! [MarkerView] + MapItemView { + id: mivMarker + + add: Transition { + NumberAnimation { + property: "slideIn" + from: 50 + to: 0 + duration: 500 + easing.type: Easing.OutBounce + easing.amplitude: 3.0 + } + } + + remove: Transition { + NumberAnimation { + property: "opacity" + to: 0.1 + duration: 50 + } + } + + model: ListModel { + id: markerModel + } + delegate: Component { + MapQuickItem { + coordinate: QtPositioning.coordinate(latitude, longitude) + anchorPoint: Qt.point(e1.width * 0.5, e1.height + slideIn) + property real slideIn : 0 + sourceItem: Shape { + id: e1 + vendorExtensionsEnabled: false + width: 32 + height: 32 + visible: true + + transform: Scale { + origin.y: e1.height * 0.5 + yScale: -1 + } + + ShapePath { + id: c_sp1 + strokeWidth: -1 + fillColor: Qt.rgba(1,0,1,1.0) + + property real half: e1.width * 0.5 + property real quarter: e1.width * 0.25 + property point center: Qt.point(e1.x + e1.width * 0.5 , e1.y + e1.height * 0.5) + + + property point top: Qt.point(center.x, center.y - half ) + property point bottomLeft: Qt.point(center.x - half, center.y + half ) + property point bottomRight: Qt.point(center.x + half, center.y + half ) + + startX: center.x; + startY: center.y + half + + PathLine { x: c_sp1.bottomLeft.x; y: c_sp1.bottomLeft.y } + PathLine { x: c_sp1.top.x; y: c_sp1.top.y } + PathLine { x: c_sp1.bottomRight.x; y: c_sp1.bottomRight.y } + PathLine { x: c_sp1.center.x; y: c_sp1.center.y + c_sp1.half } + } + } + } + } + } + //! [MarkerView] + + //! [OsloAdministrativeRegions] + MapItemView { + id: miv + model: OsloListModel { + id: osloListModel + } + add: Transition { + NumberAnimation { + property: "animationScale" + from: 0.2 + to: 1 + duration: 800 + easing.type: Easing.OutCubic + } + } + delegate: Component { + MapPolygon { + function fromMercator(l, centroid) { + var res = [] + for (var i = 0; i < l.length; i++) { + var vtx = l[i] + var offset = Qt.point((vtx.x - centroid.x) * animationScale, + (vtx.y - centroid.y) * animationScale) + var pt = Qt.point(centroid.x + offset.x, centroid.y + offset.y) + res.push( QtPositioning.mercatorToCoord(pt) ) + } + return res; + } + + path: fromMercator(osloListModel.geometries[name+"_"+adminLevel] + , osloListModel.centroids[name+"_"+adminLevel] ) + color: ((adminLevel > 4) ? "lightsteelblue" : 'firebrick') + property real animationScale : 1 + opacity: ((adminLevel < 9) ? 0.1 : 0.8) + visible: true + } + } + } + //! [OsloAdministrativeRegions] + } +} diff --git a/examples/location/location.pro b/examples/location/location.pro new file mode 100644 index 0000000..69fa651 --- /dev/null +++ b/examples/location/location.pro @@ -0,0 +1,13 @@ +TEMPLATE = subdirs + +qtHaveModule(quick) { + SUBDIRS += places \ + places_list \ + places_map \ + mapviewer \ + minimal_map \ + itemview_transitions \ + planespotter + + qtHaveModule(widgets): SUBDIRS += geojson_viewer +} diff --git a/examples/location/mapviewer/doc/images/mapviewer.png b/examples/location/mapviewer/doc/images/mapviewer.png new file mode 100644 index 0000000000000000000000000000000000000000..b55d7ff3574a714e4dc5da5a94442292f7ddcaed GIT binary patch literal 176944 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 1 )) { + showMessage(qsTr("Ambiguous geocode"), + count + " " + qsTr("results found for the") + + " " + st + " " +qsTr("point, please specify location")) + goButton.enabled = true; + } + } + } + } +} diff --git a/examples/location/mapviewer/forms/RouteAddressForm.ui.qml b/examples/location/mapviewer/forms/RouteAddressForm.ui.qml new file mode 100644 index 0000000..2254382 --- /dev/null +++ b/examples/location/mapviewer/forms/RouteAddressForm.ui.qml @@ -0,0 +1,207 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + + +import QtQuick 2.5 +import QtQuick.Controls 1.4 +import QtQuick.Layouts 1.2 + +Item { + property alias fromStreet: fromStreet + property alias fromCountry: fromCountry + property alias toStreet: toStreet + property alias toCity: toCity + property alias toCountry: toCountry + property alias fromCity: fromCity + property alias goButton: goButton + property alias clearButton: clearButton + property alias cancelButton: cancelButton + + Rectangle { + id: tabRectangle + y: 20 + height: tabTitle.height * 2 + color: "#46a2da" + anchors.rightMargin: 0 + anchors.leftMargin: 0 + anchors.left: parent.left + anchors.right: parent.right + + Label { + id: tabTitle + color: "#ffffff" + text: qsTr("Route Address") + anchors.verticalCenter: parent.verticalCenter + anchors.horizontalCenter: parent.horizontalCenter + } + } + + Item { + id: item2 + anchors.rightMargin: 20 + anchors.leftMargin: 20 + anchors.bottomMargin: 20 + anchors.topMargin: 20 + anchors.bottom: parent.bottom + anchors.left: parent.left + anchors.right: parent.right + anchors.top: tabRectangle.bottom + + GridLayout { + id: gridLayout3 + rowSpacing: 10 + rows: 1 + columns: 2 + anchors.fill: parent + + Label { + id: label1 + text: qsTr("From") + font.bold: true + anchors.horizontalCenter: parent.horizontalCenter + Layout.columnSpan : 2 + } + + Label { + id: label2 + text: qsTr("Street") + } + + TextField { + id: fromStreet + Layout.fillWidth: true + } + + Label { + id: label3 + text: qsTr("City") + } + + TextField { + id: fromCity + Layout.fillWidth: true + } + + Label { + id: label7 + text: qsTr("Country") + } + + TextField { + id: fromCountry + Layout.fillWidth: true + } + + Label { + id: label6 + text: qsTr("To") + font.bold: true + anchors.horizontalCenter: parent.horizontalCenter + Layout.columnSpan: 2 + } + + Label { + id: label4 + text: qsTr("Street") + } + + TextField { + id: toStreet + Layout.fillWidth: true + } + + Label { + id: label5 + text: qsTr("City") + } + + TextField { + id: toCity + Layout.fillWidth: true + } + + Label { + id: label8 + text: qsTr("Country") + } + + TextField { + id: toCountry + Layout.fillWidth: true + } + + RowLayout { + id: rowLayout1 + Layout.columnSpan: 2 + Layout.alignment: Qt.AlignRight + + Button { + id: goButton + text: qsTr("Proceed") + } + + Button { + id: clearButton + text: qsTr("Clear") + } + + Button { + id: cancelButton + text: qsTr("Cancel") + } + } + + Item { + Layout.fillHeight: true + Layout.columnSpan: 2 + } + } + } +} diff --git a/examples/location/mapviewer/forms/RouteCoordinate.qml b/examples/location/mapviewer/forms/RouteCoordinate.qml new file mode 100644 index 0000000..6d4bd65 --- /dev/null +++ b/examples/location/mapviewer/forms/RouteCoordinate.qml @@ -0,0 +1,89 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.5 +import QtPositioning 5.5 + +RouteCoordinateForm { + property variant toCoordinate + property variant fromCoordinate + signal showRoute(variant startCoordinate,variant endCoordinate) + signal closeForm() + + goButton.onClicked: { + var startCoordinate = QtPositioning.coordinate(parseFloat(fromLatitude.text), + parseFloat(fromLongitude.text)); + var endCoordinate = QtPositioning.coordinate(parseFloat(toLatitude.text), + parseFloat(toLongitude.text)); + if (startCoordinate.isValid && endCoordinate.isValid) { + goButton.enabled = false; + showRoute(startCoordinate,endCoordinate) + } + } + + clearButton.onClicked: { + fromLatitude.text = "" + fromLongitude.text = "" + toLatitude.text = "" + toLongitude.text = "" + } + + cancelButton.onClicked: { + closeForm() + } + + Component.onCompleted: { + fromLatitude.text = "" + fromCoordinate.latitude + fromLongitude.text = "" + fromCoordinate.longitude + toLatitude.text = "" + toCoordinate.latitude + toLongitude.text = "" + toCoordinate.longitude + } +} + diff --git a/examples/location/mapviewer/forms/RouteCoordinateForm.ui.qml b/examples/location/mapviewer/forms/RouteCoordinateForm.ui.qml new file mode 100644 index 0000000..f71d251 --- /dev/null +++ b/examples/location/mapviewer/forms/RouteCoordinateForm.ui.qml @@ -0,0 +1,183 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + + +import QtQuick 2.5 +import QtQuick.Controls 1.4 +import QtQuick.Layouts 1.2 + +Item { + property alias fromLatitude: fromLatitude + property alias fromLongitude: fromLongitude + property alias toLatitude: toLatitude + property alias toLongitude: toLongitude + property alias clearButton: clearButton + property alias goButton: goButton + property alias cancelButton: cancelButton + + Rectangle { + id: tabRectangle + y: 20 + height: tabTitle.height * 2 + color: "#46a2da" + anchors.rightMargin: 0 + anchors.leftMargin: 0 + anchors.left: parent.left + anchors.right: parent.right + + Label { + id: tabTitle + color: "#ffffff" + text: qsTr("Route Coordinates") + anchors.verticalCenter: parent.verticalCenter + anchors.horizontalCenter: parent.horizontalCenter + } + } + + Item { + id: item2 + anchors.rightMargin: 20 + anchors.leftMargin: 20 + anchors.bottomMargin: 20 + anchors.topMargin: 20 + anchors.bottom: parent.bottom + anchors.left: parent.left + anchors.right: parent.right + anchors.top: tabRectangle.bottom + + GridLayout { + id: gridLayout3 + rowSpacing: 10 + rows: 1 + columns: 2 + anchors.fill: parent + + Label { + id: label1 + text: qsTr("From") + anchors.horizontalCenter: parent.horizontalCenter + font.bold: true + Layout.columnSpan : 2 + } + + Label { + id: label2 + text: qsTr("Latitude") + } + + TextField { + id: fromLatitude + Layout.fillWidth: true + } + + Label { + id: label3 + text: qsTr("Longitude") + } + + TextField { + id: fromLongitude + Layout.fillWidth: true + } + + Label { + id: label6 + text: qsTr("To") + anchors.horizontalCenter: parent.horizontalCenter + font.bold: true + Layout.columnSpan: 2 + } + + Label { + id: label4 + text: qsTr("Latitude") + } + + TextField { + id: toLatitude + Layout.fillWidth: true + } + + Label { + id: label5 + text: qsTr("Longitude") + } + + TextField { + id: toLongitude + Layout.fillWidth: true + } + + RowLayout { + id: rowLayout1 + Layout.columnSpan: 2 + Layout.alignment: Qt.AlignRight + Button { + id: goButton + text: qsTr("Proceed") + } + + Button { + id: clearButton + text: qsTr("Clear") + } + + Button { + id: cancelButton + text: qsTr("Cancel") + } + } + Item { + Layout.fillHeight: true + Layout.columnSpan: 2 + } + } + } +} diff --git a/examples/location/mapviewer/forms/RouteList.qml b/examples/location/mapviewer/forms/RouteList.qml new file mode 100644 index 0000000..9cf889d --- /dev/null +++ b/examples/location/mapviewer/forms/RouteList.qml @@ -0,0 +1,97 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.5 +import QtQuick.Controls 1.4 +import "../helper.js" as Helper + +//! [routeinfomodel0] +ListView { +//! [routeinfomodel0] + property variant routeModel + property string totalTravelTime + property string totalDistance + signal closeForm() +//! [routeinfomodel1] + interactive: true + model: ListModel { id: routeInfoModel } + header: RouteListHeader {} + delegate: RouteListDelegate{ + routeIndex.text: index + 1 + routeInstruction.text: instruction + routeDistance.text: distance + } +//! [routeinfomodel1] + footer: Button { + anchors.horizontalCenter: parent.horizontalCenter + text: qsTr("Close") + onClicked: { + closeForm() + } + } + + Component.onCompleted: { + //! [routeinfomodel2] + routeInfoModel.clear() + if (routeModel.count > 0) { + for (var i = 0; i < routeModel.get(0).segments.length; i++) { + routeInfoModel.append({ + "instruction": routeModel.get(0).segments[i].maneuver.instructionText, + "distance": Helper.formatDistance(routeModel.get(0).segments[i].maneuver.distanceToNextInstruction) + }); + } + } + //! [routeinfomodel2] + totalTravelTime = routeModel.count == 0 ? "" : Helper.formatTime(routeModel.get(0).travelTime) + totalDistance = routeModel.count == 0 ? "" : Helper.formatDistance(routeModel.get(0).distance) + } +//! [routeinfomodel3] +} +//! [routeinfomodel3] diff --git a/examples/location/mapviewer/forms/RouteListDelegate.qml b/examples/location/mapviewer/forms/RouteListDelegate.qml new file mode 100644 index 0000000..81fe2e0 --- /dev/null +++ b/examples/location/mapviewer/forms/RouteListDelegate.qml @@ -0,0 +1,92 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.5 +import QtQuick.Controls 1.4 +import QtQuick.Layouts 1.2 + +Item { + id: root + property bool checked: false + property alias routeInstruction: instructionLabel + property alias routeDistance: distanceLabel + property alias routeIndex: indexLabel + + width: parent.width + height: indexLabel.height * 2 + + RowLayout { + spacing: 10 + anchors.left: parent.left + anchors.leftMargin: 30 + anchors.verticalCenter: parent.verticalCenter + Label { + id: indexLabel + } + Label { + id: instructionLabel + wrapMode: Text.Wrap + } + Label { + id: distanceLabel + } + } + + Rectangle { + anchors.left: parent.left + anchors.right: parent.right + anchors.margins: 15 + height: 1 + color: "#46a2da" + } +} + + + diff --git a/examples/location/mapviewer/forms/RouteListHeader.qml b/examples/location/mapviewer/forms/RouteListHeader.qml new file mode 100644 index 0000000..968395b --- /dev/null +++ b/examples/location/mapviewer/forms/RouteListHeader.qml @@ -0,0 +1,94 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.5 +import QtQuick.Controls 1.4 + +Item { + property alias travelTime: travelTimeLabel + property alias distance: distanceLabel + width: parent.width + height: tabTitle.height * 3.0 + + Rectangle { + id: tabRectangle + y: tabTitle.height + height: tabTitle.height * 2 - 1 + color: "#46a2da" + anchors.left: parent.left + anchors.right: parent.right + + Label { + id: tabTitle + color: "#ffffff" + text: qsTr("Route Information") + anchors.verticalCenter: parent.verticalCenter + anchors.horizontalCenter: parent.horizontalCenter + } + + Label { + id: travelTimeLabel + text: totalTravelTime + color: "#ffffff" + font.bold: true + anchors.left: parent.left + anchors.verticalCenter: parent.verticalCenter + } + + Label { + id: distanceLabel + text: totalDistance + color: "#ffffff" + font.bold: true + anchors.right: parent.right + anchors.verticalCenter: parent.verticalCenter + } + } +} diff --git a/examples/location/mapviewer/helper.js b/examples/location/mapviewer/helper.js new file mode 100644 index 0000000..faef9d7 --- /dev/null +++ b/examples/location/mapviewer/helper.js @@ -0,0 +1,91 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +.pragma library + +function roundNumber(number, digits) +{ + var multiple = Math.pow(10, digits); + return Math.round(number * multiple) / multiple; +} + +function formatTime(sec) +{ + var value = sec + var seconds = value % 60 + value /= 60 + value = (value > 1) ? Math.round(value) : 0 + var minutes = value % 60 + value /= 60 + value = (value > 1) ? Math.round(value) : 0 + var hours = value + if (hours > 0) value = hours + "h:"+ minutes + "m" + else value = minutes + "min" + return value +} + +function formatDistance(meters) +{ + var dist = Math.round(meters) + if (dist > 1000 ){ + if (dist > 100000){ + dist = Math.round(dist / 1000) + } + else{ + dist = Math.round(dist / 100) + dist = dist / 10 + } + dist = dist + " km" + } + else{ + dist = dist + " m" + } + return dist +} diff --git a/examples/location/mapviewer/main.cpp b/examples/location/mapviewer/main.cpp new file mode 100644 index 0000000..ec54b5a --- /dev/null +++ b/examples/location/mapviewer/main.cpp @@ -0,0 +1,154 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include +#include +#include +#include +#if QT_CONFIG(ssl) +#include +#endif +#include + +static bool parseArgs(QStringList& args, QVariantMap& parameters) +{ + + while (!args.isEmpty()) { + + QString param = args.takeFirst(); + + if (param.startsWith("--help")) { + QTextStream out(stdout); + out << "Usage: " << Qt::endl; + out << "--plugin. - Sets parameter = value for plugin" << Qt::endl; + out.flush(); + return true; + } + + if (param.startsWith("--plugin.")) { + + param.remove(0, 9); + + if (args.isEmpty() || args.first().startsWith("--")) { + parameters[param] = true; + } else { + + QString value = args.takeFirst(); + + if (value == "true" || value == "on" || value == "enabled") { + parameters[param] = true; + } else if (value == "false" || value == "off" + || value == "disable") { + parameters[param] = false; + } else { + parameters[param] = value; + } + } + } + } + return false; +} + +int main(int argc, char *argv[]) +{ +#if QT_CONFIG(library) + const QByteArray additionalLibraryPaths = qgetenv("QTLOCATION_EXTRA_LIBRARY_PATH"); + for (const QByteArray &p : additionalLibraryPaths.split(':')) + QCoreApplication::addLibraryPath(QString(p)); +#endif + QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling); + QGuiApplication application(argc, argv); + + QVariantMap parameters; + QStringList args(QCoreApplication::arguments()); + + // Fetch tokens from the environment, if present + const QByteArray mapboxMapID = qgetenv("MAPBOX_MAP_ID"); + const QByteArray mapboxAccessToken = qgetenv("MAPBOX_ACCESS_TOKEN"); + const QByteArray hereAppID = qgetenv("HERE_APP_ID"); + const QByteArray hereToken = qgetenv("HERE_TOKEN"); + const QByteArray esriToken = qgetenv("ESRI_TOKEN"); + + if (!mapboxMapID.isEmpty()) + parameters["mapbox.map_id"] = QString::fromLocal8Bit(mapboxMapID); + if (!mapboxAccessToken.isEmpty()) { + parameters["mapbox.access_token"] = QString::fromLocal8Bit(mapboxAccessToken); + parameters["mapboxgl.access_token"] = QString::fromLocal8Bit(mapboxAccessToken); + } + if (!hereAppID.isEmpty()) + parameters["here.app_id"] = QString::fromLocal8Bit(hereAppID); + if (!hereToken.isEmpty()) + parameters["here.token"] = QString::fromLocal8Bit(hereToken); + if (!esriToken.isEmpty()) + parameters["esri.token"] = QString::fromLocal8Bit(esriToken); + + if (parseArgs(args, parameters)) + return 0; + if (!args.contains(QStringLiteral("osm.useragent"))) + parameters[QStringLiteral("osm.useragent")] = QStringLiteral("QtLocation Mapviewer example"); + + QQmlApplicationEngine engine; +#if QT_CONFIG(ssl) + engine.rootContext()->setContextProperty("supportsSsl", QSslSocket::supportsSsl()); +#else + engine.rootContext()->setContextProperty("supportsSsl", false); +#endif + engine.addImportPath(QStringLiteral(":/imports")); + engine.load(QUrl(QStringLiteral("qrc:///mapviewer.qml"))); + QObject::connect(&engine, SIGNAL(quit()), qApp, SLOT(quit())); + + QObject *item = engine.rootObjects().first(); + Q_ASSERT(item); + + QMetaObject::invokeMethod(item, "initializeProviders", + Q_ARG(QVariant, QVariant::fromValue(parameters))); + + return application.exec(); +} diff --git a/examples/location/mapviewer/map/CircleItem.qml b/examples/location/mapviewer/map/CircleItem.qml new file mode 100644 index 0000000..d06aeb7 --- /dev/null +++ b/examples/location/mapviewer/map/CircleItem.qml @@ -0,0 +1,68 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +import QtQuick 2.5 +import QtLocation 5.6 + +//TODO: remove/refactor me when items are integrated + +MapCircle { + + color: "#46a2da" + border.color: "#190a33" + border.width: 2 + smooth: true + opacity: 0.25 + + function setGeometry(markers, index){ + center.latitude = markers[index].coordinate.latitude + center.longitude = markers[index].coordinate.longitude + radius= center.distanceTo(markers[index + 1].coordinate) + } +} diff --git a/examples/location/mapviewer/map/ImageItem.qml b/examples/location/mapviewer/map/ImageItem.qml new file mode 100644 index 0000000..cc5507c --- /dev/null +++ b/examples/location/mapviewer/map/ImageItem.qml @@ -0,0 +1,71 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +import QtQuick 2.5; +import QtLocation 5.6 + +MapQuickItem { //to be used inside MapComponent only + id: imageItem + + MouseArea { + anchors.fill: parent + drag.target: parent + } + + function setGeometry(markers, index) { + coordinate.latitude = markers[index].coordinate.latitude + coordinate.longitude = markers[index].coordinate.longitude + } + + sourceItem: Image { + id: testImage + source: "../resources/icon.png" + opacity: 0.7 + } +} diff --git a/examples/location/mapviewer/map/MapComponent.qml b/examples/location/mapviewer/map/MapComponent.qml new file mode 100644 index 0000000..c7ac36d --- /dev/null +++ b/examples/location/mapviewer/map/MapComponent.qml @@ -0,0 +1,641 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +import QtQuick 2.5 +import QtQuick.Controls 1.4 +import QtLocation 5.9 +import QtPositioning 5.5 +import "../helper.js" as Helper + +//! [top] +Map { + id: map +//! [top] + property variant markers + property variant mapItems + property int markerCounter: 0 // counter for total amount of markers. Resets to 0 when number of markers = 0 + property int currentMarker + property int lastX : -1 + property int lastY : -1 + property int pressX : -1 + property int pressY : -1 + property int jitterThreshold : 30 + property bool followme: false + property variant scaleLengths: [5, 10, 20, 50, 100, 200, 500, 1000, 2000, 5000, 10000, 20000, 50000, 100000, 200000, 500000, 1000000, 2000000] + property alias routeQuery: routeQuery + property alias routeModel: routeModel + property alias geocodeModel: geocodeModel + property alias slidersExpanded: sliders.expanded + + signal showGeocodeInfo() + signal geocodeFinished() + signal routeError() + signal coordinatesCaptured(double latitude, double longitude) + signal showMainMenu(variant coordinate) + signal showMarkerMenu(variant coordinate) + signal showRouteMenu(variant coordinate) + signal showPointMenu(variant coordinate) + signal showRouteList() + + function geocodeMessage() + { + var street, district, city, county, state, countryCode, country, postalCode, latitude, longitude, text + latitude = Math.round(geocodeModel.get(0).coordinate.latitude * 10000) / 10000 + longitude =Math.round(geocodeModel.get(0).coordinate.longitude * 10000) / 10000 + street = geocodeModel.get(0).address.street + district = geocodeModel.get(0).address.district + city = geocodeModel.get(0).address.city + county = geocodeModel.get(0).address.county + state = geocodeModel.get(0).address.state + countryCode = geocodeModel.get(0).address.countryCode + country = geocodeModel.get(0).address.country + postalCode = geocodeModel.get(0).address.postalCode + + text = "Latitude: " + latitude + "
" + text +="Longitude: " + longitude + "
" + "
" + if (street) text +="Street: "+ street + "
" + if (district) text +="District: "+ district +"
" + if (city) text +="City: "+ city + "
" + if (county) text +="County: "+ county + "
" + if (state) text +="State: "+ state + "
" + if (countryCode) text +="Country code: "+ countryCode + "
" + if (country) text +="Country: "+ country + "
" + if (postalCode) text +="PostalCode: "+ postalCode + "
" + return text + } + + function calculateScale() + { + var coord1, coord2, dist, text, f + f = 0 + coord1 = map.toCoordinate(Qt.point(0,scale.y)) + coord2 = map.toCoordinate(Qt.point(0+scaleImage.sourceSize.width,scale.y)) + dist = Math.round(coord1.distanceTo(coord2)) + + if (dist === 0) { + // not visible + } else { + for (var i = 0; i < scaleLengths.length-1; i++) { + if (dist < (scaleLengths[i] + scaleLengths[i+1]) / 2 ) { + f = scaleLengths[i] / dist + dist = scaleLengths[i] + break; + } + } + if (f === 0) { + f = dist / scaleLengths[i] + dist = scaleLengths[i] + } + } + + text = Helper.formatDistance(dist) + scaleImage.width = (scaleImage.sourceSize.width * f) - 2 * scaleImageLeft.sourceSize.width + scaleText.text = text + } + + function deleteMarkers() + { + var count = map.markers.length + for (var i = 0; i map.jitterThreshold || + Math.abs(map.pressY - parent.y -mouse.y ) > map.jitterThreshold) { + if (pressed) parent.radius = parent.center.distanceTo( + map.toCoordinate(Qt.point(mouse.x, mouse.y))) + } + if (mouse.button == Qt.LeftButton) { + map.lastX = mouse.x + parent.x + map.lastY = mouse.y + parent.y + } + } + + onPressAndHold:{ + if (Math.abs(map.pressX - parent.x- mouse.x ) < map.jitterThreshold + && Math.abs(map.pressY - parent.y - mouse.y ) < map.jitterThreshold) { + showPointMenu(lastCoordinate); + } + } + } + //! [pointdel1] + } + } + //! [pointdel1] + + //! [routeview0] + MapItemView { + model: routeModel + delegate: routeDelegate + //! [routeview0] + autoFitViewport: true + //! [routeview1] + } + //! [routeview1] + + //! [geocodeview] + MapItemView { + model: geocodeModel + delegate: pointDelegate + } + //! [geocodeview] + + Timer { + id: scaleTimer + interval: 100 + running: false + repeat: false + onTriggered: { + map.calculateScale() + } + } + + MouseArea { + id: mouseArea + property variant lastCoordinate + anchors.fill: parent + acceptedButtons: Qt.LeftButton | Qt.RightButton + + onPressed : { + map.lastX = mouse.x + map.lastY = mouse.y + map.pressX = mouse.x + map.pressY = mouse.y + lastCoordinate = map.toCoordinate(Qt.point(mouse.x, mouse.y)) + } + + onPositionChanged: { + if (mouse.button == Qt.LeftButton) { + map.lastX = mouse.x + map.lastY = mouse.y + } + } + + onDoubleClicked: { + var mouseGeoPos = map.toCoordinate(Qt.point(mouse.x, mouse.y)); + var preZoomPoint = map.fromCoordinate(mouseGeoPos, false); + if (mouse.button === Qt.LeftButton) { + map.zoomLevel = Math.floor(map.zoomLevel + 1) + } else if (mouse.button === Qt.RightButton) { + map.zoomLevel = Math.floor(map.zoomLevel - 1) + } + var postZoomPoint = map.fromCoordinate(mouseGeoPos, false); + var dx = postZoomPoint.x - preZoomPoint.x; + var dy = postZoomPoint.y - preZoomPoint.y; + + var mapCenterPoint = Qt.point(map.width / 2.0 + dx, map.height / 2.0 + dy); + map.center = map.toCoordinate(mapCenterPoint); + + lastX = -1; + lastY = -1; + } + + onPressAndHold:{ + if (Math.abs(map.pressX - mouse.x ) < map.jitterThreshold + && Math.abs(map.pressY - mouse.y ) < map.jitterThreshold) { + showMainMenu(lastCoordinate); + } + } + } +//! [end] +} +//! [end] diff --git a/examples/location/mapviewer/map/MapSliders.qml b/examples/location/mapviewer/map/MapSliders.qml new file mode 100644 index 0000000..ed475d0 --- /dev/null +++ b/examples/location/mapviewer/map/MapSliders.qml @@ -0,0 +1,333 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.6 +import QtQuick.Controls 1.4 +import QtQuick.Controls.Styles 1.4 +import QtQuick.Controls 2.0 as C2 + +Row { + id: containerRow + + property var mapSource + property real fontSize : 14 + property color labelBackground : "transparent" + property int edge: Qt.RightEdge + property alias expanded: sliderToggler.checked + + function rightEdge() { + return (containerRow.edge === Qt.RightEdge); + } + + layoutDirection: rightEdge() ? Qt.LeftToRight : Qt.RightToLeft + anchors.top: parent.top + anchors.bottom: parent.bottom + anchors.right: rightEdge() ? parent.right : undefined + anchors.left: rightEdge() ? undefined : parent.left + + Button { + id: sliderToggler + width: 32 + height: 96 + checkable: true + checked: true + anchors.verticalCenter: parent.verticalCenter + + transform: Scale { + origin.x: rightEdge() ? 0 : sliderToggler.width / 2 + xScale: rightEdge() ? 1 : -1 + } + + style: ButtonStyle { + background: Rectangle { + color: "transparent" + } + } + + property real shear: 0.333 + property real buttonOpacity: 0.5 + property real mirror : rightEdge() ? 1.0 : -1.0 + + Rectangle { + width: 16 + height: 48 + color: "seagreen" + antialiasing: true + opacity: sliderToggler.buttonOpacity + anchors.top: parent.top + anchors.left: sliderToggler.checked ? parent.left : parent.horizontalCenter + transform: Matrix4x4 { + property real d : sliderToggler.checked ? 1.0 : -1.0 + matrix: Qt.matrix4x4(1.0, d * sliderToggler.shear, 0.0, 0.0, + 0.0, 1.0, 0.0, 0.0, + 0.0, 0.0, 1.0, 0.0, + 0.0, 0.0, 0.0, 1.0) + } + } + + Rectangle { + width: 16 + height: 48 + color: "seagreen" + antialiasing: true + opacity: sliderToggler.buttonOpacity + anchors.top: parent.verticalCenter + anchors.right: sliderToggler.checked ? parent.right : parent.horizontalCenter + transform: Matrix4x4 { + property real d : sliderToggler.checked ? -1.0 : 1.0 + matrix: Qt.matrix4x4(1.0, d * sliderToggler.shear, 0.0, 0.0, + 0.0, 1.0, 0.0, 0.0, + 0.0, 0.0, 1.0, 0.0, + 0.0, 0.0, 0.0, 1.0) + } + } + } + + Rectangle { + id: sliderContainer + height: parent.height + width: sliderRow.width + 10 + visible: sliderToggler.checked + color: Qt.rgba( 0, 191 / 255.0, 255 / 255.0, 0.07) + + property var labelBorderColor: "transparent" + property var slidersHeight : sliderContainer.height + - rowSliderValues.height + - rowSliderLabels.height + - sliderColumn.spacing * 2 + - sliderColumn.topPadding + - sliderColumn.bottomPadding + + Column { + id: sliderColumn + spacing: 10 + topPadding: 16 + bottomPadding: 48 + anchors.centerIn: parent + + // the sliders value labels + Row { + id: rowSliderValues + spacing: sliderRow.spacing + width: sliderRow.width + height: 32 + property real entryWidth: zoomSlider.width + + Rectangle{ + color: labelBackground + height: parent.height + width: parent.entryWidth + border.color: sliderContainer.labelBorderColor + Label { + id: labelZoomValue + text: zoomSlider.value.toFixed(3) + font.pixelSize: fontSize + rotation: -90 + anchors.centerIn: parent + } + } + Rectangle{ + color: labelBackground + height: parent.height + width: parent.entryWidth + border.color: sliderContainer.labelBorderColor + Label { + id: labelBearingValue + text: bearingSlider.value.toFixed(2) + font.pixelSize: fontSize + rotation: -90 + anchors.centerIn: parent + } + } + Rectangle{ + color: labelBackground + height: parent.height + width: parent.entryWidth + border.color: sliderContainer.labelBorderColor + Label { + id: labelTiltValue + text: tiltSlider.value.toFixed(2) + font.pixelSize: fontSize + rotation: -90 + anchors.centerIn: parent + } + } + Rectangle{ + color: labelBackground + height: parent.height + width: parent.entryWidth + border.color: sliderContainer.labelBorderColor + Label { + id: labelFovValue + text: fovSlider.value.toFixed(2) + font.pixelSize: fontSize + rotation: -90 + anchors.centerIn: parent + } + } + } // rowSliderValues + + // The sliders row + Row { + spacing: -10 + id: sliderRow + height: sliderContainer.slidersHeight + + C2.Slider { + id: zoomSlider + height: parent.height + orientation : Qt.Vertical + from : containerRow.mapSource.minimumZoomLevel + to : containerRow.mapSource.maximumZoomLevel + value : containerRow.mapSource.zoomLevel + onValueChanged: { + containerRow.mapSource.zoomLevel = value + } + } + C2.Slider { + id: bearingSlider + height: parent.height + from: 0 + to: 360 + orientation : Qt.Vertical + value: containerRow.mapSource.bearing + onValueChanged: { + containerRow.mapSource.bearing = value; + } + } + C2.Slider { + id: tiltSlider + height: parent.height + orientation : Qt.Vertical + from: containerRow.mapSource.minimumTilt; + to: containerRow.mapSource.maximumTilt + value: containerRow.mapSource.tilt + onValueChanged: { + containerRow.mapSource.tilt = value; + } + } + C2.Slider { + id: fovSlider + height: parent.height + orientation : Qt.Vertical + from: containerRow.mapSource.minimumFieldOfView + to: containerRow.mapSource.maximumFieldOfView + value: containerRow.mapSource.fieldOfView + onValueChanged: { + containerRow.mapSource.fieldOfView = value; + } + } + } // Row sliders + + // The labels row + Row { + id: rowSliderLabels + spacing: sliderRow.spacing + width: sliderRow.width + property real entryWidth: zoomSlider.width + property real entryHeight: 64 + + Rectangle{ + color: labelBackground + height: parent.entryHeight + width: parent.entryWidth + border.color: sliderContainer.labelBorderColor + Label { + id: labelZoom + text: "Zoom" + font.pixelSize: fontSize + rotation: -90 + anchors.centerIn: parent + } + } + + Rectangle{ + color: labelBackground + height: parent.entryHeight + width: parent.entryWidth + border.color: sliderContainer.labelBorderColor + Label { + id: labelBearing + text: "Bearing" + font.pixelSize: fontSize + rotation: -90 + anchors.centerIn: parent + } + } + Rectangle{ + color: labelBackground + height: parent.entryHeight + width: parent.entryWidth + border.color: sliderContainer.labelBorderColor + Label { + id: labelTilt + text: "Tilt" + font.pixelSize: fontSize + rotation: -90 + anchors.centerIn: parent + } + } + Rectangle{ + color: labelBackground + height: parent.entryHeight + width: parent.entryWidth + border.color: sliderContainer.labelBorderColor + Label { + id: labelFov + text: "FoV" + font.pixelSize: fontSize + rotation: -90 + anchors.centerIn: parent + } + } + } // rowSliderLabels + } // Column + } // sliderContainer +} // containerRow diff --git a/examples/location/mapviewer/map/Marker.qml b/examples/location/mapviewer/map/Marker.qml new file mode 100644 index 0000000..095e5f9 --- /dev/null +++ b/examples/location/mapviewer/map/Marker.qml @@ -0,0 +1,126 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.5; +import QtLocation 5.6 + +//! [mqi-top] +MapQuickItem { + id: marker +//! [mqi-top] + property alias lastMouseX: markerMouseArea.lastX + property alias lastMouseY: markerMouseArea.lastY + +//! [mqi-anchor] + anchorPoint.x: image.width/4 + anchorPoint.y: image.height + + sourceItem: Image { + id: image +//! [mqi-anchor] + source: "../resources/marker.png" + opacity: markerMouseArea.pressed ? 0.6 : 1.0 + MouseArea { + id: markerMouseArea + property int pressX : -1 + property int pressY : -1 + property int jitterThreshold : 10 + property int lastX: -1 + property int lastY: -1 + anchors.fill: parent + hoverEnabled : false + drag.target: marker + preventStealing: true + + onPressed : { + map.pressX = mouse.x + map.pressY = mouse.y + map.currentMarker = -1 + for (var i = 0; i< map.markers.length; i++){ + if (marker == map.markers[i]){ + map.currentMarker = i + break + } + } + } + + onPressAndHold:{ + if (Math.abs(map.pressX - mouse.x ) < map.jitterThreshold + && Math.abs(map.pressY - mouse.y ) < map.jitterThreshold) { + var p = map.fromCoordinate(marker.coordinate) + lastX = p.x + lastY = p.y + map.showMarkerMenu(marker.coordinate) + } + } + } + + Text{ + id: number + y: image.height/10 + width: image.width + color: "white" + font.bold: true + font.pixelSize: 14 + horizontalAlignment: Text.AlignHCenter + Component.onCompleted: { + text = map.markerCounter + } + } + +//! [mqi-closeimage] + } +//! [mqi-closeimage] + + Component.onCompleted: coordinate = map.toCoordinate(Qt.point(markerMouseArea.mouseX, + markerMouseArea.mouseY)); +//! [mqi-close] +} +//! [mqi-close] diff --git a/examples/location/mapviewer/map/MiniMap.qml b/examples/location/mapviewer/map/MiniMap.qml new file mode 100644 index 0000000..78d2b01 --- /dev/null +++ b/examples/location/mapviewer/map/MiniMap.qml @@ -0,0 +1,127 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.5 +import QtPositioning 5.3 +import QtLocation 5.6 + +Rectangle{ + + function clamp(num, min, max) + { + return num < min ? min : num > max ? max : num; + } + + function minimumScaleFactor() + { + var hscalefactor = (400.0 / Math.max(Math.min(map.width, 1000), 400)) * 0.5 + var vscalefactor = (400.0 / Math.max(Math.min(map.height, 1000), 400)) * 0.5 + return Math.min(hscalefactor,vscalefactor) + } + + function avgScaleFactor() + { + var hscalefactor = (400.0 / Math.max(Math.min(map.width, 1000), 400)) * 0.5 + var vscalefactor = (400.0 / Math.max(Math.min(map.height, 1000), 400)) * 0.5 + return (hscalefactor+vscalefactor) * 0.5 + } + + id: miniMapRect + width: Math.floor(map.width * avgScaleFactor()) + 2 + height: Math.floor(map.height * avgScaleFactor()) + 2 + anchors.right: (parent) ? parent.right : undefined + anchors.rightMargin: 10 + anchors.top: (parent) ? parent.top : undefined + anchors.topMargin: 10 + color: "#242424" + Map { + id: miniMap + anchors.top: parent.top + anchors.topMargin: 1 + anchors.left: parent.left + anchors.leftMargin: 1 + width: Math.floor(map.width * avgScaleFactor()) + height: Math.floor(map.height * avgScaleFactor()) + zoomLevel: clamp(map.zoomLevel - 4.5, 2.0, 5.0) //(map.zoomLevel > minimumZoomLevel + 3) ? minimumZoomLevel + 3 : 1.5 + center: map.center + plugin: map.plugin + gesture.enabled: false + copyrightsVisible: false + property double mapZoomLevel : map.zoomLevel + + // cannot use property bindings on map.visibleRegion in MapRectangle because it's non-NOTIFYable + onCenterChanged: miniMapRectangle.updateCoordinates() + onMapZoomLevelChanged: miniMapRectangle.updateCoordinates() + onWidthChanged: miniMapRectangle.updateCoordinates() + onHeightChanged: miniMapRectangle.updateCoordinates() + + MapRectangle { + id: miniMapRectangle + color: "#44ff0000" + border.width: 1 + border.color: "red" + + function getMapVisibleRegion() + { + return QtPositioning.shapeToRectangle(map.visibleRegion) + } + + function updateCoordinates() + { + topLeft.latitude = getMapVisibleRegion().topLeft.latitude + topLeft.longitude= getMapVisibleRegion().topLeft.longitude + bottomRight.latitude = getMapVisibleRegion().bottomRight.latitude + bottomRight.longitude= getMapVisibleRegion().bottomRight.longitude + console.log("TopLeft: " + topLeft) + console.log("BotRigh: " + bottomRight) + } + } + } +} diff --git a/examples/location/mapviewer/map/PolygonItem.qml b/examples/location/mapviewer/map/PolygonItem.qml new file mode 100644 index 0000000..b2ece6d --- /dev/null +++ b/examples/location/mapviewer/map/PolygonItem.qml @@ -0,0 +1,73 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +import QtQuick 2.5 +import QtLocation 5.6 + +//TODO: remove me when items are integrated + +MapPolygon { + + color: "#46a2da" + border.color: "#190a33" + border.width: 2 + smooth: true + opacity: 0.25 + + function setGeometry(markers, index){ + for (var i = index; i0) + plugin = Qt.createQmlObject ('import QtLocation 5.6; Plugin{ name:"' + provider + '"; parameters: appWindow.parameters}', appWindow) + else + plugin = Qt.createQmlObject ('import QtLocation 5.6; Plugin{ name:"' + provider + '"}', appWindow) + + if (minimap) { + minimap.destroy() + minimap = null + } + + var zoomLevel = null + var tilt = null + var bearing = null + var fov = null + var center = null + var panelExpanded = null + if (map) { + zoomLevel = map.zoomLevel + tilt = map.tilt + bearing = map.bearing + fov = map.fieldOfView + center = map.center + panelExpanded = map.slidersExpanded + map.destroy() + } + + map = mapComponent.createObject(page); + map.plugin = plugin; + + if (zoomLevel != null) { + map.tilt = tilt + map.bearing = bearing + map.fieldOfView = fov + map.zoomLevel = zoomLevel + map.center = center + map.slidersExpanded = panelExpanded + } else { + // Use an integer ZL to enable nearest interpolation, if possible. + map.zoomLevel = Math.floor((map.maximumZoomLevel - map.minimumZoomLevel)/2) + // defaulting to 45 degrees, if possible. + map.fieldOfView = Math.min(Math.max(45.0, map.minimumFieldOfView), map.maximumFieldOfView) + } + + map.forceActiveFocus() + } + + function getPlugins() + { + var plugin = Qt.createQmlObject ('import QtLocation 5.6; Plugin {}', appWindow) + var myArray = new Array() + for (var i = 0; i" + qsTr("Distance:") + "
" + distance) + break + case "drawImage": + map.addGeoItem("ImageItem") + break + case "drawRectangle": + map.addGeoItem("RectangleItem") + break + case "drawCircle": + map.addGeoItem("CircleItem") + break; + case "drawPolyline": + map.addGeoItem("PolylineItem") + break; + case "drawPolygonMenu": + map.addGeoItem("PolygonItem") + break + default: + console.log("Unsupported operation") + } + } + } + + ItemPopupMenu { + id: itemPopupMenu + + function show(type,coordinate) + { + stackView.pop(page) + itemPopupMenu.type = type + itemPopupMenu.update() + itemPopupMenu.popup() + } + + onItemClicked: { + stackView.pop(page) + switch (item) { + case "showRouteInfo": + stackView.showRouteListPage() + break; + case "deleteRoute": + map.routeModel.reset(); + break; + case "showPointInfo": + map.showGeocodeInfo() + break; + case "deletePoint": + map.geocodeModel.reset() + break; + default: + console.log("Unsupported operation") + } + } + } + + StackView { + id: stackView + anchors.fill: parent + focus: true + initialItem: Item { + id: page + + Text { + visible: !supportsSsl && map && map.activeMapType && activeMapType.metadata.isHTTPS + text: "The active map type\n +requires (missing) SSL\n +support" + horizontalAlignment: Text.AlignHCenter + font.pixelSize: appWindow.width / 12 + font.bold: true + color: "grey" + anchors.centerIn: parent + z: 12 + } + } + + function showMessage(title,message,backPage) + { + push({ item: Qt.resolvedUrl("forms/Message.qml") , + properties: { + "title" : title, + "message" : message, + "backPage" : backPage + }}) + currentItem.closeForm.connect(closeMessage) + } + + function closeMessage(backPage) + { + pop(backPage) + } + + function closeForm() + { + pop(page) + } + + function showRouteListPage() + { + push({ item: Qt.resolvedUrl("forms/RouteList.qml") , + properties: { + "routeModel" : map.routeModel + }}) + currentItem.closeForm.connect(closeForm) + } + } + + Component { + id: mapComponent + + MapComponent{ + width: page.width + height: page.height + onFollowmeChanged: mainMenu.isFollowMe = map.followme + onSupportedMapTypesChanged: mainMenu.mapTypeMenu.createMenu(map) + onCoordinatesCaptured: { + var text = "" + qsTr("Latitude:") + " " + Helper.roundNumber(latitude,4) + "
" + qsTr("Longitude:") + " " + Helper.roundNumber(longitude,4) + stackView.showMessage(qsTr("Coordinates"),text); + } + onGeocodeFinished:{ + if (map.geocodeModel.status == GeocodeModel.Ready) { + if (map.geocodeModel.count == 0) { + stackView.showMessage(qsTr("Geocode Error"),qsTr("Unsuccessful geocode")) + } else if (map.geocodeModel.count > 1) { + stackView.showMessage(qsTr("Ambiguous geocode"), map.geocodeModel.count + " " + + qsTr("results found for the given address, please specify location")) + } else { + stackView.showMessage(qsTr("Location"), geocodeMessage(),page) + } + } else if (map.geocodeModel.status == GeocodeModel.Error) { + stackView.showMessage(qsTr("Geocode Error"),qsTr("Unsuccessful geocode")) + } + } + onRouteError: stackView.showMessage(qsTr("Route Error"),qsTr("Unable to find a route for the given points"),page) + + onShowGeocodeInfo: stackView.showMessage(qsTr("Location"),geocodeMessage(),page) + + onErrorChanged: { + if (map.error != Map.NoError) { + var title = qsTr("ProviderError") + var message = map.errorString + "

" + qsTr("Try to select other provider") + "" + if (map.error == Map.MissingRequiredParameterError) + message += "
" + qsTr("or see") + " \'mapviewer --help\' " + + qsTr("how to pass plugin parameters.") + stackView.showMessage(title,message); + } + } + onShowMainMenu: mapPopupMenu.show(coordinate) + onShowMarkerMenu: markerPopupMenu.show(coordinate) + onShowRouteMenu: itemPopupMenu.show("Route",coordinate) + onShowPointMenu: itemPopupMenu.show("Point",coordinate) + onShowRouteList: stackView.showRouteListPage() + } + } +} diff --git a/examples/location/mapviewer/mapviewer.qrc b/examples/location/mapviewer/mapviewer.qrc new file mode 100644 index 0000000..7a7d1f4 --- /dev/null +++ b/examples/location/mapviewer/mapviewer.qrc @@ -0,0 +1,38 @@ + + + mapviewer.qml + map/MapComponent.qml + map/MapSliders.qml + map/Marker.qml + map/PolylineItem.qml + map/RectangleItem.qml + map/CircleItem.qml + map/PolygonItem.qml + map/ImageItem.qml + map/MiniMap.qml + forms/Message.qml + forms/MessageForm.ui.qml + forms/Geocode.qml + forms/GeocodeForm.ui.qml + forms/ReverseGeocode.qml + forms/ReverseGeocodeForm.ui.qml + forms/RouteCoordinate.qml + forms/RouteCoordinateForm.ui.qml + forms/RouteAddress.qml + forms/RouteAddressForm.ui.qml + forms/Locale.qml + forms/LocaleForm.ui.qml + forms/RouteList.qml + forms/RouteListDelegate.qml + forms/RouteListHeader.qml + menus/MainMenu.qml + menus/MapPopupMenu.qml + menus/MarkerPopupMenu.qml + menus/ItemPopupMenu.qml + helper.js + resources/scale_end.png + resources/scale.png + resources/marker.png + resources/icon.png + + diff --git a/examples/location/mapviewer/menus/ItemPopupMenu.qml b/examples/location/mapviewer/menus/ItemPopupMenu.qml new file mode 100644 index 0000000..998a75b --- /dev/null +++ b/examples/location/mapviewer/menus/ItemPopupMenu.qml @@ -0,0 +1,63 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.5 +import QtQuick.Controls 1.4 + +Menu { + property variant type + signal itemClicked(string item) + + function update() { + clear() + addItem(qsTr("Info")).triggered.connect(function(){itemClicked("show" + type + "Info")}) + addItem(qsTr("Delete")).triggered.connect(function(){itemClicked("delete" + type )}) + } +} diff --git a/examples/location/mapviewer/menus/MainMenu.qml b/examples/location/mapviewer/menus/MainMenu.qml new file mode 100644 index 0000000..baf0357 --- /dev/null +++ b/examples/location/mapviewer/menus/MainMenu.qml @@ -0,0 +1,142 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.5 +import QtQuick.Controls 1.4 +import QtLocation 5.6 + +MenuBar { + property variant providerMenu: providerMenu + property variant mapTypeMenu: mapTypeMenu + property variant toolsMenu: toolsMenu + property alias isFollowMe: toolsMenu.isFollowMe + property alias isMiniMap: toolsMenu.isMiniMap + + signal selectProvider(string providerName) + signal selectMapType(variant mapType) + signal selectTool(string tool); + signal toggleMapState(string state) + + Menu { + id: providerMenu + title: qsTr("Provider") + + function createMenu(plugins) + { + clear() + for (var i = 0; i < plugins.length; i++) { + createProviderMenuItem(plugins[i]); + } + } + + function createProviderMenuItem(provider) + { + var item = addItem(provider); + item.checkable = true; + item.triggered.connect(function(){selectProvider(provider)}) + } + } + + Menu { + id: mapTypeMenu + title: qsTr("MapType") + + function createMenu(map) + { + clear() + for (var i = 0; i 0) { + addItem(qsTr("Delete all markers")).triggered.connect(function(){itemClicked("deleteMarkers")}) + } + + if (mapItemsCount > 0) { + addItem(qsTr("Delete all items")).triggered.connect(function(){itemClicked("deleteItems")}) + } + } +} diff --git a/examples/location/mapviewer/menus/MarkerPopupMenu.qml b/examples/location/mapviewer/menus/MarkerPopupMenu.qml new file mode 100644 index 0000000..81cf411 --- /dev/null +++ b/examples/location/mapviewer/menus/MarkerPopupMenu.qml @@ -0,0 +1,86 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.5 +import QtQuick.Controls 1.4 + +Menu { + property int currentMarker + property int markersCount + signal itemClicked(string item) + + function update() { + clear() + addItem(qsTr("Delete")).triggered.connect(function(){itemClicked("deleteMarker")}) + addItem(qsTr("Coordinates")).triggered.connect(function(){itemClicked("getMarkerCoordinate")}) + addItem(qsTr("Move to")).triggered.connect(function(){itemClicked("moveMarkerTo")}) + if (currentMarker == markersCount-2){ + addItem(qsTr("Route to next point")).triggered.connect(function(){itemClicked("routeToNextPoint")}); + addItem(qsTr("Distance to next point")).triggered.connect(function(){itemClicked("distanceToNextPoint")}); + } + if (currentMarker < markersCount-2){ + addItem(qsTr("Route to next points")).triggered.connect(function(){itemClicked("routeToNextPoints")}); + addItem(qsTr("Distance to next point")).triggered.connect(function(){itemClicked("distanceToNextPoint")}); + } + + var menu = addMenu(qsTr("Draw...")) + menu.addItem(qsTr("Image")).triggered.connect(function(){itemClicked("drawImage")}) + + if (currentMarker <= markersCount-2){ + menu.addItem(qsTr("Rectangle")).triggered.connect(function(){itemClicked("drawRectangle")}) + menu.addItem(qsTr("Circle")).triggered.connect(function(){itemClicked("drawCircle")}) + menu.addItem(qsTr("Polyline")).triggered.connect(function(){itemClicked("drawPolyline")}) + } + + if (currentMarker < markersCount-2){ + menu.addItem(qsTr("Polygon")).triggered.connect(function(){itemClicked("drawPolygonMenu")}) + } + } +} diff --git a/examples/location/mapviewer/resources/icon.png b/examples/location/mapviewer/resources/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..973a50091ada099b37b07d1456e54acb6e773650 GIT binary patch literal 1859 zcmah~cU05K8vRM=QkS;4qVA*lRNAuV>2py@qzVQE6_BFn%32UnkfkLAf)we9^aTZ} z(t|<>NE$5$f`k$XC6o{X0Rn^?ATQ`2yZ^m&?tJro_uiRr=A1caV(p=pveHMS0RWJ- zwlZ@N&h`gG5+sahiby^Hh*0fqubT@?Kmgn*zu`qTMhx6|^2z#H`+pJStNv(<0OD_m zR?|R&38LLH7=HmlG!Ma9Ac$rmZIDo$MJUc3fxiqRfWJe?BM1k8V=p5Jm*IG@P=ym9 z2cB=qfejD&ZieH8Bm{sc*f#VJkh7&U1A^{xsJ;6hSo&&?dR>CD&Uh%k!?0F+iauSuSU1q#dO%m zbX<$=aCp^uJ-+j1LYGrQmvds5OA_f;63I2?i+d{h&TI0WH1gfF?t2+Me`NMN$f7*V zqCCo`c<1yA@g%p`C-3XC{J!V;eSUBI{0pdm7WIb|55P(W;3b1$rGtpF!SM2-hz~=N z6||R?w5Up2bk%T7^>A$U@T;1UxZ08UI(j0Co`j+&*V9w#M^iqIrZ$YdL62vm$FrKo zvoI4mn2FrxiN9JHd7l~it&{IsCkwEXg}ABrxTzxiR1smigfLx7oGxvfE^nLp(8;Xo zWL9@EYe=)TUsxzItDemINSQ-Z*yvt%Q!g9SH~+bR0XwjO8(hE-afmcd8*QniMO-7zQf(% zuWs_!Hu=1*-SzF=&7Hk1{@yl!Z)bO(zqh};x4*Y9*cS){Zpj~vg|FJh-vR0f90G}n zOGrr{mQ_&vLH&rvvEx5$pE58$Yhr3*LWM-JA7fUE|_;E0D#)9&A`{435zu5ZDsI} z65Nj%v9_C>B{>-mbXH3lr*A96Q&u`$Q^QpT;qVq>iYg#bEymRDXF+9TFk{&rmhicGFLk?G`;aZ3NbsO62aSy)P0RKR0u=`D05Ji1d z^%hv6b1=LNbW559tDI<75)a+AM~3V@&%})}v;{4D3x2+jHJ9AAe?d~TmK*$8)4pp` zKITTq!;>P_);MqW4@S>()Z;~cPix8hx<=cRyO6XUQBR(NJ3BVjWCdGn}368Ut-izwpS~`X#V*M zXUm6RnveSCAnr4D!}{@@WAi09JZLAZb`<9&!OSCNnkswO0Ge-~&Ys?~dzED?xK*py z;Z3Q^JPN~C7mp{zITw2duM8JB1y2l>!B&jq){D+C;AY#J>n9+N|6zAGc+Q*F1w(7u zLA^+R(M0ov&bi2Axw_#lA;tU1RDH6 z&HJPwjL3~8QY$@CZ3aG!{qv+PmA(OVq^aXZDZE%d+du6>&85@#HI8;#GR5Q;Mw-BH`XaJL9yJC_V-*t% gdhjLiuUs-bd_{o9{h&Z=1{XL$eoD)0qRHcyZ`_I literal 0 HcmV?d00001 diff --git a/examples/location/mapviewer/resources/marker.png b/examples/location/mapviewer/resources/marker.png new file mode 100644 index 0000000000000000000000000000000000000000..2116dfdf51bfb8ac9556af035d598cf2c68c44e3 GIT binary patch literal 752 zcmVP001Be1^@s6=bY090008FNklP9F+g_dGL z7b4wOL~YbX6}NhC`Y^Yem;_BVH^=jjGv%gj-gDq^?<8~n@6OCQGh-NK7!h@__p?7@ zAHg%1%k{H&7`2$=I6)SB$ey9%mf^nW7pw@t0liA$uW3=@<{h$6c2acLUNScZ#1n1& zj{lW0thX!xPr(xr5KoZZd4{Yl+b9~?SDiKsYw4jl=ahsz49ascH$lOp{)gvA{a+7Rbz6(!?wYhMaEN_*&FvlTY+Qe#GeLd5Y`1f1;(W)TxhmI&f zGMmlT7dqEPnL5c-$rEwKC^iKt`y;L(O{LEFOX&6M`3tgeo|g$ok3Ur@d#&7y#A^h6 z?>^6`UFq7fPoGtQPnFzO*2?UlncYoA0W+aJ?(31K(tFo2L@iE#B&)%{`ZRITEx!AZ zU)hx!$Bv5w?bcmR&+YjDzHG#=UYFZb?pf8h$W$s-$07?*nr~~*-vC?M)D-<;udDUC zx(`a(n9X1Re>5i2b#_ic_8U43M<~(&X=?Gdk$OC$)?v`lX*}=K5dL}Zz8b-2L$~o) id-3sdrSb5U8~YFSpzHYmbwF4E0000PQ<|Z&(Z(QQpe}ECj@=zX;NfjIC%2Ts>e~;XMma*JYD@<);T3K0RYVMA4vcJ literal 0 HcmV?d00001 diff --git a/examples/location/mapviewer/resources/scale_end.png b/examples/location/mapviewer/resources/scale_end.png new file mode 100644 index 0000000000000000000000000000000000000000..94510b1258e33726e65d4d5f539b8dc1dea5c905 GIT binary patch literal 93 zcmeAS@N?(olHy`uVBq!ia0vp^OhC-W0V2~}Z=?b#6;Bt(5RU7~DID*U6A}^<1tu^B pAL2^zV(}^D?rhdzjZ-+uz+kqK@vYpot*Suv44$rjF6*2UngECF7V7{2 literal 0 HcmV?d00001 diff --git a/examples/location/minimal_map/doc/images/minimal_map.png b/examples/location/minimal_map/doc/images/minimal_map.png new file mode 100644 index 0000000000000000000000000000000000000000..73a16fd58664ce364bfaa6bbe8f8d5249075fed2 GIT binary patch literal 229975 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%0AAh$<02B?s@~i(32qE}8fA4uHI>pz&a)jUb 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ɉa7E-zho9Ypn+7!%X5HD$|VCi$i$ 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 W3&Vqoq~Xo=0X%K!$~tAe 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 +#include + +int main(int argc, char *argv[]) +{ + QGuiApplication app(argc, argv); + + QQmlApplicationEngine engine; + engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); + + return app.exec(); +} + diff --git a/examples/location/minimal_map/main.qml b/examples/location/minimal_map/main.qml new file mode 100644 index 0000000..285eb31 --- /dev/null +++ b/examples/location/minimal_map/main.qml @@ -0,0 +1,77 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.0 +import QtQuick.Window 2.14 +import QtLocation 5.6 +import QtPositioning 5.6 + +Window { + width: Qt.platform.os == "android" ? Screen.width : 512 + height: Qt.platform.os == "android" ? Screen.height : 512 + visible: true + + Plugin { + id: mapPlugin + name: "osm" // "mapboxgl", "esri", ... + // specify plugin parameters if necessary + // PluginParameter { + // name: + // value: + // } + } + + Map { + anchors.fill: parent + plugin: mapPlugin + center: QtPositioning.coordinate(59.91, 10.75) // Oslo + zoomLevel: 14 + } +} diff --git a/examples/location/minimal_map/minimal_map.pro b/examples/location/minimal_map/minimal_map.pro new file mode 100644 index 0000000..5c16525 --- /dev/null +++ b/examples/location/minimal_map/minimal_map.pro @@ -0,0 +1,10 @@ +TEMPLATE = app + +QT += location + +SOURCES += main.cpp + +RESOURCES += qml.qrc + +target.path = $$[QT_INSTALL_EXAMPLES]/location/minimal_map +INSTALLS += target diff --git a/examples/location/minimal_map/qml.qrc b/examples/location/minimal_map/qml.qrc new file mode 100644 index 0000000..0ff3892 --- /dev/null +++ b/examples/location/minimal_map/qml.qrc @@ -0,0 +1,6 @@ + + + main.qml + + + diff --git a/examples/location/places/doc/images/places.png b/examples/location/places/doc/images/places.png new file mode 100644 index 0000000000000000000000000000000000000000..c8ada27d9b6a612405a6563e54ad54f9d299f66c GIT binary patch literal 233430 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

{6XTt|rus=F80I_+zR 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%0D5oX*4utmgKy@`V1zRMD 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 0) + return place.location.address.text; + + return place.location.address.street; + } + + function categoryNames(categories) { + var result = ""; + + for (var i = 0; i < categories.length; ++i) { + if (result == "") { + result = categories[i].name; + } else { + result = result + ", " + categories[i].name; + } + } + + return result; + } + + function additonalInformation(place) { + var keys = place.extendedAttributes.keys(); + var result; + + for (var i = 0; i < keys.length; ++i) { + var label = place.extendedAttributes[keys[i]].label; + var text = place.extendedAttributes[keys[i]].text; + if (label) { + result += label + ": " + if (text) + result += text + result += "
" + } + } + + if (!result) + result = qsTr("No information") + + return result; + } + + editorialsButton.onClicked: showEditorials(place) + imagesButton.onClicked: showImages(place) + reviewsButton.onClicked: showReviews(place) + findSimilarButton.onClicked: searchForSimilar(place) + + Component.onCompleted: { + placeName.text = place ? (place.favorite ? place.favorite.name : place.name) : "" + placeIcon.source = place ? (place.favorite ? place.favorite.icon.url(Qt.size(40,40)) + : place.icon.url() == "" ? + "../resources/marker.png" + : place.icon.url(Qt.size(40,40))) : "" + ratingView.rating = (place && place.ratings) ? place.ratings.average : 0 + distance.text = Helper.formatDistance(distanceToPlace) + address.text = placeAddress(place) + categories.text = place ? categoryNames(place.categories) : "" + phone.text = place ? place.primaryPhone : "" + fax.text = place ? place.primaryFax : "" + email.text = place ? place.primaryEmail : "" + website.text = place ? '
' + place.primaryWebsite + '' : "" + addInformation.text = place ? additonalInformation(place) : "" + if (place) { + editorialsButton.enabled = Qt.binding(function(){ return place && place.editorialModel.totalCount > 0 }) + reviewsButton.enabled = Qt.binding(function(){ return place && place.reviewModel.totalCount > 0 }) + imagesButton.enabled = Qt.binding(function(){ return place && place.imageModel.totalCount > 0 }) + findSimilarButton.enabled = true + } + } +} + diff --git a/examples/location/places/forms/PlaceDetailsForm.ui.qml b/examples/location/places/forms/PlaceDetailsForm.ui.qml new file mode 100644 index 0000000..ad87ea7 --- /dev/null +++ b/examples/location/places/forms/PlaceDetailsForm.ui.qml @@ -0,0 +1,295 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.5 +import QtQuick.Controls 1.4 +import QtQuick.Layouts 1.2 +import "../views" + +Item { + id: root + property alias placeName: placeName + property alias placeIcon: placeIcon + property alias distance: distance + property alias address: address + property alias categories: categories + property alias phone: phone + property alias fax: fax + property alias email: email + property alias website: website + property alias addInformation: addInformation + property alias editorialsButton: editorialsButton + property alias reviewsButton: reviewsButton + property alias imagesButton: imagesButton + property alias findSimilarButton: findSimilarButton + property alias ratingView: ratingView + width: parent.width + height: parent.height + + ScrollView { + id:scrollView + flickableItem.interactive: true + anchors.fill: parent + anchors.margins: 15 + + GridLayout { + width: scrollView.width - 15 + rows: 7 + columns: 2 + + RowLayout { + Layout.columnSpan: 2 + Layout.fillWidth: true + + Image { + id: placeIcon + source: "../resources/marker.png" + anchors.margins: 30 + } + + Label { + id: placeName + text: qsTr("PlaceName") + font.bold: true + } + + Item { + Layout.fillWidth: true + } + } + + RatingView { + id: ratingView + size: placeName.height * 2 + Layout.columnSpan: 2 + } + + Rectangle { + anchors.left: parent.left + anchors.right: parent.right + Layout.columnSpan: 2 + height: 1 + color: "#46a2da" + visible: addressBox.visible + } + + GroupBox { + id: addressBox + Layout.fillWidth: true + Layout.columnSpan: 2 + flat: true + title: qsTr("Address") + + GridLayout { + id: gridLayout3 + rowSpacing: 10 + rows: 1 + columns: 2 + anchors.fill: parent + + Label { + text: qsTr("Distance:") + } + + Label { + id: distance + Layout.fillWidth: true + text: qsTr("1000 km") + } + + Label { + id: address + Layout.columnSpan: 2 + text: qsTr("Street Number
xxxxx City
Country") + } + } + } + + Rectangle { + anchors.left: parent.left + anchors.right: parent.right + Layout.columnSpan: 2 + height: 1 + color: "#46a2da" + visible: categoriesBox.visible + } + + GroupBox { + id: categoriesBox + Layout.fillWidth: true + Layout.columnSpan: 2 + flat: true + title: qsTr("Categories") + + Label { + id: categories + anchors.fill: parent + text: qsTr("category1, category2 ,category3") + } + } + + Rectangle { + anchors.left: parent.left + anchors.right: parent.right + height: 1 + color: "#46a2da" + visible: contactDetailsBox.visible + } + + GroupBox { + id: contactDetailsBox + Layout.fillWidth: true + Layout.columnSpan: 2 + flat: true + title: qsTr("Contact details") + GridLayout { + id: gridLayout4 + rowSpacing: 10 + rows: 1 + columns: 2 + anchors.fill: parent + + Label { + text: qsTr("Phone: ") + } + + Label { + id: phone + Layout.fillWidth: true + text: qsTr("000-000-000") + } + + Label { + text: qsTr("Fax: ") + } + + Label { + id: fax + Layout.fillWidth: true + text: qsTr("000-000-000") + } + + Label { + text: qsTr("Email: ") + } + + Label { + id: email + Layout.fillWidth: true + text: qsTr("name@company.com") + } + + Label { + text: qsTr("Website: ") + } + + Label { + id: website + Layout.fillWidth: true + text: qsTr("http:://company.com") + } + } + } + + Rectangle { + Layout.columnSpan: 2 + anchors.left: parent.left + anchors.right: parent.right + height: 1 + color: "#46a2da" + visible: informationBox.visible + } + + GroupBox { + id: informationBox + Layout.fillWidth: true + Layout.columnSpan: 2 + flat: true + title: qsTr("Additional information") + ColumnLayout { + Label { + id: addInformation + text: qsTr("AdditionalInformation1
AdditionalInformation2
AdditionalInformation3") + } + } + } + + RowLayout { + Layout.columnSpan: 2 + Layout.alignment: Qt.AlignHCenter + + Button { + id: editorialsButton + text: qsTr("Editorials") + enabled: false + } + + Button { + id: reviewsButton + text: qsTr("Reviews") + enabled: false + } + + Button { + id: imagesButton + text: qsTr("Images") + enabled: false + } + + Button { + id: findSimilarButton + text: qsTr("Find similar") + enabled: false + } + } + } + } +} + diff --git a/examples/location/places/forms/SearchBoundingBox.qml b/examples/location/places/forms/SearchBoundingBox.qml new file mode 100644 index 0000000..81f5fd2 --- /dev/null +++ b/examples/location/places/forms/SearchBoundingBox.qml @@ -0,0 +1,81 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.5 +import QtPositioning 5.5 + +SearchBoundingBoxForm { + property variant searchRegion + signal changeSearchBoundingBox(variant coordinate, real widthDeg, real heightDeg) + signal closeForm() + + goButton.onClicked: { + var coordinate = QtPositioning.coordinate(parseFloat(latitude.text), + parseFloat(longitude.text)); + if (coordinate.isValid) + changeSearchBoundingBox(coordinate,parseFloat(widthDeg.text),parseFloat(heightDeg.text)) + } + + clearButton.onClicked: { + latitude.text = "" + longitude.text = "" + widthDeg.text = "" + heightDeg.text = "" + } + + cancelButton.onClicked: closeForm() + + Component.onCompleted: { + latitude.text = "" + searchRegion.center.latitude + longitude.text = "" + searchRegion.center.longitude + widthDeg.text = searchRegion.width ? "" + searchRegion.width : "0.0" + heightDeg.text = searchRegion.height ? "" + searchRegion.height: "0.0" + } +} diff --git a/examples/location/places/forms/SearchBoundingBoxForm.ui.qml b/examples/location/places/forms/SearchBoundingBoxForm.ui.qml new file mode 100644 index 0000000..75180f6 --- /dev/null +++ b/examples/location/places/forms/SearchBoundingBoxForm.ui.qml @@ -0,0 +1,173 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.5 +import QtQuick.Controls 1.4 +import QtQuick.Layouts 1.2 + +Item { + property alias clearButton: clearButton + property alias goButton: goButton + property alias longitude: longitude + property alias latitude: latitude + property alias widthDeg: widthDeg + property alias heightDeg: heightDeg + property alias cancelButton: cancelButton + property alias tabTitle: tabTitle + Rectangle { + id: tabRectangle + y: 20 + height: tabTitle.height * 2 + color: "#46a2da" + anchors.rightMargin: 0 + anchors.leftMargin: 0 + anchors.left: parent.left + anchors.right: parent.right + + Label { + id: tabTitle + color: "#ffffff" + text: qsTr("Search Bounding Box") + anchors.verticalCenter: parent.verticalCenter + anchors.horizontalCenter: parent.horizontalCenter + } + } + + Item { + id: item2 + anchors.rightMargin: 20 + anchors.leftMargin: 20 + anchors.bottomMargin: 20 + anchors.topMargin: 20 + anchors.bottom: parent.bottom + anchors.left: parent.left + anchors.right: parent.right + anchors.top: tabRectangle.bottom + + GridLayout { + id: gridLayout3 + anchors.rightMargin: 0 + anchors.bottomMargin: 0 + anchors.leftMargin: 0 + anchors.topMargin: 0 + rowSpacing: 10 + rows: 1 + columns: 2 + anchors.fill: parent + + Label { + id: label2 + text: qsTr("Latitude") + } + + TextField { + id: latitude + Layout.fillWidth: true + } + + Label { + id: label3 + text: qsTr("Longitude") + } + + TextField { + id: longitude + Layout.fillWidth: true + placeholderText: qsTr("") + } + + Label { + id: label4 + text: qsTr("Width (deg)") + } + + TextField { + id: widthDeg + Layout.fillWidth: true + } + + Label { + id: label5 + text: qsTr("Height (deg)") + } + + TextField { + id: heightDeg + Layout.fillWidth: true + placeholderText: qsTr("") + } + + RowLayout { + id: rowLayout1 + Layout.columnSpan: 2 + Layout.alignment: Qt.AlignRight + + Button { + id: goButton + text: qsTr("Set") + } + + Button { + id: clearButton + text: qsTr("Clear") + } + + Button { + id: cancelButton + text: qsTr("Cancel") + } + } + Item { + Layout.fillHeight: true + Layout.columnSpan: 2 + } + } + } +} diff --git a/examples/location/places/forms/SearchBoundingCircle.qml b/examples/location/places/forms/SearchBoundingCircle.qml new file mode 100644 index 0000000..e8337b4 --- /dev/null +++ b/examples/location/places/forms/SearchBoundingCircle.qml @@ -0,0 +1,79 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.5 +import QtPositioning 5.5 + +SearchBoundingCircleForm { + property variant searchRegion + signal changeSearchBoundingCircle(variant coordinate, real radius) + signal closeForm() + + goButton.onClicked: { + var coordinate = QtPositioning.coordinate(parseFloat(latitude.text), + parseFloat(longitude.text)); + if (coordinate.isValid) + changeSearchBoundingCircle(coordinate,parseFloat(radius.text)) + } + + clearButton.onClicked: { + latitude.text = "" + longitude.text = "" + radius.text = "" + } + + cancelButton.onClicked: closeForm() + + Component.onCompleted: { + latitude.text = "" + searchRegion.center.latitude + longitude.text = "" + searchRegion.center.longitude + radius.text = searchRegion.radius ? "" + searchRegion.radius : "0.0" + } +} diff --git a/examples/location/places/forms/SearchBoundingCircleForm.ui.qml b/examples/location/places/forms/SearchBoundingCircleForm.ui.qml new file mode 100644 index 0000000..b31d899 --- /dev/null +++ b/examples/location/places/forms/SearchBoundingCircleForm.ui.qml @@ -0,0 +1,161 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.5 +import QtQuick.Controls 1.4 +import QtQuick.Layouts 1.2 + +Item { + property alias clearButton: clearButton + property alias goButton: goButton + property alias longitude: longitude + property alias latitude: latitude + property alias radius: radius + property alias cancelButton: cancelButton + property alias tabTitle: tabTitle + Rectangle { + id: tabRectangle + y: 20 + height: tabTitle.height * 2 + color: "#46a2da" + anchors.rightMargin: 0 + anchors.leftMargin: 0 + anchors.left: parent.left + anchors.right: parent.right + + Label { + id: tabTitle + color: "#ffffff" + text: qsTr("Search Bounding Circle") + anchors.verticalCenter: parent.verticalCenter + anchors.horizontalCenter: parent.horizontalCenter + } + } + + Item { + id: item2 + anchors.rightMargin: 20 + anchors.leftMargin: 20 + anchors.bottomMargin: 20 + anchors.topMargin: 20 + anchors.bottom: parent.bottom + anchors.left: parent.left + anchors.right: parent.right + anchors.top: tabRectangle.bottom + + GridLayout { + id: gridLayout3 + anchors.rightMargin: 0 + anchors.bottomMargin: 0 + anchors.leftMargin: 0 + anchors.topMargin: 0 + rowSpacing: 10 + rows: 1 + columns: 2 + anchors.fill: parent + + Label { + id: label2 + text: qsTr("Latitude") + } + + TextField { + id: latitude + Layout.fillWidth: true + } + + Label { + id: label3 + text: qsTr("Longitude") + } + + TextField { + id: longitude + Layout.fillWidth: true + placeholderText: qsTr("") + } + + Label { + id: label4 + text: qsTr("Radius (m)") + } + + TextField { + id: radius + Layout.fillWidth: true + } + + RowLayout { + id: rowLayout1 + Layout.columnSpan: 2 + Layout.alignment: Qt.AlignRight + + Button { + id: goButton + text: qsTr("Set") + } + + Button { + id: clearButton + text: qsTr("Clear") + } + + Button { + id: cancelButton + text: qsTr("Cancel") + } + } + Item { + Layout.fillHeight: true + Layout.columnSpan: 2 + } + } + } +} diff --git a/examples/location/places/forms/SearchCenter.qml b/examples/location/places/forms/SearchCenter.qml new file mode 100644 index 0000000..d1d82a3 --- /dev/null +++ b/examples/location/places/forms/SearchCenter.qml @@ -0,0 +1,80 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.5 +import QtPositioning 5.5 + +SearchCenterForm { + property string title; + property variant coordinate + signal changeSearchCenter(variant coordinate) + signal closeForm() + + goButton.onClicked: { + var coordinate = QtPositioning.coordinate(parseFloat(latitude.text), + parseFloat(longitude.text)); + if (coordinate.isValid) + changeSearchCenter(coordinate) + } + + clearButton.onClicked: { + latitude.text = "" + longitude.text = "" + } + + cancelButton.onClicked: closeForm() + + Component.onCompleted: { + latitude.text = "" + coordinate.latitude + longitude.text = "" + coordinate.longitude + if (title.length != 0) + tabTitle.text = title; + } +} diff --git a/examples/location/places/forms/SearchCenterForm.ui.qml b/examples/location/places/forms/SearchCenterForm.ui.qml new file mode 100644 index 0000000..df29acc --- /dev/null +++ b/examples/location/places/forms/SearchCenterForm.ui.qml @@ -0,0 +1,150 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.5 +import QtQuick.Controls 1.4 +import QtQuick.Layouts 1.2 + +Item { + property alias clearButton: clearButton + property alias goButton: goButton + property alias longitude: longitude + property alias latitude: latitude + property alias cancelButton: cancelButton + property alias tabTitle: tabTitle + Rectangle { + id: tabRectangle + y: 20 + height: tabTitle.height * 2 + color: "#46a2da" + anchors.rightMargin: 0 + anchors.leftMargin: 0 + anchors.left: parent.left + anchors.right: parent.right + + Label { + id: tabTitle + color: "#ffffff" + text: qsTr("Search Center") + anchors.verticalCenter: parent.verticalCenter + anchors.horizontalCenter: parent.horizontalCenter + } + } + + Item { + id: item2 + anchors.rightMargin: 20 + anchors.leftMargin: 20 + anchors.bottomMargin: 20 + anchors.topMargin: 20 + anchors.bottom: parent.bottom + anchors.left: parent.left + anchors.right: parent.right + anchors.top: tabRectangle.bottom + + GridLayout { + id: gridLayout3 + anchors.rightMargin: 0 + anchors.bottomMargin: 0 + anchors.leftMargin: 0 + anchors.topMargin: 0 + rowSpacing: 10 + rows: 1 + columns: 2 + anchors.fill: parent + + Label { + id: label2 + text: qsTr("Latitude") + } + + TextField { + id: latitude + Layout.fillWidth: true + } + + Label { + id: label3 + text: qsTr("Longitude") + } + + TextField { + id: longitude + Layout.fillWidth: true + placeholderText: qsTr("") + } + + RowLayout { + id: rowLayout1 + Layout.columnSpan: 2 + Layout.alignment: Qt.AlignRight + + Button { + id: goButton + text: qsTr("Set") + } + + Button { + id: clearButton + text: qsTr("Clear") + } + + Button { + id: cancelButton + text: qsTr("Cancel") + } + } + Item { + Layout.fillHeight: true + Layout.columnSpan: 2 + } + } + } +} diff --git a/examples/location/places/forms/SearchOptions.qml b/examples/location/places/forms/SearchOptions.qml new file mode 100644 index 0000000..fe64f15 --- /dev/null +++ b/examples/location/places/forms/SearchOptions.qml @@ -0,0 +1,88 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.5 +import QtLocation 5.6 +import QtPositioning 5.5 + +SearchOptionsForm { + id: root + property Plugin plugin + property PlaceSearchModel model + + signal changeSearchSettings(bool orderByDistance, + bool orderByName, + string locales) + signal closeForm() + + setButton.onClicked: changeSearchSettings(distanceOrderButton.checked, + nameOrderButton.checked, + locales.text) + + clearButton.onClicked: { + locales.text = "" + distanceOrderButton.checked = false + nameOrderButton.checked = false + } + + cancelButton.onClicked: { + closeForm() + } + + Component.onCompleted: { + locales.visible = root.plugin != null && root.plugin.supportsPlaces(Plugin.LocalizedPlacesFeature); + favoritesButton.visible = false; +// favoritesButton.enabled = placeSearchModel.favoritesPlugin !== null) +// isFavoritesEnabled = true; + locales.text = root.plugin.locales.join(Qt.locale().groupSeparator); + distanceOrderButton.checked = model.relevanceHint == PlaceSearchModel.DistanceHint + nameOrderButton.checked = model.relevanceHint == PlaceSearchModel.LexicalPlaceNameHint + } +} diff --git a/examples/location/places/forms/SearchOptionsForm.ui.qml b/examples/location/places/forms/SearchOptionsForm.ui.qml new file mode 100644 index 0000000..a2df9f1 --- /dev/null +++ b/examples/location/places/forms/SearchOptionsForm.ui.qml @@ -0,0 +1,169 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.5 +import QtQuick.Controls 1.4 +import QtQuick.Layouts 1.2 + +Item { + property alias clearButton: clearButton + property alias setButton: setButton + property alias cancelButton: cancelButton + property alias tabTitle: tabTitle + property alias orderGroup: orderGroup + property alias distanceOrderButton: distanceOrderButton + property alias nameOrderButton: nameOrderButton + property alias favoritesButton: favoritesButton + property alias locales: locales + + Rectangle { + id: tabRectangle + y: 20 + height: tabTitle.height * 2 + color: "#46a2da" + anchors.rightMargin: 0 + anchors.leftMargin: 0 + anchors.left: parent.left + anchors.right: parent.right + + Label { + id: tabTitle + color: "#ffffff" + text: qsTr("Search Options") + anchors.verticalCenter: parent.verticalCenter + anchors.horizontalCenter: parent.horizontalCenter + } + } + + Item { + id: item2 + anchors.rightMargin: 20 + anchors.leftMargin: 20 + anchors.bottomMargin: 20 + anchors.topMargin: 20 + anchors.bottom: parent.bottom + anchors.left: parent.left + anchors.right: parent.right + anchors.top: tabRectangle.bottom + + GridLayout { + id: gridLayout3 + anchors.rightMargin: 0 + anchors.bottomMargin: 0 + anchors.leftMargin: 0 + anchors.topMargin: 0 + rowSpacing: 10 + rows: 1 + columns: 2 + anchors.fill: parent + + Label { + id: label + text: qsTr("Locale(s)") + visible: locales.visible + } + + TextField { + id: locales + Layout.fillWidth: true + placeholderText: qsTr("") + } + + RadioButton { + id: favoritesButton + text: qsTr("Enable favorites") + Layout.columnSpan: 2 + } + + ExclusiveGroup { id: orderGroup } + RadioButton { + id: distanceOrderButton + text: qsTr("Order by distance") + exclusiveGroup: orderGroup + Layout.columnSpan: 2 + } + + RadioButton { + id: nameOrderButton + text: qsTr("Order by name") + exclusiveGroup: orderGroup + Layout.columnSpan: 2 + } + + RowLayout { + id: rowLayout1 + Layout.columnSpan: 2 + Layout.alignment: Qt.AlignRight + + Button { + id: setButton + text: qsTr("Set") + } + + Button { + id: clearButton + text: qsTr("Clear") + } + + Button { + id: cancelButton + text: qsTr("Cancel") + } + } + + Item { + Layout.fillHeight: true + Layout.columnSpan: 2 + } + + + } + } +} diff --git a/examples/location/places/helper.js b/examples/location/places/helper.js new file mode 100644 index 0000000..0e8851c --- /dev/null +++ b/examples/location/places/helper.js @@ -0,0 +1,63 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +.pragma library + +function formatDistance(distance) +{ + if (distance < 1000) + return distance.toFixed(0) + " m"; + + var km = distance/1000; + if (km < 10) + return km.toFixed(1) + " km"; + + return km.toFixed(0) + " km"; +} diff --git a/examples/location/places/items/MainMenu.qml b/examples/location/places/items/MainMenu.qml new file mode 100644 index 0000000..3e6ff0e --- /dev/null +++ b/examples/location/places/items/MainMenu.qml @@ -0,0 +1,101 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.5 +import QtQuick.Controls 1.4 +import QtLocation 5.6 + +MenuBar { + property variant providerMenu: providerMenu + property variant settingsMenu: settingsMenu + + signal selectProvider(string providerName) + signal selectSetting(string setting); + + + + Menu { + id: providerMenu + title: qsTr("Provider") + + function createMenu(plugins) + { + clear() + for (var i = 0; i < plugins.length; i++) { + createProviderMenuItem(plugins[i]); + } + } + + function createProviderMenuItem(provider) + { + var item = addItem(provider); + item.checkable = true; + item.triggered.connect(function(){selectProvider(provider)}) + } + } + + Menu { + id: settingsMenu + title: qsTr("Settings") + + function createMenu(map) + { + clear() + var item = addItem(qsTr("Search Center")); + item.triggered.connect(function(){selectSetting("searchCenter")}) + item = addItem(qsTr("Search Bounding Box")); + item.triggered.connect(function(){selectSetting("searchBoundingBox")}) + item = addItem(qsTr("Search Bounding Circle")); + item.triggered.connect(function(){selectSetting("searchBoundingCircle")}) + item = addItem(qsTr("Search Options")); + item.triggered.connect(function(){selectSetting("SearchOptions")}) + } + } +} diff --git a/examples/location/places/items/MapComponent.qml b/examples/location/places/items/MapComponent.qml new file mode 100644 index 0000000..baa43a2 --- /dev/null +++ b/examples/location/places/items/MapComponent.qml @@ -0,0 +1,224 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.5 +import QtQuick.Controls 1.4 +import QtPositioning 5.5 +import QtLocation 5.6 +import "../helper.js" as Helper + +Map { + id: map + property bool followme: false + property variant scaleLengths: [5, 10, 20, 50, 100, 200, 500, 1000, 2000, 5000, 10000, 20000, 50000, 100000, 200000, 500000, 1000000, 2000000] + + function calculateScale() + { + var coord1, coord2, dist, text, f + f = 0 + coord1 = map.toCoordinate(Qt.point(0,scale.y)) + coord2 = map.toCoordinate(Qt.point(0+scaleImage.sourceSize.width,scale.y)) + dist = Math.round(coord1.distanceTo(coord2)) + + if (dist === 0) { + // not visible + } else { + for (var i = 0; i < scaleLengths.length-1; i++) { + if (dist < (scaleLengths[i] + scaleLengths[i+1]) / 2 ) { + f = scaleLengths[i] / dist + dist = scaleLengths[i] + break; + } + } + if (f === 0) { + f = dist / scaleLengths[i] + dist = scaleLengths[i] + } + } + + text = Helper.formatDistance(dist) + scaleImage.width = (scaleImage.sourceSize.width * f) - 2 * scaleImageLeft.sourceSize.width + scaleText.text = text + } + + center { + // The Qt Company in Oslo + latitude: 59.9485 + longitude: 10.7686 + } + + gesture.flickDeceleration: 3000 + gesture.enabled: true + onCopyrightLinkActivated: Qt.openUrlExternally(link) + + onCenterChanged:{ + scaleTimer.restart() + if (map.followme) + if (map.center != positionSource.position.coordinate) map.followme = false + } + + onZoomLevelChanged:{ + scaleTimer.restart() + if (map.followme) map.center = positionSource.position.coordinate + } + + onWidthChanged:{ + scaleTimer.restart() + } + + onHeightChanged:{ + scaleTimer.restart() + } + + Keys.onPressed: { + if (event.key === Qt.Key_Plus) { + map.zoomLevel++ + } else if (event.key === Qt.Key_Minus) { + map.zoomLevel-- + } + } + + Timer { + id: scaleTimer + interval: 100 + running: false + repeat: false + onTriggered: { + map.calculateScale() + } + } + + Item { + id: scale + visible: scaleText.text != "0 m" + z: map.z + 3 + anchors.bottom: parent.bottom + anchors.right: parent.right + anchors.margins: 20 + height: scaleText.height * 2 + width: scaleImage.width + + Image { + id: scaleImageLeft + source: "../../resources/scale_end.png" + anchors.bottom: parent.bottom + anchors.right: scaleImage.left + } + Image { + id: scaleImage + source: "../../resources/scale.png" + anchors.bottom: parent.bottom + anchors.right: scaleImageRight.left + } + Image { + id: scaleImageRight + source: "../../resources/scale_end.png" + anchors.bottom: parent.bottom + anchors.right: parent.right + } + Label { + id: scaleText + color: "#004EAE" + anchors.centerIn: parent + text: "0 m" + } + Component.onCompleted: { + map.calculateScale(); + } + } + + MapQuickItem { + id: poiTheQtComapny + sourceItem: Rectangle { width: 14; height: 14; color: "#e41e25"; border.width: 2; border.color: "white"; smooth: true; radius: 7 } + coordinate { + latitude: 59.9485 + longitude: 10.7686 + } + opacity:1.0 + anchorPoint: Qt.point(sourceItem.width/2, sourceItem.height/2) + } + + MapQuickItem { + sourceItem: Text{ + text: "The Qt Company" + color:"#242424" + font.bold: true + styleColor: "#ECECEC" + style: Text.Outline + } + coordinate: poiTheQtComapny.coordinate + anchorPoint: Qt.point(-poiTheQtComapny.sourceItem.width * 0.5,poiTheQtComapny.sourceItem.height * 1.5) + } + + PositionSource{ + id: positionSource + active: followme + + onPositionChanged: { + map.center = positionSource.position.coordinate + } + } + + Slider { + id: zoomSlider; + z: map.z + 3 + minimumValue: map.minimumZoomLevel; + maximumValue: map.maximumZoomLevel; + anchors.margins: 10 + anchors.bottom: scale.top + anchors.top: parent.top + anchors.right: parent.right + orientation : Qt.Vertical + value: map.zoomLevel + onValueChanged: { + map.zoomLevel = value + } + } +} diff --git a/examples/location/places/items/SearchBar.qml b/examples/location/places/items/SearchBar.qml new file mode 100644 index 0000000..e5f1998 --- /dev/null +++ b/examples/location/places/items/SearchBar.qml @@ -0,0 +1,132 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.5 +import QtQuick.Controls 1.4 +import QtQuick.Layouts 1.2 + +ToolBar { + + property bool busyIndicatorRunning : false + property bool searchBarVisbile: true + + signal doSearch(string searchText) + signal searchTextChanged(string searchText) + signal showCategories() + signal goBack() + signal showMap() + + onSearchBarVisbileChanged: { + searchBar.opacity = searchBarVisbile ? 1 : 0 + backBar.opacity = searchBarVisbile ? 0 : 1 + } + + function showSearch(text) { + if (text != null) { + searchText.ignoreTextChange = true + searchText.text = text + searchText.ignoreTextChange = false + } + } + + RowLayout { + id: searchBar + width: parent.width + height: parent.height + Behavior on opacity { NumberAnimation{} } + visible: opacity ? true : false + TextField { + id: searchText + Behavior on opacity { NumberAnimation{} } + visible: opacity ? true : false + property bool ignoreTextChange: false + placeholderText: qsTr("Type place...") + Layout.fillWidth: true + onTextChanged: { + if (!ignoreTextChange) + searchTextChanged(text) + } + onAccepted: doSearch(searchText.text) + } + ToolButton { + id: searchButton + iconSource: "../../resources/search.png" + onClicked: doSearch(searchText.text) + } + ToolButton { + id: categoryButton + iconSource: "../../resources/categories.png" + onClicked: showCategories() + } + } + + RowLayout { + id: backBar + width: parent.width + height: parent.height + opacity: 0 + Behavior on opacity { NumberAnimation{} } + visible: opacity ? true : false + ToolButton { + id: backButton + iconSource: "../../resources/left.png" + onClicked: goBack() + } + ToolButton { + id: mapButton + iconSource: "../../resources/search.png" + onClicked: showMap() + } + Item { + Layout.fillWidth: true + } + } +} + diff --git a/examples/location/places/main.cpp b/examples/location/places/main.cpp new file mode 100644 index 0000000..69d31ae --- /dev/null +++ b/examples/location/places/main.cpp @@ -0,0 +1,136 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include +#include +#include +#include +#include + +static bool parseArgs(QStringList& args, QVariantMap& parameters) +{ + + while (!args.isEmpty()) { + + QString param = args.takeFirst(); + + if (param.startsWith("--help")) { + QTextStream out(stdout); + out << "Usage: " << Qt::endl; + out << "--plugin. - Sets parameter = value for plugin" << Qt::endl; + out.flush(); + return true; + } + + if (param.startsWith("--plugin.")) { + + param.remove(0, 9); + + if (args.isEmpty() || args.first().startsWith("--")) { + parameters[param] = true; + } else { + + QString value = args.takeFirst(); + + if (value == "true" || value == "on" || value == "enabled") { + parameters[param] = true; + } else if (value == "false" || value == "off" + || value == "disable") { + parameters[param] = false; + } else { + parameters[param] = value; + } + } + } + } + return false; +} + +int main(int argc, char *argv[]) +{ + QGuiApplication application(argc, argv); + + QVariantMap parameters; + QStringList args(QCoreApplication::arguments()); + + // Fetch tokens from the environment, if present + const QByteArray mapboxMapID = qgetenv("MAPBOX_MAP_ID"); + const QByteArray mapboxAccessToken = qgetenv("MAPBOX_ACCESS_TOKEN"); + const QByteArray hereAppID = qgetenv("HERE_APP_ID"); + const QByteArray hereToken = qgetenv("HERE_TOKEN"); + const QByteArray esriToken = qgetenv("ESRI_TOKEN"); + + if (!mapboxMapID.isEmpty()) + parameters["mapbox.map_id"] = QString::fromLocal8Bit(mapboxMapID); + if (!mapboxAccessToken.isEmpty()) + parameters["mapbox.access_token"] = QString::fromLocal8Bit(mapboxAccessToken); + if (!hereAppID.isEmpty()) + parameters["here.app_id"] = QString::fromLocal8Bit(hereAppID); + if (!hereToken.isEmpty()) + parameters["here.token"] = QString::fromLocal8Bit(hereToken); + if (!esriToken.isEmpty()) + parameters["esri.token"] = QString::fromLocal8Bit(esriToken); + + if (parseArgs(args, parameters)) + return 0; + + QQmlApplicationEngine engine; + engine.addImportPath(QStringLiteral(":/imports")); + engine.load(QUrl(QStringLiteral("qrc:///places.qml"))); + QObject::connect(&engine, SIGNAL(quit()), qApp, SLOT(quit())); + + QObject *item = engine.rootObjects().first(); + Q_ASSERT(item); + + QMetaObject::invokeMethod(item, "initializeProviders", + Q_ARG(QVariant, QVariant::fromValue(parameters))); + + return application.exec(); +} diff --git a/examples/location/places/places.pro b/examples/location/places/places.pro new file mode 100644 index 0000000..baeef40 --- /dev/null +++ b/examples/location/places/places.pro @@ -0,0 +1,44 @@ +TARGET = qml_location_places +TEMPLATE = app + +QT += qml quick network positioning location +SOURCES += main.cpp + +RESOURCES += \ + places.qrc + +OTHER_FILES += \ + places.qml \ + helper.js \ + items/MainMenu.qml \ + items/SearchBar.qml \ + items/MapComponent.qml \ + forms/Message.qml \ + forms/MessageForm.ui.qml \ + forms/SearchCenter.qml \ + forms/SearchCenterForm.ui.qml \ + forms/SearchBoundingBox.qml \ + forms/SearchBoundingBoxForm.ui.qml \ + forms/SearchBoundingCircle.qml \ + forms/SearchBoundingCircleForm.ui.qml \ + forms/PlaceDetails.qml \ + forms/PlaceDetailsForm.ui.qml \ + forms/SearchOptions.qml \ + forms/SearchOptionsForm.ui.qml \ + views/SuggestionView.qml \ + views/RatingView.qml \ + views/CategoryView.qml \ + views/CategoryDelegate.qml \ + views/SearchResultDelegate.qml \ + views/SearchResultView.qml \ + views/EditorialView.qml \ + views/EditorialDelegate.qml \ + views/EditorialPage.qml \ + views/ReviewView.qml \ + views/ReviewDelegate.qml \ + views/ReviewPage.qml \ + views/ImageView.qml + +target.path = $$[QT_INSTALL_EXAMPLES]/location/places +INSTALLS += target + diff --git a/examples/location/places/places.qml b/examples/location/places/places.qml new file mode 100644 index 0000000..a511f0e --- /dev/null +++ b/examples/location/places/places.qml @@ -0,0 +1,507 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.5 +import QtQuick.Controls 1.4 +import QtQuick.Layouts 1.2 +import QtPositioning 5.5 +import QtLocation 5.6 +import "items" + +ApplicationWindow { + id: appWindow + property Map map + property variant parameters + property variant searchLocation: map ? map.center : QtPositioning.coordinate() + property variant searchRegion: QtPositioning.circle(searchLocation) + property variant searchRegionItem + + property Plugin favoritesPlugin + + function getPlugins() { + var plugin = Qt.createQmlObject('import QtLocation 5.3; Plugin {}', appWindow); + var myArray = new Array; + for (var i = 0; i < plugin.availableServiceProviders.length; i++) { + var tempPlugin = Qt.createQmlObject ('import QtLocation 5.3; Plugin {name: "' + plugin.availableServiceProviders[i]+ '"}', appWindow) + + if (tempPlugin.supportsPlaces() && tempPlugin.supportsMapping() ) + myArray.push(tempPlugin.name) + } + myArray.sort() + return myArray; + } + + function initializeProviders(pluginParameters) + { + var parameters = new Array() + for (var prop in pluginParameters) { + var parameter = Qt.createQmlObject('import QtLocation 5.3; PluginParameter{ name: "'+ prop + '"; value: "' + pluginParameters[prop]+'"}',appWindow) + parameters.push(parameter) + } + appWindow.parameters = parameters + var plugins = getPlugins() + mainMenu.providerMenu.createMenu(plugins) + for (var i = 0; i0) + plugin = Qt.createQmlObject ('import QtLocation 5.3; Plugin{ name:"' + provider + '"; parameters: appWindow.parameters}', appWindow) + else + plugin = Qt.createQmlObject ('import QtLocation 5.3; Plugin{ name:"' + provider + '"}', appWindow) + + if (map) + map.destroy(); + map = mapComponent.createObject(page); + map.plugin = plugin; + map.zoomLevel = (map.maximumZoomLevel - map.minimumZoomLevel)/2 + categoryModel.plugin = plugin; + categoryModel.update(); + placeSearchModel.plugin = plugin; + suggestionModel.plugin = plugin; + } + + title: qsTr("Places") + width: 360 + height: 640 + visible: true + menuBar: mainMenu + toolBar: searchBar + + MainMenu { + id: mainMenu + onSelectProvider: { + stackView.pop(page) + for (var i = 0; i < providerMenu.items.length; i++) { + providerMenu.items[i].checked = providerMenu.items[i].text === providerName + } + + createMap(providerName) + if (map.error === Map.NoError) { + settingsMenu.createMenu(map); + } else { + settingsMenu.clear(); + } + } + onSelectSetting: { + stackView.pop({tem:page,immediate: true}) + switch (setting) { + case "searchCenter": + stackView.push({ item: Qt.resolvedUrl("forms/SearchCenter.qml") , + properties: { "coordinate": map.center}}) + stackView.currentItem.changeSearchCenter.connect(stackView.changeSearchCenter) + stackView.currentItem.closeForm.connect(stackView.closeForm) + break + case "searchBoundingBox": + stackView.push({ item: Qt.resolvedUrl("forms/SearchBoundingBox.qml") , + properties: { "searchRegion": searchRegion}}) + stackView.currentItem.changeSearchBoundingBox.connect(stackView.changeSearchBoundingBox) + stackView.currentItem.closeForm.connect(stackView.closeForm) + break + case "searchBoundingCircle": + stackView.push({ item: Qt.resolvedUrl("forms/SearchBoundingCircle.qml") , + properties: { "searchRegion": searchRegion}}) + stackView.currentItem.changeSearchBoundingCircle.connect(stackView.changeSearchBoundingCircle) + stackView.currentItem.closeForm.connect(stackView.closeForm) + break + case "SearchOptions": + stackView.push({ item: Qt.resolvedUrl("forms/SearchOptions.qml") , + properties: { "plugin": map.plugin, + "model": placeSearchModel}}) + stackView.currentItem.changeSearchSettings.connect(stackView.changeSearchSettings) + stackView.currentItem.closeForm.connect(stackView.closeForm) + break + default: + console.log("Unsupported setting !") + } + } + } + + //! [PlaceSearchSuggestionModel search text changed 1] + SearchBar { + id: searchBar + //! [PlaceSearchSuggestionModel search text changed 1] + width: appWindow.width + searchBarVisbile: stackView.depth > 1 && + stackView.currentItem && + stackView.currentItem.objectName != "suggestionView" ? false : true + onShowCategories: { + if (map && map.plugin) { + stackView.pop({tem:page,immediate: true}) + stackView.enterCategory() + } + } + onGoBack: stackView.pop() + //! [PlaceSearchSuggestionModel search text changed 2] + onSearchTextChanged: { + if (searchText.length >= 3 && suggestionModel != null) { + suggestionModel.searchTerm = searchText; + suggestionModel.update(); + } + } + //! [PlaceSearchSuggestionModel search text changed 2] + onDoSearch: { + if (searchText.length > 0) + placeSearchModel.searchForText(searchText); + } + onShowMap: stackView.pop(page) + //! [PlaceSearchSuggestionModel search text changed 3] + } + //! [PlaceSearchSuggestionModel search text changed 3] + + StackView { + id: stackView + + function showMessage(title,message,backPage) + { + push({ item: Qt.resolvedUrl("forms/Message.qml") , + properties: { + "title" : title, + "message" : message, + "backPage" : backPage + }}) + currentItem.closeForm.connect(closeMessage) + } + + function closeMessage(backPage) + { + pop(backPage) + } + + function closeForm() + { + pop(page) + } + + function enterCategory(index) + { + push({ item: Qt.resolvedUrl("views/CategoryView.qml") , + properties: { "categoryModel": categoryModel, + "rootIndex" : index + }}) + currentItem.showSubcategories.connect(stackView.enterCategory) + currentItem.searchCategory.connect(placeSearchModel.searchForCategory) + } + + function showSuggestions() + { + if (currentItem.objectName != "suggestionView") { + stackView.pop(page) + push({ item: Qt.resolvedUrl("views/SuggestionView.qml") , + properties: { "suggestionModel": suggestionModel } + }) + currentItem.objectName = "suggestionView" + currentItem.suggestionSelected.connect(searchBar.showSearch) + currentItem.suggestionSelected.connect(placeSearchModel.searchForText) + } + } + + function showPlaces() + { + if (currentItem.objectName != "searchResultView") { + stackView.pop({tem:page,immediate: true}) + push({ item: Qt.resolvedUrl("views/SearchResultView.qml") , + properties: { "placeSearchModel": placeSearchModel } + }) + currentItem.showPlaceDetails.connect(showPlaceDatails) + currentItem.showMap.connect(searchBar.showMap) + currentItem.objectName = "searchResultView" + } + } + + function showPlaceDatails(place, distance) + { + push({ item: Qt.resolvedUrl("forms/PlaceDetails.qml") , + properties: { "place": place, + "distanceToPlace": distance } + }) + currentItem.searchForSimilar.connect(searchForSimilar) + currentItem.showReviews.connect(showReviews) + currentItem.showEditorials.connect(showEditorials) + currentItem.showImages.connect(showImages) + } + + function showEditorials(place) + { + push({ item: Qt.resolvedUrl("views/EditorialView.qml") , + properties: { "place": place } + }) + currentItem.showEditorial.connect(showEditorial) + } + + function showReviews(place) + { + push({ item: Qt.resolvedUrl("views/ReviewView.qml") , + properties: { "place": place } + }) + currentItem.showReview.connect(showReview) + } + + function showImages(place) + { + push({ item: Qt.resolvedUrl("views/ImageView.qml") , + properties: { "place": place } + }) + } + + function showEditorial(editorial) + { + push({ item: Qt.resolvedUrl("views/EditorialPage.qml") , + properties: { "editorial": editorial } + }) + } + + function showReview(review) + { + push({ item: Qt.resolvedUrl("views/ReviewPage.qml") , + properties: { "review": review } + }) + } + + function changeSearchCenter(coordinate) + { + stackView.pop(page) + map.center = coordinate; + if (searchRegionItem) { + map.removeMapItem(searchRegionItem); + searchRegionItem.destroy(); + } + } + + function changeSearchBoundingBox(coordinate,widthDeg,heightDeg) + { + stackView.pop(page) + map.center = coordinate + searchRegion = QtPositioning.rectangle(map.center, widthDeg, heightDeg) + if (searchRegionItem) { + map.removeMapItem(searchRegionItem); + searchRegionItem.destroy(); + } + searchRegionItem = Qt.createQmlObject('import QtLocation 5.3; MapRectangle { color: "#46a2da"; border.color: "#190a33"; border.width: 2; opacity: 0.25 }', page, "MapRectangle"); + searchRegionItem.topLeft = searchRegion.topLeft; + searchRegionItem.bottomRight = searchRegion.bottomRight; + map.addMapItem(searchRegionItem); + } + + function changeSearchBoundingCircle(coordinate,radius) + { + stackView.pop(page) + map.center = coordinate; + searchRegion = QtPositioning.circle(coordinate, radius) + + if (searchRegionItem) { + map.removeMapItem(searchRegionItem); + searchRegionItem.destroy(); + } + searchRegionItem = Qt.createQmlObject('import QtLocation 5.3; MapCircle { color: "#46a2da"; border.color: "#190a33"; border.width: 2; opacity: 0.25 }', page, "MapRectangle"); + searchRegionItem.center = searchRegion.center; + searchRegionItem.radius = searchRegion.radius; + map.addMapItem(searchRegionItem); + } + + function changeSearchSettings(orderByDistance, orderByName, locales) + { + stackView.pop(page) + /*if (isFavoritesEnabled) { + if (favoritesPlugin == null) + favoritesPlugin = Qt.createQmlObject('import QtLocation 5.3; Plugin { name: "places_jsondb" }', page); + favoritesPlugin.parameters = pluginParametersFromMap(pluginParameters); + placeSearchModel.favoritesPlugin = favoritesPlugin; + } else { + placeSearchModel.favoritesPlugin = null; + }*/ + placeSearchModel.favoritesPlugin = null; + + placeSearchModel.relevanceHint = orderByDistance ? PlaceSearchModel.DistanceHint : + orderByName ? PlaceSearchModel.LexicalPlaceNameHint : + PlaceSearchModel.UnspecifiedHint; + map.plugin.locales = locales.split(Qt.locale().groupSeparator); + } + + //! [PlaceRecommendationModel search] + function searchForSimilar(place) { + stackView.pop(page) + searchBar.showSearch(place.name) + placeSearchModel.searchForRecommendations(place.placeId); + } + //! [PlaceRecommendationModel search] + + anchors.fill: parent + focus: true + initialItem: Item { + id: page + + //! [PlaceSearchModel model] + PlaceSearchModel { + id: placeSearchModel + searchArea: searchRegion + + function searchForCategory(category) { + searchTerm = ""; + categories = category; + recommendationId = ""; + searchArea = searchRegion + limit = -1; + update(); + } + + function searchForText(text) { + searchTerm = text; + categories = null; + recommendationId = ""; + searchArea = searchRegion + limit = -1; + update(); + } + + function searchForRecommendations(placeId) { + searchTerm = ""; + categories = null; + recommendationId = placeId; + searchArea = null; + limit = -1; + update(); + } + + onStatusChanged: { + switch (status) { + case PlaceSearchModel.Ready: + if (count > 0) + stackView.showPlaces() + else + stackView.showMessage(qsTr("Search Place Error"),qsTr("Place not found !")) + break; + case PlaceSearchModel.Error: + stackView.showMessage(qsTr("Search Place Error"),errorString()) + break; + } + } + } + //! [PlaceSearchModel model] + + //! [PlaceSearchSuggestionModel model] + PlaceSearchSuggestionModel { + id: suggestionModel + searchArea: searchRegion + + onStatusChanged: { + if (status == PlaceSearchSuggestionModel.Ready) + stackView.showSuggestions() + } + } + //! [PlaceSearchSuggestionModel model] + + //! [CategoryModel model] + CategoryModel { + id: categoryModel + hierarchical: true + } + //! [CategoryModel model] + + Component { + id: mapComponent + + MapComponent { + width: page.width + height: page.height + + onErrorChanged: { + if (map.error != Map.NoError) { + var title = qsTr("ProviderError"); + var message = map.errorString + "

" + qsTr("Try to select other provider") + ""; + if (map.error == Map.MissingRequiredParameterError) + message += "
" + qsTr("or see") + " \'mapviewer --help\' " + + qsTr("how to pass plugin parameters."); + stackView.showMessage(title,message); + } + } + + MapItemView { + model: placeSearchModel + delegate: MapQuickItem { + coordinate: model.type === PlaceSearchModel.PlaceResult ? place.location.coordinate : QtPositioning.coordinate() + + visible: model.type === PlaceSearchModel.PlaceResult + + anchorPoint.x: image.width * 0.28 + anchorPoint.y: image.height + + sourceItem: Image { + id: image + source: "resources/marker.png" + MouseArea { + anchors.fill: parent + onClicked: stackView.showPlaceDatails(model.place,model.distance) + } + } + } + } + } + } + } + } + + Rectangle { + color: "white" + opacity: busyIndicator.running ? 0.8 : 0 + anchors.fill: parent + Behavior on opacity { NumberAnimation{} } + } + BusyIndicator { + id: busyIndicator + anchors.centerIn: parent + running: placeSearchModel.status == PlaceSearchModel.Loading || + categoryModel.status === CategoryModel.Loading + } +} diff --git a/examples/location/places/places.qrc b/examples/location/places/places.qrc new file mode 100644 index 0000000..42026a6 --- /dev/null +++ b/examples/location/places/places.qrc @@ -0,0 +1,42 @@ + + + places.qml + helper.js + items/MainMenu.qml + items/MapComponent.qml + items/SearchBar.qml + forms/Message.qml + forms/MessageForm.ui.qml + forms/SearchCenter.qml + forms/SearchCenterForm.ui.qml + forms/SearchBoundingBox.qml + forms/SearchBoundingBoxForm.ui.qml + forms/SearchBoundingCircle.qml + forms/SearchBoundingCircleForm.ui.qml + forms/SearchOptions.qml + forms/SearchOptionsForm.ui.qml + forms/PlaceDetails.qml + forms/PlaceDetailsForm.ui.qml + views/SuggestionView.qml + views/CategoryDelegate.qml + views/CategoryView.qml + views/EditorialDelegate.qml + views/EditorialPage.qml + views/EditorialView.qml + views/ImageView.qml + views/RatingView.qml + views/ReviewDelegate.qml + views/ReviewPage.qml + views/ReviewView.qml + views/SearchResultDelegate.qml + views/SearchResultView.qml + resources/categories.png + resources/left.png + resources/marker.png + resources/right.png + resources/scale.png + resources/scale_end.png + resources/search.png + resources/star.png + + diff --git a/examples/location/places/resources/categories.png b/examples/location/places/resources/categories.png new file mode 100644 index 0000000000000000000000000000000000000000..b2d73ea0e0c017e24d80de0e8129465db9e44e2e GIT binary patch literal 130 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H0wnYHF4+L2JUv|;Lp07OCrJ1lxN%?yBfp75 z=$(W=^87LWU61~*=o0>*mA4=~gGJ)~ac1TK(f8^H&o0qaJ1S|y!yBa3y5)tMrsBj& cF6>ea3V@;|>0q(VGh978nDCnq>C9%DPk#q*=F zu<2v{vKY_M*#Ra+je56GQC1n%&V{JH7+WXYh3Ob6Mw<&;$TifHC#} literal 0 HcmV?d00001 diff --git a/examples/location/places/resources/marker.png b/examples/location/places/resources/marker.png new file mode 100644 index 0000000000000000000000000000000000000000..2116dfdf51bfb8ac9556af035d598cf2c68c44e3 GIT binary patch literal 752 zcmVP001Be1^@s6=bY090008FNklP9F+g_dGL z7b4wOL~YbX6}NhC`Y^Yem;_BVH^=jjGv%gj-gDq^?<8~n@6OCQGh-NK7!h@__p?7@ zAHg%1%k{H&7`2$=I6)SB$ey9%mf^nW7pw@t0liA$uW3=@<{h$6c2acLUNScZ#1n1& zj{lW0thX!xPr(xr5KoZZd4{Yl+b9~?SDiKsYw4jl=ahsz49ascH$lOp{)gvA{a+7Rbz6(!?wYhMaEN_*&FvlTY+Qe#GeLd5Y`1f1;(W)TxhmI&f zGMmlT7dqEPnL5c-$rEwKC^iKt`y;L(O{LEFOX&6M`3tgeo|g$ok3Ur@d#&7y#A^h6 z?>^6`UFq7fPoGtQPnFzO*2?UlncYoA0W+aJ?(31K(tFo2L@iE#B&)%{`ZRITEx!AZ zU)hx!$Bv5w?bcmR&+YjDzHG#=UYFZb?pf8h$W$s-$07?*nr~~*-vC?M)D-<;udDUC zx(`a(n9X1Re>5i2b#_ic_8U43M<~(&X=?Gdk$OC$)?v`lX*}=K5dL}Zz8b-2L$~o) id-3sdrSb5U8~YFSpzHYmbwF4E0000V@;|>0q@p}s978nDCnp?WIL391jps+> z#>S7;kN+Rz{2}_5UF)a6!^}da5W(CjlH3yJ360MKr$|~K*tuf?R literal 0 HcmV?d00001 diff --git a/examples/location/places/resources/scale.png b/examples/location/places/resources/scale.png new file mode 100644 index 0000000000000000000000000000000000000000..c4f08122ada97f0848409a7b4de914274d04d55e GIT binary patch literal 98 zcmeAS@N?(olHy`uVBq!ia0vp^ra;Wb!3HFgIj$80DNRoo#}JF&PQ<|Z&(Z(QQpe}ECj@=zX;NfjIC%2Ts>e~;XMma*JYD@<);T3K0RYVMA4vcJ literal 0 HcmV?d00001 diff --git a/examples/location/places/resources/scale_end.png b/examples/location/places/resources/scale_end.png new file mode 100644 index 0000000000000000000000000000000000000000..94510b1258e33726e65d4d5f539b8dc1dea5c905 GIT binary patch literal 93 zcmeAS@N?(olHy`uVBq!ia0vp^OhC-W0V2~}Z=?b#6;Bt(5RU7~DID*U6A}^<1tu^B pAL2^zV(}^D?rhdzjZ-+uz+kqK@vYpot*Suv44$rjF6*2UngECF7V7{2 literal 0 HcmV?d00001 diff --git a/examples/location/places/resources/search.png b/examples/location/places/resources/search.png new file mode 100644 index 0000000000000000000000000000000000000000..ce8c27aa6e387f5ac9cec3fe14c33dd99caca5d1 GIT binary patch literal 259 zcmeAS@N?(olHy`uVBq!ia0vp^Vn8gy!2%?eOIddVsZ*XVjv*T7=T3^|J#4_^%Bv{A zwD6K*07t6;M{59EBaj56#s{@Jt8X2dy6t9sVc)txJCxD|EG|s5-fY8qne|V~v6~sL zfm{@G=xuWP8-|V zmG|wJW;?gYF71;}bqfqzJ;VA+V4&8%>nGmE{Zk4En3CIa_hnDBN7jN#9LGLb1f?%N z<(47GIc=`eOee+7k8ZPmt=u{-``1%&#EP)zqJjq^g28AcLO?%AlpqE~#2|^N zs~}!@=UUeLVnr84MWeBiUpdLIP)o*%drn_f*9Qd*BsMD|N)%B|0v}*PK zmCUQ5zE20x4-5f4t5Nvb;0AaCYC*4RQotneFYp)_>;i47LHHULRtfL(&n7Ua8WhkS zJk*5uH7i(A4GNeJvc~Q!&VsgSSHNCFXk8Jn!H6^q-wQkzc3-&yxxx2o4t}$MWB9%q z3$9a|Orru?gQJ4Lj$sjRz}Pe@;3M$V5SC2-f8o7NX;i=hVYj7BK->bI(=++UBE8;8hPVAsuriFK>>ro ze-`ssID%X3CJSom3iy_HR~O6|a2Z`uk6Lt}0E=%AE($v@D4D*#zz({#-D@E9TZ1~>dlHD*eoQ!bpzgW zOHfX!E>ozi&RS%lKsrw9*vtff7dWl?F~keMO#bf+X1^2kwxz@2oJ#TmA5y6T`vs2L zbR1s-+JzlnY%%hP?=4E`w;gaYoa(X zkxPu>GrpTZT(F%nXuSR%=oH7vu{ZeHQfzoJ20G#%m=NGR> zAgN1FzYFOvU&JBC6fjp{i0T=^aaIxv=nI|+>CbDX@In2%e1I|~rPapn26*6Hq5AW* zuB;Q{N=y@<-5rZH+iL$Hlc!zWtY3WKc=8DkIrAa=3}#jMQ=AHzB;@2msf`wS2h8AxYmM-^J$OKq z3E6ehX^8ELEw{{F%VIoXG)4!eej&TjQ~0u^8**Hys>0DpRe!c_4c!i(*WBH~zyFZC zPGK6cDr>BXLjfZ>dfTcuRn*W0g<&OLv6}-P6zD-J>LUN%5gxEwsK(4iQAA%^uKT`p zk%4b`IF>?+e!d9fW~DCXoW(E63@>m*uPO6$JA$QJ@g-#*dj6uQ70?*4>vRI#M3Fq= z?h{?-`BS)9scM9cQ7hmVq5P%vHZ`vA{c#s+trm;)P53hEhY#ReSWP@~-o{^sh_x1H zYoLj5J$S`m#iPMU_c$ItfLmchL(SWxT}uznOe13v{{1UuuXoV~ok6Cp 0 ? model.title : qsTr("Untitled editorial") + font.bold: true + + wrapMode: Text.WordWrap + elide: Text.ElideRight + maximumLineCount: 2 + } + + MouseArea { + anchors.fill: parent + onClicked: showEditorial() + } +} diff --git a/examples/location/places/views/EditorialPage.qml b/examples/location/places/views/EditorialPage.qml new file mode 100644 index 0000000..76f956d --- /dev/null +++ b/examples/location/places/views/EditorialPage.qml @@ -0,0 +1,124 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.5 +import QtLocation 5.6 +import QtQuick.Controls 1.4 +import QtQuick.Layouts 1.2 + +Item { + id: root + property variant editorial + width: parent.width + height: parent.height + + ScrollView { + id: scrollView + flickableItem.interactive: true + anchors.fill: parent + anchors.margins: 15 + + ColumnLayout { + width: scrollView.width - 30 + spacing: 10 + + Rectangle { + anchors.left: parent.left + anchors.right: parent.right + height: 1 + color: "#46a2da" + } + + Label { + text: editorial.title + Layout.fillWidth: true + Layout.alignment: Qt.AlignHCenter + wrapMode: Text.WordWrap + textFormat: Text.RichText + } + + Label { + text: editorial.text + Layout.fillWidth: true + Layout.alignment: Qt.AlignHCenter + wrapMode: Text.WordWrap + textFormat: Text.RichText + } + + Rectangle { + anchors.left: parent.left + anchors.right: parent.right + height: 1 + color: "#46a2da" + } + + Image { + Layout.alignment: Qt.AlignHCenter + source: editorial.supplier.icon.url(Qt.size(width, height), Icon.List) + } + + Label { + text: editorial.supplier.name + Layout.alignment: Qt.AlignHCenter + wrapMode: Text.WordWrap + textFormat: Text.RichText + } + + Button { + id: button + text: qsTr("Open url") + Layout.alignment: Qt.AlignHCenter + onClicked: { + Qt.openUrlExternally(editorial.supplier.url) + } + } + } + } +} diff --git a/examples/location/places/views/EditorialView.qml b/examples/location/places/views/EditorialView.qml new file mode 100644 index 0000000..8b93f3c --- /dev/null +++ b/examples/location/places/views/EditorialView.qml @@ -0,0 +1,67 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.5 +import QtLocation 5.6 + +//! [PlaceEditorialModel view] +ListView { + id:view + property Place place + signal showEditorial(variant editorial) + width: parent.width + height: parent.height + model: place.editorialModel + delegate: EditorialDelegate { + onShowEditorial: view.showEditorial(model) + } +} +//! [PlaceEditorialModel view] + diff --git a/examples/location/places/views/ImageView.qml b/examples/location/places/views/ImageView.qml new file mode 100644 index 0000000..6ece893 --- /dev/null +++ b/examples/location/places/views/ImageView.qml @@ -0,0 +1,161 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.5 +import QtLocation 5.6 +import QtQuick.Controls 1.4 + +Item { + id: root + property Place place + width: parent.width + height: parent.height + + GridView { + id: gridView + + anchors.fill: parent + + model: place.imageModel + + cellWidth: width / 3 + cellHeight: cellWidth + + delegate: Rectangle { + width: gridView.cellWidth + height: gridView.cellHeight + + color: "#30FFFFFF" + + Image { + anchors.fill: parent + anchors.margins: 5 + + source: url + + fillMode: Image.PreserveAspectFit + } + + MouseArea { + anchors.fill: parent + onClicked: { + listView.positionViewAtIndex(index, ListView.Contain); + root.state = "list"; + } + } + } + } + + ListView { + id: listView + + anchors.top: parent.top + anchors.bottom: position.top + width: parent.width + spacing: 10 + + model: place.imageModel + orientation: ListView.Horizontal + snapMode: ListView.SnapOneItem + + visible: false + + delegate: Item { + width: listView.width + height: listView.height + + Image { + anchors.fill: parent + source: url + fillMode: Image.PreserveAspectFit + + MouseArea { + anchors.fill: parent + onClicked: root.state = "" + } + } + + Button { + id: button + text: qsTr("Open url") + anchors.bottom: parent.bottom + anchors.horizontalCenter: parent.horizontalCenter + onClicked: { + Qt.openUrlExternally(supplier.url) + } + } + } + } + + Label { + id: position + + width: parent.width + anchors.bottom: parent.bottom + visible: listView.visible + + text: (listView.currentIndex + 1) + '/' + listView.model.totalCount + horizontalAlignment: Text.AlignRight + } + + states: [ + State { + name: "list" + PropertyChanges { + target: gridView + visible: false + } + PropertyChanges { + target: listView + visible: true + } + } + ] +} diff --git a/examples/location/places/views/RatingView.qml b/examples/location/places/views/RatingView.qml new file mode 100644 index 0000000..1f71355 --- /dev/null +++ b/examples/location/places/views/RatingView.qml @@ -0,0 +1,65 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.5 + +Row { + property real rating: 0 + property int size: 0 + + Repeater { + model: Math.ceil(rating) + Image { + source: "../../resources/star.png" + width: size + height: size + } + } +} diff --git a/examples/location/places/views/ReviewDelegate.qml b/examples/location/places/views/ReviewDelegate.qml new file mode 100644 index 0000000..08cdef8 --- /dev/null +++ b/examples/location/places/views/ReviewDelegate.qml @@ -0,0 +1,108 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.5 +import QtLocation 5.6 +import QtQuick.Controls 1.4 + +Item { + id: root + signal showReview() + + width: parent.width + height: icon.height + 8 + + Image { + id: icon + + width: 64 + height: 64 + + anchors.verticalCenter: root.verticalCenter + anchors.left: root.left + anchors.leftMargin: 4 + + source: model.supplier.icon.url(Qt.size(64, 64), Icon.List) + fillMode: Image.PreserveAspectFit + } + + Label { + anchors.top: icon.top + anchors.topMargin: 4 + anchors.left: icon.right + anchors.leftMargin: 4 + anchors.right: root.right + anchors.rightMargin: 4 + + text: model.title + font.bold: true + + wrapMode: Text.WordWrap + elide: Text.ElideRight + maximumLineCount: 2 + } + + RatingView { + anchors.bottom: icon.bottom + anchors.bottomMargin: 4 + anchors.left: icon.right + anchors.leftMargin: 4 + anchors.right: root.right + anchors.rightMargin: 4 + + rating: model.rating + size: 16 + } + + MouseArea { + anchors.fill: parent + onClicked: showReview() + } +} diff --git a/examples/location/places/views/ReviewPage.qml b/examples/location/places/views/ReviewPage.qml new file mode 100644 index 0000000..19fbd77 --- /dev/null +++ b/examples/location/places/views/ReviewPage.qml @@ -0,0 +1,133 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.5 +import QtLocation 5.6 +import QtQuick.Controls 1.4 +import QtQuick.Layouts 1.2 + +Item { + id: root + property variant review + width: parent.width + height: parent.height + + ScrollView { + id: scrollView + flickableItem.interactive: true + anchors.fill: parent + anchors.margins: 15 + + ColumnLayout { + width: scrollView.width - 30 + spacing: 10 + + Rectangle { + anchors.left: parent.left + anchors.right: parent.right + height: 1 + color: "#46a2da" + } + + Label { + text: review.title + width: parent.width + wrapMode: Text.WordWrap + } + + Label { + text: Qt.formatDateTime(review.dateTime) + width: parent.width + Layout.alignment: Qt.AlignHCenter + } + + RatingView { + size: 16 + rating: review.rating + } + + Label { + text: review.text + width: parent.width + wrapMode: Text.WordWrap + Layout.alignment: Qt.AlignHCenter + textFormat: Text.RichText + } + + Rectangle { + anchors.left: parent.left + anchors.right: parent.right + height: 1 + color: "#46a2da" + } + + Image { + Layout.alignment: Qt.AlignHCenter + source: review.supplier.icon.url(Qt.size(width, height), Icon.List) + } + + Label { + text: editorial.supplier.name + Layout.alignment: Qt.AlignHCenter + wrapMode: Text.WordWrap + textFormat: Text.RichText + } + + Button { + id: button + text: qsTr("Open url") + Layout.alignment: Qt.AlignHCenter + onClicked: { + Qt.openUrlExternally(review.supplier.url) + } + } + } + } +} diff --git a/examples/location/places/views/ReviewView.qml b/examples/location/places/views/ReviewView.qml new file mode 100644 index 0000000..669a06d --- /dev/null +++ b/examples/location/places/views/ReviewView.qml @@ -0,0 +1,67 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.5 +import QtLocation 5.6 + +//! [ReviewModel delegate] +ListView { + id:view + property Place place + signal showReview(variant review) + width: parent.width + height: parent.height + model: place.reviewModel + delegate: ReviewDelegate { + onShowReview: view.showReview(model) + } +} +//! [ReviewModel delegate] + diff --git a/examples/location/places/views/SearchResultDelegate.qml b/examples/location/places/views/SearchResultDelegate.qml new file mode 100644 index 0000000..d6b3717 --- /dev/null +++ b/examples/location/places/views/SearchResultDelegate.qml @@ -0,0 +1,206 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.5 +import QtLocation 5.6 +import QtQuick.Controls 1.4 +import QtQuick.Layouts 1.2 +import "../helper.js" as Helper + +Item { + id: root + + signal showPlaceDetails(variant place,variant distance) + signal searchFor(string query) + + width: parent.width + height: childrenRect.height + + //! [PlaceSearchModel place delegate] + Component { + id: placeComponent + Item { + id: placeRoot + width: root.width + height: Math.max(icon.height, 3 * placeName.height) + + Rectangle { + anchors.fill: parent + color: "#44ffffff" + visible: mouse.pressed + } + + Rectangle { + anchors.fill: parent + color: "#dbffde" + visible: model.sponsored !== undefined ? model.sponsored : false + + Label { + text: qsTr("Sponsored result") + horizontalAlignment: Text.AlignRight + anchors.right: parent.right + anchors.bottom: parent.bottom + font.pixelSize: 8 + visible: model.sponsored !== undefined ? model.sponsored : false + } + } + + GridLayout { + rows: 2 + columns: 2 + anchors.fill: parent + anchors.leftMargin: 30 + flow: GridLayout.TopToBottom + + Image { + // anchors.verticalCenter: parent.verticalCenter + id:icon + source: place.favorite ? "../../resources/star.png" : place.icon.url() + Layout.rowSpan: 2 + } + + Label { + id: placeName + text: place.favorite ? place.favorite.name : place.name + Layout.fillWidth: true + } + + Label { + id: distanceText + font.italic: true + text: Helper.formatDistance(distance) + Layout.fillWidth: true + } + } + + Rectangle { + anchors.left: parent.left + anchors.right: parent.right + anchors.margins: 15 + height: 1 + color: "#46a2da" + } + + MouseArea { + id: mouse + anchors.fill: parent + onClicked: { + if (model.type === undefined || type === PlaceSearchModel.PlaceResult) { + if (!place.detailsFetched) + place.getDetails(); + root.showPlaceDetails(model.place, model.distance); + } + } + } + } + } + //! [PlaceSearchModel place delegate] + + Component { + id: proposedSearchComponent + + Item { + id: proposedSearchRoot + + width: root.width + height: Math.max(icon.height, 2 * proposedSearchTitle.height) + + Rectangle { + anchors.fill: parent + color: "#11ffffff" + visible: mouse.pressed + } + + RowLayout { + anchors.fill: parent + anchors.leftMargin: 30 + + Image { + source: icon.url() + } + + Label { + id: proposedSearchTitle + anchors.verticalCenter: parent.verticalCenter + text: "Search for " + title + } + } + + Rectangle { + anchors.left: parent.left + anchors.right: parent.right + anchors.margins: 15 + height: 1 + color: "#46a2da" + } + + MouseArea { + anchors.fill: parent + onClicked: root.ListView.view.model.updateWith(index); + } + } + } + + Loader { + anchors.left: parent.left + anchors.right: parent.right + + sourceComponent: { + switch (model.type) { + case PlaceSearchModel.PlaceResult: + return placeComponent; + case PlaceSearchModel.ProposedSearchResult: + return proposedSearchComponent; + default: + //do nothing, don't assign component if result type not recognized + } + } + } +} diff --git a/examples/location/places/views/SearchResultView.qml b/examples/location/places/views/SearchResultView.qml new file mode 100644 index 0000000..6e6c415 --- /dev/null +++ b/examples/location/places/views/SearchResultView.qml @@ -0,0 +1,101 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.5 +import QtLocation 5.6 +import QtQuick.Controls 1.4 +import QtQuick.Layouts 1.2 + +//! [PlaceSearchModel place list] +ListView { + id: searchView + width: parent.width + height: parent.height + + property variant placeSearchModel + signal showPlaceDetails(variant place, variant distance) + signal showMap() + + model: placeSearchModel + delegate: SearchResultDelegate { + onShowPlaceDetails: searchView.showPlaceDetails(place, distance) + onSearchFor: placeSearchModel.searchForText(query); + } + + footer: + + RowLayout { + width: parent.width + + Button { + text: qsTr("Previous") + enabled: placeSearchModel.previousPagesAvailable + onClicked: placeSearchModel.previousPage() + Layout.alignment: Qt.AlignHCenter + } + + Button { + text: qsTr("Clear") + onClicked: { + placeSearchModel.reset() + showMap() + } + Layout.alignment: Qt.AlignHCenter + } + + Button { + text: qsTr("Next") + enabled: placeSearchModel.nextPagesAvailable + onClicked: placeSearchModel.nextPage() + Layout.alignment: Qt.AlignHCenter + } + } +} +//! [PlaceSearchModel place list] diff --git a/examples/location/places/views/SuggestionView.qml b/examples/location/places/views/SuggestionView.qml new file mode 100644 index 0000000..960b5a2 --- /dev/null +++ b/examples/location/places/views/SuggestionView.qml @@ -0,0 +1,77 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.5 +import QtQuick.Controls 1.4 + +//! [PlaceSearchSuggestionModel view 1] +ListView { + id: suggestionView + property variant suggestionModel + signal suggestionSelected(string text) +//! [PlaceSearchSuggestionModel view 1] + snapMode: ListView.SnapToItem +//! [PlaceSearchSuggestionModel view 2] + model: suggestionModel + delegate: Item { + width: parent.width + height: label.height * 1.5 + Label { + id: label + text: suggestion + } + MouseArea { + anchors.fill: parent + onClicked: suggestionSelected(suggestion) + } + } +} +//! [PlaceSearchSuggestionModel view 2] + diff --git a/examples/location/places_list/Marker.qml b/examples/location/places_list/Marker.qml new file mode 100644 index 0000000..c1f33de --- /dev/null +++ b/examples/location/places_list/Marker.qml @@ -0,0 +1,69 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.0 + +Rectangle { + width: image.width + Image { + id: image + anchors.centerIn: parent + source: "marker.png" + Text{ + y: parent.height/10 + width: parent.width + color: "white" + font.bold: true + font.pixelSize: 14 + horizontalAlignment: Text.AlignHCenter + text: index + } + } +} diff --git a/examples/location/places_list/doc/images/places_list.png b/examples/location/places_list/doc/images/places_list.png new file mode 100644 index 0000000000000000000000000000000000000000..bf09a0314174aba8e59a2c609e563d2f0e0312a0 GIT binary patch literal 18195 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 M07*qoM6N<$g30|;@&Et; literal 0 HcmV?d00001 diff --git a/examples/location/places_list/doc/src/places_list.qdoc b/examples/location/places_list/doc/src/places_list.qdoc new file mode 100644 index 0000000..bc19d56 --- /dev/null +++ b/examples/location/places_list/doc/src/places_list.qdoc @@ -0,0 +1,76 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the documentation of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:FDL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Free Documentation License Usage +** Alternatively, this file may be used under the terms of the GNU Free +** Documentation License version 1.3 as published by the Free Software +** Foundation and appearing in the file included in the packaging of +** this file. Please review the following information to ensure +** the GNU Free Documentation License version 1.3 requirements +** will be met: https://www.gnu.org/licenses/fdl-1.3.html. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +/*! + \example places_list + \title Places List (QML) + \ingroup qtlocation-examples + + \brief The Places List example demonstrates how to search for and display a list of places using a \l ListView. + \image places_list.png + + \include examples-run.qdocinc + + The \c {Places List} example demonstrates how to search for a list of places + in a certain area and displays the result using a \l ListView. In this particular case, a search + for places associated with the term \c pizza is performed. + + \section1 Performing a Place Search + + To write a QML application that will show places in a list, we start by + making the following import declarations. + + \snippet places_list/places_list.qml Imports + + Instantiate a \l Plugin instance. The \l Plugin is effectively the backend + from where places are sourced from. Depending on the type of the plugin, + some mandatory parameters may be need to be filled in. The most likely type + of PluginParameter are some form of service access token which are documented + in the service plugin. As an example see the \l + {Mandatory Parameters} {HERE Plugin} documentation. In this snippet the \c osm + plugin is used which does not require any further parameter: + + \snippet places_list/places_list.qml Initialize Plugin + + Next we instantiate a \l PlaceSearchModel which we can use to specify + search parameters and perform a places search operation. For illustrative + purposes, \l {PlaceSearchModel::update} {update()} is invoked once + construction of the model is complete. Typically \l + {PlaceSearchModel::update} {update()} would be invoked in response to a + user action such as a button click. + + \snippet places_list/places_list.qml PlaceSearchModel + + Finally we instantiate a \l ListView to show the search results found by + the model. An inline delegate has been used and we have assumed that + every search result is of \l {Search Result Types} {type} \c + PlaceSearchesult. Consequently it is assumed that we always have access to + the \e place \l {PlaceSearchModel Roles} {role}, other search result types + may not have a \e place \l {PlaceSearchModel Roles} {role}. + + \snippet places_list/places_list.qml Places ListView +*/ diff --git a/examples/location/places_list/main.cpp b/examples/location/places_list/main.cpp new file mode 100644 index 0000000..8ae8d27 --- /dev/null +++ b/examples/location/places_list/main.cpp @@ -0,0 +1,61 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include +#include + +int main(int argc, char **argv) +{ + QGuiApplication app(argc,argv); + QQuickView view; + view.setSource(QUrl(QStringLiteral("qrc:///places_list.qml"))); + view.show(); + return app.exec(); +} diff --git a/examples/location/places_list/marker.png b/examples/location/places_list/marker.png new file mode 100644 index 0000000000000000000000000000000000000000..2116dfdf51bfb8ac9556af035d598cf2c68c44e3 GIT binary patch literal 752 zcmVP001Be1^@s6=bY090008FNklP9F+g_dGL z7b4wOL~YbX6}NhC`Y^Yem;_BVH^=jjGv%gj-gDq^?<8~n@6OCQGh-NK7!h@__p?7@ zAHg%1%k{H&7`2$=I6)SB$ey9%mf^nW7pw@t0liA$uW3=@<{h$6c2acLUNScZ#1n1& zj{lW0thX!xPr(xr5KoZZd4{Yl+b9~?SDiKsYw4jl=ahsz49ascH$lOp{)gvA{a+7Rbz6(!?wYhMaEN_*&FvlTY+Qe#GeLd5Y`1f1;(W)TxhmI&f zGMmlT7dqEPnL5c-$rEwKC^iKt`y;L(O{LEFOX&6M`3tgeo|g$ok3Ur@d#&7y#A^h6 z?>^6`UFq7fPoGtQPnFzO*2?UlncYoA0W+aJ?(31K(tFo2L@iE#B&)%{`ZRITEx!AZ zU)hx!$Bv5w?bcmR&+YjDzHG#=UYFZb?pf8h$W$s-$07?*nr~~*-vC?M)D-<;udDUC zx(`a(n9X1Re>5i2b#_ic_8U43M<~(&X=?Gdk$OC$)?v`lX*}=K5dL}Zz8b-2L$~o) id-3sdrSb5U8~YFSpzHYmbwF4E0000 + + marker.png + places_list.qml + Marker.qml + + diff --git a/examples/location/places_map/doc/images/places_map.png b/examples/location/places_map/doc/images/places_map.png new file mode 100644 index 0000000000000000000000000000000000000000..4982df233d227d35680a3886cefa7e1a2416ef95 GIT binary patch literal 167995 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≤F)kLCqS(lL_LN_)Fjl%ZeL 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 +#include + +int main(int argc, char **argv) +{ + QGuiApplication app(argc,argv); + QQuickView view; + view.setSource(QUrl(QStringLiteral("qrc:///places_map.qml"))); + view.setWidth(360); + view.setHeight(640); + view.show(); + return app.exec(); +} diff --git a/examples/location/places_map/marker.png b/examples/location/places_map/marker.png new file mode 100644 index 0000000000000000000000000000000000000000..2116dfdf51bfb8ac9556af035d598cf2c68c44e3 GIT binary patch literal 752 zcmVP001Be1^@s6=bY090008FNklP9F+g_dGL z7b4wOL~YbX6}NhC`Y^Yem;_BVH^=jjGv%gj-gDq^?<8~n@6OCQGh-NK7!h@__p?7@ zAHg%1%k{H&7`2$=I6)SB$ey9%mf^nW7pw@t0liA$uW3=@<{h$6c2acLUNScZ#1n1& zj{lW0thX!xPr(xr5KoZZd4{Yl+b9~?SDiKsYw4jl=ahsz49ascH$lOp{)gvA{a+7Rbz6(!?wYhMaEN_*&FvlTY+Qe#GeLd5Y`1f1;(W)TxhmI&f zGMmlT7dqEPnL5c-$rEwKC^iKt`y;L(O{LEFOX&6M`3tgeo|g$ok3Ur@d#&7y#A^h6 z?>^6`UFq7fPoGtQPnFzO*2?UlncYoA0W+aJ?(31K(tFo2L@iE#B&)%{`ZRITEx!AZ zU)hx!$Bv5w?bcmR&+YjDzHG#=UYFZb?pf8h$W$s-$07?*nr~~*-vC?M)D-<;udDUC zx(`a(n9X1Re>5i2b#_ic_8U43M<~(&X=?Gdk$OC$)?v`lX*}=K5dL}Zz8b-2L$~o) id-3sdrSb5U8~YFSpzHYmbwF4E0000 500) { + // 500m from last performed pizza search + lastSearchPosition = currentPosition + searchModel.searchArea = QtPositioning.circle(currentPosition) + searchModel.update() + } + } + } + //! [Current Location] + + //! [PlaceSearchModel] + property variant locationOslo: QtPositioning.coordinate( 59.93, 10.76) + + PlaceSearchModel { + id: searchModel + + plugin: myPlugin + + searchTerm: "Pizza" + searchArea: QtPositioning.circle(locationOslo) + + Component.onCompleted: update() + } + //! [PlaceSearchModel] + + //! [Places MapItemView] + Map { + id: map + anchors.fill: parent + plugin: myPlugin; + center: locationOslo + zoomLevel: 13 + + MapItemView { + model: searchModel + delegate: MapQuickItem { + coordinate: place.location.coordinate + + anchorPoint.x: image.width * 0.5 + anchorPoint.y: image.height + + sourceItem: Column { + Image { id: image; source: "marker.png" } + Text { text: title; font.bold: true } + } + } + } + } + //! [Places MapItemView] + + Connections { + target: searchModel + onStatusChanged: { + if (searchModel.status == PlaceSearchModel.Error) + console.log(searchModel.errorString()); + } + } +} diff --git a/examples/location/places_map/places_map.qrc b/examples/location/places_map/places_map.qrc new file mode 100644 index 0000000..2239529 --- /dev/null +++ b/examples/location/places_map/places_map.qrc @@ -0,0 +1,6 @@ + + + marker.png + places_map.qml + + diff --git a/examples/location/planespotter/Plane.qml b/examples/location/planespotter/Plane.qml new file mode 100644 index 0000000..167f08d --- /dev/null +++ b/examples/location/planespotter/Plane.qml @@ -0,0 +1,125 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.4 +import QtLocation 5.6 + +//! [PlaneMapQuick1] +// Plane.qml +MapQuickItem { + id: plane + property string pilotName; + property int bearing: 0; + + anchorPoint.x: image.width/2 + anchorPoint.y: image.height/2 + + sourceItem: Grid { + //... +//! [PlaneMapQuick1] + columns: 1 + Grid { + horizontalItemAlignment: Grid.AlignHCenter + Image { + id: image + rotation: bearing + source: "airplane.png" + } + Rectangle { + id: bubble + color: "lightblue" + border.width: 1 + width: text.width * 1.3 + height: text.height * 1.3 + radius: 5 + Text { + id: text + anchors.centerIn: parent + text: pilotName + } + } + } + + Rectangle { + id: message + color: "lightblue" + border.width: 1 + width: banner.width * 1.3 + height: banner.height * 1.3 + radius: 5 + opacity: 0 + Text { + id: banner + anchors.centerIn: parent + } + SequentialAnimation { + id: playMessage + running: false + NumberAnimation { target: message; + property: "opacity"; + to: 1.0; + duration: 200 + easing.type: Easing.InOutQuad + } + PauseAnimation { duration: 1000 } + NumberAnimation { target: message; + property: "opacity"; + to: 0.0; + duration: 200} + } + } + } + function showMessage(message) { + banner.text = message + playMessage.start() +//! [PlaneMapQuick2] + } +} +//! [PlaneMapQuick2] diff --git a/examples/location/planespotter/airplane.png b/examples/location/planespotter/airplane.png new file mode 100644 index 0000000000000000000000000000000000000000..080460dd623908ac19f6d6add6663ddc926fcaf1 GIT binary patch literal 831 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%0AI|#@b*v2#)$59lUh)^gy5Z-!wOR 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 literal 0 HcmV?d00001 diff --git a/examples/location/planespotter/doc/src/planespotter.qdoc b/examples/location/planespotter/doc/src/planespotter.qdoc new file mode 100644 index 0000000..574f2c7 --- /dev/null +++ b/examples/location/planespotter/doc/src/planespotter.qdoc @@ -0,0 +1,143 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the documentation of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:FDL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Free Documentation License Usage +** Alternatively, this file may be used under the terms of the GNU Free +** Documentation License version 1.3 as published by the Free Software +** Foundation and appearing in the file included in the packaging of +** this file. Please review the following information to ensure +** the GNU Free Documentation License version 1.3 requirements +** will be met: https://www.gnu.org/licenses/fdl-1.3.html. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +/*! + \example planespotter + \title Plane Spotter (QML) + \ingroup qtlocation-examples + + \brief The \c {Plane Spotter} example demonstrates the tight integration of + location and positioning data types into QML. + + \image planespotter.png + + The \c {Plane Spotter} example demonstrates how to integrate location and positioning + related C++ data types into QML and vice versa. This is useful when it is desirable to + run CPU intensive position calculations in native environments + but the results are supposed to be displayed using QML. + + The example shows a map of Europe and airplanes on two routes across Europe. + The first airplane commutes between Oslo and Berlin and the second airplane + commutes between London and Berlin. The position tracking of each airplane + is implemented in C++. The Oslo-Berlin plane is piloted in QML and the London-Berlin + plane is commanded by a C++ pilot. + + \include examples-run.qdocinc + + \section1 Overview + + + This example makes use of the \l Q_GADGET feature as part of its position controller + implementation. It permits \l {Cpp_value_integration_positioning}{direct integration} + of non-QObject based C++ value types into QML. + + The main purpose of the \c PlaneController class is to track the current + coordinates of the plane at a given time. It exposes the position + via its position property. + + \snippet planespotter/main.cpp PlaneController1 + \snippet planespotter/main.cpp PlaneController2 + + The example's \c main() function is responsible for the binding of the + \c PlaneController class instances into the QML context: + + \snippet planespotter/main.cpp PlaneControllerMain + + Similar to QObject derived classes, \l QGeoCoordinate can be integrated without + an additional QML wrapper. + + \section1 Steering the Planes + + As mentioned above, the primary purpose of \c PlaneController class is to track the current + positions of the two planes (Oslo-Berlin and London-Berlin) and advertise them as a property + to the QML layer. Its secondary purpose is to set and progress a plane along a given + flight path. In a sense it can act as a pilot. This is very much like + \l CoordinateAnimation which can animate the transition from one geo coordinate to another. + This example demonstrates how the \c {PlaneController}'s position property is modified + by C++ code using the PlaneController's own piloting abilities and by QML code using + \l CoordinateAnimation as pilot. The Oslo-Berlin plane is animated using QML code + and the London-Berlin plane is animated using C++ code. + + No matter which pilot is used, the results to the pilot's + actions are visible in C++ and QML and thus the example demonstrates unhindered and direct + exchange of position data through the C++/QML boundary. + + The visual representation of each \c Plane is done using + the \l MapQuickItem type which permits the embedding of arbitrary QtQuick items + into a map: + + \snippet planespotter/Plane.qml PlaneMapQuick1 + \snippet planespotter/Plane.qml PlaneMapQuick2 + + \section2 The C++ Pilot + + The C++ plane is steered by C++. The \c from and \c to property of the controller + class set the origin and destination which the pilot uses to calculate the + bearing for the plane: + + \snippet planespotter/main.cpp C++Pilot1 + + The pilot employs a \l QBasicTimer and \l {QTimerEvent}{QTimerEvents} to + constantly update the position. During each timer iteration + \c PlaneController::updatePosition() is called and a new position calculated. + + \snippet planespotter/main.cpp C++Pilot3 + + Once the new position is calculated, \c setPosition() is called and + the subsequent change notification of the property pushes the new position + to the QML layer. + + The C++ plane is started by clicking on the plane: + + \snippet planespotter/planespotter.qml CppPlane1 + \snippet planespotter/planespotter.qml CppPlane2 + + \l {azimuthTo}() calculates the bearing in degrees from one coordinate to another. + Note that the above code utilizes a QML animation to tie the rotation + and the position change into a single animation flow: + + \snippet planespotter/planespotter.qml CppPlane3 + + First, \l NumberAnimation rotates the plane into the correct direction + and once that is done the \c startFlight() function takes care of + starting the plane's position change. + + \snippet planespotter/main.cpp C++Pilot2 + + \section2 The QML Pilot + + The \l CoordinateAnimation type is used to control the flight from Oslo + to Berlin and vice versa. It replaces the above \l ScriptAction. + + \snippet planespotter/planespotter.qml QmlPlane1 + + The \l MouseArea of the QML plane implements the logic for the course setting + and starts the animation when required. + + \snippet planespotter/planespotter.qml QmlPlane2 + +*/ diff --git a/examples/location/planespotter/main.cpp b/examples/location/planespotter/main.cpp new file mode 100644 index 0000000..76f8cc2 --- /dev/null +++ b/examples/location/planespotter/main.cpp @@ -0,0 +1,211 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define ANIMATION_DURATION 4000 + +//! [PlaneController1] +class PlaneController: public QObject +{ + Q_OBJECT + Q_PROPERTY(QGeoCoordinate position READ position WRITE setPosition NOTIFY positionChanged) +//! [PlaneController1] + //! [C++Pilot1] + Q_PROPERTY(QGeoCoordinate from READ from WRITE setFrom NOTIFY fromChanged) + Q_PROPERTY(QGeoCoordinate to READ to WRITE setTo NOTIFY toChanged) + //! [C++Pilot1] + +public: + PlaneController() + { + easingCurve.setType(QEasingCurve::InOutQuad); + easingCurve.setPeriod(ANIMATION_DURATION); + } + + void setFrom(const QGeoCoordinate& from) + { + fromCoordinate = from; + } + + QGeoCoordinate from() const + { + return fromCoordinate; + } + + void setTo(const QGeoCoordinate& to) + { + toCoordinate = to; + } + + QGeoCoordinate to() const + { + return toCoordinate; + } + + void setPosition(const QGeoCoordinate &c) { + if (currentPosition == c) + return; + + currentPosition = c; + emit positionChanged(); + } + + QGeoCoordinate position() const + { + return currentPosition; + } + + Q_INVOKABLE bool isFlying() const { + return timer.isActive(); + } + +//! [C++Pilot2] +public slots: + void startFlight() + { + if (timer.isActive()) + return; + + startTime = QTime::currentTime(); + finishTime = startTime.addMSecs(ANIMATION_DURATION); + + timer.start(15, this); + emit departed(); + } +//! [C++Pilot2] + + void swapDestinations() { + if (currentPosition == toCoordinate) { + // swap destinations + toCoordinate = fromCoordinate; + fromCoordinate = currentPosition; + } + } + +signals: + void positionChanged(); + void arrived(); + void departed(); + void toChanged(); + void fromChanged(); + +protected: + void timerEvent(QTimerEvent *event) override + { + if (!event) + return; + + if (event->timerId() == timer.timerId()) + updatePosition(); + else + QObject::timerEvent(event); + } + +private: + //! [C++Pilot3] + void updatePosition() + { + // simple progress animation + qreal progress; + QTime current = QTime::currentTime(); + if (current >= finishTime) { + progress = 1.0; + timer.stop(); + } else { + progress = ((qreal)startTime.msecsTo(current) / ANIMATION_DURATION); + } + + setPosition(QWebMercator::coordinateInterpolation( + fromCoordinate, toCoordinate, easingCurve.valueForProgress(progress))); + + if (!timer.isActive()) + emit arrived(); + } + //! [C++Pilot3] + +private: + QGeoCoordinate currentPosition; + QGeoCoordinate fromCoordinate, toCoordinate; + QBasicTimer timer; + QTime startTime, finishTime; + QEasingCurve easingCurve; +//! [PlaneController2] + // ... +}; +//! [PlaneController2] + +//! [PlaneControllerMain] +int main(int argc, char *argv[]) +{ + QGuiApplication app(argc, argv); + + PlaneController oslo2berlin; + PlaneController berlin2london; + + QQmlApplicationEngine engine; + engine.rootContext()->setContextProperty("oslo2Berlin", &oslo2berlin); + engine.rootContext()->setContextProperty("berlin2London", &berlin2london); + engine.load(QUrl(QStringLiteral("qrc:/planespotter.qml"))); + + return app.exec(); +} +//! [PlaneControllerMain] + +#include "main.moc" diff --git a/examples/location/planespotter/planespotter.pro b/examples/location/planespotter/planespotter.pro new file mode 100644 index 0000000..d3be902 --- /dev/null +++ b/examples/location/planespotter/planespotter.pro @@ -0,0 +1,10 @@ +TEMPLATE = app +TARGET = planespotter +QT += qml quick positioning positioning-private location + +SOURCES += main.cpp + +RESOURCES += qml.qrc + +target.path = $$[QT_INSTALL_EXAMPLES]/location/planespotter +INSTALLS += target diff --git a/examples/location/planespotter/planespotter.qml b/examples/location/planespotter/planespotter.qml new file mode 100644 index 0000000..b218d14 --- /dev/null +++ b/examples/location/planespotter/planespotter.qml @@ -0,0 +1,228 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.4 +import QtQuick.Window 2.2 +import QtPositioning 5.5 +import QtLocation 5.6 + +Window { + width: 700 + height: 500 + visible: true + + property variant topLeftEurope: QtPositioning.coordinate(60.5, 0.0) + property variant bottomRightEurope: QtPositioning.coordinate(51.0, 14.0) + property variant viewOfEurope: + QtPositioning.rectangle(topLeftEurope, bottomRightEurope) + + property variant berlin: QtPositioning.coordinate(52.5175, 13.384) + property variant oslo: QtPositioning.coordinate(59.9154, 10.7425) + property variant london: QtPositioning.coordinate(51.5, 0.1275) + + Map { + id: mapOfEurope + anchors.centerIn: parent; + anchors.fill: parent + plugin: Plugin { + name: "osm" // "mapboxgl", "esri", ... + } + + Plane { + id: qmlPlane + pilotName: "QML" + coordinate: oslo2Berlin.position + + SequentialAnimation { + id: qmlPlaneAnimation + property real rotationDirection : 0; + NumberAnimation { + target: qmlPlane; property: "bearing"; duration: 1000 + easing.type: Easing.InOutQuad + to: qmlPlaneAnimation.rotationDirection + } + //! [QmlPlane1] + CoordinateAnimation { + id: coordinateAnimation; duration: 5000 + target: oslo2Berlin; property: "position" + easing.type: Easing.InOutQuad + } + //! [QmlPlane1] + + onStopped: { + if (coordinateAnimation.to === berlin) + qmlPlane.showMessage(qsTr("Hello Berlin!")) + else if (coordinateAnimation.to === oslo) + qmlPlane.showMessage(qsTr("Hello Oslo!")) + } + onStarted: { + if (coordinateAnimation.from === oslo) + qmlPlane.showMessage(qsTr("See you Oslo!")) + else if (coordinateAnimation.from === berlin) + qmlPlane.showMessage(qsTr("See you Berlin!")) + } + } + + //! [QmlPlane2] + MouseArea { + anchors.fill: parent + onClicked: { + if (qmlPlaneAnimation.running) { + console.log("Plane still in the air."); + return; + } + + if (oslo2Berlin.position === berlin) { + coordinateAnimation.from = berlin; + coordinateAnimation.to = oslo; + } else if (oslo2Berlin.position === oslo) { + coordinateAnimation.from = oslo; + coordinateAnimation.to = berlin; + } + + qmlPlaneAnimation.rotationDirection = oslo2Berlin.position.azimuthTo(coordinateAnimation.to) + qmlPlaneAnimation.start() + } + } + //! [QmlPlane2] + Component.onCompleted: { + oslo2Berlin.position = oslo; + } + } + + //! [CppPlane1] + Plane { + id: cppPlane + pilotName: "C++" + coordinate: berlin2London.position + + MouseArea { + anchors.fill: parent + onClicked: { + if (cppPlaneAnimation.running || berlin2London.isFlying()) { + console.log("Plane still in the air."); + return; + } + + berlin2London.swapDestinations(); + cppPlaneAnimation.rotationDirection = berlin2London.position.azimuthTo(berlin2London.to) + cppPlaneAnimation.start(); + cppPlane.departed(); + } + } + //! [CppPlane1] + //! [CppPlane3] + SequentialAnimation { + id: cppPlaneAnimation + property real rotationDirection : 0; + NumberAnimation { + target: cppPlane; property: "bearing"; duration: 1000 + easing.type: Easing.InOutQuad + to: cppPlaneAnimation.rotationDirection + } + ScriptAction { script: berlin2London.startFlight() } + } + //! [CppPlane3] + + Component.onCompleted: { + berlin2London.position = berlin; + berlin2London.to = london; + berlin2London.from = berlin; + berlin2London.arrived.connect(arrived) + } + + function arrived(){ + if (berlin2London.to === berlin) + cppPlane.showMessage(qsTr("Hello Berlin!")) + else if (berlin2London.to === london) + cppPlane.showMessage(qsTr("Hello London!")) + } + + function departed(){ + if (berlin2London.from === berlin) + cppPlane.showMessage(qsTr("See you Berlin!")) + else if (berlin2London.from === london) + cppPlane.showMessage(qsTr("See you London!")) + } + //! [CppPlane2] + } + //! [CppPlane2] + + visibleRegion: viewOfEurope + } + + Rectangle { + id: infoBox + anchors.centerIn: parent + color: "white" + border.width: 1 + width: text.width * 1.3 + height: text.height * 1.3 + radius: 5 + Text { + id: text + anchors.centerIn: parent + text: qsTr("Hit the plane to start the flight!") + } + + Timer { + interval: 5000; running: true; repeat: false; + onTriggered: fadeOut.start() + } + + NumberAnimation { + id: fadeOut; target: infoBox; + property: "opacity"; + to: 0.0; + duration: 200 + easing.type: Easing.InOutQuad + } + } +} diff --git a/examples/location/planespotter/qml.qrc b/examples/location/planespotter/qml.qrc new file mode 100644 index 0000000..6903ec0 --- /dev/null +++ b/examples/location/planespotter/qml.qrc @@ -0,0 +1,7 @@ + + + planespotter.qml + Plane.qml + airplane.png + + diff --git a/examples/positioning/geoflickr/doc/images/qml-flickr-1.jpg b/examples/positioning/geoflickr/doc/images/qml-flickr-1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..42514ff06dc3549246d39e01719c202624419e58 GIT binary patch literal 66794 zcmV)bK&iipP)tnpW| z@?5|5U%>QPx$|Db_MooLOP}*nr}9;`^IygG*3!^4G&BGJ04yskFfcG18yiqiP%0`a zGBPqlLPHrD8COCJ+!2A|fIL9k*4)Fs!{X!SXJ%){!N=?B>Onp~ zYH4b1Y;7+tFmZ5ky|up!3JZ~rk$QQ1&C%D2iH*Uy!N|?jPEc22VQSag;*^t@Sy^AY zvb%VEnoCSlcXV{)=j^GZsJy(xuB@_CR9yJ?_`Si&wXU^(f}nDCl%k}lsHm=qgoe=6 z+iGofgNLKDw72Nx<=xocy1BevTxO=9r7S2XW@c`fnw)}yhVk(5fr6N?r>vl!pu@?~ zrmMAab9Zn6^7SMVOMWVNgy)IX5RGACQQv+TQEg)z_YysBUnJtFXM6 zlA=5_F}Ab7jf|b>>+g<}x1X7uKSE1~jjd`}Su{34(ag)kyt_?CLZGFvL`PA}#KL)I zXjV^0CMPh7dqz<`J4ii4zQfdWYf-+nv|?p@TSY`3Au5J)c`PqFBpVo#p~jt(j}{ms zaV{cGNG@DdHmskQa%ekaJ~)npZL^mnAqfhZgM*HHCO;}Dx2vQ|Txm2XB2h3fo{2N2 zm2RiE+J044er+43qP=!QKbwkGj%R2^OJR*VC9Rf(SR@_4sAIaMKe3Wb#*$`8;da|0cgvko?u8VcNpDnpBvqr} zX>zz-qT*Yp3%CbT=6s>IOb492;#YXk zg||Rw&$7dPktpZ0*Exk(c134$9d6%$NzuMHzpj^fZZ|Qzk}8M^6T>_r;J(K2I46GMP6_Qm3m1EC4mmLsGJ71bq^OSQCbWVp1K%ejw~5^7?t#p z_6|2|kqV-lKSe%7M|W*Ko8IxqRA@8g5`%w;C+?x)ct23tTw?oL@%wiN5_ai%vl5yz zo7asij087`(Z1VjEwO!l|L!D+WImr~f0sb|C2w4zlAKF!qS|kH?IpIar8ReDem6^h zt&rW_G_J4+rPPl!uf;yg+bp4jmT1(}wrhfF%kGxzJkKLkk-u7EL+!~>BTUG;#*R=v zKRm^=1&S`6v-hw@dkL{wqFFN&t$OV1E;^^$nmbbWJJO^#evVZM5Z40{1WXJB)5)%} zBSd}4(W!t-I;VZuW~P@Y1C36zM021Zc~$6a)#&-b#G$Y4x?8VN`+gkxp8%{tl&N3_ zFoQ^U<)<0@I@}71(K)g0j+VGMR*VggXoANa`q+^&_Fyo?3yX4l=HH8A}Cv(x!eHQW^ph7bl-Jc7H#ea&x&n2vdP zmE*+c%1ID^i#q6jTsL~tmgp4;JOEq8@0bnuOVg#Mu^m=^jSlv28s%x&%>oC7Vv z!$leLEP_Yd`@jz=-*eizS1n<*dypgW!@7p+_}vIv+izE#zKh--e|vA*v6)~7zloa} zg&xQVJKgQ=&P4P*&~S_}1gdu00I_p?;Av|Gvjoj|a>^L=5=IAsdX?pMJ>8(euoEh6 z{bv6Eb@u5c-Yl1=^NUqGq$dz7KvLX2Q3Ty?E7t$HgTA;nrrn@F(Cylz$IMT&`>03b`?CD-OqJ&|O}+M>S1dfIk7zL;NJLNQw`792M) z9+Rm%B{6R%o$NZD@eucb+7fGMi|uZKi6eO=7@C15NfO|GV3t@*+idrMO&;1^u~WCH zal=3ufKMWDjKm6)?u@DkhQOr3KNfZ_Fpy&vbcvj@l3ed*+wFdU{UarhEen4z7W0Ds z2VdEJUSHXLUTb9c`tXeXcHj5gX1#e|^k>y~b*%aSQvGyZs@`SW3ZEYz*U8R(+eAM= zYTzd6D%H?vn!rMaAv6O_7O#7M;maLy&iVd3uajN3@x%a@Ol5ClPSFW2V2+F@bhFFf z3N#{j7QD6wIG|;L2$0*ntdiX>S`Y$b#$`MeqmhPLtR0Wyzl=AsJhS%dLN3_-;kaHg zX15>`E)0&VWVaV0!_;-rsXAW{;GDAxiE2tD{#`^;8BniOF(pMrLtecHgBZP6bedh_ zG~)Z{xgu&kKJF;PB%Gy_VU`L2;nq{8${3ni8<{D^gPjYK6bcUWBSzz5@dH2zMr`~E z=K~o@G^>pWlOfz|_)Dm3?uedN$*wnKiMy^teq|QPnGI!etU=X0ypSpjv(%A94&4he z25~r|x88e9l(Wl8tU4E*e(W*)R>Pb9tmk<;qy}nmVC@{6nK$cpeS1SoAF{*f!7_jh z!9v6)3U)r0n_sk-QI6U$5Qa};*{vsP6iU4TTxTO}Do`tRRH=`ae4RZ5uQ_XfJD9L^ zSNp^Vi4zBg$$W8wk1R-W?ybfypx%uoMNC&hXzRt(y_;dYr@z1O$_nd}_z+ePaknDG z#;GMAevQ;eTs;I)QCR3WwLw|~143Z1d04I`r1+G}(sSgg%>|(InLTO{HnTx!|;X>KHyITSjHHo1Ba~IUL z#9s7$yD;F8V2o7LG;P86sR(=O5(nQd%0L|`z4A&0gjF@+rY2S0T?L|6a3Pqc`mKbq+KeT<(%aXIILHvBmhNwYS6XX?ba(z^=S-@ zA4sLSic&O!iOyW?4Nxwmv@F#*RGf}l`qI)Q6*nr#yw$i_S zcT++-CktBV!1lEav}G*So%^Oz)5d}g<#bSJ=d@k(5O=-PQoHYQy*uWA+S@OOy@tDe zzu9dun}*H94`J&gy2zU#PlBY`vJGmQI&UJX;*ljv_QHHy3d&sNeZW$KJlMuj5e9e) zi@GJQ)ocOe84JADO1wz-;z9>s$eGaqhONX_3Bzw-lGNj9Mji#6sZ*XimNXgo^galq zf@Pntc@3Py>U1({mbX;kV{=&YSLDf&9A!$?oW6-`JDJMhvYj(jU0_fOq=+X9$8{vghn3WF>UISKMS>3_7F%TC)s6oy}<*4Wq>T0$Yc%sA7@)QwZM zr3xUL9)cq!%8E@Cv7;=KMzugH4-hFEHeI!EP^k~se|*WM0dS$g5mDh?oRM>TL>wDuJz3tAh!qldk-0exyokV4OlX2+mn%$QRHUoTp(s( zOyFw3gq4;9gkw@CHXn5{55XYIs3Mwwd5jK(6vW7GAdC4rgVC zTHfg1THGC^aZAPd%iVpf&ak51h*c%6mbW*abG>|e$_{w1f89BX6Mc7ZCzwtmUA6au zX8)|!?pH48sr`{oWlEcRa0k4M+UR{?)q1yA`_R|!x3GWS?+4r1g5WKUvrB(;W+1gx zhDbAzdy@r9Arkm6gTOnD#IvME zR|k86b=N1uvjKhZ#&uh!wCGC53-&Ik;@yy;YgxDS9@Eo+POKUoqPN6=TAl&Qn99{L zJyT}_jS6@0mJccv8#7v*NVvnNy_J)vhsCoUqq0I!P25N+v^yUZ3#V1!&Jac3r$S^# zgx_4nWr8v7$`oWquoicLihv5kKsg6nD}%YLT+{5?HPCNb~|``)iYY2(4l-v)YNUFnl&amv$hG|_NnfH zZ5pRn;Hn@J%#fJ_Q9&3k4JQqEo=&7-3G&VgmMEsWV16X?MFsNCe9sIF3Q;gW3j(o% z6bmkMq3MgLFah(C5P75CTHJY|0-@u0QaRPF?4AO4;Ptk{JZ-Pe8*k~&V--FQCuanX zye5He(xe}eXX^oNRS${D6M~;6UA5`GdxiQpBw!QLuc^m{b4xw@m_{e|IW;~)THOY+ z@yRpu4~7y4N-Rk;ajKNi#0#vvXpt^v5+o2np09-LJ%q(%7=~&F=T_#)oq_s)C_avO zQH;k(MTl9rd877P+{HZP!1wKhX+QYzvRd3IsBQWxNfJFHE-HPxm6KYx%N~*E(Xsc4 zUQ|b)^bvut-hg(JMTB zBoqVMU7j6L%j(c`4;WyP;*Re-NarkMhpojO^Bo_hRMKjaM32L*YJPpWsY{ASNr5|` z`jayn$jJ^34`_5a9W|;nedYh8@)3Q(f2~h0X-7Yz=z_|nl7BQJdTHFX6-Phx=&cx1 z6OF(>`-opfmVTz{Db-!WkjgR?Qg8&s(@s)L+8l!qucZ>3k%);oIYv&Xd~-CR7G}0` z5i-hu&@SgCf7UJ<*0};;3?;cQlbk4#THv?(mrywX4?Yf_hbn8=muqn+{1o&B=Mz=Z zoB49Lx)nZ_j!5L(o*}K3sbNiC)6k-6x7+X9)R5wsp0w!t)vH&N0X;?DsY|N(KHPPw zu@}Le1folQY(pX3&(yL<(`ZanHKy_tstdzs3Y0H}Q0B;a7!^GNQgwd8qPsBs!xdM` zbd_=EGZy(icilqWyawEKSHQHx;mcoacu7xYF)}}s$pn%7;|gG(SFsss4yq-92jAe7 z*5=MZLCDex{nLGj%M!1;VV8U%m)zz0CPSKbdNfSN^u2$zi)^{=P+h{Elf?R*1~1_5 z86Cd6d3`jx>C%Zz-NDTU-3r;Dlk;QDqydtxGU|#8s$mT?91eTPM4>R(z(L7J;fwMf zaOX1f22b5Z+;pUqyLuS&ex{B|&hbS{?v~9-n3=?pwG!{_f^$b>{(p_HpEA`dhzx z|KjKOI=XY+k2hzl8|9}@Zhr9Io$3^h1vlKtBVhl_owHQZN19)Z@(FX@coST3aA)t= zUF)ue+6fbjkY1|BLa^jW3$E1N;oVtv7ul^gr6t0(h0>3qx235A=Zdb(ikK&1dg_5P1y&$g*80 zUMuqH&51YcCOCnn^mM3-j@J~TiNT5z60V}J@679>zpLJMaUBAu7Ut0+2#F?f1)(yk zutPLdapxR<45JMPahHla4B6ZH#fNw!0_xsg)psl|uik__VwmeeErQIw!X%6}LiTeH z!-524O|M|k)TV-&r-q4s`xPnUPw<~uM01~`U%o-!lN+&t)1JI3ZtIS%1R}W8*CZ%> z(wH*TAP2&hc5&~! zIN_vaS8S!~&49i*%(myAC7?R3OHngV0n4({$3UK@9kacjlvmK80N<|*?C;sQ3qaVR`s9`<)Yjj{e1imJ|; zEfOH7H1sNoShm|Of$Gj~5A05pWufkRb*b-V&W}EHl5?WvY;^)w=Z0?0Z$M{Wms|FH1dxF$xu8l#&Vo-bwL^|Aky7a55b zaun+}3uD~T-6%^54T+#fwwdy_Tmlt}9t;!@lMZr=S2%}kDc$W%RNBitQYD#)3c^I3sJ~f!Z6Jb?)Wv!E+*H) z{$b&@aZN$}8A~aNsJnW&i@^K`w_>Se)a!1v?(7g)LSb^31IQT*r0pSF#47RxgB9Jn z6WYRWf;(m|aS!E=Tsf95UaG0Z(F^NuV-EtUy!m`_whRGwio8*Rs^iX}K5c0twzv&K zP9fb%40o3b=zhBDl&JIfMCcwCUK_WXQ`nMcQmhJ$gS%L{zZJwNNNnrQP0a@~pOw*F ztCCWM6`zHOs`c{TvsgH@1baC-(Y8pR)ayaqSywKyz-M;nN0($`2N}_j(D}>7d~vl5 zsV|kb!}Ns?*0SrfWXdSFK#cvz(3xzn!)@I0>$yvN?yT`(zwjRPcTowJ0@o7*BH`Fj zC)K@;*g+n}ZgST)A1Ip)AgEjb?+{%5NH@AeuyS0qjts7(btfsQJH;K!-4H!&uFl`S zwA!n2PRv3=9(?-p@27Xw0 zZQQ9>(+rBmVhM|n_t|qN7Eq}>?9PA%`~4lW=fY^N4n=%Jm((2T)FmkhA!^WWAMV01 zMIGLq_IGLX(WN62ogDhatS2m+w?BY7uq(T&P9ZCjvc*Mg(7B4Rl8tC0pY5fBhr%;Y zq6u(2#1wa}ye96xI}3y?f$m9n&Pts#yAiwJ)YMtN`bxp?U@tpwN}w%S(f!x%i4fRF ztl`l#eC}?kmieLF)gg0wVRPR0eJ-wg6qKhEZOoYssD-n0XCevto|tlyXF;;$9!u;5 zL`!WdfPXD{$TBzfj0gMf=&}AzNU@}(@VL9tU@S38rMBmp)HEM{AbHTb12U>B@`O|z z5leB0-|q|sxDz%NI;6X4$Z||5wy55Oqsf6oa$0q)XZ^+5uI##Cj7Y*xC#P*eBBIP* zJrkv_Cz|3`b&tx6mHme}h;;>I2(<2|xUIXY&050qNcpSlE?EK@G>37brui5@0uPV5 z>ju1D2<|8lG9|^GC1eDvgqKZ$-QnETAs>31B&cH(u##9p49&=+83J2-5O=H9T)Diwnm@nz^Wyj4m+15s zOMLNod9hgN*S2R^@SkYB1Xz6zX4*WQ&o5?JxxllVv)Rkd?-$F>1-`C4-{8k$F~!AK zRPZY!XO*k7tE<^^K5&lvEwlRFo^!k&o4W@39r4ZPyp216NY^LI;(9(mTP`;9<<);s zxBBOwe_ns^$N3Wbu$cc|c57DRj)7-|m**GQDt7988vXO@a0 z=uAp9wPAv|X`&MYRFsm|_+rW?Xxx{YDjVrqNKuj0k3zB1EHpJ+Ox*<*WQ*>K8;DPu zcz)ATtG@Vxr!&(#Go3Sc?z#7OKjz+Bg~BWaBI44$<-m&R(?BpB@UO4j&`*6H2yDjP zUa!yR6GhQGM-Jbj_p^^bcAs;{=i=7`fp8$O5)cE7cwNg&VaB(-d~3a+9+?k7yn5Ei zaiS;)0s}Z44#~`$u}I2G)TxT1?Zsw?IRi;DOJ-xbk??T__vAPut5<7kDoYu2_Y;YBar-Q$|jtLj-m{C$3w|vEE%4lznaR%TwY*2jo~I)JmHPK$iCch$RWWm6&qD zXymlleN&Kt{Ex#9;f7g~U2sdBDAkn0@YHzQO6RC6OJh}0OU=tn}@bb$qBUoRtOMT7M zt*L?f+98W69T|G%6(`nLhK5G;2u1{Cl?w@oM`$rjT0TuKuT93VZFty_ZzA!=bqnK< z^_27ef630o@X4YW_h0gF)xFulpvb% z26LTZ$X3XSS#nQUvM`F0$d=YLYM9E}wX2sdKJjEBhOd-*8k^PWRF6wK9xp=7tT?5) zaS-v*{a>N5Uu|-)_`}KY53&95+TG3VTd~{Qv&x;#h3(zlc-$M0`+}iRFo;cP##>uE zFU%xE`(k`^HW}NFMw6S-XgnT3bdDwbiMld5W0!g9sXZhb6dMN6sc3k_Ue|O9At1UC zoe9oA_1gSyEEb#Fj2$Nv2Z=;rH<@?5?@#U@r;ZN}&YeSnF2hR}@?|6_h?Y?Y!EQ%b zH?_BSzaO@ zCkzRTJnX!v_P7!Cu+ZuXdabq*0GISzL`Fiw;LBpt57^hqAe#zEp=KDyt`p=U~KKUQCYHjX(a#n^rw5nwr2i)-^rK zD@^A)L={ftA`c)jf81DIe)lE!{Z;Rt@9_7)#=Yl(?@VSo$ z-)2)s$=G~qGnUsiI-1%}b&bwWZ66%(9~@t9E6nmjIw+UctyS0B+SA%@pDsh$0x7S; z^auv9R->;)NA=@nx@Wso_)CcHn!dtnWwWxN(qOkky;msdrNztTg(hQTW7A!oW0N+D z2d2rf>B$dwaMYo83>SzSHc`@^^A|8`^L-YvHiT3o)I z;U!|^q*z1`w2QEd9{2E&6Gvnd;F;6GH~@%$Jj4smdPI>Ct`+hOrzFcSerUG#I~tr; zo7HLqF1HcyDQQ=P5z2r<(RF+0iH?KYTiXX)qbdJE*YQ>=m5i+TCP!0UNfIv_J&G>O z%+7v@KXM2S4!-o!;QZot!0Qe9-gbw=k=X9`QAqQ_b~u$t#LA!iix-(3ltXeOE7#uM zu2S_(PADkdp-UO^sfzl1Or%G{{;Q?w$sT=USpz0B!o)cF>UNzjqu$Huq?gM(ng;#? z>xxKpbyvDZudM&_%gW;9IrEin9M7EZ?0lvZ80$|sg2{E-RS1Z zntLTUIyMIFb|aBcble8<@}S<)N2J|HAJx`+!@;ONKKSYG?xuhD#s@bx-SJP|rB9y! zi+D*cY7tNS?E4~?DS$D60>b@Ep zola{PomsFUzx$9<-rz?sJ@?%A-#_<~b~CaV>WcdIK|sTjr+W5?05(F}B8q^h>H=Op1}w9E2lwWGfioTWs3 z$uQaZ>=nIc@U`L5PD^bU^5C(t&aSS`XGWhHm9-m7J-8G2{tl#ja6f$b+HzoH)ql_J z5Bxq5SnT0$|!$|FnHs;919UF*HMRPjg?fmA6$ z3W5~We~|hvL7b{HiZmb`Z50_n&PUT|!UvaMEJGQF#wN=Xo>4_Km-pPsOk(HnDu4@B zXu_*+LPz)x%ysm{1!{{rM<09<;QIOQ-KC|wcky-iDsY!}&n&f|Cu)|r3B(;h9laT$ z*T|?p6*i=2!y}(ml+_U~8zq53b~g><8I+`|%HFf*8?I?Z%dpL2lLWaw>v2Nw^0O4a zr_>gmmX2%?%9zK;Tgw;98G%}{^qkRWG_s$2Yfgy=uOY5|3bBCz24j9ZfCzUeggxBBS z_!x!nDfKlNF-JRd zR=XVDtacN6ueXwOQKOm>Oj-+?)?5~mcTIRsFadZbB2unux!PrUiI^vdtX``ZMNXnS zJF@a|mJGy(O3r6Bpy+Hz60ChnEufauZ5U`b+Xf6cj0M@9wXu=H_rmFvRnpRtb}R9l zv13t-6wk2Y+1KmqF?bs*O<{qV6JYp?G0jp3%^aXC>`-RApcEBQn^psCTTx+g5emxq zSv|d$I~miTGrbCCTqu(JK7#Y#xR^nEO1kOlvog$U7$8d2&ajn2hh{Kxe zqGafQv46l2VWb*usn9!j-QKF}aaz;5VS#v!jTFA8RL;a$?ZQkQ;db)I+LA-CFc!AF zB%PcXtoSxlyFVjH)VM*rg4ry{UlQ4mcxy;6Ho-*(?+2E?Hi!T9b1} z(8-5c0>T1!5(QqL&yi8RCbF$MChf}8#z`>fKoVGnoegZ@?(HxHL3> z1D(vpKX!5FzsV+pL?aNdn1LR9`iz^!g=|)D$e6cWY1-JQF`Kx zIbcc63}hkkFy@jiFS7 zsDqar7O70ovj_$X6{LngdApk3)`=+mB!yxcCUo%B8N0LtxAh$(C%7`QWjSinl!R1> zP!Y9}hy+d-p*z5FWW38A? z_AVR!uyxr(i1XQfhUm|b2j&V`Y$fsCSD*j%)0Z2Q3H-cMvvX)RgdRf)D_?XIzx{bit{|zRB>DcQuo*s-TT-V*n@N(GQ zeHIIko_*}3u8Fw9=nA*V?3KiK_rLh*+b>`5)-WuWCpOLCLsA5qPwmY^8JfNtQ(kDs zzJrX3UtE+4R77e3aGo(z`b_%=eo2_=$J0`)v&9Ev{X) zcOEX`WgsHHda4a~btzX8-~IN??JqY6oe9FF^}dkI7St5TJbP}%m|+NI0Q4nxp=@kI z0fNZQ6Nxbewqwq5p2WaR1xrvCA+n%-wfs#kP8-KY5b+FB8k;or8ib5NRFG;ga|4o? zP5{YpkAyJNwp5(pG>L|Ks4C))QO7Xy&ISG_sON+xlPz|HP!`;sk63E}2JyIP!uh7$ zc<70cJ>Lqf9_;w1jC z!IT04_KHCbNKlTrki@c?kqE&o!2~m#QZWE|7XjuqHJa<>LrTz>^W?e5LZRLI~fjadnNJR2fzRMCMQt(0h7PbqjEF%8mkq ze%dw#*Ddb2d3yZxD{P9zdI_n99EvG!WvQ?rnS^{I5<-!rK;&`d3kleYdl5N*76jD- z_!Iau9(h<(FJJ`zH&A^xVaDCo2OqrEKB2`BL%ce;>9y$f1MKb+C+N*PqPx>K>~JOV z-FLrz{l~}UR=3gathanvgvE;hd-A9+CphsdTqTm%I?$5T**;|q^@bTi|8 zs(!~I@(t_-balregm~M6!?1fbVof~K@ti!xx=6=qwL1Z>yZ-s$-eAm%;j~uci2Q@R z)~yK#5nj7n*LFVYwHu0MX{{Esyxq<@S)mOuWmUO?u?8M|vj+h^Nv9#zA|jld%Nvlu z%V2+l$^~&Z+5YBNl?~q*41vMrCEolHiL}57#t80C@Mv=wCo75X-hb)IKaTHrJEK-@ zt>HM}3XKwigQ>{#1W8Ss<-(WpsOa6?0iX%k40Fqlqg?K}Uf@|U450Y98WaDfg;Cls z12rsQ(KVLW^*dT#YMow`k~B@POV>y*V0m0z>#m*%nu0Pt_WEhf&2X)rv)a=DxO-Y_ z-C-HhxTC3T2{qNSWhq8uWZA&6ibgmnmT1Qh5J0lIyoJC8B0wxaDcWgEto0F|P;Y(z zeecvzcY2BqjuOt2fC4sJOO_?cO5(e(KmGQPv%P)?cre^Vvp8H1=bUDJ7}Bcb9g$Tn z?t>f4LLNA{&38(H3LJqK)V^D`JURy*7*s0CB8X*JwR)>kDFt<1_H?GsbpJs&viH}| zv`W&>-eFkp-Rq=%4$AskkJg$rv9a`p+e$m-EZYgwff{SJR!ws6~`P5<1zUz?^`wZ~-(SHt<5eJ^^-zr?5JrjmVnf*kC*c zkMNrB%VZ_--S3#ITs$%A8BSlukmv=!EC zYik`^B&|pAbT!?*Nc-u8TyuI+X{PNC~WJg!f+w_9nA-Ufi| zGrh4s*4n{fouKvD_jh>lxzH$h#*gZJJGg2M$>V5~HJO+S+zArs*43jbP% zUFhDGKI2_I814u1+VNt3CW$Pxm@Kt(%a*9jBvO+5vB)tNM*~rC%M@ zQ}Etu=qoYM?Y4YHUt^jq#NWQZedqE7%09j%aQ7uUq>jZGzxx?^%UBFMi!An!=tb-S z49jqLM_rZ`8NHH)1!kw`8xOA}zPtVUmyh0fV$x~U*i(&CgzJf~JIqxEdus0t_t!B#BD+x%S$}JQa$78cx{8q< zWjM!bP~J4-oI~I0qC&(=GeBUq67{~ z9Of$GJ1i6X{%oT&Y5DTuyd2Pcgj>o}H0Hz5%m+6?oDzYc&pufZOt3_L(sh_9aaK}X z@%JK{P~t{|!-}F7-%Z&RAXpho^szF<5AN;m-t$znv%mGAyR);qe}AiV59{~E!Tmj4 z0L=mZ--gF`pL&8m=XP*^egE-&%vGLx@R0*$J+*(Ze_w6i!^dYHR)_a?A1--MZEQWb zp@g7q22mh_5S~L!xl@lmx3&_dFEikpS|$rXW>B~d9tTG?-~i*<=_!(v^ON&;VQD~S z-nzb=y>rs-9qW_&&c;gOyW2l+Z@)aiay>3LVhm;!)fO>pA-aJ2X$Oz!!hf-I#;#e! zU>N^PsuC+X42j1jqTy3RPdGjO5dA<0OBG#I5UP_n2rdflE-ubaZk-(Z4+!Gs=%}+U zcJg_XT<){y@m;Y!Ec7Sl?d7<9*F5*W$#b>BF_i*evntDlbH}VSIj>908P-LJj!g|g za&s@-Hot^^!@JN1{ut3rf7-5xwaethY(~Eb%=_7H$}G3k;_{51KD40XijH!pv)bkf z3|t49y3h<*RZq3o?kqMc&%pzqZ!_P(75Mh<)jPM|zkjqcL)MMq?>>M3`Qyil)!TQR zT#~}Dk|v#AKhQR@NuAmmr?}NrJDi1jTC>t+PV!vI5_1M?!Lm{Zr|az!rCpRSL0+&s z;e__aOVyrc%Mlivs?;9jI*ltm9H8mtF^@>)gs&cz&PY0ZzNRB|JFY9BK}r6umypKO zENJ%tSx0MLPz??K22e7$er^4_aOL_E7{T9t|F-e<$qD>gi{ncLGpe-C+A_SxlIb-e z4z1w=c`2ObRtd*6&y6gMleSh;SGCnGStg-8pzKXJZL~?p^P55xXY$B#LtZ8{dVwYo zpr70+iq$0z;wn@PMvqPj?KItv{o{tcN?p0gGzJhKPYO46a7dqJ$Cc#iFc{f%60ZsZ@xGs2w={j2665HRp4VDkcoe zo6Fa(ty~|&-yM!|&DX|LabJw~|Brp(?7xkVwyF1R>2RXvOXq0=JZa~xKaSz=PQ|#U zEI6YX(I{A_vYBE!zsE7+ToZ>}*MHytcs~GN)JM-UrtGAhxBfVSze`WaL=oqfYgMag zN8@e+^v6Ep^>qZtow#6JY6sJEUC#*Jks(pb_WP&-!?f_@hyC$nNY;(u@6tz+c1*a# zM@mEwqHlL6c1h>=A|_IQSL#mJ-}_Y^6f|egQ?Y+MPF;0Xtj)8-? zD6X~h)*r|4cgrzO;!`CK;-WZd=dC}E>hDbOGv**JivNwjJJfJ|SEx$osZ!5A8MhpM z&7mQT;qP`^I}@g&o#TBnt{Hg2Q06C)LG&;TPMuj7o>bwRQL#!YK=!p#}t%GBC1<4u%>kUU(xK zR*_=o6jX}r%FEs;2zw>o`aDU@DkAE|{PvvWG%L^Ge0WaIv-El9|9ivanSa(@O?ij5 zLFx)^H7-`AG!n>_qG6#{b3*ne@SWu;8qc5h={ju>*8U)sYQuHnhX=~mcrOS!VW_XrY^EQugs2fFwLvXsRfwjD;|~XMgXWlSHFP^ z)E5gDhULTa(ynU?EwGLzp+hylt2y#=sk>UKik)u+tJRzZxqmeexRXA8+W$Ht z+&C%FJnC%MzJ|bF>FmM?TJ4W- zK@F{2@v9xs34Z1P24B26?7#DT2iW!ZZ*@AuH*al&_R6U!AJ}Rps(K1nb>N9_YvHq4 z@JQR#Y}fZd$g-yeQFn+*=YAB~fH%M?X7vkfs)me;9(Nk34s@`u2w7Q za^y%UXY+#PjGao&Vw96KFL*HzNv^a=u4=or;n0qvB=WSxw!yTiC$^{36vjzpr-{-W z2cNb)aCMc;KV8n#B3J1T=Y_mn7RBY{u^*N*DVMX^>Z*{kiSKr9D86gh9q&I`;^{nJ za=Q%`q~iFn^X5x?qnGdp6}#st6|uFy6?UGDV`R5WT2_1r2zUG4Hv|mCwIP9F%na1(l@B)=T)4) zJ#e?S+lMS3U>Dzd)*4zpqt!aucBl|rTTdVTN#jac*2^r0cPfC1ia_PJm@S>@jH4&I z0uoY9Mj559-a|-TQGaIz?PBh@j(6OyN@S(^O3hP1#fU#%NpwBMxVe&7#NfOj?ZV(H zv0U0V79lC%olA3W`od`JGBB(wWlM0eFfk)P@xrK=N|mHirU|q}*@*=X3GAdQCV83` zOR0W1SK$NaN%4Sw3D{Ek!p1C}&sEXHcRM#1-{D>b^#YVI0chLEsY~w{okL(pNbk*C zyLGX&7>c%T-bR1B)zLAb{v}v4-|NP7>$tPqEt7Me9|4r@!;NYx#t7_aT!Xu&IB_^3 z`eYqy){Cf1I5h--jI_Yk9fD5jx>feS#i(ee7;E?FL(E79k4wE2*r}D2h)jf5mU%0H zri6%6fJy~X0`O7a@fiGuP*5pJ;WA1iSBSzRQjI%5oSIR)iQ=fct zIywFByYD97;iYj>UOoEbQfylo|u@sY!9@R6vOz(N}jyIEJ)D0)Y2*TLEZF{YenW2aXZDR8o$ zla0F>jM5ZJvnt63WImr4MUl7jJU8%r>`=%v5Bhb@ z{fzDBYu)kl4aRpn*YVwRpPyii5O-mx*m)M6?A6YmwfPpDMt!IiRF@CK?0fzOY+trJ zeG1#cVb{{h{o60Mdk(Pcjy8`yXY+N+4z~?PD|VIFVTVEe2F4i=LP~lS$=WGpi;5PF z2vL*qBnuW079@!D$Obx@r&9*1?V2$pBzM94Jn*a3aZ+W;0&aO%SFnuvR~-J0D5g-7tK`T)HiL#xKK8qXbn=*K&Ltn}HB zAO118!T4_HI=*{uA2*tJ$LL#~?blvCeEW^g)4Ra#^Umx0@4VdE$Ep{W)qm&p+sB<- z&VJ|i@$0YeKD&AF>i*uz^Y64+AN|gTe1KOs510n|R`paMF=&3ARQ#$AuVA4sf-E~K zRl&6aV=xdA;R5_F39RWfsD73VysqVW>r?FXVe>K^Id&wO75biX9DD5Q*4*)Y$F_80 zdDBQl4v%cE2L@)90kyU+3@>07rnwY3XpraJZR}R;PHS3ts9)u!>QwWbt+`i25b$Ad zbc6BTP7~k3nu&Xr7m!eSOWWMnx1p%|Vb|X7bZ(z?UV`P(q1@cx>}+m>lXW(~=xoN% zcSg@{Zf}2n59i%|U}tq9ll7Rg?)E;xw6Begy>Tg*IGT^lP!&6Ks!#nAWpl^t4=F5b zR3qy2C}Qq(dS=$_h-Sr}jWhg*-Le?YC>B)s)Tb;IzU6zNl6DG1Wk*EGMPP@5&!Lfa zyId_>EtYfLWphjcDhL=urnIq(hS%M$9Vp-Nx9zY!u7g( z1QtnS7w&9vY+-_n@*%V^rLIe1>ya(+k2evO{&aDshun7uJ{$N0?zd^!3WO0b?sKEv zBAgEhBXDT!qT!O$->Jch?7sc^gP*b8fvx8EXWd|Yx6{OTaKD3pa&vM|{6`U+su~Qo zvZ`Jg37ed99psgjNo*`^fqyKak(CO9H+vB<6wX976_CO@#(h^3`K})K$7|{Z_H^p@ zuWyDRLfYJD8QgWrfVT$}uv9B->id>%MeBCqnC(y)?SY|jW2?LntmU1jPp+&KdP2(I_`KCuQU7Q!&O}GsHu#<~X>Q zuGKw*6j|}*v{!o}woDn2d&xD*jIF`odzI_F+irgBz{J*e6zpKgp;dS_0 zhj)YV-OhD<_nhWZ${vDVW^>T$)=e9g$nf7$(mJUlEafYuLS{$8mTTe$DaG%V*db(4PSC)di#mZpkony+M9 z3oIDCnhBVS1H_d8Cd!GOBFM_^raxT_*x>uKqq8-3GFvRBmbL|ZijTfOJ%C-`M;G6e zYp%~U-;37mc26N^Y52>p)2`$Bea*K*&vP^{w57lm-Eq5-9Z)w+6X|D)=|bpCctq(O zf`!P=Q*Uqg0BR)@N@!!3gJFzGuwlm+2+z%1Jl1~q0f56@=3fJaTK`jg_wlEo^NL53 zCJi*~rSvn)pl144sg2O2Q7W&sJ{4KkOH8h~8!(RSfMq`$Pk;LU;+yuxPd}aY0bb*G z-eNjkv|vZrx)@GI#>T~T6npp+Mg%kcKiP!kF&k)F*<&@^EP&@}gs4hnd{+9_u2m!-@OZZ{}EV+dRV=%@99<5sYuGmljxM+_kO)F+%;xieGajTeS3|a;wUV7 zanC&mLx(ZJLb_PkG%5WK+xI_BFD}{_)9FuV$gY;x8cY`paJ#LKrjtqhL@=BjjdXC! z6eod)>vnzdJ8x(9+c*`4@jrtXqLvWLR)XVQ*a){Ikbqqe?sPJ;Jw*%%y98xeB9LIH zpcu@ssVpUt%2q&B8HiefQkDoImJvK4RCoa-BtS@rO@P?n`Hs_su)X&4bvQhCxtA~WT2|KM(D7g4idHpjY&8@ulpCVThQ%zea8g-i*0vhih<i#WcZayEhkmvAIU5K7TEn=<15|%=XZqefwSRWknFf}y8Lzpvx8eb zRJ+==27`Xz?ibN{I4N)yF&`=;q|m5f+>2^L(}q=Xv>;K%bzww|N2dirxrPpWf(-5jZFnHX;54BRj$m8?ULb_{w5JEEhE45Z+-vs zSYHkG^&_WW@Wtn!fA;xb+Nb>PZqf@WJNn&Lar8TFl3|JU!k|y=fNn%D+;ct!2841r z5~3IS5|66l7}M=`8Lx+4l-YPJw3%o$2eCY8b)rfH#W*F@DjH1NY!8;fE{^;pNMd@4 z%R&02-7xW27b$2$a$q=^s{BbsaT!r#ii~2_MGTvURfQEK?i7V9q5^SBu^Kff?8-Ng za2i=RIBFq!=Eio(@Y^q?2MUDT2+eTs?SJe0U;m~*e*NS31216A$I1Z-C~pkE`#JuoSn5C zu^I0csys8xQRZ!BvuarhIV)>Rn`)!L(pqPn!6>r;iq^84Z*F;IOkAit@G4Fj+a<#< zO)6OAJ*Hazf4>{M-p@Zjw|(0!*M9dEx#4Gf(x>(%znf&oJA7esm5XM1r@847yzU6w zq;%A)N3G>Zi1E|9&}L>9E3}HbnwPqwh+z_Wug&cD2ZRqdt=4dK1!sXazXLk3TU>Sr zU?=mDW6?!YqdjHxNxPv_>$D`w&e&pBR^r`VkCQ}8#YbVKa=XG*QiFSp``h z*N_zC0*c6loD_x{5+9A$_CYQ*wkyCe{=4ak;&!n9zNIk=9t^ceC6#yjx2KQwEa|Ch zu6yRT!>3=d{p@_{iu>-Hzwf^LW@h#yzZWnFYHd$)J0q%!He3?Ot!tN8qx0 zA?O{w^U^4UfXwh~Vom_Lk*b2Ak9x_*JQxtdK_?z65^Yl_ znf73H+4uk{g;L-xp5C9ChH{g3!(F#kPQyckugbd+BWc`hPt`<;sfrvMFl)Sc(&V~o zkuuhFZ4N<0=)rArj2Py3GyxyAhERnY+qGeM6{3x*aFd1qCpCdlj$zla)nhp6B^2B# zSN~n>ORpY3`usJIKlsr4Uz*bQCBJ)W%+9%Jfj0`q9y?M|mFku!VAOaJV$rX|VR(ND zS`49Vc;Wnln#+UTSfi?-I>umo;&O=LydotaBsmT-4iiU?-0ioFRx2K=!q{diTWBo@ z-F`7ngdL0H;dkP6s!6-q-HIVno0(@=H3B-LD@k6p(3Pr!#LO0rh^z9RAV?=SsUI|~ za-kw%2~be1Hn;|>cGK`=tzTfcv0WIZ*ptpx+-do~pDYRugPvNY7gD8n;?-9_oobKW zp`{yM>a<#~tbM#bmvUQzGUk5dcemb6Iy+si7wn2^F*LArv{7s>UVi0?0@GYAwBc^u zXaS2vg&|{{@0RXN1Iq}zLn=7|?nW+Gt!`Dfw0!y{wuPyw#k4C~^fYfr9A)%Q-0)N` zMEluB$I6IZ-SuqKw)<_{Zr6gEkWu1#Zo{b?c*(|ASYS74SB@RF%y1sU43*!-KxC#x26lu!|^sxGpwD2f78ZpiM2-Nt9NTfWAP?P@R#NGRlI zz9xD27HO4)9ulxs68$;J4)ox4hc0{ZrPjt-FTD2U`UOijFAa+z>_>hFc9$bZ2raOC zc7ZLbR{b`()^$a<1l_iCXX*B~W%bJ3z0UkXqoGvm$4f^WP3Ihrr>id8TdlJN*wf%E2d&o+((3Oq)*t zyQv?+#*;^mOxi{M%!`r)c7pTD?kDK3%kK=H@1R*!wb%l=E?&YF&eY>z8OcWCV~ws$_0BuNVjPd{l3|eBbFZ3^&-dk;h(vIC5e3hW1$KmN{m|8i4y~uU z?8W2nzj4Q>Z~nIa;LS@nLswjOnIP;_eg_dd1Ab>%1?$Svg)=vnj>@Hbr*52g{pXG$ z6Vhz%9D&${CrYI|^Kdiu^7+D*hrzB3z14jym8Shw6;A%V@1w5H@S*Bmur;Im+XLDj&1-lVPA*0l}zM5@>9f3=c)Lf~uC^iHv5H zKK{qSfgIQkMfjE;+&bg@Pk;Gk<>7k{9|Sy-rtL?5cVP8_6A#>dwngl)lx(43-BhYp z{nF)f>Bj1bd0#kdN|nl@Zgaiu=epgVTe*Du9?%^a#oa} zyhalpjs-1u5&p$nWwodFXq7&s)tYcp+YFLD)oJJ0*`_Qu>V}&H{<1GeAq^^y?ULa= zCqq2xI*g|om2~%`W!R>t>2{CZNJDb#>nqQ$efsVrmppON%JtWyy}WFR*zHGtci^X2 z9(&+{7aEpP1Urn_6z(m#>e14LeChVWiTPT0mP4o(woUES_H)3qvGG3LpXzLr7BuE9 zI312uX#{6OXP*sc>r-PII&NZ6&vl*D@G#Gg@GGi-Hks9?K~}r zD5mI|Lv}NhcB3e4Fa4qiKUzKY4od}#sOv0qs$-Etg@0E1oc_`G}k@Rf|nHQzFA zucQ4BH!qr7R=}e^mu*eSj{-MiaRLW)>4Vf+5%fTFo}T z=^RVsh+mTQbQ`1d_1PxoGMBUHVW~IM2DPbA6T8f$UARj*Wrtv8YqK8sQH`cV)zB-p z)8FwB*g}GU+>N-A6oErX(%#we1XGLvG>Ba%@RKMS+tpKcDY<}mE4(5I)!N_KEsjz= z4(M>PBezR6cj)Om`&T{u=;68NZ@=|{n^%?&LZ-eS`Q3q2-$1W*dsdb$kuKjjUfSLc zm?68`@$E|`k5RgLw3!P%_7>!#w{h&kMJ`r9c;=$4DLL|AvdvUf6@I_}-qcB^YRFN- zgWR4Z)07Z<0->giBA6(0JriwaquTr=mc&9v3IUZABE2KGo3tBM>KOc%yu74=T^#T= z*IEo@KCelG)}Zfs?LI-mC&URr^J?V&<*|`x0xw9!gyEb)x&o`Ik)oaJ*USP%t1>_dVW9hy8|Fc>cgpOO&jP29k8i6y6pRK z)P(iYA*Qii9fpIU49u-6OSYiYh!#Y56B@F+l?nuQb9W7{dhpRJZk~Jf)q74{JU6!v zdYZH!`Q3pJKm73Rw_od)ktC$+WR4apHRvdNmN76r&hB?&9*$Mi?7Zxd(j~WwvwYUA zxMSIZ4&`!G$7f%(7_o!6DE84xM(#9lF)`jr#mY_3 z9GS^9C+#A|&+FLZIcE!NXfrEptKc@3Y@twb5K{WBPJ#;V>87a>Ip8yJeSOD8yczjH zU#mkyuufO=wi;q8fxb^xo*B_cY zxU{lzkYV;CzdMj_LOx@Z3l>WqDdo|+qI8!P1!d4T@x5(-Fd)~Gkhl;nd^drXmw6}s zwZce(@K;q}sgg_{O*64`!zPJuvX&vh^XgUI))~MdMHRG~juX}VuZzXj^OUA|D0rTE8a7aS-?p;zHj~mL2`%$xU<|4>zvuw0zp! zG^#CEHu^>uKw}!Gh~u$cGEA&|L_YluT@&)vMnLlEOpj#m6v^2@ZKS8?ZoTN*kDh$! zv=?t1Y^<*zJalknWrbn(BfmRv)9naQGR1DXP?S|xKrNLFh$`1E5BeK|*6ynxz~5xu z%;lsSHIjS468g2mBs6GCn*fAO=anK@G5*nNgaPc2Au;_4ds4)Di5leq?Qn@9~R{9BKp0h=ZC8$7V4D zFmTMZlh)haF2-zn2B<}b8#+rZW^S~=-!Nuc@EQ(wiCs4?XzEjHXv<5N{mVuKkl5+Tm4t^` ztTkUWo`ml$6(zBe7GoS;#v^c~MF!}ai)*8HX`g1(popx7KG>7Hq8+Ixq=Q6mWfp66 z8zo$fZ8Z43y}e-DO5XI&t{f}TW*)fm1KZo_lE$$N=O!8HV`ylXA$I;|!_HQKY_s8r z(iqhPr!NGIF>xP|gYdlZ!fh{dyC1%A{S8+aCPD7XD`nwK^1JJ(rgJiZZHmD}MQ|KN zp-`yMAzf@I1=m+sa1U&SmtqVTE-ChiMlo6zJ8X)Glz2*0V`fI(>e93s?b@lN*KV>j z?Uj{^+fGD=?3S>!CF;bZ_m$d=#zDj7OFG!$-KbqU|C>#agFg6R5vwJf(zul@=4|Xk ztDrx#?P^&7yNG28rP)SWTC=GDC1PtrsVKe~cv_ia{m?E4!vnc0*r{qp7Ua2qf~))N zrcX8L3x^x8dn|5v2Ved8=T|eEH<0HE$ur6C{Q9zv9EoCoYS2kqA`fgpx2x=m!M5vq z?x|#(*Whd*M#2{qrq~HiiF}3rOr;d zFWpT?`ITyd)iDgw(xf$91-1+fGv&omyVR8XteSC+OlE(7QAj9JQI{~yjIFY^oWv-q ze&1SoZ||v!rKjPDioOyNOK~TGu8Qw=sdLj9iCLqrY-pE-VT@kj)Sl;U;jA#j&2iLC zJ?R%3c+ia`Or8pPxqrOjx~pe7s~I@@B0dA8$Kp{-$CvEy_!kBK*#0XW`?4+<;*O^vdUW`^l_rfQnW4(p@M$@7O~R@O+js(F-_Gn)UBo#VpXX}I>207 zryFbc`>qw?`vW-+!+4Iui$$ldxU9w!yHgQ6!|RXQ1w4Bnl`IrJ19n^b;qJB(GNkdv z1{_Cer=68xyIy^Y*jZF{vdY9G; z(GopyKk+++%ptv}@Ba!XLvr`4Z@&2qZ?6PAIesSj9sR!l4Chp6N5AYimbkqOa924_nY#p9aeFA1QOmCM_U0? zij^r>N!X2|U2boK-ClH@$x%6bEsiQHT}!E##Btxx7)Ixsiw$UKm)Ma?RX39fsTrIW zIA$ztDP5`p*b*Iq4txd7VU7r4^U^oHaY;M)@yBo8e1G!FyRU?b#WTt8sH)9ONI;P^ z><+=8au+`L<@ewI{Ohm3{`~!yAAj8Mw-X-b3f;tbr6Muoa$1c3PZ0s1T@#Is(Q);> zX=dRUz2l78RF8X*>pyK7z`}7Bu_F;X3|?1+(o%I6t6ZCgHr}V8Iqgf*Uu_aUs5 z#hMo1({|3G#W+QuB^5K-YigV^3@MdmSV0^iLEPHR^N1^%Z+9$>t*7 zk=yav@qDM>3!rVA?NPfF+0<85rct+u-Im*Sy)82nGu8JFBc82w>sX=QiSNCltl1L6 zBU_B<-9%U88?MWXR+9xfjcdL_?1py9FmzwZuIBP4DX%H<5Lc?&^y!cu9^`laZIIhx ztYWhdRt@{&b@6zPs@CFD{zLb>r=L zF&B?cEG#slB0r)bI`TUTaZoB%>bQAc%!1v`bDd5x-08Xf{zq?A4Nbvv+vVCs2isq< z*{ZWqvxpsYXrnhBk2;#?Z9{N79xJnrKqwSwkJ_b8o~E41Mw1zYHx(ZSOvJZPCX@YQ zSGlhuR;4g^_=@(_qPS>joc_g{;zS%TQB_#Z<>MHau$;z%9R?r1-JxM5t9VoeI3Cz# zdD>E6_df(aJWl+M=2a+eVo4FPy6TaI7o0cyWaOhpPhUr`5pP)trvk^u^88J zLHw-?7ry)HZ+4#oUe94&-ExFTCDNLL{<|I%q;Vm?Edr^O9hA*htD5idZxrS#!MGr| zqn+hKBd{@*PK!6UssaKp)t_Fi=|IP^Ue_{MO=4cTsVoje-&zzj6Qg$F2+FZ*=9`%; zbxj!%%$u2f)==|X2e=HoeZWa-xXkUn9!=sRuY0(-Eh=KPBpzT?5-gIJap>dXb!cce z1jF~?Mx^)wyF5C`svHGPh`#h+5j+2qtG^x$0do3|jVm_a{ltCzMumT5dJ{;=_u}%I zpKbB8|ip$xA!^N{r3Cs zzyE~W@4x-_>4ghl_l}OX^rWOodVOZ2B!wd4>Z_MscAJe0?flJ!bNmbys$R#_gUo|S zIc^Osx906&y4YH1@$K4bVF9H*qry}xxLl|Qsj9WIP*a*ycrjCtJn|aDPT*f{Bn`=8 zq$FoVl%ecI2#Rw|fTXHpWAqC)V#oD;17o4c7CmRwyeedNJmcu-haFR8)#mHWUfB|D zT5A^N+)nh+r6G!ij*hZ~02{c8e%WGZHw42cQc5h0V~j}gvYO-VQ^z||cyc%=hTElg zO-?`a@Usg~PF}vPJ^m7nR0v)!cqaKBvAcOomcz1O>FtC5mjiYrVn;F4JAa@Xn&X*j z_Rg89joI*g;Z}CyvImLXTwx(yE3o6ysX~H{E478O`P=x$MpQv$Y|XbGohyh_=i;}{ z$o$kDiRGzM?zSmO%B@e?R$;@KFWe>E+EVq}t$DsSZ%EkB@35XSq6o*Ts!VMR=OA{< zeei^;l+UI@7^e}K={v5t>hjBPpFMd0 zmaEROvoCE=P!voTC3UX zm(2wum#zNIE*NhVZWR)t`P%C0>TR=Q*IbNfINO?=Z>`p}*17D1Ev%@x!&xra#nzM% zE@Kf>uCS39FVu)#u7!V9JJ)OqN!>7OQDgpYVj5G_Ik1Zbz)nOX=Tl>; zRLaWdjl)A1gU)y3 z{Fz3^ah$NDSJn*E`l}hvlJq8D` zqpt4ZhbJc=zIx-~$<67_+Z)ys4^Q8&mqCv524Z(6`5mh8J+i$Mj)9!V1dNlI`IEmv z>G$70Ma(=tItm~C;09Bvi(-$?Pu$U}#%87#HZGe(jsN9!-|tYVvQ~I-{apCA)@*$t z^-!y!i2QotW?{J{0~)_jxO2U*A+FEdI=fm}K3B(AV&S%PcNG@OkGAGA8?Bq|3BE^K3&<;U)i75~?i^8$L(|ZdhZ{b-X0-$j?ULc)pAF$$XiBo;%Pz<4)1rDLVz+tu z4Y%C&_+Px8+iSyA9LN8XlB7va(l%+Dv`LdJO=IJ#iSsf=rxC@=l*#Zi^+5%l8b!nx z5f|J`6%>Ra-X9bTG7%I9^~G031Q8vGe}dm%(wmp(e$yst)Be_-Pk+C2ekbWUFFpG3 z12<8GeCg&roYcGJR`<252_8xDHj>|AKJGhTFQkymYy9No{OgYZZ^7;-xEZ4te)dMCoYfkBr(A)Zmj^@r#z&a^2xd?@8+3#bU5~oS`#ipla$NgNuen65+w;@ zIH06^dui8);e&$;)>+{QQ4xG%9Y8?oDhJrD=q>&3(fio`b8n&d>)O+6?({x+;iYSC zx%1X1uUSZGZ6v=#Z{}5JQCKqugYfKwv$L;0s@VPf^It#yRHD25n&-!DudPNkm+`E@^&7qxZy`Ht`p$HkC+)be)C0-w2g*3=r)KPm zrV+@>6;F#{-15?h_q97>zrh%D1Z!~lfs&Bu2b}GWIv#a;io~yqxb(Xq5^!Z1??ka1 z`8_q871O*xy(hfe2fbSK;pcohKG;{igL*!45K$vv21UVQqRyY9Lg@#OhCUw-wl>viL@S4+C!eSP7 z@ibYjguQ>*g|;Ih!nm0#{7DFeUkYaInYEDE6==H@O(|mjC!b6voOyI)2Lhw-1(Ub) zxG!>0)(`U*v0K`WVYt#kf)IqL%2gz3J?>cgO7i?icDOM5-dApT?6FtheB_B6AA9rF zS6_Yjiqq56SM3Ga_?Qc2$z*~ zeKYypJ!q}iNz$qnxn!p&C+D-tSHIzkTe^QeL+~&B$c^K$kCKCHV1o13e9Z2oH9|)k zjV*>udenwD&K& z)(&2e^eYhrU5Fr41RbchP9V$61&AGqeyp_%0o46;@_c?K{aT#QgDh(k z`5oFS=+GSWdWnr9$ipy4;F+CYlD;~hebp~C)G9HH&;-z!&ol$2cx_-Jp4N6mhW+p&y^!Ba_o(H+ zv`dDeBhc#BLdg^yzoS^?<-iz~%gS0w$7@*%sq#DMx>6Vs9YbYfeI0@&VVkqtNPY)$ z#BS8>?PY$EyNHW3;e2*cOsALOSA~Gbfl$MmMJQgTNxdPi_!}P(3s)aD(3k zK{PK4i`3y$bw`K(>3Qj3fO72jthr~k-M+?xrsnuw(6kM+L*voGHmtVE@7C?=lz{;? z5@ksJ%U4^iil=-PpR zwD7x@Z<-_PKkSq}f%Tgn(9K&V2EH6ps`Vu$#P22MN%Y3eTi2mlY3D2}kUik9ET;vMQWk}As?$~Sx zOv{9ZR?N6K^aI1s-2=tYoMt}d7#H#7=Udv1V7Lu*ip*F_!-5WnrhKRXomZ-57-~}O zA~&y2y2A5FCBT&yZIzAWca`6Dx>)8yue59%erH688G{SID-{pu>pl!jmBpZpe?Z_^WL#_yJbkFhS3ncG9O&d zPCA2H%+ZOQRPc>nFO5VFc}yo|M$>jhKjIyZa~h5)0l+(qtD(btEc&mJzc1}ZFr45x z4KZi##h7+Y?sN|q+Q+R_8Q*3LFGZ zE4vjt94lv&|KQ|u(yNb6*Q9S&Gl>=w>xm1e)MvnX;dZBA#E{oXH^8U-N6U0gNG}ihBT8F>%wi?>U zCtiYO<#=r@Nzh-}RUkT!w|#JaIT?BNj@j&%<675ZpY;tfHUy?=XdgR{Fidz`2pq?B zB}1v#M`0dFsjcO_O`~uHer0#gj`R)&8asTi92lFhL4@vTK@NVmhVCi2S-H%0@BPK)!u8|cm_y>@+=cv!&=y>WM()J@Y>X3KRZ19`L~ zt3)|EblvWir>C#ng;_w{!AA1C%J0ll@=An@?u&KB5RjItkdZ37cz}|qisFtt>V(Lv zR^R|F8z6IjYv&hqIruPp&C9p8zJJ%lE9e2Xf0?=9oxMYjo%qtYg?E&NGP~ z52+wbg{mFtzqx>4D~``C$KT3zpTd06rIpmF5OG`xA*SlmRHW!0fgm*nqS(wA6_{C# zsJ)?vkwU|XQq>GS8R%>L@4Ju7z_x4S?}<>X+Vyr=)1JWQw!0^Acf;6gEXU2_)3eXb z;?}2K+#iAND6iA+QybQSoEjx(`8WI_v!5j8sMoW(=rR?RGBADhsd%|Onod@$lanRh zYp%bf?Gxxi4EH9TT-0$~)EUezp>7E|f_q{%q+I!rV-$KY8i7A!RNc;!tWJGg20k?C z*-Z0Hym;T^tgFk4P`h@ zlJkj_UBh6&R5+BiC_Jqg<*i~{y;_|NF1@~D4qnJIPKC#2G8R}HfzF+=bkH4~E9BtA zdJ@V84;MIzy*E{H+@MbQJx!CQv`1F}YZrtn?V~I^wuee5Q=G~WE^h2jv+l5Rwlub4 zv)6TskN_SL=S;YuRk46UMFLxLzH#1e{5y&LDts7r}$45~DInI)#gCzv0%M zEj+JG>$nYdXT}JyN9@=f>&3mB@80}=alC{3BZRuk$dg|-=nV^;`7uJ5C(NB6(_@R z2uYQ$W#^y}J}v`0iWUuB0e%qN1$l55#(0$X=IHI+Tf4dc-5KxhcI+;8NH)b8cQPX9 zXhG(D5x1$hUj+2bh|`8ho(`3mT|Yk_i7VwgSN14tEtq$ywTj~k^EO4;<72yyTm^Y-4JqLYNd>9FMYu=b8SQ&z@L~+o!}HX#!jIt;!QKSze)kFX%PYAJ!QKSz ze)k9>qP3zTa(|uQ@3;yx*^E|HMDBEczvC*5T$rDtB66qm`yE%IHSF1niam2W`rT^t zyD>prUde6P*_-0@yWiL6cdsC$p{Ur{o8-9N^7s4Q8#T#!9`U=?`F?lqY}B3KPa{L8gP_wW+C=b4D!p1ir{oc84XX1+{x+H#?xpx@4XLskrxjm;d_gtRvO#e5# z^#{y`iw8=;Wi?v&B)vbivw zAM@@wtI^FXoI2mf$Pu%V5E?NHRs!+FWhC{4GgwR<5eZQQo1I7sHn&K4$;w+v(JnRI z(4@(e?>u;j=*$^U!@xVQzWUC1!v)j!t;vFCK1lc zD~d(rh{SO`DcEJ~sC4YmLMn`w*0+YbN2gKfRQ;amF8p1$%qJ(gTyDMQk;&bo8`H&` zu*@!vGw)n}$Jpt~X`D26y@fMjdzsfEFaz%EU-5`Ue;y{n1{N7_;UH^Jw z9SipEn$oJ@(esRz#tugsd%az?j*-#noKojTW_K-MM<4Za8R@+^4(`TVcq>Q1#sXk) zOPpuyB#GyYU`Ir^Rl-Z`dArPTTf@5z1%7A>ZU>A5ZT|a9>?Qu*H#`F%14Q`A^y?gd z{3D-(PFBhv+CDnD+1#q$4#Ivq_wSl@=pY>Ed`$DZ-U2*I4(vc|*4_A%I%2{FsfH3m zEU(en1@nqxFY@WCUtL%Mx%COJm|j!Q710%u;ZQf=>g}R1mH;<{>(P0U+1)Iis*ZCm zqtRqF*};zU5u->%f%uFh!@ERIl89{OMHE>PB#}sxBDq8fp824bk5P7Q4U}FR-5}<9 ztxZjM__@ugJ3^W|EAczdcC+5GNpjuDGZv&Vn z9Y1aOg!FbXTAFN5n>qu;ZJV0R8YRhXFDVlwDWk|Tr&uK)r$|In6iMRZ=pZX?Diz7X zq35y59HK$5mXE3IC^NKB9-fD~-ixjNx~hP~0V@LX899Ne#X zK3SASxRj`5BpV}!HZB04Kw!Tr5(iHc6-5pxvcdtL*CHtfD=8&5?S7lej)`Jp>;SL9 z)6nv?)7+SGS?-&h$S!|6?PV7)UXSS>C zRB8;L>T(cehmK)mV()kGJNABeBXg|@)I?LS#m#{l5xEu!I9=j;ZC?Hpk$;Lis zM~NhfzACFMD;bgZ3jA4{D??FdNzTREwE^`T~lptU(^&@ssl+EUfa+66EC1(fq zJi8miC3CzCViF!vivpc>3#sqE&2DdPyN*-G+k^<(2Usv%1c!!xK^}PE2LZFY-pCEx zc2`o{*~#acJ&&_IVBk#az~x-(nLUyb{g{o12?Q$5~Od@z(5Ka&9iT zOzABrK~DpS2HcAgj^1vy*V*Aj)yv(K%Yfo2cY&S3Tz2*Ww@H*xut8A-hfk0t#U}`| zU~3fIqE)h6eHc0Kv)FH?QeUlXA7xLrb9-DVU$o2Eu|Ts;i#D;fK9L+t8)yNADJ;Q0 ze6I5qU}K(l#?$gV;Zsi=BnvMZN$E3h7OQle!u>mqot7LR`9|UfbjZOYpopWs-pG54 z7vBRqz(Yfsj?XLxCN}PU32=v?zRSIk{!)aZQ94#eAw~csW6M8NbVtX>DAkh9o*Zrd zydS+D+dn+~ENz1+uipV=vuxdH8mzVE}G3YIGeYO zvcs0KS$b?v+2XWYM59Hyo15Iu-ufCVMGGf;xm|pgQnbt1F?ugxWAG@y$Njg1Owya@w}>yWfiBXK5@Y6N zuzTYgrPJ3-$qkJpMiV0=iP&J^-kDh}TY2@WAJx8RqfuQRhBfbFxb_rWK7~uF=(e^1 z5A-> zxE5V>V7k!oxm1Ufvpn_=W2fS4e!Y|smkBuvBA-$})+x!;JDvQlT}=dfDY@Qjz3?r# z6xfZAk1vi#MkC`RzPrX_o{IX^b9(xc7@*E_rtE}+xD`5|D@ z+l`l(J>)AfXB?ThqomeQ=fHyKwbc*YZO+J!ipDC$DrqbSEBdeusO%QgcAu>HL`BAV zSvt7&RaW8&Qup0lDcI@qJFtV`cA%#Xnr$9`JRKNBVF;A*A9f0MWA!^UbD(ZFjbb<@ z@H^gOFSYVu_eKkzYG?FLC%T^`mBY@mfE28GooxPf=OueT_!Vag^CWSx0}w?)?sDBj-Gf|qoXEOgGJp?I%J{lTsf+URF)v^ zYc!kEqFCXwmmBS8UA~M3QD+<(1jf@_#KIHeB)pI#IMC;J?M+QDG(jpeRp>k(zYox^%G9Mc0&lJ2|oNDW9FhXsn()NgdMvzPK$%YO!+|ch(b3I9z{CIrT1xHoG1E?mw&OU{ zUwSr+1pNc}k}PXA6d+$gr34JAptAU!(%=2O?ARkMrM*3r&T_z#rl3<&ZprqA!XHk0QTdetR z2ProxTXQu)18O#a2<$-qt{(rX$@|ez+lyvGiH}Q`%3sRw0NTFe9l(RQ2wfYJxxfxa zwMb?gGnq!F?j%;Ye8dbR3rp%J+^azXQ)A@im`H3~2z0RY-HE!`-v6 zvNKkF1;D{PQMvQ?qm@;l2o4A2tXF{@b__G6rS{{9#e=*^$~s@l!NpL%OK-6SrXvBb=lo)hG`CU0FfL0gcthxdYSdL(h zo}R*$)rtMGb^8y0{QcxR1sOn_$-%KHzZBSE8#5VaF&w-}yUz~3vDrbpDoRZ%NGU*_ zRhQyIdM{OZ=DZU)9-DvVYJ41=GHO2)ACc;W9*4cy-tOjF1BvZH5Flyv6}xVbD&bf@ z0CNmf7@?ri0UqeTCrWE^*xWXVsMWUCD0cas>UKxxy?fQ|Kn}h<%GOf3J(6o~qfbIM zaq?m`3{@}eQtZTH^^4~LJ#op2L{2iSe78X_KVX+6(n+OgAQhCRr=5gde{fP6T+fAM zmx!qqP>`4%awPd3yuS!yu~>@3MQIkeYf^YECPcHo;8dtcS!Q+~{k`~I1Eh79{0HBv zw8ad$%8TLuJkC0g;V|B1S3RiOf4|x6pxvQ>R)#2zNwTU=ACLGLTy2X@0Lc9bfEwQ*s( z(E`Vgnaxffmqm6~V}>CD^m8eC1Lz6g4ugQn%%s6JI@w~WJt)}<*r7*~-wjckZMBPL z*Wt~cjSm@ITpSvk|8+5-_1}rbA9kJ$tuHRl_F|J`i~V6si`%%Teul`5#mDC7vuB?? z*?+Ucc`w;re4*LF;?lZf`Av$3Dm&}z#i6;S?P(A6ro$zJIIJ|`gW;bkJeMwAaSuHS zXz|HQT0Cr5qfsKnh^NF&4sOcpr<@hxbmEW3`=N^-^r=lYv$#o#Vgdi| z4RAae-w+xG+ijEMSP(a(*-{fiPCj9X1b95&k>qz%Q&U^3t6PI38@P5AG{zHUuCEXE zuk5U@udc4IZ;h_6%oxV7`JGk!eNmWv9b*lyZfm=hriGCxT(Ph~46VFiBo7VRT{)!1 zZ$zT=F(Nr5R*NX?&fY}Wu!3k$rxFB)6T~oqInQWSt*zl-KcVaZJc=LOlHvvJg5P!B z$W49VZg01>v^z8@%@8WB)0@-1*d2I{4Eoh~@}EE7+-ooIDQ;svu(g9DI<7j+{RDD7 znHe3q%nXZ$yc|vixd{K>V15_;^f4s}eXw#;sF#jIH)s%K*!fR(k|3EV@D=MBK@G+dgJlKfDl---J4SFi@hRcgz9k#o=pfM^< z&0DLaFq+-B`}F(f;oZ5V&7Ga~ot>2(`1|&@HmBzvtvvdg$$JF)^222y^@NYV&R1fg*eSQ0YkKt>`cRD9!onGbqv2PM)~QM zFo>CuJb?E_o;xoP)QUd3hC(O>dLfBNk>7m)fm^S4RpzQ)Xl`R4%Gc0(Pr0Uy_nv(# zmF1u^+15nqkkK`E>{dxvtMlt5mR3FydUM#LlxRI!2$tPgKa<}@^4IIjM%kjE-5E;Y z)mvNhgS|9bVuxB?cJumUAH1(lmYH?ll%J9z(GprL>wHwUWJ>3mr(yuO`&Qr^#Ru>o zwmUT6-RxFrc1Zp3_1WFswcS5`6ObTj$tOHB(hiCl3gMmOEiujfBEH?fA@A_a=JG+fBF1X_r}`Rk3atS%j3t7$F~-qZcbneeL3CN zyBfP+m&!)_K1bYFo02A&VRPQ?$*{q=XyzBh+U9{>((rz~B*{@1v4AYITKFHBFxb`x z?8x4-af!Te`O)8UwMl{C5> zMzkpZw4z3jsxSoA=g7uKS7+_<5wlMgZyEHLoZsAkIHhSq99Xv}Di)8`;fSlg2wBL@ z(d*%%XT$~V*3{J21k~k1g?V|O|L7m+ATu&Q$l;mrF40*L8QE!BlGGGQRPQ95C>9#q z0jNQ+Iu6eOc}j=v-o2D?tRHdQg~yC9!u4)fUYLShC;USQIt1j z&>$rpH3jc~@_xY#ab3h&;I=^lN}jx&9DVYqjp@w;yQE=?9d!+kdDkpTbP9*fHFi1& zlzf5~p6FbfUbrC?7&*XBQW41ncxhrOD&y(GBeRg)X%%!j5&?nC|e1fWt@mbvJmNo^iMZ-*ETj5EWWv?X%jxom#(g?R96Y^&jKZLcxGr^>74e-WI`!)J4sU1GP&U)%u`}iDno_3m_mVGhN29{k({4-)1XIX z!fsRjEhRQLoL~fYx*QbE(q^I1%1&Q4_1Ck9&m^httXSq8zfJI>gMi+9I^_ZCIi{i_*9e{hSy9T85%B0g_rGmB~;> z$dR0%>2l@Dr2IyWvCG{Q6LH?ur_C!!H8!mu4}e7 zG<7I(JCDvXo6V^ftJPxhXnku-=KKmJk}Z)yu9zkn%T{PjnnFiM#Y=W4&n0E2ysaq6 zL)Uf*!n3hQ;0;;Ye4nQhx+~on9hKf_sN2}W+yysPY07#6ai&z}<%v%uG5a|Upz5qES(LR4+|rA5H%|G$)r|vFhn%)de8f!WF4gy)O^Z_K2%>MiaonWjOVJ!4ofs0dOP0d&(%%=RzWL_y zgw|G3+(=;uB+o$aQgL0CyTfgB;7)iiMhK17-459r)B-$qXjKn^whUBTTVp8EbuY|o zC4-0Ue$sUD+{qMe!i`TFfgMzTl^YZJzBL>p3LrGYke64sfIv~d;1j=c{Hd2AX-k7) zP@l-+&_WZqIH2=-mtk)qY;c-RWFO>rz)rAF?>2m+Zr}w-&##+qpR$MZc;Uc~?1s+s zLixDFRbP<;d!3f~Dn`H4&a8!j4m?g^2vPAz^Vp0dIX|<>Adp@|MzAiIgu#DLa9aw^ zoeYMY+|N-IwoKiX-R&bhBXP(FzpX80_AYt*_=XV>_ zA!-GBh}ANP)}&AfgF->&VY}&{!k&dtWrFg<8AuQIw4Mx4|L|Nt-aA-OSwKDt)J^$W z4fh5QxQ}w{6*eS08mef}PY&F0}x>Yev>U`Zy!uNY2kJ$fBYC9|6B&jJrNPKo1U(|fW};m3>7gL0Pn2$gA4DxD^R8s8o}eLinAH{4b~3# z)vJFscR1Vtu4AC(f8NgYDb*^D<9|kP(l!-Rxgu(b=2f^Tiv)<0BC@AQl3>sX8aE`R zkWe#iyyaFFxg?d`%*>%C^NytDl;yNe+f4PUrm3l3_C3$T^0d6Ye&IRda(@^2@cW(f zJL|^NMuS2?FA1Q9Fyw@oc84Aq#++uc);E_r{q`)F+Wj_u@9a)*vXA#{&m4VTNOU+l zGP3)qd=?8jW=R^e}&CT`9@tm_gll?2cPqXuG)H8r>Ps0;w!81 zq{Ej?9w%eT<5j`t=4N4G&Mx*zYYnh#kj=`lOB`SIERKR`7KCKa6CYa+g+`*?eIu{` z^7?0!l+$fc%To-2R?HdC3|vDr#DCbG3t%3r`Lb#L^z7S%Pj|aN`)uoq+;)%I;eEEb zhiv2AY}iFDxU;&uv%Ymwa9epxOLI$)tkKjDtX6@4Ka`Ye? z9HhWZXpPMna9q6kB94naI(Yju6||Uj$`yz4(&E;dsqrqHOjB&vs5Q6)VDATDcP{&9 zsx@}cQp@boVd)*Olqksh2^H`m)ML>gIRkSusC29h@YPpc8&k%|9-1;QM2E``;>muW zXLWafW&e2p_}Jk{Zfd}e&Cb~csn!4vBGK_Msmx)1pc&`zKRm&f)kT+~#}<|+7tGOL zFi!~`$Yxy2k4-)v>VKGO<1vqxBVyX^F^O)f%{SlQW5UFxt+Rp8o{y!j^tzuN3t8vq zhR~wy=}DcQ{(7+JH{e+8&YSaGEehlgEyvrumA1N@7r#6jj-STge(v+Pzx*|8mu9C( z551D;nC%6NQhXLBfe37=3|K!Y#=bWT;*&c|%_ zIh}9rR=Im(Cns<371j7fV7H1(0eV-!?(Vxi+dhZ*#g}h%j?GUkdkr4*WOp=r8ux|A z4M|@xyoUPjw`42@b{Y+rowM8AqiB^V@8VW<$|?)X!48wX{TYIuy_-2I6(Qff%bhvxuv*$k>;17ou&{wu( zHmXSHhKPQ@m;jk}tyYgLao1QRVwyVoG7*c#9ns0*(9m3maW1kEfrnYG#|HpSE!5n2(@6sSalxK^2K!= zo@gF*^&4Gw^X$pVvBF#P$kEY`nvBQ7?{HJN*;VJ1-{FX0x8bQn42)<6P7NX^$Wg)? zU3JLsbP6^r?p<1v#K*(RxGXw}iCQz_F!=Ng|MdIQgSRoM@XJ%!W#o56rd*(=oKKPQyvx42vTDrfnLXjj8(G>W?ZVSt z9`D83ljOr)I70SlW|Llnf^t(ODK9>s^Y51CalG?TnoV_IgK21_vXJf z()Usy(#5J!#QJ!XaVYY*IMjXBZR%wQ>KZ5Ju=BsS;$l=l<%{a6@f1I=Y_a?3^H0y{ zS%zn@%gpZ}8Xbck9B+s;+ghYmWjOl}qp;mPIjc>`SGs~p&CXUl_^@jBXmK{asbaK{ ztGMTq-+AWerw}wl`hvSkTe~zC;DhUd-Q9{6zfE&bGahzCLxV2EYY)d}60zlX-o19u zT7Q2qh=vOBy|v97;dLZrs>|6qyF(_j;@2PK5_V5vmFw}Qqw|B4t@ZZy=)!Vz7-!7w zoPGNA)W*}8Ewo@vl%rJDZ74F-`+yhRq6w-Ho2|3%bTpdP?yFa?{^|F*n&XCK`9N%GgXVV9BLG0}V_rWvIQR|FvP+(Y!t*)*4(QxVSDW$; z`gStxt5%_)<{*-wiB;7Kfpai4c4cH-yuk7-u$Nyds8X-4l9#r+iob&JMWBJyO-(tw zZg)Dn7Kto=r$E%BGCGp`*NnnT7iGoei3BzlpDx}yO-_CCNvN{K7raniaFP-LRJtRW zsY-_3dB4rrIBGE7yFBj?9b#AjU6lUE$_JRC!sE;3?M9!W zw_tI_7FRnp!IKlP(~!TX(FvNG&LzKFqS=*I55B^A7`;#$61VAjrBs)m#2E-UHzlp! z75Q!zt8(B;>Eg5-QI&dO>Ge*a4RUHrePzzBn~GE@)JRy7hFIq-E-kLV_Qi+qJcYB! z+i_xRqPSP=*fC5!?lpGkdaJ8u7ah(X#eamj#kA{m^^f;=iKAW&78z;}kG@2<9l;os z-|t*PwTAXWMB?Q6`8vs%W5Kt)8BRHz6(ymg3urYl$OckRXuiE_DkH&G|WFGS>(ZRWZ@G^9VXzCLFc z131Jq%`X6g;=54sl}^7H|K|IX(o1hn7xOxJjpmhmAGZYE8=Sfq^JFhhnT=RIJb;!|_R&u4EcCpmq;TfiwVl1Hl6Iw|v63U! z`kl)IIO3(MIw2cgQb>rX=#>-GuBt`k7l%B807e(b@6d;OqWOBO9qjD*q`=uDD(jH* zLO@<=+-zeRu%#47cSWKaXE?M2yjxMyz;d4v)4r9mwb}}>oJY8eug|o3WiGab5doKB%lenEVB z+5s{`=xk!xy|ad6Zjm^t0T)-@D;r&x3m-AA2AmcrRl&|v+lv@o{&D}6TUTxr2v*m) z0g+|TW-oD=P}RDR+Y`hv}R2UA@{FZPsp%4ro=2rs&S-I_m}F&0#|f;;f<(JA-MO3 z!HmAqkZo+xtrC0G7~Z(ifnHjZwWr4#*-wTms}o#t>f6(^nO{FYgWX*6K?iGQ`!b7B zq7c7(Gh0Rh6;obwlvwK}}w{lI>IA?=#g%{jKTz?(%ib@7zvk z$~_cWvQ5}EsNc|B!T7U+(O4FsK5K5=*-5NdN;$Dudw&ZJ7EhAtcT-EZUdY)6GZHZa zD3&Z?CARr`Fr+*y1e>7jYChBzsvNolvxZ9l0}7Wv1Qc zXB8xfsR=vREqa4mW61Bk(XI&q9l;j}kS1rqYcQL|4znFyMd1LR=c@JUl=mkLidJ-9 zy!kQl?x&~Uetwd*o0nmi_BEzdsQH_*!WHah2724r4V|n;xz6EWSHyE%I+ zi>npfm_;qQa3P)FUB0gQos$S*b4evaydrrWrkJ8bO95;d&qLeo+0LW0v(wX4%2%$pU(p1{^@Udg0XQAl(Xs^m{o)R-ys^U^ z3?_XZ37W)cID6K9i&qxs6{zxeHooxP%lo65kh35^+4vtX9KQ}md2RbWGg$uuNHcGhA#nWyGXNdPSs zN&!nCutv1)@wn`E^b@T@Xl{ybTwVQbU(ivvIJ^6PUEEvVz1)|vOSAhYIA%AAs@a35 z`lYmYy0@*frmUnr!Q=EMln&pHOlM2Am*EgOc44yL70{$V?tFeazq@>0^E={mm_ZpK zaXJ(7O|*s-rfeV4+$&fkc<=K!y`e9f$D`yu|VqHWiQP{c%MuyFU zF2B9Y=_<*f!-5>VCwn`o{V!fS*=y*W9_Ws4P>E$`-%$l6rd^eWnh8PO)HSyU)B&}u zRucd-N={rBf^IEcsMVXBf>jEj;CNrqR+u>1k(VcYT6P~lYnNuH`d^VBKOD-}AI|iF zo&3@zt}szjQdpH>H5y}ON}Fw_tewr$I#$LpBoUWn{I^y#aRK`3VD7d0q+#K$yr10bPz=&Mp?m(OQO3_mCx&x~Or|yf9FdpONeW z3hW$Q;XD4}>mT=S;oIh&*^Wda8XwcHT0?mp1<6=+m*464Ht74+UGVQTJ^TjPwzmV@ zL;$E>!zc&XskV=O^;P`YMr~Wg%e%Z$Bkbn#yELdYK@BYxgtDa~U%xeQFFzsgy`x4b z!G3b;ad=yer_L&YU5edx&F=&N0GWulQ2`3q5G626 zFTn=8`(Hu}qXmH-v+Jcr_8tR8YTGdzcGj5;J$-9w2HhRz z7IOi$#l8Mw)VBZCx8Je6_U!(ZDw-dj64Nfg5n;x>a~x~;J$Bbb=bZ*iz(e2xALW5y z=Go3@jYzG+V8`)s3Aet!%%P3d%Su?ITG-9ycLL(k3~;pY4Qf_FP5yVWzJbaLC8wxB zC@c|@gWVHN1M<=je7iwmduqj;90xhz3wu!S-Fj;}zq@>0^E>he0i6k@DLq^bb}cPn zM+BlECy}&9Q9I3Dz1lMhcE%pmj?_PlSP3~Rjc)2fNzN|j<=VSw*&&Y|p)(xDUSum< zhnd>0&KUH1pI-3xf~LMk=tzEeEfrR)a_u#UY*53rtES_kAL|{)Zjx37{4Q@>q0Mgx zJ1`>(;47^RLJNLqSqo@Z_M0ksg=MFlM54Wr`%)k5=JGq58Pn&|C2p=#{f@j(D(oBO z*Rm@srByi5eLB%6)$Sc`Z3TCgL7UI80=FXy+claJRyx1Cd|mT9iHMGhqyRSD6#&-) za%tD2;0b!rN-hPv$OP6Mj!4kCOz;u6Bcm(npm~9nvr9Ena~F7T@;g+k0+-FBkudFo93a8%Afwq4@b-_Jo5nn782RxZ_(2K} zL5#ZN0R<2G%=>zsncInKK%#r5oslt-yyA) zR`P}IiFU9nsq8q?AMW{rNqbUkM$Dw>!SOUK&UMT0E;I5w6TxM|4N6B!6u2noOFN!P z@^EPF_Xj0?<|yPbeV@1yVLn1_EtX3M+hFaTRdI% zRp0FGxkDj(rK{5xQP^iR*d-i>UAq11g1dQb4tclOY_MVEekDi+EEfpk*KlwM zB?iCYt~nb=Gr>@t#%e@ab@dMM%PG19@W5cZC6Yf7Z7ssvO% zT~WDMi`Nl1EN|@Zj#Jeg4bKk4*D1dPJ4Q-sBFq2|7l+gMWOy#EYLZFMl?;x<_@p5)8{}AnapO=7Zpevi%AIMcQ0#JciL0q`Bj9pcvWR9DyC)~3uaEY5fzD!Ylj-*oN7R;x zw@7Uk0yymB6(aEkIHLpWV*3S5yNI$_UKt#R20_LZ?hmd&l4QJW`XFSm(26x3Wl>^m#iEbt+D7_>(vgwrgp_p?b_tv=OmN%V z^PwG|+5DL8%oQ9bN5zMcCs@=x-gV3GE;I5wpfgd_vYrNRP_DA0_(kqH(!VuFq3h71S41Ia*rk_LlFv5^C>$oGH%$%&O^f;!xn=0NJmZG=wQGw- zH8O`8eW&g9gofzJ`(JRY%oeb_PbJ1RhCMPg<4aTcCcWQsid(oHnG9&P6>qY*dJR9cxF zLC(wB%~f?>PK(8v;U@_1>8XghZgO{ZsXZOFwHIn`Y1n%zVUVctw?It_wc5U7Y%|*W zE$HbHFzo^opy7@$K?v0xjgID*Mn#b3xWVrbK34{>UAy*jLBq{eedvFCzPG*uc60e1 z4UNezL-5KdD?Z$PZ)G2^djxJ*-6<=pla)Q+#8+PYV5bdR!x)x#PXgPnum{VgDDhaZ zd!5)Z@;ehm*K_bc@{o8OgB;kAD>4_o^Nss~&TZ@?>Njn407Ub zA?WBEoKV$4pLx~bQ4yci*e}!wFBTNvdC4rv<`e`Wen)z==-y$bT|lBlQA0tOUP@td z4>NR(d%D$vNIRdpb}i1!->NMh}= z6%lr5tqAVOzX`P)B`hnZ3rajz&TcMJ;-YU|C^TwT;cX3fRNE9ZCbdV-E(J=R0u8|| zJUi|Xeyt(wn0C|Pg1Bf65{zkQ1h_ORrr(jDAe{Q=&DXw2>H2h~I99r>#LQO0ZZ5y0 zrYUaHPRB&ICNXezJgr}?zAZITw=^+-|C9oQlor^$Sf*qS9LJ)Hb}CElSaHJ z@L2Nemfu}w>57~c7xQ; z5EL=G8l=0ZZ~-A|!KL|m=MBr(en={xFGGV?e`mF=n*+Pd{0{I)K_Od97m$L(FRZC# zRaT6Qj`a5Nv7sE@jjq=pQu>+bJMY>y`q@2zhYy=vc|Q4FMogb$dL2P0LC|z}=40_M z>HFj%J4f3j=XyZ*34zzB%-K~FW=3WXfOQRtLP8j59bS@W73`M%qquC)WK=BVhEFvcXVc*)K+i$Nd|+^lNur zZaADx_#FDb**o8trlL5E|0S&~8?6?VnU zENEy8ZbWNTloe%zf=Cup;*07Dc+S(fVJFpSxs1V4^5*gB!fgA6rJ9*{& z>GM9E?i)ZvD&O;H4WU$e&wAP4RW7|~0Y^I>HlS;YhBCUwh2ZlzoxM98t2+*u!A8f( z+PTfFcMLMh>{w7y26V)ZoS$GvN%T~7w3#?rV)x?~Zmz5HUs{`*E!LeIC4XneoXRqU z+=W92jx{KS+uebL(z+?^^ZBMCCzOBD0p8rFtm?uc&e(t!8r`z3CjRcU$xd?Pl=F>* z0)t|yd)FrhUw~ESEKc}_=xTx-u}kMBZ?390>#a0;l>k&ncj0wftQ|BOg7_GwP6kGj z41bUNU_{kayyba=34_kjQ-b7rD|b2>9-)IT2RlgEJ4TSug)qoTU8_vy)AyOD%AVFe z`7h(PCPiK!0XJyL9At^zAy;JB=e8FL`A+YRmc}!2uxr@g^A|WCcMEgVo>!9xadaQKA{ zP!D8)&SN~ApTReLudz3-w_{aGs@I%c65MEir5-x!3N%OGS+O=@%i%y%>(;(_!gsuD z|NeddwwZ;+Z*$XHjE+3yQgQmIw-){mph)6wCjw58li*!Xg!{sYcs$a+2z$s$!au#I~pJ$nld9pZO525AMP;V{#-RTNEWI}+4B*h%* zYCPM*+RI>>9}=Ti8Ol6YfhUHgIXMI#=*425m(OOf4#f_e zeZxhoU0xr7*gaN(&4o=pst0#k+IDYm+d}N7>hld78v7H8grg_x>0rEMboqskbHC76 z!Lt>?j%fog9QD@1-w_q!CzJc1(8IhIy`1#L`}@MXcC6po9`{{FQ_0pBly8;FUr0<+p%9Z%!mf?&U<>fnBlK;ZMnz0>m;z4VkX#LK$#856|ak87T2NJP3&sm?*uy; z91u~C0*U`cXb>aL6R-nU2^lvC6SNOtK($O&{1kbzuCr=lzkJTc9#0iK6C{sTj=BKRWQ+m5{! zCDKtUy%qJA*=0#8g&pT&w;!=97SORJ!kZ3`7ZmRu=Rr=bf^K&9%cI2w%=~+Cq{kWT z_V$)iG1OaqfA@cOKn8G9+!3}xB(M|W-4qsfP&(>6naWA))baZrL*_vM3WVaqYNm-( zNqEmw7=j4vr?4YGj0bx0HZJ9c<$47;AwowDqa^yT5Q++=syY&-q)c z^L38h^|N2{qF&C90*b(5 z5}A%*enGC6`EpK;2>%HvnENC<3 zxFadHRSLmVZrv_8EaT|Q_#KKIc3@Y)8jOo@=K*2|i>lL`wHE$v^-5WlvKIcXd8MpM zSyg|x1m2a)zpRqKTM932*_T!FcT3@=E&H-c{%$F}v}Ipb)89cWWmU>r_`CX*@;7_u z``We<#_>O6Z{|5^oW}WSIf@%Qshcz%f0K1z02!;PqJgdUM@2f_ULpc`Nf0LhwpRu zAl==6(*B>{z3T1%`Q5AA{>Sg{j@Q~+UQxd-$LzQX`Q7pVx1DXrS#$8sp5q^Q-|9Ham>T)RvNQh!Udp1(qlEn?HumyE%Ds(P zHo|p%RM$@p=&ku^C-GXlJV9HTsETT9WO(%4oIcp;4WH~8s$w~UH-_i#VD7Sf$98G4 zKHsPA*LNHn8dIzUiD%mxO~+=Ua4+*Ho*O*L*@(w2RE;i@=-2}*N1yllBg;jZr(lBg)yW&GDRB)_Tuvz~jQ7vwj>$bXE zF7NJ^pVac2fZY`kLsd7hLJey21Umq90(LvwYuhkM@YXFy;+tQ_{#*0Ta{V)iu-};e zARiseZ)7tX$)$;|w_dxsfxX8^haQg}9v+gzKMxrb#1n$soD+|U7(aQM5A*7syYB_; zE=?V=3+;cG*Jo3cjFGIZWInXsn(W6SOO|Su6lJN%%%V$eD;9T|poHghBuj`OgfVNl zM=+p^lDqhWk~h1lV$AOQyE|1Np?>;S2}T3M+ScI~;oxnZ`8U;MIC zV;G4w{9d`@gWEyv%S|4*0=^nY$PV;i4$w)Aw*U{STbOs|7dCo8&S$p(3;Xp*B$Alj zh$p+ch^7>^VzNJOxu%gBr{usT9fT&6j7gCYgAzs(MD4sT7-RfxtaT(OBZ1x2qW>Lj z`2F3);5jvA0Y^ep)S_C-*p^zd6uYFlC3^sNK#9M$<7zTdw6oMCx=BTRoSrc$a}O9b z=X$8%lyY|W*F`7}+nS+n&i9!Ul2*Oc4MDOYxdN)n>T0=+z*&a$U|%u0wfh{f)pYkH zXj`HUzd#0jjfg4hfSJ@@5I&{G@cZ(%WVnnQm?SrUb?@g*ClK8Nny_ENv1P8Rw{ay- z2%(xq-*R1d$zA{Exi)ixerS!&FvDObB}I$c#BdYF_1hpR_&X2p*4WAStKc`)$j2nR z(e|z+BL+z+gvKwX2<=M6Yv875&B^mx>xCEM@VR^6c<`TF<($b5VN3)?LpHrVN!ZK)WK7G2m{L6wQCqHBf`xOXKqiSq0+LfS$ zxN(b4TCS^&ee=RqTuRL(b0ZNM&th6%!WDw)NiQd=vxJ|0xY%F^a_>wv@-Z2V&n1&8 zC8niXnyW3fYlfxbbXALLbZLapJjkZAf*}eIFyZl0&iUxQPOmyNTJ7=J)UO{0><}}X zliy8*skLOy-tIq` zbWfNW!zC&LB_4D9L>g)nUYwJb>R!w{`@wrYyTyPV&Lh9Rprce#G)k#qY1)Mgigne9 zcg$F{w--I$l4307XH6@u*(7bp6@zk48E0gqO8BS{RgX@60Cw;y$12Uq@1{et3xozv zHFzjE0TArAzKFD*I}Kcb_1Ey+Ny6HOKb5jO(jDl99>ug|hjJu1|6F!Z(Bel2=e9pe z*})hEibDtI2TY7pHW$9Xe;&&`tb?5d81^eDOX*|zHl}H=ORbDWY_Oxzn*;Ww)=}&$ zJ}0J|vKb_45>A*PBav*@J9C1 zcd~c9+bSkgrjk%>mbO*RrNVO=7gViMev+{v?kTu`Pij0_bcChfHkbx3qr!F@~HV*LZ1O|iv=i3^z=Z`K? zqjv+cOv~f+#f9^mptueT`z3_A>9Mq)80n_2YxEh^>~-zP>6^1gubacY)oxJ&1XMea zp_9{*mrwV+p(=mdXZK#f&acDy-E>;0aW!dC*B;5K=8UFTw$VPD&`ziZZST*uyEGL~ zBp9U;nmQp6G}A3nk12CP22al;VRp^Q@4zk~1$2Rd-D-`RJY|Eyr5SDE)xjRGTv;tY zYQKq9{W^QxfLtZSuHpB}`&V}4SVi)K1!EQe^vO9mQ9Dpw5IC3paV2DjKJEgR@E9JN z-vqmLC~q_DcQQiE*oky3-O-DXS+q>r-t^s6s6Z>=fcE35;LH zj|)8=NhPAufzH85TIXI>oP8+ADqx2>pv}qernk0gYTG&*q6F+vtpw!2@N((e?YO>i z^4^m|p?t%B=2ow__K@9LhgXmUeRd7MpZM%>_~Jto;Hw#6L4v6KjxNaQq=6hRM$esk z{BrIp7B-aq-RAkQUo(~(j|}AX?BrxJDW^A(%+0}Z<@Wl!G}B?YCD)ya-?M)#+}Qhe z;O0Hcvh}f-35BFQ@2p(YZxO3ALVAmLW!S9y4cMh~7bla7TQW_X#xJPdDcjCz2^Me9 zWfb#*Mf!W&A9P$RIQHz`Z6fYxkntVpxd<}>vTPtW$ ze0soE8)BkVB)e-*AB+2+RlclzextZQ;9=2u_L@XifE53k-%Vp~ha701}N; z&-SG7wgC@BK@!+dOW`@|^F0YGlR0${mi6QIuMzwrbTGt3G>| zkV9Yij_>a6CIKFp`{a3cpAC15!-0inE12*S7N%EP;0m}txsZx6B*QpvUuwOO`c?Wt z3&%J~9^ZfRJH+l|-tQuroe(X{_|)Lz!?2EW6uF)po~hB&n6Qe1=9cM7P{&C%#7v`1 zX4H%Aa+^3ahh#QGwF;uE2nSBmI8LxEu}@AJ@5bC#5;Bv?vt@_$VK>}z5o#VRauw}> zm6Mbmk3XLHyld~P;{5IDJR-UF}_6lCCiKdLk}8PAZi?Bi+1H`sBvscfbzd;o+$Yv{*>+ zAPf`enrs1E>p3X}7)hrk;YQv#Tp^R*%rT6a3HzNmzkBIu*^#4wX>FDQEmSnERP*e3 zU;6+a%Rg4bG?QNwS-Ah73E*joo{iG%|@EsObI?<(9{GGwT2l<6(yzM|IF{U;whk^0a>V!LowBkVvtl{O8-O=L@KGE!9U?}uIpPhg%OuLY9uJJrZ!aS2fT9@C!g*m9g0WC1% z{g7Wr;jh>-qI>im*tZXM4vmk0^pTX<*lpXkWlJ(LV3bcQimED~(P~rkKrs;H{(Fk8 z5s^?7Ta?81haFa{6Yv?UiNitvT$$NQ*@@}9QwArTSohgxoFp}UXJ^bLl9hmFU4AEm zWfd#rgWz{cj#&vVOfH;X4YnKRIq*9%JFzw>zYBX7s1!9q&LHwR1|95dmn5ogoAkzP zKtq%^m7m_49%sA$Rl>n0b18&T;09%Veg}Rg2*xg%LQxE;4rC@L#>a2j@^nf{?Ed|A zbs1?HY1tBh(+nd%WNU78sN7mrjKN#`%vAxxR*rDi&VWcR(Tkm&Hvxps3zG3BDTT>9;72J=$ z?>c>r9y|i8bUnZg%I^fP6X3y|6AGUdz=4V&oMEqxer-v~yD__b2Y#T|VmtBG*Y@S> zTMr(wVgfrS9O6>}P8FY+3?=@#Evjd?KU=i@VYokbGcPx&s7R&N3T!|yOz1RF_|FOn zi{-M`cG4k;XSe@xHE|F;P4hWU~;SDg>XsTmKI>=1+cutc0(hPNF>P_uIg=d?N%#=&av{4 z+AuubF6Sx_bCt5rpifQ8S5+3R*NWw{ek&Ep^Br=43V2bg~OY)xla>8r*pKn z96Y!+4!L89UD&SJJp@twp-cX>*S~|aBH867l-}e>Rw8yK-Je|yGNq0ZE38TvN9{D^ zhfXlX0=u=pHzsUYOwW$dRu1}*IHLd1P|wuF%|ZLyZ+0&(4}stD=&VpNC(n)wvy0x4 z{Ekltgn6#O55rN>Ab$X;7zrJwCt#D!8w0bjIdNc?!8oj-kztxRj{WL`+G>&}kQV`> zm|YROG<5{-IQGRUzu!MJG&go8aMc51J^8GRAWCuYKLQ9Mm8w38?obfGF$B-#$~y=$ z069ToyXVh4|Ep5EyZ_22SPmzhPAkoEcx!X3w#jVXG(V@!t8`92a?c_?*HY{cB&3fz zG5$0=Xp98Ak^D}`7dKWN%dE=#oos99Us42`}$aAeE^3y4#SHg z`7A_Zr3H4oqBkVJLs1b;Q;@;D%<7jghTddszU|=JIQrZ>jqhqm z2Tfu?naqoh*kx!rdVKE9zR}ryuW`4GzP_A1%Ag5Z8-0KrCwED3r1)hI;c7V zLgn5LwBg0f8oOO0y9=QCg@xdHHFVcsfTi*{Y&fxuv zJL9C!SnA)aC9?f;KBSQ7)2zH`QGO>*5%^~2%uG@<^rw>+`(jPWzs1Mk~v6i2b) z{?`LE#d{sJAeyEeMa>1cnFM~(Q5%xqVVK}*Az^DRCXSm#0Jd|#e${bp)-y{nT$;;lC8x=Ac>sP9kXx&R$wF>k%uVzs}CIi z2zChFd#}8k#hf5g5W_(7xcRKbYvyBS#>V7#2vSHIf}gP9sEy!6G1NpX!9L=bPG6cG zm}N_=>%6q)8>Y!@&%e@Gs{wWxjo77Si|m5mQTC(8vTCI)KT|1_(+my5O>MTSuyYIU zhuhk1Q3i&G2jD6Q??01Vw4zl5`Lym6iLBAK&fyDEZ6Sc)4FjQ#4INp=tgsX5=M2Im1sjv$HoMzk3hI zX~EGDHv%dgp-15!3aku*dM^zCyKD4E<1OW;+qznFZB1>7A0td)092Zk6tTJNaO zvbs&JSClJ_1dT)yM4Qcn?CJ!1I-H=1jHqY&2poJ)2kcA^M`=q!`qr&|IxkXHfmdud zM^I=t(X5=;suZ$Mn;8x9NhWuj`+uGh53wMk-rMq{peFyBl_+h3E%9|9;IbGCap?auO=99+hIRr7C}=sN|6Tvwd~$%of?o%21U&>*aR~ z6@!EA!~V`-a5@MF5_Fw0s{Hmr{wWyVko+zr0))D-G#YpgjgEg}Do}YHxaZoy^*c)g z{eg2kRfcjeSKC-wTYQN&nt*O8&n{vYv4b@*Wm}tCsW26@h@G0I6!IFI2mIUXMQ;lf zI|eh&hKeYZU$GKGqJVy!Yjm#s%U6=!nY9gg>=hzYa-7=7&>qHAeJX3 zZOH#;>NH_yV#$n=$3{X%n6$B47aO=XFuJ_76u2baoML#ZoNJO9t2+{ghYt)3l1L(U zOKCL)E15cH%+k!}*=28Q3LA1$L0+iS6bh zY)HpoSBKo3mkWxj5@iodEU`~TeUMcFTT#_lyiM!7Y;~qr_Uw7D!Cuzr`14P9D*PAc z*P|WJnA#MlDzX}O3tM4_>UTGR zJFCtF=2jM0!dhKfoxJ$nVEfAIDgzIhbC_sv7n&C-+pz{y@Eal-Y2uqP?BYj$J6 z@X8|6sqnsQKYNNEv!%@3`TjlGBkH}1-(H5L=-0l`D_zUg-B+-@mdtmGv+4_TAqGIH zK*!(r@87-k_xBa`_4Sgd4Y_~j)YQ}nOuMG1`8v@V)=1}wAoRF3^`TUWs^|{OdSJlw zY;){7VMxM1XS=#hJEburQzJKT`g}KilC+3jN4b)M4_9SsN-1MytTC`m(P}lJrjNSz zX^5~}mud(|&8u!RCc`G=bLHNus=YlugBRlBE+kBS$7^azY!`(}bj<+oeuee+%i4<* zrsgRBr^=|@+_J2~W3LzHw8?B=$HbUEg}qKqIqb)_@$o0lN*8e3aSM`y}T z=}X>gfWM@oqM`xn3xD7J_NV)I@818Vq9QjVYD4ay$)B9g|IuJy$F7!m$xtA0b#~zQ zUiD?^6VgleP1@uf?dG()&amJ8!`s!rrB#OEKcinFO)-h(fT4}8q2UmSGZA)_2_zrG z0p&S?Q27;No5BiFGA&eao+4S(Y$`T$UAEfP<|?&qX07$TzOJng`}(1}>Uqz>LG`=$ zIed(5w_fKy&+|Uddk*g{W~F&y*y~DMhq{IyrJ|BhwZ+iVq@bsXg2nJN2 z3jC>J%K1Km`1$3&b-e4TXgCS}#QnaiftIZ9TcX`rge9Oo*dG8A*s<~m_V#msAWUyu z_4R95MO(6dCUa&lO+duGKd~?|oyNHgyqTND9t&OmYz?Nx&Ws544*k6s*55lkn%sT+ zY1Yyb>Z=w%{#aa;<^}CSU=V5o!%&00{SZ-RY8rm_=wq?r(eaTG@@Sf#o?uYSVmV6e zD(|@^2w*18C!PWKh~4n}EG#s^wbx8u9D$@rN~#rpZcB1nu%bT;$e4pqtN3S9+0EsU$ytifdBEsl7JQqv|{*8UKG%@ca@46ORZ*) zH8$Xh`A@8WRdQe?IgA!fOJY77776Y$hCLR&rCaO64yVEn!!+fza$o+o^wrtp5^0fO zOV-c4lma?tAlH8}kwS0pn-z^mVNUGBGZ)9l%Eq#`U04I_v~IY}&tClGDg$m_n)g&_ z&;+wzI=S5&DZ*c+@v!L#vSnFFACEWoD?ZR4>A2iHNm_2K;Zc0IWGoQXaE#WLKSA^znR@WMrYxOsVL-a}|f z+K{0@*VJV47Z?mWLN_awbCH}`Pf|m6`P&-p&gfH6 z*#0maCe(X(dfi&Brs@I80=e!cFQc8=OfS1^vngDoQE-3oRy7=mzq~$ES7-^v!pW!# z`iirY{(5C>uHI!JF<)!dK^$wvLA=(NuC1rc{~r z3ani1L_pr4$cverJq!2Y%wL=}o*FyEW^ZE)K3cnY=H0vR-OGcL0gIqPh?AG*oemic z24cE*ng|^V6@VFn47!u_V_e&YMe!Id82J@O0F{Zq$%m~BvW3wDhH2$($p$Z zFv#SkNG%D{;qVB2^W$pM)vxBfqe&{D*yoqfpR1}0r27&)afu@?*<9_@;TJEPX&1G1i(ZL%?Y%YZ)`h46}u z_s#No`2~j_%5TF#{ri2CMukS;Pp|#(=qHQcO>~!q;g6iWEm=QvuH$*Q%Li87?m{b? zdH~5yfMOEHHyYmAM%L%&6T;cYTH>bA5xyxWKJ?K?@9w#G?;e51hDS&ejwpwd<~>JD z8^*_{U!FERUg9X!fpi9W#~iGl=q2PX#^eQAc_lqbPqQE^Yp33*Kt|mvfJUmRA1m6e z3uscvq^u6_LN6>qp%N}BB<7kr9iRC$w0{$yvPCmgiF@P*yqWD0i= zKi>V$R8yw~=Jz39;5?HYgLKDdco|~MmVz}LJD=?AipHY2oLd-=mvFZo_NyGBPOYuq zH#^>YB9FVR-O}Db`7~IS-Dzp0FtU91+8{Bp_}zGNG>J}P&X)9d4WkI1mtDxz!+Xq$ z>?9%3GMABt7x2v<8tPk~3Wdgc24l7ST|0~k!G$9y_w3ob*MUjjaN&@X`peASjY`G6;kdI=llip9b$-KT4J zU6_4BvTyIJ8r%kdL6I6wnwL!zV}OW_v?d4Vqvp}h?pr9iK$aKh@CrIYfewLDi%0se ztn+wcK}*?rmzu)LF?+4NvVruGt*36>n6A9OxSEU}gc^!dv?cxBW$^O=FDBTJMH%}J zbr5Y}Q4Ra%D(w>604u>_Pxf}#w^&ZJ3|6p1hZ4JA-F;-w?!8958RnS!HIOQ}Xu&P$D5@Bw!Sz=-LFygH{Ys(BU>)1 zc=S6xuY<<2)0e=Q)6l$l$)5q>xyEt0~L!MbB z&E&;sKyg(5<;t&s#Y;=q-8@l?8z*5y2)N|y2M@-$4mW6rxj$Q*WQFpx;}&j@=wyhU zi$}0cAl}U81C814nYZqI&2h)~XHGpgaPb9}U<$s+)xD!7lq^s}(j)@`1GiKdjF5N$ zcbZ_R1K=3>_r}JJ>o6ZZ5wqeE4bBm6Nq@)GlFkeu@ze?ipdLKK!^IQ9urPG7cW7w- zv*m2~-c51tPElFT&Ro9_=}g-#@`Y*Mmc~wK&Z3poCPUw3&iqWhzpT<>fsAZ5*}=mZ zK?>?2G@G-t#eCWw6i7f$bAOcWnE!C5VAu0D7;5`7c|i|mTq>XbmC^3fsyp{cEog@T zeY?ce(R*>EM9>2Xi;%omuAl4a_JNqC z!Y%3VJb)?>Z8Dtln@3L&d2}?PV~L(revybJf(gEnQnq+`N}pZCDbCs{+MwW(2# zrSq(;G|e0Gc8)f5I&~Ft6Y>-9t#=d_Z0~^6B1qV6o8C261sYG)c!iS3^-3Tp87S19 z?6LU|ClgsSZ-Xs^Gn3bb(ZI{g7k{O3Y3W7x)IGB)?I0eEG7D!?d_X9cpkrN`=rIWV z{30Hkt!Hx!^DQti(g2b|Sw??H(g-xw+;LaUov(pGQ?2W@cPF?+!03oQpi7IIAsvw%Asf(Oug{q*C6 zanJbzHNFJ~oT%-*}90T;)|M3Kkk&4UBKHM2CEZma*jtMRV zi3C09XCx>9#6yspC6a2cSS%voER*Jodp~3kod>`HqAbmbJ;= zRhHv*lMF!V6mLp99DU}yP;)0}cW2E#wI@ej>8AovwcewDD#5GJ6@<*F6e=f(HV8iy zakPHu>3Hh;%a>o8BR1MrLHhtK71-!97!g}t7(=sv>g0m+bXw05I*v$cAA zQHL7YXE3lf73=$k^z5Mv%K}NoWF~JaV^Y|y->qCq{0ZVtU-F@rhq01PErshmNMBx~!cs7GC@)GE_vVyd`Oxj{js)WBK{T*~V=^H?90=-Qs zh~DBIZIyj}eFUabXo7jAAr_CFom~u-JzH;4NN%D;nC9(>M#1jFYtnh`>}@qI-8JI6EJ&FUcr~w%)i`X>VrXn5AI<-L{cE_LUvYU{sgbtPWKw z~k<{wax!?YL{h6Bf_-%I$x|#6`suS(IZ#`owcU$tf zhuxUmQYUl~Vjho`A9T-&dE!u`MT>7HP2f%Ucff1I$@Y6+uelJv)YjZPOh%x4 z>m0c8*I$2q_r=c#-9fq8ZOl8ckBUSf?rUGCaJcxFK&`FL;p-w*_AquQY2#6v-_5>_{_||giTnI=535NGY21SP}f}-sFXWc zEg-pgif4}TvU|F zfDy-W+WLOsbX2atvAN}ihue)o*Jf-Vsx^8gxy8O{RDvQrgof#@ z>v~$`tVQW;#(7CJI8yfPsAyvb#36s^0FK!%wL!O{d47*=~OLjRzh`uJM6%dN(>Z@`{^J~?P!r4p0Td{B<1 z*@S>cfIu@(mk4))`!=L^Dd4iJ=}7#$B31tZyNxiKvfONUJ39^zt_wS9jXQc~`~3N# z={&c2`au`CLkZHZuCm-+eQ6xIuc~dTb!6Dr+IV7w34uGw2kwer2A!Q5VJda7aPC0?L;%P${%dat43i*wf& z6ikxI?aGT(N{I3rZ901&ef{aDf7~5<=UEW)Dn4L%}Hk>J#6A!NjEUxXCK?4j{fh>JpA(mNtWlM>-!zCf zsQu=zevqY=$8Eg8OY0jR=j^0D<4I%iqn|&WfBs(X-pp)fSLg0X{5v;59PwfXfK2Qn zFX7gF3KYh1mkbLoDio(vD`UfQ{-!H44_pFwI&*!YAJizS1j~aamK5{kkc$SRh(%P&^-zEZL6}nq$0A;MV*Uv?u^l3B{yHeA zPF1i?m^vs$jeNMj=Y&baCBGOVJ-;f$D!G9cl26}%>466>z46BVo)zj4UA1Mogt~Y(aI&wZ zsYRB(NuST*3x`M#W$g9)$K5)0V}b@_?ce=76oET` z@AQPhZ+$5ep(6!Rz11oPXJOBp=1=YX^yTAGSSO16!faF}PY|?DRXytCXSTR&B()*2AG5S(&MEH|sIBo^=*2WtD%JWGw6J5P8S+MSDfN7MwW#1eGsz!mf_N4Uc=no6L;q%o4t zqO?*juXCqjBOXBp-H&EN3`&G)dmp^|0Ttz*3C{&*l`(-*9@)uyobv|<&nh1Dm90MW z!X*maDJ65IB)7B39qiAGev>x{uVZ;%I-{hZtDVRII5A#!gz2W62KmSms!#tE) z#m^BSSWu%^+=h46AYghVFQ~|`G#-h6Cu$f*KsrovjlHt^VXIf%qz2ubYVcn>I6R*s zZQu%f;r8TIb8C~GF4maf&RCX<_Yevp&gX5v;tKC%j-~nnjVF#DbLFC}Zv;1!(=?*8*?a21K%rH=S0OR5gOR$G8?0+HzFmcRFrH5ThWlsCrn})#gUDjmDc) zP5-2<$=pe=`Y5*@ModbszrD}vlLaygt#=U{EoHe_3e&;(PI--u?IJ$0J-LQ&qmQ)m zFiB(#p-~mgkw}+}7cD(}U4+)lD&>-UOfCk%q7e%7%X?PC*)jcADwlahRhXIz23ZyR z@l0~G(`0>4Q&Kf$J^GTPe8a($NC_NV$7V@Lf+NM;xxSAh53N+oi< zV_V<}(*Uo7Xq~>Xh}aH|78JQ)t5nLR$^gT{;_jxr<Vmo}}Lg@gAmogp%DV)(TCRPFiW)`rgGo%hb% zU(19K>dof=%`5SmtmK0VU$=dw0yZA zHOG`o^VeaoG+xtLHQ*ifqz0)}k-M_oHZQ|*j+1Re?M;?8qov8{ogVRd(F@H622{Qb zVv_JBb5rAvC0mI+pi*v$Hv)<-ENv_@d-*XCM|43!uL(T~7i2PlR7y(u{sx;qQlmPr zzHT{R}s2=mGAF4-TI-&2q_rv=p<%BvI2kL@h%|a1*PM z!o7^>=-9e9f-(sHKmEJv?uq((n8vQ+C;74A+v95p(ye615mN0#;mA|{(yhb8Sk&_( zEaz_Sc8UzPjyj#A9qpIb_l<-oy9-zWES8$;?jBvP*T-SiV57I-@QwQzF5npVjytka zcumY2dAI`zhnPexeMudu2K<9`8EEB|a?$CkbIJnr+WOK)d~>S9t@o!p-OdD?i<038 z;@(RI@tSLT(=HH+-?IKX|5ku^fyv?+KuInUtkvA97Y+{mjKWRLCKJ34DtCIrmf4Zm zut>AHY_t%C?fbWfj}2|{{9-;CooPO{sPcftLhkSXq<3|lH3SBO6SFeIi-=kPz-2K5 znNY&?@WM?uYo92esh;R)8aNfC$;Sntn1O4I)otS^^EAe2by$p@-4jK*SKV~|u`b^g zCnYT87l6@878{ndHO2y0CUS>N*$%mKW61RoQ5_(_rq6?@lxt^ML{=YpVhg*N-nM@4 zp5&ZFH7*uH(H!7}Fo+YSu-LxS5zIv=iBx`P03FPFI)*KT1z%yUHo#Qi8 z@1BP7s{!xuZ4OaUelq$`h!sfd zNgC55iU%v@5*(fp72}JT03BOj4o3-HVJ;+saVQ-QYy71-N8b(vL6Vqr1oHD2?BqD< z=|e2Z?Sx=(Z)2rQ<{4&i?Q*~2$rV%vh?r8tFD}P;RKYA6RAG5mKcFMWIwuqIOL#ai zBoaH`#l+HyT%xJA8n^fA%l{YddTJ(mdg{6jhV-hA^lnYe+m~^~JvCUv%LrjD2FpR7;0roWh zUrlr3V=sr&5u1RZ)vh`fgQx*%p ztux-{9qN0^c&z3`)yr2uAjQjw0lNrA=*!z8Y8%O*`jv7I&p|nf*(^@k%!cFuj$o-r z1f(R81*TvIW!~Wj7RDpCU1;S)2X1E0M zSiX=Zdx5@@i+y?g>#8g3@JN`=|Bv2P*L5Gi4)@|L_Ya)XQdx#wpO+^tZ|H0uV3Nr^ z<8a6v7vMIhwAIuJP(_VymX?rI{JEW6IN`28=Rd+*#ilexR* zo^$t{GnpFBooKaiA^mQK5JSijkZM3)3B9ONZuSs3LjDlQ3jD>~+3h$9L~;B{nkvi4 z^ox%ITLdXhP1|%+?M-9dl9hO2G;w3}(ik-w-3ycT!dK8sU%lVB4xhf4~{$ zaOU)!J+uq6DSLTw@!)Bq#Zz*zCZLBi;4z}+5hlZ+DqLY9ROBj7myWt1>W*D8m`*0ba!*qs!YtS}s-5OoLe$4z{#DtUHn4C0k z9RpXkb*VR5;j;5$FJ`F}{ifgm;zrnz2=U=1Q#}-UAnpimp+M2uqP4kS=J>&56nAQO zUp)Rw28{?O27s(4dxeWvh~VOL@=_w{PG+UKoIslTx6h)?l>L#%|K@eD05TxokN0R1* z8phfHwymNM;se#pB^4VGWf6lIM%w_IrecJ|L`oL0G|xdbAjNL1;Q?g_Grw@mUx-fO zT(gPZQLl(v%KVDlRPo6F7)l9|`hK^bYZZk$zNX2}cx=Y#x|!|(G)2~phU5FZ1C#L< z7O-tivl+hMv8L1Mcs#uttDGr-d*&g26-_%i(HM>sB;#Nb?DiDobb=BzhTzzA+J^ab z8fYh)ZBT9meNcjR6`JpB4pD}+)NX9b2v}>lUbnRqPoQ|Hd;~vI^64fMvN?PHaab!=WMi#Jrj!i z#Rw6*XdsL^C?UyfIt^#osik%u*}>8cm;FhCNp<{5>OEW zC^3B7(I}BQs2!!>*pf6keE5xUwKJiLc()VEHNTh8?GaA3O+D|s;2NHICA$%>@vmfo z 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 Eg5PjTRR910 literal 0 HcmV?d00001 diff --git a/examples/positioning/geoflickr/doc/src/geoflickr.qdoc b/examples/positioning/geoflickr/doc/src/geoflickr.qdoc new file mode 100644 index 0000000..14d6e88 --- /dev/null +++ b/examples/positioning/geoflickr/doc/src/geoflickr.qdoc @@ -0,0 +1,87 @@ +/**************************************************************************** +** +** Copyright (C) 2019 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the documentation of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:FDL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Free Documentation License Usage +** Alternatively, this file may be used under the terms of the GNU Free +** Documentation License version 1.3 as published by the Free Software +** Foundation and appearing in the file included in the packaging of +** this file. Please review the following information to ensure +** the GNU Free Documentation License version 1.3 requirements +** will be met: https://www.gnu.org/licenses/fdl-1.3.html. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +/*! + \example geoflickr + \title GeoFlickr (QML) + \ingroup qtpositioning-examples + + \brief The GeoFlickr example shows how to use the user's current + position to fetch local content from a web service. + + This is a small example, illustrating one of the very core parts + of the \l{Qt Positioning} API: the ability to retrieve and use the + user's current geographic position. + + Key QML types shown in this example: + \list + \li \l{QtPositioning::PositionSource}{PositionSource} + \li \l{XmlListModel}{XmlListModel} + \endlist + + \image qml-flickr-1.jpg + + \include examples-run.qdocinc + + \section1 Retrieving the Current Position + + Retrieving the user's current position is achieved using the PositionSource + type. In this example, we instantiate the PositionSource as part + of the GeoTab component (the floating "window" describing current + position and status). + + \snippet geoflickr/flickrmobile/GeoTab.qml possrc + + When the "Locate and update" button is pressed, we first interrogate + the PositionSource to check if it has an available backend for + positioning data. If it does not, we fall back to using a pre-recorded + NMEA log for demonstration. We then instruct the PositionSource to update. + + \snippet geoflickr/flickrmobile/GeoTab.qml locatebutton-top + \snippet geoflickr/flickrmobile/GeoTab.qml locatebutton-clicked + + To share the new position data with the rest of the application, we + use properties that we have created on the GeoTab component: + + \snippet geoflickr/flickrmobile/GeoTab.qml props + + \section1 Using the Current Position + + The longitude and latitude values retrieved here are eventually set + in the properties on the RestModel component. The RestModel is an + XmlListModel, which retrieves XML data from a URL and creates a data + model by performing XPath queries on it. + + In this case, it retrieves data from the Flickr REST API online, + based on our current position + + \snippet geoflickr/flickrcommon/RestModel.qml restmodel + + This model data is then shown in a variety of Qt Quick views to + produce the example application. + +*/ diff --git a/examples/positioning/geoflickr/flickr-90.qml b/examples/positioning/geoflickr/flickr-90.qml new file mode 100644 index 0000000..e335274 --- /dev/null +++ b/examples/positioning/geoflickr/flickr-90.qml @@ -0,0 +1,61 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.0 + +Item { + width: 480; height: 320 + + Loader { + y: 320; rotation: -90 + transformOrigin: Item.TopLeft + source: "flickr.qml" + } +} diff --git a/examples/positioning/geoflickr/flickr.qml b/examples/positioning/geoflickr/flickr.qml new file mode 100644 index 0000000..45cfb44 --- /dev/null +++ b/examples/positioning/geoflickr/flickr.qml @@ -0,0 +1,147 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.0 +import QtQuick.XmlListModel 2.0 +import "flickrcommon" as Common +import "flickrmobile" as Mobile + +Item { + id: screen; width: 320; height: 480 + property bool inListView : false + + Rectangle { + id: background + anchors.fill: parent; color: "#343434"; + + Image { source: "flickrmobile/images/stripes.png"; fillMode: Image.Tile; anchors.fill: parent; opacity: 0.3 } + + Common.RestModel { + id: restModel + coordinate: geoTab.coordinate + } + + Item { + id: views + x: 2; width: parent.width - 4 + anchors.top: titleBar.bottom; anchors.bottom: toolBar.top + + Text { + text: qsTr("Network error") + font.pixelSize: 48 + fontSizeMode: Text.HorizontalFit + anchors.centerIn: parent + width: parent.width * 0.9 + visible: restModel.status === XmlListModel.Error + + } + + Mobile.GridDelegate { id: gridDelegate } + GridView { + x: (width/4-79)/2; y: x + id: photoGridView; model: restModel; delegate: gridDelegate; cacheBuffer: 100 + cellWidth: (parent.width-2)/4; cellHeight: cellWidth; width: parent.width; height: parent.height - 1; z: 6 + } + Mobile.ListDelegate { id: listDelegate } + ListView { + id: photoListView; model: restModel; delegate: listDelegate; z: 6 + width: parent.width; height: parent.height; x: -(parent.width * 1.5); cacheBuffer: 100; + } + states: State { + name: "ListView"; when: screen.inListView == true + PropertyChanges { target: photoListView; x: 0 } + PropertyChanges { target: photoGridView; x: -(parent.width * 1.5) } + } + + transitions: Transition { + NumberAnimation { properties: "x"; duration: 500; easing.type: Easing.InOutQuad } + } + } + Mobile.ImageDetails { id: imageDetails; width: parent.width; anchors.left: views.right; height: parent.height; z:1 } + Mobile.TitleBar { id: titleBar; z: 5; width: parent.width; height: 40; opacity: 0.9 } + Mobile.GeoTab { + id: geoTab; + x: 15; y:50; + } + Mobile.ToolBar { + id: toolBar; z: 5 + height: 40; anchors.bottom: parent.bottom; width: parent.width; opacity: 0.9 + button1Label: "Update"; button2Label: "View mode" + onButton1Clicked: restModel.reload() + onButton2Clicked: if (screen.inListView == true) screen.inListView = false; else screen.inListView = true + } + Connections { + target: imageDetails + onClosed: { + if (background.state == "DetailedView") { + background.state = ''; + imageDetails.photoUrl = ""; + } + } + } + + states: State { + name: "DetailedView" + PropertyChanges { target: views; x: -parent.width } + PropertyChanges { target: geoTab; x: -parent.width } + PropertyChanges { target: toolBar; button1Label: "More..." } + PropertyChanges { + target: toolBar + onButton1Clicked: if (imageDetails.state=='') imageDetails.state='Back'; else imageDetails.state='' + } + PropertyChanges { target: toolBar; button2Label: "Back" } + PropertyChanges { target: toolBar; onButton2Clicked: imageDetails.closed() } + } + + transitions: Transition { + NumberAnimation { properties: "x"; duration: 500; easing.type: Easing.InOutQuad } + } + } +} diff --git a/examples/positioning/geoflickr/flickr.qrc b/examples/positioning/geoflickr/flickr.qrc new file mode 100644 index 0000000..1019f7d --- /dev/null +++ b/examples/positioning/geoflickr/flickr.qrc @@ -0,0 +1,30 @@ + + + flickr.qml + flickr-90.qml + flickrcommon/Progress.qml + flickrcommon/RestModel.qml + flickrcommon/ScrollBar.qml + flickrcommon/Slider.qml + flickrmobile/Button.qml + flickrmobile/GeoTab.qml + flickrmobile/GridDelegate.qml + flickrmobile/ImageDetails.qml + flickrmobile/ListDelegate.qml + flickrmobile/nmealog.txt + flickrmobile/TitleBar.qml + flickrmobile/ToolBar.qml + flickrmobile/images/gloss.png + flickrmobile/images/lineedit.png + flickrmobile/images/lineedit.sci + flickrmobile/images/moon.png + flickrmobile/images/quit.png + flickrmobile/images/star.png + flickrmobile/images/stripes.png + flickrmobile/images/sun.png + flickrmobile/images/titlebar.png + flickrmobile/images/titlebar.sci + flickrmobile/images/toolbutton.png + flickrmobile/images/toolbutton.sci + + diff --git a/examples/positioning/geoflickr/flickrcommon/Progress.qml b/examples/positioning/geoflickr/flickrcommon/Progress.qml new file mode 100644 index 0000000..f8388b5 --- /dev/null +++ b/examples/positioning/geoflickr/flickrcommon/Progress.qml @@ -0,0 +1,82 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.0 + +Item { + property variant progress: 0 + + Rectangle { + anchors.fill: parent; smooth: true + border.color: "white"; border.width: 0; radius: height/2 - 2 + gradient: Gradient { + GradientStop { position: 0; color: "#66343434" } + GradientStop { position: 1.0; color: "#66000000" } + } + } + + Rectangle { + y: 2; height: parent.height-4; + x: 2; width: Math.max(parent.width * progress - 4, 0); + opacity: width < 1 ? 0 : 1; smooth: true + gradient: Gradient { + GradientStop { position: 0; color: "lightsteelblue" } + GradientStop { position: 1.0; color: "steelblue" } + } + radius: height/2 - 2 + } + + Text { + text: Math.round(progress * 100) + "%" + anchors.horizontalCenter: parent.horizontalCenter + anchors.verticalCenter: parent.verticalCenter + color: "white"; font.bold: true + } +} diff --git a/examples/positioning/geoflickr/flickrcommon/RestModel.qml b/examples/positioning/geoflickr/flickrcommon/RestModel.qml new file mode 100644 index 0000000..ad9f4dc --- /dev/null +++ b/examples/positioning/geoflickr/flickrcommon/RestModel.qml @@ -0,0 +1,75 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.0 +import QtQuick.XmlListModel 2.0 + +//! [restmodel] +XmlListModel { + property variant coordinate + + source: "https://api.flickr.com/services/rest/?" + + "min_taken_date=2000-01-01+0:00:00&" + + "extras=date_taken&" + + "method=flickr.photos.search&" + + "per_page=30&" + + "sort=date-taken-desc&" + + "api_key=e36784df8a03fea04c22ed93318b291c&" + + "lat=" + coordinate.latitude + "&lon=" + coordinate.longitude; + query: "/rsp/photos/photo" + + XmlRole { name: "title"; query: "@title/string()" } + XmlRole { name: "datetaken"; query: "@datetaken/string()" } + XmlRole { name: "farm"; query: "@farm/string()" } + XmlRole { name: "server"; query: "@server/string()" } + XmlRole { name: "id"; query: "@id/string()" } + XmlRole { name: "secret"; query: "@secret/string()" } +} +//! [restmodel] diff --git a/examples/positioning/geoflickr/flickrcommon/ScrollBar.qml b/examples/positioning/geoflickr/flickrcommon/ScrollBar.qml new file mode 100644 index 0000000..f961468 --- /dev/null +++ b/examples/positioning/geoflickr/flickrcommon/ScrollBar.qml @@ -0,0 +1,90 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.0 + +Item { + id: container + + property variant flickableArea + + Rectangle { + radius: 5 + color: "black" + opacity: 0.3 + border.color: "white" + border.width: 2 + x: 0 + y: flickableArea.visibleArea.yPosition * container.height + width: parent.width + height: flickableArea.visibleArea.heightRatio * container.height + } + states: [ + State { + name: "show" + when: flickableArea.movingVertically + PropertyChanges { + target: container + opacity: 1 + } + } + ] + transitions: [ + Transition { + from: "*" + to: "*" + NumberAnimation { + target: container + properties: "opacity" + duration: 400 + } + } + ] +} diff --git a/examples/positioning/geoflickr/flickrcommon/Slider.qml b/examples/positioning/geoflickr/flickrcommon/Slider.qml new file mode 100644 index 0000000..f323ab2 --- /dev/null +++ b/examples/positioning/geoflickr/flickrcommon/Slider.qml @@ -0,0 +1,86 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.0 + +Item { + id: slider; width: 400; height: 16 + + // value is read/write. + property real value + onValueChanged: { handle.x = 2 + (value - minimum) * slider.xMax / (maximum - minimum); } + property real maximum: 1 + property real minimum: 1 + property int xMax: slider.width - handle.width - 4 + + Rectangle { + anchors.fill: parent + border.color: "white"; border.width: 0; radius: 8 + gradient: Gradient { + GradientStop { position: 0.0; color: "#66343434" } + GradientStop { position: 1.0; color: "#66000000" } + } + } + + Rectangle { + id: handle; smooth: true + x: slider.width / 2 - handle.width / 2; y: 2; width: 30; height: slider.height-4; radius: 6 + gradient: Gradient { + GradientStop { position: 0.0; color: "lightgray" } + GradientStop { position: 1.0; color: "gray" } + } + + MouseArea { + anchors.fill: parent; drag.target: parent + drag.axis: Drag.XAxis; drag.minimumX: 2; drag.maximumX: slider.xMax+2 + onPositionChanged: { value = (maximum - minimum) * (handle.x-2) / slider.xMax + minimum; } + } + } +} diff --git a/examples/positioning/geoflickr/flickrmobile/Button.qml b/examples/positioning/geoflickr/flickrmobile/Button.qml new file mode 100644 index 0000000..5f2fcba --- /dev/null +++ b/examples/positioning/geoflickr/flickrmobile/Button.qml @@ -0,0 +1,88 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.0 + +Item { + id: container + + signal clicked + + property string text + + BorderImage { + id: buttonImage + source: "images/toolbutton.sci" + width: container.width; height: container.height + } + BorderImage { + id: pressed + opacity: 0 + source: "images/toolbutton.sci" + width: container.width; height: container.height + } + MouseArea { + id: mouseRegion + anchors.fill: buttonImage + onClicked: { container.clicked(); } + } + Text { + color: "white" + anchors.centerIn: buttonImage; font.bold: true + text: container.text; style: Text.Raised; styleColor: "black" + } + states: [ + State { + name: "Pressed" + when: mouseRegion.pressed == true + PropertyChanges { target: pressed; opacity: 1 } + } + ] +} diff --git a/examples/positioning/geoflickr/flickrmobile/GeoTab.qml b/examples/positioning/geoflickr/flickrmobile/GeoTab.qml new file mode 100644 index 0000000..59dacc2 --- /dev/null +++ b/examples/positioning/geoflickr/flickrmobile/GeoTab.qml @@ -0,0 +1,181 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.0 +import QtPositioning 5.2 + +Rectangle { + id: container + property int maxX: parent.width; property int maxY: parent.height +//! [props] + property variant coordinate +//! [props] + + Binding { + target: container + property: "coordinate" + value: positionSource.position.coordinate + } + + width: 300; height: 130 + color: "blue" + opacity: 0.7 + border.color: "black" + border.width: 1 + radius: 5 + gradient: Gradient { + GradientStop {position: 0.0; color: "grey"} + GradientStop {position: 1.0; color: "black"} + } + MouseArea { + anchors.fill: parent + drag.target: parent + drag.axis: Drag.XandYAxis + drag.minimumX: -(parent.width * (2/3)); drag.maximumX: parent.maxX - (parent.width/3) + drag.minimumY: -(parent.height/2); drag.maximumY: parent.maxY - (parent.height/2) + } +//! [locatebutton-top] + Button { + id: locateButton + text: "Locate & update" +//! [locatebutton-top] + anchors {left: parent.left; leftMargin: 5} + y: 3; height: 32; width: parent.width - 10 +//! [locatebutton-clicked] + onClicked: { + if (positionSource.supportedPositioningMethods === + PositionSource.NoPositioningMethods) { + positionSource.nmeaSource = "nmealog.txt"; + sourceText.text = "(filesource): " + printableMethod(positionSource.supportedPositioningMethods); + } + positionSource.update(); + } + } +//! [locatebutton-clicked] +//! [possrc] + PositionSource { + id: positionSource + onPositionChanged: { planet.source = "images/sun.png"; } + + onSourceErrorChanged: { + if (sourceError == PositionSource.NoError) + return + + console.log("Source error: " + sourceError) + activityText.fadeOut = true + stop() + } + + onUpdateTimeout: { + activityText.fadeOut = true + } + } +//! [possrc] + function printableMethod(method) { + if (method === PositionSource.SatellitePositioningMethods) + return "Satellite"; + else if (method === PositionSource.NoPositioningMethods) + return "Not available" + else if (method === PositionSource.NonSatellitePositioningMethods) + return "Non-satellite" + else if (method === PositionSource.AllPositioningMethods) + return "Multiple" + return "source error"; + } + + Grid { + id: locationGrid + columns: 2 + anchors {left: parent.left; leftMargin: 5; top: locateButton.bottom; topMargin: 5} + spacing: 5 + Text {color: "white"; font.bold: true + text: "Lat:"; style: Text.Raised; styleColor: "black" + } + Text {id: latitudeValue; color: "white"; font.bold: true + text: positionSource.position.coordinate.latitude; style: Text.Raised; styleColor: "black"; + } + Text {color: "white"; font.bold: true + text: "Lon:"; style: Text.Raised; styleColor: "black" + } + Text {id: longitudeValue; color: "white"; font.bold: true + text: positionSource.position.coordinate.longitude; style: Text.Raised; styleColor: "black" + } + } + Image { + id: planet + anchors {top: locationGrid.bottom; left: parent.left; leftMargin: locationGrid.anchors.leftMargin} + source: "images/moon.png" + width: 30; height: 30 + } + Text {id: sourceText; color: "white"; font.bold: true; + anchors {left: planet.right; leftMargin: 5; verticalCenter: planet.verticalCenter} + text: "Source: " + printableMethod(positionSource.supportedPositioningMethods); style: Text.Raised; styleColor: "black"; + } + + Text { + id: activityText; color: "white"; font.bold: true; + anchors { top: planet.bottom; horizontalCenter: parent.horizontalCenter } + property bool fadeOut: false + + text: { + if (fadeOut) + return qsTr("Timeout occurred!"); + else if (positionSource.active) + return qsTr("Retrieving update...") + else + return "" + } + + Timer { + id: fadeoutTimer; repeat: false; interval: 3000; running: activityText.fadeOut + onTriggered: { activityText.fadeOut = false; } + } + } +} diff --git a/examples/positioning/geoflickr/flickrmobile/GridDelegate.qml b/examples/positioning/geoflickr/flickrmobile/GridDelegate.qml new file mode 100644 index 0000000..5ed0db5 --- /dev/null +++ b/examples/positioning/geoflickr/flickrmobile/GridDelegate.qml @@ -0,0 +1,122 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + + import QtQuick 2.0 + import QtQuick.Window 2.0 + + Component { + id: photoDelegate + Item { + id: wrapper; width: 79; height: 79 + + function photoClicked() { + imageDetails.photoTitle = title; + imageDetails.photoDate = datetaken; + imageDetails.photoUrl = "http://farm" + farm + ".static.flickr.com/" + server + "/" + id + "_" + secret + ".jpg"; + console.log(imageDetails.photoUrl); + scaleMe.state = "Details"; + } + + Item { + anchors.centerIn: parent + scale: 0.0 + Behavior on scale { NumberAnimation { easing.type: Easing.InOutQuad} } + id: scaleMe + + Rectangle { height: 79; width: 79; id: blackRect; anchors.centerIn: parent; color: "black"; smooth: true } + Rectangle { + id: whiteRect; width: 76; height: 76; anchors.centerIn: parent; color: "#dddddd"; smooth: true + Image { id: thumb; + // source: imagePath; + source: imageDetails.photoUrl = "http://farm" + farm + ".static.flickr.com/" + server + "/" + id + "_" + secret + "_t.jpg" + width: parent.width; height: parent.height + x: 1; y: 1; smooth: true} + Image { source: "images/gloss.png" } + } + + Connections { + target: toolBar + onButton2Clicked: if (scaleMe.state == 'Details' ) scaleMe.state = 'Show' + } + + states: [ + State { + name: "Show"; when: thumb.status == Image.Ready + PropertyChanges { target: scaleMe; scale: Math.round(Screen.pixelDensity / 4) } + }, + State { + name: "Details" + PropertyChanges { target: scaleMe; scale: Math.round(Screen.pixelDensity / 4)} + ParentChange { target: wrapper; parent: imageDetails.frontContainer } + PropertyChanges { target: wrapper; x: 20; y: 60; z: 1000 } + PropertyChanges { target: background; state: "DetailedView" } + } + ] + transitions: [ + Transition { + from: "Show"; to: "Details" + ParentAnimation { + NumberAnimation { properties: "x,y"; duration: 500; easing.type: Easing.InOutQuad } + } + }, + Transition { + from: "Details"; to: "Show" + SequentialAnimation { + ParentAnimation { + NumberAnimation { properties: "x,y"; duration: 500; easing.type: Easing.InOutQuad } + } + PropertyAction { targets: wrapper; properties: "z" } + } + } + ] + } + MouseArea { anchors.fill: wrapper; onClicked: { photoClicked() } } + } + } diff --git a/examples/positioning/geoflickr/flickrmobile/ImageDetails.qml b/examples/positioning/geoflickr/flickrmobile/ImageDetails.qml new file mode 100644 index 0000000..58c924b --- /dev/null +++ b/examples/positioning/geoflickr/flickrmobile/ImageDetails.qml @@ -0,0 +1,166 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.0 +import "../flickrcommon" as Common + +Flipable { + id: container + + property variant frontContainer: containerFront + property string photoTitle: "" + property string photoDate + property string photoUrl + property variant prevScale: 1.0 + + signal closed + + transform: Rotation { + id: itemRotation + origin.x: container.width / 2; + axis.y: 1; axis.z: 0 + } + + front: Item { + id: containerFront; anchors.fill: container + + Rectangle { + anchors.fill: parent + color: "black"; opacity: 0.4 + } + + Column { + spacing: 10 + anchors { + left: parent.left; leftMargin: 20 + right: parent.right; rightMargin: 20 + top: parent.top; topMargin: 180 + } + Text { font.bold: true; color: "white"; elide: Text.ElideRight; text: container.photoTitle } + Text { color: "white"; elide: Text.ElideRight; text: "Published: " + container.photoDate } + } + } + + back: Item { + anchors.fill: container + + Rectangle { anchors.fill: parent; color: "black"; opacity: 0.4 } + + Common.Progress { + anchors.centerIn: parent; width: 200; height: 18 + progress: bigImage.progress; visible: bigImage.status != Image.Ready + } + + Flickable { + id: flickable; anchors.fill: parent; clip: true + contentWidth: imageContainer.width; contentHeight: imageContainer.height + + Item { + id: imageContainer + width: Math.max(bigImage.width * bigImage.scale, flickable.width); + height: Math.max(bigImage.height * bigImage.scale, flickable.height); + + Image { + id: bigImage; // source: container.photoUrl + source: container.photoUrl + scale: slider.value + anchors.centerIn: parent; smooth: !flickable.movingVertically + onStatusChanged : { + // Default scale shows the entire image. + if (status == Image.Ready && width != 0) { + slider.minimum = Math.min(flickable.width / width, flickable.height / height); + prevScale = Math.min(slider.minimum, 1); + slider.value = prevScale; + } + } + } + } + } + + Text { + text: "Image Unavailable" + visible: bigImage.status == Image.Error + anchors.centerIn: parent; color: "white"; font.bold: true + } + + Common.Slider { + id: slider; visible: { bigImage.status == Image.Ready && maximum > minimum } + anchors { + bottom: parent.bottom; bottomMargin: 65 + left: parent.left; leftMargin: 25 + right: parent.right; rightMargin: 25 + } + onValueChanged: { + if (bigImage.width * value > flickable.width) { + var xoff = (flickable.width/2 + flickable.contentX) * value / prevScale; + flickable.contentX = xoff - flickable.width/2; + } + if (bigImage.height * value > flickable.height) { + var yoff = (flickable.height/2 + flickable.contentY) * value / prevScale; + flickable.contentY = yoff - flickable.height/2; + } + prevScale = value; + } + } + } + + states: State { + name: "Back" + PropertyChanges { target: itemRotation; angle: 180 } + } + + transitions: Transition { + SequentialAnimation { + PropertyAction { target: bigImage; property: "smooth"; value: false } + NumberAnimation { easing.type: Easing.InOutQuad; properties: "angle"; duration: 500 } + PropertyAction { target: bigImage; property: "smooth"; value: !flickable.movingVertically } + } + } +} diff --git a/examples/positioning/geoflickr/flickrmobile/ListDelegate.qml b/examples/positioning/geoflickr/flickrmobile/ListDelegate.qml new file mode 100644 index 0000000..f83f345 --- /dev/null +++ b/examples/positioning/geoflickr/flickrmobile/ListDelegate.qml @@ -0,0 +1,76 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.0 + Component { + Item { + id: wrapper; width: wrapper.ListView.view.width; height: 86 + Item { + id: moveMe + Rectangle { color: "black"; opacity: index % 2 ? 0.2 : 0.4; height: 84; width: wrapper.width; y: 1 } + Rectangle { + x: 6; y: 4; width: 76; height: 76; color: "white"; smooth: true + + Image { + //source: imagePath; + source: "http://farm" + farm + ".static.flickr.com/" + server + "/" + id + "_" + secret + "_t.jpg" + width: parent.width; height: parent.height + x: 0; y: 0 } + + Image { source: "images/gloss.png" } + } + Column { + x: 92; width: wrapper.ListView.view.width - 95; y: 15; spacing: 2 + Text { text: title; color: "white"; width: parent.width; font.bold: true; elide: Text.ElideRight; style: Text.Raised; styleColor: "black" } + Text { text: datetaken; width: parent.width; elide: Text.ElideRight; color: "#cccccc"; style: Text.Raised; styleColor: "black" } + } + } + } +} diff --git a/examples/positioning/geoflickr/flickrmobile/TitleBar.qml b/examples/positioning/geoflickr/flickrmobile/TitleBar.qml new file mode 100644 index 0000000..883042a --- /dev/null +++ b/examples/positioning/geoflickr/flickrmobile/TitleBar.qml @@ -0,0 +1,87 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.0 + +Item { + id: titleBar + BorderImage { source: "images/titlebar.sci"; width: parent.width; height: parent.height + 14; y: -7 } + + Item { + id: container + width: (parent.width * 2) - 55 ; height: parent.height + + Image { + id: quitButton + anchors.left: parent.left//; anchors.leftMargin: 0 + anchors.verticalCenter: parent.verticalCenter + source: "images/quit.png" + MouseArea { + anchors.fill: parent + onClicked: Qt.quit() + } + } + + Text { + id: categoryText + anchors { + left: quitButton.right; leftMargin: 10; rightMargin: 10 + verticalCenter: parent.verticalCenter + } + elide: Text.ElideLeft + text: "GeoFlickr (QML)" + font.bold: true; color: "White"; style: Text.Raised; styleColor: "Black" + } + } + + transitions: Transition { + NumberAnimation { properties: "x"; easing.type: Easing.InOutQuad } + } +} diff --git a/examples/positioning/geoflickr/flickrmobile/ToolBar.qml b/examples/positioning/geoflickr/flickrmobile/ToolBar.qml new file mode 100644 index 0000000..cb0a0fd --- /dev/null +++ b/examples/positioning/geoflickr/flickrmobile/ToolBar.qml @@ -0,0 +1,74 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.0 + +Item { + id: toolbar + + property alias button1Label: button1.text + property alias button2Label: button2.text + signal button1Clicked + signal button2Clicked + + BorderImage { source: "images/titlebar.sci"; width: parent.width; height: parent.height + 14; y: -7 } + + Button { + id: button1 + anchors.left: parent.left; anchors.leftMargin: 5; y: 3; width: 140; height: 32 + onClicked: toolbar.button1Clicked() + } + + Button { + id: button2 + anchors.right: parent.right; anchors.rightMargin: 5; y: 3; width: 140; height: 32 + onClicked: toolbar.button2Clicked() + } +} diff --git a/examples/positioning/geoflickr/flickrmobile/images/gloss.png b/examples/positioning/geoflickr/flickrmobile/images/gloss.png new file mode 100644 index 0000000000000000000000000000000000000000..dff2bd34718bce770ed746136f8976332111c23e GIT binary patch literal 889 zcmV-<1BU#GP)eTd}%-tK1b1D4>ySGqo)GjrzLvFHj= z6ours|8KvB5bhFPA3bXSq1ii_tVuw48*3Puc;)XPLEvq@0M!gpbZ1Ll1^l47D7vdi z`@@I+JGf&8-y<7EA2J)e*Kb)8I7LzPu`*^hYk{LE`s7KS8b=@dIEp?8r?nWqwK9sn zvw-muUwc|}_Y@;|?*mciRyY+zi+%{KdB%EZQq!Uz4K>fTb9m*V=%?x|v0k%@aA_1p zKj-OF4Vi~amlplvwVgWKu@Y^RJ$PT8-rb$((ynscUqru!wW1zG=X7b&?-q^SwcDCX zOeTt=KP*L~4qA)W5dG;8mpbY8r*WQ=!^cYXXDcBDq71VmgpZVqh#$%{MJPO zoUKQgEa5i4%F2|6Jt^(AGe>l~A>&}BIQOxZF_i^aEo?ap`Ar(lJM8EZyCMZ+SB29pGh zSg@hzWe6M#$7mL#(BchidKseYIN$B98PBp5u9&iBm>7s)6M`~`R`WoGh%sv>M^Owx zc`ihUiK;@M6*JlaXsvR~ZX;=hHZd`MB)~DVaLr??uW-eXB~zlHa~2a>wgA~7W-9Km+0YRW8uA|UW4I5BTM4~?*i`v?*i`vud&yE=VmBv+|22M P00000NkvXXu0mjfaetp8 literal 0 HcmV?d00001 diff --git a/examples/positioning/geoflickr/flickrmobile/images/lineedit.png b/examples/positioning/geoflickr/flickrmobile/images/lineedit.png new file mode 100644 index 0000000000000000000000000000000000000000..a6afb5121a6f8f02491ce9fa220d9f8b6c0f31c0 GIT binary patch literal 1307 zcmV+$1?2jPP)^_M)OMqYwHdLJ>s}eN&%{;FDDU1^oxa7nPzf zf|n{76#7tuptM>qwY6%kY0}0t>Ez5g`}=&DOiXMwNlBU%`@!bG%sywZNPmU@yB5~XvhKv!26k>*eX&bbw5aXw&G#TbLCA|i}k z8f7#)N6$bH1z+HgV`usG{a=Q?E!s!7KC!vxy=C(31Wd&|ecvMJ3*;m7aD5HC*jIC@bW7P5Ig-Q0^y^q_fw-J0mj6kel zw5houE82_#qG*u0YpWrOL||gWgF7E!_uyWV$r+*^k1tf(Nzyug%&@zEC#Vp+-0V1` zzZa3St15$kvK(nl2r0Q-Ol?bzPe1yE_Wn-16qKwXbQZd~X=oG9`UMY4vl+b0EnCN` zx?~q=^<8j}D4GBshPtXa^+Ya*&qxsw>eJKYeXeO|nvjp$2uVtm%P$GQ)!16A-IodyiE^a&f9@g^NzD zgk`h4nq^mljWq?lp1@rd!^XPn3-G$v@IS#B>(;l1*FD3=7z6=p7QBqiqj*h#&EKk9 zS5?Jwoz)G%Hvs=H0AE)=yzUq_#^Q+=c-?wn*BH}0|MpiYT>j7{ndOr+G4IzOEFes*|GuptD@Dn(UGS#&L;j-B|1sH2&U z*y-tMthY=|O)&E12&puhdPbUwrL2)l&@_WansDUHBbW#pjRtn=iwR<%r@Xbo>xbXq z$gvR+AQ*y%t9FW(r2eak2q6SQ2y>BZ>oaQ{Si`}O4l?}XFokNK^g@Dj-o4kex%6Cl zbA{3AKREpPVMralr3&30T?m4~tjYp3#x%Xv+RLJ=pMU$6*WP`Vw?2HE(vDvGH&!`) z=oDr{dBY=Z1JVB4{)cKwd%}h9#u+~`PH(A~qAgOS0~=d(nRpiqz_Tp7ET(F)tO{e7 z&NJ@D=)I{#d25;Rqi31?qW*%Z4h)(!4G(v0E53Nwle=ndLj^P#M$e4Wn3_Q*QyOG= z?^iU63Yz`vea1jnUk`=u9Qi_#^Iu=!_@Se(6#5Gc0 zr98Q=HtI=(yw9^-MaUwHRW)2O7;H&o=HewTo|>XD7CtH6S$fJB{J3#O{sI^eqK)Qb RrHcRn002ovPDHLkV1hGOfVKbt literal 0 HcmV?d00001 diff --git a/examples/positioning/geoflickr/flickrmobile/images/lineedit.sci b/examples/positioning/geoflickr/flickrmobile/images/lineedit.sci new file mode 100644 index 0000000..054bff7 --- /dev/null +++ b/examples/positioning/geoflickr/flickrmobile/images/lineedit.sci @@ -0,0 +1,5 @@ +border.left: 10 +border.top: 10 +border.bottom: 10 +border.right: 10 +source: lineedit.png diff --git a/examples/positioning/geoflickr/flickrmobile/images/moon.png b/examples/positioning/geoflickr/flickrmobile/images/moon.png new file mode 100644 index 0000000000000000000000000000000000000000..1583ac83f7cfbfdca3f9c0818a2ff00e7585bef3 GIT binary patch literal 2366 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 literal 0 HcmV?d00001 diff --git a/examples/positioning/geoflickr/flickrmobile/images/quit.png b/examples/positioning/geoflickr/flickrmobile/images/quit.png new file mode 100644 index 0000000000000000000000000000000000000000..aef73853e362dd6787ecffaa057f21adf7d1d456 GIT binary patch literal 1785 zcmV({j3*ryZagbwx(==k`U_8JXxI-RukX6@Fn9*<|uYPJ5Jmv`vw{d;O1w&?VP$K0pa zn8Sg&?gBgEu-kjfOUtykyGIJc)pu!kSJlzc5w7o&!|tFrt8ab^yRx#vkYD6%j^3TV zqXWEn1LHP^W8=KMyiD-fkzk)oX6a&SaY?`&1FBxFsjAheHc+?Iq1`&e+5x-zLs+lZ z8wKQLHk%a|q8v)Df_Cwgh2m{{tHg2FsZEuS_OGCxB$AN~tWyyH=TMxPE$iO8hc&b929q5(agq zg@t}PnSyUBR0U+IP^2PMC=^s-LzGG-YPZ|M!Zw?YeNBT61OhccUZqkg0m&~|#B(K0 zMNPvo7BDA!%E)14!D#HqVcFxOV=807ot+)Z=ko%Te-G7cHU$X4c=;5c&&QCIOeRUe zi}DJHm)jXCPrRw}c(&DSQ56=wE97^uNx&-bBeq07Cu@K?#6p%V%XD~nC}2${6B&(0 zipP_P5DFDxd0FOrvc$1d#`AIx&jYl{&tU0|2IIXTHCUs;(2qx>Vq>v2*q7MvZi=sQ z7(;v|o7G0`RtMHE;(8AMPeZ92_sSw37vVa{P-B6-hSeMT(MW`jx?N#K_Pv`*rvZ~n zQ)91zfWw}^&WVTx=G z#J|H){Ei~-R>Vd!=ndZx`pS<|n4-9lW@cutI0SX!vkdA7c+h{XfX@&4pn%xn>uc*Y zH#<)jN$NgY1&z8?nVp@bwY4>|u{Jk1X%kSsP2T{{Pk#LNd4046pYC>!$YQqA^z_W% zlP_ONj{<46SQMR3M``TlLcTzo-c13eS}-6K1T^YH;k-J&Yx-R>h##Q#PFi zWL0dIaA-?~1zb235`Xi~7uQ&!@5K>h29|Hk-@bEpm|NV66spbyBvBs%?>pI_-{F^7*;> zD`YTH9dY5EjH~w~w1l9J!Ksy#Mi9?nbKV^mR?GqNlG7chJXlrw#ro65_hmc%|4C=`rT0w<1i?VJXt+7_iVoa_}WjQZG z7XP1nFRbLnD4%*J(24dOcEA?OqFoqP^lTl544NNutN%f|(;oPIL+d zgsL_mOWfBJ?zvlUFG-f3)8P_54>w?Z<_{2~Kn{<^#l^10V!7gWMYSL|h8>JqA*a)I zXGjg!B3XO<35OdnZl8HW3>q=r9b$3;K!0*(Q#;ctxm<3tSghmu{)F_|bGzNbC+`ZW z#b%Q!Et$<=e)7Dx>i!T*9kOpGJtF)T9DSGdCYI3cx9J+}=Tw+(|20r_JVQ(&Ie~(WXHxMd(c4()0X~bUEaWAuh*L~4 z{Jfce-bDO+d^GY}tR)x`VN=nnt$k&zd-uES(1G4cbWwT_nKPGanNAY@YMZG|-MUiC zm%xRquF{FA2Xl`mD%*z3u6;v0PTiP$^Wx62D&cRSP^e5idG&1O$VfN2<_Nj5nS0m9 zvV_bJ*wJ_H!mfOUbpzg0+iJ0LBc(x$AGe{`ocpiW^NTY}$0xWvdVkRau+;zn002ov JPDHLkV1nwjbWZ>P literal 0 HcmV?d00001 diff --git a/examples/positioning/geoflickr/flickrmobile/images/stripes.png b/examples/positioning/geoflickr/flickrmobile/images/stripes.png new file mode 100644 index 0000000000000000000000000000000000000000..75d2bf6c66ea20238f29bc6a086a31a5eecc4add GIT binary patch literal 159 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqX`U{QArhD8o;BoRRupM@X#YWC z&AhG~(G?Tk7NzVx{!C}(WsWwToQawCX>C!bqA#&neMnfkRqW1Q<;|IC>;n4?mzErn zP+wi?SU!JJ+@EuLGLzb7+U`79``e!BN>uf^N)M~+&)ps{&z2X9U-Do=3(!UePgg&e IbxsLQ0E~z{qyPW_ literal 0 HcmV?d00001 diff --git a/examples/positioning/geoflickr/flickrmobile/images/sun.png b/examples/positioning/geoflickr/flickrmobile/images/sun.png new file mode 100644 index 0000000000000000000000000000000000000000..c5fd36ed39d42ce1f365f27e9637b3a0e1f3e73f GIT binary patch literal 8110 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 q(yB& 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

;0zh{wA6OyP`PpX?5+&HR6pc9-BAki5H0 zByU68bx5^Jdi<^wtwng<5@1Cse;J?uPDbxFhe;A8w{D#I@c?=4DTV&>DUezUvh%hm z`=n~`%u#jwlJseZipKrWd4HA>n;rECYTSfh#=Aw(^ocbeuZ zc0TC&nh#|m^6IaUly+VMw2DWYuzr>sJ4Y1dd+4P%;g3~<8yV6e5|t@so1Yh(HYg46 zpgnku#z{chc?jA=g4Bdmlg#iEAS#H6QlS7R4X~}iqKl}wp+@yo*v6>%8j$^wRPhMy zEHw$^|AqQ!%k>gx%OfWc7dyE0_Bx*aY!mFNF3)zeNZUq^m=H4j+(Jt9`yb)f?km4d z@NpeVrTKVeEtI_&GbcuvXjzB(d1kaz&nXW^5ZAaw!7+`K~grnCozxONw* z6m~8YuVd8lQZ24@&wri4xP!vXJlXfhgdOckM^E*IncVU^_KH$mzMSj;fEa zqGSCC@yfQD>u=Komjs^%;N7`)QYu_e%=G!SkNUM~R`PZ*`bk63;%8zzyH;O$^Kl{g%Ws~}4r7B^Bua%B| z>-G(>@|QnDXs63a#yhg9&g--${P-11=N=u4qRWI@3CJ~sY6Zp(71hUq%Q2NkRK(0& z4-nZSK?PA5iml`#bd!9%$4Quzw3*nM)w8UkHp}9&dS-Z*0N~&JNg?0;DaJCa{C=aP zPk+bB*PkPN4xlGC0c?JBTf1+mxlZCvd*I*m%v;+xr8cgjGB~Hd*UR{qp*RBR!I7$P z@2ra3r$EC?B=rXbvL+-!k9ow_10!q5Mqo8gi7Ez4s-$Q@6*I=5!ra=tNcqe$tW;L9 z)O!`7`Yc}jm8YFO$j=eevZFeJ<}qpO={~oZYh{e&rL2lYX}_ z!y9^`H==(6U;!3I&5^=Lx7xV`J%l7fz>c7?D_k2RE&6JU2N*^vNs{aS?v`k^fmm`* ze1XEG&^4y$$~&gYb@)fD?)FEh_b;Klai9G4Zyt{C`OAU6HvF*jfFQPw zu>etUrahB$TqAB2dwMYP1<`p)q6t7!IL)PzpseMTJr% zV?j0?0!9ONh<0#@XySe^f{~snp|Tt^1d1dhLu1$2bYSry<8kJ=l=1dTh`A*Ih{lZS z-evBt%zhjXGHbN@Ls}dksKQDFV_jUryAet&kg7+$NP}hNt;;Zi6r2_NYs&bdXJ}Vo zb&a6%OiE-n1P#t|m^8y0P_%CDNHj)zZczh(R=atK`@Qn|smjOcAoFA+hvM53B?MH= zS~taLZ$!WP4WQ94(ANQ^pp7bEg2;Ho-?nS|Sm}|mfV`7Lr+Hl&EaoNt^Ll|t14R|_ z-01adQC$N7H37xhP&YO{K3|Tozj}Gwdt*>=Xvo{A50|U|?L--e*Zx6MUi(K{{`>4* zXZQ|QLcjMU$+e|f9!2fL&t{Ye(BFt-$>ZCEmh3`(s1xRY;~)*7WQgdVpS|_#6_FR- zH@Of2!gjryk5v5*OWfa}sP6$LeQW_K3g~-%9R>i%J6|#%@E+#Ijk`geTG3Br^6Dq$ zLaVFy)+-_auH_#{Mvun`mCD_Rl=ru&(chM@RJm77`P*{+UjTy4T^PfT-T(jq07*qo IM6N<$f(!}_`Tzg` literal 0 HcmV?d00001 diff --git a/examples/positioning/geoflickr/flickrmobile/images/titlebar.png b/examples/positioning/geoflickr/flickrmobile/images/titlebar.png new file mode 100644 index 0000000000000000000000000000000000000000..aa35c9e1b6583bbeb5b0b2ba070f236b36297eda GIT binary patch literal 1327 zcmV+~1000E`Nkl`f!%0rEEPTYqq|G_0m&4Ap+E=_4Pe8zLK6_*upKav37Z`-H{x7y3c#8H{EGoc5R3VI_Um%_ z{cq>z=Wuv<2-aF~j;AU6x)Gg{uVt*>)FaDuXZRLuJ%>YDeXWBeTsNj0yXWU;xV^oF zySuyJ%d)&N0l=RhKK$~>>FFti6Y%)>NNrIRG&F+n-jnGAJEqQ^-vaR(C*{06r?2Nx z+9=}=JN8=UtCWJv|W%Syrb)RaKA~+Y15*bPr6Em7}HGv0pYBVSnvU?<3M-!x;7~}0JfsSJ_GK74>&*pg^Q{TJf*L#xTlqQ|rgpLhP&7>7eVQo(;d}$q zva}p0Dc)ObN(wRt{^aBYa+J(^T?EH#n(!h%u-?4DbUJP5-pvM6?_(xB_2Wf)Dqm18 zm107J$XKR605P@qHJi>i^P|nP@Oj2cFeE<0s`sllP`*;n)_Rml#g*Y&89-oS zA`|t1T?ac;Ule&^M%osX@0|?v^cp|guX^)ErH3$lX(LC_Q#{-K<3ZY!Du1bix^B^h=)vUfe90@eZGAw8y&6-^pE#Wx_d zf@9sc+THHhc=&84V(?9r_bky!N@3v2gW5@-jdiU5c=^{ZlG^ehk)gTOAIV>gbun)NbT6A zcZ#G>CtrV=H@!<4>@#Lx&xW!Bz=F35{^zUB8qm<;RJ1>5_W2rzNWFMjh2qG_QhFcj z5lb*n6_KR&M|zO#rO@@E9X$wL;@`{BDa2S;WZl$v^SfkX?9OYc6A10_dx(6h2-?)L zLKnH@dg%*Ru>Yrwnw)qGa{Ya`uabZ5B;N}HU*E`*xB2qKfULEnkXHU0r06t)k;*P> zEBSIVbaL+nK`+o40IeR?s}sqcq2-k0`=%`GiDssyWk)$voY&W-pK2w|jQ lCTB{<{F8{3tU5o7_z#DajA}HOxLyDN002ovPDHLkV1k~ddi4MR literal 0 HcmV?d00001 diff --git a/examples/positioning/geoflickr/flickrmobile/images/titlebar.sci b/examples/positioning/geoflickr/flickrmobile/images/titlebar.sci new file mode 100644 index 0000000..0418d94 --- /dev/null +++ b/examples/positioning/geoflickr/flickrmobile/images/titlebar.sci @@ -0,0 +1,5 @@ +border.left: 10 +border.top: 12 +border.bottom: 12 +border.right: 10 +source: titlebar.png diff --git a/examples/positioning/geoflickr/flickrmobile/images/toolbutton.png b/examples/positioning/geoflickr/flickrmobile/images/toolbutton.png new file mode 100644 index 0000000000000000000000000000000000000000..11310013eedc808ca278e3068d7779e708422726 GIT binary patch literal 2550 zcmVe zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00~}6L_t(&-kn;@Ze&RjJrQ}U z%I)@yx>vMhM)Vd??@(_*@_Yb7zz49M58wmf14gXj57@F~Rl)u9qI_Ld^LrWu%xs>-#eH7mxJ+t3r+Iu8>W-a$yaW&t9&L`W+wBlS zfLl#pt~TpGtyZfqA$po-jn!)P$DjWACx19QJHykbPjPf~R4mp`GJ`_tnt(B$NSb8* zzQ_XH0$@3QS~Nt>JtdI!X60wP2}Fdu54Tva*SNgA#6MqugMWPW6^@UOzjlnD5dfT= zoc#X9ix;2&_Se6`#l;1#uCB2Ehi68#3$>GQ&EiUM!f+9^cl;4}c5EU-m|w1^6+#F& zK0e0jCqKliSFiB*FTTLXA3grv1OS`O=JT_&Gn}8F-8ETgyHgg=*R!L*lAJU z{d}G_7_K?rx!~xVyW<`}gnh^5si>^ZGTuyS(`M1OQK- zJi%tO!GCt&#n|)yL5pugLm^OmbDx@NlF)fEk><<7FboZW0t6@k(*1ymcxVtz(*#lg z>~M2)joaHB{OI{7`1arb`fLJ#^?IFS*aF2~Q>LCE71Q5IL$F-wUE-g~UqYuw-8W91xn+bx`P@ZMvZCNMK50N8G~P*pH9 zL^DqZ&ENt)LYaKi!;NQmGju%+0H$cKFZvjcX1 z3lfFb0OuH6e~;a63r9c*Ap$T>6TJ5j5$txmIfa;AP=S|S+yPBAj$oxZdvWW^Iga8uDf^wmPB@BB2s9<3e0NHtnC{zg|fO9SapsENVl)F#7d{_lx z-pvfaKzx?e2qF=uH4{adCkVLNp4_%?~t) zssKzS1E{~dcBd==y(}PTb9-<6EPnMkiUV1u74Wpq1j3YavSEM~xjDL{X3rBWDBq-> z<#R!#$?=6sL)*oQ4jItoebN65fQA9dSR|Tcb;siL5&)1=rR%hnCY8XlW7Txs2S9yq z0>A>#1BT^|;r6*U%nJZ|3@{&s&I^ZKU`=15OjQd~&kxk8G&4!G%Nngd3jkWw5uHpE zTE8-6K)Mh@i0G<9c`0x*wPo3Hi)5_megz#P>d zGxL=RL<$L!9Z94{MURcu-u1mZwpfV5?^^&0uOC9kjvofVUN1CY7d*fO<_XGa!O?dX zf~O3E191T9VoOx!Qh2aqDbFv(5YJLB(Cq5i_6u~3_ zwbCyDnC{Q~z#ImH9Be7Nq`|V2l%*Shs$cX-%JG%P28av*JeS*c9o7gn09Yqz84w3| zb2gJQ?adRETCugS_ytATwLZdBc$unVohIe{UT2{?1jH|FOJI8M;l1ytLGS$x0D06;<&KZf=^ zKY%!<#cH>~WXj~R2rdiYS@o08_Vcb{k)!l zS%IomIEvfYl$2q$^oEvSqYJt8Ub;xAvQZ7f=$f^{T^~S1nApJ)gE(4Rs=Ri5z0j3J zn$D49XHcjugx68ww7}X05jM&teE*hOT_2dK$1M0UOh0GN9i%v`kmmx6Dg0nD7!gpI3_$P_2Y zXj^4Hpb~@jABRyBv#xkv7@Q)ZX^GWhn9R`BTRahgC%42QakQgUs;|?9;zFSmM@zL% zV}$49@j^}607?MEnUtDLmgEhg>NvdsL1X{l?miLb6QL>F?fCeFO zsI4~A0h=mq2wEVgUjNPZ_SA?HcRhSr0ghPFZG_VDS?VlMl^)zw?WNM5^V=(e&bbVP zRz3Tk4%(EbBtv=*8={Q8u2YKVQik-7Z#x$-NEQ+htR;Wx&Yp9`fu<B652VFZWs1RLPz+Io`c{_x1PR z|MypJ{*KUJFE1~D@&5Yy`QyirvDs{LOy>%5{%%hECFmYHFNM)una#u=iB$nYl{xCd z>`+x%o@f%LY03<`ySu}iH*fIv?OUwZ>tEj9e)yIE;PmwL*>=1AaDTV`n{)0{=Nx!) z-Lt<3#d3W%kV<5&zUl_us};i&=sgCA%~?Pyr_&~;w%^s&Ri4EE09*nYhh&1)L;wH) M07*qoM6N<$g3{N*E&u=k literal 0 HcmV?d00001 diff --git a/examples/positioning/geoflickr/flickrmobile/images/toolbutton.sci b/examples/positioning/geoflickr/flickrmobile/images/toolbutton.sci new file mode 100644 index 0000000..9e4f965 --- /dev/null +++ b/examples/positioning/geoflickr/flickrmobile/images/toolbutton.sci @@ -0,0 +1,5 @@ +border.left: 15 +border.top: 4 +border.bottom: 4 +border.right: 15 +source: toolbutton.png diff --git a/examples/positioning/geoflickr/flickrmobile/nmealog.txt b/examples/positioning/geoflickr/flickrmobile/nmealog.txt new file mode 100644 index 0000000..8c8286d --- /dev/null +++ b/examples/positioning/geoflickr/flickrmobile/nmealog.txt @@ -0,0 +1,1403 @@ +$GPGGA,222437.000,2734.33926,S,15305.44310,E,1,07,1.3,50.6,M,39.2,M,,*72 +$GPGLL,2734.33926,S,15305.44310,E,222437.000,A,A*49 +$GPGSA,A,3,16,25,23,20,13,27,11,,,,,,2.3,1.3,1.9*3D +$GPGST,222437.000,13.3,7.4,6.6,85.1,6.0,6.8,13.7*56 +$GPGSV,3,1,10,16,49,115,42,25,39,269,36,23,58,176,29,20,72,335,35*75 +$GPGSV,3,2,10,19,02,028,,04,06,241,22,13,30,223,30,27,19,284,35*78 +$GPGSV,3,3,10,11,06,337,30,03,13,055,25*7C +$GPRMC,222437.000,A,2734.33926,S,15305.44310,E,33.9,157.8,030308,11.2,W,A*0F +$GPVTG,157.8,T,169.0,M,33.9,N,62.9,K,A*22 +$GPGGA,222438.000,2734.34821,S,15305.44697,E,1,07,1.2,50.8,M,39.2,M,,*79 +$GPGLL,2734.34821,S,15305.44697,E,222438.000,A,A*4D +$GPGSA,A,3,16,25,23,20,13,27,03,,,,,,2.1,1.2,1.7*33 +$GPGST,222438.000,12.4,6.4,9.3,16.2,6.1,8.3,16.4*5F +$GPGSV,3,1,10,16,49,115,41,25,39,269,36,23,58,176,28,20,72,335,36*74 +$GPGSV,3,2,10,19,02,028,,04,06,241,20,13,30,223,28,27,19,284,35*73 +$GPGSV,3,3,10,11,06,337,28,03,13,055,25*75 +$GPRMC,222438.000,A,2734.34821,S,15305.44697,E,33.8,158.3,030308,11.2,W,A*0E +$GPVTG,158.3,T,169.5,M,33.8,N,62.5,K,A*2E +$GPGGA,222439.000,2734.35696,S,15305.45072,E,1,06,1.7,51.2,M,39.2,M,,*78 +$GPGLL,2734.35696,S,15305.45072,E,222439.000,A,A*43 +$GPGSA,A,3,16,25,23,20,13,27,,,,,,,3.3,1.7,2.8*3A +$GPGST,222439.000,10.3,9.1,12.2,44.6,9.8,9.9,25.2*62 +$GPGSV,3,1,10,16,49,115,34,25,39,269,36,23,58,175,29,20,72,335,35*77 +$GPGSV,3,2,10,19,02,028,,04,06,241,20,13,30,223,27,27,19,284,32*7B +$GPGSV,3,3,10,11,06,337,28,03,14,055,25*72 +$GPRMC,222439.000,A,2734.35696,S,15305.45072,E,33.2,158.7,030308,11.2,W,A*0E +$GPVTG,158.7,T,169.9,M,33.2,N,61.5,K,A*2F +$GPGGA,222440.000,2734.36580,S,15305.45446,E,1,07,1.3,52.0,M,39.2,M,,*76 +$GPGLL,2734.36580,S,15305.45446,E,222440.000,A,A*49 +$GPGSA,A,3,16,25,23,20,13,27,11,,,,,,2.3,1.3,1.9*3D +$GPGST,222440.000,13.0,8.0,13.4,6.2,7.4,12.2,20.9*64 +$GPGSV,3,1,10,16,49,115,40,25,39,269,38,23,58,175,31,20,72,335,34*72 +$GPGSV,3,2,10,19,02,028,,04,06,241,20,13,30,223,26,27,19,284,30*78 +$GPGSV,3,3,10,11,06,337,26,03,14,055,25*7C +$GPRMC,222440.000,A,2734.36580,S,15305.45446,E,33.7,159.1,030308,11.2,W,A*06 +$GPVTG,159.1,T,170.3,M,33.7,N,62.4,K,A*2D +$GPGGA,222441.000,2734.37483,S,15305.45825,E,1,07,1.3,52.7,M,39.2,M,,*7A +$GPGLL,2734.37483,S,15305.45825,E,222441.000,A,A*42 +$GPGSA,A,3,16,25,23,20,13,27,11,,,,,,2.3,1.3,1.9*3D +$GPGST,222441.000,14.0,7.6,14.1,17.6,7.7,12.5,21.0*51 +$GPGSV,3,1,10,16,49,115,41,25,39,269,39,23,58,175,29,20,72,335,35*7A +$GPGSV,3,2,10,19,02,028,,04,06,241,20,13,30,223,24,27,19,284,30*7A +$GPGSV,3,3,10,11,06,337,28,03,14,055,25*72 +$GPRMC,222441.000,A,2734.37483,S,15305.45825,E,34.6,159.4,030308,11.2,W,A*0E +$GPVTG,159.4,T,170.6,M,34.6,N,64.1,K,A*28 +$GPGGA,222442.000,2734.38407,S,15305.46216,E,1,06,1.3,53.3,M,39.2,M,,*77 +$GPGLL,2734.38407,S,15305.46216,E,222442.000,A,A*4B +$GPGSA,A,3,16,25,20,13,27,11,,,,,,,2.3,1.3,1.9*3C +$GPGST,222442.000,16.6,7.0,14.4,14.6,7.0,12.8,21.6*5A +$GPGSV,3,1,10,16,49,115,40,25,39,269,38,23,58,175,22,20,72,335,35*71 +$GPGSV,3,2,10,19,02,028,,04,06,241,20,13,30,223,25,27,19,284,29*73 +$GPGSV,3,3,10,11,06,337,27,03,14,055,25*7D +$GPRMC,222442.000,A,2734.38407,S,15305.46216,E,35.5,159.3,030308,11.2,W,A*02 +$GPVTG,159.3,T,170.5,M,35.5,N,65.8,K,A*26 +$GPGGA,222443.000,2734.39347,S,15305.46609,E,1,05,1.8,53.8,M,39.2,M,,*7D +$GPGLL,2734.39347,S,15305.46609,E,222443.000,A,A*42 +$GPGSA,A,3,16,25,20,27,11,,,,,,,,2.8,1.8,2.1*35 +$GPGST,222443.000,11.3,6.5,14.6,14.5,6.6,13.0,18.4*5A +$GPGSV,3,1,10,16,49,115,40,25,39,269,38,23,58,175,22,20,72,335,36*72 +$GPGSV,3,2,10,19,02,028,,04,06,241,20,13,30,223,26,27,19,284,31*79 +$GPGSV,3,3,10,11,06,337,28,03,14,055,25*72 +$GPRMC,222443.000,A,2734.39347,S,15305.46609,E,36.2,159.4,030308,11.2,W,A*08 +$GPVTG,159.4,T,170.6,M,36.2,N,67.0,K,A*2C +$GPGGA,222444.000,2734.40297,S,15305.47000,E,1,06,1.3,54.1,M,39.2,M,,*70 +$GPGLL,2734.40297,S,15305.47000,E,222444.000,A,A*49 +$GPGSA,A,3,16,25,20,13,27,11,,,,,,,2.3,1.3,1.9*3C +$GPGST,222444.000,17.6,6.3,12.7,14.4,6.3,11.4,16.2*55 +$GPGSV,3,1,10,16,49,115,38,25,39,269,38,23,58,175,22,20,72,335,35*7E +$GPGSV,3,2,10,19,02,028,,04,06,241,20,13,30,223,25,27,19,284,29*73 +$GPGSV,3,3,10,11,06,337,25,03,14,055,23*79 +$GPRMC,222444.000,A,2734.40297,S,15305.47000,E,36.5,159.5,030308,11.2,W,A*05 +$GPVTG,159.5,T,170.8,M,36.5,N,67.5,K,A*21 +$GPGGA,222445.000,2734.41247,S,15305.47390,E,1,07,1.3,54.2,M,39.2,M,,*75 +$GPGLL,2734.41247,S,15305.47390,E,222445.000,A,A*4E +$GPGSA,A,3,16,25,23,20,13,27,11,,,,,,2.3,1.3,1.9*3D +$GPGST,222445.000,16.0,7.0,14.4,10.4,6.7,13.0,20.7*52 +$GPGSV,3,1,10,16,49,115,36,25,39,269,36,23,58,175,22,20,72,335,34*7F +$GPGSV,3,2,10,19,02,028,,04,06,241,20,13,30,223,26,27,19,284,31*79 +$GPGSV,3,3,10,11,06,337,26,03,14,055,23*7A +$GPRMC,222445.000,A,2734.41247,S,15305.47390,E,36.6,159.7,030308,11.2,W,A*03 +$GPVTG,159.7,T,170.9,M,36.6,N,67.8,K,A*2C +$GPGGA,222446.000,2734.42201,S,15305.47790,E,1,07,1.3,54.4,M,39.2,M,,*75 +$GPGLL,2734.42201,S,15305.47790,E,222446.000,A,A*48 +$GPGSA,A,3,16,25,23,20,13,27,11,,,,,,2.3,1.3,1.9*3D +$GPGST,222446.000,13.0,7.4,12.3,6.6,6.9,11.2,17.9*60 +$GPGSV,3,1,10,16,49,115,36,25,39,269,37,23,58,175,27,20,72,335,35*7A +$GPGSV,3,2,10,19,02,028,,04,06,241,23,13,30,223,30,27,19,284,32*7E +$GPGSV,3,3,10,11,06,337,27,03,14,055,23*7B +$GPRMC,222446.000,A,2734.42201,S,15305.47790,E,36.6,159.3,030308,11.2,W,A*01 +$GPVTG,159.3,T,170.5,M,36.6,N,67.7,K,A*2B +$GPGGA,222447.000,2734.43157,S,15305.48195,E,1,07,1.3,54.3,M,39.2,M,,*7E +$GPGLL,2734.43157,S,15305.48195,E,222447.000,A,A*44 +$GPGSA,A,3,16,25,23,20,13,27,11,,,,,,2.3,1.3,1.9*3D +$GPGST,222447.000,10.7,6.7,10.5,6.6,6.2,9.6,15.5*5B +$GPGSV,3,1,11,16,49,115,32,25,39,269,37,23,58,175,28,20,72,335,33*76 +$GPGSV,3,2,11,19,02,028,,04,06,241,23,13,30,223,30,27,19,284,32*7F +$GPGSV,3,3,11,11,06,337,29,01,,,19,03,14,055,23*7D +$GPRMC,222447.000,A,2734.43157,S,15305.48195,E,36.7,159.1,030308,11.2,W,A*0E +$GPVTG,159.1,T,170.3,M,36.7,N,67.9,K,A*20 +$GPGGA,222448.000,2734.44111,S,15305.48610,E,1,08,1.1,54.1,M,39.2,M,,*71 +$GPGLL,2734.44111,S,15305.48610,E,222448.000,A,A*44 +$GPGSA,A,3,16,25,23,20,13,27,11,03,,,,,2.0,1.1,1.6*30 +$GPGST,222448.000,20.4,10.5,8.8,52.5,8.7,9.1,15.2*6C +$GPGSV,3,1,11,16,49,115,27,25,39,269,38,23,58,175,26,20,72,335,31*71 +$GPGSV,3,2,11,19,02,028,,04,06,241,23,13,30,223,37,27,19,284,27*7C +$GPGSV,3,3,11,11,06,337,27,01,,,19,03,14,055,23*73 +$GPRMC,222448.000,A,2734.44111,S,15305.48610,E,36.8,158.7,030308,11.2,W,A*06 +$GPVTG,158.7,T,169.9,M,36.8,N,68.2,K,A*2E +$GPGGA,222449.000,2734.45068,S,15305.49044,E,1,08,1.1,53.6,M,39.2,M,,*78 +$GPGLL,2734.45068,S,15305.49044,E,222449.000,A,A*4D +$GPGSA,A,3,16,25,23,20,13,27,11,03,,,,,2.0,1.1,1.6*30 +$GPGST,222449.000,17.1,8.8,10.2,14.2,8.2,9.3,17.4*6D +$GPGSV,3,1,11,16,49,115,28,25,39,269,37,23,58,175,25,20,72,335,28*7A +$GPGSV,3,2,11,19,02,028,,04,06,241,23,13,30,223,37,27,19,284,32*78 +$GPGSV,3,3,11,11,06,337,27,01,,,19,03,14,055,24*74 +$GPRMC,222449.000,A,2734.45068,S,15305.49044,E,37.2,157.8,030308,11.2,W,A*04 +$GPVTG,157.8,T,169.0,M,37.2,N,68.9,K,A*27 +$GPGGA,222450.000,2734.46041,S,15305.49485,E,1,08,1.1,53.3,M,39.2,M,,*74 +$GPGLL,2734.46041,S,15305.49485,E,222450.000,A,A*44 +$GPGSA,A,3,16,25,23,20,13,27,11,03,,,,,2.0,1.1,1.6*30 +$GPGST,222450.000,17.4,8.9,12.7,10.1,11.5,8.2,16.5*5E +$GPGSV,3,1,11,16,49,115,25,25,39,269,36,23,58,175,30,20,72,336,28*71 +$GPGSV,3,2,11,19,02,028,,04,06,241,21,13,30,223,38,27,19,284,34*73 +$GPGSV,3,3,11,11,06,337,27,01,,,19,03,14,055,22*72 +$GPRMC,222450.000,A,2734.46041,S,15305.49485,E,37.7,157.9,030308,11.2,W,A*09 +$GPVTG,157.9,T,169.1,M,37.7,N,69.8,K,A*22 +$GPGGA,222451.000,2734.47033,S,15305.49924,E,1,08,1.1,53.1,M,39.2,M,,*75 +$GPGLL,2734.47033,S,15305.49924,E,222451.000,A,A*47 +$GPGSA,A,3,16,25,23,20,13,27,11,03,,,,,2.0,1.1,1.6*30 +$GPGST,222451.000,14.1,8.0,10.5,14.3,9.5,7.5,15.0*61 +$GPGSV,3,1,11,16,49,115,27,25,39,269,38,23,58,175,28,20,72,336,25*79 +$GPGSV,3,2,11,19,02,028,,04,06,241,21,13,30,223,38,27,19,284,34*73 +$GPGSV,3,3,11,11,06,337,24,01,,,19,03,14,055,25*76 +$GPRMC,222451.000,A,2734.47033,S,15305.49924,E,38.1,158.1,030308,11.2,W,A*04 +$GPVTG,158.1,T,169.3,M,38.1,N,70.5,K,A*2B +$GPGGA,222452.000,2734.48022,S,15305.50375,E,1,08,1.1,52.5,M,39.2,M,,*7A +$GPGLL,2734.48022,S,15305.50375,E,222452.000,A,A*4D +$GPGSA,A,3,16,25,23,20,13,27,11,03,,,,,2.0,1.1,1.6*30 +$GPGST,222452.000,24.1,13.9,9.7,80.6,12.7,9.0,21.0*54 +$GPGSV,3,1,11,16,49,115,29,25,39,269,38,23,58,175,27,20,72,336,30*7C +$GPGSV,3,2,11,19,02,028,,04,06,241,21,13,30,223,35,27,19,284,34*7E +$GPGSV,3,3,11,11,06,337,22,01,,,19,03,14,055,24*71 +$GPRMC,222452.000,A,2734.48022,S,15305.50375,E,38.3,157.9,030308,11.2,W,A*0B +$GPVTG,157.9,T,169.1,M,38.3,N,70.9,K,A*20 +$GPGGA,222453.000,2734.49019,S,15305.50802,E,1,06,1.7,52.1,M,39.2,M,,*75 +$GPGLL,2734.49019,S,15305.50802,E,222453.000,A,A*4E +$GPGSA,A,3,16,25,23,20,13,27,,,,,,,3.3,1.7,2.8*3A +$GPGST,222453.000,10.4,15.4,9.3,66.3,13.4,9.6,24.6*52 +$GPGSV,3,1,11,16,49,115,31,25,39,269,36,23,58,175,28,20,71,336,25*73 +$GPGSV,3,2,11,19,02,028,,04,06,241,21,13,30,223,33,27,19,284,31*7D +$GPGSV,3,3,11,11,06,337,22,01,,,19,03,14,055,24*71 +$GPRMC,222453.000,A,2734.49019,S,15305.50802,E,38.3,159.1,030308,11.2,W,A*0E +$GPVTG,159.1,T,170.3,M,38.3,N,70.9,K,A*2C +$GPGGA,222454.000,2734.50008,S,15305.51221,E,1,07,1.3,52.1,M,39.2,M,,*75 +$GPGLL,2734.50008,S,15305.51221,E,222454.000,A,A*4B +$GPGSA,A,3,16,25,23,20,13,27,11,,,,,,2.3,1.3,1.9*3D +$GPGST,222454.000,12.5,11.7,8.3,70.6,10.4,8.0,19.0*5E +$GPGSV,3,1,11,16,49,115,30,25,39,269,36,23,58,175,26,20,71,336,28*71 +$GPGSV,3,2,11,19,02,028,,04,06,241,21,13,30,223,32,27,19,284,30*7D +$GPGSV,3,3,11,11,06,337,24,01,,,18,03,14,055,24*76 +$GPRMC,222454.000,A,2734.50008,S,15305.51221,E,38.1,159.4,030308,11.2,W,A*0C +$GPVTG,159.4,T,170.6,M,38.1,N,70.5,K,A*22 +$GPGGA,222455.000,2734.50992,S,15305.51642,E,1,07,1.3,52.2,M,39.2,M,,*7C +$GPGLL,2734.50992,S,15305.51642,E,222455.000,A,A*41 +$GPGSA,A,3,16,25,23,20,13,27,11,,,,,,2.3,1.3,1.9*3D +$GPGST,222455.000,11.5,10.8,9.3,83.5,9.9,8.6,23.3*65 +$GPGSV,3,1,11,16,49,115,33,25,39,269,36,23,58,175,32,20,71,336,31*7F +$GPGSV,3,2,11,19,02,028,,04,06,241,21,13,30,223,29,27,19,284,29*7F +$GPGSV,3,3,11,11,06,337,28,01,,,18,03,14,055,24*7A +$GPRMC,222455.000,A,2734.50992,S,15305.51642,E,37.8,159.0,030308,11.2,W,A*04 +$GPVTG,159.0,T,170.2,M,37.8,N,70.0,K,A*21 +$GPGGA,222456.000,2734.51963,S,15305.52059,E,1,07,1.3,52.5,M,39.2,M,,*78 +$GPGLL,2734.51963,S,15305.52059,E,222456.000,A,A*42 +$GPGSA,A,3,16,25,23,20,13,27,11,,,,,,2.3,1.3,1.9*3D +$GPGST,222456.000,11.3,9.0,13.1,11.0,8.4,11.9,20.9*55 +$GPGSV,3,1,11,16,49,115,31,25,39,269,37,23,58,175,27,20,71,336,33*7A +$GPGSV,3,2,11,19,02,028,,04,06,241,19,13,30,223,29,27,19,284,32*7E +$GPGSV,3,3,11,11,06,337,30,01,,,18,03,14,055,24*73 +$GPRMC,222456.000,A,2734.51963,S,15305.52059,E,37.3,158.8,030308,11.2,W,A*05 +$GPVTG,158.8,T,170.0,M,37.3,N,69.1,K,A*28 +$GPGGA,222457.000,2734.52908,S,15305.52467,E,1,06,1.3,53.2,M,39.2,M,,*79 +$GPGLL,2734.52908,S,15305.52467,E,222457.000,A,A*44 +$GPGSA,A,3,16,25,20,13,27,11,,,,,,,2.3,1.3,1.9*3C +$GPGST,222457.000,20.4,7.8,12.0,8.1,7.3,10.9,17.9*63 +$GPGSV,3,1,11,16,49,115,37,25,39,269,37,23,58,175,24,20,71,336,35*79 +$GPGSV,3,2,11,19,02,028,,04,06,241,19,13,30,223,29,27,19,284,32*7E +$GPGSV,3,3,11,11,06,337,28,01,,,18,03,14,055,23*7D +$GPRMC,222457.000,A,2734.52908,S,15305.52467,E,36.2,158.7,030308,11.2,W,A*0C +$GPVTG,158.7,T,169.9,M,36.2,N,67.1,K,A*28 +$GPGGA,222458.000,2734.53845,S,15305.52866,E,1,06,1.6,54.2,M,39.2,M,,*70 +$GPGLL,2734.53845,S,15305.52866,E,222458.000,A,A*4F +$GPGSA,A,3,16,25,23,20,27,11,,,,,,,2.6,1.6,2.1*34 +$GPGST,222458.000,16.7,7.3,13.9,11.0,7.0,12.5,17.9*5D +$GPGSV,3,1,11,16,49,115,36,25,39,269,37,23,58,175,24,20,71,336,35*78 +$GPGSV,3,2,11,19,02,028,19,04,06,241,19,13,30,223,26,27,19,284,31*7A +$GPGSV,3,3,11,11,06,337,23,01,,,18,03,14,055,23*76 +$GPRMC,222458.000,A,2734.53845,S,15305.52866,E,35.9,159.1,030308,11.2,W,A*08 +$GPVTG,159.1,T,170.3,M,35.9,N,66.5,K,A*20 +$GPGGA,222459.000,2734.54772,S,15305.53309,E,1,08,1.1,55.6,M,39.2,M,,*72 +$GPGLL,2734.54772,S,15305.53309,E,222459.000,A,A*41 +$GPGSA,A,3,16,25,23,20,13,27,11,03,,,,,2.0,1.1,1.6*30 +$GPGST,222459.000,17.5,6.5,9.3,15.5,6.1,8.3,15.2*5C +$GPGSV,3,1,11,16,49,115,38,25,39,268,36,23,58,175,35,20,71,336,35*76 +$GPGSV,3,2,11,19,02,028,19,04,06,241,19,13,30,223,33,27,19,284,34*7B +$GPGSV,3,3,11,11,06,337,29,01,,,18,03,14,055,22*7D +$GPRMC,222459.000,A,2734.54772,S,15305.53309,E,35.9,156.8,030308,11.2,W,A*00 +$GPVTG,156.8,T,168.0,M,35.9,N,66.4,K,A*2D +$GPGGA,222500.000,2734.55655,S,15305.53845,E,1,08,1.1,56.1,M,39.2,M,,*7D +$GPGLL,2734.55655,S,15305.53845,E,222500.000,A,A*4A +$GPGSA,A,3,16,25,23,20,13,27,11,03,,,,,2.0,1.1,1.6*30 +$GPGST,222500.000,14.5,9.8,7.9,83.3,7.3,9.0,14.3*5C +$GPGSV,3,1,11,16,49,115,36,25,39,268,31,23,58,175,39,20,71,336,33*75 +$GPGSV,3,2,11,19,02,028,21,04,06,241,19,13,30,223,30,27,19,284,29*7F +$GPGSV,3,3,11,11,06,337,25,01,,,18,03,14,055,28*7B +$GPRMC,222500.000,A,2734.55655,S,15305.53845,E,35.9,151.6,030308,11.2,W,A*02 +$GPVTG,151.6,T,162.8,M,35.9,N,66.5,K,A*27 +$GPGGA,222501.000,2734.56495,S,15305.54489,E,1,08,1.1,57.0,M,39.2,M,,*7A +$GPGLL,2734.56495,S,15305.54489,E,222501.000,A,A*4D +$GPGSA,A,3,16,25,23,20,13,27,11,03,,,,,2.0,1.1,1.6*30 +$GPGST,222501.000,14.3,8.0,10.9,27.0,8.0,9.5,15.6*64 +$GPGSV,3,1,11,16,49,115,41,25,39,268,31,23,58,175,36,20,71,336,31*78 +$GPGSV,3,2,11,19,02,028,21,04,06,241,19,13,30,223,27,27,19,284,29*79 +$GPGSV,3,3,11,11,06,337,22,01,,,18,03,14,055,31*74 +$GPRMC,222501.000,A,2734.56495,S,15305.54489,E,36.5,145.7,030308,11.2,W,A*0E +$GPVTG,145.7,T,156.9,M,36.5,N,67.5,K,A*2B +$GPGGA,222502.000,2734.57337,S,15305.55181,E,1,06,1.5,57.9,M,39.2,M,,*78 +$GPGLL,2734.57337,S,15305.55181,E,222502.000,A,A*4C +$GPGSA,A,3,16,25,23,20,27,03,,,,,,,2.5,1.5,2.0*36 +$GPGST,222502.000,14.5,7.0,11.9,20.7,7.1,10.5,15.0*5F +$GPGSV,3,1,11,16,49,115,43,25,39,268,35,23,58,175,37,20,71,336,34*7A +$GPGSV,3,2,11,19,02,028,21,04,06,241,19,13,30,223,23,27,19,284,33*76 +$GPGSV,3,3,11,11,06,337,22,01,,,18,03,14,055,34*71 +$GPRMC,222502.000,A,2734.57337,S,15305.55181,E,37.4,143.8,030308,11.2,W,A*06 +$GPVTG,143.8,T,155.0,M,37.4,N,69.3,K,A*20 +$GPGGA,222503.000,2734.58184,S,15305.55887,E,1,08,1.1,58.5,M,39.2,M,,*7A +$GPGLL,2734.58184,S,15305.55887,E,222503.000,A,A*47 +$GPGSA,A,3,16,25,23,20,13,27,11,03,,,,,2.0,1.1,1.6*30 +$GPGST,222503.000,13.4,6.4,14.1,0.3,5.9,12.9,21.5*60 +$GPGSV,3,1,11,16,49,115,43,25,39,268,35,23,58,175,38,20,71,336,35*74 +$GPGSV,3,2,11,19,02,028,19,04,06,241,19,13,30,223,23,27,19,284,32*7C +$GPGSV,3,3,11,11,06,337,26,01,,,17,03,14,055,34*7A +$GPRMC,222503.000,A,2734.58184,S,15305.55887,E,37.8,143.4,030308,11.2,W,A*0D +$GPVTG,143.4,T,154.6,M,37.8,N,70.0,K,A*2C +$GPGGA,222504.000,2734.59032,S,15305.56580,E,1,07,1.2,58.9,M,39.2,M,,*79 +$GPGLL,2734.59032,S,15305.56580,E,222504.000,A,A*44 +$GPGSA,A,3,16,25,23,20,13,27,03,,,,,,2.1,1.2,1.7*33 +$GPGST,222504.000,24.6,6.2,13.3,3.6,5.7,12.2,20.2*67 +$GPGSV,3,1,11,16,49,115,43,25,39,268,35,23,58,175,39,20,71,336,35*75 +$GPGSV,3,2,11,19,02,028,19,04,06,241,19,13,30,223,22,27,19,284,31*7E +$GPGSV,3,3,11,11,06,337,25,01,,,17,03,14,055,30*7D +$GPRMC,222504.000,A,2734.59032,S,15305.56580,E,37.6,143.6,030308,11.2,W,A*02 +$GPVTG,143.6,T,154.8,M,37.6,N,69.7,K,A*21 +$GPGGA,222505.000,2734.59874,S,15305.57271,E,1,06,1.5,59.4,M,39.2,M,,*70 +$GPGLL,2734.59874,S,15305.57271,E,222505.000,A,A*47 +$GPGSA,A,3,16,25,23,20,27,03,,,,,,,2.5,1.5,2.0*36 +$GPGST,222505.000,17.4,5.5,11.8,3.4,5.0,10.8,17.3*61 +$GPGSV,3,1,11,16,49,115,44,25,39,268,35,23,58,175,39,20,71,336,36*71 +$GPGSV,3,2,11,19,02,028,21,04,06,241,19,13,30,223,24,27,19,284,31*73 +$GPGSV,3,3,11,11,06,337,,01,,,17,03,14,055,29*72 +$GPRMC,222505.000,A,2734.59874,S,15305.57271,E,37.3,143.7,030308,11.2,W,A*05 +$GPVTG,143.7,T,154.9,M,37.3,N,69.1,K,A*22 +$GPGGA,222506.000,2734.60703,S,15305.57943,E,1,07,1.2,60.1,M,39.2,M,,*75 +$GPGLL,2734.60703,S,15305.57943,E,222506.000,A,A*4B +$GPGSA,A,3,16,25,23,20,13,27,03,,,,,,2.1,1.2,1.7*33 +$GPGST,222506.000,16.1,6.2,11.7,15.3,6.1,10.4,17.4*54 +$GPGSV,3,1,11,16,49,115,43,25,39,268,34,23,58,175,37,20,71,336,36*79 +$GPGSV,3,2,11,19,02,028,21,04,06,241,,13,30,223,24,27,19,284,31*7B +$GPGSV,3,3,11,11,06,337,,01,,,17,03,14,055,28*73 +$GPRMC,222506.000,A,2734.60703,S,15305.57943,E,36.5,143.9,030308,11.2,W,A*00 +$GPVTG,143.9,T,155.1,M,36.5,N,67.6,K,A*2B +$GPGGA,222507.000,2734.61507,S,15305.58593,E,1,07,1.2,60.9,M,39.2,M,,*75 +$GPGLL,2734.61507,S,15305.58593,E,222507.000,A,A*43 +$GPGSA,A,3,16,25,23,20,13,27,03,,,,,,2.1,1.2,1.7*33 +$GPGST,222507.000,14.0,6.8,11.8,10.9,6.4,10.7,18.5*54 +$GPGSV,3,1,11,16,49,115,43,25,39,268,34,23,58,175,37,20,71,336,34*7B +$GPGSV,3,2,11,19,02,028,21,04,06,241,,13,30,223,29,27,19,284,34*73 +$GPGSV,3,3,11,11,06,337,,01,,,17,03,14,055,29*72 +$GPRMC,222507.000,A,2734.61507,S,15305.58593,E,35.4,143.9,030308,11.2,W,A*0A +$GPVTG,143.9,T,155.1,M,35.4,N,65.5,K,A*28 +$GPGGA,222508.000,2734.62275,S,15305.59221,E,1,06,1.7,61.8,M,39.2,M,,*70 +$GPGLL,2734.62275,S,15305.59221,E,222508.000,A,A*42 +$GPGSA,A,3,16,25,23,20,13,27,,,,,,,3.3,1.7,2.8*3A +$GPGST,222508.000,12.5,9.3,16.3,19.5,9.4,14.4,27.5*51 +$GPGSV,3,1,11,16,49,115,43,25,39,268,33,23,58,175,38,20,71,336,31*76 +$GPGSV,3,2,11,19,02,028,21,04,06,241,,13,30,223,30,27,19,284,35*7A +$GPGSV,3,3,11,11,06,337,,01,,,17,03,14,055,28*73 +$GPRMC,222508.000,A,2734.62275,S,15305.59221,E,33.9,143.9,030308,11.2,W,A*00 +$GPVTG,143.9,T,155.1,M,33.9,N,62.9,K,A*28 +$GPGGA,222509.000,2734.63006,S,15305.59817,E,1,06,1.7,62.7,M,39.2,M,,*75 +$GPGLL,2734.63006,S,15305.59817,E,222509.000,A,A*4B +$GPGSA,A,3,16,25,23,20,13,27,,,,,,,3.3,1.7,2.8*3A +$GPGST,222509.000,10.4,8.1,14.2,21.9,8.4,12.3,23.7*52 +$GPGSV,3,1,11,16,49,115,44,25,39,268,32,23,58,175,37,20,71,336,29*76 +$GPGSV,3,2,11,19,02,028,21,04,06,241,,13,30,223,28,27,19,284,35*73 +$GPGSV,3,3,11,11,06,337,,01,,,17,03,14,055,30*7A +$GPRMC,222509.000,A,2734.63006,S,15305.59817,E,32.2,143.9,030308,11.2,W,A*03 +$GPVTG,143.9,T,155.1,M,32.2,N,59.7,K,A*24 +$GPGGA,222510.000,2734.63706,S,15305.60376,E,1,06,1.7,63.5,M,39.2,M,,*7F +$GPGLL,2734.63706,S,15305.60376,E,222510.000,A,A*42 +$GPGSA,A,3,16,25,23,20,13,27,,,,,,,3.3,1.7,2.8*3A +$GPGST,222510.000,12.4,8.3,12.9,28.0,8.7,11.0,21.6*57 +$GPGSV,3,1,11,16,48,115,43,25,39,268,32,23,58,175,37,20,71,336,29*70 +$GPGSV,3,2,11,19,02,028,20,04,06,241,,13,30,223,31,27,19,284,35*7A +$GPGSV,3,3,11,11,06,337,,01,,,17,03,14,055,25*7E +$GPRMC,222510.000,A,2734.63706,S,15305.60376,E,30.6,144.3,030308,11.2,W,A*01 +$GPVTG,144.3,T,155.5,M,30.6,N,56.7,K,A*24 +$GPGGA,222511.000,2734.64376,S,15305.60904,E,1,07,1.2,64.4,M,39.2,M,,*77 +$GPGLL,2734.64376,S,15305.60904,E,222511.000,A,A*48 +$GPGSA,A,3,16,25,23,20,13,27,03,,,,,,2.1,1.2,1.7*33 +$GPGST,222511.000,14.6,5.7,10.5,2.7,5.2,9.6,15.0*5C +$GPGSV,3,1,11,16,48,115,44,25,39,268,32,23,58,175,37,20,71,336,28*76 +$GPGSV,3,2,11,19,02,028,20,04,06,241,23,13,30,223,29,27,19,284,36*71 +$GPGSV,3,3,11,11,06,337,,01,,,17,03,14,055,29*72 +$GPRMC,222511.000,A,2734.64376,S,15305.60904,E,29.1,144.2,030308,11.2,W,A*05 +$GPVTG,144.2,T,155.4,M,29.1,N,53.9,K,A*20 +$GPGGA,222512.000,2734.64992,S,15305.61405,E,1,07,1.2,65.4,M,39.2,M,,*78 +$GPGLL,2734.64992,S,15305.61405,E,222512.000,A,A*46 +$GPGSA,A,3,16,25,23,20,13,27,03,,,,,,2.1,1.2,1.7*33 +$GPGST,222512.000,13.4,17.0,5.7,85.6,5.3,15.5,23.6*5A +$GPGSV,3,1,11,16,48,115,45,25,39,268,33,23,58,175,38,20,71,336,28*79 +$GPGSV,3,2,11,19,02,028,20,04,06,241,23,13,30,223,26,27,19,284,33*7B +$GPGSV,3,3,11,11,06,337,24,01,,,17,03,14,055,27*7A +$GPRMC,222512.000,A,2734.64992,S,15305.61405,E,27.2,143.6,030308,11.2,W,A*05 +$GPVTG,143.6,T,154.8,M,27.2,N,50.5,K,A*2C +$GPGGA,222513.000,2734.65572,S,15305.61884,E,1,07,1.2,66.2,M,39.2,M,,*7A +$GPGLL,2734.65572,S,15305.61884,E,222513.000,A,A*41 +$GPGSA,A,3,16,25,23,20,13,27,03,,,,,,2.1,1.2,1.7*33 +$GPGST,222513.000,12.3,7.0,14.8,2.4,6.5,13.5,21.4*6D +$GPGSV,3,1,10,16,48,115,44,25,39,268,35,23,58,175,38,20,71,336,28*7F +$GPGSV,3,2,10,19,02,028,20,04,06,241,23,13,30,223,23,27,19,284,33*7F +$GPGSV,3,3,10,11,06,337,24,03,14,055,28*73 +$GPRMC,222513.000,A,2734.65572,S,15305.61884,E,25.8,143.6,030308,11.2,W,A*0A +$GPVTG,143.6,T,154.8,M,25.8,N,47.9,K,A*2E +$GPGGA,222514.000,2734.66155,S,15305.62364,E,1,06,1.5,67.0,M,39.2,M,,*7C +$GPGLL,2734.66155,S,15305.62364,E,222514.000,A,A*42 +$GPGSA,A,3,16,25,23,20,27,03,,,,,,,2.5,1.5,2.0*36 +$GPGST,222514.000,25.5,6.1,14.4,3.1,5.6,13.2,19.2*6A +$GPGSV,3,1,10,16,48,115,44,25,39,268,33,23,58,175,38,20,71,336,26*77 +$GPGSV,3,2,10,19,02,028,18,04,06,241,23,13,30,223,23,27,19,284,34*73 +$GPGSV,3,3,10,11,06,337,28,03,14,055,29*7E +$GPRMC,222514.000,A,2734.66155,S,15305.62364,E,25.9,143.6,030308,11.2,W,A*08 +$GPVTG,143.6,T,154.8,M,25.9,N,48.0,K,A*29 +$GPGGA,222515.000,2734.66761,S,15305.62860,E,1,06,1.5,67.5,M,39.2,M,,*76 +$GPGLL,2734.66761,S,15305.62860,E,222515.000,A,A*4D +$GPGSA,A,3,16,25,23,20,27,03,,,,,,,2.5,1.5,2.0*36 +$GPGST,222515.000,20.1,5.5,13.0,3.0,5.1,11.8,17.4*68 +$GPGSV,3,1,10,16,48,115,44,25,39,268,32,23,58,175,38,20,71,336,26*76 +$GPGSV,3,2,10,19,02,028,18,04,06,241,23,13,30,223,24,27,19,284,34*74 +$GPGSV,3,3,10,11,06,337,28,03,14,055,24*73 +$GPRMC,222515.000,A,2734.66761,S,15305.62860,E,26.9,143.7,030308,11.2,W,A*05 +$GPVTG,143.7,T,154.9,M,26.9,N,49.8,K,A*23 +$GPGGA,222516.000,2734.67384,S,15305.63376,E,1,06,1.5,68.2,M,39.2,M,,*7E +$GPGLL,2734.67384,S,15305.63376,E,222516.000,A,A*4D +$GPGSA,A,3,16,25,23,20,27,03,,,,,,,2.5,1.5,2.0*36 +$GPGST,222516.000,16.4,5.8,11.5,4.5,5.3,10.5,17.3*6A +$GPGSV,3,1,10,16,48,115,44,25,39,268,32,23,58,175,38,20,71,336,30*71 +$GPGSV,3,2,10,19,02,028,18,04,06,241,23,13,30,223,24,27,19,284,33*73 +$GPGSV,3,3,10,11,06,337,28,03,14,055,28*7F +$GPRMC,222516.000,A,2734.67384,S,15305.63376,E,27.7,143.8,030308,11.2,W,A*05 +$GPVTG,143.8,T,155.0,M,27.7,N,51.4,K,A*2E +$GPGGA,222517.000,2734.68035,S,15305.63901,E,1,06,1.5,68.8,M,39.2,M,,*79 +$GPGLL,2734.68035,S,15305.63901,E,222517.000,A,A*40 +$GPGSA,A,3,16,25,23,20,27,03,,,,,,,2.5,1.5,2.0*36 +$GPGST,222517.000,19.1,6.2,12.1,7.2,5.8,11.0,15.3*66 +$GPGSV,3,1,10,16,48,115,44,25,39,268,34,23,58,175,38,20,71,336,32*75 +$GPGSV,3,2,10,19,02,028,20,04,06,241,23,13,30,223,24,27,19,284,34*7F +$GPGSV,3,3,10,11,06,337,24,03,14,055,29*72 +$GPRMC,222517.000,A,2734.68035,S,15305.63901,E,28.6,144.1,030308,11.2,W,A*08 +$GPVTG,144.1,T,155.3,M,28.6,N,53.0,K,A*2B +$GPGGA,222518.000,2734.68718,S,15305.64446,E,1,07,1.4,69.1,M,39.2,M,,*7F +$GPGLL,2734.68718,S,15305.64446,E,222518.000,A,A*4E +$GPGSA,A,3,16,25,23,20,27,11,03,,,,,,2.4,1.4,1.9*3C +$GPGST,222518.000,13.8,5.5,10.6,5.8,5.1,9.6,13.4*54 +$GPGSV,3,1,10,16,48,115,43,25,39,268,33,23,58,175,37,20,71,336,35*7D +$GPGSV,3,2,10,19,02,028,20,04,06,241,18,13,30,223,24,27,19,284,33*70 +$GPGSV,3,3,10,11,06,337,22,03,14,055,33*7F +$GPRMC,222518.000,A,2734.68718,S,15305.64446,E,29.9,144.4,030308,11.2,W,A*0D +$GPVTG,144.4,T,155.6,M,29.9,N,55.3,K,A*20 +$GPGGA,222519.000,2734.69424,S,15305.65010,E,1,07,1.4,69.5,M,39.2,M,,*71 +$GPGLL,2734.69424,S,15305.65010,E,222519.000,A,A*44 +$GPGSA,A,3,16,25,23,20,27,11,03,,,,,,2.4,1.4,1.9*3C +$GPGST,222519.000,14.0,13.4,5.0,89.4,4.6,12.3,18.8*58 +$GPGSV,3,1,10,16,48,115,44,25,39,268,34,23,58,175,37,20,71,336,37*7F +$GPGSV,3,2,10,19,02,028,20,04,06,241,18,13,30,223,23,27,19,284,31*75 +$GPGSV,3,3,10,11,06,337,26,03,14,055,35*7D +$GPRMC,222519.000,A,2734.69424,S,15305.65010,E,31.0,144.4,030308,11.2,W,A*07 +$GPVTG,144.4,T,155.6,M,31.0,N,57.5,K,A*24 +$GPGGA,222520.000,2734.70163,S,15305.65604,E,1,07,1.4,69.6,M,39.2,M,,*75 +$GPGLL,2734.70163,S,15305.65604,E,222520.000,A,A*43 +$GPGSA,A,3,16,25,23,20,27,11,03,,,,,,2.4,1.4,1.9*3C +$GPGST,222520.000,9.8,11.6,4.7,89.0,4.3,10.6,15.9*6A +$GPGSV,3,1,10,16,48,115,44,25,39,268,35,23,58,175,39,20,71,336,36*71 +$GPGSV,3,2,10,19,02,028,20,04,06,241,19,13,30,223,23,27,19,284,31*74 +$GPGSV,3,3,10,11,06,337,31,03,14,055,37*79 +$GPRMC,222520.000,A,2734.70163,S,15305.65604,E,32.5,144.1,030308,11.2,W,A*03 +$GPVTG,144.1,T,155.3,M,32.5,N,60.2,K,A*21 +$GPGGA,222521.000,2734.70923,S,15305.66218,E,1,07,1.4,69.5,M,39.2,M,,*71 +$GPGLL,2734.70923,S,15305.66218,E,222521.000,A,A*44 +$GPGSA,A,3,16,25,23,20,27,11,03,,,,,,2.4,1.4,1.9*3C +$GPGST,222521.000,11.1,6.2,10.8,9.6,5.8,9.8,16.8*53 +$GPGSV,3,1,10,16,48,115,44,25,39,268,36,23,58,175,40,20,71,336,38*72 +$GPGSV,3,2,10,19,02,028,20,04,06,241,19,13,30,223,23,27,19,284,26*72 +$GPGSV,3,3,10,11,06,338,31,03,14,055,37*76 +$GPRMC,222521.000,A,2734.70923,S,15305.66218,E,33.5,144.0,030308,11.2,W,A*04 +$GPVTG,144.0,T,155.3,M,33.5,N,62.0,K,A*21 +$GPGGA,222522.000,2734.71700,S,15305.66845,E,1,06,1.5,69.1,M,39.2,M,,*7A +$GPGLL,2734.71700,S,15305.66845,E,222522.000,A,A*4B +$GPGSA,A,3,16,25,23,20,27,03,,,,,,,2.5,1.5,2.0*36 +$GPGST,222522.000,15.0,5.7,9.9,5.5,5.2,9.0,15.4*68 +$GPGSV,3,1,10,16,48,115,43,25,39,268,36,23,58,175,40,20,71,336,37*7A +$GPGSV,3,2,10,19,02,028,20,04,06,241,24,13,30,223,23,27,19,284,26*7C +$GPGSV,3,3,10,11,06,338,25,03,14,055,37*73 +$GPRMC,222522.000,A,2734.71700,S,15305.66845,E,34.2,144.1,030308,11.2,W,A*0A +$GPVTG,144.1,T,155.3,M,34.2,N,63.4,K,A*25 +$GPGGA,222523.000,2734.72487,S,15305.67483,E,1,07,1.4,68.6,M,39.2,M,,*75 +$GPGLL,2734.72487,S,15305.67483,E,222523.000,A,A*42 +$GPGSA,A,3,16,25,23,20,27,11,03,,,,,,2.4,1.4,1.9*3C +$GPGST,222523.000,13.8,5.2,10.1,3.9,4.8,9.2,13.8*5B +$GPGSV,3,1,10,16,48,115,44,25,39,268,37,23,58,175,41,20,71,336,35*7F +$GPGSV,3,2,10,19,02,028,20,04,06,241,24,13,30,223,23,27,19,284,26*7C +$GPGSV,3,3,10,11,06,338,23,03,14,055,31*73 +$GPRMC,222523.000,A,2734.72487,S,15305.67483,E,34.7,144.2,030308,11.2,W,A*05 +$GPVTG,144.2,T,155.4,M,34.7,N,64.3,K,A*24 +$GPGGA,222524.000,2734.73280,S,15305.68126,E,1,07,1.4,68.1,M,39.2,M,,*70 +$GPGLL,2734.73280,S,15305.68126,E,222524.000,A,A*40 +$GPGSA,A,3,16,25,23,20,27,11,03,,,,,,2.4,1.4,1.9*3C +$GPGST,222524.000,10.5,4.9,9.4,3.5,4.5,8.6,12.8*60 +$GPGSV,3,1,10,16,48,115,44,25,39,268,37,23,58,175,41,20,71,336,35*7F +$GPGSV,3,2,10,19,02,028,20,04,06,241,22,13,30,223,23,27,19,284,26*7A +$GPGSV,3,3,10,11,06,338,25,03,14,055,29*7C +$GPRMC,222524.000,A,2734.73280,S,15305.68126,E,35.0,144.2,030308,11.2,W,A*01 +$GPVTG,144.2,T,155.4,M,35.0,N,64.9,K,A*28 +$GPGGA,222525.000,2734.74083,S,15305.68778,E,1,07,1.4,67.7,M,39.2,M,,*73 +$GPGLL,2734.74083,S,15305.68778,E,222525.000,A,A*4A +$GPGSA,A,3,16,25,23,20,27,11,03,,,,,,2.4,1.4,1.9*3C +$GPGST,222525.000,10.3,5.2,13.4,3.6,4.8,12.3,20.4*6B +$GPGSV,3,1,10,16,48,115,43,25,39,268,38,23,58,175,40,20,71,336,36*75 +$GPGSV,3,2,10,19,02,028,20,04,06,241,22,13,30,223,23,27,19,284,23*7F +$GPGSV,3,3,10,11,06,338,27,03,14,055,36*70 +$GPRMC,222525.000,A,2734.74083,S,15305.68778,E,35.6,144.2,030308,11.2,W,A*0D +$GPVTG,144.2,T,155.4,M,35.6,N,65.9,K,A*2F +$GPGGA,222526.000,2734.74894,S,15305.69428,E,1,06,1.5,67.2,M,39.2,M,,*7C +$GPGLL,2734.74894,S,15305.69428,E,222526.000,A,A*40 +$GPGSA,A,3,16,25,23,20,27,03,,,,,,,2.5,1.5,2.0*36 +$GPGST,222526.000,8.0,5.7,12.0,2.6,5.2,10.9,17.4*54 +$GPGSV,3,1,10,16,48,115,43,25,39,268,37,23,58,175,40,20,71,336,35*79 +$GPGSV,3,2,10,19,02,028,20,04,06,241,22,13,30,223,23,27,19,284,24*78 +$GPGSV,3,3,10,11,06,338,27,03,14,055,39*7F +$GPRMC,222526.000,A,2734.74894,S,15305.69428,E,35.8,144.5,030308,11.2,W,A*0E +$GPVTG,144.5,T,155.7,M,35.8,N,66.3,K,A*2C +$GPGGA,222527.000,2734.75707,S,15305.70075,E,1,05,1.7,66.8,M,39.2,M,,*77 +$GPGLL,2734.75707,S,15305.70075,E,222527.000,A,A*41 +$GPGSA,A,3,16,25,23,20,03,,,,,,,,2.9,1.7,2.4*39 +$GPGST,222527.000,13.9,6.3,10.9,6.3,5.9,10.0,18.2*60 +$GPGSV,3,1,10,16,48,115,44,25,39,268,38,23,58,175,40,20,71,336,33*77 +$GPGSV,3,2,10,19,02,028,,04,06,241,25,13,30,223,23,27,19,284,26*7F +$GPGSV,3,3,10,11,06,338,,03,14,055,36*75 +$GPRMC,222527.000,A,2734.75707,S,15305.70075,E,35.8,144.6,030308,11.2,W,A*0C +$GPVTG,144.6,T,155.8,M,35.8,N,66.2,K,A*21 +$GPGGA,222528.000,2734.76518,S,15305.70724,E,1,06,1.5,66.1,M,39.2,M,,*7C +$GPGLL,2734.76518,S,15305.70724,E,222528.000,A,A*42 +$GPGSA,A,3,16,25,23,20,27,03,,,,,,,2.5,1.5,2.0*36 +$GPGST,222528.000,11.3,5.6,10.1,4.5,5.2,9.2,16.1*51 +$GPGSV,3,1,10,16,48,115,43,25,39,268,39,23,58,175,39,20,71,336,28*75 +$GPGSV,3,2,10,19,02,028,,04,06,241,25,13,30,223,23,27,19,284,26*7F +$GPGSV,3,3,10,11,06,338,,03,14,055,36*75 +$GPRMC,222528.000,A,2734.76518,S,15305.70724,E,35.7,144.4,030308,11.2,W,A*02 +$GPVTG,144.4,T,155.6,M,35.7,N,66.2,K,A*22 +$GPGGA,222529.000,2734.77313,S,15305.71385,E,1,06,1.5,66.1,M,39.2,M,,*7F +$GPGLL,2734.77313,S,15305.71385,E,222529.000,A,A*41 +$GPGSA,A,3,16,25,23,20,27,03,,,,,,,2.5,1.5,2.0*36 +$GPGST,222529.000,10.9,5.6,12.5,5.4,5.2,11.4,20.9*6F +$GPGSV,3,1,10,16,48,115,41,25,39,268,40,23,58,175,36,20,71,336,28*76 +$GPGSV,3,2,10,19,02,028,,04,06,241,25,13,30,223,23,27,19,284,24*7D +$GPGSV,3,3,10,11,06,338,27,03,14,055,30*76 +$GPRMC,222529.000,A,2734.77313,S,15305.71385,E,35.6,143.5,030308,11.2,W,A*06 +$GPVTG,143.5,T,154.7,M,35.6,N,65.8,K,A*2C +$GPGGA,222530.000,2734.78106,S,15305.72042,E,1,06,1.5,66.0,M,39.2,M,,*74 +$GPGLL,2734.78106,S,15305.72042,E,222530.000,A,A*4B +$GPGSA,A,3,16,25,23,20,27,03,,,,,,,2.5,1.5,2.0*36 +$GPGST,222530.000,9.4,5.4,18.9,2.4,4.9,17.3,30.6*54 +$GPGSV,3,1,10,16,48,115,40,25,39,268,40,23,58,175,36,20,71,336,28*77 +$GPGSV,3,2,10,19,02,028,,04,06,241,25,13,30,223,23,27,19,284,26*7F +$GPGSV,3,3,10,11,06,338,27,03,14,055,29*7E +$GPRMC,222530.000,A,2734.78106,S,15305.72042,E,35.5,143.7,030308,11.2,W,A*0D +$GPVTG,143.7,T,155.0,M,35.5,N,65.8,K,A*2B +$GPGGA,222531.000,2734.78918,S,15305.72691,E,1,05,4.4,66.0,M,39.2,M,,*7D +$GPGLL,2734.78918,S,15305.72691,E,222531.000,A,A*45 +$GPGSA,A,3,16,25,23,27,11,,,,,,,,9.3,4.4,8.2*36 +$GPGST,222531.000,9.1,8.5,53.9,3.2,8.2,49.2,81.3*56 +$GPGSV,3,1,10,16,48,115,40,25,39,268,39,23,58,175,37,20,71,336,28*78 +$GPGSV,3,2,10,19,02,028,,04,06,241,25,13,31,223,23,27,19,284,25*7D +$GPGSV,3,3,10,11,06,338,24,03,14,055,22*76 +$GPRMC,222531.000,A,2734.78918,S,15305.72691,E,35.9,144.5,030308,11.2,W,A*0A +$GPVTG,144.5,T,155.7,M,35.9,N,66.4,K,A*2A +$GPGGA,222532.000,2734.79737,S,15305.73347,E,1,06,1.5,66.0,M,39.2,M,,*74 +$GPGLL,2734.79737,S,15305.73347,E,222532.000,A,A*4B +$GPGSA,A,3,16,25,23,20,27,03,,,,,,,2.5,1.5,2.0*36 +$GPGST,222532.000,11.0,6.8,38.7,1.2,6.3,35.3,58.4*69 +$GPGSV,3,1,10,16,48,115,40,25,39,268,39,23,58,175,36,20,71,336,28*79 +$GPGSV,3,2,10,19,02,028,,04,06,241,25,13,31,223,24,27,19,284,23*7C +$GPGSV,3,3,10,11,06,338,24,03,14,055,30*75 +$GPRMC,222532.000,A,2734.79737,S,15305.73347,E,36.1,144.5,030308,11.2,W,A*0F +$GPVTG,144.5,T,155.7,M,36.1,N,66.9,K,A*2C +$GPGGA,222533.000,2734.80571,S,15305.74004,E,1,06,4.1,66.1,M,39.2,M,,*70 +$GPGLL,2734.80571,S,15305.74004,E,222533.000,A,A*4F +$GPGSA,A,3,16,25,23,27,11,03,,,,,,,8.3,4.1,7.3*3F +$GPGST,222533.000,9.4,6.1,45.5,0.4,5.6,41.6,69.5*50 +$GPGSV,3,1,10,16,48,115,40,25,39,268,39,23,58,175,37,20,71,336,28*78 +$GPGSV,3,2,10,19,02,028,,04,06,241,23,13,31,223,24,27,19,284,25*7C +$GPGSV,3,3,10,11,06,338,22,03,14,055,25*77 +$GPRMC,222533.000,A,2734.80571,S,15305.74004,E,36.6,145.0,030308,11.2,W,A*08 +$GPVTG,145.0,T,156.2,M,36.6,N,67.7,K,A*26 +$GPGGA,222534.000,2734.81441,S,15305.74656,E,1,06,1.8,65.2,M,39.2,M,,*79 +$GPGLL,2734.81441,S,15305.74656,E,222534.000,A,A*4A +$GPGSA,A,3,16,25,23,13,27,03,,,,,,,3.5,1.8,3.1*3A +$GPGST,222534.000,20.2,5.8,45.7,1.7,5.4,41.7,71.3*6C +$GPGSV,3,1,10,16,48,115,40,25,39,268,38,23,58,175,37,20,71,336,28*79 +$GPGSV,3,2,10,19,02,028,,04,06,241,23,13,31,223,25,27,19,284,25*7D +$GPGSV,3,3,10,11,06,338,22,03,14,055,31*72 +$GPRMC,222534.000,A,2734.81441,S,15305.74656,E,37.6,146.2,030308,11.2,W,A*0D +$GPVTG,146.2,T,157.5,M,37.6,N,69.7,K,A*2E +$GPGGA,222535.000,2734.82349,S,15305.75307,E,1,05,1.9,63.5,M,39.2,M,,*77 +$GPGLL,2734.82349,S,15305.75307,E,222535.000,A,A*47 +$GPGSA,A,3,16,25,23,13,03,,,,,,,,3.6,1.9,3.1*3D +$GPGST,222535.000,27.6,7.0,40.6,3.1,6.7,37.1,68.4*6C +$GPGSV,3,1,10,16,48,115,40,25,39,268,36,23,58,175,37,20,71,336,28*77 +$GPGSV,3,2,10,19,02,028,,04,06,241,20,13,31,223,25,27,19,284,23*78 +$GPGSV,3,3,10,11,06,338,22,03,14,055,26*74 +$GPRMC,222535.000,A,2734.82349,S,15305.75307,E,38.7,147.3,030308,11.2,W,A*0E +$GPVTG,147.3,T,158.6,M,38.7,N,71.7,K,A*25 +$GPGGA,222536.000,2734.83215,S,15305.75969,E,1,05,1.7,63.5,M,39.2,M,,*71 +$GPGLL,2734.83215,S,15305.75969,E,222536.000,A,A*4F +$GPGSA,A,3,16,25,23,20,03,,,,,,,,2.9,1.7,2.4*39 +$GPGST,222536.000,7.9,6.3,97.2,3.9,8.3,88.7,161.0*62 +$GPGSV,3,1,10,16,48,115,40,25,39,268,37,23,58,175,36,20,71,336,28*77 +$GPGSV,3,2,10,19,02,028,,04,06,241,20,13,31,223,25,27,19,284,23*78 +$GPGSV,3,3,10,11,06,338,22,03,14,055,26*74 +$GPRMC,222536.000,A,2734.83215,S,15305.75969,E,37.6,145.6,030308,11.2,W,A*0F +$GPVTG,145.6,T,156.8,M,37.6,N,69.7,K,A*25 +$GPGGA,222537.000,2734.84076,S,15305.76655,E,1,05,1.7,63.5,M,39.2,M,,*73 +$GPGLL,2734.84076,S,15305.76655,E,222537.000,A,A*4D +$GPGSA,A,3,16,25,23,20,03,,,,,,,,2.9,1.7,2.4*39 +$GPGST,222537.000,16.0,7.8,110.8,2.1,8.0,101.2,209.1*57 +$GPGSV,3,1,10,16,48,115,39,25,39,268,36,23,58,175,34,20,71,336,28*7A +$GPGSV,3,2,10,19,02,028,,04,06,241,22,13,31,223,25,27,19,284,23*7A +$GPGSV,3,3,10,11,06,338,22,03,14,055,25*77 +$GPRMC,222537.000,A,2734.84076,S,15305.76655,E,37.9,144.6,030308,11.2,W,A*03 +$GPVTG,144.6,T,155.8,M,37.9,N,70.3,K,A*24 +$GPGGA,222538.000,2734.84945,S,15305.77356,E,1,05,1.9,63.5,M,39.2,M,,*7C +$GPGLL,2734.84945,S,15305.77356,E,222538.000,A,A*4C +$GPGSA,A,3,16,25,23,13,03,,,,,,,,3.6,1.9,3.1*3D +$GPGST,222538.000,13.1,8.0,61.7,1.6,7.5,56.4,113.0*51 +$GPGSV,3,1,10,16,48,115,40,25,39,268,37,23,58,175,32,20,71,336,*79 +$GPGSV,3,2,10,19,02,028,,04,06,241,22,13,31,223,25,27,19,284,23*7A +$GPGSV,3,3,10,11,06,338,22,03,14,055,28*7A +$GPRMC,222538.000,A,2734.84945,S,15305.77356,E,38.4,144.2,030308,11.2,W,A*04 +$GPVTG,144.2,T,155.4,M,38.4,N,71.1,K,A*2D +$GPGGA,222539.000,2734.85792,S,15305.78022,E,1,05,1.9,63.5,M,39.2,M,,*77 +$GPGLL,2734.85792,S,15305.78022,E,222539.000,A,A*47 +$GPGSA,A,3,16,25,23,13,03,,,,,,,,3.6,1.9,3.1*3D +$GPGST,222539.000,6.4,7.5,72.7,1.5,7.1,66.5,137.2*68 +$GPGSV,3,1,10,16,48,115,40,25,39,268,38,23,58,175,32,20,71,336,*76 +$GPGSV,3,2,10,19,02,028,,04,06,241,22,13,31,223,25,27,19,284,23*7A +$GPGSV,3,3,10,11,06,338,22,03,14,055,28*7A +$GPRMC,222539.000,A,2734.85792,S,15305.78022,E,37.1,144.9,030308,11.2,W,A*0E +$GPVTG,144.9,T,156.1,M,37.1,N,68.7,K,A*24 +$GPGGA,222540.000,2734.86604,S,15305.78646,E,1,05,4.4,63.5,M,39.2,M,,*78 +$GPGLL,2734.86604,S,15305.78646,E,222540.000,A,A*40 +$GPGSA,A,3,16,25,23,27,11,,,,,,,,9.3,4.4,8.2*36 +$GPGST,222540.000,13.6,8.3,67.7,1.8,7.8,61.9,111.1*55 +$GPGSV,3,1,10,16,48,115,40,25,39,268,38,23,58,175,32,20,71,336,*76 +$GPGSV,3,2,10,19,02,028,,04,06,241,26,13,31,223,22,27,19,284,22*78 +$GPGSV,3,3,10,11,06,338,20,03,14,055,28*78 +$GPRMC,222540.000,A,2734.86604,S,15305.78646,E,35.3,145.6,030308,11.2,W,A*07 +$GPVTG,145.6,T,156.8,M,35.3,N,65.4,K,A*2D +$GPGGA,222541.000,2734.87421,S,15305.79222,E,1,06,1.8,63.5,M,39.2,M,,*70 +$GPGLL,2734.87421,S,15305.79222,E,222541.000,A,A*42 +$GPGSA,A,3,16,25,23,13,27,03,,,,,,,3.5,1.8,3.1*3A +$GPGST,222541.000,11.7,33.3,8.1,87.4,7.5,30.4,54.6*51 +$GPGSV,3,1,10,16,48,115,39,25,39,268,33,23,58,175,36,20,71,336,*77 +$GPGSV,3,2,10,19,02,028,,04,06,241,26,13,31,223,22,27,19,284,22*78 +$GPGSV,3,3,10,11,06,338,20,03,14,055,26*76 +$GPRMC,222541.000,A,2734.87421,S,15305.79222,E,34.6,147.7,030308,11.2,W,A*02 +$GPVTG,147.7,T,158.9,M,34.6,N,64.1,K,A*21 +$GPGGA,222542.000,2734.88135,S,15305.79765,E,1,06,1.8,63.5,M,39.2,M,,*7A +$GPGLL,2734.88135,S,15305.79765,E,222542.000,A,A*48 +$GPGSA,A,3,16,25,23,13,27,03,,,,,,,3.5,1.8,3.1*3A +$GPGST,222542.000,23.5,7.9,53.0,0.2,7.2,48.5,78.4*6F +$GPGSV,3,1,10,16,48,115,40,25,39,268,36,23,58,175,35,20,71,336,*7F +$GPGSV,3,2,10,19,02,028,,04,06,241,27,13,31,223,23,27,19,284,25*7F +$GPGSV,3,3,10,11,06,338,20,03,14,055,26*76 +$GPRMC,222542.000,A,2734.88135,S,15305.79765,E,31.0,145.8,030308,11.2,W,A*06 +$GPVTG,145.8,T,157.0,M,31.0,N,57.4,K,A*2C +$GPGGA,222543.000,2734.88798,S,15305.80287,E,1,07,1.2,63.0,M,39.2,M,,*7B +$GPGLL,2734.88798,S,15305.80287,E,222543.000,A,A*47 +$GPGSA,A,3,16,25,23,20,13,27,03,,,,,,2.1,1.2,1.7*33 +$GPGST,222543.000,18.8,6.7,28.4,0.5,6.1,26.0,41.8*62 +$GPGSV,3,1,10,16,48,115,40,25,39,268,39,23,58,175,35,20,71,336,21*73 +$GPGSV,3,2,10,19,02,028,,04,06,241,37,13,31,223,22,27,19,284,24*7E +$GPGSV,3,3,10,11,06,338,20,03,14,055,32*73 +$GPRMC,222543.000,A,2734.88798,S,15305.80287,E,29.0,144.8,030308,11.2,W,A*01 +$GPVTG,144.8,T,156.0,M,29.0,N,53.8,K,A*2D +$GPGGA,222544.000,2734.89328,S,15305.80767,E,1,06,1.8,62.9,M,39.2,M,,*7A +$GPGLL,2734.89328,S,15305.80767,E,222544.000,A,A*45 +$GPGSA,A,3,16,25,23,13,27,03,,,,,,,3.5,1.8,3.1*3A +$GPGST,222544.000,14.9,35.2,5.8,89.5,5.4,32.2,52.6*52 +$GPGSV,3,1,10,16,48,115,43,25,39,268,40,23,58,175,25,20,71,336,21*7F +$GPGSV,3,2,10,19,02,028,,04,06,241,28,13,31,223,30,27,19,284,29*7E +$GPGSV,3,3,10,11,06,338,20,03,14,055,33*72 +$GPRMC,222544.000,A,2734.89328,S,15305.80767,E,24.5,140.9,030308,11.2,W,A*0E +$GPVTG,140.9,T,152.1,M,24.5,N,45.3,K,A*29 +$GPGGA,222545.000,2734.89633,S,15305.81084,E,1,05,1.9,62.9,M,39.2,M,,*7D +$GPGLL,2734.89633,S,15305.81084,E,222545.000,A,A*40 +$GPGSA,A,3,16,25,23,13,03,,,,,,,,3.6,1.9,3.1*3D +$GPGST,222545.000,19.5,6.0,33.0,1.0,5.5,30.2,52.4*69 +$GPGSV,3,1,10,16,48,115,41,25,39,268,34,23,58,175,29,20,71,336,30*72 +$GPGSV,3,2,10,19,02,028,,04,06,241,25,13,31,223,29,27,19,284,30*73 +$GPGSV,3,3,10,11,06,338,20,03,14,055,30*71 +$GPRMC,222545.000,A,2734.89633,S,15305.81084,E,14.6,136.6,030308,11.2,W,A*05 +$GPVTG,136.6,T,147.8,M,14.6,N,27.0,K,A*2D +$GPGGA,222546.000,2734.89236,S,15305.81130,E,1,06,1.3,62.6,M,39.2,M,,*77 +$GPGLL,2734.89236,S,15305.81130,E,222546.000,A,A*4C +$GPGSA,A,3,16,25,23,20,13,03,,,,,,,2.3,1.3,1.9*3B +$GPGST,222546.000,11.5,5.6,15.6,0.9,5.2,14.3,26.4*6E +$GPGSV,3,1,10,16,48,115,35,25,39,268,40,23,58,175,41,20,71,336,38*74 +$GPGSV,3,2,10,19,02,028,,04,06,241,26,13,31,223,33,27,19,284,26*7C +$GPGSV,3,3,10,11,06,338,20,03,14,055,28*78 +$GPRMC,222546.000,A,2734.89236,S,15305.81130,E,16.9,2.1,030308,11.2,W,A*05 +$GPVTG,2.1,T,13.3,M,16.9,N,31.2,K,A*1F +$GPGGA,222547.000,2734.89429,S,15305.81239,E,1,05,2.3,62.5,M,39.2,M,,*77 +$GPGLL,2734.89429,S,15305.81239,E,222547.000,A,A*4F +$GPGSA,A,3,16,23,13,27,03,,,,,,,,4.6,2.3,3.9*39 +$GPGST,222547.000,11.4,38.3,9.7,69.8,14.7,33.0,49.2*6B +$GPGSV,3,1,10,16,48,115,32,25,39,268,37,23,58,175,42,20,71,336,37*7F +$GPGSV,3,2,10,19,02,028,,04,06,241,26,13,31,223,36,27,19,284,29*76 +$GPGSV,3,3,10,11,06,338,20,03,14,055,34*75 +$GPRMC,222547.000,A,2734.89429,S,15305.81239,E,8.4,154.5,030308,11.2,W,A*32 +$GPVTG,154.5,T,165.7,M,8.4,N,15.6,K,A*1D +$GPGGA,222548.000,2734.89474,S,15305.81253,E,1,07,1.2,62.0,M,39.2,M,,*79 +$GPGLL,2734.89474,S,15305.81253,E,222548.000,A,A*44 +$GPGSA,A,3,16,25,23,20,13,27,03,,,,,,2.1,1.2,1.7*33 +$GPGST,222548.000,11.0,12.3,7.9,86.0,7.3,11.3,20.6*5F +$GPGSV,3,1,10,16,48,115,34,25,39,268,36,23,58,175,42,20,71,336,38*77 +$GPGSV,3,2,10,19,02,028,,04,06,241,25,13,31,223,36,27,19,284,29*75 +$GPGSV,3,3,10,11,06,338,20,03,14,055,33*72 +$GPRMC,222548.000,A,2734.89474,S,15305.81253,E,0.3,353.0,030308,11.2,W,A*36 +$GPVTG,353.0,T,4.3,M,0.3,N,0.5,K,A*27 +$GPGGA,222549.000,2734.89490,S,15305.81265,E,1,04,2.0,61.8,M,39.2,M,,*7E +$GPGLL,2734.89490,S,15305.81265,E,222549.000,A,A*4A +$GPGSA,A,3,25,23,13,03,,,,,,,,,3.9,2.0,3.3*3D +$GPGST,222549.000,17.0,16.1,8.8,81.3,8.3,14.6,29.3*57 +$GPGSV,3,1,11,16,48,115,33,25,39,268,37,23,58,175,42,20,71,336,36*7E +$GPGSV,3,2,11,19,02,028,,04,06,241,25,13,31,223,35,27,19,284,30*7F +$GPGSV,3,3,11,11,06,338,20,01,,,21,03,14,055,33*71 +$GPRMC,222549.000,A,2734.89490,S,15305.81265,E,0.2,330.7,030308,11.2,W,A*3B +$GPVTG,330.7,T,341.9,M,0.2,N,0.3,K,A*2A +$GPGGA,222550.000,2734.89526,S,15305.81278,E,1,04,2.6,61.7,M,39.2,M,,*7F +$GPGLL,2734.89526,S,15305.81278,E,222550.000,A,A*42 +$GPGSA,A,3,16,25,23,13,,,,,,,,,6.1,2.6,5.6*31 +$GPGST,222550.000,13.4,12.4,27.3,43.1,18.9,19.8,52.9*5A +$GPGSV,3,1,11,16,48,115,30,25,39,268,38,23,58,175,42,20,71,336,37*73 +$GPGSV,3,2,11,19,02,028,,04,06,241,25,13,31,223,36,27,19,284,31*7D +$GPGSV,3,3,11,11,06,338,,01,,,21,03,14,055,32*72 +$GPRMC,222550.000,A,2734.89526,S,15305.81278,E,0.1,350.7,030308,11.2,W,A*36 +$GPVTG,350.7,T,1.9,M,0.1,N,0.2,K,A*29 +$GPGGA,222551.000,2734.89528,S,15305.81279,E,1,05,2.3,61.7,M,39.2,M,,*75 +$GPGLL,2734.89528,S,15305.81279,E,222551.000,A,A*4C +$GPGSA,A,3,16,23,13,27,03,,,,,,,,4.6,2.3,3.9*39 +$GPGST,222551.000,13.7,31.0,11.1,60.5,16.5,25.2,39.3*5F +$GPGSV,3,1,11,16,48,115,30,25,39,268,39,23,58,175,41,20,71,336,35*73 +$GPGSV,3,2,11,19,02,028,,04,06,241,23,13,31,223,36,27,19,284,31*7B +$GPGSV,3,3,11,11,06,338,,01,,,20,03,14,055,30*71 +$GPRMC,222551.000,A,2734.89528,S,15305.81279,E,0.1,345.0,030308,11.2,W,A*3B +$GPVTG,345.0,T,356.2,M,0.1,N,0.2,K,A*20 +$GPGGA,222552.000,2734.89550,S,15305.81288,E,1,05,2.1,61.7,M,39.2,M,,*75 +$GPGLL,2734.89550,S,15305.81288,E,222552.000,A,A*4E +$GPGSA,A,3,16,25,23,13,27,,,,,,,,4.7,2.1,4.2*32 +$GPGST,222552.000,11.7,11.5,20.8,20.0,11.8,18.2,39.1*55 +$GPGSV,3,1,11,16,48,115,31,25,39,268,40,23,58,175,42,20,71,336,35*7F +$GPGSV,3,2,11,19,02,028,,04,06,241,23,13,31,223,38,27,19,284,31*75 +$GPGSV,3,3,11,11,06,338,,01,,,20,03,14,055,30*71 +$GPRMC,222552.000,A,2734.89550,S,15305.81288,E,0.1,11.2,030308,11.2,W,A*09 +$GPVTG,11.2,T,22.5,M,0.1,N,0.2,K,A*27 +$GPGGA,222553.000,2734.89573,S,15305.81294,E,1,05,2.1,61.5,M,39.2,M,,*7A +$GPGLL,2734.89573,S,15305.81294,E,222553.000,A,A*43 +$GPGSA,A,3,16,25,23,13,27,,,,,,,,4.7,2.1,4.2*32 +$GPGST,222553.000,9.8,10.3,17.6,19.1,10.4,15.6,33.7*6C +$GPGSV,3,1,10,16,48,115,29,25,39,268,38,23,58,175,41,20,71,336,37*79 +$GPGSV,3,2,10,19,02,028,,04,06,241,23,13,31,223,39,27,19,284,30*74 +$GPGSV,3,3,10,11,06,338,,03,14,055,29*7B +$GPRMC,222553.000,A,2734.89573,S,15305.81294,E,0.1,351.8,030308,11.2,W,A*39 +$GPVTG,351.8,T,3.0,M,0.1,N,0.2,K,A*2C +$GPGGA,222554.000,2734.89591,S,15305.81298,E,1,04,2.6,61.4,M,39.2,M,,*7A +$GPGLL,2734.89591,S,15305.81298,E,222554.000,A,A*44 +$GPGSA,A,3,16,25,23,13,,,,,,,,,6.1,2.6,5.6*31 +$GPGST,222554.000,16.9,10.4,17.8,12.8,10.0,16.1,37.3*5F +$GPGSV,3,1,10,16,48,115,32,25,39,268,38,23,58,175,41,20,71,336,36*72 +$GPGSV,3,2,10,19,02,028,,04,06,241,23,13,31,223,38,27,19,284,31*74 +$GPGSV,3,3,10,11,06,338,,03,14,055,26*74 +$GPRMC,222554.000,A,2734.89591,S,15305.81298,E,0.1,334.9,030308,11.2,W,A*3C +$GPVTG,334.9,T,346.1,M,0.1,N,0.2,K,A*2D +$GPGGA,222555.000,2734.89607,S,15305.81301,E,1,04,2.6,61.2,M,39.2,M,,*70 +$GPGLL,2734.89607,S,15305.81301,E,222555.000,A,A*48 +$GPGSA,A,3,16,25,23,13,,,,,,,,,6.1,2.6,5.6*31 +$GPGST,222555.000,14.4,11.9,23.3,40.8,16.2,17.6,44.5*56 +$GPGSV,3,1,11,16,48,115,32,25,39,268,37,23,58,175,40,20,71,336,38*73 +$GPGSV,3,2,11,19,02,028,,04,06,241,23,13,31,223,37,27,19,284,30*7B +$GPGSV,3,3,11,11,06,338,,01,,,20,03,14,055,25*75 +$GPRMC,222555.000,A,2734.89607,S,15305.81301,E,0.1,6.2,030308,11.2,W,A*39 +$GPVTG,6.2,T,17.4,M,0.1,N,0.2,K,A*16 +$GPGGA,222556.000,2734.89612,S,15305.81301,E,1,04,2.6,61.1,M,39.2,M,,*74 +$GPGLL,2734.89612,S,15305.81301,E,222556.000,A,A*4F +$GPGSA,A,3,16,25,23,13,,,,,,,,,6.1,2.6,5.6*31 +$GPGST,222556.000,12.4,15.8,24.1,4.1,14.5,22.0,39.9*69 +$GPGSV,3,1,11,16,48,115,33,25,39,268,38,23,58,174,41,20,71,336,38*7D +$GPGSV,3,2,11,19,02,028,,04,06,242,23,13,31,223,38,27,19,284,32*75 +$GPGSV,3,3,11,11,06,338,,01,,,20,03,14,055,28*78 +$GPRMC,222556.000,A,2734.89612,S,15305.81301,E,0.1,21.8,030308,11.2,W,A*01 +$GPVTG,21.8,T,33.0,M,0.1,N,0.2,K,A*2B +$GPGGA,222557.000,2734.89635,S,15305.81337,E,1,05,2.1,61.0,M,39.2,M,,*72 +$GPGLL,2734.89635,S,15305.81337,E,222557.000,A,A*4E +$GPGSA,A,3,16,25,23,13,27,,,,,,,,4.7,2.1,4.2*32 +$GPGST,222557.000,10.3,13.0,15.0,5.2,11.9,13.7,32.7*6B +$GPGSV,3,1,10,16,48,115,33,25,39,268,38,23,58,174,41,20,71,336,36*72 +$GPGSV,3,2,10,19,02,028,,04,06,242,23,13,31,223,39,27,19,284,28*7E +$GPGSV,3,3,10,11,06,338,,03,14,055,31*72 +$GPRMC,222557.000,A,2734.89635,S,15305.81337,E,1.2,96.1,030308,11.2,W,A*07 +$GPVTG,96.1,T,107.3,M,1.2,N,2.2,K,A*1B +$GPGGA,222558.000,2734.89638,S,15305.81517,E,1,06,1.8,60.6,M,39.2,M,,*7A +$GPGLL,2734.89638,S,15305.81517,E,222558.000,A,A*48 +$GPGSA,A,3,16,25,23,13,27,03,,,,,,,3.5,1.8,3.1*3A +$GPGST,222558.000,18.6,12.9,7.5,72.4,7.5,11.4,21.9*57 +$GPGSV,3,1,10,16,48,115,39,25,39,268,38,23,58,174,37,20,71,336,26*78 +$GPGSV,3,2,10,19,02,028,,04,06,242,23,13,31,223,34,27,19,284,29*72 +$GPGSV,3,3,10,11,06,338,,03,14,055,30*73 +$GPRMC,222558.000,A,2734.89638,S,15305.81517,E,5.6,82.0,030308,11.2,W,A*05 +$GPVTG,82.0,T,93.2,M,5.6,N,10.3,K,A*10 +$GPGGA,222559.000,2734.89631,S,15305.81911,E,1,05,2.2,60.5,M,39.2,M,,*71 +$GPGLL,2734.89631,S,15305.81911,E,222559.000,A,A*4A +$GPGSA,A,3,16,25,23,20,27,,,,,,,,3.6,2.2,2.9*3A +$GPGST,222559.000,17.0,15.1,33.1,15.1,15.5,29.4,59.0*59 +$GPGSV,3,1,10,16,48,115,34,25,39,268,35,23,58,174,30,20,71,336,29*70 +$GPGSV,3,2,10,19,02,028,,04,06,242,23,13,31,223,35,27,19,284,28*72 +$GPGSV,3,3,10,11,06,338,,03,14,055,27*75 +$GPRMC,222559.000,A,2734.89631,S,15305.81911,E,12.5,87.6,030308,11.2,W,A*31 +$GPVTG,87.6,T,98.8,M,12.5,N,23.2,K,A*26 +$GPGGA,222600.000,2734.89436,S,15305.82359,E,1,06,1.8,61.2,M,39.2,M,,*72 +$GPGLL,2734.89436,S,15305.82359,E,222600.000,A,A*45 +$GPGSA,A,3,16,25,23,13,27,03,,,,,,,3.5,1.8,3.1*3A +$GPGST,222600.000,14.4,14.9,6.9,79.1,6.7,13.4,28.4*57 +$GPGSV,3,1,10,16,48,115,37,25,39,268,36,23,58,174,29,20,71,336,33*73 +$GPGSV,3,2,10,19,02,028,,04,06,242,23,13,31,223,39,27,19,284,28*7E +$GPGSV,3,3,10,11,06,338,,03,14,055,28*7A +$GPRMC,222600.000,A,2734.89436,S,15305.82359,E,15.9,62.5,030308,11.2,W,A*3D +$GPVTG,62.5,T,73.7,M,15.9,N,29.5,K,A*22 +$GPGGA,222601.000,2734.89190,S,15305.82850,E,1,06,1.8,60.5,M,39.2,M,,*7E +$GPGLL,2734.89190,S,15305.82850,E,222601.000,A,A*4F +$GPGSA,A,3,16,25,23,13,27,03,,,,,,,3.6,1.8,3.1*39 +$GPGST,222601.000,11.5,13.4,6.1,78.5,6.0,12.0,24.9*56 +$GPGSV,3,1,10,16,48,115,40,25,39,268,27,23,58,174,35,20,71,336,28*74 +$GPGSV,3,2,10,19,02,028,,04,06,242,,13,31,223,39,27,19,284,27*70 +$GPGSV,3,3,10,11,06,338,,03,14,055,23*71 +$GPRMC,222601.000,A,2734.89190,S,15305.82850,E,18.0,58.9,030308,11.2,W,A*36 +$GPVTG,58.9,T,70.1,M,18.0,N,33.4,K,A*2C +$GPGGA,222602.000,2734.88904,S,15305.83361,E,1,05,1.6,60.0,M,39.2,M,,*79 +$GPGLL,2734.88904,S,15305.83361,E,222602.000,A,A*40 +$GPGSA,A,3,16,23,20,13,03,,,,,,,,2.5,1.6,1.9*3F +$GPGST,222602.000,11.3,17.1,6.5,54.9,10.2,13.2,18.6*62 +$GPGSV,3,1,10,16,48,115,27,25,39,268,29,23,58,174,33,20,71,336,33*77 +$GPGSV,3,2,10,19,02,028,,04,06,242,,13,31,223,35,27,19,284,32*78 +$GPGSV,3,3,10,11,06,338,,03,14,055,24*76 +$GPRMC,222602.000,A,2734.88904,S,15305.83361,E,19.8,55.1,030308,11.2,W,A*35 +$GPVTG,55.1,T,66.3,M,19.8,N,36.7,K,A*23 +$GPGGA,222603.000,2734.88556,S,15305.83944,E,1,04,3.8,58.8,M,39.2,M,,*70 +$GPGLL,2734.88556,S,15305.83944,E,222603.000,A,A*47 +$GPGSA,A,3,25,23,20,27,,,,,,,,,6.5,3.8,5.2*3C +$GPGST,222603.000,12.6,48.6,15.6,66.9,41.3,21.9,62.5*59 +$GPGSV,3,1,10,16,48,115,23,25,39,268,29,23,58,174,31,20,71,337,37*74 +$GPGSV,3,2,10,19,02,028,,04,06,242,,13,31,223,34,27,19,284,26*7C +$GPGSV,3,3,10,11,06,338,,03,14,055,28*7A +$GPRMC,222603.000,A,2734.88556,S,15305.83944,E,22.7,54.4,030308,11.2,W,A*31 +$GPVTG,54.4,T,65.6,M,22.7,N,42.1,K,A*23 +$GPGGA,222604.000,2734.88238,S,15305.84546,E,1,04,4.4,57.8,M,39.2,M,,*75 +$GPGLL,2734.88238,S,15305.84546,E,222604.000,A,A*46 +$GPGSA,A,3,25,20,13,27,,,,,,,,,7.2,4.4,5.7*37 +$GPGST,222604.000,10.4,46.8,10.9,81.3,42.4,11.8,57.5*57 +$GPGSV,3,1,10,16,48,115,27,25,39,268,32,23,58,174,32,20,71,337,37*79 +$GPGSV,3,2,10,19,02,028,,04,06,242,,13,31,223,34,27,19,284,34*7F +$GPGSV,3,3,10,11,06,338,,03,14,055,29*7B +$GPRMC,222604.000,A,2734.88238,S,15305.84546,E,23.3,54.5,030308,11.2,W,A*34 +$GPVTG,54.5,T,65.7,M,23.3,N,43.2,K,A*24 +$GPGGA,222605.000,2734.87917,S,15305.85182,E,1,04,4.4,56.6,M,39.2,M,,*7F +$GPGLL,2734.87917,S,15305.85182,E,222605.000,A,A*43 +$GPGSA,A,3,25,20,13,27,,,,,,,,,7.2,4.4,5.7*37 +$GPGST,222605.000,14.3,40.3,10.1,81.5,36.5,10.7,49.8*58 +$GPGSV,3,1,10,16,48,115,24,25,39,268,32,23,58,174,33,20,71,337,37*7B +$GPGSV,3,2,10,19,02,028,,04,06,242,20,13,31,223,35,27,19,284,32*7A +$GPGSV,3,3,10,11,06,338,,03,14,055,26*74 +$GPRMC,222605.000,A,2734.87917,S,15305.85182,E,24.5,55.0,030308,11.2,W,A*34 +$GPVTG,55.0,T,66.2,M,24.5,N,45.3,K,A*20 +$GPGGA,222606.000,2734.87588,S,15305.85846,E,1,05,3.6,55.8,M,39.2,M,,*7E +$GPGLL,2734.87588,S,15305.85846,E,222606.000,A,A*4B +$GPGSA,A,3,25,23,20,13,27,,,,,,,,6.3,3.6,5.2*36 +$GPGST,222606.000,11.7,30.4,8.7,77.7,27.2,9.8,40.6*59 +$GPGSV,3,1,10,16,48,115,24,25,39,268,31,23,58,174,32,20,71,337,34*7A +$GPGSV,3,2,10,19,02,029,,04,06,242,20,13,31,223,35,27,19,284,34*7D +$GPGSV,3,3,10,11,06,338,,03,14,055,24*76 +$GPRMC,222606.000,A,2734.87588,S,15305.85846,E,25.3,55.9,030308,11.2,W,A*32 +$GPVTG,55.9,T,67.1,M,25.3,N,46.9,K,A*25 +$GPGGA,222607.000,2734.87218,S,15305.86543,E,1,06,1.8,55.5,M,39.2,M,,*78 +$GPGLL,2734.87218,S,15305.86543,E,222607.000,A,A*4F +$GPGSA,A,3,16,25,23,13,27,03,,,,,,,3.6,1.8,3.1*39 +$GPGST,222607.000,11.2,13.8,8.5,86.1,7.8,12.6,27.3*52 +$GPGSV,3,1,10,16,48,115,29,25,39,268,26,23,58,174,34,20,71,337,32*71 +$GPGSV,3,2,10,19,02,029,,04,06,242,27,13,31,223,36,27,19,284,30*7D +$GPGSV,3,3,10,11,06,338,,03,14,055,24*76 +$GPRMC,222607.000,A,2734.87218,S,15305.86543,E,26.0,57.6,030308,11.2,W,A*3B +$GPVTG,57.6,T,68.8,M,26.0,N,48.1,K,A*28 +$GPGGA,222608.000,2734.86867,S,15305.87251,E,1,06,1.8,55.1,M,39.2,M,,*75 +$GPGLL,2734.86867,S,15305.87251,E,222608.000,A,A*46 +$GPGSA,A,3,16,25,23,13,27,03,,,,,,,3.6,1.8,3.1*39 +$GPGST,222608.000,15.1,15.8,7.1,68.8,8.0,13.6,36.7*5C +$GPGSV,3,1,10,16,48,115,39,25,39,268,28,23,58,174,35,20,71,337,30*7D +$GPGSV,3,2,10,19,02,029,,04,06,242,27,13,31,223,40,27,19,284,28*75 +$GPGSV,3,3,10,11,06,338,,03,14,055,28*7A +$GPRMC,222608.000,A,2734.86867,S,15305.87251,E,25.9,60.7,030308,11.2,W,A*3D +$GPVTG,60.7,T,71.9,M,25.9,N,47.9,K,A*29 +$GPGGA,222609.000,2734.86555,S,15305.87973,E,1,06,1.8,54.7,M,39.2,M,,*74 +$GPGLL,2734.86555,S,15305.87973,E,222609.000,A,A*40 +$GPGSA,A,3,16,25,23,13,27,03,,,,,,,3.6,1.8,3.1*39 +$GPGST,222609.000,10.9,10.9,5.1,85.4,4.7,10.0,22.0*55 +$GPGSV,3,1,10,16,48,116,34,25,39,268,39,23,58,174,29,20,71,337,33*7D +$GPGSV,3,2,10,19,02,029,,04,06,242,24,13,31,223,42,27,19,284,23*7F +$GPGSV,3,3,10,11,06,338,,03,14,055,26*74 +$GPRMC,222609.000,A,2734.86555,S,15305.87973,E,25.7,64.3,030308,11.2,W,A*35 +$GPVTG,64.3,T,75.6,M,25.7,N,47.5,K,A*20 +$GPGGA,222610.000,2734.86253,S,15305.88695,E,1,05,1.9,54.1,M,39.2,M,,*71 +$GPGLL,2734.86253,S,15305.88695,E,222610.000,A,A*41 +$GPGSA,A,3,16,25,23,13,03,,,,,,,,3.7,1.9,3.1*3C +$GPGST,222610.000,11.1,14.6,7.4,64.7,8.3,12.4,28.7*57 +$GPGSV,3,1,10,16,48,116,29,25,39,268,42,23,58,174,28,20,71,337,32*7D +$GPGSV,3,2,10,19,02,029,,04,06,242,24,13,31,223,42,27,19,284,23*7F +$GPGSV,3,3,10,11,06,338,,03,14,055,24*76 +$GPRMC,222610.000,A,2734.86253,S,15305.88695,E,25.3,65.0,030308,11.2,W,A*32 +$GPVTG,65.0,T,76.3,M,25.3,N,46.8,K,A*2C +$GPGGA,222611.000,2734.85924,S,15305.89387,E,1,05,2.2,53.4,M,39.2,M,,*75 +$GPGLL,2734.85924,S,15305.89387,E,222611.000,A,A*4F +$GPGSA,A,3,16,25,23,20,13,,,,,,,,5.3,2.2,4.8*39 +$GPGST,222611.000,17.7,8.4,21.7,17.4,9.4,19.0,57.8*57 +$GPGSV,3,1,10,16,48,116,39,25,39,268,32,23,58,174,35,20,71,337,26*72 +$GPGSV,3,2,10,19,02,029,,04,06,242,31,13,31,223,39,27,19,284,24*70 +$GPGSV,3,3,10,11,06,338,,03,14,055,26*74 +$GPRMC,222611.000,A,2734.85924,S,15305.89387,E,24.9,61.4,030308,11.2,W,A*37 +$GPVTG,61.4,T,72.6,M,24.9,N,46.1,K,A*2F +$GPGGA,222612.000,2734.85516,S,15305.90007,E,1,07,1.2,53.3,M,39.2,M,,*7E +$GPGLL,2734.85516,S,15305.90007,E,222612.000,A,A*42 +$GPGSA,A,3,16,25,23,20,13,27,03,,,,,,2.1,1.2,1.7*33 +$GPGST,222612.000,15.5,16.3,8.2,77.8,8.0,14.7,27.8*50 +$GPGSV,3,1,10,16,48,116,29,25,39,268,29,23,58,174,30,20,71,337,34*7F +$GPGSV,3,2,10,19,02,029,,04,06,242,27,13,31,223,35,27,19,284,28*77 +$GPGSV,3,3,10,11,06,338,,03,14,055,25*77 +$GPRMC,222612.000,A,2734.85516,S,15305.90007,E,24.5,53.1,030308,11.2,W,A*32 +$GPVTG,53.1,T,64.3,M,24.5,N,45.4,K,A*23 +$GPGGA,222613.000,2734.85043,S,15305.90565,E,1,05,1.9,53.2,M,39.2,M,,*73 +$GPGLL,2734.85043,S,15305.90565,E,222613.000,A,A*47 +$GPGSA,A,3,16,25,20,13,27,,,,,,,,3.7,1.9,3.2*3A +$GPGST,222613.000,21.1,11.0,20.9,21.8,11.7,18.1,48.5*55 +$GPGSV,3,1,10,16,48,116,30,25,39,268,32,23,58,174,24,20,71,337,36*7A +$GPGSV,3,2,10,19,02,029,,04,06,242,22,13,31,223,35,27,19,284,29*73 +$GPGSV,3,3,10,11,06,338,,03,14,055,29*7B +$GPRMC,222613.000,A,2734.85043,S,15305.90565,E,24.9,45.4,030308,11.2,W,A*39 +$GPVTG,45.4,T,56.6,M,24.9,N,46.1,K,A*2F +$GPGGA,222614.000,2734.84523,S,15305.91064,E,1,05,1.9,53.2,M,39.2,M,,*73 +$GPGLL,2734.84523,S,15305.91064,E,222614.000,A,A*47 +$GPGSA,A,3,16,25,20,13,27,,,,,,,,3.7,1.9,3.2*3A +$GPGST,222614.000,18.8,16.8,28.3,28.1,18.2,24.0,43.4*54 +$GPGSV,3,1,10,16,48,116,27,25,39,268,30,23,58,174,32,20,71,337,35*7A +$GPGSV,3,2,10,19,02,029,,04,06,242,28,13,31,223,26,27,19,284,32*71 +$GPGSV,3,3,10,11,06,338,,03,14,055,30*73 +$GPRMC,222614.000,A,2734.84523,S,15305.91064,E,24.7,40.2,030308,11.2,W,A*34 +$GPVTG,40.2,T,51.4,M,24.7,N,45.7,K,A*22 +$GPGGA,222615.000,2734.84002,S,15305.91547,E,1,07,1.2,53.0,M,39.2,M,,*7B +$GPGLL,2734.84002,S,15305.91547,E,222615.000,A,A*44 +$GPGSA,A,3,16,25,23,20,13,27,03,,,,,,2.1,1.2,1.7*33 +$GPGST,222615.000,19.7,18.9,7.9,71.0,8.8,16.5,18.9*52 +$GPGSV,3,1,10,16,48,116,25,25,39,268,26,23,58,174,35,20,71,337,34*79 +$GPGSV,3,2,10,19,02,029,,04,06,242,24,13,31,223,25,27,19,284,30*7C +$GPGSV,3,3,10,11,06,338,,03,14,055,29*7B +$GPRMC,222615.000,A,2734.84002,S,15305.91547,E,24.1,38.7,030308,11.2,W,A*3B +$GPVTG,38.7,T,49.9,M,24.1,N,44.7,K,A*2B +$GPGGA,222616.000,2734.83488,S,15305.92024,E,1,07,1.2,53.1,M,39.2,M,,*7B +$GPGLL,2734.83488,S,15305.92024,E,222616.000,A,A*45 +$GPGSA,A,3,16,25,23,20,13,27,03,,,,,,2.1,1.2,1.7*33 +$GPGST,222616.000,18.1,15.8,11.2,70.8,10.8,14.1,19.9*51 +$GPGSV,3,1,10,16,48,116,27,25,39,268,29,23,58,174,34,20,71,337,30*71 +$GPGSV,3,2,10,19,02,029,,04,06,242,27,13,31,223,24,27,19,284,28*77 +$GPGSV,3,3,10,11,06,338,,03,14,055,32*71 +$GPRMC,222616.000,A,2734.83488,S,15305.92024,E,24.0,39.3,030308,11.2,W,A*3E +$GPVTG,39.3,T,50.5,M,24.0,N,44.5,K,A*29 +$GPGGA,222617.000,2734.82955,S,15305.92505,E,1,07,1.2,53.2,M,39.2,M,,*73 +$GPGLL,2734.82955,S,15305.92505,E,222617.000,A,A*4E +$GPGSA,A,3,16,25,23,20,13,27,03,,,,,,2.1,1.2,1.7*33 +$GPGST,222617.000,14.7,13.3,9.2,70.7,8.9,11.8,16.8*5B +$GPGSV,3,1,10,16,48,116,23,25,39,268,30,23,58,174,35,20,71,337,33*7F +$GPGSV,3,2,10,19,02,029,,04,06,242,25,13,31,223,25,27,19,284,26*7A +$GPGSV,3,3,10,11,06,338,,03,14,055,32*71 +$GPRMC,222617.000,A,2734.82955,S,15305.92505,E,24.7,38.8,030308,11.2,W,A*38 +$GPVTG,38.8,T,50.0,M,24.7,N,45.7,K,A*22 +$GPGGA,222618.000,2734.82405,S,15305.92991,E,1,07,1.2,53.5,M,39.2,M,,*72 +$GPGLL,2734.82405,S,15305.92991,E,222618.000,A,A*48 +$GPGSA,A,3,16,25,23,20,13,27,03,,,,,,2.1,1.2,1.7*33 +$GPGST,222618.000,13.7,14.7,7.8,77.2,7.6,13.2,24.3*54 +$GPGSV,3,1,10,16,48,116,27,25,39,268,30,23,58,174,36,20,71,337,32*79 +$GPGSV,3,2,10,19,02,029,,04,06,242,31,13,31,223,25,27,19,283,23*7D +$GPGSV,3,3,10,11,06,338,,03,14,056,32*72 +$GPRMC,222618.000,A,2734.82405,S,15305.92991,E,25.3,38.3,030308,11.2,W,A*30 +$GPVTG,38.3,T,49.5,M,25.3,N,46.8,K,A*2D +$GPGGA,222619.000,2734.81867,S,15305.93485,E,1,07,1.2,53.8,M,39.2,M,,*7C +$GPGLL,2734.81867,S,15305.93485,E,222619.000,A,A*4B +$GPGSA,A,3,16,25,23,20,13,27,03,,,,,,2.1,1.2,1.7*33 +$GPGST,222619.000,20.5,18.3,9.9,85.5,9.1,16.7,27.9*5A +$GPGSV,3,1,10,16,48,116,27,25,39,268,30,23,58,174,35,20,71,337,33*7B +$GPGSV,3,2,10,19,02,029,,04,06,242,29,13,31,223,23,27,19,283,23*72 +$GPGSV,3,3,10,11,06,338,,03,14,056,32*72 +$GPRMC,222619.000,A,2734.81867,S,15305.93485,E,25.3,39.2,030308,11.2,W,A*33 +$GPVTG,39.2,T,50.4,M,25.3,N,46.8,K,A*24 +$GPGGA,222620.000,2734.81344,S,15305.93979,E,1,05,1.6,53.8,M,39.2,M,,*74 +$GPGLL,2734.81344,S,15305.93979,E,222620.000,A,A*45 +$GPGSA,A,3,16,23,20,13,03,,,,,,,,2.5,1.6,1.9*3F +$GPGST,222620.000,18.2,14.7,21.1,9.8,19.1,13.7,29.8*64 +$GPGSV,3,1,10,16,48,116,26,25,39,268,30,23,58,174,33,20,71,337,34*7B +$GPGSV,3,2,10,19,02,029,,04,06,242,24,13,31,223,25,27,19,283,29*73 +$GPGSV,3,3,10,11,06,338,,03,14,056,33*73 +$GPRMC,222620.000,A,2734.81344,S,15305.93979,E,24.7,39.5,030308,11.2,W,A*3F +$GPVTG,39.5,T,50.7,M,24.7,N,45.8,K,A*26 +$GPGGA,222621.000,2734.80838,S,15305.94469,E,1,06,1.3,53.5,M,39.2,M,,*74 +$GPGLL,2734.80838,S,15305.94469,E,222621.000,A,A*4E +$GPGSA,A,3,16,25,23,20,13,03,,,,,,,2.3,1.3,1.9*3B +$GPGST,222621.000,14.6,11.8,13.4,39.2,11.7,11.4,21.8*5D +$GPGSV,3,1,10,16,48,116,25,25,39,268,31,23,58,174,33,20,71,337,37*7A +$GPGSV,3,2,10,19,03,029,,04,06,242,24,13,31,223,24,27,19,283,36*7D +$GPGSV,3,3,10,11,06,338,,03,14,056,32*72 +$GPRMC,222621.000,A,2734.80838,S,15305.94469,E,24.1,40.1,030308,11.2,W,A*38 +$GPVTG,40.1,T,51.3,M,24.1,N,44.7,K,A*21 +$GPGGA,222622.000,2734.80354,S,15305.94956,E,1,06,1.7,53.3,M,39.2,M,,*75 +$GPGLL,2734.80354,S,15305.94956,E,222622.000,A,A*4D +$GPGSA,A,3,16,25,23,20,13,27,,,,,,,3.3,1.7,2.9*3B +$GPGST,222622.000,13.2,10.2,17.1,41.6,12.5,13.2,30.8*59 +$GPGSV,3,1,10,16,48,116,26,25,39,268,31,23,58,174,26,20,71,337,39*73 +$GPGSV,3,2,10,19,03,029,,04,06,242,24,13,31,223,28,27,19,283,36*71 +$GPGSV,3,3,10,11,06,338,,03,14,056,35*75 +$GPRMC,222622.000,A,2734.80354,S,15305.94956,E,23.6,41.3,030308,11.2,W,A*38 +$GPVTG,41.3,T,52.5,M,23.6,N,43.7,K,A*20 +$GPGGA,222623.000,2734.79878,S,15305.95470,E,1,05,1.9,52.8,M,39.2,M,,*78 +$GPGLL,2734.79878,S,15305.95470,E,222623.000,A,A*47 +$GPGSA,A,3,16,25,20,13,27,,,,,,,,3.7,1.9,3.2*3A +$GPGST,222623.000,14.7,24.8,16.6,50.3,19.9,18.6,39.3*5E +$GPGSV,3,1,11,16,48,116,24,25,39,268,32,23,58,174,24,20,71,337,38*70 +$GPGSV,3,2,11,19,03,029,,04,06,242,24,13,31,223,32,27,19,283,34*79 +$GPGSV,3,3,11,11,06,338,,01,,,18,03,14,056,34*7D +$GPRMC,222623.000,A,2734.79878,S,15305.95470,E,24.0,43.4,030308,11.2,W,A*36 +$GPVTG,43.4,T,54.6,M,24.0,N,44.4,K,A*25 +$GPGGA,222624.000,2734.79400,S,15305.96019,E,1,05,1.9,52.3,M,39.2,M,,*7F +$GPGLL,2734.79400,S,15305.96019,E,222624.000,A,A*4B +$GPGSA,A,3,16,25,20,27,03,,,,,,,,2.7,1.9,2.0*39 +$GPGST,222624.000,12.3,24.0,7.9,80.2,8.0,21.7,15.3*5C +$GPGSV,3,1,11,16,48,116,23,25,39,268,32,23,58,174,26,20,71,337,37*7A +$GPGSV,3,2,11,19,03,029,,04,06,242,24,13,31,223,35,27,19,283,25*7E +$GPGSV,3,3,11,11,06,338,,01,,,18,03,14,056,31*78 +$GPRMC,222624.000,A,2734.79400,S,15305.96019,E,24.7,45.3,030308,11.2,W,A*3C +$GPVTG,45.3,T,56.6,M,24.7,N,45.7,K,A*23 +$GPGGA,222625.000,2734.78953,S,15305.96595,E,1,05,1.9,51.8,M,39.2,M,,*7D +$GPGLL,2734.78953,S,15305.96595,E,222625.000,A,A*41 +$GPGSA,A,3,16,25,20,13,27,,,,,,,,3.7,1.9,3.2*3A +$GPGST,222625.000,24.0,12.2,19.9,37.5,14.2,16.0,36.1*57 +$GPGSV,3,1,11,16,48,116,30,25,39,268,32,23,58,174,23,20,71,337,37*7D +$GPGSV,3,2,11,19,03,029,,04,06,242,25,13,31,223,36,27,19,283,25*7C +$GPGSV,3,3,11,11,06,338,,01,,,18,03,14,056,24*7C +$GPRMC,222625.000,A,2734.78953,S,15305.96595,E,24.8,47.9,030308,11.2,W,A*31 +$GPVTG,47.9,T,59.1,M,24.8,N,46.0,K,A*28 +$GPGGA,222626.000,2734.78516,S,15305.97172,E,1,05,2.5,51.1,M,39.2,M,,*79 +$GPGLL,2734.78516,S,15305.97172,E,222626.000,A,A*43 +$GPGSA,A,3,16,25,20,04,13,,,,,,,,4.2,2.5,3.3*37 +$GPGST,222626.000,20.2,12.6,23.1,19.8,13.0,20.2,38.4*5F +$GPGSV,3,1,11,16,48,116,31,25,39,268,32,23,58,174,25,20,71,337,38*75 +$GPGSV,3,2,11,19,03,029,,04,06,242,25,13,31,223,36,27,19,283,23*7A +$GPGSV,3,3,11,11,06,338,,01,,,18,03,14,056,24*7C +$GPRMC,222626.000,A,2734.78516,S,15305.97172,E,24.7,48.3,030308,11.2,W,A*39 +$GPVTG,48.3,T,59.5,M,24.7,N,45.7,K,A*22 +$GPGGA,222627.000,2734.78079,S,15305.97737,E,1,04,2.5,50.5,M,39.2,M,,*77 +$GPGLL,2734.78079,S,15305.97737,E,222627.000,A,A*49 +$GPGSA,A,3,16,23,20,13,,,,,,,,,5.8,2.5,5.2*39 +$GPGST,222627.000,16.3,12.4,42.2,11.3,13.5,37.9,90.0*51 +$GPGSV,3,1,11,16,48,116,28,25,39,268,32,23,58,174,25,20,71,337,37*72 +$GPGSV,3,2,11,19,03,029,,04,06,242,29,13,31,223,37,27,19,283,30*75 +$GPGSV,3,3,11,11,06,338,,01,,,18,03,14,056,24*7C +$GPRMC,222627.000,A,2734.78079,S,15305.97737,E,24.3,48.1,030308,11.2,W,A*35 +$GPVTG,48.1,T,59.3,M,24.3,N,45.1,K,A*24 +$GPGGA,222628.000,2734.77637,S,15305.98293,E,1,07,1.3,50.2,M,39.2,M,,*7E +$GPGLL,2734.77637,S,15305.98293,E,222628.000,A,A*41 +$GPGSA,A,3,16,25,23,04,13,27,03,,,,,,2.2,1.3,1.8*38 +$GPGST,222628.000,13.2,14.5,8.8,76.9,8.4,13.0,22.0*5F +$GPGSV,3,1,11,16,48,116,30,25,39,268,32,23,58,174,27,20,71,337,37*79 +$GPGSV,3,2,11,19,03,029,,04,06,242,32,13,31,223,37,27,19,283,28*76 +$GPGSV,3,3,11,11,06,338,,01,,,18,03,14,056,25*7D +$GPRMC,222628.000,A,2734.77637,S,15305.98293,E,23.9,48.5,030308,11.2,W,A*34 +$GPVTG,48.5,T,59.7,M,23.9,N,44.3,K,A*2A +$GPGGA,222629.000,2734.77226,S,15305.98850,E,1,08,1.1,49.5,M,39.2,M,,*7C +$GPGLL,2734.77226,S,15305.98850,E,222629.000,A,A*41 +$GPGSA,A,3,16,25,23,20,04,13,27,03,,,,,1.7,1.1,1.3*35 +$GPGST,222629.000,11.0,9.5,7.3,89.6,6.7,8.6,14.3*5E +$GPGSV,3,1,11,16,48,116,31,25,39,268,32,23,58,174,25,20,71,337,36*7B +$GPGSV,3,2,11,19,03,029,,04,06,242,30,13,31,223,37,27,19,283,28*74 +$GPGSV,3,3,11,11,06,338,,01,,,18,03,14,056,27*7F +$GPRMC,222629.000,A,2734.77226,S,15305.98850,E,23.5,49.4,030308,11.2,W,A*38 +$GPVTG,49.4,T,60.6,M,23.5,N,43.5,K,A*2C +$GPGGA,222630.000,2734.76859,S,15305.99361,E,1,04,3.5,49.4,M,39.2,M,,*74 +$GPGLL,2734.76859,S,15305.99361,E,222630.000,A,A*42 +$GPGSA,A,3,16,25,20,27,,,,,,,,,4.9,3.5,3.4*39 +$GPGST,222630.000,13.4,7.9,50.0,19.9,17.0,43.1,69.5*66 +$GPGSV,3,1,11,16,48,116,31,25,39,268,30,23,58,174,22,20,71,337,36*7E +$GPGSV,3,2,11,19,03,029,,04,06,242,32,13,31,223,35,27,19,283,24*78 +$GPGSV,3,3,11,11,06,338,18,01,,,18,03,14,056,29*78 +$GPRMC,222630.000,A,2734.76859,S,15305.99361,E,21.1,50.3,030308,11.2,W,A*32 +$GPVTG,50.3,T,61.5,M,21.1,N,39.1,K,A*2E +$GPGGA,222631.000,2734.76498,S,15305.99809,E,1,08,1.1,48.2,M,39.2,M,,*7C +$GPGLL,2734.76498,S,15305.99809,E,222631.000,A,A*47 +$GPGSA,A,3,16,25,23,20,04,13,27,03,,,,,1.7,1.1,1.3*35 +$GPGST,222631.000,18.4,10.8,5.8,77.6,5.6,9.7,13.2*63 +$GPGSV,3,1,11,16,48,116,32,25,39,268,31,23,58,174,22,20,71,337,35*7F +$GPGSV,3,2,11,19,03,029,,04,06,242,30,13,31,223,36,27,19,283,25*78 +$GPGSV,3,3,11,11,06,338,18,01,,,18,03,14,056,33*73 +$GPRMC,222631.000,A,2734.76498,S,15305.99809,E,19.4,47.4,030308,11.2,W,A*38 +$GPVTG,47.4,T,58.6,M,19.4,N,35.9,K,A*2C +$GPGGA,222632.000,2734.76359,S,15306.00162,E,1,08,1.1,49.6,M,39.2,M,,*77 +$GPGLL,2734.76359,S,15306.00162,E,222632.000,A,A*49 +$GPGSA,A,3,16,25,23,20,04,13,27,03,,,,,1.7,1.1,1.3*35 +$GPGST,222632.000,18.1,14.9,6.7,53.4,9.5,11.5,16.1*5A +$GPGSV,3,1,11,16,48,116,30,25,39,268,31,23,58,174,31,20,71,337,31*7B +$GPGSV,3,2,11,19,03,029,,04,06,242,22,13,31,223,37,27,19,283,29*76 +$GPGSV,3,3,11,11,06,338,24,01,,,18,03,14,056,25*7B +$GPRMC,222632.000,A,2734.76359,S,15306.00162,E,12.4,65.5,030308,11.2,W,A*3C +$GPVTG,65.5,T,76.7,M,12.4,N,22.9,K,A*2D +$GPGGA,222633.000,2734.76254,S,15306.00553,E,1,08,1.1,49.0,M,39.2,M,,*7A +$GPGLL,2734.76254,S,15306.00553,E,222633.000,A,A*42 +$GPGSA,A,3,16,25,23,20,04,13,27,03,,,,,1.7,1.1,1.3*35 +$GPGST,222633.000,13.9,12.3,5.8,55.3,7.8,9.7,13.7*62 +$GPGSV,3,1,10,16,48,116,35,25,39,268,35,23,58,174,30,20,71,337,35*7E +$GPGSV,3,2,10,19,03,029,,04,06,242,26,13,31,223,39,27,19,283,26*72 +$GPGSV,3,3,10,11,06,338,24,03,14,056,30*76 +$GPRMC,222633.000,A,2734.76254,S,15306.00553,E,12.9,72.5,030308,11.2,W,A*3C +$GPVTG,72.5,T,83.7,M,12.9,N,23.9,K,A*2D +$GPGGA,222634.000,2734.76305,S,15306.00850,E,1,08,1.1,48.4,M,39.2,M,,*73 +$GPGLL,2734.76305,S,15306.00850,E,222634.000,A,A*4E +$GPGSA,A,3,16,25,23,20,04,13,27,03,,,,,1.7,1.1,1.3*35 +$GPGST,222634.000,11.3,10.3,5.3,58.0,6.5,8.4,12.0*62 +$GPGSV,3,1,10,16,48,116,33,25,39,268,38,23,58,174,30,20,71,337,30*70 +$GPGSV,3,2,10,19,03,029,,04,06,242,29,13,31,223,34,27,19,283,30*77 +$GPGSV,3,3,10,11,06,338,23,03,14,056,25*75 +$GPRMC,222634.000,A,2734.76305,S,15306.00850,E,9.4,99.3,030308,11.2,W,A*04 +$GPVTG,99.3,T,110.5,M,9.4,N,17.3,K,A*2D +$GPGGA,222635.000,2734.76418,S,15306.01089,E,1,08,1.1,47.9,M,39.2,M,,*76 +$GPGLL,2734.76418,S,15306.01089,E,222635.000,A,A*49 +$GPGSA,A,3,16,25,23,20,04,13,27,03,,,,,1.7,1.1,1.3*35 +$GPGST,222635.000,13.4,9.3,7.7,66.3,7.3,8.3,14.0*50 +$GPGSV,3,1,10,16,48,116,36,25,39,268,31,23,58,174,37,20,71,337,36*7D +$GPGSV,3,2,10,19,03,029,,04,06,242,31,13,31,223,34,27,19,283,31*7F +$GPGSV,3,3,10,11,06,338,23,03,14,056,23*73 +$GPRMC,222635.000,A,2734.76418,S,15306.01089,E,8.3,116.7,030308,11.2,W,A*37 +$GPVTG,116.7,T,127.9,M,8.3,N,15.4,K,A*14 +$GPGGA,222636.000,2734.76577,S,15306.01258,E,1,07,1.7,47.9,M,39.2,M,,*7A +$GPGLL,2734.76577,S,15306.01258,E,222636.000,A,A*4C +$GPGSA,A,3,16,25,23,20,04,13,27,,,,,,2.8,1.7,2.3*3F +$GPGST,222636.000,10.6,11.9,8.1,45.4,9.3,9.3,18.8*65 +$GPGSV,3,1,10,16,48,116,41,25,39,268,35,23,58,174,40,20,71,337,33*7C +$GPGSV,3,2,10,19,03,029,,04,06,242,32,13,31,223,28,27,19,283,34*74 +$GPGSV,3,3,10,11,06,338,25,03,14,056,23*75 +$GPRMC,222636.000,A,2734.76577,S,15306.01258,E,7.6,135.7,030308,11.2,W,A*39 +$GPVTG,135.7,T,146.9,M,7.6,N,14.1,K,A*1C +$GPGGA,222637.000,2734.76759,S,15306.01422,E,1,07,1.7,47.8,M,39.2,M,,*7F +$GPGLL,2734.76759,S,15306.01422,E,222637.000,A,A*48 +$GPGSA,A,3,16,25,23,20,04,13,27,,,,,,2.8,1.7,2.3*3F +$GPGST,222637.000,8.9,7.2,10.9,44.4,8.4,8.5,17.1*59 +$GPGSV,3,1,10,16,48,116,44,25,39,268,36,23,58,174,33,20,71,337,33*7E +$GPGSV,3,2,10,19,03,029,,04,06,242,24,13,31,223,29,27,19,283,36*70 +$GPGSV,3,3,10,11,06,338,25,03,14,056,23*75 +$GPRMC,222637.000,A,2734.76759,S,15306.01422,E,8.0,140.6,030308,11.2,W,A*37 +$GPVTG,140.6,T,151.8,M,8.0,N,14.8,K,A*18 +$GPGGA,222638.000,2734.76957,S,15306.01592,E,1,06,2.0,47.6,M,39.2,M,,*71 +$GPGLL,2734.76957,S,15306.01592,E,222638.000,A,A*4D +$GPGSA,A,3,16,25,23,20,04,13,,,,,,,3.2,2.0,2.6*30 +$GPGST,222638.000,10.4,8.9,16.3,14.1,8.7,14.6,19.9*51 +$GPGSV,3,1,10,16,48,116,38,25,39,268,30,23,58,174,29,20,71,337,29*73 +$GPGSV,3,2,10,19,03,029,,04,06,242,28,13,31,223,31,27,19,283,29*7B +$GPGSV,3,3,10,11,06,338,21,03,14,056,23*71 +$GPRMC,222638.000,A,2734.76957,S,15306.01592,E,8.8,142.8,030308,11.2,W,A*36 +$GPVTG,142.8,T,154.0,M,8.8,N,16.2,K,A*19 +$GPGGA,222639.000,2734.77109,S,15306.01748,E,1,07,1.7,47.8,M,39.2,M,,*7C +$GPGLL,2734.77109,S,15306.01748,E,222639.000,A,A*4B +$GPGSA,A,3,16,25,23,20,04,13,27,,,,,,2.8,1.7,2.3*3F +$GPGST,222639.000,9.5,9.6,14.7,43.8,11.3,11.5,19.8*51 +$GPGSV,3,1,10,16,48,116,37,25,39,268,32,23,58,174,37,20,71,337,29*71 +$GPGSV,3,2,10,19,03,029,,04,06,242,28,13,31,223,31,27,19,283,27*75 +$GPGSV,3,3,10,11,06,338,21,03,14,056,23*71 +$GPRMC,222639.000,A,2734.77109,S,15306.01748,E,7.1,137.2,030308,11.2,W,A*3E +$GPVTG,137.2,T,148.4,M,7.1,N,13.1,K,A*18 +$GPGGA,222640.000,2734.77216,S,15306.02018,E,1,04,2.6,47.8,M,39.2,M,,*7F +$GPGLL,2734.77216,S,15306.02018,E,222640.000,A,A*49 +$GPGSA,A,3,16,25,23,13,,,,,,,,,6.2,2.6,5.6*32 +$GPGST,222640.000,20.0,11.7,22.3,7.0,10.9,20.3,46.8*65 +$GPGSV,3,1,10,16,48,116,32,25,39,268,29,23,58,174,24,20,71,337,25*70 +$GPGSV,3,2,10,19,03,029,,04,06,242,28,13,31,223,31,27,19,283,25*77 +$GPGSV,3,3,10,11,06,338,21,03,14,056,23*71 +$GPRMC,222640.000,A,2734.77216,S,15306.02018,E,9.4,114.2,030308,11.2,W,A*36 +$GPVTG,114.2,T,125.4,M,9.4,N,17.4,K,A*18 +$GPGGA,222641.000,2734.77543,S,15306.02149,E,1,04,2.6,47.7,M,39.2,M,,*73 +$GPGLL,2734.77543,S,15306.02149,E,222641.000,A,A*4A +$GPGSA,A,3,16,25,23,13,,,,,,,,,6.2,2.6,5.6*32 +$GPGST,222641.000,18.3,40.3,13.2,79.5,13.7,36.3,59.1*5E +$GPGSV,3,1,10,16,48,116,34,25,39,268,23,23,58,174,26,20,71,337,27*7C +$GPGSV,3,2,10,19,03,029,,04,06,242,28,13,31,223,31,27,19,283,23*71 +$GPGSV,3,3,10,11,06,338,21,03,14,056,23*71 +$GPRMC,222641.000,A,2734.77543,S,15306.02149,E,12.5,160.9,030308,11.2,W,A*06 +$GPVTG,160.9,T,172.1,M,12.5,N,23.1,K,A*2E +$GPGGA,222642.000,2734.77709,S,15306.02300,E,1,04,2.6,47.7,M,39.2,M,,*73 +$GPGLL,2734.77709,S,15306.02300,E,222642.000,A,A*4A +$GPGSA,A,3,16,20,04,13,,,,,,,,,4.3,2.6,3.4*35 +$GPGST,222642.000,15.8,14.5,71.8,20.7,26.3,61.6,97.2*58 +$GPGSV,3,1,10,16,48,116,41,25,40,268,23,23,58,174,27,20,71,337,34*73 +$GPGSV,3,2,10,19,03,029,,04,06,242,28,13,31,223,31,27,19,283,23*71 +$GPGSV,3,3,10,11,06,338,21,03,14,056,23*71 +$GPRMC,222642.000,A,2734.77709,S,15306.02300,E,7.5,140.7,030308,11.2,W,A*3E +$GPVTG,140.7,T,151.9,M,7.5,N,13.9,K,A*14 +$GPGGA,222643.000,2734.77831,S,15306.02427,E,1,04,2.6,47.5,M,39.2,M,,*76 +$GPGLL,2734.77831,S,15306.02427,E,222643.000,A,A*4D +$GPGSA,A,3,16,20,04,13,,,,,,,,,4.3,2.6,3.4*35 +$GPGST,222643.000,12.9,15.5,112.8,21.4,39.9,96.1,154.3*5C +$GPGSV,3,1,10,16,48,116,41,25,40,268,23,23,58,174,26,20,71,337,35*73 +$GPGSV,3,2,10,19,03,029,,04,06,242,28,13,31,223,31,27,19,283,23*71 +$GPGSV,3,3,10,11,06,338,21,03,14,056,23*71 +$GPRMC,222643.000,A,2734.77831,S,15306.02427,E,5.6,136.2,030308,11.2,W,A*3C +$GPVTG,136.2,T,147.4,M,5.6,N,10.4,K,A*15 +$GPGGA,222644.000,2734.77900,S,15306.02522,E,1,04,2.5,47.4,M,39.2,M,,*74 +$GPGLL,2734.77900,S,15306.02522,E,222644.000,A,A*4D +$GPGSA,A,3,16,23,20,13,,,,,,,,,5.8,2.5,5.2*39 +$GPGST,222644.000,11.9,32.3,39.9,23.1,35.5,30.7,165.7*69 +$GPGSV,3,1,10,16,48,116,38,25,40,268,23,23,58,174,25,20,71,337,37*7C +$GPGSV,3,2,10,19,03,029,,04,06,242,28,13,31,223,31,27,19,283,23*71 +$GPGSV,3,3,10,11,06,338,21,03,14,056,26*74 +$GPRMC,222644.000,A,2734.77900,S,15306.02522,E,3.7,127.8,030308,11.2,W,A*31 +$GPVTG,127.8,T,139.0,M,3.7,N,6.9,K,A*2F +$GPGGA,222645.000,2734.77991,S,15306.02594,E,1,04,3.4,47.4,M,39.2,M,,*70 +$GPGLL,2734.77991,S,15306.02594,E,222645.000,A,A*49 +$GPGSA,A,3,16,23,20,03,,,,,,,,,6.1,3.4,5.0*30 +$GPGST,222645.000,15.3,40.1,15.0,66.6,34.1,19.2,69.1*50 +$GPGSV,3,1,10,16,48,116,33,25,40,268,23,23,58,174,23,20,71,337,35*73 +$GPGSV,3,2,10,19,03,029,,04,06,242,28,13,31,223,31,27,19,283,23*71 +$GPGSV,3,3,10,11,06,338,21,03,14,056,30*73 +$GPRMC,222645.000,A,2734.77991,S,15306.02594,E,3.9,145.4,030308,11.2,W,A*33 +$GPVTG,145.4,T,156.6,M,3.9,N,7.2,K,A*2C +$GPGGA,222646.000,2734.78074,S,15306.02652,E,1,04,3.4,47.4,M,39.2,M,,*77 +$GPGLL,2734.78074,S,15306.02652,E,222646.000,A,A*4E +$GPGSA,A,3,16,23,20,03,,,,,,,,,6.1,3.4,5.0*30 +$GPGST,222646.000,14.8,53.5,15.6,78.9,48.1,16.9,76.9*50 +$GPGSV,3,1,11,16,48,116,32,25,40,268,23,23,58,174,26,20,71,337,32*71 +$GPGSV,3,2,11,19,03,029,,04,06,242,28,13,31,223,31,27,19,283,23*70 +$GPGSV,3,3,11,11,06,338,21,08,00,298,,03,14,056,34*4D +$GPRMC,222646.000,A,2734.78074,S,15306.02652,E,3.5,149.5,030308,11.2,W,A*35 +$GPVTG,149.5,T,160.7,M,3.5,N,6.6,K,A*2C +$GPGGA,222647.000,2734.78140,S,15306.02704,E,1,04,3.4,47.3,M,39.2,M,,*75 +$GPGLL,2734.78140,S,15306.02704,E,222647.000,A,A*4B +$GPGSA,A,3,16,23,20,03,,,,,,,,,6.1,3.4,5.0*30 +$GPGST,222647.000,11.7,42.4,13.1,77.7,38.0,14.3,60.9*53 +$GPGSV,3,1,11,16,48,116,37,25,40,268,23,23,58,174,31,20,71,337,36*76 +$GPGSV,3,2,11,19,03,029,,04,06,242,28,13,31,223,31,27,19,283,23*70 +$GPGSV,3,3,11,11,06,338,21,08,00,298,,03,14,056,34*4D +$GPRMC,222647.000,A,2734.78140,S,15306.02704,E,2.8,145.4,030308,11.2,W,A*31 +$GPVTG,145.4,T,156.6,M,2.8,N,5.1,K,A*2D +$GPGGA,222648.000,2734.78183,S,15306.02753,E,1,04,3.5,47.2,M,39.2,M,,*77 +$GPGLL,2734.78183,S,15306.02753,E,222648.000,A,A*49 +$GPGSA,A,3,16,23,20,03,,,,,,,,,6.1,3.5,5.0*31 +$GPGST,222648.000,11.3,35.2,16.9,76.3,31.5,16.9,53.8*53 +$GPGSV,3,1,11,16,48,116,35,25,40,267,23,23,58,174,37,20,71,337,35*7E +$GPGSV,3,2,11,19,03,029,,04,06,242,28,13,31,223,31,27,19,283,23*70 +$GPGSV,3,3,11,11,06,338,21,08,00,298,,03,14,056,35*4C +$GPRMC,222648.000,A,2734.78183,S,15306.02753,E,2.1,135.8,030308,11.2,W,A*31 +$GPVTG,135.8,T,147.1,M,2.1,N,3.9,K,A*26 +$GPGGA,222649.000,2734.78197,S,15306.02773,E,1,04,3.5,46.8,M,39.2,M,,*7A +$GPGLL,2734.78197,S,15306.02773,E,222649.000,A,A*4F +$GPGSA,A,3,16,23,20,03,,,,,,,,,6.1,3.5,5.0*31 +$GPGST,222649.000,13.9,60.8,14.8,84.0,55.3,14.7,79.7*52 +$GPGSV,3,1,11,16,48,116,31,25,40,267,23,23,58,174,36,20,71,337,31*7F +$GPGSV,3,2,11,19,03,029,,04,06,242,,13,31,223,,27,19,283,23*78 +$GPGSV,3,3,11,11,06,338,21,08,00,298,,03,14,056,29*41 +$GPRMC,222649.000,A,2734.78197,S,15306.02773,E,0.6,148.6,030308,11.2,W,A*36 +$GPVTG,148.6,T,159.8,M,0.6,N,1.2,K,A*28 +$GPGGA,222650.000,2734.78195,S,15306.02785,E,1,04,3.5,46.4,M,39.2,M,,*75 +$GPGLL,2734.78195,S,15306.02785,E,222650.000,A,A*4C +$GPGSA,A,3,16,23,20,03,,,,,,,,,6.1,3.5,5.0*31 +$GPGST,222650.000,11.4,48.0,12.9,83.3,43.6,12.8,63.8*5B +$GPGSV,3,1,11,16,48,116,30,25,40,267,23,23,58,174,33,20,71,337,30*7A +$GPGSV,3,2,11,19,03,029,,04,06,242,,13,31,223,,27,19,283,23*78 +$GPGSV,3,3,11,11,06,338,21,08,00,298,,03,14,056,26*4E +$GPRMC,222650.000,A,2734.78195,S,15306.02785,E,0.2,6.4,030308,11.2,W,A*38 +$GPVTG,6.4,T,17.6,M,0.2,N,0.3,K,A*10 +$GPGGA,222651.000,2734.78191,S,15306.02798,E,1,04,3.5,45.9,M,39.2,M,,*72 +$GPGLL,2734.78191,S,15306.02798,E,222651.000,A,A*45 +$GPGSA,A,3,16,23,20,03,,,,,,,,,6.1,3.5,5.0*31 +$GPGST,222651.000,9.8,40.0,12.0,82.4,36.3,11.9,53.8*6E +$GPGSV,3,1,11,16,48,116,28,25,40,267,,23,58,174,35,20,71,337,26*73 +$GPGSV,3,2,11,19,03,029,,04,06,242,,13,31,223,,27,19,283,*79 +$GPGSV,3,3,11,11,06,338,21,08,00,298,,03,14,056,28*40 +$GPRMC,222651.000,A,2734.78191,S,15306.02798,E,0.1,352.6,030308,11.2,W,A*32 +$GPVTG,352.6,T,3.8,M,0.1,N,0.3,K,A*28 +$GPGGA,222652.000,2734.78198,S,15306.02797,E,1,04,3.5,45.9,M,39.2,M,,*77 +$GPGLL,2734.78198,S,15306.02797,E,222652.000,A,A*40 +$GPGSA,A,3,16,23,20,03,,,,,,,,,6.1,3.5,5.0*31 +$GPGST,222652.000,21.7,41.2,15.0,83.8,37.5,14.2,91.6*58 +$GPGSV,3,1,11,16,48,116,24,25,40,267,,23,58,174,23,20,71,337,26*78 +$GPGSV,3,2,11,19,03,029,,04,06,242,,13,31,223,,27,19,283,*79 +$GPGSV,3,3,11,11,06,338,21,08,00,298,,03,14,056,24*4C +$GPRMC,222652.000,A,2734.78198,S,15306.02797,E,0.2,263.5,030308,11.2,W,A*34 +$GPVTG,263.5,T,274.7,M,0.2,N,0.3,K,A*26 +$GPGGA,222653.000,2734.78226,S,15306.02793,E,1,04,3.5,45.9,M,39.2,M,,*74 +$GPGLL,2734.78226,S,15306.02793,E,222653.000,A,A*43 +$GPGSA,A,3,16,23,20,03,,,,,,,,,6.1,3.5,5.0*31 +$GPGST,222653.000,18.8,36.4,20.7,81.4,33.0,19.3,78.6*5F +$GPGSV,3,1,11,16,48,116,24,25,40,267,,23,58,174,25,20,71,337,25*7D +$GPGSV,3,2,11,19,03,029,,04,06,242,,13,31,223,,27,20,283,*73 +$GPGSV,3,3,11,11,06,338,21,08,00,298,,03,14,056,24*4C +$GPRMC,222653.000,A,2734.78226,S,15306.02793,E,0.8,188.1,030308,11.2,W,A*3F +$GPVTG,188.1,T,199.3,M,0.8,N,1.5,K,A*2D +$GPGGA,222654.000,2734.78231,S,15306.02789,E,1,04,3.5,45.9,M,39.2,M,,*7E +$GPGLL,2734.78231,S,15306.02789,E,222654.000,A,A*49 +$GPGSA,A,3,16,23,20,03,,,,,,,,,6.1,3.5,5.0*31 +$GPGST,222654.000,14.4,23.3,16.5,69.8,20.7,16.0,57.9*5D +$GPGSV,3,1,11,16,48,116,34,25,40,267,,23,58,174,34,20,71,337,31*79 +$GPGSV,3,2,11,19,03,029,,04,06,242,,13,31,223,,27,20,283,*73 +$GPGSV,3,3,11,11,06,338,21,08,00,298,,03,14,056,31*48 +$GPRMC,222654.000,A,2734.78231,S,15306.02789,E,0.1,145.6,030308,11.2,W,A*3A +$GPVTG,145.6,T,156.8,M,0.1,N,0.2,K,A*2C +$GPGGA,222655.000,2734.78251,S,15306.02806,E,1,04,3.5,45.8,M,39.2,M,,*70 +$GPGLL,2734.78251,S,15306.02806,E,222655.000,A,A*46 +$GPGSA,A,3,16,23,20,03,,,,,,,,,6.1,3.5,5.0*31 +$GPGST,222655.000,12.0,28.1,14.0,78.7,25.3,13.6,52.5*54 +$GPGSV,3,1,11,16,48,116,40,25,40,267,,23,58,174,38,20,71,337,35*72 +$GPGSV,3,2,11,19,03,029,,04,06,242,,13,31,223,,27,20,283,*73 +$GPGSV,3,3,11,11,06,338,21,08,00,298,,03,14,056,36*4F +$GPRMC,222655.000,A,2734.78251,S,15306.02806,E,0.7,135.5,030308,11.2,W,A*37 +$GPVTG,135.5,T,146.8,M,0.7,N,1.2,K,A*2E +$GPGGA,222656.000,2734.78273,S,15306.02823,E,1,04,3.5,45.7,M,39.2,M,,*7B +$GPGLL,2734.78273,S,15306.02823,E,222656.000,A,A*42 +$GPGSA,A,3,16,23,20,03,,,,,,,,,6.1,3.5,5.0*31 +$GPGST,222656.000,9.9,24.8,12.2,76.6,22.2,12.0,44.0*69 +$GPGSV,3,1,11,16,48,116,38,25,40,267,,23,58,174,36,20,71,337,30*76 +$GPGSV,3,2,11,19,03,029,,04,06,242,,13,31,223,,27,20,283,*73 +$GPGSV,3,3,11,11,06,338,21,08,00,298,,03,14,056,35*4C +$GPRMC,222656.000,A,2734.78273,S,15306.02823,E,0.5,135.5,030308,11.2,W,A*31 +$GPVTG,135.5,T,146.7,M,0.5,N,1.0,K,A*21 +$GPGGA,222657.000,2734.78312,S,15306.02858,E,1,04,3.5,45.5,M,39.2,M,,*72 +$GPGLL,2734.78312,S,15306.02858,E,222657.000,A,A*49 +$GPGSA,A,3,16,23,20,03,,,,,,,,,6.1,3.5,5.0*31 +$GPGST,222657.000,8.4,22.4,10.9,74.9,19.9,11.0,38.1*60 +$GPGSV,3,1,11,16,48,116,37,25,40,267,,23,58,174,36,20,71,337,30*79 +$GPGSV,3,2,11,19,03,029,,04,06,242,,13,31,223,,27,20,283,*73 +$GPGSV,3,3,11,11,06,338,21,08,00,298,,03,14,056,34*4D +$GPRMC,222657.000,A,2734.78312,S,15306.02858,E,1.3,137.6,030308,11.2,W,A*3C +$GPVTG,137.6,T,148.8,M,1.3,N,2.4,K,A*21 +$GPGGA,222658.000,2734.78370,S,15306.02910,E,1,04,3.5,45.4,M,39.2,M,,*75 +$GPGLL,2734.78370,S,15306.02910,E,222658.000,A,A*4F +$GPGSA,A,3,16,23,20,03,,,,,,,,,6.1,3.5,5.0*31 +$GPGST,222658.000,11.5,25.4,19.7,45.8,20.9,20.7,46.1*53 +$GPGSV,3,1,11,16,48,116,34,25,40,267,18,23,58,174,36,20,71,337,32*71 +$GPGSV,3,2,11,19,03,029,,04,06,242,,13,31,223,,27,20,283,*73 +$GPGSV,3,3,11,11,06,338,,08,00,298,,03,14,056,32*48 +$GPRMC,222658.000,A,2734.78370,S,15306.02910,E,2.7,141.8,030308,11.2,W,A*32 +$GPVTG,141.8,T,153.0,M,2.7,N,5.0,K,A*28 +$GPGGA,222659.000,2734.78463,S,15306.02956,E,1,04,3.5,45.4,M,39.2,M,,*73 +$GPGLL,2734.78463,S,15306.02956,E,222659.000,A,A*49 +$GPGSA,A,3,16,23,20,03,,,,,,,,,6.1,3.5,5.0*31 +$GPGST,222659.000,10.9,34.8,17.8,79.2,31.4,17.1,52.2*5E +$GPGSV,3,1,11,16,48,116,32,25,40,267,18,23,58,174,37,20,71,337,32*76 +$GPGSV,3,2,11,19,03,029,,04,06,242,,13,31,223,,27,20,283,*73 +$GPGSV,3,3,11,11,06,338,,08,00,298,,03,14,056,26*4D +$GPRMC,222659.000,A,2734.78463,S,15306.02956,E,3.6,157.2,030308,11.2,W,A*39 +$GPVTG,157.2,T,168.4,M,3.6,N,6.7,K,A*2D +$GPGGA,222700.000,2734.78553,S,15306.02974,E,1,04,3.5,45.3,M,39.2,M,,*7B +$GPGLL,2734.78553,S,15306.02974,E,222700.000,A,A*46 +$GPGSA,A,3,16,23,20,03,,,,,,,,,6.1,3.5,5.0*31 +$GPGST,222700.000,13.4,30.5,15.4,80.9,27.6,14.6,58.2*5C +$GPGSV,3,1,11,16,48,116,38,25,40,267,18,23,58,174,42,20,71,337,34*78 +$GPGSV,3,2,11,19,03,029,,04,06,242,,13,31,223,,27,20,283,*73 +$GPGSV,3,3,11,11,06,338,,08,00,298,,03,14,056,30*4A +$GPRMC,222700.000,A,2734.78553,S,15306.02974,E,3.1,171.1,030308,11.2,W,A*36 +$GPVTG,171.1,T,182.3,M,3.1,N,5.7,K,A*2D +$GPGGA,222701.000,2734.78678,S,15306.02887,E,1,05,1.6,45.4,M,39.2,M,,*7A +$GPGLL,2734.78678,S,15306.02887,E,222701.000,A,A*40 +$GPGSA,A,3,16,23,20,13,03,,,,,,,,2.5,1.6,1.9*3F +$GPGST,222701.000,18.6,22.3,33.4,25.2,29.0,22.6,46.2*53 +$GPGSV,3,1,11,16,48,116,30,25,40,267,18,23,58,174,33,20,71,337,27*74 +$GPGSV,3,2,11,19,03,029,,04,06,242,,13,31,223,20,27,20,283,*71 +$GPGSV,3,3,11,11,06,338,,08,00,298,,03,14,056,27*4C +$GPRMC,222701.000,A,2734.78678,S,15306.02887,E,5.1,212.6,030308,11.2,W,A*37 +$GPVTG,212.6,T,223.8,M,5.1,N,9.5,K,A*27 +$GPGGA,222702.000,2734.78726,S,15306.02769,E,1,04,3.5,45.3,M,39.2,M,,*7B +$GPGLL,2734.78726,S,15306.02769,E,222702.000,A,A*46 +$GPGSA,A,3,16,23,20,03,,,,,,,,,6.1,3.5,5.0*31 +$GPGST,222702.000,14.7,49.5,20.8,84.3,45.1,19.5,72.8*5F +$GPGSV,3,1,11,16,48,116,36,25,40,267,18,23,58,174,40,20,71,337,31*71 +$GPGSV,3,2,11,19,03,029,,04,06,242,,13,31,223,20,27,20,283,*71 +$GPGSV,3,3,11,11,06,338,,08,00,298,,03,14,056,28*43 +$GPRMC,222702.000,A,2734.78726,S,15306.02769,E,4.2,246.4,030308,11.2,W,A*30 +$GPVTG,246.4,T,257.6,M,4.2,N,7.7,K,A*27 +$GPGGA,222703.000,2734.78745,S,15306.02617,E,1,05,1.6,45.3,M,39.2,M,,*77 +$GPGLL,2734.78745,S,15306.02617,E,222703.000,A,A*4A +$GPGSA,A,3,16,23,20,13,03,,,,,,,,2.5,1.6,1.9*3F +$GPGST,222703.000,12.3,16.0,23.0,21.5,20.3,15.6,33.1*53 +$GPGSV,3,1,11,16,48,116,31,25,40,267,18,23,58,174,29,20,70,337,23*7B +$GPGSV,3,2,11,19,03,029,,04,06,242,,13,31,223,22,27,20,283,*73 +$GPGSV,3,3,11,11,06,338,,08,00,298,,03,14,056,27*4C +$GPRMC,222703.000,A,2734.78745,S,15306.02617,E,4.9,265.5,030308,11.2,W,A*37 +$GPVTG,265.5,T,276.7,M,4.9,N,9.1,K,A*26 +$GPGGA,222704.000,2734.78730,S,15306.02555,E,1,04,3.5,45.3,M,39.2,M,,*77 +$GPGLL,2734.78730,S,15306.02555,E,222704.000,A,A*4A +$GPGSA,A,3,16,23,20,03,,,,,,,,,6.1,3.5,5.1*30 +$GPGST,222704.000,9.5,34.0,22.1,80.5,30.8,20.6,55.7*69 +$GPGSV,3,1,11,16,48,116,31,25,40,267,18,23,58,174,29,20,70,337,23*7B +$GPGSV,3,2,11,19,03,029,,04,06,242,,13,31,223,22,27,20,283,*73 +$GPGSV,3,3,11,11,06,338,,08,00,298,,03,14,056,31*4B +$GPRMC,222704.000,A,2734.78730,S,15306.02555,E,2.1,286.5,030308,11.2,W,A*34 +$GPVTG,286.5,T,297.7,M,2.1,N,3.9,K,A*28 +$GPGGA,222705.000,2734.78698,S,15306.02452,E,1,04,3.5,45.3,M,39.2,M,,*73 +$GPGLL,2734.78698,S,15306.02452,E,222705.000,A,A*4E +$GPGSA,A,3,16,23,20,03,,,,,,,,,6.1,3.5,5.1*30 +$GPGST,222705.000,93.8,65.1,31.9,84.0,59.3,29.7,94.1*5F +$GPGSV,3,1,11,16,48,116,29,25,40,267,18,23,58,174,29,20,70,337,23*72 +$GPGSV,3,2,11,19,03,029,,04,06,242,,13,31,223,22,27,20,283,*73 +$GPGSV,3,3,11,11,06,338,,08,00,298,,03,14,056,30*4A +$GPRMC,222705.000,A,2734.78698,S,15306.02452,E,3.6,290.3,030308,11.2,W,A*37 +$GPVTG,290.3,T,301.5,M,3.6,N,6.8,K,A*27 +$GPGGA,222706.000,2734.78686,S,15306.02339,E,1,04,3.5,45.3,M,39.2,M,,*75 +$GPGLL,2734.78686,S,15306.02339,E,222706.000,A,A*48 +$GPGSA,A,3,16,23,20,03,,,,,,,,,6.1,3.5,5.1*30 +$GPGST,222706.000,114.3,62.0,48.3,70.3,55.4,45.7,116.3*5B +$GPGSV,3,1,11,16,48,116,24,25,40,267,18,23,58,174,29,20,70,337,23*7F +$GPGSV,3,2,11,19,03,029,,04,06,242,,13,31,223,22,27,20,283,*73 +$GPGSV,3,3,11,11,06,338,,08,00,298,,03,14,056,24*4F +$GPRMC,222706.000,A,2734.78686,S,15306.02339,E,3.4,277.7,030308,11.2,W,A*3E +$GPVTG,277.7,T,288.9,M,3.4,N,6.3,K,A*2F +$GPGGA,222707.000,2734.78679,S,15306.02251,E,1,04,3.5,45.3,M,39.2,M,,*7B +$GPGLL,2734.78679,S,15306.02251,E,222707.000,A,A*46 +$GPGSA,A,3,16,23,20,03,,,,,,,,,6.1,3.5,5.1*30 +$GPGST,222707.000,128.0,90.0,67.0,53.0,75.4,69.6,158.6*55 +$GPGSV,3,1,11,16,48,116,24,25,40,267,18,23,58,174,29,20,70,337,23*7F +$GPGSV,3,2,11,19,03,029,,04,06,242,,13,31,223,22,27,20,283,*73 +$GPGSV,3,3,11,11,06,338,,08,00,298,,03,14,056,24*4F +$GPRMC,222707.000,A,2734.78679,S,15306.02251,E,,,030308,,,A*79 +$GPVTG,,T,,M,,N,,K,N*2C +$GPGGA,222708.000,2734.78673,S,15306.02181,E,1,05,1.6,45.3,M,39.2,M,,*70 +$GPGLL,2734.78673,S,15306.02181,E,222708.000,A,A*4D +$GPGSA,A,3,16,23,20,13,03,,,,,,,,2.5,1.6,1.9*3F +$GPGST,222708.000,66.8,93.0,70.5,62.6,69.3,81.1,141.7*6F +$GPGSV,3,1,11,16,48,116,24,25,40,267,,23,58,174,29,20,70,337,23*76 +$GPGSV,3,2,11,19,03,029,,04,06,242,,13,31,222,22,27,20,283,*72 +$GPGSV,3,3,11,11,06,338,,08,00,298,,03,14,056,24*4F +$GPRMC,222708.000,A,2734.78673,S,15306.02181,E,,,030308,,,A*72 +$GPVTG,,T,,M,,N,,K,N*2C +$GPGGA,222709.000,2734.78668,S,15306.02124,E,1,05,1.6,45.3,M,39.2,M,,*74 +$GPGLL,2734.78668,S,15306.02124,E,222709.000,A,A*49 +$GPGSA,A,2,16,23,20,13,03,,,,,,,,1.8,1.6,0.9*31 +$GPGST,222709.000,89.5,61.2,117.7,37.9,91.7,79.5,4.3*54 +$GPGSV,3,1,11,16,48,116,24,25,40,267,,23,58,174,29,20,70,337,23*76 +$GPGSV,3,2,11,19,03,029,,04,06,242,,13,31,222,22,27,20,283,*72 +$GPGSV,3,3,11,11,06,338,,08,00,298,,03,14,056,24*4F +$GPRMC,222709.000,A,2734.78668,S,15306.02124,E,,,030308,,,A*76 +$GPVTG,,T,,M,,N,,K,N*2C +$GPGGA,222710.000,2734.78664,S,15306.02080,E,1,05,1.6,45.3,M,39.2,M,,*7F +$GPGLL,2734.78664,S,15306.02080,E,222710.000,A,A*42 +$GPGSA,A,2,16,23,20,13,03,,,,,,,,1.8,1.6,0.9*31 +$GPGST,222710.000,117.0,82.3,157.6,39.0,121.7,107.9,3.9*62 +$GPGSV,3,1,11,16,48,116,24,25,40,267,,23,58,174,29,20,70,337,23*76 +$GPGSV,3,2,11,19,03,029,,04,06,242,,13,31,222,22,27,20,283,*72 +$GPGSV,3,3,11,11,06,338,,08,00,298,,03,14,056,24*4F +$GPRMC,222710.000,A,2734.78664,S,15306.02080,E,,,030308,,,A*7D +$GPVTG,,T,,M,,N,,K,N*2C +$GPGGA,222711.000,2734.78660,S,15306.02044,E,1,05,1.6,45.3,M,39.2,M,,*72 +$GPGLL,2734.78660,S,15306.02044,E,222711.000,A,A*4F +$GPGSA,A,2,16,23,20,13,03,,,,,,,,1.8,1.6,0.9*31 +$GPGST,222711.000,128.0,107.6,205.2,40.2,156.7,142.6,3.5*58 +$GPGSV,3,1,11,16,48,116,24,25,40,267,,23,58,174,29,20,70,337,23*76 +$GPGSV,3,2,11,19,03,029,,04,06,242,,13,31,222,22,27,20,283,*72 +$GPGSV,3,3,11,11,06,338,,08,00,298,,03,14,056,24*4F +$GPRMC,222711.000,A,2734.78660,S,15306.02044,E,,,030308,,,A*70 +$GPVTG,,T,,M,,N,,K,N*2C +$GPGGA,222712.000,2734.78658,S,15306.02015,E,1,05,1.6,45.3,M,39.2,M,,*7E +$GPGLL,2734.78658,S,15306.02015,E,222712.000,A,A*43 +$GPGSA,A,2,16,23,20,13,03,,,,,,,,1.8,1.6,0.9*31 +$GPGST,222712.000,128.0,137.2,261.1,41.4,197.4,183.9,3.2*51 +$GPGSV,3,1,11,16,48,116,24,25,40,267,,23,58,173,29,20,70,337,23*71 +$GPGSV,3,2,11,19,03,029,,04,06,242,,13,31,222,22,27,20,283,*72 +$GPGSV,3,3,11,11,06,338,,08,00,298,,03,14,056,24*4F +$GPRMC,222712.000,A,2734.78658,S,15306.02015,E,,,030308,,,A*7C \ No newline at end of file diff --git a/examples/positioning/geoflickr/geoflickr.pro b/examples/positioning/geoflickr/geoflickr.pro new file mode 100644 index 0000000..0bbfecd --- /dev/null +++ b/examples/positioning/geoflickr/geoflickr.pro @@ -0,0 +1,15 @@ +TEMPLATE = app +TARGET = geoflickr + +QT += qml quick network positioning xmlpatterns +SOURCES += qmllocationflickr.cpp + +RESOURCES += \ + flickr.qrc + +OTHER_FILES += flickr.qml \ + flickrcommon/* \ + flickrmobile/* + +target.path = $$[QT_INSTALL_EXAMPLES]/positioning/geoflickr +INSTALLS += target diff --git a/examples/positioning/geoflickr/geoflickr.qmlproject b/examples/positioning/geoflickr/geoflickr.qmlproject new file mode 100644 index 0000000..d4909f8 --- /dev/null +++ b/examples/positioning/geoflickr/geoflickr.qmlproject @@ -0,0 +1,16 @@ +import QmlProject 1.0 + +Project { + /* Include .qml, .js, and image files from current directory and subdirectories */ + QmlFiles { + directory: "." + } + JavaScriptFiles { + directory: "." + } + ImageFiles { + directory: "." + } + /* List of plugin directories passed to QML runtime */ + // importPaths: [ " ../exampleplugin " ] +} diff --git a/examples/positioning/geoflickr/qmllocationflickr.cpp b/examples/positioning/geoflickr/qmllocationflickr.cpp new file mode 100644 index 0000000..61176cb --- /dev/null +++ b/examples/positioning/geoflickr/qmllocationflickr.cpp @@ -0,0 +1,68 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include +#include +#include + +int main(int argc, char *argv[]) +{ + QGuiApplication application(argc, argv); + const QString mainQmlApp = QStringLiteral("qrc:///flickr.qml"); + QQuickView view; + view.setSource(QUrl(mainQmlApp)); + view.setResizeMode(QQuickView::SizeRootObjectToView); + // Qt.quit() called in embedded .qml by default only emits + // quit() signal, so do this (optionally use Qt.exit()). + QObject::connect(view.engine(), SIGNAL(quit()), qApp, SLOT(quit())); + view.setGeometry(QRect(100, 100, 360, 640)); + view.show(); + return application.exec(); +} diff --git a/examples/positioning/logfilepositionsource/clientapplication.cpp b/examples/positioning/logfilepositionsource/clientapplication.cpp new file mode 100644 index 0000000..1dca07a --- /dev/null +++ b/examples/positioning/logfilepositionsource/clientapplication.cpp @@ -0,0 +1,72 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include +#include + +#include "logfilepositionsource.h" +#include "clientapplication.h" + +ClientApplication::ClientApplication(QWidget *parent) + : QMainWindow(parent) +{ + textEdit = new QTextEdit; + setCentralWidget(textEdit); + + LogFilePositionSource *source = new LogFilePositionSource(this); + connect(source, SIGNAL(positionUpdated(QGeoPositionInfo)), + this, SLOT(positionUpdated(QGeoPositionInfo))); + + source->startUpdates(); +} + +void ClientApplication::positionUpdated(const QGeoPositionInfo &info) +{ + textEdit->append(QString("Position updated: Date/time = %1, Coordinate = %2").arg(info.timestamp().toString()).arg(info.coordinate().toString())); +} diff --git a/examples/positioning/logfilepositionsource/clientapplication.h b/examples/positioning/logfilepositionsource/clientapplication.h new file mode 100644 index 0000000..4ffd548 --- /dev/null +++ b/examples/positioning/logfilepositionsource/clientapplication.h @@ -0,0 +1,74 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#ifndef CLIENTAPPLICATION_H +#define CLIENTAPPLICATION_H + +#include + +QT_BEGIN_NAMESPACE +class QGeoPositionInfo; +class QTextEdit; +QT_END_NAMESPACE + +class ClientApplication : public QMainWindow +{ + Q_OBJECT +public: + ClientApplication(QWidget *parent = 0); + +private slots: + void positionUpdated(const QGeoPositionInfo &info); + +private: + QTextEdit *textEdit; +}; + + +#endif diff --git a/examples/positioning/logfilepositionsource/doc/src/logfilepositionsource.qdoc b/examples/positioning/logfilepositionsource/doc/src/logfilepositionsource.qdoc new file mode 100644 index 0000000..27ad7e3 --- /dev/null +++ b/examples/positioning/logfilepositionsource/doc/src/logfilepositionsource.qdoc @@ -0,0 +1,87 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the documentation of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:FDL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Free Documentation License Usage +** Alternatively, this file may be used under the terms of the GNU Free +** Documentation License version 1.3 as published by the Free Software +** Foundation and appearing in the file included in the packaging of +** this file. Please review the following information to ensure +** the GNU Free Documentation License version 1.3 requirements +** will be met: https://www.gnu.org/licenses/fdl-1.3.html. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +/*! +\example logfilepositionsource +\title Log File Position Source (C++) +\ingroup qtpositioning-examples + +\brief The Logfile Position Source shows how to create and work with a custom NMEA position source, + for platforms without GPS. + +The data is read from a file which has positional data in NMEA format. The resulting time and +position information is then displayed to the screen as simple text in date/time and +latitude/longitude format. + +This example class reads position data from a text file, \e log.txt. The file specifies position +data using a simple text format: it contains one position update per line, where each line contains +a date/time, a latitude and a longitude, separated by spaces. The date/time is in ISO 8601 format +and the latitude and longitude are in degrees decimal format. Here is an excerpt from \e log.txt: + +\code +2009-08-24T22:25:01 -27.576082 153.092415 +2009-08-24T22:25:02 -27.576223 153.092530 +2009-08-24T22:25:03 -27.576364 153.092648 +\endcode + +The class reads this data and distributes it via the +\l{QGeoPositionInfoSource::positionUpdated()}{positionUpdated()} signal. + +Here is the definition of the \c LogFilePositionSource class: + +\quotefromfile logfilepositionsource/logfilepositionsource.h +\skipto class LogFilePositionSource +\printuntil }; + +The main methods overrided by the subclass are: + +\list + \li \l{QGeoPositionInfoSource::startUpdates()}{startUpdates()}: called by client applications + to start regular position updates. + \li \l{QGeoPositionInfoSource::stopUpdates()}{stopUpdates()}: called by client applications to + stop regular position updates. + \li \l{QGeoPositionInfoSource::requestUpdate()}{requestUpdate()}: called by client applications + to request a single update, with a specified timeout. +\endlist + +When a position update is available, the subclass emits the +\l{QGeoPositionInfoSource::positionUpdated()}{positionUpdated()} signal. + +Here are the key methods in the class implementation: + +\quotefromfile logfilepositionsource/logfilepositionsource.cpp +\skipto LogFilePositionSource::LogFilePositionSource +\printuntil /^\}/ +\skipto LogFilePositionSource::startUpdates +\printuntil /^\}/ +\skipto LogFilePositionSource::stopUpdates +\printuntil /^\}/ +\skipto LogFilePositionSource::requestUpdate +\printuntil /^\}/ +\printuntil LogFilePositionSource::readNextPosition +\printuntil /^\}/ +*/ diff --git a/examples/positioning/logfilepositionsource/logfile.qrc b/examples/positioning/logfilepositionsource/logfile.qrc new file mode 100644 index 0000000..6121394 --- /dev/null +++ b/examples/positioning/logfilepositionsource/logfile.qrc @@ -0,0 +1,5 @@ + + + simplelog.txt + + diff --git a/examples/positioning/logfilepositionsource/logfilepositionsource.cpp b/examples/positioning/logfilepositionsource/logfilepositionsource.cpp new file mode 100644 index 0000000..9c414c6 --- /dev/null +++ b/examples/positioning/logfilepositionsource/logfilepositionsource.cpp @@ -0,0 +1,132 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include + +#include "logfilepositionsource.h" + +LogFilePositionSource::LogFilePositionSource(QObject *parent) + : QGeoPositionInfoSource(parent), + logFile(new QFile(this)), + timer(new QTimer(this)) +{ + connect(timer, SIGNAL(timeout()), this, SLOT(readNextPosition())); + + logFile->setFileName(":/simplelog.txt"); + if (!logFile->open(QIODevice::ReadOnly)) + qWarning() << "Error: cannot open source file" << logFile->fileName(); +} + +QGeoPositionInfo LogFilePositionSource::lastKnownPosition(bool /*fromSatellitePositioningMethodsOnly*/) const +{ + return lastPosition; +} + +LogFilePositionSource::PositioningMethods LogFilePositionSource::supportedPositioningMethods() const +{ + return AllPositioningMethods; +} + +int LogFilePositionSource::minimumUpdateInterval() const +{ + return 500; +} + +void LogFilePositionSource::startUpdates() +{ + int interval = updateInterval(); + if (interval < minimumUpdateInterval()) + interval = minimumUpdateInterval(); + + timer->start(interval); +} + +void LogFilePositionSource::stopUpdates() +{ + timer->stop(); +} + +void LogFilePositionSource::requestUpdate(int /*timeout*/) +{ + // For simplicity, ignore timeout - assume that if data is not available + // now, no data will be added to the file later + if (logFile->canReadLine()) + readNextPosition(); + else + emit updateTimeout(); +} + +void LogFilePositionSource::readNextPosition() +{ + QByteArray line = logFile->readLine().trimmed(); + if (!line.isEmpty()) { + QList data = line.split(' '); + double latitude; + double longitude; + bool hasLatitude = false; + bool hasLongitude = false; + QDateTime timestamp = QDateTime::fromString(QString(data.value(0)), Qt::ISODate); + latitude = data.value(1).toDouble(&hasLatitude); + longitude = data.value(2).toDouble(&hasLongitude); + + if (hasLatitude && hasLongitude && timestamp.isValid()) { + QGeoCoordinate coordinate(latitude, longitude); + QGeoPositionInfo info(coordinate, timestamp); + if (info.isValid()) { + lastPosition = info; + emit positionUpdated(info); + } + } + } +} + +QGeoPositionInfoSource::Error LogFilePositionSource::error() const +{ + return QGeoPositionInfoSource::NoError; +} diff --git a/examples/positioning/logfilepositionsource/logfilepositionsource.h b/examples/positioning/logfilepositionsource/logfilepositionsource.h new file mode 100644 index 0000000..843516c --- /dev/null +++ b/examples/positioning/logfilepositionsource/logfilepositionsource.h @@ -0,0 +1,87 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#ifndef LOGFILEPOSITIONSOURCE_H +#define LOGFILEPOSITIONSOURCE_H + +#include + +QT_BEGIN_NAMESPACE +class QFile; +class QTimer; +QT_END_NAMESPACE + +class LogFilePositionSource : public QGeoPositionInfoSource +{ + Q_OBJECT +public: + LogFilePositionSource(QObject *parent = 0); + + QGeoPositionInfo lastKnownPosition(bool fromSatellitePositioningMethodsOnly = false) const; + + PositioningMethods supportedPositioningMethods() const; + int minimumUpdateInterval() const; + Error error() const; + +public slots: + virtual void startUpdates(); + virtual void stopUpdates(); + + virtual void requestUpdate(int timeout = 5000); + +private slots: + void readNextPosition(); + +private: + QFile *logFile; + QTimer *timer; + QGeoPositionInfo lastPosition; +}; + +#endif diff --git a/examples/positioning/logfilepositionsource/logfilepositionsource.pro b/examples/positioning/logfilepositionsource/logfilepositionsource.pro new file mode 100644 index 0000000..cb9e30a --- /dev/null +++ b/examples/positioning/logfilepositionsource/logfilepositionsource.pro @@ -0,0 +1,16 @@ +TEMPLATE = app +TARGET = logfilepositionsource +QT = positioning core widgets + + +HEADERS = logfilepositionsource.h \ + clientapplication.h +SOURCES = logfilepositionsource.cpp \ + clientapplication.cpp \ + main.cpp + +RESOURCES += \ + logfile.qrc + +target.path = $$[QT_INSTALL_EXAMPLES]/positioning/logfilepositionsource +INSTALLS += target diff --git a/examples/positioning/logfilepositionsource/main.cpp b/examples/positioning/logfilepositionsource/main.cpp new file mode 100644 index 0000000..dcc05a1 --- /dev/null +++ b/examples/positioning/logfilepositionsource/main.cpp @@ -0,0 +1,62 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include + +#include "clientapplication.h" + +int main(int argc, char *argv[]) +{ + QApplication app(argc, argv); + + ClientApplication client; + client.show(); + + return app.exec(); +} diff --git a/examples/positioning/logfilepositionsource/simplelog.txt b/examples/positioning/logfilepositionsource/simplelog.txt new file mode 100644 index 0000000..d016b2a --- /dev/null +++ b/examples/positioning/logfilepositionsource/simplelog.txt @@ -0,0 +1,156 @@ +2009-08-24T22:24:37 -27.572321 153.090718 +2009-08-24T22:24:38 -27.572470 153.090783 +2009-08-24T22:24:39 -27.572616 153.090845 +2009-08-24T22:24:40 -27.572763 153.090908 +2009-08-24T22:24:41 -27.572914 153.090971 +2009-08-24T22:24:42 -27.573068 153.091036 +2009-08-24T22:24:43 -27.573224 153.091102 +2009-08-24T22:24:44 -27.573383 153.091167 +2009-08-24T22:24:45 -27.573541 153.091232 +2009-08-24T22:24:46 -27.573700 153.091298 +2009-08-24T22:24:47 -27.573860 153.091366 +2009-08-24T22:24:48 -27.574019 153.091435 +2009-08-24T22:24:49 -27.574178 153.091507 +2009-08-24T22:24:50 -27.574340 153.091581 +2009-08-24T22:24:51 -27.574506 153.091654 +2009-08-24T22:24:52 -27.574670 153.091729 +2009-08-24T22:24:53 -27.574836 153.091800 +2009-08-24T22:24:54 -27.575001 153.091870 +2009-08-24T22:24:55 -27.575165 153.091940 +2009-08-24T22:24:56 -27.575327 153.092010 +2009-08-24T22:24:57 -27.575485 153.092078 +2009-08-24T22:24:58 -27.575641 153.092144 +2009-08-24T22:24:59 -27.575795 153.092218 +2009-08-24T22:25:00 -27.575942 153.092308 +2009-08-24T22:25:01 -27.576082 153.092415 +2009-08-24T22:25:02 -27.576223 153.092530 +2009-08-24T22:25:03 -27.576364 153.092648 +2009-08-24T22:25:04 -27.576505 153.092763 +2009-08-24T22:25:05 -27.576646 153.092879 +2009-08-24T22:25:06 -27.576784 153.092990 +2009-08-24T22:25:07 -27.576918 153.093099 +2009-08-24T22:25:08 -27.577046 153.093204 +2009-08-24T22:25:09 -27.577168 153.093303 +2009-08-24T22:25:10 -27.577284 153.093396 +2009-08-24T22:25:11 -27.577396 153.093484 +2009-08-24T22:25:12 -27.577499 153.093568 +2009-08-24T22:25:13 -27.577595 153.093647 +2009-08-24T22:25:14 -27.577692 153.093727 +2009-08-24T22:25:15 -27.577793 153.093810 +2009-08-24T22:25:16 -27.577897 153.093896 +2009-08-24T22:25:17 -27.578006 153.093984 +2009-08-24T22:25:18 -27.578120 153.094074 +2009-08-24T22:25:19 -27.578237 153.094168 +2009-08-24T22:25:20 -27.578360 153.094267 +2009-08-24T22:25:21 -27.578487 153.094370 +2009-08-24T22:25:22 -27.578617 153.094474 +2009-08-24T22:25:23 -27.578748 153.094581 +2009-08-24T22:25:24 -27.578880 153.094688 +2009-08-24T22:25:25 -27.579014 153.094796 +2009-08-24T22:25:26 -27.579149 153.094905 +2009-08-24T22:25:27 -27.579285 153.095012 +2009-08-24T22:25:28 -27.579420 153.095121 +2009-08-24T22:25:29 -27.579552 153.095231 +2009-08-24T22:25:30 -27.579684 153.095340 +2009-08-24T22:25:31 -27.579820 153.095449 +2009-08-24T22:25:32 -27.579956 153.095558 +2009-08-24T22:25:33 -27.580095 153.095667 +2009-08-24T22:25:34 -27.580240 153.095776 +2009-08-24T22:25:35 -27.580392 153.095885 +2009-08-24T22:25:36 -27.580536 153.095995 +2009-08-24T22:25:37 -27.580679 153.096109 +2009-08-24T22:25:38 -27.580824 153.096226 +2009-08-24T22:25:39 -27.580965 153.096337 +2009-08-24T22:25:40 -27.581101 153.096441 +2009-08-24T22:25:41 -27.581237 153.096537 +2009-08-24T22:25:42 -27.581356 153.096628 +2009-08-24T22:25:43 -27.581466 153.096714 +2009-08-24T22:25:44 -27.581555 153.096795 +2009-08-24T22:25:45 -27.581606 153.096847 +2009-08-24T22:25:46 -27.581539 153.096855 +2009-08-24T22:25:47 -27.581572 153.096873 +2009-08-24T22:25:48 -27.581579 153.096875 +2009-08-24T22:25:49 -27.581582 153.096878 +2009-08-24T22:25:50 -27.581588 153.096880 +2009-08-24T22:25:51 -27.581588 153.096880 +2009-08-24T22:25:52 -27.581592 153.096881 +2009-08-24T22:25:53 -27.581596 153.096882 +2009-08-24T22:25:54 -27.581599 153.096883 +2009-08-24T22:25:55 -27.581601 153.096883 +2009-08-24T22:25:56 -27.581602 153.096883 +2009-08-24T22:25:57 -27.581606 153.096890 +2009-08-24T22:25:58 -27.581606 153.096919 +2009-08-24T22:25:59 -27.581605 153.096985 +2009-08-24T22:26:00 -27.581573 153.097060 +2009-08-24T22:26:01 -27.581532 153.097142 +2009-08-24T22:26:02 -27.581484 153.097227 +2009-08-24T22:26:03 -27.581426 153.097324 +2009-08-24T22:26:04 -27.581373 153.097424 +2009-08-24T22:26:05 -27.581320 153.097530 +2009-08-24T22:26:06 -27.581265 153.097641 +2009-08-24T22:26:07 -27.581203 153.097757 +2009-08-24T22:26:08 -27.581144 153.097875 +2009-08-24T22:26:09 -27.581093 153.097995 +2009-08-24T22:26:10 -27.581042 153.098116 +2009-08-24T22:26:11 -27.580987 153.098231 +2009-08-24T22:26:12 -27.580919 153.098334 +2009-08-24T22:26:13 -27.580841 153.098428 +2009-08-24T22:26:14 -27.580754 153.098511 +2009-08-24T22:26:15 -27.580667 153.098591 +2009-08-24T22:26:16 -27.580581 153.098671 +2009-08-24T22:26:17 -27.580492 153.098751 +2009-08-24T22:26:18 -27.580401 153.098832 +2009-08-24T22:26:19 -27.580311 153.098914 +2009-08-24T22:26:20 -27.580224 153.098996 +2009-08-24T22:26:21 -27.580140 153.099078 +2009-08-24T22:26:22 -27.580059 153.099159 +2009-08-24T22:26:23 -27.579980 153.099245 +2009-08-24T22:26:24 -27.579900 153.099336 +2009-08-24T22:26:25 -27.579826 153.099433 +2009-08-24T22:26:26 -27.579753 153.099529 +2009-08-24T22:26:27 -27.579680 153.099623 +2009-08-24T22:26:28 -27.579606 153.099716 +2009-08-24T22:26:29 -27.579538 153.099808 +2009-08-24T22:26:30 -27.579477 153.099893 +2009-08-24T22:26:31 -27.579416 153.099968 +2009-08-24T22:26:32 -27.579393 153.100027 +2009-08-24T22:26:33 -27.579376 153.100092 +2009-08-24T22:26:34 -27.579384 153.100142 +2009-08-24T22:26:35 -27.579403 153.100181 +2009-08-24T22:26:36 -27.579429 153.100210 +2009-08-24T22:26:37 -27.579460 153.100237 +2009-08-24T22:26:38 -27.579493 153.100265 +2009-08-24T22:26:39 -27.579518 153.100291 +2009-08-24T22:26:40 -27.579536 153.100336 +2009-08-24T22:26:41 -27.579591 153.100358 +2009-08-24T22:26:42 -27.579618 153.100383 +2009-08-24T22:26:43 -27.579639 153.100404 +2009-08-24T22:26:44 -27.579650 153.100420 +2009-08-24T22:26:45 -27.579665 153.100432 +2009-08-24T22:26:46 -27.579679 153.100442 +2009-08-24T22:26:47 -27.579690 153.100451 +2009-08-24T22:26:48 -27.579697 153.100459 +2009-08-24T22:26:49 -27.579700 153.100462 +2009-08-24T22:26:50 -27.579699 153.100464 +2009-08-24T22:26:51 -27.579699 153.100466 +2009-08-24T22:26:52 -27.579700 153.100466 +2009-08-24T22:26:53 -27.579704 153.100466 +2009-08-24T22:26:54 -27.579705 153.100465 +2009-08-24T22:26:55 -27.579708 153.100468 +2009-08-24T22:26:56 -27.579712 153.100471 +2009-08-24T22:26:57 -27.579719 153.100476 +2009-08-24T22:26:58 -27.579728 153.100485 +2009-08-24T22:26:59 -27.579744 153.100493 +2009-08-24T22:27:00 -27.579759 153.100496 +2009-08-24T22:27:01 -27.579780 153.100481 +2009-08-24T22:27:02 -27.579788 153.100462 +2009-08-24T22:27:03 -27.579791 153.100436 +2009-08-24T22:27:04 -27.579788 153.100426 +2009-08-24T22:27:05 -27.579783 153.100409 +2009-08-24T22:27:06 -27.579781 153.100390 +2009-08-24T22:27:07 -27.579780 153.100375 +2009-08-24T22:27:08 -27.579779 153.100364 +2009-08-24T22:27:09 -27.579778 153.100354 +2009-08-24T22:27:10 -27.579777 153.100347 +2009-08-24T22:27:11 -27.579777 153.100341 +2009-08-24T22:27:12 -27.579776 153.100336 diff --git a/examples/positioning/positioning.pro b/examples/positioning/positioning.pro new file mode 100644 index 0000000..50c328b --- /dev/null +++ b/examples/positioning/positioning.pro @@ -0,0 +1,9 @@ +TEMPLATE = subdirs + +qtHaveModule(widgets): SUBDIRS += logfilepositionsource +qtHaveModule(quick) { + SUBDIRS += satelliteinfo + + qtHaveModule(xmlpatterns): SUBDIRS += geoflickr + qtHaveModule(network): SUBDIRS += weatherinfo +} diff --git a/examples/positioning/satelliteinfo/doc/images/example-satelliteinfo.png b/examples/positioning/satelliteinfo/doc/images/example-satelliteinfo.png new file mode 100644 index 0000000000000000000000000000000000000000..aa9a217c232773407fe0bcec4665723d3ed4565d GIT binary patch literal 27371 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 k63DQRexEtLIU8q)dJ~KYEcqim+ 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 KWlN>sef&T0c$BCB literal 0 HcmV?d00001 diff --git a/examples/positioning/satelliteinfo/doc/src/satelliteinfo.qdoc b/examples/positioning/satelliteinfo/doc/src/satelliteinfo.qdoc new file mode 100644 index 0000000..54c3020 --- /dev/null +++ b/examples/positioning/satelliteinfo/doc/src/satelliteinfo.qdoc @@ -0,0 +1,75 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the documentation of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:FDL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Free Documentation License Usage +** Alternatively, this file may be used under the terms of the GNU Free +** Documentation License version 1.3 as published by the Free Software +** Foundation and appearing in the file included in the packaging of +** this file. Please review the following information to ensure +** the GNU Free Documentation License version 1.3 requirements +** will be met: https://www.gnu.org/licenses/fdl-1.3.html. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +/*! + \example satelliteinfo + \title SatelliteInfo (C++/QML) + + \brief The SatelliteInfo example shows how the available satellites + at the user's current position and marks the satellites + currently contributing to the GPS fix as pink. + + \ingroup qtpositioning-examples + + Key \l{Qt Positioning} classes used in this example: + + \list + \li \l{QGeoSatelliteInfo} + \li \l{QGeoSatelliteInfoSource} + \endlist + + \image ../images/example-satelliteinfo.png + + The example displays the signal strength of all satellites in view. Any satellite + that is currently used to calculate the GPS fix has been marked pink. The number at + the bottom of each signal bar is the individual satellite identifier. + + The application operates in three different modes: + + \table + \header + \li Application mode + \li Description + \row + \li running + \li The application continuously queries the system for satellite updates. When new data + is available it will be displayed. + \row + \li stopped + \li The application stops updating the satellite information. + \row + \li single + \li The application makes a single update request with a timeout of 10s. The display + remains empty until the request was answered by the system. + \endtable + + If the platform does not provide satellite information the application automatically + switches into a demo mode whereby it continuously switches between predefined + sets of satellite data. + + \include examples-run.qdocinc +*/ diff --git a/examples/positioning/satelliteinfo/main.cpp b/examples/positioning/satelliteinfo/main.cpp new file mode 100644 index 0000000..feeb12a --- /dev/null +++ b/examples/positioning/satelliteinfo/main.cpp @@ -0,0 +1,72 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include +#include +#include +#include +#include "satellitemodel.h" + +int main(int argc, char *argv[]) +{ + QGuiApplication app(argc, argv); + qmlRegisterType("Local", 1, 0, "SatelliteModel"); + + QQuickView view; + view.setSource(QStringLiteral("qrc:///satelliteinfo.qml")); + view.setResizeMode(QQuickView::SizeRootObjectToView); + + QObject::connect(view.engine(), SIGNAL(quit()), qApp, SLOT(quit())); + view.show(); + + return app.exec(); +} + + diff --git a/examples/positioning/satelliteinfo/satelliteinfo.pro b/examples/positioning/satelliteinfo/satelliteinfo.pro new file mode 100644 index 0000000..4aef9d0 --- /dev/null +++ b/examples/positioning/satelliteinfo/satelliteinfo.pro @@ -0,0 +1,22 @@ +TEMPLATE = app +TARGET = satelliteinfo + +QT += quick positioning + +SOURCES += main.cpp \ + satellitemodel.cpp + +HEADERS += \ + satellitemodel.h + +OTHER_FILES += \ + satelliteinfo.qml + +RESOURCES += \ + satelliteinfo.qrc + +target.path = $$[QT_INSTALL_EXAMPLES]/positioning/satelliteinfo +INSTALLS += target + + + diff --git a/examples/positioning/satelliteinfo/satelliteinfo.qml b/examples/positioning/satelliteinfo/satelliteinfo.qml new file mode 100644 index 0000000..a0269e2 --- /dev/null +++ b/examples/positioning/satelliteinfo/satelliteinfo.qml @@ -0,0 +1,314 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.0 +import Local 1.0 + +Rectangle { + id: page + width: 360 + height: 360 + + SatelliteModel { + id: satelliteModel + running: true + onErrorFound: errorLabel.text = qsTr("Last Error: %1", "%1=error number").arg(code) + } + + Item { + id: header + height: column.height + 30 + width: parent.width + state: "running" + + anchors.top: parent.top + + function toggle() + { + switch (header.state) { + case "single": header.state = "running"; break; + default: + case "running": header.state = "stopped"; break; + case "stopped": header.state = "single"; break; + } + } + + function enterSingle() + { + satelliteModel.singleRequestMode = true; + satelliteModel.running = true; + } + + function enterRunning() + { + satelliteModel.running = false; + satelliteModel.singleRequestMode = false; + satelliteModel.running = true; + } + + states: [ + State { + name: "stopped" + PropertyChanges { target: startStop; bText: qsTr("Single") } + PropertyChanges { + target: modeLabel; text: qsTr("Current Mode: stopped") + } + PropertyChanges { target: satelliteModel; running: false; } + }, + State { + name: "single" + PropertyChanges { target: startStop; bText: qsTr("Start") } + PropertyChanges { + target: modeLabel; text: qsTr("Current Mode: single") + } + StateChangeScript { script: header.enterSingle(); } + }, + State { + name: "running" + PropertyChanges { target: startStop; bText: qsTr("Stop") } + PropertyChanges { + target: modeLabel; text: qsTr("Current Mode: running") + } + StateChangeScript { script: header.enterRunning(); } + } + ] + + Column { + id: column + anchors.verticalCenter: parent.verticalCenter + anchors.left: parent.left + anchors.margins: 7 + Text { + id: overview + text: satelliteModel.satelliteInfoAvailable + ? qsTr("Known Satellites") + : qsTr("Known Satellites (Demo Mode)") + font.pointSize: 12 + } + + Text { + id: modeLabel + font.pointSize: 12 + } + + Text { + id: errorLabel + text: qsTr("Last Error: None") + font.pointSize: 12 + } + } + Rectangle { + id: startStop + border.color: "black" + border.width: 3 + anchors.right: parent.right + anchors.verticalCenter: parent.verticalCenter + anchors.margins: 7 + radius: 10 + height: maxField.height*1.4 + width: maxField.width*1.4 + + property string bText: qsTr("Stop"); + + Text { //need this for sizing + id: maxField + text: qsTr("Single") + font.pointSize: 13 + opacity: 0 + } + + Text { + id: buttonText + anchors.centerIn: parent + text: startStop.bText + font.pointSize: 13 + } + + MouseArea { + anchors.fill: parent + onPressed: { startStop.color = "lightGray" } + onClicked: { header.toggle() } + onReleased: { startStop.color = "white" } + } + } + } + + Rectangle { + anchors.top: header.bottom + anchors.bottom: parent.bottom + anchors.left: parent.left + anchors.right: parent.right + anchors.margins: rect.myMargin + border.width: 3 + radius: 10 + border.color: "black" + + Item { + id: rect + anchors.fill: parent + anchors.margins: myMargin + property int myMargin: 7 + + Row { + id: view + property int rows: repeater.model.entryCount + property int singleWidth: ((rect.width - scale.width)/rows )-rect.myMargin + spacing: rect.myMargin + + Rectangle { + id: scale + width: strengthLabel.width+10 + height: rect.height + color: "#32cd32" + Text { + anchors.horizontalCenter: parent.horizontalCenter + anchors.bottom: lawngreenRect.top + font.pointSize: 11 + text: "50" + } + Text { + anchors.horizontalCenter: parent.horizontalCenter + anchors.top: parent.top + font.pointSize: 11 + text: "100" + } + + Rectangle { + id: redRect + width: parent.width + color: "red" + height: parent.height*10/100 + anchors.bottom: parent.bottom + Text { + id: strengthLabel + anchors.horizontalCenter: parent.horizontalCenter + anchors.bottom: parent.bottom + font.pointSize: 11 + text: "00" + } + } + Rectangle { + id: orangeRect + height: parent.height*10/100 + anchors.bottom: redRect.top + width: parent.width + color: "#ffa500" + Text { + anchors.horizontalCenter: parent.horizontalCenter + anchors.bottom: parent.bottom + font.pointSize: 11 + text: "10" + } + } + Rectangle { + id: goldRect + height: parent.height*10/100 + anchors.bottom: orangeRect.top + width: parent.width + color: "#ffd700" + Text { + anchors.horizontalCenter: parent.horizontalCenter + anchors.bottom: parent.bottom + font.pointSize: 11 + text: "20" + } + } + Rectangle { + id: yellowRect + height: parent.height*10/100 + anchors.bottom: goldRect.top + width: parent.width + color: "yellow" + Text { + anchors.horizontalCenter: parent.horizontalCenter + anchors.bottom: parent.bottom + font.pointSize: 11 + text: "30" + } + } + Rectangle { + id: lawngreenRect + height: parent.height*10/100 + anchors.bottom: yellowRect.top + width: parent.width + color: "#7cFc00" + Text { + anchors.horizontalCenter: parent.horizontalCenter + anchors.bottom: parent.bottom + font.pointSize: 11 + text: "40" + } + } + } + + Repeater { + id: repeater + model: satelliteModel + delegate: Rectangle { + height: rect.height + width: view.singleWidth + Rectangle { + anchors.bottom: parent.bottom + width: parent.width + height: parent.height*signalStrength/100 + color: isInUse ? "#7FFF0000" : "#7F0000FF" + } + Text { + anchors.horizontalCenter: parent.horizontalCenter + anchors.bottom: parent.bottom + text: satelliteIdentifier + } + } + } + } + } + } +} + diff --git a/examples/positioning/satelliteinfo/satelliteinfo.qrc b/examples/positioning/satelliteinfo/satelliteinfo.qrc new file mode 100644 index 0000000..8745f87 --- /dev/null +++ b/examples/positioning/satelliteinfo/satelliteinfo.qrc @@ -0,0 +1,5 @@ + + + satelliteinfo.qml + + diff --git a/examples/positioning/satelliteinfo/satellitemodel.cpp b/examples/positioning/satelliteinfo/satellitemodel.cpp new file mode 100644 index 0000000..112fc9c --- /dev/null +++ b/examples/positioning/satelliteinfo/satellitemodel.cpp @@ -0,0 +1,319 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "satellitemodel.h" +#include +#include + +SatelliteModel::SatelliteModel(QObject *parent) : + QAbstractListModel(parent), source(0), m_componentCompleted(false), m_running(false), + m_runningRequested(false), demo(false), isSingle(false), singleRequestServed(false) +{ + source = QGeoSatelliteInfoSource::createDefaultSource(this); + if (!demo && !source) { + qWarning() << "No satellite data source found. Changing to demo mode."; + demo = true; + } + if (!demo) { + source->setUpdateInterval(3000); + connect(source, SIGNAL(satellitesInViewUpdated(QList)), + this, SLOT(satellitesInViewUpdated(QList))); + connect(source, SIGNAL(satellitesInUseUpdated(QList)), + this, SLOT(satellitesInUseUpdated(QList))); + connect(source, SIGNAL(error(QGeoSatelliteInfoSource::Error)), + this, SLOT(error(QGeoSatelliteInfoSource::Error))); + } + + if (demo) { + timer = new QTimer(this); + connect(timer, SIGNAL(timeout()), this, SLOT(updateDemoData())); + timer->start(3000); + } +} + +int SatelliteModel::rowCount(const QModelIndex &parent) const +{ + Q_UNUSED(parent); + if (!source && !demo) + return 0; + + return knownSatellites.count(); +} + +QVariant SatelliteModel::data(const QModelIndex &index, int role) const +{ + if (!demo && !source) + return QVariant(); + + if (!index.isValid() || index.row() < 0) + return QVariant(); + + if (index.row() >= knownSatellites.count()) { + qWarning() << "SatelliteModel: Index out of bound"; + return QVariant(); + } + + const QGeoSatelliteInfo &info = knownSatellites.at(index.row()); + switch (role) { + case IdentifierRole: + return info.satelliteIdentifier(); + case InUseRole: + return satellitesInUse.contains(info.satelliteIdentifier()); + case SignalStrengthRole: + return info.signalStrength(); + case ElevationRole: + if (!info.hasAttribute(QGeoSatelliteInfo::Elevation)) + return QVariant(); + return info.attribute(QGeoSatelliteInfo::Elevation); + case AzimuthRole: + if (!info.hasAttribute(QGeoSatelliteInfo::Azimuth)) + return QVariant(); + return info.attribute(QGeoSatelliteInfo::Azimuth); + default: + break; + + } + + return QVariant(); +} + +QHash SatelliteModel::roleNames() const +{ + QHash roleNames; + roleNames.insert(IdentifierRole, "satelliteIdentifier"); + roleNames.insert(InUseRole, "isInUse"); + roleNames.insert(SignalStrengthRole, "signalStrength"); + roleNames.insert(ElevationRole, "elevation"); + roleNames.insert(AzimuthRole, "azimuth"); + return roleNames; +} + +void SatelliteModel::componentComplete() +{ + m_componentCompleted = true; + if (m_runningRequested) + setRunning(true); +} + +bool SatelliteModel::running() const +{ + return m_running; +} + +bool SatelliteModel::isSingleRequest() const +{ + return isSingle; +} + +void SatelliteModel::setSingleRequest(bool single) +{ + if (running()) { + qWarning() << "Cannot change single request mode while running"; + return; + } + + if (single != isSingle) { //flag changed + isSingle = single; + emit singleRequestChanged(); + } +} + +void SatelliteModel::setRunning(bool isActive) +{ + if (!source && !demo) + return; + + if (!m_componentCompleted) { + m_runningRequested = isActive; + return; + } + + if (m_running == isActive) + return; + + m_running = isActive; + + if (m_running) { + clearModel(); + if (demo) + timer->start(2000); + else if (isSingleRequest()) + source->requestUpdate(10000); + else + source->startUpdates(); + + if (demo) + singleRequestServed = false; + } else { + if (demo) + timer->stop(); + else if (!isSingleRequest()) + source->stopUpdates(); + } + + + Q_EMIT runningChanged(); +} + +int SatelliteModel::entryCount() const +{ + return knownSatellites.count(); +} + +bool SatelliteModel::canProvideSatelliteInfo() const +{ + return !demo; +} + +void SatelliteModel::clearModel() +{ + beginResetModel(); + knownSatelliteIds.clear(); + knownSatellites.clear(); + satellitesInUse.clear(); + endResetModel(); +} + +void SatelliteModel::updateDemoData() +{ + static bool flag = true; + QList satellites; + if (flag) { + for (int i = 0; i<5; i++) { + QGeoSatelliteInfo info; + info.setSatelliteIdentifier(i); + info.setSignalStrength(20 + 20*i); + satellites.append(info); + } + } else { + for (int i = 0; i<9; i++) { + QGeoSatelliteInfo info; + info.setSatelliteIdentifier(i*2); + info.setSignalStrength(20 + 10*i); + satellites.append(info); + } + } + + + satellitesInViewUpdated(satellites); + flag ? satellitesInUseUpdated(QList() << satellites.at(2)) + : satellitesInUseUpdated(QList() << satellites.at(3)); + flag = !flag; + + emit errorFound(flag); + + if (isSingleRequest() && !singleRequestServed) { + singleRequestServed = true; + setRunning(false); + } +} + +void SatelliteModel::error(QGeoSatelliteInfoSource::Error error) +{ + emit errorFound((int)error); +} + +QT_BEGIN_NAMESPACE +inline bool operator<(const QGeoSatelliteInfo& a, const QGeoSatelliteInfo& b) +{ + return a.satelliteIdentifier() < b.satelliteIdentifier(); +} +QT_END_NAMESPACE + +void SatelliteModel::satellitesInViewUpdated(const QList &infos) +{ + if (!running()) + return; + + int oldEntryCount = knownSatellites.count(); + + + QSet satelliteIdsInUpdate; + foreach (const QGeoSatelliteInfo &info, infos) + satelliteIdsInUpdate.insert(info.satelliteIdentifier()); + + QSet toBeRemoved = knownSatelliteIds - satelliteIdsInUpdate; + + //We reset the model as in reality just about all entry values change + //and there are generally a lot of inserts and removals each time + //Hence we don't bother with complex model update logic beyond resetModel() + beginResetModel(); + + knownSatellites = infos; + + //sort them for presentation purposes + std::sort(knownSatellites.begin(), knownSatellites.end()); + + //remove old "InUse" data + //new satellites are by default not in "InUse" + //existing satellites keep their "inUse" state + satellitesInUse -= toBeRemoved; + + knownSatelliteIds = satelliteIdsInUpdate; + endResetModel(); + + if (oldEntryCount != knownSatellites.count()) + emit entryCountChanged(); +} + +void SatelliteModel::satellitesInUseUpdated(const QList &infos) +{ + if (!running()) + return; + + beginResetModel(); + + satellitesInUse.clear(); + foreach (const QGeoSatelliteInfo &info, infos) + satellitesInUse.insert(info.satelliteIdentifier()); + + endResetModel(); +} + diff --git a/examples/positioning/satelliteinfo/satellitemodel.h b/examples/positioning/satelliteinfo/satellitemodel.h new file mode 100644 index 0000000..37f8301 --- /dev/null +++ b/examples/positioning/satelliteinfo/satellitemodel.h @@ -0,0 +1,134 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef SATELLITEMODEL_H +#define SATELLITEMODEL_H + +#include +#include +#include +#include +#include + +QT_FORWARD_DECLARE_CLASS(QTimer) +QT_FORWARD_DECLARE_CLASS(QGeoSatelliteInfoSource) + +class SatelliteModel : public QAbstractListModel, public QQmlParserStatus +{ + Q_OBJECT + Q_PROPERTY(bool running READ running WRITE setRunning NOTIFY runningChanged) + Q_PROPERTY(bool satelliteInfoAvailable READ canProvideSatelliteInfo NOTIFY canProvideSatelliteInfoChanged) + Q_PROPERTY(int entryCount READ entryCount NOTIFY entryCountChanged) + Q_PROPERTY(bool singleRequestMode READ isSingleRequest WRITE setSingleRequest NOTIFY singleRequestChanged) + Q_INTERFACES(QQmlParserStatus) +public: + explicit SatelliteModel(QObject *parent = 0); + + enum { + IdentifierRole = Qt::UserRole + 1, + InUseRole, + SignalStrengthRole, + ElevationRole, + AzimuthRole + }; + + //From QAbstractListModel + int rowCount(const QModelIndex &parent) const; + QVariant data(const QModelIndex &index, int role) const; + QHash roleNames() const; + + //From QQmlParserStatus + void classBegin() {} + void componentComplete(); + + bool running() const; + void setRunning(bool isActive); + + bool isSingleRequest() const; + void setSingleRequest(bool single); + + int entryCount() const; + + bool canProvideSatelliteInfo() const; + +signals: + void runningChanged(); + void entryCountChanged(); + void errorFound(int code); + void canProvideSatelliteInfoChanged(); + void singleRequestChanged(); + +public slots: + void clearModel(); + void updateDemoData(); + +private slots: + void error(QGeoSatelliteInfoSource::Error); + void satellitesInViewUpdated(const QList &infos); + void satellitesInUseUpdated(const QList &infos); + +private: + QGeoSatelliteInfoSource *source; + bool m_componentCompleted; + bool m_running; + bool m_runningRequested; + QList knownSatellites; + QSet knownSatelliteIds; + QSet satellitesInUse; + bool demo; + QTimer *timer; + bool isSingle; + bool singleRequestServed; + +}; + +QML_DECLARE_TYPE(SatelliteModel) + +#endif // SATELLITEMODEL_H diff --git a/examples/positioning/weatherinfo/appmodel.cpp b/examples/positioning/weatherinfo/appmodel.cpp new file mode 100644 index 0000000..6d31d5b --- /dev/null +++ b/examples/positioning/weatherinfo/appmodel.cpp @@ -0,0 +1,552 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "appmodel.h" + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +/* + *This application uses http://openweathermap.org/api + **/ + +#define ZERO_KELVIN 273.15 + +Q_LOGGING_CATEGORY(requestsLog,"wapp.requests") + +WeatherData::WeatherData(QObject *parent) : + QObject(parent) +{ +} + +WeatherData::WeatherData(const WeatherData &other) : + QObject(0), + m_dayOfWeek(other.m_dayOfWeek), + m_weather(other.m_weather), + m_weatherDescription(other.m_weatherDescription), + m_temperature(other.m_temperature) +{ +} + +QString WeatherData::dayOfWeek() const +{ + return m_dayOfWeek; +} + +/*! + * The icon value is based on OpenWeatherMap.org icon set. For details + * see http://bugs.openweathermap.org/projects/api/wiki/Weather_Condition_Codes + * + * e.g. 01d ->sunny day + * + * The icon string will be translated to + * http://openweathermap.org/img/w/01d.png + */ +QString WeatherData::weatherIcon() const +{ + return m_weather; +} + +QString WeatherData::weatherDescription() const +{ + return m_weatherDescription; +} + +QString WeatherData::temperature() const +{ + return m_temperature; +} + +void WeatherData::setDayOfWeek(const QString &value) +{ + m_dayOfWeek = value; + emit dataChanged(); +} + +void WeatherData::setWeatherIcon(const QString &value) +{ + m_weather = value; + emit dataChanged(); +} + +void WeatherData::setWeatherDescription(const QString &value) +{ + m_weatherDescription = value; + emit dataChanged(); +} + +void WeatherData::setTemperature(const QString &value) +{ + m_temperature = value; + emit dataChanged(); +} + +class AppModelPrivate +{ +public: + static const int baseMsBeforeNewRequest = 5 * 1000; // 5 s, increased after each missing answer up to 10x + QGeoPositionInfoSource *src; + QGeoCoordinate coord; + QString longitude, latitude; + QString city; + QNetworkAccessManager *nam; + WeatherData now; + QList forecast; + QQmlListProperty *fcProp; + bool ready; + bool useGps; + QElapsedTimer throttle; + int nErrors; + int minMsBeforeNewRequest; + QTimer delayedCityRequestTimer; + QTimer requestNewWeatherTimer; + QString app_ident; + + AppModelPrivate() : + src(NULL), + nam(NULL), + fcProp(NULL), + ready(false), + useGps(true), + nErrors(0), + minMsBeforeNewRequest(baseMsBeforeNewRequest) + { + delayedCityRequestTimer.setSingleShot(true); + delayedCityRequestTimer.setInterval(1000); // 1 s + requestNewWeatherTimer.setSingleShot(false); + requestNewWeatherTimer.setInterval(20*60*1000); // 20 min + throttle.invalidate(); + app_ident = QStringLiteral("36496bad1955bf3365448965a42b9eac"); + } +}; + +static void forecastAppend(QQmlListProperty *prop, WeatherData *val) +{ + Q_UNUSED(val); + Q_UNUSED(prop); +} + +static WeatherData *forecastAt(QQmlListProperty *prop, int index) +{ + AppModelPrivate *d = static_cast(prop->data); + return d->forecast.at(index); +} + +static int forecastCount(QQmlListProperty *prop) +{ + AppModelPrivate *d = static_cast(prop->data); + return d->forecast.size(); +} + +static void forecastClear(QQmlListProperty *prop) +{ + static_cast(prop->data)->forecast.clear(); +} + +//! [0] +AppModel::AppModel(QObject *parent) : + QObject(parent), + d(new AppModelPrivate) +{ +//! [0] + d->fcProp = new QQmlListProperty(this, d, + forecastAppend, + forecastCount, + forecastAt, + forecastClear); + + connect(&d->delayedCityRequestTimer, SIGNAL(timeout()), + this, SLOT(queryCity())); + connect(&d->requestNewWeatherTimer, SIGNAL(timeout()), + this, SLOT(refreshWeather())); + d->requestNewWeatherTimer.start(); + + +//! [1] + d->nam = new QNetworkAccessManager(this); + d->src = QGeoPositionInfoSource::createDefaultSource(this); + + if (d->src) { + d->useGps = true; + connect(d->src, SIGNAL(positionUpdated(QGeoPositionInfo)), + this, SLOT(positionUpdated(QGeoPositionInfo))); + connect(d->src, SIGNAL(error(QGeoPositionInfoSource::Error)), + this, SLOT(positionError(QGeoPositionInfoSource::Error))); + d->src->startUpdates(); + } else { + d->useGps = false; + d->city = "Brisbane"; + emit cityChanged(); + this->refreshWeather(); + } +} +//! [1] + +AppModel::~AppModel() +{ + if (d->src) + d->src->stopUpdates(); + delete d; +} + +//! [2] +void AppModel::positionUpdated(QGeoPositionInfo gpsPos) +{ + d->coord = gpsPos.coordinate(); + + if (!(d->useGps)) + return; + + queryCity(); +} +//! [2] + +void AppModel::queryCity() +{ + //don't update more often then once a minute + //to keep load on server low + if (d->throttle.isValid() && d->throttle.elapsed() < d->minMsBeforeNewRequest ) { + qCDebug(requestsLog) << "delaying query of city"; + if (!d->delayedCityRequestTimer.isActive()) + d->delayedCityRequestTimer.start(); + return; + } + qDebug(requestsLog) << "requested query of city"; + d->throttle.start(); + d->minMsBeforeNewRequest = (d->nErrors + 1) * d->baseMsBeforeNewRequest; + + QString latitude, longitude; + longitude.setNum(d->coord.longitude()); + latitude.setNum(d->coord.latitude()); + + QUrl url("http://api.openweathermap.org/data/2.5/weather"); + QUrlQuery query; + query.addQueryItem("lat", latitude); + query.addQueryItem("lon", longitude); + query.addQueryItem("mode", "json"); + query.addQueryItem("APPID", d->app_ident); + url.setQuery(query); + qCDebug(requestsLog) << "submitting request"; + + QNetworkReply *rep = d->nam->get(QNetworkRequest(url)); + // connect up the signal right away + connect(rep, &QNetworkReply::finished, + this, [this, rep]() { handleGeoNetworkData(rep); }); +} + +void AppModel::positionError(QGeoPositionInfoSource::Error e) +{ + Q_UNUSED(e); + qWarning() << "Position source error. Falling back to simulation mode."; + // cleanup insufficient QGeoPositionInfoSource instance + d->src->stopUpdates(); + d->src->deleteLater(); + d->src = 0; + + // activate simulation mode + d->useGps = false; + d->city = "Brisbane"; + emit cityChanged(); + this->refreshWeather(); +} + +void AppModel::hadError(bool tryAgain) +{ + qCDebug(requestsLog) << "hadError, will " << (tryAgain ? "" : "not ") << "rety"; + d->throttle.start(); + if (d->nErrors < 10) + ++d->nErrors; + d->minMsBeforeNewRequest = (d->nErrors + 1) * d->baseMsBeforeNewRequest; + if (tryAgain) + d->delayedCityRequestTimer.start(); +} + +void AppModel::handleGeoNetworkData(QNetworkReply *networkReply) +{ + if (!networkReply) { + hadError(false); // should retry? + return; + } + + if (!networkReply->error()) { + d->nErrors = 0; + if (!d->throttle.isValid()) + d->throttle.start(); + d->minMsBeforeNewRequest = d->baseMsBeforeNewRequest; + //convert coordinates to city name + QJsonDocument document = QJsonDocument::fromJson(networkReply->readAll()); + + QJsonObject jo = document.object(); + QJsonValue jv = jo.value(QStringLiteral("name")); + + const QString city = jv.toString(); + qCDebug(requestsLog) << "got city: " << city; + if (city != d->city) { + d->city = city; + emit cityChanged(); + refreshWeather(); + } + } else { + hadError(true); + } + networkReply->deleteLater(); +} + +void AppModel::refreshWeather() +{ + if (d->city.isEmpty()) { + qCDebug(requestsLog) << "refreshing weather skipped (no city)"; + return; + } + qCDebug(requestsLog) << "refreshing weather"; + QUrl url("http://api.openweathermap.org/data/2.5/weather"); + QUrlQuery query; + + query.addQueryItem("q", d->city); + query.addQueryItem("mode", "json"); + query.addQueryItem("APPID", d->app_ident); + url.setQuery(query); + + QNetworkReply *rep = d->nam->get(QNetworkRequest(url)); + // connect up the signal right away + connect(rep, &QNetworkReply::finished, + this, [this, rep]() { handleWeatherNetworkData(rep); }); +} + +static QString niceTemperatureString(double t) +{ + return QString::number(qRound(t-ZERO_KELVIN)) + QChar(0xB0); +} + +void AppModel::handleWeatherNetworkData(QNetworkReply *networkReply) +{ + qCDebug(requestsLog) << "got weather network data"; + if (!networkReply) + return; + + if (!networkReply->error()) { + foreach (WeatherData *inf, d->forecast) + delete inf; + d->forecast.clear(); + + QJsonDocument document = QJsonDocument::fromJson(networkReply->readAll()); + + if (document.isObject()) { + QJsonObject obj = document.object(); + QJsonObject tempObject; + QJsonValue val; + + if (obj.contains(QStringLiteral("weather"))) { + val = obj.value(QStringLiteral("weather")); + QJsonArray weatherArray = val.toArray(); + val = weatherArray.at(0); + tempObject = val.toObject(); + d->now.setWeatherDescription(tempObject.value(QStringLiteral("description")).toString()); + d->now.setWeatherIcon(tempObject.value("icon").toString()); + } + if (obj.contains(QStringLiteral("main"))) { + val = obj.value(QStringLiteral("main")); + tempObject = val.toObject(); + val = tempObject.value(QStringLiteral("temp")); + d->now.setTemperature(niceTemperatureString(val.toDouble())); + } + } + } + networkReply->deleteLater(); + + //retrieve the forecast + QUrl url("http://api.openweathermap.org/data/2.5/forecast/daily"); + QUrlQuery query; + + query.addQueryItem("q", d->city); + query.addQueryItem("mode", "json"); + query.addQueryItem("cnt", "5"); + query.addQueryItem("APPID", d->app_ident); + url.setQuery(query); + + QNetworkReply *rep = d->nam->get(QNetworkRequest(url)); + // connect up the signal right away + connect(rep, &QNetworkReply::finished, + this, [this, rep]() { handleForecastNetworkData(rep); }); +} + +void AppModel::handleForecastNetworkData(QNetworkReply *networkReply) +{ + qCDebug(requestsLog) << "got forecast"; + if (!networkReply) + return; + + if (!networkReply->error()) { + QJsonDocument document = QJsonDocument::fromJson(networkReply->readAll()); + + QJsonObject jo; + QJsonValue jv; + QJsonObject root = document.object(); + jv = root.value(QStringLiteral("list")); + if (!jv.isArray()) + qWarning() << "Invalid forecast object"; + QJsonArray ja = jv.toArray(); + //we need 4 days of forecast -> first entry is today + if (ja.count() != 5) + qWarning() << "Invalid forecast object"; + + QString data; + for (int i = 1; isetTemperature(data); + + //get date + jv = subtree.value(QStringLiteral("dt")); + QDateTime dt = QDateTime::fromMSecsSinceEpoch((qint64)jv.toDouble()*1000); + forecastEntry->setDayOfWeek(dt.date().toString(QStringLiteral("ddd"))); + + //get icon + QJsonArray weatherArray = subtree.value(QStringLiteral("weather")).toArray(); + jo = weatherArray.at(0).toObject(); + forecastEntry->setWeatherIcon(jo.value(QStringLiteral("icon")).toString()); + + //get description + forecastEntry->setWeatherDescription(jo.value(QStringLiteral("description")).toString()); + + d->forecast.append(forecastEntry); + } + + if (!(d->ready)) { + d->ready = true; + emit readyChanged(); + } + + emit weatherChanged(); + } + networkReply->deleteLater(); +} + +bool AppModel::hasValidCity() const +{ + return (!(d->city.isEmpty()) && d->city.size() > 1 && d->city != ""); +} + +bool AppModel::hasValidWeather() const +{ + return hasValidCity() && (!(d->now.weatherIcon().isEmpty()) && + (d->now.weatherIcon().size() > 1) && + d->now.weatherIcon() != ""); +} + +WeatherData *AppModel::weather() const +{ + return &(d->now); +} + +QQmlListProperty AppModel::forecast() const +{ + return *(d->fcProp); +} + +bool AppModel::ready() const +{ + return d->ready; +} + +bool AppModel::hasSource() const +{ + return (d->src != NULL); +} + +bool AppModel::useGps() const +{ + return d->useGps; +} + +void AppModel::setUseGps(bool value) +{ + d->useGps = value; + if (value) { + d->city = ""; + d->throttle.invalidate(); + emit cityChanged(); + emit weatherChanged(); + } + emit useGpsChanged(); +} + +QString AppModel::city() const +{ + return d->city; +} + +void AppModel::setCity(const QString &value) +{ + d->city = value; + emit cityChanged(); + refreshWeather(); +} diff --git a/examples/positioning/weatherinfo/appmodel.h b/examples/positioning/weatherinfo/appmodel.h new file mode 100644 index 0000000..f6657a5 --- /dev/null +++ b/examples/positioning/weatherinfo/appmodel.h @@ -0,0 +1,181 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef APPMODEL_H +#define APPMODEL_H + +#include +#include +#include +#include + +#include + +//! [0] +class WeatherData : public QObject { + Q_OBJECT + Q_PROPERTY(QString dayOfWeek + READ dayOfWeek WRITE setDayOfWeek + NOTIFY dataChanged) + Q_PROPERTY(QString weatherIcon + READ weatherIcon WRITE setWeatherIcon + NOTIFY dataChanged) + Q_PROPERTY(QString weatherDescription + READ weatherDescription WRITE setWeatherDescription + NOTIFY dataChanged) + Q_PROPERTY(QString temperature + READ temperature WRITE setTemperature + NOTIFY dataChanged) + +public: + explicit WeatherData(QObject *parent = 0); + WeatherData(const WeatherData &other); + + QString dayOfWeek() const; + QString weatherIcon() const; + QString weatherDescription() const; + QString temperature() const; + + void setDayOfWeek(const QString &value); + void setWeatherIcon(const QString &value); + void setWeatherDescription(const QString &value); + void setTemperature(const QString &value); + +signals: + void dataChanged(); +//! [0] +private: + QString m_dayOfWeek; + QString m_weather; + QString m_weatherDescription; + QString m_temperature; +//! [1] +}; +//! [1] + +Q_DECLARE_METATYPE(WeatherData) + +class AppModelPrivate; +//! [2] +class AppModel : public QObject +{ + Q_OBJECT + Q_PROPERTY(bool ready + READ ready + NOTIFY readyChanged) + Q_PROPERTY(bool hasSource + READ hasSource + NOTIFY readyChanged) + Q_PROPERTY(bool hasValidCity + READ hasValidCity + NOTIFY cityChanged) + Q_PROPERTY(bool hasValidWeather + READ hasValidWeather + NOTIFY weatherChanged) + Q_PROPERTY(bool useGps + READ useGps WRITE setUseGps + NOTIFY useGpsChanged) + Q_PROPERTY(QString city + READ city WRITE setCity + NOTIFY cityChanged) + Q_PROPERTY(WeatherData *weather + READ weather + NOTIFY weatherChanged) + Q_PROPERTY(QQmlListProperty forecast + READ forecast + NOTIFY weatherChanged) + +public: + explicit AppModel(QObject *parent = 0); + ~AppModel(); + + bool ready() const; + bool hasSource() const; + bool useGps() const; + bool hasValidCity() const; + bool hasValidWeather() const; + void setUseGps(bool value); + void hadError(bool tryAgain); + + QString city() const; + void setCity(const QString &value); + + WeatherData *weather() const; + QQmlListProperty forecast() const; + +public slots: + Q_INVOKABLE void refreshWeather(); + +//! [2] +private slots: + void queryCity(); + void positionUpdated(QGeoPositionInfo gpsPos); + void positionError(QGeoPositionInfoSource::Error e); + void handleGeoNetworkData(QNetworkReply *networkReply); + void handleWeatherNetworkData(QNetworkReply *networkReply); + void handleForecastNetworkData(QNetworkReply *networkReply); + +//! [3] +signals: + void readyChanged(); + void useGpsChanged(); + void cityChanged(); + void weatherChanged(); + +//! [3] + +private: + AppModelPrivate *d; + +//! [4] +}; +//! [4] + +#endif // APPMODEL_H diff --git a/examples/positioning/weatherinfo/components/BigForecastIcon.qml b/examples/positioning/weatherinfo/components/BigForecastIcon.qml new file mode 100644 index 0000000..6d2b4c8 --- /dev/null +++ b/examples/positioning/weatherinfo/components/BigForecastIcon.qml @@ -0,0 +1,93 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.0 + +Item { + id: current + + property string topText: "20*" + property string bottomText: "Mostly cloudy" + property string weatherIcon: "01d" + property real smallSide: (current.width < current.height ? current.width : current.height) + + Text { + text: current.topText + font.pointSize: 28 + anchors { + top: current.top + left: current.left + topMargin: 5 + leftMargin: 5 + } + } + + WeatherIcon { + weatherIcon: current.weatherIcon + useServerIcon: false + anchors.centerIn: parent + anchors.verticalCenterOffset: -15 + width: current.smallSide + height: current.smallSide + } + + Text { + text: current.bottomText + font.pointSize: 23 + wrapMode: Text.WordWrap + width: parent.width + horizontalAlignment: Text.AlignRight + anchors { + bottom: current.bottom + right: current.right + rightMargin: 5 + } + } +} diff --git a/examples/positioning/weatherinfo/components/ForecastIcon.qml b/examples/positioning/weatherinfo/components/ForecastIcon.qml new file mode 100644 index 0000000..7e48536 --- /dev/null +++ b/examples/positioning/weatherinfo/components/ForecastIcon.qml @@ -0,0 +1,99 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.0 + +Item { + id: top + + property string topText: "Mon" + property string weatherIcon: "01d" + property string bottomText: "22*/23*" + + Text { + id: dayText + horizontalAlignment: Text.AlignHCenter + width: top.width + text: top.topText + + anchors.top: parent.top + anchors.topMargin: top.height / 5 - dayText.paintedHeight + anchors.horizontalCenter: parent.horizontalCenter + } + + WeatherIcon { + id: icon + weatherIcon: top.weatherIcon + + property real side: { + var h = 3 * top.height / 5 + if (top.width < h) + top.width; + else + h; + } + + width: icon.side + height: icon.side + + anchors.centerIn: parent + } + + Text { + id: tempText + horizontalAlignment: Text.AlignHCenter + width: top.width + text: top.bottomText + + anchors.bottom: parent.bottom + anchors.bottomMargin: top.height / 5 - tempText.paintedHeight + anchors.horizontalCenter: parent.horizontalCenter + } +} diff --git a/examples/positioning/weatherinfo/components/WeatherIcon.qml b/examples/positioning/weatherinfo/components/WeatherIcon.qml new file mode 100644 index 0000000..638a52f --- /dev/null +++ b/examples/positioning/weatherinfo/components/WeatherIcon.qml @@ -0,0 +1,112 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.0 + +Item { + id: container + + property string weatherIcon: "01d" + + //server icons are too small. we keep using the local images + property bool useServerIcon: true + + Image { + id: img + source: { + if (useServerIcon) + "http://openweathermap.org/img/w/" + container.weatherIcon + ".png" + else { + switch (weatherIcon) { + case "01d": + case "01n": + "../icons/weather-sunny.png" + break; + case "02d": + case "02n": + "../icons/weather-sunny-very-few-clouds.png" + break; + case "03d": + case "03n": + "../icons/weather-few-clouds.png" + break; + case "04d": + case "04n": + "../icons/weather-overcast.png" + break; + case "09d": + case "09n": + "../icons/weather-showers.png" + break; + case "10d": + case "10n": + "../icons/weather-showers.png" + break; + case "11d": + case "11n": + "../icons/weather-thundershower.png" + break; + case "13d": + case "13n": + "../icons/weather-snow.png" + break; + case "50d": + case "50n": + "../icons/weather-fog.png" + break; + default: + "../icons/weather-unknown.png" + } + } + } + smooth: true + anchors.fill: parent + } +} diff --git a/examples/positioning/weatherinfo/doc/images/example-weatherinfo.png b/examples/positioning/weatherinfo/doc/images/example-weatherinfo.png new file mode 100644 index 0000000000000000000000000000000000000000..6557b57b2764a3c5e435755d05108a06fc1d563c GIT binary patch literal 82081 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

l;#XiE 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

q~)d8s!8}{10j9MX@ELWZG*C&ZZL! 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

g`s}QO5ynaZ!c)D4y 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 literal 0 HcmV?d00001 diff --git a/examples/positioning/weatherinfo/icons/weather-fog.png b/examples/positioning/weatherinfo/icons/weather-fog.png new file mode 100644 index 0000000000000000000000000000000000000000..9ffe9c4afcde071ce38d6846f7b2e2bee233cbaf GIT binary patch literal 43896 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�J}hmz``kpmts#GklXq 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 W$Cxu22_JOG2`p6Z{w#w{Rv)qrRC%Yn70e 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 z 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 T&UI|Szei3=S+YjlB<%kIn6v!l literal 0 HcmV?d00001 diff --git a/examples/positioning/weatherinfo/icons/weather-icy.png b/examples/positioning/weatherinfo/icons/weather-icy.png new file mode 100644 index 0000000000000000000000000000000000000000..18d203840b84401e6d7fefdb0846d09e0401c2f0 GIT binary patch literal 49362 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

K35|IsY+(I%c&*uc^9w5Vce(+&K_Koe(3XqglO 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

  • NnU*6Kv5~Hyu;EjK`hl33$K_I}E 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 literal 0 HcmV?d00001 diff --git a/examples/positioning/weatherinfo/icons/weather-snow.png b/examples/positioning/weatherinfo/icons/weather-snow.png new file mode 100644 index 0000000000000000000000000000000000000000..e7426e3cddc7d6352a6a2483eb3bcc060d860c8a GIT binary patch literal 70939 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 VyzTpd{lCsvMr6R@QFW__#k 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%0DYr^=+;A+oR!^FXBhMu4`BG6 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 literal 0 HcmV?d00001 diff --git a/examples/positioning/weatherinfo/icons/weather-sunny-very-few-clouds.png b/examples/positioning/weatherinfo/icons/weather-sunny-very-few-clouds.png new file mode 100644 index 0000000000000000000000000000000000000000..133bcb29f734312d7a3e686acc0ec90fd1274210 GIT binary patch literal 65731 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 literal 0 HcmV?d00001 diff --git a/examples/positioning/weatherinfo/icons/weather-sunny.png b/examples/positioning/weatherinfo/icons/weather-sunny.png new file mode 100644 index 0000000000000000000000000000000000000000..0fac921d7bd2d314d127bba8ea93e8aa01de0845 GIT binary patch literal 59084 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 gvT@w*0M|;(`oV}RQWLRkszv!Y`Z3zP` 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 +#include +#include +#include +#include +#include + +//! [0] +#include "appmodel.h" + +int main(int argc, char *argv[]) +{ + QLoggingCategory::setFilterRules("wapp.*.debug=false"); + QGuiApplication application(argc, argv); + + qmlRegisterType("WeatherInfo", 1, 0, "WeatherData"); + qmlRegisterType("WeatherInfo", 1, 0, "AppModel"); + +//! [0] + qRegisterMetaType(); +//! [1] + const QString mainQmlApp = QStringLiteral("qrc:///weatherinfo.qml"); + QQuickView view; + view.setSource(QUrl(mainQmlApp)); + view.setResizeMode(QQuickView::SizeRootObjectToView); + + QObject::connect(view.engine(), SIGNAL(quit()), qApp, SLOT(quit())); + view.setGeometry(QRect(100, 100, 360, 640)); + view.show(); + return application.exec(); +} +//! [1] diff --git a/examples/positioning/weatherinfo/weatherinfo.pro b/examples/positioning/weatherinfo/weatherinfo.pro new file mode 100644 index 0000000..e2b2102 --- /dev/null +++ b/examples/positioning/weatherinfo/weatherinfo.pro @@ -0,0 +1,21 @@ +TEMPLATE = app +TARGET = weatherinfo + +QT += core network positioning qml quick + +SOURCES += main.cpp \ + appmodel.cpp + +OTHER_FILES += weatherinfo.qml \ + components/WeatherIcon.qml \ + components/ForecastIcon.qml \ + components/BigForecastIcon.qml \ + icons/* + + +RESOURCES += weatherinfo.qrc + +HEADERS += appmodel.h + +target.path = $$[QT_INSTALL_EXAMPLES]/positioning/weatherinfo +INSTALLS += target diff --git a/examples/positioning/weatherinfo/weatherinfo.qml b/examples/positioning/weatherinfo/weatherinfo.qml new file mode 100644 index 0000000..730ae75 --- /dev/null +++ b/examples/positioning/weatherinfo/weatherinfo.qml @@ -0,0 +1,240 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.0 +import "components" +//! [0] +import WeatherInfo 1.0 + +Item { + id: window +//! [0] + width: 360 + height: 640 + + state: "loading" + + states: [ + State { + name: "loading" + PropertyChanges { target: main; opacity: 0 } + PropertyChanges { target: wait; opacity: 1 } + }, + State { + name: "ready" + PropertyChanges { target: main; opacity: 1 } + PropertyChanges { target: wait; opacity: 0 } + } + ] +//! [1] + AppModel { + id: model + onReadyChanged: { + if (model.ready) + window.state = "ready" + else + window.state = "loading" + } + } +//! [1] + Item { + id: wait + anchors.fill: parent + + Text { + text: "Loading weather data..." + anchors.centerIn: parent + font.pointSize: 18 + } + } + + Item { + id: main + anchors.fill: parent + + Column { + spacing: 6 + + anchors { + fill: parent + topMargin: 6; bottomMargin: 6; leftMargin: 6; rightMargin: 6 + } + + Rectangle { + width: parent.width + height: 25 + color: "lightgrey" + + Text { + text: (model.hasValidCity ? model.city : "Unknown location") + (model.useGps ? " (GPS)" : "") + anchors.fill: parent + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignVCenter + } + + MouseArea { + anchors.fill: parent + onClicked: { + if (model.useGps) { + model.useGps = false + model.city = "Brisbane" + } else { + switch (model.city) { + case "Brisbane": + model.city = "Oslo" + break + case "Oslo": + model.city = "Helsinki" + break + case "Helsinki": + model.city = "New York" + break + case "New York": + model.useGps = true + break + } + } + } + } + } + +//! [3] + BigForecastIcon { + id: current + + width: main.width -12 + height: 2 * (main.height - 25 - 12) / 3 + + weatherIcon: (model.hasValidWeather + ? model.weather.weatherIcon + : "01d") +//! [3] + topText: (model.hasValidWeather + ? model.weather.temperature + : "??") + bottomText: (model.hasValidWeather + ? model.weather.weatherDescription + : "No weather data") + + MouseArea { + anchors.fill: parent + onClicked: { + model.refreshWeather() + } + } +//! [4] + } +//! [4] + + Row { + id: iconRow + spacing: 6 + + width: main.width - 12 + height: (main.height - 25 - 24) / 3 + + property real iconWidth: iconRow.width / 4 - 10 + property real iconHeight: iconRow.height + + ForecastIcon { + id: forecast1 + width: iconRow.iconWidth + height: iconRow.iconHeight + + topText: (model.hasValidWeather ? + model.forecast[0].dayOfWeek : "??") + bottomText: (model.hasValidWeather ? + model.forecast[0].temperature : "??/??") + weatherIcon: (model.hasValidWeather ? + model.forecast[0].weatherIcon : "01d") + } + ForecastIcon { + id: forecast2 + width: iconRow.iconWidth + height: iconRow.iconHeight + + topText: (model.hasValidWeather ? + model.forecast[1].dayOfWeek : "??") + bottomText: (model.hasValidWeather ? + model.forecast[1].temperature : "??/??") + weatherIcon: (model.hasValidWeather ? + model.forecast[1].weatherIcon : "01d") + } + ForecastIcon { + id: forecast3 + width: iconRow.iconWidth + height: iconRow.iconHeight + + topText: (model.hasValidWeather ? + model.forecast[2].dayOfWeek : "??") + bottomText: (model.hasValidWeather ? + model.forecast[2].temperature : "??/??") + weatherIcon: (model.hasValidWeather ? + model.forecast[2].weatherIcon : "01d") + } + ForecastIcon { + id: forecast4 + width: iconRow.iconWidth + height: iconRow.iconHeight + + topText: (model.hasValidWeather ? + model.forecast[3].dayOfWeek : "??") + bottomText: (model.hasValidWeather ? + model.forecast[3].temperature : "??/??") + weatherIcon: (model.hasValidWeather ? + model.forecast[3].weatherIcon : "01d") + } + + } + } + } +//! [2] +} +//! [2] diff --git a/examples/positioning/weatherinfo/weatherinfo.qrc b/examples/positioning/weatherinfo/weatherinfo.qrc new file mode 100644 index 0000000..7b79dbe --- /dev/null +++ b/examples/positioning/weatherinfo/weatherinfo.qrc @@ -0,0 +1,20 @@ + + + weatherinfo.qml + components/BigForecastIcon.qml + components/ForecastIcon.qml + components/WeatherIcon.qml + icons/weather-few-clouds.png + icons/weather-fog.png + icons/weather-haze.png + icons/weather-icy.png + icons/weather-overcast.png + icons/weather-showers.png + icons/weather-sleet.png + icons/weather-snow.png + icons/weather-storm.png + icons/weather-sunny-very-few-clouds.png + icons/weather-sunny.png + icons/weather-thundershower.png + + diff --git a/include/QtLocation/5.15.8/QtLocation/private/error_messages_p.h b/include/QtLocation/5.15.8/QtLocation/private/error_messages_p.h new file mode 100644 index 0000000..a324afd --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/error_messages_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/declarativemaps/error_messages_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/locationvaluetypehelper_p.h b/include/QtLocation/5.15.8/QtLocation/private/locationvaluetypehelper_p.h new file mode 100644 index 0000000..231185a --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/locationvaluetypehelper_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/declarativemaps/locationvaluetypehelper_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qabstractgeotilecache_p.h b/include/QtLocation/5.15.8/QtLocation/private/qabstractgeotilecache_p.h new file mode 100644 index 0000000..c483a2f --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qabstractgeotilecache_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/maps/qabstractgeotilecache_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qcache3q_p.h b/include/QtLocation/5.15.8/QtLocation/private/qcache3q_p.h new file mode 100644 index 0000000..2f3ebc0 --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qcache3q_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/maps/qcache3q_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qdeclarativecategory_p.h b/include/QtLocation/5.15.8/QtLocation/private/qdeclarativecategory_p.h new file mode 100644 index 0000000..c248e92 --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qdeclarativecategory_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/declarativeplaces/qdeclarativecategory_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qdeclarativecirclemapitem_p.h b/include/QtLocation/5.15.8/QtLocation/private/qdeclarativecirclemapitem_p.h new file mode 100644 index 0000000..78e9551 --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qdeclarativecirclemapitem_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/declarativemaps/qdeclarativecirclemapitem_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qdeclarativecirclemapitem_p_p.h b/include/QtLocation/5.15.8/QtLocation/private/qdeclarativecirclemapitem_p_p.h new file mode 100644 index 0000000..6684d8a --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qdeclarativecirclemapitem_p_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/declarativemaps/qdeclarativecirclemapitem_p_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qdeclarativecontactdetail_p.h b/include/QtLocation/5.15.8/QtLocation/private/qdeclarativecontactdetail_p.h new file mode 100644 index 0000000..fcb4404 --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qdeclarativecontactdetail_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/declarativeplaces/qdeclarativecontactdetail_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qdeclarativegeocodemodel_p.h b/include/QtLocation/5.15.8/QtLocation/private/qdeclarativegeocodemodel_p.h new file mode 100644 index 0000000..f5b5f6d --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qdeclarativegeocodemodel_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/declarativemaps/qdeclarativegeocodemodel_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qdeclarativegeomaneuver_p.h b/include/QtLocation/5.15.8/QtLocation/private/qdeclarativegeomaneuver_p.h new file mode 100644 index 0000000..5c465b2 --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qdeclarativegeomaneuver_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/declarativemaps/qdeclarativegeomaneuver_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qdeclarativegeomap_p.h b/include/QtLocation/5.15.8/QtLocation/private/qdeclarativegeomap_p.h new file mode 100644 index 0000000..aac9d61 --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qdeclarativegeomap_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/declarativemaps/qdeclarativegeomap_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qdeclarativegeomapcopyrightsnotice_p.h b/include/QtLocation/5.15.8/QtLocation/private/qdeclarativegeomapcopyrightsnotice_p.h new file mode 100644 index 0000000..d2b8ad5 --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qdeclarativegeomapcopyrightsnotice_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/declarativemaps/qdeclarativegeomapcopyrightsnotice_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qdeclarativegeomapitembase_p.h b/include/QtLocation/5.15.8/QtLocation/private/qdeclarativegeomapitembase_p.h new file mode 100644 index 0000000..4e7f2cc --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qdeclarativegeomapitembase_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/declarativemaps/qdeclarativegeomapitembase_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qdeclarativegeomapitemgroup_p.h b/include/QtLocation/5.15.8/QtLocation/private/qdeclarativegeomapitemgroup_p.h new file mode 100644 index 0000000..6eaad94 --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qdeclarativegeomapitemgroup_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/declarativemaps/qdeclarativegeomapitemgroup_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qdeclarativegeomapitemtransitionmanager_p.h b/include/QtLocation/5.15.8/QtLocation/private/qdeclarativegeomapitemtransitionmanager_p.h new file mode 100644 index 0000000..cdb3df3 --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qdeclarativegeomapitemtransitionmanager_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/declarativemaps/qdeclarativegeomapitemtransitionmanager_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qdeclarativegeomapitemutils_p.h b/include/QtLocation/5.15.8/QtLocation/private/qdeclarativegeomapitemutils_p.h new file mode 100644 index 0000000..318ba5b --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qdeclarativegeomapitemutils_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/declarativemaps/qdeclarativegeomapitemutils_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qdeclarativegeomapitemview_p.h b/include/QtLocation/5.15.8/QtLocation/private/qdeclarativegeomapitemview_p.h new file mode 100644 index 0000000..2b4c7b7 --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qdeclarativegeomapitemview_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/declarativemaps/qdeclarativegeomapitemview_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qdeclarativegeomapparameter_p.h b/include/QtLocation/5.15.8/QtLocation/private/qdeclarativegeomapparameter_p.h new file mode 100644 index 0000000..3c13672 --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qdeclarativegeomapparameter_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/declarativemaps/qdeclarativegeomapparameter_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qdeclarativegeomapquickitem_p.h b/include/QtLocation/5.15.8/QtLocation/private/qdeclarativegeomapquickitem_p.h new file mode 100644 index 0000000..8a09296 --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qdeclarativegeomapquickitem_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/declarativemaps/qdeclarativegeomapquickitem_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qdeclarativegeomaptype_p.h b/include/QtLocation/5.15.8/QtLocation/private/qdeclarativegeomaptype_p.h new file mode 100644 index 0000000..7091377 --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qdeclarativegeomaptype_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/declarativemaps/qdeclarativegeomaptype_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qdeclarativegeoroute_p.h b/include/QtLocation/5.15.8/QtLocation/private/qdeclarativegeoroute_p.h new file mode 100644 index 0000000..eea7f78 --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qdeclarativegeoroute_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/declarativemaps/qdeclarativegeoroute_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qdeclarativegeoroutemodel_p.h b/include/QtLocation/5.15.8/QtLocation/private/qdeclarativegeoroutemodel_p.h new file mode 100644 index 0000000..137ec32 --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qdeclarativegeoroutemodel_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/declarativemaps/qdeclarativegeoroutemodel_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qdeclarativegeoroutesegment_p.h b/include/QtLocation/5.15.8/QtLocation/private/qdeclarativegeoroutesegment_p.h new file mode 100644 index 0000000..7b5811f --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qdeclarativegeoroutesegment_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/declarativemaps/qdeclarativegeoroutesegment_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qdeclarativegeoserviceprovider_p.h b/include/QtLocation/5.15.8/QtLocation/private/qdeclarativegeoserviceprovider_p.h new file mode 100644 index 0000000..cce0215 --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qdeclarativegeoserviceprovider_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/declarativemaps/qdeclarativegeoserviceprovider_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qdeclarativenavigator_p.h b/include/QtLocation/5.15.8/QtLocation/private/qdeclarativenavigator_p.h new file mode 100644 index 0000000..62409a4 --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qdeclarativenavigator_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/labs/qdeclarativenavigator_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qdeclarativenavigator_p_p.h b/include/QtLocation/5.15.8/QtLocation/private/qdeclarativenavigator_p_p.h new file mode 100644 index 0000000..00dc4b9 --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qdeclarativenavigator_p_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/labs/qdeclarativenavigator_p_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qdeclarativeperiod_p.h b/include/QtLocation/5.15.8/QtLocation/private/qdeclarativeperiod_p.h new file mode 100644 index 0000000..df1f3b2 --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qdeclarativeperiod_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/declarativeplaces/qdeclarativeperiod_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qdeclarativeplace_p.h b/include/QtLocation/5.15.8/QtLocation/private/qdeclarativeplace_p.h new file mode 100644 index 0000000..027d4f1 --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qdeclarativeplace_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/declarativeplaces/qdeclarativeplace_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qdeclarativeplaceattribute_p.h b/include/QtLocation/5.15.8/QtLocation/private/qdeclarativeplaceattribute_p.h new file mode 100644 index 0000000..e39588a --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qdeclarativeplaceattribute_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/declarativeplaces/qdeclarativeplaceattribute_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qdeclarativeplacecontentmodel_p.h b/include/QtLocation/5.15.8/QtLocation/private/qdeclarativeplacecontentmodel_p.h new file mode 100644 index 0000000..2eda492 --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qdeclarativeplacecontentmodel_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/declarativeplaces/qdeclarativeplacecontentmodel_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qdeclarativeplaceeditorialmodel_p.h b/include/QtLocation/5.15.8/QtLocation/private/qdeclarativeplaceeditorialmodel_p.h new file mode 100644 index 0000000..a97da4b --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qdeclarativeplaceeditorialmodel_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/declarativeplaces/qdeclarativeplaceeditorialmodel_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qdeclarativeplaceicon_p.h b/include/QtLocation/5.15.8/QtLocation/private/qdeclarativeplaceicon_p.h new file mode 100644 index 0000000..a3522c6 --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qdeclarativeplaceicon_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/declarativeplaces/qdeclarativeplaceicon_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qdeclarativeplaceimagemodel_p.h b/include/QtLocation/5.15.8/QtLocation/private/qdeclarativeplaceimagemodel_p.h new file mode 100644 index 0000000..169a543 --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qdeclarativeplaceimagemodel_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/declarativeplaces/qdeclarativeplaceimagemodel_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qdeclarativeplaceuser_p.h b/include/QtLocation/5.15.8/QtLocation/private/qdeclarativeplaceuser_p.h new file mode 100644 index 0000000..5633b5f --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qdeclarativeplaceuser_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/declarativeplaces/qdeclarativeplaceuser_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qdeclarativepolygonmapitem_p.h b/include/QtLocation/5.15.8/QtLocation/private/qdeclarativepolygonmapitem_p.h new file mode 100644 index 0000000..3b850bc --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qdeclarativepolygonmapitem_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/declarativemaps/qdeclarativepolygonmapitem_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qdeclarativepolygonmapitem_p_p.h b/include/QtLocation/5.15.8/QtLocation/private/qdeclarativepolygonmapitem_p_p.h new file mode 100644 index 0000000..e3a6457 --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qdeclarativepolygonmapitem_p_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/declarativemaps/qdeclarativepolygonmapitem_p_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qdeclarativepolylinemapitem_p.h b/include/QtLocation/5.15.8/QtLocation/private/qdeclarativepolylinemapitem_p.h new file mode 100644 index 0000000..c34c4a7 --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qdeclarativepolylinemapitem_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/declarativemaps/qdeclarativepolylinemapitem_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qdeclarativepolylinemapitem_p_p.h b/include/QtLocation/5.15.8/QtLocation/private/qdeclarativepolylinemapitem_p_p.h new file mode 100644 index 0000000..6479fba --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qdeclarativepolylinemapitem_p_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/declarativemaps/qdeclarativepolylinemapitem_p_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qdeclarativeratings_p.h b/include/QtLocation/5.15.8/QtLocation/private/qdeclarativeratings_p.h new file mode 100644 index 0000000..6d4d38b --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qdeclarativeratings_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/declarativeplaces/qdeclarativeratings_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qdeclarativerectanglemapitem_p.h b/include/QtLocation/5.15.8/QtLocation/private/qdeclarativerectanglemapitem_p.h new file mode 100644 index 0000000..8fab63a --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qdeclarativerectanglemapitem_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/declarativemaps/qdeclarativerectanglemapitem_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qdeclarativerectanglemapitem_p_p.h b/include/QtLocation/5.15.8/QtLocation/private/qdeclarativerectanglemapitem_p_p.h new file mode 100644 index 0000000..52fe2a5 --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qdeclarativerectanglemapitem_p_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/declarativemaps/qdeclarativerectanglemapitem_p_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qdeclarativereviewmodel_p.h b/include/QtLocation/5.15.8/QtLocation/private/qdeclarativereviewmodel_p.h new file mode 100644 index 0000000..33dbb08 --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qdeclarativereviewmodel_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/declarativeplaces/qdeclarativereviewmodel_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qdeclarativeroutemapitem_p.h b/include/QtLocation/5.15.8/QtLocation/private/qdeclarativeroutemapitem_p.h new file mode 100644 index 0000000..c9107a1 --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qdeclarativeroutemapitem_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/declarativemaps/qdeclarativeroutemapitem_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qdeclarativesearchmodelbase_p.h b/include/QtLocation/5.15.8/QtLocation/private/qdeclarativesearchmodelbase_p.h new file mode 100644 index 0000000..fae2832 --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qdeclarativesearchmodelbase_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/declarativeplaces/qdeclarativesearchmodelbase_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qdeclarativesearchresultmodel_p.h b/include/QtLocation/5.15.8/QtLocation/private/qdeclarativesearchresultmodel_p.h new file mode 100644 index 0000000..0401828 --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qdeclarativesearchresultmodel_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/declarativeplaces/qdeclarativesearchresultmodel_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qdeclarativesearchsuggestionmodel_p.h b/include/QtLocation/5.15.8/QtLocation/private/qdeclarativesearchsuggestionmodel_p.h new file mode 100644 index 0000000..26275c5 --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qdeclarativesearchsuggestionmodel_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/declarativeplaces/qdeclarativesearchsuggestionmodel_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qdeclarativesupplier_p.h b/include/QtLocation/5.15.8/QtLocation/private/qdeclarativesupplier_p.h new file mode 100644 index 0000000..ef78d04 --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qdeclarativesupplier_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/declarativeplaces/qdeclarativesupplier_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qdeclarativesupportedcategoriesmodel_p.h b/include/QtLocation/5.15.8/QtLocation/private/qdeclarativesupportedcategoriesmodel_p.h new file mode 100644 index 0000000..3f7f6ec --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qdeclarativesupportedcategoriesmodel_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/declarativeplaces/qdeclarativesupportedcategoriesmodel_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qgeocameracapabilities_p.h b/include/QtLocation/5.15.8/QtLocation/private/qgeocameracapabilities_p.h new file mode 100644 index 0000000..c237979 --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qgeocameracapabilities_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/maps/qgeocameracapabilities_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qgeocameradata_p.h b/include/QtLocation/5.15.8/QtLocation/private/qgeocameradata_p.h new file mode 100644 index 0000000..0639753 --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qgeocameradata_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/maps/qgeocameradata_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qgeocameratiles_p.h b/include/QtLocation/5.15.8/QtLocation/private/qgeocameratiles_p.h new file mode 100644 index 0000000..80f6aaf --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qgeocameratiles_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/maps/qgeocameratiles_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qgeocameratiles_p_p.h b/include/QtLocation/5.15.8/QtLocation/private/qgeocameratiles_p_p.h new file mode 100644 index 0000000..72a905e --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qgeocameratiles_p_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/maps/qgeocameratiles_p_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qgeocodereply_p.h b/include/QtLocation/5.15.8/QtLocation/private/qgeocodereply_p.h new file mode 100644 index 0000000..2524050 --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qgeocodereply_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/maps/qgeocodereply_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qgeocodingmanager_p.h b/include/QtLocation/5.15.8/QtLocation/private/qgeocodingmanager_p.h new file mode 100644 index 0000000..043ed36 --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qgeocodingmanager_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/maps/qgeocodingmanager_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qgeocodingmanagerengine_p.h b/include/QtLocation/5.15.8/QtLocation/private/qgeocodingmanagerengine_p.h new file mode 100644 index 0000000..5ce24ee --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qgeocodingmanagerengine_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/maps/qgeocodingmanagerengine_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qgeofiletilecache_p.h b/include/QtLocation/5.15.8/QtLocation/private/qgeofiletilecache_p.h new file mode 100644 index 0000000..9fbe35a --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qgeofiletilecache_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/maps/qgeofiletilecache_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qgeojson_p.h b/include/QtLocation/5.15.8/QtLocation/private/qgeojson_p.h new file mode 100644 index 0000000..f631d7f --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qgeojson_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/labs/qgeojson_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qgeomaneuver_p.h b/include/QtLocation/5.15.8/QtLocation/private/qgeomaneuver_p.h new file mode 100644 index 0000000..cd5008e --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qgeomaneuver_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/maps/qgeomaneuver_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qgeomap_p.h b/include/QtLocation/5.15.8/QtLocation/private/qgeomap_p.h new file mode 100644 index 0000000..b7327e4 --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qgeomap_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/maps/qgeomap_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qgeomap_p_p.h b/include/QtLocation/5.15.8/QtLocation/private/qgeomap_p_p.h new file mode 100644 index 0000000..3407c69 --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qgeomap_p_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/maps/qgeomap_p_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qgeomapitemgeometry_p.h b/include/QtLocation/5.15.8/QtLocation/private/qgeomapitemgeometry_p.h new file mode 100644 index 0000000..7b50bc0 --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qgeomapitemgeometry_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/declarativemaps/qgeomapitemgeometry_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qgeomapobject_p.h b/include/QtLocation/5.15.8/QtLocation/private/qgeomapobject_p.h new file mode 100644 index 0000000..88e6e7b --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qgeomapobject_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/declarativemaps/qgeomapobject_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qgeomapobject_p_p.h b/include/QtLocation/5.15.8/QtLocation/private/qgeomapobject_p_p.h new file mode 100644 index 0000000..7624327 --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qgeomapobject_p_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/declarativemaps/qgeomapobject_p_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qgeomapobjectqsgsupport_p.h b/include/QtLocation/5.15.8/QtLocation/private/qgeomapobjectqsgsupport_p.h new file mode 100644 index 0000000..4d3fdd8 --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qgeomapobjectqsgsupport_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/labs/qsg/qgeomapobjectqsgsupport_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qgeomapparameter_p.h b/include/QtLocation/5.15.8/QtLocation/private/qgeomapparameter_p.h new file mode 100644 index 0000000..007128a --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qgeomapparameter_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/maps/qgeomapparameter_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qgeomappingmanager_p.h b/include/QtLocation/5.15.8/QtLocation/private/qgeomappingmanager_p.h new file mode 100644 index 0000000..9b03ed7 --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qgeomappingmanager_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/maps/qgeomappingmanager_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qgeomappingmanager_p_p.h b/include/QtLocation/5.15.8/QtLocation/private/qgeomappingmanager_p_p.h new file mode 100644 index 0000000..a9d965a --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qgeomappingmanager_p_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/maps/qgeomappingmanager_p_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qgeomappingmanagerengine_p.h b/include/QtLocation/5.15.8/QtLocation/private/qgeomappingmanagerengine_p.h new file mode 100644 index 0000000..a1dd77b --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qgeomappingmanagerengine_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/maps/qgeomappingmanagerengine_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qgeomappingmanagerengine_p_p.h b/include/QtLocation/5.15.8/QtLocation/private/qgeomappingmanagerengine_p_p.h new file mode 100644 index 0000000..7d99d28 --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qgeomappingmanagerengine_p_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/maps/qgeomappingmanagerengine_p_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qgeomaptype_p.h b/include/QtLocation/5.15.8/QtLocation/private/qgeomaptype_p.h new file mode 100644 index 0000000..d6f8348 --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qgeomaptype_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/maps/qgeomaptype_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qgeomaptype_p_p.h b/include/QtLocation/5.15.8/QtLocation/private/qgeomaptype_p_p.h new file mode 100644 index 0000000..93fb3ba --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qgeomaptype_p_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/maps/qgeomaptype_p_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qgeoprojection_p.h b/include/QtLocation/5.15.8/QtLocation/private/qgeoprojection_p.h new file mode 100644 index 0000000..3a8abf9 --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qgeoprojection_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/maps/qgeoprojection_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qgeoroute_p.h b/include/QtLocation/5.15.8/QtLocation/private/qgeoroute_p.h new file mode 100644 index 0000000..aed5df1 --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qgeoroute_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/maps/qgeoroute_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qgeorouteparser_p.h b/include/QtLocation/5.15.8/QtLocation/private/qgeorouteparser_p.h new file mode 100644 index 0000000..75a676d --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qgeorouteparser_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/maps/qgeorouteparser_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qgeorouteparser_p_p.h b/include/QtLocation/5.15.8/QtLocation/private/qgeorouteparser_p_p.h new file mode 100644 index 0000000..a40608f --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qgeorouteparser_p_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/maps/qgeorouteparser_p_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qgeorouteparserosrmv4_p.h b/include/QtLocation/5.15.8/QtLocation/private/qgeorouteparserosrmv4_p.h new file mode 100644 index 0000000..0882302 --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qgeorouteparserosrmv4_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/maps/qgeorouteparserosrmv4_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qgeorouteparserosrmv5_p.h b/include/QtLocation/5.15.8/QtLocation/private/qgeorouteparserosrmv5_p.h new file mode 100644 index 0000000..d16d23f --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qgeorouteparserosrmv5_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/maps/qgeorouteparserosrmv5_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qgeoroutereply_p.h b/include/QtLocation/5.15.8/QtLocation/private/qgeoroutereply_p.h new file mode 100644 index 0000000..73e5640 --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qgeoroutereply_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/maps/qgeoroutereply_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qgeorouterequest_p.h b/include/QtLocation/5.15.8/QtLocation/private/qgeorouterequest_p.h new file mode 100644 index 0000000..00f7941 --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qgeorouterequest_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/maps/qgeorouterequest_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qgeoroutesegment_p.h b/include/QtLocation/5.15.8/QtLocation/private/qgeoroutesegment_p.h new file mode 100644 index 0000000..77cc84a --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qgeoroutesegment_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/maps/qgeoroutesegment_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qgeoroutingmanager_p.h b/include/QtLocation/5.15.8/QtLocation/private/qgeoroutingmanager_p.h new file mode 100644 index 0000000..1824922 --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qgeoroutingmanager_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/maps/qgeoroutingmanager_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qgeoroutingmanagerengine_p.h b/include/QtLocation/5.15.8/QtLocation/private/qgeoroutingmanagerengine_p.h new file mode 100644 index 0000000..6f11de9 --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qgeoroutingmanagerengine_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/maps/qgeoroutingmanagerengine_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qgeoserviceprovider_p.h b/include/QtLocation/5.15.8/QtLocation/private/qgeoserviceprovider_p.h new file mode 100644 index 0000000..88f9999 --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qgeoserviceprovider_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/maps/qgeoserviceprovider_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qgeosimplify_p.h b/include/QtLocation/5.15.8/QtLocation/private/qgeosimplify_p.h new file mode 100644 index 0000000..f3e0951 --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qgeosimplify_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/declarativemaps/qgeosimplify_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qgeotiledmap_p.h b/include/QtLocation/5.15.8/QtLocation/private/qgeotiledmap_p.h new file mode 100644 index 0000000..718b0a3 --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qgeotiledmap_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/maps/qgeotiledmap_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qgeotiledmap_p_p.h b/include/QtLocation/5.15.8/QtLocation/private/qgeotiledmap_p_p.h new file mode 100644 index 0000000..10bf8bb --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qgeotiledmap_p_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/maps/qgeotiledmap_p_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qgeotiledmaplabs_p.h b/include/QtLocation/5.15.8/QtLocation/private/qgeotiledmaplabs_p.h new file mode 100644 index 0000000..2da4a5d --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qgeotiledmaplabs_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/labs/qgeotiledmaplabs_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qgeotiledmappingmanagerengine_p.h b/include/QtLocation/5.15.8/QtLocation/private/qgeotiledmappingmanagerengine_p.h new file mode 100644 index 0000000..8cda0fe --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qgeotiledmappingmanagerengine_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/maps/qgeotiledmappingmanagerengine_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qgeotiledmappingmanagerengine_p_p.h b/include/QtLocation/5.15.8/QtLocation/private/qgeotiledmappingmanagerengine_p_p.h new file mode 100644 index 0000000..1ad7d38 --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qgeotiledmappingmanagerengine_p_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/maps/qgeotiledmappingmanagerengine_p_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qgeotiledmapreply_p.h b/include/QtLocation/5.15.8/QtLocation/private/qgeotiledmapreply_p.h new file mode 100644 index 0000000..90e0c73 --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qgeotiledmapreply_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/maps/qgeotiledmapreply_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qgeotiledmapreply_p_p.h b/include/QtLocation/5.15.8/QtLocation/private/qgeotiledmapreply_p_p.h new file mode 100644 index 0000000..6563bf2 --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qgeotiledmapreply_p_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/maps/qgeotiledmapreply_p_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qgeotiledmapscene_p.h b/include/QtLocation/5.15.8/QtLocation/private/qgeotiledmapscene_p.h new file mode 100644 index 0000000..edf39c9 --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qgeotiledmapscene_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/maps/qgeotiledmapscene_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qgeotiledmapscene_p_p.h b/include/QtLocation/5.15.8/QtLocation/private/qgeotiledmapscene_p_p.h new file mode 100644 index 0000000..2ca92be --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qgeotiledmapscene_p_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/maps/qgeotiledmapscene_p_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qgeotilefetcher_p.h b/include/QtLocation/5.15.8/QtLocation/private/qgeotilefetcher_p.h new file mode 100644 index 0000000..5e921b5 --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qgeotilefetcher_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/maps/qgeotilefetcher_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qgeotilefetcher_p_p.h b/include/QtLocation/5.15.8/QtLocation/private/qgeotilefetcher_p_p.h new file mode 100644 index 0000000..c183b71 --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qgeotilefetcher_p_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/maps/qgeotilefetcher_p_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qgeotilerequestmanager_p.h b/include/QtLocation/5.15.8/QtLocation/private/qgeotilerequestmanager_p.h new file mode 100644 index 0000000..8872823 --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qgeotilerequestmanager_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/maps/qgeotilerequestmanager_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qgeotilespec_p.h b/include/QtLocation/5.15.8/QtLocation/private/qgeotilespec_p.h new file mode 100644 index 0000000..7737cc7 --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qgeotilespec_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/maps/qgeotilespec_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qgeotilespec_p_p.h b/include/QtLocation/5.15.8/QtLocation/private/qgeotilespec_p_p.h new file mode 100644 index 0000000..8f318b6 --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qgeotilespec_p_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/maps/qgeotilespec_p_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qlocationglobal_p.h b/include/QtLocation/5.15.8/QtLocation/private/qlocationglobal_p.h new file mode 100644 index 0000000..0592935 --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qlocationglobal_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/qlocationglobal_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qmapcircleobject_p.h b/include/QtLocation/5.15.8/QtLocation/private/qmapcircleobject_p.h new file mode 100644 index 0000000..a6ad414 --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qmapcircleobject_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/labs/qmapcircleobject_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qmapcircleobject_p_p.h b/include/QtLocation/5.15.8/QtLocation/private/qmapcircleobject_p_p.h new file mode 100644 index 0000000..cce19aa --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qmapcircleobject_p_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/labs/qmapcircleobject_p_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qmapcircleobjectqsg_p_p.h b/include/QtLocation/5.15.8/QtLocation/private/qmapcircleobjectqsg_p_p.h new file mode 100644 index 0000000..4978925 --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qmapcircleobjectqsg_p_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/labs/qsg/qmapcircleobjectqsg_p_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qmapiconobject_p.h b/include/QtLocation/5.15.8/QtLocation/private/qmapiconobject_p.h new file mode 100644 index 0000000..72676e9 --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qmapiconobject_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/labs/qmapiconobject_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qmapiconobject_p_p.h b/include/QtLocation/5.15.8/QtLocation/private/qmapiconobject_p_p.h new file mode 100644 index 0000000..6b96f1b --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qmapiconobject_p_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/labs/qmapiconobject_p_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qmapiconobjectqsg_p_p.h b/include/QtLocation/5.15.8/QtLocation/private/qmapiconobjectqsg_p_p.h new file mode 100644 index 0000000..e687bb9 --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qmapiconobjectqsg_p_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/labs/qsg/qmapiconobjectqsg_p_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qmapobjectview_p.h b/include/QtLocation/5.15.8/QtLocation/private/qmapobjectview_p.h new file mode 100644 index 0000000..5a7ab25 --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qmapobjectview_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/labs/qmapobjectview_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qmapobjectview_p_p.h b/include/QtLocation/5.15.8/QtLocation/private/qmapobjectview_p_p.h new file mode 100644 index 0000000..3576f41 --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qmapobjectview_p_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/labs/qmapobjectview_p_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qmappolygonobject_p.h b/include/QtLocation/5.15.8/QtLocation/private/qmappolygonobject_p.h new file mode 100644 index 0000000..035e405 --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qmappolygonobject_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/labs/qmappolygonobject_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qmappolygonobject_p_p.h b/include/QtLocation/5.15.8/QtLocation/private/qmappolygonobject_p_p.h new file mode 100644 index 0000000..21925a0 --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qmappolygonobject_p_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/labs/qmappolygonobject_p_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qmappolygonobjectqsg_p_p.h b/include/QtLocation/5.15.8/QtLocation/private/qmappolygonobjectqsg_p_p.h new file mode 100644 index 0000000..4cdd75a --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qmappolygonobjectqsg_p_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/labs/qsg/qmappolygonobjectqsg_p_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qmappolylineobject_p.h b/include/QtLocation/5.15.8/QtLocation/private/qmappolylineobject_p.h new file mode 100644 index 0000000..7caa6c5 --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qmappolylineobject_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/labs/qmappolylineobject_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qmappolylineobject_p_p.h b/include/QtLocation/5.15.8/QtLocation/private/qmappolylineobject_p_p.h new file mode 100644 index 0000000..b036d83 --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qmappolylineobject_p_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/labs/qmappolylineobject_p_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qmappolylineobjectqsg_p_p.h b/include/QtLocation/5.15.8/QtLocation/private/qmappolylineobjectqsg_p_p.h new file mode 100644 index 0000000..3942003 --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qmappolylineobjectqsg_p_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/labs/qsg/qmappolylineobjectqsg_p_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qmaprouteobject_p.h b/include/QtLocation/5.15.8/QtLocation/private/qmaprouteobject_p.h new file mode 100644 index 0000000..220827e --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qmaprouteobject_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/labs/qmaprouteobject_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qmaprouteobject_p_p.h b/include/QtLocation/5.15.8/QtLocation/private/qmaprouteobject_p_p.h new file mode 100644 index 0000000..092ddeb --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qmaprouteobject_p_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/labs/qmaprouteobject_p_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qmaprouteobjectqsg_p_p.h b/include/QtLocation/5.15.8/QtLocation/private/qmaprouteobjectqsg_p_p.h new file mode 100644 index 0000000..e3bed34 --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qmaprouteobjectqsg_p_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/labs/qsg/qmaprouteobjectqsg_p_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qnavigationmanager_p.h b/include/QtLocation/5.15.8/QtLocation/private/qnavigationmanager_p.h new file mode 100644 index 0000000..f919f75 --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qnavigationmanager_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/maps/qnavigationmanager_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qnavigationmanagerengine_p.h b/include/QtLocation/5.15.8/QtLocation/private/qnavigationmanagerengine_p.h new file mode 100644 index 0000000..be6ece5 --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qnavigationmanagerengine_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/maps/qnavigationmanagerengine_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qparameterizableobject_p.h b/include/QtLocation/5.15.8/QtLocation/private/qparameterizableobject_p.h new file mode 100644 index 0000000..906804f --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qparameterizableobject_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/declarativemaps/qparameterizableobject_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qplace_p.h b/include/QtLocation/5.15.8/QtLocation/private/qplace_p.h new file mode 100644 index 0000000..1aabde7 --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qplace_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/places/qplace_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qplaceattribute_p.h b/include/QtLocation/5.15.8/QtLocation/private/qplaceattribute_p.h new file mode 100644 index 0000000..ce8bd7c --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qplaceattribute_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/places/qplaceattribute_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qplacecategory_p.h b/include/QtLocation/5.15.8/QtLocation/private/qplacecategory_p.h new file mode 100644 index 0000000..ed94a62 --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qplacecategory_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/places/qplacecategory_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qplacecontactdetail_p.h b/include/QtLocation/5.15.8/QtLocation/private/qplacecontactdetail_p.h new file mode 100644 index 0000000..c8833e9 --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qplacecontactdetail_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/places/qplacecontactdetail_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qplacecontent_p.h b/include/QtLocation/5.15.8/QtLocation/private/qplacecontent_p.h new file mode 100644 index 0000000..4ccd7c8 --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qplacecontent_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/places/qplacecontent_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qplacecontentrequest_p.h b/include/QtLocation/5.15.8/QtLocation/private/qplacecontentrequest_p.h new file mode 100644 index 0000000..64ca72d --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qplacecontentrequest_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/places/qplacecontentrequest_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qplaceeditorial_p.h b/include/QtLocation/5.15.8/QtLocation/private/qplaceeditorial_p.h new file mode 100644 index 0000000..c4caf2e --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qplaceeditorial_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/places/qplaceeditorial_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qplaceicon_p.h b/include/QtLocation/5.15.8/QtLocation/private/qplaceicon_p.h new file mode 100644 index 0000000..37a951d --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qplaceicon_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/places/qplaceicon_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qplaceimage_p.h b/include/QtLocation/5.15.8/QtLocation/private/qplaceimage_p.h new file mode 100644 index 0000000..9de1983 --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qplaceimage_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/places/qplaceimage_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qplacemanagerengine_p.h b/include/QtLocation/5.15.8/QtLocation/private/qplacemanagerengine_p.h new file mode 100644 index 0000000..2e1be79 --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qplacemanagerengine_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/places/qplacemanagerengine_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qplaceproposedsearchresult_p.h b/include/QtLocation/5.15.8/QtLocation/private/qplaceproposedsearchresult_p.h new file mode 100644 index 0000000..b9e81b0 --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qplaceproposedsearchresult_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/places/qplaceproposedsearchresult_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qplaceratings_p.h b/include/QtLocation/5.15.8/QtLocation/private/qplaceratings_p.h new file mode 100644 index 0000000..3904253 --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qplaceratings_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/places/qplaceratings_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qplacereply_p.h b/include/QtLocation/5.15.8/QtLocation/private/qplacereply_p.h new file mode 100644 index 0000000..fb0e273 --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qplacereply_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/places/qplacereply_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qplaceresult_p.h b/include/QtLocation/5.15.8/QtLocation/private/qplaceresult_p.h new file mode 100644 index 0000000..94132fe --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qplaceresult_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/places/qplaceresult_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qplacereview_p.h b/include/QtLocation/5.15.8/QtLocation/private/qplacereview_p.h new file mode 100644 index 0000000..94552a3 --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qplacereview_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/places/qplacereview_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qplacesearchrequest_p.h b/include/QtLocation/5.15.8/QtLocation/private/qplacesearchrequest_p.h new file mode 100644 index 0000000..84a2197 --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qplacesearchrequest_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/places/qplacesearchrequest_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qplacesearchresult_p.h b/include/QtLocation/5.15.8/QtLocation/private/qplacesearchresult_p.h new file mode 100644 index 0000000..1b7404e --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qplacesearchresult_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/places/qplacesearchresult_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qplacesupplier_p.h b/include/QtLocation/5.15.8/QtLocation/private/qplacesupplier_p.h new file mode 100644 index 0000000..718cc74 --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qplacesupplier_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/places/qplacesupplier_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qplaceuser_p.h b/include/QtLocation/5.15.8/QtLocation/private/qplaceuser_p.h new file mode 100644 index 0000000..0dc4089 --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qplaceuser_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/places/qplaceuser_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qqsgmapobject_p.h b/include/QtLocation/5.15.8/QtLocation/private/qqsgmapobject_p.h new file mode 100644 index 0000000..b95fee4 --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qqsgmapobject_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/labs/qsg/qqsgmapobject_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/qquickgeomapgesturearea_p.h b/include/QtLocation/5.15.8/QtLocation/private/qquickgeomapgesturearea_p.h new file mode 100644 index 0000000..04e7e71 --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/qquickgeomapgesturearea_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/declarativemaps/qquickgeomapgesturearea_p.h" diff --git a/include/QtLocation/5.15.8/QtLocation/private/unsupportedreplies_p.h b/include/QtLocation/5.15.8/QtLocation/private/unsupportedreplies_p.h new file mode 100644 index 0000000..396fcf9 --- /dev/null +++ b/include/QtLocation/5.15.8/QtLocation/private/unsupportedreplies_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/places/unsupportedreplies_p.h" diff --git a/include/QtLocation/QGeoCodeReply b/include/QtLocation/QGeoCodeReply new file mode 100644 index 0000000..14193f8 --- /dev/null +++ b/include/QtLocation/QGeoCodeReply @@ -0,0 +1 @@ +#include "qgeocodereply.h" diff --git a/include/QtLocation/QGeoCodingManager b/include/QtLocation/QGeoCodingManager new file mode 100644 index 0000000..ed7d721 --- /dev/null +++ b/include/QtLocation/QGeoCodingManager @@ -0,0 +1 @@ +#include "qgeocodingmanager.h" diff --git a/include/QtLocation/QGeoCodingManagerEngine b/include/QtLocation/QGeoCodingManagerEngine new file mode 100644 index 0000000..69303d2 --- /dev/null +++ b/include/QtLocation/QGeoCodingManagerEngine @@ -0,0 +1 @@ +#include "qgeocodingmanagerengine.h" diff --git a/include/QtLocation/QGeoManeuver b/include/QtLocation/QGeoManeuver new file mode 100644 index 0000000..a3ff6a5 --- /dev/null +++ b/include/QtLocation/QGeoManeuver @@ -0,0 +1 @@ +#include "qgeomaneuver.h" diff --git a/include/QtLocation/QGeoRoute b/include/QtLocation/QGeoRoute new file mode 100644 index 0000000..fd6690a --- /dev/null +++ b/include/QtLocation/QGeoRoute @@ -0,0 +1 @@ +#include "qgeoroute.h" diff --git a/include/QtLocation/QGeoRouteLeg b/include/QtLocation/QGeoRouteLeg new file mode 100644 index 0000000..fd6690a --- /dev/null +++ b/include/QtLocation/QGeoRouteLeg @@ -0,0 +1 @@ +#include "qgeoroute.h" diff --git a/include/QtLocation/QGeoRouteReply b/include/QtLocation/QGeoRouteReply new file mode 100644 index 0000000..6109d67 --- /dev/null +++ b/include/QtLocation/QGeoRouteReply @@ -0,0 +1 @@ +#include "qgeoroutereply.h" diff --git a/include/QtLocation/QGeoRouteRequest b/include/QtLocation/QGeoRouteRequest new file mode 100644 index 0000000..221969b --- /dev/null +++ b/include/QtLocation/QGeoRouteRequest @@ -0,0 +1 @@ +#include "qgeorouterequest.h" diff --git a/include/QtLocation/QGeoRouteSegment b/include/QtLocation/QGeoRouteSegment new file mode 100644 index 0000000..74590d6 --- /dev/null +++ b/include/QtLocation/QGeoRouteSegment @@ -0,0 +1 @@ +#include "qgeoroutesegment.h" diff --git a/include/QtLocation/QGeoRoutingManager b/include/QtLocation/QGeoRoutingManager new file mode 100644 index 0000000..76e5224 --- /dev/null +++ b/include/QtLocation/QGeoRoutingManager @@ -0,0 +1 @@ +#include "qgeoroutingmanager.h" diff --git a/include/QtLocation/QGeoRoutingManagerEngine b/include/QtLocation/QGeoRoutingManagerEngine new file mode 100644 index 0000000..300a668 --- /dev/null +++ b/include/QtLocation/QGeoRoutingManagerEngine @@ -0,0 +1 @@ +#include "qgeoroutingmanagerengine.h" diff --git a/include/QtLocation/QGeoServiceProvider b/include/QtLocation/QGeoServiceProvider new file mode 100644 index 0000000..d5b38bc --- /dev/null +++ b/include/QtLocation/QGeoServiceProvider @@ -0,0 +1 @@ +#include "qgeoserviceprovider.h" diff --git a/include/QtLocation/QGeoServiceProviderFactory b/include/QtLocation/QGeoServiceProviderFactory new file mode 100644 index 0000000..9bee8fb --- /dev/null +++ b/include/QtLocation/QGeoServiceProviderFactory @@ -0,0 +1 @@ +#include "qgeoserviceproviderfactory.h" diff --git a/include/QtLocation/QLocation b/include/QtLocation/QLocation new file mode 100644 index 0000000..e433f1e --- /dev/null +++ b/include/QtLocation/QLocation @@ -0,0 +1 @@ +#include "qlocation.h" diff --git a/include/QtLocation/QPlace b/include/QtLocation/QPlace new file mode 100644 index 0000000..51b4bac --- /dev/null +++ b/include/QtLocation/QPlace @@ -0,0 +1 @@ +#include "qplace.h" diff --git a/include/QtLocation/QPlaceAttribute b/include/QtLocation/QPlaceAttribute new file mode 100644 index 0000000..05d36df --- /dev/null +++ b/include/QtLocation/QPlaceAttribute @@ -0,0 +1 @@ +#include "qplaceattribute.h" diff --git a/include/QtLocation/QPlaceCategory b/include/QtLocation/QPlaceCategory new file mode 100644 index 0000000..959738a --- /dev/null +++ b/include/QtLocation/QPlaceCategory @@ -0,0 +1 @@ +#include "qplacecategory.h" diff --git a/include/QtLocation/QPlaceContactDetail b/include/QtLocation/QPlaceContactDetail new file mode 100644 index 0000000..4ff2d2d --- /dev/null +++ b/include/QtLocation/QPlaceContactDetail @@ -0,0 +1 @@ +#include "qplacecontactdetail.h" diff --git a/include/QtLocation/QPlaceContent b/include/QtLocation/QPlaceContent new file mode 100644 index 0000000..7ebb145 --- /dev/null +++ b/include/QtLocation/QPlaceContent @@ -0,0 +1 @@ +#include "qplacecontent.h" diff --git a/include/QtLocation/QPlaceContentReply b/include/QtLocation/QPlaceContentReply new file mode 100644 index 0000000..67fc8a8 --- /dev/null +++ b/include/QtLocation/QPlaceContentReply @@ -0,0 +1 @@ +#include "qplacecontentreply.h" diff --git a/include/QtLocation/QPlaceContentRequest b/include/QtLocation/QPlaceContentRequest new file mode 100644 index 0000000..43459f4 --- /dev/null +++ b/include/QtLocation/QPlaceContentRequest @@ -0,0 +1 @@ +#include "qplacecontentrequest.h" diff --git a/include/QtLocation/QPlaceDetailsReply b/include/QtLocation/QPlaceDetailsReply new file mode 100644 index 0000000..1455310 --- /dev/null +++ b/include/QtLocation/QPlaceDetailsReply @@ -0,0 +1 @@ +#include "qplacedetailsreply.h" diff --git a/include/QtLocation/QPlaceEditorial b/include/QtLocation/QPlaceEditorial new file mode 100644 index 0000000..d1a232a --- /dev/null +++ b/include/QtLocation/QPlaceEditorial @@ -0,0 +1 @@ +#include "qplaceeditorial.h" diff --git a/include/QtLocation/QPlaceIcon b/include/QtLocation/QPlaceIcon new file mode 100644 index 0000000..fae7a4e --- /dev/null +++ b/include/QtLocation/QPlaceIcon @@ -0,0 +1 @@ +#include "qplaceicon.h" diff --git a/include/QtLocation/QPlaceIdReply b/include/QtLocation/QPlaceIdReply new file mode 100644 index 0000000..8709b65 --- /dev/null +++ b/include/QtLocation/QPlaceIdReply @@ -0,0 +1 @@ +#include "qplaceidreply.h" diff --git a/include/QtLocation/QPlaceImage b/include/QtLocation/QPlaceImage new file mode 100644 index 0000000..606c306 --- /dev/null +++ b/include/QtLocation/QPlaceImage @@ -0,0 +1 @@ +#include "qplaceimage.h" diff --git a/include/QtLocation/QPlaceManager b/include/QtLocation/QPlaceManager new file mode 100644 index 0000000..7973c48 --- /dev/null +++ b/include/QtLocation/QPlaceManager @@ -0,0 +1 @@ +#include "qplacemanager.h" diff --git a/include/QtLocation/QPlaceManagerEngine b/include/QtLocation/QPlaceManagerEngine new file mode 100644 index 0000000..27f07fc --- /dev/null +++ b/include/QtLocation/QPlaceManagerEngine @@ -0,0 +1 @@ +#include "qplacemanagerengine.h" diff --git a/include/QtLocation/QPlaceMatchReply b/include/QtLocation/QPlaceMatchReply new file mode 100644 index 0000000..37ffdf2 --- /dev/null +++ b/include/QtLocation/QPlaceMatchReply @@ -0,0 +1 @@ +#include "qplacematchreply.h" diff --git a/include/QtLocation/QPlaceMatchRequest b/include/QtLocation/QPlaceMatchRequest new file mode 100644 index 0000000..ceaeb96 --- /dev/null +++ b/include/QtLocation/QPlaceMatchRequest @@ -0,0 +1 @@ +#include "qplacematchrequest.h" diff --git a/include/QtLocation/QPlaceProposedSearchResult b/include/QtLocation/QPlaceProposedSearchResult new file mode 100644 index 0000000..c43f2a6 --- /dev/null +++ b/include/QtLocation/QPlaceProposedSearchResult @@ -0,0 +1 @@ +#include "qplaceproposedsearchresult.h" diff --git a/include/QtLocation/QPlaceRatings b/include/QtLocation/QPlaceRatings new file mode 100644 index 0000000..4b7f63c --- /dev/null +++ b/include/QtLocation/QPlaceRatings @@ -0,0 +1 @@ +#include "qplaceratings.h" diff --git a/include/QtLocation/QPlaceReply b/include/QtLocation/QPlaceReply new file mode 100644 index 0000000..f0654b8 --- /dev/null +++ b/include/QtLocation/QPlaceReply @@ -0,0 +1 @@ +#include "qplacereply.h" diff --git a/include/QtLocation/QPlaceResult b/include/QtLocation/QPlaceResult new file mode 100644 index 0000000..4f5c8db --- /dev/null +++ b/include/QtLocation/QPlaceResult @@ -0,0 +1 @@ +#include "qplaceresult.h" diff --git a/include/QtLocation/QPlaceReview b/include/QtLocation/QPlaceReview new file mode 100644 index 0000000..83cccec --- /dev/null +++ b/include/QtLocation/QPlaceReview @@ -0,0 +1 @@ +#include "qplacereview.h" diff --git a/include/QtLocation/QPlaceSearchReply b/include/QtLocation/QPlaceSearchReply new file mode 100644 index 0000000..395a61a --- /dev/null +++ b/include/QtLocation/QPlaceSearchReply @@ -0,0 +1 @@ +#include "qplacesearchreply.h" diff --git a/include/QtLocation/QPlaceSearchRequest b/include/QtLocation/QPlaceSearchRequest new file mode 100644 index 0000000..b247dab --- /dev/null +++ b/include/QtLocation/QPlaceSearchRequest @@ -0,0 +1 @@ +#include "qplacesearchrequest.h" diff --git a/include/QtLocation/QPlaceSearchResult b/include/QtLocation/QPlaceSearchResult new file mode 100644 index 0000000..2298271 --- /dev/null +++ b/include/QtLocation/QPlaceSearchResult @@ -0,0 +1 @@ +#include "qplacesearchresult.h" diff --git a/include/QtLocation/QPlaceSearchSuggestionReply b/include/QtLocation/QPlaceSearchSuggestionReply new file mode 100644 index 0000000..e7a4f91 --- /dev/null +++ b/include/QtLocation/QPlaceSearchSuggestionReply @@ -0,0 +1 @@ +#include "qplacesearchsuggestionreply.h" diff --git a/include/QtLocation/QPlaceSupplier b/include/QtLocation/QPlaceSupplier new file mode 100644 index 0000000..465b46d --- /dev/null +++ b/include/QtLocation/QPlaceSupplier @@ -0,0 +1 @@ +#include "qplacesupplier.h" diff --git a/include/QtLocation/QPlaceUser b/include/QtLocation/QPlaceUser new file mode 100644 index 0000000..5acba29 --- /dev/null +++ b/include/QtLocation/QPlaceUser @@ -0,0 +1 @@ +#include "qplaceuser.h" diff --git a/include/QtLocation/QtLocation b/include/QtLocation/QtLocation new file mode 100644 index 0000000..c5936ba --- /dev/null +++ b/include/QtLocation/QtLocation @@ -0,0 +1,47 @@ +#ifndef QT_QTLOCATION_MODULE_H +#define QT_QTLOCATION_MODULE_H +#include +#include "qlocationglobal.h" +#include "placemacro.h" +#include "qgeocodereply.h" +#include "qgeocodingmanager.h" +#include "qgeocodingmanagerengine.h" +#include "qgeomaneuver.h" +#include "qgeoroute.h" +#include "qgeoroutereply.h" +#include "qgeorouterequest.h" +#include "qgeoroutesegment.h" +#include "qgeoroutingmanager.h" +#include "qgeoroutingmanagerengine.h" +#include "qgeoserviceprovider.h" +#include "qgeoserviceproviderfactory.h" +#include "qlocation.h" +#include "qplace.h" +#include "qplaceattribute.h" +#include "qplacecategory.h" +#include "qplacecontactdetail.h" +#include "qplacecontent.h" +#include "qplacecontentreply.h" +#include "qplacecontentrequest.h" +#include "qplacedetailsreply.h" +#include "qplaceeditorial.h" +#include "qplaceicon.h" +#include "qplaceidreply.h" +#include "qplaceimage.h" +#include "qplacemanager.h" +#include "qplacemanagerengine.h" +#include "qplacematchreply.h" +#include "qplacematchrequest.h" +#include "qplaceproposedsearchresult.h" +#include "qplaceratings.h" +#include "qplacereply.h" +#include "qplaceresult.h" +#include "qplacereview.h" +#include "qplacesearchreply.h" +#include "qplacesearchrequest.h" +#include "qplacesearchresult.h" +#include "qplacesearchsuggestionreply.h" +#include "qplacesupplier.h" +#include "qplaceuser.h" +#include "qtlocationversion.h" +#endif diff --git a/include/QtLocation/QtLocationVersion b/include/QtLocation/QtLocationVersion new file mode 100644 index 0000000..8da2499 --- /dev/null +++ b/include/QtLocation/QtLocationVersion @@ -0,0 +1 @@ +#include "qtlocationversion.h" diff --git a/include/QtLocation/headers.pri b/include/QtLocation/headers.pri new file mode 100644 index 0000000..6650217 --- /dev/null +++ b/include/QtLocation/headers.pri @@ -0,0 +1,6 @@ +SYNCQT.HEADER_FILES = qlocation.h qlocationglobal.h maps/qgeocodereply.h maps/qgeocodingmanager.h maps/qgeocodingmanagerengine.h maps/qgeomaneuver.h maps/qgeoroute.h maps/qgeoroutereply.h maps/qgeorouterequest.h maps/qgeoroutesegment.h maps/qgeoroutingmanager.h maps/qgeoroutingmanagerengine.h maps/qgeoserviceprovider.h maps/qgeoserviceproviderfactory.h places/placemacro.h places/qplace.h places/qplaceattribute.h places/qplacecategory.h places/qplacecontactdetail.h places/qplacecontent.h places/qplacecontentreply.h places/qplacecontentrequest.h places/qplacedetailsreply.h places/qplaceeditorial.h places/qplaceicon.h places/qplaceidreply.h places/qplaceimage.h places/qplacemanager.h places/qplacemanagerengine.h places/qplacematchreply.h places/qplacematchrequest.h places/qplaceproposedsearchresult.h places/qplaceratings.h places/qplacereply.h places/qplaceresult.h places/qplacereview.h places/qplacesearchreply.h places/qplacesearchrequest.h places/qplacesearchresult.h places/qplacesearchsuggestionreply.h places/qplacesupplier.h places/qplaceuser.h +SYNCQT.GENERATED_HEADER_FILES = QLocation QGeoCodeReply QGeoCodingManager QGeoCodingManagerEngine QGeoManeuver QGeoRoute QGeoRouteLeg QGeoRouteReply QGeoRouteRequest QGeoRouteSegment QGeoRoutingManager QGeoRoutingManagerEngine QGeoServiceProvider QGeoServiceProviderFactory QPlace QPlaceAttribute QPlaceCategory QPlaceContactDetail QPlaceContent QPlaceContentReply QPlaceContentRequest QPlaceDetailsReply QPlaceEditorial QPlaceIcon QPlaceIdReply QPlaceImage QPlaceManager QPlaceManagerEngine QPlaceMatchReply QPlaceMatchRequest QPlaceProposedSearchResult QPlaceRatings QPlaceReply QPlaceResult QPlaceReview QPlaceSearchReply QPlaceSearchRequest QPlaceSearchResult QPlaceSearchSuggestionReply QPlaceSupplier QPlaceUser qtlocationversion.h QtLocationVersion QtLocation +SYNCQT.PRIVATE_HEADER_FILES = qlocationglobal_p.h declarativemaps/error_messages_p.h declarativemaps/locationvaluetypehelper_p.h declarativemaps/qdeclarativecirclemapitem_p.h declarativemaps/qdeclarativecirclemapitem_p_p.h declarativemaps/qdeclarativegeocodemodel_p.h declarativemaps/qdeclarativegeomaneuver_p.h declarativemaps/qdeclarativegeomap_p.h declarativemaps/qdeclarativegeomapcopyrightsnotice_p.h declarativemaps/qdeclarativegeomapitembase_p.h declarativemaps/qdeclarativegeomapitemgroup_p.h declarativemaps/qdeclarativegeomapitemtransitionmanager_p.h declarativemaps/qdeclarativegeomapitemutils_p.h declarativemaps/qdeclarativegeomapitemview_p.h declarativemaps/qdeclarativegeomapparameter_p.h declarativemaps/qdeclarativegeomapquickitem_p.h declarativemaps/qdeclarativegeomaptype_p.h declarativemaps/qdeclarativegeoroute_p.h declarativemaps/qdeclarativegeoroutemodel_p.h declarativemaps/qdeclarativegeoroutesegment_p.h declarativemaps/qdeclarativegeoserviceprovider_p.h declarativemaps/qdeclarativepolygonmapitem_p.h declarativemaps/qdeclarativepolygonmapitem_p_p.h declarativemaps/qdeclarativepolylinemapitem_p.h declarativemaps/qdeclarativepolylinemapitem_p_p.h declarativemaps/qdeclarativerectanglemapitem_p.h declarativemaps/qdeclarativerectanglemapitem_p_p.h declarativemaps/qdeclarativeroutemapitem_p.h declarativemaps/qgeomapitemgeometry_p.h declarativemaps/qgeomapobject_p.h declarativemaps/qgeomapobject_p_p.h declarativemaps/qgeosimplify_p.h declarativemaps/qparameterizableobject_p.h declarativemaps/qquickgeomapgesturearea_p.h declarativeplaces/qdeclarativecategory_p.h declarativeplaces/qdeclarativecontactdetail_p.h declarativeplaces/qdeclarativeperiod_p.h declarativeplaces/qdeclarativeplace_p.h declarativeplaces/qdeclarativeplaceattribute_p.h declarativeplaces/qdeclarativeplacecontentmodel_p.h declarativeplaces/qdeclarativeplaceeditorialmodel_p.h declarativeplaces/qdeclarativeplaceicon_p.h declarativeplaces/qdeclarativeplaceimagemodel_p.h declarativeplaces/qdeclarativeplaceuser_p.h declarativeplaces/qdeclarativeratings_p.h declarativeplaces/qdeclarativereviewmodel_p.h declarativeplaces/qdeclarativesearchmodelbase_p.h declarativeplaces/qdeclarativesearchresultmodel_p.h declarativeplaces/qdeclarativesearchsuggestionmodel_p.h declarativeplaces/qdeclarativesupplier_p.h declarativeplaces/qdeclarativesupportedcategoriesmodel_p.h labs/qdeclarativenavigator_p.h labs/qdeclarativenavigator_p_p.h labs/qgeojson_p.h labs/qgeotiledmaplabs_p.h labs/qmapcircleobject_p.h labs/qmapcircleobject_p_p.h labs/qmapiconobject_p.h labs/qmapiconobject_p_p.h labs/qmapobjectview_p.h labs/qmapobjectview_p_p.h labs/qmappolygonobject_p.h labs/qmappolygonobject_p_p.h labs/qmappolylineobject_p.h labs/qmappolylineobject_p_p.h labs/qmaprouteobject_p.h labs/qmaprouteobject_p_p.h maps/qabstractgeotilecache_p.h maps/qcache3q_p.h maps/qgeocameracapabilities_p.h maps/qgeocameradata_p.h maps/qgeocameratiles_p.h maps/qgeocameratiles_p_p.h maps/qgeocodereply_p.h maps/qgeocodingmanager_p.h maps/qgeocodingmanagerengine_p.h maps/qgeofiletilecache_p.h maps/qgeomaneuver_p.h maps/qgeomap_p.h maps/qgeomap_p_p.h maps/qgeomapparameter_p.h maps/qgeomappingmanager_p.h maps/qgeomappingmanager_p_p.h maps/qgeomappingmanagerengine_p.h maps/qgeomappingmanagerengine_p_p.h maps/qgeomaptype_p.h maps/qgeomaptype_p_p.h maps/qgeoprojection_p.h maps/qgeoroute_p.h maps/qgeorouteparser_p.h maps/qgeorouteparser_p_p.h maps/qgeorouteparserosrmv4_p.h maps/qgeorouteparserosrmv5_p.h maps/qgeoroutereply_p.h maps/qgeorouterequest_p.h maps/qgeoroutesegment_p.h maps/qgeoroutingmanager_p.h maps/qgeoroutingmanagerengine_p.h maps/qgeoserviceprovider_p.h maps/qgeotiledmap_p.h maps/qgeotiledmap_p_p.h maps/qgeotiledmappingmanagerengine_p.h maps/qgeotiledmappingmanagerengine_p_p.h maps/qgeotiledmapreply_p.h maps/qgeotiledmapreply_p_p.h maps/qgeotiledmapscene_p.h maps/qgeotiledmapscene_p_p.h maps/qgeotilefetcher_p.h maps/qgeotilefetcher_p_p.h maps/qgeotilerequestmanager_p.h maps/qgeotilespec_p.h maps/qgeotilespec_p_p.h maps/qnavigationmanager_p.h maps/qnavigationmanagerengine_p.h places/qplace_p.h places/qplaceattribute_p.h places/qplacecategory_p.h places/qplacecontactdetail_p.h places/qplacecontent_p.h places/qplacecontentrequest_p.h places/qplaceeditorial_p.h places/qplaceicon_p.h places/qplaceimage_p.h places/qplacemanagerengine_p.h places/qplaceproposedsearchresult_p.h places/qplaceratings_p.h places/qplacereply_p.h places/qplaceresult_p.h places/qplacereview_p.h places/qplacesearchrequest_p.h places/qplacesearchresult_p.h places/qplacesupplier_p.h places/qplaceuser_p.h places/unsupportedreplies_p.h labs/qsg/qgeomapobjectqsgsupport_p.h labs/qsg/qmapcircleobjectqsg_p_p.h labs/qsg/qmapiconobjectqsg_p_p.h labs/qsg/qmappolygonobjectqsg_p_p.h labs/qsg/qmappolylineobjectqsg_p_p.h labs/qsg/qmaprouteobjectqsg_p_p.h labs/qsg/qqsgmapobject_p.h +SYNCQT.QPA_HEADER_FILES = +SYNCQT.CLEAN_HEADER_FILES = qlocation.h qlocationglobal.h maps/qgeocodereply.h maps/qgeocodingmanager.h maps/qgeocodingmanagerengine.h maps/qgeomaneuver.h maps/qgeoroute.h maps/qgeoroutereply.h maps/qgeorouterequest.h maps/qgeoroutesegment.h maps/qgeoroutingmanager.h maps/qgeoroutingmanagerengine.h maps/qgeoserviceprovider.h maps/qgeoserviceproviderfactory.h places/placemacro.h places/qplace.h places/qplaceattribute.h places/qplacecategory.h places/qplacecontactdetail.h places/qplacecontent.h places/qplacecontentreply.h places/qplacecontentrequest.h places/qplacedetailsreply.h places/qplaceeditorial.h places/qplaceicon.h places/qplaceidreply.h places/qplaceimage.h places/qplacemanager.h places/qplacemanagerengine.h places/qplacematchreply.h places/qplacematchrequest.h places/qplaceproposedsearchresult.h places/qplaceratings.h places/qplacereply.h places/qplaceresult.h places/qplacereview.h places/qplacesearchreply.h places/qplacesearchrequest.h places/qplacesearchresult.h places/qplacesearchsuggestionreply.h places/qplacesupplier.h places/qplaceuser.h +SYNCQT.INJECTIONS = diff --git a/include/QtLocation/placemacro.h b/include/QtLocation/placemacro.h new file mode 100644 index 0000000..19404ab --- /dev/null +++ b/include/QtLocation/placemacro.h @@ -0,0 +1 @@ +#include "../../src/location/places/placemacro.h" diff --git a/include/QtLocation/qgeocodereply.h b/include/QtLocation/qgeocodereply.h new file mode 100644 index 0000000..ba6d712 --- /dev/null +++ b/include/QtLocation/qgeocodereply.h @@ -0,0 +1 @@ +#include "../../src/location/maps/qgeocodereply.h" diff --git a/include/QtLocation/qgeocodingmanager.h b/include/QtLocation/qgeocodingmanager.h new file mode 100644 index 0000000..7ddf50f --- /dev/null +++ b/include/QtLocation/qgeocodingmanager.h @@ -0,0 +1 @@ +#include "../../src/location/maps/qgeocodingmanager.h" diff --git a/include/QtLocation/qgeocodingmanagerengine.h b/include/QtLocation/qgeocodingmanagerengine.h new file mode 100644 index 0000000..18d06ef --- /dev/null +++ b/include/QtLocation/qgeocodingmanagerengine.h @@ -0,0 +1 @@ +#include "../../src/location/maps/qgeocodingmanagerengine.h" diff --git a/include/QtLocation/qgeomaneuver.h b/include/QtLocation/qgeomaneuver.h new file mode 100644 index 0000000..72e145b --- /dev/null +++ b/include/QtLocation/qgeomaneuver.h @@ -0,0 +1 @@ +#include "../../src/location/maps/qgeomaneuver.h" diff --git a/include/QtLocation/qgeoroute.h b/include/QtLocation/qgeoroute.h new file mode 100644 index 0000000..b0bdf34 --- /dev/null +++ b/include/QtLocation/qgeoroute.h @@ -0,0 +1 @@ +#include "../../src/location/maps/qgeoroute.h" diff --git a/include/QtLocation/qgeoroutereply.h b/include/QtLocation/qgeoroutereply.h new file mode 100644 index 0000000..34d8e88 --- /dev/null +++ b/include/QtLocation/qgeoroutereply.h @@ -0,0 +1 @@ +#include "../../src/location/maps/qgeoroutereply.h" diff --git a/include/QtLocation/qgeorouterequest.h b/include/QtLocation/qgeorouterequest.h new file mode 100644 index 0000000..33bf11d --- /dev/null +++ b/include/QtLocation/qgeorouterequest.h @@ -0,0 +1 @@ +#include "../../src/location/maps/qgeorouterequest.h" diff --git a/include/QtLocation/qgeoroutesegment.h b/include/QtLocation/qgeoroutesegment.h new file mode 100644 index 0000000..7205732 --- /dev/null +++ b/include/QtLocation/qgeoroutesegment.h @@ -0,0 +1 @@ +#include "../../src/location/maps/qgeoroutesegment.h" diff --git a/include/QtLocation/qgeoroutingmanager.h b/include/QtLocation/qgeoroutingmanager.h new file mode 100644 index 0000000..8ae46be --- /dev/null +++ b/include/QtLocation/qgeoroutingmanager.h @@ -0,0 +1 @@ +#include "../../src/location/maps/qgeoroutingmanager.h" diff --git a/include/QtLocation/qgeoroutingmanagerengine.h b/include/QtLocation/qgeoroutingmanagerengine.h new file mode 100644 index 0000000..4b26f14 --- /dev/null +++ b/include/QtLocation/qgeoroutingmanagerengine.h @@ -0,0 +1 @@ +#include "../../src/location/maps/qgeoroutingmanagerengine.h" diff --git a/include/QtLocation/qgeoserviceprovider.h b/include/QtLocation/qgeoserviceprovider.h new file mode 100644 index 0000000..4aca205 --- /dev/null +++ b/include/QtLocation/qgeoserviceprovider.h @@ -0,0 +1 @@ +#include "../../src/location/maps/qgeoserviceprovider.h" diff --git a/include/QtLocation/qgeoserviceproviderfactory.h b/include/QtLocation/qgeoserviceproviderfactory.h new file mode 100644 index 0000000..39a5e4c --- /dev/null +++ b/include/QtLocation/qgeoserviceproviderfactory.h @@ -0,0 +1 @@ +#include "../../src/location/maps/qgeoserviceproviderfactory.h" diff --git a/include/QtLocation/qlocation.h b/include/QtLocation/qlocation.h new file mode 100644 index 0000000..4c266a1 --- /dev/null +++ b/include/QtLocation/qlocation.h @@ -0,0 +1 @@ +#include "../../src/location/qlocation.h" diff --git a/include/QtLocation/qlocationglobal.h b/include/QtLocation/qlocationglobal.h new file mode 100644 index 0000000..9959740 --- /dev/null +++ b/include/QtLocation/qlocationglobal.h @@ -0,0 +1 @@ +#include "../../src/location/qlocationglobal.h" diff --git a/include/QtLocation/qplace.h b/include/QtLocation/qplace.h new file mode 100644 index 0000000..7ce3cf4 --- /dev/null +++ b/include/QtLocation/qplace.h @@ -0,0 +1 @@ +#include "../../src/location/places/qplace.h" diff --git a/include/QtLocation/qplaceattribute.h b/include/QtLocation/qplaceattribute.h new file mode 100644 index 0000000..9ade0c5 --- /dev/null +++ b/include/QtLocation/qplaceattribute.h @@ -0,0 +1 @@ +#include "../../src/location/places/qplaceattribute.h" diff --git a/include/QtLocation/qplacecategory.h b/include/QtLocation/qplacecategory.h new file mode 100644 index 0000000..310d15c --- /dev/null +++ b/include/QtLocation/qplacecategory.h @@ -0,0 +1 @@ +#include "../../src/location/places/qplacecategory.h" diff --git a/include/QtLocation/qplacecontactdetail.h b/include/QtLocation/qplacecontactdetail.h new file mode 100644 index 0000000..179040c --- /dev/null +++ b/include/QtLocation/qplacecontactdetail.h @@ -0,0 +1 @@ +#include "../../src/location/places/qplacecontactdetail.h" diff --git a/include/QtLocation/qplacecontent.h b/include/QtLocation/qplacecontent.h new file mode 100644 index 0000000..675d5ee --- /dev/null +++ b/include/QtLocation/qplacecontent.h @@ -0,0 +1 @@ +#include "../../src/location/places/qplacecontent.h" diff --git a/include/QtLocation/qplacecontentreply.h b/include/QtLocation/qplacecontentreply.h new file mode 100644 index 0000000..3129a8f --- /dev/null +++ b/include/QtLocation/qplacecontentreply.h @@ -0,0 +1 @@ +#include "../../src/location/places/qplacecontentreply.h" diff --git a/include/QtLocation/qplacecontentrequest.h b/include/QtLocation/qplacecontentrequest.h new file mode 100644 index 0000000..1578507 --- /dev/null +++ b/include/QtLocation/qplacecontentrequest.h @@ -0,0 +1 @@ +#include "../../src/location/places/qplacecontentrequest.h" diff --git a/include/QtLocation/qplacedetailsreply.h b/include/QtLocation/qplacedetailsreply.h new file mode 100644 index 0000000..586e16a --- /dev/null +++ b/include/QtLocation/qplacedetailsreply.h @@ -0,0 +1 @@ +#include "../../src/location/places/qplacedetailsreply.h" diff --git a/include/QtLocation/qplaceeditorial.h b/include/QtLocation/qplaceeditorial.h new file mode 100644 index 0000000..9dac346 --- /dev/null +++ b/include/QtLocation/qplaceeditorial.h @@ -0,0 +1 @@ +#include "../../src/location/places/qplaceeditorial.h" diff --git a/include/QtLocation/qplaceicon.h b/include/QtLocation/qplaceicon.h new file mode 100644 index 0000000..558ac04 --- /dev/null +++ b/include/QtLocation/qplaceicon.h @@ -0,0 +1 @@ +#include "../../src/location/places/qplaceicon.h" diff --git a/include/QtLocation/qplaceidreply.h b/include/QtLocation/qplaceidreply.h new file mode 100644 index 0000000..8d19185 --- /dev/null +++ b/include/QtLocation/qplaceidreply.h @@ -0,0 +1 @@ +#include "../../src/location/places/qplaceidreply.h" diff --git a/include/QtLocation/qplaceimage.h b/include/QtLocation/qplaceimage.h new file mode 100644 index 0000000..856deb1 --- /dev/null +++ b/include/QtLocation/qplaceimage.h @@ -0,0 +1 @@ +#include "../../src/location/places/qplaceimage.h" diff --git a/include/QtLocation/qplacemanager.h b/include/QtLocation/qplacemanager.h new file mode 100644 index 0000000..689e043 --- /dev/null +++ b/include/QtLocation/qplacemanager.h @@ -0,0 +1 @@ +#include "../../src/location/places/qplacemanager.h" diff --git a/include/QtLocation/qplacemanagerengine.h b/include/QtLocation/qplacemanagerengine.h new file mode 100644 index 0000000..8966e6d --- /dev/null +++ b/include/QtLocation/qplacemanagerengine.h @@ -0,0 +1 @@ +#include "../../src/location/places/qplacemanagerengine.h" diff --git a/include/QtLocation/qplacematchreply.h b/include/QtLocation/qplacematchreply.h new file mode 100644 index 0000000..123bd8f --- /dev/null +++ b/include/QtLocation/qplacematchreply.h @@ -0,0 +1 @@ +#include "../../src/location/places/qplacematchreply.h" diff --git a/include/QtLocation/qplacematchrequest.h b/include/QtLocation/qplacematchrequest.h new file mode 100644 index 0000000..bca1b69 --- /dev/null +++ b/include/QtLocation/qplacematchrequest.h @@ -0,0 +1 @@ +#include "../../src/location/places/qplacematchrequest.h" diff --git a/include/QtLocation/qplaceproposedsearchresult.h b/include/QtLocation/qplaceproposedsearchresult.h new file mode 100644 index 0000000..9a609b4 --- /dev/null +++ b/include/QtLocation/qplaceproposedsearchresult.h @@ -0,0 +1 @@ +#include "../../src/location/places/qplaceproposedsearchresult.h" diff --git a/include/QtLocation/qplaceratings.h b/include/QtLocation/qplaceratings.h new file mode 100644 index 0000000..dc6ad10 --- /dev/null +++ b/include/QtLocation/qplaceratings.h @@ -0,0 +1 @@ +#include "../../src/location/places/qplaceratings.h" diff --git a/include/QtLocation/qplacereply.h b/include/QtLocation/qplacereply.h new file mode 100644 index 0000000..96a2fef --- /dev/null +++ b/include/QtLocation/qplacereply.h @@ -0,0 +1 @@ +#include "../../src/location/places/qplacereply.h" diff --git a/include/QtLocation/qplaceresult.h b/include/QtLocation/qplaceresult.h new file mode 100644 index 0000000..48e4bed --- /dev/null +++ b/include/QtLocation/qplaceresult.h @@ -0,0 +1 @@ +#include "../../src/location/places/qplaceresult.h" diff --git a/include/QtLocation/qplacereview.h b/include/QtLocation/qplacereview.h new file mode 100644 index 0000000..19273d9 --- /dev/null +++ b/include/QtLocation/qplacereview.h @@ -0,0 +1 @@ +#include "../../src/location/places/qplacereview.h" diff --git a/include/QtLocation/qplacesearchreply.h b/include/QtLocation/qplacesearchreply.h new file mode 100644 index 0000000..5e45879 --- /dev/null +++ b/include/QtLocation/qplacesearchreply.h @@ -0,0 +1 @@ +#include "../../src/location/places/qplacesearchreply.h" diff --git a/include/QtLocation/qplacesearchrequest.h b/include/QtLocation/qplacesearchrequest.h new file mode 100644 index 0000000..794ac51 --- /dev/null +++ b/include/QtLocation/qplacesearchrequest.h @@ -0,0 +1 @@ +#include "../../src/location/places/qplacesearchrequest.h" diff --git a/include/QtLocation/qplacesearchresult.h b/include/QtLocation/qplacesearchresult.h new file mode 100644 index 0000000..102d1e8 --- /dev/null +++ b/include/QtLocation/qplacesearchresult.h @@ -0,0 +1 @@ +#include "../../src/location/places/qplacesearchresult.h" diff --git a/include/QtLocation/qplacesearchsuggestionreply.h b/include/QtLocation/qplacesearchsuggestionreply.h new file mode 100644 index 0000000..72cdc6a --- /dev/null +++ b/include/QtLocation/qplacesearchsuggestionreply.h @@ -0,0 +1 @@ +#include "../../src/location/places/qplacesearchsuggestionreply.h" diff --git a/include/QtLocation/qplacesupplier.h b/include/QtLocation/qplacesupplier.h new file mode 100644 index 0000000..071102d --- /dev/null +++ b/include/QtLocation/qplacesupplier.h @@ -0,0 +1 @@ +#include "../../src/location/places/qplacesupplier.h" diff --git a/include/QtLocation/qplaceuser.h b/include/QtLocation/qplaceuser.h new file mode 100644 index 0000000..88d3b28 --- /dev/null +++ b/include/QtLocation/qplaceuser.h @@ -0,0 +1 @@ +#include "../../src/location/places/qplaceuser.h" diff --git a/include/QtLocation/qtlocationversion.h b/include/QtLocation/qtlocationversion.h new file mode 100644 index 0000000..0f52408 --- /dev/null +++ b/include/QtLocation/qtlocationversion.h @@ -0,0 +1,9 @@ +/* This file was generated by syncqt. */ +#ifndef QT_QTLOCATION_VERSION_H +#define QT_QTLOCATION_VERSION_H + +#define QTLOCATION_VERSION_STR "5.15.8" + +#define QTLOCATION_VERSION 0x050F08 + +#endif // QT_QTLOCATION_VERSION_H diff --git a/include/QtPositioning/5.15.8/QtPositioning/private/qclipperutils_p.h b/include/QtPositioning/5.15.8/QtPositioning/private/qclipperutils_p.h new file mode 100644 index 0000000..876b17c --- /dev/null +++ b/include/QtPositioning/5.15.8/QtPositioning/private/qclipperutils_p.h @@ -0,0 +1 @@ +#include "../../../../../src/positioning/qclipperutils_p.h" diff --git a/include/QtPositioning/5.15.8/QtPositioning/private/qdoublematrix4x4_p.h b/include/QtPositioning/5.15.8/QtPositioning/private/qdoublematrix4x4_p.h new file mode 100644 index 0000000..9f9622b --- /dev/null +++ b/include/QtPositioning/5.15.8/QtPositioning/private/qdoublematrix4x4_p.h @@ -0,0 +1 @@ +#include "../../../../../src/positioning/qdoublematrix4x4_p.h" diff --git a/include/QtPositioning/5.15.8/QtPositioning/private/qdoublevector2d_p.h b/include/QtPositioning/5.15.8/QtPositioning/private/qdoublevector2d_p.h new file mode 100644 index 0000000..a679f2f --- /dev/null +++ b/include/QtPositioning/5.15.8/QtPositioning/private/qdoublevector2d_p.h @@ -0,0 +1 @@ +#include "../../../../../src/positioning/qdoublevector2d_p.h" diff --git a/include/QtPositioning/5.15.8/QtPositioning/private/qdoublevector3d_p.h b/include/QtPositioning/5.15.8/QtPositioning/private/qdoublevector3d_p.h new file mode 100644 index 0000000..6b1a13c --- /dev/null +++ b/include/QtPositioning/5.15.8/QtPositioning/private/qdoublevector3d_p.h @@ -0,0 +1 @@ +#include "../../../../../src/positioning/qdoublevector3d_p.h" diff --git a/include/QtPositioning/5.15.8/QtPositioning/private/qgeoaddress_p.h b/include/QtPositioning/5.15.8/QtPositioning/private/qgeoaddress_p.h new file mode 100644 index 0000000..b494007 --- /dev/null +++ b/include/QtPositioning/5.15.8/QtPositioning/private/qgeoaddress_p.h @@ -0,0 +1 @@ +#include "../../../../../src/positioning/qgeoaddress_p.h" diff --git a/include/QtPositioning/5.15.8/QtPositioning/private/qgeocircle_p.h b/include/QtPositioning/5.15.8/QtPositioning/private/qgeocircle_p.h new file mode 100644 index 0000000..80a2f05 --- /dev/null +++ b/include/QtPositioning/5.15.8/QtPositioning/private/qgeocircle_p.h @@ -0,0 +1 @@ +#include "../../../../../src/positioning/qgeocircle_p.h" diff --git a/include/QtPositioning/5.15.8/QtPositioning/private/qgeocoordinate_p.h b/include/QtPositioning/5.15.8/QtPositioning/private/qgeocoordinate_p.h new file mode 100644 index 0000000..53b5c3b --- /dev/null +++ b/include/QtPositioning/5.15.8/QtPositioning/private/qgeocoordinate_p.h @@ -0,0 +1 @@ +#include "../../../../../src/positioning/qgeocoordinate_p.h" diff --git a/include/QtPositioning/5.15.8/QtPositioning/private/qgeocoordinateobject_p.h b/include/QtPositioning/5.15.8/QtPositioning/private/qgeocoordinateobject_p.h new file mode 100644 index 0000000..11739db --- /dev/null +++ b/include/QtPositioning/5.15.8/QtPositioning/private/qgeocoordinateobject_p.h @@ -0,0 +1 @@ +#include "../../../../../src/positioning/qgeocoordinateobject_p.h" diff --git a/include/QtPositioning/5.15.8/QtPositioning/private/qgeolocation_p.h b/include/QtPositioning/5.15.8/QtPositioning/private/qgeolocation_p.h new file mode 100644 index 0000000..15bd5a1 --- /dev/null +++ b/include/QtPositioning/5.15.8/QtPositioning/private/qgeolocation_p.h @@ -0,0 +1 @@ +#include "../../../../../src/positioning/qgeolocation_p.h" diff --git a/include/QtPositioning/5.15.8/QtPositioning/private/qgeopath_p.h b/include/QtPositioning/5.15.8/QtPositioning/private/qgeopath_p.h new file mode 100644 index 0000000..a41c689 --- /dev/null +++ b/include/QtPositioning/5.15.8/QtPositioning/private/qgeopath_p.h @@ -0,0 +1 @@ +#include "../../../../../src/positioning/qgeopath_p.h" diff --git a/include/QtPositioning/5.15.8/QtPositioning/private/qgeopolygon_p.h b/include/QtPositioning/5.15.8/QtPositioning/private/qgeopolygon_p.h new file mode 100644 index 0000000..6394c8b --- /dev/null +++ b/include/QtPositioning/5.15.8/QtPositioning/private/qgeopolygon_p.h @@ -0,0 +1 @@ +#include "../../../../../src/positioning/qgeopolygon_p.h" diff --git a/include/QtPositioning/5.15.8/QtPositioning/private/qgeopositioninfo_p.h b/include/QtPositioning/5.15.8/QtPositioning/private/qgeopositioninfo_p.h new file mode 100644 index 0000000..d85beda --- /dev/null +++ b/include/QtPositioning/5.15.8/QtPositioning/private/qgeopositioninfo_p.h @@ -0,0 +1 @@ +#include "../../../../../src/positioning/qgeopositioninfo_p.h" diff --git a/include/QtPositioning/5.15.8/QtPositioning/private/qgeopositioninfosource_p.h b/include/QtPositioning/5.15.8/QtPositioning/private/qgeopositioninfosource_p.h new file mode 100644 index 0000000..a43d355 --- /dev/null +++ b/include/QtPositioning/5.15.8/QtPositioning/private/qgeopositioninfosource_p.h @@ -0,0 +1 @@ +#include "../../../../../src/positioning/qgeopositioninfosource_p.h" diff --git a/include/QtPositioning/5.15.8/QtPositioning/private/qgeorectangle_p.h b/include/QtPositioning/5.15.8/QtPositioning/private/qgeorectangle_p.h new file mode 100644 index 0000000..e4d2ac1 --- /dev/null +++ b/include/QtPositioning/5.15.8/QtPositioning/private/qgeorectangle_p.h @@ -0,0 +1 @@ +#include "../../../../../src/positioning/qgeorectangle_p.h" diff --git a/include/QtPositioning/5.15.8/QtPositioning/private/qgeosatelliteinfo_p.h b/include/QtPositioning/5.15.8/QtPositioning/private/qgeosatelliteinfo_p.h new file mode 100644 index 0000000..2d475b8 --- /dev/null +++ b/include/QtPositioning/5.15.8/QtPositioning/private/qgeosatelliteinfo_p.h @@ -0,0 +1 @@ +#include "../../../../../src/positioning/qgeosatelliteinfo_p.h" diff --git a/include/QtPositioning/5.15.8/QtPositioning/private/qgeosatelliteinfosource_p.h b/include/QtPositioning/5.15.8/QtPositioning/private/qgeosatelliteinfosource_p.h new file mode 100644 index 0000000..b13fd08 --- /dev/null +++ b/include/QtPositioning/5.15.8/QtPositioning/private/qgeosatelliteinfosource_p.h @@ -0,0 +1 @@ +#include "../../../../../src/positioning/qgeosatelliteinfosource_p.h" diff --git a/include/QtPositioning/5.15.8/QtPositioning/private/qgeoshape_p.h b/include/QtPositioning/5.15.8/QtPositioning/private/qgeoshape_p.h new file mode 100644 index 0000000..ef4a35e --- /dev/null +++ b/include/QtPositioning/5.15.8/QtPositioning/private/qgeoshape_p.h @@ -0,0 +1 @@ +#include "../../../../../src/positioning/qgeoshape_p.h" diff --git a/include/QtPositioning/5.15.8/QtPositioning/private/qlocationdata_simulator_p.h b/include/QtPositioning/5.15.8/QtPositioning/private/qlocationdata_simulator_p.h new file mode 100644 index 0000000..ed0b911 --- /dev/null +++ b/include/QtPositioning/5.15.8/QtPositioning/private/qlocationdata_simulator_p.h @@ -0,0 +1 @@ +#include "../../../../../src/positioning/qlocationdata_simulator_p.h" diff --git a/include/QtPositioning/5.15.8/QtPositioning/private/qlocationutils_p.h b/include/QtPositioning/5.15.8/QtPositioning/private/qlocationutils_p.h new file mode 100644 index 0000000..0c3d9cd --- /dev/null +++ b/include/QtPositioning/5.15.8/QtPositioning/private/qlocationutils_p.h @@ -0,0 +1 @@ +#include "../../../../../src/positioning/qlocationutils_p.h" diff --git a/include/QtPositioning/5.15.8/QtPositioning/private/qnmeapositioninfosource_p.h b/include/QtPositioning/5.15.8/QtPositioning/private/qnmeapositioninfosource_p.h new file mode 100644 index 0000000..2fd5904 --- /dev/null +++ b/include/QtPositioning/5.15.8/QtPositioning/private/qnmeapositioninfosource_p.h @@ -0,0 +1 @@ +#include "../../../../../src/positioning/qnmeapositioninfosource_p.h" diff --git a/include/QtPositioning/5.15.8/QtPositioning/private/qpositioningglobal_p.h b/include/QtPositioning/5.15.8/QtPositioning/private/qpositioningglobal_p.h new file mode 100644 index 0000000..657c470 --- /dev/null +++ b/include/QtPositioning/5.15.8/QtPositioning/private/qpositioningglobal_p.h @@ -0,0 +1 @@ +#include "../../../../../src/positioning/qpositioningglobal_p.h" diff --git a/include/QtPositioning/5.15.8/QtPositioning/private/qwebmercator_p.h b/include/QtPositioning/5.15.8/QtPositioning/private/qwebmercator_p.h new file mode 100644 index 0000000..f2abab1 --- /dev/null +++ b/include/QtPositioning/5.15.8/QtPositioning/private/qwebmercator_p.h @@ -0,0 +1 @@ +#include "../../../../../src/positioning/qwebmercator_p.h" diff --git a/include/QtPositioning/QGeoAddress b/include/QtPositioning/QGeoAddress new file mode 100644 index 0000000..708bcab --- /dev/null +++ b/include/QtPositioning/QGeoAddress @@ -0,0 +1 @@ +#include "qgeoaddress.h" diff --git a/include/QtPositioning/QGeoAreaMonitorInfo b/include/QtPositioning/QGeoAreaMonitorInfo new file mode 100644 index 0000000..7e137e6 --- /dev/null +++ b/include/QtPositioning/QGeoAreaMonitorInfo @@ -0,0 +1 @@ +#include "qgeoareamonitorinfo.h" diff --git a/include/QtPositioning/QGeoAreaMonitorSource b/include/QtPositioning/QGeoAreaMonitorSource new file mode 100644 index 0000000..942ccf6 --- /dev/null +++ b/include/QtPositioning/QGeoAreaMonitorSource @@ -0,0 +1 @@ +#include "qgeoareamonitorsource.h" diff --git a/include/QtPositioning/QGeoCircle b/include/QtPositioning/QGeoCircle new file mode 100644 index 0000000..b77d827 --- /dev/null +++ b/include/QtPositioning/QGeoCircle @@ -0,0 +1 @@ +#include "qgeocircle.h" diff --git a/include/QtPositioning/QGeoCoordinate b/include/QtPositioning/QGeoCoordinate new file mode 100644 index 0000000..812fb2a --- /dev/null +++ b/include/QtPositioning/QGeoCoordinate @@ -0,0 +1 @@ +#include "qgeocoordinate.h" diff --git a/include/QtPositioning/QGeoLocation b/include/QtPositioning/QGeoLocation new file mode 100644 index 0000000..bd38c75 --- /dev/null +++ b/include/QtPositioning/QGeoLocation @@ -0,0 +1 @@ +#include "qgeolocation.h" diff --git a/include/QtPositioning/QGeoPath b/include/QtPositioning/QGeoPath new file mode 100644 index 0000000..bde3300 --- /dev/null +++ b/include/QtPositioning/QGeoPath @@ -0,0 +1 @@ +#include "qgeopath.h" diff --git a/include/QtPositioning/QGeoPolygon b/include/QtPositioning/QGeoPolygon new file mode 100644 index 0000000..e02b134 --- /dev/null +++ b/include/QtPositioning/QGeoPolygon @@ -0,0 +1 @@ +#include "qgeopolygon.h" diff --git a/include/QtPositioning/QGeoPositionInfo b/include/QtPositioning/QGeoPositionInfo new file mode 100644 index 0000000..d6feec9 --- /dev/null +++ b/include/QtPositioning/QGeoPositionInfo @@ -0,0 +1 @@ +#include "qgeopositioninfo.h" diff --git a/include/QtPositioning/QGeoPositionInfoSource b/include/QtPositioning/QGeoPositionInfoSource new file mode 100644 index 0000000..b7cc338 --- /dev/null +++ b/include/QtPositioning/QGeoPositionInfoSource @@ -0,0 +1 @@ +#include "qgeopositioninfosource.h" diff --git a/include/QtPositioning/QGeoPositionInfoSourceFactory b/include/QtPositioning/QGeoPositionInfoSourceFactory new file mode 100644 index 0000000..7448436 --- /dev/null +++ b/include/QtPositioning/QGeoPositionInfoSourceFactory @@ -0,0 +1 @@ +#include "qgeopositioninfosourcefactory.h" diff --git a/include/QtPositioning/QGeoRectangle b/include/QtPositioning/QGeoRectangle new file mode 100644 index 0000000..9a7d48f --- /dev/null +++ b/include/QtPositioning/QGeoRectangle @@ -0,0 +1 @@ +#include "qgeorectangle.h" diff --git a/include/QtPositioning/QGeoSatelliteInfo b/include/QtPositioning/QGeoSatelliteInfo new file mode 100644 index 0000000..a3fd47d --- /dev/null +++ b/include/QtPositioning/QGeoSatelliteInfo @@ -0,0 +1 @@ +#include "qgeosatelliteinfo.h" diff --git a/include/QtPositioning/QGeoSatelliteInfoSource b/include/QtPositioning/QGeoSatelliteInfoSource new file mode 100644 index 0000000..cc6ba9d --- /dev/null +++ b/include/QtPositioning/QGeoSatelliteInfoSource @@ -0,0 +1 @@ +#include "qgeosatelliteinfosource.h" diff --git a/include/QtPositioning/QGeoShape b/include/QtPositioning/QGeoShape new file mode 100644 index 0000000..d86ddc3 --- /dev/null +++ b/include/QtPositioning/QGeoShape @@ -0,0 +1 @@ +#include "qgeoshape.h" diff --git a/include/QtPositioning/QNmeaPositionInfoSource b/include/QtPositioning/QNmeaPositionInfoSource new file mode 100644 index 0000000..5c261c9 --- /dev/null +++ b/include/QtPositioning/QNmeaPositionInfoSource @@ -0,0 +1 @@ +#include "qnmeapositioninfosource.h" diff --git a/include/QtPositioning/QtPositioning b/include/QtPositioning/QtPositioning new file mode 100644 index 0000000..ea25c25 --- /dev/null +++ b/include/QtPositioning/QtPositioning @@ -0,0 +1,22 @@ +#ifndef QT_QTPOSITIONING_MODULE_H +#define QT_QTPOSITIONING_MODULE_H +#include +#include "qpositioningglobal.h" +#include "qgeoaddress.h" +#include "qgeoareamonitorinfo.h" +#include "qgeoareamonitorsource.h" +#include "qgeocircle.h" +#include "qgeocoordinate.h" +#include "qgeolocation.h" +#include "qgeopath.h" +#include "qgeopolygon.h" +#include "qgeopositioninfo.h" +#include "qgeopositioninfosource.h" +#include "qgeopositioninfosourcefactory.h" +#include "qgeorectangle.h" +#include "qgeosatelliteinfo.h" +#include "qgeosatelliteinfosource.h" +#include "qgeoshape.h" +#include "qnmeapositioninfosource.h" +#include "qtpositioningversion.h" +#endif diff --git a/include/QtPositioning/QtPositioningVersion b/include/QtPositioning/QtPositioningVersion new file mode 100644 index 0000000..2f99398 --- /dev/null +++ b/include/QtPositioning/QtPositioningVersion @@ -0,0 +1 @@ +#include "qtpositioningversion.h" diff --git a/include/QtPositioning/headers.pri b/include/QtPositioning/headers.pri new file mode 100644 index 0000000..fa167a7 --- /dev/null +++ b/include/QtPositioning/headers.pri @@ -0,0 +1,6 @@ +SYNCQT.HEADER_FILES = qgeoaddress.h qgeoareamonitorinfo.h qgeoareamonitorsource.h qgeocircle.h qgeocoordinate.h qgeolocation.h qgeopath.h qgeopolygon.h qgeopositioninfo.h qgeopositioninfosource.h qgeopositioninfosourcefactory.h qgeorectangle.h qgeosatelliteinfo.h qgeosatelliteinfosource.h qgeoshape.h qnmeapositioninfosource.h qpositioningglobal.h +SYNCQT.GENERATED_HEADER_FILES = QGeoAddress QGeoAreaMonitorInfo QGeoAreaMonitorSource QGeoCircle QGeoCoordinate QGeoLocation QGeoPath QGeoPolygon QGeoPositionInfo QGeoPositionInfoSource QGeoPositionInfoSourceFactory QGeoRectangle QGeoSatelliteInfo QGeoSatelliteInfoSource QGeoShape QNmeaPositionInfoSource qtpositioningversion.h QtPositioningVersion QtPositioning +SYNCQT.PRIVATE_HEADER_FILES = qclipperutils_p.h qdoublematrix4x4_p.h qdoublevector2d_p.h qdoublevector3d_p.h qgeoaddress_p.h qgeocircle_p.h qgeocoordinate_p.h qgeocoordinateobject_p.h qgeolocation_p.h qgeopath_p.h qgeopolygon_p.h qgeopositioninfo_p.h qgeopositioninfosource_p.h qgeorectangle_p.h qgeosatelliteinfo_p.h qgeosatelliteinfosource_p.h qgeoshape_p.h qlocationdata_simulator_p.h qlocationutils_p.h qnmeapositioninfosource_p.h qpositioningglobal_p.h qwebmercator_p.h +SYNCQT.QPA_HEADER_FILES = +SYNCQT.CLEAN_HEADER_FILES = qgeoaddress.h qgeoareamonitorinfo.h qgeoareamonitorsource.h qgeocircle.h qgeocoordinate.h qgeolocation.h qgeopath.h qgeopolygon.h qgeopositioninfo.h qgeopositioninfosource.h qgeopositioninfosourcefactory.h qgeorectangle.h qgeosatelliteinfo.h qgeosatelliteinfosource.h qgeoshape.h qnmeapositioninfosource.h qpositioningglobal.h +SYNCQT.INJECTIONS = diff --git a/include/QtPositioning/qgeoaddress.h b/include/QtPositioning/qgeoaddress.h new file mode 100644 index 0000000..b8e0a99 --- /dev/null +++ b/include/QtPositioning/qgeoaddress.h @@ -0,0 +1 @@ +#include "../../src/positioning/qgeoaddress.h" diff --git a/include/QtPositioning/qgeoareamonitorinfo.h b/include/QtPositioning/qgeoareamonitorinfo.h new file mode 100644 index 0000000..f9a334c --- /dev/null +++ b/include/QtPositioning/qgeoareamonitorinfo.h @@ -0,0 +1 @@ +#include "../../src/positioning/qgeoareamonitorinfo.h" diff --git a/include/QtPositioning/qgeoareamonitorsource.h b/include/QtPositioning/qgeoareamonitorsource.h new file mode 100644 index 0000000..4555de8 --- /dev/null +++ b/include/QtPositioning/qgeoareamonitorsource.h @@ -0,0 +1 @@ +#include "../../src/positioning/qgeoareamonitorsource.h" diff --git a/include/QtPositioning/qgeocircle.h b/include/QtPositioning/qgeocircle.h new file mode 100644 index 0000000..f598c2c --- /dev/null +++ b/include/QtPositioning/qgeocircle.h @@ -0,0 +1 @@ +#include "../../src/positioning/qgeocircle.h" diff --git a/include/QtPositioning/qgeocoordinate.h b/include/QtPositioning/qgeocoordinate.h new file mode 100644 index 0000000..93b16d9 --- /dev/null +++ b/include/QtPositioning/qgeocoordinate.h @@ -0,0 +1 @@ +#include "../../src/positioning/qgeocoordinate.h" diff --git a/include/QtPositioning/qgeolocation.h b/include/QtPositioning/qgeolocation.h new file mode 100644 index 0000000..59429ea --- /dev/null +++ b/include/QtPositioning/qgeolocation.h @@ -0,0 +1 @@ +#include "../../src/positioning/qgeolocation.h" diff --git a/include/QtPositioning/qgeopath.h b/include/QtPositioning/qgeopath.h new file mode 100644 index 0000000..8e61b7e --- /dev/null +++ b/include/QtPositioning/qgeopath.h @@ -0,0 +1 @@ +#include "../../src/positioning/qgeopath.h" diff --git a/include/QtPositioning/qgeopolygon.h b/include/QtPositioning/qgeopolygon.h new file mode 100644 index 0000000..c9e8296 --- /dev/null +++ b/include/QtPositioning/qgeopolygon.h @@ -0,0 +1 @@ +#include "../../src/positioning/qgeopolygon.h" diff --git a/include/QtPositioning/qgeopositioninfo.h b/include/QtPositioning/qgeopositioninfo.h new file mode 100644 index 0000000..213fbb2 --- /dev/null +++ b/include/QtPositioning/qgeopositioninfo.h @@ -0,0 +1 @@ +#include "../../src/positioning/qgeopositioninfo.h" diff --git a/include/QtPositioning/qgeopositioninfosource.h b/include/QtPositioning/qgeopositioninfosource.h new file mode 100644 index 0000000..8f7082d --- /dev/null +++ b/include/QtPositioning/qgeopositioninfosource.h @@ -0,0 +1 @@ +#include "../../src/positioning/qgeopositioninfosource.h" diff --git a/include/QtPositioning/qgeopositioninfosourcefactory.h b/include/QtPositioning/qgeopositioninfosourcefactory.h new file mode 100644 index 0000000..e59bdd9 --- /dev/null +++ b/include/QtPositioning/qgeopositioninfosourcefactory.h @@ -0,0 +1 @@ +#include "../../src/positioning/qgeopositioninfosourcefactory.h" diff --git a/include/QtPositioning/qgeorectangle.h b/include/QtPositioning/qgeorectangle.h new file mode 100644 index 0000000..f4a6526 --- /dev/null +++ b/include/QtPositioning/qgeorectangle.h @@ -0,0 +1 @@ +#include "../../src/positioning/qgeorectangle.h" diff --git a/include/QtPositioning/qgeosatelliteinfo.h b/include/QtPositioning/qgeosatelliteinfo.h new file mode 100644 index 0000000..1c1d631 --- /dev/null +++ b/include/QtPositioning/qgeosatelliteinfo.h @@ -0,0 +1 @@ +#include "../../src/positioning/qgeosatelliteinfo.h" diff --git a/include/QtPositioning/qgeosatelliteinfosource.h b/include/QtPositioning/qgeosatelliteinfosource.h new file mode 100644 index 0000000..a3115b1 --- /dev/null +++ b/include/QtPositioning/qgeosatelliteinfosource.h @@ -0,0 +1 @@ +#include "../../src/positioning/qgeosatelliteinfosource.h" diff --git a/include/QtPositioning/qgeoshape.h b/include/QtPositioning/qgeoshape.h new file mode 100644 index 0000000..6e7d4db --- /dev/null +++ b/include/QtPositioning/qgeoshape.h @@ -0,0 +1 @@ +#include "../../src/positioning/qgeoshape.h" diff --git a/include/QtPositioning/qnmeapositioninfosource.h b/include/QtPositioning/qnmeapositioninfosource.h new file mode 100644 index 0000000..6f5d63d --- /dev/null +++ b/include/QtPositioning/qnmeapositioninfosource.h @@ -0,0 +1 @@ +#include "../../src/positioning/qnmeapositioninfosource.h" diff --git a/include/QtPositioning/qpositioningglobal.h b/include/QtPositioning/qpositioningglobal.h new file mode 100644 index 0000000..a291214 --- /dev/null +++ b/include/QtPositioning/qpositioningglobal.h @@ -0,0 +1 @@ +#include "../../src/positioning/qpositioningglobal.h" diff --git a/include/QtPositioning/qtpositioningversion.h b/include/QtPositioning/qtpositioningversion.h new file mode 100644 index 0000000..f955f38 --- /dev/null +++ b/include/QtPositioning/qtpositioningversion.h @@ -0,0 +1,9 @@ +/* This file was generated by syncqt. */ +#ifndef QT_QTPOSITIONING_VERSION_H +#define QT_QTPOSITIONING_VERSION_H + +#define QTPOSITIONING_VERSION_STR "5.15.8" + +#define QTPOSITIONING_VERSION 0x050F08 + +#endif // QT_QTPOSITIONING_VERSION_H diff --git a/include/QtPositioningQuick/5.15.8/QtPositioningQuick/private/qdeclarativegeoaddress_p.h b/include/QtPositioningQuick/5.15.8/QtPositioningQuick/private/qdeclarativegeoaddress_p.h new file mode 100644 index 0000000..98e5c13 --- /dev/null +++ b/include/QtPositioningQuick/5.15.8/QtPositioningQuick/private/qdeclarativegeoaddress_p.h @@ -0,0 +1 @@ +#include "../../../../../src/positioningquick/qdeclarativegeoaddress_p.h" diff --git a/include/QtPositioningQuick/5.15.8/QtPositioningQuick/private/qdeclarativegeolocation_p.h b/include/QtPositioningQuick/5.15.8/QtPositioningQuick/private/qdeclarativegeolocation_p.h new file mode 100644 index 0000000..b0c75f1 --- /dev/null +++ b/include/QtPositioningQuick/5.15.8/QtPositioningQuick/private/qdeclarativegeolocation_p.h @@ -0,0 +1 @@ +#include "../../../../../src/positioningquick/qdeclarativegeolocation_p.h" diff --git a/include/QtPositioningQuick/5.15.8/QtPositioningQuick/private/qdeclarativepluginparameter_p.h b/include/QtPositioningQuick/5.15.8/QtPositioningQuick/private/qdeclarativepluginparameter_p.h new file mode 100644 index 0000000..bed66c7 --- /dev/null +++ b/include/QtPositioningQuick/5.15.8/QtPositioningQuick/private/qdeclarativepluginparameter_p.h @@ -0,0 +1 @@ +#include "../../../../../src/positioningquick/qdeclarativepluginparameter_p.h" diff --git a/include/QtPositioningQuick/5.15.8/QtPositioningQuick/private/qdeclarativeposition_p.h b/include/QtPositioningQuick/5.15.8/QtPositioningQuick/private/qdeclarativeposition_p.h new file mode 100644 index 0000000..151ff26 --- /dev/null +++ b/include/QtPositioningQuick/5.15.8/QtPositioningQuick/private/qdeclarativeposition_p.h @@ -0,0 +1 @@ +#include "../../../../../src/positioningquick/qdeclarativeposition_p.h" diff --git a/include/QtPositioningQuick/5.15.8/QtPositioningQuick/private/qdeclarativepositionsource_p.h b/include/QtPositioningQuick/5.15.8/QtPositioningQuick/private/qdeclarativepositionsource_p.h new file mode 100644 index 0000000..870a4fa --- /dev/null +++ b/include/QtPositioningQuick/5.15.8/QtPositioningQuick/private/qdeclarativepositionsource_p.h @@ -0,0 +1 @@ +#include "../../../../../src/positioningquick/qdeclarativepositionsource_p.h" diff --git a/include/QtPositioningQuick/5.15.8/QtPositioningQuick/private/qpositioningquickglobal_p.h b/include/QtPositioningQuick/5.15.8/QtPositioningQuick/private/qpositioningquickglobal_p.h new file mode 100644 index 0000000..532a737 --- /dev/null +++ b/include/QtPositioningQuick/5.15.8/QtPositioningQuick/private/qpositioningquickglobal_p.h @@ -0,0 +1 @@ +#include "../../../../../src/positioningquick/qpositioningquickglobal_p.h" diff --git a/include/QtPositioningQuick/5.15.8/QtPositioningQuick/private/qquickgeocoordinateanimation_p.h b/include/QtPositioningQuick/5.15.8/QtPositioningQuick/private/qquickgeocoordinateanimation_p.h new file mode 100644 index 0000000..08d8685 --- /dev/null +++ b/include/QtPositioningQuick/5.15.8/QtPositioningQuick/private/qquickgeocoordinateanimation_p.h @@ -0,0 +1 @@ +#include "../../../../../src/positioningquick/qquickgeocoordinateanimation_p.h" diff --git a/include/QtPositioningQuick/5.15.8/QtPositioningQuick/private/qquickgeocoordinateanimation_p_p.h b/include/QtPositioningQuick/5.15.8/QtPositioningQuick/private/qquickgeocoordinateanimation_p_p.h new file mode 100644 index 0000000..a50771e --- /dev/null +++ b/include/QtPositioningQuick/5.15.8/QtPositioningQuick/private/qquickgeocoordinateanimation_p_p.h @@ -0,0 +1 @@ +#include "../../../../../src/positioningquick/qquickgeocoordinateanimation_p_p.h" diff --git a/include/QtPositioningQuick/QtPositioningQuick b/include/QtPositioningQuick/QtPositioningQuick new file mode 100644 index 0000000..6b1a2f8 --- /dev/null +++ b/include/QtPositioningQuick/QtPositioningQuick @@ -0,0 +1,6 @@ +#ifndef QT_QTPOSITIONINGQUICK_MODULE_H +#define QT_QTPOSITIONINGQUICK_MODULE_H +#include +#include "qpositioningquickglobal.h" +#include "qtpositioningquickversion.h" +#endif diff --git a/include/QtPositioningQuick/QtPositioningQuickVersion b/include/QtPositioningQuick/QtPositioningQuickVersion new file mode 100644 index 0000000..2c697a7 --- /dev/null +++ b/include/QtPositioningQuick/QtPositioningQuickVersion @@ -0,0 +1 @@ +#include "qtpositioningquickversion.h" diff --git a/include/QtPositioningQuick/headers.pri b/include/QtPositioningQuick/headers.pri new file mode 100644 index 0000000..115ea26 --- /dev/null +++ b/include/QtPositioningQuick/headers.pri @@ -0,0 +1,6 @@ +SYNCQT.HEADER_FILES = qpositioningquickglobal.h +SYNCQT.GENERATED_HEADER_FILES = qtpositioningquickversion.h QtPositioningQuickVersion QtPositioningQuick +SYNCQT.PRIVATE_HEADER_FILES = qdeclarativegeoaddress_p.h qdeclarativegeolocation_p.h qdeclarativepluginparameter_p.h qdeclarativeposition_p.h qdeclarativepositionsource_p.h qpositioningquickglobal_p.h qquickgeocoordinateanimation_p.h qquickgeocoordinateanimation_p_p.h +SYNCQT.QPA_HEADER_FILES = +SYNCQT.CLEAN_HEADER_FILES = qpositioningquickglobal.h +SYNCQT.INJECTIONS = diff --git a/include/QtPositioningQuick/qpositioningquickglobal.h b/include/QtPositioningQuick/qpositioningquickglobal.h new file mode 100644 index 0000000..4c34141 --- /dev/null +++ b/include/QtPositioningQuick/qpositioningquickglobal.h @@ -0,0 +1 @@ +#include "../../src/positioningquick/qpositioningquickglobal.h" diff --git a/include/QtPositioningQuick/qtpositioningquickversion.h b/include/QtPositioningQuick/qtpositioningquickversion.h new file mode 100644 index 0000000..07bc44f --- /dev/null +++ b/include/QtPositioningQuick/qtpositioningquickversion.h @@ -0,0 +1,9 @@ +/* This file was generated by syncqt. */ +#ifndef QT_QTPOSITIONINGQUICK_VERSION_H +#define QT_QTPOSITIONINGQUICK_VERSION_H + +#define QTPOSITIONINGQUICK_VERSION_STR "5.15.8" + +#define QTPOSITIONINGQUICK_VERSION 0x050F08 + +#endif // QT_QTPOSITIONINGQUICK_VERSION_H diff --git a/qtlocation.pro b/qtlocation.pro new file mode 100644 index 0000000..2577ff2 --- /dev/null +++ b/qtlocation.pro @@ -0,0 +1,8 @@ +requires(!wasm) +load(configure) +qtCompileTest(gypsy) +qtCompileTest(winrt) + +load(qt_parts) + +DISTFILES += sync.profile configure.json diff --git a/src/3rdparty/clip2tri/LICENSE b/src/3rdparty/clip2tri/LICENSE new file mode 100644 index 0000000..9d99b88 --- /dev/null +++ b/src/3rdparty/clip2tri/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014 Bitfighter developers + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/src/3rdparty/clip2tri/clip2tri.cpp b/src/3rdparty/clip2tri/clip2tri.cpp new file mode 100644 index 0000000..db4911c --- /dev/null +++ b/src/3rdparty/clip2tri/clip2tri.cpp @@ -0,0 +1,406 @@ +/* + * Authors: kaen, raptor, sam686, watusimoto + * + * Originally from the bitfighter source code + * + * The MIT License (MIT) + * + * Copyright (c) 2014 Bitfighter developers + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "clip2tri.h" +#include + +#include + +static const double clipperScaleFactor = 1073741822.0; +static const double clipperScaleFactorInv = 1.0 / 1073741822.0; + +using namespace p2t; + +namespace c2t +{ + + +static const F32 CLIPPER_SCALE_FACT = 1000.0f; +static const F32 CLIPPER_SCALE_FACT_INVERSE = 0.001f; + +///////////////////////////////// + +Point::Point() +{ + x = 0; + y = 0; +} + +Point::Point(const Point& pt) +{ + x = pt.x; + y = pt.y; +} + + +///////////////////////////////// + +clip2tri::clip2tri() : openSubject(false) +{ + // Do nothing! +} + +clip2tri::~clip2tri() +{ + // Do nothing! +} + + +void clip2tri::triangulate(const vector > &inputPolygons, vector &outputTriangles, + const vector &boundingPolygon) +{ + // Use clipper to clean. This upscales the floating point input + PolyTree solution; + mergePolysToPolyTree(inputPolygons, solution); + + Path bounds = upscaleClipperPoints(boundingPolygon); + + // This will downscale the Clipper output and use poly2tri to triangulate + triangulateComplex(outputTriangles, bounds, solution); +} + +void clip2tri::addClipPolygon(const Path &path) +{ + try // prevent any exception to spill into Qt + { + clipper.AddPath(path, ptClip, true); + } + catch(QtClipperLib::clipperException &e) + { + printf("addClipPolygon: %s\n", e.what()); + } +} + +void clip2tri::addSubjectPath(const Path &path, bool closed) +{ + try // prevent any exception to spill into Qt + { + clipper.AddPath(path, ptSubject, closed); + } + catch(QtClipperLib::clipperException &e) + { + printf("addSubjectPath: %s\n", e.what()); + return; + } + if (!closed) + openSubject = true; +} + +void clip2tri::clearClipper() +{ + // clear doesn't throw + clipper.Clear(); + openSubject = false; +} + +static QtClipperLib::ClipType operation(const clip2tri::Operation &op) +{ + switch (op) { + case clip2tri::Intersection: + return QtClipperLib::ctIntersection; + case clip2tri::Union: + return QtClipperLib::ctUnion; + case clip2tri::Difference: + return QtClipperLib::ctDifference; + case clip2tri::Xor: + return QtClipperLib::ctXor; + } + return ctIntersection; +} + +static std::string operationName(const clip2tri::Operation &op) +{ + switch (op) { + case clip2tri::Intersection: + return std::string("Intersection"); + case clip2tri::Union: + return std::string("Union"); + case clip2tri::Difference: + return std::string("Difference"); + case clip2tri::Xor: + return std::string("Xor"); + } + return std::string("Intersection"); +} + +Paths clip2tri::execute(const clip2tri::Operation op, const PolyFillType subjFillType, const PolyFillType clipFillType) +{ + Paths solution; + try // prevent any exception from spilling into Qt + { + if (!openSubject) { + clipper.Execute(operation(op), solution, subjFillType, clipFillType); + } else { + PolyTree res; + clipper.Execute(operation(op), res, subjFillType, clipFillType); + PolyNode *n = res.GetFirst(); + if (n) { + solution.push_back(n->Contour); + while ((n = n->GetNext())) + solution.push_back(n->Contour); + } + } + } + catch(QtClipperLib::clipperException &e) + { + printf("executing %s: %s\n", operationName(op).c_str(), e.what()); + } + return solution; +} + +int clip2tri::pointInPolygon(const IntPoint &pt, const Path &path) +{ + return PointInPolygon(pt, path); +} + +Path clip2tri::upscaleClipperPoints(const vector &inputPolygon) +{ + Path outputPolygon; + outputPolygon.resize(inputPolygon.size()); + + for(S32 i = 0; i < inputPolygon.size(); i++) + outputPolygon[i] = IntPoint(S64(inputPolygon[i].x * CLIPPER_SCALE_FACT), S64(inputPolygon[i].y * CLIPPER_SCALE_FACT)); + + return outputPolygon; +} + + +Paths clip2tri::upscaleClipperPoints(const vector > &inputPolygons) +{ + Paths outputPolygons; + + outputPolygons.resize(inputPolygons.size()); + + for(S32 i = 0; i < inputPolygons.size(); i++) + { + outputPolygons[i].resize(inputPolygons[i].size()); + + for(S32 j = 0; j < inputPolygons[i].size(); j++) + outputPolygons[i][j] = IntPoint(S64(inputPolygons[i][j].x * CLIPPER_SCALE_FACT), S64(inputPolygons[i][j].y * CLIPPER_SCALE_FACT)); + } + + return outputPolygons; +} + + +vector > clip2tri::downscaleClipperPoints(const Paths &inputPolygons) +{ + vector > outputPolygons; + + outputPolygons.resize(inputPolygons.size()); + + for(U32 i = 0; i < inputPolygons.size(); i++) + { + outputPolygons[i].resize(inputPolygons[i].size()); + + for(U32 j = 0; j < inputPolygons[i].size(); j++) + outputPolygons[i][j] = Point(F32(inputPolygons[i][j].X) * CLIPPER_SCALE_FACT_INVERSE, F32(inputPolygons[i][j].Y) * CLIPPER_SCALE_FACT_INVERSE); + } + + return outputPolygons; +} + + +// Use Clipper to merge inputPolygons, placing the result in a Polytree +// NOTE: this does NOT downscale the Clipper points. You must do this afterwards +// +// Here you add all your non-navigatable objects (e.g. walls, barriers, etc.) +bool clip2tri::mergePolysToPolyTree(const vector > &inputPolygons, PolyTree &solution) +{ + Paths input = upscaleClipperPoints(inputPolygons); + + // Fire up clipper and union! + Clipper clipper; + clipper.StrictlySimple(true); + + try // there is a "throw" in AddPolygon + { + clipper.AddPaths(input, ptSubject, true); + } + catch(QtClipperLib::clipperException &e) + { + printf("mergePolysToPolyTree: %s\n", e.what()); + } + + return clipper.Execute(ctUnion, solution, pftNonZero, pftNonZero); +} + + +// Delete all poly2tri points from a vector and clear the vector +static void deleteAndClear(vector &vec) +{ + for(U32 i = 0; i < vec.size(); i++) + delete vec[i]; + + vec.clear(); +} + + +// Shrink large polygons by reducing each coordinate by 1 in the +// general direction of the last point as we wind around +// +// This normally wouldn't work in every case, but our upscaled-by-1000 polygons +// have little chance to create new duplicate points with this method. +// +// For information on why this was needed, see: +// +// https://code.google.com/p/poly2tri/issues/detail?id=90 +// +static void edgeShrink(Path &path) +{ + U32 prev = path.size() - 1; + for(U32 i = 0; i < path.size(); i++) + { + // Adjust coordinate by 1 depending on the direction + path[i].X - path[prev].X > 0 ? path[i].X-- : path[i].X++; + path[i].Y - path[prev].Y > 0 ? path[i].Y-- : path[i].Y++; + + prev = i; + } +} + + +// This uses poly2tri to triangulate. poly2tri isn't very robust so clipper needs to do +// the cleaning of points before getting here. +// +// A tree structure of polygons is required for doing complex polygons-within-polygons. +// For reference discussion on how this started to be developed, see here: +// +// https://code.google.com/p/poly2tri/issues/detail?id=74 +// +// For assistance with a special case crash, see this utility: +// http://javascript.poly2tri.googlecode.com/hg/index.html +// +// FIXME: what is ignoreFills and ignoreHoles for? kaen? +bool clip2tri::triangulateComplex(vector &outputTriangles, const Path &outline, + const PolyTree &polyTree, bool ignoreFills, bool ignoreHoles) +{ + // Keep track of memory for all the poly2tri objects we create + vector cdtRegistry; + vector > holesRegistry; + vector > polylinesRegistry; + + + // Let's be tricky and add our outline to the root node (it should have none), it'll be + // our first Clipper hole + PolyNode *rootNode = NULL; + + PolyNode tempNode; + if(polyTree.Total() == 0) // Polytree is empty with no root node, e.g. on an empty level + rootNode = &tempNode; + else + rootNode = polyTree.GetFirst()->Parent; + + rootNode->Contour = outline; + + // Now traverse our polyline nodes and triangulate them with only their children holes + PolyNode *currentNode = rootNode; + while(currentNode != NULL) + { + // A Clipper hole is actually what we want to build zones for; they become our bounding + // polylines. poly2tri holes are therefore the inverse + if((!ignoreHoles && currentNode->IsHole()) || + (!ignoreFills && !currentNode->IsHole())) + { + // Build up this polyline in poly2tri's format (downscale Clipper points) + vector polyline; + for(U32 j = 0; j < currentNode->Contour.size(); j++) + polyline.push_back(new p2t::Point(F64(currentNode->Contour[j].X), F64(currentNode->Contour[j].Y))); + + polylinesRegistry.push_back(polyline); // Memory + + // Set our polyline in poly2tri + p2t::CDT* cdt = new p2t::CDT(polyline); + cdtRegistry.push_back(cdt); + + for(U32 j = 0; j < currentNode->Childs.size(); j++) + { + PolyNode *childNode = currentNode->Childs[j]; + + // Slightly modify the polygon to guarantee no duplicate points + edgeShrink(childNode->Contour); + + vector hole; + for(U32 k = 0; k < childNode->Contour.size(); k++) + hole.push_back(new p2t::Point(F64(childNode->Contour[k].X), F64(childNode->Contour[k].Y))); + + holesRegistry.push_back(hole); // Memory + + // Add the holes for this polyline + cdt->AddHole(hole); + } + + cdt->Triangulate(); + + // Add current output triangles to our total + vector currentOutput = cdt->GetTriangles(); + + // Copy our data to TNL::Point and to our output Vector + p2t::Triangle *currentTriangle; + for(U32 j = 0; j < currentOutput.size(); j++) + { + currentTriangle = currentOutput[j]; + outputTriangles.push_back(Point(currentTriangle->GetPoint(0)->x * CLIPPER_SCALE_FACT_INVERSE, currentTriangle->GetPoint(0)->y * CLIPPER_SCALE_FACT_INVERSE)); + outputTriangles.push_back(Point(currentTriangle->GetPoint(1)->x * CLIPPER_SCALE_FACT_INVERSE, currentTriangle->GetPoint(1)->y * CLIPPER_SCALE_FACT_INVERSE)); + outputTriangles.push_back(Point(currentTriangle->GetPoint(2)->x * CLIPPER_SCALE_FACT_INVERSE, currentTriangle->GetPoint(2)->y * CLIPPER_SCALE_FACT_INVERSE)); + } + } + + currentNode = currentNode->GetNext(); + } + + + // Clean up memory used with poly2tri + // + // Clean-up workers + for(S32 i = 0; i < cdtRegistry.size(); i++) + delete cdtRegistry[i]; + + // Free the polylines + for(S32 i = 0; i < polylinesRegistry.size(); i++) + { + vector polyline = polylinesRegistry[i]; + deleteAndClear(polyline); + } + + // Free the holes + for(S32 i = 0; i < holesRegistry.size(); i++) + { + vector hole = holesRegistry[i]; + deleteAndClear(hole); + } + + // Make sure we have output data + if(outputTriangles.size() == 0) + return false; + + return true; +} + + +} /* namespace c2t */ diff --git a/src/3rdparty/clip2tri/clip2tri.h b/src/3rdparty/clip2tri/clip2tri.h new file mode 100644 index 0000000..3848d00 --- /dev/null +++ b/src/3rdparty/clip2tri/clip2tri.h @@ -0,0 +1,102 @@ +/* + * Authors: kaen, raptor, sam686, watusimoto + * + * Originally from the bitfighter source code + * + * The MIT License (MIT) + * + * Copyright (c) 2014 Bitfighter developers + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#ifndef CLIP2TRI_H_ +#define CLIP2TRI_H_ + +#include +#include + +using namespace std; +using namespace QtClipperLib; + +namespace c2t +{ + +typedef signed int S32; +typedef signed long long S64; +typedef unsigned int U32; +typedef float F32; +typedef double F64; + + +struct Point +{ + F32 x; + F32 y; + + Point(); + Point(const Point &pt); + + template + Point(T in_x, U in_y) { x = static_cast(in_x); y = static_cast(in_y); } +}; + +class clip2tri +{ +private: + // + Path upscaleClipperPoints(const vector &inputPolygon); + + // These operate on a vector of polygons + Paths upscaleClipperPoints(const vector > &inputPolygons); + vector > downscaleClipperPoints(const Paths &inputPolygons); + + bool mergePolysToPolyTree(const vector > &inputPolygons, PolyTree &solution); + + bool triangulateComplex(vector &outputTriangles, const Path &outline, + const PolyTree &polyTree, bool ignoreFills = true, bool ignoreHoles = false); + +public: + enum Operation { Union, Intersection, Difference, Xor }; + clip2tri(); + virtual ~clip2tri(); + + void triangulate(const vector > &inputPolygons, vector &outputTriangles, + const vector &boundingPolygon); + + // Clip polygons are intended as closed, even if the first and last vertex aren't the same. + void addClipPolygon(const Path &path); + // Closed means the path has to be effectively closed. Meaning path[0] == path[path.size()-1] + void addSubjectPath(const Path &path, bool closed); + + void clearClipper(); + + Paths execute(const Operation op, + const PolyFillType subjFillType = pftNonZero, + const PolyFillType clipFillType = pftNonZero); + + static int pointInPolygon(const IntPoint &pt, const Path &path); + + Clipper clipper; + bool openSubject; +}; + +} /* namespace c2t */ + +#endif /* CLIP2TRI_H_ */ diff --git a/src/3rdparty/clip2tri/clip2tri.pro b/src/3rdparty/clip2tri/clip2tri.pro new file mode 100644 index 0000000..4059a63 --- /dev/null +++ b/src/3rdparty/clip2tri/clip2tri.pro @@ -0,0 +1,22 @@ +TARGET = qt_clip2tri + +CONFIG += staticlib exceptions warn_off optimize_full + +INCLUDEPATH += ../poly2tri +INCLUDEPATH += ../clipper + +load(qt_helper_lib) + +# workaround for QTBUG-31586 +contains(QT_CONFIG, c++11): CONFIG += c++11 + +gcc { + QMAKE_CFLAGS_OPTIMIZE_FULL += -ffast-math + !clang:!intel_icc:!rim_qcc: QMAKE_CXXFLAGS_WARN_ON += -Wno-error=return-type +} + +HEADERS += clip2tri.h +SOURCES += clip2tri.cpp + +LIBS_PRIVATE += -L$$MODULE_BASE_OUTDIR/lib -lqt_poly2tri$$qtPlatformTargetSuffix() -lqt_clipper$$qtPlatformTargetSuffix() + diff --git a/src/3rdparty/clip2tri/qt_attribution.json b/src/3rdparty/clip2tri/qt_attribution.json new file mode 100644 index 0000000..1316f63 --- /dev/null +++ b/src/3rdparty/clip2tri/qt_attribution.json @@ -0,0 +1,13 @@ +{ + "Id": "clip2tri", + "Name": "Clip2Tri Polygon Triangulation Library", + "QDocModule": "qtlocation", + "QtUsage": "Used in the QML plugin of Qt Location.", + + "Description": "Clip2Tri can be used together with Clipper for robust triangulation.", + "Homepage": "https://github.com/raptor/clip2tri", + "LicenseId": "MIT", + "License": "MIT License", + "LicenseFile": "LICENSE", + "Copyright": "Copyright (c) 2014 Bitfighter developers" +} diff --git a/src/3rdparty/clipper/LICENSE b/src/3rdparty/clipper/LICENSE new file mode 100644 index 0000000..2213e37 --- /dev/null +++ b/src/3rdparty/clipper/LICENSE @@ -0,0 +1,48 @@ +Use, modification & distribution is subject to Boost Software License Ver 1. +http://www.boost.org/LICENSE_1_0.txt + +Attributions: +The code in this library is an extension of Bala Vatti's clipping algorithm: +"A generic solution to polygon clipping" +Communications of the ACM, Vol 35, Issue 7 (July 1992) pp 56-63. +http://portal.acm.org/citation.cfm?id=129906 + +Computer graphics and geometric modeling: implementation and algorithms +By Max K. Agoston +Springer; 1 edition (January 4, 2005) +http://books.google.com/books?q=vatti+clipping+agoston + +See also: +"Polygon Offsetting by Computing Winding Numbers" +Paper no. DETC2005-85513 pp. 565-575 +ASME 2005 International Design Engineering Technical Conferences +and Computers and Information in Engineering Conference (IDETC/CIE2005) +September 24-28, 2005 , Long Beach, California, USA +http://www.me.berkeley.edu/~mcmains/pubs/DAC05OffsetPolygon.pdf + + + +Boost Software License - Version 1.0 - August 17th, 2003 +http://www.boost.org/LICENSE_1_0.txt + +Permission is hereby granted, free of charge, to any person or organization +obtaining a copy of the software and accompanying documentation covered by +this license (the "Software") to use, reproduce, display, distribute, +execute, and transmit the Software, and to prepare derivative works of the +Software, and to permit third-parties to whom the Software is furnished to +do so, all subject to the following: + +The copyright notices in the Software and this entire statement, including +the above license grant, this restriction and the following disclaimer, +must be included in all copies of the Software, in whole or in part, and +all derivative works of the Software, unless such copies or derivative +works are solely in the form of machine-executable object code generated by +a source language processor. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/src/3rdparty/clipper/clipper.cpp b/src/3rdparty/clipper/clipper.cpp new file mode 100644 index 0000000..53ac4d8 --- /dev/null +++ b/src/3rdparty/clipper/clipper.cpp @@ -0,0 +1,4622 @@ +/******************************************************************************* +* * +* Author : Angus Johnson * +* Version : 6.4.0 * +* Date : 2 July 2015 * +* Website : http://www.angusj.com * +* Copyright : Angus Johnson 2010-2015 * +* * +* License: * +* Use, modification & distribution is subject to Boost Software License Ver 1. * +* http://www.boost.org/LICENSE_1_0.txt * +* * +* Attributions: * +* The code in this library is an extension of Bala Vatti's clipping algorithm: * +* "A generic solution to polygon clipping" * +* Communications of the ACM, Vol 35, Issue 7 (July 1992) pp 56-63. * +* http://portal.acm.org/citation.cfm?id=129906 * +* * +* Computer graphics and geometric modeling: implementation and algorithms * +* By Max K. Agoston * +* Springer; 1 edition (January 4, 2005) * +* http://books.google.com/books?q=vatti+clipping+agoston * +* * +* See also: * +* "Polygon Offsetting by Computing Winding Numbers" * +* Paper no. DETC2005-85513 pp. 565-575 * +* ASME 2005 International Design Engineering Technical Conferences * +* and Computers and Information in Engineering Conference (IDETC/CIE2005) * +* September 24-28, 2005 , Long Beach, California, USA * +* http://www.me.berkeley.edu/~mcmains/pubs/DAC05OffsetPolygon.pdf * +* * +*******************************************************************************/ + +/******************************************************************************* +* * +* This is a translation of the Delphi Clipper library and the naming style * +* used has retained a Delphi flavour. * +* * +*******************************************************************************/ + +#include "clipper.h" +#include +#include +#include +#include +#include +#include +#include +#include + +namespace QtClipperLib { + +static double const pi = 3.141592653589793238; +static double const two_pi = pi *2; +static double const def_arc_tolerance = 0.25; + +enum Direction { dRightToLeft, dLeftToRight }; + +static int const Unassigned = -1; //edge not currently 'owning' a solution +static int const Skip = -2; //edge that would otherwise close a path + +#define HORIZONTAL (-1.0E+40) +#define TOLERANCE (1.0e-20) +#define NEAR_ZERO(val) (((val) > -TOLERANCE) && ((val) < TOLERANCE)) + +struct TEdge { + IntPoint Bot; + IntPoint Curr; //current (updated for every new scanbeam) + IntPoint Top; + double Dx; + PolyType PolyTyp; + EdgeSide Side; //side only refers to current side of solution poly + int WindDelta; //1 or -1 depending on winding direction + int WindCnt; + int WindCnt2; //winding count of the opposite polytype + int OutIdx; + TEdge *Next; + TEdge *Prev; + TEdge *NextInLML; + TEdge *NextInAEL; + TEdge *PrevInAEL; + TEdge *NextInSEL; + TEdge *PrevInSEL; +}; + +struct IntersectNode { + TEdge *Edge1; + TEdge *Edge2; + IntPoint Pt; +}; + +struct LocalMinimum { + cInt Y; + TEdge *LeftBound; + TEdge *RightBound; +}; + +struct OutPt; + +//OutRec: contains a path in the clipping solution. Edges in the AEL will +//carry a pointer to an OutRec when they are part of the clipping solution. +struct OutRec { + int Idx; + bool IsHole; + bool IsOpen; + OutRec *FirstLeft; //see comments in clipper.pas + PolyNode *PolyNd; + OutPt *Pts; + OutPt *BottomPt; +}; + +struct OutPt { + int Idx; + IntPoint Pt; + OutPt *Next; + OutPt *Prev; +}; + +struct Join { + OutPt *OutPt1; + OutPt *OutPt2; + IntPoint OffPt; +}; + +struct LocMinSorter +{ + inline bool operator()(const LocalMinimum& locMin1, const LocalMinimum& locMin2) + { + return locMin2.Y < locMin1.Y; + } +}; + +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +inline cInt Round(double val) +{ + if ((val < 0)) return static_cast(val - 0.5); + else return static_cast(val + 0.5); +} +//------------------------------------------------------------------------------ + +inline cInt Abs(cInt val) +{ + return val < 0 ? -val : val; +} + +//------------------------------------------------------------------------------ +// PolyTree methods ... +//------------------------------------------------------------------------------ + +void PolyTree::Clear() +{ + for (PolyNodes::size_type i = 0; i < AllNodes.size(); ++i) + delete AllNodes[i]; + AllNodes.resize(0); + Childs.resize(0); +} +//------------------------------------------------------------------------------ + +PolyNode* PolyTree::GetFirst() const +{ + if (!Childs.empty()) + return Childs[0]; + else + return 0; +} +//------------------------------------------------------------------------------ + +int PolyTree::Total() const +{ + int result = (int)AllNodes.size(); + //with negative offsets, ignore the hidden outer polygon ... + if (result > 0 && Childs[0] != AllNodes[0]) result--; + return result; +} + +//------------------------------------------------------------------------------ +// PolyNode methods ... +//------------------------------------------------------------------------------ + +PolyNode::PolyNode(): Childs(), Parent(0), Index(0), m_IsOpen(false) +{ +} +//------------------------------------------------------------------------------ + +int PolyNode::ChildCount() const +{ + return (int)Childs.size(); +} +//------------------------------------------------------------------------------ + +void PolyNode::AddChild(PolyNode& child) +{ + unsigned cnt = (unsigned)Childs.size(); + Childs.push_back(&child); + child.Parent = this; + child.Index = cnt; +} +//------------------------------------------------------------------------------ + +PolyNode* PolyNode::GetNext() const +{ + if (!Childs.empty()) + return Childs[0]; + else + return GetNextSiblingUp(); +} +//------------------------------------------------------------------------------ + +PolyNode* PolyNode::GetNextSiblingUp() const +{ + if (!Parent) //protects against PolyTree.GetNextSiblingUp() + return 0; + else if (Index == Parent->Childs.size() - 1) + return Parent->GetNextSiblingUp(); + else + return Parent->Childs[Index + 1]; +} +//------------------------------------------------------------------------------ + +bool PolyNode::IsHole() const +{ + bool result = true; + PolyNode* node = Parent; + while (node) + { + result = !result; + node = node->Parent; + } + return result; +} +//------------------------------------------------------------------------------ + +bool PolyNode::IsOpen() const +{ + return m_IsOpen; +} +//------------------------------------------------------------------------------ + +#ifndef use_int32 + +//------------------------------------------------------------------------------ +// Int128 class (enables safe math on signed 64bit integers) +// eg Int128 val1((long64)9223372036854775807); //ie 2^63 -1 +// Int128 val2((long64)9223372036854775807); +// Int128 val3 = val1 * val2; +// val3.AsString => "85070591730234615847396907784232501249" (8.5e+37) +//------------------------------------------------------------------------------ + +class Int128 +{ + public: + ulong64 lo; + long64 hi; + + Int128(long64 _lo = 0) + { + lo = (ulong64)_lo; + if (_lo < 0) hi = -1; else hi = 0; + } + + + Int128(const Int128 &val): lo(val.lo), hi(val.hi){} + + Int128(const long64& _hi, const ulong64& _lo): lo(_lo), hi(_hi){} + + Int128& operator = (const long64 &val) + { + lo = (ulong64)val; + if (val < 0) hi = -1; else hi = 0; + return *this; + } + + bool operator == (const Int128 &val) const + {return (hi == val.hi && lo == val.lo);} + + bool operator != (const Int128 &val) const + { return !(*this == val);} + + bool operator > (const Int128 &val) const + { + if (hi != val.hi) + return hi > val.hi; + else + return lo > val.lo; + } + + bool operator < (const Int128 &val) const + { + if (hi != val.hi) + return hi < val.hi; + else + return lo < val.lo; + } + + bool operator >= (const Int128 &val) const + { return !(*this < val);} + + bool operator <= (const Int128 &val) const + { return !(*this > val);} + + Int128& operator += (const Int128 &rhs) + { + hi += rhs.hi; + lo += rhs.lo; + if (lo < rhs.lo) hi++; + return *this; + } + + Int128 operator + (const Int128 &rhs) const + { + Int128 result(*this); + result+= rhs; + return result; + } + + Int128& operator -= (const Int128 &rhs) + { + *this += -rhs; + return *this; + } + + Int128 operator - (const Int128 &rhs) const + { + Int128 result(*this); + result -= rhs; + return result; + } + + Int128 operator-() const //unary negation + { + if (lo == 0) + return Int128(-hi, 0); + else + return Int128(~hi, ~lo + 1); + } + + operator double() const + { + const double shift64 = 18446744073709551616.0; //2^64 + if (hi < 0) + { + if (lo == 0) return (double)hi * shift64; + else return -(double)(~lo + ~hi * shift64); + } + else + return (double)(lo + hi * shift64); + } + +}; +//------------------------------------------------------------------------------ + +Int128 Int128Mul (long64 lhs, long64 rhs) +{ + bool negate = (lhs < 0) != (rhs < 0); + + if (lhs < 0) lhs = -lhs; + ulong64 int1Hi = ulong64(lhs) >> 32; + ulong64 int1Lo = ulong64(lhs & 0xFFFFFFFF); + + if (rhs < 0) rhs = -rhs; + ulong64 int2Hi = ulong64(rhs) >> 32; + ulong64 int2Lo = ulong64(rhs & 0xFFFFFFFF); + + //nb: see comments in clipper.pas + ulong64 a = int1Hi * int2Hi; + ulong64 b = int1Lo * int2Lo; + ulong64 c = int1Hi * int2Lo + int1Lo * int2Hi; + + Int128 tmp; + tmp.hi = long64(a + (c >> 32)); + tmp.lo = long64(c << 32); + tmp.lo += long64(b); + if (tmp.lo < b) tmp.hi++; + if (negate) tmp = -tmp; + return tmp; +}; +#endif + +//------------------------------------------------------------------------------ +// Miscellaneous global functions +//------------------------------------------------------------------------------ + +bool Orientation(const Path &poly) +{ + return Area(poly) >= 0; +} +//------------------------------------------------------------------------------ + +double Area(const Path &poly) +{ + int size = (int)poly.size(); + if (size < 3) return 0; + + double a = 0; + for (int i = 0, j = size -1; i < size; ++i) + { + a += ((double)poly[j].X + poly[i].X) * ((double)poly[j].Y - poly[i].Y); + j = i; + } + return -a * 0.5; +} +//------------------------------------------------------------------------------ + +double Area(const OutPt *op) +{ + const OutPt *startOp = op; + if (!op) return 0; + double a = 0; + do { + a += (double)(op->Prev->Pt.X + op->Pt.X) * (double)(op->Prev->Pt.Y - op->Pt.Y); + op = op->Next; + } while (op != startOp); + return a * 0.5; +} +//------------------------------------------------------------------------------ + +double Area(const OutRec &outRec) +{ + return Area(outRec.Pts); +} +//------------------------------------------------------------------------------ + +bool PointIsVertex(const IntPoint &Pt, OutPt *pp) +{ + OutPt *pp2 = pp; + do + { + if (pp2->Pt == Pt) return true; + pp2 = pp2->Next; + } + while (pp2 != pp); + return false; +} +//------------------------------------------------------------------------------ + +//See "The Point in Polygon Problem for Arbitrary Polygons" by Hormann & Agathos +//http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.88.5498&rep=rep1&type=pdf +int PointInPolygon(const IntPoint &pt, const Path &path) +{ + //returns 0 if false, +1 if true, -1 if pt ON polygon boundary + int result = 0; + size_t cnt = path.size(); + if (cnt < 3) return 0; + IntPoint ip = path[0]; + for(size_t i = 1; i <= cnt; ++i) + { + IntPoint ipNext = (i == cnt ? path[0] : path[i]); + if (ipNext.Y == pt.Y) + { + if ((ipNext.X == pt.X) || (ip.Y == pt.Y && + ((ipNext.X > pt.X) == (ip.X < pt.X)))) return -1; + } + if ((ip.Y < pt.Y) != (ipNext.Y < pt.Y)) + { + if (ip.X >= pt.X) + { + if (ipNext.X > pt.X) result = 1 - result; + else + { + double d = (double)(ip.X - pt.X) * (ipNext.Y - pt.Y) - + (double)(ipNext.X - pt.X) * (ip.Y - pt.Y); + if (!d) return -1; + if ((d > 0) == (ipNext.Y > ip.Y)) result = 1 - result; + } + } else + { + if (ipNext.X > pt.X) + { + double d = (double)(ip.X - pt.X) * (ipNext.Y - pt.Y) - + (double)(ipNext.X - pt.X) * (ip.Y - pt.Y); + if (!d) return -1; + if ((d > 0) == (ipNext.Y > ip.Y)) result = 1 - result; + } + } + } + ip = ipNext; + } + return result; +} +//------------------------------------------------------------------------------ + +int PointInPolygon (const IntPoint &pt, OutPt *op) +{ + //returns 0 if false, +1 if true, -1 if pt ON polygon boundary + int result = 0; + OutPt* startOp = op; + for(;;) + { + if (op->Next->Pt.Y == pt.Y) + { + if ((op->Next->Pt.X == pt.X) || (op->Pt.Y == pt.Y && + ((op->Next->Pt.X > pt.X) == (op->Pt.X < pt.X)))) return -1; + } + if ((op->Pt.Y < pt.Y) != (op->Next->Pt.Y < pt.Y)) + { + if (op->Pt.X >= pt.X) + { + if (op->Next->Pt.X > pt.X) result = 1 - result; + else + { + double d = (double)(op->Pt.X - pt.X) * (op->Next->Pt.Y - pt.Y) - + (double)(op->Next->Pt.X - pt.X) * (op->Pt.Y - pt.Y); + if (!d) return -1; + if ((d > 0) == (op->Next->Pt.Y > op->Pt.Y)) result = 1 - result; + } + } else + { + if (op->Next->Pt.X > pt.X) + { + double d = (double)(op->Pt.X - pt.X) * (op->Next->Pt.Y - pt.Y) - + (double)(op->Next->Pt.X - pt.X) * (op->Pt.Y - pt.Y); + if (!d) return -1; + if ((d > 0) == (op->Next->Pt.Y > op->Pt.Y)) result = 1 - result; + } + } + } + op = op->Next; + if (startOp == op) break; + } + return result; +} +//------------------------------------------------------------------------------ + +bool Poly2ContainsPoly1(OutPt *OutPt1, OutPt *OutPt2) +{ + OutPt* op = OutPt1; + do + { + //nb: PointInPolygon returns 0 if false, +1 if true, -1 if pt on polygon + int res = PointInPolygon(op->Pt, OutPt2); + if (res >= 0) return res > 0; + op = op->Next; + } + while (op != OutPt1); + return true; +} +//---------------------------------------------------------------------- + +bool SlopesEqual(const TEdge &e1, const TEdge &e2, bool UseFullInt64Range) +{ +#ifndef use_int32 + if (UseFullInt64Range) + return Int128Mul(e1.Top.Y - e1.Bot.Y, e2.Top.X - e2.Bot.X) == + Int128Mul(e1.Top.X - e1.Bot.X, e2.Top.Y - e2.Bot.Y); + else +#endif + return (e1.Top.Y - e1.Bot.Y) * (e2.Top.X - e2.Bot.X) == + (e1.Top.X - e1.Bot.X) * (e2.Top.Y - e2.Bot.Y); +} +//------------------------------------------------------------------------------ + +bool SlopesEqual(const IntPoint pt1, const IntPoint pt2, + const IntPoint pt3, bool UseFullInt64Range) +{ +#ifndef use_int32 + if (UseFullInt64Range) + return Int128Mul(pt1.Y-pt2.Y, pt2.X-pt3.X) == Int128Mul(pt1.X-pt2.X, pt2.Y-pt3.Y); + else +#endif + return (pt1.Y-pt2.Y)*(pt2.X-pt3.X) == (pt1.X-pt2.X)*(pt2.Y-pt3.Y); +} +//------------------------------------------------------------------------------ + +bool SlopesEqual(const IntPoint pt1, const IntPoint pt2, + const IntPoint pt3, const IntPoint pt4, bool UseFullInt64Range) +{ +#ifndef use_int32 + if (UseFullInt64Range) + return Int128Mul(pt1.Y-pt2.Y, pt3.X-pt4.X) == Int128Mul(pt1.X-pt2.X, pt3.Y-pt4.Y); + else +#endif + return (pt1.Y-pt2.Y)*(pt3.X-pt4.X) == (pt1.X-pt2.X)*(pt3.Y-pt4.Y); +} +//------------------------------------------------------------------------------ + +inline bool IsHorizontal(TEdge &e) +{ + return e.Dx == HORIZONTAL; +} +//------------------------------------------------------------------------------ + +inline double GetDx(const IntPoint pt1, const IntPoint pt2) +{ + return (pt1.Y == pt2.Y) ? + HORIZONTAL : (double)(pt2.X - pt1.X) / (pt2.Y - pt1.Y); +} +//--------------------------------------------------------------------------- + +inline void SetDx(TEdge &e) +{ + cInt dy = (e.Top.Y - e.Bot.Y); + if (dy == 0) e.Dx = HORIZONTAL; + else e.Dx = (double)(e.Top.X - e.Bot.X) / dy; +} +//--------------------------------------------------------------------------- + +inline void SwapSides(TEdge &Edge1, TEdge &Edge2) +{ + EdgeSide Side = Edge1.Side; + Edge1.Side = Edge2.Side; + Edge2.Side = Side; +} +//------------------------------------------------------------------------------ + +inline void SwapPolyIndexes(TEdge &Edge1, TEdge &Edge2) +{ + int OutIdx = Edge1.OutIdx; + Edge1.OutIdx = Edge2.OutIdx; + Edge2.OutIdx = OutIdx; +} +//------------------------------------------------------------------------------ + +inline cInt TopX(TEdge &edge, const cInt currentY) +{ + return ( currentY == edge.Top.Y ) ? + edge.Top.X : edge.Bot.X + Round(edge.Dx *(currentY - edge.Bot.Y)); +} +//------------------------------------------------------------------------------ + +void IntersectPoint(TEdge &Edge1, TEdge &Edge2, IntPoint &ip) +{ +#ifdef use_xyz + ip.Z = 0; +#endif + + double b1, b2; + if (Edge1.Dx == Edge2.Dx) + { + ip.Y = Edge1.Curr.Y; + ip.X = TopX(Edge1, ip.Y); + return; + } + else if (Edge1.Dx == 0) + { + ip.X = Edge1.Bot.X; + if (IsHorizontal(Edge2)) + ip.Y = Edge2.Bot.Y; + else + { + b2 = Edge2.Bot.Y - (Edge2.Bot.X / Edge2.Dx); + ip.Y = Round(ip.X / Edge2.Dx + b2); + } + } + else if (Edge2.Dx == 0) + { + ip.X = Edge2.Bot.X; + if (IsHorizontal(Edge1)) + ip.Y = Edge1.Bot.Y; + else + { + b1 = Edge1.Bot.Y - (Edge1.Bot.X / Edge1.Dx); + ip.Y = Round(ip.X / Edge1.Dx + b1); + } + } + else + { + b1 = Edge1.Bot.X - Edge1.Bot.Y * Edge1.Dx; + b2 = Edge2.Bot.X - Edge2.Bot.Y * Edge2.Dx; + double q = (b2-b1) / (Edge1.Dx - Edge2.Dx); + ip.Y = Round(q); + if (std::fabs(Edge1.Dx) < std::fabs(Edge2.Dx)) + ip.X = Round(Edge1.Dx * q + b1); + else + ip.X = Round(Edge2.Dx * q + b2); + } + + if (ip.Y < Edge1.Top.Y || ip.Y < Edge2.Top.Y) + { + if (Edge1.Top.Y > Edge2.Top.Y) + ip.Y = Edge1.Top.Y; + else + ip.Y = Edge2.Top.Y; + if (std::fabs(Edge1.Dx) < std::fabs(Edge2.Dx)) + ip.X = TopX(Edge1, ip.Y); + else + ip.X = TopX(Edge2, ip.Y); + } + //finally, don't allow 'ip' to be BELOW curr.Y (ie bottom of scanbeam) ... + if (ip.Y > Edge1.Curr.Y) + { + ip.Y = Edge1.Curr.Y; + //use the more vertical edge to derive X ... + if (std::fabs(Edge1.Dx) > std::fabs(Edge2.Dx)) + ip.X = TopX(Edge2, ip.Y); else + ip.X = TopX(Edge1, ip.Y); + } +} +//------------------------------------------------------------------------------ + +void ReversePolyPtLinks(OutPt *pp) +{ + if (!pp) return; + OutPt *pp1, *pp2; + pp1 = pp; + do { + pp2 = pp1->Next; + pp1->Next = pp1->Prev; + pp1->Prev = pp2; + pp1 = pp2; + } while( pp1 != pp ); +} +//------------------------------------------------------------------------------ + +void DisposeOutPts(OutPt*& pp) +{ + if (pp == 0) return; + pp->Prev->Next = 0; + while( pp ) + { + OutPt *tmpPp = pp; + pp = pp->Next; + delete tmpPp; + } +} +//------------------------------------------------------------------------------ + +inline void InitEdge(TEdge* e, TEdge* eNext, TEdge* ePrev, const IntPoint& Pt) +{ + std::memset(e, 0, sizeof(TEdge)); + e->Next = eNext; + e->Prev = ePrev; + e->Curr = Pt; + e->OutIdx = Unassigned; +} +//------------------------------------------------------------------------------ + +void InitEdge2(TEdge& e, PolyType Pt) +{ + if (e.Curr.Y >= e.Next->Curr.Y) + { + e.Bot = e.Curr; + e.Top = e.Next->Curr; + } else + { + e.Top = e.Curr; + e.Bot = e.Next->Curr; + } + SetDx(e); + e.PolyTyp = Pt; +} +//------------------------------------------------------------------------------ + +TEdge* RemoveEdge(TEdge* e) +{ + //removes e from double_linked_list (but without removing from memory) + e->Prev->Next = e->Next; + e->Next->Prev = e->Prev; + TEdge* result = e->Next; + e->Prev = 0; //flag as removed (see ClipperBase.Clear) + return result; +} +//------------------------------------------------------------------------------ + +inline void ReverseHorizontal(TEdge &e) +{ + //swap horizontal edges' Top and Bottom x's so they follow the natural + //progression of the bounds - ie so their xbots will align with the + //adjoining lower edge. [Helpful in the ProcessHorizontal() method.] + std::swap(e.Top.X, e.Bot.X); +#ifdef use_xyz + std::swap(e.Top.Z, e.Bot.Z); +#endif +} +//------------------------------------------------------------------------------ + +void SwapPoints(IntPoint &pt1, IntPoint &pt2) +{ + IntPoint tmp = pt1; + pt1 = pt2; + pt2 = tmp; +} +//------------------------------------------------------------------------------ + +bool GetOverlapSegment(IntPoint pt1a, IntPoint pt1b, IntPoint pt2a, + IntPoint pt2b, IntPoint &pt1, IntPoint &pt2) +{ + //precondition: segments are Collinear. + if (Abs(pt1a.X - pt1b.X) > Abs(pt1a.Y - pt1b.Y)) + { + if (pt1a.X > pt1b.X) SwapPoints(pt1a, pt1b); + if (pt2a.X > pt2b.X) SwapPoints(pt2a, pt2b); + if (pt1a.X > pt2a.X) pt1 = pt1a; else pt1 = pt2a; + if (pt1b.X < pt2b.X) pt2 = pt1b; else pt2 = pt2b; + return pt1.X < pt2.X; + } else + { + if (pt1a.Y < pt1b.Y) SwapPoints(pt1a, pt1b); + if (pt2a.Y < pt2b.Y) SwapPoints(pt2a, pt2b); + if (pt1a.Y < pt2a.Y) pt1 = pt1a; else pt1 = pt2a; + if (pt1b.Y > pt2b.Y) pt2 = pt1b; else pt2 = pt2b; + return pt1.Y > pt2.Y; + } +} +//------------------------------------------------------------------------------ + +bool FirstIsBottomPt(const OutPt* btmPt1, const OutPt* btmPt2) +{ + OutPt *p = btmPt1->Prev; + while ((p->Pt == btmPt1->Pt) && (p != btmPt1)) p = p->Prev; + double dx1p = std::fabs(GetDx(btmPt1->Pt, p->Pt)); + p = btmPt1->Next; + while ((p->Pt == btmPt1->Pt) && (p != btmPt1)) p = p->Next; + double dx1n = std::fabs(GetDx(btmPt1->Pt, p->Pt)); + + p = btmPt2->Prev; + while ((p->Pt == btmPt2->Pt) && (p != btmPt2)) p = p->Prev; + double dx2p = std::fabs(GetDx(btmPt2->Pt, p->Pt)); + p = btmPt2->Next; + while ((p->Pt == btmPt2->Pt) && (p != btmPt2)) p = p->Next; + double dx2n = std::fabs(GetDx(btmPt2->Pt, p->Pt)); + + if (std::max(dx1p, dx1n) == std::max(dx2p, dx2n) && + std::min(dx1p, dx1n) == std::min(dx2p, dx2n)) + return Area(btmPt1) > 0; //if otherwise identical use orientation + else + return (dx1p >= dx2p && dx1p >= dx2n) || (dx1n >= dx2p && dx1n >= dx2n); +} +//------------------------------------------------------------------------------ + +OutPt* GetBottomPt(OutPt *pp) +{ + OutPt* dups = 0; + OutPt* p = pp->Next; + while (p != pp) + { + if (p->Pt.Y > pp->Pt.Y) + { + pp = p; + dups = 0; + } + else if (p->Pt.Y == pp->Pt.Y && p->Pt.X <= pp->Pt.X) + { + if (p->Pt.X < pp->Pt.X) + { + dups = 0; + pp = p; + } else + { + if (p->Next != pp && p->Prev != pp) dups = p; + } + } + p = p->Next; + } + if (dups) + { + //there appears to be at least 2 vertices at BottomPt so ... + while (dups != p) + { + if (!FirstIsBottomPt(p, dups)) pp = dups; + dups = dups->Next; + while (dups->Pt != pp->Pt) dups = dups->Next; + } + } + return pp; +} +//------------------------------------------------------------------------------ + +bool Pt2IsBetweenPt1AndPt3(const IntPoint pt1, + const IntPoint pt2, const IntPoint pt3) +{ + if ((pt1 == pt3) || (pt1 == pt2) || (pt3 == pt2)) + return false; + else if (pt1.X != pt3.X) + return (pt2.X > pt1.X) == (pt2.X < pt3.X); + else + return (pt2.Y > pt1.Y) == (pt2.Y < pt3.Y); +} +//------------------------------------------------------------------------------ + +bool HorzSegmentsOverlap(cInt seg1a, cInt seg1b, cInt seg2a, cInt seg2b) +{ + if (seg1a > seg1b) std::swap(seg1a, seg1b); + if (seg2a > seg2b) std::swap(seg2a, seg2b); + return (seg1a < seg2b) && (seg2a < seg1b); +} + +//------------------------------------------------------------------------------ +// ClipperBase class methods ... +//------------------------------------------------------------------------------ + +ClipperBase::ClipperBase() //constructor +{ + m_CurrentLM = m_MinimaList.begin(); //begin() == end() here + m_UseFullRange = false; +} +//------------------------------------------------------------------------------ + +ClipperBase::~ClipperBase() //destructor +{ + Clear(); +} +//------------------------------------------------------------------------------ + +void RangeTest(const IntPoint& Pt, bool& useFullRange) +{ + if (useFullRange) + { + if (Pt.X > hiRange || Pt.Y > hiRange || -Pt.X > hiRange || -Pt.Y > hiRange) + throw clipperException("Coordinate outside allowed range"); + } + else if (Pt.X > loRange|| Pt.Y > loRange || -Pt.X > loRange || -Pt.Y > loRange) + { + useFullRange = true; + RangeTest(Pt, useFullRange); + } +} +//------------------------------------------------------------------------------ + +TEdge* FindNextLocMin(TEdge* E) +{ + for (;;) + { + while (E->Bot != E->Prev->Bot || E->Curr == E->Top) E = E->Next; + if (!IsHorizontal(*E) && !IsHorizontal(*E->Prev)) break; + while (IsHorizontal(*E->Prev)) E = E->Prev; + TEdge* E2 = E; + while (IsHorizontal(*E)) E = E->Next; + if (E->Top.Y == E->Prev->Bot.Y) continue; //ie just an intermediate horz. + if (E2->Prev->Bot.X < E->Bot.X) E = E2; + break; + } + return E; +} +//------------------------------------------------------------------------------ + +TEdge* ClipperBase::ProcessBound(TEdge* E, bool NextIsForward) +{ + TEdge *Result = E; + TEdge *Horz = 0; + + if (E->OutIdx == Skip) + { + //if edges still remain in the current bound beyond the skip edge then + //create another LocMin and call ProcessBound once more + if (NextIsForward) + { + while (E->Top.Y == E->Next->Bot.Y) E = E->Next; + //don't include top horizontals when parsing a bound a second time, + //they will be contained in the opposite bound ... + while (E != Result && IsHorizontal(*E)) E = E->Prev; + } + else + { + while (E->Top.Y == E->Prev->Bot.Y) E = E->Prev; + while (E != Result && IsHorizontal(*E)) E = E->Next; + } + + if (E == Result) + { + if (NextIsForward) Result = E->Next; + else Result = E->Prev; + } + else + { + //there are more edges in the bound beyond result starting with E + if (NextIsForward) + E = Result->Next; + else + E = Result->Prev; + MinimaList::value_type locMin; + locMin.Y = E->Bot.Y; + locMin.LeftBound = 0; + locMin.RightBound = E; + E->WindDelta = 0; + Result = ProcessBound(E, NextIsForward); + m_MinimaList.push_back(locMin); + } + return Result; + } + + TEdge *EStart; + + if (IsHorizontal(*E)) + { + //We need to be careful with open paths because this may not be a + //true local minima (ie E may be following a skip edge). + //Also, consecutive horz. edges may start heading left before going right. + if (NextIsForward) + EStart = E->Prev; + else + EStart = E->Next; + if (IsHorizontal(*EStart)) //ie an adjoining horizontal skip edge + { + if (EStart->Bot.X != E->Bot.X && EStart->Top.X != E->Bot.X) + ReverseHorizontal(*E); + } + else if (EStart->Bot.X != E->Bot.X) + ReverseHorizontal(*E); + } + + EStart = E; + if (NextIsForward) + { + while (Result->Top.Y == Result->Next->Bot.Y && Result->Next->OutIdx != Skip) + Result = Result->Next; + if (IsHorizontal(*Result) && Result->Next->OutIdx != Skip) + { + //nb: at the top of a bound, horizontals are added to the bound + //only when the preceding edge attaches to the horizontal's left vertex + //unless a Skip edge is encountered when that becomes the top divide + Horz = Result; + while (IsHorizontal(*Horz->Prev)) Horz = Horz->Prev; + if (Horz->Prev->Top.X > Result->Next->Top.X) Result = Horz->Prev; + } + while (E != Result) + { + E->NextInLML = E->Next; + if (IsHorizontal(*E) && E != EStart && + E->Bot.X != E->Prev->Top.X) ReverseHorizontal(*E); + E = E->Next; + } + if (IsHorizontal(*E) && E != EStart && E->Bot.X != E->Prev->Top.X) + ReverseHorizontal(*E); + Result = Result->Next; //move to the edge just beyond current bound + } else + { + while (Result->Top.Y == Result->Prev->Bot.Y && Result->Prev->OutIdx != Skip) + Result = Result->Prev; + if (IsHorizontal(*Result) && Result->Prev->OutIdx != Skip) + { + Horz = Result; + while (IsHorizontal(*Horz->Next)) Horz = Horz->Next; + if (Horz->Next->Top.X == Result->Prev->Top.X || + Horz->Next->Top.X > Result->Prev->Top.X) Result = Horz->Next; + } + + while (E != Result) + { + E->NextInLML = E->Prev; + if (IsHorizontal(*E) && E != EStart && E->Bot.X != E->Next->Top.X) + ReverseHorizontal(*E); + E = E->Prev; + } + if (IsHorizontal(*E) && E != EStart && E->Bot.X != E->Next->Top.X) + ReverseHorizontal(*E); + Result = Result->Prev; //move to the edge just beyond current bound + } + + return Result; +} +//------------------------------------------------------------------------------ + +bool ClipperBase::AddPath(const Path &pg, PolyType PolyTyp, bool Closed) +{ +#ifdef use_lines + if (!Closed && PolyTyp == ptClip) + throw clipperException("AddPath: Open paths must be subject."); +#else + if (!Closed) + throw clipperException("AddPath: Open paths have been disabled."); +#endif + + int highI = (int)pg.size() -1; + if (Closed) while (highI > 0 && (pg[highI] == pg[0])) --highI; + while (highI > 0 && (pg[highI] == pg[highI -1])) --highI; + if ((Closed && highI < 2) || (!Closed && highI < 1)) return false; + + //create a new edge array ... + TEdge *edges = new TEdge [highI +1]; + + bool IsFlat = true; + //1. Basic (first) edge initialization ... + try + { + edges[1].Curr = pg[1]; + RangeTest(pg[0], m_UseFullRange); + RangeTest(pg[highI], m_UseFullRange); + InitEdge(&edges[0], &edges[1], &edges[highI], pg[0]); + InitEdge(&edges[highI], &edges[0], &edges[highI-1], pg[highI]); + for (int i = highI - 1; i >= 1; --i) + { + RangeTest(pg[i], m_UseFullRange); + InitEdge(&edges[i], &edges[i+1], &edges[i-1], pg[i]); + } + } + catch(...) + { + delete [] edges; + throw; //range test fails + } + TEdge *eStart = &edges[0]; + + //2. Remove duplicate vertices, and (when closed) collinear edges ... + TEdge *E = eStart, *eLoopStop = eStart; + for (;;) + { + //nb: allows matching start and end points when not Closed ... + if (E->Curr == E->Next->Curr && (Closed || E->Next != eStart)) + { + if (E == E->Next) break; + if (E == eStart) eStart = E->Next; + E = RemoveEdge(E); + eLoopStop = E; + continue; + } + if (E->Prev == E->Next) + break; //only two vertices + else if (Closed && + SlopesEqual(E->Prev->Curr, E->Curr, E->Next->Curr, m_UseFullRange) && + (!m_PreserveCollinear || + !Pt2IsBetweenPt1AndPt3(E->Prev->Curr, E->Curr, E->Next->Curr))) + { + //Collinear edges are allowed for open paths but in closed paths + //the default is to merge adjacent collinear edges into a single edge. + //However, if the PreserveCollinear property is enabled, only overlapping + //collinear edges (ie spikes) will be removed from closed paths. + if (E == eStart) eStart = E->Next; + E = RemoveEdge(E); + E = E->Prev; + eLoopStop = E; + continue; + } + E = E->Next; + if ((E == eLoopStop) || (!Closed && E->Next == eStart)) break; + } + + if ((!Closed && (E == E->Next)) || (Closed && (E->Prev == E->Next))) + { + delete [] edges; + return false; + } + + if (!Closed) + { + m_HasOpenPaths = true; + eStart->Prev->OutIdx = Skip; + } + + //3. Do second stage of edge initialization ... + E = eStart; + do + { + InitEdge2(*E, PolyTyp); + E = E->Next; + if (IsFlat && E->Curr.Y != eStart->Curr.Y) IsFlat = false; + } + while (E != eStart); + + //4. Finally, add edge bounds to LocalMinima list ... + + //Totally flat paths must be handled differently when adding them + //to LocalMinima list to avoid endless loops etc ... + if (IsFlat) + { + if (Closed) + { + delete [] edges; + return false; + } + E->Prev->OutIdx = Skip; + MinimaList::value_type locMin; + locMin.Y = E->Bot.Y; + locMin.LeftBound = 0; + locMin.RightBound = E; + locMin.RightBound->Side = esRight; + locMin.RightBound->WindDelta = 0; + for (;;) + { + if (E->Bot.X != E->Prev->Top.X) ReverseHorizontal(*E); + if (E->Next->OutIdx == Skip) break; + E->NextInLML = E->Next; + E = E->Next; + } + m_MinimaList.push_back(locMin); + m_edges.push_back(edges); + return true; + } + + m_edges.push_back(edges); + bool leftBoundIsForward; + TEdge* EMin = 0; + + //workaround to avoid an endless loop in the while loop below when + //open paths have matching start and end points ... + if (E->Prev->Bot == E->Prev->Top) E = E->Next; + + for (;;) + { + E = FindNextLocMin(E); + if (E == EMin) break; + else if (!EMin) EMin = E; + + //E and E.Prev now share a local minima (left aligned if horizontal). + //Compare their slopes to find which starts which bound ... + MinimaList::value_type locMin; + locMin.Y = E->Bot.Y; + if (E->Dx < E->Prev->Dx) + { + locMin.LeftBound = E->Prev; + locMin.RightBound = E; + leftBoundIsForward = false; //Q.nextInLML = Q.prev + } else + { + locMin.LeftBound = E; + locMin.RightBound = E->Prev; + leftBoundIsForward = true; //Q.nextInLML = Q.next + } + + if (!Closed) locMin.LeftBound->WindDelta = 0; + else if (locMin.LeftBound->Next == locMin.RightBound) + locMin.LeftBound->WindDelta = -1; + else locMin.LeftBound->WindDelta = 1; + locMin.RightBound->WindDelta = -locMin.LeftBound->WindDelta; + + E = ProcessBound(locMin.LeftBound, leftBoundIsForward); + if (E->OutIdx == Skip) E = ProcessBound(E, leftBoundIsForward); + + TEdge* E2 = ProcessBound(locMin.RightBound, !leftBoundIsForward); + if (E2->OutIdx == Skip) E2 = ProcessBound(E2, !leftBoundIsForward); + + if (locMin.LeftBound->OutIdx == Skip) + locMin.LeftBound = 0; + else if (locMin.RightBound->OutIdx == Skip) + locMin.RightBound = 0; + m_MinimaList.push_back(locMin); + if (!leftBoundIsForward) E = E2; + } + return true; +} +//------------------------------------------------------------------------------ + +bool ClipperBase::AddPaths(const Paths &ppg, PolyType PolyTyp, bool Closed) +{ + bool result = false; + for (Paths::size_type i = 0; i < ppg.size(); ++i) + if (AddPath(ppg[i], PolyTyp, Closed)) result = true; + return result; +} +//------------------------------------------------------------------------------ + +void ClipperBase::Clear() +{ + DisposeLocalMinimaList(); + for (EdgeList::size_type i = 0; i < m_edges.size(); ++i) + { + TEdge* edges = m_edges[i]; + delete [] edges; + } + m_edges.clear(); + m_UseFullRange = false; + m_HasOpenPaths = false; +} +//------------------------------------------------------------------------------ + +void ClipperBase::Reset() +{ + m_CurrentLM = m_MinimaList.begin(); + if (m_CurrentLM == m_MinimaList.end()) return; //ie nothing to process + std::sort(m_MinimaList.begin(), m_MinimaList.end(), LocMinSorter()); + + m_Scanbeam = ScanbeamList(); //clears/resets priority_queue + //reset all edges ... + for (MinimaList::iterator lm = m_MinimaList.begin(); lm != m_MinimaList.end(); ++lm) + { + InsertScanbeam(lm->Y); + TEdge* e = lm->LeftBound; + if (e) + { + e->Curr = e->Bot; + e->Side = esLeft; + e->OutIdx = Unassigned; + } + + e = lm->RightBound; + if (e) + { + e->Curr = e->Bot; + e->Side = esRight; + e->OutIdx = Unassigned; + } + } + m_ActiveEdges = 0; + m_CurrentLM = m_MinimaList.begin(); +} +//------------------------------------------------------------------------------ + +void ClipperBase::DisposeLocalMinimaList() +{ + m_MinimaList.clear(); + m_CurrentLM = m_MinimaList.begin(); +} +//------------------------------------------------------------------------------ + +bool ClipperBase::PopLocalMinima(cInt Y, const LocalMinimum *&locMin) +{ + if (m_CurrentLM == m_MinimaList.end() || (*m_CurrentLM).Y != Y) return false; + locMin = &(*m_CurrentLM); + ++m_CurrentLM; + return true; +} +//------------------------------------------------------------------------------ + +IntRect ClipperBase::GetBounds() +{ + IntRect result; + MinimaList::iterator lm = m_MinimaList.begin(); + if (lm == m_MinimaList.end()) + { + result.left = result.top = result.right = result.bottom = 0; + return result; + } + result.left = lm->LeftBound->Bot.X; + result.top = lm->LeftBound->Bot.Y; + result.right = lm->LeftBound->Bot.X; + result.bottom = lm->LeftBound->Bot.Y; + while (lm != m_MinimaList.end()) + { + //todo - needs fixing for open paths + result.bottom = std::max(result.bottom, lm->LeftBound->Bot.Y); + TEdge* e = lm->LeftBound; + for (;;) { + TEdge* bottomE = e; + while (e->NextInLML) + { + if (e->Bot.X < result.left) result.left = e->Bot.X; + if (e->Bot.X > result.right) result.right = e->Bot.X; + e = e->NextInLML; + } + result.left = std::min(result.left, e->Bot.X); + result.right = std::max(result.right, e->Bot.X); + result.left = std::min(result.left, e->Top.X); + result.right = std::max(result.right, e->Top.X); + result.top = std::min(result.top, e->Top.Y); + if (bottomE == lm->LeftBound) e = lm->RightBound; + else break; + } + ++lm; + } + return result; +} +//------------------------------------------------------------------------------ + +void ClipperBase::InsertScanbeam(const cInt Y) +{ + m_Scanbeam.push(Y); +} +//------------------------------------------------------------------------------ + +bool ClipperBase::PopScanbeam(cInt &Y) +{ + if (m_Scanbeam.empty()) return false; + Y = m_Scanbeam.top(); + m_Scanbeam.pop(); + while (!m_Scanbeam.empty() && Y == m_Scanbeam.top()) { m_Scanbeam.pop(); } // Pop duplicates. + return true; +} +//------------------------------------------------------------------------------ + +void ClipperBase::DisposeAllOutRecs(){ + for (PolyOutList::size_type i = 0; i < m_PolyOuts.size(); ++i) + DisposeOutRec(i); + m_PolyOuts.clear(); +} +//------------------------------------------------------------------------------ + +void ClipperBase::DisposeOutRec(PolyOutList::size_type index) +{ + OutRec *outRec = m_PolyOuts[index]; + if (outRec->Pts) DisposeOutPts(outRec->Pts); + delete outRec; + m_PolyOuts[index] = 0; +} +//------------------------------------------------------------------------------ + +void ClipperBase::DeleteFromAEL(TEdge *e) +{ + TEdge* AelPrev = e->PrevInAEL; + TEdge* AelNext = e->NextInAEL; + if (!AelPrev && !AelNext && (e != m_ActiveEdges)) return; //already deleted + if (AelPrev) AelPrev->NextInAEL = AelNext; + else m_ActiveEdges = AelNext; + if (AelNext) AelNext->PrevInAEL = AelPrev; + e->NextInAEL = 0; + e->PrevInAEL = 0; +} +//------------------------------------------------------------------------------ + +OutRec* ClipperBase::CreateOutRec() +{ + OutRec* result = new OutRec; + result->IsHole = false; + result->IsOpen = false; + result->FirstLeft = 0; + result->Pts = 0; + result->BottomPt = 0; + result->PolyNd = 0; + m_PolyOuts.push_back(result); + result->Idx = (int)m_PolyOuts.size() - 1; + return result; +} +//------------------------------------------------------------------------------ + +void ClipperBase::SwapPositionsInAEL(TEdge *Edge1, TEdge *Edge2) +{ + //check that one or other edge hasn't already been removed from AEL ... + if (Edge1->NextInAEL == Edge1->PrevInAEL || + Edge2->NextInAEL == Edge2->PrevInAEL) return; + + if (Edge1->NextInAEL == Edge2) + { + TEdge* Next = Edge2->NextInAEL; + if (Next) Next->PrevInAEL = Edge1; + TEdge* Prev = Edge1->PrevInAEL; + if (Prev) Prev->NextInAEL = Edge2; + Edge2->PrevInAEL = Prev; + Edge2->NextInAEL = Edge1; + Edge1->PrevInAEL = Edge2; + Edge1->NextInAEL = Next; + } + else if (Edge2->NextInAEL == Edge1) + { + TEdge* Next = Edge1->NextInAEL; + if (Next) Next->PrevInAEL = Edge2; + TEdge* Prev = Edge2->PrevInAEL; + if (Prev) Prev->NextInAEL = Edge1; + Edge1->PrevInAEL = Prev; + Edge1->NextInAEL = Edge2; + Edge2->PrevInAEL = Edge1; + Edge2->NextInAEL = Next; + } + else + { + TEdge* Next = Edge1->NextInAEL; + TEdge* Prev = Edge1->PrevInAEL; + Edge1->NextInAEL = Edge2->NextInAEL; + if (Edge1->NextInAEL) Edge1->NextInAEL->PrevInAEL = Edge1; + Edge1->PrevInAEL = Edge2->PrevInAEL; + if (Edge1->PrevInAEL) Edge1->PrevInAEL->NextInAEL = Edge1; + Edge2->NextInAEL = Next; + if (Edge2->NextInAEL) Edge2->NextInAEL->PrevInAEL = Edge2; + Edge2->PrevInAEL = Prev; + if (Edge2->PrevInAEL) Edge2->PrevInAEL->NextInAEL = Edge2; + } + + if (!Edge1->PrevInAEL) m_ActiveEdges = Edge1; + else if (!Edge2->PrevInAEL) m_ActiveEdges = Edge2; +} +//------------------------------------------------------------------------------ + +void ClipperBase::UpdateEdgeIntoAEL(TEdge *&e) +{ + if (!e->NextInLML) + throw clipperException("UpdateEdgeIntoAEL: invalid call"); + + e->NextInLML->OutIdx = e->OutIdx; + TEdge* AelPrev = e->PrevInAEL; + TEdge* AelNext = e->NextInAEL; + if (AelPrev) AelPrev->NextInAEL = e->NextInLML; + else m_ActiveEdges = e->NextInLML; + if (AelNext) AelNext->PrevInAEL = e->NextInLML; + e->NextInLML->Side = e->Side; + e->NextInLML->WindDelta = e->WindDelta; + e->NextInLML->WindCnt = e->WindCnt; + e->NextInLML->WindCnt2 = e->WindCnt2; + e = e->NextInLML; + e->Curr = e->Bot; + e->PrevInAEL = AelPrev; + e->NextInAEL = AelNext; + if (!IsHorizontal(*e)) InsertScanbeam(e->Top.Y); +} +//------------------------------------------------------------------------------ + +bool ClipperBase::LocalMinimaPending() +{ + return (m_CurrentLM != m_MinimaList.end()); +} + +//------------------------------------------------------------------------------ +// TClipper methods ... +//------------------------------------------------------------------------------ + +Clipper::Clipper(int initOptions) : ClipperBase() //constructor +{ + m_ExecuteLocked = false; + m_UseFullRange = false; + m_ReverseOutput = ((initOptions & ioReverseSolution) != 0); + m_StrictSimple = ((initOptions & ioStrictlySimple) != 0); + m_PreserveCollinear = ((initOptions & ioPreserveCollinear) != 0); + m_HasOpenPaths = false; +#ifdef use_xyz + m_ZFill = 0; +#endif +} +//------------------------------------------------------------------------------ + +#ifdef use_xyz +void Clipper::ZFillFunction(ZFillCallback zFillFunc) +{ + m_ZFill = zFillFunc; +} +//------------------------------------------------------------------------------ +#endif + +bool Clipper::Execute(ClipType clipType, Paths &solution, PolyFillType fillType) +{ + return Execute(clipType, solution, fillType, fillType); +} +//------------------------------------------------------------------------------ + +bool Clipper::Execute(ClipType clipType, PolyTree &polytree, PolyFillType fillType) +{ + return Execute(clipType, polytree, fillType, fillType); +} +//------------------------------------------------------------------------------ + +bool Clipper::Execute(ClipType clipType, Paths &solution, + PolyFillType subjFillType, PolyFillType clipFillType) +{ + if( m_ExecuteLocked ) return false; + if (m_HasOpenPaths) + throw clipperException("Error: PolyTree struct is needed for open path clipping."); + m_ExecuteLocked = true; + solution.resize(0); + m_SubjFillType = subjFillType; + m_ClipFillType = clipFillType; + m_ClipType = clipType; + m_UsingPolyTree = false; + bool succeeded = ExecuteInternal(); + if (succeeded) BuildResult(solution); + DisposeAllOutRecs(); + m_ExecuteLocked = false; + return succeeded; +} +//------------------------------------------------------------------------------ + +bool Clipper::Execute(ClipType clipType, PolyTree& polytree, + PolyFillType subjFillType, PolyFillType clipFillType) +{ + if( m_ExecuteLocked ) return false; + m_ExecuteLocked = true; + m_SubjFillType = subjFillType; + m_ClipFillType = clipFillType; + m_ClipType = clipType; + m_UsingPolyTree = true; + bool succeeded = ExecuteInternal(); + if (succeeded) BuildResult2(polytree); + DisposeAllOutRecs(); + m_ExecuteLocked = false; + return succeeded; +} +//------------------------------------------------------------------------------ + +void Clipper::FixHoleLinkage(OutRec &outrec) +{ + //skip OutRecs that (a) contain outermost polygons or + //(b) already have the correct owner/child linkage ... + if (!outrec.FirstLeft || + (outrec.IsHole != outrec.FirstLeft->IsHole && + outrec.FirstLeft->Pts)) return; + + OutRec* orfl = outrec.FirstLeft; + while (orfl && ((orfl->IsHole == outrec.IsHole) || !orfl->Pts)) + orfl = orfl->FirstLeft; + outrec.FirstLeft = orfl; +} +//------------------------------------------------------------------------------ + +bool Clipper::ExecuteInternal() +{ + bool succeeded = true; + try { + Reset(); + m_Maxima = MaximaList(); + m_SortedEdges = 0; + + succeeded = true; + cInt botY, topY; + if (!PopScanbeam(botY)) return false; + InsertLocalMinimaIntoAEL(botY); + while (PopScanbeam(topY) || LocalMinimaPending()) + { + ProcessHorizontals(); + ClearGhostJoins(); + if (!ProcessIntersections(topY)) + { + succeeded = false; + break; + } + ProcessEdgesAtTopOfScanbeam(topY); + botY = topY; + InsertLocalMinimaIntoAEL(botY); + } + } + catch(...) + { + succeeded = false; + } + + if (succeeded) + { + //fix orientations ... + for (PolyOutList::size_type i = 0; i < m_PolyOuts.size(); ++i) + { + OutRec *outRec = m_PolyOuts[i]; + if (!outRec->Pts || outRec->IsOpen) continue; + if ((outRec->IsHole ^ m_ReverseOutput) == (Area(*outRec) > 0)) + ReversePolyPtLinks(outRec->Pts); + } + + if (!m_Joins.empty()) JoinCommonEdges(); + + //unfortunately FixupOutPolygon() must be done after JoinCommonEdges() + for (PolyOutList::size_type i = 0; i < m_PolyOuts.size(); ++i) + { + OutRec *outRec = m_PolyOuts[i]; + if (!outRec->Pts) continue; + if (outRec->IsOpen) + FixupOutPolyline(*outRec); + else + FixupOutPolygon(*outRec); + } + + if (m_StrictSimple) DoSimplePolygons(); + } + + ClearJoins(); + ClearGhostJoins(); + return succeeded; +} +//------------------------------------------------------------------------------ + +void Clipper::SetWindingCount(TEdge &edge) +{ + TEdge *e = edge.PrevInAEL; + //find the edge of the same polytype that immediately preceeds 'edge' in AEL + while (e && ((e->PolyTyp != edge.PolyTyp) || (e->WindDelta == 0))) e = e->PrevInAEL; + if (!e) + { + if (edge.WindDelta == 0) + { + PolyFillType pft = (edge.PolyTyp == ptSubject ? m_SubjFillType : m_ClipFillType); + edge.WindCnt = (pft == pftNegative ? -1 : 1); + } + else + edge.WindCnt = edge.WindDelta; + edge.WindCnt2 = 0; + e = m_ActiveEdges; //ie get ready to calc WindCnt2 + } + else if (edge.WindDelta == 0 && m_ClipType != ctUnion) + { + edge.WindCnt = 1; + edge.WindCnt2 = e->WindCnt2; + e = e->NextInAEL; //ie get ready to calc WindCnt2 + } + else if (IsEvenOddFillType(edge)) + { + //EvenOdd filling ... + if (edge.WindDelta == 0) + { + //are we inside a subj polygon ... + bool Inside = true; + TEdge *e2 = e->PrevInAEL; + while (e2) + { + if (e2->PolyTyp == e->PolyTyp && e2->WindDelta != 0) + Inside = !Inside; + e2 = e2->PrevInAEL; + } + edge.WindCnt = (Inside ? 0 : 1); + } + else + { + edge.WindCnt = edge.WindDelta; + } + edge.WindCnt2 = e->WindCnt2; + e = e->NextInAEL; //ie get ready to calc WindCnt2 + } + else + { + //nonZero, Positive or Negative filling ... + if (e->WindCnt * e->WindDelta < 0) + { + //prev edge is 'decreasing' WindCount (WC) toward zero + //so we're outside the previous polygon ... + if (Abs(e->WindCnt) > 1) + { + //outside prev poly but still inside another. + //when reversing direction of prev poly use the same WC + if (e->WindDelta * edge.WindDelta < 0) edge.WindCnt = e->WindCnt; + //otherwise continue to 'decrease' WC ... + else edge.WindCnt = e->WindCnt + edge.WindDelta; + } + else + //now outside all polys of same polytype so set own WC ... + edge.WindCnt = (edge.WindDelta == 0 ? 1 : edge.WindDelta); + } else + { + //prev edge is 'increasing' WindCount (WC) away from zero + //so we're inside the previous polygon ... + if (edge.WindDelta == 0) + edge.WindCnt = (e->WindCnt < 0 ? e->WindCnt - 1 : e->WindCnt + 1); + //if wind direction is reversing prev then use same WC + else if (e->WindDelta * edge.WindDelta < 0) edge.WindCnt = e->WindCnt; + //otherwise add to WC ... + else edge.WindCnt = e->WindCnt + edge.WindDelta; + } + edge.WindCnt2 = e->WindCnt2; + e = e->NextInAEL; //ie get ready to calc WindCnt2 + } + + //update WindCnt2 ... + if (IsEvenOddAltFillType(edge)) + { + //EvenOdd filling ... + while (e != &edge) + { + if (e->WindDelta != 0) + edge.WindCnt2 = (edge.WindCnt2 == 0 ? 1 : 0); + e = e->NextInAEL; + } + } else + { + //nonZero, Positive or Negative filling ... + while ( e != &edge ) + { + edge.WindCnt2 += e->WindDelta; + e = e->NextInAEL; + } + } +} +//------------------------------------------------------------------------------ + +bool Clipper::IsEvenOddFillType(const TEdge& edge) const +{ + if (edge.PolyTyp == ptSubject) + return m_SubjFillType == pftEvenOdd; else + return m_ClipFillType == pftEvenOdd; +} +//------------------------------------------------------------------------------ + +bool Clipper::IsEvenOddAltFillType(const TEdge& edge) const +{ + if (edge.PolyTyp == ptSubject) + return m_ClipFillType == pftEvenOdd; else + return m_SubjFillType == pftEvenOdd; +} +//------------------------------------------------------------------------------ + +bool Clipper::IsContributing(const TEdge& edge) const +{ + PolyFillType pft, pft2; + if (edge.PolyTyp == ptSubject) + { + pft = m_SubjFillType; + pft2 = m_ClipFillType; + } else + { + pft = m_ClipFillType; + pft2 = m_SubjFillType; + } + + switch(pft) + { + case pftEvenOdd: + //return false if a subj line has been flagged as inside a subj polygon + if (edge.WindDelta == 0 && edge.WindCnt != 1) return false; + break; + case pftNonZero: + if (Abs(edge.WindCnt) != 1) return false; + break; + case pftPositive: + if (edge.WindCnt != 1) return false; + break; + default: //pftNegative + if (edge.WindCnt != -1) return false; + } + + switch(m_ClipType) + { + case ctIntersection: + switch(pft2) + { + case pftEvenOdd: + case pftNonZero: + return (edge.WindCnt2 != 0); + case pftPositive: + return (edge.WindCnt2 > 0); + default: + return (edge.WindCnt2 < 0); + } + break; + case ctUnion: + switch(pft2) + { + case pftEvenOdd: + case pftNonZero: + return (edge.WindCnt2 == 0); + case pftPositive: + return (edge.WindCnt2 <= 0); + default: + return (edge.WindCnt2 >= 0); + } + break; + case ctDifference: + if (edge.PolyTyp == ptSubject) + switch(pft2) + { + case pftEvenOdd: + case pftNonZero: + return (edge.WindCnt2 == 0); + case pftPositive: + return (edge.WindCnt2 <= 0); + default: + return (edge.WindCnt2 >= 0); + } + else + switch(pft2) + { + case pftEvenOdd: + case pftNonZero: + return (edge.WindCnt2 != 0); + case pftPositive: + return (edge.WindCnt2 > 0); + default: + return (edge.WindCnt2 < 0); + } + break; + case ctXor: + if (edge.WindDelta == 0) //XOr always contributing unless open + switch(pft2) + { + case pftEvenOdd: + case pftNonZero: + return (edge.WindCnt2 == 0); + case pftPositive: + return (edge.WindCnt2 <= 0); + default: + return (edge.WindCnt2 >= 0); + } + else + return true; + break; + default: + return true; + } +} +//------------------------------------------------------------------------------ + +OutPt* Clipper::AddLocalMinPoly(TEdge *e1, TEdge *e2, const IntPoint &Pt) +{ + OutPt* result; + TEdge *e, *prevE; + if (IsHorizontal(*e2) || ( e1->Dx > e2->Dx )) + { + result = AddOutPt(e1, Pt); + e2->OutIdx = e1->OutIdx; + e1->Side = esLeft; + e2->Side = esRight; + e = e1; + if (e->PrevInAEL == e2) + prevE = e2->PrevInAEL; + else + prevE = e->PrevInAEL; + } else + { + result = AddOutPt(e2, Pt); + e1->OutIdx = e2->OutIdx; + e1->Side = esRight; + e2->Side = esLeft; + e = e2; + if (e->PrevInAEL == e1) + prevE = e1->PrevInAEL; + else + prevE = e->PrevInAEL; + } + + if (prevE && prevE->OutIdx >= 0) + { + cInt xPrev = TopX(*prevE, Pt.Y); + cInt xE = TopX(*e, Pt.Y); + if (xPrev == xE && (e->WindDelta != 0) && (prevE->WindDelta != 0) && + SlopesEqual(IntPoint(xPrev, Pt.Y), prevE->Top, IntPoint(xE, Pt.Y), e->Top, m_UseFullRange)) + { + OutPt* outPt = AddOutPt(prevE, Pt); + AddJoin(result, outPt, e->Top); + } + } + return result; +} +//------------------------------------------------------------------------------ + +void Clipper::AddLocalMaxPoly(TEdge *e1, TEdge *e2, const IntPoint &Pt) +{ + AddOutPt( e1, Pt ); + if (e2->WindDelta == 0) AddOutPt(e2, Pt); + if( e1->OutIdx == e2->OutIdx ) + { + e1->OutIdx = Unassigned; + e2->OutIdx = Unassigned; + } + else if (e1->OutIdx < e2->OutIdx) + AppendPolygon(e1, e2); + else + AppendPolygon(e2, e1); +} +//------------------------------------------------------------------------------ + +void Clipper::AddEdgeToSEL(TEdge *edge) +{ + //SEL pointers in PEdge are reused to build a list of horizontal edges. + //However, we don't need to worry about order with horizontal edge processing. + if( !m_SortedEdges ) + { + m_SortedEdges = edge; + edge->PrevInSEL = 0; + edge->NextInSEL = 0; + } + else + { + edge->NextInSEL = m_SortedEdges; + edge->PrevInSEL = 0; + m_SortedEdges->PrevInSEL = edge; + m_SortedEdges = edge; + } +} +//------------------------------------------------------------------------------ + +bool Clipper::PopEdgeFromSEL(TEdge *&edge) +{ + if (!m_SortedEdges) return false; + edge = m_SortedEdges; + DeleteFromSEL(m_SortedEdges); + return true; +} +//------------------------------------------------------------------------------ + +void Clipper::CopyAELToSEL() +{ + TEdge* e = m_ActiveEdges; + m_SortedEdges = e; + while ( e ) + { + e->PrevInSEL = e->PrevInAEL; + e->NextInSEL = e->NextInAEL; + e = e->NextInAEL; + } +} +//------------------------------------------------------------------------------ + +void Clipper::AddJoin(OutPt *op1, OutPt *op2, const IntPoint OffPt) +{ + Join* j = new Join; + j->OutPt1 = op1; + j->OutPt2 = op2; + j->OffPt = OffPt; + m_Joins.push_back(j); +} +//------------------------------------------------------------------------------ + +void Clipper::ClearJoins() +{ + for (JoinList::size_type i = 0; i < m_Joins.size(); i++) + delete m_Joins[i]; + m_Joins.resize(0); +} +//------------------------------------------------------------------------------ + +void Clipper::ClearGhostJoins() +{ + for (JoinList::size_type i = 0; i < m_GhostJoins.size(); i++) + delete m_GhostJoins[i]; + m_GhostJoins.resize(0); +} +//------------------------------------------------------------------------------ + +void Clipper::AddGhostJoin(OutPt *op, const IntPoint OffPt) +{ + Join* j = new Join; + j->OutPt1 = op; + j->OutPt2 = 0; + j->OffPt = OffPt; + m_GhostJoins.push_back(j); +} +//------------------------------------------------------------------------------ + +void Clipper::InsertLocalMinimaIntoAEL(const cInt botY) +{ + const LocalMinimum *lm; + while (PopLocalMinima(botY, lm)) + { + TEdge* lb = lm->LeftBound; + TEdge* rb = lm->RightBound; + + OutPt *Op1 = 0; + if (!lb) + { + //nb: don't insert LB into either AEL or SEL + InsertEdgeIntoAEL(rb, 0); + SetWindingCount(*rb); + if (IsContributing(*rb)) + Op1 = AddOutPt(rb, rb->Bot); + } + else if (!rb) + { + InsertEdgeIntoAEL(lb, 0); + SetWindingCount(*lb); + if (IsContributing(*lb)) + Op1 = AddOutPt(lb, lb->Bot); + InsertScanbeam(lb->Top.Y); + } + else + { + InsertEdgeIntoAEL(lb, 0); + InsertEdgeIntoAEL(rb, lb); + SetWindingCount( *lb ); + rb->WindCnt = lb->WindCnt; + rb->WindCnt2 = lb->WindCnt2; + if (IsContributing(*lb)) + Op1 = AddLocalMinPoly(lb, rb, lb->Bot); + InsertScanbeam(lb->Top.Y); + } + + if (rb) + { + if (IsHorizontal(*rb)) + { + AddEdgeToSEL(rb); + if (rb->NextInLML) + InsertScanbeam(rb->NextInLML->Top.Y); + } + else InsertScanbeam( rb->Top.Y ); + } + + if (!lb || !rb) continue; + + //if any output polygons share an edge, they'll need joining later ... + if (Op1 && IsHorizontal(*rb) && + m_GhostJoins.size() > 0 && (rb->WindDelta != 0)) + { + for (JoinList::size_type i = 0; i < m_GhostJoins.size(); ++i) + { + Join* jr = m_GhostJoins[i]; + //if the horizontal Rb and a 'ghost' horizontal overlap, then convert + //the 'ghost' join to a real join ready for later ... + if (HorzSegmentsOverlap(jr->OutPt1->Pt.X, jr->OffPt.X, rb->Bot.X, rb->Top.X)) + AddJoin(jr->OutPt1, Op1, jr->OffPt); + } + } + + if (lb->OutIdx >= 0 && lb->PrevInAEL && + lb->PrevInAEL->Curr.X == lb->Bot.X && + lb->PrevInAEL->OutIdx >= 0 && + SlopesEqual(lb->PrevInAEL->Bot, lb->PrevInAEL->Top, lb->Curr, lb->Top, m_UseFullRange) && + (lb->WindDelta != 0) && (lb->PrevInAEL->WindDelta != 0)) + { + OutPt *Op2 = AddOutPt(lb->PrevInAEL, lb->Bot); + AddJoin(Op1, Op2, lb->Top); + } + + if(lb->NextInAEL != rb) + { + + if (rb->OutIdx >= 0 && rb->PrevInAEL->OutIdx >= 0 && + SlopesEqual(rb->PrevInAEL->Curr, rb->PrevInAEL->Top, rb->Curr, rb->Top, m_UseFullRange) && + (rb->WindDelta != 0) && (rb->PrevInAEL->WindDelta != 0)) + { + OutPt *Op2 = AddOutPt(rb->PrevInAEL, rb->Bot); + AddJoin(Op1, Op2, rb->Top); + } + + TEdge* e = lb->NextInAEL; + if (e) + { + while( e != rb ) + { + //nb: For calculating winding counts etc, IntersectEdges() assumes + //that param1 will be to the Right of param2 ABOVE the intersection ... + IntersectEdges(rb , e , lb->Curr); //order important here + e = e->NextInAEL; + } + } + } + + } +} +//------------------------------------------------------------------------------ + +void Clipper::DeleteFromSEL(TEdge *e) +{ + TEdge* SelPrev = e->PrevInSEL; + TEdge* SelNext = e->NextInSEL; + if( !SelPrev && !SelNext && (e != m_SortedEdges) ) return; //already deleted + if( SelPrev ) SelPrev->NextInSEL = SelNext; + else m_SortedEdges = SelNext; + if( SelNext ) SelNext->PrevInSEL = SelPrev; + e->NextInSEL = 0; + e->PrevInSEL = 0; +} +//------------------------------------------------------------------------------ + +#ifdef use_xyz +void Clipper::SetZ(IntPoint& pt, TEdge& e1, TEdge& e2) +{ + if (pt.Z != 0 || !m_ZFill) return; + else if (pt == e1.Bot) pt.Z = e1.Bot.Z; + else if (pt == e1.Top) pt.Z = e1.Top.Z; + else if (pt == e2.Bot) pt.Z = e2.Bot.Z; + else if (pt == e2.Top) pt.Z = e2.Top.Z; + else (*m_ZFill)(e1.Bot, e1.Top, e2.Bot, e2.Top, pt); +} +//------------------------------------------------------------------------------ +#endif + +void Clipper::IntersectEdges(TEdge *e1, TEdge *e2, IntPoint &Pt) +{ + bool e1Contributing = ( e1->OutIdx >= 0 ); + bool e2Contributing = ( e2->OutIdx >= 0 ); + +#ifdef use_xyz + SetZ(Pt, *e1, *e2); +#endif + +#ifdef use_lines + //if either edge is on an OPEN path ... + if (e1->WindDelta == 0 || e2->WindDelta == 0) + { + //ignore subject-subject open path intersections UNLESS they + //are both open paths, AND they are both 'contributing maximas' ... + if (e1->WindDelta == 0 && e2->WindDelta == 0) return; + + //if intersecting a subj line with a subj poly ... + else if (e1->PolyTyp == e2->PolyTyp && + e1->WindDelta != e2->WindDelta && m_ClipType == ctUnion) + { + if (e1->WindDelta == 0) + { + if (e2Contributing) + { + AddOutPt(e1, Pt); + if (e1Contributing) e1->OutIdx = Unassigned; + } + } + else + { + if (e1Contributing) + { + AddOutPt(e2, Pt); + if (e2Contributing) e2->OutIdx = Unassigned; + } + } + } + else if (e1->PolyTyp != e2->PolyTyp) + { + //toggle subj open path OutIdx on/off when Abs(clip.WndCnt) == 1 ... + if ((e1->WindDelta == 0) && abs(e2->WindCnt) == 1 && + (m_ClipType != ctUnion || e2->WindCnt2 == 0)) + { + AddOutPt(e1, Pt); + if (e1Contributing) e1->OutIdx = Unassigned; + } + else if ((e2->WindDelta == 0) && (abs(e1->WindCnt) == 1) && + (m_ClipType != ctUnion || e1->WindCnt2 == 0)) + { + AddOutPt(e2, Pt); + if (e2Contributing) e2->OutIdx = Unassigned; + } + } + return; + } +#endif + + //update winding counts... + //assumes that e1 will be to the Right of e2 ABOVE the intersection + if ( e1->PolyTyp == e2->PolyTyp ) + { + if ( IsEvenOddFillType( *e1) ) + { + int oldE1WindCnt = e1->WindCnt; + e1->WindCnt = e2->WindCnt; + e2->WindCnt = oldE1WindCnt; + } else + { + if (e1->WindCnt + e2->WindDelta == 0 ) e1->WindCnt = -e1->WindCnt; + else e1->WindCnt += e2->WindDelta; + if ( e2->WindCnt - e1->WindDelta == 0 ) e2->WindCnt = -e2->WindCnt; + else e2->WindCnt -= e1->WindDelta; + } + } else + { + if (!IsEvenOddFillType(*e2)) e1->WindCnt2 += e2->WindDelta; + else e1->WindCnt2 = ( e1->WindCnt2 == 0 ) ? 1 : 0; + if (!IsEvenOddFillType(*e1)) e2->WindCnt2 -= e1->WindDelta; + else e2->WindCnt2 = ( e2->WindCnt2 == 0 ) ? 1 : 0; + } + + PolyFillType e1FillType, e2FillType, e1FillType2, e2FillType2; + if (e1->PolyTyp == ptSubject) + { + e1FillType = m_SubjFillType; + e1FillType2 = m_ClipFillType; + } else + { + e1FillType = m_ClipFillType; + e1FillType2 = m_SubjFillType; + } + if (e2->PolyTyp == ptSubject) + { + e2FillType = m_SubjFillType; + e2FillType2 = m_ClipFillType; + } else + { + e2FillType = m_ClipFillType; + e2FillType2 = m_SubjFillType; + } + + cInt e1Wc, e2Wc; + switch (e1FillType) + { + case pftPositive: e1Wc = e1->WindCnt; break; + case pftNegative: e1Wc = -e1->WindCnt; break; + default: e1Wc = Abs(e1->WindCnt); + } + switch(e2FillType) + { + case pftPositive: e2Wc = e2->WindCnt; break; + case pftNegative: e2Wc = -e2->WindCnt; break; + default: e2Wc = Abs(e2->WindCnt); + } + + if ( e1Contributing && e2Contributing ) + { + if ((e1Wc != 0 && e1Wc != 1) || (e2Wc != 0 && e2Wc != 1) || + (e1->PolyTyp != e2->PolyTyp && m_ClipType != ctXor) ) + { + AddLocalMaxPoly(e1, e2, Pt); + } + else + { + AddOutPt(e1, Pt); + AddOutPt(e2, Pt); + SwapSides( *e1 , *e2 ); + SwapPolyIndexes( *e1 , *e2 ); + } + } + else if ( e1Contributing ) + { + if (e2Wc == 0 || e2Wc == 1) + { + AddOutPt(e1, Pt); + SwapSides(*e1, *e2); + SwapPolyIndexes(*e1, *e2); + } + } + else if ( e2Contributing ) + { + if (e1Wc == 0 || e1Wc == 1) + { + AddOutPt(e2, Pt); + SwapSides(*e1, *e2); + SwapPolyIndexes(*e1, *e2); + } + } + else if ( (e1Wc == 0 || e1Wc == 1) && (e2Wc == 0 || e2Wc == 1)) + { + //neither edge is currently contributing ... + + cInt e1Wc2, e2Wc2; + switch (e1FillType2) + { + case pftPositive: e1Wc2 = e1->WindCnt2; break; + case pftNegative : e1Wc2 = -e1->WindCnt2; break; + default: e1Wc2 = Abs(e1->WindCnt2); + } + switch (e2FillType2) + { + case pftPositive: e2Wc2 = e2->WindCnt2; break; + case pftNegative: e2Wc2 = -e2->WindCnt2; break; + default: e2Wc2 = Abs(e2->WindCnt2); + } + + if (e1->PolyTyp != e2->PolyTyp) + { + AddLocalMinPoly(e1, e2, Pt); + } + else if (e1Wc == 1 && e2Wc == 1) + switch( m_ClipType ) { + case ctIntersection: + if (e1Wc2 > 0 && e2Wc2 > 0) + AddLocalMinPoly(e1, e2, Pt); + break; + case ctUnion: + if ( e1Wc2 <= 0 && e2Wc2 <= 0 ) + AddLocalMinPoly(e1, e2, Pt); + break; + case ctDifference: + if (((e1->PolyTyp == ptClip) && (e1Wc2 > 0) && (e2Wc2 > 0)) || + ((e1->PolyTyp == ptSubject) && (e1Wc2 <= 0) && (e2Wc2 <= 0))) + AddLocalMinPoly(e1, e2, Pt); + break; + case ctXor: + AddLocalMinPoly(e1, e2, Pt); + } + else + SwapSides( *e1, *e2 ); + } +} +//------------------------------------------------------------------------------ + +void Clipper::SetHoleState(TEdge *e, OutRec *outrec) +{ + TEdge *e2 = e->PrevInAEL; + TEdge *eTmp = 0; + while (e2) + { + if (e2->OutIdx >= 0 && e2->WindDelta != 0) + { + if (!eTmp) eTmp = e2; + else if (eTmp->OutIdx == e2->OutIdx) eTmp = 0; + } + e2 = e2->PrevInAEL; + } + if (!eTmp) + { + outrec->FirstLeft = 0; + outrec->IsHole = false; + } + else + { + outrec->FirstLeft = m_PolyOuts[eTmp->OutIdx]; + outrec->IsHole = !outrec->FirstLeft->IsHole; + } +} +//------------------------------------------------------------------------------ + +OutRec* GetLowermostRec(OutRec *outRec1, OutRec *outRec2) +{ + //work out which polygon fragment has the correct hole state ... + if (!outRec1->BottomPt) + outRec1->BottomPt = GetBottomPt(outRec1->Pts); + if (!outRec2->BottomPt) + outRec2->BottomPt = GetBottomPt(outRec2->Pts); + OutPt *OutPt1 = outRec1->BottomPt; + OutPt *OutPt2 = outRec2->BottomPt; + if (OutPt1->Pt.Y > OutPt2->Pt.Y) return outRec1; + else if (OutPt1->Pt.Y < OutPt2->Pt.Y) return outRec2; + else if (OutPt1->Pt.X < OutPt2->Pt.X) return outRec1; + else if (OutPt1->Pt.X > OutPt2->Pt.X) return outRec2; + else if (OutPt1->Next == OutPt1) return outRec2; + else if (OutPt2->Next == OutPt2) return outRec1; + else if (FirstIsBottomPt(OutPt1, OutPt2)) return outRec1; + else return outRec2; +} +//------------------------------------------------------------------------------ + +bool OutRec1RightOfOutRec2(OutRec* outRec1, OutRec* outRec2) +{ + do + { + outRec1 = outRec1->FirstLeft; + if (outRec1 == outRec2) return true; + } while (outRec1); + return false; +} +//------------------------------------------------------------------------------ + +OutRec* Clipper::GetOutRec(int Idx) +{ + OutRec* outrec = m_PolyOuts[Idx]; + while (outrec != m_PolyOuts[outrec->Idx]) + outrec = m_PolyOuts[outrec->Idx]; + return outrec; +} +//------------------------------------------------------------------------------ + +void Clipper::AppendPolygon(TEdge *e1, TEdge *e2) +{ + //get the start and ends of both output polygons ... + OutRec *outRec1 = m_PolyOuts[e1->OutIdx]; + OutRec *outRec2 = m_PolyOuts[e2->OutIdx]; + + OutRec *holeStateRec; + if (OutRec1RightOfOutRec2(outRec1, outRec2)) + holeStateRec = outRec2; + else if (OutRec1RightOfOutRec2(outRec2, outRec1)) + holeStateRec = outRec1; + else + holeStateRec = GetLowermostRec(outRec1, outRec2); + + //get the start and ends of both output polygons and + //join e2 poly onto e1 poly and delete pointers to e2 ... + + OutPt* p1_lft = outRec1->Pts; + OutPt* p1_rt = p1_lft->Prev; + OutPt* p2_lft = outRec2->Pts; + OutPt* p2_rt = p2_lft->Prev; + + //join e2 poly onto e1 poly and delete pointers to e2 ... + if( e1->Side == esLeft ) + { + if( e2->Side == esLeft ) + { + //z y x a b c + ReversePolyPtLinks(p2_lft); + p2_lft->Next = p1_lft; + p1_lft->Prev = p2_lft; + p1_rt->Next = p2_rt; + p2_rt->Prev = p1_rt; + outRec1->Pts = p2_rt; + } else + { + //x y z a b c + p2_rt->Next = p1_lft; + p1_lft->Prev = p2_rt; + p2_lft->Prev = p1_rt; + p1_rt->Next = p2_lft; + outRec1->Pts = p2_lft; + } + } else + { + if( e2->Side == esRight ) + { + //a b c z y x + ReversePolyPtLinks(p2_lft); + p1_rt->Next = p2_rt; + p2_rt->Prev = p1_rt; + p2_lft->Next = p1_lft; + p1_lft->Prev = p2_lft; + } else + { + //a b c x y z + p1_rt->Next = p2_lft; + p2_lft->Prev = p1_rt; + p1_lft->Prev = p2_rt; + p2_rt->Next = p1_lft; + } + } + + outRec1->BottomPt = 0; + if (holeStateRec == outRec2) + { + if (outRec2->FirstLeft != outRec1) + outRec1->FirstLeft = outRec2->FirstLeft; + outRec1->IsHole = outRec2->IsHole; + } + outRec2->Pts = 0; + outRec2->BottomPt = 0; + outRec2->FirstLeft = outRec1; + + int OKIdx = e1->OutIdx; + int ObsoleteIdx = e2->OutIdx; + + e1->OutIdx = Unassigned; //nb: safe because we only get here via AddLocalMaxPoly + e2->OutIdx = Unassigned; + + TEdge* e = m_ActiveEdges; + while( e ) + { + if( e->OutIdx == ObsoleteIdx ) + { + e->OutIdx = OKIdx; + e->Side = e1->Side; + break; + } + e = e->NextInAEL; + } + + outRec2->Idx = outRec1->Idx; +} +//------------------------------------------------------------------------------ + +OutPt* Clipper::AddOutPt(TEdge *e, const IntPoint &pt) +{ + if( e->OutIdx < 0 ) + { + OutRec *outRec = CreateOutRec(); + outRec->IsOpen = (e->WindDelta == 0); + OutPt* newOp = new OutPt; + outRec->Pts = newOp; + newOp->Idx = outRec->Idx; + newOp->Pt = pt; + newOp->Next = newOp; + newOp->Prev = newOp; + if (!outRec->IsOpen) + SetHoleState(e, outRec); + e->OutIdx = outRec->Idx; + return newOp; + } else + { + OutRec *outRec = m_PolyOuts[e->OutIdx]; + //OutRec.Pts is the 'Left-most' point & OutRec.Pts.Prev is the 'Right-most' + OutPt* op = outRec->Pts; + + bool ToFront = (e->Side == esLeft); + if (ToFront && (pt == op->Pt)) return op; + else if (!ToFront && (pt == op->Prev->Pt)) return op->Prev; + + OutPt* newOp = new OutPt; + newOp->Idx = outRec->Idx; + newOp->Pt = pt; + newOp->Next = op; + newOp->Prev = op->Prev; + newOp->Prev->Next = newOp; + op->Prev = newOp; + if (ToFront) outRec->Pts = newOp; + return newOp; + } +} +//------------------------------------------------------------------------------ + +OutPt* Clipper::GetLastOutPt(TEdge *e) +{ + OutRec *outRec = m_PolyOuts[e->OutIdx]; + if (e->Side == esLeft) + return outRec->Pts; + else + return outRec->Pts->Prev; +} +//------------------------------------------------------------------------------ + +void Clipper::ProcessHorizontals() +{ + TEdge* horzEdge; + while (PopEdgeFromSEL(horzEdge)) + ProcessHorizontal(horzEdge); +} +//------------------------------------------------------------------------------ + +inline bool IsMinima(TEdge *e) +{ + return e && (e->Prev->NextInLML != e) && (e->Next->NextInLML != e); +} +//------------------------------------------------------------------------------ + +inline bool IsMaxima(TEdge *e, const cInt Y) +{ + return e && e->Top.Y == Y && !e->NextInLML; +} +//------------------------------------------------------------------------------ + +inline bool IsIntermediate(TEdge *e, const cInt Y) +{ + return e->Top.Y == Y && e->NextInLML; +} +//------------------------------------------------------------------------------ + +TEdge *GetMaximaPair(TEdge *e) +{ + if ((e->Next->Top == e->Top) && !e->Next->NextInLML) + return e->Next; + else if ((e->Prev->Top == e->Top) && !e->Prev->NextInLML) + return e->Prev; + else return 0; +} +//------------------------------------------------------------------------------ + +TEdge *GetMaximaPairEx(TEdge *e) +{ + //as GetMaximaPair() but returns 0 if MaxPair isn't in AEL (unless it's horizontal) + TEdge* result = GetMaximaPair(e); + if (result && (result->OutIdx == Skip || + (result->NextInAEL == result->PrevInAEL && !IsHorizontal(*result)))) return 0; + return result; +} +//------------------------------------------------------------------------------ + +void Clipper::SwapPositionsInSEL(TEdge *Edge1, TEdge *Edge2) +{ + if( !( Edge1->NextInSEL ) && !( Edge1->PrevInSEL ) ) return; + if( !( Edge2->NextInSEL ) && !( Edge2->PrevInSEL ) ) return; + + if( Edge1->NextInSEL == Edge2 ) + { + TEdge* Next = Edge2->NextInSEL; + if( Next ) Next->PrevInSEL = Edge1; + TEdge* Prev = Edge1->PrevInSEL; + if( Prev ) Prev->NextInSEL = Edge2; + Edge2->PrevInSEL = Prev; + Edge2->NextInSEL = Edge1; + Edge1->PrevInSEL = Edge2; + Edge1->NextInSEL = Next; + } + else if( Edge2->NextInSEL == Edge1 ) + { + TEdge* Next = Edge1->NextInSEL; + if( Next ) Next->PrevInSEL = Edge2; + TEdge* Prev = Edge2->PrevInSEL; + if( Prev ) Prev->NextInSEL = Edge1; + Edge1->PrevInSEL = Prev; + Edge1->NextInSEL = Edge2; + Edge2->PrevInSEL = Edge1; + Edge2->NextInSEL = Next; + } + else + { + TEdge* Next = Edge1->NextInSEL; + TEdge* Prev = Edge1->PrevInSEL; + Edge1->NextInSEL = Edge2->NextInSEL; + if( Edge1->NextInSEL ) Edge1->NextInSEL->PrevInSEL = Edge1; + Edge1->PrevInSEL = Edge2->PrevInSEL; + if( Edge1->PrevInSEL ) Edge1->PrevInSEL->NextInSEL = Edge1; + Edge2->NextInSEL = Next; + if( Edge2->NextInSEL ) Edge2->NextInSEL->PrevInSEL = Edge2; + Edge2->PrevInSEL = Prev; + if( Edge2->PrevInSEL ) Edge2->PrevInSEL->NextInSEL = Edge2; + } + + if( !Edge1->PrevInSEL ) m_SortedEdges = Edge1; + else if( !Edge2->PrevInSEL ) m_SortedEdges = Edge2; +} +//------------------------------------------------------------------------------ + +TEdge* GetNextInAEL(TEdge *e, Direction dir) +{ + return dir == dLeftToRight ? e->NextInAEL : e->PrevInAEL; +} +//------------------------------------------------------------------------------ + +void GetHorzDirection(TEdge& HorzEdge, Direction& Dir, cInt& Left, cInt& Right) +{ + if (HorzEdge.Bot.X < HorzEdge.Top.X) + { + Left = HorzEdge.Bot.X; + Right = HorzEdge.Top.X; + Dir = dLeftToRight; + } else + { + Left = HorzEdge.Top.X; + Right = HorzEdge.Bot.X; + Dir = dRightToLeft; + } +} +//------------------------------------------------------------------------ + +/******************************************************************************* +* Notes: Horizontal edges (HEs) at scanline intersections (ie at the Top or * +* Bottom of a scanbeam) are processed as if layered. The order in which HEs * +* are processed doesn't matter. HEs intersect with other HE Bot.Xs only [#] * +* (or they could intersect with Top.Xs only, ie EITHER Bot.Xs OR Top.Xs), * +* and with other non-horizontal edges [*]. Once these intersections are * +* processed, intermediate HEs then 'promote' the Edge above (NextInLML) into * +* the AEL. These 'promoted' edges may in turn intersect [%] with other HEs. * +*******************************************************************************/ + +void Clipper::ProcessHorizontal(TEdge *horzEdge) +{ + Direction dir; + cInt horzLeft, horzRight; + bool IsOpen = (horzEdge->WindDelta == 0); + + GetHorzDirection(*horzEdge, dir, horzLeft, horzRight); + + TEdge* eLastHorz = horzEdge, *eMaxPair = 0; + while (eLastHorz->NextInLML && IsHorizontal(*eLastHorz->NextInLML)) + eLastHorz = eLastHorz->NextInLML; + if (!eLastHorz->NextInLML) + eMaxPair = GetMaximaPair(eLastHorz); + + MaximaList::const_iterator maxIt; + MaximaList::const_reverse_iterator maxRit; + if (m_Maxima.size() > 0) + { + //get the first maxima in range (X) ... + if (dir == dLeftToRight) + { + maxIt = m_Maxima.begin(); + while (maxIt != m_Maxima.end() && *maxIt <= horzEdge->Bot.X) maxIt++; + if (maxIt != m_Maxima.end() && *maxIt >= eLastHorz->Top.X) + maxIt = m_Maxima.end(); + } + else + { + maxRit = m_Maxima.rbegin(); + while (maxRit != m_Maxima.rend() && *maxRit > horzEdge->Bot.X) maxRit++; + if (maxRit != m_Maxima.rend() && *maxRit <= eLastHorz->Top.X) + maxRit = m_Maxima.rend(); + } + } + + OutPt* op1 = 0; + + for (;;) //loop through consec. horizontal edges + { + + bool IsLastHorz = (horzEdge == eLastHorz); + TEdge* e = GetNextInAEL(horzEdge, dir); + while(e) + { + + //this code block inserts extra coords into horizontal edges (in output + //polygons) whereever maxima touch these horizontal edges. This helps + //'simplifying' polygons (ie if the Simplify property is set). + if (m_Maxima.size() > 0) + { + if (dir == dLeftToRight) + { + while (maxIt != m_Maxima.end() && *maxIt < e->Curr.X) + { + if (horzEdge->OutIdx >= 0 && !IsOpen) + AddOutPt(horzEdge, IntPoint(*maxIt, horzEdge->Bot.Y)); + maxIt++; + } + } + else + { + while (maxRit != m_Maxima.rend() && *maxRit > e->Curr.X) + { + if (horzEdge->OutIdx >= 0 && !IsOpen) + AddOutPt(horzEdge, IntPoint(*maxRit, horzEdge->Bot.Y)); + maxRit++; + } + } + }; + + if ((dir == dLeftToRight && e->Curr.X > horzRight) || + (dir == dRightToLeft && e->Curr.X < horzLeft)) break; + + //Also break if we've got to the end of an intermediate horizontal edge ... + //nb: Smaller Dx's are to the right of larger Dx's ABOVE the horizontal. + if (e->Curr.X == horzEdge->Top.X && horzEdge->NextInLML && + e->Dx < horzEdge->NextInLML->Dx) break; + + if (horzEdge->OutIdx >= 0 && !IsOpen) //note: may be done multiple times + { + op1 = AddOutPt(horzEdge, e->Curr); + TEdge* eNextHorz = m_SortedEdges; + while (eNextHorz) + { + if (eNextHorz->OutIdx >= 0 && + HorzSegmentsOverlap(horzEdge->Bot.X, + horzEdge->Top.X, eNextHorz->Bot.X, eNextHorz->Top.X)) + { + OutPt* op2 = GetLastOutPt(eNextHorz); + AddJoin(op2, op1, eNextHorz->Top); + } + eNextHorz = eNextHorz->NextInSEL; + } + AddGhostJoin(op1, horzEdge->Bot); + } + + //OK, so far we're still in range of the horizontal Edge but make sure + //we're at the last of consec. horizontals when matching with eMaxPair + if(e == eMaxPair && IsLastHorz) + { + if (horzEdge->OutIdx >= 0) + AddLocalMaxPoly(horzEdge, eMaxPair, horzEdge->Top); + DeleteFromAEL(horzEdge); + DeleteFromAEL(eMaxPair); + return; + } + + if(dir == dLeftToRight) + { + IntPoint Pt = IntPoint(e->Curr.X, horzEdge->Curr.Y); + IntersectEdges(horzEdge, e, Pt); + } + else + { + IntPoint Pt = IntPoint(e->Curr.X, horzEdge->Curr.Y); + IntersectEdges( e, horzEdge, Pt); + } + TEdge* eNext = GetNextInAEL(e, dir); + SwapPositionsInAEL( horzEdge, e ); + e = eNext; + } //end while(e) + + //Break out of loop if HorzEdge.NextInLML is not also horizontal ... + if (!horzEdge->NextInLML || !IsHorizontal(*horzEdge->NextInLML)) break; + + UpdateEdgeIntoAEL(horzEdge); + if (horzEdge->OutIdx >= 0) AddOutPt(horzEdge, horzEdge->Bot); + GetHorzDirection(*horzEdge, dir, horzLeft, horzRight); + + } //end for (;;) + + if (horzEdge->OutIdx >= 0 && !op1) + { + op1 = GetLastOutPt(horzEdge); + TEdge* eNextHorz = m_SortedEdges; + while (eNextHorz) + { + if (eNextHorz->OutIdx >= 0 && + HorzSegmentsOverlap(horzEdge->Bot.X, + horzEdge->Top.X, eNextHorz->Bot.X, eNextHorz->Top.X)) + { + OutPt* op2 = GetLastOutPt(eNextHorz); + AddJoin(op2, op1, eNextHorz->Top); + } + eNextHorz = eNextHorz->NextInSEL; + } + AddGhostJoin(op1, horzEdge->Top); + } + + if (horzEdge->NextInLML) + { + if(horzEdge->OutIdx >= 0) + { + op1 = AddOutPt( horzEdge, horzEdge->Top); + UpdateEdgeIntoAEL(horzEdge); + if (horzEdge->WindDelta == 0) return; + //nb: HorzEdge is no longer horizontal here + TEdge* ePrev = horzEdge->PrevInAEL; + TEdge* eNext = horzEdge->NextInAEL; + if (ePrev && ePrev->Curr.X == horzEdge->Bot.X && + ePrev->Curr.Y == horzEdge->Bot.Y && ePrev->WindDelta != 0 && + (ePrev->OutIdx >= 0 && ePrev->Curr.Y > ePrev->Top.Y && + SlopesEqual(*horzEdge, *ePrev, m_UseFullRange))) + { + OutPt* op2 = AddOutPt(ePrev, horzEdge->Bot); + AddJoin(op1, op2, horzEdge->Top); + } + else if (eNext && eNext->Curr.X == horzEdge->Bot.X && + eNext->Curr.Y == horzEdge->Bot.Y && eNext->WindDelta != 0 && + eNext->OutIdx >= 0 && eNext->Curr.Y > eNext->Top.Y && + SlopesEqual(*horzEdge, *eNext, m_UseFullRange)) + { + OutPt* op2 = AddOutPt(eNext, horzEdge->Bot); + AddJoin(op1, op2, horzEdge->Top); + } + } + else + UpdateEdgeIntoAEL(horzEdge); + } + else + { + if (horzEdge->OutIdx >= 0) AddOutPt(horzEdge, horzEdge->Top); + DeleteFromAEL(horzEdge); + } +} +//------------------------------------------------------------------------------ + +bool Clipper::ProcessIntersections(const cInt topY) +{ + if( !m_ActiveEdges ) return true; + try { + BuildIntersectList(topY); + size_t IlSize = m_IntersectList.size(); + if (IlSize == 0) return true; + if (IlSize == 1 || FixupIntersectionOrder()) ProcessIntersectList(); + else return false; + } + catch(...) + { + m_SortedEdges = 0; + DisposeIntersectNodes(); + throw clipperException("ProcessIntersections error"); + } + m_SortedEdges = 0; + return true; +} +//------------------------------------------------------------------------------ + +void Clipper::DisposeIntersectNodes() +{ + for (size_t i = 0; i < m_IntersectList.size(); ++i ) + delete m_IntersectList[i]; + m_IntersectList.clear(); +} +//------------------------------------------------------------------------------ + +void Clipper::BuildIntersectList(const cInt topY) +{ + if ( !m_ActiveEdges ) return; + + //prepare for sorting ... + TEdge* e = m_ActiveEdges; + m_SortedEdges = e; + while( e ) + { + e->PrevInSEL = e->PrevInAEL; + e->NextInSEL = e->NextInAEL; + e->Curr.X = TopX( *e, topY ); + e = e->NextInAEL; + } + + //bubblesort ... + bool isModified; + do + { + isModified = false; + e = m_SortedEdges; + while( e->NextInSEL ) + { + TEdge *eNext = e->NextInSEL; + IntPoint Pt; + if(e->Curr.X > eNext->Curr.X) + { + IntersectPoint(*e, *eNext, Pt); + if (Pt.Y < topY) Pt = IntPoint(TopX(*e, topY), topY); + IntersectNode * newNode = new IntersectNode; + newNode->Edge1 = e; + newNode->Edge2 = eNext; + newNode->Pt = Pt; + m_IntersectList.push_back(newNode); + + SwapPositionsInSEL(e, eNext); + isModified = true; + } + else + e = eNext; + } + if( e->PrevInSEL ) e->PrevInSEL->NextInSEL = 0; + else break; + } + while ( isModified ); + m_SortedEdges = 0; //important +} +//------------------------------------------------------------------------------ + + +void Clipper::ProcessIntersectList() +{ + for (size_t i = 0; i < m_IntersectList.size(); ++i) + { + IntersectNode* iNode = m_IntersectList[i]; + { + IntersectEdges( iNode->Edge1, iNode->Edge2, iNode->Pt); + SwapPositionsInAEL( iNode->Edge1 , iNode->Edge2 ); + } + delete iNode; + } + m_IntersectList.clear(); +} +//------------------------------------------------------------------------------ + +bool IntersectListSort(IntersectNode* node1, IntersectNode* node2) +{ + return node2->Pt.Y < node1->Pt.Y; +} +//------------------------------------------------------------------------------ + +inline bool EdgesAdjacent(const IntersectNode &inode) +{ + return (inode.Edge1->NextInSEL == inode.Edge2) || + (inode.Edge1->PrevInSEL == inode.Edge2); +} +//------------------------------------------------------------------------------ + +bool Clipper::FixupIntersectionOrder() +{ + //pre-condition: intersections are sorted Bottom-most first. + //Now it's crucial that intersections are made only between adjacent edges, + //so to ensure this the order of intersections may need adjusting ... + CopyAELToSEL(); + std::sort(m_IntersectList.begin(), m_IntersectList.end(), IntersectListSort); + size_t cnt = m_IntersectList.size(); + for (size_t i = 0; i < cnt; ++i) + { + if (!EdgesAdjacent(*m_IntersectList[i])) + { + size_t j = i + 1; + while (j < cnt && !EdgesAdjacent(*m_IntersectList[j])) j++; + if (j == cnt) return false; + std::swap(m_IntersectList[i], m_IntersectList[j]); + } + SwapPositionsInSEL(m_IntersectList[i]->Edge1, m_IntersectList[i]->Edge2); + } + return true; +} +//------------------------------------------------------------------------------ + +void Clipper::DoMaxima(TEdge *e) +{ + TEdge* eMaxPair = GetMaximaPairEx(e); + if (!eMaxPair) + { + if (e->OutIdx >= 0) + AddOutPt(e, e->Top); + DeleteFromAEL(e); + return; + } + + TEdge* eNext = e->NextInAEL; + while(eNext && eNext != eMaxPair) + { + IntersectEdges(e, eNext, e->Top); + SwapPositionsInAEL(e, eNext); + eNext = e->NextInAEL; + } + + if(e->OutIdx == Unassigned && eMaxPair->OutIdx == Unassigned) + { + DeleteFromAEL(e); + DeleteFromAEL(eMaxPair); + } + else if( e->OutIdx >= 0 && eMaxPair->OutIdx >= 0 ) + { + if (e->OutIdx >= 0) AddLocalMaxPoly(e, eMaxPair, e->Top); + DeleteFromAEL(e); + DeleteFromAEL(eMaxPair); + } +#ifdef use_lines + else if (e->WindDelta == 0) + { + if (e->OutIdx >= 0) + { + AddOutPt(e, e->Top); + e->OutIdx = Unassigned; + } + DeleteFromAEL(e); + + if (eMaxPair->OutIdx >= 0) + { + AddOutPt(eMaxPair, e->Top); + eMaxPair->OutIdx = Unassigned; + } + DeleteFromAEL(eMaxPair); + } +#endif + else throw clipperException("DoMaxima error"); +} +//------------------------------------------------------------------------------ + +void Clipper::ProcessEdgesAtTopOfScanbeam(const cInt topY) +{ + TEdge* e = m_ActiveEdges; + while( e ) + { + //1. process maxima, treating them as if they're 'bent' horizontal edges, + // but exclude maxima with horizontal edges. nb: e can't be a horizontal. + bool IsMaximaEdge = IsMaxima(e, topY); + + if(IsMaximaEdge) + { + TEdge* eMaxPair = GetMaximaPairEx(e); + IsMaximaEdge = (!eMaxPair || !IsHorizontal(*eMaxPair)); + } + + if(IsMaximaEdge) + { + if (m_StrictSimple) m_Maxima.push_back(e->Top.X); + TEdge* ePrev = e->PrevInAEL; + DoMaxima(e); + if( !ePrev ) e = m_ActiveEdges; + else e = ePrev->NextInAEL; + } + else + { + //2. promote horizontal edges, otherwise update Curr.X and Curr.Y ... + if (IsIntermediate(e, topY) && IsHorizontal(*e->NextInLML)) + { + UpdateEdgeIntoAEL(e); + if (e->OutIdx >= 0) + AddOutPt(e, e->Bot); + AddEdgeToSEL(e); + } + else + { + e->Curr.X = TopX( *e, topY ); + e->Curr.Y = topY; + } + + //When StrictlySimple and 'e' is being touched by another edge, then + //make sure both edges have a vertex here ... + if (m_StrictSimple) + { + TEdge* ePrev = e->PrevInAEL; + if ((e->OutIdx >= 0) && (e->WindDelta != 0) && ePrev && (ePrev->OutIdx >= 0) && + (ePrev->Curr.X == e->Curr.X) && (ePrev->WindDelta != 0)) + { + IntPoint pt = e->Curr; +#ifdef use_xyz + SetZ(pt, *ePrev, *e); +#endif + OutPt* op = AddOutPt(ePrev, pt); + OutPt* op2 = AddOutPt(e, pt); + AddJoin(op, op2, pt); //StrictlySimple (type-3) join + } + } + + e = e->NextInAEL; + } + } + + //3. Process horizontals at the Top of the scanbeam ... + m_Maxima.sort(); + ProcessHorizontals(); + m_Maxima.clear(); + + //4. Promote intermediate vertices ... + e = m_ActiveEdges; + while(e) + { + if(IsIntermediate(e, topY)) + { + OutPt* op = 0; + if( e->OutIdx >= 0 ) + op = AddOutPt(e, e->Top); + UpdateEdgeIntoAEL(e); + + //if output polygons share an edge, they'll need joining later ... + TEdge* ePrev = e->PrevInAEL; + TEdge* eNext = e->NextInAEL; + if (ePrev && ePrev->Curr.X == e->Bot.X && + ePrev->Curr.Y == e->Bot.Y && op && + ePrev->OutIdx >= 0 && ePrev->Curr.Y > ePrev->Top.Y && + SlopesEqual(e->Curr, e->Top, ePrev->Curr, ePrev->Top, m_UseFullRange) && + (e->WindDelta != 0) && (ePrev->WindDelta != 0)) + { + OutPt* op2 = AddOutPt(ePrev, e->Bot); + AddJoin(op, op2, e->Top); + } + else if (eNext && eNext->Curr.X == e->Bot.X && + eNext->Curr.Y == e->Bot.Y && op && + eNext->OutIdx >= 0 && eNext->Curr.Y > eNext->Top.Y && + SlopesEqual(e->Curr, e->Top, eNext->Curr, eNext->Top, m_UseFullRange) && + (e->WindDelta != 0) && (eNext->WindDelta != 0)) + { + OutPt* op2 = AddOutPt(eNext, e->Bot); + AddJoin(op, op2, e->Top); + } + } + e = e->NextInAEL; + } +} +//------------------------------------------------------------------------------ + +void Clipper::FixupOutPolyline(OutRec &outrec) +{ + OutPt *pp = outrec.Pts; + OutPt *lastPP = pp->Prev; + while (pp != lastPP) + { + pp = pp->Next; + if (pp->Pt == pp->Prev->Pt) + { + if (pp == lastPP) lastPP = pp->Prev; + OutPt *tmpPP = pp->Prev; + tmpPP->Next = pp->Next; + pp->Next->Prev = tmpPP; + delete pp; + pp = tmpPP; + } + } + + if (pp == pp->Prev) + { + DisposeOutPts(pp); + outrec.Pts = 0; + return; + } +} +//------------------------------------------------------------------------------ + +void Clipper::FixupOutPolygon(OutRec &outrec) +{ + //FixupOutPolygon() - removes duplicate points and simplifies consecutive + //parallel edges by removing the middle vertex. + OutPt *lastOK = 0; + outrec.BottomPt = 0; + OutPt *pp = outrec.Pts; + bool preserveCol = m_PreserveCollinear || m_StrictSimple; + + for (;;) + { + if (pp->Prev == pp || pp->Prev == pp->Next) + { + DisposeOutPts(pp); + outrec.Pts = 0; + return; + } + + //test for duplicate points and collinear edges ... + if ((pp->Pt == pp->Next->Pt) || (pp->Pt == pp->Prev->Pt) || + (SlopesEqual(pp->Prev->Pt, pp->Pt, pp->Next->Pt, m_UseFullRange) && + (!preserveCol || !Pt2IsBetweenPt1AndPt3(pp->Prev->Pt, pp->Pt, pp->Next->Pt)))) + { + lastOK = 0; + OutPt *tmp = pp; + pp->Prev->Next = pp->Next; + pp->Next->Prev = pp->Prev; + pp = pp->Prev; + delete tmp; + } + else if (pp == lastOK) break; + else + { + if (!lastOK) lastOK = pp; + pp = pp->Next; + } + } + outrec.Pts = pp; +} +//------------------------------------------------------------------------------ + +int PointCount(OutPt *Pts) +{ + if (!Pts) return 0; + int result = 0; + OutPt* p = Pts; + do + { + result++; + p = p->Next; + } + while (p != Pts); + return result; +} +//------------------------------------------------------------------------------ + +void Clipper::BuildResult(Paths &polys) +{ + polys.reserve(m_PolyOuts.size()); + for (PolyOutList::size_type i = 0; i < m_PolyOuts.size(); ++i) + { + if (!m_PolyOuts[i]->Pts) continue; + Path pg; + OutPt* p = m_PolyOuts[i]->Pts->Prev; + int cnt = PointCount(p); + if (cnt < 2) continue; + pg.reserve(cnt); + for (int i = 0; i < cnt; ++i) + { + pg.push_back(p->Pt); + p = p->Prev; + } + polys.push_back(pg); + } +} +//------------------------------------------------------------------------------ + +void Clipper::BuildResult2(PolyTree& polytree) +{ + polytree.Clear(); + polytree.AllNodes.reserve(m_PolyOuts.size()); + //add each output polygon/contour to polytree ... + for (PolyOutList::size_type i = 0; i < m_PolyOuts.size(); i++) + { + OutRec* outRec = m_PolyOuts[i]; + int cnt = PointCount(outRec->Pts); + if ((outRec->IsOpen && cnt < 2) || (!outRec->IsOpen && cnt < 3)) continue; + FixHoleLinkage(*outRec); + PolyNode* pn = new PolyNode(); + //nb: polytree takes ownership of all the PolyNodes + polytree.AllNodes.push_back(pn); + outRec->PolyNd = pn; + pn->Parent = 0; + pn->Index = 0; + pn->Contour.reserve(cnt); + OutPt *op = outRec->Pts->Prev; + for (int j = 0; j < cnt; j++) + { + pn->Contour.push_back(op->Pt); + op = op->Prev; + } + } + + //fixup PolyNode links etc ... + polytree.Childs.reserve(m_PolyOuts.size()); + for (PolyOutList::size_type i = 0; i < m_PolyOuts.size(); i++) + { + OutRec* outRec = m_PolyOuts[i]; + if (!outRec->PolyNd) continue; + if (outRec->IsOpen) + { + outRec->PolyNd->m_IsOpen = true; + polytree.AddChild(*outRec->PolyNd); + } + else if (outRec->FirstLeft && outRec->FirstLeft->PolyNd) + outRec->FirstLeft->PolyNd->AddChild(*outRec->PolyNd); + else + polytree.AddChild(*outRec->PolyNd); + } +} +//------------------------------------------------------------------------------ + +void SwapIntersectNodes(IntersectNode &int1, IntersectNode &int2) +{ + //just swap the contents (because fIntersectNodes is a single-linked-list) + IntersectNode inode = int1; //gets a copy of Int1 + int1.Edge1 = int2.Edge1; + int1.Edge2 = int2.Edge2; + int1.Pt = int2.Pt; + int2.Edge1 = inode.Edge1; + int2.Edge2 = inode.Edge2; + int2.Pt = inode.Pt; +} +//------------------------------------------------------------------------------ + +inline bool E2InsertsBeforeE1(TEdge &e1, TEdge &e2) +{ + if (e2.Curr.X == e1.Curr.X) + { + if (e2.Top.Y > e1.Top.Y) + return e2.Top.X < TopX(e1, e2.Top.Y); + else return e1.Top.X > TopX(e2, e1.Top.Y); + } + else return e2.Curr.X < e1.Curr.X; +} +//------------------------------------------------------------------------------ + +bool GetOverlap(const cInt a1, const cInt a2, const cInt b1, const cInt b2, + cInt& Left, cInt& Right) +{ + if (a1 < a2) + { + if (b1 < b2) {Left = std::max(a1,b1); Right = std::min(a2,b2);} + else {Left = std::max(a1,b2); Right = std::min(a2,b1);} + } + else + { + if (b1 < b2) {Left = std::max(a2,b1); Right = std::min(a1,b2);} + else {Left = std::max(a2,b2); Right = std::min(a1,b1);} + } + return Left < Right; +} +//------------------------------------------------------------------------------ + +inline void UpdateOutPtIdxs(OutRec& outrec) +{ + OutPt* op = outrec.Pts; + do + { + op->Idx = outrec.Idx; + op = op->Prev; + } + while(op != outrec.Pts); +} +//------------------------------------------------------------------------------ + +void Clipper::InsertEdgeIntoAEL(TEdge *edge, TEdge* startEdge) +{ + if(!m_ActiveEdges) + { + edge->PrevInAEL = 0; + edge->NextInAEL = 0; + m_ActiveEdges = edge; + } + else if(!startEdge && E2InsertsBeforeE1(*m_ActiveEdges, *edge)) + { + edge->PrevInAEL = 0; + edge->NextInAEL = m_ActiveEdges; + m_ActiveEdges->PrevInAEL = edge; + m_ActiveEdges = edge; + } + else + { + if(!startEdge) startEdge = m_ActiveEdges; + while(startEdge->NextInAEL && + !E2InsertsBeforeE1(*startEdge->NextInAEL , *edge)) + startEdge = startEdge->NextInAEL; + edge->NextInAEL = startEdge->NextInAEL; + if(startEdge->NextInAEL) startEdge->NextInAEL->PrevInAEL = edge; + edge->PrevInAEL = startEdge; + startEdge->NextInAEL = edge; + } +} +//---------------------------------------------------------------------- + +OutPt* DupOutPt(OutPt* outPt, bool InsertAfter) +{ + OutPt* result = new OutPt; + result->Pt = outPt->Pt; + result->Idx = outPt->Idx; + if (InsertAfter) + { + result->Next = outPt->Next; + result->Prev = outPt; + outPt->Next->Prev = result; + outPt->Next = result; + } + else + { + result->Prev = outPt->Prev; + result->Next = outPt; + outPt->Prev->Next = result; + outPt->Prev = result; + } + return result; +} +//------------------------------------------------------------------------------ + +bool JoinHorz(OutPt* op1, OutPt* op1b, OutPt* op2, OutPt* op2b, + const IntPoint Pt, bool DiscardLeft) +{ + Direction Dir1 = (op1->Pt.X > op1b->Pt.X ? dRightToLeft : dLeftToRight); + Direction Dir2 = (op2->Pt.X > op2b->Pt.X ? dRightToLeft : dLeftToRight); + if (Dir1 == Dir2) return false; + + //When DiscardLeft, we want Op1b to be on the Left of Op1, otherwise we + //want Op1b to be on the Right. (And likewise with Op2 and Op2b.) + //So, to facilitate this while inserting Op1b and Op2b ... + //when DiscardLeft, make sure we're AT or RIGHT of Pt before adding Op1b, + //otherwise make sure we're AT or LEFT of Pt. (Likewise with Op2b.) + if (Dir1 == dLeftToRight) + { + while (op1->Next->Pt.X <= Pt.X && + op1->Next->Pt.X >= op1->Pt.X && op1->Next->Pt.Y == Pt.Y) + op1 = op1->Next; + if (DiscardLeft && (op1->Pt.X != Pt.X)) op1 = op1->Next; + op1b = DupOutPt(op1, !DiscardLeft); + if (op1b->Pt != Pt) + { + op1 = op1b; + op1->Pt = Pt; + op1b = DupOutPt(op1, !DiscardLeft); + } + } + else + { + while (op1->Next->Pt.X >= Pt.X && + op1->Next->Pt.X <= op1->Pt.X && op1->Next->Pt.Y == Pt.Y) + op1 = op1->Next; + if (!DiscardLeft && (op1->Pt.X != Pt.X)) op1 = op1->Next; + op1b = DupOutPt(op1, DiscardLeft); + if (op1b->Pt != Pt) + { + op1 = op1b; + op1->Pt = Pt; + op1b = DupOutPt(op1, DiscardLeft); + } + } + + if (Dir2 == dLeftToRight) + { + while (op2->Next->Pt.X <= Pt.X && + op2->Next->Pt.X >= op2->Pt.X && op2->Next->Pt.Y == Pt.Y) + op2 = op2->Next; + if (DiscardLeft && (op2->Pt.X != Pt.X)) op2 = op2->Next; + op2b = DupOutPt(op2, !DiscardLeft); + if (op2b->Pt != Pt) + { + op2 = op2b; + op2->Pt = Pt; + op2b = DupOutPt(op2, !DiscardLeft); + }; + } else + { + while (op2->Next->Pt.X >= Pt.X && + op2->Next->Pt.X <= op2->Pt.X && op2->Next->Pt.Y == Pt.Y) + op2 = op2->Next; + if (!DiscardLeft && (op2->Pt.X != Pt.X)) op2 = op2->Next; + op2b = DupOutPt(op2, DiscardLeft); + if (op2b->Pt != Pt) + { + op2 = op2b; + op2->Pt = Pt; + op2b = DupOutPt(op2, DiscardLeft); + }; + }; + + if ((Dir1 == dLeftToRight) == DiscardLeft) + { + op1->Prev = op2; + op2->Next = op1; + op1b->Next = op2b; + op2b->Prev = op1b; + } + else + { + op1->Next = op2; + op2->Prev = op1; + op1b->Prev = op2b; + op2b->Next = op1b; + } + return true; +} +//------------------------------------------------------------------------------ + +bool Clipper::JoinPoints(Join *j, OutRec* outRec1, OutRec* outRec2) +{ + OutPt *op1 = j->OutPt1, *op1b; + OutPt *op2 = j->OutPt2, *op2b; + + //There are 3 kinds of joins for output polygons ... + //1. Horizontal joins where Join.OutPt1 & Join.OutPt2 are vertices anywhere + //along (horizontal) collinear edges (& Join.OffPt is on the same horizontal). + //2. Non-horizontal joins where Join.OutPt1 & Join.OutPt2 are at the same + //location at the Bottom of the overlapping segment (& Join.OffPt is above). + //3. StrictSimple joins where edges touch but are not collinear and where + //Join.OutPt1, Join.OutPt2 & Join.OffPt all share the same point. + bool isHorizontal = (j->OutPt1->Pt.Y == j->OffPt.Y); + + if (isHorizontal && (j->OffPt == j->OutPt1->Pt) && + (j->OffPt == j->OutPt2->Pt)) + { + //Strictly Simple join ... + if (outRec1 != outRec2) return false; + op1b = j->OutPt1->Next; + while (op1b != op1 && (op1b->Pt == j->OffPt)) + op1b = op1b->Next; + bool reverse1 = (op1b->Pt.Y > j->OffPt.Y); + op2b = j->OutPt2->Next; + while (op2b != op2 && (op2b->Pt == j->OffPt)) + op2b = op2b->Next; + bool reverse2 = (op2b->Pt.Y > j->OffPt.Y); + if (reverse1 == reverse2) return false; + if (reverse1) + { + op1b = DupOutPt(op1, false); + op2b = DupOutPt(op2, true); + op1->Prev = op2; + op2->Next = op1; + op1b->Next = op2b; + op2b->Prev = op1b; + j->OutPt1 = op1; + j->OutPt2 = op1b; + return true; + } else + { + op1b = DupOutPt(op1, true); + op2b = DupOutPt(op2, false); + op1->Next = op2; + op2->Prev = op1; + op1b->Prev = op2b; + op2b->Next = op1b; + j->OutPt1 = op1; + j->OutPt2 = op1b; + return true; + } + } + else if (isHorizontal) + { + //treat horizontal joins differently to non-horizontal joins since with + //them we're not yet sure where the overlapping is. OutPt1.Pt & OutPt2.Pt + //may be anywhere along the horizontal edge. + op1b = op1; + while (op1->Prev->Pt.Y == op1->Pt.Y && op1->Prev != op1b && op1->Prev != op2) + op1 = op1->Prev; + while (op1b->Next->Pt.Y == op1b->Pt.Y && op1b->Next != op1 && op1b->Next != op2) + op1b = op1b->Next; + if (op1b->Next == op1 || op1b->Next == op2) return false; //a flat 'polygon' + + op2b = op2; + while (op2->Prev->Pt.Y == op2->Pt.Y && op2->Prev != op2b && op2->Prev != op1b) + op2 = op2->Prev; + while (op2b->Next->Pt.Y == op2b->Pt.Y && op2b->Next != op2 && op2b->Next != op1) + op2b = op2b->Next; + if (op2b->Next == op2 || op2b->Next == op1) return false; //a flat 'polygon' + + cInt Left, Right; + //Op1 --> Op1b & Op2 --> Op2b are the extremites of the horizontal edges + if (!GetOverlap(op1->Pt.X, op1b->Pt.X, op2->Pt.X, op2b->Pt.X, Left, Right)) + return false; + + //DiscardLeftSide: when overlapping edges are joined, a spike will created + //which needs to be cleaned up. However, we don't want Op1 or Op2 caught up + //on the discard Side as either may still be needed for other joins ... + IntPoint Pt; + bool DiscardLeftSide; + if (op1->Pt.X >= Left && op1->Pt.X <= Right) + { + Pt = op1->Pt; DiscardLeftSide = (op1->Pt.X > op1b->Pt.X); + } + else if (op2->Pt.X >= Left&& op2->Pt.X <= Right) + { + Pt = op2->Pt; DiscardLeftSide = (op2->Pt.X > op2b->Pt.X); + } + else if (op1b->Pt.X >= Left && op1b->Pt.X <= Right) + { + Pt = op1b->Pt; DiscardLeftSide = op1b->Pt.X > op1->Pt.X; + } + else + { + Pt = op2b->Pt; DiscardLeftSide = (op2b->Pt.X > op2->Pt.X); + } + j->OutPt1 = op1; j->OutPt2 = op2; + return JoinHorz(op1, op1b, op2, op2b, Pt, DiscardLeftSide); + } else + { + //nb: For non-horizontal joins ... + // 1. Jr.OutPt1.Pt.Y == Jr.OutPt2.Pt.Y + // 2. Jr.OutPt1.Pt > Jr.OffPt.Y + + //make sure the polygons are correctly oriented ... + op1b = op1->Next; + while ((op1b->Pt == op1->Pt) && (op1b != op1)) op1b = op1b->Next; + bool Reverse1 = ((op1b->Pt.Y > op1->Pt.Y) || + !SlopesEqual(op1->Pt, op1b->Pt, j->OffPt, m_UseFullRange)); + if (Reverse1) + { + op1b = op1->Prev; + while ((op1b->Pt == op1->Pt) && (op1b != op1)) op1b = op1b->Prev; + if ((op1b->Pt.Y > op1->Pt.Y) || + !SlopesEqual(op1->Pt, op1b->Pt, j->OffPt, m_UseFullRange)) return false; + }; + op2b = op2->Next; + while ((op2b->Pt == op2->Pt) && (op2b != op2))op2b = op2b->Next; + bool Reverse2 = ((op2b->Pt.Y > op2->Pt.Y) || + !SlopesEqual(op2->Pt, op2b->Pt, j->OffPt, m_UseFullRange)); + if (Reverse2) + { + op2b = op2->Prev; + while ((op2b->Pt == op2->Pt) && (op2b != op2)) op2b = op2b->Prev; + if ((op2b->Pt.Y > op2->Pt.Y) || + !SlopesEqual(op2->Pt, op2b->Pt, j->OffPt, m_UseFullRange)) return false; + } + + if ((op1b == op1) || (op2b == op2) || (op1b == op2b) || + ((outRec1 == outRec2) && (Reverse1 == Reverse2))) return false; + + if (Reverse1) + { + op1b = DupOutPt(op1, false); + op2b = DupOutPt(op2, true); + op1->Prev = op2; + op2->Next = op1; + op1b->Next = op2b; + op2b->Prev = op1b; + j->OutPt1 = op1; + j->OutPt2 = op1b; + return true; + } else + { + op1b = DupOutPt(op1, true); + op2b = DupOutPt(op2, false); + op1->Next = op2; + op2->Prev = op1; + op1b->Prev = op2b; + op2b->Next = op1b; + j->OutPt1 = op1; + j->OutPt2 = op1b; + return true; + } + } +} +//---------------------------------------------------------------------- + +static OutRec* ParseFirstLeft(OutRec* FirstLeft) +{ + while (FirstLeft && !FirstLeft->Pts) + FirstLeft = FirstLeft->FirstLeft; + return FirstLeft; +} +//------------------------------------------------------------------------------ + +void Clipper::FixupFirstLefts1(OutRec* OldOutRec, OutRec* NewOutRec) +{ + //tests if NewOutRec contains the polygon before reassigning FirstLeft + for (PolyOutList::size_type i = 0; i < m_PolyOuts.size(); ++i) + { + OutRec* outRec = m_PolyOuts[i]; + OutRec* firstLeft = ParseFirstLeft(outRec->FirstLeft); + if (outRec->Pts && firstLeft == OldOutRec) + { + if (Poly2ContainsPoly1(outRec->Pts, NewOutRec->Pts)) + outRec->FirstLeft = NewOutRec; + } + } +} +//---------------------------------------------------------------------- + +void Clipper::FixupFirstLefts2(OutRec* InnerOutRec, OutRec* OuterOutRec) +{ + //A polygon has split into two such that one is now the inner of the other. + //It's possible that these polygons now wrap around other polygons, so check + //every polygon that's also contained by OuterOutRec's FirstLeft container + //(including 0) to see if they've become inner to the new inner polygon ... + OutRec* orfl = OuterOutRec->FirstLeft; + for (PolyOutList::size_type i = 0; i < m_PolyOuts.size(); ++i) + { + OutRec* outRec = m_PolyOuts[i]; + + if (!outRec->Pts || outRec == OuterOutRec || outRec == InnerOutRec) + continue; + OutRec* firstLeft = ParseFirstLeft(outRec->FirstLeft); + if (firstLeft != orfl && firstLeft != InnerOutRec && firstLeft != OuterOutRec) + continue; + if (Poly2ContainsPoly1(outRec->Pts, InnerOutRec->Pts)) + outRec->FirstLeft = InnerOutRec; + else if (Poly2ContainsPoly1(outRec->Pts, OuterOutRec->Pts)) + outRec->FirstLeft = OuterOutRec; + else if (outRec->FirstLeft == InnerOutRec || outRec->FirstLeft == OuterOutRec) + outRec->FirstLeft = orfl; + } +} +//---------------------------------------------------------------------- +void Clipper::FixupFirstLefts3(OutRec* OldOutRec, OutRec* NewOutRec) +{ + //reassigns FirstLeft WITHOUT testing if NewOutRec contains the polygon + for (PolyOutList::size_type i = 0; i < m_PolyOuts.size(); ++i) + { + OutRec* outRec = m_PolyOuts[i]; + OutRec* firstLeft = ParseFirstLeft(outRec->FirstLeft); + if (outRec->Pts && outRec->FirstLeft == OldOutRec) + outRec->FirstLeft = NewOutRec; + } +} +//---------------------------------------------------------------------- + +void Clipper::JoinCommonEdges() +{ + for (JoinList::size_type i = 0; i < m_Joins.size(); i++) + { + Join* join = m_Joins[i]; + + OutRec *outRec1 = GetOutRec(join->OutPt1->Idx); + OutRec *outRec2 = GetOutRec(join->OutPt2->Idx); + + if (!outRec1->Pts || !outRec2->Pts) continue; + if (outRec1->IsOpen || outRec2->IsOpen) continue; + + //get the polygon fragment with the correct hole state (FirstLeft) + //before calling JoinPoints() ... + OutRec *holeStateRec; + if (outRec1 == outRec2) holeStateRec = outRec1; + else if (OutRec1RightOfOutRec2(outRec1, outRec2)) holeStateRec = outRec2; + else if (OutRec1RightOfOutRec2(outRec2, outRec1)) holeStateRec = outRec1; + else holeStateRec = GetLowermostRec(outRec1, outRec2); + + if (!JoinPoints(join, outRec1, outRec2)) continue; + + if (outRec1 == outRec2) + { + //instead of joining two polygons, we've just created a new one by + //splitting one polygon into two. + outRec1->Pts = join->OutPt1; + outRec1->BottomPt = 0; + outRec2 = CreateOutRec(); + outRec2->Pts = join->OutPt2; + + //update all OutRec2.Pts Idx's ... + UpdateOutPtIdxs(*outRec2); + + if (Poly2ContainsPoly1(outRec2->Pts, outRec1->Pts)) + { + //outRec1 contains outRec2 ... + outRec2->IsHole = !outRec1->IsHole; + outRec2->FirstLeft = outRec1; + + if (m_UsingPolyTree) FixupFirstLefts2(outRec2, outRec1); + + if ((outRec2->IsHole ^ m_ReverseOutput) == (Area(*outRec2) > 0)) + ReversePolyPtLinks(outRec2->Pts); + + } else if (Poly2ContainsPoly1(outRec1->Pts, outRec2->Pts)) + { + //outRec2 contains outRec1 ... + outRec2->IsHole = outRec1->IsHole; + outRec1->IsHole = !outRec2->IsHole; + outRec2->FirstLeft = outRec1->FirstLeft; + outRec1->FirstLeft = outRec2; + + if (m_UsingPolyTree) FixupFirstLefts2(outRec1, outRec2); + + if ((outRec1->IsHole ^ m_ReverseOutput) == (Area(*outRec1) > 0)) + ReversePolyPtLinks(outRec1->Pts); + } + else + { + //the 2 polygons are completely separate ... + outRec2->IsHole = outRec1->IsHole; + outRec2->FirstLeft = outRec1->FirstLeft; + + //fixup FirstLeft pointers that may need reassigning to OutRec2 + if (m_UsingPolyTree) FixupFirstLefts1(outRec1, outRec2); + } + + } else + { + //joined 2 polygons together ... + + outRec2->Pts = 0; + outRec2->BottomPt = 0; + outRec2->Idx = outRec1->Idx; + + outRec1->IsHole = holeStateRec->IsHole; + if (holeStateRec == outRec2) + outRec1->FirstLeft = outRec2->FirstLeft; + outRec2->FirstLeft = outRec1; + + if (m_UsingPolyTree) FixupFirstLefts3(outRec2, outRec1); + } + } +} + +//------------------------------------------------------------------------------ +// ClipperOffset support functions ... +//------------------------------------------------------------------------------ + +DoublePoint GetUnitNormal(const IntPoint &pt1, const IntPoint &pt2) +{ + if(pt2.X == pt1.X && pt2.Y == pt1.Y) + return DoublePoint(0, 0); + + double Dx = (double)(pt2.X - pt1.X); + double dy = (double)(pt2.Y - pt1.Y); + double f = 1 *1.0/ std::sqrt( Dx*Dx + dy*dy ); + Dx *= f; + dy *= f; + return DoublePoint(dy, -Dx); +} + +//------------------------------------------------------------------------------ +// ClipperOffset class +//------------------------------------------------------------------------------ + +ClipperOffset::ClipperOffset(double miterLimit, double arcTolerance) +{ + this->MiterLimit = miterLimit; + this->ArcTolerance = arcTolerance; + m_lowest.X = -1; +} +//------------------------------------------------------------------------------ + +ClipperOffset::~ClipperOffset() +{ + Clear(); +} +//------------------------------------------------------------------------------ + +void ClipperOffset::Clear() +{ + for (int i = 0; i < m_polyNodes.ChildCount(); ++i) + delete m_polyNodes.Childs[i]; + m_polyNodes.Childs.clear(); + m_lowest.X = -1; +} +//------------------------------------------------------------------------------ + +void ClipperOffset::AddPath(const Path& path, JoinType joinType, EndType endType) +{ + int highI = (int)path.size() - 1; + if (highI < 0) return; + PolyNode* newNode = new PolyNode(); + newNode->m_jointype = joinType; + newNode->m_endtype = endType; + + //strip duplicate points from path and also get index to the lowest point ... + if (endType == etClosedLine || endType == etClosedPolygon) + while (highI > 0 && path[0] == path[highI]) highI--; + newNode->Contour.reserve(highI + 1); + newNode->Contour.push_back(path[0]); + int j = 0, k = 0; + for (int i = 1; i <= highI; i++) + if (newNode->Contour[j] != path[i]) + { + j++; + newNode->Contour.push_back(path[i]); + if (path[i].Y > newNode->Contour[k].Y || + (path[i].Y == newNode->Contour[k].Y && + path[i].X < newNode->Contour[k].X)) k = j; + } + if (endType == etClosedPolygon && j < 2) + { + delete newNode; + return; + } + m_polyNodes.AddChild(*newNode); + + //if this path's lowest pt is lower than all the others then update m_lowest + if (endType != etClosedPolygon) return; + if (m_lowest.X < 0) + m_lowest = IntPoint(m_polyNodes.ChildCount() - 1, k); + else + { + IntPoint ip = m_polyNodes.Childs[(int)m_lowest.X]->Contour[(int)m_lowest.Y]; + if (newNode->Contour[k].Y > ip.Y || + (newNode->Contour[k].Y == ip.Y && + newNode->Contour[k].X < ip.X)) + m_lowest = IntPoint(m_polyNodes.ChildCount() - 1, k); + } +} +//------------------------------------------------------------------------------ + +void ClipperOffset::AddPaths(const Paths& paths, JoinType joinType, EndType endType) +{ + for (Paths::size_type i = 0; i < paths.size(); ++i) + AddPath(paths[i], joinType, endType); +} +//------------------------------------------------------------------------------ + +void ClipperOffset::FixOrientations() +{ + //fixup orientations of all closed paths if the orientation of the + //closed path with the lowermost vertex is wrong ... + if (m_lowest.X >= 0 && + !Orientation(m_polyNodes.Childs[(int)m_lowest.X]->Contour)) + { + for (int i = 0; i < m_polyNodes.ChildCount(); ++i) + { + PolyNode& node = *m_polyNodes.Childs[i]; + if (node.m_endtype == etClosedPolygon || + (node.m_endtype == etClosedLine && Orientation(node.Contour))) + ReversePath(node.Contour); + } + } else + { + for (int i = 0; i < m_polyNodes.ChildCount(); ++i) + { + PolyNode& node = *m_polyNodes.Childs[i]; + if (node.m_endtype == etClosedLine && !Orientation(node.Contour)) + ReversePath(node.Contour); + } + } +} +//------------------------------------------------------------------------------ + +void ClipperOffset::Execute(Paths& solution, double delta) +{ + solution.clear(); + FixOrientations(); + DoOffset(delta); + + //now clean up 'corners' ... + Clipper clpr; + clpr.AddPaths(m_destPolys, ptSubject, true); + if (delta > 0) + { + clpr.Execute(ctUnion, solution, pftPositive, pftPositive); + } + else + { + IntRect r = clpr.GetBounds(); + Path outer(4); + outer[0] = IntPoint(r.left - 10, r.bottom + 10); + outer[1] = IntPoint(r.right + 10, r.bottom + 10); + outer[2] = IntPoint(r.right + 10, r.top - 10); + outer[3] = IntPoint(r.left - 10, r.top - 10); + + clpr.AddPath(outer, ptSubject, true); + clpr.ReverseSolution(true); + clpr.Execute(ctUnion, solution, pftNegative, pftNegative); + if (solution.size() > 0) solution.erase(solution.begin()); + } +} +//------------------------------------------------------------------------------ + +void ClipperOffset::Execute(PolyTree& solution, double delta) +{ + solution.Clear(); + FixOrientations(); + DoOffset(delta); + + //now clean up 'corners' ... + Clipper clpr; + clpr.AddPaths(m_destPolys, ptSubject, true); + if (delta > 0) + { + clpr.Execute(ctUnion, solution, pftPositive, pftPositive); + } + else + { + IntRect r = clpr.GetBounds(); + Path outer(4); + outer[0] = IntPoint(r.left - 10, r.bottom + 10); + outer[1] = IntPoint(r.right + 10, r.bottom + 10); + outer[2] = IntPoint(r.right + 10, r.top - 10); + outer[3] = IntPoint(r.left - 10, r.top - 10); + + clpr.AddPath(outer, ptSubject, true); + clpr.ReverseSolution(true); + clpr.Execute(ctUnion, solution, pftNegative, pftNegative); + //remove the outer PolyNode rectangle ... + if (solution.ChildCount() == 1 && solution.Childs[0]->ChildCount() > 0) + { + PolyNode* outerNode = solution.Childs[0]; + solution.Childs.reserve(outerNode->ChildCount()); + solution.Childs[0] = outerNode->Childs[0]; + solution.Childs[0]->Parent = outerNode->Parent; + for (int i = 1; i < outerNode->ChildCount(); ++i) + solution.AddChild(*outerNode->Childs[i]); + } + else + solution.Clear(); + } +} +//------------------------------------------------------------------------------ + +void ClipperOffset::DoOffset(double delta) +{ + m_destPolys.clear(); + m_delta = delta; + + //if Zero offset, just copy any CLOSED polygons to m_p and return ... + if (NEAR_ZERO(delta)) + { + m_destPolys.reserve(m_polyNodes.ChildCount()); + for (int i = 0; i < m_polyNodes.ChildCount(); i++) + { + PolyNode& node = *m_polyNodes.Childs[i]; + if (node.m_endtype == etClosedPolygon) + m_destPolys.push_back(node.Contour); + } + return; + } + + //see offset_triginometry3.svg in the documentation folder ... + if (MiterLimit > 2) m_miterLim = 2/(MiterLimit * MiterLimit); + else m_miterLim = 0.5; + + double y; + if (ArcTolerance <= 0.0) y = def_arc_tolerance; + else if (ArcTolerance > std::fabs(delta) * def_arc_tolerance) + y = std::fabs(delta) * def_arc_tolerance; + else y = ArcTolerance; + //see offset_triginometry2.svg in the documentation folder ... + double steps = pi / std::acos(1 - y / std::fabs(delta)); + if (steps > std::fabs(delta) * pi) + steps = std::fabs(delta) * pi; //ie excessive precision check + m_sin = std::sin(two_pi / steps); + m_cos = std::cos(two_pi / steps); + m_StepsPerRad = steps / two_pi; + if (delta < 0.0) m_sin = -m_sin; + + m_destPolys.reserve(m_polyNodes.ChildCount() * 2); + for (int i = 0; i < m_polyNodes.ChildCount(); i++) + { + PolyNode& node = *m_polyNodes.Childs[i]; + m_srcPoly = node.Contour; + + int len = (int)m_srcPoly.size(); + if (len == 0 || (delta <= 0 && (len < 3 || node.m_endtype != etClosedPolygon))) + continue; + + m_destPoly.clear(); + if (len == 1) + { + if (node.m_jointype == jtRound) + { + double X = 1.0, Y = 0.0; + for (cInt j = 1; j <= steps; j++) + { + m_destPoly.push_back(IntPoint( + Round(m_srcPoly[0].X + X * delta), + Round(m_srcPoly[0].Y + Y * delta))); + double X2 = X; + X = X * m_cos - m_sin * Y; + Y = X2 * m_sin + Y * m_cos; + } + } + else + { + double X = -1.0, Y = -1.0; + for (int j = 0; j < 4; ++j) + { + m_destPoly.push_back(IntPoint( + Round(m_srcPoly[0].X + X * delta), + Round(m_srcPoly[0].Y + Y * delta))); + if (X < 0) X = 1; + else if (Y < 0) Y = 1; + else X = -1; + } + } + m_destPolys.push_back(m_destPoly); + continue; + } + //build m_normals ... + m_normals.clear(); + m_normals.reserve(len); + for (int j = 0; j < len - 1; ++j) + m_normals.push_back(GetUnitNormal(m_srcPoly[j], m_srcPoly[j + 1])); + if (node.m_endtype == etClosedLine || node.m_endtype == etClosedPolygon) + m_normals.push_back(GetUnitNormal(m_srcPoly[len - 1], m_srcPoly[0])); + else + m_normals.push_back(DoublePoint(m_normals[len - 2])); + + if (node.m_endtype == etClosedPolygon) + { + int k = len - 1; + for (int j = 0; j < len; ++j) + OffsetPoint(j, k, node.m_jointype); + m_destPolys.push_back(m_destPoly); + } + else if (node.m_endtype == etClosedLine) + { + int k = len - 1; + for (int j = 0; j < len; ++j) + OffsetPoint(j, k, node.m_jointype); + m_destPolys.push_back(m_destPoly); + m_destPoly.clear(); + //re-build m_normals ... + DoublePoint n = m_normals[len -1]; + for (int j = len - 1; j > 0; j--) + m_normals[j] = DoublePoint(-m_normals[j - 1].X, -m_normals[j - 1].Y); + m_normals[0] = DoublePoint(-n.X, -n.Y); + k = 0; + for (int j = len - 1; j >= 0; j--) + OffsetPoint(j, k, node.m_jointype); + m_destPolys.push_back(m_destPoly); + } + else + { + int k = 0; + for (int j = 1; j < len - 1; ++j) + OffsetPoint(j, k, node.m_jointype); + + IntPoint pt1; + if (node.m_endtype == etOpenButt) + { + int j = len - 1; + pt1 = IntPoint((cInt)Round(m_srcPoly[j].X + m_normals[j].X * + delta), (cInt)Round(m_srcPoly[j].Y + m_normals[j].Y * delta)); + m_destPoly.push_back(pt1); + pt1 = IntPoint((cInt)Round(m_srcPoly[j].X - m_normals[j].X * + delta), (cInt)Round(m_srcPoly[j].Y - m_normals[j].Y * delta)); + m_destPoly.push_back(pt1); + } + else + { + int j = len - 1; + k = len - 2; + m_sinA = 0; + m_normals[j] = DoublePoint(-m_normals[j].X, -m_normals[j].Y); + if (node.m_endtype == etOpenSquare) + DoSquare(j, k); + else + DoRound(j, k); + } + + //re-build m_normals ... + for (int j = len - 1; j > 0; j--) + m_normals[j] = DoublePoint(-m_normals[j - 1].X, -m_normals[j - 1].Y); + m_normals[0] = DoublePoint(-m_normals[1].X, -m_normals[1].Y); + + k = len - 1; + for (int j = k - 1; j > 0; --j) OffsetPoint(j, k, node.m_jointype); + + if (node.m_endtype == etOpenButt) + { + pt1 = IntPoint((cInt)Round(m_srcPoly[0].X - m_normals[0].X * delta), + (cInt)Round(m_srcPoly[0].Y - m_normals[0].Y * delta)); + m_destPoly.push_back(pt1); + pt1 = IntPoint((cInt)Round(m_srcPoly[0].X + m_normals[0].X * delta), + (cInt)Round(m_srcPoly[0].Y + m_normals[0].Y * delta)); + m_destPoly.push_back(pt1); + } + else + { + k = 1; + m_sinA = 0; + if (node.m_endtype == etOpenSquare) + DoSquare(0, 1); + else + DoRound(0, 1); + } + m_destPolys.push_back(m_destPoly); + } + } +} +//------------------------------------------------------------------------------ + +void ClipperOffset::OffsetPoint(int j, int& k, JoinType jointype) +{ + //cross product ... + m_sinA = (m_normals[k].X * m_normals[j].Y - m_normals[j].X * m_normals[k].Y); + if (std::fabs(m_sinA * m_delta) < 1.0) + { + //dot product ... + double cosA = (m_normals[k].X * m_normals[j].X + m_normals[j].Y * m_normals[k].Y ); + if (cosA > 0) // angle => 0 degrees + { + m_destPoly.push_back(IntPoint(Round(m_srcPoly[j].X + m_normals[k].X * m_delta), + Round(m_srcPoly[j].Y + m_normals[k].Y * m_delta))); + return; + } + //else angle => 180 degrees + } + else if (m_sinA > 1.0) m_sinA = 1.0; + else if (m_sinA < -1.0) m_sinA = -1.0; + + if (m_sinA * m_delta < 0) + { + m_destPoly.push_back(IntPoint(Round(m_srcPoly[j].X + m_normals[k].X * m_delta), + Round(m_srcPoly[j].Y + m_normals[k].Y * m_delta))); + m_destPoly.push_back(m_srcPoly[j]); + m_destPoly.push_back(IntPoint(Round(m_srcPoly[j].X + m_normals[j].X * m_delta), + Round(m_srcPoly[j].Y + m_normals[j].Y * m_delta))); + } + else + switch (jointype) + { + case jtMiter: + { + double r = 1 + (m_normals[j].X * m_normals[k].X + + m_normals[j].Y * m_normals[k].Y); + if (r >= m_miterLim) DoMiter(j, k, r); else DoSquare(j, k); + break; + } + case jtSquare: DoSquare(j, k); break; + case jtRound: DoRound(j, k); break; + } + k = j; +} +//------------------------------------------------------------------------------ + +void ClipperOffset::DoSquare(int j, int k) +{ + double dx = std::tan(std::atan2(m_sinA, + m_normals[k].X * m_normals[j].X + m_normals[k].Y * m_normals[j].Y) / 4); + m_destPoly.push_back(IntPoint( + Round(m_srcPoly[j].X + m_delta * (m_normals[k].X - m_normals[k].Y * dx)), + Round(m_srcPoly[j].Y + m_delta * (m_normals[k].Y + m_normals[k].X * dx)))); + m_destPoly.push_back(IntPoint( + Round(m_srcPoly[j].X + m_delta * (m_normals[j].X + m_normals[j].Y * dx)), + Round(m_srcPoly[j].Y + m_delta * (m_normals[j].Y - m_normals[j].X * dx)))); +} +//------------------------------------------------------------------------------ + +void ClipperOffset::DoMiter(int j, int k, double r) +{ + double q = m_delta / r; + m_destPoly.push_back(IntPoint(Round(m_srcPoly[j].X + (m_normals[k].X + m_normals[j].X) * q), + Round(m_srcPoly[j].Y + (m_normals[k].Y + m_normals[j].Y) * q))); +} +//------------------------------------------------------------------------------ + +void ClipperOffset::DoRound(int j, int k) +{ + double a = std::atan2(m_sinA, + m_normals[k].X * m_normals[j].X + m_normals[k].Y * m_normals[j].Y); + int steps = std::max((int)Round(m_StepsPerRad * std::fabs(a)), 1); + + double X = m_normals[k].X, Y = m_normals[k].Y, X2; + for (int i = 0; i < steps; ++i) + { + m_destPoly.push_back(IntPoint( + Round(m_srcPoly[j].X + X * m_delta), + Round(m_srcPoly[j].Y + Y * m_delta))); + X2 = X; + X = X * m_cos - m_sin * Y; + Y = X2 * m_sin + Y * m_cos; + } + m_destPoly.push_back(IntPoint( + Round(m_srcPoly[j].X + m_normals[j].X * m_delta), + Round(m_srcPoly[j].Y + m_normals[j].Y * m_delta))); +} + +//------------------------------------------------------------------------------ +// Miscellaneous public functions +//------------------------------------------------------------------------------ + +void Clipper::DoSimplePolygons() +{ + PolyOutList::size_type i = 0; + while (i < m_PolyOuts.size()) + { + OutRec* outrec = m_PolyOuts[i++]; + OutPt* op = outrec->Pts; + if (!op || outrec->IsOpen) continue; + do //for each Pt in Polygon until duplicate found do ... + { + OutPt* op2 = op->Next; + while (op2 != outrec->Pts) + { + if ((op->Pt == op2->Pt) && op2->Next != op && op2->Prev != op) + { + //split the polygon into two ... + OutPt* op3 = op->Prev; + OutPt* op4 = op2->Prev; + op->Prev = op4; + op4->Next = op; + op2->Prev = op3; + op3->Next = op2; + + outrec->Pts = op; + OutRec* outrec2 = CreateOutRec(); + outrec2->Pts = op2; + UpdateOutPtIdxs(*outrec2); + if (Poly2ContainsPoly1(outrec2->Pts, outrec->Pts)) + { + //OutRec2 is contained by OutRec1 ... + outrec2->IsHole = !outrec->IsHole; + outrec2->FirstLeft = outrec; + if (m_UsingPolyTree) FixupFirstLefts2(outrec2, outrec); + } + else + if (Poly2ContainsPoly1(outrec->Pts, outrec2->Pts)) + { + //OutRec1 is contained by OutRec2 ... + outrec2->IsHole = outrec->IsHole; + outrec->IsHole = !outrec2->IsHole; + outrec2->FirstLeft = outrec->FirstLeft; + outrec->FirstLeft = outrec2; + if (m_UsingPolyTree) FixupFirstLefts2(outrec, outrec2); + } + else + { + //the 2 polygons are separate ... + outrec2->IsHole = outrec->IsHole; + outrec2->FirstLeft = outrec->FirstLeft; + if (m_UsingPolyTree) FixupFirstLefts1(outrec, outrec2); + } + op2 = op; //ie get ready for the Next iteration + } + op2 = op2->Next; + } + op = op->Next; + } + while (op != outrec->Pts); + } +} +//------------------------------------------------------------------------------ + +void ReversePath(Path& p) +{ + std::reverse(p.begin(), p.end()); +} +//------------------------------------------------------------------------------ + +void ReversePaths(Paths& p) +{ + for (Paths::size_type i = 0; i < p.size(); ++i) + ReversePath(p[i]); +} +//------------------------------------------------------------------------------ + +void SimplifyPolygon(const Path &in_poly, Paths &out_polys, PolyFillType fillType) +{ + Clipper c; + c.StrictlySimple(true); + c.AddPath(in_poly, ptSubject, true); + c.Execute(ctUnion, out_polys, fillType, fillType); +} +//------------------------------------------------------------------------------ + +void SimplifyPolygons(const Paths &in_polys, Paths &out_polys, PolyFillType fillType) +{ + Clipper c; + c.StrictlySimple(true); + c.AddPaths(in_polys, ptSubject, true); + c.Execute(ctUnion, out_polys, fillType, fillType); +} +//------------------------------------------------------------------------------ + +void SimplifyPolygons(Paths &polys, PolyFillType fillType) +{ + SimplifyPolygons(polys, polys, fillType); +} +//------------------------------------------------------------------------------ + +inline double DistanceSqrd(const IntPoint& pt1, const IntPoint& pt2) +{ + double Dx = ((double)pt1.X - pt2.X); + double dy = ((double)pt1.Y - pt2.Y); + return (Dx*Dx + dy*dy); +} +//------------------------------------------------------------------------------ + +double DistanceFromLineSqrd( + const IntPoint& pt, const IntPoint& ln1, const IntPoint& ln2) +{ + //The equation of a line in general form (Ax + By + C = 0) + //given 2 points (x¹,y¹) & (x²,y²) is ... + //(y¹ - y²)x + (x² - x¹)y + (y² - y¹)x¹ - (x² - x¹)y¹ = 0 + //A = (y¹ - y²); B = (x² - x¹); C = (y² - y¹)x¹ - (x² - x¹)y¹ + //perpendicular distance of point (x³,y³) = (Ax³ + By³ + C)/Sqrt(A² + B²) + //see http://en.wikipedia.org/wiki/Perpendicular_distance + double A = double(ln1.Y - ln2.Y); + double B = double(ln2.X - ln1.X); + double C = A * ln1.X + B * ln1.Y; + C = A * pt.X + B * pt.Y - C; + return (C * C) / (A * A + B * B); +} +//--------------------------------------------------------------------------- + +bool SlopesNearCollinear(const IntPoint& pt1, + const IntPoint& pt2, const IntPoint& pt3, double distSqrd) +{ + //this function is more accurate when the point that's geometrically + //between the other 2 points is the one that's tested for distance. + //ie makes it more likely to pick up 'spikes' ... + if (Abs(pt1.X - pt2.X) > Abs(pt1.Y - pt2.Y)) + { + if ((pt1.X > pt2.X) == (pt1.X < pt3.X)) + return DistanceFromLineSqrd(pt1, pt2, pt3) < distSqrd; + else if ((pt2.X > pt1.X) == (pt2.X < pt3.X)) + return DistanceFromLineSqrd(pt2, pt1, pt3) < distSqrd; + else + return DistanceFromLineSqrd(pt3, pt1, pt2) < distSqrd; + } + else + { + if ((pt1.Y > pt2.Y) == (pt1.Y < pt3.Y)) + return DistanceFromLineSqrd(pt1, pt2, pt3) < distSqrd; + else if ((pt2.Y > pt1.Y) == (pt2.Y < pt3.Y)) + return DistanceFromLineSqrd(pt2, pt1, pt3) < distSqrd; + else + return DistanceFromLineSqrd(pt3, pt1, pt2) < distSqrd; + } +} +//------------------------------------------------------------------------------ + +bool PointsAreClose(IntPoint pt1, IntPoint pt2, double distSqrd) +{ + double Dx = (double)pt1.X - pt2.X; + double dy = (double)pt1.Y - pt2.Y; + return ((Dx * Dx) + (dy * dy) <= distSqrd); +} +//------------------------------------------------------------------------------ + +OutPt* ExcludeOp(OutPt* op) +{ + OutPt* result = op->Prev; + result->Next = op->Next; + op->Next->Prev = result; + result->Idx = 0; + return result; +} +//------------------------------------------------------------------------------ + +void CleanPolygon(const Path& in_poly, Path& out_poly, double distance) +{ + //distance = proximity in units/pixels below which vertices + //will be stripped. Default ~= sqrt(2). + + size_t size = in_poly.size(); + + if (size == 0) + { + out_poly.clear(); + return; + } + + OutPt* outPts = new OutPt[size]; + for (size_t i = 0; i < size; ++i) + { + outPts[i].Pt = in_poly[i]; + outPts[i].Next = &outPts[(i + 1) % size]; + outPts[i].Next->Prev = &outPts[i]; + outPts[i].Idx = 0; + } + + double distSqrd = distance * distance; + OutPt* op = &outPts[0]; + while (op->Idx == 0 && op->Next != op->Prev) + { + if (PointsAreClose(op->Pt, op->Prev->Pt, distSqrd)) + { + op = ExcludeOp(op); + size--; + } + else if (PointsAreClose(op->Prev->Pt, op->Next->Pt, distSqrd)) + { + ExcludeOp(op->Next); + op = ExcludeOp(op); + size -= 2; + } + else if (SlopesNearCollinear(op->Prev->Pt, op->Pt, op->Next->Pt, distSqrd)) + { + op = ExcludeOp(op); + size--; + } + else + { + op->Idx = 1; + op = op->Next; + } + } + + if (size < 3) size = 0; + out_poly.resize(size); + for (size_t i = 0; i < size; ++i) + { + out_poly[i] = op->Pt; + op = op->Next; + } + delete [] outPts; +} +//------------------------------------------------------------------------------ + +void CleanPolygon(Path& poly, double distance) +{ + CleanPolygon(poly, poly, distance); +} +//------------------------------------------------------------------------------ + +void CleanPolygons(const Paths& in_polys, Paths& out_polys, double distance) +{ + out_polys.resize(in_polys.size()); + for (Paths::size_type i = 0; i < in_polys.size(); ++i) + CleanPolygon(in_polys[i], out_polys[i], distance); +} +//------------------------------------------------------------------------------ + +void CleanPolygons(Paths& polys, double distance) +{ + CleanPolygons(polys, polys, distance); +} +//------------------------------------------------------------------------------ + +void Minkowski(const Path& poly, const Path& path, + Paths& solution, bool isSum, bool isClosed) +{ + int delta = (isClosed ? 1 : 0); + size_t polyCnt = poly.size(); + size_t pathCnt = path.size(); + Paths pp; + pp.reserve(pathCnt); + if (isSum) + for (size_t i = 0; i < pathCnt; ++i) + { + Path p; + p.reserve(polyCnt); + for (size_t j = 0; j < poly.size(); ++j) + p.push_back(IntPoint(path[i].X + poly[j].X, path[i].Y + poly[j].Y)); + pp.push_back(p); + } + else + for (size_t i = 0; i < pathCnt; ++i) + { + Path p; + p.reserve(polyCnt); + for (size_t j = 0; j < poly.size(); ++j) + p.push_back(IntPoint(path[i].X - poly[j].X, path[i].Y - poly[j].Y)); + pp.push_back(p); + } + + solution.clear(); + solution.reserve((pathCnt + delta) * (polyCnt + 1)); + for (size_t i = 0; i < pathCnt - 1 + delta; ++i) + for (size_t j = 0; j < polyCnt; ++j) + { + Path quad; + quad.reserve(4); + quad.push_back(pp[i % pathCnt][j % polyCnt]); + quad.push_back(pp[(i + 1) % pathCnt][j % polyCnt]); + quad.push_back(pp[(i + 1) % pathCnt][(j + 1) % polyCnt]); + quad.push_back(pp[i % pathCnt][(j + 1) % polyCnt]); + if (!Orientation(quad)) ReversePath(quad); + solution.push_back(quad); + } +} +//------------------------------------------------------------------------------ + +void MinkowskiSum(const Path& pattern, const Path& path, Paths& solution, bool pathIsClosed) +{ + Minkowski(pattern, path, solution, true, pathIsClosed); + Clipper c; + c.AddPaths(solution, ptSubject, true); + c.Execute(ctUnion, solution, pftNonZero, pftNonZero); +} +//------------------------------------------------------------------------------ + +void TranslatePath(const Path& input, Path& output, const IntPoint delta) +{ + //precondition: input != output + output.resize(input.size()); + for (size_t i = 0; i < input.size(); ++i) + output[i] = IntPoint(input[i].X + delta.X, input[i].Y + delta.Y); +} +//------------------------------------------------------------------------------ + +void MinkowskiSum(const Path& pattern, const Paths& paths, Paths& solution, bool pathIsClosed) +{ + Clipper c; + for (size_t i = 0; i < paths.size(); ++i) + { + Paths tmp; + Minkowski(pattern, paths[i], tmp, true, pathIsClosed); + c.AddPaths(tmp, ptSubject, true); + if (pathIsClosed) + { + Path tmp2; + TranslatePath(paths[i], tmp2, pattern[0]); + c.AddPath(tmp2, ptClip, true); + } + } + c.Execute(ctUnion, solution, pftNonZero, pftNonZero); +} +//------------------------------------------------------------------------------ + +void MinkowskiDiff(const Path& poly1, const Path& poly2, Paths& solution) +{ + Minkowski(poly1, poly2, solution, false, true); + Clipper c; + c.AddPaths(solution, ptSubject, true); + c.Execute(ctUnion, solution, pftNonZero, pftNonZero); +} +//------------------------------------------------------------------------------ + +enum NodeType {ntAny, ntOpen, ntClosed}; + +void AddPolyNodeToPaths(const PolyNode& polynode, NodeType nodetype, Paths& paths) +{ + bool match = true; + if (nodetype == ntClosed) match = !polynode.IsOpen(); + else if (nodetype == ntOpen) return; + + if (!polynode.Contour.empty() && match) + paths.push_back(polynode.Contour); + for (int i = 0; i < polynode.ChildCount(); ++i) + AddPolyNodeToPaths(*polynode.Childs[i], nodetype, paths); +} +//------------------------------------------------------------------------------ + +void PolyTreeToPaths(const PolyTree& polytree, Paths& paths) +{ + paths.resize(0); + paths.reserve(polytree.Total()); + AddPolyNodeToPaths(polytree, ntAny, paths); +} +//------------------------------------------------------------------------------ + +void ClosedPathsFromPolyTree(const PolyTree& polytree, Paths& paths) +{ + paths.resize(0); + paths.reserve(polytree.Total()); + AddPolyNodeToPaths(polytree, ntClosed, paths); +} +//------------------------------------------------------------------------------ + +void OpenPathsFromPolyTree(PolyTree& polytree, Paths& paths) +{ + paths.resize(0); + paths.reserve(polytree.Total()); + //Open paths are top level only, so ... + for (int i = 0; i < polytree.ChildCount(); ++i) + if (polytree.Childs[i]->IsOpen()) + paths.push_back(polytree.Childs[i]->Contour); +} +//------------------------------------------------------------------------------ + +std::ostream& operator <<(std::ostream &s, const IntPoint &p) +{ + s << "(" << p.X << "," << p.Y << ")"; + return s; +} +//------------------------------------------------------------------------------ + +std::ostream& operator <<(std::ostream &s, const Path &p) +{ + if (p.empty()) return s; + Path::size_type last = p.size() -1; + for (Path::size_type i = 0; i < last; i++) + s << "(" << p[i].X << "," << p[i].Y << "), "; + s << "(" << p[last].X << "," << p[last].Y << ")\n"; + return s; +} +//------------------------------------------------------------------------------ + +std::ostream& operator <<(std::ostream &s, const Paths &p) +{ + for (Paths::size_type i = 0; i < p.size(); i++) + s << p[i]; + s << "\n"; + return s; +} +//------------------------------------------------------------------------------ + +} //QtClipperLib namespace diff --git a/src/3rdparty/clipper/clipper.h b/src/3rdparty/clipper/clipper.h new file mode 100644 index 0000000..78013af --- /dev/null +++ b/src/3rdparty/clipper/clipper.h @@ -0,0 +1,404 @@ +/******************************************************************************* +* * +* Author : Angus Johnson * +* Version : 6.4.0 * +* Date : 2 July 2015 * +* Website : http://www.angusj.com * +* Copyright : Angus Johnson 2010-2015 * +* * +* License: * +* Use, modification & distribution is subject to Boost Software License Ver 1. * +* http://www.boost.org/LICENSE_1_0.txt * +* * +* Attributions: * +* The code in this library is an extension of Bala Vatti's clipping algorithm: * +* "A generic solution to polygon clipping" * +* Communications of the ACM, Vol 35, Issue 7 (July 1992) pp 56-63. * +* http://portal.acm.org/citation.cfm?id=129906 * +* * +* Computer graphics and geometric modeling: implementation and algorithms * +* By Max K. Agoston * +* Springer; 1 edition (January 4, 2005) * +* http://books.google.com/books?q=vatti+clipping+agoston * +* * +* See also: * +* "Polygon Offsetting by Computing Winding Numbers" * +* Paper no. DETC2005-85513 pp. 565-575 * +* ASME 2005 International Design Engineering Technical Conferences * +* and Computers and Information in Engineering Conference (IDETC/CIE2005) * +* September 24-28, 2005 , Long Beach, California, USA * +* http://www.me.berkeley.edu/~mcmains/pubs/DAC05OffsetPolygon.pdf * +* * +*******************************************************************************/ + +#ifndef clipper_hpp +#define clipper_hpp + +#define CLIPPER_VERSION "6.2.6" + +//use_int32: When enabled 32bit ints are used instead of 64bit ints. This +//improve performance but coordinate values are limited to the range +/- 46340 +//#define use_int32 + +//use_xyz: adds a Z member to IntPoint. Adds a minor cost to perfomance. +//#define use_xyz + +//use_lines: Enables line clipping. Adds a very minor cost to performance. +#define use_lines + +//use_deprecated: Enables temporary support for the obsolete functions +//#define use_deprecated + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace QtClipperLib { + +enum ClipType { ctIntersection, ctUnion, ctDifference, ctXor }; +enum PolyType { ptSubject, ptClip }; +//By far the most widely used winding rules for polygon filling are +//EvenOdd & NonZero (GDI, GDI+, XLib, OpenGL, Cairo, AGG, Quartz, SVG, Gr32) +//Others rules include Positive, Negative and ABS_GTR_EQ_TWO (only in OpenGL) +//see http://glprogramming.com/red/chapter11.html +enum PolyFillType { pftEvenOdd, pftNonZero, pftPositive, pftNegative }; + +#ifdef use_int32 + typedef int cInt; + static cInt const loRange = 0x7FFF; + static cInt const hiRange = 0x7FFF; +#else + typedef signed long long cInt; + static cInt const loRange = 0x3FFFFFFF; + static cInt const hiRange = 0x3FFFFFFFFFFFFFFFLL; + typedef signed long long long64; //used by Int128 class + typedef unsigned long long ulong64; + +#endif + +struct IntPoint { + cInt X; + cInt Y; +#ifdef use_xyz + cInt Z; + IntPoint(cInt x = 0, cInt y = 0, cInt z = 0): X(x), Y(y), Z(z) {}; +#else + IntPoint(cInt x = 0, cInt y = 0): X(x), Y(y) {}; +#endif + + friend inline bool operator== (const IntPoint& a, const IntPoint& b) + { + return a.X == b.X && a.Y == b.Y; + } + friend inline bool operator!= (const IntPoint& a, const IntPoint& b) + { + return a.X != b.X || a.Y != b.Y; + } +}; +//------------------------------------------------------------------------------ + +typedef std::vector< IntPoint > Path; +typedef std::vector< Path > Paths; + +inline Path& operator <<(Path& poly, const IntPoint& p) {poly.push_back(p); return poly;} +inline Paths& operator <<(Paths& polys, const Path& p) {polys.push_back(p); return polys;} + +std::ostream& operator <<(std::ostream &s, const IntPoint &p); +std::ostream& operator <<(std::ostream &s, const Path &p); +std::ostream& operator <<(std::ostream &s, const Paths &p); + +struct DoublePoint +{ + double X; + double Y; + DoublePoint(double x = 0, double y = 0) : X(x), Y(y) {} + DoublePoint(IntPoint ip) : X((double)ip.X), Y((double)ip.Y) {} +}; +//------------------------------------------------------------------------------ + +#ifdef use_xyz +typedef void (*ZFillCallback)(IntPoint& e1bot, IntPoint& e1top, IntPoint& e2bot, IntPoint& e2top, IntPoint& pt); +#endif + +enum InitOptions {ioReverseSolution = 1, ioStrictlySimple = 2, ioPreserveCollinear = 4}; +enum JoinType {jtSquare, jtRound, jtMiter}; +enum EndType {etClosedPolygon, etClosedLine, etOpenButt, etOpenSquare, etOpenRound}; + +class PolyNode; +typedef std::vector< PolyNode* > PolyNodes; + +class PolyNode +{ +public: + PolyNode(); + virtual ~PolyNode(){}; + Path Contour; + PolyNodes Childs; + PolyNode* Parent; + PolyNode* GetNext() const; + bool IsHole() const; + bool IsOpen() const; + int ChildCount() const; +private: + unsigned Index; //node index in Parent.Childs + bool m_IsOpen; + JoinType m_jointype; + EndType m_endtype; + PolyNode* GetNextSiblingUp() const; + void AddChild(PolyNode& child); + friend class Clipper; //to access Index + friend class ClipperOffset; +}; + +class PolyTree: public PolyNode +{ +public: + ~PolyTree(){Clear();}; + PolyNode* GetFirst() const; + void Clear(); + int Total() const; +private: + PolyNodes AllNodes; + friend class Clipper; //to access AllNodes +}; + +bool Orientation(const Path &poly); +double Area(const Path &poly); +int PointInPolygon(const IntPoint &pt, const Path &path); + +void SimplifyPolygon(const Path &in_poly, Paths &out_polys, PolyFillType fillType = pftEvenOdd); +void SimplifyPolygons(const Paths &in_polys, Paths &out_polys, PolyFillType fillType = pftEvenOdd); +void SimplifyPolygons(Paths &polys, PolyFillType fillType = pftEvenOdd); + +void CleanPolygon(const Path& in_poly, Path& out_poly, double distance = 1.415); +void CleanPolygon(Path& poly, double distance = 1.415); +void CleanPolygons(const Paths& in_polys, Paths& out_polys, double distance = 1.415); +void CleanPolygons(Paths& polys, double distance = 1.415); + +void MinkowskiSum(const Path& pattern, const Path& path, Paths& solution, bool pathIsClosed); +void MinkowskiSum(const Path& pattern, const Paths& paths, Paths& solution, bool pathIsClosed); +void MinkowskiDiff(const Path& poly1, const Path& poly2, Paths& solution); + +void PolyTreeToPaths(const PolyTree& polytree, Paths& paths); +void ClosedPathsFromPolyTree(const PolyTree& polytree, Paths& paths); +void OpenPathsFromPolyTree(PolyTree& polytree, Paths& paths); + +void ReversePath(Path& p); +void ReversePaths(Paths& p); + +struct IntRect { cInt left; cInt top; cInt right; cInt bottom; }; + +//enums that are used internally ... +enum EdgeSide { esLeft = 1, esRight = 2}; + +//forward declarations (for stuff used internally) ... +struct TEdge; +struct IntersectNode; +struct LocalMinimum; +struct OutPt; +struct OutRec; +struct Join; + +typedef std::vector < OutRec* > PolyOutList; +typedef std::vector < TEdge* > EdgeList; +typedef std::vector < Join* > JoinList; +typedef std::vector < IntersectNode* > IntersectList; + +//------------------------------------------------------------------------------ + +//ClipperBase is the ancestor to the Clipper class. It should not be +//instantiated directly. This class simply abstracts the conversion of sets of +//polygon coordinates into edge objects that are stored in a LocalMinima list. +class ClipperBase +{ +public: + ClipperBase(); + virtual ~ClipperBase(); + virtual bool AddPath(const Path &pg, PolyType PolyTyp, bool Closed); + bool AddPaths(const Paths &ppg, PolyType PolyTyp, bool Closed); + virtual void Clear(); + IntRect GetBounds(); + bool PreserveCollinear() {return m_PreserveCollinear;}; + void PreserveCollinear(bool value) {m_PreserveCollinear = value;}; +protected: + void DisposeLocalMinimaList(); + TEdge* AddBoundsToLML(TEdge *e, bool IsClosed); + virtual void Reset(); + TEdge* ProcessBound(TEdge* E, bool IsClockwise); + void InsertScanbeam(const cInt Y); + bool PopScanbeam(cInt &Y); + bool LocalMinimaPending(); + bool PopLocalMinima(cInt Y, const LocalMinimum *&locMin); + OutRec* CreateOutRec(); + void DisposeAllOutRecs(); + void DisposeOutRec(PolyOutList::size_type index); + void SwapPositionsInAEL(TEdge *edge1, TEdge *edge2); + void DeleteFromAEL(TEdge *e); + void UpdateEdgeIntoAEL(TEdge *&e); + + typedef std::vector MinimaList; + MinimaList::iterator m_CurrentLM; + MinimaList m_MinimaList; + + bool m_UseFullRange; + EdgeList m_edges; + bool m_PreserveCollinear; + bool m_HasOpenPaths; + PolyOutList m_PolyOuts; + TEdge *m_ActiveEdges; + + typedef std::priority_queue ScanbeamList; + ScanbeamList m_Scanbeam; +}; +//------------------------------------------------------------------------------ + +class Clipper : public virtual ClipperBase +{ +public: + Clipper(int initOptions = 0); + bool Execute(ClipType clipType, + Paths &solution, + PolyFillType fillType = pftEvenOdd); + bool Execute(ClipType clipType, + Paths &solution, + PolyFillType subjFillType, + PolyFillType clipFillType); + bool Execute(ClipType clipType, + PolyTree &polytree, + PolyFillType fillType = pftEvenOdd); + bool Execute(ClipType clipType, + PolyTree &polytree, + PolyFillType subjFillType, + PolyFillType clipFillType); + bool ReverseSolution() { return m_ReverseOutput; }; + void ReverseSolution(bool value) {m_ReverseOutput = value;}; + bool StrictlySimple() {return m_StrictSimple;}; + void StrictlySimple(bool value) {m_StrictSimple = value;}; + //set the callback function for z value filling on intersections (otherwise Z is 0) +#ifdef use_xyz + void ZFillFunction(ZFillCallback zFillFunc); +#endif +protected: + virtual bool ExecuteInternal(); +private: + JoinList m_Joins; + JoinList m_GhostJoins; + IntersectList m_IntersectList; + ClipType m_ClipType; + typedef std::list MaximaList; + MaximaList m_Maxima; + TEdge *m_SortedEdges; + bool m_ExecuteLocked; + PolyFillType m_ClipFillType; + PolyFillType m_SubjFillType; + bool m_ReverseOutput; + bool m_UsingPolyTree; + bool m_StrictSimple; +#ifdef use_xyz + ZFillCallback m_ZFill; //custom callback +#endif + void SetWindingCount(TEdge& edge); + bool IsEvenOddFillType(const TEdge& edge) const; + bool IsEvenOddAltFillType(const TEdge& edge) const; + void InsertLocalMinimaIntoAEL(const cInt botY); + void InsertEdgeIntoAEL(TEdge *edge, TEdge* startEdge); + void AddEdgeToSEL(TEdge *edge); + bool PopEdgeFromSEL(TEdge *&edge); + void CopyAELToSEL(); + void DeleteFromSEL(TEdge *e); + void SwapPositionsInSEL(TEdge *edge1, TEdge *edge2); + bool IsContributing(const TEdge& edge) const; + bool IsTopHorz(const cInt XPos); + void DoMaxima(TEdge *e); + void ProcessHorizontals(); + void ProcessHorizontal(TEdge *horzEdge); + void AddLocalMaxPoly(TEdge *e1, TEdge *e2, const IntPoint &pt); + OutPt* AddLocalMinPoly(TEdge *e1, TEdge *e2, const IntPoint &pt); + OutRec* GetOutRec(int idx); + void AppendPolygon(TEdge *e1, TEdge *e2); + void IntersectEdges(TEdge *e1, TEdge *e2, IntPoint &pt); + OutPt* AddOutPt(TEdge *e, const IntPoint &pt); + OutPt* GetLastOutPt(TEdge *e); + bool ProcessIntersections(const cInt topY); + void BuildIntersectList(const cInt topY); + void ProcessIntersectList(); + void ProcessEdgesAtTopOfScanbeam(const cInt topY); + void BuildResult(Paths& polys); + void BuildResult2(PolyTree& polytree); + void SetHoleState(TEdge *e, OutRec *outrec); + void DisposeIntersectNodes(); + bool FixupIntersectionOrder(); + void FixupOutPolygon(OutRec &outrec); + void FixupOutPolyline(OutRec &outrec); + bool IsHole(TEdge *e); + bool FindOwnerFromSplitRecs(OutRec &outRec, OutRec *&currOrfl); + void FixHoleLinkage(OutRec &outrec); + void AddJoin(OutPt *op1, OutPt *op2, const IntPoint offPt); + void ClearJoins(); + void ClearGhostJoins(); + void AddGhostJoin(OutPt *op, const IntPoint offPt); + bool JoinPoints(Join *j, OutRec* outRec1, OutRec* outRec2); + void JoinCommonEdges(); + void DoSimplePolygons(); + void FixupFirstLefts1(OutRec* OldOutRec, OutRec* NewOutRec); + void FixupFirstLefts2(OutRec* InnerOutRec, OutRec* OuterOutRec); + void FixupFirstLefts3(OutRec* OldOutRec, OutRec* NewOutRec); +#ifdef use_xyz + void SetZ(IntPoint& pt, TEdge& e1, TEdge& e2); +#endif +}; +//------------------------------------------------------------------------------ + +class ClipperOffset +{ +public: + ClipperOffset(double miterLimit = 2.0, double roundPrecision = 0.25); + ~ClipperOffset(); + void AddPath(const Path& path, JoinType joinType, EndType endType); + void AddPaths(const Paths& paths, JoinType joinType, EndType endType); + void Execute(Paths& solution, double delta); + void Execute(PolyTree& solution, double delta); + void Clear(); + double MiterLimit; + double ArcTolerance; +private: + Paths m_destPolys; + Path m_srcPoly; + Path m_destPoly; + std::vector m_normals; + double m_delta, m_sinA, m_sin, m_cos; + double m_miterLim, m_StepsPerRad; + IntPoint m_lowest; + PolyNode m_polyNodes; + + void FixOrientations(); + void DoOffset(double delta); + void OffsetPoint(int j, int& k, JoinType jointype); + void DoSquare(int j, int k); + void DoMiter(int j, int k, double r); + void DoRound(int j, int k); +}; +//------------------------------------------------------------------------------ + +class clipperException : public std::exception +{ + public: + clipperException(const char* description): m_descr(description) {} + virtual ~clipperException() throw() {} + virtual const char* what() const throw() {return m_descr.c_str();} + private: + std::string m_descr; +}; +//------------------------------------------------------------------------------ + +} //QtClipperLib namespace + +#endif //clipper_hpp + + diff --git a/src/3rdparty/clipper/clipper.pro b/src/3rdparty/clipper/clipper.pro new file mode 100644 index 0000000..a518d24 --- /dev/null +++ b/src/3rdparty/clipper/clipper.pro @@ -0,0 +1,16 @@ +TARGET = qt_clipper + +CONFIG += staticlib exceptions warn_off optimize_full + +load(qt_helper_lib) + +# workaround for QTBUG-31586 +contains(QT_CONFIG, c++11): CONFIG += c++11 + +gcc { + QMAKE_CFLAGS_OPTIMIZE_FULL += -ffast-math + !clang:!intel_icc:!rim_qcc: QMAKE_CXXFLAGS_WARN_ON += -Wno-error=return-type +} + +HEADERS += clipper.h +SOURCES += clipper.cpp diff --git a/src/3rdparty/clipper/qt_attribution.json b/src/3rdparty/clipper/qt_attribution.json new file mode 100644 index 0000000..4f6a232 --- /dev/null +++ b/src/3rdparty/clipper/qt_attribution.json @@ -0,0 +1,13 @@ +{ + "Id": "clipper", + "Name": "Clipper Polygon Clipping Library", + "QDocModule": "qtlocation", + "QtUsage": "Used in the QML plugin of Qt Location.", + "Description": "The Clipper library performs line & polygon clipping - intersection, union, difference & exclusive-or, and line & polygon offsetting.", + "Homepage": "http://www.angusj.com/delphi/clipper.php", + "Version": "6.4.0", + "LicenseId": "BSL-1.0", + "License": "Boost Software License 1.0", + "LicenseFile": "LICENSE", + "Copyright": "Copyright Angus Johnson 2010-2015" +} diff --git a/src/3rdparty/earcut/LICENSE b/src/3rdparty/earcut/LICENSE new file mode 100644 index 0000000..8bafb57 --- /dev/null +++ b/src/3rdparty/earcut/LICENSE @@ -0,0 +1,15 @@ +ISC License + +Copyright (c) 2015, Mapbox + +Permission to use, copy, modify, and/or distribute this software for any purpose +with or without fee is hereby granted, provided that the above copyright notice +and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. diff --git a/src/3rdparty/earcut/earcut.hpp b/src/3rdparty/earcut/earcut.hpp new file mode 100644 index 0000000..d0b0c41 --- /dev/null +++ b/src/3rdparty/earcut/earcut.hpp @@ -0,0 +1,837 @@ +/**************************************************************************** +** earcut.hpp v2.2.1 +** +** ISC License +** +** Copyright (c) 2015, Mapbox +** +** Permission to use, copy, modify, and/or distribute this software for any purpose +** with or without fee is hereby granted, provided that the above copyright notice +** and this permission notice appear in all copies. +** +** THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +** REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +** FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +** INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +** OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +** TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +** THIS SOFTWARE. +****************************************************************************/ + +#pragma once +#ifndef EARCUT_HPP +#define EARCUT_HPP + +#pragma once + +#include +#include +#include +#include +#include + +namespace qt_mapbox { + +namespace util { + +template struct nth { + inline static typename std::tuple_element::type + get(const T& t) { return std::get(t); }; +}; + +} + +namespace detail { + +template +class Earcut { +public: + std::vector indices; + std::size_t vertices = 0; + + template + void operator()(const Polygon& points); + +private: + struct Node { + Node(N index, double x_, double y_) : i(index), x(x_), y(y_) {} + Node(const Node&) = delete; + Node& operator=(const Node&) = delete; + Node(Node&&) = delete; + Node& operator=(Node&&) = delete; + + const N i; + const double x; + const double y; + + // previous and next vertice nodes in a polygon ring + Node* prev = nullptr; + Node* next = nullptr; + + // z-order curve value + int32_t z = 0; + + // previous and next nodes in z-order + Node* prevZ = nullptr; + Node* nextZ = nullptr; + + // indicates whether this is a steiner point + bool steiner = false; + }; + + template Node* linkedList(const Ring& points, const bool clockwise); + Node* filterPoints(Node* start, Node* end = nullptr); + void earcutLinked(Node* ear, int pass = 0); + bool isEar(Node* ear); + bool isEarHashed(Node* ear); + Node* cureLocalIntersections(Node* start); + void splitEarcut(Node* start); + template Node* eliminateHoles(const Polygon& points, Node* outerNode); + void eliminateHole(Node* hole, Node* outerNode); + Node* findHoleBridge(Node* hole, Node* outerNode); + bool sectorContainsSector(const Node* m, const Node* p); + void indexCurve(Node* start); + Node* sortLinked(Node* list); + int32_t zOrder(const double x_, const double y_); + Node* getLeftmost(Node* start); + bool pointInTriangle(double ax, double ay, double bx, double by, double cx, double cy, double px, double py) const; + bool isValidDiagonal(Node* a, Node* b); + double area(const Node* p, const Node* q, const Node* r) const; + bool equals(const Node* p1, const Node* p2); + bool intersects(const Node* p1, const Node* q1, const Node* p2, const Node* q2); + bool onSegment(const Node* p, const Node* q, const Node* r); + int sign(double val); + bool intersectsPolygon(const Node* a, const Node* b); + bool locallyInside(const Node* a, const Node* b); + bool middleInside(const Node* a, const Node* b); + Node* splitPolygon(Node* a, Node* b); + template Node* insertNode(std::size_t i, const Point& p, Node* last); + void removeNode(Node* p); + + bool hashing; + double minX, maxX; + double minY, maxY; + double inv_size = 0; + + template > + class ObjectPool { + public: + ObjectPool() { } + ObjectPool(std::size_t blockSize_) { + reset(blockSize_); + } + ~ObjectPool() { + clear(); + } + template + T* construct(Args&&... args) { + if (currentIndex >= blockSize) { + currentBlock = alloc_traits::allocate(alloc, blockSize); + allocations.emplace_back(currentBlock); + currentIndex = 0; + } + T* object = ¤tBlock[currentIndex++]; + alloc_traits::construct(alloc, object, std::forward(args)...); + return object; + } + void reset(std::size_t newBlockSize) { + for (auto allocation : allocations) { + alloc_traits::deallocate(alloc, allocation, blockSize); + } + allocations.clear(); + blockSize = std::max(1, newBlockSize); + currentBlock = nullptr; + currentIndex = blockSize; + } + void clear() { reset(blockSize); } + private: + T* currentBlock = nullptr; + std::size_t currentIndex = 1; + std::size_t blockSize = 1; + std::vector allocations; + Alloc alloc; + typedef typename std::allocator_traits alloc_traits; + }; + ObjectPool nodes; +}; + +template template +void Earcut::operator()(const Polygon& points) { + // reset + indices.clear(); + vertices = 0; + + if (points.empty()) return; + + double x; + double y; + int threshold = 80; + std::size_t len = 0; + + for (size_t i = 0; threshold >= 0 && i < points.size(); i++) { + threshold -= static_cast(points[i].size()); + len += points[i].size(); + } + + //estimate size of nodes and indices + nodes.reset(len * 3 / 2); + indices.reserve(len + points[0].size()); + + Node* outerNode = linkedList(points[0], true); + if (!outerNode || outerNode->prev == outerNode->next) return; + + if (points.size() > 1) outerNode = eliminateHoles(points, outerNode); + + // if the shape is not too simple, we'll use z-order curve hash later; calculate polygon bbox + hashing = threshold < 0; + if (hashing) { + Node* p = outerNode->next; + minX = maxX = outerNode->x; + minY = maxY = outerNode->y; + do { + x = p->x; + y = p->y; + minX = std::min(minX, x); + minY = std::min(minY, y); + maxX = std::max(maxX, x); + maxY = std::max(maxY, y); + p = p->next; + } while (p != outerNode); + + // minX, minY and size are later used to transform coords into integers for z-order calculation + inv_size = std::max(maxX - minX, maxY - minY); + inv_size = inv_size != .0 ? (1. / inv_size) : .0; + } + + earcutLinked(outerNode); + + nodes.clear(); +} + +// create a circular doubly linked list from polygon points in the specified winding order +template template +typename Earcut::Node* +Earcut::linkedList(const Ring& points, const bool clockwise) { + using Point = typename Ring::value_type; + double sum = 0; + const std::size_t len = points.size(); + std::size_t i, j; + Node* last = nullptr; + + // calculate original winding order of a polygon ring + for (i = 0, j = len > 0 ? len - 1 : 0; i < len; j = i++) { + const auto& p1 = points[i]; + const auto& p2 = points[j]; + const double p20 = util::nth<0, Point>::get(p2); + const double p10 = util::nth<0, Point>::get(p1); + const double p11 = util::nth<1, Point>::get(p1); + const double p21 = util::nth<1, Point>::get(p2); + sum += (p20 - p10) * (p11 + p21); + } + + // link points into circular doubly-linked list in the specified winding order + if (clockwise == (sum > 0)) { + for (i = 0; i < len; i++) last = insertNode(vertices + i, points[i], last); + } else { + for (i = len; i-- > 0;) last = insertNode(vertices + i, points[i], last); + } + + if (last && equals(last, last->next)) { + removeNode(last); + last = last->next; + } + + vertices += len; + + return last; +} + +// eliminate colinear or duplicate points +template +typename Earcut::Node* +Earcut::filterPoints(Node* start, Node* end) { + if (!end) end = start; + + Node* p = start; + bool again; + do { + again = false; + + if (!p->steiner && (equals(p, p->next) || area(p->prev, p, p->next) == 0)) { + removeNode(p); + p = end = p->prev; + + if (p == p->next) break; + again = true; + + } else { + p = p->next; + } + } while (again || p != end); + + return end; +} + +// main ear slicing loop which triangulates a polygon (given as a linked list) +template +void Earcut::earcutLinked(Node* ear, int pass) { + if (!ear) return; + + // interlink polygon nodes in z-order + if (!pass && hashing) indexCurve(ear); + + Node* stop = ear; + Node* prev; + Node* next; + + int iterations = 0; + + // iterate through ears, slicing them one by one + while (ear->prev != ear->next) { + iterations++; + prev = ear->prev; + next = ear->next; + + if (hashing ? isEarHashed(ear) : isEar(ear)) { + // cut off the triangle + indices.emplace_back(prev->i); + indices.emplace_back(ear->i); + indices.emplace_back(next->i); + + removeNode(ear); + + // skipping the next vertice leads to less sliver triangles + ear = next->next; + stop = next->next; + + continue; + } + + ear = next; + + // if we looped through the whole remaining polygon and can't find any more ears + if (ear == stop) { + // try filtering points and slicing again + if (!pass) earcutLinked(filterPoints(ear), 1); + + // if this didn't work, try curing all small self-intersections locally + else if (pass == 1) { + ear = cureLocalIntersections(filterPoints(ear)); + earcutLinked(ear, 2); + + // as a last resort, try splitting the remaining polygon into two + } else if (pass == 2) splitEarcut(ear); + + break; + } + } +} + +// check whether a polygon node forms a valid ear with adjacent nodes +template +bool Earcut::isEar(Node* ear) { + const Node* a = ear->prev; + const Node* b = ear; + const Node* c = ear->next; + + if (area(a, b, c) >= 0) return false; // reflex, can't be an ear + + // now make sure we don't have other points inside the potential ear + Node* p = ear->next->next; + + while (p != ear->prev) { + if (pointInTriangle(a->x, a->y, b->x, b->y, c->x, c->y, p->x, p->y) && + area(p->prev, p, p->next) >= 0) return false; + p = p->next; + } + + return true; +} + +template +bool Earcut::isEarHashed(Node* ear) { + const Node* a = ear->prev; + const Node* b = ear; + const Node* c = ear->next; + + if (area(a, b, c) >= 0) return false; // reflex, can't be an ear + + // triangle bbox; min & max are calculated like this for speed + const double minTX = std::min(a->x, std::min(b->x, c->x)); + const double minTY = std::min(a->y, std::min(b->y, c->y)); + const double maxTX = std::max(a->x, std::max(b->x, c->x)); + const double maxTY = std::max(a->y, std::max(b->y, c->y)); + + // z-order range for the current triangle bbox; + const int32_t minZ = zOrder(minTX, minTY); + const int32_t maxZ = zOrder(maxTX, maxTY); + + // first look for points inside the triangle in increasing z-order + Node* p = ear->nextZ; + + while (p && p->z <= maxZ) { + if (p != ear->prev && p != ear->next && + pointInTriangle(a->x, a->y, b->x, b->y, c->x, c->y, p->x, p->y) && + area(p->prev, p, p->next) >= 0) return false; + p = p->nextZ; + } + + // then look for points in decreasing z-order + p = ear->prevZ; + + while (p && p->z >= minZ) { + if (p != ear->prev && p != ear->next && + pointInTriangle(a->x, a->y, b->x, b->y, c->x, c->y, p->x, p->y) && + area(p->prev, p, p->next) >= 0) return false; + p = p->prevZ; + } + + return true; +} + +// go through all polygon nodes and cure small local self-intersections +template +typename Earcut::Node* +Earcut::cureLocalIntersections(Node* start) { + Node* p = start; + do { + Node* a = p->prev; + Node* b = p->next->next; + + // a self-intersection where edge (v[i-1],v[i]) intersects (v[i+1],v[i+2]) + if (!equals(a, b) && intersects(a, p, p->next, b) && locallyInside(a, b) && locallyInside(b, a)) { + indices.emplace_back(a->i); + indices.emplace_back(p->i); + indices.emplace_back(b->i); + + // remove two nodes involved + removeNode(p); + removeNode(p->next); + + p = start = b; + } + p = p->next; + } while (p != start); + + return filterPoints(p); +} + +// try splitting polygon into two and triangulate them independently +template +void Earcut::splitEarcut(Node* start) { + // look for a valid diagonal that divides the polygon into two + Node* a = start; + do { + Node* b = a->next->next; + while (b != a->prev) { + if (a->i != b->i && isValidDiagonal(a, b)) { + // split the polygon in two by the diagonal + Node* c = splitPolygon(a, b); + + // filter colinear points around the cuts + a = filterPoints(a, a->next); + c = filterPoints(c, c->next); + + // run earcut on each half + earcutLinked(a); + earcutLinked(c); + return; + } + b = b->next; + } + a = a->next; + } while (a != start); +} + +// link every hole into the outer loop, producing a single-ring polygon without holes +template template +typename Earcut::Node* +Earcut::eliminateHoles(const Polygon& points, Node* outerNode) { + const size_t len = points.size(); + + std::vector queue; + for (size_t i = 1; i < len; i++) { + Node* list = linkedList(points[i], false); + if (list) { + if (list == list->next) list->steiner = true; + queue.push_back(getLeftmost(list)); + } + } + std::sort(queue.begin(), queue.end(), [](const Node* a, const Node* b) { + return a->x < b->x; + }); + + // process holes from left to right + for (size_t i = 0; i < queue.size(); i++) { + eliminateHole(queue[i], outerNode); + outerNode = filterPoints(outerNode, outerNode->next); + } + + return outerNode; +} + +// find a bridge between vertices that connects hole with an outer ring and and link it +template +void Earcut::eliminateHole(Node* hole, Node* outerNode) { + outerNode = findHoleBridge(hole, outerNode); + if (outerNode) { + Node* b = splitPolygon(outerNode, hole); + filterPoints(b, b->next); + } +} + +// David Eberly's algorithm for finding a bridge between hole and outer polygon +template +typename Earcut::Node* +Earcut::findHoleBridge(Node* hole, Node* outerNode) { + Node* p = outerNode; + double hx = hole->x; + double hy = hole->y; + double qx = -std::numeric_limits::infinity(); + Node* m = nullptr; + + // find a segment intersected by a ray from the hole's leftmost Vertex to the left; + // segment's endpoint with lesser x will be potential connection Vertex + do { + if (hy <= p->y && hy >= p->next->y && p->next->y != p->y) { + double x = p->x + (hy - p->y) * (p->next->x - p->x) / (p->next->y - p->y); + if (x <= hx && x > qx) { + qx = x; + if (x == hx) { + if (hy == p->y) return p; + if (hy == p->next->y) return p->next; + } + m = p->x < p->next->x ? p : p->next; + } + } + p = p->next; + } while (p != outerNode); + + if (!m) return 0; + + if (hx == qx) return m; // hole touches outer segment; pick leftmost endpoint + + // look for points inside the triangle of hole Vertex, segment intersection and endpoint; + // if there are no points found, we have a valid connection; + // otherwise choose the Vertex of the minimum angle with the ray as connection Vertex + + const Node* stop = m; + double tanMin = std::numeric_limits::infinity(); + double tanCur = 0; + + p = m; + double mx = m->x; + double my = m->y; + + do { + if (hx >= p->x && p->x >= mx && hx != p->x && + pointInTriangle(hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p->x, p->y)) { + + tanCur = std::abs(hy - p->y) / (hx - p->x); // tangential + + if (locallyInside(p, hole) && + (tanCur < tanMin || (tanCur == tanMin && (p->x > m->x || sectorContainsSector(m, p))))) { + m = p; + tanMin = tanCur; + } + } + + p = p->next; + } while (p != stop); + + return m; +} + +// whether sector in vertex m contains sector in vertex p in the same coordinates +template +bool Earcut::sectorContainsSector(const Node* m, const Node* p) { + return area(m->prev, m, p->prev) < 0 && area(p->next, m, m->next) < 0; +} + +// interlink polygon nodes in z-order +template +void Earcut::indexCurve(Node* start) { + assert(start); + Node* p = start; + + do { + p->z = p->z ? p->z : zOrder(p->x, p->y); + p->prevZ = p->prev; + p->nextZ = p->next; + p = p->next; + } while (p != start); + + p->prevZ->nextZ = nullptr; + p->prevZ = nullptr; + + sortLinked(p); +} + +// Simon Tatham's linked list merge sort algorithm +// http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html +template +typename Earcut::Node* +Earcut::sortLinked(Node* list) { + assert(list); + Node* p; + Node* q; + Node* e; + Node* tail; + int i, numMerges, pSize, qSize; + int inSize = 1; + + for (;;) { + p = list; + list = nullptr; + tail = nullptr; + numMerges = 0; + + while (p) { + numMerges++; + q = p; + pSize = 0; + for (i = 0; i < inSize; i++) { + pSize++; + q = q->nextZ; + if (!q) break; + } + + qSize = inSize; + + while (pSize > 0 || (qSize > 0 && q)) { + + if (pSize == 0) { + e = q; + q = q->nextZ; + qSize--; + } else if (qSize == 0 || !q) { + e = p; + p = p->nextZ; + pSize--; + } else if (p->z <= q->z) { + e = p; + p = p->nextZ; + pSize--; + } else { + e = q; + q = q->nextZ; + qSize--; + } + + if (tail) tail->nextZ = e; + else list = e; + + e->prevZ = tail; + tail = e; + } + + p = q; + } + + tail->nextZ = nullptr; + + if (numMerges <= 1) return list; + + inSize *= 2; + } +} + +// z-order of a Vertex given coords and size of the data bounding box +template +int32_t Earcut::zOrder(const double x_, const double y_) { + // coords are transformed into non-negative 15-bit integer range + int32_t x = static_cast(32767.0 * (x_ - minX) * inv_size); + int32_t y = static_cast(32767.0 * (y_ - minY) * inv_size); + + x = (x | (x << 8)) & 0x00FF00FF; + x = (x | (x << 4)) & 0x0F0F0F0F; + x = (x | (x << 2)) & 0x33333333; + x = (x | (x << 1)) & 0x55555555; + + y = (y | (y << 8)) & 0x00FF00FF; + y = (y | (y << 4)) & 0x0F0F0F0F; + y = (y | (y << 2)) & 0x33333333; + y = (y | (y << 1)) & 0x55555555; + + return x | (y << 1); +} + +// find the leftmost node of a polygon ring +template +typename Earcut::Node* +Earcut::getLeftmost(Node* start) { + Node* p = start; + Node* leftmost = start; + do { + if (p->x < leftmost->x || (p->x == leftmost->x && p->y < leftmost->y)) + leftmost = p; + p = p->next; + } while (p != start); + + return leftmost; +} + +// check if a point lies within a convex triangle +template +bool Earcut::pointInTriangle(double ax, double ay, double bx, double by, double cx, double cy, double px, double py) const { + return (cx - px) * (ay - py) - (ax - px) * (cy - py) >= 0 && + (ax - px) * (by - py) - (bx - px) * (ay - py) >= 0 && + (bx - px) * (cy - py) - (cx - px) * (by - py) >= 0; +} + +// check if a diagonal between two polygon nodes is valid (lies in polygon interior) +template +bool Earcut::isValidDiagonal(Node* a, Node* b) { + return a->next->i != b->i && a->prev->i != b->i && !intersectsPolygon(a, b) && // dones't intersect other edges + ((locallyInside(a, b) && locallyInside(b, a) && middleInside(a, b) && // locally visible + (area(a->prev, a, b->prev) != 0.0 || area(a, b->prev, b) != 0.0)) || // does not create opposite-facing sectors + (equals(a, b) && area(a->prev, a, a->next) > 0 && area(b->prev, b, b->next) > 0)); // special zero-length case +} + +// signed area of a triangle +template +double Earcut::area(const Node* p, const Node* q, const Node* r) const { + return (q->y - p->y) * (r->x - q->x) - (q->x - p->x) * (r->y - q->y); +} + +// check if two points are equal +template +bool Earcut::equals(const Node* p1, const Node* p2) { + return p1->x == p2->x && p1->y == p2->y; +} + +// check if two segments intersect +template +bool Earcut::intersects(const Node* p1, const Node* q1, const Node* p2, const Node* q2) { + int o1 = sign(area(p1, q1, p2)); + int o2 = sign(area(p1, q1, q2)); + int o3 = sign(area(p2, q2, p1)); + int o4 = sign(area(p2, q2, q1)); + + if (o1 != o2 && o3 != o4) return true; // general case + + if (o1 == 0 && onSegment(p1, p2, q1)) return true; // p1, q1 and p2 are collinear and p2 lies on p1q1 + if (o2 == 0 && onSegment(p1, q2, q1)) return true; // p1, q1 and q2 are collinear and q2 lies on p1q1 + if (o3 == 0 && onSegment(p2, p1, q2)) return true; // p2, q2 and p1 are collinear and p1 lies on p2q2 + if (o4 == 0 && onSegment(p2, q1, q2)) return true; // p2, q2 and q1 are collinear and q1 lies on p2q2 + + return false; +} + +// for collinear points p, q, r, check if point q lies on segment pr +template +bool Earcut::onSegment(const Node* p, const Node* q, const Node* r) { + return q->x <= std::max(p->x, r->x) && + q->x >= std::min(p->x, r->x) && + q->y <= std::max(p->y, r->y) && + q->y >= std::min(p->y, r->y); +} + +template +int Earcut::sign(double val) { + return (0.0 < val) - (val < 0.0); +} + +// check if a polygon diagonal intersects any polygon segments +template +bool Earcut::intersectsPolygon(const Node* a, const Node* b) { + const Node* p = a; + do { + if (p->i != a->i && p->next->i != a->i && p->i != b->i && p->next->i != b->i && + intersects(p, p->next, a, b)) return true; + p = p->next; + } while (p != a); + + return false; +} + +// check if a polygon diagonal is locally inside the polygon +template +bool Earcut::locallyInside(const Node* a, const Node* b) { + return area(a->prev, a, a->next) < 0 ? + area(a, b, a->next) >= 0 && area(a, a->prev, b) >= 0 : + area(a, b, a->prev) < 0 || area(a, a->next, b) < 0; +} + +// check if the middle Vertex of a polygon diagonal is inside the polygon +template +bool Earcut::middleInside(const Node* a, const Node* b) { + const Node* p = a; + bool inside = false; + double px = (a->x + b->x) / 2; + double py = (a->y + b->y) / 2; + do { + if (((p->y > py) != (p->next->y > py)) && p->next->y != p->y && + (px < (p->next->x - p->x) * (py - p->y) / (p->next->y - p->y) + p->x)) + inside = !inside; + p = p->next; + } while (p != a); + + return inside; +} + +// link two polygon vertices with a bridge; if the vertices belong to the same ring, it splits +// polygon into two; if one belongs to the outer ring and another to a hole, it merges it into a +// single ring +template +typename Earcut::Node* +Earcut::splitPolygon(Node* a, Node* b) { + Node* a2 = nodes.construct(a->i, a->x, a->y); + Node* b2 = nodes.construct(b->i, b->x, b->y); + Node* an = a->next; + Node* bp = b->prev; + + a->next = b; + b->prev = a; + + a2->next = an; + an->prev = a2; + + b2->next = a2; + a2->prev = b2; + + bp->next = b2; + b2->prev = bp; + + return b2; +} + +// create a node and util::optionally link it with previous one (in a circular doubly linked list) +template template +typename Earcut::Node* +Earcut::insertNode(std::size_t i, const Point& pt, Node* last) { + Node* p = nodes.construct(static_cast(i), util::nth<0, Point>::get(pt), util::nth<1, Point>::get(pt)); + + if (!last) { + p->prev = p; + p->next = p; + + } else { + assert(last); + p->next = last->next; + p->prev = last; + last->next->prev = p; + last->next = p; + } + return p; +} + +template +void Earcut::removeNode(Node* p) { + p->next->prev = p->prev; + p->prev->next = p->next; + + if (p->prevZ) p->prevZ->nextZ = p->nextZ; + if (p->nextZ) p->nextZ->prevZ = p->prevZ; +} +} + +template +std::vector earcut(const Polygon& poly) { + qt_mapbox::detail::Earcut earcut; + earcut(poly); + return std::move(earcut.indices); +} +} + +#endif //EARCUT_HPP diff --git a/src/3rdparty/earcut/qt_attribution.json b/src/3rdparty/earcut/qt_attribution.json new file mode 100644 index 0000000..0e52989 --- /dev/null +++ b/src/3rdparty/earcut/qt_attribution.json @@ -0,0 +1,13 @@ +{ + "Id": "earcut", + "Name": "Earcut Polygon Triangulation Library", + "QDocModule": "qtlocation", + "QtUsage": "Used in the QML plugin of Qt Location.", + + "Description": "A C++ port of earcut.js, a fast, header-only polygon triangulation library.", + "Homepage": "https://github.com/mapbox/earcut.hpp", + "LicenseId": "ISC", + "License": "ISC License", + "LicenseFile": "LICENSE", + "Copyright": "Copyright (c) 2015 Mapbox" +} diff --git a/src/3rdparty/geosimplify.js/LICENSE b/src/3rdparty/geosimplify.js/LICENSE new file mode 100644 index 0000000..bd04cc2 --- /dev/null +++ b/src/3rdparty/geosimplify.js/LICENSE @@ -0,0 +1,27 @@ +Qt port of geosimplify.js, https://github.com/mapbox/geosimplify-js + +Copyright (c) 2017, Daniel Patterson +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are +permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this list of + conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, this list + of conditions and the following disclaimer in the documentation and/or other materials + provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR +TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +--------------------------------- +Based on simplify-js by Vladimir Agafonkin - http://mourner.github.io/simplify-js/ diff --git a/src/3rdparty/geosimplify.js/qt_attribution.json b/src/3rdparty/geosimplify.js/qt_attribution.json new file mode 100644 index 0000000..bc8046e --- /dev/null +++ b/src/3rdparty/geosimplify.js/qt_attribution.json @@ -0,0 +1,13 @@ +{ + "Id": "geosimplify-js", + "Name": "geosimplify-js polyline simplification library", + "QDocModule": "qtlocation", + "QtUsage": "Used in the QML plugin of Qt Location.", + + "Description": "Based on https://github.com/mourner/simplify-js, geosimplify-js fixes the problem that the simple pythagorean measure used in simplify-js changes size if you simply give it longitude/latitude sequences to simplify.", + "Homepage": "https://github.com/mapbox/geosimplify-js", + "LicenseId": "geosimplify-js", + "License": "geosimplify-js License", + "LicenseFile": "LICENSE", + "Copyright": "Copyright (c) 2017 Daniel Patterson" +} diff --git a/src/3rdparty/mapbox-gl-native/LICENSE.md b/src/3rdparty/mapbox-gl-native/LICENSE.md new file mode 100644 index 0000000..d12e00b --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/LICENSE.md @@ -0,0 +1,944 @@ +mapbox-gl-native copyright (c) 2014-2017 Mapbox. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +=========================================================================== + +Mapbox GL uses portions of Android Gesture Detectors Framework. + +Copyright (c) 2012, Almer Thie + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +=========================================================================== + +Mapbox GL uses portions of Android Support Library. + +Copyright (c) 2005-2013, The Android Open Source Project + +Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +=========================================================================== + +Mapbox GL uses portions of Boost. + +Distributed under the Boost Software License, Version 1.0. + +http://www.boost.org/LICENSE_1_0.txt + +=========================================================================== + +Mapbox GL uses portions of Clipper. + +Author : Angus Johnson +Version : 6.1.3a +Date : 22 January 2014 +Website : http://www.angusj.com +Copyright : Angus Johnson 2010-2014 + +License: +Use, modification & distribution is subject to Boost Software License Ver 1. +http://www.boost.org/LICENSE_1_0.txt + +Attributions: +The code in this library is an extension of Bala Vatti's clipping algorithm: +"A generic solution to polygon clipping" +Communications of the ACM, Vol 35, Issue 7 (July 1992) pp 56-63. +http://portal.acm.org/citation.cfm?id=129906 + +Computer graphics and geometric modeling: implementation and algorithms +By Max K. Agoston +Springer; 1 edition (January 4, 2005) +http://books.google.com/books?q=vatti+clipping+agoston + +See also: +"Polygon Offsetting by Computing Winding Numbers" +Paper no. DETC2005-85513 pp. 565-575 +ASME 2005 International Design Engineering Technical Conferences +and Computers and Information in Engineering Conference (IDETC/CIE2005) +September 24-28, 2005 , Long Beach, California, USA +http://www.me.berkeley.edu/~mcmains/pubs/DAC05OffsetPolygon.pdf + +=========================================================================== + +Mapbox GL uses portions of BugshotKit. + +The MIT License (MIT) + +Copyright (c) 2014 marcoarment + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +=========================================================================== + +Mapbox GL uses portions of CSS Color Parser. + +(c) Dean McNamee , 2012. +C++ port by Konstantin Käfer , 2014. + +https://github.com/deanm/css-color-parser-js +https://github.com/kkaefer/css-color-parser-cpp + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. + +=========================================================================== + +Mapbox GL uses portions of GLFW. + +Copyright (c) 2002-2006 Marcus Geelnard +Copyright (c) 2006-2010 Camilla Berglund + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would + be appreciated but is not required. + +2. Altered source versions must be plainly marked as such, and must not + be misrepresented as being the original software. + +3. This notice may not be removed or altered from any source + distribution. + +=========================================================================== + +Mapbox GL uses portions of libc++. + +The libc++ library is dual licensed under both the University of Illinois +"BSD-Like" license and the MIT license. As a user of this code you may choose +to use it under either license. As a contributor, you agree to allow your code +to be used under both. + +Full text of the relevant licenses is included below. + +==== + +University of Illinois/NCSA +Open Source License + +Copyright (c) 2009-2015 by the contributors listed in CREDITS.TXT + +All rights reserved. + +Developed by: + + LLVM Team + + University of Illinois at Urbana-Champaign + + http://llvm.org + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal with +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +* Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimers. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimers in the + documentation and/or other materials provided with the distribution. + +* Neither the names of the LLVM Team, University of Illinois at + Urbana-Champaign, nor the names of its contributors may be used to + endorse or promote products derived from this Software without specific + prior written permission. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE +SOFTWARE. + +==== + +Copyright (c) 2009-2014 by the contributors listed in CREDITS.TXT + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +=========================================================================== + +Mapbox GL uses portions of libcurl. + +COPYRIGHT AND PERMISSION NOTICE + +Copyright (c) 1996 - 2015, Daniel Stenberg, . + +All rights reserved. + +Permission to use, copy, modify, and distribute this software for any purpose +with or without fee is hereby granted, provided that the above copyright +notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. IN +NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE +OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of a copyright holder shall not +be used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization of the copyright holder. + +=========================================================================== + +Mapbox GL uses portions of libjpeg-turbo. + +This software is based in part on the work of the Independent JPEG Group. + +Copyright (C)2009-2015 D. R. Commander. All Rights Reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +- Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. +- Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. +- Neither the name of the libjpeg-turbo Project nor the names of its + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS", +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +TurboJPEG/LJT: this implements the TurboJPEG API using libjpeg or libjpeg-turbo + +=========================================================================== + +Mapbox GL uses portions of libpng. + +This copy of the libpng notices is provided for your convenience. In case of +any discrepancy between this copy and the notices in the file png.h that is +included in the libpng distribution, the latter shall prevail. + +COPYRIGHT NOTICE, DISCLAIMER, and LICENSE: + +If you modify libpng you may insert additional notices immediately following +this sentence. + +This code is released under the libpng license. + +libpng versions 1.0.7, July 1, 2000, through 1.6.18, July 23, 2015, are +Copyright (c) 2000-2002, 2004, 2006-2015 Glenn Randers-Pehrson, and are +distributed according to the same disclaimer and license as libpng-1.0.6 +with the following individuals added to the list of Contributing Authors: + + Simon-Pierre Cadieux + Eric S. Raymond + Mans Rullgard + Cosmin Truta + Gilles Vollant + James Yu + +and with the following additions to the disclaimer: + + There is no warranty against interference with your enjoyment of the + library or against infringement. There is no warranty that our + efforts or the library will fulfill any of your particular purposes + or needs. This library is provided with all faults, and the entire + risk of satisfactory quality, performance, accuracy, and effort is with + the user. + +libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are +Copyright (c) 1998-2000 Glenn Randers-Pehrson, and are distributed according +to the same disclaimer and license as libpng-0.96, with the following +individuals added to the list of Contributing Authors: + + Tom Lane + Glenn Randers-Pehrson + Willem van Schaik + +libpng versions 0.89, June 1996, through 0.96, May 1997, are +Copyright (c) 1996-1997 Andreas Dilger, and are +distributed according to the same disclaimer and license as libpng-0.88, +with the following individuals added to the list of Contributing Authors: + + John Bowler + Kevin Bracey + Sam Bushell + Magnus Holmgren + Greg Roelofs + Tom Tanner + +libpng versions 0.5, May 1995, through 0.88, January 1996, are +Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc. + +For the purposes of this copyright and license, "Contributing Authors" +is defined as the following set of individuals: + + Andreas Dilger + Dave Martindale + Guy Eric Schalnat + Paul Schmidt + Tim Wegner + +The PNG Reference Library is supplied "AS IS". The Contributing Authors +and Group 42, Inc. disclaim all warranties, expressed or implied, +including, without limitation, the warranties of merchantability and of +fitness for any purpose. The Contributing Authors and Group 42, Inc. +assume no liability for direct, indirect, incidental, special, exemplary, +or consequential damages, which may result from the use of the PNG +Reference Library, even if advised of the possibility of such damage. + +Permission is hereby granted to use, copy, modify, and distribute this +source code, or portions hereof, for any purpose, without fee, subject +to the following restrictions: + +1. The origin of this source code must not be misrepresented. + +2. Altered versions must be plainly marked as such and must not + be misrepresented as being the original source. + +3. This Copyright notice may not be removed or altered from any + source or altered source distribution. + +The Contributing Authors and Group 42, Inc. specifically permit, without +fee, and encourage the use of this source code as a component to +supporting the PNG file format in commercial products. If you use this +source code in a product, acknowledgment is not required but would be +appreciated. + +=========================================================================== + +Mapbox GL uses portions of libuv. + +libuv is part of the Node project: http://nodejs.org/ +libuv may be distributed alone under Node's license: + +==== + +Copyright Joyent, Inc. and other Node contributors. All rights reserved. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. + +==== + +This license applies to all parts of libuv that are not externally +maintained libraries. + +The externally maintained libraries used by libuv are: + +- tree.h (from FreeBSD), copyright Niels Provos. Two clause BSD license. + +- inet_pton and inet_ntop implementations, contained in src/inet.c, are + copyright the Internet Systems Consortium, Inc., and licensed under the ISC + license. + +- stdint-msvc2008.h (from msinttypes), copyright Alexander Chemeris. Three + clause BSD license. + +- pthread-fixes.h, pthread-fixes.c, copyright Google Inc. and Sony Mobile + Communications AB. Three clause BSD license. + +- android-ifaddrs.h, android-ifaddrs.c, copyright Berkeley Software Design + Inc, Kenneth MacKay and Emergya (Cloud4all, FP7/2007-2013, grant agreement + n° 289016). Three clause BSD license. + +=========================================================================== + +Mapbox GL uses portions of libzip. + +Copyright (C) 1999-2014 Dieter Baron and Thomas Klausner + +The authors can be contacted at + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +=========================================================================== + +Mapbox GL uses portions of LOST. + +Copyright (c) 2014 Mapzen + +Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +=========================================================================== + +Mapbox GL uses portions of the Mapbox iOS SDK, which was derived from the +Route-Me open source project, including the Alpstein fork of it. + +The Route-Me license appears below. + +Copyright (c) 2008-2013, Route-Me Contributors +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation +and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +=========================================================================== + +Mapbox GL uses portions of nunicode. + +Copyright (c) 2013 Aleksey Tulinov + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +=========================================================================== + +Mapbox GL uses portions of OkHTTP. + +Copyright 2014 Square, Inc. + +Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +=========================================================================== + +Mapbox GL uses portions of OpenSSL. + +LICENSE ISSUES +============== + +The OpenSSL toolkit stays under a dual license, i.e. both the conditions of +the OpenSSL License and the original SSLeay license apply to the toolkit. +See below for the actual license texts. Actually both licenses are BSD-style +Open Source licenses. In case of any license issues related to OpenSSL +please contact openssl-core@openssl.org. + +OpenSSL License +--------------- + +Copyright (c) 1998-2011 The OpenSSL Project. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +3. All advertising materials mentioning features or use of this + software must display the following acknowledgment: + "This product includes software developed by the OpenSSL Project + for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + +4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + endorse or promote products derived from this software without + prior written permission. For written permission, please contact + openssl-core@openssl.org. + +5. Products derived from this software may not be called "OpenSSL" + nor may "OpenSSL" appear in their names without prior written + permission of the OpenSSL Project. + +6. Redistributions of any form whatsoever must retain the following + acknowledgment: + "This product includes software developed by the OpenSSL Project + for use in the OpenSSL Toolkit (http://www.openssl.org/)" + +THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY +EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR +ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. + +This product includes cryptographic software written by Eric Young +(eay@cryptsoft.com). This product includes software written by Tim +Hudson (tjh@cryptsoft.com). + +Original SSLeay License +----------------------- + +Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) +All rights reserved. + +This package is an SSL implementation written +by Eric Young (eay@cryptsoft.com). +The implementation was written so as to conform with Netscapes SSL. + +This library is free for commercial and non-commercial use as long as +The following conditions are aheared to. The following conditions +apply to all code found in this distribution, be it the RC4, RSA, +lhash, DES, etc., code; not just the SSL code. The SSL documentation +included with this distribution is covered by the same copyright terms +except that the holder is Tim Hudson (tjh@cryptsoft.com). + +Copyright remains Eric Young's, and as such any Copyright notices in +the code are not to be removed. +If this package is used in a product, Eric Young should be given attribution +as the author of the parts of the library used. +This can be in the form of a textual message at program startup or +in documentation (online or textual) provided with the package. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +3. All advertising materials mentioning features or use of this software + must display the following acknowledgement: + "This product includes cryptographic software written by + Eric Young (eay@cryptsoft.com)" + The word 'cryptographic' can be left out if the rouines from the library + being used are not cryptographic related :-). +4. If you include any Windows specific code (or a derivative thereof) from + the apps directory (application code) you must include an acknowledgement: + "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + +THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. + +The licence and distribution terms for any publically available version or +derivative of this code cannot be changed. i.e. this code cannot simply be +copied and put under another distribution licence +[including the GNU Public Licence.] + +=========================================================================== + +Mapbox GL uses portions of RapidJSON. + +Tencent is pleased to support the open source community by making RapidJSON +available. + +Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights +reserved. + +If you have downloaded a copy of the RapidJSON binary from Tencent, please note +that the RapidJSON binary is licensed under the MIT License. If you have +downloaded a copy of the RapidJSON source code from Tencent, please note that +RapidJSON source code is licensed under the MIT License, except for the third- +party components listed below which are subject to different license terms. +Your integration of RapidJSON into your own projects may require compliance with +the MIT License, as well as the other licenses applicable to the third-party +components included within RapidJSON. To avoid the problematic JSON license in +your own projects, it's sufficient to exclude the bin/jsonchecker/ directory, as +it's the only code under the JSON license. A copy of the MIT License is included +in this file. + +Other dependencies and licenses: + +Open Source Software Licensed Under the BSD License: +-------------------------------------------------------------------- + +The msinttypes r29 +Copyright (c) 2006-2013 Alexander Chemeris +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. +* Neither the name of copyright holder nor the names of its contributors may be + used to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Open Source Software Licensed Under the JSON License: +-------------------------------------------------------------------- + +json.org +Copyright (c) 2002 JSON.org +All Rights Reserved. + +JSON_checker +Copyright (c) 2002 JSON.org +All Rights Reserved. + +Terms of the JSON License: +--------------------------------------------------- + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +The Software shall be used for Good, not Evil. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Terms of the MIT License: +-------------------------------------------------------------------- + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +=========================================================================== + +Mapbox GL uses portions of Reachability. + +Copyright (c) 2011, Tony Million. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation +and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +=========================================================================== + +Mapbox GL uses portions of SQLite. + +2001 September 15 + +The author disclaims copyright to this source code. In place of +a legal notice, here is a blessing: + + May you do good and not evil. + May you find forgiveness for yourself and forgive others. + May you share freely, never taking more than you give. + +=========================================================================== + +Mapbox GL uses portions of SVPulsingAnnotationView. + +Copyright (c) 2013, Sam Vermette + +Permission to use, copy, modify, and/or distribute this software for any purpose +with or without fee is hereby granted, provided that the above copyright notice +and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. + +=========================================================================== + +Mapbox GL uses portions of zlib. + +Acknowledgments: + +The deflate format used by zlib was defined by Phil Katz. The deflate and +zlib specifications were written by L. Peter Deutsch. Thanks to all the +people who reported problems and suggested various improvements in zlib; they +are too numerous to cite here. + +Copyright notice: + +(C) 1995-2013 Jean-loup Gailly and Mark Adler + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. + + Jean-loup Gailly Mark Adler + jloup@gzip.org madler@alumni.caltech.edu + +=========================================================================== + +Mapbox GL uses portions of Realm Objective-C. + +Copyright 2015 Realm Inc. + +Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/src/3rdparty/mapbox-gl-native/LICENSE_Boost.txt b/src/3rdparty/mapbox-gl-native/LICENSE_Boost.txt new file mode 100644 index 0000000..36b7cd9 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/LICENSE_Boost.txt @@ -0,0 +1,23 @@ +Boost Software License - Version 1.0 - August 17th, 2003 + +Permission is hereby granted, free of charge, to any person or organization +obtaining a copy of the software and accompanying documentation covered by +this license (the "Software") to use, reproduce, display, distribute, +execute, and transmit the Software, and to prepare derivative works of the +Software, and to permit third-parties to whom the Software is furnished to +do so, all subject to the following: + +The copyright notices in the Software and this entire statement, including +the above license grant, this restriction and the following disclaimer, +must be included in all copies of the Software, in whole or in part, and +all derivative works of the Software, unless such copies or derivative +works are solely in the form of machine-executable object code generated by +a source language processor. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/src/3rdparty/mapbox-gl-native/LICENSE_CSSColorParser.txt b/src/3rdparty/mapbox-gl-native/LICENSE_CSSColorParser.txt new file mode 100644 index 0000000..b70130d --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/LICENSE_CSSColorParser.txt @@ -0,0 +1,23 @@ +(c) Dean McNamee , 2012. +C++ port by Mapbox, Konstantin Käfer , 2014-2017. + +https://github.com/deanm/css-color-parser-js +https://github.com/kkaefer/css-color-parser-cpp + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. diff --git a/src/3rdparty/mapbox-gl-native/LICENSE_geojson.txt b/src/3rdparty/mapbox-gl-native/LICENSE_geojson.txt new file mode 100644 index 0000000..8f6a86b --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/LICENSE_geojson.txt @@ -0,0 +1,13 @@ +Copyright (c) 2016, Mapbox + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. \ No newline at end of file diff --git a/src/3rdparty/mapbox-gl-native/LICENSE_geojson_vt_cpp.txt b/src/3rdparty/mapbox-gl-native/LICENSE_geojson_vt_cpp.txt new file mode 100644 index 0000000..8bafb57 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/LICENSE_geojson_vt_cpp.txt @@ -0,0 +1,15 @@ +ISC License + +Copyright (c) 2015, Mapbox + +Permission to use, copy, modify, and/or distribute this software for any purpose +with or without fee is hereby granted, provided that the above copyright notice +and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. diff --git a/src/3rdparty/mapbox-gl-native/LICENSE_geometry.txt b/src/3rdparty/mapbox-gl-native/LICENSE_geometry.txt new file mode 100644 index 0000000..14101c2 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/LICENSE_geometry.txt @@ -0,0 +1,13 @@ +Copyright (c) 2016, Mapbox + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/src/3rdparty/mapbox-gl-native/LICENSE_mapbox.txt b/src/3rdparty/mapbox-gl-native/LICENSE_mapbox.txt new file mode 100644 index 0000000..fa0a43f --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/LICENSE_mapbox.txt @@ -0,0 +1,46 @@ +mapbox-gl-native copyright (c) 2014-2017 Mapbox. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + +Copyright (c) 2013 Brandon Jones, Colin MacKenzie IV + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the +use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim + that you wrote the original software. If you use this software in a + product, an acknowledgment in the product documentation would be + appreciated but is not required. + +2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + +3. This notice may not be removed or altered from any source distribution. diff --git a/src/3rdparty/mapbox-gl-native/LICENSE_parsedate.txt b/src/3rdparty/mapbox-gl-native/LICENSE_parsedate.txt new file mode 100644 index 0000000..0f733d8 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/LICENSE_parsedate.txt @@ -0,0 +1,11 @@ +COPYRIGHT AND PERMISSION NOTICE + +Copyright (C) 1998 - 2014, Daniel Stenberg, , et al. + +All rights reserved. + +Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of a copyright holder shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization of the copyright holder. diff --git a/src/3rdparty/mapbox-gl-native/LICENSE_protozero.txt b/src/3rdparty/mapbox-gl-native/LICENSE_protozero.txt new file mode 100644 index 0000000..d0b3011 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/LICENSE_protozero.txt @@ -0,0 +1,24 @@ +protozero copyright (c) Mapbox. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/src/3rdparty/mapbox-gl-native/LICENSE_rapidjson.txt b/src/3rdparty/mapbox-gl-native/LICENSE_rapidjson.txt new file mode 100644 index 0000000..c84f8fa --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/LICENSE_rapidjson.txt @@ -0,0 +1,21 @@ +Tencent is pleased to support the open source community by making RapidJSON available. + +Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. + +Licensed under the MIT License (the "License"); you may not use this file except +in compliance with the License. You may obtain a copy of the License at + +http://opensource.org/licenses/MIT + +Unless required by applicable law or agreed to in writing, software distributed +under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +CONDITIONS OF ANY KIND, either express or implied. See the License for the +specific language governing permissions and limitations under the License. + +MIT LICENSE + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/src/3rdparty/mapbox-gl-native/LICENSE_vectortile.txt b/src/3rdparty/mapbox-gl-native/LICENSE_vectortile.txt new file mode 100644 index 0000000..14101c2 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/LICENSE_vectortile.txt @@ -0,0 +1,13 @@ +Copyright (c) 2016, Mapbox + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/src/3rdparty/mapbox-gl-native/LICENSE_wagyu.txt b/src/3rdparty/mapbox-gl-native/LICENSE_wagyu.txt new file mode 100644 index 0000000..4710c53 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/LICENSE_wagyu.txt @@ -0,0 +1,37 @@ +Parts of the code in the Wagyu Library are derived from the version of the +Clipper Library by Angus Johnson listed below. + +Author : Angus Johnson +Version : 6.4.0 +Date : 2 July 2015 +Website : http://www.angusj.com + +Copyright for portions of the derived code in the Wagyu library are held +by Angus Johnson, 2010-2015. All other copyright for the Wagyu Library are held by +Mapbox, 2016. This code is published in accordance with, and retains the same license +as the Clipper Library by Angus Johnson. + +Copyright (c) 2010-2015, Angus Johnson +Copyright (c) 2016, Mapbox + +Permission is hereby granted, free of charge, to any person or organization +obtaining a copy of the software and accompanying documentation covered by +this license (the "Software") to use, reproduce, display, distribute, +execute, and transmit the Software, and to prepare derivative works of the +Software, and to permit third-parties to whom the Software is furnished to +do so, all subject to the following: + +The copyright notices in the Software and this entire statement, including +the above license grant, this restriction and the following disclaimer, +must be included in all copies of the Software, in whole or in part, and +all derivative works of the Software, unless such copies or derivative +works are solely in the form of machine-executable object code generated by +a source language processor. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/src/3rdparty/mapbox-gl-native/deps/earcut/0.12.4/LICENSE b/src/3rdparty/mapbox-gl-native/deps/earcut/0.12.4/LICENSE new file mode 100644 index 0000000..8bafb57 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/earcut/0.12.4/LICENSE @@ -0,0 +1,15 @@ +ISC License + +Copyright (c) 2015, Mapbox + +Permission to use, copy, modify, and/or distribute this software for any purpose +with or without fee is hereby granted, provided that the above copyright notice +and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. diff --git a/src/3rdparty/mapbox-gl-native/deps/earcut/0.12.4/include/mapbox/earcut.hpp b/src/3rdparty/mapbox-gl-native/deps/earcut/0.12.4/include/mapbox/earcut.hpp new file mode 100644 index 0000000..a916c1d --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/earcut/0.12.4/include/mapbox/earcut.hpp @@ -0,0 +1,772 @@ +#pragma once + +#include +#include +#include +#include +#include + +namespace mapbox { + +namespace util { + +template struct nth { + inline static typename std::tuple_element::type + get(const T& t) { return std::get(t); }; +}; + +} + +namespace detail { + +template +class Earcut { +public: + std::vector indices; + std::size_t vertices = 0; + + template + void operator()(const Polygon& points); + +private: + struct Node { + Node(N index, double x_, double y_) : i(index), x(x_), y(y_) {} + Node(const Node&) = delete; + Node& operator=(const Node&) = delete; + Node(Node&&) = delete; + Node& operator=(Node&&) = delete; + + const N i; + const double x; + const double y; + + // previous and next vertice nodes in a polygon ring + Node* prev = nullptr; + Node* next = nullptr; + + // z-order curve value + int32_t z = 0; + + // previous and next nodes in z-order + Node* prevZ = nullptr; + Node* nextZ = nullptr; + + // indicates whether this is a steiner point + bool steiner = false; + }; + + template Node* linkedList(const Ring& points, const bool clockwise); + Node* filterPoints(Node* start, Node* end = nullptr); + void earcutLinked(Node* ear, int pass = 0); + bool isEar(Node* ear); + bool isEarHashed(Node* ear); + Node* cureLocalIntersections(Node* start); + void splitEarcut(Node* start); + template Node* eliminateHoles(const Polygon& points, Node* outerNode); + void eliminateHole(Node* hole, Node* outerNode); + Node* findHoleBridge(Node* hole, Node* outerNode); + void indexCurve(Node* start); + Node* sortLinked(Node* list); + int32_t zOrder(const double x_, const double y_); + Node* getLeftmost(Node* start); + bool pointInTriangle(double ax, double ay, double bx, double by, double cx, double cy, double px, double py) const; + bool isValidDiagonal(Node* a, Node* b); + double area(const Node* p, const Node* q, const Node* r) const; + bool equals(const Node* p1, const Node* p2); + bool intersects(const Node* p1, const Node* q1, const Node* p2, const Node* q2); + bool intersectsPolygon(const Node* a, const Node* b); + bool locallyInside(const Node* a, const Node* b); + bool middleInside(const Node* a, const Node* b); + Node* splitPolygon(Node* a, Node* b); + template Node* insertNode(std::size_t i, const Point& p, Node* last); + void removeNode(Node* p); + + bool hashing; + double minX, maxX; + double minY, maxY; + double inv_size = 0; + + template > + class ObjectPool { + public: + ObjectPool() { } + ObjectPool(std::size_t blockSize_) { + reset(blockSize_); + } + ~ObjectPool() { + clear(); + } + template + T* construct(Args&&... args) { + if (currentIndex >= blockSize) { + currentBlock = alloc.allocate(blockSize); + allocations.emplace_back(currentBlock); + currentIndex = 0; + } + T* object = ¤tBlock[currentIndex++]; + alloc.construct(object, std::forward(args)...); + return object; + } + void reset(std::size_t newBlockSize) { + for (auto allocation : allocations) alloc.deallocate(allocation, blockSize); + allocations.clear(); + blockSize = std::max(1, newBlockSize); + currentBlock = nullptr; + currentIndex = blockSize; + } + void clear() { reset(blockSize); } + private: + T* currentBlock = nullptr; + std::size_t currentIndex = 1; + std::size_t blockSize = 1; + std::vector allocations; + Alloc alloc; + }; + ObjectPool nodes; +}; + +template template +void Earcut::operator()(const Polygon& points) { + // reset + indices.clear(); + vertices = 0; + + if (points.empty()) return; + + double x; + double y; + int threshold = 80; + std::size_t len = 0; + + for (size_t i = 0; threshold >= 0 && i < points.size(); i++) { + threshold -= static_cast(points[i].size()); + len += points[i].size(); + } + + //estimate size of nodes and indices + nodes.reset(len * 3 / 2); + indices.reserve(len + points[0].size()); + + Node* outerNode = linkedList(points[0], true); + if (!outerNode) return; + + if (points.size() > 1) outerNode = eliminateHoles(points, outerNode); + + // if the shape is not too simple, we'll use z-order curve hash later; calculate polygon bbox + hashing = threshold < 0; + if (hashing) { + Node* p = outerNode->next; + minX = maxX = p->x; + minY = maxY = p->y; + do { + x = p->x; + y = p->y; + minX = std::min(minX, x); + minY = std::min(minY, y); + maxX = std::max(maxX, x); + maxY = std::max(maxY, y); + p = p->next; + } while (p != outerNode); + + // minX, minY and size are later used to transform coords into integers for z-order calculation + inv_size = std::max(maxX - minX, maxY - minY); + inv_size = inv_size != .0 ? (1. / inv_size) : .0; + } + + earcutLinked(outerNode); + + nodes.clear(); +} + +// create a circular doubly linked list from polygon points in the specified winding order +template template +typename Earcut::Node* +Earcut::linkedList(const Ring& points, const bool clockwise) { + using Point = typename Ring::value_type; + double sum = 0; + const std::size_t len = points.size(); + std::size_t i, j; + Node* last = nullptr; + + // calculate original winding order of a polygon ring + for (i = 0, j = len > 0 ? len - 1 : 0; i < len; j = i++) { + const auto& p1 = points[i]; + const auto& p2 = points[j]; + const double p20 = util::nth<0, Point>::get(p2); + const double p10 = util::nth<0, Point>::get(p1); + const double p11 = util::nth<1, Point>::get(p1); + const double p21 = util::nth<1, Point>::get(p2); + sum += (p20 - p10) * (p11 + p21); + } + + // link points into circular doubly-linked list in the specified winding order + if (clockwise == (sum > 0)) { + for (i = 0; i < len; i++) last = insertNode(vertices + i, points[i], last); + } else { + for (i = len; i-- > 0;) last = insertNode(vertices + i, points[i], last); + } + + if (last && equals(last, last->next)) { + removeNode(last); + last = last->next; + } + + vertices += len; + + return last; +} + +// eliminate colinear or duplicate points +template +typename Earcut::Node* +Earcut::filterPoints(Node* start, Node* end) { + if (!end) end = start; + + Node* p = start; + bool again; + do { + again = false; + + if (!p->steiner && (equals(p, p->next) || area(p->prev, p, p->next) == 0)) { + removeNode(p); + p = end = p->prev; + + if (p == p->next) break; + again = true; + + } else { + p = p->next; + } + } while (again || p != end); + + return end; +} + +// main ear slicing loop which triangulates a polygon (given as a linked list) +template +void Earcut::earcutLinked(Node* ear, int pass) { + if (!ear) return; + + // interlink polygon nodes in z-order + if (!pass && hashing) indexCurve(ear); + + Node* stop = ear; + Node* prev; + Node* next; + + int iterations = 0; + + // iterate through ears, slicing them one by one + while (ear->prev != ear->next) { + iterations++; + prev = ear->prev; + next = ear->next; + + if (hashing ? isEarHashed(ear) : isEar(ear)) { + // cut off the triangle + indices.emplace_back(prev->i); + indices.emplace_back(ear->i); + indices.emplace_back(next->i); + + removeNode(ear); + + // skipping the next vertice leads to less sliver triangles + ear = next->next; + stop = next->next; + + continue; + } + + ear = next; + + // if we looped through the whole remaining polygon and can't find any more ears + if (ear == stop) { + // try filtering points and slicing again + if (!pass) earcutLinked(filterPoints(ear), 1); + + // if this didn't work, try curing all small self-intersections locally + else if (pass == 1) { + ear = cureLocalIntersections(ear); + earcutLinked(ear, 2); + + // as a last resort, try splitting the remaining polygon into two + } else if (pass == 2) splitEarcut(ear); + + break; + } + } +} + +// check whether a polygon node forms a valid ear with adjacent nodes +template +bool Earcut::isEar(Node* ear) { + const Node* a = ear->prev; + const Node* b = ear; + const Node* c = ear->next; + + if (area(a, b, c) >= 0) return false; // reflex, can't be an ear + + // now make sure we don't have other points inside the potential ear + Node* p = ear->next->next; + + while (p != ear->prev) { + if (pointInTriangle(a->x, a->y, b->x, b->y, c->x, c->y, p->x, p->y) && + area(p->prev, p, p->next) >= 0) return false; + p = p->next; + } + + return true; +} + +template +bool Earcut::isEarHashed(Node* ear) { + const Node* a = ear->prev; + const Node* b = ear; + const Node* c = ear->next; + + if (area(a, b, c) >= 0) return false; // reflex, can't be an ear + + // triangle bbox; min & max are calculated like this for speed + const double minTX = std::min(a->x, std::min(b->x, c->x)); + const double minTY = std::min(a->y, std::min(b->y, c->y)); + const double maxTX = std::max(a->x, std::max(b->x, c->x)); + const double maxTY = std::max(a->y, std::max(b->y, c->y)); + + // z-order range for the current triangle bbox; + const int32_t minZ = zOrder(minTX, minTY); + const int32_t maxZ = zOrder(maxTX, maxTY); + + // first look for points inside the triangle in increasing z-order + Node* p = ear->nextZ; + + while (p && p->z <= maxZ) { + if (p != ear->prev && p != ear->next && + pointInTriangle(a->x, a->y, b->x, b->y, c->x, c->y, p->x, p->y) && + area(p->prev, p, p->next) >= 0) return false; + p = p->nextZ; + } + + // then look for points in decreasing z-order + p = ear->prevZ; + + while (p && p->z >= minZ) { + if (p != ear->prev && p != ear->next && + pointInTriangle(a->x, a->y, b->x, b->y, c->x, c->y, p->x, p->y) && + area(p->prev, p, p->next) >= 0) return false; + p = p->prevZ; + } + + return true; +} + +// go through all polygon nodes and cure small local self-intersections +template +typename Earcut::Node* +Earcut::cureLocalIntersections(Node* start) { + Node* p = start; + do { + Node* a = p->prev; + Node* b = p->next->next; + + // a self-intersection where edge (v[i-1],v[i]) intersects (v[i+1],v[i+2]) + if (!equals(a, b) && intersects(a, p, p->next, b) && locallyInside(a, b) && locallyInside(b, a)) { + indices.emplace_back(a->i); + indices.emplace_back(p->i); + indices.emplace_back(b->i); + + // remove two nodes involved + removeNode(p); + removeNode(p->next); + + p = start = b; + } + p = p->next; + } while (p != start); + + return p; +} + +// try splitting polygon into two and triangulate them independently +template +void Earcut::splitEarcut(Node* start) { + // look for a valid diagonal that divides the polygon into two + Node* a = start; + do { + Node* b = a->next->next; + while (b != a->prev) { + if (a->i != b->i && isValidDiagonal(a, b)) { + // split the polygon in two by the diagonal + Node* c = splitPolygon(a, b); + + // filter colinear points around the cuts + a = filterPoints(a, a->next); + c = filterPoints(c, c->next); + + // run earcut on each half + earcutLinked(a); + earcutLinked(c); + return; + } + b = b->next; + } + a = a->next; + } while (a != start); +} + +// link every hole into the outer loop, producing a single-ring polygon without holes +template template +typename Earcut::Node* +Earcut::eliminateHoles(const Polygon& points, Node* outerNode) { + const size_t len = points.size(); + + std::vector queue; + for (size_t i = 1; i < len; i++) { + Node* list = linkedList(points[i], false); + if (list) { + if (list == list->next) list->steiner = true; + queue.push_back(getLeftmost(list)); + } + } + std::sort(queue.begin(), queue.end(), [](const Node* a, const Node* b) { + return a->x < b->x; + }); + + // process holes from left to right + for (size_t i = 0; i < queue.size(); i++) { + eliminateHole(queue[i], outerNode); + outerNode = filterPoints(outerNode, outerNode->next); + } + + return outerNode; +} + +// find a bridge between vertices that connects hole with an outer ring and and link it +template +void Earcut::eliminateHole(Node* hole, Node* outerNode) { + outerNode = findHoleBridge(hole, outerNode); + if (outerNode) { + Node* b = splitPolygon(outerNode, hole); + filterPoints(b, b->next); + } +} + +// David Eberly's algorithm for finding a bridge between hole and outer polygon +template +typename Earcut::Node* +Earcut::findHoleBridge(Node* hole, Node* outerNode) { + Node* p = outerNode; + double hx = hole->x; + double hy = hole->y; + double qx = -std::numeric_limits::infinity(); + Node* m = nullptr; + + // find a segment intersected by a ray from the hole's leftmost Vertex to the left; + // segment's endpoint with lesser x will be potential connection Vertex + do { + if (hy <= p->y && hy >= p->next->y && p->next->y != p->y) { + double x = p->x + (hy - p->y) * (p->next->x - p->x) / (p->next->y - p->y); + if (x <= hx && x > qx) { + qx = x; + if (x == hx) { + if (hy == p->y) return p; + if (hy == p->next->y) return p->next; + } + m = p->x < p->next->x ? p : p->next; + } + } + p = p->next; + } while (p != outerNode); + + if (!m) return 0; + + if (hx == qx) return m->prev; + + // look for points inside the triangle of hole Vertex, segment intersection and endpoint; + // if there are no points found, we have a valid connection; + // otherwise choose the Vertex of the minimum angle with the ray as connection Vertex + + const Node* stop = m; + double tanMin = std::numeric_limits::infinity(); + double tanCur = 0; + + p = m->next; + double mx = m->x; + double my = m->y; + + while (p != stop) { + if (hx >= p->x && p->x >= mx && hx != p->x && + pointInTriangle(hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p->x, p->y)) { + + tanCur = std::abs(hy - p->y) / (hx - p->x); // tangential + + if ((tanCur < tanMin || (tanCur == tanMin && p->x > m->x)) && locallyInside(p, hole)) { + m = p; + tanMin = tanCur; + } + } + + p = p->next; + } + + return m; +} + +// interlink polygon nodes in z-order +template +void Earcut::indexCurve(Node* start) { + assert(start); + Node* p = start; + + do { + p->z = p->z ? p->z : zOrder(p->x, p->y); + p->prevZ = p->prev; + p->nextZ = p->next; + p = p->next; + } while (p != start); + + p->prevZ->nextZ = nullptr; + p->prevZ = nullptr; + + sortLinked(p); +} + +// Simon Tatham's linked list merge sort algorithm +// http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html +template +typename Earcut::Node* +Earcut::sortLinked(Node* list) { + assert(list); + Node* p; + Node* q; + Node* e; + Node* tail; + int i, numMerges, pSize, qSize; + int inSize = 1; + + for (;;) { + p = list; + list = nullptr; + tail = nullptr; + numMerges = 0; + + while (p) { + numMerges++; + q = p; + pSize = 0; + for (i = 0; i < inSize; i++) { + pSize++; + q = q->nextZ; + if (!q) break; + } + + qSize = inSize; + + while (pSize > 0 || (qSize > 0 && q)) { + + if (pSize == 0) { + e = q; + q = q->nextZ; + qSize--; + } else if (qSize == 0 || !q) { + e = p; + p = p->nextZ; + pSize--; + } else if (p->z <= q->z) { + e = p; + p = p->nextZ; + pSize--; + } else { + e = q; + q = q->nextZ; + qSize--; + } + + if (tail) tail->nextZ = e; + else list = e; + + e->prevZ = tail; + tail = e; + } + + p = q; + } + + tail->nextZ = nullptr; + + if (numMerges <= 1) return list; + + inSize *= 2; + } +} + +// z-order of a Vertex given coords and size of the data bounding box +template +int32_t Earcut::zOrder(const double x_, const double y_) { + // coords are transformed into non-negative 15-bit integer range + int32_t x = static_cast(32767.0 * (x_ - minX) * inv_size); + int32_t y = static_cast(32767.0 * (y_ - minY) * inv_size); + + x = (x | (x << 8)) & 0x00FF00FF; + x = (x | (x << 4)) & 0x0F0F0F0F; + x = (x | (x << 2)) & 0x33333333; + x = (x | (x << 1)) & 0x55555555; + + y = (y | (y << 8)) & 0x00FF00FF; + y = (y | (y << 4)) & 0x0F0F0F0F; + y = (y | (y << 2)) & 0x33333333; + y = (y | (y << 1)) & 0x55555555; + + return x | (y << 1); +} + +// find the leftmost node of a polygon ring +template +typename Earcut::Node* +Earcut::getLeftmost(Node* start) { + Node* p = start; + Node* leftmost = start; + do { + if (p->x < leftmost->x) leftmost = p; + p = p->next; + } while (p != start); + + return leftmost; +} + +// check if a point lies within a convex triangle +template +bool Earcut::pointInTriangle(double ax, double ay, double bx, double by, double cx, double cy, double px, double py) const { + return (cx - px) * (ay - py) - (ax - px) * (cy - py) >= 0 && + (ax - px) * (by - py) - (bx - px) * (ay - py) >= 0 && + (bx - px) * (cy - py) - (cx - px) * (by - py) >= 0; +} + +// check if a diagonal between two polygon nodes is valid (lies in polygon interior) +template +bool Earcut::isValidDiagonal(Node* a, Node* b) { + return a->next->i != b->i && a->prev->i != b->i && !intersectsPolygon(a, b) && + locallyInside(a, b) && locallyInside(b, a) && middleInside(a, b); +} + +// signed area of a triangle +template +double Earcut::area(const Node* p, const Node* q, const Node* r) const { + return (q->y - p->y) * (r->x - q->x) - (q->x - p->x) * (r->y - q->y); +} + +// check if two points are equal +template +bool Earcut::equals(const Node* p1, const Node* p2) { + return p1->x == p2->x && p1->y == p2->y; +} + +// check if two segments intersect +template +bool Earcut::intersects(const Node* p1, const Node* q1, const Node* p2, const Node* q2) { + if ((equals(p1, q1) && equals(p2, q2)) || + (equals(p1, q2) && equals(p2, q1))) return true; + return (area(p1, q1, p2) > 0) != (area(p1, q1, q2) > 0) && + (area(p2, q2, p1) > 0) != (area(p2, q2, q1) > 0); +} + +// check if a polygon diagonal intersects any polygon segments +template +bool Earcut::intersectsPolygon(const Node* a, const Node* b) { + const Node* p = a; + do { + if (p->i != a->i && p->next->i != a->i && p->i != b->i && p->next->i != b->i && + intersects(p, p->next, a, b)) return true; + p = p->next; + } while (p != a); + + return false; +} + +// check if a polygon diagonal is locally inside the polygon +template +bool Earcut::locallyInside(const Node* a, const Node* b) { + return area(a->prev, a, a->next) < 0 ? + area(a, b, a->next) >= 0 && area(a, a->prev, b) >= 0 : + area(a, b, a->prev) < 0 || area(a, a->next, b) < 0; +} + +// check if the middle Vertex of a polygon diagonal is inside the polygon +template +bool Earcut::middleInside(const Node* a, const Node* b) { + const Node* p = a; + bool inside = false; + double px = (a->x + b->x) / 2; + double py = (a->y + b->y) / 2; + do { + if (((p->y > py) != (p->next->y > py)) && p->next->y != p->y && + (px < (p->next->x - p->x) * (py - p->y) / (p->next->y - p->y) + p->x)) + inside = !inside; + p = p->next; + } while (p != a); + + return inside; +} + +// link two polygon vertices with a bridge; if the vertices belong to the same ring, it splits +// polygon into two; if one belongs to the outer ring and another to a hole, it merges it into a +// single ring +template +typename Earcut::Node* +Earcut::splitPolygon(Node* a, Node* b) { + Node* a2 = nodes.construct(a->i, a->x, a->y); + Node* b2 = nodes.construct(b->i, b->x, b->y); + Node* an = a->next; + Node* bp = b->prev; + + a->next = b; + b->prev = a; + + a2->next = an; + an->prev = a2; + + b2->next = a2; + a2->prev = b2; + + bp->next = b2; + b2->prev = bp; + + return b2; +} + +// create a node and util::optionally link it with previous one (in a circular doubly linked list) +template template +typename Earcut::Node* +Earcut::insertNode(std::size_t i, const Point& pt, Node* last) { + Node* p = nodes.construct(static_cast(i), util::nth<0, Point>::get(pt), util::nth<1, Point>::get(pt)); + + if (!last) { + p->prev = p; + p->next = p; + + } else { + assert(last); + p->next = last->next; + p->prev = last; + last->next->prev = p; + last->next = p; + } + return p; +} + +template +void Earcut::removeNode(Node* p) { + p->next->prev = p->prev; + p->prev->next = p->next; + + if (p->prevZ) p->prevZ->nextZ = p->nextZ; + if (p->nextZ) p->nextZ->prevZ = p->prevZ; +} +} + +template +std::vector earcut(const Polygon& poly) { + mapbox::detail::Earcut earcut; + earcut(poly); + return std::move(earcut.indices); +} +} diff --git a/src/3rdparty/mapbox-gl-native/deps/geojson/0.4.2/include/mapbox/geojson.hpp b/src/3rdparty/mapbox-gl-native/deps/geojson/0.4.2/include/mapbox/geojson.hpp new file mode 100644 index 0000000..4b62751 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/geojson/0.4.2/include/mapbox/geojson.hpp @@ -0,0 +1,42 @@ +#pragma once + +#include +#include + +namespace mapbox { +namespace geojson { + +using value = mapbox::geometry::value; +using null_value_t = mapbox::geometry::null_value_t; +using identifier = mapbox::geometry::identifier; +using point = mapbox::geometry::point; +using multi_point = mapbox::geometry::multi_point; +using line_string = mapbox::geometry::line_string; +using linear_ring = mapbox::geometry::linear_ring; +using multi_line_string = mapbox::geometry::multi_line_string; +using polygon = mapbox::geometry::polygon; +using multi_polygon = mapbox::geometry::multi_polygon; +using geometry = mapbox::geometry::geometry; +using geometry_collection = mapbox::geometry::geometry_collection; +using feature = mapbox::geometry::feature; +using feature_collection = mapbox::geometry::feature_collection; + +// Parse inputs of known types. Instantiations are provided for geometry, feature, and +// feature_collection. +template +T parse(const std::string &); + +// Parse any GeoJSON type. +using geojson = mapbox::util::variant; +geojson parse(const std::string &); + +// Stringify inputs of known types. Instantiations are provided for geometry, feature, and +// feature_collection. +template +std::string stringify(const T &); + +// Stringify any GeoJSON type. +std::string stringify(const geojson &); + +} // namespace geojson +} // namespace mapbox diff --git a/src/3rdparty/mapbox-gl-native/deps/geojson/0.4.2/include/mapbox/geojson/rapidjson.hpp b/src/3rdparty/mapbox-gl-native/deps/geojson/0.4.2/include/mapbox/geojson/rapidjson.hpp new file mode 100644 index 0000000..360eefd --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/geojson/0.4.2/include/mapbox/geojson/rapidjson.hpp @@ -0,0 +1,32 @@ +#pragma once + +#include +#include + +namespace mapbox { +namespace geojson { + +// Use the CrtAllocator, because the MemoryPoolAllocator is broken on ARM +// https://github.com/miloyip/rapidjson/issues/200, 301, 388 +using rapidjson_allocator = rapidjson::CrtAllocator; +using rapidjson_document = rapidjson::GenericDocument, rapidjson_allocator>; +using rapidjson_value = rapidjson::GenericValue, rapidjson_allocator>; + +// Convert inputs of known types. Instantiations are provided for geometry, feature, and +// feature_collection. +template +T convert(const rapidjson_value &); + +// Convert any GeoJSON type. +geojson convert(const rapidjson_value &); + +// Convert back to rapidjson value. Instantiations are provided for geometry, feature, and +// feature_collection. +template +rapidjson_value convert(const T &, rapidjson_allocator&); + +// Convert any GeoJSON type. +rapidjson_value convert(const geojson &, rapidjson_allocator&); + +} // namespace geojson +} // namespace mapbox diff --git a/src/3rdparty/mapbox-gl-native/deps/geojson/0.4.2/include/mapbox/geojson_impl.hpp b/src/3rdparty/mapbox-gl-native/deps/geojson/0.4.2/include/mapbox/geojson_impl.hpp new file mode 100644 index 0000000..48d81e4 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/geojson/0.4.2/include/mapbox/geojson_impl.hpp @@ -0,0 +1,453 @@ +#pragma once + +#include +#include + +#include +#include +#include +#include + +#include + +namespace mapbox { +namespace geojson { + +using error = std::runtime_error; +using prop_map = std::unordered_map; + +template +T convert(const rapidjson_value &json); + +template <> +point convert(const rapidjson_value &json) { + if (json.Size() < 2) + throw error("coordinates array must have at least 2 numbers"); + + return point{ json[0].GetDouble(), json[1].GetDouble() }; +} + +template +Cont convert(const rapidjson_value &json) { + Cont points; + auto size = json.Size(); + points.reserve(size); + + for (auto &element : json.GetArray()) { + points.push_back(convert(element)); + } + return points; +} + +template <> +geometry convert(const rapidjson_value &json) { + if (!json.IsObject()) + throw error("Geometry must be an object"); + + const auto &json_end = json.MemberEnd(); + + const auto &type_itr = json.FindMember("type"); + if (type_itr == json_end) + throw error("Geometry must have a type property"); + + const auto &type = type_itr->value; + + if (type == "GeometryCollection") { + const auto &geometries_itr = json.FindMember("geometries"); + if (geometries_itr == json_end) + throw error("GeometryCollection must have a geometries property"); + + const auto &json_geometries = geometries_itr->value; + + if (!json_geometries.IsArray()) + throw error("GeometryCollection geometries property must be an array"); + + return geometry{ convert(json_geometries) }; + } + + const auto &coords_itr = json.FindMember("coordinates"); + + if (coords_itr == json_end) + throw error(std::string(type.GetString()) + " geometry must have a coordinates property"); + + const auto &json_coords = coords_itr->value; + if (!json_coords.IsArray()) + throw error("coordinates property must be an array"); + + if (type == "Point") + return geometry{ convert(json_coords) }; + if (type == "MultiPoint") + return geometry{ convert(json_coords) }; + if (type == "LineString") + return geometry{ convert(json_coords) }; + if (type == "MultiLineString") + return geometry{ convert(json_coords) }; + if (type == "Polygon") + return geometry{ convert(json_coords) }; + if (type == "MultiPolygon") + return geometry{ convert(json_coords) }; + + throw error(std::string(type.GetString()) + " not yet implemented"); +} + +template <> +value convert(const rapidjson_value &json); + +template <> +prop_map convert(const rapidjson_value &json) { + if (!json.IsObject()) + throw error("properties must be an object"); + + prop_map result; + for (auto &member : json.GetObject()) { + result.emplace(std::string(member.name.GetString(), member.name.GetStringLength()), + convert(member.value)); + } + return result; +} + +template <> +value convert(const rapidjson_value &json) { + switch (json.GetType()) { + case rapidjson::kNullType: + return ::mapbox::geometry::null_value_t{}; + case rapidjson::kFalseType: + return false; + case rapidjson::kTrueType: + return true; + case rapidjson::kObjectType: + return convert(json); + case rapidjson::kArrayType: + return convert>(json); + case rapidjson::kStringType: + return std::string(json.GetString(), json.GetStringLength()); + default: + assert(json.GetType() == rapidjson::kNumberType); + if (json.IsUint64()) + return std::uint64_t(json.GetUint64()); + if (json.IsInt64()) + return std::int64_t(json.GetInt64()); + return json.GetDouble(); + } +} + +template <> +identifier convert(const rapidjson_value &json) { + switch (json.GetType()) { + case rapidjson::kStringType: + return std::string(json.GetString(), json.GetStringLength()); + case rapidjson::kNumberType: + if (json.IsUint64()) + return std::uint64_t(json.GetUint64()); + if (json.IsInt64()) + return std::int64_t(json.GetInt64()); + return json.GetDouble(); + default: + throw error("Feature id must be a string or number"); + } +} + +template <> +feature convert(const rapidjson_value &json) { + if (!json.IsObject()) + throw error("Feature must be an object"); + + auto const &json_end = json.MemberEnd(); + auto const &type_itr = json.FindMember("type"); + + if (type_itr == json_end) + throw error("Feature must have a type property"); + if (type_itr->value != "Feature") + throw error("Feature type must be Feature"); + + auto const &geom_itr = json.FindMember("geometry"); + + if (geom_itr == json_end) + throw error("Feature must have a geometry property"); + + feature result{ convert(geom_itr->value) }; + + auto const &id_itr = json.FindMember("id"); + if (id_itr != json_end) { + result.id = convert(id_itr->value); + } + + auto const &prop_itr = json.FindMember("properties"); + if (prop_itr != json_end) { + const auto &json_props = prop_itr->value; + if (!json_props.IsNull()) { + result.properties = convert(json_props); + } + } + + return result; +} + +template <> +geojson convert(const rapidjson_value &json) { + if (!json.IsObject()) + throw error("GeoJSON must be an object"); + + const auto &type_itr = json.FindMember("type"); + const auto &json_end = json.MemberEnd(); + + if (type_itr == json_end) + throw error("GeoJSON must have a type property"); + + const auto &type = type_itr->value; + + if (type == "FeatureCollection") { + const auto &features_itr = json.FindMember("features"); + if (features_itr == json_end) + throw error("FeatureCollection must have features property"); + + const auto &json_features = features_itr->value; + + if (!json_features.IsArray()) + throw error("FeatureCollection features property must be an array"); + + feature_collection collection; + + const auto &size = json_features.Size(); + collection.reserve(size); + + for (auto &feature_obj : json_features.GetArray()) { + collection.push_back(convert(feature_obj)); + } + + return geojson{ collection }; + } + + if (type == "Feature") + return geojson{ convert(json) }; + + return geojson{ convert(json) }; +} + +template +T parse(const std::string &json) { + rapidjson_document d; + d.Parse(json.c_str()); + if (d.HasParseError()) { + std::stringstream message; + message << d.GetErrorOffset() << " - " << rapidjson::GetParseError_En(d.GetParseError()); + throw error(message.str()); + } + return convert(d); +} + +template <> +geometry parse(const std::string &); +template <> +feature parse(const std::string &); +template <> +feature_collection parse(const std::string &); + +geojson parse(const std::string &json) { + return parse(json); +} + +geojson convert(const rapidjson_value &json) { + return convert(json); +} + +template <> +rapidjson_value convert(const geometry&, rapidjson_allocator&); + +template <> +rapidjson_value convert(const feature&, rapidjson_allocator&); + +template <> +rapidjson_value convert(const feature_collection&, rapidjson_allocator&); + +struct to_type { +public: + const char * operator()(const point&) { + return "Point"; + } + + const char * operator()(const line_string&) { + return "LineString"; + } + + const char * operator()(const polygon&) { + return "Polygon"; + } + + const char * operator()(const multi_point&) { + return "MultiPoint"; + } + + const char * operator()(const multi_line_string&) { + return "MultiLineString"; + } + + const char * operator()(const multi_polygon&) { + return "MultiPolygon"; + } + + const char * operator()(const geometry_collection&) { + return "GeometryCollection"; + } +}; + +struct to_coordinates_or_geometries { + rapidjson_allocator& allocator; + + // Handles line_string, polygon, multi_point, multi_line_string, multi_polygon, and geometry_collection. + template + rapidjson_value operator()(const std::vector& vector) { + rapidjson_value result; + result.SetArray(); + for (std::size_t i = 0; i < vector.size(); ++i) { + result.PushBack(operator()(vector[i]), allocator); + } + return result; + } + + rapidjson_value operator()(const point& element) { + rapidjson_value result; + result.SetArray(); + result.PushBack(element.x, allocator); + result.PushBack(element.y, allocator); + return result; + } + + rapidjson_value operator()(const geometry& element) { + return convert(element, allocator); + } +}; + +struct to_value { + rapidjson_allocator& allocator; + + rapidjson_value operator()(null_value_t) { + rapidjson_value result; + result.SetNull(); + return result; + } + + rapidjson_value operator()(bool t) { + rapidjson_value result; + result.SetBool(t); + return result; + } + + rapidjson_value operator()(int64_t t) { + rapidjson_value result; + result.SetInt64(t); + return result; + } + + rapidjson_value operator()(uint64_t t) { + rapidjson_value result; + result.SetUint64(t); + return result; + } + + rapidjson_value operator()(double t) { + rapidjson_value result; + result.SetDouble(t); + return result; + } + + rapidjson_value operator()(const std::string& t) { + rapidjson_value result; + result.SetString(t.data(), rapidjson::SizeType(t.size()), allocator); + return result; + } + + rapidjson_value operator()(const std::vector& array) { + rapidjson_value result; + result.SetArray(); + for (const auto& item : array) { + result.PushBack(value::visit(item, *this), allocator); + } + return result; + } + + rapidjson_value operator()(const std::unordered_map& map) { + rapidjson_value result; + result.SetObject(); + for (const auto& property : map) { + result.AddMember( + rapidjson::GenericStringRef { + property.first.data(), + rapidjson::SizeType(property.first.size()) + }, + value::visit(property.second, *this), + allocator); + } + return result; + } +}; + +template <> +rapidjson_value convert(const geometry& element, rapidjson_allocator& allocator) { + rapidjson_value result(rapidjson::kObjectType); + + result.AddMember( + "type", + rapidjson::GenericStringRef { geometry::visit(element, to_type()) }, + allocator); + + result.AddMember( + rapidjson::GenericStringRef { element.is() ? "geometries" : "coordinates" }, + geometry::visit(element, to_coordinates_or_geometries { allocator }), + allocator); + + return result; +} + +template <> +rapidjson_value convert(const feature& element, rapidjson_allocator& allocator) { + rapidjson_value result(rapidjson::kObjectType); + result.AddMember("type", "Feature", allocator); + + if (element.id) { + result.AddMember("id", identifier::visit(*element.id, to_value { allocator }), allocator); + } + + result.AddMember("geometry", convert(element.geometry, allocator), allocator); + result.AddMember("properties", to_value { allocator }(element.properties), allocator); + + return result; +} + +template <> +rapidjson_value convert(const feature_collection& collection, rapidjson_allocator& allocator) { + rapidjson_value result(rapidjson::kObjectType); + result.AddMember("type", "FeatureCollection", allocator); + + rapidjson_value features(rapidjson::kArrayType); + for (const auto& element : collection) { + features.PushBack(convert(element, allocator), allocator); + } + result.AddMember("features", features, allocator); + + return result; +} + +rapidjson_value convert(const geojson& element, rapidjson_allocator& allocator) { + return geojson::visit(element, [&] (const auto& alternative) { + return convert(alternative, allocator); + }); +} + +template +std::string stringify(const T& t) { + rapidjson_allocator allocator; + rapidjson::StringBuffer buffer; + rapidjson::Writer writer(buffer); + convert(t, allocator).Accept(writer); + return buffer.GetString(); +} + +std::string stringify(const geojson& element) { + return geojson::visit(element, [] (const auto& alternative) { + return stringify(alternative); + }); +} + +} // namespace geojson +} // namespace mapbox diff --git a/src/3rdparty/mapbox-gl-native/deps/geojsonvt/6.5.1/include/mapbox/geojsonvt.hpp b/src/3rdparty/mapbox-gl-native/deps/geojsonvt/6.5.1/include/mapbox/geojsonvt.hpp new file mode 100644 index 0000000..af5bbc3 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/geojsonvt/6.5.1/include/mapbox/geojsonvt.hpp @@ -0,0 +1,254 @@ +#pragma once + +#include +#include +#include +#include + +#include +#include +#include +#include + +namespace mapbox { +namespace geojsonvt { + +using geometry = mapbox::geometry::geometry; +using feature = mapbox::geometry::feature; +using feature_collection = mapbox::geometry::feature_collection; +using geometry_collection = mapbox::geometry::geometry_collection; +using geojson = mapbox::util::variant; + +struct ToFeatureCollection { + feature_collection operator()(const feature_collection& value) const { + return value; + } + feature_collection operator()(const feature& value) const { + return { value }; + } + feature_collection operator()(const geometry& value) const { + return { { value } }; + } +}; + +struct TileOptions { + // simplification tolerance (higher means simpler) + double tolerance = 3; + + // tile extent + uint16_t extent = 4096; + + // tile buffer on each side + uint16_t buffer = 64; +}; + +struct Options : TileOptions { + // max zoom to preserve detail on + uint8_t maxZoom = 18; + + // max zoom in the tile index + uint8_t indexMaxZoom = 5; + + // max number of points per tile in the tile index + uint32_t indexMaxPoints = 100000; +}; + +const Tile empty_tile{}; + +inline uint64_t toID(uint8_t z, uint32_t x, uint32_t y) { + return (((1ull << z) * y + x) * 32) + z; +} + +inline const Tile geoJSONToTile(const geojson& geojson_, + uint8_t z, + uint32_t x, + uint32_t y, + const TileOptions& options = TileOptions(), + bool wrap = false, + bool clip = false) { + + const auto features_ = geojson::visit(geojson_, ToFeatureCollection{}); + auto z2 = 1u << z; + auto tolerance = (options.tolerance / options.extent) / z2; + auto features = detail::convert(features_, tolerance); + if (wrap) { + features = detail::wrap(features, double(options.buffer) / options.extent); + } + if (clip) { + const double p = options.buffer / options.extent; + + const auto left = detail::clip<0>(features, (x - p) / z2, (x + 1 + p) / z2, -1, 2); + features = detail::clip<1>(left, (y - p) / z2, (y + 1 + p) / z2, -1, 2); + } + return detail::InternalTile({ features, z, x, y, options.extent, tolerance }).tile; +} + +class GeoJSONVT { +public: + const Options options; + + GeoJSONVT(const mapbox::geometry::feature_collection& features_, + const Options& options_ = Options()) + : options(options_) { + + const uint32_t z2 = 1u << options.maxZoom; + + auto converted = detail::convert(features_, (options.tolerance / options.extent) / z2); + auto features = detail::wrap(converted, double(options.buffer) / options.extent); + + splitTile(features, 0, 0, 0); + } + + GeoJSONVT(const geojson& geojson_, const Options& options_ = Options()) + : GeoJSONVT(geojson::visit(geojson_, ToFeatureCollection{}), options_) { + } + + std::map stats; + uint32_t total = 0; + + const Tile& getTile(const uint8_t z, const uint32_t x_, const uint32_t y) { + + if (z > options.maxZoom) + throw std::runtime_error("Requested zoom higher than maxZoom: " + std::to_string(z)); + + const uint32_t z2 = 1u << z; + const uint32_t x = ((x_ % z2) + z2) % z2; // wrap tile x coordinate + const uint64_t id = toID(z, x, y); + + auto it = tiles.find(id); + if (it != tiles.end()) + return it->second.tile; + + it = findParent(z, x, y); + + if (it == tiles.end()) + throw std::runtime_error("Parent tile not found"); + + // if we found a parent tile containing the original geometry, we can drill down from it + const auto& parent = it->second; + + // drill down parent tile up to the requested one + splitTile(parent.source_features, parent.z, parent.x, parent.y, z, x, y); + + it = tiles.find(id); + if (it != tiles.end()) + return it->second.tile; + + it = findParent(z, x, y); + if (it == tiles.end()) + throw std::runtime_error("Parent tile not found"); + + return empty_tile; + } + + const std::unordered_map& getInternalTiles() const { + return tiles; + } + +private: + std::unordered_map tiles; + + std::unordered_map::iterator + findParent(const uint8_t z, const uint32_t x, const uint32_t y) { + uint8_t z0 = z; + uint32_t x0 = x; + uint32_t y0 = y; + + const auto end = tiles.end(); + auto parent = end; + + while ((parent == end) && (z0 != 0)) { + z0--; + x0 = x0 / 2; + y0 = y0 / 2; + parent = tiles.find(toID(z0, x0, y0)); + } + + return parent; + } + + void splitTile(const detail::vt_features& features, + const uint8_t z, + const uint32_t x, + const uint32_t y, + const uint8_t cz = 0, + const uint32_t cx = 0, + const uint32_t cy = 0) { + + const double z2 = 1u << z; + const uint64_t id = toID(z, x, y); + + auto it = tiles.find(id); + + if (it == tiles.end()) { + const double tolerance = + (z == options.maxZoom ? 0 : options.tolerance / (z2 * options.extent)); + + it = tiles + .emplace(id, + detail::InternalTile{ features, z, x, y, options.extent, tolerance }) + .first; + stats[z] = (stats.count(z) ? stats[z] + 1 : 1); + total++; + // printf("tile z%i-%i-%i\n", z, x, y); + } + + auto& tile = it->second; + + if (features.empty()) + return; + + // if it's the first-pass tiling + if (cz == 0u) { + // stop tiling if we reached max zoom, or if the tile is too simple + if (z == options.indexMaxZoom || tile.tile.num_points <= options.indexMaxPoints) { + tile.source_features = features; + return; + } + + } else { // drilldown to a specific tile; + // stop tiling if we reached base zoom + if (z == options.maxZoom) + return; + + // stop tiling if it's our target tile zoom + if (z == cz) { + tile.source_features = features; + return; + } + + // stop tiling if it's not an ancestor of the target tile + const double m = 1u << (cz - z); + if (x != static_cast(std::floor(cx / m)) || + y != static_cast(std::floor(cy / m))) { + tile.source_features = features; + return; + } + } + + const double p = 0.5 * options.buffer / options.extent; + const auto& min = tile.bbox.min; + const auto& max = tile.bbox.max; + + const auto left = detail::clip<0>(features, (x - p) / z2, (x + 0.5 + p) / z2, min.x, max.x); + + splitTile(detail::clip<1>(left, (y - p) / z2, (y + 0.5 + p) / z2, min.y, max.y), z + 1, + x * 2, y * 2, cz, cx, cy); + splitTile(detail::clip<1>(left, (y + 0.5 - p) / z2, (y + 1 + p) / z2, min.y, max.y), z + 1, + x * 2, y * 2 + 1, cz, cx, cy); + + const auto right = + detail::clip<0>(features, (x + 0.5 - p) / z2, (x + 1 + p) / z2, min.x, max.x); + + splitTile(detail::clip<1>(right, (y - p) / z2, (y + 0.5 + p) / z2, min.y, max.y), z + 1, + x * 2 + 1, y * 2, cz, cx, cy); + splitTile(detail::clip<1>(right, (y + 0.5 - p) / z2, (y + 1 + p) / z2, min.y, max.y), z + 1, + x * 2 + 1, y * 2 + 1, cz, cx, cy); + + // if we sliced further down, no need to keep source geometry + tile.source_features = {}; + } +}; + +} // namespace geojsonvt +} // namespace mapbox diff --git a/src/3rdparty/mapbox-gl-native/deps/geojsonvt/6.5.1/include/mapbox/geojsonvt/clip.hpp b/src/3rdparty/mapbox-gl-native/deps/geojsonvt/6.5.1/include/mapbox/geojsonvt/clip.hpp new file mode 100644 index 0000000..e6f3059 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/geojsonvt/6.5.1/include/mapbox/geojsonvt/clip.hpp @@ -0,0 +1,251 @@ +#pragma once + +#include + +namespace mapbox { +namespace geojsonvt { +namespace detail { + +template +class clipper { +public: + const double k1; + const double k2; + + vt_geometry operator()(const vt_point& point) const { + return point; + } + + vt_geometry operator()(const vt_multi_point& points) const { + vt_multi_point part; + for (const auto& p : points) { + const double ak = get(p); + if (ak >= k1 && ak <= k2) + part.push_back(p); + } + return part; + } + + vt_geometry operator()(const vt_line_string& line) const { + vt_multi_line_string parts; + clipLine(line, parts); + if (parts.size() == 1) + return parts[0]; + else + return parts; + } + + vt_geometry operator()(const vt_multi_line_string& lines) const { + vt_multi_line_string parts; + for (const auto& line : lines) { + clipLine(line, parts); + } + if (parts.size() == 1) + return parts[0]; + else + return parts; + } + + vt_geometry operator()(const vt_polygon& polygon) const { + vt_polygon result; + for (const auto& ring : polygon) { + const auto new_ring = clipRing(ring); + if (!new_ring.empty()) + result.push_back(new_ring); + } + return result; + } + + vt_geometry operator()(const vt_multi_polygon& polygons) const { + vt_multi_polygon result; + for (const auto& polygon : polygons) { + vt_polygon p; + for (const auto& ring : polygon) { + const auto new_ring = clipRing(ring); + if (!new_ring.empty()) + p.push_back(new_ring); + } + if (!p.empty()) + result.push_back(p); + } + return result; + } + + vt_geometry operator()(const vt_geometry_collection& geometries) const { + vt_geometry_collection result; + for (const auto& geometry : geometries) { + vt_geometry::visit(geometry, + [&](const auto& g) { result.push_back(this->operator()(g)); }); + } + return result; + } + +private: + vt_line_string newSlice(vt_multi_line_string& parts, vt_line_string& slice, double dist) const { + if (!slice.empty()) { + slice.dist = dist; + parts.push_back(std::move(slice)); + } + return {}; + } + + void clipLine(const vt_line_string& line, vt_multi_line_string& slices) const { + + const double dist = line.dist; + const size_t len = line.size(); + + if (len < 2) + return; + + vt_line_string slice; + + for (size_t i = 0; i < (len - 1); ++i) { + const auto& a = line[i]; + const auto& b = line[i + 1]; + const double ak = get(a); + const double bk = get(b); + + if (ak < k1) { + if (bk > k2) { // ---|-----|--> + slice.push_back(intersect(a, b, k1)); + slice.push_back(intersect(a, b, k2)); + slice = newSlice(slices, slice, dist); + + } else if (bk >= k1) { // ---|--> | + slice.push_back(intersect(a, b, k1)); + if (i == len - 2) + slice.push_back(b); // last point + } + } else if (ak >= k2) { + if (bk < k1) { // <--|-----|--- + slice.push_back(intersect(a, b, k2)); + slice.push_back(intersect(a, b, k1)); + slice = newSlice(slices, slice, dist); + + } else if (bk < k2) { // | <--|--- + slice.push_back(intersect(a, b, k2)); + if (i == len - 2) + slice.push_back(b); // last point + } + } else { + slice.push_back(a); + + if (bk < k1) { // <--|--- | + slice.push_back(intersect(a, b, k1)); + slice = newSlice(slices, slice, dist); + + } else if (bk > k2) { // | ---|--> + slice.push_back(intersect(a, b, k2)); + slice = newSlice(slices, slice, dist); + + } else if (i == len - 2) { // | --> | + slice.push_back(b); + } + } + } + + // add the final slice + newSlice(slices, slice, dist); + } + + vt_linear_ring clipRing(const vt_linear_ring& ring) const { + const size_t len = ring.size(); + + vt_linear_ring slice; + slice.area = ring.area; + + if (len < 2) + return slice; + + for (size_t i = 0; i < (len - 1); ++i) { + const auto& a = ring[i]; + const auto& b = ring[i + 1]; + const double ak = get(a); + const double bk = get(b); + + if (ak < k1) { + if (bk >= k1) { + slice.push_back(intersect(a, b, k1)); // ---|--> | + if (bk > k2) // ---|-----|--> + slice.push_back(intersect(a, b, k2)); + else if (i == len - 2) + slice.push_back(b); // last point + } + } else if (ak >= k2) { + if (bk < k2) { // | <--|--- + slice.push_back(intersect(a, b, k2)); + if (bk < k1) // <--|-----|--- + slice.push_back(intersect(a, b, k1)); + else if (i == len - 2) + slice.push_back(b); // last point + } + } else { + slice.push_back(a); + if (bk < k1) // <--|--- | + slice.push_back(intersect(a, b, k1)); + else if (bk > k2) // | ---|--> + slice.push_back(intersect(a, b, k2)); + // | --> | + } + } + + // close the polygon if its endpoints are not the same after clipping + if (!slice.empty()) { + const auto& first = slice.front(); + const auto& last = slice.back(); + if (first != last) { + slice.push_back(first); + } + } + + return slice; + } +}; + +/* clip features between two axis-parallel lines: + * | | + * ___|___ | / + * / | \____|____/ + * | | + */ + +template +inline vt_features clip(const vt_features& features, + const double k1, + const double k2, + const double minAll, + const double maxAll) { + + if (minAll >= k1 && maxAll < k2) // trivial accept + return features; + + if (maxAll < k1 || minAll >= k2) // trivial reject + return {}; + + vt_features clipped; + + for (const auto& feature : features) { + const auto& geom = feature.geometry; + const auto& props = feature.properties; + const auto& id = feature.id; + + const double min = get(feature.bbox.min); + const double max = get(feature.bbox.max); + + if (min >= k1 && max < k2) { // trivial accept + clipped.push_back(feature); + + } else if (max < k1 || min >= k2) { // trivial reject + continue; + + } else { + clipped.emplace_back(vt_geometry::visit(geom, clipper{ k1, k2 }), props, id); + } + } + + return clipped; +} + +} // namespace detail +} // namespace geojsonvt +} // namespace mapbox diff --git a/src/3rdparty/mapbox-gl-native/deps/geojsonvt/6.5.1/include/mapbox/geojsonvt/convert.hpp b/src/3rdparty/mapbox-gl-native/deps/geojsonvt/6.5.1/include/mapbox/geojsonvt/convert.hpp new file mode 100644 index 0000000..88c036f --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/geojsonvt/6.5.1/include/mapbox/geojsonvt/convert.hpp @@ -0,0 +1,109 @@ +#pragma once + +#include +#include +#include + +#include +#include + +namespace mapbox { +namespace geojsonvt { +namespace detail { + +struct project { + const double tolerance; + using result_type = vt_geometry; + + vt_point operator()(const geometry::point& p) { + const double sine = std::sin(p.y * M_PI / 180); + const double x = p.x / 360 + 0.5; + const double y = + std::max(std::min(0.5 - 0.25 * std::log((1 + sine) / (1 - sine)) / M_PI, 1.0), 0.0); + return { x, y, 0.0 }; + } + + vt_line_string operator()(const geometry::line_string& points) { + vt_line_string result; + const size_t len = points.size(); + + if (len == 0) + return result; + + result.reserve(len); + + for (const auto& p : points) { + result.push_back(operator()(p)); + } + + for (size_t i = 0; i < len - 1; ++i) { + const auto& a = result[i]; + const auto& b = result[i + 1]; + // use Manhattan distance instead of Euclidian to avoid expensive square root + // computation + result.dist += std::abs(b.x - a.x) + std::abs(b.y - a.y); + } + + simplify(result, tolerance); + + return result; + } + + vt_linear_ring operator()(const geometry::linear_ring& ring) { + vt_linear_ring result; + const size_t len = ring.size(); + + if (len == 0) + return result; + + result.reserve(len); + + for (const auto& p : ring) { + result.push_back(operator()(p)); + } + + double area = 0.0; + + for (size_t i = 0; i < len - 1; ++i) { + const auto& a = result[i]; + const auto& b = result[i + 1]; + area += a.x * b.y - b.x * a.y; + } + result.area = std::abs(area / 2); + + simplify(result, tolerance); + + return result; + } + + vt_geometry operator()(const geometry::geometry& geometry) { + return geometry::geometry::visit(geometry, project{ tolerance }); + } + + // Handles polygon, multi_*, geometry_collection. + template + auto operator()(const T& vector) { + typename vt_geometry_type::type result; + result.reserve(vector.size()); + for (const auto& e : vector) { + result.push_back(operator()(e)); + } + return result; + } +}; + +inline vt_features convert(const geometry::feature_collection& features, + const double tolerance) { + vt_features projected; + projected.reserve(features.size()); + for (const auto& feature : features) { + projected.emplace_back( + geometry::geometry::visit(feature.geometry, project{ tolerance }), + feature.properties, feature.id); + } + return projected; +} + +} // namespace detail +} // namespace geojsonvt +} // namespace mapbox diff --git a/src/3rdparty/mapbox-gl-native/deps/geojsonvt/6.5.1/include/mapbox/geojsonvt/simplify.hpp b/src/3rdparty/mapbox-gl-native/deps/geojsonvt/6.5.1/include/mapbox/geojsonvt/simplify.hpp new file mode 100644 index 0000000..784f085 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/geojsonvt/6.5.1/include/mapbox/geojsonvt/simplify.hpp @@ -0,0 +1,84 @@ +#pragma once + +#include + +namespace mapbox { +namespace geojsonvt { +namespace detail { + +// square distance from a point to a segment +inline double getSqSegDist(const vt_point& p, const vt_point& a, const vt_point& b) { + double x = a.x; + double y = a.y; + double dx = b.x - a.x; + double dy = b.y - a.y; + + if ((dx != 0.0) || (dy != 0.0)) { + + const double t = ((p.x - a.x) * dx + (p.y - a.y) * dy) / (dx * dx + dy * dy); + + if (t > 1) { + x = b.x; + y = b.y; + + } else if (t > 0) { + x += dx * t; + y += dy * t; + } + } + + dx = p.x - x; + dy = p.y - y; + + return dx * dx + dy * dy; +} + +// calculate simplification data using optimized Douglas-Peucker algorithm +inline void simplify(std::vector& points, size_t first, size_t last, double sqTolerance) { + double maxSqDist = sqTolerance; + size_t index = 0; + const int64_t mid = (last - first) >> 1; + int64_t minPosToMid = last - first; + + for (auto i = first + 1; i < last; i++) { + const double sqDist = getSqSegDist(points[i], points[first], points[last]); + + if (sqDist > maxSqDist) { + index = i; + maxSqDist = sqDist; + + } else if (sqDist == maxSqDist) { + // a workaround to ensure we choose a pivot close to the middle of the list, + // reducing recursion depth, for certain degenerate inputs + // https://github.com/mapbox/geojson-vt/issues/104 + auto posToMid = std::abs(static_cast(i) - mid); + if (posToMid < minPosToMid) { + index = i; + minPosToMid = posToMid; + } + } + } + + if (maxSqDist > sqTolerance) { + // save the point importance in squared pixels as a z coordinate + points[index].z = maxSqDist; + if (index - first > 1) + simplify(points, first, index, sqTolerance); + if (last - index > 1) + simplify(points, index, last, sqTolerance); + } +} + +inline void simplify(std::vector& points, double tolerance) { + const size_t len = points.size(); + + // always retain the endpoints (1 is the max value) + points[0].z = 1.0; + points[len - 1].z = 1.0; + + simplify(points, 0, len - 1, tolerance * tolerance); +} + +} // namespace detail +} // namespace geojsonvt +} // namespace mapbox diff --git a/src/3rdparty/mapbox-gl-native/deps/geojsonvt/6.5.1/include/mapbox/geojsonvt/tile.hpp b/src/3rdparty/mapbox-gl-native/deps/geojsonvt/6.5.1/include/mapbox/geojsonvt/tile.hpp new file mode 100644 index 0000000..e382346 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/geojsonvt/6.5.1/include/mapbox/geojsonvt/tile.hpp @@ -0,0 +1,184 @@ +#pragma once + +#include +#include +#include + +namespace mapbox { +namespace geojsonvt { + +struct Tile { + mapbox::geometry::feature_collection features; + uint32_t num_points = 0; + uint32_t num_simplified = 0; +}; + +namespace detail { + +class InternalTile { +public: + const uint16_t extent; + const uint8_t z; + const uint32_t x; + const uint32_t y; + + const double z2; + const double tolerance; + const double sq_tolerance; + + vt_features source_features; + mapbox::geometry::box bbox = { { 2, 1 }, { -1, 0 } }; + + Tile tile; + + InternalTile(const vt_features& source, + const uint8_t z_, + const uint32_t x_, + const uint32_t y_, + const uint16_t extent_, + const double tolerance_) + : extent(extent_), + z(z_), + x(x_), + y(y_), + z2(std::pow(2, z)), + tolerance(tolerance_), + sq_tolerance(tolerance_ * tolerance_) { + + for (const auto& feature : source) { + const auto& geom = feature.geometry; + const auto& props = feature.properties; + const auto& id = feature.id; + + tile.num_points += feature.num_points; + + vt_geometry::visit(geom, [&](const auto& g) { + // `this->` is a workaround for https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61636 + this->addFeature(g, props, id); + }); + + bbox.min.x = std::min(feature.bbox.min.x, bbox.min.x); + bbox.min.y = std::min(feature.bbox.min.y, bbox.min.y); + bbox.max.x = std::max(feature.bbox.max.x, bbox.max.x); + bbox.max.y = std::max(feature.bbox.max.y, bbox.max.y); + } + } + +private: + void + addFeature(const vt_point& point, const property_map& props, const optional& id) { + tile.features.push_back({ transform(point), props, id }); + } + + void addFeature(const vt_line_string& line, + const property_map& props, + const optional& id) { + const auto new_line = transform(line); + if (!new_line.empty()) + tile.features.push_back({ std::move(new_line), props, id }); + } + + void addFeature(const vt_polygon& polygon, + const property_map& props, + const optional& id) { + const auto new_polygon = transform(polygon); + if (!new_polygon.empty()) + tile.features.push_back({ std::move(new_polygon), props, id }); + } + + void addFeature(const vt_geometry_collection& collection, + const property_map& props, + const optional& id) { + for (const auto& geom : collection) { + vt_geometry::visit(geom, [&](const auto& g) { + // `this->` is a workaround for https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61636 + this->addFeature(g, props, id); + }); + } + } + + template + void addFeature(const T& multi, const property_map& props, const optional& id) { + const auto new_multi = transform(multi); + + switch (new_multi.size()) { + case 0: + break; + case 1: + tile.features.push_back({ std::move(new_multi[0]), props, id }); + break; + default: + tile.features.push_back({ std::move(new_multi), props, id }); + break; + } + } + + mapbox::geometry::point transform(const vt_point& p) { + ++tile.num_simplified; + return { static_cast(::round((p.x * z2 - x) * extent)), + static_cast(::round((p.y * z2 - y) * extent)) }; + } + + mapbox::geometry::multi_point transform(const vt_multi_point& points) { + mapbox::geometry::multi_point result; + result.reserve(points.size()); + for (const auto& p : points) { + result.push_back(transform(p)); + } + return result; + } + + mapbox::geometry::line_string transform(const vt_line_string& line) { + mapbox::geometry::line_string result; + if (line.dist > tolerance) { + for (const auto& p : line) { + if (p.z > sq_tolerance) + result.push_back(transform(p)); + } + } + return result; + } + + mapbox::geometry::linear_ring transform(const vt_linear_ring& ring) { + mapbox::geometry::linear_ring result; + if (ring.area > sq_tolerance) { + for (const auto& p : ring) { + if (p.z > sq_tolerance) + result.push_back(transform(p)); + } + } + return result; + } + + mapbox::geometry::multi_line_string transform(const vt_multi_line_string& lines) { + mapbox::geometry::multi_line_string result; + for (const auto& line : lines) { + if (line.dist > tolerance) + result.push_back(transform(line)); + } + return result; + } + + mapbox::geometry::polygon transform(const vt_polygon& rings) { + mapbox::geometry::polygon result; + for (const auto& ring : rings) { + if (ring.area > sq_tolerance) + result.push_back(transform(ring)); + } + return result; + } + + mapbox::geometry::multi_polygon transform(const vt_multi_polygon& polygons) { + mapbox::geometry::multi_polygon result; + for (const auto& polygon : polygons) { + const auto p = transform(polygon); + if (!p.empty()) + result.push_back(std::move(p)); + } + return result; + } +}; + +} // namespace detail +} // namespace geojsonvt +} // namespace mapbox diff --git a/src/3rdparty/mapbox-gl-native/deps/geojsonvt/6.5.1/include/mapbox/geojsonvt/types.hpp b/src/3rdparty/mapbox-gl-native/deps/geojsonvt/6.5.1/include/mapbox/geojsonvt/types.hpp new file mode 100644 index 0000000..b65844f --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/geojsonvt/6.5.1/include/mapbox/geojsonvt/types.hpp @@ -0,0 +1,162 @@ +#pragma once + +#include +#include + +#include +#include +#include +#include + +namespace mapbox { +namespace geojsonvt { +namespace detail { + +struct vt_point : mapbox::geometry::point { + double z = 0.0; // simplification tolerance + + vt_point(double x_, double y_, double z_) : mapbox::geometry::point(x_, y_), z(z_) { + } + + vt_point(double x_, double y_) : vt_point(x_, y_, 0.0) { + } +}; + +template +inline double get(const T&); + +template <> +inline double get<0>(const vt_point& p) { + return p.x; +} +template <> +inline double get<1>(const vt_point& p) { + return p.y; +} +template <> +inline double get<0>(const mapbox::geometry::point& p) { + return p.x; +} +template <> +inline double get<1>(const mapbox::geometry::point& p) { + return p.y; +} + +template +inline vt_point intersect(const vt_point&, const vt_point&, const double); + +template <> +inline vt_point intersect<0>(const vt_point& a, const vt_point& b, const double x) { + const double y = (x - a.x) * (b.y - a.y) / (b.x - a.x) + a.y; + return { x, y, 1.0 }; +} +template <> +inline vt_point intersect<1>(const vt_point& a, const vt_point& b, const double y) { + const double x = (y - a.y) * (b.x - a.x) / (b.y - a.y) + a.x; + return { x, y, 1.0 }; +} + +using vt_multi_point = std::vector; + +struct vt_line_string : std::vector { + using container_type = std::vector; + vt_line_string() = default; + vt_line_string(std::initializer_list args) + : container_type(std::move(args)) {} + + double dist = 0.0; // line length +}; + +struct vt_linear_ring : std::vector { + using container_type = std::vector; + vt_linear_ring() = default; + vt_linear_ring(std::initializer_list args) + : container_type(std::move(args)) {} + + double area = 0.0; // polygon ring area +}; + +using vt_multi_line_string = std::vector; +using vt_polygon = std::vector; +using vt_multi_polygon = std::vector; + +struct vt_geometry_collection; + +using vt_geometry = mapbox::util::variant; + +struct vt_geometry_collection : std::vector {}; + +using property_map = mapbox::geometry::property_map; +using identifier = mapbox::geometry::identifier; + +template +using optional = std::experimental::optional; + +template +struct vt_geometry_type; + +template <> +struct vt_geometry_type> { + using type = vt_point; +}; +template <> +struct vt_geometry_type> { + using type = vt_line_string; +}; +template <> +struct vt_geometry_type> { + using type = vt_polygon; +}; +template <> +struct vt_geometry_type> { + using type = vt_multi_point; +}; +template <> +struct vt_geometry_type> { + using type = vt_multi_line_string; +}; +template <> +struct vt_geometry_type> { + using type = vt_multi_polygon; +}; +template <> +struct vt_geometry_type> { + using type = vt_geometry; +}; +template <> +struct vt_geometry_type> { + using type = vt_geometry_collection; +}; + +struct vt_feature { + vt_geometry geometry; + property_map properties; + optional id; + + mapbox::geometry::box bbox = { { 2, 1 }, { -1, 0 } }; + uint32_t num_points = 0; + + vt_feature(const vt_geometry& geom, const property_map& props, const optional& id_) + : geometry(geom), properties(props), id(id_) { + + mapbox::geometry::for_each_point(geom, [&](const vt_point& p) { + bbox.min.x = std::min(p.x, bbox.min.x); + bbox.min.y = std::min(p.y, bbox.min.y); + bbox.max.x = std::max(p.x, bbox.max.x); + bbox.max.y = std::max(p.y, bbox.max.y); + ++num_points; + }); + } +}; + +using vt_features = std::vector; + +} // namespace detail +} // namespace geojsonvt +} // namespace mapbox diff --git a/src/3rdparty/mapbox-gl-native/deps/geojsonvt/6.5.1/include/mapbox/geojsonvt/wrap.hpp b/src/3rdparty/mapbox-gl-native/deps/geojsonvt/6.5.1/include/mapbox/geojsonvt/wrap.hpp new file mode 100644 index 0000000..495ccc5 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/geojsonvt/6.5.1/include/mapbox/geojsonvt/wrap.hpp @@ -0,0 +1,46 @@ +#pragma once + +#include +#include + +namespace mapbox { +namespace geojsonvt { +namespace detail { + +inline void shiftCoords(vt_features& features, double offset) { + for (auto& feature : features) { + mapbox::geometry::for_each_point(feature.geometry, + [offset](vt_point& point) { point.x += offset; }); + feature.bbox.min.x += offset; + feature.bbox.max.x += offset; + } +} + +inline vt_features wrap(const vt_features& features, double buffer) { + // left world copy + auto left = clip<0>(features, -1 - buffer, buffer, -1, 2); + // right world copy + auto right = clip<0>(features, 1 - buffer, 2 + buffer, -1, 2); + + if (left.empty() && right.empty()) + return features; + + // center world copy + auto merged = clip<0>(features, -buffer, 1 + buffer, -1, 2); + + if (!left.empty()) { + // merge left into center + shiftCoords(left, 1.0); + merged.insert(merged.begin(), left.begin(), left.end()); + } + if (!right.empty()) { + // merge right into center + shiftCoords(right, -1.0); + merged.insert(merged.end(), right.begin(), right.end()); + } + return merged; +} + +} // namespace detail +} // namespace geojsonvt +} // namespace mapbox diff --git a/src/3rdparty/mapbox-gl-native/deps/geometry/0.9.3/include/mapbox/geometry.hpp b/src/3rdparty/mapbox-gl-native/deps/geometry/0.9.3/include/mapbox/geometry.hpp new file mode 100644 index 0000000..e232453 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/geometry/0.9.3/include/mapbox/geometry.hpp @@ -0,0 +1,13 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include diff --git a/src/3rdparty/mapbox-gl-native/deps/geometry/0.9.3/include/mapbox/geometry/box.hpp b/src/3rdparty/mapbox-gl-native/deps/geometry/0.9.3/include/mapbox/geometry/box.hpp new file mode 100644 index 0000000..bf81b70 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/geometry/0.9.3/include/mapbox/geometry/box.hpp @@ -0,0 +1,34 @@ +#pragma once + +#include + +namespace mapbox { +namespace geometry { + +template +struct box +{ + using point_type = point; + + constexpr box(point_type const& min_, point_type const& max_) + : min(min_), max(max_) + {} + + point_type min; + point_type max; +}; + +template +constexpr bool operator==(box const& lhs, box const& rhs) +{ + return lhs.min == rhs.min && lhs.max == rhs.max; +} + +template +constexpr bool operator!=(box const& lhs, box const& rhs) +{ + return lhs.min != rhs.min || lhs.max != rhs.max; +} + +} // namespace geometry +} // namespace mapbox diff --git a/src/3rdparty/mapbox-gl-native/deps/geometry/0.9.3/include/mapbox/geometry/envelope.hpp b/src/3rdparty/mapbox-gl-native/deps/geometry/0.9.3/include/mapbox/geometry/envelope.hpp new file mode 100644 index 0000000..8603583 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/geometry/0.9.3/include/mapbox/geometry/envelope.hpp @@ -0,0 +1,33 @@ +#pragma once + +#include +#include + +#include + +namespace mapbox { +namespace geometry { + +template +box envelope(G const& geometry) +{ + using limits = std::numeric_limits; + + T min_t = limits::has_infinity ? -limits::infinity() : limits::min(); + T max_t = limits::has_infinity ? limits::infinity() : limits::max(); + + point min(max_t, max_t); + point max(min_t, min_t); + + for_each_point(geometry, [&] (point const& point) { + if (min.x > point.x) min.x = point.x; + if (min.y > point.y) min.y = point.y; + if (max.x < point.x) max.x = point.x; + if (max.y < point.y) max.y = point.y; + }); + + return box(min, max); +} + +} // namespace geometry +} // namespace mapbox diff --git a/src/3rdparty/mapbox-gl-native/deps/geometry/0.9.3/include/mapbox/geometry/feature.hpp b/src/3rdparty/mapbox-gl-native/deps/geometry/0.9.3/include/mapbox/geometry/feature.hpp new file mode 100644 index 0000000..685c012 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/geometry/0.9.3/include/mapbox/geometry/feature.hpp @@ -0,0 +1,96 @@ +#pragma once + +#include + +#include + +#include +#include +#include +#include +#include + +namespace mapbox { +namespace geometry { + +struct value; + +struct null_value_t +{ + constexpr null_value_t() {} + constexpr null_value_t(std::nullptr_t) {} +}; + +constexpr bool operator==(const null_value_t&, const null_value_t&) { return true; } +constexpr bool operator!=(const null_value_t&, const null_value_t&) { return false; } +constexpr bool operator<(const null_value_t&, const null_value_t&) { return false; } + +constexpr null_value_t null_value = null_value_t(); + +// Multiple numeric types (uint64_t, int64_t, double) are present in order to support +// the widest possible range of JSON numbers, which do not have a maximum range. +// Implementations that produce `value`s should use that order for type preference, +// using uint64_t for positive integers, int64_t for negative integers, and double +// for non-integers and integers outside the range of 64 bits. +using value_base = mapbox::util::variant>, + mapbox::util::recursive_wrapper>>; + +struct value : value_base +{ + using value_base::value_base; +}; + +using property_map = std::unordered_map; + +// The same considerations and requirement for numeric types apply as for `value_base`. +using identifier = mapbox::util::variant; + +template +struct feature +{ + using coordinate_type = T; + using geometry_type = mapbox::geometry::geometry; // Fully qualified to avoid GCC -fpermissive error. + + geometry_type geometry; + property_map properties {}; + std::experimental::optional id {}; + + // GCC 4.9 does not support C++14 aggregates with non-static data member + // initializers. + feature(geometry_type geometry_, + property_map properties_ = property_map {}, + std::experimental::optional id_ = std::experimental::optional {}) + : geometry(std::move(geometry_)), + properties(std::move(properties_)), + id(std::move(id_)) {} +}; + +template +constexpr bool operator==(feature const& lhs, feature const& rhs) +{ + return lhs.id == rhs.id && lhs.geometry == rhs.geometry && lhs.properties == rhs.properties; +} + +template +constexpr bool operator!=(feature const& lhs, feature const& rhs) +{ + return !(lhs == rhs); +} + +template class Cont = std::vector> +struct feature_collection : Cont> +{ + using coordinate_type = T; + using feature_type = feature; + using container_type = Cont; + using size_type = typename container_type::size_type; + + template + feature_collection(Args&&... args) : container_type(std::forward(args)...) {} + feature_collection(std::initializer_list args) + : container_type(std::move(args)) {} +}; + +} // namespace geometry +} // namespace mapbox diff --git a/src/3rdparty/mapbox-gl-native/deps/geometry/0.9.3/include/mapbox/geometry/for_each_point.hpp b/src/3rdparty/mapbox-gl-native/deps/geometry/0.9.3/include/mapbox/geometry/for_each_point.hpp new file mode 100644 index 0000000..44d6e77 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/geometry/0.9.3/include/mapbox/geometry/for_each_point.hpp @@ -0,0 +1,45 @@ +#pragma once + +#include + +namespace mapbox { +namespace geometry { + +template +auto for_each_point(Point&& point, F&& f) + -> decltype(point.x, point.y, void()) +{ + f(std::forward(point)); +} + +template +auto for_each_point(Container&& container, F&& f) + -> decltype(container.begin(), container.end(), void()); + +template +void for_each_point(mapbox::util::variant const& geom, F&& f) +{ + mapbox::util::variant::visit(geom, [&] (auto const& g) { + for_each_point(g, f); + }); +} + +template +void for_each_point(mapbox::util::variant & geom, F&& f) +{ + mapbox::util::variant::visit(geom, [&] (auto & g) { + for_each_point(g, f); + }); +} + +template +auto for_each_point(Container&& container, F&& f) + -> decltype(container.begin(), container.end(), void()) +{ + for (auto& e: container) { + for_each_point(e, f); + } +} + +} // namespace geometry +} // namespace mapbox diff --git a/src/3rdparty/mapbox-gl-native/deps/geometry/0.9.3/include/mapbox/geometry/geometry.hpp b/src/3rdparty/mapbox-gl-native/deps/geometry/0.9.3/include/mapbox/geometry/geometry.hpp new file mode 100644 index 0000000..3b86117 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/geometry/0.9.3/include/mapbox/geometry/geometry.hpp @@ -0,0 +1,58 @@ +#pragma once + +#include +#include +#include +#include +#include +#include + +#include + +// stl +#include + +namespace mapbox { +namespace geometry { + +template class Cont = std::vector> +struct geometry_collection; + +template +using geometry_base = mapbox::util::variant, + line_string, + polygon, + multi_point, + multi_line_string, + multi_polygon, + geometry_collection>; + +template +struct geometry : geometry_base +{ + using coordinate_type = T; + using geometry_base::geometry_base; + + /* + * The default constructor would create a point geometry with default-constructed coordinates; + * i.e. (0, 0). Since this is not particularly useful, and could hide bugs, it is disabled. + */ + geometry() = delete; +}; + +template class Cont> +struct geometry_collection : Cont> +{ + using coordinate_type = T; + using geometry_type = geometry; + using container_type = Cont; + using size_type = typename container_type::size_type; + + template + geometry_collection(Args&&... args) : container_type(std::forward(args)...) {} + geometry_collection(std::initializer_list args) + : container_type(std::move(args)) {} +}; + +} // namespace geometry +} // namespace mapbox diff --git a/src/3rdparty/mapbox-gl-native/deps/geometry/0.9.3/include/mapbox/geometry/line_string.hpp b/src/3rdparty/mapbox-gl-native/deps/geometry/0.9.3/include/mapbox/geometry/line_string.hpp new file mode 100644 index 0000000..d11d06b --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/geometry/0.9.3/include/mapbox/geometry/line_string.hpp @@ -0,0 +1,26 @@ +#pragma once + +// mapbox +#include +// stl +#include + +namespace mapbox { +namespace geometry { + +template class Cont = std::vector> +struct line_string : Cont > +{ + using coordinate_type = T; + using point_type = point; + using container_type = Cont; + using size_type = typename container_type::size_type; + + template + line_string(Args&&... args) : container_type(std::forward(args)...) {} + line_string(std::initializer_list args) + : container_type(std::move(args)) {} +}; + +} // namespace geometry +} // namespace mapbox diff --git a/src/3rdparty/mapbox-gl-native/deps/geometry/0.9.3/include/mapbox/geometry/multi_line_string.hpp b/src/3rdparty/mapbox-gl-native/deps/geometry/0.9.3/include/mapbox/geometry/multi_line_string.hpp new file mode 100644 index 0000000..7dfefd8 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/geometry/0.9.3/include/mapbox/geometry/multi_line_string.hpp @@ -0,0 +1,26 @@ +#pragma once + +// mapbox +#include +// stl +#include + +namespace mapbox { +namespace geometry { + +template class Cont = std::vector> +struct multi_line_string : Cont> +{ + using coordinate_type = T; + using line_string_type = line_string; + using container_type = Cont; + using size_type = typename container_type::size_type; + + template + multi_line_string(Args&&... args) : container_type(std::forward(args)...) {} + multi_line_string(std::initializer_list args) + : container_type(std::move(args)) {} +}; + +} // namespace geometry +} // namespace mapbox diff --git a/src/3rdparty/mapbox-gl-native/deps/geometry/0.9.3/include/mapbox/geometry/multi_point.hpp b/src/3rdparty/mapbox-gl-native/deps/geometry/0.9.3/include/mapbox/geometry/multi_point.hpp new file mode 100644 index 0000000..d2d7a67 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/geometry/0.9.3/include/mapbox/geometry/multi_point.hpp @@ -0,0 +1,26 @@ +#pragma once + +// mapbox +#include +// stl +#include + +namespace mapbox { +namespace geometry { + +template class Cont = std::vector> +struct multi_point : Cont> +{ + using coordinate_type = T; + using point_type = point; + using container_type = Cont; + using size_type = typename container_type::size_type; + + template + multi_point(Args&&... args) : container_type(std::forward(args)...) {} + multi_point(std::initializer_list args) + : container_type(std::move(args)) {} +}; + +} // namespace geometry +} // namespace mapbox diff --git a/src/3rdparty/mapbox-gl-native/deps/geometry/0.9.3/include/mapbox/geometry/multi_polygon.hpp b/src/3rdparty/mapbox-gl-native/deps/geometry/0.9.3/include/mapbox/geometry/multi_polygon.hpp new file mode 100644 index 0000000..0e3cb32 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/geometry/0.9.3/include/mapbox/geometry/multi_polygon.hpp @@ -0,0 +1,26 @@ +#pragma once + +// mapbox +#include +// stl +#include + +namespace mapbox { +namespace geometry { + +template class Cont = std::vector> +struct multi_polygon : Cont> +{ + using coordinate_type = T; + using polygon_type = polygon; + using container_type = Cont; + using size_type = typename container_type::size_type; + + template + multi_polygon(Args&&... args) : container_type(std::forward(args)...) {} + multi_polygon(std::initializer_list args) + : container_type(std::move(args)) {} +}; + +} // namespace geometry +} // namespace mapbox diff --git a/src/3rdparty/mapbox-gl-native/deps/geometry/0.9.3/include/mapbox/geometry/point.hpp b/src/3rdparty/mapbox-gl-native/deps/geometry/0.9.3/include/mapbox/geometry/point.hpp new file mode 100644 index 0000000..0cba499 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/geometry/0.9.3/include/mapbox/geometry/point.hpp @@ -0,0 +1,35 @@ +#pragma once + +namespace mapbox { +namespace geometry { + +template +struct point +{ + using coordinate_type = T; + + constexpr point() + : x(), y() + {} + constexpr point(T x_, T y_) + : x(x_), y(y_) + {} + + T x; + T y; +}; + +template +constexpr bool operator==(point const& lhs, point const& rhs) +{ + return lhs.x == rhs.x && lhs.y == rhs.y; +} + +template +constexpr bool operator!=(point const& lhs, point const& rhs) +{ + return !(lhs == rhs); +} + +} // namespace geometry +} // namespace mapbox diff --git a/src/3rdparty/mapbox-gl-native/deps/geometry/0.9.3/include/mapbox/geometry/point_arithmetic.hpp b/src/3rdparty/mapbox-gl-native/deps/geometry/0.9.3/include/mapbox/geometry/point_arithmetic.hpp new file mode 100644 index 0000000..0c4c632 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/geometry/0.9.3/include/mapbox/geometry/point_arithmetic.hpp @@ -0,0 +1,119 @@ +#pragma once + +namespace mapbox { +namespace geometry { + +template +point operator+(point const& lhs, point const& rhs) +{ + return point(lhs.x + rhs.x, lhs.y + rhs.y); +} + +template +point operator+(point const& lhs, T const& rhs) +{ + return point(lhs.x + rhs, lhs.y + rhs); +} + +template +point operator-(point const& lhs, point const& rhs) +{ + return point(lhs.x - rhs.x, lhs.y - rhs.y); +} + +template +point operator-(point const& lhs, T const& rhs) +{ + return point(lhs.x - rhs, lhs.y - rhs); +} + +template +point operator*(point const& lhs, point const& rhs) +{ + return point(lhs.x * rhs.x, lhs.y * rhs.y); +} + +template +point operator*(point const& lhs, T const& rhs) +{ + return point(lhs.x * rhs, lhs.y * rhs); +} + +template +point operator/(point const& lhs, point const& rhs) +{ + return point(lhs.x / rhs.x, lhs.y / rhs.y); +} + +template +point operator/(point const& lhs, T const& rhs) +{ + return point(lhs.x / rhs, lhs.y / rhs); +} + +template +point& operator+=(point& lhs, point const& rhs) +{ + lhs.x += rhs.x; + lhs.y += rhs.y; + return lhs; +} + +template +point& operator+=(point& lhs, T const& rhs) +{ + lhs.x += rhs; + lhs.y += rhs; + return lhs; +} + +template +point& operator-=(point& lhs, point const& rhs) +{ + lhs.x -= rhs.x; + lhs.y -= rhs.y; + return lhs; +} + +template +point& operator-=(point& lhs, T const& rhs) +{ + lhs.x -= rhs; + lhs.y -= rhs; + return lhs; +} + +template +point& operator*=(point& lhs, point const& rhs) +{ + lhs.x *= rhs.x; + lhs.y *= rhs.y; + return lhs; +} + +template +point& operator*=(point& lhs, T const& rhs) +{ + lhs.x *= rhs; + lhs.y *= rhs; + return lhs; +} + +template +point& operator/=(point& lhs, point const& rhs) +{ + lhs.x /= rhs.x; + lhs.y /= rhs.y; + return lhs; +} + +template +point& operator/=(point& lhs, T const& rhs) +{ + lhs.x /= rhs; + lhs.y /= rhs; + return lhs; +} + +} // namespace geometry +} // namespace mapbox diff --git a/src/3rdparty/mapbox-gl-native/deps/geometry/0.9.3/include/mapbox/geometry/polygon.hpp b/src/3rdparty/mapbox-gl-native/deps/geometry/0.9.3/include/mapbox/geometry/polygon.hpp new file mode 100644 index 0000000..0c7e116 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/geometry/0.9.3/include/mapbox/geometry/polygon.hpp @@ -0,0 +1,41 @@ +#pragma once + +// mapbox +#include + +// stl +#include + +namespace mapbox { +namespace geometry { + +template class Cont = std::vector> +struct linear_ring : Cont> +{ + using coordinate_type = T; + using point_type = point; + using container_type = Cont; + using size_type = typename container_type::size_type; + + template + linear_ring(Args&&... args) : container_type(std::forward(args)...) {} + linear_ring(std::initializer_list args) + : container_type(std::move(args)) {} +}; + +template class Cont = std::vector> +struct polygon : Cont> +{ + using coordinate_type = T; + using linear_ring_type = linear_ring; + using container_type = Cont; + using size_type = typename container_type::size_type; + + template + polygon(Args&&... args) : container_type(std::forward(args)...) {} + polygon(std::initializer_list args) + : container_type(std::move(args)) {} +}; + +} // namespace geometry +} // namespace mapbox diff --git a/src/3rdparty/mapbox-gl-native/deps/kdbush/0.1.1-1/LICENSE b/src/3rdparty/mapbox-gl-native/deps/kdbush/0.1.1-1/LICENSE new file mode 100644 index 0000000..3c8f67e --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/kdbush/0.1.1-1/LICENSE @@ -0,0 +1,13 @@ +Copyright (c) 2016, Vladimir Agafonkin + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/src/3rdparty/mapbox-gl-native/deps/kdbush/0.1.1-1/include/kdbush.hpp b/src/3rdparty/mapbox-gl-native/deps/kdbush/0.1.1-1/include/kdbush.hpp new file mode 100644 index 0000000..b5938c1 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/kdbush/0.1.1-1/include/kdbush.hpp @@ -0,0 +1,210 @@ +#pragma once + +#include +#include +#include +#include +#include +#include + +namespace kdbush { + +template +struct nth { + inline static typename std::tuple_element::type get(const T &t) { + return std::get(t); + } +}; + +template +class KDBush { + +public: + using TNumber = decltype(nth<0, TPoint>::get(std::declval())); + static_assert( + std::is_same::get(std::declval()))>::value, + "point component types must be identical"); + + static const std::uint8_t defaultNodeSize = 64; + + KDBush(const std::uint8_t nodeSize_ = defaultNodeSize) : nodeSize(nodeSize_) { + } + + KDBush(const std::vector &points_, const std::uint8_t nodeSize_ = defaultNodeSize) + : KDBush(std::begin(points_), std::end(points_), nodeSize_) { + } + + template + KDBush(const TPointIter &points_begin, + const TPointIter &points_end, + const std::uint8_t nodeSize_ = defaultNodeSize) + : nodeSize(nodeSize_) { + fill(points_begin, points_end); + } + + void fill(const std::vector &points_) { + fill(std::begin(points_), std::end(points_)); + } + + template + void fill(const TPointIter &points_begin, const TPointIter &points_end) { + assert(points.empty()); + const TIndex size = static_cast(std::distance(points_begin, points_end)); + + points.reserve(size); + ids.reserve(size); + + TIndex i = 0; + for (auto p = points_begin; p != points_end; p++) { + points.emplace_back(nth<0, TPoint>::get(*p), nth<1, TPoint>::get(*p)); + ids.push_back(i++); + } + + sortKD(0, size - 1, 0); + } + + template + void range(const TNumber minX, + const TNumber minY, + const TNumber maxX, + const TNumber maxY, + const TVisitor &visitor) { + range(minX, minY, maxX, maxY, visitor, 0, static_cast(ids.size() - 1), 0); + } + + template + void within(const TNumber qx, const TNumber qy, const TNumber r, const TVisitor &visitor) { + within(qx, qy, r, visitor, 0, static_cast(ids.size() - 1), 0); + } + +private: + std::vector ids; + std::vector> points; + std::uint8_t nodeSize; + + template + void range(const TNumber minX, + const TNumber minY, + const TNumber maxX, + const TNumber maxY, + const TVisitor &visitor, + const TIndex left, + const TIndex right, + const std::uint8_t axis) { + + if (right - left <= nodeSize) { + for (auto i = left; i <= right; i++) { + const TNumber x = std::get<0>(points[i]); + const TNumber y = std::get<1>(points[i]); + if (x >= minX && x <= maxX && y >= minY && y <= maxY) visitor(ids[i]); + } + return; + } + + const TIndex m = (left + right) >> 1; + const TNumber x = std::get<0>(points[m]); + const TNumber y = std::get<1>(points[m]); + + if (x >= minX && x <= maxX && y >= minY && y <= maxY) visitor(ids[m]); + + if (axis == 0 ? minX <= x : minY <= y) + range(minX, minY, maxX, maxY, visitor, left, m - 1, (axis + 1) % 2); + + if (axis == 0 ? maxX >= x : maxY >= y) + range(minX, minY, maxX, maxY, visitor, m + 1, right, (axis + 1) % 2); + } + + template + void within(const TNumber qx, + const TNumber qy, + const TNumber r, + const TVisitor &visitor, + const TIndex left, + const TIndex right, + const std::uint8_t axis) { + + const TNumber r2 = r * r; + + if (right - left <= nodeSize) { + for (auto i = left; i <= right; i++) { + const TNumber x = std::get<0>(points[i]); + const TNumber y = std::get<1>(points[i]); + if (sqDist(x, y, qx, qy) <= r2) visitor(ids[i]); + } + return; + } + + const TIndex m = (left + right) >> 1; + const TNumber x = std::get<0>(points[m]); + const TNumber y = std::get<1>(points[m]); + + if (sqDist(x, y, qx, qy) <= r2) visitor(ids[m]); + + if (axis == 0 ? qx - r <= x : qy - r <= y) + within(qx, qy, r, visitor, left, m - 1, (axis + 1) % 2); + + if (axis == 0 ? qx + r >= x : qy + r >= y) + within(qx, qy, r, visitor, m + 1, right, (axis + 1) % 2); + } + + void sortKD(const TIndex left, const TIndex right, const std::uint8_t axis) { + if (right - left <= nodeSize) return; + const TIndex m = (left + right) >> 1; + if (axis == 0) { + select<0>(m, left, right); + } else { + select<1>(m, left, right); + } + sortKD(left, m - 1, (axis + 1) % 2); + sortKD(m + 1, right, (axis + 1) % 2); + } + + template + void select(const TIndex k, TIndex left, TIndex right) { + + while (right > left) { + if (right - left > 600) { + const double n = right - left + 1; + const double m = k - left + 1; + const double z = std::log(n); + const double s = 0.5 * std::exp(2 * z / 3); + const double r = + k - m * s / n + 0.5 * std::sqrt(z * s * (1 - s / n)) * (2 * m < n ? -1 : 1); + select(k, std::max(left, TIndex(r)), std::min(right, TIndex(r + s))); + } + + const TNumber t = std::get(points[k]); + TIndex i = left; + TIndex j = right; + + swapItem(left, k); + if (std::get(points[right]) > t) swapItem(left, right); + + while (i < j) { + swapItem(i++, j--); + while (std::get(points[i]) < t) i++; + while (std::get(points[j]) > t) j--; + } + + if (std::get(points[left]) == t) + swapItem(left, j); + else { + swapItem(++j, right); + } + + if (j <= k) left = j + 1; + if (k <= j) right = j - 1; + } + } + + void swapItem(const TIndex i, const TIndex j) { + std::iter_swap(ids.begin() + i, ids.begin() + j); + std::iter_swap(points.begin() + i, points.begin() + j); + } + + TNumber sqDist(const TNumber ax, const TNumber ay, const TNumber bx, const TNumber by) { + return std::pow(ax - bx, 2) + std::pow(ay - by, 2); + } +}; + +} // namespace kdbush diff --git a/src/3rdparty/mapbox-gl-native/deps/optional/f27e7908/include/experimental/optional b/src/3rdparty/mapbox-gl-native/deps/optional/f27e7908/include/experimental/optional new file mode 100644 index 0000000..7b9148f --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/optional/f27e7908/include/experimental/optional @@ -0,0 +1,1052 @@ +// Copyright (C) 2011 - 2012 Andrzej Krzemienski. +// +// Use, modification, and distribution is subject to the Boost Software +// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// The idea and interface is based on Boost.Optional library +// authored by Fernando Luis Cacciola Carballal + +# ifndef ___OPTIONAL_HPP___ +# define ___OPTIONAL_HPP___ + +# include +# include +# include +# include +# include +# include +# include + +# define TR2_OPTIONAL_REQUIRES(...) typename enable_if<__VA_ARGS__::value, bool>::type = false + +# if defined __GNUC__ // NOTE: GNUC is also defined for Clang +# if (__GNUC__ == 4) && (__GNUC_MINOR__ >= 8) +# define TR2_OPTIONAL_GCC_4_8_AND_HIGHER___ +# elif (__GNUC__ > 4) +# define TR2_OPTIONAL_GCC_4_8_AND_HIGHER___ +# endif +# +# if (__GNUC__ == 4) && (__GNUC_MINOR__ >= 7) +# define TR2_OPTIONAL_GCC_4_7_AND_HIGHER___ +# elif (__GNUC__ > 4) +# define TR2_OPTIONAL_GCC_4_7_AND_HIGHER___ +# endif +# +# if (__GNUC__ == 4) && (__GNUC_MINOR__ == 8) && (__GNUC_PATCHLEVEL__ >= 1) +# define TR2_OPTIONAL_GCC_4_8_1_AND_HIGHER___ +# elif (__GNUC__ == 4) && (__GNUC_MINOR__ >= 9) +# define TR2_OPTIONAL_GCC_4_8_1_AND_HIGHER___ +# elif (__GNUC__ > 4) +# define TR2_OPTIONAL_GCC_4_8_1_AND_HIGHER___ +# endif +# endif +# +# if defined __clang_major__ +# if (__clang_major__ == 3 && __clang_minor__ >= 5) +# define TR2_OPTIONAL_CLANG_3_5_AND_HIGHTER_ +# elif (__clang_major__ > 3) +# define TR2_OPTIONAL_CLANG_3_5_AND_HIGHTER_ +# endif +# if defined TR2_OPTIONAL_CLANG_3_5_AND_HIGHTER_ +# define TR2_OPTIONAL_CLANG_3_4_2_AND_HIGHER_ +# elif (__clang_major__ == 3 && __clang_minor__ == 4 && __clang_patchlevel__ >= 2) +# define TR2_OPTIONAL_CLANG_3_4_2_AND_HIGHER_ +# endif +# endif +# +# if defined _MSC_VER +# if (_MSC_VER >= 1900) +# define TR2_OPTIONAL_MSVC_2015_AND_HIGHER___ +# endif +# endif + +# if defined __clang__ +# if (__clang_major__ > 2) || (__clang_major__ == 2) && (__clang_minor__ >= 9) +# define OPTIONAL_HAS_THIS_RVALUE_REFS 1 +# else +# define OPTIONAL_HAS_THIS_RVALUE_REFS 0 +# endif +# elif defined TR2_OPTIONAL_GCC_4_8_1_AND_HIGHER___ +# define OPTIONAL_HAS_THIS_RVALUE_REFS 1 +# elif defined TR2_OPTIONAL_MSVC_2015_AND_HIGHER___ +# define OPTIONAL_HAS_THIS_RVALUE_REFS 1 +# else +# define OPTIONAL_HAS_THIS_RVALUE_REFS 0 +# endif + + +# if defined TR2_OPTIONAL_GCC_4_8_1_AND_HIGHER___ +# define OPTIONAL_HAS_CONSTEXPR_INIT_LIST 1 +# define OPTIONAL_CONSTEXPR_INIT_LIST constexpr +# else +# define OPTIONAL_HAS_CONSTEXPR_INIT_LIST 0 +# define OPTIONAL_CONSTEXPR_INIT_LIST +# endif + +# if defined TR2_OPTIONAL_CLANG_3_5_AND_HIGHTER_ && (defined __cplusplus) && (__cplusplus != 201103L) +# define OPTIONAL_HAS_MOVE_ACCESSORS 1 +# else +# define OPTIONAL_HAS_MOVE_ACCESSORS 0 +# endif + +# // In C++11 constexpr implies const, so we need to make non-const members also non-constexpr +# if (defined __cplusplus) && (__cplusplus == 201103L) +# define OPTIONAL_MUTABLE_CONSTEXPR +# else +# define OPTIONAL_MUTABLE_CONSTEXPR constexpr +# endif + +namespace std{ + +namespace experimental{ + +// BEGIN workaround for missing is_trivially_destructible +# if defined TR2_OPTIONAL_GCC_4_8_AND_HIGHER___ + // leave it: it is already there +# elif defined TR2_OPTIONAL_CLANG_3_4_2_AND_HIGHER_ + // leave it: it is already there +# elif defined TR2_OPTIONAL_MSVC_2015_AND_HIGHER___ + // leave it: it is already there +# elif defined TR2_OPTIONAL_DISABLE_EMULATION_OF_TYPE_TRAITS + // leave it: the user doesn't want it +# else + template + using is_trivially_destructible = std::has_trivial_destructor; +# endif +// END workaround for missing is_trivially_destructible + +# if (defined TR2_OPTIONAL_GCC_4_7_AND_HIGHER___) + // leave it; our metafunctions are already defined. +# elif defined TR2_OPTIONAL_CLANG_3_4_2_AND_HIGHER_ + // leave it; our metafunctions are already defined. +# elif defined TR2_OPTIONAL_MSVC_2015_AND_HIGHER___ + // leave it: it is already there +# elif defined TR2_OPTIONAL_DISABLE_EMULATION_OF_TYPE_TRAITS + // leave it: the user doesn't want it +# else + + +// workaround for missing traits in GCC and CLANG +template +struct is_nothrow_move_constructible +{ + constexpr static bool value = std::is_nothrow_constructible::value; +}; + + +template +struct is_assignable +{ + template + constexpr static bool has_assign(...) { return false; } + + template () = std::declval(), true)) > + // the comma operator is necessary for the cases where operator= returns void + constexpr static bool has_assign(bool) { return true; } + + constexpr static bool value = has_assign(true); +}; + + +template +struct is_nothrow_move_assignable +{ + template + struct has_nothrow_move_assign { + constexpr static bool value = false; + }; + + template + struct has_nothrow_move_assign { + constexpr static bool value = noexcept( std::declval() = std::declval() ); + }; + + constexpr static bool value = has_nothrow_move_assign::value>::value; +}; +// end workaround + + +# endif + + + +// 20.5.4, optional for object types +template class optional; + +// 20.5.5, optional for lvalue reference types +template class optional; + + +// workaround: std utility functions aren't constexpr yet +template inline constexpr T&& constexpr_forward(typename std::remove_reference::type& t) noexcept +{ + return static_cast(t); +} + +template inline constexpr T&& constexpr_forward(typename std::remove_reference::type&& t) noexcept +{ + static_assert(!std::is_lvalue_reference::value, "!!"); + return static_cast(t); +} + +template inline constexpr typename std::remove_reference::type&& constexpr_move(T&& t) noexcept +{ + return static_cast::type&&>(t); +} + + +#if defined NDEBUG +# define TR2_OPTIONAL_ASSERTED_EXPRESSION(CHECK, EXPR) (EXPR) +#else +# define TR2_OPTIONAL_ASSERTED_EXPRESSION(CHECK, EXPR) ((CHECK) ? (EXPR) : ([]{assert(!#CHECK);}(), (EXPR))) +#endif + + +namespace detail_ +{ + +// static_addressof: a constexpr version of addressof +template +struct has_overloaded_addressof +{ + template + constexpr static bool has_overload(...) { return false; } + + template ().operator&()) > + constexpr static bool has_overload(bool) { return true; } + + constexpr static bool value = has_overload(true); +}; + +template )> +constexpr T* static_addressof(T& ref) +{ + return &ref; +} + +template )> +T* static_addressof(T& ref) +{ + return std::addressof(ref); +} + + +// the call to convert(b) has return type A and converts b to type A iff b decltype(b) is implicitly convertible to A +template +constexpr U convert(U v) { return v; } + +} // namespace detail + + +constexpr struct trivial_init_t{} trivial_init{}; + + +// 20.5.6, In-place construction +constexpr struct in_place_t{} in_place{}; + + +// 20.5.7, Disengaged state indicator +struct nullopt_t +{ + struct init{}; + constexpr explicit nullopt_t(init){} +}; +constexpr nullopt_t nullopt{nullopt_t::init()}; + + +// 20.5.8, class bad_optional_access +class bad_optional_access : public logic_error { +public: + explicit bad_optional_access(const string& what_arg) : logic_error{what_arg} {} + explicit bad_optional_access(const char* what_arg) : logic_error{what_arg} {} +}; + + +template +union storage_t +{ + unsigned char dummy_; + T value_; + + constexpr storage_t( trivial_init_t ) noexcept : dummy_() {}; + + template + constexpr storage_t( Args&&... args ) : value_(constexpr_forward(args)...) {} + + ~storage_t(){} +}; + + +template +union constexpr_storage_t +{ + unsigned char dummy_; + T value_; + + constexpr constexpr_storage_t( trivial_init_t ) noexcept : dummy_() {}; + + template + constexpr constexpr_storage_t( Args&&... args ) : value_(constexpr_forward(args)...) {} + + ~constexpr_storage_t() = default; +}; + + +template +struct optional_base +{ + bool init_; + storage_t storage_; + + constexpr optional_base() noexcept : init_(false), storage_(trivial_init) {}; + + explicit constexpr optional_base(const T& v) : init_(true), storage_(v) {} + + explicit constexpr optional_base(T&& v) : init_(true), storage_(constexpr_move(v)) {} + + template explicit optional_base(in_place_t, Args&&... args) + : init_(true), storage_(constexpr_forward(args)...) {} + + template >)> + explicit optional_base(in_place_t, std::initializer_list il, Args&&... args) + : init_(true), storage_(il, std::forward(args)...) {} + + ~optional_base() { if (init_) storage_.value_.T::~T(); } +}; + + +template +struct constexpr_optional_base +{ + bool init_; + constexpr_storage_t storage_; + + constexpr constexpr_optional_base() noexcept : init_(false), storage_(trivial_init) {}; + + explicit constexpr constexpr_optional_base(const T& v) : init_(true), storage_(v) {} + + explicit constexpr constexpr_optional_base(T&& v) : init_(true), storage_(constexpr_move(v)) {} + + template explicit constexpr constexpr_optional_base(in_place_t, Args&&... args) + : init_(true), storage_(constexpr_forward(args)...) {} + + template >)> + OPTIONAL_CONSTEXPR_INIT_LIST explicit constexpr_optional_base(in_place_t, std::initializer_list il, Args&&... args) + : init_(true), storage_(il, std::forward(args)...) {} + + ~constexpr_optional_base() = default; +}; + +template +using OptionalBase = typename std::conditional< + is_trivially_destructible::value, // if possible + constexpr_optional_base::type>, // use base with trivial destructor + optional_base::type> +>::type; + + + +template +class optional : private OptionalBase +{ + static_assert( !std::is_same::type, nullopt_t>::value, "bad T" ); + static_assert( !std::is_same::type, in_place_t>::value, "bad T" ); + + + constexpr bool initialized() const noexcept { return OptionalBase::init_; } + typename std::remove_const::type* dataptr() { return std::addressof(OptionalBase::storage_.value_); } + constexpr const T* dataptr() const { return detail_::static_addressof(OptionalBase::storage_.value_); } + +# if OPTIONAL_HAS_THIS_RVALUE_REFS == 1 + constexpr const T& contained_val() const& { return OptionalBase::storage_.value_; } +# if OPTIONAL_HAS_MOVE_ACCESSORS == 1 + OPTIONAL_MUTABLE_CONSTEXPR T&& contained_val() && { return std::move(OptionalBase::storage_.value_); } + OPTIONAL_MUTABLE_CONSTEXPR T& contained_val() & { return OptionalBase::storage_.value_; } +# else + T& contained_val() & { return OptionalBase::storage_.value_; } + T&& contained_val() && { return std::move(OptionalBase::storage_.value_); } +# endif +# else + constexpr const T& contained_val() const { return OptionalBase::storage_.value_; } + T& contained_val() { return OptionalBase::storage_.value_; } +# endif + + void clear() noexcept { + if (initialized()) dataptr()->T::~T(); + OptionalBase::init_ = false; + } + + template + void initialize(Args&&... args) noexcept(noexcept(T(std::forward(args)...))) + { + assert(!OptionalBase::init_); + ::new (static_cast(dataptr())) T(std::forward(args)...); + OptionalBase::init_ = true; + } + + template + void initialize(std::initializer_list il, Args&&... args) noexcept(noexcept(T(il, std::forward(args)...))) + { + assert(!OptionalBase::init_); + ::new (static_cast(dataptr())) T(il, std::forward(args)...); + OptionalBase::init_ = true; + } + +public: + typedef T value_type; + + // 20.5.5.1, constructors + constexpr optional() noexcept : OptionalBase() {}; + constexpr optional(nullopt_t) noexcept : OptionalBase() {}; + + optional(const optional& rhs) + : OptionalBase() + { + if (rhs.initialized()) { + ::new (static_cast(dataptr())) T(*rhs); + OptionalBase::init_ = true; + } + } + + optional(optional&& rhs) noexcept(is_nothrow_move_constructible::value) + : OptionalBase() + { + if (rhs.initialized()) { + ::new (static_cast(dataptr())) T(std::move(*rhs)); + OptionalBase::init_ = true; + } + } + + constexpr optional(const T& v) : OptionalBase(v) {} + + constexpr optional(T&& v) : OptionalBase(constexpr_move(v)) {} + + template + explicit constexpr optional(in_place_t, Args&&... args) + : OptionalBase(in_place_t{}, constexpr_forward(args)...) {} + + template >)> + OPTIONAL_CONSTEXPR_INIT_LIST explicit optional(in_place_t, std::initializer_list il, Args&&... args) + : OptionalBase(in_place_t{}, il, constexpr_forward(args)...) {} + + // 20.5.4.2, Destructor + ~optional() = default; + + // 20.5.4.3, assignment + optional& operator=(nullopt_t) noexcept + { + clear(); + return *this; + } + + optional& operator=(const optional& rhs) + { + if (initialized() == true && rhs.initialized() == false) clear(); + else if (initialized() == false && rhs.initialized() == true) initialize(*rhs); + else if (initialized() == true && rhs.initialized() == true) contained_val() = *rhs; + return *this; + } + + optional& operator=(optional&& rhs) + noexcept(is_nothrow_move_assignable::value && is_nothrow_move_constructible::value) + { + if (initialized() == true && rhs.initialized() == false) clear(); + else if (initialized() == false && rhs.initialized() == true) initialize(std::move(*rhs)); + else if (initialized() == true && rhs.initialized() == true) contained_val() = std::move(*rhs); + return *this; + } + + template + auto operator=(U&& v) + -> typename enable_if + < + is_same::type, T>::value, + optional& + >::type + { + if (initialized()) { contained_val() = std::forward(v); } + else { initialize(std::forward(v)); } + return *this; + } + + + template + void emplace(Args&&... args) + { + clear(); + initialize(std::forward(args)...); + } + + template + void emplace(initializer_list il, Args&&... args) + { + clear(); + initialize(il, std::forward(args)...); + } + + // 20.5.4.4, Swap + void swap(optional& rhs) noexcept(is_nothrow_move_constructible::value && noexcept(swap(declval(), declval()))) + { + if (initialized() == true && rhs.initialized() == false) { rhs.initialize(std::move(**this)); clear(); } + else if (initialized() == false && rhs.initialized() == true) { initialize(std::move(*rhs)); rhs.clear(); } + else if (initialized() == true && rhs.initialized() == true) { using std::swap; swap(**this, *rhs); } + } + + // 20.5.4.5, Observers + + explicit constexpr operator bool() const noexcept { return initialized(); } + constexpr bool has_value() const noexcept { return initialized(); } + + constexpr T const* operator ->() const { + return TR2_OPTIONAL_ASSERTED_EXPRESSION(initialized(), dataptr()); + } + +# if OPTIONAL_HAS_MOVE_ACCESSORS == 1 + + OPTIONAL_MUTABLE_CONSTEXPR T* operator ->() { + assert (initialized()); + return dataptr(); + } + + constexpr T const& operator *() const& { + return TR2_OPTIONAL_ASSERTED_EXPRESSION(initialized(), contained_val()); + } + + OPTIONAL_MUTABLE_CONSTEXPR T& operator *() & { + assert (initialized()); + return contained_val(); + } + + OPTIONAL_MUTABLE_CONSTEXPR T&& operator *() && { + assert (initialized()); + return constexpr_move(contained_val()); + } + + constexpr T const& value() const& { + return initialized() ? contained_val() : (throw bad_optional_access("bad optional access"), contained_val()); + } + + OPTIONAL_MUTABLE_CONSTEXPR T& value() & { + return initialized() ? contained_val() : (throw bad_optional_access("bad optional access"), contained_val()); + } + + OPTIONAL_MUTABLE_CONSTEXPR T&& value() && { + if (!initialized()) throw bad_optional_access("bad optional access"); + return std::move(contained_val()); + } + +# else + + T* operator ->() { + assert (initialized()); + return dataptr(); + } + + constexpr T const& operator *() const { + return TR2_OPTIONAL_ASSERTED_EXPRESSION(initialized(), contained_val()); + } + + T& operator *() { + assert (initialized()); + return contained_val(); + } + + constexpr T const& value() const { + return initialized() ? contained_val() : (throw bad_optional_access("bad optional access"), contained_val()); + } + + T& value() { + return initialized() ? contained_val() : (throw bad_optional_access("bad optional access"), contained_val()); + } + +# endif + +# if OPTIONAL_HAS_THIS_RVALUE_REFS == 1 + + template + constexpr T value_or(V&& v) const& + { + return *this ? **this : detail_::convert(constexpr_forward(v)); + } + +# if OPTIONAL_HAS_MOVE_ACCESSORS == 1 + + template + OPTIONAL_MUTABLE_CONSTEXPR T value_or(V&& v) && + { + return *this ? constexpr_move(const_cast&>(*this).contained_val()) : detail_::convert(constexpr_forward(v)); + } + +# else + + template + T value_or(V&& v) && + { + return *this ? constexpr_move(const_cast&>(*this).contained_val()) : detail_::convert(constexpr_forward(v)); + } + +# endif + +# else + + template + constexpr T value_or(V&& v) const + { + return *this ? **this : detail_::convert(constexpr_forward(v)); + } + +# endif + + // 20.6.3.6, modifiers + void reset() noexcept { clear(); } +}; + + +template +class optional +{ + static_assert( !std::is_same::value, "bad T" ); + static_assert( !std::is_same::value, "bad T" ); + T* ref; + +public: + + // 20.5.5.1, construction/destruction + constexpr optional() noexcept : ref(nullptr) {} + + constexpr optional(nullopt_t) noexcept : ref(nullptr) {} + + constexpr optional(T& v) noexcept : ref(detail_::static_addressof(v)) {} + + optional(T&&) = delete; + + constexpr optional(const optional& rhs) noexcept : ref(rhs.ref) {} + + explicit constexpr optional(in_place_t, T& v) noexcept : ref(detail_::static_addressof(v)) {} + + explicit optional(in_place_t, T&&) = delete; + + ~optional() = default; + + // 20.5.5.2, mutation + optional& operator=(nullopt_t) noexcept { + ref = nullptr; + return *this; + } + + // optional& operator=(const optional& rhs) noexcept { + // ref = rhs.ref; + // return *this; + // } + + // optional& operator=(optional&& rhs) noexcept { + // ref = rhs.ref; + // return *this; + // } + + template + auto operator=(U&& rhs) noexcept + -> typename enable_if + < + is_same::type, optional>::value, + optional& + >::type + { + ref = rhs.ref; + return *this; + } + + template + auto operator=(U&& rhs) noexcept + -> typename enable_if + < + !is_same::type, optional>::value, + optional& + >::type + = delete; + + void emplace(T& v) noexcept { + ref = detail_::static_addressof(v); + } + + void emplace(T&&) = delete; + + + void swap(optional& rhs) noexcept + { + std::swap(ref, rhs.ref); + } + + // 20.5.5.3, observers + constexpr T* operator->() const { + return TR2_OPTIONAL_ASSERTED_EXPRESSION(ref, ref); + } + + constexpr T& operator*() const { + return TR2_OPTIONAL_ASSERTED_EXPRESSION(ref, *ref); + } + + constexpr T& value() const { + return ref ? *ref : (throw bad_optional_access("bad optional access"), *ref); + } + + explicit constexpr operator bool() const noexcept { + return ref != nullptr; + } + + constexpr bool has_value() const noexcept { + return ref != nullptr; + } + + template + constexpr typename decay::type value_or(V&& v) const + { + return *this ? **this : detail_::convert::type>(constexpr_forward(v)); + } + + // x.x.x.x, modifiers + void reset() noexcept { ref = nullptr; } +}; + + +template +class optional +{ + static_assert( sizeof(T) == 0, "optional rvalue references disallowed" ); +}; + + +// 20.5.8, Relational operators +template constexpr bool operator==(const optional& x, const optional& y) +{ + return bool(x) != bool(y) ? false : bool(x) == false ? true : *x == *y; +} + +template constexpr bool operator!=(const optional& x, const optional& y) +{ + return !(x == y); +} + +template constexpr bool operator<(const optional& x, const optional& y) +{ + return (!y) ? false : (!x) ? true : *x < *y; +} + +template constexpr bool operator>(const optional& x, const optional& y) +{ + return (y < x); +} + +template constexpr bool operator<=(const optional& x, const optional& y) +{ + return !(y < x); +} + +template constexpr bool operator>=(const optional& x, const optional& y) +{ + return !(x < y); +} + + +// 20.5.9, Comparison with nullopt +template constexpr bool operator==(const optional& x, nullopt_t) noexcept +{ + return (!x); +} + +template constexpr bool operator==(nullopt_t, const optional& x) noexcept +{ + return (!x); +} + +template constexpr bool operator!=(const optional& x, nullopt_t) noexcept +{ + return bool(x); +} + +template constexpr bool operator!=(nullopt_t, const optional& x) noexcept +{ + return bool(x); +} + +template constexpr bool operator<(const optional&, nullopt_t) noexcept +{ + return false; +} + +template constexpr bool operator<(nullopt_t, const optional& x) noexcept +{ + return bool(x); +} + +template constexpr bool operator<=(const optional& x, nullopt_t) noexcept +{ + return (!x); +} + +template constexpr bool operator<=(nullopt_t, const optional&) noexcept +{ + return true; +} + +template constexpr bool operator>(const optional& x, nullopt_t) noexcept +{ + return bool(x); +} + +template constexpr bool operator>(nullopt_t, const optional&) noexcept +{ + return false; +} + +template constexpr bool operator>=(const optional&, nullopt_t) noexcept +{ + return true; +} + +template constexpr bool operator>=(nullopt_t, const optional& x) noexcept +{ + return (!x); +} + + + +// 20.5.10, Comparison with T +template constexpr bool operator==(const optional& x, const T& v) +{ + return bool(x) ? *x == v : false; +} + +template constexpr bool operator==(const T& v, const optional& x) +{ + return bool(x) ? v == *x : false; +} + +template constexpr bool operator!=(const optional& x, const T& v) +{ + return bool(x) ? *x != v : true; +} + +template constexpr bool operator!=(const T& v, const optional& x) +{ + return bool(x) ? v != *x : true; +} + +template constexpr bool operator<(const optional& x, const T& v) +{ + return bool(x) ? *x < v : true; +} + +template constexpr bool operator>(const T& v, const optional& x) +{ + return bool(x) ? v > *x : true; +} + +template constexpr bool operator>(const optional& x, const T& v) +{ + return bool(x) ? *x > v : false; +} + +template constexpr bool operator<(const T& v, const optional& x) +{ + return bool(x) ? v < *x : false; +} + +template constexpr bool operator>=(const optional& x, const T& v) +{ + return bool(x) ? *x >= v : false; +} + +template constexpr bool operator<=(const T& v, const optional& x) +{ + return bool(x) ? v <= *x : false; +} + +template constexpr bool operator<=(const optional& x, const T& v) +{ + return bool(x) ? *x <= v : true; +} + +template constexpr bool operator>=(const T& v, const optional& x) +{ + return bool(x) ? v >= *x : true; +} + + +// Comparison of optional with T +template constexpr bool operator==(const optional& x, const T& v) +{ + return bool(x) ? *x == v : false; +} + +template constexpr bool operator==(const T& v, const optional& x) +{ + return bool(x) ? v == *x : false; +} + +template constexpr bool operator!=(const optional& x, const T& v) +{ + return bool(x) ? *x != v : true; +} + +template constexpr bool operator!=(const T& v, const optional& x) +{ + return bool(x) ? v != *x : true; +} + +template constexpr bool operator<(const optional& x, const T& v) +{ + return bool(x) ? *x < v : true; +} + +template constexpr bool operator>(const T& v, const optional& x) +{ + return bool(x) ? v > *x : true; +} + +template constexpr bool operator>(const optional& x, const T& v) +{ + return bool(x) ? *x > v : false; +} + +template constexpr bool operator<(const T& v, const optional& x) +{ + return bool(x) ? v < *x : false; +} + +template constexpr bool operator>=(const optional& x, const T& v) +{ + return bool(x) ? *x >= v : false; +} + +template constexpr bool operator<=(const T& v, const optional& x) +{ + return bool(x) ? v <= *x : false; +} + +template constexpr bool operator<=(const optional& x, const T& v) +{ + return bool(x) ? *x <= v : true; +} + +template constexpr bool operator>=(const T& v, const optional& x) +{ + return bool(x) ? v >= *x : true; +} + +// Comparison of optional with T +template constexpr bool operator==(const optional& x, const T& v) +{ + return bool(x) ? *x == v : false; +} + +template constexpr bool operator==(const T& v, const optional& x) +{ + return bool(x) ? v == *x : false; +} + +template constexpr bool operator!=(const optional& x, const T& v) +{ + return bool(x) ? *x != v : true; +} + +template constexpr bool operator!=(const T& v, const optional& x) +{ + return bool(x) ? v != *x : true; +} + +template constexpr bool operator<(const optional& x, const T& v) +{ + return bool(x) ? *x < v : true; +} + +template constexpr bool operator>(const T& v, const optional& x) +{ + return bool(x) ? v > *x : true; +} + +template constexpr bool operator>(const optional& x, const T& v) +{ + return bool(x) ? *x > v : false; +} + +template constexpr bool operator<(const T& v, const optional& x) +{ + return bool(x) ? v < *x : false; +} + +template constexpr bool operator>=(const optional& x, const T& v) +{ + return bool(x) ? *x >= v : false; +} + +template constexpr bool operator<=(const T& v, const optional& x) +{ + return bool(x) ? v <= *x : false; +} + +template constexpr bool operator<=(const optional& x, const T& v) +{ + return bool(x) ? *x <= v : true; +} + +template constexpr bool operator>=(const T& v, const optional& x) +{ + return bool(x) ? v >= *x : true; +} + + +// 20.5.12, Specialized algorithms +template +void swap(optional& x, optional& y) noexcept(noexcept(x.swap(y))) +{ + x.swap(y); +} + + +template +constexpr optional::type> make_optional(T&& v) +{ + return optional::type>(constexpr_forward(v)); +} + +template +constexpr optional make_optional(reference_wrapper v) +{ + return optional(v.get()); +} + + +} // namespace experimental +} // namespace std + +namespace std +{ + template + struct hash> + { + typedef typename hash::result_type result_type; + typedef std::experimental::optional argument_type; + + constexpr result_type operator()(argument_type const& arg) const { + return arg ? std::hash{}(*arg) : result_type{}; + } + }; + + template + struct hash> + { + typedef typename hash::result_type result_type; + typedef std::experimental::optional argument_type; + + constexpr result_type operator()(argument_type const& arg) const { + return arg ? std::hash{}(*arg) : result_type{}; + } + }; +} + +# undef TR2_OPTIONAL_REQUIRES +# undef TR2_OPTIONAL_ASSERTED_EXPRESSION + +# endif //___OPTIONAL_HPP___ diff --git a/src/3rdparty/mapbox-gl-native/deps/polylabel/1.0.3/LICENSE b/src/3rdparty/mapbox-gl-native/deps/polylabel/1.0.3/LICENSE new file mode 100644 index 0000000..9be4a96 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/polylabel/1.0.3/LICENSE @@ -0,0 +1,14 @@ +ISC License +Copyright (c) 2016 Mapbox + +Permission to use, copy, modify, and/or distribute this software for any purpose +with or without fee is hereby granted, provided that the above copyright notice +and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH REGARD TO +THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. +IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR +CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA +OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS +ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. diff --git a/src/3rdparty/mapbox-gl-native/deps/polylabel/1.0.3/include/mapbox/polylabel.hpp b/src/3rdparty/mapbox-gl-native/deps/polylabel/1.0.3/include/mapbox/polylabel.hpp new file mode 100644 index 0000000..0e9e2b5 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/polylabel/1.0.3/include/mapbox/polylabel.hpp @@ -0,0 +1,178 @@ +#pragma once + +#include +#include +#include +#include + +#include +#include +#include +#include + +namespace mapbox { + +namespace detail { + +// get squared distance from a point to a segment +template +T getSegDistSq(const geometry::point& p, + const geometry::point& a, + const geometry::point& b) { + auto x = a.x; + auto y = a.y; + auto dx = b.x - x; + auto dy = b.y - y; + + if (dx != 0 || dy != 0) { + + auto t = ((p.x - x) * dx + (p.y - y) * dy) / (dx * dx + dy * dy); + + if (t > 1) { + x = b.x; + y = b.y; + + } else if (t > 0) { + x += dx * t; + y += dy * t; + } + } + + dx = p.x - x; + dy = p.y - y; + + return dx * dx + dy * dy; +} + +// signed distance from point to polygon outline (negative if point is outside) +template +auto pointToPolygonDist(const geometry::point& point, const geometry::polygon& polygon) { + bool inside = false; + auto minDistSq = std::numeric_limits::infinity(); + + for (const auto& ring : polygon) { + for (std::size_t i = 0, len = ring.size(), j = len - 1; i < len; j = i++) { + const auto& a = ring[i]; + const auto& b = ring[j]; + + if ((a.y > point.y) != (b.y > point.y) && + (point.x < (b.x - a.x) * (point.y - a.y) / (b.y - a.y) + a.x)) inside = !inside; + + minDistSq = std::min(minDistSq, getSegDistSq(point, a, b)); + } + } + + return (inside ? 1 : -1) * std::sqrt(minDistSq); +} + +template +struct Cell { + Cell(const geometry::point& c_, T h_, const geometry::polygon& polygon) + : c(c_), + h(h_), + d(pointToPolygonDist(c, polygon)), + max(d + h * std::sqrt(2)) + {} + + geometry::point c; // cell center + T h; // half the cell size + T d; // distance from cell center to polygon + T max; // max distance to polygon within a cell +}; + +// get polygon centroid +template +Cell getCentroidCell(const geometry::polygon& polygon) { + T area = 0; + geometry::point c { 0, 0 }; + const auto& ring = polygon.at(0); + + for (std::size_t i = 0, len = ring.size(), j = len - 1; i < len; j = i++) { + const geometry::point& a = ring[i]; + const geometry::point& b = ring[j]; + auto f = a.x * b.y - b.x * a.y; + c.x += (a.x + b.x) * f; + c.y += (a.y + b.y) * f; + area += f * 3; + } + + return Cell(area == 0 ? ring.at(0) : c / area, 0, polygon); +} + +} // namespace detail + +template +geometry::point polylabel(const geometry::polygon& polygon, T precision = 1, bool debug = false) { + using namespace detail; + + // find the bounding box of the outer ring + const geometry::box envelope = geometry::envelope(polygon.at(0)); + + const geometry::point size { + envelope.max.x - envelope.min.x, + envelope.max.y - envelope.min.y + }; + + const T cellSize = std::min(size.x, size.y); + T h = cellSize / 2; + + // a priority queue of cells in order of their "potential" (max distance to polygon) + auto compareMax = [] (const Cell& a, const Cell& b) { + return a.max < b.max; + }; + using Queue = std::priority_queue, std::vector>, decltype(compareMax)>; + Queue cellQueue(compareMax); + + if (cellSize == 0) { + return envelope.min; + } + + // cover polygon with initial cells + for (T x = envelope.min.x; x < envelope.max.x; x += cellSize) { + for (T y = envelope.min.y; y < envelope.max.y; y += cellSize) { + cellQueue.push(Cell({x + h, y + h}, h, polygon)); + } + } + + // take centroid as the first best guess + auto bestCell = getCentroidCell(polygon); + + // special case for rectangular polygons + Cell bboxCell(envelope.min + size / 2.0, 0, polygon); + if (bboxCell.d > bestCell.d) { + bestCell = bboxCell; + } + + auto numProbes = cellQueue.size(); + while (!cellQueue.empty()) { + // pick the most promising cell from the queue + auto cell = cellQueue.top(); + cellQueue.pop(); + + // update the best cell if we found a better one + if (cell.d > bestCell.d) { + bestCell = cell; + if (debug) std::cout << "found best " << ::round(1e4 * cell.d) / 1e4 << " after " << numProbes << " probes" << std::endl; + } + + // do not drill down further if there's no chance of a better solution + if (cell.max - bestCell.d <= precision) continue; + + // split the cell into four cells + h = cell.h / 2; + cellQueue.push(Cell({cell.c.x - h, cell.c.y - h}, h, polygon)); + cellQueue.push(Cell({cell.c.x + h, cell.c.y - h}, h, polygon)); + cellQueue.push(Cell({cell.c.x - h, cell.c.y + h}, h, polygon)); + cellQueue.push(Cell({cell.c.x + h, cell.c.y + h}, h, polygon)); + numProbes += 4; + } + + if (debug) { + std::cout << "num probes: " << numProbes << std::endl; + std::cout << "best distance: " << bestCell.d << std::endl; + } + + return bestCell.c; +} + +} // namespace mapbox diff --git a/src/3rdparty/mapbox-gl-native/deps/protozero/1.5.2/include/protozero/byteswap.hpp b/src/3rdparty/mapbox-gl-native/deps/protozero/1.5.2/include/protozero/byteswap.hpp new file mode 100644 index 0000000..bca4844 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/protozero/1.5.2/include/protozero/byteswap.hpp @@ -0,0 +1,84 @@ +#ifndef PROTOZERO_BYTESWAP_HPP +#define PROTOZERO_BYTESWAP_HPP + +/***************************************************************************** + +protozero - Minimalistic protocol buffer decoder and encoder in C++. + +This file is from https://github.com/mapbox/protozero where you can find more +documentation. + +*****************************************************************************/ + +/** + * @file byteswap.hpp + * + * @brief Contains functions to swap bytes in values (for different endianness). + */ + +#include +#include + +#include + +namespace protozero { +namespace detail { + +inline uint32_t byteswap_impl(uint32_t value) noexcept { +#ifdef PROTOZERO_USE_BUILTIN_BSWAP + return __builtin_bswap32(value); +#else + return ((value & 0xff000000) >> 24) | + ((value & 0x00ff0000) >> 8) | + ((value & 0x0000ff00) << 8) | + ((value & 0x000000ff) << 24); +#endif +} + +inline uint64_t byteswap_impl(uint64_t value) noexcept { +#ifdef PROTOZERO_USE_BUILTIN_BSWAP + return __builtin_bswap64(value); +#else + return ((value & 0xff00000000000000ULL) >> 56) | + ((value & 0x00ff000000000000ULL) >> 40) | + ((value & 0x0000ff0000000000ULL) >> 24) | + ((value & 0x000000ff00000000ULL) >> 8) | + ((value & 0x00000000ff000000ULL) << 8) | + ((value & 0x0000000000ff0000ULL) << 24) | + ((value & 0x000000000000ff00ULL) << 40) | + ((value & 0x00000000000000ffULL) << 56); +#endif +} + +inline void byteswap_inplace(uint32_t* ptr) noexcept { + *ptr = byteswap_impl(*ptr); +} + +inline void byteswap_inplace(uint64_t* ptr) noexcept { + *ptr = byteswap_impl(*ptr); +} + +inline void byteswap_inplace(int32_t* ptr) noexcept { + auto bptr = reinterpret_cast(ptr); + *bptr = byteswap_impl(*bptr); +} + +inline void byteswap_inplace(int64_t* ptr) noexcept { + auto bptr = reinterpret_cast(ptr); + *bptr = byteswap_impl(*bptr); +} + +inline void byteswap_inplace(float* ptr) noexcept { + auto bptr = reinterpret_cast(ptr); + *bptr = byteswap_impl(*bptr); +} + +inline void byteswap_inplace(double* ptr) noexcept { + auto bptr = reinterpret_cast(ptr); + *bptr = byteswap_impl(*bptr); +} + +} // end namespace detail +} // end namespace protozero + +#endif // PROTOZERO_BYTESWAP_HPP diff --git a/src/3rdparty/mapbox-gl-native/deps/protozero/1.5.2/include/protozero/config.hpp b/src/3rdparty/mapbox-gl-native/deps/protozero/1.5.2/include/protozero/config.hpp new file mode 100644 index 0000000..6fc7749 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/protozero/1.5.2/include/protozero/config.hpp @@ -0,0 +1,48 @@ +#ifndef PROTOZERO_CONFIG_HPP +#define PROTOZERO_CONFIG_HPP + +/***************************************************************************** + +protozero - Minimalistic protocol buffer decoder and encoder in C++. + +This file is from https://github.com/mapbox/protozero where you can find more +documentation. + +*****************************************************************************/ + +#include + +/** + * @file config.hpp + * + * @brief Contains macro checks for different configurations. + */ + +#define PROTOZERO_LITTLE_ENDIAN 1234 +#define PROTOZERO_BIG_ENDIAN 4321 + +// Find out which byte order the machine has. +#if defined(__BYTE_ORDER) +# if (__BYTE_ORDER == __LITTLE_ENDIAN) +# define PROTOZERO_BYTE_ORDER PROTOZERO_LITTLE_ENDIAN +# endif +# if (__BYTE_ORDER == __BIG_ENDIAN) +# define PROTOZERO_BYTE_ORDER PROTOZERO_BIG_ENDIAN +# endif +#else +// This probably isn't a very good default, but might do until we figure +// out something better. +# define PROTOZERO_BYTE_ORDER PROTOZERO_LITTLE_ENDIAN +#endif + +// Check whether __builtin_bswap is available +#if defined(__GNUC__) || defined(__clang__) +# define PROTOZERO_USE_BUILTIN_BSWAP +#endif + +// Wrapper for assert() used for testing +#ifndef protozero_assert +# define protozero_assert(x) assert(x) +#endif + +#endif // PROTOZERO_CONFIG_HPP diff --git a/src/3rdparty/mapbox-gl-native/deps/protozero/1.5.2/include/protozero/exception.hpp b/src/3rdparty/mapbox-gl-native/deps/protozero/1.5.2/include/protozero/exception.hpp new file mode 100644 index 0000000..ca4340e --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/protozero/1.5.2/include/protozero/exception.hpp @@ -0,0 +1,68 @@ +#ifndef PROTOZERO_EXCEPTION_HPP +#define PROTOZERO_EXCEPTION_HPP + +/***************************************************************************** + +protozero - Minimalistic protocol buffer decoder and encoder in C++. + +This file is from https://github.com/mapbox/protozero where you can find more +documentation. + +*****************************************************************************/ + +/** + * @file exception.hpp + * + * @brief Contains the exceptions used in the protozero library. + */ + +#include + +/** + * @brief All parts of the protozero header-only library are in this namespace. + */ +namespace protozero { + +/** + * All exceptions explicitly thrown by the functions of the protozero library + * derive from this exception. + */ +struct exception : std::exception { + /// Returns the explanatory string. + const char* what() const noexcept override { return "pbf exception"; } +}; + +/** + * This exception is thrown when parsing a varint thats larger than allowed. + * This should never happen unless the data is corrupted. + */ +struct varint_too_long_exception : exception { + /// Returns the explanatory string. + const char* what() const noexcept override { return "varint too long exception"; } +}; + +/** + * This exception is thrown when the wire type of a pdf field is unknown. + * This should never happen unless the data is corrupted. + */ +struct unknown_pbf_wire_type_exception : exception { + /// Returns the explanatory string. + const char* what() const noexcept override { return "unknown pbf field type exception"; } +}; + +/** + * This exception is thrown when we are trying to read a field and there + * are not enough bytes left in the buffer to read it. Almost all functions + * of the pbf_reader class can throw this exception. + * + * This should never happen unless the data is corrupted or you have + * initialized the pbf_reader object with incomplete data. + */ +struct end_of_buffer_exception : exception { + /// Returns the explanatory string. + const char* what() const noexcept override { return "end of buffer exception"; } +}; + +} // end namespace protozero + +#endif // PROTOZERO_EXCEPTION_HPP diff --git a/src/3rdparty/mapbox-gl-native/deps/protozero/1.5.2/include/protozero/iterators.hpp b/src/3rdparty/mapbox-gl-native/deps/protozero/1.5.2/include/protozero/iterators.hpp new file mode 100644 index 0000000..a19f202 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/protozero/1.5.2/include/protozero/iterators.hpp @@ -0,0 +1,328 @@ +#ifndef PROTOZERO_ITERATORS_HPP +#define PROTOZERO_ITERATORS_HPP + +/***************************************************************************** + +protozero - Minimalistic protocol buffer decoder and encoder in C++. + +This file is from https://github.com/mapbox/protozero where you can find more +documentation. + +*****************************************************************************/ + +/** + * @file iterators.hpp + * + * @brief Contains the iterators for access to packed repeated fields. + */ + +#include +#include +#include + +#include +#include + +#if PROTOZERO_BYTE_ORDER != PROTOZERO_LITTLE_ENDIAN +# include +#endif + +namespace protozero { + +/** + * A range of iterators based on std::pair. Created from beginning and + * end iterators. Used as a return type from some pbf_reader methods + * that is easy to use with range-based for loops. + */ +template > +class iterator_range : +#ifdef PROTOZERO_STRICT_API + protected +#else + public +#endif + P { + +public: + + /// The type of the iterators in this range. + using iterator = T; + + /// The value type of the underlying iterator. + using value_type = typename std::iterator_traits::value_type; + + /** + * Default constructor. Create empty iterator_range. + */ + constexpr iterator_range() : + P(iterator{}, iterator{}) { + } + + /** + * Create iterator range from two iterators. + * + * @param first_iterator Iterator to beginning or range. + * @param last_iterator Iterator to end or range. + */ + constexpr iterator_range(iterator&& first_iterator, iterator&& last_iterator) : + P(std::forward(first_iterator), + std::forward(last_iterator)) { + } + + /// Return iterator to beginning of range. + constexpr iterator begin() const noexcept { + return this->first; + } + + /// Return iterator to end of range. + constexpr iterator end() const noexcept { + return this->second; + } + + /// Return iterator to beginning of range. + constexpr iterator cbegin() const noexcept { + return this->first; + } + + /// Return iterator to end of range. + constexpr iterator cend() const noexcept { + return this->second; + } + + /// Return true if this range is empty. + constexpr std::size_t empty() const noexcept { + return begin() == end(); + } + + /** + * Get element at the beginning of the range. + * + * @pre Range must not be empty. + */ + value_type front() const { + protozero_assert(!empty()); + return *(this->first); + } + + /** + * Advance beginning of range by one. + * + * @pre Range must not be empty. + */ + void drop_front() { + protozero_assert(!empty()); + ++this->first; + } + + /** + * Swap the contents of this range with the other. + * + * @param other Other range to swap data with. + */ + void swap(iterator_range& other) noexcept { + using std::swap; + swap(this->first, other.first); + swap(this->second, other.second); + } + +}; // struct iterator_range + +/** + * Swap two iterator_ranges. + * + * @param lhs First range. + * @param rhs Second range. + */ +template +inline void swap(iterator_range& lhs, iterator_range& rhs) noexcept { + lhs.swap(rhs); +} + +/** + * A forward iterator used for accessing packed repeated fields of fixed + * length (fixed32, sfixed32, float, double). + */ +template +class const_fixed_iterator { + + /// Pointer to current iterator position + const char* m_data; + + /// Pointer to end iterator position + const char* m_end; + +public: + + using iterator_category = std::forward_iterator_tag; + using value_type = T; + using difference_type = std::ptrdiff_t; + using pointer = value_type*; + using reference = value_type&; + + const_fixed_iterator() noexcept : + m_data(nullptr), + m_end(nullptr) { + } + + const_fixed_iterator(const char* data, const char* end) noexcept : + m_data(data), + m_end(end) { + } + + const_fixed_iterator(const const_fixed_iterator&) noexcept = default; + const_fixed_iterator(const_fixed_iterator&&) noexcept = default; + + const_fixed_iterator& operator=(const const_fixed_iterator&) noexcept = default; + const_fixed_iterator& operator=(const_fixed_iterator&&) noexcept = default; + + ~const_fixed_iterator() noexcept = default; + + value_type operator*() const { + value_type result; + std::memcpy(&result, m_data, sizeof(value_type)); +#if PROTOZERO_BYTE_ORDER != PROTOZERO_LITTLE_ENDIAN + detail::byteswap_inplace(&result); +#endif + return result; + } + + const_fixed_iterator& operator++() { + m_data += sizeof(value_type); + return *this; + } + + const_fixed_iterator operator++(int) { + const const_fixed_iterator tmp(*this); + ++(*this); + return tmp; + } + + bool operator==(const const_fixed_iterator& rhs) const noexcept { + return m_data == rhs.m_data && m_end == rhs.m_end; + } + + bool operator!=(const const_fixed_iterator& rhs) const noexcept { + return !(*this == rhs); + } + +}; // class const_fixed_iterator + +/** + * A forward iterator used for accessing packed repeated varint fields + * (int32, uint32, int64, uint64, bool, enum). + */ +template +class const_varint_iterator { + +protected: + + /// Pointer to current iterator position + const char* m_data; + + /// Pointer to end iterator position + const char* m_end; + +public: + + using iterator_category = std::forward_iterator_tag; + using value_type = T; + using difference_type = std::ptrdiff_t; + using pointer = value_type*; + using reference = value_type&; + + const_varint_iterator() noexcept : + m_data(nullptr), + m_end(nullptr) { + } + + const_varint_iterator(const char* data, const char* end) noexcept : + m_data(data), + m_end(end) { + } + + const_varint_iterator(const const_varint_iterator&) noexcept = default; + const_varint_iterator(const_varint_iterator&&) noexcept = default; + + const_varint_iterator& operator=(const const_varint_iterator&) noexcept = default; + const_varint_iterator& operator=(const_varint_iterator&&) noexcept = default; + + ~const_varint_iterator() noexcept = default; + + value_type operator*() const { + const char* d = m_data; // will be thrown away + return static_cast(decode_varint(&d, m_end)); + } + + const_varint_iterator& operator++() { + skip_varint(&m_data, m_end); + return *this; + } + + const_varint_iterator operator++(int) { + const const_varint_iterator tmp(*this); + ++(*this); + return tmp; + } + + bool operator==(const const_varint_iterator& rhs) const noexcept { + return m_data == rhs.m_data && m_end == rhs.m_end; + } + + bool operator!=(const const_varint_iterator& rhs) const noexcept { + return !(*this == rhs); + } + +}; // class const_varint_iterator + +/** + * A forward iterator used for accessing packed repeated svarint fields + * (sint32, sint64). + */ +template +class const_svarint_iterator : public const_varint_iterator { + +public: + + using iterator_category = std::forward_iterator_tag; + using value_type = T; + using difference_type = std::ptrdiff_t; + using pointer = value_type*; + using reference = value_type&; + + const_svarint_iterator() noexcept : + const_varint_iterator() { + } + + const_svarint_iterator(const char* data, const char* end) noexcept : + const_varint_iterator(data, end) { + } + + const_svarint_iterator(const const_svarint_iterator&) = default; + const_svarint_iterator(const_svarint_iterator&&) = default; + + const_svarint_iterator& operator=(const const_svarint_iterator&) = default; + const_svarint_iterator& operator=(const_svarint_iterator&&) = default; + + ~const_svarint_iterator() = default; + + value_type operator*() const { + const char* d = this->m_data; // will be thrown away + return static_cast(decode_zigzag64(decode_varint(&d, this->m_end))); + } + + const_svarint_iterator& operator++() { + skip_varint(&this->m_data, this->m_end); + return *this; + } + + const_svarint_iterator operator++(int) { + const const_svarint_iterator tmp(*this); + ++(*this); + return tmp; + } + +}; // class const_svarint_iterator + +} // end namespace protozero + +#endif // PROTOZERO_ITERATORS_HPP diff --git a/src/3rdparty/mapbox-gl-native/deps/protozero/1.5.2/include/protozero/pbf_builder.hpp b/src/3rdparty/mapbox-gl-native/deps/protozero/1.5.2/include/protozero/pbf_builder.hpp new file mode 100644 index 0000000..8197395 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/protozero/1.5.2/include/protozero/pbf_builder.hpp @@ -0,0 +1,160 @@ +#ifndef PROTOZERO_PBF_BUILDER_HPP +#define PROTOZERO_PBF_BUILDER_HPP + +/***************************************************************************** + +protozero - Minimalistic protocol buffer decoder and encoder in C++. + +This file is from https://github.com/mapbox/protozero where you can find more +documentation. + +*****************************************************************************/ + +/** + * @file pbf_builder.hpp + * + * @brief Contains the pbf_builder template class. + */ + +#include + +#include +#include + +namespace protozero { + +/** + * The pbf_builder is used to write PBF formatted messages into a buffer. It + * is based on the pbf_writer class and has all the same methods. The + * difference is that while the pbf_writer class takes an integer tag, + * this template class takes a tag of the template type T. The idea is that + * T will be an enumeration value and this helps reduce the possibility of + * programming errors. + * + * Almost all methods in this class can throw an std::bad_alloc exception if + * the std::string used as a buffer wants to resize. + * + * Read the tutorial to understand how this class is used. + */ +template +class pbf_builder : public pbf_writer { + + static_assert(std::is_same::type>::value, + "T must be enum with underlying type protozero::pbf_tag_type"); + +public: + + using enum_type = T; + + explicit pbf_builder(std::string& data) noexcept : + pbf_writer(data) { + } + + template + pbf_builder(pbf_writer& parent_writer, P tag) noexcept : + pbf_writer(parent_writer, pbf_tag_type(tag)) { + } + +/// @cond INTERNAL +#define PROTOZERO_WRITER_WRAP_ADD_SCALAR(name, type) \ + void add_##name(T tag, type value) { \ + pbf_writer::add_##name(pbf_tag_type(tag), value); \ + } + + PROTOZERO_WRITER_WRAP_ADD_SCALAR(bool, bool) + PROTOZERO_WRITER_WRAP_ADD_SCALAR(enum, int32_t) + PROTOZERO_WRITER_WRAP_ADD_SCALAR(int32, int32_t) + PROTOZERO_WRITER_WRAP_ADD_SCALAR(sint32, int32_t) + PROTOZERO_WRITER_WRAP_ADD_SCALAR(uint32, uint32_t) + PROTOZERO_WRITER_WRAP_ADD_SCALAR(int64, int64_t) + PROTOZERO_WRITER_WRAP_ADD_SCALAR(sint64, int64_t) + PROTOZERO_WRITER_WRAP_ADD_SCALAR(uint64, uint64_t) + PROTOZERO_WRITER_WRAP_ADD_SCALAR(fixed32, uint32_t) + PROTOZERO_WRITER_WRAP_ADD_SCALAR(sfixed32, int32_t) + PROTOZERO_WRITER_WRAP_ADD_SCALAR(fixed64, uint64_t) + PROTOZERO_WRITER_WRAP_ADD_SCALAR(sfixed64, int64_t) + PROTOZERO_WRITER_WRAP_ADD_SCALAR(float, float) + PROTOZERO_WRITER_WRAP_ADD_SCALAR(double, double) + +#undef PROTOZERO_WRITER_WRAP_ADD_SCALAR +/// @endcond + + void add_bytes(T tag, const char* value, std::size_t size) { + pbf_writer::add_bytes(pbf_tag_type(tag), value, size); + } + + void add_bytes(T tag, const data_view& value) { + pbf_writer::add_bytes(pbf_tag_type(tag), value); + } + + void add_bytes(T tag, const std::string& value) { + pbf_writer::add_bytes(pbf_tag_type(tag), value); + } + + void add_bytes(T tag, const char* value) { + pbf_writer::add_bytes(pbf_tag_type(tag), value); + } + + template + void add_bytes_vectored(T tag, Ts&&... values) { + pbf_writer::add_bytes_vectored(pbf_tag_type(tag), std::forward(values)...); + } + + void add_string(T tag, const char* value, std::size_t size) { + pbf_writer::add_string(pbf_tag_type(tag), value, size); + } + + void add_string(T tag, const data_view& value) { + pbf_writer::add_string(pbf_tag_type(tag), value); + } + + void add_string(T tag, const std::string& value) { + pbf_writer::add_string(pbf_tag_type(tag), value); + } + + void add_string(T tag, const char* value) { + pbf_writer::add_string(pbf_tag_type(tag), value); + } + + void add_message(T tag, const char* value, std::size_t size) { + pbf_writer::add_message(pbf_tag_type(tag), value, size); + } + + void add_message(T tag, const data_view& value) { + pbf_writer::add_message(pbf_tag_type(tag), value); + } + + void add_message(T tag, const std::string& value) { + pbf_writer::add_message(pbf_tag_type(tag), value); + } + +/// @cond INTERNAL +#define PROTOZERO_WRITER_WRAP_ADD_PACKED(name) \ + template \ + void add_packed_##name(T tag, InputIterator first, InputIterator last) { \ + pbf_writer::add_packed_##name(pbf_tag_type(tag), first, last); \ + } + + PROTOZERO_WRITER_WRAP_ADD_PACKED(bool) + PROTOZERO_WRITER_WRAP_ADD_PACKED(enum) + PROTOZERO_WRITER_WRAP_ADD_PACKED(int32) + PROTOZERO_WRITER_WRAP_ADD_PACKED(sint32) + PROTOZERO_WRITER_WRAP_ADD_PACKED(uint32) + PROTOZERO_WRITER_WRAP_ADD_PACKED(int64) + PROTOZERO_WRITER_WRAP_ADD_PACKED(sint64) + PROTOZERO_WRITER_WRAP_ADD_PACKED(uint64) + PROTOZERO_WRITER_WRAP_ADD_PACKED(fixed32) + PROTOZERO_WRITER_WRAP_ADD_PACKED(sfixed32) + PROTOZERO_WRITER_WRAP_ADD_PACKED(fixed64) + PROTOZERO_WRITER_WRAP_ADD_PACKED(sfixed64) + PROTOZERO_WRITER_WRAP_ADD_PACKED(float) + PROTOZERO_WRITER_WRAP_ADD_PACKED(double) + +#undef PROTOZERO_WRITER_WRAP_ADD_PACKED +/// @endcond + +}; // class pbf_builder + +} // end namespace protozero + +#endif // PROTOZERO_PBF_BUILDER_HPP diff --git a/src/3rdparty/mapbox-gl-native/deps/protozero/1.5.2/include/protozero/pbf_message.hpp b/src/3rdparty/mapbox-gl-native/deps/protozero/1.5.2/include/protozero/pbf_message.hpp new file mode 100644 index 0000000..c599cf1 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/protozero/1.5.2/include/protozero/pbf_message.hpp @@ -0,0 +1,98 @@ +#ifndef PROTOZERO_PBF_MESSAGE_HPP +#define PROTOZERO_PBF_MESSAGE_HPP + +/***************************************************************************** + +protozero - Minimalistic protocol buffer decoder and encoder in C++. + +This file is from https://github.com/mapbox/protozero where you can find more +documentation. + +*****************************************************************************/ + +/** + * @file pbf_message.hpp + * + * @brief Contains the pbf_message template class. + */ + +#include + +#include +#include + +namespace protozero { + +/** + * This class represents a protobuf message. Either a top-level message or + * a nested sub-message. Top-level messages can be created from any buffer + * with a pointer and length: + * + * @code + * enum class Message : protozero::pbf_tag_type { + * ... + * }; + * + * std::string buffer; + * // fill buffer... + * pbf_message message(buffer.data(), buffer.size()); + * @endcode + * + * Sub-messages are created using get_message(): + * + * @code + * enum class SubMessage : protozero::pbf_tag_type { + * ... + * }; + * + * pbf_message message(...); + * message.next(); + * pbf_message submessage = message.get_message(); + * @endcode + * + * All methods of the pbf_message class except get_bytes() and get_string() + * provide the strong exception guarantee, ie they either succeed or do not + * change the pbf_message object they are called on. Use the get_data() method + * instead of get_bytes() or get_string(), if you need this guarantee. + * + * This template class is based on the pbf_reader class and has all the same + * methods. The difference is that whereever the pbf_reader class takes an + * integer tag, this template class takes a tag of the template type T. + * + * Read the tutorial to understand how this class is used. + */ +template +class pbf_message : public pbf_reader { + + static_assert(std::is_same::type>::value, "T must be enum with underlying type protozero::pbf_tag_type"); + +public: + + using enum_type = T; + + template + pbf_message(Args&&... args) noexcept : + pbf_reader(std::forward(args)...) { + } + + bool next() { + return pbf_reader::next(); + } + + bool next(T next_tag) { + return pbf_reader::next(pbf_tag_type(next_tag)); + } + + bool next(T next_tag, pbf_wire_type type) { + return pbf_reader::next(pbf_tag_type(next_tag), type); + } + + T tag() const noexcept { + return T(pbf_reader::tag()); + } + +}; // class pbf_message + +} // end namespace protozero + +#endif // PROTOZERO_PBF_MESSAGE_HPP diff --git a/src/3rdparty/mapbox-gl-native/deps/protozero/1.5.2/include/protozero/pbf_reader.hpp b/src/3rdparty/mapbox-gl-native/deps/protozero/1.5.2/include/protozero/pbf_reader.hpp new file mode 100644 index 0000000..905ca0a --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/protozero/1.5.2/include/protozero/pbf_reader.hpp @@ -0,0 +1,952 @@ +#ifndef PROTOZERO_PBF_READER_HPP +#define PROTOZERO_PBF_READER_HPP + +/***************************************************************************** + +protozero - Minimalistic protocol buffer decoder and encoder in C++. + +This file is from https://github.com/mapbox/protozero where you can find more +documentation. + +*****************************************************************************/ + +/** + * @file pbf_reader.hpp + * + * @brief Contains the pbf_reader class. + */ + +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#if PROTOZERO_BYTE_ORDER != PROTOZERO_LITTLE_ENDIAN +# include +#endif + +namespace protozero { + +/** + * This class represents a protobuf message. Either a top-level message or + * a nested sub-message. Top-level messages can be created from any buffer + * with a pointer and length: + * + * @code + * std::string buffer; + * // fill buffer... + * pbf_reader message(buffer.data(), buffer.size()); + * @endcode + * + * Sub-messages are created using get_message(): + * + * @code + * pbf_reader message(...); + * message.next(); + * pbf_reader submessage = message.get_message(); + * @endcode + * + * All methods of the pbf_reader class except get_bytes() and get_string() + * provide the strong exception guarantee, ie they either succeed or do not + * change the pbf_reader object they are called on. Use the get_view() method + * instead of get_bytes() or get_string(), if you need this guarantee. + */ +class pbf_reader { + + // A pointer to the next unread data. + const char* m_data = nullptr; + + // A pointer to one past the end of data. + const char* m_end = nullptr; + + // The wire type of the current field. + pbf_wire_type m_wire_type = pbf_wire_type::unknown; + + // The tag of the current field. + pbf_tag_type m_tag = 0; + + template + T get_fixed() { + T result; + skip_bytes(sizeof(T)); + std::memcpy(&result, m_data - sizeof(T), sizeof(T)); +#if PROTOZERO_BYTE_ORDER != PROTOZERO_LITTLE_ENDIAN + detail::byteswap_inplace(&result); +#endif + return result; + } + + template + iterator_range> packed_fixed() { + protozero_assert(tag() != 0 && "call next() before accessing field value"); + const auto len = get_len_and_skip(); + protozero_assert(len % sizeof(T) == 0); + return iterator_range>{const_fixed_iterator(m_data - len, m_data), + const_fixed_iterator(m_data, m_data)}; + } + + template + T get_varint() { + return static_cast(decode_varint(&m_data, m_end)); + } + + template + T get_svarint() { + protozero_assert((has_wire_type(pbf_wire_type::varint) || has_wire_type(pbf_wire_type::length_delimited)) && "not a varint"); + return static_cast(decode_zigzag64(decode_varint(&m_data, m_end))); + } + + pbf_length_type get_length() { + return get_varint(); + } + + void skip_bytes(pbf_length_type len) { + if (m_data + len > m_end) { + throw end_of_buffer_exception(); + } + m_data += len; + + // In debug builds reset the tag to zero so that we can detect (some) + // wrong code. +#ifndef NDEBUG + m_tag = 0; +#endif + } + + pbf_length_type get_len_and_skip() { + const auto len = get_length(); + skip_bytes(len); + return len; + } + + template + iterator_range get_packed() { + protozero_assert(tag() != 0 && "call next() before accessing field value"); + const auto len = get_len_and_skip(); + return iterator_range{T{m_data - len, m_data}, + T{m_data, m_data}}; + } + +public: + + /** + * Construct a pbf_reader message from a data_view. The pointer from the + * data_view will be stored inside the pbf_reader object, no data is + * copied. So you must make sure the view stays valid as long as the + * pbf_reader object is used. + * + * The buffer must contain a complete protobuf message. + * + * @post There is no current field. + */ + explicit pbf_reader(const data_view& view) noexcept + : m_data(view.data()), + m_end(view.data() + view.size()), + m_wire_type(pbf_wire_type::unknown), + m_tag(0) { + } + + /** + * Construct a pbf_reader message from a data pointer and a length. The + * pointer will be stored inside the pbf_reader object, no data is copied. + * So you must make sure the buffer stays valid as long as the pbf_reader + * object is used. + * + * The buffer must contain a complete protobuf message. + * + * @post There is no current field. + */ + pbf_reader(const char* data, std::size_t size) noexcept + : m_data(data), + m_end(data + size), + m_wire_type(pbf_wire_type::unknown), + m_tag(0) { + } + + /** + * Construct a pbf_reader message from a data pointer and a length. The + * pointer will be stored inside the pbf_reader object, no data is copied. + * So you must make sure the buffer stays valid as long as the pbf_reader + * object is used. + * + * The buffer must contain a complete protobuf message. + * + * @post There is no current field. + */ + explicit pbf_reader(const std::pair& data) noexcept + : m_data(data.first), + m_end(data.first + data.second), + m_wire_type(pbf_wire_type::unknown), + m_tag(0) { + } + + /** + * Construct a pbf_reader message from a std::string. A pointer to the + * string internals will be stored inside the pbf_reader object, no data + * is copied. So you must make sure the string is unchanged as long as the + * pbf_reader object is used. + * + * The string must contain a complete protobuf message. + * + * @post There is no current field. + */ + explicit pbf_reader(const std::string& data) noexcept + : m_data(data.data()), + m_end(data.data() + data.size()), + m_wire_type(pbf_wire_type::unknown), + m_tag(0) { + } + + /** + * pbf_reader can be default constructed and behaves like it has an empty + * buffer. + */ + pbf_reader() noexcept = default; + + /// pbf_reader messages can be copied trivially. + pbf_reader(const pbf_reader&) noexcept = default; + + /// pbf_reader messages can be moved trivially. + pbf_reader(pbf_reader&&) noexcept = default; + + /// pbf_reader messages can be copied trivially. + pbf_reader& operator=(const pbf_reader& other) noexcept = default; + + /// pbf_reader messages can be moved trivially. + pbf_reader& operator=(pbf_reader&& other) noexcept = default; + + ~pbf_reader() = default; + + /** + * Swap the contents of this object with the other. + * + * @param other Other object to swap data with. + */ + void swap(pbf_reader& other) noexcept { + using std::swap; + swap(m_data, other.m_data); + swap(m_end, other.m_end); + swap(m_wire_type, other.m_wire_type); + swap(m_tag, other.m_tag); + } + + /** + * In a boolean context the pbf_reader class evaluates to `true` if there + * are still fields available and to `false` if the last field has been + * read. + */ + operator bool() const noexcept { + return m_data < m_end; + } + + /** + * Return the length in bytes of the current message. If you have + * already called next() and/or any of the get_*() functions, this will + * return the remaining length. + * + * This can, for instance, be used to estimate the space needed for a + * buffer. Of course you have to know reasonably well what data to expect + * and how it is encoded for this number to have any meaning. + */ + std::size_t length() const noexcept { + return std::size_t(m_end - m_data); + } + + /** + * Set next field in the message as the current field. This is usually + * called in a while loop: + * + * @code + * pbf_reader message(...); + * while (message.next()) { + * // handle field + * } + * @endcode + * + * @returns `true` if there is a next field, `false` if not. + * @pre There must be no current field. + * @post If it returns `true` there is a current field now. + */ + bool next() { + if (m_data == m_end) { + return false; + } + + const auto value = get_varint(); + m_tag = pbf_tag_type(value >> 3); + + // tags 0 and 19000 to 19999 are not allowed as per + // https://developers.google.com/protocol-buffers/docs/proto + protozero_assert(((m_tag > 0 && m_tag < 19000) || + (m_tag > 19999 && m_tag <= ((1 << 29) - 1))) && "tag out of range"); + + m_wire_type = pbf_wire_type(value & 0x07); + switch (m_wire_type) { + case pbf_wire_type::varint: + case pbf_wire_type::fixed64: + case pbf_wire_type::length_delimited: + case pbf_wire_type::fixed32: + break; + default: + throw unknown_pbf_wire_type_exception(); + } + + return true; + } + + /** + * Set next field with given tag in the message as the current field. + * Fields with other tags are skipped. This is usually called in a while + * loop for repeated fields: + * + * @code + * pbf_reader message(...); + * while (message.next(17)) { + * // handle field + * } + * @endcode + * + * or you can call it just once to get the one field with this tag: + * + * @code + * pbf_reader message(...); + * if (message.next(17)) { + * // handle field + * } + * @endcode + * + * Note that this will not check the wire type. The two-argument version + * of this function will also check the wire type. + * + * @returns `true` if there is a next field with this tag. + * @pre There must be no current field. + * @post If it returns `true` there is a current field now with the given tag. + */ + bool next(pbf_tag_type next_tag) { + while (next()) { + if (m_tag == next_tag) { + return true; + } else { + skip(); + } + } + return false; + } + + /** + * Set next field with given tag and wire type in the message as the + * current field. Fields with other tags are skipped. This is usually + * called in a while loop for repeated fields: + * + * @code + * pbf_reader message(...); + * while (message.next(17, pbf_wire_type::varint)) { + * // handle field + * } + * @endcode + * + * or you can call it just once to get the one field with this tag: + * + * @code + * pbf_reader message(...); + * if (message.next(17, pbf_wire_type::varint)) { + * // handle field + * } + * @endcode + * + * Note that this will also check the wire type. The one-argument version + * of this function will not check the wire type. + * + * @returns `true` if there is a next field with this tag. + * @pre There must be no current field. + * @post If it returns `true` there is a current field now with the given tag. + */ + bool next(pbf_tag_type next_tag, pbf_wire_type type) { + while (next()) { + if (m_tag == next_tag && m_wire_type == type) { + return true; + } else { + skip(); + } + } + return false; + } + + /** + * The tag of the current field. The tag is the field number from the + * description in the .proto file. + * + * Call next() before calling this function to set the current field. + * + * @returns tag of the current field. + * @pre There must be a current field (ie. next() must have returned `true`). + */ + pbf_tag_type tag() const noexcept { + return m_tag; + } + + /** + * Get the wire type of the current field. The wire types are: + * + * * 0 - varint + * * 1 - 64 bit + * * 2 - length-delimited + * * 5 - 32 bit + * + * All other types are illegal. + * + * Call next() before calling this function to set the current field. + * + * @returns wire type of the current field. + * @pre There must be a current field (ie. next() must have returned `true`). + */ + pbf_wire_type wire_type() const noexcept { + return m_wire_type; + } + + /** + * Get the tag and wire type of the current field in one integer suitable + * for comparison with a switch statement. + * + * Use it like this: + * + * @code + * pbf_reader message(...); + * while (message.next()) { + * switch (message.tag_and_type()) { + * case tag_and_type(17, pbf_wire_type::length_delimited): + * .... + * break; + * case tag_and_type(21, pbf_wire_type::varint): + * .... + * break; + * default: + * message.skip(); + * } + * } + * @endcode + */ + uint32_t tag_and_type() const noexcept { + return protozero::tag_and_type(tag(), wire_type()); + } + + /** + * Check the wire type of the current field. + * + * @returns `true` if the current field has the given wire type. + * @pre There must be a current field (ie. next() must have returned `true`). + */ + bool has_wire_type(pbf_wire_type type) const noexcept { + return wire_type() == type; + } + + /** + * Consume the current field. + * + * @pre There must be a current field (ie. next() must have returned `true`). + * @post The current field was consumed and there is no current field now. + */ + void skip() { + protozero_assert(tag() != 0 && "call next() before calling skip()"); + switch (wire_type()) { + case pbf_wire_type::varint: + skip_varint(&m_data, m_end); + break; + case pbf_wire_type::fixed64: + skip_bytes(8); + break; + case pbf_wire_type::length_delimited: + skip_bytes(get_length()); + break; + case pbf_wire_type::fixed32: + skip_bytes(4); + break; + default: + protozero_assert(false && "can not be here because next() should have thrown already"); + } + } + + ///@{ + /** + * @name Scalar field accessor functions + */ + + /** + * Consume and return value of current "bool" field. + * + * @pre There must be a current field (ie. next() must have returned `true`). + * @pre The current field must be of type "bool". + * @post The current field was consumed and there is no current field now. + */ + bool get_bool() { + protozero_assert(tag() != 0 && "call next() before accessing field value"); + protozero_assert(has_wire_type(pbf_wire_type::varint) && "not a varint"); + protozero_assert((*m_data & 0x80) == 0 && "not a 1 byte varint"); + skip_bytes(1); + return m_data[-1] != 0; // -1 okay because we incremented m_data the line before + } + + /** + * Consume and return value of current "enum" field. + * + * @pre There must be a current field (ie. next() must have returned `true`). + * @pre The current field must be of type "enum". + * @post The current field was consumed and there is no current field now. + */ + int32_t get_enum() { + protozero_assert(has_wire_type(pbf_wire_type::varint) && "not a varint"); + return get_varint(); + } + + /** + * Consume and return value of current "int32" varint field. + * + * @pre There must be a current field (ie. next() must have returned `true`). + * @pre The current field must be of type "int32". + * @post The current field was consumed and there is no current field now. + */ + int32_t get_int32() { + protozero_assert(has_wire_type(pbf_wire_type::varint) && "not a varint"); + return get_varint(); + } + + /** + * Consume and return value of current "sint32" varint field. + * + * @pre There must be a current field (ie. next() must have returned `true`). + * @pre The current field must be of type "sint32". + * @post The current field was consumed and there is no current field now. + */ + int32_t get_sint32() { + protozero_assert(has_wire_type(pbf_wire_type::varint) && "not a varint"); + return get_svarint(); + } + + /** + * Consume and return value of current "uint32" varint field. + * + * @pre There must be a current field (ie. next() must have returned `true`). + * @pre The current field must be of type "uint32". + * @post The current field was consumed and there is no current field now. + */ + uint32_t get_uint32() { + protozero_assert(has_wire_type(pbf_wire_type::varint) && "not a varint"); + return get_varint(); + } + + /** + * Consume and return value of current "int64" varint field. + * + * @pre There must be a current field (ie. next() must have returned `true`). + * @pre The current field must be of type "int64". + * @post The current field was consumed and there is no current field now. + */ + int64_t get_int64() { + protozero_assert(has_wire_type(pbf_wire_type::varint) && "not a varint"); + return get_varint(); + } + + /** + * Consume and return value of current "sint64" varint field. + * + * @pre There must be a current field (ie. next() must have returned `true`). + * @pre The current field must be of type "sint64". + * @post The current field was consumed and there is no current field now. + */ + int64_t get_sint64() { + protozero_assert(has_wire_type(pbf_wire_type::varint) && "not a varint"); + return get_svarint(); + } + + /** + * Consume and return value of current "uint64" varint field. + * + * @pre There must be a current field (ie. next() must have returned `true`). + * @pre The current field must be of type "uint64". + * @post The current field was consumed and there is no current field now. + */ + uint64_t get_uint64() { + protozero_assert(has_wire_type(pbf_wire_type::varint) && "not a varint"); + return get_varint(); + } + + /** + * Consume and return value of current "fixed32" field. + * + * @pre There must be a current field (ie. next() must have returned `true`). + * @pre The current field must be of type "fixed32". + * @post The current field was consumed and there is no current field now. + */ + uint32_t get_fixed32() { + protozero_assert(tag() != 0 && "call next() before accessing field value"); + protozero_assert(has_wire_type(pbf_wire_type::fixed32) && "not a 32-bit fixed"); + return get_fixed(); + } + + /** + * Consume and return value of current "sfixed32" field. + * + * @pre There must be a current field (ie. next() must have returned `true`). + * @pre The current field must be of type "sfixed32". + * @post The current field was consumed and there is no current field now. + */ + int32_t get_sfixed32() { + protozero_assert(tag() != 0 && "call next() before accessing field value"); + protozero_assert(has_wire_type(pbf_wire_type::fixed32) && "not a 32-bit fixed"); + return get_fixed(); + } + + /** + * Consume and return value of current "fixed64" field. + * + * @pre There must be a current field (ie. next() must have returned `true`). + * @pre The current field must be of type "fixed64". + * @post The current field was consumed and there is no current field now. + */ + uint64_t get_fixed64() { + protozero_assert(tag() != 0 && "call next() before accessing field value"); + protozero_assert(has_wire_type(pbf_wire_type::fixed64) && "not a 64-bit fixed"); + return get_fixed(); + } + + /** + * Consume and return value of current "sfixed64" field. + * + * @pre There must be a current field (ie. next() must have returned `true`). + * @pre The current field must be of type "sfixed64". + * @post The current field was consumed and there is no current field now. + */ + int64_t get_sfixed64() { + protozero_assert(tag() != 0 && "call next() before accessing field value"); + protozero_assert(has_wire_type(pbf_wire_type::fixed64) && "not a 64-bit fixed"); + return get_fixed(); + } + + /** + * Consume and return value of current "float" field. + * + * @pre There must be a current field (ie. next() must have returned `true`). + * @pre The current field must be of type "float". + * @post The current field was consumed and there is no current field now. + */ + float get_float() { + protozero_assert(tag() != 0 && "call next() before accessing field value"); + protozero_assert(has_wire_type(pbf_wire_type::fixed32) && "not a 32-bit fixed"); + return get_fixed(); + } + + /** + * Consume and return value of current "double" field. + * + * @pre There must be a current field (ie. next() must have returned `true`). + * @pre The current field must be of type "double". + * @post The current field was consumed and there is no current field now. + */ + double get_double() { + protozero_assert(tag() != 0 && "call next() before accessing field value"); + protozero_assert(has_wire_type(pbf_wire_type::fixed64) && "not a 64-bit fixed"); + return get_fixed(); + } + + /** + * Consume and return value of current "bytes", "string", or "message" + * field. + * + * @returns A data_view object. + * @pre There must be a current field (ie. next() must have returned `true`). + * @pre The current field must be of type "bytes", "string", or "message". + * @post The current field was consumed and there is no current field now. + */ + data_view get_view() { + protozero_assert(tag() != 0 && "call next() before accessing field value"); + protozero_assert(has_wire_type(pbf_wire_type::length_delimited) && "not of type string, bytes or message"); + const auto len = get_len_and_skip(); + return data_view{m_data - len, len}; + } + +#ifndef PROTOZERO_STRICT_API + /** + * Consume and return value of current "bytes" or "string" field. + * + * @returns A pair with a pointer to the data and the length of the data. + * @pre There must be a current field (ie. next() must have returned `true`). + * @pre The current field must be of type "bytes" or "string". + * @post The current field was consumed and there is no current field now. + */ + std::pair get_data() { + protozero_assert(tag() != 0 && "call next() before accessing field value"); + protozero_assert(has_wire_type(pbf_wire_type::length_delimited) && "not of type string, bytes or message"); + const auto len = get_len_and_skip(); + return std::make_pair(m_data - len, len); + } +#endif + + /** + * Consume and return value of current "bytes" field. + * + * @pre There must be a current field (ie. next() must have returned `true`). + * @pre The current field must be of type "bytes". + * @post The current field was consumed and there is no current field now. + */ + std::string get_bytes() { + return std::string(get_view()); + } + + /** + * Consume and return value of current "string" field. + * + * @pre There must be a current field (ie. next() must have returned `true`). + * @pre The current field must be of type "string". + * @post The current field was consumed and there is no current field now. + */ + std::string get_string() { + return std::string(get_view()); + } + + /** + * Consume and return value of current "message" field. + * + * @pre There must be a current field (ie. next() must have returned `true`). + * @pre The current field must be of type "message". + * @post The current field was consumed and there is no current field now. + */ + pbf_reader get_message() { + return pbf_reader(get_view()); + } + + ///@} + + /// Forward iterator for iterating over bool (int32 varint) values. + using const_bool_iterator = const_varint_iterator< int32_t>; + + /// Forward iterator for iterating over enum (int32 varint) values. + using const_enum_iterator = const_varint_iterator< int32_t>; + + /// Forward iterator for iterating over int32 (varint) values. + using const_int32_iterator = const_varint_iterator< int32_t>; + + /// Forward iterator for iterating over sint32 (varint) values. + using const_sint32_iterator = const_svarint_iterator; + + /// Forward iterator for iterating over uint32 (varint) values. + using const_uint32_iterator = const_varint_iterator; + + /// Forward iterator for iterating over int64 (varint) values. + using const_int64_iterator = const_varint_iterator< int64_t>; + + /// Forward iterator for iterating over sint64 (varint) values. + using const_sint64_iterator = const_svarint_iterator; + + /// Forward iterator for iterating over uint64 (varint) values. + using const_uint64_iterator = const_varint_iterator; + + ///@{ + /** + * @name Repeated packed field accessor functions + */ + + /** + * Consume current "repeated packed bool" field. + * + * @returns a pair of iterators to the beginning and one past the end of + * the data. + * @pre There must be a current field (ie. next() must have returned `true`). + * @pre The current field must be of type "repeated packed bool". + * @post The current field was consumed and there is no current field now. + */ + iterator_range get_packed_bool() { + return get_packed(); + } + + /** + * Consume current "repeated packed enum" field. + * + * @returns a pair of iterators to the beginning and one past the end of + * the data. + * @pre There must be a current field (ie. next() must have returned `true`). + * @pre The current field must be of type "repeated packed enum". + * @post The current field was consumed and there is no current field now. + */ + iterator_range get_packed_enum() { + return get_packed(); + } + + /** + * Consume current "repeated packed int32" field. + * + * @returns a pair of iterators to the beginning and one past the end of + * the data. + * @pre There must be a current field (ie. next() must have returned `true`). + * @pre The current field must be of type "repeated packed int32". + * @post The current field was consumed and there is no current field now. + */ + iterator_range get_packed_int32() { + return get_packed(); + } + + /** + * Consume current "repeated packed sint32" field. + * + * @returns a pair of iterators to the beginning and one past the end of + * the data. + * @pre There must be a current field (ie. next() must have returned `true`). + * @pre The current field must be of type "repeated packed sint32". + * @post The current field was consumed and there is no current field now. + */ + iterator_range get_packed_sint32() { + return get_packed(); + } + + /** + * Consume current "repeated packed uint32" field. + * + * @returns a pair of iterators to the beginning and one past the end of + * the data. + * @pre There must be a current field (ie. next() must have returned `true`). + * @pre The current field must be of type "repeated packed uint32". + * @post The current field was consumed and there is no current field now. + */ + iterator_range get_packed_uint32() { + return get_packed(); + } + + /** + * Consume current "repeated packed int64" field. + * + * @returns a pair of iterators to the beginning and one past the end of + * the data. + * @pre There must be a current field (ie. next() must have returned `true`). + * @pre The current field must be of type "repeated packed int64". + * @post The current field was consumed and there is no current field now. + */ + iterator_range get_packed_int64() { + return get_packed(); + } + + /** + * Consume current "repeated packed sint64" field. + * + * @returns a pair of iterators to the beginning and one past the end of + * the data. + * @pre There must be a current field (ie. next() must have returned `true`). + * @pre The current field must be of type "repeated packed sint64". + * @post The current field was consumed and there is no current field now. + */ + iterator_range get_packed_sint64() { + return get_packed(); + } + + /** + * Consume current "repeated packed uint64" field. + * + * @returns a pair of iterators to the beginning and one past the end of + * the data. + * @pre There must be a current field (ie. next() must have returned `true`). + * @pre The current field must be of type "repeated packed uint64". + * @post The current field was consumed and there is no current field now. + */ + iterator_range get_packed_uint64() { + return get_packed(); + } + + /** + * Consume current "repeated packed fixed32" field. + * + * @returns a pair of iterators to the beginning and one past the end of + * the data. + * @pre There must be a current field (ie. next() must have returned `true`). + * @pre The current field must be of type "repeated packed fixed32". + * @post The current field was consumed and there is no current field now. + */ + auto get_packed_fixed32() -> decltype(packed_fixed()) { + return packed_fixed(); + } + + /** + * Consume current "repeated packed sfixed32" field. + * + * @returns a pair of iterators to the beginning and one past the end of + * the data. + * @pre There must be a current field (ie. next() must have returned `true`). + * @pre The current field must be of type "repeated packed sfixed32". + * @post The current field was consumed and there is no current field now. + */ + auto get_packed_sfixed32() -> decltype(packed_fixed()) { + return packed_fixed(); + } + + /** + * Consume current "repeated packed fixed64" field. + * + * @returns a pair of iterators to the beginning and one past the end of + * the data. + * @pre There must be a current field (ie. next() must have returned `true`). + * @pre The current field must be of type "repeated packed fixed64". + * @post The current field was consumed and there is no current field now. + */ + auto get_packed_fixed64() -> decltype(packed_fixed()) { + return packed_fixed(); + } + + /** + * Consume current "repeated packed sfixed64" field. + * + * @returns a pair of iterators to the beginning and one past the end of + * the data. + * @pre There must be a current field (ie. next() must have returned `true`). + * @pre The current field must be of type "repeated packed sfixed64". + * @post The current field was consumed and there is no current field now. + */ + auto get_packed_sfixed64() -> decltype(packed_fixed()) { + return packed_fixed(); + } + + /** + * Consume current "repeated packed float" field. + * + * @returns a pair of iterators to the beginning and one past the end of + * the data. + * @pre There must be a current field (ie. next() must have returned `true`). + * @pre The current field must be of type "repeated packed float". + * @post The current field was consumed and there is no current field now. + */ + auto get_packed_float() -> decltype(packed_fixed()) { + return packed_fixed(); + } + + /** + * Consume current "repeated packed double" field. + * + * @returns a pair of iterators to the beginning and one past the end of + * the data. + * @pre There must be a current field (ie. next() must have returned `true`). + * @pre The current field must be of type "repeated packed double". + * @post The current field was consumed and there is no current field now. + */ + auto get_packed_double() -> decltype(packed_fixed()) { + return packed_fixed(); + } + + ///@} + +}; // class pbf_reader + +/** + * Swap two pbf_reader objects. + * + * @param lhs First object. + * @param rhs Second object. + */ +inline void swap(pbf_reader& lhs, pbf_reader& rhs) noexcept { + lhs.swap(rhs); +} + +} // end namespace protozero + +#endif // PROTOZERO_PBF_READER_HPP diff --git a/src/3rdparty/mapbox-gl-native/deps/protozero/1.5.2/include/protozero/pbf_writer.hpp b/src/3rdparty/mapbox-gl-native/deps/protozero/1.5.2/include/protozero/pbf_writer.hpp new file mode 100644 index 0000000..af626bd --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/protozero/1.5.2/include/protozero/pbf_writer.hpp @@ -0,0 +1,975 @@ +#ifndef PROTOZERO_PBF_WRITER_HPP +#define PROTOZERO_PBF_WRITER_HPP + +/***************************************************************************** + +protozero - Minimalistic protocol buffer decoder and encoder in C++. + +This file is from https://github.com/mapbox/protozero where you can find more +documentation. + +*****************************************************************************/ + +/** + * @file pbf_writer.hpp + * + * @brief Contains the pbf_writer class. + */ + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#if PROTOZERO_BYTE_ORDER != PROTOZERO_LITTLE_ENDIAN +# include +#endif + +namespace protozero { + +namespace detail { + + template class packed_field_varint; + template class packed_field_svarint; + template class packed_field_fixed; + +} // end namespace detail + +/** + * The pbf_writer is used to write PBF formatted messages into a buffer. + * + * Almost all methods in this class can throw an std::bad_alloc exception if + * the std::string used as a buffer wants to resize. + */ +class pbf_writer { + + // A pointer to a string buffer holding the data already written to the + // PBF message. For default constructed writers or writers that have been + // rolled back, this is a nullptr. + std::string* m_data; + + // A pointer to a parent writer object if this is a submessage. If this + // is a top-level writer, it is a nullptr. + pbf_writer* m_parent_writer; + + // This is usually 0. If there is an open submessage, this is set in the + // parent to the rollback position, ie. the last position before the + // submessage was started. This is the position where the header of the + // submessage starts. + std::size_t m_rollback_pos = 0; + + // This is usually 0. If there is an open submessage, this is set in the + // parent to the position where the data of the submessage is written to. + std::size_t m_pos = 0; + + void add_varint(uint64_t value) { + protozero_assert(m_pos == 0 && "you can't add fields to a parent pbf_writer if there is an existing pbf_writer for a submessage"); + protozero_assert(m_data); + write_varint(std::back_inserter(*m_data), value); + } + + void add_field(pbf_tag_type tag, pbf_wire_type type) { + protozero_assert(((tag > 0 && tag < 19000) || (tag > 19999 && tag <= ((1 << 29) - 1))) && "tag out of range"); + const uint32_t b = (tag << 3) | uint32_t(type); + add_varint(b); + } + + void add_tagged_varint(pbf_tag_type tag, uint64_t value) { + add_field(tag, pbf_wire_type::varint); + add_varint(value); + } + + template + void add_fixed(T value) { + protozero_assert(m_pos == 0 && "you can't add fields to a parent pbf_writer if there is an existing pbf_writer for a submessage"); + protozero_assert(m_data); +#if PROTOZERO_BYTE_ORDER != PROTOZERO_LITTLE_ENDIAN + detail::byteswap_inplace(&value); +#endif + m_data->append(reinterpret_cast(&value), sizeof(T)); + } + + template + void add_packed_fixed(pbf_tag_type tag, It first, It last, std::input_iterator_tag) { + if (first == last) { + return; + } + + pbf_writer sw(*this, tag); + + while (first != last) { + sw.add_fixed(*first++); + } + } + + template + void add_packed_fixed(pbf_tag_type tag, It first, It last, std::forward_iterator_tag) { + if (first == last) { + return; + } + + const auto length = std::distance(first, last); + add_length_varint(tag, sizeof(T) * pbf_length_type(length)); + reserve(sizeof(T) * std::size_t(length)); + + while (first != last) { + add_fixed(*first++); + } + } + + template + void add_packed_varint(pbf_tag_type tag, It first, It last) { + if (first == last) { + return; + } + + pbf_writer sw(*this, tag); + + while (first != last) { + sw.add_varint(uint64_t(*first++)); + } + } + + template + void add_packed_svarint(pbf_tag_type tag, It first, It last) { + if (first == last) { + return; + } + + pbf_writer sw(*this, tag); + + while (first != last) { + sw.add_varint(encode_zigzag64(*first++)); + } + } + + // The number of bytes to reserve for the varint holding the length of + // a length-delimited field. The length has to fit into pbf_length_type, + // and a varint needs 8 bit for every 7 bit. + enum constant_reserve_bytes : int { + reserve_bytes = sizeof(pbf_length_type) * 8 / 7 + 1 + }; + + // If m_rollpack_pos is set to this special value, it means that when + // the submessage is closed, nothing needs to be done, because the length + // of the submessage has already been written correctly. + enum constant_size_is_known : std::size_t { + size_is_known = std::numeric_limits::max() + }; + + void open_submessage(pbf_tag_type tag, std::size_t size) { + protozero_assert(m_pos == 0); + protozero_assert(m_data); + if (size == 0) { + m_rollback_pos = m_data->size(); + add_field(tag, pbf_wire_type::length_delimited); + m_data->append(std::size_t(reserve_bytes), '\0'); + } else { + m_rollback_pos = size_is_known; + add_length_varint(tag, pbf_length_type(size)); + reserve(size); + } + m_pos = m_data->size(); + } + + void rollback_submessage() { + protozero_assert(m_pos != 0); + protozero_assert(m_rollback_pos != size_is_known); + protozero_assert(m_data); + m_data->resize(m_rollback_pos); + m_pos = 0; + } + + void commit_submessage() { + protozero_assert(m_pos != 0); + protozero_assert(m_rollback_pos != size_is_known); + protozero_assert(m_data); + const auto length = pbf_length_type(m_data->size() - m_pos); + + protozero_assert(m_data->size() >= m_pos - reserve_bytes); + const auto n = write_varint(m_data->begin() + long(m_pos) - reserve_bytes, length); + + m_data->erase(m_data->begin() + long(m_pos) - reserve_bytes + n, m_data->begin() + long(m_pos)); + m_pos = 0; + } + + void close_submessage() { + protozero_assert(m_data); + if (m_pos == 0 || m_rollback_pos == size_is_known) { + return; + } + if (m_data->size() - m_pos == 0) { + rollback_submessage(); + } else { + commit_submessage(); + } + } + + void add_length_varint(pbf_tag_type tag, pbf_length_type length) { + add_field(tag, pbf_wire_type::length_delimited); + add_varint(length); + } + +public: + + /** + * Create a writer using the given string as a data store. The pbf_writer + * stores a reference to that string and adds all data to it. The string + * doesn't have to be empty. The pbf_writer will just append data. + */ + explicit pbf_writer(std::string& data) noexcept : + m_data(&data), + m_parent_writer(nullptr) { + } + + /** + * Create a writer without a data store. In this form the writer can not + * be used! + */ + pbf_writer() noexcept : + m_data(nullptr), + m_parent_writer(nullptr) { + } + + /** + * Construct a pbf_writer for a submessage from the pbf_writer of the + * parent message. + * + * @param parent_writer The pbf_writer + * @param tag Tag (field number) of the field that will be written + * @param size Optional size of the submessage in bytes (use 0 for unknown). + * Setting this allows some optimizations but is only possible in + * a few very specific cases. + */ + pbf_writer(pbf_writer& parent_writer, pbf_tag_type tag, std::size_t size=0) : + m_data(parent_writer.m_data), + m_parent_writer(&parent_writer) { + m_parent_writer->open_submessage(tag, size); + } + + /// A pbf_writer object can be copied + pbf_writer(const pbf_writer&) noexcept = default; + + /// A pbf_writer object can be copied + pbf_writer& operator=(const pbf_writer&) noexcept = default; + + /// A pbf_writer object can be moved + pbf_writer(pbf_writer&&) noexcept = default; + + /// A pbf_writer object can be moved + pbf_writer& operator=(pbf_writer&&) noexcept = default; + + ~pbf_writer() { + if (m_parent_writer) { + m_parent_writer->close_submessage(); + } + } + + /** + * Swap the contents of this object with the other. + * + * @param other Other object to swap data with. + */ + void swap(pbf_writer& other) noexcept { + using std::swap; + swap(m_data, other.m_data); + swap(m_parent_writer, other.m_parent_writer); + swap(m_rollback_pos, other.m_rollback_pos); + swap(m_pos, other.m_pos); + } + + /** + * Reserve size bytes in the underlying message store in addition to + * whatever the message store already holds. So unlike + * the `std::string::reserve()` method this is not an absolute size, + * but additional memory that should be reserved. + * + * @param size Number of bytes to reserve in underlying message store. + */ + void reserve(std::size_t size) { + protozero_assert(m_data); + m_data->reserve(m_data->size() + size); + } + + /** + * Cancel writing of this submessage. The complete submessage will be + * removed as if it was never created and no fields were added. + * + * @pre Must be a pbf_writer of a submessage, ie one opened with the + * pbf_writer constructor taking a parent message. + */ + void rollback() { + protozero_assert(m_parent_writer && "you can't call rollback() on a pbf_writer without a parent"); + protozero_assert(m_pos == 0 && "you can't call rollback() on a pbf_writer that has an open nested submessage"); + m_parent_writer->rollback_submessage(); + m_data = nullptr; + } + + ///@{ + /** + * @name Scalar field writer functions + */ + + /** + * Add "bool" field to data. + * + * @param tag Tag (field number) of the field + * @param value Value to be written + */ + void add_bool(pbf_tag_type tag, bool value) { + add_field(tag, pbf_wire_type::varint); + protozero_assert(m_pos == 0 && "you can't add fields to a parent pbf_writer if there is an existing pbf_writer for a submessage"); + protozero_assert(m_data); + m_data->append(1, value); + } + + /** + * Add "enum" field to data. + * + * @param tag Tag (field number) of the field + * @param value Value to be written + */ + void add_enum(pbf_tag_type tag, int32_t value) { + add_tagged_varint(tag, uint64_t(value)); + } + + /** + * Add "int32" field to data. + * + * @param tag Tag (field number) of the field + * @param value Value to be written + */ + void add_int32(pbf_tag_type tag, int32_t value) { + add_tagged_varint(tag, uint64_t(value)); + } + + /** + * Add "sint32" field to data. + * + * @param tag Tag (field number) of the field + * @param value Value to be written + */ + void add_sint32(pbf_tag_type tag, int32_t value) { + add_tagged_varint(tag, encode_zigzag32(value)); + } + + /** + * Add "uint32" field to data. + * + * @param tag Tag (field number) of the field + * @param value Value to be written + */ + void add_uint32(pbf_tag_type tag, uint32_t value) { + add_tagged_varint(tag, value); + } + + /** + * Add "int64" field to data. + * + * @param tag Tag (field number) of the field + * @param value Value to be written + */ + void add_int64(pbf_tag_type tag, int64_t value) { + add_tagged_varint(tag, uint64_t(value)); + } + + /** + * Add "sint64" field to data. + * + * @param tag Tag (field number) of the field + * @param value Value to be written + */ + void add_sint64(pbf_tag_type tag, int64_t value) { + add_tagged_varint(tag, encode_zigzag64(value)); + } + + /** + * Add "uint64" field to data. + * + * @param tag Tag (field number) of the field + * @param value Value to be written + */ + void add_uint64(pbf_tag_type tag, uint64_t value) { + add_tagged_varint(tag, value); + } + + /** + * Add "fixed32" field to data. + * + * @param tag Tag (field number) of the field + * @param value Value to be written + */ + void add_fixed32(pbf_tag_type tag, uint32_t value) { + add_field(tag, pbf_wire_type::fixed32); + add_fixed(value); + } + + /** + * Add "sfixed32" field to data. + * + * @param tag Tag (field number) of the field + * @param value Value to be written + */ + void add_sfixed32(pbf_tag_type tag, int32_t value) { + add_field(tag, pbf_wire_type::fixed32); + add_fixed(value); + } + + /** + * Add "fixed64" field to data. + * + * @param tag Tag (field number) of the field + * @param value Value to be written + */ + void add_fixed64(pbf_tag_type tag, uint64_t value) { + add_field(tag, pbf_wire_type::fixed64); + add_fixed(value); + } + + /** + * Add "sfixed64" field to data. + * + * @param tag Tag (field number) of the field + * @param value Value to be written + */ + void add_sfixed64(pbf_tag_type tag, int64_t value) { + add_field(tag, pbf_wire_type::fixed64); + add_fixed(value); + } + + /** + * Add "float" field to data. + * + * @param tag Tag (field number) of the field + * @param value Value to be written + */ + void add_float(pbf_tag_type tag, float value) { + add_field(tag, pbf_wire_type::fixed32); + add_fixed(value); + } + + /** + * Add "double" field to data. + * + * @param tag Tag (field number) of the field + * @param value Value to be written + */ + void add_double(pbf_tag_type tag, double value) { + add_field(tag, pbf_wire_type::fixed64); + add_fixed(value); + } + + /** + * Add "bytes" field to data. + * + * @param tag Tag (field number) of the field + * @param value Pointer to value to be written + * @param size Number of bytes to be written + */ + void add_bytes(pbf_tag_type tag, const char* value, std::size_t size) { + protozero_assert(m_pos == 0 && "you can't add fields to a parent pbf_writer if there is an existing pbf_writer for a submessage"); + protozero_assert(m_data); + protozero_assert(size <= std::numeric_limits::max()); + add_length_varint(tag, pbf_length_type(size)); + m_data->append(value, size); + } + + /** + * Add "bytes" field to data. + * + * @param tag Tag (field number) of the field + * @param value Value to be written + */ + void add_bytes(pbf_tag_type tag, const data_view& value) { + add_bytes(tag, value.data(), value.size()); + } + + /** + * Add "bytes" field to data. + * + * @param tag Tag (field number) of the field + * @param value Value to be written + */ + void add_bytes(pbf_tag_type tag, const std::string& value) { + add_bytes(tag, value.data(), value.size()); + } + + /** + * Add "bytes" field to data. Bytes from the value are written until + * a null byte is encountered. The null byte is not added. + * + * @param tag Tag (field number) of the field + * @param value Pointer to zero-delimited value to be written + */ + void add_bytes(pbf_tag_type tag, const char* value) { + add_bytes(tag, value, std::strlen(value)); + } + + /** + * Add "bytes" field to data using vectored input. All the data in the + * 2nd and further arguments is "concatenated" with only a single copy + * into the final buffer. + * + * This will work with objects of any type supporting the data() and + * size() methods like std::string or protozero::data_view. + * + * Example: + * @code + * std::string data1 = "abc"; + * std::string data2 = "xyz"; + * writer.add_bytes_vectored(1, data1, data2); + * @endcode + * + * @tparam Ts List of types supporting data() and size() methods. + * @param tag Tag (field number) of the field + * @param values List of objects of types Ts with data to be appended. + */ + template + void add_bytes_vectored(pbf_tag_type tag, Ts&&... values) { + protozero_assert(m_pos == 0 && "you can't add fields to a parent pbf_writer if there is an existing pbf_writer for a submessage"); + protozero_assert(m_data); + size_t sum_size = 0; + (void)std::initializer_list{sum_size += values.size()...}; + protozero_assert(sum_size <= std::numeric_limits::max()); + add_length_varint(tag, pbf_length_type(sum_size)); + m_data->reserve(m_data->size() + sum_size); + (void)std::initializer_list{(m_data->append(values.data(), values.size()), 0)...}; + } + + /** + * Add "string" field to data. + * + * @param tag Tag (field number) of the field + * @param value Pointer to value to be written + * @param size Number of bytes to be written + */ + void add_string(pbf_tag_type tag, const char* value, std::size_t size) { + add_bytes(tag, value, size); + } + + /** + * Add "string" field to data. + * + * @param tag Tag (field number) of the field + * @param value Value to be written + */ + void add_string(pbf_tag_type tag, const data_view& value) { + add_bytes(tag, value.data(), value.size()); + } + + /** + * Add "string" field to data. + * + * @param tag Tag (field number) of the field + * @param value Value to be written + */ + void add_string(pbf_tag_type tag, const std::string& value) { + add_bytes(tag, value.data(), value.size()); + } + + /** + * Add "string" field to data. Bytes from the value are written until + * a null byte is encountered. The null byte is not added. + * + * @param tag Tag (field number) of the field + * @param value Pointer to value to be written + */ + void add_string(pbf_tag_type tag, const char* value) { + add_bytes(tag, value, std::strlen(value)); + } + + /** + * Add "message" field to data. + * + * @param tag Tag (field number) of the field + * @param value Pointer to message to be written + * @param size Length of the message + */ + void add_message(pbf_tag_type tag, const char* value, std::size_t size) { + add_bytes(tag, value, size); + } + + /** + * Add "message" field to data. + * + * @param tag Tag (field number) of the field + * @param value Value to be written. The value must be a complete message. + */ + void add_message(pbf_tag_type tag, const data_view& value) { + add_bytes(tag, value.data(), value.size()); + } + + /** + * Add "message" field to data. + * + * @param tag Tag (field number) of the field + * @param value Value to be written. The value must be a complete message. + */ + void add_message(pbf_tag_type tag, const std::string& value) { + add_bytes(tag, value.data(), value.size()); + } + + ///@} + + ///@{ + /** + * @name Repeated packed field writer functions + */ + + /** + * Add "repeated packed bool" field to data. + * + * @tparam InputIterator A type satisfying the InputIterator concept. + * Dereferencing the iterator must yield a type assignable to bool. + * @param tag Tag (field number) of the field + * @param first Iterator pointing to the beginning of the data + * @param last Iterator pointing one past the end of data + */ + template + void add_packed_bool(pbf_tag_type tag, InputIterator first, InputIterator last) { + add_packed_varint(tag, first, last); + } + + /** + * Add "repeated packed enum" field to data. + * + * @tparam InputIterator A type satisfying the InputIterator concept. + * Dereferencing the iterator must yield a type assignable to int32_t. + * @param tag Tag (field number) of the field + * @param first Iterator pointing to the beginning of the data + * @param last Iterator pointing one past the end of data + */ + template + void add_packed_enum(pbf_tag_type tag, InputIterator first, InputIterator last) { + add_packed_varint(tag, first, last); + } + + /** + * Add "repeated packed int32" field to data. + * + * @tparam InputIterator A type satisfying the InputIterator concept. + * Dereferencing the iterator must yield a type assignable to int32_t. + * @param tag Tag (field number) of the field + * @param first Iterator pointing to the beginning of the data + * @param last Iterator pointing one past the end of data + */ + template + void add_packed_int32(pbf_tag_type tag, InputIterator first, InputIterator last) { + add_packed_varint(tag, first, last); + } + + /** + * Add "repeated packed sint32" field to data. + * + * @tparam InputIterator A type satisfying the InputIterator concept. + * Dereferencing the iterator must yield a type assignable to int32_t. + * @param tag Tag (field number) of the field + * @param first Iterator pointing to the beginning of the data + * @param last Iterator pointing one past the end of data + */ + template + void add_packed_sint32(pbf_tag_type tag, InputIterator first, InputIterator last) { + add_packed_svarint(tag, first, last); + } + + /** + * Add "repeated packed uint32" field to data. + * + * @tparam InputIterator A type satisfying the InputIterator concept. + * Dereferencing the iterator must yield a type assignable to uint32_t. + * @param tag Tag (field number) of the field + * @param first Iterator pointing to the beginning of the data + * @param last Iterator pointing one past the end of data + */ + template + void add_packed_uint32(pbf_tag_type tag, InputIterator first, InputIterator last) { + add_packed_varint(tag, first, last); + } + + /** + * Add "repeated packed int64" field to data. + * + * @tparam InputIterator A type satisfying the InputIterator concept. + * Dereferencing the iterator must yield a type assignable to int64_t. + * @param tag Tag (field number) of the field + * @param first Iterator pointing to the beginning of the data + * @param last Iterator pointing one past the end of data + */ + template + void add_packed_int64(pbf_tag_type tag, InputIterator first, InputIterator last) { + add_packed_varint(tag, first, last); + } + + /** + * Add "repeated packed sint64" field to data. + * + * @tparam InputIterator A type satisfying the InputIterator concept. + * Dereferencing the iterator must yield a type assignable to int64_t. + * @param tag Tag (field number) of the field + * @param first Iterator pointing to the beginning of the data + * @param last Iterator pointing one past the end of data + */ + template + void add_packed_sint64(pbf_tag_type tag, InputIterator first, InputIterator last) { + add_packed_svarint(tag, first, last); + } + + /** + * Add "repeated packed uint64" field to data. + * + * @tparam InputIterator A type satisfying the InputIterator concept. + * Dereferencing the iterator must yield a type assignable to uint64_t. + * @param tag Tag (field number) of the field + * @param first Iterator pointing to the beginning of the data + * @param last Iterator pointing one past the end of data + */ + template + void add_packed_uint64(pbf_tag_type tag, InputIterator first, InputIterator last) { + add_packed_varint(tag, first, last); + } + + /** + * Add "repeated packed fixed32" field to data. + * + * @tparam InputIterator A type satisfying the InputIterator concept. + * Dereferencing the iterator must yield a type assignable to uint32_t. + * @param tag Tag (field number) of the field + * @param first Iterator pointing to the beginning of the data + * @param last Iterator pointing one past the end of data + */ + template + void add_packed_fixed32(pbf_tag_type tag, InputIterator first, InputIterator last) { + add_packed_fixed(tag, first, last, + typename std::iterator_traits::iterator_category()); + } + + /** + * Add "repeated packed sfixed32" field to data. + * + * @tparam InputIterator A type satisfying the InputIterator concept. + * Dereferencing the iterator must yield a type assignable to int32_t. + * @param tag Tag (field number) of the field + * @param first Iterator pointing to the beginning of the data + * @param last Iterator pointing one past the end of data + */ + template + void add_packed_sfixed32(pbf_tag_type tag, InputIterator first, InputIterator last) { + add_packed_fixed(tag, first, last, + typename std::iterator_traits::iterator_category()); + } + + /** + * Add "repeated packed fixed64" field to data. + * + * @tparam InputIterator A type satisfying the InputIterator concept. + * Dereferencing the iterator must yield a type assignable to uint64_t. + * @param tag Tag (field number) of the field + * @param first Iterator pointing to the beginning of the data + * @param last Iterator pointing one past the end of data + */ + template + void add_packed_fixed64(pbf_tag_type tag, InputIterator first, InputIterator last) { + add_packed_fixed(tag, first, last, + typename std::iterator_traits::iterator_category()); + } + + /** + * Add "repeated packed sfixed64" field to data. + * + * @tparam InputIterator A type satisfying the InputIterator concept. + * Dereferencing the iterator must yield a type assignable to int64_t. + * @param tag Tag (field number) of the field + * @param first Iterator pointing to the beginning of the data + * @param last Iterator pointing one past the end of data + */ + template + void add_packed_sfixed64(pbf_tag_type tag, InputIterator first, InputIterator last) { + add_packed_fixed(tag, first, last, + typename std::iterator_traits::iterator_category()); + } + + /** + * Add "repeated packed float" field to data. + * + * @tparam InputIterator A type satisfying the InputIterator concept. + * Dereferencing the iterator must yield a type assignable to float. + * @param tag Tag (field number) of the field + * @param first Iterator pointing to the beginning of the data + * @param last Iterator pointing one past the end of data + */ + template + void add_packed_float(pbf_tag_type tag, InputIterator first, InputIterator last) { + add_packed_fixed(tag, first, last, + typename std::iterator_traits::iterator_category()); + } + + /** + * Add "repeated packed double" field to data. + * + * @tparam InputIterator A type satisfying the InputIterator concept. + * Dereferencing the iterator must yield a type assignable to double. + * @param tag Tag (field number) of the field + * @param first Iterator pointing to the beginning of the data + * @param last Iterator pointing one past the end of data + */ + template + void add_packed_double(pbf_tag_type tag, InputIterator first, InputIterator last) { + add_packed_fixed(tag, first, last, + typename std::iterator_traits::iterator_category()); + } + + ///@} + + template friend class detail::packed_field_varint; + template friend class detail::packed_field_svarint; + template friend class detail::packed_field_fixed; + +}; // class pbf_writer + +/** + * Swap two pbf_writer objects. + * + * @param lhs First object. + * @param rhs Second object. + */ +inline void swap(pbf_writer& lhs, pbf_writer& rhs) noexcept { + lhs.swap(rhs); +} + +namespace detail { + + class packed_field { + + protected: + + pbf_writer m_writer; + + public: + + packed_field(const packed_field&) = delete; + packed_field& operator=(const packed_field&) = delete; + + packed_field(packed_field&&) = default; + packed_field& operator=(packed_field&&) = default; + + packed_field(pbf_writer& parent_writer, pbf_tag_type tag) : + m_writer(parent_writer, tag) { + } + + packed_field(pbf_writer& parent_writer, pbf_tag_type tag, std::size_t size) : + m_writer(parent_writer, tag, size) { + } + + void rollback() { + m_writer.rollback(); + } + + }; // class packed_field + + template + class packed_field_fixed : public packed_field { + + public: + + template + packed_field_fixed(pbf_writer& parent_writer, P tag) : + packed_field(parent_writer, static_cast(tag)) { + } + + template + packed_field_fixed(pbf_writer& parent_writer, P tag, std::size_t size) : + packed_field(parent_writer, static_cast(tag), size * sizeof(T)) { + } + + void add_element(T value) { + m_writer.add_fixed(value); + } + + }; // class packed_field_fixed + + template + class packed_field_varint : public packed_field { + + public: + + template + packed_field_varint(pbf_writer& parent_writer, P tag) : + packed_field(parent_writer, static_cast(tag)) { + } + + void add_element(T value) { + m_writer.add_varint(uint64_t(value)); + } + + }; // class packed_field_varint + + template + class packed_field_svarint : public packed_field { + + public: + + template + packed_field_svarint(pbf_writer& parent_writer, P tag) : + packed_field(parent_writer, static_cast(tag)) { + } + + void add_element(T value) { + m_writer.add_varint(encode_zigzag64(value)); + } + + }; // class packed_field_svarint + +} // end namespace detail + +/// Class for generating packed repeated bool fields. +using packed_field_bool = detail::packed_field_varint; + +/// Class for generating packed repeated enum fields. +using packed_field_enum = detail::packed_field_varint; + +/// Class for generating packed repeated int32 fields. +using packed_field_int32 = detail::packed_field_varint; + +/// Class for generating packed repeated sint32 fields. +using packed_field_sint32 = detail::packed_field_svarint; + +/// Class for generating packed repeated uint32 fields. +using packed_field_uint32 = detail::packed_field_varint; + +/// Class for generating packed repeated int64 fields. +using packed_field_int64 = detail::packed_field_varint; + +/// Class for generating packed repeated sint64 fields. +using packed_field_sint64 = detail::packed_field_svarint; + +/// Class for generating packed repeated uint64 fields. +using packed_field_uint64 = detail::packed_field_varint; + +/// Class for generating packed repeated fixed32 fields. +using packed_field_fixed32 = detail::packed_field_fixed; + +/// Class for generating packed repeated sfixed32 fields. +using packed_field_sfixed32 = detail::packed_field_fixed; + +/// Class for generating packed repeated fixed64 fields. +using packed_field_fixed64 = detail::packed_field_fixed; + +/// Class for generating packed repeated sfixed64 fields. +using packed_field_sfixed64 = detail::packed_field_fixed; + +/// Class for generating packed repeated float fields. +using packed_field_float = detail::packed_field_fixed; + +/// Class for generating packed repeated double fields. +using packed_field_double = detail::packed_field_fixed; + +} // end namespace protozero + +#endif // PROTOZERO_PBF_WRITER_HPP diff --git a/src/3rdparty/mapbox-gl-native/deps/protozero/1.5.2/include/protozero/types.hpp b/src/3rdparty/mapbox-gl-native/deps/protozero/1.5.2/include/protozero/types.hpp new file mode 100644 index 0000000..3dbdaf1 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/protozero/1.5.2/include/protozero/types.hpp @@ -0,0 +1,206 @@ +#ifndef PROTOZERO_TYPES_HPP +#define PROTOZERO_TYPES_HPP + +/***************************************************************************** + +protozero - Minimalistic protocol buffer decoder and encoder in C++. + +This file is from https://github.com/mapbox/protozero where you can find more +documentation. + +*****************************************************************************/ + +/** + * @file types.hpp + * + * @brief Contains the declaration of low-level types used in the pbf format. + */ + +#include +#include +#include +#include +#include +#include + +#include + +namespace protozero { + +/** + * The type used for field tags (field numbers). + */ +using pbf_tag_type = uint32_t; + +/** + * The type used to encode type information. + * See the table on + * https://developers.google.com/protocol-buffers/docs/encoding + */ +enum class pbf_wire_type : uint32_t { + varint = 0, // int32/64, uint32/64, sint32/64, bool, enum + fixed64 = 1, // fixed64, sfixed64, double + length_delimited = 2, // string, bytes, embedded messages, + // packed repeated fields + fixed32 = 5, // fixed32, sfixed32, float + unknown = 99 // used for default setting in this library +}; + +/** + * Get the tag and wire type of the current field in one integer suitable + * for comparison with a switch statement. + * + * See pbf_reader.tag_and_type() for an example how to use this. + */ +template +constexpr inline uint32_t tag_and_type(T tag, pbf_wire_type wire_type) noexcept { + return (static_cast(static_cast(tag)) << 3) | static_cast(wire_type); +} + +/** + * The type used for length values, such as the length of a field. + */ +using pbf_length_type = uint32_t; + +#ifdef PROTOZERO_USE_VIEW +using data_view = PROTOZERO_USE_VIEW; +#else + +/** + * Holds a pointer to some data and a length. + * + * This class is supposed to be compatible with the std::string_view + * that will be available in C++17. + */ +class data_view { + + const char* m_data; + std::size_t m_size; + +public: + + /** + * Default constructor. Construct an empty data_view. + */ + constexpr data_view() noexcept + : m_data(nullptr), + m_size(0) { + } + + /** + * Create data_view from pointer and size. + * + * @param ptr Pointer to the data. + * @param length Length of the data. + */ + constexpr data_view(const char* ptr, std::size_t length) noexcept + : m_data(ptr), + m_size(length) { + } + + /** + * Create data_view from string. + * + * @param str String with the data. + */ + data_view(const std::string& str) noexcept + : m_data(str.data()), + m_size(str.size()) { + } + + /** + * Create data_view from zero-terminated string. + * + * @param ptr Pointer to the data. + */ + data_view(const char* ptr) noexcept + : m_data(ptr), + m_size(std::strlen(ptr)) { + } + + /** + * Swap the contents of this object with the other. + * + * @param other Other object to swap data with. + */ + void swap(data_view& other) noexcept { + using std::swap; + swap(m_data, other.m_data); + swap(m_size, other.m_size); + } + + /// Return pointer to data. + constexpr const char* data() const noexcept { + return m_data; + } + + /// Return length of data in bytes. + constexpr std::size_t size() const noexcept { + return m_size; + } + + /// Returns true if size is 0. + constexpr bool empty() const noexcept { + return m_size == 0; + } + + /** + * Convert data view to string. + * + * @pre Must not be default constructed data_view. + */ + std::string to_string() const { + protozero_assert(m_data); + return std::string{m_data, m_size}; + } + + /** + * Convert data view to string. + * + * @pre Must not be default constructed data_view. + */ + explicit operator std::string() const { + protozero_assert(m_data); + return std::string{m_data, m_size}; + } + +}; // class data_view + +/** + * Swap two data_view objects. + * + * @param lhs First object. + * @param rhs Second object. + */ +inline void swap(data_view& lhs, data_view& rhs) noexcept { + lhs.swap(rhs); +} + +/** + * Two data_view instances are equal if they have the same size and the + * same content. + * + * @param lhs First object. + * @param rhs Second object. + */ +inline bool operator==(const data_view& lhs, const data_view& rhs) noexcept { + return lhs.size() == rhs.size() && std::equal(lhs.data(), lhs.data() + lhs.size(), rhs.data()); +} + +/** + * Two data_view instances are not equal if they have different sizes or the + * content differs. + * + * @param lhs First object. + * @param rhs Second object. + */ +inline bool operator!=(const data_view& lhs, const data_view& rhs) noexcept { + return !(lhs == rhs); +} + +#endif + + +} // end namespace protozero + +#endif // PROTOZERO_TYPES_HPP diff --git a/src/3rdparty/mapbox-gl-native/deps/protozero/1.5.2/include/protozero/varint.hpp b/src/3rdparty/mapbox-gl-native/deps/protozero/1.5.2/include/protozero/varint.hpp new file mode 100644 index 0000000..d115d5f --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/protozero/1.5.2/include/protozero/varint.hpp @@ -0,0 +1,187 @@ +#ifndef PROTOZERO_VARINT_HPP +#define PROTOZERO_VARINT_HPP + +/***************************************************************************** + +protozero - Minimalistic protocol buffer decoder and encoder in C++. + +This file is from https://github.com/mapbox/protozero where you can find more +documentation. + +*****************************************************************************/ + +/** + * @file varint.hpp + * + * @brief Contains low-level varint and zigzag encoding and decoding functions. + */ + +#include + +#include + +namespace protozero { + +/** + * The maximum length of a 64 bit varint. + */ +constexpr const int8_t max_varint_length = sizeof(uint64_t) * 8 / 7 + 1; + +namespace detail { + + // from https://github.com/facebook/folly/blob/master/folly/Varint.h + inline uint64_t decode_varint_impl(const char** data, const char* end) { + const int8_t* begin = reinterpret_cast(*data); + const int8_t* iend = reinterpret_cast(end); + const int8_t* p = begin; + uint64_t val = 0; + + if (iend - begin >= max_varint_length) { // fast path + do { + int64_t b; + b = *p++; val = uint64_t((b & 0x7f) ); if (b >= 0) break; + b = *p++; val |= uint64_t((b & 0x7f) << 7); if (b >= 0) break; + b = *p++; val |= uint64_t((b & 0x7f) << 14); if (b >= 0) break; + b = *p++; val |= uint64_t((b & 0x7f) << 21); if (b >= 0) break; + b = *p++; val |= uint64_t((b & 0x7f) << 28); if (b >= 0) break; + b = *p++; val |= uint64_t((b & 0x7f) << 35); if (b >= 0) break; + b = *p++; val |= uint64_t((b & 0x7f) << 42); if (b >= 0) break; + b = *p++; val |= uint64_t((b & 0x7f) << 49); if (b >= 0) break; + b = *p++; val |= uint64_t((b & 0x7f) << 56); if (b >= 0) break; + b = *p++; val |= uint64_t((b & 0x7f) << 63); if (b >= 0) break; + throw varint_too_long_exception(); + } while (false); + } else { + int shift = 0; + while (p != iend && *p < 0) { + val |= uint64_t(*p++ & 0x7f) << shift; + shift += 7; + } + if (p == iend) { + throw end_of_buffer_exception(); + } + val |= uint64_t(*p++) << shift; + } + + *data = reinterpret_cast(p); + return val; + } + +} // end namespace detail + +/** + * Decode a 64 bit varint. + * + * Strong exception guarantee: if there is an exception the data pointer will + * not be changed. + * + * @param[in,out] data Pointer to pointer to the input data. After the function + * returns this will point to the next data to be read. + * @param[in] end Pointer one past the end of the input data. + * @returns The decoded integer + * @throws varint_too_long_exception if the varint is longer then the maximum + * length that would fit in a 64 bit int. Usually this means your data + * is corrupted or you are trying to read something as a varint that + * isn't. + * @throws end_of_buffer_exception if the *end* of the buffer was reached + * before the end of the varint. + */ +inline uint64_t decode_varint(const char** data, const char* end) { + // If this is a one-byte varint, decode it here. + if (end != *data && ((**data & 0x80) == 0)) { + uint64_t val = uint64_t(**data); + ++(*data); + return val; + } + // If this varint is more than one byte, defer to complete implementation. + return detail::decode_varint_impl(data, end); +} + +/** + * Skip over a varint. + * + * Strong exception guarantee: if there is an exception the data pointer will + * not be changed. + * + * @param[in,out] data Pointer to pointer to the input data. After the function + * returns this will point to the next data to be read. + * @param[in] end Pointer one past the end of the input data. + * @throws end_of_buffer_exception if the *end* of the buffer was reached + * before the end of the varint. + */ +inline void skip_varint(const char** data, const char* end) { + const int8_t* begin = reinterpret_cast(*data); + const int8_t* iend = reinterpret_cast(end); + const int8_t* p = begin; + + while (p != iend && *p < 0) { + ++p; + } + + if (p >= begin + max_varint_length) { + throw varint_too_long_exception(); + } + + if (p == iend) { + throw end_of_buffer_exception(); + } + + ++p; + + *data = reinterpret_cast(p); +} + +/** + * Varint encode a 64 bit integer. + * + * @tparam T An output iterator type. + * @param data Output iterator the varint encoded value will be written to + * byte by byte. + * @param value The integer that will be encoded. + * @throws Any exception thrown by increment or dereference operator on data. + */ +template +inline int write_varint(T data, uint64_t value) { + int n = 1; + + while (value >= 0x80) { + *data++ = char((value & 0x7f) | 0x80); + value >>= 7; + ++n; + } + *data++ = char(value); + + return n; +} + +/** + * ZigZag encodes a 32 bit integer. + */ +inline constexpr uint32_t encode_zigzag32(int32_t value) noexcept { + return (static_cast(value) << 1) ^ (static_cast(value >> 31)); +} + +/** + * ZigZag encodes a 64 bit integer. + */ +inline constexpr uint64_t encode_zigzag64(int64_t value) noexcept { + return (static_cast(value) << 1) ^ (static_cast(value >> 63)); +} + +/** + * Decodes a 32 bit ZigZag-encoded integer. + */ +inline constexpr int32_t decode_zigzag32(uint32_t value) noexcept { + return static_cast(value >> 1) ^ -static_cast(value & 1); +} + +/** + * Decodes a 64 bit ZigZag-encoded integer. + */ +inline constexpr int64_t decode_zigzag64(uint64_t value) noexcept { + return static_cast(value >> 1) ^ -static_cast(value & 1); +} + +} // end namespace protozero + +#endif // PROTOZERO_VARINT_HPP diff --git a/src/3rdparty/mapbox-gl-native/deps/protozero/1.5.2/include/protozero/version.hpp b/src/3rdparty/mapbox-gl-native/deps/protozero/1.5.2/include/protozero/version.hpp new file mode 100644 index 0000000..6d82823 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/protozero/1.5.2/include/protozero/version.hpp @@ -0,0 +1,34 @@ +#ifndef PROTOZERO_VERSION_HPP +#define PROTOZERO_VERSION_HPP + +/***************************************************************************** + +protozero - Minimalistic protocol buffer decoder and encoder in C++. + +This file is from https://github.com/mapbox/protozero where you can find more +documentation. + +*****************************************************************************/ + +/** + * @file version.hpp + * + * @brief Contains macros defining the protozero version. + */ + +/// The major version number +#define PROTOZERO_VERSION_MAJOR 1 + +/// The minor version number +#define PROTOZERO_VERSION_MINOR 5 + +/// The patch number +#define PROTOZERO_VERSION_PATCH 2 + +/// The complete version number +#define PROTOZERO_VERSION_CODE (PROTOZERO_VERSION_MAJOR * 10000 + PROTOZERO_VERSION_MINOR * 100 + PROTOZERO_VERSION_PATCH) + +/// Version number as string +#define PROTOZERO_VERSION_STRING "1.5.2" + +#endif // PROTOZERO_VERSION_HPP diff --git a/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/allocators.h b/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/allocators.h new file mode 100644 index 0000000..98affe0 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/allocators.h @@ -0,0 +1,271 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_ALLOCATORS_H_ +#define RAPIDJSON_ALLOCATORS_H_ + +#include "rapidjson.h" + +RAPIDJSON_NAMESPACE_BEGIN + +/////////////////////////////////////////////////////////////////////////////// +// Allocator + +/*! \class rapidjson::Allocator + \brief Concept for allocating, resizing and freeing memory block. + + Note that Malloc() and Realloc() are non-static but Free() is static. + + So if an allocator need to support Free(), it needs to put its pointer in + the header of memory block. + +\code +concept Allocator { + static const bool kNeedFree; //!< Whether this allocator needs to call Free(). + + // Allocate a memory block. + // \param size of the memory block in bytes. + // \returns pointer to the memory block. + void* Malloc(size_t size); + + // Resize a memory block. + // \param originalPtr The pointer to current memory block. Null pointer is permitted. + // \param originalSize The current size in bytes. (Design issue: since some allocator may not book-keep this, explicitly pass to it can save memory.) + // \param newSize the new size in bytes. + void* Realloc(void* originalPtr, size_t originalSize, size_t newSize); + + // Free a memory block. + // \param pointer to the memory block. Null pointer is permitted. + static void Free(void *ptr); +}; +\endcode +*/ + +/////////////////////////////////////////////////////////////////////////////// +// CrtAllocator + +//! C-runtime library allocator. +/*! This class is just wrapper for standard C library memory routines. + \note implements Allocator concept +*/ +class CrtAllocator { +public: + static const bool kNeedFree = true; + void* Malloc(size_t size) { + if (size) // behavior of malloc(0) is implementation defined. + return std::malloc(size); + else + return NULL; // standardize to returning NULL. + } + void* Realloc(void* originalPtr, size_t originalSize, size_t newSize) { + (void)originalSize; + if (newSize == 0) { + std::free(originalPtr); + return NULL; + } + return std::realloc(originalPtr, newSize); + } + static void Free(void *ptr) { std::free(ptr); } +}; + +/////////////////////////////////////////////////////////////////////////////// +// MemoryPoolAllocator + +//! Default memory allocator used by the parser and DOM. +/*! This allocator allocate memory blocks from pre-allocated memory chunks. + + It does not free memory blocks. And Realloc() only allocate new memory. + + The memory chunks are allocated by BaseAllocator, which is CrtAllocator by default. + + User may also supply a buffer as the first chunk. + + If the user-buffer is full then additional chunks are allocated by BaseAllocator. + + The user-buffer is not deallocated by this allocator. + + \tparam BaseAllocator the allocator type for allocating memory chunks. Default is CrtAllocator. + \note implements Allocator concept +*/ +template +class MemoryPoolAllocator { +public: + static const bool kNeedFree = false; //!< Tell users that no need to call Free() with this allocator. (concept Allocator) + + //! Constructor with chunkSize. + /*! \param chunkSize The size of memory chunk. The default is kDefaultChunkSize. + \param baseAllocator The allocator for allocating memory chunks. + */ + MemoryPoolAllocator(size_t chunkSize = kDefaultChunkCapacity, BaseAllocator* baseAllocator = 0) : + chunkHead_(0), chunk_capacity_(chunkSize), userBuffer_(0), baseAllocator_(baseAllocator), ownBaseAllocator_(0) + { + } + + //! Constructor with user-supplied buffer. + /*! The user buffer will be used firstly. When it is full, memory pool allocates new chunk with chunk size. + + The user buffer will not be deallocated when this allocator is destructed. + + \param buffer User supplied buffer. + \param size Size of the buffer in bytes. It must at least larger than sizeof(ChunkHeader). + \param chunkSize The size of memory chunk. The default is kDefaultChunkSize. + \param baseAllocator The allocator for allocating memory chunks. + */ + MemoryPoolAllocator(void *buffer, size_t size, size_t chunkSize = kDefaultChunkCapacity, BaseAllocator* baseAllocator = 0) : + chunkHead_(0), chunk_capacity_(chunkSize), userBuffer_(buffer), baseAllocator_(baseAllocator), ownBaseAllocator_(0) + { + RAPIDJSON_ASSERT(buffer != 0); + RAPIDJSON_ASSERT(size > sizeof(ChunkHeader)); + chunkHead_ = reinterpret_cast(buffer); + chunkHead_->capacity = size - sizeof(ChunkHeader); + chunkHead_->size = 0; + chunkHead_->next = 0; + } + + //! Destructor. + /*! This deallocates all memory chunks, excluding the user-supplied buffer. + */ + ~MemoryPoolAllocator() { + Clear(); + RAPIDJSON_DELETE(ownBaseAllocator_); + } + + //! Deallocates all memory chunks, excluding the user-supplied buffer. + void Clear() { + while (chunkHead_ && chunkHead_ != userBuffer_) { + ChunkHeader* next = chunkHead_->next; + baseAllocator_->Free(chunkHead_); + chunkHead_ = next; + } + if (chunkHead_ && chunkHead_ == userBuffer_) + chunkHead_->size = 0; // Clear user buffer + } + + //! Computes the total capacity of allocated memory chunks. + /*! \return total capacity in bytes. + */ + size_t Capacity() const { + size_t capacity = 0; + for (ChunkHeader* c = chunkHead_; c != 0; c = c->next) + capacity += c->capacity; + return capacity; + } + + //! Computes the memory blocks allocated. + /*! \return total used bytes. + */ + size_t Size() const { + size_t size = 0; + for (ChunkHeader* c = chunkHead_; c != 0; c = c->next) + size += c->size; + return size; + } + + //! Allocates a memory block. (concept Allocator) + void* Malloc(size_t size) { + if (!size) + return NULL; + + size = RAPIDJSON_ALIGN(size); + if (chunkHead_ == 0 || chunkHead_->size + size > chunkHead_->capacity) + if (!AddChunk(chunk_capacity_ > size ? chunk_capacity_ : size)) + return NULL; + + void *buffer = reinterpret_cast(chunkHead_) + RAPIDJSON_ALIGN(sizeof(ChunkHeader)) + chunkHead_->size; + chunkHead_->size += size; + return buffer; + } + + //! Resizes a memory block (concept Allocator) + void* Realloc(void* originalPtr, size_t originalSize, size_t newSize) { + if (originalPtr == 0) + return Malloc(newSize); + + if (newSize == 0) + return NULL; + + originalSize = RAPIDJSON_ALIGN(originalSize); + newSize = RAPIDJSON_ALIGN(newSize); + + // Do not shrink if new size is smaller than original + if (originalSize >= newSize) + return originalPtr; + + // Simply expand it if it is the last allocation and there is sufficient space + if (originalPtr == reinterpret_cast(chunkHead_) + RAPIDJSON_ALIGN(sizeof(ChunkHeader)) + chunkHead_->size - originalSize) { + size_t increment = static_cast(newSize - originalSize); + if (chunkHead_->size + increment <= chunkHead_->capacity) { + chunkHead_->size += increment; + return originalPtr; + } + } + + // Realloc process: allocate and copy memory, do not free original buffer. + if (void* newBuffer = Malloc(newSize)) { + if (originalSize) + std::memcpy(newBuffer, originalPtr, originalSize); + return newBuffer; + } + else + return NULL; + } + + //! Frees a memory block (concept Allocator) + static void Free(void *ptr) { (void)ptr; } // Do nothing + +private: + //! Copy constructor is not permitted. + MemoryPoolAllocator(const MemoryPoolAllocator& rhs) /* = delete */; + //! Copy assignment operator is not permitted. + MemoryPoolAllocator& operator=(const MemoryPoolAllocator& rhs) /* = delete */; + + //! Creates a new chunk. + /*! \param capacity Capacity of the chunk in bytes. + \return true if success. + */ + bool AddChunk(size_t capacity) { + if (!baseAllocator_) + ownBaseAllocator_ = baseAllocator_ = RAPIDJSON_NEW(BaseAllocator()); + if (ChunkHeader* chunk = reinterpret_cast(baseAllocator_->Malloc(RAPIDJSON_ALIGN(sizeof(ChunkHeader)) + capacity))) { + chunk->capacity = capacity; + chunk->size = 0; + chunk->next = chunkHead_; + chunkHead_ = chunk; + return true; + } + else + return false; + } + + static const int kDefaultChunkCapacity = 64 * 1024; //!< Default chunk capacity. + + //! Chunk header for perpending to each chunk. + /*! Chunks are stored as a singly linked list. + */ + struct ChunkHeader { + size_t capacity; //!< Capacity of the chunk in bytes (excluding the header itself). + size_t size; //!< Current size of allocated memory in bytes. + ChunkHeader *next; //!< Next chunk in the linked list. + }; + + ChunkHeader *chunkHead_; //!< Head of the chunk linked-list. Only the head chunk serves allocation. + size_t chunk_capacity_; //!< The minimum capacity of chunk when they are allocated. + void *userBuffer_; //!< User supplied buffer. + BaseAllocator* baseAllocator_; //!< base allocator for allocating memory chunks. + BaseAllocator* ownBaseAllocator_; //!< base allocator created by this object. +}; + +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_ENCODINGS_H_ diff --git a/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/document.h b/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/document.h new file mode 100644 index 0000000..e3e20df --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/document.h @@ -0,0 +1,2575 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_DOCUMENT_H_ +#define RAPIDJSON_DOCUMENT_H_ + +/*! \file document.h */ + +#include "reader.h" +#include "internal/meta.h" +#include "internal/strfunc.h" +#include "memorystream.h" +#include "encodedstream.h" +#include // placement new +#include + +RAPIDJSON_DIAG_PUSH +#ifdef _MSC_VER +RAPIDJSON_DIAG_OFF(4127) // conditional expression is constant +RAPIDJSON_DIAG_OFF(4244) // conversion from kXxxFlags to 'uint16_t', possible loss of data +#endif + +#ifdef __clang__ +RAPIDJSON_DIAG_OFF(padded) +RAPIDJSON_DIAG_OFF(switch-enum) +RAPIDJSON_DIAG_OFF(c++98-compat) +#endif + +#ifdef __GNUC__ +RAPIDJSON_DIAG_OFF(effc++) +#if __GNUC__ >= 6 +RAPIDJSON_DIAG_OFF(terminate) // ignore throwing RAPIDJSON_ASSERT in RAPIDJSON_NOEXCEPT functions +#endif +#endif // __GNUC__ + +#ifndef RAPIDJSON_NOMEMBERITERATORCLASS +#include // std::iterator, std::random_access_iterator_tag +#endif + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS +#include // std::move +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +// Forward declaration. +template +class GenericValue; + +template +class GenericDocument; + +//! Name-value pair in a JSON object value. +/*! + This class was internal to GenericValue. It used to be a inner struct. + But a compiler (IBM XL C/C++ for AIX) have reported to have problem with that so it moved as a namespace scope struct. + https://code.google.com/p/rapidjson/issues/detail?id=64 +*/ +template +struct GenericMember { + GenericValue name; //!< name of member (must be a string) + GenericValue value; //!< value of member. +}; + +/////////////////////////////////////////////////////////////////////////////// +// GenericMemberIterator + +#ifndef RAPIDJSON_NOMEMBERITERATORCLASS + +//! (Constant) member iterator for a JSON object value +/*! + \tparam Const Is this a constant iterator? + \tparam Encoding Encoding of the value. (Even non-string values need to have the same encoding in a document) + \tparam Allocator Allocator type for allocating memory of object, array and string. + + This class implements a Random Access Iterator for GenericMember elements + of a GenericValue, see ISO/IEC 14882:2003(E) C++ standard, 24.1 [lib.iterator.requirements]. + + \note This iterator implementation is mainly intended to avoid implicit + conversions from iterator values to \c NULL, + e.g. from GenericValue::FindMember. + + \note Define \c RAPIDJSON_NOMEMBERITERATORCLASS to fall back to a + pointer-based implementation, if your platform doesn't provide + the C++ header. + + \see GenericMember, GenericValue::MemberIterator, GenericValue::ConstMemberIterator + */ +template +class GenericMemberIterator + : public std::iterator >::Type> { + + friend class GenericValue; + template friend class GenericMemberIterator; + + typedef GenericMember PlainType; + typedef typename internal::MaybeAddConst::Type ValueType; + typedef std::iterator BaseType; + +public: + //! Iterator type itself + typedef GenericMemberIterator Iterator; + //! Constant iterator type + typedef GenericMemberIterator ConstIterator; + //! Non-constant iterator type + typedef GenericMemberIterator NonConstIterator; + + //! Pointer to (const) GenericMember + typedef typename BaseType::pointer Pointer; + //! Reference to (const) GenericMember + typedef typename BaseType::reference Reference; + //! Signed integer type (e.g. \c ptrdiff_t) + typedef typename BaseType::difference_type DifferenceType; + + //! Default constructor (singular value) + /*! Creates an iterator pointing to no element. + \note All operations, except for comparisons, are undefined on such values. + */ + GenericMemberIterator() : ptr_() {} + + //! Iterator conversions to more const + /*! + \param it (Non-const) iterator to copy from + + Allows the creation of an iterator from another GenericMemberIterator + that is "less const". Especially, creating a non-constant iterator + from a constant iterator are disabled: + \li const -> non-const (not ok) + \li const -> const (ok) + \li non-const -> const (ok) + \li non-const -> non-const (ok) + + \note If the \c Const template parameter is already \c false, this + constructor effectively defines a regular copy-constructor. + Otherwise, the copy constructor is implicitly defined. + */ + GenericMemberIterator(const NonConstIterator & it) : ptr_(it.ptr_) {} + Iterator& operator=(const NonConstIterator & it) { ptr_ = it.ptr_; return *this; } + + //! @name stepping + //@{ + Iterator& operator++(){ ++ptr_; return *this; } + Iterator& operator--(){ --ptr_; return *this; } + Iterator operator++(int){ Iterator old(*this); ++ptr_; return old; } + Iterator operator--(int){ Iterator old(*this); --ptr_; return old; } + //@} + + //! @name increment/decrement + //@{ + Iterator operator+(DifferenceType n) const { return Iterator(ptr_+n); } + Iterator operator-(DifferenceType n) const { return Iterator(ptr_-n); } + + Iterator& operator+=(DifferenceType n) { ptr_+=n; return *this; } + Iterator& operator-=(DifferenceType n) { ptr_-=n; return *this; } + //@} + + //! @name relations + //@{ + bool operator==(ConstIterator that) const { return ptr_ == that.ptr_; } + bool operator!=(ConstIterator that) const { return ptr_ != that.ptr_; } + bool operator<=(ConstIterator that) const { return ptr_ <= that.ptr_; } + bool operator>=(ConstIterator that) const { return ptr_ >= that.ptr_; } + bool operator< (ConstIterator that) const { return ptr_ < that.ptr_; } + bool operator> (ConstIterator that) const { return ptr_ > that.ptr_; } + //@} + + //! @name dereference + //@{ + Reference operator*() const { return *ptr_; } + Pointer operator->() const { return ptr_; } + Reference operator[](DifferenceType n) const { return ptr_[n]; } + //@} + + //! Distance + DifferenceType operator-(ConstIterator that) const { return ptr_-that.ptr_; } + +private: + //! Internal constructor from plain pointer + explicit GenericMemberIterator(Pointer p) : ptr_(p) {} + + Pointer ptr_; //!< raw pointer +}; + +#else // RAPIDJSON_NOMEMBERITERATORCLASS + +// class-based member iterator implementation disabled, use plain pointers + +template +struct GenericMemberIterator; + +//! non-const GenericMemberIterator +template +struct GenericMemberIterator { + //! use plain pointer as iterator type + typedef GenericMember* Iterator; +}; +//! const GenericMemberIterator +template +struct GenericMemberIterator { + //! use plain const pointer as iterator type + typedef const GenericMember* Iterator; +}; + +#endif // RAPIDJSON_NOMEMBERITERATORCLASS + +/////////////////////////////////////////////////////////////////////////////// +// GenericStringRef + +//! Reference to a constant string (not taking a copy) +/*! + \tparam CharType character type of the string + + This helper class is used to automatically infer constant string + references for string literals, especially from \c const \b (!) + character arrays. + + The main use is for creating JSON string values without copying the + source string via an \ref Allocator. This requires that the referenced + string pointers have a sufficient lifetime, which exceeds the lifetime + of the associated GenericValue. + + \b Example + \code + Value v("foo"); // ok, no need to copy & calculate length + const char foo[] = "foo"; + v.SetString(foo); // ok + + const char* bar = foo; + // Value x(bar); // not ok, can't rely on bar's lifetime + Value x(StringRef(bar)); // lifetime explicitly guaranteed by user + Value y(StringRef(bar, 3)); // ok, explicitly pass length + \endcode + + \see StringRef, GenericValue::SetString +*/ +template +struct GenericStringRef { + typedef CharType Ch; //!< character type of the string + + //! Create string reference from \c const character array +#ifndef __clang__ // -Wdocumentation + /*! + This constructor implicitly creates a constant string reference from + a \c const character array. It has better performance than + \ref StringRef(const CharType*) by inferring the string \ref length + from the array length, and also supports strings containing null + characters. + + \tparam N length of the string, automatically inferred + + \param str Constant character array, lifetime assumed to be longer + than the use of the string in e.g. a GenericValue + + \post \ref s == str + + \note Constant complexity. + \note There is a hidden, private overload to disallow references to + non-const character arrays to be created via this constructor. + By this, e.g. function-scope arrays used to be filled via + \c snprintf are excluded from consideration. + In such cases, the referenced string should be \b copied to the + GenericValue instead. + */ +#endif + template + GenericStringRef(const CharType (&str)[N]) RAPIDJSON_NOEXCEPT + : s(str), length(N-1) {} + + //! Explicitly create string reference from \c const character pointer +#ifndef __clang__ // -Wdocumentation + /*! + This constructor can be used to \b explicitly create a reference to + a constant string pointer. + + \see StringRef(const CharType*) + + \param str Constant character pointer, lifetime assumed to be longer + than the use of the string in e.g. a GenericValue + + \post \ref s == str + + \note There is a hidden, private overload to disallow references to + non-const character arrays to be created via this constructor. + By this, e.g. function-scope arrays used to be filled via + \c snprintf are excluded from consideration. + In such cases, the referenced string should be \b copied to the + GenericValue instead. + */ +#endif + explicit GenericStringRef(const CharType* str) + : s(str), length(internal::StrLen(str)){ RAPIDJSON_ASSERT(s != 0); } + + //! Create constant string reference from pointer and length +#ifndef __clang__ // -Wdocumentation + /*! \param str constant string, lifetime assumed to be longer than the use of the string in e.g. a GenericValue + \param len length of the string, excluding the trailing NULL terminator + + \post \ref s == str && \ref length == len + \note Constant complexity. + */ +#endif + GenericStringRef(const CharType* str, SizeType len) + : s(str), length(len) { RAPIDJSON_ASSERT(s != 0); } + + GenericStringRef(const GenericStringRef& rhs) : s(rhs.s), length(rhs.length) {} + + GenericStringRef& operator=(const GenericStringRef& rhs) { s = rhs.s; length = rhs.length; } + + //! implicit conversion to plain CharType pointer + operator const Ch *() const { return s; } + + const Ch* const s; //!< plain CharType pointer + const SizeType length; //!< length of the string (excluding the trailing NULL terminator) + +private: + //! Disallow construction from non-const array + template + GenericStringRef(CharType (&str)[N]) /* = delete */; +}; + +//! Mark a character pointer as constant string +/*! Mark a plain character pointer as a "string literal". This function + can be used to avoid copying a character string to be referenced as a + value in a JSON GenericValue object, if the string's lifetime is known + to be valid long enough. + \tparam CharType Character type of the string + \param str Constant string, lifetime assumed to be longer than the use of the string in e.g. a GenericValue + \return GenericStringRef string reference object + \relatesalso GenericStringRef + + \see GenericValue::GenericValue(StringRefType), GenericValue::operator=(StringRefType), GenericValue::SetString(StringRefType), GenericValue::PushBack(StringRefType, Allocator&), GenericValue::AddMember +*/ +template +inline GenericStringRef StringRef(const CharType* str) { + return GenericStringRef(str, internal::StrLen(str)); +} + +//! Mark a character pointer as constant string +/*! Mark a plain character pointer as a "string literal". This function + can be used to avoid copying a character string to be referenced as a + value in a JSON GenericValue object, if the string's lifetime is known + to be valid long enough. + + This version has better performance with supplied length, and also + supports string containing null characters. + + \tparam CharType character type of the string + \param str Constant string, lifetime assumed to be longer than the use of the string in e.g. a GenericValue + \param length The length of source string. + \return GenericStringRef string reference object + \relatesalso GenericStringRef +*/ +template +inline GenericStringRef StringRef(const CharType* str, size_t length) { + return GenericStringRef(str, SizeType(length)); +} + +#if RAPIDJSON_HAS_STDSTRING +//! Mark a string object as constant string +/*! Mark a string object (e.g. \c std::string) as a "string literal". + This function can be used to avoid copying a string to be referenced as a + value in a JSON GenericValue object, if the string's lifetime is known + to be valid long enough. + + \tparam CharType character type of the string + \param str Constant string, lifetime assumed to be longer than the use of the string in e.g. a GenericValue + \return GenericStringRef string reference object + \relatesalso GenericStringRef + \note Requires the definition of the preprocessor symbol \ref RAPIDJSON_HAS_STDSTRING. +*/ +template +inline GenericStringRef StringRef(const std::basic_string& str) { + return GenericStringRef(str.data(), SizeType(str.size())); +} +#endif + +/////////////////////////////////////////////////////////////////////////////// +// GenericValue type traits +namespace internal { + +template +struct IsGenericValueImpl : FalseType {}; + +// select candidates according to nested encoding and allocator types +template struct IsGenericValueImpl::Type, typename Void::Type> + : IsBaseOf, T>::Type {}; + +// helper to match arbitrary GenericValue instantiations, including derived classes +template struct IsGenericValue : IsGenericValueImpl::Type {}; + +} // namespace internal + +/////////////////////////////////////////////////////////////////////////////// +// TypeHelper + +namespace internal { + +template +struct TypeHelper {}; + +template +struct TypeHelper { + static bool Is(const ValueType& v) { return v.IsBool(); } + static bool Get(const ValueType& v) { return v.GetBool(); } + static ValueType& Set(ValueType& v, bool data) { return v.SetBool(data); } + static ValueType& Set(ValueType& v, bool data, typename ValueType::AllocatorType&) { return v.SetBool(data); } +}; + +template +struct TypeHelper { + static bool Is(const ValueType& v) { return v.IsInt(); } + static int Get(const ValueType& v) { return v.GetInt(); } + static ValueType& Set(ValueType& v, int data) { return v.SetInt(data); } + static ValueType& Set(ValueType& v, int data, typename ValueType::AllocatorType&) { return v.SetInt(data); } +}; + +template +struct TypeHelper { + static bool Is(const ValueType& v) { return v.IsUint(); } + static unsigned Get(const ValueType& v) { return v.GetUint(); } + static ValueType& Set(ValueType& v, unsigned data) { return v.SetUint(data); } + static ValueType& Set(ValueType& v, unsigned data, typename ValueType::AllocatorType&) { return v.SetUint(data); } +}; + +template +struct TypeHelper { + static bool Is(const ValueType& v) { return v.IsInt64(); } + static int64_t Get(const ValueType& v) { return v.GetInt64(); } + static ValueType& Set(ValueType& v, int64_t data) { return v.SetInt64(data); } + static ValueType& Set(ValueType& v, int64_t data, typename ValueType::AllocatorType&) { return v.SetInt64(data); } +}; + +template +struct TypeHelper { + static bool Is(const ValueType& v) { return v.IsUint64(); } + static uint64_t Get(const ValueType& v) { return v.GetUint64(); } + static ValueType& Set(ValueType& v, uint64_t data) { return v.SetUint64(data); } + static ValueType& Set(ValueType& v, uint64_t data, typename ValueType::AllocatorType&) { return v.SetUint64(data); } +}; + +template +struct TypeHelper { + static bool Is(const ValueType& v) { return v.IsDouble(); } + static double Get(const ValueType& v) { return v.GetDouble(); } + static ValueType& Set(ValueType& v, double data) { return v.SetDouble(data); } + static ValueType& Set(ValueType& v, double data, typename ValueType::AllocatorType&) { return v.SetDouble(data); } +}; + +template +struct TypeHelper { + static bool Is(const ValueType& v) { return v.IsFloat(); } + static float Get(const ValueType& v) { return v.GetFloat(); } + static ValueType& Set(ValueType& v, float data) { return v.SetFloat(data); } + static ValueType& Set(ValueType& v, float data, typename ValueType::AllocatorType&) { return v.SetFloat(data); } +}; + +template +struct TypeHelper { + typedef const typename ValueType::Ch* StringType; + static bool Is(const ValueType& v) { return v.IsString(); } + static StringType Get(const ValueType& v) { return v.GetString(); } + static ValueType& Set(ValueType& v, const StringType data) { return v.SetString(typename ValueType::StringRefType(data)); } + static ValueType& Set(ValueType& v, const StringType data, typename ValueType::AllocatorType& a) { return v.SetString(data, a); } +}; + +#if RAPIDJSON_HAS_STDSTRING +template +struct TypeHelper > { + typedef std::basic_string StringType; + static bool Is(const ValueType& v) { return v.IsString(); } + static StringType Get(const ValueType& v) { return StringType(v.GetString(), v.GetStringLength()); } + static ValueType& Set(ValueType& v, const StringType& data, typename ValueType::AllocatorType& a) { return v.SetString(data, a); } +}; +#endif + +template +struct TypeHelper { + typedef typename ValueType::Array ArrayType; + static bool Is(const ValueType& v) { return v.IsArray(); } + static ArrayType Get(ValueType& v) { return v.GetArray(); } + static ValueType& Set(ValueType& v, ArrayType data) { return v = data; } + static ValueType& Set(ValueType& v, ArrayType data, typename ValueType::AllocatorType&) { return v = data; } +}; + +template +struct TypeHelper { + typedef typename ValueType::ConstArray ArrayType; + static bool Is(const ValueType& v) { return v.IsArray(); } + static ArrayType Get(const ValueType& v) { return v.GetArray(); } +}; + +template +struct TypeHelper { + typedef typename ValueType::Object ObjectType; + static bool Is(const ValueType& v) { return v.IsObject(); } + static ObjectType Get(ValueType& v) { return v.GetObject(); } + static ValueType& Set(ValueType& v, ObjectType data) { return v = data; } + static ValueType& Set(ValueType& v, ObjectType data, typename ValueType::AllocatorType&) { v = data; } +}; + +template +struct TypeHelper { + typedef typename ValueType::ConstObject ObjectType; + static bool Is(const ValueType& v) { return v.IsObject(); } + static ObjectType Get(const ValueType& v) { return v.GetObject(); } +}; + +} // namespace internal + +// Forward declarations +template class GenericArray; +template class GenericObject; + +/////////////////////////////////////////////////////////////////////////////// +// GenericValue + +//! Represents a JSON value. Use Value for UTF8 encoding and default allocator. +/*! + A JSON value can be one of 7 types. This class is a variant type supporting + these types. + + Use the Value if UTF8 and default allocator + + \tparam Encoding Encoding of the value. (Even non-string values need to have the same encoding in a document) + \tparam Allocator Allocator type for allocating memory of object, array and string. +*/ +template > +class GenericValue { +public: + //! Name-value pair in an object. + typedef GenericMember Member; + typedef Encoding EncodingType; //!< Encoding type from template parameter. + typedef Allocator AllocatorType; //!< Allocator type from template parameter. + typedef typename Encoding::Ch Ch; //!< Character type derived from Encoding. + typedef GenericStringRef StringRefType; //!< Reference to a constant string + typedef typename GenericMemberIterator::Iterator MemberIterator; //!< Member iterator for iterating in object. + typedef typename GenericMemberIterator::Iterator ConstMemberIterator; //!< Constant member iterator for iterating in object. + typedef GenericValue* ValueIterator; //!< Value iterator for iterating in array. + typedef const GenericValue* ConstValueIterator; //!< Constant value iterator for iterating in array. + typedef GenericValue ValueType; //!< Value type of itself. + typedef GenericArray Array; + typedef GenericArray ConstArray; + typedef GenericObject Object; + typedef GenericObject ConstObject; + + //!@name Constructors and destructor. + //@{ + + //! Default constructor creates a null value. + GenericValue() RAPIDJSON_NOEXCEPT : data_() { data_.f.flags = kNullFlag; } + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + //! Move constructor in C++11 + GenericValue(GenericValue&& rhs) RAPIDJSON_NOEXCEPT : data_(rhs.data_) { + rhs.data_.f.flags = kNullFlag; // give up contents + } +#endif + +private: + //! Copy constructor is not permitted. + GenericValue(const GenericValue& rhs); + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + //! Moving from a GenericDocument is not permitted. + template + GenericValue(GenericDocument&& rhs); + + //! Move assignment from a GenericDocument is not permitted. + template + GenericValue& operator=(GenericDocument&& rhs); +#endif + +public: + + //! Constructor with JSON value type. + /*! This creates a Value of specified type with default content. + \param type Type of the value. + \note Default content for number is zero. + */ + explicit GenericValue(Type type) RAPIDJSON_NOEXCEPT : data_() { + static const uint16_t defaultFlags[7] = { + kNullFlag, kFalseFlag, kTrueFlag, kObjectFlag, kArrayFlag, kShortStringFlag, + kNumberAnyFlag + }; + RAPIDJSON_ASSERT(type <= kNumberType); + data_.f.flags = defaultFlags[type]; + + // Use ShortString to store empty string. + if (type == kStringType) + data_.ss.SetLength(0); + } + + //! Explicit copy constructor (with allocator) + /*! Creates a copy of a Value by using the given Allocator + \tparam SourceAllocator allocator of \c rhs + \param rhs Value to copy from (read-only) + \param allocator Allocator for allocating copied elements and buffers. Commonly use GenericDocument::GetAllocator(). + \see CopyFrom() + */ + template< typename SourceAllocator > + GenericValue(const GenericValue& rhs, Allocator & allocator); + + //! Constructor for boolean value. + /*! \param b Boolean value + \note This constructor is limited to \em real boolean values and rejects + implicitly converted types like arbitrary pointers. Use an explicit cast + to \c bool, if you want to construct a boolean JSON value in such cases. + */ +#ifndef RAPIDJSON_DOXYGEN_RUNNING // hide SFINAE from Doxygen + template + explicit GenericValue(T b, RAPIDJSON_ENABLEIF((internal::IsSame))) RAPIDJSON_NOEXCEPT // See #472 +#else + explicit GenericValue(bool b) RAPIDJSON_NOEXCEPT +#endif + : data_() { + // safe-guard against failing SFINAE + RAPIDJSON_STATIC_ASSERT((internal::IsSame::Value)); + data_.f.flags = b ? kTrueFlag : kFalseFlag; + } + + //! Constructor for int value. + explicit GenericValue(int i) RAPIDJSON_NOEXCEPT : data_() { + data_.n.i64 = i; + data_.f.flags = (i >= 0) ? (kNumberIntFlag | kUintFlag | kUint64Flag) : kNumberIntFlag; + } + + //! Constructor for unsigned value. + explicit GenericValue(unsigned u) RAPIDJSON_NOEXCEPT : data_() { + data_.n.u64 = u; + data_.f.flags = (u & 0x80000000) ? kNumberUintFlag : (kNumberUintFlag | kIntFlag | kInt64Flag); + } + + //! Constructor for int64_t value. + explicit GenericValue(int64_t i64) RAPIDJSON_NOEXCEPT : data_() { + data_.n.i64 = i64; + data_.f.flags = kNumberInt64Flag; + if (i64 >= 0) { + data_.f.flags |= kNumberUint64Flag; + if (!(static_cast(i64) & RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0x00000000))) + data_.f.flags |= kUintFlag; + if (!(static_cast(i64) & RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0x80000000))) + data_.f.flags |= kIntFlag; + } + else if (i64 >= static_cast(RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0x80000000))) + data_.f.flags |= kIntFlag; + } + + //! Constructor for uint64_t value. + explicit GenericValue(uint64_t u64) RAPIDJSON_NOEXCEPT : data_() { + data_.n.u64 = u64; + data_.f.flags = kNumberUint64Flag; + if (!(u64 & RAPIDJSON_UINT64_C2(0x80000000, 0x00000000))) + data_.f.flags |= kInt64Flag; + if (!(u64 & RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0x00000000))) + data_.f.flags |= kUintFlag; + if (!(u64 & RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0x80000000))) + data_.f.flags |= kIntFlag; + } + + //! Constructor for double value. + explicit GenericValue(double d) RAPIDJSON_NOEXCEPT : data_() { data_.n.d = d; data_.f.flags = kNumberDoubleFlag; } + + //! Constructor for constant string (i.e. do not make a copy of string) + GenericValue(const Ch* s, SizeType length) RAPIDJSON_NOEXCEPT : data_() { SetStringRaw(StringRef(s, length)); } + + //! Constructor for constant string (i.e. do not make a copy of string) + explicit GenericValue(StringRefType s) RAPIDJSON_NOEXCEPT : data_() { SetStringRaw(s); } + + //! Constructor for copy-string (i.e. do make a copy of string) + GenericValue(const Ch* s, SizeType length, Allocator& allocator) : data_() { SetStringRaw(StringRef(s, length), allocator); } + + //! Constructor for copy-string (i.e. do make a copy of string) + GenericValue(const Ch*s, Allocator& allocator) : data_() { SetStringRaw(StringRef(s), allocator); } + +#if RAPIDJSON_HAS_STDSTRING + //! Constructor for copy-string from a string object (i.e. do make a copy of string) + /*! \note Requires the definition of the preprocessor symbol \ref RAPIDJSON_HAS_STDSTRING. + */ + GenericValue(const std::basic_string& s, Allocator& allocator) : data_() { SetStringRaw(StringRef(s), allocator); } +#endif + + //! Constructor for Array. + /*! + \param a An array obtained by \c GetArray(). + \note \c Array is always pass-by-value. + \note the source array is moved into this value and the sourec array becomes empty. + */ + GenericValue(Array a) RAPIDJSON_NOEXCEPT : data_(a.value_.data_) { + a.value_.data_ = Data(); + a.value_.data_.f.flags = kArrayFlag; + } + + //! Constructor for Object. + /*! + \param o An object obtained by \c GetObject(). + \note \c Object is always pass-by-value. + \note the source object is moved into this value and the sourec object becomes empty. + */ + GenericValue(Object o) RAPIDJSON_NOEXCEPT : data_(o.value_.data_) { + o.value_.data_ = Data(); + o.value_.data_.f.flags = kObjectFlag; + } + + //! Destructor. + /*! Need to destruct elements of array, members of object, or copy-string. + */ + ~GenericValue() { + if (Allocator::kNeedFree) { // Shortcut by Allocator's trait + switch(data_.f.flags) { + case kArrayFlag: + { + GenericValue* e = GetElementsPointer(); + for (GenericValue* v = e; v != e + data_.a.size; ++v) + v->~GenericValue(); + Allocator::Free(e); + } + break; + + case kObjectFlag: + for (MemberIterator m = MemberBegin(); m != MemberEnd(); ++m) + m->~Member(); + Allocator::Free(GetMembersPointer()); + break; + + case kCopyStringFlag: + Allocator::Free(const_cast(GetStringPointer())); + break; + + default: + break; // Do nothing for other types. + } + } + } + + //@} + + //!@name Assignment operators + //@{ + + //! Assignment with move semantics. + /*! \param rhs Source of the assignment. It will become a null value after assignment. + */ + GenericValue& operator=(GenericValue& rhs) RAPIDJSON_NOEXCEPT { + RAPIDJSON_ASSERT(this != &rhs); + this->~GenericValue(); + RawAssign(rhs); + return *this; + } + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + //! Move assignment in C++11 + GenericValue& operator=(GenericValue&& rhs) RAPIDJSON_NOEXCEPT { + return *this = rhs.Move(); + } +#endif + + //! Assignment of constant string reference (no copy) + /*! \param str Constant string reference to be assigned + \note This overload is needed to avoid clashes with the generic primitive type assignment overload below. + \see GenericStringRef, operator=(T) + */ + GenericValue& operator=(StringRefType str) RAPIDJSON_NOEXCEPT { + GenericValue s(str); + return *this = s; + } + + //! Assignment with primitive types. + /*! \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t + \param value The value to be assigned. + + \note The source type \c T explicitly disallows all pointer types, + especially (\c const) \ref Ch*. This helps avoiding implicitly + referencing character strings with insufficient lifetime, use + \ref SetString(const Ch*, Allocator&) (for copying) or + \ref StringRef() (to explicitly mark the pointer as constant) instead. + All other pointer types would implicitly convert to \c bool, + use \ref SetBool() instead. + */ + template + RAPIDJSON_DISABLEIF_RETURN((internal::IsPointer), (GenericValue&)) + operator=(T value) { + GenericValue v(value); + return *this = v; + } + + //! Deep-copy assignment from Value + /*! Assigns a \b copy of the Value to the current Value object + \tparam SourceAllocator Allocator type of \c rhs + \param rhs Value to copy from (read-only) + \param allocator Allocator to use for copying + */ + template + GenericValue& CopyFrom(const GenericValue& rhs, Allocator& allocator) { + RAPIDJSON_ASSERT(static_cast(this) != static_cast(&rhs)); + this->~GenericValue(); + new (this) GenericValue(rhs, allocator); + return *this; + } + + //! Exchange the contents of this value with those of other. + /*! + \param other Another value. + \note Constant complexity. + */ + GenericValue& Swap(GenericValue& other) RAPIDJSON_NOEXCEPT { + GenericValue temp; + temp.RawAssign(*this); + RawAssign(other); + other.RawAssign(temp); + return *this; + } + + //! free-standing swap function helper + /*! + Helper function to enable support for common swap implementation pattern based on \c std::swap: + \code + void swap(MyClass& a, MyClass& b) { + using std::swap; + swap(a.value, b.value); + // ... + } + \endcode + \see Swap() + */ + friend inline void swap(GenericValue& a, GenericValue& b) RAPIDJSON_NOEXCEPT { a.Swap(b); } + + //! Prepare Value for move semantics + /*! \return *this */ + GenericValue& Move() RAPIDJSON_NOEXCEPT { return *this; } + //@} + + //!@name Equal-to and not-equal-to operators + //@{ + //! Equal-to operator + /*! + \note If an object contains duplicated named member, comparing equality with any object is always \c false. + \note Linear time complexity (number of all values in the subtree and total lengths of all strings). + */ + template + bool operator==(const GenericValue& rhs) const { + typedef GenericValue RhsType; + if (GetType() != rhs.GetType()) + return false; + + switch (GetType()) { + case kObjectType: // Warning: O(n^2) inner-loop + if (data_.o.size != rhs.data_.o.size) + return false; + for (ConstMemberIterator lhsMemberItr = MemberBegin(); lhsMemberItr != MemberEnd(); ++lhsMemberItr) { + typename RhsType::ConstMemberIterator rhsMemberItr = rhs.FindMember(lhsMemberItr->name); + if (rhsMemberItr == rhs.MemberEnd() || lhsMemberItr->value != rhsMemberItr->value) + return false; + } + return true; + + case kArrayType: + if (data_.a.size != rhs.data_.a.size) + return false; + for (SizeType i = 0; i < data_.a.size; i++) + if ((*this)[i] != rhs[i]) + return false; + return true; + + case kStringType: + return StringEqual(rhs); + + case kNumberType: + if (IsDouble() || rhs.IsDouble()) { + double a = GetDouble(); // May convert from integer to double. + double b = rhs.GetDouble(); // Ditto + return a >= b && a <= b; // Prevent -Wfloat-equal + } + else + return data_.n.u64 == rhs.data_.n.u64; + + default: + return true; + } + } + + //! Equal-to operator with const C-string pointer + bool operator==(const Ch* rhs) const { return *this == GenericValue(StringRef(rhs)); } + +#if RAPIDJSON_HAS_STDSTRING + //! Equal-to operator with string object + /*! \note Requires the definition of the preprocessor symbol \ref RAPIDJSON_HAS_STDSTRING. + */ + bool operator==(const std::basic_string& rhs) const { return *this == GenericValue(StringRef(rhs)); } +#endif + + //! Equal-to operator with primitive types + /*! \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t, \c double, \c true, \c false + */ + template RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr,internal::IsGenericValue >), (bool)) operator==(const T& rhs) const { return *this == GenericValue(rhs); } + + //! Not-equal-to operator + /*! \return !(*this == rhs) + */ + template + bool operator!=(const GenericValue& rhs) const { return !(*this == rhs); } + + //! Not-equal-to operator with const C-string pointer + bool operator!=(const Ch* rhs) const { return !(*this == rhs); } + + //! Not-equal-to operator with arbitrary types + /*! \return !(*this == rhs) + */ + template RAPIDJSON_DISABLEIF_RETURN((internal::IsGenericValue), (bool)) operator!=(const T& rhs) const { return !(*this == rhs); } + + //! Equal-to operator with arbitrary types (symmetric version) + /*! \return (rhs == lhs) + */ + template friend RAPIDJSON_DISABLEIF_RETURN((internal::IsGenericValue), (bool)) operator==(const T& lhs, const GenericValue& rhs) { return rhs == lhs; } + + //! Not-Equal-to operator with arbitrary types (symmetric version) + /*! \return !(rhs == lhs) + */ + template friend RAPIDJSON_DISABLEIF_RETURN((internal::IsGenericValue), (bool)) operator!=(const T& lhs, const GenericValue& rhs) { return !(rhs == lhs); } + //@} + + //!@name Type + //@{ + + Type GetType() const { return static_cast(data_.f.flags & kTypeMask); } + bool IsNull() const { return data_.f.flags == kNullFlag; } + bool IsFalse() const { return data_.f.flags == kFalseFlag; } + bool IsTrue() const { return data_.f.flags == kTrueFlag; } + bool IsBool() const { return (data_.f.flags & kBoolFlag) != 0; } + bool IsObject() const { return data_.f.flags == kObjectFlag; } + bool IsArray() const { return data_.f.flags == kArrayFlag; } + bool IsNumber() const { return (data_.f.flags & kNumberFlag) != 0; } + bool IsInt() const { return (data_.f.flags & kIntFlag) != 0; } + bool IsUint() const { return (data_.f.flags & kUintFlag) != 0; } + bool IsInt64() const { return (data_.f.flags & kInt64Flag) != 0; } + bool IsUint64() const { return (data_.f.flags & kUint64Flag) != 0; } + bool IsDouble() const { return (data_.f.flags & kDoubleFlag) != 0; } + bool IsString() const { return (data_.f.flags & kStringFlag) != 0; } + + // Checks whether a number can be losslessly converted to a double. + bool IsLosslessDouble() const { + if (!IsNumber()) return false; + if (IsUint64()) { + uint64_t u = GetUint64(); + volatile double d = static_cast(u); + return (d >= 0.0) + && (d < static_cast(std::numeric_limits::max())) + && (u == static_cast(d)); + } + if (IsInt64()) { + int64_t i = GetInt64(); + volatile double d = static_cast(i); + return (d >= static_cast(std::numeric_limits::min())) + && (d < static_cast(std::numeric_limits::max())) + && (i == static_cast(d)); + } + return true; // double, int, uint are always lossless + } + + // Checks whether a number is a float (possible lossy). + bool IsFloat() const { + if ((data_.f.flags & kDoubleFlag) == 0) + return false; + double d = GetDouble(); + return d >= -3.4028234e38 && d <= 3.4028234e38; + } + // Checks whether a number can be losslessly converted to a float. + bool IsLosslessFloat() const { + if (!IsNumber()) return false; + double a = GetDouble(); + if (a < static_cast(-std::numeric_limits::max()) + || a > static_cast(std::numeric_limits::max())) + return false; + double b = static_cast(static_cast(a)); + return a >= b && a <= b; // Prevent -Wfloat-equal + } + + //@} + + //!@name Null + //@{ + + GenericValue& SetNull() { this->~GenericValue(); new (this) GenericValue(); return *this; } + + //@} + + //!@name Bool + //@{ + + bool GetBool() const { RAPIDJSON_ASSERT(IsBool()); return data_.f.flags == kTrueFlag; } + //!< Set boolean value + /*! \post IsBool() == true */ + GenericValue& SetBool(bool b) { this->~GenericValue(); new (this) GenericValue(b); return *this; } + + //@} + + //!@name Object + //@{ + + //! Set this value as an empty object. + /*! \post IsObject() == true */ + GenericValue& SetObject() { this->~GenericValue(); new (this) GenericValue(kObjectType); return *this; } + + //! Get the number of members in the object. + SizeType MemberCount() const { RAPIDJSON_ASSERT(IsObject()); return data_.o.size; } + + //! Check whether the object is empty. + bool ObjectEmpty() const { RAPIDJSON_ASSERT(IsObject()); return data_.o.size == 0; } + + //! Get a value from an object associated with the name. + /*! \pre IsObject() == true + \tparam T Either \c Ch or \c const \c Ch (template used for disambiguation with \ref operator[](SizeType)) + \note In version 0.1x, if the member is not found, this function returns a null value. This makes issue 7. + Since 0.2, if the name is not correct, it will assert. + If user is unsure whether a member exists, user should use HasMember() first. + A better approach is to use FindMember(). + \note Linear time complexity. + */ + template + RAPIDJSON_DISABLEIF_RETURN((internal::NotExpr::Type, Ch> >),(GenericValue&)) operator[](T* name) { + GenericValue n(StringRef(name)); + return (*this)[n]; + } + template + RAPIDJSON_DISABLEIF_RETURN((internal::NotExpr::Type, Ch> >),(const GenericValue&)) operator[](T* name) const { return const_cast(*this)[name]; } + + //! Get a value from an object associated with the name. + /*! \pre IsObject() == true + \tparam SourceAllocator Allocator of the \c name value + + \note Compared to \ref operator[](T*), this version is faster because it does not need a StrLen(). + And it can also handle strings with embedded null characters. + + \note Linear time complexity. + */ + template + GenericValue& operator[](const GenericValue& name) { + MemberIterator member = FindMember(name); + if (member != MemberEnd()) + return member->value; + else { + RAPIDJSON_ASSERT(false); // see above note + + // This will generate -Wexit-time-destructors in clang + // static GenericValue NullValue; + // return NullValue; + + // Use static buffer and placement-new to prevent destruction + static char buffer[sizeof(GenericValue)]; + return *new (buffer) GenericValue(); + } + } + template + const GenericValue& operator[](const GenericValue& name) const { return const_cast(*this)[name]; } + +#if RAPIDJSON_HAS_STDSTRING + //! Get a value from an object associated with name (string object). + GenericValue& operator[](const std::basic_string& name) { return (*this)[GenericValue(StringRef(name))]; } + const GenericValue& operator[](const std::basic_string& name) const { return (*this)[GenericValue(StringRef(name))]; } +#endif + + //! Const member iterator + /*! \pre IsObject() == true */ + ConstMemberIterator MemberBegin() const { RAPIDJSON_ASSERT(IsObject()); return ConstMemberIterator(GetMembersPointer()); } + //! Const \em past-the-end member iterator + /*! \pre IsObject() == true */ + ConstMemberIterator MemberEnd() const { RAPIDJSON_ASSERT(IsObject()); return ConstMemberIterator(GetMembersPointer() + data_.o.size); } + //! Member iterator + /*! \pre IsObject() == true */ + MemberIterator MemberBegin() { RAPIDJSON_ASSERT(IsObject()); return MemberIterator(GetMembersPointer()); } + //! \em Past-the-end member iterator + /*! \pre IsObject() == true */ + MemberIterator MemberEnd() { RAPIDJSON_ASSERT(IsObject()); return MemberIterator(GetMembersPointer() + data_.o.size); } + + //! Check whether a member exists in the object. + /*! + \param name Member name to be searched. + \pre IsObject() == true + \return Whether a member with that name exists. + \note It is better to use FindMember() directly if you need the obtain the value as well. + \note Linear time complexity. + */ + bool HasMember(const Ch* name) const { return FindMember(name) != MemberEnd(); } + +#if RAPIDJSON_HAS_STDSTRING + //! Check whether a member exists in the object with string object. + /*! + \param name Member name to be searched. + \pre IsObject() == true + \return Whether a member with that name exists. + \note It is better to use FindMember() directly if you need the obtain the value as well. + \note Linear time complexity. + */ + bool HasMember(const std::basic_string& name) const { return FindMember(name) != MemberEnd(); } +#endif + + //! Check whether a member exists in the object with GenericValue name. + /*! + This version is faster because it does not need a StrLen(). It can also handle string with null character. + \param name Member name to be searched. + \pre IsObject() == true + \return Whether a member with that name exists. + \note It is better to use FindMember() directly if you need the obtain the value as well. + \note Linear time complexity. + */ + template + bool HasMember(const GenericValue& name) const { return FindMember(name) != MemberEnd(); } + + //! Find member by name. + /*! + \param name Member name to be searched. + \pre IsObject() == true + \return Iterator to member, if it exists. + Otherwise returns \ref MemberEnd(). + + \note Earlier versions of Rapidjson returned a \c NULL pointer, in case + the requested member doesn't exist. For consistency with e.g. + \c std::map, this has been changed to MemberEnd() now. + \note Linear time complexity. + */ + MemberIterator FindMember(const Ch* name) { + GenericValue n(StringRef(name)); + return FindMember(n); + } + + ConstMemberIterator FindMember(const Ch* name) const { return const_cast(*this).FindMember(name); } + + //! Find member by name. + /*! + This version is faster because it does not need a StrLen(). It can also handle string with null character. + \param name Member name to be searched. + \pre IsObject() == true + \return Iterator to member, if it exists. + Otherwise returns \ref MemberEnd(). + + \note Earlier versions of Rapidjson returned a \c NULL pointer, in case + the requested member doesn't exist. For consistency with e.g. + \c std::map, this has been changed to MemberEnd() now. + \note Linear time complexity. + */ + template + MemberIterator FindMember(const GenericValue& name) { + RAPIDJSON_ASSERT(IsObject()); + RAPIDJSON_ASSERT(name.IsString()); + MemberIterator member = MemberBegin(); + for ( ; member != MemberEnd(); ++member) + if (name.StringEqual(member->name)) + break; + return member; + } + template ConstMemberIterator FindMember(const GenericValue& name) const { return const_cast(*this).FindMember(name); } + +#if RAPIDJSON_HAS_STDSTRING + //! Find member by string object name. + /*! + \param name Member name to be searched. + \pre IsObject() == true + \return Iterator to member, if it exists. + Otherwise returns \ref MemberEnd(). + */ + MemberIterator FindMember(const std::basic_string& name) { return FindMember(GenericValue(StringRef(name))); } + ConstMemberIterator FindMember(const std::basic_string& name) const { return FindMember(GenericValue(StringRef(name))); } +#endif + + //! Add a member (name-value pair) to the object. + /*! \param name A string value as name of member. + \param value Value of any type. + \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \note The ownership of \c name and \c value will be transferred to this object on success. + \pre IsObject() && name.IsString() + \post name.IsNull() && value.IsNull() + \note Amortized Constant time complexity. + */ + GenericValue& AddMember(GenericValue& name, GenericValue& value, Allocator& allocator) { + RAPIDJSON_ASSERT(IsObject()); + RAPIDJSON_ASSERT(name.IsString()); + + ObjectData& o = data_.o; + if (o.size >= o.capacity) { + if (o.capacity == 0) { + o.capacity = kDefaultObjectCapacity; + SetMembersPointer(reinterpret_cast(allocator.Malloc(o.capacity * sizeof(Member)))); + } + else { + SizeType oldCapacity = o.capacity; + o.capacity += (oldCapacity + 1) / 2; // grow by factor 1.5 + SetMembersPointer(reinterpret_cast(allocator.Realloc(GetMembersPointer(), oldCapacity * sizeof(Member), o.capacity * sizeof(Member)))); + } + } + Member* members = GetMembersPointer(); + members[o.size].name.RawAssign(name); + members[o.size].value.RawAssign(value); + o.size++; + return *this; + } + + //! Add a constant string value as member (name-value pair) to the object. + /*! \param name A string value as name of member. + \param value constant string reference as value of member. + \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \pre IsObject() + \note This overload is needed to avoid clashes with the generic primitive type AddMember(GenericValue&,T,Allocator&) overload below. + \note Amortized Constant time complexity. + */ + GenericValue& AddMember(GenericValue& name, StringRefType value, Allocator& allocator) { + GenericValue v(value); + return AddMember(name, v, allocator); + } + +#if RAPIDJSON_HAS_STDSTRING + //! Add a string object as member (name-value pair) to the object. + /*! \param name A string value as name of member. + \param value constant string reference as value of member. + \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \pre IsObject() + \note This overload is needed to avoid clashes with the generic primitive type AddMember(GenericValue&,T,Allocator&) overload below. + \note Amortized Constant time complexity. + */ + GenericValue& AddMember(GenericValue& name, std::basic_string& value, Allocator& allocator) { + GenericValue v(value, allocator); + return AddMember(name, v, allocator); + } +#endif + + //! Add any primitive value as member (name-value pair) to the object. + /*! \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t + \param name A string value as name of member. + \param value Value of primitive type \c T as value of member + \param allocator Allocator for reallocating memory. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \pre IsObject() + + \note The source type \c T explicitly disallows all pointer types, + especially (\c const) \ref Ch*. This helps avoiding implicitly + referencing character strings with insufficient lifetime, use + \ref AddMember(StringRefType, GenericValue&, Allocator&) or \ref + AddMember(StringRefType, StringRefType, Allocator&). + All other pointer types would implicitly convert to \c bool, + use an explicit cast instead, if needed. + \note Amortized Constant time complexity. + */ + template + RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (GenericValue&)) + AddMember(GenericValue& name, T value, Allocator& allocator) { + GenericValue v(value); + return AddMember(name, v, allocator); + } + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + GenericValue& AddMember(GenericValue&& name, GenericValue&& value, Allocator& allocator) { + return AddMember(name, value, allocator); + } + GenericValue& AddMember(GenericValue&& name, GenericValue& value, Allocator& allocator) { + return AddMember(name, value, allocator); + } + GenericValue& AddMember(GenericValue& name, GenericValue&& value, Allocator& allocator) { + return AddMember(name, value, allocator); + } + GenericValue& AddMember(StringRefType name, GenericValue&& value, Allocator& allocator) { + GenericValue n(name); + return AddMember(n, value, allocator); + } +#endif // RAPIDJSON_HAS_CXX11_RVALUE_REFS + + + //! Add a member (name-value pair) to the object. + /*! \param name A constant string reference as name of member. + \param value Value of any type. + \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \note The ownership of \c value will be transferred to this object on success. + \pre IsObject() + \post value.IsNull() + \note Amortized Constant time complexity. + */ + GenericValue& AddMember(StringRefType name, GenericValue& value, Allocator& allocator) { + GenericValue n(name); + return AddMember(n, value, allocator); + } + + //! Add a constant string value as member (name-value pair) to the object. + /*! \param name A constant string reference as name of member. + \param value constant string reference as value of member. + \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \pre IsObject() + \note This overload is needed to avoid clashes with the generic primitive type AddMember(StringRefType,T,Allocator&) overload below. + \note Amortized Constant time complexity. + */ + GenericValue& AddMember(StringRefType name, StringRefType value, Allocator& allocator) { + GenericValue v(value); + return AddMember(name, v, allocator); + } + + //! Add any primitive value as member (name-value pair) to the object. + /*! \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t + \param name A constant string reference as name of member. + \param value Value of primitive type \c T as value of member + \param allocator Allocator for reallocating memory. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \pre IsObject() + + \note The source type \c T explicitly disallows all pointer types, + especially (\c const) \ref Ch*. This helps avoiding implicitly + referencing character strings with insufficient lifetime, use + \ref AddMember(StringRefType, GenericValue&, Allocator&) or \ref + AddMember(StringRefType, StringRefType, Allocator&). + All other pointer types would implicitly convert to \c bool, + use an explicit cast instead, if needed. + \note Amortized Constant time complexity. + */ + template + RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (GenericValue&)) + AddMember(StringRefType name, T value, Allocator& allocator) { + GenericValue n(name); + return AddMember(n, value, allocator); + } + + //! Remove all members in the object. + /*! This function do not deallocate memory in the object, i.e. the capacity is unchanged. + \note Linear time complexity. + */ + void RemoveAllMembers() { + RAPIDJSON_ASSERT(IsObject()); + for (MemberIterator m = MemberBegin(); m != MemberEnd(); ++m) + m->~Member(); + data_.o.size = 0; + } + + //! Remove a member in object by its name. + /*! \param name Name of member to be removed. + \return Whether the member existed. + \note This function may reorder the object members. Use \ref + EraseMember(ConstMemberIterator) if you need to preserve the + relative order of the remaining members. + \note Linear time complexity. + */ + bool RemoveMember(const Ch* name) { + GenericValue n(StringRef(name)); + return RemoveMember(n); + } + +#if RAPIDJSON_HAS_STDSTRING + bool RemoveMember(const std::basic_string& name) { return RemoveMember(GenericValue(StringRef(name))); } +#endif + + template + bool RemoveMember(const GenericValue& name) { + MemberIterator m = FindMember(name); + if (m != MemberEnd()) { + RemoveMember(m); + return true; + } + else + return false; + } + + //! Remove a member in object by iterator. + /*! \param m member iterator (obtained by FindMember() or MemberBegin()). + \return the new iterator after removal. + \note This function may reorder the object members. Use \ref + EraseMember(ConstMemberIterator) if you need to preserve the + relative order of the remaining members. + \note Constant time complexity. + */ + MemberIterator RemoveMember(MemberIterator m) { + RAPIDJSON_ASSERT(IsObject()); + RAPIDJSON_ASSERT(data_.o.size > 0); + RAPIDJSON_ASSERT(GetMembersPointer() != 0); + RAPIDJSON_ASSERT(m >= MemberBegin() && m < MemberEnd()); + + MemberIterator last(GetMembersPointer() + (data_.o.size - 1)); + if (data_.o.size > 1 && m != last) + *m = *last; // Move the last one to this place + else + m->~Member(); // Only one left, just destroy + --data_.o.size; + return m; + } + + //! Remove a member from an object by iterator. + /*! \param pos iterator to the member to remove + \pre IsObject() == true && \ref MemberBegin() <= \c pos < \ref MemberEnd() + \return Iterator following the removed element. + If the iterator \c pos refers to the last element, the \ref MemberEnd() iterator is returned. + \note This function preserves the relative order of the remaining object + members. If you do not need this, use the more efficient \ref RemoveMember(MemberIterator). + \note Linear time complexity. + */ + MemberIterator EraseMember(ConstMemberIterator pos) { + return EraseMember(pos, pos +1); + } + + //! Remove members in the range [first, last) from an object. + /*! \param first iterator to the first member to remove + \param last iterator following the last member to remove + \pre IsObject() == true && \ref MemberBegin() <= \c first <= \c last <= \ref MemberEnd() + \return Iterator following the last removed element. + \note This function preserves the relative order of the remaining object + members. + \note Linear time complexity. + */ + MemberIterator EraseMember(ConstMemberIterator first, ConstMemberIterator last) { + RAPIDJSON_ASSERT(IsObject()); + RAPIDJSON_ASSERT(data_.o.size > 0); + RAPIDJSON_ASSERT(GetMembersPointer() != 0); + RAPIDJSON_ASSERT(first >= MemberBegin()); + RAPIDJSON_ASSERT(first <= last); + RAPIDJSON_ASSERT(last <= MemberEnd()); + + MemberIterator pos = MemberBegin() + (first - MemberBegin()); + for (MemberIterator itr = pos; itr != last; ++itr) + itr->~Member(); + std::memmove(&*pos, &*last, static_cast(MemberEnd() - last) * sizeof(Member)); + data_.o.size -= static_cast(last - first); + return pos; + } + + //! Erase a member in object by its name. + /*! \param name Name of member to be removed. + \return Whether the member existed. + \note Linear time complexity. + */ + bool EraseMember(const Ch* name) { + GenericValue n(StringRef(name)); + return EraseMember(n); + } + +#if RAPIDJSON_HAS_STDSTRING + bool EraseMember(const std::basic_string& name) { return EraseMember(GenericValue(StringRef(name))); } +#endif + + template + bool EraseMember(const GenericValue& name) { + MemberIterator m = FindMember(name); + if (m != MemberEnd()) { + EraseMember(m); + return true; + } + else + return false; + } + + Object GetObject() { RAPIDJSON_ASSERT(IsObject()); return Object(*this); } + ConstObject GetObject() const { RAPIDJSON_ASSERT(IsObject()); return ConstObject(*this); } + + //@} + + //!@name Array + //@{ + + //! Set this value as an empty array. + /*! \post IsArray == true */ + GenericValue& SetArray() { this->~GenericValue(); new (this) GenericValue(kArrayType); return *this; } + + //! Get the number of elements in array. + SizeType Size() const { RAPIDJSON_ASSERT(IsArray()); return data_.a.size; } + + //! Get the capacity of array. + SizeType Capacity() const { RAPIDJSON_ASSERT(IsArray()); return data_.a.capacity; } + + //! Check whether the array is empty. + bool Empty() const { RAPIDJSON_ASSERT(IsArray()); return data_.a.size == 0; } + + //! Remove all elements in the array. + /*! This function do not deallocate memory in the array, i.e. the capacity is unchanged. + \note Linear time complexity. + */ + void Clear() { + RAPIDJSON_ASSERT(IsArray()); + GenericValue* e = GetElementsPointer(); + for (GenericValue* v = e; v != e + data_.a.size; ++v) + v->~GenericValue(); + data_.a.size = 0; + } + + //! Get an element from array by index. + /*! \pre IsArray() == true + \param index Zero-based index of element. + \see operator[](T*) + */ + GenericValue& operator[](SizeType index) { + RAPIDJSON_ASSERT(IsArray()); + RAPIDJSON_ASSERT(index < data_.a.size); + return GetElementsPointer()[index]; + } + const GenericValue& operator[](SizeType index) const { return const_cast(*this)[index]; } + + //! Element iterator + /*! \pre IsArray() == true */ + ValueIterator Begin() { RAPIDJSON_ASSERT(IsArray()); return GetElementsPointer(); } + //! \em Past-the-end element iterator + /*! \pre IsArray() == true */ + ValueIterator End() { RAPIDJSON_ASSERT(IsArray()); return GetElementsPointer() + data_.a.size; } + //! Constant element iterator + /*! \pre IsArray() == true */ + ConstValueIterator Begin() const { return const_cast(*this).Begin(); } + //! Constant \em past-the-end element iterator + /*! \pre IsArray() == true */ + ConstValueIterator End() const { return const_cast(*this).End(); } + + //! Request the array to have enough capacity to store elements. + /*! \param newCapacity The capacity that the array at least need to have. + \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \note Linear time complexity. + */ + GenericValue& Reserve(SizeType newCapacity, Allocator &allocator) { + RAPIDJSON_ASSERT(IsArray()); + if (newCapacity > data_.a.capacity) { + SetElementsPointer(reinterpret_cast(allocator.Realloc(GetElementsPointer(), data_.a.capacity * sizeof(GenericValue), newCapacity * sizeof(GenericValue)))); + data_.a.capacity = newCapacity; + } + return *this; + } + + //! Append a GenericValue at the end of the array. + /*! \param value Value to be appended. + \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator(). + \pre IsArray() == true + \post value.IsNull() == true + \return The value itself for fluent API. + \note The ownership of \c value will be transferred to this array on success. + \note If the number of elements to be appended is known, calls Reserve() once first may be more efficient. + \note Amortized constant time complexity. + */ + GenericValue& PushBack(GenericValue& value, Allocator& allocator) { + RAPIDJSON_ASSERT(IsArray()); + if (data_.a.size >= data_.a.capacity) + Reserve(data_.a.capacity == 0 ? kDefaultArrayCapacity : (data_.a.capacity + (data_.a.capacity + 1) / 2), allocator); + GetElementsPointer()[data_.a.size++].RawAssign(value); + return *this; + } + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + GenericValue& PushBack(GenericValue&& value, Allocator& allocator) { + return PushBack(value, allocator); + } +#endif // RAPIDJSON_HAS_CXX11_RVALUE_REFS + + //! Append a constant string reference at the end of the array. + /*! \param value Constant string reference to be appended. + \param allocator Allocator for reallocating memory. It must be the same one used previously. Commonly use GenericDocument::GetAllocator(). + \pre IsArray() == true + \return The value itself for fluent API. + \note If the number of elements to be appended is known, calls Reserve() once first may be more efficient. + \note Amortized constant time complexity. + \see GenericStringRef + */ + GenericValue& PushBack(StringRefType value, Allocator& allocator) { + return (*this).template PushBack(value, allocator); + } + + //! Append a primitive value at the end of the array. + /*! \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t + \param value Value of primitive type T to be appended. + \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator(). + \pre IsArray() == true + \return The value itself for fluent API. + \note If the number of elements to be appended is known, calls Reserve() once first may be more efficient. + + \note The source type \c T explicitly disallows all pointer types, + especially (\c const) \ref Ch*. This helps avoiding implicitly + referencing character strings with insufficient lifetime, use + \ref PushBack(GenericValue&, Allocator&) or \ref + PushBack(StringRefType, Allocator&). + All other pointer types would implicitly convert to \c bool, + use an explicit cast instead, if needed. + \note Amortized constant time complexity. + */ + template + RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (GenericValue&)) + PushBack(T value, Allocator& allocator) { + GenericValue v(value); + return PushBack(v, allocator); + } + + //! Remove the last element in the array. + /*! + \note Constant time complexity. + */ + GenericValue& PopBack() { + RAPIDJSON_ASSERT(IsArray()); + RAPIDJSON_ASSERT(!Empty()); + GetElementsPointer()[--data_.a.size].~GenericValue(); + return *this; + } + + //! Remove an element of array by iterator. + /*! + \param pos iterator to the element to remove + \pre IsArray() == true && \ref Begin() <= \c pos < \ref End() + \return Iterator following the removed element. If the iterator pos refers to the last element, the End() iterator is returned. + \note Linear time complexity. + */ + ValueIterator Erase(ConstValueIterator pos) { + return Erase(pos, pos + 1); + } + + //! Remove elements in the range [first, last) of the array. + /*! + \param first iterator to the first element to remove + \param last iterator following the last element to remove + \pre IsArray() == true && \ref Begin() <= \c first <= \c last <= \ref End() + \return Iterator following the last removed element. + \note Linear time complexity. + */ + ValueIterator Erase(ConstValueIterator first, ConstValueIterator last) { + RAPIDJSON_ASSERT(IsArray()); + RAPIDJSON_ASSERT(data_.a.size > 0); + RAPIDJSON_ASSERT(GetElementsPointer() != 0); + RAPIDJSON_ASSERT(first >= Begin()); + RAPIDJSON_ASSERT(first <= last); + RAPIDJSON_ASSERT(last <= End()); + ValueIterator pos = Begin() + (first - Begin()); + for (ValueIterator itr = pos; itr != last; ++itr) + itr->~GenericValue(); + std::memmove(pos, last, static_cast(End() - last) * sizeof(GenericValue)); + data_.a.size -= static_cast(last - first); + return pos; + } + + Array GetArray() { RAPIDJSON_ASSERT(IsArray()); return Array(*this); } + ConstArray GetArray() const { RAPIDJSON_ASSERT(IsArray()); return ConstArray(*this); } + + //@} + + //!@name Number + //@{ + + int GetInt() const { RAPIDJSON_ASSERT(data_.f.flags & kIntFlag); return data_.n.i.i; } + unsigned GetUint() const { RAPIDJSON_ASSERT(data_.f.flags & kUintFlag); return data_.n.u.u; } + int64_t GetInt64() const { RAPIDJSON_ASSERT(data_.f.flags & kInt64Flag); return data_.n.i64; } + uint64_t GetUint64() const { RAPIDJSON_ASSERT(data_.f.flags & kUint64Flag); return data_.n.u64; } + + //! Get the value as double type. + /*! \note If the value is 64-bit integer type, it may lose precision. Use \c IsLosslessDouble() to check whether the converison is lossless. + */ + double GetDouble() const { + RAPIDJSON_ASSERT(IsNumber()); + if ((data_.f.flags & kDoubleFlag) != 0) return data_.n.d; // exact type, no conversion. + if ((data_.f.flags & kIntFlag) != 0) return data_.n.i.i; // int -> double + if ((data_.f.flags & kUintFlag) != 0) return data_.n.u.u; // unsigned -> double + if ((data_.f.flags & kInt64Flag) != 0) return static_cast(data_.n.i64); // int64_t -> double (may lose precision) + RAPIDJSON_ASSERT((data_.f.flags & kUint64Flag) != 0); return static_cast(data_.n.u64); // uint64_t -> double (may lose precision) + } + + //! Get the value as float type. + /*! \note If the value is 64-bit integer type, it may lose precision. Use \c IsLosslessFloat() to check whether the converison is lossless. + */ + float GetFloat() const { + return static_cast(GetDouble()); + } + + GenericValue& SetInt(int i) { this->~GenericValue(); new (this) GenericValue(i); return *this; } + GenericValue& SetUint(unsigned u) { this->~GenericValue(); new (this) GenericValue(u); return *this; } + GenericValue& SetInt64(int64_t i64) { this->~GenericValue(); new (this) GenericValue(i64); return *this; } + GenericValue& SetUint64(uint64_t u64) { this->~GenericValue(); new (this) GenericValue(u64); return *this; } + GenericValue& SetDouble(double d) { this->~GenericValue(); new (this) GenericValue(d); return *this; } + GenericValue& SetFloat(float f) { this->~GenericValue(); new (this) GenericValue(f); return *this; } + + //@} + + //!@name String + //@{ + + const Ch* GetString() const { RAPIDJSON_ASSERT(IsString()); return (data_.f.flags & kInlineStrFlag) ? data_.ss.str : GetStringPointer(); } + + //! Get the length of string. + /*! Since rapidjson permits "\\u0000" in the json string, strlen(v.GetString()) may not equal to v.GetStringLength(). + */ + SizeType GetStringLength() const { RAPIDJSON_ASSERT(IsString()); return ((data_.f.flags & kInlineStrFlag) ? (data_.ss.GetLength()) : data_.s.length); } + + //! Set this value as a string without copying source string. + /*! This version has better performance with supplied length, and also support string containing null character. + \param s source string pointer. + \param length The length of source string, excluding the trailing null terminator. + \return The value itself for fluent API. + \post IsString() == true && GetString() == s && GetStringLength() == length + \see SetString(StringRefType) + */ + GenericValue& SetString(const Ch* s, SizeType length) { return SetString(StringRef(s, length)); } + + //! Set this value as a string without copying source string. + /*! \param s source string reference + \return The value itself for fluent API. + \post IsString() == true && GetString() == s && GetStringLength() == s.length + */ + GenericValue& SetString(StringRefType s) { this->~GenericValue(); SetStringRaw(s); return *this; } + + //! Set this value as a string by copying from source string. + /*! This version has better performance with supplied length, and also support string containing null character. + \param s source string. + \param length The length of source string, excluding the trailing null terminator. + \param allocator Allocator for allocating copied buffer. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \post IsString() == true && GetString() != s && strcmp(GetString(),s) == 0 && GetStringLength() == length + */ + GenericValue& SetString(const Ch* s, SizeType length, Allocator& allocator) { this->~GenericValue(); SetStringRaw(StringRef(s, length), allocator); return *this; } + + //! Set this value as a string by copying from source string. + /*! \param s source string. + \param allocator Allocator for allocating copied buffer. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \post IsString() == true && GetString() != s && strcmp(GetString(),s) == 0 && GetStringLength() == length + */ + GenericValue& SetString(const Ch* s, Allocator& allocator) { return SetString(s, internal::StrLen(s), allocator); } + +#if RAPIDJSON_HAS_STDSTRING + //! Set this value as a string by copying from source string. + /*! \param s source string. + \param allocator Allocator for allocating copied buffer. Commonly use GenericDocument::GetAllocator(). + \return The value itself for fluent API. + \post IsString() == true && GetString() != s.data() && strcmp(GetString(),s.data() == 0 && GetStringLength() == s.size() + \note Requires the definition of the preprocessor symbol \ref RAPIDJSON_HAS_STDSTRING. + */ + GenericValue& SetString(const std::basic_string& s, Allocator& allocator) { return SetString(s.data(), SizeType(s.size()), allocator); } +#endif + + //@} + + //!@name Array + //@{ + + //! Templated version for checking whether this value is type T. + /*! + \tparam T Either \c bool, \c int, \c unsigned, \c int64_t, \c uint64_t, \c double, \c float, \c const \c char*, \c std::basic_string + */ + template + bool Is() const { return internal::TypeHelper::Is(*this); } + + template + T Get() const { return internal::TypeHelper::Get(*this); } + + template + T Get() { return internal::TypeHelper::Get(*this); } + + template + ValueType& Set(const T& data) { return internal::TypeHelper::Set(*this, data); } + + template + ValueType& Set(const T& data, AllocatorType& allocator) { return internal::TypeHelper::Set(*this, data, allocator); } + + //@} + + //! Generate events of this value to a Handler. + /*! This function adopts the GoF visitor pattern. + Typical usage is to output this JSON value as JSON text via Writer, which is a Handler. + It can also be used to deep clone this value via GenericDocument, which is also a Handler. + \tparam Handler type of handler. + \param handler An object implementing concept Handler. + */ + template + bool Accept(Handler& handler) const { + switch(GetType()) { + case kNullType: return handler.Null(); + case kFalseType: return handler.Bool(false); + case kTrueType: return handler.Bool(true); + + case kObjectType: + if (RAPIDJSON_UNLIKELY(!handler.StartObject())) + return false; + for (ConstMemberIterator m = MemberBegin(); m != MemberEnd(); ++m) { + RAPIDJSON_ASSERT(m->name.IsString()); // User may change the type of name by MemberIterator. + if (RAPIDJSON_UNLIKELY(!handler.Key(m->name.GetString(), m->name.GetStringLength(), (m->name.data_.f.flags & kCopyFlag) != 0))) + return false; + if (RAPIDJSON_UNLIKELY(!m->value.Accept(handler))) + return false; + } + return handler.EndObject(data_.o.size); + + case kArrayType: + if (RAPIDJSON_UNLIKELY(!handler.StartArray())) + return false; + for (const GenericValue* v = Begin(); v != End(); ++v) + if (RAPIDJSON_UNLIKELY(!v->Accept(handler))) + return false; + return handler.EndArray(data_.a.size); + + case kStringType: + return handler.String(GetString(), GetStringLength(), (data_.f.flags & kCopyFlag) != 0); + + default: + RAPIDJSON_ASSERT(GetType() == kNumberType); + if (IsDouble()) return handler.Double(data_.n.d); + else if (IsInt()) return handler.Int(data_.n.i.i); + else if (IsUint()) return handler.Uint(data_.n.u.u); + else if (IsInt64()) return handler.Int64(data_.n.i64); + else return handler.Uint64(data_.n.u64); + } + } + +private: + template friend class GenericValue; + template friend class GenericDocument; + + enum { + kBoolFlag = 0x0008, + kNumberFlag = 0x0010, + kIntFlag = 0x0020, + kUintFlag = 0x0040, + kInt64Flag = 0x0080, + kUint64Flag = 0x0100, + kDoubleFlag = 0x0200, + kStringFlag = 0x0400, + kCopyFlag = 0x0800, + kInlineStrFlag = 0x1000, + + // Initial flags of different types. + kNullFlag = kNullType, + kTrueFlag = kTrueType | kBoolFlag, + kFalseFlag = kFalseType | kBoolFlag, + kNumberIntFlag = kNumberType | kNumberFlag | kIntFlag | kInt64Flag, + kNumberUintFlag = kNumberType | kNumberFlag | kUintFlag | kUint64Flag | kInt64Flag, + kNumberInt64Flag = kNumberType | kNumberFlag | kInt64Flag, + kNumberUint64Flag = kNumberType | kNumberFlag | kUint64Flag, + kNumberDoubleFlag = kNumberType | kNumberFlag | kDoubleFlag, + kNumberAnyFlag = kNumberType | kNumberFlag | kIntFlag | kInt64Flag | kUintFlag | kUint64Flag | kDoubleFlag, + kConstStringFlag = kStringType | kStringFlag, + kCopyStringFlag = kStringType | kStringFlag | kCopyFlag, + kShortStringFlag = kStringType | kStringFlag | kCopyFlag | kInlineStrFlag, + kObjectFlag = kObjectType, + kArrayFlag = kArrayType, + + kTypeMask = 0x07 + }; + + static const SizeType kDefaultArrayCapacity = 16; + static const SizeType kDefaultObjectCapacity = 16; + + struct Flag { +#if RAPIDJSON_48BITPOINTER_OPTIMIZATION + char payload[sizeof(SizeType) * 2 + 6]; // 2 x SizeType + lower 48-bit pointer +#elif RAPIDJSON_64BIT + char payload[sizeof(SizeType) * 2 + sizeof(void*) + 6]; // 6 padding bytes +#else + char payload[sizeof(SizeType) * 2 + sizeof(void*) + 2]; // 2 padding bytes +#endif + uint16_t flags; + }; + + struct String { + SizeType length; + SizeType hashcode; //!< reserved + const Ch* str; + }; // 12 bytes in 32-bit mode, 16 bytes in 64-bit mode + + // implementation detail: ShortString can represent zero-terminated strings up to MaxSize chars + // (excluding the terminating zero) and store a value to determine the length of the contained + // string in the last character str[LenPos] by storing "MaxSize - length" there. If the string + // to store has the maximal length of MaxSize then str[LenPos] will be 0 and therefore act as + // the string terminator as well. For getting the string length back from that value just use + // "MaxSize - str[LenPos]". + // This allows to store 13-chars strings in 32-bit mode, 21-chars strings in 64-bit mode, + // 13-chars strings for RAPIDJSON_48BITPOINTER_OPTIMIZATION=1 inline (for `UTF8`-encoded strings). + struct ShortString { + enum { MaxChars = sizeof(static_cast(0)->payload) / sizeof(Ch), MaxSize = MaxChars - 1, LenPos = MaxSize }; + Ch str[MaxChars]; + + inline static bool Usable(SizeType len) { return (MaxSize >= len); } + inline void SetLength(SizeType len) { str[LenPos] = static_cast(MaxSize - len); } + inline SizeType GetLength() const { return static_cast(MaxSize - str[LenPos]); } + }; // at most as many bytes as "String" above => 12 bytes in 32-bit mode, 16 bytes in 64-bit mode + + // By using proper binary layout, retrieval of different integer types do not need conversions. + union Number { +#if RAPIDJSON_ENDIAN == RAPIDJSON_LITTLEENDIAN + struct I { + int i; + char padding[4]; + }i; + struct U { + unsigned u; + char padding2[4]; + }u; +#else + struct I { + char padding[4]; + int i; + }i; + struct U { + char padding2[4]; + unsigned u; + }u; +#endif + int64_t i64; + uint64_t u64; + double d; + }; // 8 bytes + + struct ObjectData { + SizeType size; + SizeType capacity; + Member* members; + }; // 12 bytes in 32-bit mode, 16 bytes in 64-bit mode + + struct ArrayData { + SizeType size; + SizeType capacity; + GenericValue* elements; + }; // 12 bytes in 32-bit mode, 16 bytes in 64-bit mode + + union Data { + String s; + ShortString ss; + Number n; + ObjectData o; + ArrayData a; + Flag f; + }; // 16 bytes in 32-bit mode, 24 bytes in 64-bit mode, 16 bytes in 64-bit with RAPIDJSON_48BITPOINTER_OPTIMIZATION + + RAPIDJSON_FORCEINLINE const Ch* GetStringPointer() const { return RAPIDJSON_GETPOINTER(Ch, data_.s.str); } + RAPIDJSON_FORCEINLINE const Ch* SetStringPointer(const Ch* str) { return RAPIDJSON_SETPOINTER(Ch, data_.s.str, str); } + RAPIDJSON_FORCEINLINE GenericValue* GetElementsPointer() const { return RAPIDJSON_GETPOINTER(GenericValue, data_.a.elements); } + RAPIDJSON_FORCEINLINE GenericValue* SetElementsPointer(GenericValue* elements) { return RAPIDJSON_SETPOINTER(GenericValue, data_.a.elements, elements); } + RAPIDJSON_FORCEINLINE Member* GetMembersPointer() const { return RAPIDJSON_GETPOINTER(Member, data_.o.members); } + RAPIDJSON_FORCEINLINE Member* SetMembersPointer(Member* members) { return RAPIDJSON_SETPOINTER(Member, data_.o.members, members); } + + // Initialize this value as array with initial data, without calling destructor. + void SetArrayRaw(GenericValue* values, SizeType count, Allocator& allocator) { + data_.f.flags = kArrayFlag; + if (count) { + GenericValue* e = static_cast(allocator.Malloc(count * sizeof(GenericValue))); + SetElementsPointer(e); + std::memcpy(e, values, count * sizeof(GenericValue)); + } + else + SetElementsPointer(0); + data_.a.size = data_.a.capacity = count; + } + + //! Initialize this value as object with initial data, without calling destructor. + void SetObjectRaw(Member* members, SizeType count, Allocator& allocator) { + data_.f.flags = kObjectFlag; + if (count) { + Member* m = static_cast(allocator.Malloc(count * sizeof(Member))); + SetMembersPointer(m); + std::memcpy(m, members, count * sizeof(Member)); + } + else + SetMembersPointer(0); + data_.o.size = data_.o.capacity = count; + } + + //! Initialize this value as constant string, without calling destructor. + void SetStringRaw(StringRefType s) RAPIDJSON_NOEXCEPT { + data_.f.flags = kConstStringFlag; + SetStringPointer(s); + data_.s.length = s.length; + } + + //! Initialize this value as copy string with initial data, without calling destructor. + void SetStringRaw(StringRefType s, Allocator& allocator) { + Ch* str = 0; + if (ShortString::Usable(s.length)) { + data_.f.flags = kShortStringFlag; + data_.ss.SetLength(s.length); + str = data_.ss.str; + } else { + data_.f.flags = kCopyStringFlag; + data_.s.length = s.length; + str = static_cast(allocator.Malloc((s.length + 1) * sizeof(Ch))); + SetStringPointer(str); + } + std::memcpy(str, s, s.length * sizeof(Ch)); + str[s.length] = '\0'; + } + + //! Assignment without calling destructor + void RawAssign(GenericValue& rhs) RAPIDJSON_NOEXCEPT { + data_ = rhs.data_; + // data_.f.flags = rhs.data_.f.flags; + rhs.data_.f.flags = kNullFlag; + } + + template + bool StringEqual(const GenericValue& rhs) const { + RAPIDJSON_ASSERT(IsString()); + RAPIDJSON_ASSERT(rhs.IsString()); + + const SizeType len1 = GetStringLength(); + const SizeType len2 = rhs.GetStringLength(); + if(len1 != len2) { return false; } + + const Ch* const str1 = GetString(); + const Ch* const str2 = rhs.GetString(); + if(str1 == str2) { return true; } // fast path for constant string + + return (std::memcmp(str1, str2, sizeof(Ch) * len1) == 0); + } + + Data data_; +}; + +//! GenericValue with UTF8 encoding +typedef GenericValue > Value; + +/////////////////////////////////////////////////////////////////////////////// +// GenericDocument + +//! A document for parsing JSON text as DOM. +/*! + \note implements Handler concept + \tparam Encoding Encoding for both parsing and string storage. + \tparam Allocator Allocator for allocating memory for the DOM + \tparam StackAllocator Allocator for allocating memory for stack during parsing. + \warning Although GenericDocument inherits from GenericValue, the API does \b not provide any virtual functions, especially no virtual destructor. To avoid memory leaks, do not \c delete a GenericDocument object via a pointer to a GenericValue. +*/ +template , typename StackAllocator = CrtAllocator> +class GenericDocument : public GenericValue { +public: + typedef typename Encoding::Ch Ch; //!< Character type derived from Encoding. + typedef GenericValue ValueType; //!< Value type of the document. + typedef Allocator AllocatorType; //!< Allocator type from template parameter. + + //! Constructor + /*! Creates an empty document of specified type. + \param type Mandatory type of object to create. + \param allocator Optional allocator for allocating memory. + \param stackCapacity Optional initial capacity of stack in bytes. + \param stackAllocator Optional allocator for allocating memory for stack. + */ + explicit GenericDocument(Type type, Allocator* allocator = 0, size_t stackCapacity = kDefaultStackCapacity, StackAllocator* stackAllocator = 0) : + GenericValue(type), allocator_(allocator), ownAllocator_(0), stack_(stackAllocator, stackCapacity), parseResult_() + { + if (!allocator_) + ownAllocator_ = allocator_ = RAPIDJSON_NEW(Allocator()); + } + + //! Constructor + /*! Creates an empty document which type is Null. + \param allocator Optional allocator for allocating memory. + \param stackCapacity Optional initial capacity of stack in bytes. + \param stackAllocator Optional allocator for allocating memory for stack. + */ + GenericDocument(Allocator* allocator = 0, size_t stackCapacity = kDefaultStackCapacity, StackAllocator* stackAllocator = 0) : + allocator_(allocator), ownAllocator_(0), stack_(stackAllocator, stackCapacity), parseResult_() + { + if (!allocator_) + ownAllocator_ = allocator_ = RAPIDJSON_NEW(Allocator()); + } + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + //! Move constructor in C++11 + GenericDocument(GenericDocument&& rhs) RAPIDJSON_NOEXCEPT + : ValueType(std::forward(rhs)), // explicit cast to avoid prohibited move from Document + allocator_(rhs.allocator_), + ownAllocator_(rhs.ownAllocator_), + stack_(std::move(rhs.stack_)), + parseResult_(rhs.parseResult_) + { + rhs.allocator_ = 0; + rhs.ownAllocator_ = 0; + rhs.parseResult_ = ParseResult(); + } +#endif + + ~GenericDocument() { + Destroy(); + } + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + //! Move assignment in C++11 + GenericDocument& operator=(GenericDocument&& rhs) RAPIDJSON_NOEXCEPT + { + // The cast to ValueType is necessary here, because otherwise it would + // attempt to call GenericValue's templated assignment operator. + ValueType::operator=(std::forward(rhs)); + + // Calling the destructor here would prematurely call stack_'s destructor + Destroy(); + + allocator_ = rhs.allocator_; + ownAllocator_ = rhs.ownAllocator_; + stack_ = std::move(rhs.stack_); + parseResult_ = rhs.parseResult_; + + rhs.allocator_ = 0; + rhs.ownAllocator_ = 0; + rhs.parseResult_ = ParseResult(); + + return *this; + } +#endif + + //! Exchange the contents of this document with those of another. + /*! + \param rhs Another document. + \note Constant complexity. + \see GenericValue::Swap + */ + GenericDocument& Swap(GenericDocument& rhs) RAPIDJSON_NOEXCEPT { + ValueType::Swap(rhs); + stack_.Swap(rhs.stack_); + internal::Swap(allocator_, rhs.allocator_); + internal::Swap(ownAllocator_, rhs.ownAllocator_); + internal::Swap(parseResult_, rhs.parseResult_); + return *this; + } + + //! free-standing swap function helper + /*! + Helper function to enable support for common swap implementation pattern based on \c std::swap: + \code + void swap(MyClass& a, MyClass& b) { + using std::swap; + swap(a.doc, b.doc); + // ... + } + \endcode + \see Swap() + */ + friend inline void swap(GenericDocument& a, GenericDocument& b) RAPIDJSON_NOEXCEPT { a.Swap(b); } + + //! Populate this document by a generator which produces SAX events. + /*! \tparam Generator A functor with bool f(Handler) prototype. + \param g Generator functor which sends SAX events to the parameter. + \return The document itself for fluent API. + */ + template + GenericDocument& Populate(Generator& g) { + ClearStackOnExit scope(*this); + if (g(*this)) { + RAPIDJSON_ASSERT(stack_.GetSize() == sizeof(ValueType)); // Got one and only one root object + ValueType::operator=(*stack_.template Pop(1));// Move value from stack to document + } + return *this; + } + + //!@name Parse from stream + //!@{ + + //! Parse JSON text from an input stream (with Encoding conversion) + /*! \tparam parseFlags Combination of \ref ParseFlag. + \tparam SourceEncoding Encoding of input stream + \tparam InputStream Type of input stream, implementing Stream concept + \param is Input stream to be parsed. + \return The document itself for fluent API. + */ + template + GenericDocument& ParseStream(InputStream& is) { + GenericReader reader( + stack_.HasAllocator() ? &stack_.GetAllocator() : 0); + ClearStackOnExit scope(*this); + parseResult_ = reader.template Parse(is, *this); + if (parseResult_) { + RAPIDJSON_ASSERT(stack_.GetSize() == sizeof(ValueType)); // Got one and only one root object + ValueType::operator=(*stack_.template Pop(1));// Move value from stack to document + } + return *this; + } + + //! Parse JSON text from an input stream + /*! \tparam parseFlags Combination of \ref ParseFlag. + \tparam InputStream Type of input stream, implementing Stream concept + \param is Input stream to be parsed. + \return The document itself for fluent API. + */ + template + GenericDocument& ParseStream(InputStream& is) { + return ParseStream(is); + } + + //! Parse JSON text from an input stream (with \ref kParseDefaultFlags) + /*! \tparam InputStream Type of input stream, implementing Stream concept + \param is Input stream to be parsed. + \return The document itself for fluent API. + */ + template + GenericDocument& ParseStream(InputStream& is) { + return ParseStream(is); + } + //!@} + + //!@name Parse in-place from mutable string + //!@{ + + //! Parse JSON text from a mutable string + /*! \tparam parseFlags Combination of \ref ParseFlag. + \param str Mutable zero-terminated string to be parsed. + \return The document itself for fluent API. + */ + template + GenericDocument& ParseInsitu(Ch* str) { + GenericInsituStringStream s(str); + return ParseStream(s); + } + + //! Parse JSON text from a mutable string (with \ref kParseDefaultFlags) + /*! \param str Mutable zero-terminated string to be parsed. + \return The document itself for fluent API. + */ + GenericDocument& ParseInsitu(Ch* str) { + return ParseInsitu(str); + } + //!@} + + //!@name Parse from read-only string + //!@{ + + //! Parse JSON text from a read-only string (with Encoding conversion) + /*! \tparam parseFlags Combination of \ref ParseFlag (must not contain \ref kParseInsituFlag). + \tparam SourceEncoding Transcoding from input Encoding + \param str Read-only zero-terminated string to be parsed. + */ + template + GenericDocument& Parse(const typename SourceEncoding::Ch* str) { + RAPIDJSON_ASSERT(!(parseFlags & kParseInsituFlag)); + GenericStringStream s(str); + return ParseStream(s); + } + + //! Parse JSON text from a read-only string + /*! \tparam parseFlags Combination of \ref ParseFlag (must not contain \ref kParseInsituFlag). + \param str Read-only zero-terminated string to be parsed. + */ + template + GenericDocument& Parse(const Ch* str) { + return Parse(str); + } + + //! Parse JSON text from a read-only string (with \ref kParseDefaultFlags) + /*! \param str Read-only zero-terminated string to be parsed. + */ + GenericDocument& Parse(const Ch* str) { + return Parse(str); + } + + template + GenericDocument& Parse(const typename SourceEncoding::Ch* str, size_t length) { + RAPIDJSON_ASSERT(!(parseFlags & kParseInsituFlag)); + MemoryStream ms(static_cast(str), length * sizeof(typename SourceEncoding::Ch)); + EncodedInputStream is(ms); + ParseStream(is); + return *this; + } + + template + GenericDocument& Parse(const Ch* str, size_t length) { + return Parse(str, length); + } + + GenericDocument& Parse(const Ch* str, size_t length) { + return Parse(str, length); + } + +#if RAPIDJSON_HAS_STDSTRING + template + GenericDocument& Parse(const std::basic_string& str) { + // c_str() is constant complexity according to standard. Should be faster than Parse(const char*, size_t) + return Parse(str.c_str()); + } + + template + GenericDocument& Parse(const std::basic_string& str) { + return Parse(str.c_str()); + } + + GenericDocument& Parse(const std::basic_string& str) { + return Parse(str); + } +#endif // RAPIDJSON_HAS_STDSTRING + + //!@} + + //!@name Handling parse errors + //!@{ + + //! Whether a parse error has occured in the last parsing. + bool HasParseError() const { return parseResult_.IsError(); } + + //! Get the \ref ParseErrorCode of last parsing. + ParseErrorCode GetParseError() const { return parseResult_.Code(); } + + //! Get the position of last parsing error in input, 0 otherwise. + size_t GetErrorOffset() const { return parseResult_.Offset(); } + + //! Implicit conversion to get the last parse result +#ifndef __clang // -Wdocumentation + /*! \return \ref ParseResult of the last parse operation + + \code + Document doc; + ParseResult ok = doc.Parse(json); + if (!ok) + printf( "JSON parse error: %s (%u)\n", GetParseError_En(ok.Code()), ok.Offset()); + \endcode + */ +#endif + operator ParseResult() const { return parseResult_; } + //!@} + + //! Get the allocator of this document. + Allocator& GetAllocator() { + RAPIDJSON_ASSERT(allocator_); + return *allocator_; + } + + //! Get the capacity of stack in bytes. + size_t GetStackCapacity() const { return stack_.GetCapacity(); } + +private: + // clear stack on any exit from ParseStream, e.g. due to exception + struct ClearStackOnExit { + explicit ClearStackOnExit(GenericDocument& d) : d_(d) {} + ~ClearStackOnExit() { d_.ClearStack(); } + private: + ClearStackOnExit(const ClearStackOnExit&); + ClearStackOnExit& operator=(const ClearStackOnExit&); + GenericDocument& d_; + }; + + // callers of the following private Handler functions + // template friend class GenericReader; // for parsing + template friend class GenericValue; // for deep copying + +public: + // Implementation of Handler + bool Null() { new (stack_.template Push()) ValueType(); return true; } + bool Bool(bool b) { new (stack_.template Push()) ValueType(b); return true; } + bool Int(int i) { new (stack_.template Push()) ValueType(i); return true; } + bool Uint(unsigned i) { new (stack_.template Push()) ValueType(i); return true; } + bool Int64(int64_t i) { new (stack_.template Push()) ValueType(i); return true; } + bool Uint64(uint64_t i) { new (stack_.template Push()) ValueType(i); return true; } + bool Double(double d) { new (stack_.template Push()) ValueType(d); return true; } + + bool RawNumber(const Ch* str, SizeType length, bool copy) { + if (copy) + new (stack_.template Push()) ValueType(str, length, GetAllocator()); + else + new (stack_.template Push()) ValueType(str, length); + return true; + } + + bool String(const Ch* str, SizeType length, bool copy) { + if (copy) + new (stack_.template Push()) ValueType(str, length, GetAllocator()); + else + new (stack_.template Push()) ValueType(str, length); + return true; + } + + bool StartObject() { new (stack_.template Push()) ValueType(kObjectType); return true; } + + bool Key(const Ch* str, SizeType length, bool copy) { return String(str, length, copy); } + + bool EndObject(SizeType memberCount) { + typename ValueType::Member* members = stack_.template Pop(memberCount); + stack_.template Top()->SetObjectRaw(members, memberCount, GetAllocator()); + return true; + } + + bool StartArray() { new (stack_.template Push()) ValueType(kArrayType); return true; } + + bool EndArray(SizeType elementCount) { + ValueType* elements = stack_.template Pop(elementCount); + stack_.template Top()->SetArrayRaw(elements, elementCount, GetAllocator()); + return true; + } + +private: + //! Prohibit copying + GenericDocument(const GenericDocument&); + //! Prohibit assignment + GenericDocument& operator=(const GenericDocument&); + + void ClearStack() { + if (Allocator::kNeedFree) + while (stack_.GetSize() > 0) // Here assumes all elements in stack array are GenericValue (Member is actually 2 GenericValue objects) + (stack_.template Pop(1))->~ValueType(); + else + stack_.Clear(); + stack_.ShrinkToFit(); + } + + void Destroy() { + RAPIDJSON_DELETE(ownAllocator_); + } + + static const size_t kDefaultStackCapacity = 1024; + Allocator* allocator_; + Allocator* ownAllocator_; + internal::Stack stack_; + ParseResult parseResult_; +}; + +//! GenericDocument with UTF8 encoding +typedef GenericDocument > Document; + +// defined here due to the dependency on GenericDocument +template +template +inline +GenericValue::GenericValue(const GenericValue& rhs, Allocator& allocator) +{ + switch (rhs.GetType()) { + case kObjectType: + case kArrayType: { // perform deep copy via SAX Handler + GenericDocument d(&allocator); + rhs.Accept(d); + RawAssign(*d.stack_.template Pop(1)); + } + break; + case kStringType: + if (rhs.data_.f.flags == kConstStringFlag) { + data_.f.flags = rhs.data_.f.flags; + data_ = *reinterpret_cast(&rhs.data_); + } else { + SetStringRaw(StringRef(rhs.GetString(), rhs.GetStringLength()), allocator); + } + break; + default: + data_.f.flags = rhs.data_.f.flags; + data_ = *reinterpret_cast(&rhs.data_); + break; + } +} + +//! Helper class for accessing Value of array type. +/*! + Instance of this helper class is obtained by \c GenericValue::GetArray(). + In addition to all APIs for array type, it provides range-based for loop if \c RAPIDJSON_HAS_CXX11_RANGE_FOR=1. +*/ +template +class GenericArray { +public: + typedef GenericArray ConstArray; + typedef GenericArray Array; + typedef ValueT PlainType; + typedef typename internal::MaybeAddConst::Type ValueType; + typedef ValueType* ValueIterator; // This may be const or non-const iterator + typedef const ValueT* ConstValueIterator; + typedef typename ValueType::AllocatorType AllocatorType; + typedef typename ValueType::StringRefType StringRefType; + + template + friend class GenericValue; + + GenericArray(const GenericArray& rhs) : value_(rhs.value_) {} + GenericArray& operator=(const GenericArray& rhs) { value_ = rhs.value_; return *this; } + ~GenericArray() {} + + SizeType Size() const { return value_.Size(); } + SizeType Capacity() const { return value_.Capacity(); } + bool Empty() const { return value_.Empty(); } + void Clear() const { value_.Clear(); } + ValueType& operator[](SizeType index) const { return value_[index]; } + ValueIterator Begin() const { return value_.Begin(); } + ValueIterator End() const { return value_.End(); } + GenericArray Reserve(SizeType newCapacity, AllocatorType &allocator) const { value_.Reserve(newCapacity, allocator); return *this; } + GenericArray PushBack(ValueType& value, AllocatorType& allocator) const { value_.PushBack(value, allocator); return *this; } +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + GenericArray PushBack(ValueType&& value, AllocatorType& allocator) const { value_.PushBack(value, allocator); return *this; } +#endif // RAPIDJSON_HAS_CXX11_RVALUE_REFS + GenericArray PushBack(StringRefType value, AllocatorType& allocator) const { value_.PushBack(value, allocator); return *this; } + template RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (const GenericArray&)) PushBack(T value, AllocatorType& allocator) const { value_.PushBack(value, allocator); return *this; } + GenericArray PopBack() const { value_.PopBack(); return *this; } + ValueIterator Erase(ConstValueIterator pos) const { return value_.Erase(pos); } + ValueIterator Erase(ConstValueIterator first, ConstValueIterator last) const { return value_.Erase(first, last); } + +#if RAPIDJSON_HAS_CXX11_RANGE_FOR + ValueIterator begin() const { return value_.Begin(); } + ValueIterator end() const { return value_.End(); } +#endif + +private: + GenericArray(); + GenericArray(ValueType& value) : value_(value) {} + ValueType& value_; +}; + +//! Helper class for accessing Value of object type. +/*! + Instance of this helper class is obtained by \c GenericValue::GetObject(). + In addition to all APIs for array type, it provides range-based for loop if \c RAPIDJSON_HAS_CXX11_RANGE_FOR=1. +*/ +template +class GenericObject { +public: + typedef GenericObject ConstObject; + typedef GenericObject Object; + typedef ValueT PlainType; + typedef typename internal::MaybeAddConst::Type ValueType; + typedef GenericMemberIterator MemberIterator; // This may be const or non-const iterator + typedef GenericMemberIterator ConstMemberIterator; + typedef typename ValueType::AllocatorType AllocatorType; + typedef typename ValueType::StringRefType StringRefType; + typedef typename ValueType::EncodingType EncodingType; + typedef typename ValueType::Ch Ch; + + template + friend class GenericValue; + + GenericObject(const GenericObject& rhs) : value_(rhs.value_) {} + GenericObject& operator=(const GenericObject& rhs) { value_ = rhs.value_; return *this; } + ~GenericObject() {} + + SizeType MemberCount() const { return value_.MemberCount(); } + bool ObjectEmpty() const { return value_.ObjectEmpty(); } + template ValueType& operator[](T* name) const { return value_[name]; } + template ValueType& operator[](const GenericValue& name) const { return value_[name]; } +#if RAPIDJSON_HAS_STDSTRING + ValueType& operator[](const std::basic_string& name) const { return value_[name]; } +#endif + MemberIterator MemberBegin() const { return value_.MemberBegin(); } + MemberIterator MemberEnd() const { return value_.MemberEnd(); } + bool HasMember(const Ch* name) const { return value_.HasMember(name); } +#if RAPIDJSON_HAS_STDSTRING + bool HasMember(const std::basic_string& name) const { return value_.HasMember(name); } +#endif + template bool HasMember(const GenericValue& name) const { return value_.HasMember(name); } + MemberIterator FindMember(const Ch* name) const { return value_.FindMember(name); } + template MemberIterator FindMember(const GenericValue& name) const { return value_.FindMember(name); } +#if RAPIDJSON_HAS_STDSTRING + MemberIterator FindMember(const std::basic_string& name) const { return value_.FindMember(name); } +#endif + GenericObject AddMember(ValueType& name, ValueType& value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } + GenericObject AddMember(ValueType& name, StringRefType value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } +#if RAPIDJSON_HAS_STDSTRING + GenericObject AddMember(ValueType& name, std::basic_string& value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } +#endif + template RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (ValueType&)) AddMember(ValueType& name, T value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + GenericObject AddMember(ValueType&& name, ValueType&& value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } + GenericObject AddMember(ValueType&& name, ValueType& value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } + GenericObject AddMember(ValueType& name, ValueType&& value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } + GenericObject AddMember(StringRefType name, ValueType&& value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } +#endif // RAPIDJSON_HAS_CXX11_RVALUE_REFS + GenericObject AddMember(StringRefType name, ValueType& value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } + GenericObject AddMember(StringRefType name, StringRefType value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } + template RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (GenericObject)) AddMember(StringRefType name, T value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; } + void RemoveAllMembers() { return value_.RemoveAllMembers(); } + bool RemoveMember(const Ch* name) const { return value_.RemoveMember(name); } +#if RAPIDJSON_HAS_STDSTRING + bool RemoveMember(const std::basic_string& name) const { return value_.RemoveMember(name); } +#endif + template bool RemoveMember(const GenericValue& name) const { return value_.RemoveMember(name); } + MemberIterator RemoveMember(MemberIterator m) const { return value_.RemoveMember(m); } + MemberIterator EraseMember(ConstMemberIterator pos) const { return value_.EraseMember(pos); } + MemberIterator EraseMember(ConstMemberIterator first, ConstMemberIterator last) const { return value_.EraseMember(first, last); } + bool EraseMember(const Ch* name) const { return value_.EraseMember(name); } +#if RAPIDJSON_HAS_STDSTRING + bool EraseMember(const std::basic_string& name) const { return EraseMember(ValueType(StringRef(name))); } +#endif + template bool EraseMember(const GenericValue& name) const { return value_.EraseMember(name); } + +#if RAPIDJSON_HAS_CXX11_RANGE_FOR + MemberIterator begin() const { return value_.MemberBegin(); } + MemberIterator end() const { return value_.MemberEnd(); } +#endif + +private: + GenericObject(); + GenericObject(ValueType& value) : value_(value) {} + ValueType& value_; +}; + +RAPIDJSON_NAMESPACE_END +RAPIDJSON_DIAG_POP + +#endif // RAPIDJSON_DOCUMENT_H_ diff --git a/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/encodedstream.h b/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/encodedstream.h new file mode 100644 index 0000000..1450683 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/encodedstream.h @@ -0,0 +1,299 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_ENCODEDSTREAM_H_ +#define RAPIDJSON_ENCODEDSTREAM_H_ + +#include "stream.h" +#include "memorystream.h" + +#ifdef __GNUC__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(effc++) +#endif + +#ifdef __clang__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(padded) +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +//! Input byte stream wrapper with a statically bound encoding. +/*! + \tparam Encoding The interpretation of encoding of the stream. Either UTF8, UTF16LE, UTF16BE, UTF32LE, UTF32BE. + \tparam InputByteStream Type of input byte stream. For example, FileReadStream. +*/ +template +class EncodedInputStream { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); +public: + typedef typename Encoding::Ch Ch; + + EncodedInputStream(InputByteStream& is) : is_(is) { + current_ = Encoding::TakeBOM(is_); + } + + Ch Peek() const { return current_; } + Ch Take() { Ch c = current_; current_ = Encoding::Take(is_); return c; } + size_t Tell() const { return is_.Tell(); } + + // Not implemented + void Put(Ch) { RAPIDJSON_ASSERT(false); } + void Flush() { RAPIDJSON_ASSERT(false); } + Ch* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } + size_t PutEnd(Ch*) { RAPIDJSON_ASSERT(false); return 0; } + +private: + EncodedInputStream(const EncodedInputStream&); + EncodedInputStream& operator=(const EncodedInputStream&); + + InputByteStream& is_; + Ch current_; +}; + +//! Specialized for UTF8 MemoryStream. +template <> +class EncodedInputStream, MemoryStream> { +public: + typedef UTF8<>::Ch Ch; + + EncodedInputStream(MemoryStream& is) : is_(is) { + if (static_cast(is_.Peek()) == 0xEFu) is_.Take(); + if (static_cast(is_.Peek()) == 0xBBu) is_.Take(); + if (static_cast(is_.Peek()) == 0xBFu) is_.Take(); + } + Ch Peek() const { return is_.Peek(); } + Ch Take() { return is_.Take(); } + size_t Tell() const { return is_.Tell(); } + + // Not implemented + void Put(Ch) {} + void Flush() {} + Ch* PutBegin() { return 0; } + size_t PutEnd(Ch*) { return 0; } + + MemoryStream& is_; + +private: + EncodedInputStream(const EncodedInputStream&); + EncodedInputStream& operator=(const EncodedInputStream&); +}; + +//! Output byte stream wrapper with statically bound encoding. +/*! + \tparam Encoding The interpretation of encoding of the stream. Either UTF8, UTF16LE, UTF16BE, UTF32LE, UTF32BE. + \tparam OutputByteStream Type of input byte stream. For example, FileWriteStream. +*/ +template +class EncodedOutputStream { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); +public: + typedef typename Encoding::Ch Ch; + + EncodedOutputStream(OutputByteStream& os, bool putBOM = true) : os_(os) { + if (putBOM) + Encoding::PutBOM(os_); + } + + void Put(Ch c) { Encoding::Put(os_, c); } + void Flush() { os_.Flush(); } + + // Not implemented + Ch Peek() const { RAPIDJSON_ASSERT(false); return 0;} + Ch Take() { RAPIDJSON_ASSERT(false); return 0;} + size_t Tell() const { RAPIDJSON_ASSERT(false); return 0; } + Ch* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } + size_t PutEnd(Ch*) { RAPIDJSON_ASSERT(false); return 0; } + +private: + EncodedOutputStream(const EncodedOutputStream&); + EncodedOutputStream& operator=(const EncodedOutputStream&); + + OutputByteStream& os_; +}; + +#define RAPIDJSON_ENCODINGS_FUNC(x) UTF8::x, UTF16LE::x, UTF16BE::x, UTF32LE::x, UTF32BE::x + +//! Input stream wrapper with dynamically bound encoding and automatic encoding detection. +/*! + \tparam CharType Type of character for reading. + \tparam InputByteStream type of input byte stream to be wrapped. +*/ +template +class AutoUTFInputStream { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); +public: + typedef CharType Ch; + + //! Constructor. + /*! + \param is input stream to be wrapped. + \param type UTF encoding type if it is not detected from the stream. + */ + AutoUTFInputStream(InputByteStream& is, UTFType type = kUTF8) : is_(&is), type_(type), hasBOM_(false) { + RAPIDJSON_ASSERT(type >= kUTF8 && type <= kUTF32BE); + DetectType(); + static const TakeFunc f[] = { RAPIDJSON_ENCODINGS_FUNC(Take) }; + takeFunc_ = f[type_]; + current_ = takeFunc_(*is_); + } + + UTFType GetType() const { return type_; } + bool HasBOM() const { return hasBOM_; } + + Ch Peek() const { return current_; } + Ch Take() { Ch c = current_; current_ = takeFunc_(*is_); return c; } + size_t Tell() const { return is_->Tell(); } + + // Not implemented + void Put(Ch) { RAPIDJSON_ASSERT(false); } + void Flush() { RAPIDJSON_ASSERT(false); } + Ch* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } + size_t PutEnd(Ch*) { RAPIDJSON_ASSERT(false); return 0; } + +private: + AutoUTFInputStream(const AutoUTFInputStream&); + AutoUTFInputStream& operator=(const AutoUTFInputStream&); + + // Detect encoding type with BOM or RFC 4627 + void DetectType() { + // BOM (Byte Order Mark): + // 00 00 FE FF UTF-32BE + // FF FE 00 00 UTF-32LE + // FE FF UTF-16BE + // FF FE UTF-16LE + // EF BB BF UTF-8 + + const unsigned char* c = reinterpret_cast(is_->Peek4()); + if (!c) + return; + + unsigned bom = static_cast(c[0] | (c[1] << 8) | (c[2] << 16) | (c[3] << 24)); + hasBOM_ = false; + if (bom == 0xFFFE0000) { type_ = kUTF32BE; hasBOM_ = true; is_->Take(); is_->Take(); is_->Take(); is_->Take(); } + else if (bom == 0x0000FEFF) { type_ = kUTF32LE; hasBOM_ = true; is_->Take(); is_->Take(); is_->Take(); is_->Take(); } + else if ((bom & 0xFFFF) == 0xFFFE) { type_ = kUTF16BE; hasBOM_ = true; is_->Take(); is_->Take(); } + else if ((bom & 0xFFFF) == 0xFEFF) { type_ = kUTF16LE; hasBOM_ = true; is_->Take(); is_->Take(); } + else if ((bom & 0xFFFFFF) == 0xBFBBEF) { type_ = kUTF8; hasBOM_ = true; is_->Take(); is_->Take(); is_->Take(); } + + // RFC 4627: Section 3 + // "Since the first two characters of a JSON text will always be ASCII + // characters [RFC0020], it is possible to determine whether an octet + // stream is UTF-8, UTF-16 (BE or LE), or UTF-32 (BE or LE) by looking + // at the pattern of nulls in the first four octets." + // 00 00 00 xx UTF-32BE + // 00 xx 00 xx UTF-16BE + // xx 00 00 00 UTF-32LE + // xx 00 xx 00 UTF-16LE + // xx xx xx xx UTF-8 + + if (!hasBOM_) { + unsigned pattern = (c[0] ? 1 : 0) | (c[1] ? 2 : 0) | (c[2] ? 4 : 0) | (c[3] ? 8 : 0); + switch (pattern) { + case 0x08: type_ = kUTF32BE; break; + case 0x0A: type_ = kUTF16BE; break; + case 0x01: type_ = kUTF32LE; break; + case 0x05: type_ = kUTF16LE; break; + case 0x0F: type_ = kUTF8; break; + default: break; // Use type defined by user. + } + } + + // Runtime check whether the size of character type is sufficient. It only perform checks with assertion. + if (type_ == kUTF16LE || type_ == kUTF16BE) RAPIDJSON_ASSERT(sizeof(Ch) >= 2); + if (type_ == kUTF32LE || type_ == kUTF32BE) RAPIDJSON_ASSERT(sizeof(Ch) >= 4); + } + + typedef Ch (*TakeFunc)(InputByteStream& is); + InputByteStream* is_; + UTFType type_; + Ch current_; + TakeFunc takeFunc_; + bool hasBOM_; +}; + +//! Output stream wrapper with dynamically bound encoding and automatic encoding detection. +/*! + \tparam CharType Type of character for writing. + \tparam OutputByteStream type of output byte stream to be wrapped. +*/ +template +class AutoUTFOutputStream { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); +public: + typedef CharType Ch; + + //! Constructor. + /*! + \param os output stream to be wrapped. + \param type UTF encoding type. + \param putBOM Whether to write BOM at the beginning of the stream. + */ + AutoUTFOutputStream(OutputByteStream& os, UTFType type, bool putBOM) : os_(&os), type_(type) { + RAPIDJSON_ASSERT(type >= kUTF8 && type <= kUTF32BE); + + // Runtime check whether the size of character type is sufficient. It only perform checks with assertion. + if (type_ == kUTF16LE || type_ == kUTF16BE) RAPIDJSON_ASSERT(sizeof(Ch) >= 2); + if (type_ == kUTF32LE || type_ == kUTF32BE) RAPIDJSON_ASSERT(sizeof(Ch) >= 4); + + static const PutFunc f[] = { RAPIDJSON_ENCODINGS_FUNC(Put) }; + putFunc_ = f[type_]; + + if (putBOM) + PutBOM(); + } + + UTFType GetType() const { return type_; } + + void Put(Ch c) { putFunc_(*os_, c); } + void Flush() { os_->Flush(); } + + // Not implemented + Ch Peek() const { RAPIDJSON_ASSERT(false); return 0;} + Ch Take() { RAPIDJSON_ASSERT(false); return 0;} + size_t Tell() const { RAPIDJSON_ASSERT(false); return 0; } + Ch* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } + size_t PutEnd(Ch*) { RAPIDJSON_ASSERT(false); return 0; } + +private: + AutoUTFOutputStream(const AutoUTFOutputStream&); + AutoUTFOutputStream& operator=(const AutoUTFOutputStream&); + + void PutBOM() { + typedef void (*PutBOMFunc)(OutputByteStream&); + static const PutBOMFunc f[] = { RAPIDJSON_ENCODINGS_FUNC(PutBOM) }; + f[type_](*os_); + } + + typedef void (*PutFunc)(OutputByteStream&, Ch); + + OutputByteStream* os_; + UTFType type_; + PutFunc putFunc_; +}; + +#undef RAPIDJSON_ENCODINGS_FUNC + +RAPIDJSON_NAMESPACE_END + +#ifdef __clang__ +RAPIDJSON_DIAG_POP +#endif + +#ifdef __GNUC__ +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_FILESTREAM_H_ diff --git a/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/encodings.h b/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/encodings.h new file mode 100644 index 0000000..baa7c2b --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/encodings.h @@ -0,0 +1,716 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_ENCODINGS_H_ +#define RAPIDJSON_ENCODINGS_H_ + +#include "rapidjson.h" + +#ifdef _MSC_VER +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(4244) // conversion from 'type1' to 'type2', possible loss of data +RAPIDJSON_DIAG_OFF(4702) // unreachable code +#elif defined(__GNUC__) +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(effc++) +RAPIDJSON_DIAG_OFF(overflow) +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +/////////////////////////////////////////////////////////////////////////////// +// Encoding + +/*! \class rapidjson::Encoding + \brief Concept for encoding of Unicode characters. + +\code +concept Encoding { + typename Ch; //! Type of character. A "character" is actually a code unit in unicode's definition. + + enum { supportUnicode = 1 }; // or 0 if not supporting unicode + + //! \brief Encode a Unicode codepoint to an output stream. + //! \param os Output stream. + //! \param codepoint An unicode codepoint, ranging from 0x0 to 0x10FFFF inclusively. + template + static void Encode(OutputStream& os, unsigned codepoint); + + //! \brief Decode a Unicode codepoint from an input stream. + //! \param is Input stream. + //! \param codepoint Output of the unicode codepoint. + //! \return true if a valid codepoint can be decoded from the stream. + template + static bool Decode(InputStream& is, unsigned* codepoint); + + //! \brief Validate one Unicode codepoint from an encoded stream. + //! \param is Input stream to obtain codepoint. + //! \param os Output for copying one codepoint. + //! \return true if it is valid. + //! \note This function just validating and copying the codepoint without actually decode it. + template + static bool Validate(InputStream& is, OutputStream& os); + + // The following functions are deal with byte streams. + + //! Take a character from input byte stream, skip BOM if exist. + template + static CharType TakeBOM(InputByteStream& is); + + //! Take a character from input byte stream. + template + static Ch Take(InputByteStream& is); + + //! Put BOM to output byte stream. + template + static void PutBOM(OutputByteStream& os); + + //! Put a character to output byte stream. + template + static void Put(OutputByteStream& os, Ch c); +}; +\endcode +*/ + +/////////////////////////////////////////////////////////////////////////////// +// UTF8 + +//! UTF-8 encoding. +/*! http://en.wikipedia.org/wiki/UTF-8 + http://tools.ietf.org/html/rfc3629 + \tparam CharType Code unit for storing 8-bit UTF-8 data. Default is char. + \note implements Encoding concept +*/ +template +struct UTF8 { + typedef CharType Ch; + + enum { supportUnicode = 1 }; + + template + static void Encode(OutputStream& os, unsigned codepoint) { + if (codepoint <= 0x7F) + os.Put(static_cast(codepoint & 0xFF)); + else if (codepoint <= 0x7FF) { + os.Put(static_cast(0xC0 | ((codepoint >> 6) & 0xFF))); + os.Put(static_cast(0x80 | ((codepoint & 0x3F)))); + } + else if (codepoint <= 0xFFFF) { + os.Put(static_cast(0xE0 | ((codepoint >> 12) & 0xFF))); + os.Put(static_cast(0x80 | ((codepoint >> 6) & 0x3F))); + os.Put(static_cast(0x80 | (codepoint & 0x3F))); + } + else { + RAPIDJSON_ASSERT(codepoint <= 0x10FFFF); + os.Put(static_cast(0xF0 | ((codepoint >> 18) & 0xFF))); + os.Put(static_cast(0x80 | ((codepoint >> 12) & 0x3F))); + os.Put(static_cast(0x80 | ((codepoint >> 6) & 0x3F))); + os.Put(static_cast(0x80 | (codepoint & 0x3F))); + } + } + + template + static void EncodeUnsafe(OutputStream& os, unsigned codepoint) { + if (codepoint <= 0x7F) + PutUnsafe(os, static_cast(codepoint & 0xFF)); + else if (codepoint <= 0x7FF) { + PutUnsafe(os, static_cast(0xC0 | ((codepoint >> 6) & 0xFF))); + PutUnsafe(os, static_cast(0x80 | ((codepoint & 0x3F)))); + } + else if (codepoint <= 0xFFFF) { + PutUnsafe(os, static_cast(0xE0 | ((codepoint >> 12) & 0xFF))); + PutUnsafe(os, static_cast(0x80 | ((codepoint >> 6) & 0x3F))); + PutUnsafe(os, static_cast(0x80 | (codepoint & 0x3F))); + } + else { + RAPIDJSON_ASSERT(codepoint <= 0x10FFFF); + PutUnsafe(os, static_cast(0xF0 | ((codepoint >> 18) & 0xFF))); + PutUnsafe(os, static_cast(0x80 | ((codepoint >> 12) & 0x3F))); + PutUnsafe(os, static_cast(0x80 | ((codepoint >> 6) & 0x3F))); + PutUnsafe(os, static_cast(0x80 | (codepoint & 0x3F))); + } + } + + template + static bool Decode(InputStream& is, unsigned* codepoint) { +#define COPY() c = is.Take(); *codepoint = (*codepoint << 6) | (static_cast(c) & 0x3Fu) +#define TRANS(mask) result &= ((GetRange(static_cast(c)) & mask) != 0) +#define TAIL() COPY(); TRANS(0x70) + typename InputStream::Ch c = is.Take(); + if (!(c & 0x80)) { + *codepoint = static_cast(c); + return true; + } + + unsigned char type = GetRange(static_cast(c)); + if (type >= 32) { + *codepoint = 0; + } else { + *codepoint = (0xFF >> type) & static_cast(c); + } + bool result = true; + switch (type) { + case 2: TAIL(); return result; + case 3: TAIL(); TAIL(); return result; + case 4: COPY(); TRANS(0x50); TAIL(); return result; + case 5: COPY(); TRANS(0x10); TAIL(); TAIL(); return result; + case 6: TAIL(); TAIL(); TAIL(); return result; + case 10: COPY(); TRANS(0x20); TAIL(); return result; + case 11: COPY(); TRANS(0x60); TAIL(); TAIL(); return result; + default: return false; + } +#undef COPY +#undef TRANS +#undef TAIL + } + + template + static bool Validate(InputStream& is, OutputStream& os) { +#define COPY() os.Put(c = is.Take()) +#define TRANS(mask) result &= ((GetRange(static_cast(c)) & mask) != 0) +#define TAIL() COPY(); TRANS(0x70) + Ch c; + COPY(); + if (!(c & 0x80)) + return true; + + bool result = true; + switch (GetRange(static_cast(c))) { + case 2: TAIL(); return result; + case 3: TAIL(); TAIL(); return result; + case 4: COPY(); TRANS(0x50); TAIL(); return result; + case 5: COPY(); TRANS(0x10); TAIL(); TAIL(); return result; + case 6: TAIL(); TAIL(); TAIL(); return result; + case 10: COPY(); TRANS(0x20); TAIL(); return result; + case 11: COPY(); TRANS(0x60); TAIL(); TAIL(); return result; + default: return false; + } +#undef COPY +#undef TRANS +#undef TAIL + } + + static unsigned char GetRange(unsigned char c) { + // Referring to DFA of http://bjoern.hoehrmann.de/utf-8/decoder/dfa/ + // With new mapping 1 -> 0x10, 7 -> 0x20, 9 -> 0x40, such that AND operation can test multiple types. + static const unsigned char type[] = { + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10, + 0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 8,8,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 10,3,3,3,3,3,3,3,3,3,3,3,3,4,3,3, 11,6,6,6,5,8,8,8,8,8,8,8,8,8,8,8, + }; + return type[c]; + } + + template + static CharType TakeBOM(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + typename InputByteStream::Ch c = Take(is); + if (static_cast(c) != 0xEFu) return c; + c = is.Take(); + if (static_cast(c) != 0xBBu) return c; + c = is.Take(); + if (static_cast(c) != 0xBFu) return c; + c = is.Take(); + return c; + } + + template + static Ch Take(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + return static_cast(is.Take()); + } + + template + static void PutBOM(OutputByteStream& os) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(static_cast(0xEFu)); + os.Put(static_cast(0xBBu)); + os.Put(static_cast(0xBFu)); + } + + template + static void Put(OutputByteStream& os, Ch c) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(static_cast(c)); + } +}; + +/////////////////////////////////////////////////////////////////////////////// +// UTF16 + +//! UTF-16 encoding. +/*! http://en.wikipedia.org/wiki/UTF-16 + http://tools.ietf.org/html/rfc2781 + \tparam CharType Type for storing 16-bit UTF-16 data. Default is wchar_t. C++11 may use char16_t instead. + \note implements Encoding concept + + \note For in-memory access, no need to concern endianness. The code units and code points are represented by CPU's endianness. + For streaming, use UTF16LE and UTF16BE, which handle endianness. +*/ +template +struct UTF16 { + typedef CharType Ch; + RAPIDJSON_STATIC_ASSERT(sizeof(Ch) >= 2); + + enum { supportUnicode = 1 }; + + template + static void Encode(OutputStream& os, unsigned codepoint) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputStream::Ch) >= 2); + if (codepoint <= 0xFFFF) { + RAPIDJSON_ASSERT(codepoint < 0xD800 || codepoint > 0xDFFF); // Code point itself cannot be surrogate pair + os.Put(static_cast(codepoint)); + } + else { + RAPIDJSON_ASSERT(codepoint <= 0x10FFFF); + unsigned v = codepoint - 0x10000; + os.Put(static_cast((v >> 10) | 0xD800)); + os.Put((v & 0x3FF) | 0xDC00); + } + } + + + template + static void EncodeUnsafe(OutputStream& os, unsigned codepoint) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputStream::Ch) >= 2); + if (codepoint <= 0xFFFF) { + RAPIDJSON_ASSERT(codepoint < 0xD800 || codepoint > 0xDFFF); // Code point itself cannot be surrogate pair + PutUnsafe(os, static_cast(codepoint)); + } + else { + RAPIDJSON_ASSERT(codepoint <= 0x10FFFF); + unsigned v = codepoint - 0x10000; + PutUnsafe(os, static_cast((v >> 10) | 0xD800)); + PutUnsafe(os, (v & 0x3FF) | 0xDC00); + } + } + + template + static bool Decode(InputStream& is, unsigned* codepoint) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputStream::Ch) >= 2); + typename InputStream::Ch c = is.Take(); + if (c < 0xD800 || c > 0xDFFF) { + *codepoint = static_cast(c); + return true; + } + else if (c <= 0xDBFF) { + *codepoint = (static_cast(c) & 0x3FF) << 10; + c = is.Take(); + *codepoint |= (static_cast(c) & 0x3FF); + *codepoint += 0x10000; + return c >= 0xDC00 && c <= 0xDFFF; + } + return false; + } + + template + static bool Validate(InputStream& is, OutputStream& os) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputStream::Ch) >= 2); + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputStream::Ch) >= 2); + typename InputStream::Ch c; + os.Put(static_cast(c = is.Take())); + if (c < 0xD800 || c > 0xDFFF) + return true; + else if (c <= 0xDBFF) { + os.Put(c = is.Take()); + return c >= 0xDC00 && c <= 0xDFFF; + } + return false; + } +}; + +//! UTF-16 little endian encoding. +template +struct UTF16LE : UTF16 { + template + static CharType TakeBOM(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + CharType c = Take(is); + return static_cast(c) == 0xFEFFu ? Take(is) : c; + } + + template + static CharType Take(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + unsigned c = static_cast(is.Take()); + c |= static_cast(static_cast(is.Take())) << 8; + return static_cast(c); + } + + template + static void PutBOM(OutputByteStream& os) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(static_cast(0xFFu)); + os.Put(static_cast(0xFEu)); + } + + template + static void Put(OutputByteStream& os, CharType c) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(static_cast(static_cast(c) & 0xFFu)); + os.Put(static_cast((static_cast(c) >> 8) & 0xFFu)); + } +}; + +//! UTF-16 big endian encoding. +template +struct UTF16BE : UTF16 { + template + static CharType TakeBOM(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + CharType c = Take(is); + return static_cast(c) == 0xFEFFu ? Take(is) : c; + } + + template + static CharType Take(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + unsigned c = static_cast(static_cast(is.Take())) << 8; + c |= static_cast(is.Take()); + return static_cast(c); + } + + template + static void PutBOM(OutputByteStream& os) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(static_cast(0xFEu)); + os.Put(static_cast(0xFFu)); + } + + template + static void Put(OutputByteStream& os, CharType c) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(static_cast((static_cast(c) >> 8) & 0xFFu)); + os.Put(static_cast(static_cast(c) & 0xFFu)); + } +}; + +/////////////////////////////////////////////////////////////////////////////// +// UTF32 + +//! UTF-32 encoding. +/*! http://en.wikipedia.org/wiki/UTF-32 + \tparam CharType Type for storing 32-bit UTF-32 data. Default is unsigned. C++11 may use char32_t instead. + \note implements Encoding concept + + \note For in-memory access, no need to concern endianness. The code units and code points are represented by CPU's endianness. + For streaming, use UTF32LE and UTF32BE, which handle endianness. +*/ +template +struct UTF32 { + typedef CharType Ch; + RAPIDJSON_STATIC_ASSERT(sizeof(Ch) >= 4); + + enum { supportUnicode = 1 }; + + template + static void Encode(OutputStream& os, unsigned codepoint) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputStream::Ch) >= 4); + RAPIDJSON_ASSERT(codepoint <= 0x10FFFF); + os.Put(codepoint); + } + + template + static void EncodeUnsafe(OutputStream& os, unsigned codepoint) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputStream::Ch) >= 4); + RAPIDJSON_ASSERT(codepoint <= 0x10FFFF); + PutUnsafe(os, codepoint); + } + + template + static bool Decode(InputStream& is, unsigned* codepoint) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputStream::Ch) >= 4); + Ch c = is.Take(); + *codepoint = c; + return c <= 0x10FFFF; + } + + template + static bool Validate(InputStream& is, OutputStream& os) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputStream::Ch) >= 4); + Ch c; + os.Put(c = is.Take()); + return c <= 0x10FFFF; + } +}; + +//! UTF-32 little endian enocoding. +template +struct UTF32LE : UTF32 { + template + static CharType TakeBOM(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + CharType c = Take(is); + return static_cast(c) == 0x0000FEFFu ? Take(is) : c; + } + + template + static CharType Take(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + unsigned c = static_cast(is.Take()); + c |= static_cast(static_cast(is.Take())) << 8; + c |= static_cast(static_cast(is.Take())) << 16; + c |= static_cast(static_cast(is.Take())) << 24; + return static_cast(c); + } + + template + static void PutBOM(OutputByteStream& os) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(static_cast(0xFFu)); + os.Put(static_cast(0xFEu)); + os.Put(static_cast(0x00u)); + os.Put(static_cast(0x00u)); + } + + template + static void Put(OutputByteStream& os, CharType c) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(static_cast(c & 0xFFu)); + os.Put(static_cast((c >> 8) & 0xFFu)); + os.Put(static_cast((c >> 16) & 0xFFu)); + os.Put(static_cast((c >> 24) & 0xFFu)); + } +}; + +//! UTF-32 big endian encoding. +template +struct UTF32BE : UTF32 { + template + static CharType TakeBOM(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + CharType c = Take(is); + return static_cast(c) == 0x0000FEFFu ? Take(is) : c; + } + + template + static CharType Take(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + unsigned c = static_cast(static_cast(is.Take())) << 24; + c |= static_cast(static_cast(is.Take())) << 16; + c |= static_cast(static_cast(is.Take())) << 8; + c |= static_cast(static_cast(is.Take())); + return static_cast(c); + } + + template + static void PutBOM(OutputByteStream& os) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(static_cast(0x00u)); + os.Put(static_cast(0x00u)); + os.Put(static_cast(0xFEu)); + os.Put(static_cast(0xFFu)); + } + + template + static void Put(OutputByteStream& os, CharType c) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(static_cast((c >> 24) & 0xFFu)); + os.Put(static_cast((c >> 16) & 0xFFu)); + os.Put(static_cast((c >> 8) & 0xFFu)); + os.Put(static_cast(c & 0xFFu)); + } +}; + +/////////////////////////////////////////////////////////////////////////////// +// ASCII + +//! ASCII encoding. +/*! http://en.wikipedia.org/wiki/ASCII + \tparam CharType Code unit for storing 7-bit ASCII data. Default is char. + \note implements Encoding concept +*/ +template +struct ASCII { + typedef CharType Ch; + + enum { supportUnicode = 0 }; + + template + static void Encode(OutputStream& os, unsigned codepoint) { + RAPIDJSON_ASSERT(codepoint <= 0x7F); + os.Put(static_cast(codepoint & 0xFF)); + } + + template + static void EncodeUnsafe(OutputStream& os, unsigned codepoint) { + RAPIDJSON_ASSERT(codepoint <= 0x7F); + PutUnsafe(os, static_cast(codepoint & 0xFF)); + } + + template + static bool Decode(InputStream& is, unsigned* codepoint) { + uint8_t c = static_cast(is.Take()); + *codepoint = c; + return c <= 0X7F; + } + + template + static bool Validate(InputStream& is, OutputStream& os) { + uint8_t c = static_cast(is.Take()); + os.Put(static_cast(c)); + return c <= 0x7F; + } + + template + static CharType TakeBOM(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + uint8_t c = static_cast(Take(is)); + return static_cast(c); + } + + template + static Ch Take(InputByteStream& is) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename InputByteStream::Ch) == 1); + return static_cast(is.Take()); + } + + template + static void PutBOM(OutputByteStream& os) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + (void)os; + } + + template + static void Put(OutputByteStream& os, Ch c) { + RAPIDJSON_STATIC_ASSERT(sizeof(typename OutputByteStream::Ch) == 1); + os.Put(static_cast(c)); + } +}; + +/////////////////////////////////////////////////////////////////////////////// +// AutoUTF + +//! Runtime-specified UTF encoding type of a stream. +enum UTFType { + kUTF8 = 0, //!< UTF-8. + kUTF16LE = 1, //!< UTF-16 little endian. + kUTF16BE = 2, //!< UTF-16 big endian. + kUTF32LE = 3, //!< UTF-32 little endian. + kUTF32BE = 4 //!< UTF-32 big endian. +}; + +//! Dynamically select encoding according to stream's runtime-specified UTF encoding type. +/*! \note This class can be used with AutoUTFInputtStream and AutoUTFOutputStream, which provides GetType(). +*/ +template +struct AutoUTF { + typedef CharType Ch; + + enum { supportUnicode = 1 }; + +#define RAPIDJSON_ENCODINGS_FUNC(x) UTF8::x, UTF16LE::x, UTF16BE::x, UTF32LE::x, UTF32BE::x + + template + RAPIDJSON_FORCEINLINE static void Encode(OutputStream& os, unsigned codepoint) { + typedef void (*EncodeFunc)(OutputStream&, unsigned); + static const EncodeFunc f[] = { RAPIDJSON_ENCODINGS_FUNC(Encode) }; + (*f[os.GetType()])(os, codepoint); + } + + template + RAPIDJSON_FORCEINLINE static void EncodeUnsafe(OutputStream& os, unsigned codepoint) { + typedef void (*EncodeFunc)(OutputStream&, unsigned); + static const EncodeFunc f[] = { RAPIDJSON_ENCODINGS_FUNC(EncodeUnsafe) }; + (*f[os.GetType()])(os, codepoint); + } + + template + RAPIDJSON_FORCEINLINE static bool Decode(InputStream& is, unsigned* codepoint) { + typedef bool (*DecodeFunc)(InputStream&, unsigned*); + static const DecodeFunc f[] = { RAPIDJSON_ENCODINGS_FUNC(Decode) }; + return (*f[is.GetType()])(is, codepoint); + } + + template + RAPIDJSON_FORCEINLINE static bool Validate(InputStream& is, OutputStream& os) { + typedef bool (*ValidateFunc)(InputStream&, OutputStream&); + static const ValidateFunc f[] = { RAPIDJSON_ENCODINGS_FUNC(Validate) }; + return (*f[is.GetType()])(is, os); + } + +#undef RAPIDJSON_ENCODINGS_FUNC +}; + +/////////////////////////////////////////////////////////////////////////////// +// Transcoder + +//! Encoding conversion. +template +struct Transcoder { + //! Take one Unicode codepoint from source encoding, convert it to target encoding and put it to the output stream. + template + RAPIDJSON_FORCEINLINE static bool Transcode(InputStream& is, OutputStream& os) { + unsigned codepoint; + if (!SourceEncoding::Decode(is, &codepoint)) + return false; + TargetEncoding::Encode(os, codepoint); + return true; + } + + template + RAPIDJSON_FORCEINLINE static bool TranscodeUnsafe(InputStream& is, OutputStream& os) { + unsigned codepoint; + if (!SourceEncoding::Decode(is, &codepoint)) + return false; + TargetEncoding::EncodeUnsafe(os, codepoint); + return true; + } + + //! Validate one Unicode codepoint from an encoded stream. + template + RAPIDJSON_FORCEINLINE static bool Validate(InputStream& is, OutputStream& os) { + return Transcode(is, os); // Since source/target encoding is different, must transcode. + } +}; + +// Forward declaration. +template +inline void PutUnsafe(Stream& stream, typename Stream::Ch c); + +//! Specialization of Transcoder with same source and target encoding. +template +struct Transcoder { + template + RAPIDJSON_FORCEINLINE static bool Transcode(InputStream& is, OutputStream& os) { + os.Put(is.Take()); // Just copy one code unit. This semantic is different from primary template class. + return true; + } + + template + RAPIDJSON_FORCEINLINE static bool TranscodeUnsafe(InputStream& is, OutputStream& os) { + PutUnsafe(os, is.Take()); // Just copy one code unit. This semantic is different from primary template class. + return true; + } + + template + RAPIDJSON_FORCEINLINE static bool Validate(InputStream& is, OutputStream& os) { + return Encoding::Validate(is, os); // source/target encoding are the same + } +}; + +RAPIDJSON_NAMESPACE_END + +#if defined(__GNUC__) || defined(_MSC_VER) +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_ENCODINGS_H_ diff --git a/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/error/en.h b/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/error/en.h new file mode 100644 index 0000000..2db838b --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/error/en.h @@ -0,0 +1,74 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_ERROR_EN_H_ +#define RAPIDJSON_ERROR_EN_H_ + +#include "error.h" + +#ifdef __clang__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(switch-enum) +RAPIDJSON_DIAG_OFF(covered-switch-default) +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +//! Maps error code of parsing into error message. +/*! + \ingroup RAPIDJSON_ERRORS + \param parseErrorCode Error code obtained in parsing. + \return the error message. + \note User can make a copy of this function for localization. + Using switch-case is safer for future modification of error codes. +*/ +inline const RAPIDJSON_ERROR_CHARTYPE* GetParseError_En(ParseErrorCode parseErrorCode) { + switch (parseErrorCode) { + case kParseErrorNone: return RAPIDJSON_ERROR_STRING("No error."); + + case kParseErrorDocumentEmpty: return RAPIDJSON_ERROR_STRING("The document is empty."); + case kParseErrorDocumentRootNotSingular: return RAPIDJSON_ERROR_STRING("The document root must not be followed by other values."); + + case kParseErrorValueInvalid: return RAPIDJSON_ERROR_STRING("Invalid value."); + + case kParseErrorObjectMissName: return RAPIDJSON_ERROR_STRING("Missing a name for object member."); + case kParseErrorObjectMissColon: return RAPIDJSON_ERROR_STRING("Missing a colon after a name of object member."); + case kParseErrorObjectMissCommaOrCurlyBracket: return RAPIDJSON_ERROR_STRING("Missing a comma or '}' after an object member."); + + case kParseErrorArrayMissCommaOrSquareBracket: return RAPIDJSON_ERROR_STRING("Missing a comma or ']' after an array element."); + + case kParseErrorStringUnicodeEscapeInvalidHex: return RAPIDJSON_ERROR_STRING("Incorrect hex digit after \\u escape in string."); + case kParseErrorStringUnicodeSurrogateInvalid: return RAPIDJSON_ERROR_STRING("The surrogate pair in string is invalid."); + case kParseErrorStringEscapeInvalid: return RAPIDJSON_ERROR_STRING("Invalid escape character in string."); + case kParseErrorStringMissQuotationMark: return RAPIDJSON_ERROR_STRING("Missing a closing quotation mark in string."); + case kParseErrorStringInvalidEncoding: return RAPIDJSON_ERROR_STRING("Invalid encoding in string."); + + case kParseErrorNumberTooBig: return RAPIDJSON_ERROR_STRING("Number too big to be stored in double."); + case kParseErrorNumberMissFraction: return RAPIDJSON_ERROR_STRING("Miss fraction part in number."); + case kParseErrorNumberMissExponent: return RAPIDJSON_ERROR_STRING("Miss exponent in number."); + + case kParseErrorTermination: return RAPIDJSON_ERROR_STRING("Terminate parsing due to Handler error."); + case kParseErrorUnspecificSyntaxError: return RAPIDJSON_ERROR_STRING("Unspecific syntax error."); + + default: return RAPIDJSON_ERROR_STRING("Unknown error."); + } +} + +RAPIDJSON_NAMESPACE_END + +#ifdef __clang__ +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_ERROR_EN_H_ diff --git a/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/error/error.h b/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/error/error.h new file mode 100644 index 0000000..95cb31a --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/error/error.h @@ -0,0 +1,155 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_ERROR_ERROR_H_ +#define RAPIDJSON_ERROR_ERROR_H_ + +#include "../rapidjson.h" + +#ifdef __clang__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(padded) +#endif + +/*! \file error.h */ + +/*! \defgroup RAPIDJSON_ERRORS RapidJSON error handling */ + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_ERROR_CHARTYPE + +//! Character type of error messages. +/*! \ingroup RAPIDJSON_ERRORS + The default character type is \c char. + On Windows, user can define this macro as \c TCHAR for supporting both + unicode/non-unicode settings. +*/ +#ifndef RAPIDJSON_ERROR_CHARTYPE +#define RAPIDJSON_ERROR_CHARTYPE char +#endif + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_ERROR_STRING + +//! Macro for converting string literial to \ref RAPIDJSON_ERROR_CHARTYPE[]. +/*! \ingroup RAPIDJSON_ERRORS + By default this conversion macro does nothing. + On Windows, user can define this macro as \c _T(x) for supporting both + unicode/non-unicode settings. +*/ +#ifndef RAPIDJSON_ERROR_STRING +#define RAPIDJSON_ERROR_STRING(x) x +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +/////////////////////////////////////////////////////////////////////////////// +// ParseErrorCode + +//! Error code of parsing. +/*! \ingroup RAPIDJSON_ERRORS + \see GenericReader::Parse, GenericReader::GetParseErrorCode +*/ +enum ParseErrorCode { + kParseErrorNone = 0, //!< No error. + + kParseErrorDocumentEmpty, //!< The document is empty. + kParseErrorDocumentRootNotSingular, //!< The document root must not follow by other values. + + kParseErrorValueInvalid, //!< Invalid value. + + kParseErrorObjectMissName, //!< Missing a name for object member. + kParseErrorObjectMissColon, //!< Missing a colon after a name of object member. + kParseErrorObjectMissCommaOrCurlyBracket, //!< Missing a comma or '}' after an object member. + + kParseErrorArrayMissCommaOrSquareBracket, //!< Missing a comma or ']' after an array element. + + kParseErrorStringUnicodeEscapeInvalidHex, //!< Incorrect hex digit after \\u escape in string. + kParseErrorStringUnicodeSurrogateInvalid, //!< The surrogate pair in string is invalid. + kParseErrorStringEscapeInvalid, //!< Invalid escape character in string. + kParseErrorStringMissQuotationMark, //!< Missing a closing quotation mark in string. + kParseErrorStringInvalidEncoding, //!< Invalid encoding in string. + + kParseErrorNumberTooBig, //!< Number too big to be stored in double. + kParseErrorNumberMissFraction, //!< Miss fraction part in number. + kParseErrorNumberMissExponent, //!< Miss exponent in number. + + kParseErrorTermination, //!< Parsing was terminated. + kParseErrorUnspecificSyntaxError //!< Unspecific syntax error. +}; + +//! Result of parsing (wraps ParseErrorCode) +/*! + \ingroup RAPIDJSON_ERRORS + \code + Document doc; + ParseResult ok = doc.Parse("[42]"); + if (!ok) { + fprintf(stderr, "JSON parse error: %s (%u)", + GetParseError_En(ok.Code()), ok.Offset()); + exit(EXIT_FAILURE); + } + \endcode + \see GenericReader::Parse, GenericDocument::Parse +*/ +struct ParseResult { +public: + //! Default constructor, no error. + ParseResult() : code_(kParseErrorNone), offset_(0) {} + //! Constructor to set an error. + ParseResult(ParseErrorCode code, size_t offset) : code_(code), offset_(offset) {} + + //! Get the error code. + ParseErrorCode Code() const { return code_; } + //! Get the error offset, if \ref IsError(), 0 otherwise. + size_t Offset() const { return offset_; } + + //! Conversion to \c bool, returns \c true, iff !\ref IsError(). + operator bool() const { return !IsError(); } + //! Whether the result is an error. + bool IsError() const { return code_ != kParseErrorNone; } + + bool operator==(const ParseResult& that) const { return code_ == that.code_; } + bool operator==(ParseErrorCode code) const { return code_ == code; } + friend bool operator==(ParseErrorCode code, const ParseResult & err) { return code == err.code_; } + + //! Reset error code. + void Clear() { Set(kParseErrorNone); } + //! Update error code and offset. + void Set(ParseErrorCode code, size_t offset = 0) { code_ = code; offset_ = offset; } + +private: + ParseErrorCode code_; + size_t offset_; +}; + +//! Function pointer type of GetParseError(). +/*! \ingroup RAPIDJSON_ERRORS + + This is the prototype for \c GetParseError_X(), where \c X is a locale. + User can dynamically change locale in runtime, e.g.: +\code + GetParseErrorFunc GetParseError = GetParseError_En; // or whatever + const RAPIDJSON_ERROR_CHARTYPE* s = GetParseError(document.GetParseErrorCode()); +\endcode +*/ +typedef const RAPIDJSON_ERROR_CHARTYPE* (*GetParseErrorFunc)(ParseErrorCode); + +RAPIDJSON_NAMESPACE_END + +#ifdef __clang__ +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_ERROR_ERROR_H_ diff --git a/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/filereadstream.h b/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/filereadstream.h new file mode 100644 index 0000000..b56ea13 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/filereadstream.h @@ -0,0 +1,99 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_FILEREADSTREAM_H_ +#define RAPIDJSON_FILEREADSTREAM_H_ + +#include "stream.h" +#include + +#ifdef __clang__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(padded) +RAPIDJSON_DIAG_OFF(unreachable-code) +RAPIDJSON_DIAG_OFF(missing-noreturn) +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +//! File byte stream for input using fread(). +/*! + \note implements Stream concept +*/ +class FileReadStream { +public: + typedef char Ch; //!< Character type (byte). + + //! Constructor. + /*! + \param fp File pointer opened for read. + \param buffer user-supplied buffer. + \param bufferSize size of buffer in bytes. Must >=4 bytes. + */ + FileReadStream(std::FILE* fp, char* buffer, size_t bufferSize) : fp_(fp), buffer_(buffer), bufferSize_(bufferSize), bufferLast_(0), current_(buffer_), readCount_(0), count_(0), eof_(false) { + RAPIDJSON_ASSERT(fp_ != 0); + RAPIDJSON_ASSERT(bufferSize >= 4); + Read(); + } + + Ch Peek() const { return *current_; } + Ch Take() { Ch c = *current_; Read(); return c; } + size_t Tell() const { return count_ + static_cast(current_ - buffer_); } + + // Not implemented + void Put(Ch) { RAPIDJSON_ASSERT(false); } + void Flush() { RAPIDJSON_ASSERT(false); } + Ch* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } + size_t PutEnd(Ch*) { RAPIDJSON_ASSERT(false); return 0; } + + // For encoding detection only. + const Ch* Peek4() const { + return (current_ + 4 <= bufferLast_) ? current_ : 0; + } + +private: + void Read() { + if (current_ < bufferLast_) + ++current_; + else if (!eof_) { + count_ += readCount_; + readCount_ = fread(buffer_, 1, bufferSize_, fp_); + bufferLast_ = buffer_ + readCount_ - 1; + current_ = buffer_; + + if (readCount_ < bufferSize_) { + buffer_[readCount_] = '\0'; + ++bufferLast_; + eof_ = true; + } + } + } + + std::FILE* fp_; + Ch *buffer_; + size_t bufferSize_; + Ch *bufferLast_; + Ch *current_; + size_t readCount_; + size_t count_; //!< Number of characters read + bool eof_; +}; + +RAPIDJSON_NAMESPACE_END + +#ifdef __clang__ +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_FILESTREAM_H_ diff --git a/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/filewritestream.h b/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/filewritestream.h new file mode 100644 index 0000000..6378dd6 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/filewritestream.h @@ -0,0 +1,104 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_FILEWRITESTREAM_H_ +#define RAPIDJSON_FILEWRITESTREAM_H_ + +#include "stream.h" +#include + +#ifdef __clang__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(unreachable-code) +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +//! Wrapper of C file stream for input using fread(). +/*! + \note implements Stream concept +*/ +class FileWriteStream { +public: + typedef char Ch; //!< Character type. Only support char. + + FileWriteStream(std::FILE* fp, char* buffer, size_t bufferSize) : fp_(fp), buffer_(buffer), bufferEnd_(buffer + bufferSize), current_(buffer_) { + RAPIDJSON_ASSERT(fp_ != 0); + } + + void Put(char c) { + if (current_ >= bufferEnd_) + Flush(); + + *current_++ = c; + } + + void PutN(char c, size_t n) { + size_t avail = static_cast(bufferEnd_ - current_); + while (n > avail) { + std::memset(current_, c, avail); + current_ += avail; + Flush(); + n -= avail; + avail = static_cast(bufferEnd_ - current_); + } + + if (n > 0) { + std::memset(current_, c, n); + current_ += n; + } + } + + void Flush() { + if (current_ != buffer_) { + size_t result = fwrite(buffer_, 1, static_cast(current_ - buffer_), fp_); + if (result < static_cast(current_ - buffer_)) { + // failure deliberately ignored at this time + // added to avoid warn_unused_result build errors + } + current_ = buffer_; + } + } + + // Not implemented + char Peek() const { RAPIDJSON_ASSERT(false); return 0; } + char Take() { RAPIDJSON_ASSERT(false); return 0; } + size_t Tell() const { RAPIDJSON_ASSERT(false); return 0; } + char* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } + size_t PutEnd(char*) { RAPIDJSON_ASSERT(false); return 0; } + +private: + // Prohibit copy constructor & assignment operator. + FileWriteStream(const FileWriteStream&); + FileWriteStream& operator=(const FileWriteStream&); + + std::FILE* fp_; + char *buffer_; + char *bufferEnd_; + char *current_; +}; + +//! Implement specialized version of PutN() with memset() for better performance. +template<> +inline void PutN(FileWriteStream& stream, char c, size_t n) { + stream.PutN(c, n); +} + +RAPIDJSON_NAMESPACE_END + +#ifdef __clang__ +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_FILESTREAM_H_ diff --git a/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/fwd.h b/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/fwd.h new file mode 100644 index 0000000..e8104e8 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/fwd.h @@ -0,0 +1,151 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_FWD_H_ +#define RAPIDJSON_FWD_H_ + +#include "rapidjson.h" + +RAPIDJSON_NAMESPACE_BEGIN + +// encodings.h + +template struct UTF8; +template struct UTF16; +template struct UTF16BE; +template struct UTF16LE; +template struct UTF32; +template struct UTF32BE; +template struct UTF32LE; +template struct ASCII; +template struct AutoUTF; + +template +struct Transcoder; + +// allocators.h + +class CrtAllocator; + +template +class MemoryPoolAllocator; + +// stream.h + +template +struct GenericStringStream; + +typedef GenericStringStream > StringStream; + +template +struct GenericInsituStringStream; + +typedef GenericInsituStringStream > InsituStringStream; + +// stringbuffer.h + +template +class GenericStringBuffer; + +typedef GenericStringBuffer, CrtAllocator> StringBuffer; + +// filereadstream.h + +class FileReadStream; + +// filewritestream.h + +class FileWriteStream; + +// memorybuffer.h + +template +struct GenericMemoryBuffer; + +typedef GenericMemoryBuffer MemoryBuffer; + +// memorystream.h + +struct MemoryStream; + +// reader.h + +template +struct BaseReaderHandler; + +template +class GenericReader; + +typedef GenericReader, UTF8, CrtAllocator> Reader; + +// writer.h + +template +class Writer; + +// prettywriter.h + +template +class PrettyWriter; + +// document.h + +template +struct GenericMember; + +template +class GenericMemberIterator; + +template +struct GenericStringRef; + +template +class GenericValue; + +typedef GenericValue, MemoryPoolAllocator > Value; + +template +class GenericDocument; + +typedef GenericDocument, MemoryPoolAllocator, CrtAllocator> Document; + +// pointer.h + +template +class GenericPointer; + +typedef GenericPointer Pointer; + +// schema.h + +template +class IGenericRemoteSchemaDocumentProvider; + +template +class GenericSchemaDocument; + +typedef GenericSchemaDocument SchemaDocument; +typedef IGenericRemoteSchemaDocumentProvider IRemoteSchemaDocumentProvider; + +template < + typename SchemaDocumentType, + typename OutputHandler, + typename StateAllocator> +class GenericSchemaValidator; + +typedef GenericSchemaValidator, void>, CrtAllocator> SchemaValidator; + +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_RAPIDJSONFWD_H_ diff --git a/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/internal/biginteger.h b/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/internal/biginteger.h new file mode 100644 index 0000000..9d3e88c --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/internal/biginteger.h @@ -0,0 +1,290 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_BIGINTEGER_H_ +#define RAPIDJSON_BIGINTEGER_H_ + +#include "../rapidjson.h" + +#if defined(_MSC_VER) && defined(_M_AMD64) +#include // for _umul128 +#pragma intrinsic(_umul128) +#endif + +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +class BigInteger { +public: + typedef uint64_t Type; + + BigInteger(const BigInteger& rhs) : count_(rhs.count_) { + std::memcpy(digits_, rhs.digits_, count_ * sizeof(Type)); + } + + explicit BigInteger(uint64_t u) : count_(1) { + digits_[0] = u; + } + + BigInteger(const char* decimals, size_t length) : count_(1) { + RAPIDJSON_ASSERT(length > 0); + digits_[0] = 0; + size_t i = 0; + const size_t kMaxDigitPerIteration = 19; // 2^64 = 18446744073709551616 > 10^19 + while (length >= kMaxDigitPerIteration) { + AppendDecimal64(decimals + i, decimals + i + kMaxDigitPerIteration); + length -= kMaxDigitPerIteration; + i += kMaxDigitPerIteration; + } + + if (length > 0) + AppendDecimal64(decimals + i, decimals + i + length); + } + + BigInteger& operator=(const BigInteger &rhs) + { + if (this != &rhs) { + count_ = rhs.count_; + std::memcpy(digits_, rhs.digits_, count_ * sizeof(Type)); + } + return *this; + } + + BigInteger& operator=(uint64_t u) { + digits_[0] = u; + count_ = 1; + return *this; + } + + BigInteger& operator+=(uint64_t u) { + Type backup = digits_[0]; + digits_[0] += u; + for (size_t i = 0; i < count_ - 1; i++) { + if (digits_[i] >= backup) + return *this; // no carry + backup = digits_[i + 1]; + digits_[i + 1] += 1; + } + + // Last carry + if (digits_[count_ - 1] < backup) + PushBack(1); + + return *this; + } + + BigInteger& operator*=(uint64_t u) { + if (u == 0) return *this = 0; + if (u == 1) return *this; + if (*this == 1) return *this = u; + + uint64_t k = 0; + for (size_t i = 0; i < count_; i++) { + uint64_t hi; + digits_[i] = MulAdd64(digits_[i], u, k, &hi); + k = hi; + } + + if (k > 0) + PushBack(k); + + return *this; + } + + BigInteger& operator*=(uint32_t u) { + if (u == 0) return *this = 0; + if (u == 1) return *this; + if (*this == 1) return *this = u; + + uint64_t k = 0; + for (size_t i = 0; i < count_; i++) { + const uint64_t c = digits_[i] >> 32; + const uint64_t d = digits_[i] & 0xFFFFFFFF; + const uint64_t uc = u * c; + const uint64_t ud = u * d; + const uint64_t p0 = ud + k; + const uint64_t p1 = uc + (p0 >> 32); + digits_[i] = (p0 & 0xFFFFFFFF) | (p1 << 32); + k = p1 >> 32; + } + + if (k > 0) + PushBack(k); + + return *this; + } + + BigInteger& operator<<=(size_t shift) { + if (IsZero() || shift == 0) return *this; + + size_t offset = shift / kTypeBit; + size_t interShift = shift % kTypeBit; + RAPIDJSON_ASSERT(count_ + offset <= kCapacity); + + if (interShift == 0) { + std::memmove(&digits_[count_ - 1 + offset], &digits_[count_ - 1], count_ * sizeof(Type)); + count_ += offset; + } + else { + digits_[count_] = 0; + for (size_t i = count_; i > 0; i--) + digits_[i + offset] = (digits_[i] << interShift) | (digits_[i - 1] >> (kTypeBit - interShift)); + digits_[offset] = digits_[0] << interShift; + count_ += offset; + if (digits_[count_]) + count_++; + } + + std::memset(digits_, 0, offset * sizeof(Type)); + + return *this; + } + + bool operator==(const BigInteger& rhs) const { + return count_ == rhs.count_ && std::memcmp(digits_, rhs.digits_, count_ * sizeof(Type)) == 0; + } + + bool operator==(const Type rhs) const { + return count_ == 1 && digits_[0] == rhs; + } + + BigInteger& MultiplyPow5(unsigned exp) { + static const uint32_t kPow5[12] = { + 5, + 5 * 5, + 5 * 5 * 5, + 5 * 5 * 5 * 5, + 5 * 5 * 5 * 5 * 5, + 5 * 5 * 5 * 5 * 5 * 5, + 5 * 5 * 5 * 5 * 5 * 5 * 5, + 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5, + 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5, + 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5, + 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5, + 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 + }; + if (exp == 0) return *this; + for (; exp >= 27; exp -= 27) *this *= RAPIDJSON_UINT64_C2(0X6765C793, 0XFA10079D); // 5^27 + for (; exp >= 13; exp -= 13) *this *= static_cast(1220703125u); // 5^13 + if (exp > 0) *this *= kPow5[exp - 1]; + return *this; + } + + // Compute absolute difference of this and rhs. + // Assume this != rhs + bool Difference(const BigInteger& rhs, BigInteger* out) const { + int cmp = Compare(rhs); + RAPIDJSON_ASSERT(cmp != 0); + const BigInteger *a, *b; // Makes a > b + bool ret; + if (cmp < 0) { a = &rhs; b = this; ret = true; } + else { a = this; b = &rhs; ret = false; } + + Type borrow = 0; + for (size_t i = 0; i < a->count_; i++) { + Type d = a->digits_[i] - borrow; + if (i < b->count_) + d -= b->digits_[i]; + borrow = (d > a->digits_[i]) ? 1 : 0; + out->digits_[i] = d; + if (d != 0) + out->count_ = i + 1; + } + + return ret; + } + + int Compare(const BigInteger& rhs) const { + if (count_ != rhs.count_) + return count_ < rhs.count_ ? -1 : 1; + + for (size_t i = count_; i-- > 0;) + if (digits_[i] != rhs.digits_[i]) + return digits_[i] < rhs.digits_[i] ? -1 : 1; + + return 0; + } + + size_t GetCount() const { return count_; } + Type GetDigit(size_t index) const { RAPIDJSON_ASSERT(index < count_); return digits_[index]; } + bool IsZero() const { return count_ == 1 && digits_[0] == 0; } + +private: + void AppendDecimal64(const char* begin, const char* end) { + uint64_t u = ParseUint64(begin, end); + if (IsZero()) + *this = u; + else { + unsigned exp = static_cast(end - begin); + (MultiplyPow5(exp) <<= exp) += u; // *this = *this * 10^exp + u + } + } + + void PushBack(Type digit) { + RAPIDJSON_ASSERT(count_ < kCapacity); + digits_[count_++] = digit; + } + + static uint64_t ParseUint64(const char* begin, const char* end) { + uint64_t r = 0; + for (const char* p = begin; p != end; ++p) { + RAPIDJSON_ASSERT(*p >= '0' && *p <= '9'); + r = r * 10u + static_cast(*p - '0'); + } + return r; + } + + // Assume a * b + k < 2^128 + static uint64_t MulAdd64(uint64_t a, uint64_t b, uint64_t k, uint64_t* outHigh) { +#if defined(_MSC_VER) && defined(_M_AMD64) + uint64_t low = _umul128(a, b, outHigh) + k; + if (low < k) + (*outHigh)++; + return low; +#elif (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) && defined(__x86_64__) + __extension__ typedef unsigned __int128 uint128; + uint128 p = static_cast(a) * static_cast(b); + p += k; + *outHigh = static_cast(p >> 64); + return static_cast(p); +#else + const uint64_t a0 = a & 0xFFFFFFFF, a1 = a >> 32, b0 = b & 0xFFFFFFFF, b1 = b >> 32; + uint64_t x0 = a0 * b0, x1 = a0 * b1, x2 = a1 * b0, x3 = a1 * b1; + x1 += (x0 >> 32); // can't give carry + x1 += x2; + if (x1 < x2) + x3 += (static_cast(1) << 32); + uint64_t lo = (x1 << 32) + (x0 & 0xFFFFFFFF); + uint64_t hi = x3 + (x1 >> 32); + + lo += k; + if (lo < k) + hi++; + *outHigh = hi; + return lo; +#endif + } + + static const size_t kBitCount = 3328; // 64bit * 54 > 10^1000 + static const size_t kCapacity = kBitCount / sizeof(Type); + static const size_t kTypeBit = sizeof(Type) * 8; + + Type digits_[kCapacity]; + size_t count_; +}; + +} // namespace internal +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_BIGINTEGER_H_ diff --git a/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/internal/diyfp.h b/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/internal/diyfp.h new file mode 100644 index 0000000..c9fefdc --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/internal/diyfp.h @@ -0,0 +1,258 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +// This is a C++ header-only implementation of Grisu2 algorithm from the publication: +// Loitsch, Florian. "Printing floating-point numbers quickly and accurately with +// integers." ACM Sigplan Notices 45.6 (2010): 233-243. + +#ifndef RAPIDJSON_DIYFP_H_ +#define RAPIDJSON_DIYFP_H_ + +#include "../rapidjson.h" + +#if defined(_MSC_VER) && defined(_M_AMD64) +#include +#pragma intrinsic(_BitScanReverse64) +#pragma intrinsic(_umul128) +#endif + +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +#ifdef __GNUC__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(effc++) +#endif + +#ifdef __clang__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(padded) +#endif + +struct DiyFp { + DiyFp() : f(), e() {} + + DiyFp(uint64_t fp, int exp) : f(fp), e(exp) {} + + explicit DiyFp(double d) { + union { + double d; + uint64_t u64; + } u = { d }; + + int biased_e = static_cast((u.u64 & kDpExponentMask) >> kDpSignificandSize); + uint64_t significand = (u.u64 & kDpSignificandMask); + if (biased_e != 0) { + f = significand + kDpHiddenBit; + e = biased_e - kDpExponentBias; + } + else { + f = significand; + e = kDpMinExponent + 1; + } + } + + DiyFp operator-(const DiyFp& rhs) const { + return DiyFp(f - rhs.f, e); + } + + DiyFp operator*(const DiyFp& rhs) const { +#if defined(_MSC_VER) && defined(_M_AMD64) + uint64_t h; + uint64_t l = _umul128(f, rhs.f, &h); + if (l & (uint64_t(1) << 63)) // rounding + h++; + return DiyFp(h, e + rhs.e + 64); +#elif (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) && defined(__x86_64__) + __extension__ typedef unsigned __int128 uint128; + uint128 p = static_cast(f) * static_cast(rhs.f); + uint64_t h = static_cast(p >> 64); + uint64_t l = static_cast(p); + if (l & (uint64_t(1) << 63)) // rounding + h++; + return DiyFp(h, e + rhs.e + 64); +#else + const uint64_t M32 = 0xFFFFFFFF; + const uint64_t a = f >> 32; + const uint64_t b = f & M32; + const uint64_t c = rhs.f >> 32; + const uint64_t d = rhs.f & M32; + const uint64_t ac = a * c; + const uint64_t bc = b * c; + const uint64_t ad = a * d; + const uint64_t bd = b * d; + uint64_t tmp = (bd >> 32) + (ad & M32) + (bc & M32); + tmp += 1U << 31; /// mult_round + return DiyFp(ac + (ad >> 32) + (bc >> 32) + (tmp >> 32), e + rhs.e + 64); +#endif + } + + DiyFp Normalize() const { +#if defined(_MSC_VER) && defined(_M_AMD64) + unsigned long index; + _BitScanReverse64(&index, f); + return DiyFp(f << (63 - index), e - (63 - index)); +#elif defined(__GNUC__) && __GNUC__ >= 4 + int s = __builtin_clzll(f); + return DiyFp(f << s, e - s); +#else + DiyFp res = *this; + while (!(res.f & (static_cast(1) << 63))) { + res.f <<= 1; + res.e--; + } + return res; +#endif + } + + DiyFp NormalizeBoundary() const { + DiyFp res = *this; + while (!(res.f & (kDpHiddenBit << 1))) { + res.f <<= 1; + res.e--; + } + res.f <<= (kDiySignificandSize - kDpSignificandSize - 2); + res.e = res.e - (kDiySignificandSize - kDpSignificandSize - 2); + return res; + } + + void NormalizedBoundaries(DiyFp* minus, DiyFp* plus) const { + DiyFp pl = DiyFp((f << 1) + 1, e - 1).NormalizeBoundary(); + DiyFp mi = (f == kDpHiddenBit) ? DiyFp((f << 2) - 1, e - 2) : DiyFp((f << 1) - 1, e - 1); + mi.f <<= mi.e - pl.e; + mi.e = pl.e; + *plus = pl; + *minus = mi; + } + + double ToDouble() const { + union { + double d; + uint64_t u64; + }u; + const uint64_t be = (e == kDpDenormalExponent && (f & kDpHiddenBit) == 0) ? 0 : + static_cast(e + kDpExponentBias); + u.u64 = (f & kDpSignificandMask) | (be << kDpSignificandSize); + return u.d; + } + + static const int kDiySignificandSize = 64; + static const int kDpSignificandSize = 52; + static const int kDpExponentBias = 0x3FF + kDpSignificandSize; + static const int kDpMaxExponent = 0x7FF - kDpExponentBias; + static const int kDpMinExponent = -kDpExponentBias; + static const int kDpDenormalExponent = -kDpExponentBias + 1; + static const uint64_t kDpExponentMask = RAPIDJSON_UINT64_C2(0x7FF00000, 0x00000000); + static const uint64_t kDpSignificandMask = RAPIDJSON_UINT64_C2(0x000FFFFF, 0xFFFFFFFF); + static const uint64_t kDpHiddenBit = RAPIDJSON_UINT64_C2(0x00100000, 0x00000000); + + uint64_t f; + int e; +}; + +inline DiyFp GetCachedPowerByIndex(size_t index) { + // 10^-348, 10^-340, ..., 10^340 + static const uint64_t kCachedPowers_F[] = { + RAPIDJSON_UINT64_C2(0xfa8fd5a0, 0x081c0288), RAPIDJSON_UINT64_C2(0xbaaee17f, 0xa23ebf76), + RAPIDJSON_UINT64_C2(0x8b16fb20, 0x3055ac76), RAPIDJSON_UINT64_C2(0xcf42894a, 0x5dce35ea), + RAPIDJSON_UINT64_C2(0x9a6bb0aa, 0x55653b2d), RAPIDJSON_UINT64_C2(0xe61acf03, 0x3d1a45df), + RAPIDJSON_UINT64_C2(0xab70fe17, 0xc79ac6ca), RAPIDJSON_UINT64_C2(0xff77b1fc, 0xbebcdc4f), + RAPIDJSON_UINT64_C2(0xbe5691ef, 0x416bd60c), RAPIDJSON_UINT64_C2(0x8dd01fad, 0x907ffc3c), + RAPIDJSON_UINT64_C2(0xd3515c28, 0x31559a83), RAPIDJSON_UINT64_C2(0x9d71ac8f, 0xada6c9b5), + RAPIDJSON_UINT64_C2(0xea9c2277, 0x23ee8bcb), RAPIDJSON_UINT64_C2(0xaecc4991, 0x4078536d), + RAPIDJSON_UINT64_C2(0x823c1279, 0x5db6ce57), RAPIDJSON_UINT64_C2(0xc2109436, 0x4dfb5637), + RAPIDJSON_UINT64_C2(0x9096ea6f, 0x3848984f), RAPIDJSON_UINT64_C2(0xd77485cb, 0x25823ac7), + RAPIDJSON_UINT64_C2(0xa086cfcd, 0x97bf97f4), RAPIDJSON_UINT64_C2(0xef340a98, 0x172aace5), + RAPIDJSON_UINT64_C2(0xb23867fb, 0x2a35b28e), RAPIDJSON_UINT64_C2(0x84c8d4df, 0xd2c63f3b), + RAPIDJSON_UINT64_C2(0xc5dd4427, 0x1ad3cdba), RAPIDJSON_UINT64_C2(0x936b9fce, 0xbb25c996), + RAPIDJSON_UINT64_C2(0xdbac6c24, 0x7d62a584), RAPIDJSON_UINT64_C2(0xa3ab6658, 0x0d5fdaf6), + RAPIDJSON_UINT64_C2(0xf3e2f893, 0xdec3f126), RAPIDJSON_UINT64_C2(0xb5b5ada8, 0xaaff80b8), + RAPIDJSON_UINT64_C2(0x87625f05, 0x6c7c4a8b), RAPIDJSON_UINT64_C2(0xc9bcff60, 0x34c13053), + RAPIDJSON_UINT64_C2(0x964e858c, 0x91ba2655), RAPIDJSON_UINT64_C2(0xdff97724, 0x70297ebd), + RAPIDJSON_UINT64_C2(0xa6dfbd9f, 0xb8e5b88f), RAPIDJSON_UINT64_C2(0xf8a95fcf, 0x88747d94), + RAPIDJSON_UINT64_C2(0xb9447093, 0x8fa89bcf), RAPIDJSON_UINT64_C2(0x8a08f0f8, 0xbf0f156b), + RAPIDJSON_UINT64_C2(0xcdb02555, 0x653131b6), RAPIDJSON_UINT64_C2(0x993fe2c6, 0xd07b7fac), + RAPIDJSON_UINT64_C2(0xe45c10c4, 0x2a2b3b06), RAPIDJSON_UINT64_C2(0xaa242499, 0x697392d3), + RAPIDJSON_UINT64_C2(0xfd87b5f2, 0x8300ca0e), RAPIDJSON_UINT64_C2(0xbce50864, 0x92111aeb), + RAPIDJSON_UINT64_C2(0x8cbccc09, 0x6f5088cc), RAPIDJSON_UINT64_C2(0xd1b71758, 0xe219652c), + RAPIDJSON_UINT64_C2(0x9c400000, 0x00000000), RAPIDJSON_UINT64_C2(0xe8d4a510, 0x00000000), + RAPIDJSON_UINT64_C2(0xad78ebc5, 0xac620000), RAPIDJSON_UINT64_C2(0x813f3978, 0xf8940984), + RAPIDJSON_UINT64_C2(0xc097ce7b, 0xc90715b3), RAPIDJSON_UINT64_C2(0x8f7e32ce, 0x7bea5c70), + RAPIDJSON_UINT64_C2(0xd5d238a4, 0xabe98068), RAPIDJSON_UINT64_C2(0x9f4f2726, 0x179a2245), + RAPIDJSON_UINT64_C2(0xed63a231, 0xd4c4fb27), RAPIDJSON_UINT64_C2(0xb0de6538, 0x8cc8ada8), + RAPIDJSON_UINT64_C2(0x83c7088e, 0x1aab65db), RAPIDJSON_UINT64_C2(0xc45d1df9, 0x42711d9a), + RAPIDJSON_UINT64_C2(0x924d692c, 0xa61be758), RAPIDJSON_UINT64_C2(0xda01ee64, 0x1a708dea), + RAPIDJSON_UINT64_C2(0xa26da399, 0x9aef774a), RAPIDJSON_UINT64_C2(0xf209787b, 0xb47d6b85), + RAPIDJSON_UINT64_C2(0xb454e4a1, 0x79dd1877), RAPIDJSON_UINT64_C2(0x865b8692, 0x5b9bc5c2), + RAPIDJSON_UINT64_C2(0xc83553c5, 0xc8965d3d), RAPIDJSON_UINT64_C2(0x952ab45c, 0xfa97a0b3), + RAPIDJSON_UINT64_C2(0xde469fbd, 0x99a05fe3), RAPIDJSON_UINT64_C2(0xa59bc234, 0xdb398c25), + RAPIDJSON_UINT64_C2(0xf6c69a72, 0xa3989f5c), RAPIDJSON_UINT64_C2(0xb7dcbf53, 0x54e9bece), + RAPIDJSON_UINT64_C2(0x88fcf317, 0xf22241e2), RAPIDJSON_UINT64_C2(0xcc20ce9b, 0xd35c78a5), + RAPIDJSON_UINT64_C2(0x98165af3, 0x7b2153df), RAPIDJSON_UINT64_C2(0xe2a0b5dc, 0x971f303a), + RAPIDJSON_UINT64_C2(0xa8d9d153, 0x5ce3b396), RAPIDJSON_UINT64_C2(0xfb9b7cd9, 0xa4a7443c), + RAPIDJSON_UINT64_C2(0xbb764c4c, 0xa7a44410), RAPIDJSON_UINT64_C2(0x8bab8eef, 0xb6409c1a), + RAPIDJSON_UINT64_C2(0xd01fef10, 0xa657842c), RAPIDJSON_UINT64_C2(0x9b10a4e5, 0xe9913129), + RAPIDJSON_UINT64_C2(0xe7109bfb, 0xa19c0c9d), RAPIDJSON_UINT64_C2(0xac2820d9, 0x623bf429), + RAPIDJSON_UINT64_C2(0x80444b5e, 0x7aa7cf85), RAPIDJSON_UINT64_C2(0xbf21e440, 0x03acdd2d), + RAPIDJSON_UINT64_C2(0x8e679c2f, 0x5e44ff8f), RAPIDJSON_UINT64_C2(0xd433179d, 0x9c8cb841), + RAPIDJSON_UINT64_C2(0x9e19db92, 0xb4e31ba9), RAPIDJSON_UINT64_C2(0xeb96bf6e, 0xbadf77d9), + RAPIDJSON_UINT64_C2(0xaf87023b, 0x9bf0ee6b) + }; + static const int16_t kCachedPowers_E[] = { + -1220, -1193, -1166, -1140, -1113, -1087, -1060, -1034, -1007, -980, + -954, -927, -901, -874, -847, -821, -794, -768, -741, -715, + -688, -661, -635, -608, -582, -555, -529, -502, -475, -449, + -422, -396, -369, -343, -316, -289, -263, -236, -210, -183, + -157, -130, -103, -77, -50, -24, 3, 30, 56, 83, + 109, 136, 162, 189, 216, 242, 269, 295, 322, 348, + 375, 402, 428, 455, 481, 508, 534, 561, 588, 614, + 641, 667, 694, 720, 747, 774, 800, 827, 853, 880, + 907, 933, 960, 986, 1013, 1039, 1066 + }; + return DiyFp(kCachedPowers_F[index], kCachedPowers_E[index]); +} + +inline DiyFp GetCachedPower(int e, int* K) { + + //int k = static_cast(ceil((-61 - e) * 0.30102999566398114)) + 374; + double dk = (-61 - e) * 0.30102999566398114 + 347; // dk must be positive, so can do ceiling in positive + int k = static_cast(dk); + if (dk - k > 0.0) + k++; + + unsigned index = static_cast((k >> 3) + 1); + *K = -(-348 + static_cast(index << 3)); // decimal exponent no need lookup table + + return GetCachedPowerByIndex(index); +} + +inline DiyFp GetCachedPower10(int exp, int *outExp) { + unsigned index = (static_cast(exp) + 348u) / 8u; + *outExp = -348 + static_cast(index) * 8; + return GetCachedPowerByIndex(index); + } + +#ifdef __GNUC__ +RAPIDJSON_DIAG_POP +#endif + +#ifdef __clang__ +RAPIDJSON_DIAG_POP +RAPIDJSON_DIAG_OFF(padded) +#endif + +} // namespace internal +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_DIYFP_H_ diff --git a/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/internal/dtoa.h b/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/internal/dtoa.h new file mode 100644 index 0000000..8d6350e --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/internal/dtoa.h @@ -0,0 +1,245 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +// This is a C++ header-only implementation of Grisu2 algorithm from the publication: +// Loitsch, Florian. "Printing floating-point numbers quickly and accurately with +// integers." ACM Sigplan Notices 45.6 (2010): 233-243. + +#ifndef RAPIDJSON_DTOA_ +#define RAPIDJSON_DTOA_ + +#include "itoa.h" // GetDigitsLut() +#include "diyfp.h" +#include "ieee754.h" + +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +#ifdef __GNUC__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(effc++) +RAPIDJSON_DIAG_OFF(array-bounds) // some gcc versions generate wrong warnings https://gcc.gnu.org/bugzilla/show_bug.cgi?id=59124 +#endif + +inline void GrisuRound(char* buffer, int len, uint64_t delta, uint64_t rest, uint64_t ten_kappa, uint64_t wp_w) { + while (rest < wp_w && delta - rest >= ten_kappa && + (rest + ten_kappa < wp_w || /// closer + wp_w - rest > rest + ten_kappa - wp_w)) { + buffer[len - 1]--; + rest += ten_kappa; + } +} + +inline unsigned CountDecimalDigit32(uint32_t n) { + // Simple pure C++ implementation was faster than __builtin_clz version in this situation. + if (n < 10) return 1; + if (n < 100) return 2; + if (n < 1000) return 3; + if (n < 10000) return 4; + if (n < 100000) return 5; + if (n < 1000000) return 6; + if (n < 10000000) return 7; + if (n < 100000000) return 8; + // Will not reach 10 digits in DigitGen() + //if (n < 1000000000) return 9; + //return 10; + return 9; +} + +inline void DigitGen(const DiyFp& W, const DiyFp& Mp, uint64_t delta, char* buffer, int* len, int* K) { + static const uint32_t kPow10[] = { 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000 }; + const DiyFp one(uint64_t(1) << -Mp.e, Mp.e); + const DiyFp wp_w = Mp - W; + uint32_t p1 = static_cast(Mp.f >> -one.e); + uint64_t p2 = Mp.f & (one.f - 1); + unsigned kappa = CountDecimalDigit32(p1); // kappa in [0, 9] + *len = 0; + + while (kappa > 0) { + uint32_t d = 0; + switch (kappa) { + case 9: d = p1 / 100000000; p1 %= 100000000; break; + case 8: d = p1 / 10000000; p1 %= 10000000; break; + case 7: d = p1 / 1000000; p1 %= 1000000; break; + case 6: d = p1 / 100000; p1 %= 100000; break; + case 5: d = p1 / 10000; p1 %= 10000; break; + case 4: d = p1 / 1000; p1 %= 1000; break; + case 3: d = p1 / 100; p1 %= 100; break; + case 2: d = p1 / 10; p1 %= 10; break; + case 1: d = p1; p1 = 0; break; + default:; + } + if (d || *len) + buffer[(*len)++] = static_cast('0' + static_cast(d)); + kappa--; + uint64_t tmp = (static_cast(p1) << -one.e) + p2; + if (tmp <= delta) { + *K += kappa; + GrisuRound(buffer, *len, delta, tmp, static_cast(kPow10[kappa]) << -one.e, wp_w.f); + return; + } + } + + // kappa = 0 + for (;;) { + p2 *= 10; + delta *= 10; + char d = static_cast(p2 >> -one.e); + if (d || *len) + buffer[(*len)++] = static_cast('0' + d); + p2 &= one.f - 1; + kappa--; + if (p2 < delta) { + *K += kappa; + int index = -static_cast(kappa); + GrisuRound(buffer, *len, delta, p2, one.f, wp_w.f * (index < 9 ? kPow10[-static_cast(kappa)] : 0)); + return; + } + } +} + +inline void Grisu2(double value, char* buffer, int* length, int* K) { + const DiyFp v(value); + DiyFp w_m, w_p; + v.NormalizedBoundaries(&w_m, &w_p); + + const DiyFp c_mk = GetCachedPower(w_p.e, K); + const DiyFp W = v.Normalize() * c_mk; + DiyFp Wp = w_p * c_mk; + DiyFp Wm = w_m * c_mk; + Wm.f++; + Wp.f--; + DigitGen(W, Wp, Wp.f - Wm.f, buffer, length, K); +} + +inline char* WriteExponent(int K, char* buffer) { + if (K < 0) { + *buffer++ = '-'; + K = -K; + } + + if (K >= 100) { + *buffer++ = static_cast('0' + static_cast(K / 100)); + K %= 100; + const char* d = GetDigitsLut() + K * 2; + *buffer++ = d[0]; + *buffer++ = d[1]; + } + else if (K >= 10) { + const char* d = GetDigitsLut() + K * 2; + *buffer++ = d[0]; + *buffer++ = d[1]; + } + else + *buffer++ = static_cast('0' + static_cast(K)); + + return buffer; +} + +inline char* Prettify(char* buffer, int length, int k, int maxDecimalPlaces) { + const int kk = length + k; // 10^(kk-1) <= v < 10^kk + + if (0 <= k && kk <= 21) { + // 1234e7 -> 12340000000 + for (int i = length; i < kk; i++) + buffer[i] = '0'; + buffer[kk] = '.'; + buffer[kk + 1] = '0'; + return &buffer[kk + 2]; + } + else if (0 < kk && kk <= 21) { + // 1234e-2 -> 12.34 + std::memmove(&buffer[kk + 1], &buffer[kk], static_cast(length - kk)); + buffer[kk] = '.'; + if (0 > k + maxDecimalPlaces) { + // When maxDecimalPlaces = 2, 1.2345 -> 1.23, 1.102 -> 1.1 + // Remove extra trailing zeros (at least one) after truncation. + for (int i = kk + maxDecimalPlaces; i > kk + 1; i--) + if (buffer[i] != '0') + return &buffer[i + 1]; + return &buffer[kk + 2]; // Reserve one zero + } + else + return &buffer[length + 1]; + } + else if (-6 < kk && kk <= 0) { + // 1234e-6 -> 0.001234 + const int offset = 2 - kk; + std::memmove(&buffer[offset], &buffer[0], static_cast(length)); + buffer[0] = '0'; + buffer[1] = '.'; + for (int i = 2; i < offset; i++) + buffer[i] = '0'; + if (length - kk > maxDecimalPlaces) { + // When maxDecimalPlaces = 2, 0.123 -> 0.12, 0.102 -> 0.1 + // Remove extra trailing zeros (at least one) after truncation. + for (int i = maxDecimalPlaces + 1; i > 2; i--) + if (buffer[i] != '0') + return &buffer[i + 1]; + return &buffer[3]; // Reserve one zero + } + else + return &buffer[length + offset]; + } + else if (kk < -maxDecimalPlaces) { + // Truncate to zero + buffer[0] = '0'; + buffer[1] = '.'; + buffer[2] = '0'; + return &buffer[3]; + } + else if (length == 1) { + // 1e30 + buffer[1] = 'e'; + return WriteExponent(kk - 1, &buffer[2]); + } + else { + // 1234e30 -> 1.234e33 + std::memmove(&buffer[2], &buffer[1], static_cast(length - 1)); + buffer[1] = '.'; + buffer[length + 1] = 'e'; + return WriteExponent(kk - 1, &buffer[0 + length + 2]); + } +} + +inline char* dtoa(double value, char* buffer, int maxDecimalPlaces = 324) { + RAPIDJSON_ASSERT(maxDecimalPlaces >= 1); + Double d(value); + if (d.IsZero()) { + if (d.Sign()) + *buffer++ = '-'; // -0.0, Issue #289 + buffer[0] = '0'; + buffer[1] = '.'; + buffer[2] = '0'; + return &buffer[3]; + } + else { + if (value < 0) { + *buffer++ = '-'; + value = -value; + } + int length, K; + Grisu2(value, buffer, &length, &K); + return Prettify(buffer, length, K, maxDecimalPlaces); + } +} + +#ifdef __GNUC__ +RAPIDJSON_DIAG_POP +#endif + +} // namespace internal +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_DTOA_ diff --git a/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/internal/ieee754.h b/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/internal/ieee754.h new file mode 100644 index 0000000..82bb0b9 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/internal/ieee754.h @@ -0,0 +1,78 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_IEEE754_ +#define RAPIDJSON_IEEE754_ + +#include "../rapidjson.h" + +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +class Double { +public: + Double() {} + Double(double d) : d_(d) {} + Double(uint64_t u) : u_(u) {} + + double Value() const { return d_; } + uint64_t Uint64Value() const { return u_; } + + double NextPositiveDouble() const { + RAPIDJSON_ASSERT(!Sign()); + return Double(u_ + 1).Value(); + } + + bool Sign() const { return (u_ & kSignMask) != 0; } + uint64_t Significand() const { return u_ & kSignificandMask; } + int Exponent() const { return static_cast(((u_ & kExponentMask) >> kSignificandSize) - kExponentBias); } + + bool IsNan() const { return (u_ & kExponentMask) == kExponentMask && Significand() != 0; } + bool IsInf() const { return (u_ & kExponentMask) == kExponentMask && Significand() == 0; } + bool IsNanOrInf() const { return (u_ & kExponentMask) == kExponentMask; } + bool IsNormal() const { return (u_ & kExponentMask) != 0 || Significand() == 0; } + bool IsZero() const { return (u_ & (kExponentMask | kSignificandMask)) == 0; } + + uint64_t IntegerSignificand() const { return IsNormal() ? Significand() | kHiddenBit : Significand(); } + int IntegerExponent() const { return (IsNormal() ? Exponent() : kDenormalExponent) - kSignificandSize; } + uint64_t ToBias() const { return (u_ & kSignMask) ? ~u_ + 1 : u_ | kSignMask; } + + static unsigned EffectiveSignificandSize(int order) { + if (order >= -1021) + return 53; + else if (order <= -1074) + return 0; + else + return static_cast(order) + 1074; + } + +private: + static const int kSignificandSize = 52; + static const int kExponentBias = 0x3FF; + static const int kDenormalExponent = 1 - kExponentBias; + static const uint64_t kSignMask = RAPIDJSON_UINT64_C2(0x80000000, 0x00000000); + static const uint64_t kExponentMask = RAPIDJSON_UINT64_C2(0x7FF00000, 0x00000000); + static const uint64_t kSignificandMask = RAPIDJSON_UINT64_C2(0x000FFFFF, 0xFFFFFFFF); + static const uint64_t kHiddenBit = RAPIDJSON_UINT64_C2(0x00100000, 0x00000000); + + union { + double d_; + uint64_t u_; + }; +}; + +} // namespace internal +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_IEEE754_ diff --git a/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/internal/itoa.h b/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/internal/itoa.h new file mode 100644 index 0000000..01a4e7e --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/internal/itoa.h @@ -0,0 +1,304 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_ITOA_ +#define RAPIDJSON_ITOA_ + +#include "../rapidjson.h" + +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +inline const char* GetDigitsLut() { + static const char cDigitsLut[200] = { + '0','0','0','1','0','2','0','3','0','4','0','5','0','6','0','7','0','8','0','9', + '1','0','1','1','1','2','1','3','1','4','1','5','1','6','1','7','1','8','1','9', + '2','0','2','1','2','2','2','3','2','4','2','5','2','6','2','7','2','8','2','9', + '3','0','3','1','3','2','3','3','3','4','3','5','3','6','3','7','3','8','3','9', + '4','0','4','1','4','2','4','3','4','4','4','5','4','6','4','7','4','8','4','9', + '5','0','5','1','5','2','5','3','5','4','5','5','5','6','5','7','5','8','5','9', + '6','0','6','1','6','2','6','3','6','4','6','5','6','6','6','7','6','8','6','9', + '7','0','7','1','7','2','7','3','7','4','7','5','7','6','7','7','7','8','7','9', + '8','0','8','1','8','2','8','3','8','4','8','5','8','6','8','7','8','8','8','9', + '9','0','9','1','9','2','9','3','9','4','9','5','9','6','9','7','9','8','9','9' + }; + return cDigitsLut; +} + +inline char* u32toa(uint32_t value, char* buffer) { + const char* cDigitsLut = GetDigitsLut(); + + if (value < 10000) { + const uint32_t d1 = (value / 100) << 1; + const uint32_t d2 = (value % 100) << 1; + + if (value >= 1000) + *buffer++ = cDigitsLut[d1]; + if (value >= 100) + *buffer++ = cDigitsLut[d1 + 1]; + if (value >= 10) + *buffer++ = cDigitsLut[d2]; + *buffer++ = cDigitsLut[d2 + 1]; + } + else if (value < 100000000) { + // value = bbbbcccc + const uint32_t b = value / 10000; + const uint32_t c = value % 10000; + + const uint32_t d1 = (b / 100) << 1; + const uint32_t d2 = (b % 100) << 1; + + const uint32_t d3 = (c / 100) << 1; + const uint32_t d4 = (c % 100) << 1; + + if (value >= 10000000) + *buffer++ = cDigitsLut[d1]; + if (value >= 1000000) + *buffer++ = cDigitsLut[d1 + 1]; + if (value >= 100000) + *buffer++ = cDigitsLut[d2]; + *buffer++ = cDigitsLut[d2 + 1]; + + *buffer++ = cDigitsLut[d3]; + *buffer++ = cDigitsLut[d3 + 1]; + *buffer++ = cDigitsLut[d4]; + *buffer++ = cDigitsLut[d4 + 1]; + } + else { + // value = aabbbbcccc in decimal + + const uint32_t a = value / 100000000; // 1 to 42 + value %= 100000000; + + if (a >= 10) { + const unsigned i = a << 1; + *buffer++ = cDigitsLut[i]; + *buffer++ = cDigitsLut[i + 1]; + } + else + *buffer++ = static_cast('0' + static_cast(a)); + + const uint32_t b = value / 10000; // 0 to 9999 + const uint32_t c = value % 10000; // 0 to 9999 + + const uint32_t d1 = (b / 100) << 1; + const uint32_t d2 = (b % 100) << 1; + + const uint32_t d3 = (c / 100) << 1; + const uint32_t d4 = (c % 100) << 1; + + *buffer++ = cDigitsLut[d1]; + *buffer++ = cDigitsLut[d1 + 1]; + *buffer++ = cDigitsLut[d2]; + *buffer++ = cDigitsLut[d2 + 1]; + *buffer++ = cDigitsLut[d3]; + *buffer++ = cDigitsLut[d3 + 1]; + *buffer++ = cDigitsLut[d4]; + *buffer++ = cDigitsLut[d4 + 1]; + } + return buffer; +} + +inline char* i32toa(int32_t value, char* buffer) { + uint32_t u = static_cast(value); + if (value < 0) { + *buffer++ = '-'; + u = ~u + 1; + } + + return u32toa(u, buffer); +} + +inline char* u64toa(uint64_t value, char* buffer) { + const char* cDigitsLut = GetDigitsLut(); + const uint64_t kTen8 = 100000000; + const uint64_t kTen9 = kTen8 * 10; + const uint64_t kTen10 = kTen8 * 100; + const uint64_t kTen11 = kTen8 * 1000; + const uint64_t kTen12 = kTen8 * 10000; + const uint64_t kTen13 = kTen8 * 100000; + const uint64_t kTen14 = kTen8 * 1000000; + const uint64_t kTen15 = kTen8 * 10000000; + const uint64_t kTen16 = kTen8 * kTen8; + + if (value < kTen8) { + uint32_t v = static_cast(value); + if (v < 10000) { + const uint32_t d1 = (v / 100) << 1; + const uint32_t d2 = (v % 100) << 1; + + if (v >= 1000) + *buffer++ = cDigitsLut[d1]; + if (v >= 100) + *buffer++ = cDigitsLut[d1 + 1]; + if (v >= 10) + *buffer++ = cDigitsLut[d2]; + *buffer++ = cDigitsLut[d2 + 1]; + } + else { + // value = bbbbcccc + const uint32_t b = v / 10000; + const uint32_t c = v % 10000; + + const uint32_t d1 = (b / 100) << 1; + const uint32_t d2 = (b % 100) << 1; + + const uint32_t d3 = (c / 100) << 1; + const uint32_t d4 = (c % 100) << 1; + + if (value >= 10000000) + *buffer++ = cDigitsLut[d1]; + if (value >= 1000000) + *buffer++ = cDigitsLut[d1 + 1]; + if (value >= 100000) + *buffer++ = cDigitsLut[d2]; + *buffer++ = cDigitsLut[d2 + 1]; + + *buffer++ = cDigitsLut[d3]; + *buffer++ = cDigitsLut[d3 + 1]; + *buffer++ = cDigitsLut[d4]; + *buffer++ = cDigitsLut[d4 + 1]; + } + } + else if (value < kTen16) { + const uint32_t v0 = static_cast(value / kTen8); + const uint32_t v1 = static_cast(value % kTen8); + + const uint32_t b0 = v0 / 10000; + const uint32_t c0 = v0 % 10000; + + const uint32_t d1 = (b0 / 100) << 1; + const uint32_t d2 = (b0 % 100) << 1; + + const uint32_t d3 = (c0 / 100) << 1; + const uint32_t d4 = (c0 % 100) << 1; + + const uint32_t b1 = v1 / 10000; + const uint32_t c1 = v1 % 10000; + + const uint32_t d5 = (b1 / 100) << 1; + const uint32_t d6 = (b1 % 100) << 1; + + const uint32_t d7 = (c1 / 100) << 1; + const uint32_t d8 = (c1 % 100) << 1; + + if (value >= kTen15) + *buffer++ = cDigitsLut[d1]; + if (value >= kTen14) + *buffer++ = cDigitsLut[d1 + 1]; + if (value >= kTen13) + *buffer++ = cDigitsLut[d2]; + if (value >= kTen12) + *buffer++ = cDigitsLut[d2 + 1]; + if (value >= kTen11) + *buffer++ = cDigitsLut[d3]; + if (value >= kTen10) + *buffer++ = cDigitsLut[d3 + 1]; + if (value >= kTen9) + *buffer++ = cDigitsLut[d4]; + if (value >= kTen8) + *buffer++ = cDigitsLut[d4 + 1]; + + *buffer++ = cDigitsLut[d5]; + *buffer++ = cDigitsLut[d5 + 1]; + *buffer++ = cDigitsLut[d6]; + *buffer++ = cDigitsLut[d6 + 1]; + *buffer++ = cDigitsLut[d7]; + *buffer++ = cDigitsLut[d7 + 1]; + *buffer++ = cDigitsLut[d8]; + *buffer++ = cDigitsLut[d8 + 1]; + } + else { + const uint32_t a = static_cast(value / kTen16); // 1 to 1844 + value %= kTen16; + + if (a < 10) + *buffer++ = static_cast('0' + static_cast(a)); + else if (a < 100) { + const uint32_t i = a << 1; + *buffer++ = cDigitsLut[i]; + *buffer++ = cDigitsLut[i + 1]; + } + else if (a < 1000) { + *buffer++ = static_cast('0' + static_cast(a / 100)); + + const uint32_t i = (a % 100) << 1; + *buffer++ = cDigitsLut[i]; + *buffer++ = cDigitsLut[i + 1]; + } + else { + const uint32_t i = (a / 100) << 1; + const uint32_t j = (a % 100) << 1; + *buffer++ = cDigitsLut[i]; + *buffer++ = cDigitsLut[i + 1]; + *buffer++ = cDigitsLut[j]; + *buffer++ = cDigitsLut[j + 1]; + } + + const uint32_t v0 = static_cast(value / kTen8); + const uint32_t v1 = static_cast(value % kTen8); + + const uint32_t b0 = v0 / 10000; + const uint32_t c0 = v0 % 10000; + + const uint32_t d1 = (b0 / 100) << 1; + const uint32_t d2 = (b0 % 100) << 1; + + const uint32_t d3 = (c0 / 100) << 1; + const uint32_t d4 = (c0 % 100) << 1; + + const uint32_t b1 = v1 / 10000; + const uint32_t c1 = v1 % 10000; + + const uint32_t d5 = (b1 / 100) << 1; + const uint32_t d6 = (b1 % 100) << 1; + + const uint32_t d7 = (c1 / 100) << 1; + const uint32_t d8 = (c1 % 100) << 1; + + *buffer++ = cDigitsLut[d1]; + *buffer++ = cDigitsLut[d1 + 1]; + *buffer++ = cDigitsLut[d2]; + *buffer++ = cDigitsLut[d2 + 1]; + *buffer++ = cDigitsLut[d3]; + *buffer++ = cDigitsLut[d3 + 1]; + *buffer++ = cDigitsLut[d4]; + *buffer++ = cDigitsLut[d4 + 1]; + *buffer++ = cDigitsLut[d5]; + *buffer++ = cDigitsLut[d5 + 1]; + *buffer++ = cDigitsLut[d6]; + *buffer++ = cDigitsLut[d6 + 1]; + *buffer++ = cDigitsLut[d7]; + *buffer++ = cDigitsLut[d7 + 1]; + *buffer++ = cDigitsLut[d8]; + *buffer++ = cDigitsLut[d8 + 1]; + } + + return buffer; +} + +inline char* i64toa(int64_t value, char* buffer) { + uint64_t u = static_cast(value); + if (value < 0) { + *buffer++ = '-'; + u = ~u + 1; + } + + return u64toa(u, buffer); +} + +} // namespace internal +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_ITOA_ diff --git a/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/internal/meta.h b/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/internal/meta.h new file mode 100644 index 0000000..5a9aaa4 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/internal/meta.h @@ -0,0 +1,181 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_INTERNAL_META_H_ +#define RAPIDJSON_INTERNAL_META_H_ + +#include "../rapidjson.h" + +#ifdef __GNUC__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(effc++) +#endif +#if defined(_MSC_VER) +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(6334) +#endif + +#if RAPIDJSON_HAS_CXX11_TYPETRAITS +#include +#endif + +//@cond RAPIDJSON_INTERNAL +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +// Helper to wrap/convert arbitrary types to void, useful for arbitrary type matching +template struct Void { typedef void Type; }; + +/////////////////////////////////////////////////////////////////////////////// +// BoolType, TrueType, FalseType +// +template struct BoolType { + static const bool Value = Cond; + typedef BoolType Type; +}; +typedef BoolType TrueType; +typedef BoolType FalseType; + + +/////////////////////////////////////////////////////////////////////////////// +// SelectIf, BoolExpr, NotExpr, AndExpr, OrExpr +// + +template struct SelectIfImpl { template struct Apply { typedef T1 Type; }; }; +template <> struct SelectIfImpl { template struct Apply { typedef T2 Type; }; }; +template struct SelectIfCond : SelectIfImpl::template Apply {}; +template struct SelectIf : SelectIfCond {}; + +template struct AndExprCond : FalseType {}; +template <> struct AndExprCond : TrueType {}; +template struct OrExprCond : TrueType {}; +template <> struct OrExprCond : FalseType {}; + +template struct BoolExpr : SelectIf::Type {}; +template struct NotExpr : SelectIf::Type {}; +template struct AndExpr : AndExprCond::Type {}; +template struct OrExpr : OrExprCond::Type {}; + + +/////////////////////////////////////////////////////////////////////////////// +// AddConst, MaybeAddConst, RemoveConst +template struct AddConst { typedef const T Type; }; +template struct MaybeAddConst : SelectIfCond {}; +template struct RemoveConst { typedef T Type; }; +template struct RemoveConst { typedef T Type; }; + + +/////////////////////////////////////////////////////////////////////////////// +// IsSame, IsConst, IsMoreConst, IsPointer +// +template struct IsSame : FalseType {}; +template struct IsSame : TrueType {}; + +template struct IsConst : FalseType {}; +template struct IsConst : TrueType {}; + +template +struct IsMoreConst + : AndExpr::Type, typename RemoveConst::Type>, + BoolType::Value >= IsConst::Value> >::Type {}; + +template struct IsPointer : FalseType {}; +template struct IsPointer : TrueType {}; + +/////////////////////////////////////////////////////////////////////////////// +// IsBaseOf +// +#if RAPIDJSON_HAS_CXX11_TYPETRAITS + +template struct IsBaseOf + : BoolType< ::std::is_base_of::value> {}; + +#else // simplified version adopted from Boost + +template struct IsBaseOfImpl { + RAPIDJSON_STATIC_ASSERT(sizeof(B) != 0); + RAPIDJSON_STATIC_ASSERT(sizeof(D) != 0); + + typedef char (&Yes)[1]; + typedef char (&No) [2]; + + template + static Yes Check(const D*, T); + static No Check(const B*, int); + + struct Host { + operator const B*() const; + operator const D*(); + }; + + enum { Value = (sizeof(Check(Host(), 0)) == sizeof(Yes)) }; +}; + +template struct IsBaseOf + : OrExpr, BoolExpr > >::Type {}; + +#endif // RAPIDJSON_HAS_CXX11_TYPETRAITS + + +////////////////////////////////////////////////////////////////////////// +// EnableIf / DisableIf +// +template struct EnableIfCond { typedef T Type; }; +template struct EnableIfCond { /* empty */ }; + +template struct DisableIfCond { typedef T Type; }; +template struct DisableIfCond { /* empty */ }; + +template +struct EnableIf : EnableIfCond {}; + +template +struct DisableIf : DisableIfCond {}; + +// SFINAE helpers +struct SfinaeTag {}; +template struct RemoveSfinaeTag; +template struct RemoveSfinaeTag { typedef T Type; }; + +#define RAPIDJSON_REMOVEFPTR_(type) \ + typename ::RAPIDJSON_NAMESPACE::internal::RemoveSfinaeTag \ + < ::RAPIDJSON_NAMESPACE::internal::SfinaeTag&(*) type>::Type + +#define RAPIDJSON_ENABLEIF(cond) \ + typename ::RAPIDJSON_NAMESPACE::internal::EnableIf \ + ::Type * = NULL + +#define RAPIDJSON_DISABLEIF(cond) \ + typename ::RAPIDJSON_NAMESPACE::internal::DisableIf \ + ::Type * = NULL + +#define RAPIDJSON_ENABLEIF_RETURN(cond,returntype) \ + typename ::RAPIDJSON_NAMESPACE::internal::EnableIf \ + ::Type + +#define RAPIDJSON_DISABLEIF_RETURN(cond,returntype) \ + typename ::RAPIDJSON_NAMESPACE::internal::DisableIf \ + ::Type + +} // namespace internal +RAPIDJSON_NAMESPACE_END +//@endcond + +#if defined(__GNUC__) || defined(_MSC_VER) +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_INTERNAL_META_H_ diff --git a/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/internal/pow10.h b/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/internal/pow10.h new file mode 100644 index 0000000..02f475d --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/internal/pow10.h @@ -0,0 +1,55 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_POW10_ +#define RAPIDJSON_POW10_ + +#include "../rapidjson.h" + +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +//! Computes integer powers of 10 in double (10.0^n). +/*! This function uses lookup table for fast and accurate results. + \param n non-negative exponent. Must <= 308. + \return 10.0^n +*/ +inline double Pow10(int n) { + static const double e[] = { // 1e-0...1e308: 309 * 8 bytes = 2472 bytes + 1e+0, + 1e+1, 1e+2, 1e+3, 1e+4, 1e+5, 1e+6, 1e+7, 1e+8, 1e+9, 1e+10, 1e+11, 1e+12, 1e+13, 1e+14, 1e+15, 1e+16, 1e+17, 1e+18, 1e+19, 1e+20, + 1e+21, 1e+22, 1e+23, 1e+24, 1e+25, 1e+26, 1e+27, 1e+28, 1e+29, 1e+30, 1e+31, 1e+32, 1e+33, 1e+34, 1e+35, 1e+36, 1e+37, 1e+38, 1e+39, 1e+40, + 1e+41, 1e+42, 1e+43, 1e+44, 1e+45, 1e+46, 1e+47, 1e+48, 1e+49, 1e+50, 1e+51, 1e+52, 1e+53, 1e+54, 1e+55, 1e+56, 1e+57, 1e+58, 1e+59, 1e+60, + 1e+61, 1e+62, 1e+63, 1e+64, 1e+65, 1e+66, 1e+67, 1e+68, 1e+69, 1e+70, 1e+71, 1e+72, 1e+73, 1e+74, 1e+75, 1e+76, 1e+77, 1e+78, 1e+79, 1e+80, + 1e+81, 1e+82, 1e+83, 1e+84, 1e+85, 1e+86, 1e+87, 1e+88, 1e+89, 1e+90, 1e+91, 1e+92, 1e+93, 1e+94, 1e+95, 1e+96, 1e+97, 1e+98, 1e+99, 1e+100, + 1e+101,1e+102,1e+103,1e+104,1e+105,1e+106,1e+107,1e+108,1e+109,1e+110,1e+111,1e+112,1e+113,1e+114,1e+115,1e+116,1e+117,1e+118,1e+119,1e+120, + 1e+121,1e+122,1e+123,1e+124,1e+125,1e+126,1e+127,1e+128,1e+129,1e+130,1e+131,1e+132,1e+133,1e+134,1e+135,1e+136,1e+137,1e+138,1e+139,1e+140, + 1e+141,1e+142,1e+143,1e+144,1e+145,1e+146,1e+147,1e+148,1e+149,1e+150,1e+151,1e+152,1e+153,1e+154,1e+155,1e+156,1e+157,1e+158,1e+159,1e+160, + 1e+161,1e+162,1e+163,1e+164,1e+165,1e+166,1e+167,1e+168,1e+169,1e+170,1e+171,1e+172,1e+173,1e+174,1e+175,1e+176,1e+177,1e+178,1e+179,1e+180, + 1e+181,1e+182,1e+183,1e+184,1e+185,1e+186,1e+187,1e+188,1e+189,1e+190,1e+191,1e+192,1e+193,1e+194,1e+195,1e+196,1e+197,1e+198,1e+199,1e+200, + 1e+201,1e+202,1e+203,1e+204,1e+205,1e+206,1e+207,1e+208,1e+209,1e+210,1e+211,1e+212,1e+213,1e+214,1e+215,1e+216,1e+217,1e+218,1e+219,1e+220, + 1e+221,1e+222,1e+223,1e+224,1e+225,1e+226,1e+227,1e+228,1e+229,1e+230,1e+231,1e+232,1e+233,1e+234,1e+235,1e+236,1e+237,1e+238,1e+239,1e+240, + 1e+241,1e+242,1e+243,1e+244,1e+245,1e+246,1e+247,1e+248,1e+249,1e+250,1e+251,1e+252,1e+253,1e+254,1e+255,1e+256,1e+257,1e+258,1e+259,1e+260, + 1e+261,1e+262,1e+263,1e+264,1e+265,1e+266,1e+267,1e+268,1e+269,1e+270,1e+271,1e+272,1e+273,1e+274,1e+275,1e+276,1e+277,1e+278,1e+279,1e+280, + 1e+281,1e+282,1e+283,1e+284,1e+285,1e+286,1e+287,1e+288,1e+289,1e+290,1e+291,1e+292,1e+293,1e+294,1e+295,1e+296,1e+297,1e+298,1e+299,1e+300, + 1e+301,1e+302,1e+303,1e+304,1e+305,1e+306,1e+307,1e+308 + }; + RAPIDJSON_ASSERT(n >= 0 && n <= 308); + return e[n]; +} + +} // namespace internal +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_POW10_ diff --git a/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/internal/regex.h b/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/internal/regex.h new file mode 100644 index 0000000..422a524 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/internal/regex.h @@ -0,0 +1,701 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_INTERNAL_REGEX_H_ +#define RAPIDJSON_INTERNAL_REGEX_H_ + +#include "../allocators.h" +#include "../stream.h" +#include "stack.h" + +#ifdef __clang__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(padded) +RAPIDJSON_DIAG_OFF(switch-enum) +RAPIDJSON_DIAG_OFF(implicit-fallthrough) +#endif + +#ifdef __GNUC__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(effc++) +#endif + +#ifdef _MSC_VER +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(4512) // assignment operator could not be generated +#endif + +#ifndef RAPIDJSON_REGEX_VERBOSE +#define RAPIDJSON_REGEX_VERBOSE 0 +#endif + +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +/////////////////////////////////////////////////////////////////////////////// +// GenericRegex + +static const SizeType kRegexInvalidState = ~SizeType(0); //!< Represents an invalid index in GenericRegex::State::out, out1 +static const SizeType kRegexInvalidRange = ~SizeType(0); + +//! Regular expression engine with subset of ECMAscript grammar. +/*! + Supported regular expression syntax: + - \c ab Concatenation + - \c a|b Alternation + - \c a? Zero or one + - \c a* Zero or more + - \c a+ One or more + - \c a{3} Exactly 3 times + - \c a{3,} At least 3 times + - \c a{3,5} 3 to 5 times + - \c (ab) Grouping + - \c ^a At the beginning + - \c a$ At the end + - \c . Any character + - \c [abc] Character classes + - \c [a-c] Character class range + - \c [a-z0-9_] Character class combination + - \c [^abc] Negated character classes + - \c [^a-c] Negated character class range + - \c [\b] Backspace (U+0008) + - \c \\| \\\\ ... Escape characters + - \c \\f Form feed (U+000C) + - \c \\n Line feed (U+000A) + - \c \\r Carriage return (U+000D) + - \c \\t Tab (U+0009) + - \c \\v Vertical tab (U+000B) + + \note This is a Thompson NFA engine, implemented with reference to + Cox, Russ. "Regular Expression Matching Can Be Simple And Fast (but is slow in Java, Perl, PHP, Python, Ruby,...).", + https://swtch.com/~rsc/regexp/regexp1.html +*/ +template +class GenericRegex { +public: + typedef typename Encoding::Ch Ch; + + GenericRegex(const Ch* source, Allocator* allocator = 0) : + states_(allocator, 256), ranges_(allocator, 256), root_(kRegexInvalidState), stateCount_(), rangeCount_(), + stateSet_(), state0_(allocator, 0), state1_(allocator, 0), anchorBegin_(), anchorEnd_() + { + GenericStringStream ss(source); + DecodedStream > ds(ss); + Parse(ds); + } + + ~GenericRegex() { + Allocator::Free(stateSet_); + } + + bool IsValid() const { + return root_ != kRegexInvalidState; + } + + template + bool Match(InputStream& is) const { + return SearchWithAnchoring(is, true, true); + } + + bool Match(const Ch* s) const { + GenericStringStream is(s); + return Match(is); + } + + template + bool Search(InputStream& is) const { + return SearchWithAnchoring(is, anchorBegin_, anchorEnd_); + } + + bool Search(const Ch* s) const { + GenericStringStream is(s); + return Search(is); + } + +private: + enum Operator { + kZeroOrOne, + kZeroOrMore, + kOneOrMore, + kConcatenation, + kAlternation, + kLeftParenthesis + }; + + static const unsigned kAnyCharacterClass = 0xFFFFFFFF; //!< For '.' + static const unsigned kRangeCharacterClass = 0xFFFFFFFE; + static const unsigned kRangeNegationFlag = 0x80000000; + + struct Range { + unsigned start; // + unsigned end; + SizeType next; + }; + + struct State { + SizeType out; //!< Equals to kInvalid for matching state + SizeType out1; //!< Equals to non-kInvalid for split + SizeType rangeStart; + unsigned codepoint; + }; + + struct Frag { + Frag(SizeType s, SizeType o, SizeType m) : start(s), out(o), minIndex(m) {} + SizeType start; + SizeType out; //!< link-list of all output states + SizeType minIndex; + }; + + template + class DecodedStream { + public: + DecodedStream(SourceStream& ss) : ss_(ss), codepoint_() { Decode(); } + unsigned Peek() { return codepoint_; } + unsigned Take() { + unsigned c = codepoint_; + if (c) // No further decoding when '\0' + Decode(); + return c; + } + + private: + void Decode() { + if (!Encoding::Decode(ss_, &codepoint_)) + codepoint_ = 0; + } + + SourceStream& ss_; + unsigned codepoint_; + }; + + State& GetState(SizeType index) { + RAPIDJSON_ASSERT(index < stateCount_); + return states_.template Bottom()[index]; + } + + const State& GetState(SizeType index) const { + RAPIDJSON_ASSERT(index < stateCount_); + return states_.template Bottom()[index]; + } + + Range& GetRange(SizeType index) { + RAPIDJSON_ASSERT(index < rangeCount_); + return ranges_.template Bottom()[index]; + } + + const Range& GetRange(SizeType index) const { + RAPIDJSON_ASSERT(index < rangeCount_); + return ranges_.template Bottom()[index]; + } + + template + void Parse(DecodedStream& ds) { + Allocator allocator; + Stack operandStack(&allocator, 256); // Frag + Stack operatorStack(&allocator, 256); // Operator + Stack atomCountStack(&allocator, 256); // unsigned (Atom per parenthesis) + + *atomCountStack.template Push() = 0; + + unsigned codepoint; + while (ds.Peek() != 0) { + switch (codepoint = ds.Take()) { + case '^': + anchorBegin_ = true; + break; + + case '$': + anchorEnd_ = true; + break; + + case '|': + while (!operatorStack.Empty() && *operatorStack.template Top() < kAlternation) + if (!Eval(operandStack, *operatorStack.template Pop(1))) + return; + *operatorStack.template Push() = kAlternation; + *atomCountStack.template Top() = 0; + break; + + case '(': + *operatorStack.template Push() = kLeftParenthesis; + *atomCountStack.template Push() = 0; + break; + + case ')': + while (!operatorStack.Empty() && *operatorStack.template Top() != kLeftParenthesis) + if (!Eval(operandStack, *operatorStack.template Pop(1))) + return; + if (operatorStack.Empty()) + return; + operatorStack.template Pop(1); + atomCountStack.template Pop(1); + ImplicitConcatenation(atomCountStack, operatorStack); + break; + + case '?': + if (!Eval(operandStack, kZeroOrOne)) + return; + break; + + case '*': + if (!Eval(operandStack, kZeroOrMore)) + return; + break; + + case '+': + if (!Eval(operandStack, kOneOrMore)) + return; + break; + + case '{': + { + unsigned n, m; + if (!ParseUnsigned(ds, &n)) + return; + + if (ds.Peek() == ',') { + ds.Take(); + if (ds.Peek() == '}') + m = kInfinityQuantifier; + else if (!ParseUnsigned(ds, &m) || m < n) + return; + } + else + m = n; + + if (!EvalQuantifier(operandStack, n, m) || ds.Peek() != '}') + return; + ds.Take(); + } + break; + + case '.': + PushOperand(operandStack, kAnyCharacterClass); + ImplicitConcatenation(atomCountStack, operatorStack); + break; + + case '[': + { + SizeType range; + if (!ParseRange(ds, &range)) + return; + SizeType s = NewState(kRegexInvalidState, kRegexInvalidState, kRangeCharacterClass); + GetState(s).rangeStart = range; + *operandStack.template Push() = Frag(s, s, s); + } + ImplicitConcatenation(atomCountStack, operatorStack); + break; + + case '\\': // Escape character + if (!CharacterEscape(ds, &codepoint)) + return; // Unsupported escape character + // fall through to default + + default: // Pattern character + PushOperand(operandStack, codepoint); + ImplicitConcatenation(atomCountStack, operatorStack); + } + } + + while (!operatorStack.Empty()) + if (!Eval(operandStack, *operatorStack.template Pop(1))) + return; + + // Link the operand to matching state. + if (operandStack.GetSize() == sizeof(Frag)) { + Frag* e = operandStack.template Pop(1); + Patch(e->out, NewState(kRegexInvalidState, kRegexInvalidState, 0)); + root_ = e->start; + +#if RAPIDJSON_REGEX_VERBOSE + printf("root: %d\n", root_); + for (SizeType i = 0; i < stateCount_ ; i++) { + State& s = GetState(i); + printf("[%2d] out: %2d out1: %2d c: '%c'\n", i, s.out, s.out1, (char)s.codepoint); + } + printf("\n"); +#endif + } + + // Preallocate buffer for SearchWithAnchoring() + RAPIDJSON_ASSERT(stateSet_ == 0); + if (stateCount_ > 0) { + stateSet_ = static_cast(states_.GetAllocator().Malloc(GetStateSetSize())); + state0_.template Reserve(stateCount_); + state1_.template Reserve(stateCount_); + } + } + + SizeType NewState(SizeType out, SizeType out1, unsigned codepoint) { + State* s = states_.template Push(); + s->out = out; + s->out1 = out1; + s->codepoint = codepoint; + s->rangeStart = kRegexInvalidRange; + return stateCount_++; + } + + void PushOperand(Stack& operandStack, unsigned codepoint) { + SizeType s = NewState(kRegexInvalidState, kRegexInvalidState, codepoint); + *operandStack.template Push() = Frag(s, s, s); + } + + void ImplicitConcatenation(Stack& atomCountStack, Stack& operatorStack) { + if (*atomCountStack.template Top()) + *operatorStack.template Push() = kConcatenation; + (*atomCountStack.template Top())++; + } + + SizeType Append(SizeType l1, SizeType l2) { + SizeType old = l1; + while (GetState(l1).out != kRegexInvalidState) + l1 = GetState(l1).out; + GetState(l1).out = l2; + return old; + } + + void Patch(SizeType l, SizeType s) { + for (SizeType next; l != kRegexInvalidState; l = next) { + next = GetState(l).out; + GetState(l).out = s; + } + } + + bool Eval(Stack& operandStack, Operator op) { + switch (op) { + case kConcatenation: + RAPIDJSON_ASSERT(operandStack.GetSize() >= sizeof(Frag) * 2); + { + Frag e2 = *operandStack.template Pop(1); + Frag e1 = *operandStack.template Pop(1); + Patch(e1.out, e2.start); + *operandStack.template Push() = Frag(e1.start, e2.out, Min(e1.minIndex, e2.minIndex)); + } + return true; + + case kAlternation: + if (operandStack.GetSize() >= sizeof(Frag) * 2) { + Frag e2 = *operandStack.template Pop(1); + Frag e1 = *operandStack.template Pop(1); + SizeType s = NewState(e1.start, e2.start, 0); + *operandStack.template Push() = Frag(s, Append(e1.out, e2.out), Min(e1.minIndex, e2.minIndex)); + return true; + } + return false; + + case kZeroOrOne: + if (operandStack.GetSize() >= sizeof(Frag)) { + Frag e = *operandStack.template Pop(1); + SizeType s = NewState(kRegexInvalidState, e.start, 0); + *operandStack.template Push() = Frag(s, Append(e.out, s), e.minIndex); + return true; + } + return false; + + case kZeroOrMore: + if (operandStack.GetSize() >= sizeof(Frag)) { + Frag e = *operandStack.template Pop(1); + SizeType s = NewState(kRegexInvalidState, e.start, 0); + Patch(e.out, s); + *operandStack.template Push() = Frag(s, s, e.minIndex); + return true; + } + return false; + + default: + RAPIDJSON_ASSERT(op == kOneOrMore); + if (operandStack.GetSize() >= sizeof(Frag)) { + Frag e = *operandStack.template Pop(1); + SizeType s = NewState(kRegexInvalidState, e.start, 0); + Patch(e.out, s); + *operandStack.template Push() = Frag(e.start, s, e.minIndex); + return true; + } + return false; + } + } + + bool EvalQuantifier(Stack& operandStack, unsigned n, unsigned m) { + RAPIDJSON_ASSERT(n <= m); + RAPIDJSON_ASSERT(operandStack.GetSize() >= sizeof(Frag)); + + if (n == 0) { + if (m == 0) // a{0} not support + return false; + else if (m == kInfinityQuantifier) + Eval(operandStack, kZeroOrMore); // a{0,} -> a* + else { + Eval(operandStack, kZeroOrOne); // a{0,5} -> a? + for (unsigned i = 0; i < m - 1; i++) + CloneTopOperand(operandStack); // a{0,5} -> a? a? a? a? a? + for (unsigned i = 0; i < m - 1; i++) + Eval(operandStack, kConcatenation); // a{0,5} -> a?a?a?a?a? + } + return true; + } + + for (unsigned i = 0; i < n - 1; i++) // a{3} -> a a a + CloneTopOperand(operandStack); + + if (m == kInfinityQuantifier) + Eval(operandStack, kOneOrMore); // a{3,} -> a a a+ + else if (m > n) { + CloneTopOperand(operandStack); // a{3,5} -> a a a a + Eval(operandStack, kZeroOrOne); // a{3,5} -> a a a a? + for (unsigned i = n; i < m - 1; i++) + CloneTopOperand(operandStack); // a{3,5} -> a a a a? a? + for (unsigned i = n; i < m; i++) + Eval(operandStack, kConcatenation); // a{3,5} -> a a aa?a? + } + + for (unsigned i = 0; i < n - 1; i++) + Eval(operandStack, kConcatenation); // a{3} -> aaa, a{3,} -> aaa+, a{3.5} -> aaaa?a? + + return true; + } + + static SizeType Min(SizeType a, SizeType b) { return a < b ? a : b; } + + void CloneTopOperand(Stack& operandStack) { + const Frag src = *operandStack.template Top(); // Copy constructor to prevent invalidation + SizeType count = stateCount_ - src.minIndex; // Assumes top operand contains states in [src->minIndex, stateCount_) + State* s = states_.template Push(count); + memcpy(s, &GetState(src.minIndex), count * sizeof(State)); + for (SizeType j = 0; j < count; j++) { + if (s[j].out != kRegexInvalidState) + s[j].out += count; + if (s[j].out1 != kRegexInvalidState) + s[j].out1 += count; + } + *operandStack.template Push() = Frag(src.start + count, src.out + count, src.minIndex + count); + stateCount_ += count; + } + + template + bool ParseUnsigned(DecodedStream& ds, unsigned* u) { + unsigned r = 0; + if (ds.Peek() < '0' || ds.Peek() > '9') + return false; + while (ds.Peek() >= '0' && ds.Peek() <= '9') { + if (r >= 429496729 && ds.Peek() > '5') // 2^32 - 1 = 4294967295 + return false; // overflow + r = r * 10 + (ds.Take() - '0'); + } + *u = r; + return true; + } + + template + bool ParseRange(DecodedStream& ds, SizeType* range) { + bool isBegin = true; + bool negate = false; + int step = 0; + SizeType start = kRegexInvalidRange; + SizeType current = kRegexInvalidRange; + unsigned codepoint; + while ((codepoint = ds.Take()) != 0) { + if (isBegin) { + isBegin = false; + if (codepoint == '^') { + negate = true; + continue; + } + } + + switch (codepoint) { + case ']': + if (start == kRegexInvalidRange) + return false; // Error: nothing inside [] + if (step == 2) { // Add trailing '-' + SizeType r = NewRange('-'); + RAPIDJSON_ASSERT(current != kRegexInvalidRange); + GetRange(current).next = r; + } + if (negate) + GetRange(start).start |= kRangeNegationFlag; + *range = start; + return true; + + case '\\': + if (ds.Peek() == 'b') { + ds.Take(); + codepoint = 0x0008; // Escape backspace character + } + else if (!CharacterEscape(ds, &codepoint)) + return false; + // fall through to default + + default: + switch (step) { + case 1: + if (codepoint == '-') { + step++; + break; + } + // fall through to step 0 for other characters + + case 0: + { + SizeType r = NewRange(codepoint); + if (current != kRegexInvalidRange) + GetRange(current).next = r; + if (start == kRegexInvalidRange) + start = r; + current = r; + } + step = 1; + break; + + default: + RAPIDJSON_ASSERT(step == 2); + GetRange(current).end = codepoint; + step = 0; + } + } + } + return false; + } + + SizeType NewRange(unsigned codepoint) { + Range* r = ranges_.template Push(); + r->start = r->end = codepoint; + r->next = kRegexInvalidRange; + return rangeCount_++; + } + + template + bool CharacterEscape(DecodedStream& ds, unsigned* escapedCodepoint) { + unsigned codepoint; + switch (codepoint = ds.Take()) { + case '^': + case '$': + case '|': + case '(': + case ')': + case '?': + case '*': + case '+': + case '.': + case '[': + case ']': + case '{': + case '}': + case '\\': + *escapedCodepoint = codepoint; return true; + case 'f': *escapedCodepoint = 0x000C; return true; + case 'n': *escapedCodepoint = 0x000A; return true; + case 'r': *escapedCodepoint = 0x000D; return true; + case 't': *escapedCodepoint = 0x0009; return true; + case 'v': *escapedCodepoint = 0x000B; return true; + default: + return false; // Unsupported escape character + } + } + + template + bool SearchWithAnchoring(InputStream& is, bool anchorBegin, bool anchorEnd) const { + RAPIDJSON_ASSERT(IsValid()); + DecodedStream ds(is); + + state0_.Clear(); + Stack *current = &state0_, *next = &state1_; + const size_t stateSetSize = GetStateSetSize(); + std::memset(stateSet_, 0, stateSetSize); + + bool matched = AddState(*current, root_); + unsigned codepoint; + while (!current->Empty() && (codepoint = ds.Take()) != 0) { + std::memset(stateSet_, 0, stateSetSize); + next->Clear(); + matched = false; + for (const SizeType* s = current->template Bottom(); s != current->template End(); ++s) { + const State& sr = GetState(*s); + if (sr.codepoint == codepoint || + sr.codepoint == kAnyCharacterClass || + (sr.codepoint == kRangeCharacterClass && MatchRange(sr.rangeStart, codepoint))) + { + matched = AddState(*next, sr.out) || matched; + if (!anchorEnd && matched) + return true; + } + if (!anchorBegin) + AddState(*next, root_); + } + internal::Swap(current, next); + } + + return matched; + } + + size_t GetStateSetSize() const { + return (stateCount_ + 31) / 32 * 4; + } + + // Return whether the added states is a match state + bool AddState(Stack& l, SizeType index) const { + RAPIDJSON_ASSERT(index != kRegexInvalidState); + + const State& s = GetState(index); + if (s.out1 != kRegexInvalidState) { // Split + bool matched = AddState(l, s.out); + return AddState(l, s.out1) || matched; + } + else if (!(stateSet_[index >> 5] & (1 << (index & 31)))) { + stateSet_[index >> 5] |= (1 << (index & 31)); + *l.template PushUnsafe() = index; + } + return s.out == kRegexInvalidState; // by using PushUnsafe() above, we can ensure s is not validated due to reallocation. + } + + bool MatchRange(SizeType rangeIndex, unsigned codepoint) const { + bool yes = (GetRange(rangeIndex).start & kRangeNegationFlag) == 0; + while (rangeIndex != kRegexInvalidRange) { + const Range& r = GetRange(rangeIndex); + if (codepoint >= (r.start & ~kRangeNegationFlag) && codepoint <= r.end) + return yes; + rangeIndex = r.next; + } + return !yes; + } + + Stack states_; + Stack ranges_; + SizeType root_; + SizeType stateCount_; + SizeType rangeCount_; + + static const unsigned kInfinityQuantifier = ~0u; + + // For SearchWithAnchoring() + uint32_t* stateSet_; // allocated by states_.GetAllocator() + mutable Stack state0_; + mutable Stack state1_; + bool anchorBegin_; + bool anchorEnd_; +}; + +typedef GenericRegex > Regex; + +} // namespace internal +RAPIDJSON_NAMESPACE_END + +#ifdef __clang__ +RAPIDJSON_DIAG_POP +#endif + +#ifdef _MSC_VER +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_INTERNAL_REGEX_H_ diff --git a/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/internal/stack.h b/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/internal/stack.h new file mode 100644 index 0000000..022c9aa --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/internal/stack.h @@ -0,0 +1,230 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_INTERNAL_STACK_H_ +#define RAPIDJSON_INTERNAL_STACK_H_ + +#include "../allocators.h" +#include "swap.h" + +#if defined(__clang__) +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(c++98-compat) +#endif + +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +/////////////////////////////////////////////////////////////////////////////// +// Stack + +//! A type-unsafe stack for storing different types of data. +/*! \tparam Allocator Allocator for allocating stack memory. +*/ +template +class Stack { +public: + // Optimization note: Do not allocate memory for stack_ in constructor. + // Do it lazily when first Push() -> Expand() -> Resize(). + Stack(Allocator* allocator, size_t stackCapacity) : allocator_(allocator), ownAllocator_(0), stack_(0), stackTop_(0), stackEnd_(0), initialCapacity_(stackCapacity) { + } + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + Stack(Stack&& rhs) + : allocator_(rhs.allocator_), + ownAllocator_(rhs.ownAllocator_), + stack_(rhs.stack_), + stackTop_(rhs.stackTop_), + stackEnd_(rhs.stackEnd_), + initialCapacity_(rhs.initialCapacity_) + { + rhs.allocator_ = 0; + rhs.ownAllocator_ = 0; + rhs.stack_ = 0; + rhs.stackTop_ = 0; + rhs.stackEnd_ = 0; + rhs.initialCapacity_ = 0; + } +#endif + + ~Stack() { + Destroy(); + } + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + Stack& operator=(Stack&& rhs) { + if (&rhs != this) + { + Destroy(); + + allocator_ = rhs.allocator_; + ownAllocator_ = rhs.ownAllocator_; + stack_ = rhs.stack_; + stackTop_ = rhs.stackTop_; + stackEnd_ = rhs.stackEnd_; + initialCapacity_ = rhs.initialCapacity_; + + rhs.allocator_ = 0; + rhs.ownAllocator_ = 0; + rhs.stack_ = 0; + rhs.stackTop_ = 0; + rhs.stackEnd_ = 0; + rhs.initialCapacity_ = 0; + } + return *this; + } +#endif + + void Swap(Stack& rhs) RAPIDJSON_NOEXCEPT { + internal::Swap(allocator_, rhs.allocator_); + internal::Swap(ownAllocator_, rhs.ownAllocator_); + internal::Swap(stack_, rhs.stack_); + internal::Swap(stackTop_, rhs.stackTop_); + internal::Swap(stackEnd_, rhs.stackEnd_); + internal::Swap(initialCapacity_, rhs.initialCapacity_); + } + + void Clear() { stackTop_ = stack_; } + + void ShrinkToFit() { + if (Empty()) { + // If the stack is empty, completely deallocate the memory. + Allocator::Free(stack_); + stack_ = 0; + stackTop_ = 0; + stackEnd_ = 0; + } + else + Resize(GetSize()); + } + + // Optimization note: try to minimize the size of this function for force inline. + // Expansion is run very infrequently, so it is moved to another (probably non-inline) function. + template + RAPIDJSON_FORCEINLINE void Reserve(size_t count = 1) { + // Expand the stack if needed + if (RAPIDJSON_UNLIKELY(stackTop_ + sizeof(T) * count > stackEnd_)) + Expand(count); + } + + template + RAPIDJSON_FORCEINLINE T* Push(size_t count = 1) { + Reserve(count); + return PushUnsafe(count); + } + + template + RAPIDJSON_FORCEINLINE T* PushUnsafe(size_t count = 1) { + RAPIDJSON_ASSERT(stackTop_ + sizeof(T) * count <= stackEnd_); + T* ret = reinterpret_cast(stackTop_); + stackTop_ += sizeof(T) * count; + return ret; + } + + template + T* Pop(size_t count) { + RAPIDJSON_ASSERT(GetSize() >= count * sizeof(T)); + stackTop_ -= count * sizeof(T); + return reinterpret_cast(stackTop_); + } + + template + T* Top() { + RAPIDJSON_ASSERT(GetSize() >= sizeof(T)); + return reinterpret_cast(stackTop_ - sizeof(T)); + } + + template + const T* Top() const { + RAPIDJSON_ASSERT(GetSize() >= sizeof(T)); + return reinterpret_cast(stackTop_ - sizeof(T)); + } + + template + T* End() { return reinterpret_cast(stackTop_); } + + template + const T* End() const { return reinterpret_cast(stackTop_); } + + template + T* Bottom() { return reinterpret_cast(stack_); } + + template + const T* Bottom() const { return reinterpret_cast(stack_); } + + bool HasAllocator() const { + return allocator_ != 0; + } + + Allocator& GetAllocator() { + RAPIDJSON_ASSERT(allocator_); + return *allocator_; + } + + bool Empty() const { return stackTop_ == stack_; } + size_t GetSize() const { return static_cast(stackTop_ - stack_); } + size_t GetCapacity() const { return static_cast(stackEnd_ - stack_); } + +private: + template + void Expand(size_t count) { + // Only expand the capacity if the current stack exists. Otherwise just create a stack with initial capacity. + size_t newCapacity; + if (stack_ == 0) { + if (!allocator_) + ownAllocator_ = allocator_ = RAPIDJSON_NEW(Allocator()); + newCapacity = initialCapacity_; + } else { + newCapacity = GetCapacity(); + newCapacity += (newCapacity + 1) / 2; + } + size_t newSize = GetSize() + sizeof(T) * count; + if (newCapacity < newSize) + newCapacity = newSize; + + Resize(newCapacity); + } + + void Resize(size_t newCapacity) { + const size_t size = GetSize(); // Backup the current size + stack_ = static_cast(allocator_->Realloc(stack_, GetCapacity(), newCapacity)); + stackTop_ = stack_ + size; + stackEnd_ = stack_ + newCapacity; + } + + void Destroy() { + Allocator::Free(stack_); + RAPIDJSON_DELETE(ownAllocator_); // Only delete if it is owned by the stack + } + + // Prohibit copy constructor & assignment operator. + Stack(const Stack&); + Stack& operator=(const Stack&); + + Allocator* allocator_; + Allocator* ownAllocator_; + char *stack_; + char *stackTop_; + char *stackEnd_; + size_t initialCapacity_; +}; + +} // namespace internal +RAPIDJSON_NAMESPACE_END + +#if defined(__clang__) +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_STACK_H_ diff --git a/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/internal/strfunc.h b/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/internal/strfunc.h new file mode 100644 index 0000000..2edfae5 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/internal/strfunc.h @@ -0,0 +1,55 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_INTERNAL_STRFUNC_H_ +#define RAPIDJSON_INTERNAL_STRFUNC_H_ + +#include "../stream.h" + +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +//! Custom strlen() which works on different character types. +/*! \tparam Ch Character type (e.g. char, wchar_t, short) + \param s Null-terminated input string. + \return Number of characters in the string. + \note This has the same semantics as strlen(), the return value is not number of Unicode codepoints. +*/ +template +inline SizeType StrLen(const Ch* s) { + const Ch* p = s; + while (*p) ++p; + return SizeType(p - s); +} + +//! Returns number of code points in a encoded string. +template +bool CountStringCodePoint(const typename Encoding::Ch* s, SizeType length, SizeType* outCount) { + GenericStringStream is(s); + const typename Encoding::Ch* end = s + length; + SizeType count = 0; + while (is.src_ < end) { + unsigned codepoint; + if (!Encoding::Decode(is, &codepoint)) + return false; + count++; + } + *outCount = count; + return true; +} + +} // namespace internal +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_INTERNAL_STRFUNC_H_ diff --git a/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/internal/strtod.h b/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/internal/strtod.h new file mode 100644 index 0000000..289c413 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/internal/strtod.h @@ -0,0 +1,269 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_STRTOD_ +#define RAPIDJSON_STRTOD_ + +#include "ieee754.h" +#include "biginteger.h" +#include "diyfp.h" +#include "pow10.h" + +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +inline double FastPath(double significand, int exp) { + if (exp < -308) + return 0.0; + else if (exp >= 0) + return significand * internal::Pow10(exp); + else + return significand / internal::Pow10(-exp); +} + +inline double StrtodNormalPrecision(double d, int p) { + if (p < -308) { + // Prevent expSum < -308, making Pow10(p) = 0 + d = FastPath(d, -308); + d = FastPath(d, p + 308); + } + else + d = FastPath(d, p); + return d; +} + +template +inline T Min3(T a, T b, T c) { + T m = a; + if (m > b) m = b; + if (m > c) m = c; + return m; +} + +inline int CheckWithinHalfULP(double b, const BigInteger& d, int dExp) { + const Double db(b); + const uint64_t bInt = db.IntegerSignificand(); + const int bExp = db.IntegerExponent(); + const int hExp = bExp - 1; + + int dS_Exp2 = 0, dS_Exp5 = 0, bS_Exp2 = 0, bS_Exp5 = 0, hS_Exp2 = 0, hS_Exp5 = 0; + + // Adjust for decimal exponent + if (dExp >= 0) { + dS_Exp2 += dExp; + dS_Exp5 += dExp; + } + else { + bS_Exp2 -= dExp; + bS_Exp5 -= dExp; + hS_Exp2 -= dExp; + hS_Exp5 -= dExp; + } + + // Adjust for binary exponent + if (bExp >= 0) + bS_Exp2 += bExp; + else { + dS_Exp2 -= bExp; + hS_Exp2 -= bExp; + } + + // Adjust for half ulp exponent + if (hExp >= 0) + hS_Exp2 += hExp; + else { + dS_Exp2 -= hExp; + bS_Exp2 -= hExp; + } + + // Remove common power of two factor from all three scaled values + int common_Exp2 = Min3(dS_Exp2, bS_Exp2, hS_Exp2); + dS_Exp2 -= common_Exp2; + bS_Exp2 -= common_Exp2; + hS_Exp2 -= common_Exp2; + + BigInteger dS = d; + dS.MultiplyPow5(static_cast(dS_Exp5)) <<= static_cast(dS_Exp2); + + BigInteger bS(bInt); + bS.MultiplyPow5(static_cast(bS_Exp5)) <<= static_cast(bS_Exp2); + + BigInteger hS(1); + hS.MultiplyPow5(static_cast(hS_Exp5)) <<= static_cast(hS_Exp2); + + BigInteger delta(0); + dS.Difference(bS, &delta); + + return delta.Compare(hS); +} + +inline bool StrtodFast(double d, int p, double* result) { + // Use fast path for string-to-double conversion if possible + // see http://www.exploringbinary.com/fast-path-decimal-to-floating-point-conversion/ + if (p > 22 && p < 22 + 16) { + // Fast Path Cases In Disguise + d *= internal::Pow10(p - 22); + p = 22; + } + + if (p >= -22 && p <= 22 && d <= 9007199254740991.0) { // 2^53 - 1 + *result = FastPath(d, p); + return true; + } + else + return false; +} + +// Compute an approximation and see if it is within 1/2 ULP +inline bool StrtodDiyFp(const char* decimals, size_t length, size_t decimalPosition, int exp, double* result) { + uint64_t significand = 0; + size_t i = 0; // 2^64 - 1 = 18446744073709551615, 1844674407370955161 = 0x1999999999999999 + for (; i < length; i++) { + if (significand > RAPIDJSON_UINT64_C2(0x19999999, 0x99999999) || + (significand == RAPIDJSON_UINT64_C2(0x19999999, 0x99999999) && decimals[i] > '5')) + break; + significand = significand * 10u + static_cast(decimals[i] - '0'); + } + + if (i < length && decimals[i] >= '5') // Rounding + significand++; + + size_t remaining = length - i; + const unsigned kUlpShift = 3; + const unsigned kUlp = 1 << kUlpShift; + int64_t error = (remaining == 0) ? 0 : kUlp / 2; + + DiyFp v(significand, 0); + v = v.Normalize(); + error <<= -v.e; + + const int dExp = static_cast(decimalPosition) - static_cast(i) + exp; + + int actualExp; + DiyFp cachedPower = GetCachedPower10(dExp, &actualExp); + if (actualExp != dExp) { + static const DiyFp kPow10[] = { + DiyFp(RAPIDJSON_UINT64_C2(0xa0000000, 00000000), -60), // 10^1 + DiyFp(RAPIDJSON_UINT64_C2(0xc8000000, 00000000), -57), // 10^2 + DiyFp(RAPIDJSON_UINT64_C2(0xfa000000, 00000000), -54), // 10^3 + DiyFp(RAPIDJSON_UINT64_C2(0x9c400000, 00000000), -50), // 10^4 + DiyFp(RAPIDJSON_UINT64_C2(0xc3500000, 00000000), -47), // 10^5 + DiyFp(RAPIDJSON_UINT64_C2(0xf4240000, 00000000), -44), // 10^6 + DiyFp(RAPIDJSON_UINT64_C2(0x98968000, 00000000), -40) // 10^7 + }; + int adjustment = dExp - actualExp - 1; + RAPIDJSON_ASSERT(adjustment >= 0 && adjustment < 7); + v = v * kPow10[adjustment]; + if (length + static_cast(adjustment)> 19u) // has more digits than decimal digits in 64-bit + error += kUlp / 2; + } + + v = v * cachedPower; + + error += kUlp + (error == 0 ? 0 : 1); + + const int oldExp = v.e; + v = v.Normalize(); + error <<= oldExp - v.e; + + const unsigned effectiveSignificandSize = Double::EffectiveSignificandSize(64 + v.e); + unsigned precisionSize = 64 - effectiveSignificandSize; + if (precisionSize + kUlpShift >= 64) { + unsigned scaleExp = (precisionSize + kUlpShift) - 63; + v.f >>= scaleExp; + v.e += scaleExp; + error = (error >> scaleExp) + 1 + static_cast(kUlp); + precisionSize -= scaleExp; + } + + DiyFp rounded(v.f >> precisionSize, v.e + static_cast(precisionSize)); + const uint64_t precisionBits = (v.f & ((uint64_t(1) << precisionSize) - 1)) * kUlp; + const uint64_t halfWay = (uint64_t(1) << (precisionSize - 1)) * kUlp; + if (precisionBits >= halfWay + static_cast(error)) { + rounded.f++; + if (rounded.f & (DiyFp::kDpHiddenBit << 1)) { // rounding overflows mantissa (issue #340) + rounded.f >>= 1; + rounded.e++; + } + } + + *result = rounded.ToDouble(); + + return halfWay - static_cast(error) >= precisionBits || precisionBits >= halfWay + static_cast(error); +} + +inline double StrtodBigInteger(double approx, const char* decimals, size_t length, size_t decimalPosition, int exp) { + const BigInteger dInt(decimals, length); + const int dExp = static_cast(decimalPosition) - static_cast(length) + exp; + Double a(approx); + int cmp = CheckWithinHalfULP(a.Value(), dInt, dExp); + if (cmp < 0) + return a.Value(); // within half ULP + else if (cmp == 0) { + // Round towards even + if (a.Significand() & 1) + return a.NextPositiveDouble(); + else + return a.Value(); + } + else // adjustment + return a.NextPositiveDouble(); +} + +inline double StrtodFullPrecision(double d, int p, const char* decimals, size_t length, size_t decimalPosition, int exp) { + RAPIDJSON_ASSERT(d >= 0.0); + RAPIDJSON_ASSERT(length >= 1); + + double result; + if (StrtodFast(d, p, &result)) + return result; + + // Trim leading zeros + while (*decimals == '0' && length > 1) { + length--; + decimals++; + decimalPosition--; + } + + // Trim trailing zeros + while (decimals[length - 1] == '0' && length > 1) { + length--; + decimalPosition--; + exp++; + } + + // Trim right-most digits + const int kMaxDecimalDigit = 780; + if (static_cast(length) > kMaxDecimalDigit) { + int delta = (static_cast(length) - kMaxDecimalDigit); + exp += delta; + decimalPosition -= static_cast(delta); + length = kMaxDecimalDigit; + } + + // If too small, underflow to zero + if (int(length) + exp < -324) + return 0.0; + + if (StrtodDiyFp(decimals, length, decimalPosition, exp, &result)) + return result; + + // Use approximation from StrtodDiyFp and make adjustment with BigInteger comparison + return StrtodBigInteger(result, decimals, length, decimalPosition, exp); +} + +} // namespace internal +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_STRTOD_ diff --git a/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/internal/swap.h b/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/internal/swap.h new file mode 100644 index 0000000..666e49f --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/internal/swap.h @@ -0,0 +1,46 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_INTERNAL_SWAP_H_ +#define RAPIDJSON_INTERNAL_SWAP_H_ + +#include "../rapidjson.h" + +#if defined(__clang__) +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(c++98-compat) +#endif + +RAPIDJSON_NAMESPACE_BEGIN +namespace internal { + +//! Custom swap() to avoid dependency on C++ header +/*! \tparam T Type of the arguments to swap, should be instantiated with primitive C++ types only. + \note This has the same semantics as std::swap(). +*/ +template +inline void Swap(T& a, T& b) RAPIDJSON_NOEXCEPT { + T tmp = a; + a = b; + b = tmp; +} + +} // namespace internal +RAPIDJSON_NAMESPACE_END + +#if defined(__clang__) +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_INTERNAL_SWAP_H_ diff --git a/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/istreamwrapper.h b/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/istreamwrapper.h new file mode 100644 index 0000000..f5fe289 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/istreamwrapper.h @@ -0,0 +1,115 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_ISTREAMWRAPPER_H_ +#define RAPIDJSON_ISTREAMWRAPPER_H_ + +#include "stream.h" +#include + +#ifdef __clang__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(padded) +#endif + +#ifdef _MSC_VER +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(4351) // new behavior: elements of array 'array' will be default initialized +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +//! Wrapper of \c std::basic_istream into RapidJSON's Stream concept. +/*! + The classes can be wrapped including but not limited to: + + - \c std::istringstream + - \c std::stringstream + - \c std::wistringstream + - \c std::wstringstream + - \c std::ifstream + - \c std::fstream + - \c std::wifstream + - \c std::wfstream + + \tparam StreamType Class derived from \c std::basic_istream. +*/ + +template +class BasicIStreamWrapper { +public: + typedef typename StreamType::char_type Ch; + BasicIStreamWrapper(StreamType& stream) : stream_(stream), count_(), peekBuffer_() {} + + Ch Peek() const { + typename StreamType::int_type c = stream_.peek(); + return RAPIDJSON_LIKELY(c != StreamType::traits_type::eof()) ? static_cast(c) : '\0'; + } + + Ch Take() { + typename StreamType::int_type c = stream_.get(); + if (RAPIDJSON_LIKELY(c != StreamType::traits_type::eof())) { + count_++; + return static_cast(c); + } + else + return '\0'; + } + + // tellg() may return -1 when failed. So we count by ourself. + size_t Tell() const { return count_; } + + Ch* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } + void Put(Ch) { RAPIDJSON_ASSERT(false); } + void Flush() { RAPIDJSON_ASSERT(false); } + size_t PutEnd(Ch*) { RAPIDJSON_ASSERT(false); return 0; } + + // For encoding detection only. + const Ch* Peek4() const { + RAPIDJSON_ASSERT(sizeof(Ch) == 1); // Only usable for byte stream. + int i; + bool hasError = false; + for (i = 0; i < 4; ++i) { + typename StreamType::int_type c = stream_.get(); + if (c == StreamType::traits_type::eof()) { + hasError = true; + stream_.clear(); + break; + } + peekBuffer_[i] = static_cast(c); + } + for (--i; i >= 0; --i) + stream_.putback(peekBuffer_[i]); + return !hasError ? peekBuffer_ : 0; + } + +private: + BasicIStreamWrapper(const BasicIStreamWrapper&); + BasicIStreamWrapper& operator=(const BasicIStreamWrapper&); + + StreamType& stream_; + size_t count_; //!< Number of characters read. Note: + mutable Ch peekBuffer_[4]; +}; + +typedef BasicIStreamWrapper IStreamWrapper; +typedef BasicIStreamWrapper WIStreamWrapper; + +#if defined(__clang__) || defined(_MSC_VER) +RAPIDJSON_DIAG_POP +#endif + +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_ISTREAMWRAPPER_H_ diff --git a/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/memorybuffer.h b/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/memorybuffer.h new file mode 100644 index 0000000..39bee1d --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/memorybuffer.h @@ -0,0 +1,70 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_MEMORYBUFFER_H_ +#define RAPIDJSON_MEMORYBUFFER_H_ + +#include "stream.h" +#include "internal/stack.h" + +RAPIDJSON_NAMESPACE_BEGIN + +//! Represents an in-memory output byte stream. +/*! + This class is mainly for being wrapped by EncodedOutputStream or AutoUTFOutputStream. + + It is similar to FileWriteBuffer but the destination is an in-memory buffer instead of a file. + + Differences between MemoryBuffer and StringBuffer: + 1. StringBuffer has Encoding but MemoryBuffer is only a byte buffer. + 2. StringBuffer::GetString() returns a null-terminated string. MemoryBuffer::GetBuffer() returns a buffer without terminator. + + \tparam Allocator type for allocating memory buffer. + \note implements Stream concept +*/ +template +struct GenericMemoryBuffer { + typedef char Ch; // byte + + GenericMemoryBuffer(Allocator* allocator = 0, size_t capacity = kDefaultCapacity) : stack_(allocator, capacity) {} + + void Put(Ch c) { *stack_.template Push() = c; } + void Flush() {} + + void Clear() { stack_.Clear(); } + void ShrinkToFit() { stack_.ShrinkToFit(); } + Ch* Push(size_t count) { return stack_.template Push(count); } + void Pop(size_t count) { stack_.template Pop(count); } + + const Ch* GetBuffer() const { + return stack_.template Bottom(); + } + + size_t GetSize() const { return stack_.GetSize(); } + + static const size_t kDefaultCapacity = 256; + mutable internal::Stack stack_; +}; + +typedef GenericMemoryBuffer<> MemoryBuffer; + +//! Implement specialized version of PutN() with memset() for better performance. +template<> +inline void PutN(MemoryBuffer& memoryBuffer, char c, size_t n) { + std::memset(memoryBuffer.stack_.Push(n), c, n * sizeof(c)); +} + +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_MEMORYBUFFER_H_ diff --git a/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/memorystream.h b/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/memorystream.h new file mode 100644 index 0000000..1d71d8a --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/memorystream.h @@ -0,0 +1,71 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_MEMORYSTREAM_H_ +#define RAPIDJSON_MEMORYSTREAM_H_ + +#include "stream.h" + +#ifdef __clang__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(unreachable-code) +RAPIDJSON_DIAG_OFF(missing-noreturn) +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +//! Represents an in-memory input byte stream. +/*! + This class is mainly for being wrapped by EncodedInputStream or AutoUTFInputStream. + + It is similar to FileReadBuffer but the source is an in-memory buffer instead of a file. + + Differences between MemoryStream and StringStream: + 1. StringStream has encoding but MemoryStream is a byte stream. + 2. MemoryStream needs size of the source buffer and the buffer don't need to be null terminated. StringStream assume null-terminated string as source. + 3. MemoryStream supports Peek4() for encoding detection. StringStream is specified with an encoding so it should not have Peek4(). + \note implements Stream concept +*/ +struct MemoryStream { + typedef char Ch; // byte + + MemoryStream(const Ch *src, size_t size) : src_(src), begin_(src), end_(src + size), size_(size) {} + + Ch Peek() const { return RAPIDJSON_UNLIKELY(src_ == end_) ? '\0' : *src_; } + Ch Take() { return RAPIDJSON_UNLIKELY(src_ == end_) ? '\0' : *src_++; } + size_t Tell() const { return static_cast(src_ - begin_); } + + Ch* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } + void Put(Ch) { RAPIDJSON_ASSERT(false); } + void Flush() { RAPIDJSON_ASSERT(false); } + size_t PutEnd(Ch*) { RAPIDJSON_ASSERT(false); return 0; } + + // For encoding detection only. + const Ch* Peek4() const { + return Tell() + 4 <= size_ ? src_ : 0; + } + + const Ch* src_; //!< Current read position. + const Ch* begin_; //!< Original head of the string. + const Ch* end_; //!< End of stream. + size_t size_; //!< Size of the stream. +}; + +RAPIDJSON_NAMESPACE_END + +#ifdef __clang__ +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_MEMORYBUFFER_H_ diff --git a/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/msinttypes/inttypes.h b/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/msinttypes/inttypes.h new file mode 100644 index 0000000..1811128 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/msinttypes/inttypes.h @@ -0,0 +1,316 @@ +// ISO C9x compliant inttypes.h for Microsoft Visual Studio +// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124 +// +// Copyright (c) 2006-2013 Alexander Chemeris +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the product nor the names of its contributors may +// be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED +// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO +// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////////// + +// The above software in this distribution may have been modified by +// THL A29 Limited ("Tencent Modifications"). +// All Tencent Modifications are Copyright (C) 2015 THL A29 Limited. + +#ifndef _MSC_VER // [ +#error "Use this header only with Microsoft Visual C++ compilers!" +#endif // _MSC_VER ] + +#ifndef _MSC_INTTYPES_H_ // [ +#define _MSC_INTTYPES_H_ + +#if _MSC_VER > 1000 +#pragma once +#endif + +#include "stdint.h" + +// miloyip: VC supports inttypes.h since VC2013 +#if _MSC_VER >= 1800 +#include +#else + +// 7.8 Format conversion of integer types + +typedef struct { + intmax_t quot; + intmax_t rem; +} imaxdiv_t; + +// 7.8.1 Macros for format specifiers + +#if !defined(__cplusplus) || defined(__STDC_FORMAT_MACROS) // [ See footnote 185 at page 198 + +// The fprintf macros for signed integers are: +#define PRId8 "d" +#define PRIi8 "i" +#define PRIdLEAST8 "d" +#define PRIiLEAST8 "i" +#define PRIdFAST8 "d" +#define PRIiFAST8 "i" + +#define PRId16 "hd" +#define PRIi16 "hi" +#define PRIdLEAST16 "hd" +#define PRIiLEAST16 "hi" +#define PRIdFAST16 "hd" +#define PRIiFAST16 "hi" + +#define PRId32 "I32d" +#define PRIi32 "I32i" +#define PRIdLEAST32 "I32d" +#define PRIiLEAST32 "I32i" +#define PRIdFAST32 "I32d" +#define PRIiFAST32 "I32i" + +#define PRId64 "I64d" +#define PRIi64 "I64i" +#define PRIdLEAST64 "I64d" +#define PRIiLEAST64 "I64i" +#define PRIdFAST64 "I64d" +#define PRIiFAST64 "I64i" + +#define PRIdMAX "I64d" +#define PRIiMAX "I64i" + +#define PRIdPTR "Id" +#define PRIiPTR "Ii" + +// The fprintf macros for unsigned integers are: +#define PRIo8 "o" +#define PRIu8 "u" +#define PRIx8 "x" +#define PRIX8 "X" +#define PRIoLEAST8 "o" +#define PRIuLEAST8 "u" +#define PRIxLEAST8 "x" +#define PRIXLEAST8 "X" +#define PRIoFAST8 "o" +#define PRIuFAST8 "u" +#define PRIxFAST8 "x" +#define PRIXFAST8 "X" + +#define PRIo16 "ho" +#define PRIu16 "hu" +#define PRIx16 "hx" +#define PRIX16 "hX" +#define PRIoLEAST16 "ho" +#define PRIuLEAST16 "hu" +#define PRIxLEAST16 "hx" +#define PRIXLEAST16 "hX" +#define PRIoFAST16 "ho" +#define PRIuFAST16 "hu" +#define PRIxFAST16 "hx" +#define PRIXFAST16 "hX" + +#define PRIo32 "I32o" +#define PRIu32 "I32u" +#define PRIx32 "I32x" +#define PRIX32 "I32X" +#define PRIoLEAST32 "I32o" +#define PRIuLEAST32 "I32u" +#define PRIxLEAST32 "I32x" +#define PRIXLEAST32 "I32X" +#define PRIoFAST32 "I32o" +#define PRIuFAST32 "I32u" +#define PRIxFAST32 "I32x" +#define PRIXFAST32 "I32X" + +#define PRIo64 "I64o" +#define PRIu64 "I64u" +#define PRIx64 "I64x" +#define PRIX64 "I64X" +#define PRIoLEAST64 "I64o" +#define PRIuLEAST64 "I64u" +#define PRIxLEAST64 "I64x" +#define PRIXLEAST64 "I64X" +#define PRIoFAST64 "I64o" +#define PRIuFAST64 "I64u" +#define PRIxFAST64 "I64x" +#define PRIXFAST64 "I64X" + +#define PRIoMAX "I64o" +#define PRIuMAX "I64u" +#define PRIxMAX "I64x" +#define PRIXMAX "I64X" + +#define PRIoPTR "Io" +#define PRIuPTR "Iu" +#define PRIxPTR "Ix" +#define PRIXPTR "IX" + +// The fscanf macros for signed integers are: +#define SCNd8 "d" +#define SCNi8 "i" +#define SCNdLEAST8 "d" +#define SCNiLEAST8 "i" +#define SCNdFAST8 "d" +#define SCNiFAST8 "i" + +#define SCNd16 "hd" +#define SCNi16 "hi" +#define SCNdLEAST16 "hd" +#define SCNiLEAST16 "hi" +#define SCNdFAST16 "hd" +#define SCNiFAST16 "hi" + +#define SCNd32 "ld" +#define SCNi32 "li" +#define SCNdLEAST32 "ld" +#define SCNiLEAST32 "li" +#define SCNdFAST32 "ld" +#define SCNiFAST32 "li" + +#define SCNd64 "I64d" +#define SCNi64 "I64i" +#define SCNdLEAST64 "I64d" +#define SCNiLEAST64 "I64i" +#define SCNdFAST64 "I64d" +#define SCNiFAST64 "I64i" + +#define SCNdMAX "I64d" +#define SCNiMAX "I64i" + +#ifdef _WIN64 // [ +# define SCNdPTR "I64d" +# define SCNiPTR "I64i" +#else // _WIN64 ][ +# define SCNdPTR "ld" +# define SCNiPTR "li" +#endif // _WIN64 ] + +// The fscanf macros for unsigned integers are: +#define SCNo8 "o" +#define SCNu8 "u" +#define SCNx8 "x" +#define SCNX8 "X" +#define SCNoLEAST8 "o" +#define SCNuLEAST8 "u" +#define SCNxLEAST8 "x" +#define SCNXLEAST8 "X" +#define SCNoFAST8 "o" +#define SCNuFAST8 "u" +#define SCNxFAST8 "x" +#define SCNXFAST8 "X" + +#define SCNo16 "ho" +#define SCNu16 "hu" +#define SCNx16 "hx" +#define SCNX16 "hX" +#define SCNoLEAST16 "ho" +#define SCNuLEAST16 "hu" +#define SCNxLEAST16 "hx" +#define SCNXLEAST16 "hX" +#define SCNoFAST16 "ho" +#define SCNuFAST16 "hu" +#define SCNxFAST16 "hx" +#define SCNXFAST16 "hX" + +#define SCNo32 "lo" +#define SCNu32 "lu" +#define SCNx32 "lx" +#define SCNX32 "lX" +#define SCNoLEAST32 "lo" +#define SCNuLEAST32 "lu" +#define SCNxLEAST32 "lx" +#define SCNXLEAST32 "lX" +#define SCNoFAST32 "lo" +#define SCNuFAST32 "lu" +#define SCNxFAST32 "lx" +#define SCNXFAST32 "lX" + +#define SCNo64 "I64o" +#define SCNu64 "I64u" +#define SCNx64 "I64x" +#define SCNX64 "I64X" +#define SCNoLEAST64 "I64o" +#define SCNuLEAST64 "I64u" +#define SCNxLEAST64 "I64x" +#define SCNXLEAST64 "I64X" +#define SCNoFAST64 "I64o" +#define SCNuFAST64 "I64u" +#define SCNxFAST64 "I64x" +#define SCNXFAST64 "I64X" + +#define SCNoMAX "I64o" +#define SCNuMAX "I64u" +#define SCNxMAX "I64x" +#define SCNXMAX "I64X" + +#ifdef _WIN64 // [ +# define SCNoPTR "I64o" +# define SCNuPTR "I64u" +# define SCNxPTR "I64x" +# define SCNXPTR "I64X" +#else // _WIN64 ][ +# define SCNoPTR "lo" +# define SCNuPTR "lu" +# define SCNxPTR "lx" +# define SCNXPTR "lX" +#endif // _WIN64 ] + +#endif // __STDC_FORMAT_MACROS ] + +// 7.8.2 Functions for greatest-width integer types + +// 7.8.2.1 The imaxabs function +#define imaxabs _abs64 + +// 7.8.2.2 The imaxdiv function + +// This is modified version of div() function from Microsoft's div.c found +// in %MSVC.NET%\crt\src\div.c +#ifdef STATIC_IMAXDIV // [ +static +#else // STATIC_IMAXDIV ][ +_inline +#endif // STATIC_IMAXDIV ] +imaxdiv_t __cdecl imaxdiv(intmax_t numer, intmax_t denom) +{ + imaxdiv_t result; + + result.quot = numer / denom; + result.rem = numer % denom; + + if (numer < 0 && result.rem > 0) { + // did division wrong; must fix up + ++result.quot; + result.rem -= denom; + } + + return result; +} + +// 7.8.2.3 The strtoimax and strtoumax functions +#define strtoimax _strtoi64 +#define strtoumax _strtoui64 + +// 7.8.2.4 The wcstoimax and wcstoumax functions +#define wcstoimax _wcstoi64 +#define wcstoumax _wcstoui64 + +#endif // _MSC_VER >= 1800 + +#endif // _MSC_INTTYPES_H_ ] diff --git a/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/msinttypes/stdint.h b/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/msinttypes/stdint.h new file mode 100644 index 0000000..3d4477b --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/msinttypes/stdint.h @@ -0,0 +1,300 @@ +// ISO C9x compliant stdint.h for Microsoft Visual Studio +// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124 +// +// Copyright (c) 2006-2013 Alexander Chemeris +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the product nor the names of its contributors may +// be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED +// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO +// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////////// + +// The above software in this distribution may have been modified by +// THL A29 Limited ("Tencent Modifications"). +// All Tencent Modifications are Copyright (C) 2015 THL A29 Limited. + +#ifndef _MSC_VER // [ +#error "Use this header only with Microsoft Visual C++ compilers!" +#endif // _MSC_VER ] + +#ifndef _MSC_STDINT_H_ // [ +#define _MSC_STDINT_H_ + +#if _MSC_VER > 1000 +#pragma once +#endif + +// miloyip: Originally Visual Studio 2010 uses its own stdint.h. However it generates warning with INT64_C(), so change to use this file for vs2010. +#if _MSC_VER >= 1600 // [ +#include + +#if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS) // [ See footnote 224 at page 260 + +#undef INT8_C +#undef INT16_C +#undef INT32_C +#undef INT64_C +#undef UINT8_C +#undef UINT16_C +#undef UINT32_C +#undef UINT64_C + +// 7.18.4.1 Macros for minimum-width integer constants + +#define INT8_C(val) val##i8 +#define INT16_C(val) val##i16 +#define INT32_C(val) val##i32 +#define INT64_C(val) val##i64 + +#define UINT8_C(val) val##ui8 +#define UINT16_C(val) val##ui16 +#define UINT32_C(val) val##ui32 +#define UINT64_C(val) val##ui64 + +// 7.18.4.2 Macros for greatest-width integer constants +// These #ifndef's are needed to prevent collisions with . +// Check out Issue 9 for the details. +#ifndef INTMAX_C // [ +# define INTMAX_C INT64_C +#endif // INTMAX_C ] +#ifndef UINTMAX_C // [ +# define UINTMAX_C UINT64_C +#endif // UINTMAX_C ] + +#endif // __STDC_CONSTANT_MACROS ] + +#else // ] _MSC_VER >= 1700 [ + +#include + +// For Visual Studio 6 in C++ mode and for many Visual Studio versions when +// compiling for ARM we have to wrap include with 'extern "C++" {}' +// or compiler would give many errors like this: +// error C2733: second C linkage of overloaded function 'wmemchr' not allowed +#if defined(__cplusplus) && !defined(_M_ARM) +extern "C" { +#endif +# include +#if defined(__cplusplus) && !defined(_M_ARM) +} +#endif + +// Define _W64 macros to mark types changing their size, like intptr_t. +#ifndef _W64 +# if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && _MSC_VER >= 1300 +# define _W64 __w64 +# else +# define _W64 +# endif +#endif + + +// 7.18.1 Integer types + +// 7.18.1.1 Exact-width integer types + +// Visual Studio 6 and Embedded Visual C++ 4 doesn't +// realize that, e.g. char has the same size as __int8 +// so we give up on __intX for them. +#if (_MSC_VER < 1300) + typedef signed char int8_t; + typedef signed short int16_t; + typedef signed int int32_t; + typedef unsigned char uint8_t; + typedef unsigned short uint16_t; + typedef unsigned int uint32_t; +#else + typedef signed __int8 int8_t; + typedef signed __int16 int16_t; + typedef signed __int32 int32_t; + typedef unsigned __int8 uint8_t; + typedef unsigned __int16 uint16_t; + typedef unsigned __int32 uint32_t; +#endif +typedef signed __int64 int64_t; +typedef unsigned __int64 uint64_t; + + +// 7.18.1.2 Minimum-width integer types +typedef int8_t int_least8_t; +typedef int16_t int_least16_t; +typedef int32_t int_least32_t; +typedef int64_t int_least64_t; +typedef uint8_t uint_least8_t; +typedef uint16_t uint_least16_t; +typedef uint32_t uint_least32_t; +typedef uint64_t uint_least64_t; + +// 7.18.1.3 Fastest minimum-width integer types +typedef int8_t int_fast8_t; +typedef int16_t int_fast16_t; +typedef int32_t int_fast32_t; +typedef int64_t int_fast64_t; +typedef uint8_t uint_fast8_t; +typedef uint16_t uint_fast16_t; +typedef uint32_t uint_fast32_t; +typedef uint64_t uint_fast64_t; + +// 7.18.1.4 Integer types capable of holding object pointers +#ifdef _WIN64 // [ + typedef signed __int64 intptr_t; + typedef unsigned __int64 uintptr_t; +#else // _WIN64 ][ + typedef _W64 signed int intptr_t; + typedef _W64 unsigned int uintptr_t; +#endif // _WIN64 ] + +// 7.18.1.5 Greatest-width integer types +typedef int64_t intmax_t; +typedef uint64_t uintmax_t; + + +// 7.18.2 Limits of specified-width integer types + +#if !defined(__cplusplus) || defined(__STDC_LIMIT_MACROS) // [ See footnote 220 at page 257 and footnote 221 at page 259 + +// 7.18.2.1 Limits of exact-width integer types +#define INT8_MIN ((int8_t)_I8_MIN) +#define INT8_MAX _I8_MAX +#define INT16_MIN ((int16_t)_I16_MIN) +#define INT16_MAX _I16_MAX +#define INT32_MIN ((int32_t)_I32_MIN) +#define INT32_MAX _I32_MAX +#define INT64_MIN ((int64_t)_I64_MIN) +#define INT64_MAX _I64_MAX +#define UINT8_MAX _UI8_MAX +#define UINT16_MAX _UI16_MAX +#define UINT32_MAX _UI32_MAX +#define UINT64_MAX _UI64_MAX + +// 7.18.2.2 Limits of minimum-width integer types +#define INT_LEAST8_MIN INT8_MIN +#define INT_LEAST8_MAX INT8_MAX +#define INT_LEAST16_MIN INT16_MIN +#define INT_LEAST16_MAX INT16_MAX +#define INT_LEAST32_MIN INT32_MIN +#define INT_LEAST32_MAX INT32_MAX +#define INT_LEAST64_MIN INT64_MIN +#define INT_LEAST64_MAX INT64_MAX +#define UINT_LEAST8_MAX UINT8_MAX +#define UINT_LEAST16_MAX UINT16_MAX +#define UINT_LEAST32_MAX UINT32_MAX +#define UINT_LEAST64_MAX UINT64_MAX + +// 7.18.2.3 Limits of fastest minimum-width integer types +#define INT_FAST8_MIN INT8_MIN +#define INT_FAST8_MAX INT8_MAX +#define INT_FAST16_MIN INT16_MIN +#define INT_FAST16_MAX INT16_MAX +#define INT_FAST32_MIN INT32_MIN +#define INT_FAST32_MAX INT32_MAX +#define INT_FAST64_MIN INT64_MIN +#define INT_FAST64_MAX INT64_MAX +#define UINT_FAST8_MAX UINT8_MAX +#define UINT_FAST16_MAX UINT16_MAX +#define UINT_FAST32_MAX UINT32_MAX +#define UINT_FAST64_MAX UINT64_MAX + +// 7.18.2.4 Limits of integer types capable of holding object pointers +#ifdef _WIN64 // [ +# define INTPTR_MIN INT64_MIN +# define INTPTR_MAX INT64_MAX +# define UINTPTR_MAX UINT64_MAX +#else // _WIN64 ][ +# define INTPTR_MIN INT32_MIN +# define INTPTR_MAX INT32_MAX +# define UINTPTR_MAX UINT32_MAX +#endif // _WIN64 ] + +// 7.18.2.5 Limits of greatest-width integer types +#define INTMAX_MIN INT64_MIN +#define INTMAX_MAX INT64_MAX +#define UINTMAX_MAX UINT64_MAX + +// 7.18.3 Limits of other integer types + +#ifdef _WIN64 // [ +# define PTRDIFF_MIN _I64_MIN +# define PTRDIFF_MAX _I64_MAX +#else // _WIN64 ][ +# define PTRDIFF_MIN _I32_MIN +# define PTRDIFF_MAX _I32_MAX +#endif // _WIN64 ] + +#define SIG_ATOMIC_MIN INT_MIN +#define SIG_ATOMIC_MAX INT_MAX + +#ifndef SIZE_MAX // [ +# ifdef _WIN64 // [ +# define SIZE_MAX _UI64_MAX +# else // _WIN64 ][ +# define SIZE_MAX _UI32_MAX +# endif // _WIN64 ] +#endif // SIZE_MAX ] + +// WCHAR_MIN and WCHAR_MAX are also defined in +#ifndef WCHAR_MIN // [ +# define WCHAR_MIN 0 +#endif // WCHAR_MIN ] +#ifndef WCHAR_MAX // [ +# define WCHAR_MAX _UI16_MAX +#endif // WCHAR_MAX ] + +#define WINT_MIN 0 +#define WINT_MAX _UI16_MAX + +#endif // __STDC_LIMIT_MACROS ] + + +// 7.18.4 Limits of other integer types + +#if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS) // [ See footnote 224 at page 260 + +// 7.18.4.1 Macros for minimum-width integer constants + +#define INT8_C(val) val##i8 +#define INT16_C(val) val##i16 +#define INT32_C(val) val##i32 +#define INT64_C(val) val##i64 + +#define UINT8_C(val) val##ui8 +#define UINT16_C(val) val##ui16 +#define UINT32_C(val) val##ui32 +#define UINT64_C(val) val##ui64 + +// 7.18.4.2 Macros for greatest-width integer constants +// These #ifndef's are needed to prevent collisions with . +// Check out Issue 9 for the details. +#ifndef INTMAX_C // [ +# define INTMAX_C INT64_C +#endif // INTMAX_C ] +#ifndef UINTMAX_C // [ +# define UINTMAX_C UINT64_C +#endif // UINTMAX_C ] + +#endif // __STDC_CONSTANT_MACROS ] + +#endif // _MSC_VER >= 1600 ] + +#endif // _MSC_STDINT_H_ ] diff --git a/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/ostreamwrapper.h b/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/ostreamwrapper.h new file mode 100644 index 0000000..6f4667c --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/ostreamwrapper.h @@ -0,0 +1,81 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_OSTREAMWRAPPER_H_ +#define RAPIDJSON_OSTREAMWRAPPER_H_ + +#include "stream.h" +#include + +#ifdef __clang__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(padded) +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +//! Wrapper of \c std::basic_ostream into RapidJSON's Stream concept. +/*! + The classes can be wrapped including but not limited to: + + - \c std::ostringstream + - \c std::stringstream + - \c std::wpstringstream + - \c std::wstringstream + - \c std::ifstream + - \c std::fstream + - \c std::wofstream + - \c std::wfstream + + \tparam StreamType Class derived from \c std::basic_ostream. +*/ + +template +class BasicOStreamWrapper { +public: + typedef typename StreamType::char_type Ch; + BasicOStreamWrapper(StreamType& stream) : stream_(stream) {} + + void Put(Ch c) { + stream_.put(c); + } + + void Flush() { + stream_.flush(); + } + + // Not implemented + char Peek() const { RAPIDJSON_ASSERT(false); return 0; } + char Take() { RAPIDJSON_ASSERT(false); return 0; } + size_t Tell() const { RAPIDJSON_ASSERT(false); return 0; } + char* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } + size_t PutEnd(char*) { RAPIDJSON_ASSERT(false); return 0; } + +private: + BasicOStreamWrapper(const BasicOStreamWrapper&); + BasicOStreamWrapper& operator=(const BasicOStreamWrapper&); + + StreamType& stream_; +}; + +typedef BasicOStreamWrapper OStreamWrapper; +typedef BasicOStreamWrapper WOStreamWrapper; + +#ifdef __clang__ +RAPIDJSON_DIAG_POP +#endif + +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_OSTREAMWRAPPER_H_ diff --git a/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/pointer.h b/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/pointer.h new file mode 100644 index 0000000..0206ac1 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/pointer.h @@ -0,0 +1,1358 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_POINTER_H_ +#define RAPIDJSON_POINTER_H_ + +#include "document.h" +#include "internal/itoa.h" + +#ifdef __clang__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(switch-enum) +#endif + +#ifdef _MSC_VER +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(4512) // assignment operator could not be generated +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +static const SizeType kPointerInvalidIndex = ~SizeType(0); //!< Represents an invalid index in GenericPointer::Token + +//! Error code of parsing. +/*! \ingroup RAPIDJSON_ERRORS + \see GenericPointer::GenericPointer, GenericPointer::GetParseErrorCode +*/ +enum PointerParseErrorCode { + kPointerParseErrorNone = 0, //!< The parse is successful + + kPointerParseErrorTokenMustBeginWithSolidus, //!< A token must begin with a '/' + kPointerParseErrorInvalidEscape, //!< Invalid escape + kPointerParseErrorInvalidPercentEncoding, //!< Invalid percent encoding in URI fragment + kPointerParseErrorCharacterMustPercentEncode //!< A character must percent encoded in URI fragment +}; + +/////////////////////////////////////////////////////////////////////////////// +// GenericPointer + +//! Represents a JSON Pointer. Use Pointer for UTF8 encoding and default allocator. +/*! + This class implements RFC 6901 "JavaScript Object Notation (JSON) Pointer" + (https://tools.ietf.org/html/rfc6901). + + A JSON pointer is for identifying a specific value in a JSON document + (GenericDocument). It can simplify coding of DOM tree manipulation, because it + can access multiple-level depth of DOM tree with single API call. + + After it parses a string representation (e.g. "/foo/0" or URI fragment + representation (e.g. "#/foo/0") into its internal representation (tokens), + it can be used to resolve a specific value in multiple documents, or sub-tree + of documents. + + Contrary to GenericValue, Pointer can be copy constructed and copy assigned. + Apart from assignment, a Pointer cannot be modified after construction. + + Although Pointer is very convenient, please aware that constructing Pointer + involves parsing and dynamic memory allocation. A special constructor with user- + supplied tokens eliminates these. + + GenericPointer depends on GenericDocument and GenericValue. + + \tparam ValueType The value type of the DOM tree. E.g. GenericValue > + \tparam Allocator The allocator type for allocating memory for internal representation. + + \note GenericPointer uses same encoding of ValueType. + However, Allocator of GenericPointer is independent of Allocator of Value. +*/ +template +class GenericPointer { +public: + typedef typename ValueType::EncodingType EncodingType; //!< Encoding type from Value + typedef typename ValueType::Ch Ch; //!< Character type from Value + + //! A token is the basic units of internal representation. + /*! + A JSON pointer string representation "/foo/123" is parsed to two tokens: + "foo" and 123. 123 will be represented in both numeric form and string form. + They are resolved according to the actual value type (object or array). + + For token that are not numbers, or the numeric value is out of bound + (greater than limits of SizeType), they are only treated as string form + (i.e. the token's index will be equal to kPointerInvalidIndex). + + This struct is public so that user can create a Pointer without parsing and + allocation, using a special constructor. + */ + struct Token { + const Ch* name; //!< Name of the token. It has null character at the end but it can contain null character. + SizeType length; //!< Length of the name. + SizeType index; //!< A valid array index, if it is not equal to kPointerInvalidIndex. + }; + + //!@name Constructors and destructor. + //@{ + + //! Default constructor. + GenericPointer(Allocator* allocator = 0) : allocator_(allocator), ownAllocator_(), nameBuffer_(), tokens_(), tokenCount_(), parseErrorOffset_(), parseErrorCode_(kPointerParseErrorNone) {} + + //! Constructor that parses a string or URI fragment representation. + /*! + \param source A null-terminated, string or URI fragment representation of JSON pointer. + \param allocator User supplied allocator for this pointer. If no allocator is provided, it creates a self-owned one. + */ + explicit GenericPointer(const Ch* source, Allocator* allocator = 0) : allocator_(allocator), ownAllocator_(), nameBuffer_(), tokens_(), tokenCount_(), parseErrorOffset_(), parseErrorCode_(kPointerParseErrorNone) { + Parse(source, internal::StrLen(source)); + } + +#if RAPIDJSON_HAS_STDSTRING + //! Constructor that parses a string or URI fragment representation. + /*! + \param source A string or URI fragment representation of JSON pointer. + \param allocator User supplied allocator for this pointer. If no allocator is provided, it creates a self-owned one. + \note Requires the definition of the preprocessor symbol \ref RAPIDJSON_HAS_STDSTRING. + */ + explicit GenericPointer(const std::basic_string& source, Allocator* allocator = 0) : allocator_(allocator), ownAllocator_(), nameBuffer_(), tokens_(), tokenCount_(), parseErrorOffset_(), parseErrorCode_(kPointerParseErrorNone) { + Parse(source.c_str(), source.size()); + } +#endif + + //! Constructor that parses a string or URI fragment representation, with length of the source string. + /*! + \param source A string or URI fragment representation of JSON pointer. + \param length Length of source. + \param allocator User supplied allocator for this pointer. If no allocator is provided, it creates a self-owned one. + \note Slightly faster than the overload without length. + */ + GenericPointer(const Ch* source, size_t length, Allocator* allocator = 0) : allocator_(allocator), ownAllocator_(), nameBuffer_(), tokens_(), tokenCount_(), parseErrorOffset_(), parseErrorCode_(kPointerParseErrorNone) { + Parse(source, length); + } + + //! Constructor with user-supplied tokens. + /*! + This constructor let user supplies const array of tokens. + This prevents the parsing process and eliminates allocation. + This is preferred for memory constrained environments. + + \param tokens An constant array of tokens representing the JSON pointer. + \param tokenCount Number of tokens. + + \b Example + \code + #define NAME(s) { s, sizeof(s) / sizeof(s[0]) - 1, kPointerInvalidIndex } + #define INDEX(i) { #i, sizeof(#i) - 1, i } + + static const Pointer::Token kTokens[] = { NAME("foo"), INDEX(123) }; + static const Pointer p(kTokens, sizeof(kTokens) / sizeof(kTokens[0])); + // Equivalent to static const Pointer p("/foo/123"); + + #undef NAME + #undef INDEX + \endcode + */ + GenericPointer(const Token* tokens, size_t tokenCount) : allocator_(), ownAllocator_(), nameBuffer_(), tokens_(const_cast(tokens)), tokenCount_(tokenCount), parseErrorOffset_(), parseErrorCode_(kPointerParseErrorNone) {} + + //! Copy constructor. + GenericPointer(const GenericPointer& rhs, Allocator* allocator = 0) : allocator_(allocator), ownAllocator_(), nameBuffer_(), tokens_(), tokenCount_(), parseErrorOffset_(), parseErrorCode_(kPointerParseErrorNone) { + *this = rhs; + } + + //! Destructor. + ~GenericPointer() { + if (nameBuffer_) // If user-supplied tokens constructor is used, nameBuffer_ is nullptr and tokens_ are not deallocated. + Allocator::Free(tokens_); + RAPIDJSON_DELETE(ownAllocator_); + } + + //! Assignment operator. + GenericPointer& operator=(const GenericPointer& rhs) { + if (this != &rhs) { + // Do not delete ownAllcator + if (nameBuffer_) + Allocator::Free(tokens_); + + tokenCount_ = rhs.tokenCount_; + parseErrorOffset_ = rhs.parseErrorOffset_; + parseErrorCode_ = rhs.parseErrorCode_; + + if (rhs.nameBuffer_) + CopyFromRaw(rhs); // Normally parsed tokens. + else { + tokens_ = rhs.tokens_; // User supplied const tokens. + nameBuffer_ = 0; + } + } + return *this; + } + + //@} + + //!@name Append token + //@{ + + //! Append a token and return a new Pointer + /*! + \param token Token to be appended. + \param allocator Allocator for the newly return Pointer. + \return A new Pointer with appended token. + */ + GenericPointer Append(const Token& token, Allocator* allocator = 0) const { + GenericPointer r; + r.allocator_ = allocator; + Ch *p = r.CopyFromRaw(*this, 1, token.length + 1); + std::memcpy(p, token.name, (token.length + 1) * sizeof(Ch)); + r.tokens_[tokenCount_].name = p; + r.tokens_[tokenCount_].length = token.length; + r.tokens_[tokenCount_].index = token.index; + return r; + } + + //! Append a name token with length, and return a new Pointer + /*! + \param name Name to be appended. + \param length Length of name. + \param allocator Allocator for the newly return Pointer. + \return A new Pointer with appended token. + */ + GenericPointer Append(const Ch* name, SizeType length, Allocator* allocator = 0) const { + Token token = { name, length, kPointerInvalidIndex }; + return Append(token, allocator); + } + + //! Append a name token without length, and return a new Pointer + /*! + \param name Name (const Ch*) to be appended. + \param allocator Allocator for the newly return Pointer. + \return A new Pointer with appended token. + */ + template + RAPIDJSON_DISABLEIF_RETURN((internal::NotExpr::Type, Ch> >), (GenericPointer)) + Append(T* name, Allocator* allocator = 0) const { + return Append(name, StrLen(name), allocator); + } + +#if RAPIDJSON_HAS_STDSTRING + //! Append a name token, and return a new Pointer + /*! + \param name Name to be appended. + \param allocator Allocator for the newly return Pointer. + \return A new Pointer with appended token. + */ + GenericPointer Append(const std::basic_string& name, Allocator* allocator = 0) const { + return Append(name.c_str(), static_cast(name.size()), allocator); + } +#endif + + //! Append a index token, and return a new Pointer + /*! + \param index Index to be appended. + \param allocator Allocator for the newly return Pointer. + \return A new Pointer with appended token. + */ + GenericPointer Append(SizeType index, Allocator* allocator = 0) const { + char buffer[21]; + char* end = sizeof(SizeType) == 4 ? internal::u32toa(index, buffer) : internal::u64toa(index, buffer); + SizeType length = static_cast(end - buffer); + buffer[length] = '\0'; + + if (sizeof(Ch) == 1) { + Token token = { reinterpret_cast(buffer), length, index }; + return Append(token, allocator); + } + else { + Ch name[21]; + for (size_t i = 0; i <= length; i++) + name[i] = buffer[i]; + Token token = { name, length, index }; + return Append(token, allocator); + } + } + + //! Append a token by value, and return a new Pointer + /*! + \param token token to be appended. + \param allocator Allocator for the newly return Pointer. + \return A new Pointer with appended token. + */ + GenericPointer Append(const ValueType& token, Allocator* allocator = 0) const { + if (token.IsString()) + return Append(token.GetString(), token.GetStringLength(), allocator); + else { + RAPIDJSON_ASSERT(token.IsUint64()); + RAPIDJSON_ASSERT(token.GetUint64() <= SizeType(~0)); + return Append(static_cast(token.GetUint64()), allocator); + } + } + + //!@name Handling Parse Error + //@{ + + //! Check whether this is a valid pointer. + bool IsValid() const { return parseErrorCode_ == kPointerParseErrorNone; } + + //! Get the parsing error offset in code unit. + size_t GetParseErrorOffset() const { return parseErrorOffset_; } + + //! Get the parsing error code. + PointerParseErrorCode GetParseErrorCode() const { return parseErrorCode_; } + + //@} + + //! Get the allocator of this pointer. + Allocator& GetAllocator() { return *allocator_; } + + //!@name Tokens + //@{ + + //! Get the token array (const version only). + const Token* GetTokens() const { return tokens_; } + + //! Get the number of tokens. + size_t GetTokenCount() const { return tokenCount_; } + + //@} + + //!@name Equality/inequality operators + //@{ + + //! Equality operator. + /*! + \note When any pointers are invalid, always returns false. + */ + bool operator==(const GenericPointer& rhs) const { + if (!IsValid() || !rhs.IsValid() || tokenCount_ != rhs.tokenCount_) + return false; + + for (size_t i = 0; i < tokenCount_; i++) { + if (tokens_[i].index != rhs.tokens_[i].index || + tokens_[i].length != rhs.tokens_[i].length || + (tokens_[i].length != 0 && std::memcmp(tokens_[i].name, rhs.tokens_[i].name, sizeof(Ch)* tokens_[i].length) != 0)) + { + return false; + } + } + + return true; + } + + //! Inequality operator. + /*! + \note When any pointers are invalid, always returns true. + */ + bool operator!=(const GenericPointer& rhs) const { return !(*this == rhs); } + + //@} + + //!@name Stringify + //@{ + + //! Stringify the pointer into string representation. + /*! + \tparam OutputStream Type of output stream. + \param os The output stream. + */ + template + bool Stringify(OutputStream& os) const { + return Stringify(os); + } + + //! Stringify the pointer into URI fragment representation. + /*! + \tparam OutputStream Type of output stream. + \param os The output stream. + */ + template + bool StringifyUriFragment(OutputStream& os) const { + return Stringify(os); + } + + //@} + + //!@name Create value + //@{ + + //! Create a value in a subtree. + /*! + If the value is not exist, it creates all parent values and a JSON Null value. + So it always succeed and return the newly created or existing value. + + Remind that it may change types of parents according to tokens, so it + potentially removes previously stored values. For example, if a document + was an array, and "/foo" is used to create a value, then the document + will be changed to an object, and all existing array elements are lost. + + \param root Root value of a DOM subtree to be resolved. It can be any value other than document root. + \param allocator Allocator for creating the values if the specified value or its parents are not exist. + \param alreadyExist If non-null, it stores whether the resolved value is already exist. + \return The resolved newly created (a JSON Null value), or already exists value. + */ + ValueType& Create(ValueType& root, typename ValueType::AllocatorType& allocator, bool* alreadyExist = 0) const { + RAPIDJSON_ASSERT(IsValid()); + ValueType* v = &root; + bool exist = true; + for (const Token *t = tokens_; t != tokens_ + tokenCount_; ++t) { + if (v->IsArray() && t->name[0] == '-' && t->length == 1) { + v->PushBack(ValueType().Move(), allocator); + v = &((*v)[v->Size() - 1]); + exist = false; + } + else { + if (t->index == kPointerInvalidIndex) { // must be object name + if (!v->IsObject()) + v->SetObject(); // Change to Object + } + else { // object name or array index + if (!v->IsArray() && !v->IsObject()) + v->SetArray(); // Change to Array + } + + if (v->IsArray()) { + if (t->index >= v->Size()) { + v->Reserve(t->index + 1, allocator); + while (t->index >= v->Size()) + v->PushBack(ValueType().Move(), allocator); + exist = false; + } + v = &((*v)[t->index]); + } + else { + typename ValueType::MemberIterator m = v->FindMember(GenericStringRef(t->name, t->length)); + if (m == v->MemberEnd()) { + v->AddMember(ValueType(t->name, t->length, allocator).Move(), ValueType().Move(), allocator); + v = &(--v->MemberEnd())->value; // Assumes AddMember() appends at the end + exist = false; + } + else + v = &m->value; + } + } + } + + if (alreadyExist) + *alreadyExist = exist; + + return *v; + } + + //! Creates a value in a document. + /*! + \param document A document to be resolved. + \param alreadyExist If non-null, it stores whether the resolved value is already exist. + \return The resolved newly created, or already exists value. + */ + template + ValueType& Create(GenericDocument& document, bool* alreadyExist = 0) const { + return Create(document, document.GetAllocator(), alreadyExist); + } + + //@} + + //!@name Query value + //@{ + + //! Query a value in a subtree. + /*! + \param root Root value of a DOM sub-tree to be resolved. It can be any value other than document root. + \param unresolvedTokenIndex If the pointer cannot resolve a token in the pointer, this parameter can obtain the index of unresolved token. + \return Pointer to the value if it can be resolved. Otherwise null. + + \note + There are only 3 situations when a value cannot be resolved: + 1. A value in the path is not an array nor object. + 2. An object value does not contain the token. + 3. A token is out of range of an array value. + + Use unresolvedTokenIndex to retrieve the token index. + */ + ValueType* Get(ValueType& root, size_t* unresolvedTokenIndex = 0) const { + RAPIDJSON_ASSERT(IsValid()); + ValueType* v = &root; + for (const Token *t = tokens_; t != tokens_ + tokenCount_; ++t) { + switch (v->GetType()) { + case kObjectType: + { + typename ValueType::MemberIterator m = v->FindMember(GenericStringRef(t->name, t->length)); + if (m == v->MemberEnd()) + break; + v = &m->value; + } + continue; + case kArrayType: + if (t->index == kPointerInvalidIndex || t->index >= v->Size()) + break; + v = &((*v)[t->index]); + continue; + default: + break; + } + + // Error: unresolved token + if (unresolvedTokenIndex) + *unresolvedTokenIndex = static_cast(t - tokens_); + return 0; + } + return v; + } + + //! Query a const value in a const subtree. + /*! + \param root Root value of a DOM sub-tree to be resolved. It can be any value other than document root. + \return Pointer to the value if it can be resolved. Otherwise null. + */ + const ValueType* Get(const ValueType& root, size_t* unresolvedTokenIndex = 0) const { + return Get(const_cast(root), unresolvedTokenIndex); + } + + //@} + + //!@name Query a value with default + //@{ + + //! Query a value in a subtree with default value. + /*! + Similar to Get(), but if the specified value do not exists, it creates all parents and clone the default value. + So that this function always succeed. + + \param root Root value of a DOM sub-tree to be resolved. It can be any value other than document root. + \param defaultValue Default value to be cloned if the value was not exists. + \param allocator Allocator for creating the values if the specified value or its parents are not exist. + \see Create() + */ + ValueType& GetWithDefault(ValueType& root, const ValueType& defaultValue, typename ValueType::AllocatorType& allocator) const { + bool alreadyExist; + Value& v = Create(root, allocator, &alreadyExist); + return alreadyExist ? v : v.CopyFrom(defaultValue, allocator); + } + + //! Query a value in a subtree with default null-terminated string. + ValueType& GetWithDefault(ValueType& root, const Ch* defaultValue, typename ValueType::AllocatorType& allocator) const { + bool alreadyExist; + Value& v = Create(root, allocator, &alreadyExist); + return alreadyExist ? v : v.SetString(defaultValue, allocator); + } + +#if RAPIDJSON_HAS_STDSTRING + //! Query a value in a subtree with default std::basic_string. + ValueType& GetWithDefault(ValueType& root, const std::basic_string& defaultValue, typename ValueType::AllocatorType& allocator) const { + bool alreadyExist; + Value& v = Create(root, allocator, &alreadyExist); + return alreadyExist ? v : v.SetString(defaultValue, allocator); + } +#endif + + //! Query a value in a subtree with default primitive value. + /*! + \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t, \c bool + */ + template + RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (ValueType&)) + GetWithDefault(ValueType& root, T defaultValue, typename ValueType::AllocatorType& allocator) const { + return GetWithDefault(root, ValueType(defaultValue).Move(), allocator); + } + + //! Query a value in a document with default value. + template + ValueType& GetWithDefault(GenericDocument& document, const ValueType& defaultValue) const { + return GetWithDefault(document, defaultValue, document.GetAllocator()); + } + + //! Query a value in a document with default null-terminated string. + template + ValueType& GetWithDefault(GenericDocument& document, const Ch* defaultValue) const { + return GetWithDefault(document, defaultValue, document.GetAllocator()); + } + +#if RAPIDJSON_HAS_STDSTRING + //! Query a value in a document with default std::basic_string. + template + ValueType& GetWithDefault(GenericDocument& document, const std::basic_string& defaultValue) const { + return GetWithDefault(document, defaultValue, document.GetAllocator()); + } +#endif + + //! Query a value in a document with default primitive value. + /*! + \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t, \c bool + */ + template + RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (ValueType&)) + GetWithDefault(GenericDocument& document, T defaultValue) const { + return GetWithDefault(document, defaultValue, document.GetAllocator()); + } + + //@} + + //!@name Set a value + //@{ + + //! Set a value in a subtree, with move semantics. + /*! + It creates all parents if they are not exist or types are different to the tokens. + So this function always succeeds but potentially remove existing values. + + \param root Root value of a DOM sub-tree to be resolved. It can be any value other than document root. + \param value Value to be set. + \param allocator Allocator for creating the values if the specified value or its parents are not exist. + \see Create() + */ + ValueType& Set(ValueType& root, ValueType& value, typename ValueType::AllocatorType& allocator) const { + return Create(root, allocator) = value; + } + + //! Set a value in a subtree, with copy semantics. + ValueType& Set(ValueType& root, const ValueType& value, typename ValueType::AllocatorType& allocator) const { + return Create(root, allocator).CopyFrom(value, allocator); + } + + //! Set a null-terminated string in a subtree. + ValueType& Set(ValueType& root, const Ch* value, typename ValueType::AllocatorType& allocator) const { + return Create(root, allocator) = ValueType(value, allocator).Move(); + } + +#if RAPIDJSON_HAS_STDSTRING + //! Set a std::basic_string in a subtree. + ValueType& Set(ValueType& root, const std::basic_string& value, typename ValueType::AllocatorType& allocator) const { + return Create(root, allocator) = ValueType(value, allocator).Move(); + } +#endif + + //! Set a primitive value in a subtree. + /*! + \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t, \c bool + */ + template + RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (ValueType&)) + Set(ValueType& root, T value, typename ValueType::AllocatorType& allocator) const { + return Create(root, allocator) = ValueType(value).Move(); + } + + //! Set a value in a document, with move semantics. + template + ValueType& Set(GenericDocument& document, ValueType& value) const { + return Create(document) = value; + } + + //! Set a value in a document, with copy semantics. + template + ValueType& Set(GenericDocument& document, const ValueType& value) const { + return Create(document).CopyFrom(value, document.GetAllocator()); + } + + //! Set a null-terminated string in a document. + template + ValueType& Set(GenericDocument& document, const Ch* value) const { + return Create(document) = ValueType(value, document.GetAllocator()).Move(); + } + +#if RAPIDJSON_HAS_STDSTRING + //! Sets a std::basic_string in a document. + template + ValueType& Set(GenericDocument& document, const std::basic_string& value) const { + return Create(document) = ValueType(value, document.GetAllocator()).Move(); + } +#endif + + //! Set a primitive value in a document. + /*! + \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t, \c bool + */ + template + RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (ValueType&)) + Set(GenericDocument& document, T value) const { + return Create(document) = value; + } + + //@} + + //!@name Swap a value + //@{ + + //! Swap a value with a value in a subtree. + /*! + It creates all parents if they are not exist or types are different to the tokens. + So this function always succeeds but potentially remove existing values. + + \param root Root value of a DOM sub-tree to be resolved. It can be any value other than document root. + \param value Value to be swapped. + \param allocator Allocator for creating the values if the specified value or its parents are not exist. + \see Create() + */ + ValueType& Swap(ValueType& root, ValueType& value, typename ValueType::AllocatorType& allocator) const { + return Create(root, allocator).Swap(value); + } + + //! Swap a value with a value in a document. + template + ValueType& Swap(GenericDocument& document, ValueType& value) const { + return Create(document).Swap(value); + } + + //@} + + //! Erase a value in a subtree. + /*! + \param root Root value of a DOM sub-tree to be resolved. It can be any value other than document root. + \return Whether the resolved value is found and erased. + + \note Erasing with an empty pointer \c Pointer(""), i.e. the root, always fail and return false. + */ + bool Erase(ValueType& root) const { + RAPIDJSON_ASSERT(IsValid()); + if (tokenCount_ == 0) // Cannot erase the root + return false; + + ValueType* v = &root; + const Token* last = tokens_ + (tokenCount_ - 1); + for (const Token *t = tokens_; t != last; ++t) { + switch (v->GetType()) { + case kObjectType: + { + typename ValueType::MemberIterator m = v->FindMember(GenericStringRef(t->name, t->length)); + if (m == v->MemberEnd()) + return false; + v = &m->value; + } + break; + case kArrayType: + if (t->index == kPointerInvalidIndex || t->index >= v->Size()) + return false; + v = &((*v)[t->index]); + break; + default: + return false; + } + } + + switch (v->GetType()) { + case kObjectType: + return v->EraseMember(GenericStringRef(last->name, last->length)); + case kArrayType: + if (last->index == kPointerInvalidIndex || last->index >= v->Size()) + return false; + v->Erase(v->Begin() + last->index); + return true; + default: + return false; + } + } + +private: + //! Clone the content from rhs to this. + /*! + \param rhs Source pointer. + \param extraToken Extra tokens to be allocated. + \param extraNameBufferSize Extra name buffer size (in number of Ch) to be allocated. + \return Start of non-occupied name buffer, for storing extra names. + */ + Ch* CopyFromRaw(const GenericPointer& rhs, size_t extraToken = 0, size_t extraNameBufferSize = 0) { + if (!allocator_) // allocator is independently owned. + ownAllocator_ = allocator_ = RAPIDJSON_NEW(Allocator()); + + size_t nameBufferSize = rhs.tokenCount_; // null terminators for tokens + for (Token *t = rhs.tokens_; t != rhs.tokens_ + rhs.tokenCount_; ++t) + nameBufferSize += t->length; + + tokenCount_ = rhs.tokenCount_ + extraToken; + tokens_ = static_cast(allocator_->Malloc(tokenCount_ * sizeof(Token) + (nameBufferSize + extraNameBufferSize) * sizeof(Ch))); + nameBuffer_ = reinterpret_cast(tokens_ + tokenCount_); + if (rhs.tokenCount_ > 0) { + std::memcpy(tokens_, rhs.tokens_, rhs.tokenCount_ * sizeof(Token)); + } + if (nameBufferSize > 0) { + std::memcpy(nameBuffer_, rhs.nameBuffer_, nameBufferSize * sizeof(Ch)); + } + + // Adjust pointers to name buffer + std::ptrdiff_t diff = nameBuffer_ - rhs.nameBuffer_; + for (Token *t = tokens_; t != tokens_ + rhs.tokenCount_; ++t) + t->name += diff; + + return nameBuffer_ + nameBufferSize; + } + + //! Check whether a character should be percent-encoded. + /*! + According to RFC 3986 2.3 Unreserved Characters. + \param c The character (code unit) to be tested. + */ + bool NeedPercentEncode(Ch c) const { + return !((c >= '0' && c <= '9') || (c >= 'A' && c <='Z') || (c >= 'a' && c <= 'z') || c == '-' || c == '.' || c == '_' || c =='~'); + } + + //! Parse a JSON String or its URI fragment representation into tokens. +#ifndef __clang__ // -Wdocumentation + /*! + \param source Either a JSON Pointer string, or its URI fragment representation. Not need to be null terminated. + \param length Length of the source string. + \note Source cannot be JSON String Representation of JSON Pointer, e.g. In "/\u0000", \u0000 will not be unescaped. + */ +#endif + void Parse(const Ch* source, size_t length) { + RAPIDJSON_ASSERT(source != NULL); + RAPIDJSON_ASSERT(nameBuffer_ == 0); + RAPIDJSON_ASSERT(tokens_ == 0); + + // Create own allocator if user did not supply. + if (!allocator_) + ownAllocator_ = allocator_ = RAPIDJSON_NEW(Allocator()); + + // Count number of '/' as tokenCount + tokenCount_ = 0; + for (const Ch* s = source; s != source + length; s++) + if (*s == '/') + tokenCount_++; + + Token* token = tokens_ = static_cast(allocator_->Malloc(tokenCount_ * sizeof(Token) + length * sizeof(Ch))); + Ch* name = nameBuffer_ = reinterpret_cast(tokens_ + tokenCount_); + size_t i = 0; + + // Detect if it is a URI fragment + bool uriFragment = false; + if (source[i] == '#') { + uriFragment = true; + i++; + } + + if (i != length && source[i] != '/') { + parseErrorCode_ = kPointerParseErrorTokenMustBeginWithSolidus; + goto error; + } + + while (i < length) { + RAPIDJSON_ASSERT(source[i] == '/'); + i++; // consumes '/' + + token->name = name; + bool isNumber = true; + + while (i < length && source[i] != '/') { + Ch c = source[i]; + if (uriFragment) { + // Decoding percent-encoding for URI fragment + if (c == '%') { + PercentDecodeStream is(&source[i], source + length); + GenericInsituStringStream os(name); + Ch* begin = os.PutBegin(); + if (!Transcoder, EncodingType>().Validate(is, os) || !is.IsValid()) { + parseErrorCode_ = kPointerParseErrorInvalidPercentEncoding; + goto error; + } + size_t len = os.PutEnd(begin); + i += is.Tell() - 1; + if (len == 1) + c = *name; + else { + name += len; + isNumber = false; + i++; + continue; + } + } + else if (NeedPercentEncode(c)) { + parseErrorCode_ = kPointerParseErrorCharacterMustPercentEncode; + goto error; + } + } + + i++; + + // Escaping "~0" -> '~', "~1" -> '/' + if (c == '~') { + if (i < length) { + c = source[i]; + if (c == '0') c = '~'; + else if (c == '1') c = '/'; + else { + parseErrorCode_ = kPointerParseErrorInvalidEscape; + goto error; + } + i++; + } + else { + parseErrorCode_ = kPointerParseErrorInvalidEscape; + goto error; + } + } + + // First check for index: all of characters are digit + if (c < '0' || c > '9') + isNumber = false; + + *name++ = c; + } + token->length = static_cast(name - token->name); + if (token->length == 0) + isNumber = false; + *name++ = '\0'; // Null terminator + + // Second check for index: more than one digit cannot have leading zero + if (isNumber && token->length > 1 && token->name[0] == '0') + isNumber = false; + + // String to SizeType conversion + SizeType n = 0; + if (isNumber) { + for (size_t j = 0; j < token->length; j++) { + SizeType m = n * 10 + static_cast(token->name[j] - '0'); + if (m < n) { // overflow detection + isNumber = false; + break; + } + n = m; + } + } + + token->index = isNumber ? n : kPointerInvalidIndex; + token++; + } + + RAPIDJSON_ASSERT(name <= nameBuffer_ + length); // Should not overflow buffer + parseErrorCode_ = kPointerParseErrorNone; + return; + + error: + Allocator::Free(tokens_); + nameBuffer_ = 0; + tokens_ = 0; + tokenCount_ = 0; + parseErrorOffset_ = i; + return; + } + + //! Stringify to string or URI fragment representation. + /*! + \tparam uriFragment True for stringifying to URI fragment representation. False for string representation. + \tparam OutputStream type of output stream. + \param os The output stream. + */ + template + bool Stringify(OutputStream& os) const { + RAPIDJSON_ASSERT(IsValid()); + + if (uriFragment) + os.Put('#'); + + for (Token *t = tokens_; t != tokens_ + tokenCount_; ++t) { + os.Put('/'); + for (size_t j = 0; j < t->length; j++) { + Ch c = t->name[j]; + if (c == '~') { + os.Put('~'); + os.Put('0'); + } + else if (c == '/') { + os.Put('~'); + os.Put('1'); + } + else if (uriFragment && NeedPercentEncode(c)) { + // Transcode to UTF8 sequence + GenericStringStream source(&t->name[j]); + PercentEncodeStream target(os); + if (!Transcoder >().Validate(source, target)) + return false; + j += source.Tell() - 1; + } + else + os.Put(c); + } + } + return true; + } + + //! A helper stream for decoding a percent-encoded sequence into code unit. + /*! + This stream decodes %XY triplet into code unit (0-255). + If it encounters invalid characters, it sets output code unit as 0 and + mark invalid, and to be checked by IsValid(). + */ + class PercentDecodeStream { + public: + typedef typename ValueType::Ch Ch; + + //! Constructor + /*! + \param source Start of the stream + \param end Past-the-end of the stream. + */ + PercentDecodeStream(const Ch* source, const Ch* end) : src_(source), head_(source), end_(end), valid_(true) {} + + Ch Take() { + if (*src_ != '%' || src_ + 3 > end_) { // %XY triplet + valid_ = false; + return 0; + } + src_++; + Ch c = 0; + for (int j = 0; j < 2; j++) { + c = static_cast(c << 4); + Ch h = *src_; + if (h >= '0' && h <= '9') c = static_cast(c + h - '0'); + else if (h >= 'A' && h <= 'F') c = static_cast(c + h - 'A' + 10); + else if (h >= 'a' && h <= 'f') c = static_cast(c + h - 'a' + 10); + else { + valid_ = false; + return 0; + } + src_++; + } + return c; + } + + size_t Tell() const { return static_cast(src_ - head_); } + bool IsValid() const { return valid_; } + + private: + const Ch* src_; //!< Current read position. + const Ch* head_; //!< Original head of the string. + const Ch* end_; //!< Past-the-end position. + bool valid_; //!< Whether the parsing is valid. + }; + + //! A helper stream to encode character (UTF-8 code unit) into percent-encoded sequence. + template + class PercentEncodeStream { + public: + PercentEncodeStream(OutputStream& os) : os_(os) {} + void Put(char c) { // UTF-8 must be byte + unsigned char u = static_cast(c); + static const char hexDigits[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; + os_.Put('%'); + os_.Put(hexDigits[u >> 4]); + os_.Put(hexDigits[u & 15]); + } + private: + OutputStream& os_; + }; + + Allocator* allocator_; //!< The current allocator. It is either user-supplied or equal to ownAllocator_. + Allocator* ownAllocator_; //!< Allocator owned by this Pointer. + Ch* nameBuffer_; //!< A buffer containing all names in tokens. + Token* tokens_; //!< A list of tokens. + size_t tokenCount_; //!< Number of tokens in tokens_. + size_t parseErrorOffset_; //!< Offset in code unit when parsing fail. + PointerParseErrorCode parseErrorCode_; //!< Parsing error code. +}; + +//! GenericPointer for Value (UTF-8, default allocator). +typedef GenericPointer Pointer; + +//!@name Helper functions for GenericPointer +//@{ + +////////////////////////////////////////////////////////////////////////////// + +template +typename T::ValueType& CreateValueByPointer(T& root, const GenericPointer& pointer, typename T::AllocatorType& a) { + return pointer.Create(root, a); +} + +template +typename T::ValueType& CreateValueByPointer(T& root, const CharType(&source)[N], typename T::AllocatorType& a) { + return GenericPointer(source, N - 1).Create(root, a); +} + +// No allocator parameter + +template +typename DocumentType::ValueType& CreateValueByPointer(DocumentType& document, const GenericPointer& pointer) { + return pointer.Create(document); +} + +template +typename DocumentType::ValueType& CreateValueByPointer(DocumentType& document, const CharType(&source)[N]) { + return GenericPointer(source, N - 1).Create(document); +} + +////////////////////////////////////////////////////////////////////////////// + +template +typename T::ValueType* GetValueByPointer(T& root, const GenericPointer& pointer, size_t* unresolvedTokenIndex = 0) { + return pointer.Get(root, unresolvedTokenIndex); +} + +template +const typename T::ValueType* GetValueByPointer(const T& root, const GenericPointer& pointer, size_t* unresolvedTokenIndex = 0) { + return pointer.Get(root, unresolvedTokenIndex); +} + +template +typename T::ValueType* GetValueByPointer(T& root, const CharType (&source)[N], size_t* unresolvedTokenIndex = 0) { + return GenericPointer(source, N - 1).Get(root, unresolvedTokenIndex); +} + +template +const typename T::ValueType* GetValueByPointer(const T& root, const CharType(&source)[N], size_t* unresolvedTokenIndex = 0) { + return GenericPointer(source, N - 1).Get(root, unresolvedTokenIndex); +} + +////////////////////////////////////////////////////////////////////////////// + +template +typename T::ValueType& GetValueByPointerWithDefault(T& root, const GenericPointer& pointer, const typename T::ValueType& defaultValue, typename T::AllocatorType& a) { + return pointer.GetWithDefault(root, defaultValue, a); +} + +template +typename T::ValueType& GetValueByPointerWithDefault(T& root, const GenericPointer& pointer, const typename T::Ch* defaultValue, typename T::AllocatorType& a) { + return pointer.GetWithDefault(root, defaultValue, a); +} + +#if RAPIDJSON_HAS_STDSTRING +template +typename T::ValueType& GetValueByPointerWithDefault(T& root, const GenericPointer& pointer, const std::basic_string& defaultValue, typename T::AllocatorType& a) { + return pointer.GetWithDefault(root, defaultValue, a); +} +#endif + +template +RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (typename T::ValueType&)) +GetValueByPointerWithDefault(T& root, const GenericPointer& pointer, T2 defaultValue, typename T::AllocatorType& a) { + return pointer.GetWithDefault(root, defaultValue, a); +} + +template +typename T::ValueType& GetValueByPointerWithDefault(T& root, const CharType(&source)[N], const typename T::ValueType& defaultValue, typename T::AllocatorType& a) { + return GenericPointer(source, N - 1).GetWithDefault(root, defaultValue, a); +} + +template +typename T::ValueType& GetValueByPointerWithDefault(T& root, const CharType(&source)[N], const typename T::Ch* defaultValue, typename T::AllocatorType& a) { + return GenericPointer(source, N - 1).GetWithDefault(root, defaultValue, a); +} + +#if RAPIDJSON_HAS_STDSTRING +template +typename T::ValueType& GetValueByPointerWithDefault(T& root, const CharType(&source)[N], const std::basic_string& defaultValue, typename T::AllocatorType& a) { + return GenericPointer(source, N - 1).GetWithDefault(root, defaultValue, a); +} +#endif + +template +RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (typename T::ValueType&)) +GetValueByPointerWithDefault(T& root, const CharType(&source)[N], T2 defaultValue, typename T::AllocatorType& a) { + return GenericPointer(source, N - 1).GetWithDefault(root, defaultValue, a); +} + +// No allocator parameter + +template +typename DocumentType::ValueType& GetValueByPointerWithDefault(DocumentType& document, const GenericPointer& pointer, const typename DocumentType::ValueType& defaultValue) { + return pointer.GetWithDefault(document, defaultValue); +} + +template +typename DocumentType::ValueType& GetValueByPointerWithDefault(DocumentType& document, const GenericPointer& pointer, const typename DocumentType::Ch* defaultValue) { + return pointer.GetWithDefault(document, defaultValue); +} + +#if RAPIDJSON_HAS_STDSTRING +template +typename DocumentType::ValueType& GetValueByPointerWithDefault(DocumentType& document, const GenericPointer& pointer, const std::basic_string& defaultValue) { + return pointer.GetWithDefault(document, defaultValue); +} +#endif + +template +RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (typename DocumentType::ValueType&)) +GetValueByPointerWithDefault(DocumentType& document, const GenericPointer& pointer, T2 defaultValue) { + return pointer.GetWithDefault(document, defaultValue); +} + +template +typename DocumentType::ValueType& GetValueByPointerWithDefault(DocumentType& document, const CharType(&source)[N], const typename DocumentType::ValueType& defaultValue) { + return GenericPointer(source, N - 1).GetWithDefault(document, defaultValue); +} + +template +typename DocumentType::ValueType& GetValueByPointerWithDefault(DocumentType& document, const CharType(&source)[N], const typename DocumentType::Ch* defaultValue) { + return GenericPointer(source, N - 1).GetWithDefault(document, defaultValue); +} + +#if RAPIDJSON_HAS_STDSTRING +template +typename DocumentType::ValueType& GetValueByPointerWithDefault(DocumentType& document, const CharType(&source)[N], const std::basic_string& defaultValue) { + return GenericPointer(source, N - 1).GetWithDefault(document, defaultValue); +} +#endif + +template +RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (typename DocumentType::ValueType&)) +GetValueByPointerWithDefault(DocumentType& document, const CharType(&source)[N], T2 defaultValue) { + return GenericPointer(source, N - 1).GetWithDefault(document, defaultValue); +} + +////////////////////////////////////////////////////////////////////////////// + +template +typename T::ValueType& SetValueByPointer(T& root, const GenericPointer& pointer, typename T::ValueType& value, typename T::AllocatorType& a) { + return pointer.Set(root, value, a); +} + +template +typename T::ValueType& SetValueByPointer(T& root, const GenericPointer& pointer, const typename T::ValueType& value, typename T::AllocatorType& a) { + return pointer.Set(root, value, a); +} + +template +typename T::ValueType& SetValueByPointer(T& root, const GenericPointer& pointer, const typename T::Ch* value, typename T::AllocatorType& a) { + return pointer.Set(root, value, a); +} + +#if RAPIDJSON_HAS_STDSTRING +template +typename T::ValueType& SetValueByPointer(T& root, const GenericPointer& pointer, const std::basic_string& value, typename T::AllocatorType& a) { + return pointer.Set(root, value, a); +} +#endif + +template +RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (typename T::ValueType&)) +SetValueByPointer(T& root, const GenericPointer& pointer, T2 value, typename T::AllocatorType& a) { + return pointer.Set(root, value, a); +} + +template +typename T::ValueType& SetValueByPointer(T& root, const CharType(&source)[N], typename T::ValueType& value, typename T::AllocatorType& a) { + return GenericPointer(source, N - 1).Set(root, value, a); +} + +template +typename T::ValueType& SetValueByPointer(T& root, const CharType(&source)[N], const typename T::ValueType& value, typename T::AllocatorType& a) { + return GenericPointer(source, N - 1).Set(root, value, a); +} + +template +typename T::ValueType& SetValueByPointer(T& root, const CharType(&source)[N], const typename T::Ch* value, typename T::AllocatorType& a) { + return GenericPointer(source, N - 1).Set(root, value, a); +} + +#if RAPIDJSON_HAS_STDSTRING +template +typename T::ValueType& SetValueByPointer(T& root, const CharType(&source)[N], const std::basic_string& value, typename T::AllocatorType& a) { + return GenericPointer(source, N - 1).Set(root, value, a); +} +#endif + +template +RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (typename T::ValueType&)) +SetValueByPointer(T& root, const CharType(&source)[N], T2 value, typename T::AllocatorType& a) { + return GenericPointer(source, N - 1).Set(root, value, a); +} + +// No allocator parameter + +template +typename DocumentType::ValueType& SetValueByPointer(DocumentType& document, const GenericPointer& pointer, typename DocumentType::ValueType& value) { + return pointer.Set(document, value); +} + +template +typename DocumentType::ValueType& SetValueByPointer(DocumentType& document, const GenericPointer& pointer, const typename DocumentType::ValueType& value) { + return pointer.Set(document, value); +} + +template +typename DocumentType::ValueType& SetValueByPointer(DocumentType& document, const GenericPointer& pointer, const typename DocumentType::Ch* value) { + return pointer.Set(document, value); +} + +#if RAPIDJSON_HAS_STDSTRING +template +typename DocumentType::ValueType& SetValueByPointer(DocumentType& document, const GenericPointer& pointer, const std::basic_string& value) { + return pointer.Set(document, value); +} +#endif + +template +RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (typename DocumentType::ValueType&)) +SetValueByPointer(DocumentType& document, const GenericPointer& pointer, T2 value) { + return pointer.Set(document, value); +} + +template +typename DocumentType::ValueType& SetValueByPointer(DocumentType& document, const CharType(&source)[N], typename DocumentType::ValueType& value) { + return GenericPointer(source, N - 1).Set(document, value); +} + +template +typename DocumentType::ValueType& SetValueByPointer(DocumentType& document, const CharType(&source)[N], const typename DocumentType::ValueType& value) { + return GenericPointer(source, N - 1).Set(document, value); +} + +template +typename DocumentType::ValueType& SetValueByPointer(DocumentType& document, const CharType(&source)[N], const typename DocumentType::Ch* value) { + return GenericPointer(source, N - 1).Set(document, value); +} + +#if RAPIDJSON_HAS_STDSTRING +template +typename DocumentType::ValueType& SetValueByPointer(DocumentType& document, const CharType(&source)[N], const std::basic_string& value) { + return GenericPointer(source, N - 1).Set(document, value); +} +#endif + +template +RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr, internal::IsGenericValue >), (typename DocumentType::ValueType&)) +SetValueByPointer(DocumentType& document, const CharType(&source)[N], T2 value) { + return GenericPointer(source, N - 1).Set(document, value); +} + +////////////////////////////////////////////////////////////////////////////// + +template +typename T::ValueType& SwapValueByPointer(T& root, const GenericPointer& pointer, typename T::ValueType& value, typename T::AllocatorType& a) { + return pointer.Swap(root, value, a); +} + +template +typename T::ValueType& SwapValueByPointer(T& root, const CharType(&source)[N], typename T::ValueType& value, typename T::AllocatorType& a) { + return GenericPointer(source, N - 1).Swap(root, value, a); +} + +template +typename DocumentType::ValueType& SwapValueByPointer(DocumentType& document, const GenericPointer& pointer, typename DocumentType::ValueType& value) { + return pointer.Swap(document, value); +} + +template +typename DocumentType::ValueType& SwapValueByPointer(DocumentType& document, const CharType(&source)[N], typename DocumentType::ValueType& value) { + return GenericPointer(source, N - 1).Swap(document, value); +} + +////////////////////////////////////////////////////////////////////////////// + +template +bool EraseValueByPointer(T& root, const GenericPointer& pointer) { + return pointer.Erase(root); +} + +template +bool EraseValueByPointer(T& root, const CharType(&source)[N]) { + return GenericPointer(source, N - 1).Erase(root); +} + +//@} + +RAPIDJSON_NAMESPACE_END + +#ifdef __clang__ +RAPIDJSON_DIAG_POP +#endif + +#ifdef _MSC_VER +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_POINTER_H_ diff --git a/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/prettywriter.h b/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/prettywriter.h new file mode 100644 index 0000000..0dcb0fe --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/prettywriter.h @@ -0,0 +1,255 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_PRETTYWRITER_H_ +#define RAPIDJSON_PRETTYWRITER_H_ + +#include "writer.h" + +#ifdef __GNUC__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(effc++) +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +//! Combination of PrettyWriter format flags. +/*! \see PrettyWriter::SetFormatOptions + */ +enum PrettyFormatOptions { + kFormatDefault = 0, //!< Default pretty formatting. + kFormatSingleLineArray = 1 //!< Format arrays on a single line. +}; + +//! Writer with indentation and spacing. +/*! + \tparam OutputStream Type of ouptut os. + \tparam SourceEncoding Encoding of source string. + \tparam TargetEncoding Encoding of output stream. + \tparam StackAllocator Type of allocator for allocating memory of stack. +*/ +template, typename TargetEncoding = UTF8<>, typename StackAllocator = CrtAllocator, unsigned writeFlags = kWriteDefaultFlags> +class PrettyWriter : public Writer { +public: + typedef Writer Base; + typedef typename Base::Ch Ch; + + //! Constructor + /*! \param os Output stream. + \param allocator User supplied allocator. If it is null, it will create a private one. + \param levelDepth Initial capacity of stack. + */ + explicit PrettyWriter(OutputStream& os, StackAllocator* allocator = 0, size_t levelDepth = Base::kDefaultLevelDepth) : + Base(os, allocator, levelDepth), indentChar_(' '), indentCharCount_(4), formatOptions_(kFormatDefault) {} + + + explicit PrettyWriter(StackAllocator* allocator = 0, size_t levelDepth = Base::kDefaultLevelDepth) : + Base(allocator, levelDepth), indentChar_(' '), indentCharCount_(4) {} + + //! Set custom indentation. + /*! \param indentChar Character for indentation. Must be whitespace character (' ', '\\t', '\\n', '\\r'). + \param indentCharCount Number of indent characters for each indentation level. + \note The default indentation is 4 spaces. + */ + PrettyWriter& SetIndent(Ch indentChar, unsigned indentCharCount) { + RAPIDJSON_ASSERT(indentChar == ' ' || indentChar == '\t' || indentChar == '\n' || indentChar == '\r'); + indentChar_ = indentChar; + indentCharCount_ = indentCharCount; + return *this; + } + + //! Set pretty writer formatting options. + /*! \param options Formatting options. + */ + PrettyWriter& SetFormatOptions(PrettyFormatOptions options) { + formatOptions_ = options; + return *this; + } + + /*! @name Implementation of Handler + \see Handler + */ + //@{ + + bool Null() { PrettyPrefix(kNullType); return Base::WriteNull(); } + bool Bool(bool b) { PrettyPrefix(b ? kTrueType : kFalseType); return Base::WriteBool(b); } + bool Int(int i) { PrettyPrefix(kNumberType); return Base::WriteInt(i); } + bool Uint(unsigned u) { PrettyPrefix(kNumberType); return Base::WriteUint(u); } + bool Int64(int64_t i64) { PrettyPrefix(kNumberType); return Base::WriteInt64(i64); } + bool Uint64(uint64_t u64) { PrettyPrefix(kNumberType); return Base::WriteUint64(u64); } + bool Double(double d) { PrettyPrefix(kNumberType); return Base::WriteDouble(d); } + + bool RawNumber(const Ch* str, SizeType length, bool copy = false) { + (void)copy; + PrettyPrefix(kNumberType); + return Base::WriteString(str, length); + } + + bool String(const Ch* str, SizeType length, bool copy = false) { + (void)copy; + PrettyPrefix(kStringType); + return Base::WriteString(str, length); + } + +#if RAPIDJSON_HAS_STDSTRING + bool String(const std::basic_string& str) { + return String(str.data(), SizeType(str.size())); + } +#endif + + bool StartObject() { + PrettyPrefix(kObjectType); + new (Base::level_stack_.template Push()) typename Base::Level(false); + return Base::WriteStartObject(); + } + + bool Key(const Ch* str, SizeType length, bool copy = false) { return String(str, length, copy); } + +#if RAPIDJSON_HAS_STDSTRING + bool Key(const std::basic_string& str) { + return Key(str.data(), SizeType(str.size())); + } +#endif + + bool EndObject(SizeType memberCount = 0) { + (void)memberCount; + RAPIDJSON_ASSERT(Base::level_stack_.GetSize() >= sizeof(typename Base::Level)); + RAPIDJSON_ASSERT(!Base::level_stack_.template Top()->inArray); + bool empty = Base::level_stack_.template Pop(1)->valueCount == 0; + + if (!empty) { + Base::os_->Put('\n'); + WriteIndent(); + } + bool ret = Base::WriteEndObject(); + (void)ret; + RAPIDJSON_ASSERT(ret == true); + if (Base::level_stack_.Empty()) // end of json text + Base::os_->Flush(); + return true; + } + + bool StartArray() { + PrettyPrefix(kArrayType); + new (Base::level_stack_.template Push()) typename Base::Level(true); + return Base::WriteStartArray(); + } + + bool EndArray(SizeType memberCount = 0) { + (void)memberCount; + RAPIDJSON_ASSERT(Base::level_stack_.GetSize() >= sizeof(typename Base::Level)); + RAPIDJSON_ASSERT(Base::level_stack_.template Top()->inArray); + bool empty = Base::level_stack_.template Pop(1)->valueCount == 0; + + if (!empty && !(formatOptions_ & kFormatSingleLineArray)) { + Base::os_->Put('\n'); + WriteIndent(); + } + bool ret = Base::WriteEndArray(); + (void)ret; + RAPIDJSON_ASSERT(ret == true); + if (Base::level_stack_.Empty()) // end of json text + Base::os_->Flush(); + return true; + } + + //@} + + /*! @name Convenience extensions */ + //@{ + + //! Simpler but slower overload. + bool String(const Ch* str) { return String(str, internal::StrLen(str)); } + bool Key(const Ch* str) { return Key(str, internal::StrLen(str)); } + + //@} + + //! Write a raw JSON value. + /*! + For user to write a stringified JSON as a value. + + \param json A well-formed JSON value. It should not contain null character within [0, length - 1] range. + \param length Length of the json. + \param type Type of the root of json. + \note When using PrettyWriter::RawValue(), the result json may not be indented correctly. + */ + bool RawValue(const Ch* json, size_t length, Type type) { PrettyPrefix(type); return Base::WriteRawValue(json, length); } + +protected: + void PrettyPrefix(Type type) { + (void)type; + if (Base::level_stack_.GetSize() != 0) { // this value is not at root + typename Base::Level* level = Base::level_stack_.template Top(); + + if (level->inArray) { + if (level->valueCount > 0) { + Base::os_->Put(','); // add comma if it is not the first element in array + if (formatOptions_ & kFormatSingleLineArray) + Base::os_->Put(' '); + } + + if (!(formatOptions_ & kFormatSingleLineArray)) { + Base::os_->Put('\n'); + WriteIndent(); + } + } + else { // in object + if (level->valueCount > 0) { + if (level->valueCount % 2 == 0) { + Base::os_->Put(','); + Base::os_->Put('\n'); + } + else { + Base::os_->Put(':'); + Base::os_->Put(' '); + } + } + else + Base::os_->Put('\n'); + + if (level->valueCount % 2 == 0) + WriteIndent(); + } + if (!level->inArray && level->valueCount % 2 == 0) + RAPIDJSON_ASSERT(type == kStringType); // if it's in object, then even number should be a name + level->valueCount++; + } + else { + RAPIDJSON_ASSERT(!Base::hasRoot_); // Should only has one and only one root. + Base::hasRoot_ = true; + } + } + + void WriteIndent() { + size_t count = (Base::level_stack_.GetSize() / sizeof(typename Base::Level)) * indentCharCount_; + PutN(*Base::os_, static_cast(indentChar_), count); + } + + Ch indentChar_; + unsigned indentCharCount_; + PrettyFormatOptions formatOptions_; + +private: + // Prohibit copy constructor & assignment operator. + PrettyWriter(const PrettyWriter&); + PrettyWriter& operator=(const PrettyWriter&); +}; + +RAPIDJSON_NAMESPACE_END + +#ifdef __GNUC__ +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_RAPIDJSON_H_ diff --git a/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/rapidjson.h b/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/rapidjson.h new file mode 100644 index 0000000..053b2ce --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/rapidjson.h @@ -0,0 +1,615 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_RAPIDJSON_H_ +#define RAPIDJSON_RAPIDJSON_H_ + +/*!\file rapidjson.h + \brief common definitions and configuration + + \see RAPIDJSON_CONFIG + */ + +/*! \defgroup RAPIDJSON_CONFIG RapidJSON configuration + \brief Configuration macros for library features + + Some RapidJSON features are configurable to adapt the library to a wide + variety of platforms, environments and usage scenarios. Most of the + features can be configured in terms of overriden or predefined + preprocessor macros at compile-time. + + Some additional customization is available in the \ref RAPIDJSON_ERRORS APIs. + + \note These macros should be given on the compiler command-line + (where applicable) to avoid inconsistent values when compiling + different translation units of a single application. + */ + +#include // malloc(), realloc(), free(), size_t +#include // memset(), memcpy(), memmove(), memcmp() + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_VERSION_STRING +// +// ALWAYS synchronize the following 3 macros with corresponding variables in /CMakeLists.txt. +// + +//!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN +// token stringification +#define RAPIDJSON_STRINGIFY(x) RAPIDJSON_DO_STRINGIFY(x) +#define RAPIDJSON_DO_STRINGIFY(x) #x +//!@endcond + +/*! \def RAPIDJSON_MAJOR_VERSION + \ingroup RAPIDJSON_CONFIG + \brief Major version of RapidJSON in integer. +*/ +/*! \def RAPIDJSON_MINOR_VERSION + \ingroup RAPIDJSON_CONFIG + \brief Minor version of RapidJSON in integer. +*/ +/*! \def RAPIDJSON_PATCH_VERSION + \ingroup RAPIDJSON_CONFIG + \brief Patch version of RapidJSON in integer. +*/ +/*! \def RAPIDJSON_VERSION_STRING + \ingroup RAPIDJSON_CONFIG + \brief Version of RapidJSON in ".." string format. +*/ +#define RAPIDJSON_MAJOR_VERSION 1 +#define RAPIDJSON_MINOR_VERSION 1 +#define RAPIDJSON_PATCH_VERSION 0 +#define RAPIDJSON_VERSION_STRING \ + RAPIDJSON_STRINGIFY(RAPIDJSON_MAJOR_VERSION.RAPIDJSON_MINOR_VERSION.RAPIDJSON_PATCH_VERSION) + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_NAMESPACE_(BEGIN|END) +/*! \def RAPIDJSON_NAMESPACE + \ingroup RAPIDJSON_CONFIG + \brief provide custom rapidjson namespace + + In order to avoid symbol clashes and/or "One Definition Rule" errors + between multiple inclusions of (different versions of) RapidJSON in + a single binary, users can customize the name of the main RapidJSON + namespace. + + In case of a single nesting level, defining \c RAPIDJSON_NAMESPACE + to a custom name (e.g. \c MyRapidJSON) is sufficient. If multiple + levels are needed, both \ref RAPIDJSON_NAMESPACE_BEGIN and \ref + RAPIDJSON_NAMESPACE_END need to be defined as well: + + \code + // in some .cpp file + #define RAPIDJSON_NAMESPACE my::rapidjson + #define RAPIDJSON_NAMESPACE_BEGIN namespace my { namespace rapidjson { + #define RAPIDJSON_NAMESPACE_END } } + #include "rapidjson/..." + \endcode + + \see rapidjson + */ +/*! \def RAPIDJSON_NAMESPACE_BEGIN + \ingroup RAPIDJSON_CONFIG + \brief provide custom rapidjson namespace (opening expression) + \see RAPIDJSON_NAMESPACE +*/ +/*! \def RAPIDJSON_NAMESPACE_END + \ingroup RAPIDJSON_CONFIG + \brief provide custom rapidjson namespace (closing expression) + \see RAPIDJSON_NAMESPACE +*/ +#ifndef RAPIDJSON_NAMESPACE +#define RAPIDJSON_NAMESPACE rapidjson +#endif +#ifndef RAPIDJSON_NAMESPACE_BEGIN +#define RAPIDJSON_NAMESPACE_BEGIN namespace RAPIDJSON_NAMESPACE { +#endif +#ifndef RAPIDJSON_NAMESPACE_END +#define RAPIDJSON_NAMESPACE_END } +#endif + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_HAS_STDSTRING + +#ifndef RAPIDJSON_HAS_STDSTRING +#ifdef RAPIDJSON_DOXYGEN_RUNNING +#define RAPIDJSON_HAS_STDSTRING 1 // force generation of documentation +#else +#define RAPIDJSON_HAS_STDSTRING 0 // no std::string support by default +#endif +/*! \def RAPIDJSON_HAS_STDSTRING + \ingroup RAPIDJSON_CONFIG + \brief Enable RapidJSON support for \c std::string + + By defining this preprocessor symbol to \c 1, several convenience functions for using + \ref rapidjson::GenericValue with \c std::string are enabled, especially + for construction and comparison. + + \hideinitializer +*/ +#endif // !defined(RAPIDJSON_HAS_STDSTRING) + +#if RAPIDJSON_HAS_STDSTRING +#include +#endif // RAPIDJSON_HAS_STDSTRING + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_NO_INT64DEFINE + +/*! \def RAPIDJSON_NO_INT64DEFINE + \ingroup RAPIDJSON_CONFIG + \brief Use external 64-bit integer types. + + RapidJSON requires the 64-bit integer types \c int64_t and \c uint64_t types + to be available at global scope. + + If users have their own definition, define RAPIDJSON_NO_INT64DEFINE to + prevent RapidJSON from defining its own types. +*/ +#ifndef RAPIDJSON_NO_INT64DEFINE +//!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN +#if defined(_MSC_VER) && (_MSC_VER < 1800) // Visual Studio 2013 +#include "msinttypes/stdint.h" +#include "msinttypes/inttypes.h" +#else +// Other compilers should have this. +#include +#include +#endif +//!@endcond +#ifdef RAPIDJSON_DOXYGEN_RUNNING +#define RAPIDJSON_NO_INT64DEFINE +#endif +#endif // RAPIDJSON_NO_INT64TYPEDEF + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_FORCEINLINE + +#ifndef RAPIDJSON_FORCEINLINE +//!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN +#if defined(_MSC_VER) && defined(NDEBUG) +#define RAPIDJSON_FORCEINLINE __forceinline +#elif defined(__GNUC__) && __GNUC__ >= 4 && defined(NDEBUG) +#define RAPIDJSON_FORCEINLINE __attribute__((always_inline)) +#else +#define RAPIDJSON_FORCEINLINE +#endif +//!@endcond +#endif // RAPIDJSON_FORCEINLINE + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_ENDIAN +#define RAPIDJSON_LITTLEENDIAN 0 //!< Little endian machine +#define RAPIDJSON_BIGENDIAN 1 //!< Big endian machine + +//! Endianness of the machine. +/*! + \def RAPIDJSON_ENDIAN + \ingroup RAPIDJSON_CONFIG + + GCC 4.6 provided macro for detecting endianness of the target machine. But other + compilers may not have this. User can define RAPIDJSON_ENDIAN to either + \ref RAPIDJSON_LITTLEENDIAN or \ref RAPIDJSON_BIGENDIAN. + + Default detection implemented with reference to + \li https://gcc.gnu.org/onlinedocs/gcc-4.6.0/cpp/Common-Predefined-Macros.html + \li http://www.boost.org/doc/libs/1_42_0/boost/detail/endian.hpp +*/ +#ifndef RAPIDJSON_ENDIAN +// Detect with GCC 4.6's macro +# ifdef __BYTE_ORDER__ +# if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ +# define RAPIDJSON_ENDIAN RAPIDJSON_LITTLEENDIAN +# elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ +# define RAPIDJSON_ENDIAN RAPIDJSON_BIGENDIAN +# else +# error Unknown machine endianess detected. User needs to define RAPIDJSON_ENDIAN. +# endif // __BYTE_ORDER__ +// Detect with GLIBC's endian.h +# elif defined(__GLIBC__) +# include +# if (__BYTE_ORDER == __LITTLE_ENDIAN) +# define RAPIDJSON_ENDIAN RAPIDJSON_LITTLEENDIAN +# elif (__BYTE_ORDER == __BIG_ENDIAN) +# define RAPIDJSON_ENDIAN RAPIDJSON_BIGENDIAN +# else +# error Unknown machine endianess detected. User needs to define RAPIDJSON_ENDIAN. +# endif // __GLIBC__ +// Detect with _LITTLE_ENDIAN and _BIG_ENDIAN macro +# elif defined(_LITTLE_ENDIAN) && !defined(_BIG_ENDIAN) +# define RAPIDJSON_ENDIAN RAPIDJSON_LITTLEENDIAN +# elif defined(_BIG_ENDIAN) && !defined(_LITTLE_ENDIAN) +# define RAPIDJSON_ENDIAN RAPIDJSON_BIGENDIAN +// Detect with architecture macros +# elif defined(__sparc) || defined(__sparc__) || defined(_POWER) || defined(__powerpc__) || defined(__ppc__) || defined(__hpux) || defined(__hppa) || defined(_MIPSEB) || defined(_POWER) || defined(__s390__) +# define RAPIDJSON_ENDIAN RAPIDJSON_BIGENDIAN +# elif defined(__i386__) || defined(__alpha__) || defined(__ia64) || defined(__ia64__) || defined(_M_IX86) || defined(_M_IA64) || defined(_M_ALPHA) || defined(__amd64) || defined(__amd64__) || defined(_M_AMD64) || defined(__x86_64) || defined(__x86_64__) || defined(_M_X64) || defined(__bfin__) +# define RAPIDJSON_ENDIAN RAPIDJSON_LITTLEENDIAN +# elif defined(_MSC_VER) && defined(_M_ARM) +# define RAPIDJSON_ENDIAN RAPIDJSON_LITTLEENDIAN +# elif defined(RAPIDJSON_DOXYGEN_RUNNING) +# define RAPIDJSON_ENDIAN +# else +# error Unknown machine endianess detected. User needs to define RAPIDJSON_ENDIAN. +# endif +#endif // RAPIDJSON_ENDIAN + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_64BIT + +//! Whether using 64-bit architecture +#ifndef RAPIDJSON_64BIT +#if defined(__LP64__) || (defined(__x86_64__) && defined(__ILP32__)) || defined(_WIN64) || defined(__EMSCRIPTEN__) +#define RAPIDJSON_64BIT 1 +#else +#define RAPIDJSON_64BIT 0 +#endif +#endif // RAPIDJSON_64BIT + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_ALIGN + +//! Data alignment of the machine. +/*! \ingroup RAPIDJSON_CONFIG + \param x pointer to align + + Some machines require strict data alignment. Currently the default uses 4 bytes + alignment on 32-bit platforms and 8 bytes alignment for 64-bit platforms. + User can customize by defining the RAPIDJSON_ALIGN function macro. +*/ +#ifndef RAPIDJSON_ALIGN +#if RAPIDJSON_64BIT == 1 +#define RAPIDJSON_ALIGN(x) (((x) + static_cast(7u)) & ~static_cast(7u)) +#else +#define RAPIDJSON_ALIGN(x) (((x) + 3u) & ~3u) +#endif +#endif + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_UINT64_C2 + +//! Construct a 64-bit literal by a pair of 32-bit integer. +/*! + 64-bit literal with or without ULL suffix is prone to compiler warnings. + UINT64_C() is C macro which cause compilation problems. + Use this macro to define 64-bit constants by a pair of 32-bit integer. +*/ +#ifndef RAPIDJSON_UINT64_C2 +#define RAPIDJSON_UINT64_C2(high32, low32) ((static_cast(high32) << 32) | static_cast(low32)) +#endif + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_48BITPOINTER_OPTIMIZATION + +//! Use only lower 48-bit address for some pointers. +/*! + \ingroup RAPIDJSON_CONFIG + + This optimization uses the fact that current X86-64 architecture only implement lower 48-bit virtual address. + The higher 16-bit can be used for storing other data. + \c GenericValue uses this optimization to reduce its size form 24 bytes to 16 bytes in 64-bit architecture. +*/ +#ifndef RAPIDJSON_48BITPOINTER_OPTIMIZATION +#if defined(__amd64__) || defined(__amd64) || defined(__x86_64__) || defined(__x86_64) || defined(_M_X64) || defined(_M_AMD64) +#define RAPIDJSON_48BITPOINTER_OPTIMIZATION 1 +#else +#define RAPIDJSON_48BITPOINTER_OPTIMIZATION 0 +#endif +#endif // RAPIDJSON_48BITPOINTER_OPTIMIZATION + +#if RAPIDJSON_48BITPOINTER_OPTIMIZATION == 1 +#if RAPIDJSON_64BIT != 1 +#error RAPIDJSON_48BITPOINTER_OPTIMIZATION can only be set to 1 when RAPIDJSON_64BIT=1 +#endif +#define RAPIDJSON_SETPOINTER(type, p, x) (p = reinterpret_cast((reinterpret_cast(p) & static_cast(RAPIDJSON_UINT64_C2(0xFFFF0000, 0x00000000))) | reinterpret_cast(reinterpret_cast(x)))) +#define RAPIDJSON_GETPOINTER(type, p) (reinterpret_cast(reinterpret_cast(p) & static_cast(RAPIDJSON_UINT64_C2(0x0000FFFF, 0xFFFFFFFF)))) +#else +#define RAPIDJSON_SETPOINTER(type, p, x) (p = (x)) +#define RAPIDJSON_GETPOINTER(type, p) (p) +#endif + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_SSE2/RAPIDJSON_SSE42/RAPIDJSON_SIMD + +/*! \def RAPIDJSON_SIMD + \ingroup RAPIDJSON_CONFIG + \brief Enable SSE2/SSE4.2 optimization. + + RapidJSON supports optimized implementations for some parsing operations + based on the SSE2 or SSE4.2 SIMD extensions on modern Intel-compatible + processors. + + To enable these optimizations, two different symbols can be defined; + \code + // Enable SSE2 optimization. + #define RAPIDJSON_SSE2 + + // Enable SSE4.2 optimization. + #define RAPIDJSON_SSE42 + \endcode + + \c RAPIDJSON_SSE42 takes precedence, if both are defined. + + If any of these symbols is defined, RapidJSON defines the macro + \c RAPIDJSON_SIMD to indicate the availability of the optimized code. +*/ +#if defined(RAPIDJSON_SSE2) || defined(RAPIDJSON_SSE42) \ + || defined(RAPIDJSON_DOXYGEN_RUNNING) +#define RAPIDJSON_SIMD +#endif + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_NO_SIZETYPEDEFINE + +#ifndef RAPIDJSON_NO_SIZETYPEDEFINE +/*! \def RAPIDJSON_NO_SIZETYPEDEFINE + \ingroup RAPIDJSON_CONFIG + \brief User-provided \c SizeType definition. + + In order to avoid using 32-bit size types for indexing strings and arrays, + define this preprocessor symbol and provide the type rapidjson::SizeType + before including RapidJSON: + \code + #define RAPIDJSON_NO_SIZETYPEDEFINE + namespace rapidjson { typedef ::std::size_t SizeType; } + #include "rapidjson/..." + \endcode + + \see rapidjson::SizeType +*/ +#ifdef RAPIDJSON_DOXYGEN_RUNNING +#define RAPIDJSON_NO_SIZETYPEDEFINE +#endif +RAPIDJSON_NAMESPACE_BEGIN +//! Size type (for string lengths, array sizes, etc.) +/*! RapidJSON uses 32-bit array/string indices even on 64-bit platforms, + instead of using \c size_t. Users may override the SizeType by defining + \ref RAPIDJSON_NO_SIZETYPEDEFINE. +*/ +typedef unsigned SizeType; +RAPIDJSON_NAMESPACE_END +#endif + +// always import std::size_t to rapidjson namespace +RAPIDJSON_NAMESPACE_BEGIN +using std::size_t; +RAPIDJSON_NAMESPACE_END + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_ASSERT + +//! Assertion. +/*! \ingroup RAPIDJSON_CONFIG + By default, rapidjson uses C \c assert() for internal assertions. + User can override it by defining RAPIDJSON_ASSERT(x) macro. + + \note Parsing errors are handled and can be customized by the + \ref RAPIDJSON_ERRORS APIs. +*/ +#ifndef RAPIDJSON_ASSERT +#include +#define RAPIDJSON_ASSERT(x) assert(x) +#endif // RAPIDJSON_ASSERT + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_STATIC_ASSERT + +// Adopt from boost +#ifndef RAPIDJSON_STATIC_ASSERT +#ifndef __clang__ +//!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN +#endif +RAPIDJSON_NAMESPACE_BEGIN +template struct STATIC_ASSERTION_FAILURE; +template <> struct STATIC_ASSERTION_FAILURE { enum { value = 1 }; }; +template struct StaticAssertTest {}; +RAPIDJSON_NAMESPACE_END + +#define RAPIDJSON_JOIN(X, Y) RAPIDJSON_DO_JOIN(X, Y) +#define RAPIDJSON_DO_JOIN(X, Y) RAPIDJSON_DO_JOIN2(X, Y) +#define RAPIDJSON_DO_JOIN2(X, Y) X##Y + +#if defined(__GNUC__) +#define RAPIDJSON_STATIC_ASSERT_UNUSED_ATTRIBUTE __attribute__((unused)) +#else +#define RAPIDJSON_STATIC_ASSERT_UNUSED_ATTRIBUTE +#endif +#ifndef __clang__ +//!@endcond +#endif + +/*! \def RAPIDJSON_STATIC_ASSERT + \brief (Internal) macro to check for conditions at compile-time + \param x compile-time condition + \hideinitializer + */ +#define RAPIDJSON_STATIC_ASSERT(x) \ + typedef ::RAPIDJSON_NAMESPACE::StaticAssertTest< \ + sizeof(::RAPIDJSON_NAMESPACE::STATIC_ASSERTION_FAILURE)> \ + RAPIDJSON_JOIN(StaticAssertTypedef, __LINE__) RAPIDJSON_STATIC_ASSERT_UNUSED_ATTRIBUTE +#endif + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_LIKELY, RAPIDJSON_UNLIKELY + +//! Compiler branching hint for expression with high probability to be true. +/*! + \ingroup RAPIDJSON_CONFIG + \param x Boolean expression likely to be true. +*/ +#ifndef RAPIDJSON_LIKELY +#if defined(__GNUC__) || defined(__clang__) +#define RAPIDJSON_LIKELY(x) __builtin_expect(!!(x), 1) +#else +#define RAPIDJSON_LIKELY(x) (x) +#endif +#endif + +//! Compiler branching hint for expression with low probability to be true. +/*! + \ingroup RAPIDJSON_CONFIG + \param x Boolean expression unlikely to be true. +*/ +#ifndef RAPIDJSON_UNLIKELY +#if defined(__GNUC__) || defined(__clang__) +#define RAPIDJSON_UNLIKELY(x) __builtin_expect(!!(x), 0) +#else +#define RAPIDJSON_UNLIKELY(x) (x) +#endif +#endif + +/////////////////////////////////////////////////////////////////////////////// +// Helpers + +//!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN + +#define RAPIDJSON_MULTILINEMACRO_BEGIN do { +#define RAPIDJSON_MULTILINEMACRO_END \ +} while((void)0, 0) + +// adopted from Boost +#define RAPIDJSON_VERSION_CODE(x,y,z) \ + (((x)*100000) + ((y)*100) + (z)) + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_DIAG_PUSH/POP, RAPIDJSON_DIAG_OFF + +#if defined(__GNUC__) +#define RAPIDJSON_GNUC \ + RAPIDJSON_VERSION_CODE(__GNUC__,__GNUC_MINOR__,__GNUC_PATCHLEVEL__) +#endif + +#if defined(__clang__) || (defined(RAPIDJSON_GNUC) && RAPIDJSON_GNUC >= RAPIDJSON_VERSION_CODE(4,2,0)) + +#define RAPIDJSON_PRAGMA(x) _Pragma(RAPIDJSON_STRINGIFY(x)) +#define RAPIDJSON_DIAG_PRAGMA(x) RAPIDJSON_PRAGMA(GCC diagnostic x) +#define RAPIDJSON_DIAG_OFF(x) \ + RAPIDJSON_DIAG_PRAGMA(ignored RAPIDJSON_STRINGIFY(RAPIDJSON_JOIN(-W,x))) + +// push/pop support in Clang and GCC>=4.6 +#if defined(__clang__) || (defined(RAPIDJSON_GNUC) && RAPIDJSON_GNUC >= RAPIDJSON_VERSION_CODE(4,6,0)) +#define RAPIDJSON_DIAG_PUSH RAPIDJSON_DIAG_PRAGMA(push) +#define RAPIDJSON_DIAG_POP RAPIDJSON_DIAG_PRAGMA(pop) +#else // GCC >= 4.2, < 4.6 +#define RAPIDJSON_DIAG_PUSH /* ignored */ +#define RAPIDJSON_DIAG_POP /* ignored */ +#endif + +#elif defined(_MSC_VER) + +// pragma (MSVC specific) +#define RAPIDJSON_PRAGMA(x) __pragma(x) +#define RAPIDJSON_DIAG_PRAGMA(x) RAPIDJSON_PRAGMA(warning(x)) + +#define RAPIDJSON_DIAG_OFF(x) RAPIDJSON_DIAG_PRAGMA(disable: x) +#define RAPIDJSON_DIAG_PUSH RAPIDJSON_DIAG_PRAGMA(push) +#define RAPIDJSON_DIAG_POP RAPIDJSON_DIAG_PRAGMA(pop) + +#else + +#define RAPIDJSON_DIAG_OFF(x) /* ignored */ +#define RAPIDJSON_DIAG_PUSH /* ignored */ +#define RAPIDJSON_DIAG_POP /* ignored */ + +#endif // RAPIDJSON_DIAG_* + +/////////////////////////////////////////////////////////////////////////////// +// C++11 features + +#ifndef RAPIDJSON_HAS_CXX11_RVALUE_REFS +#if defined(__clang__) +#if __has_feature(cxx_rvalue_references) && \ + (defined(_LIBCPP_VERSION) || defined(__GLIBCXX__) && __GLIBCXX__ >= 20080306) +#define RAPIDJSON_HAS_CXX11_RVALUE_REFS 1 +#else +#define RAPIDJSON_HAS_CXX11_RVALUE_REFS 0 +#endif +#elif (defined(RAPIDJSON_GNUC) && (RAPIDJSON_GNUC >= RAPIDJSON_VERSION_CODE(4,3,0)) && defined(__GXX_EXPERIMENTAL_CXX0X__)) || \ + (defined(_MSC_VER) && _MSC_VER >= 1600) + +#define RAPIDJSON_HAS_CXX11_RVALUE_REFS 1 +#else +#define RAPIDJSON_HAS_CXX11_RVALUE_REFS 0 +#endif +#endif // RAPIDJSON_HAS_CXX11_RVALUE_REFS + +#ifndef RAPIDJSON_HAS_CXX11_NOEXCEPT +#if defined(__clang__) +#define RAPIDJSON_HAS_CXX11_NOEXCEPT __has_feature(cxx_noexcept) +#elif (defined(RAPIDJSON_GNUC) && (RAPIDJSON_GNUC >= RAPIDJSON_VERSION_CODE(4,6,0)) && defined(__GXX_EXPERIMENTAL_CXX0X__)) +// (defined(_MSC_VER) && _MSC_VER >= ????) // not yet supported +#define RAPIDJSON_HAS_CXX11_NOEXCEPT 1 +#else +#define RAPIDJSON_HAS_CXX11_NOEXCEPT 0 +#endif +#endif +#if RAPIDJSON_HAS_CXX11_NOEXCEPT +#define RAPIDJSON_NOEXCEPT noexcept +#else +#define RAPIDJSON_NOEXCEPT /* noexcept */ +#endif // RAPIDJSON_HAS_CXX11_NOEXCEPT + +// no automatic detection, yet +#ifndef RAPIDJSON_HAS_CXX11_TYPETRAITS +#define RAPIDJSON_HAS_CXX11_TYPETRAITS 0 +#endif + +#ifndef RAPIDJSON_HAS_CXX11_RANGE_FOR +#if defined(__clang__) +#define RAPIDJSON_HAS_CXX11_RANGE_FOR __has_feature(cxx_range_for) +#elif (defined(RAPIDJSON_GNUC) && (RAPIDJSON_GNUC >= RAPIDJSON_VERSION_CODE(4,3,0)) && defined(__GXX_EXPERIMENTAL_CXX0X__)) || \ + (defined(_MSC_VER) && _MSC_VER >= 1700) +#define RAPIDJSON_HAS_CXX11_RANGE_FOR 1 +#else +#define RAPIDJSON_HAS_CXX11_RANGE_FOR 0 +#endif +#endif // RAPIDJSON_HAS_CXX11_RANGE_FOR + +//!@endcond + +/////////////////////////////////////////////////////////////////////////////// +// new/delete + +#ifndef RAPIDJSON_NEW +///! customization point for global \c new +#define RAPIDJSON_NEW(x) new x +#endif +#ifndef RAPIDJSON_DELETE +///! customization point for global \c delete +#define RAPIDJSON_DELETE(x) delete x +#endif + +/////////////////////////////////////////////////////////////////////////////// +// Type + +/*! \namespace rapidjson + \brief main RapidJSON namespace + \see RAPIDJSON_NAMESPACE +*/ +RAPIDJSON_NAMESPACE_BEGIN + +//! Type of JSON value +enum Type { + kNullType = 0, //!< null + kFalseType = 1, //!< false + kTrueType = 2, //!< true + kObjectType = 3, //!< object + kArrayType = 4, //!< array + kStringType = 5, //!< string + kNumberType = 6 //!< number +}; + +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_RAPIDJSON_H_ diff --git a/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/reader.h b/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/reader.h new file mode 100644 index 0000000..19f8849 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/reader.h @@ -0,0 +1,1879 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_READER_H_ +#define RAPIDJSON_READER_H_ + +/*! \file reader.h */ + +#include "allocators.h" +#include "stream.h" +#include "encodedstream.h" +#include "internal/meta.h" +#include "internal/stack.h" +#include "internal/strtod.h" +#include + +#if defined(RAPIDJSON_SIMD) && defined(_MSC_VER) +#include +#pragma intrinsic(_BitScanForward) +#endif +#ifdef RAPIDJSON_SSE42 +#include +#elif defined(RAPIDJSON_SSE2) +#include +#endif + +#ifdef _MSC_VER +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(4127) // conditional expression is constant +RAPIDJSON_DIAG_OFF(4702) // unreachable code +#endif + +#ifdef __clang__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(old-style-cast) +RAPIDJSON_DIAG_OFF(padded) +RAPIDJSON_DIAG_OFF(switch-enum) +#endif + +#ifdef __GNUC__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(effc++) +#endif + +//!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN +#define RAPIDJSON_NOTHING /* deliberately empty */ +#ifndef RAPIDJSON_PARSE_ERROR_EARLY_RETURN +#define RAPIDJSON_PARSE_ERROR_EARLY_RETURN(value) \ + RAPIDJSON_MULTILINEMACRO_BEGIN \ + if (RAPIDJSON_UNLIKELY(HasParseError())) { return value; } \ + RAPIDJSON_MULTILINEMACRO_END +#endif +#define RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID \ + RAPIDJSON_PARSE_ERROR_EARLY_RETURN(RAPIDJSON_NOTHING) +//!@endcond + +/*! \def RAPIDJSON_PARSE_ERROR_NORETURN + \ingroup RAPIDJSON_ERRORS + \brief Macro to indicate a parse error. + \param parseErrorCode \ref rapidjson::ParseErrorCode of the error + \param offset position of the error in JSON input (\c size_t) + + This macros can be used as a customization point for the internal + error handling mechanism of RapidJSON. + + A common usage model is to throw an exception instead of requiring the + caller to explicitly check the \ref rapidjson::GenericReader::Parse's + return value: + + \code + #define RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode,offset) \ + throw ParseException(parseErrorCode, #parseErrorCode, offset) + + #include // std::runtime_error + #include "rapidjson/error/error.h" // rapidjson::ParseResult + + struct ParseException : std::runtime_error, rapidjson::ParseResult { + ParseException(rapidjson::ParseErrorCode code, const char* msg, size_t offset) + : std::runtime_error(msg), ParseResult(code, offset) {} + }; + + #include "rapidjson/reader.h" + \endcode + + \see RAPIDJSON_PARSE_ERROR, rapidjson::GenericReader::Parse + */ +#ifndef RAPIDJSON_PARSE_ERROR_NORETURN +#define RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset) \ + RAPIDJSON_MULTILINEMACRO_BEGIN \ + RAPIDJSON_ASSERT(!HasParseError()); /* Error can only be assigned once */ \ + SetParseError(parseErrorCode, offset); \ + RAPIDJSON_MULTILINEMACRO_END +#endif + +/*! \def RAPIDJSON_PARSE_ERROR + \ingroup RAPIDJSON_ERRORS + \brief (Internal) macro to indicate and handle a parse error. + \param parseErrorCode \ref rapidjson::ParseErrorCode of the error + \param offset position of the error in JSON input (\c size_t) + + Invokes RAPIDJSON_PARSE_ERROR_NORETURN and stops the parsing. + + \see RAPIDJSON_PARSE_ERROR_NORETURN + \hideinitializer + */ +#ifndef RAPIDJSON_PARSE_ERROR +#define RAPIDJSON_PARSE_ERROR(parseErrorCode, offset) \ + RAPIDJSON_MULTILINEMACRO_BEGIN \ + RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset); \ + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; \ + RAPIDJSON_MULTILINEMACRO_END +#endif + +#include "error/error.h" // ParseErrorCode, ParseResult + +RAPIDJSON_NAMESPACE_BEGIN + +/////////////////////////////////////////////////////////////////////////////// +// ParseFlag + +/*! \def RAPIDJSON_PARSE_DEFAULT_FLAGS + \ingroup RAPIDJSON_CONFIG + \brief User-defined kParseDefaultFlags definition. + + User can define this as any \c ParseFlag combinations. +*/ +#ifndef RAPIDJSON_PARSE_DEFAULT_FLAGS +#define RAPIDJSON_PARSE_DEFAULT_FLAGS kParseNoFlags +#endif + +//! Combination of parseFlags +/*! \see Reader::Parse, Document::Parse, Document::ParseInsitu, Document::ParseStream + */ +enum ParseFlag { + kParseNoFlags = 0, //!< No flags are set. + kParseInsituFlag = 1, //!< In-situ(destructive) parsing. + kParseValidateEncodingFlag = 2, //!< Validate encoding of JSON strings. + kParseIterativeFlag = 4, //!< Iterative(constant complexity in terms of function call stack size) parsing. + kParseStopWhenDoneFlag = 8, //!< After parsing a complete JSON root from stream, stop further processing the rest of stream. When this flag is used, parser will not generate kParseErrorDocumentRootNotSingular error. + kParseFullPrecisionFlag = 16, //!< Parse number in full precision (but slower). + kParseCommentsFlag = 32, //!< Allow one-line (//) and multi-line (/**/) comments. + kParseNumbersAsStringsFlag = 64, //!< Parse all numbers (ints/doubles) as strings. + kParseTrailingCommasFlag = 128, //!< Allow trailing commas at the end of objects and arrays. + kParseNanAndInfFlag = 256, //!< Allow parsing NaN, Inf, Infinity, -Inf and -Infinity as doubles. + kParseDefaultFlags = RAPIDJSON_PARSE_DEFAULT_FLAGS //!< Default parse flags. Can be customized by defining RAPIDJSON_PARSE_DEFAULT_FLAGS +}; + +/////////////////////////////////////////////////////////////////////////////// +// Handler + +/*! \class rapidjson::Handler + \brief Concept for receiving events from GenericReader upon parsing. + The functions return true if no error occurs. If they return false, + the event publisher should terminate the process. +\code +concept Handler { + typename Ch; + + bool Null(); + bool Bool(bool b); + bool Int(int i); + bool Uint(unsigned i); + bool Int64(int64_t i); + bool Uint64(uint64_t i); + bool Double(double d); + /// enabled via kParseNumbersAsStringsFlag, string is not null-terminated (use length) + bool RawNumber(const Ch* str, SizeType length, bool copy); + bool String(const Ch* str, SizeType length, bool copy); + bool StartObject(); + bool Key(const Ch* str, SizeType length, bool copy); + bool EndObject(SizeType memberCount); + bool StartArray(); + bool EndArray(SizeType elementCount); +}; +\endcode +*/ +/////////////////////////////////////////////////////////////////////////////// +// BaseReaderHandler + +//! Default implementation of Handler. +/*! This can be used as base class of any reader handler. + \note implements Handler concept +*/ +template, typename Derived = void> +struct BaseReaderHandler { + typedef typename Encoding::Ch Ch; + + typedef typename internal::SelectIf, BaseReaderHandler, Derived>::Type Override; + + bool Default() { return true; } + bool Null() { return static_cast(*this).Default(); } + bool Bool(bool) { return static_cast(*this).Default(); } + bool Int(int) { return static_cast(*this).Default(); } + bool Uint(unsigned) { return static_cast(*this).Default(); } + bool Int64(int64_t) { return static_cast(*this).Default(); } + bool Uint64(uint64_t) { return static_cast(*this).Default(); } + bool Double(double) { return static_cast(*this).Default(); } + /// enabled via kParseNumbersAsStringsFlag, string is not null-terminated (use length) + bool RawNumber(const Ch* str, SizeType len, bool copy) { return static_cast(*this).String(str, len, copy); } + bool String(const Ch*, SizeType, bool) { return static_cast(*this).Default(); } + bool StartObject() { return static_cast(*this).Default(); } + bool Key(const Ch* str, SizeType len, bool copy) { return static_cast(*this).String(str, len, copy); } + bool EndObject(SizeType) { return static_cast(*this).Default(); } + bool StartArray() { return static_cast(*this).Default(); } + bool EndArray(SizeType) { return static_cast(*this).Default(); } +}; + +/////////////////////////////////////////////////////////////////////////////// +// StreamLocalCopy + +namespace internal { + +template::copyOptimization> +class StreamLocalCopy; + +//! Do copy optimization. +template +class StreamLocalCopy { +public: + StreamLocalCopy(Stream& original) : s(original), original_(original) {} + ~StreamLocalCopy() { original_ = s; } + + Stream s; + +private: + StreamLocalCopy& operator=(const StreamLocalCopy&) /* = delete */; + + Stream& original_; +}; + +//! Keep reference. +template +class StreamLocalCopy { +public: + StreamLocalCopy(Stream& original) : s(original) {} + + Stream& s; + +private: + StreamLocalCopy& operator=(const StreamLocalCopy&) /* = delete */; +}; + +} // namespace internal + +/////////////////////////////////////////////////////////////////////////////// +// SkipWhitespace + +//! Skip the JSON white spaces in a stream. +/*! \param is A input stream for skipping white spaces. + \note This function has SSE2/SSE4.2 specialization. +*/ +template +void SkipWhitespace(InputStream& is) { + internal::StreamLocalCopy copy(is); + InputStream& s(copy.s); + + typename InputStream::Ch c; + while ((c = s.Peek()) == ' ' || c == '\n' || c == '\r' || c == '\t') + s.Take(); +} + +inline const char* SkipWhitespace(const char* p, const char* end) { + while (p != end && (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t')) + ++p; + return p; +} + +#ifdef RAPIDJSON_SSE42 +//! Skip whitespace with SSE 4.2 pcmpistrm instruction, testing 16 8-byte characters at once. +inline const char *SkipWhitespace_SIMD(const char* p) { + // Fast return for single non-whitespace + if (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t') + ++p; + else + return p; + + // 16-byte align to the next boundary + const char* nextAligned = reinterpret_cast((reinterpret_cast(p) + 15) & static_cast(~15)); + while (p != nextAligned) + if (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t') + ++p; + else + return p; + + // The rest of string using SIMD + static const char whitespace[16] = " \n\r\t"; + const __m128i w = _mm_loadu_si128(reinterpret_cast(&whitespace[0])); + + for (;; p += 16) { + const __m128i s = _mm_load_si128(reinterpret_cast(p)); + const int r = _mm_cvtsi128_si32(_mm_cmpistrm(w, s, _SIDD_UBYTE_OPS | _SIDD_CMP_EQUAL_ANY | _SIDD_BIT_MASK | _SIDD_NEGATIVE_POLARITY)); + if (r != 0) { // some of characters is non-whitespace +#ifdef _MSC_VER // Find the index of first non-whitespace + unsigned long offset; + _BitScanForward(&offset, r); + return p + offset; +#else + return p + __builtin_ffs(r) - 1; +#endif + } + } +} + +inline const char *SkipWhitespace_SIMD(const char* p, const char* end) { + // Fast return for single non-whitespace + if (p != end && (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t')) + ++p; + else + return p; + + // The middle of string using SIMD + static const char whitespace[16] = " \n\r\t"; + const __m128i w = _mm_loadu_si128(reinterpret_cast(&whitespace[0])); + + for (; p <= end - 16; p += 16) { + const __m128i s = _mm_loadu_si128(reinterpret_cast(p)); + const int r = _mm_cvtsi128_si32(_mm_cmpistrm(w, s, _SIDD_UBYTE_OPS | _SIDD_CMP_EQUAL_ANY | _SIDD_BIT_MASK | _SIDD_NEGATIVE_POLARITY)); + if (r != 0) { // some of characters is non-whitespace +#ifdef _MSC_VER // Find the index of first non-whitespace + unsigned long offset; + _BitScanForward(&offset, r); + return p + offset; +#else + return p + __builtin_ffs(r) - 1; +#endif + } + } + + return SkipWhitespace(p, end); +} + +#elif defined(RAPIDJSON_SSE2) + +//! Skip whitespace with SSE2 instructions, testing 16 8-byte characters at once. +inline const char *SkipWhitespace_SIMD(const char* p) { + // Fast return for single non-whitespace + if (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t') + ++p; + else + return p; + + // 16-byte align to the next boundary + const char* nextAligned = reinterpret_cast((reinterpret_cast(p) + 15) & static_cast(~15)); + while (p != nextAligned) + if (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t') + ++p; + else + return p; + + // The rest of string + #define C16(c) { c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c } + static const char whitespaces[4][16] = { C16(' '), C16('\n'), C16('\r'), C16('\t') }; + #undef C16 + + const __m128i w0 = _mm_loadu_si128(reinterpret_cast(&whitespaces[0][0])); + const __m128i w1 = _mm_loadu_si128(reinterpret_cast(&whitespaces[1][0])); + const __m128i w2 = _mm_loadu_si128(reinterpret_cast(&whitespaces[2][0])); + const __m128i w3 = _mm_loadu_si128(reinterpret_cast(&whitespaces[3][0])); + + for (;; p += 16) { + const __m128i s = _mm_load_si128(reinterpret_cast(p)); + __m128i x = _mm_cmpeq_epi8(s, w0); + x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w1)); + x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w2)); + x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w3)); + unsigned short r = static_cast(~_mm_movemask_epi8(x)); + if (r != 0) { // some of characters may be non-whitespace +#ifdef _MSC_VER // Find the index of first non-whitespace + unsigned long offset; + _BitScanForward(&offset, r); + return p + offset; +#else + return p + __builtin_ffs(r) - 1; +#endif + } + } +} + +inline const char *SkipWhitespace_SIMD(const char* p, const char* end) { + // Fast return for single non-whitespace + if (p != end && (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t')) + ++p; + else + return p; + + // The rest of string + #define C16(c) { c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c } + static const char whitespaces[4][16] = { C16(' '), C16('\n'), C16('\r'), C16('\t') }; + #undef C16 + + const __m128i w0 = _mm_loadu_si128(reinterpret_cast(&whitespaces[0][0])); + const __m128i w1 = _mm_loadu_si128(reinterpret_cast(&whitespaces[1][0])); + const __m128i w2 = _mm_loadu_si128(reinterpret_cast(&whitespaces[2][0])); + const __m128i w3 = _mm_loadu_si128(reinterpret_cast(&whitespaces[3][0])); + + for (; p <= end - 16; p += 16) { + const __m128i s = _mm_loadu_si128(reinterpret_cast(p)); + __m128i x = _mm_cmpeq_epi8(s, w0); + x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w1)); + x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w2)); + x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w3)); + unsigned short r = static_cast(~_mm_movemask_epi8(x)); + if (r != 0) { // some of characters may be non-whitespace +#ifdef _MSC_VER // Find the index of first non-whitespace + unsigned long offset; + _BitScanForward(&offset, r); + return p + offset; +#else + return p + __builtin_ffs(r) - 1; +#endif + } + } + + return SkipWhitespace(p, end); +} + +#endif // RAPIDJSON_SSE2 + +#ifdef RAPIDJSON_SIMD +//! Template function specialization for InsituStringStream +template<> inline void SkipWhitespace(InsituStringStream& is) { + is.src_ = const_cast(SkipWhitespace_SIMD(is.src_)); +} + +//! Template function specialization for StringStream +template<> inline void SkipWhitespace(StringStream& is) { + is.src_ = SkipWhitespace_SIMD(is.src_); +} + +template<> inline void SkipWhitespace(EncodedInputStream, MemoryStream>& is) { + is.is_.src_ = SkipWhitespace_SIMD(is.is_.src_, is.is_.end_); +} +#endif // RAPIDJSON_SIMD + +/////////////////////////////////////////////////////////////////////////////// +// GenericReader + +//! SAX-style JSON parser. Use \ref Reader for UTF8 encoding and default allocator. +/*! GenericReader parses JSON text from a stream, and send events synchronously to an + object implementing Handler concept. + + It needs to allocate a stack for storing a single decoded string during + non-destructive parsing. + + For in-situ parsing, the decoded string is directly written to the source + text string, no temporary buffer is required. + + A GenericReader object can be reused for parsing multiple JSON text. + + \tparam SourceEncoding Encoding of the input stream. + \tparam TargetEncoding Encoding of the parse output. + \tparam StackAllocator Allocator type for stack. +*/ +template +class GenericReader { +public: + typedef typename SourceEncoding::Ch Ch; //!< SourceEncoding character type + + //! Constructor. + /*! \param stackAllocator Optional allocator for allocating stack memory. (Only use for non-destructive parsing) + \param stackCapacity stack capacity in bytes for storing a single decoded string. (Only use for non-destructive parsing) + */ + GenericReader(StackAllocator* stackAllocator = 0, size_t stackCapacity = kDefaultStackCapacity) : stack_(stackAllocator, stackCapacity), parseResult_() {} + + //! Parse JSON text. + /*! \tparam parseFlags Combination of \ref ParseFlag. + \tparam InputStream Type of input stream, implementing Stream concept. + \tparam Handler Type of handler, implementing Handler concept. + \param is Input stream to be parsed. + \param handler The handler to receive events. + \return Whether the parsing is successful. + */ + template + ParseResult Parse(InputStream& is, Handler& handler) { + if (parseFlags & kParseIterativeFlag) + return IterativeParse(is, handler); + + parseResult_.Clear(); + + ClearStackOnExit scope(*this); + + SkipWhitespaceAndComments(is); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_); + + if (RAPIDJSON_UNLIKELY(is.Peek() == '\0')) { + RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorDocumentEmpty, is.Tell()); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_); + } + else { + ParseValue(is, handler); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_); + + if (!(parseFlags & kParseStopWhenDoneFlag)) { + SkipWhitespaceAndComments(is); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_); + + if (RAPIDJSON_UNLIKELY(is.Peek() != '\0')) { + RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorDocumentRootNotSingular, is.Tell()); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_); + } + } + } + + return parseResult_; + } + + //! Parse JSON text (with \ref kParseDefaultFlags) + /*! \tparam InputStream Type of input stream, implementing Stream concept + \tparam Handler Type of handler, implementing Handler concept. + \param is Input stream to be parsed. + \param handler The handler to receive events. + \return Whether the parsing is successful. + */ + template + ParseResult Parse(InputStream& is, Handler& handler) { + return Parse(is, handler); + } + + //! Whether a parse error has occured in the last parsing. + bool HasParseError() const { return parseResult_.IsError(); } + + //! Get the \ref ParseErrorCode of last parsing. + ParseErrorCode GetParseErrorCode() const { return parseResult_.Code(); } + + //! Get the position of last parsing error in input, 0 otherwise. + size_t GetErrorOffset() const { return parseResult_.Offset(); } + +protected: + void SetParseError(ParseErrorCode code, size_t offset) { parseResult_.Set(code, offset); } + +private: + // Prohibit copy constructor & assignment operator. + GenericReader(const GenericReader&); + GenericReader& operator=(const GenericReader&); + + void ClearStack() { stack_.Clear(); } + + // clear stack on any exit from ParseStream, e.g. due to exception + struct ClearStackOnExit { + explicit ClearStackOnExit(GenericReader& r) : r_(r) {} + ~ClearStackOnExit() { r_.ClearStack(); } + private: + GenericReader& r_; + ClearStackOnExit(const ClearStackOnExit&); + ClearStackOnExit& operator=(const ClearStackOnExit&); + }; + + template + void SkipWhitespaceAndComments(InputStream& is) { + SkipWhitespace(is); + + if (parseFlags & kParseCommentsFlag) { + while (RAPIDJSON_UNLIKELY(Consume(is, '/'))) { + if (Consume(is, '*')) { + while (true) { + if (RAPIDJSON_UNLIKELY(is.Peek() == '\0')) + RAPIDJSON_PARSE_ERROR(kParseErrorUnspecificSyntaxError, is.Tell()); + else if (Consume(is, '*')) { + if (Consume(is, '/')) + break; + } + else + is.Take(); + } + } + else if (RAPIDJSON_LIKELY(Consume(is, '/'))) + while (is.Peek() != '\0' && is.Take() != '\n'); + else + RAPIDJSON_PARSE_ERROR(kParseErrorUnspecificSyntaxError, is.Tell()); + + SkipWhitespace(is); + } + } + } + + // Parse object: { string : value, ... } + template + void ParseObject(InputStream& is, Handler& handler) { + RAPIDJSON_ASSERT(is.Peek() == '{'); + is.Take(); // Skip '{' + + if (RAPIDJSON_UNLIKELY(!handler.StartObject())) + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + + SkipWhitespaceAndComments(is); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + + if (Consume(is, '}')) { + if (RAPIDJSON_UNLIKELY(!handler.EndObject(0))) // empty object + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + return; + } + + for (SizeType memberCount = 0;;) { + if (RAPIDJSON_UNLIKELY(is.Peek() != '"')) + RAPIDJSON_PARSE_ERROR(kParseErrorObjectMissName, is.Tell()); + + ParseString(is, handler, true); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + + SkipWhitespaceAndComments(is); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + + if (RAPIDJSON_UNLIKELY(!Consume(is, ':'))) + RAPIDJSON_PARSE_ERROR(kParseErrorObjectMissColon, is.Tell()); + + SkipWhitespaceAndComments(is); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + + ParseValue(is, handler); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + + SkipWhitespaceAndComments(is); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + + ++memberCount; + + switch (is.Peek()) { + case ',': + is.Take(); + SkipWhitespaceAndComments(is); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + break; + case '}': + is.Take(); + if (RAPIDJSON_UNLIKELY(!handler.EndObject(memberCount))) + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + return; + default: + RAPIDJSON_PARSE_ERROR(kParseErrorObjectMissCommaOrCurlyBracket, is.Tell()); break; // This useless break is only for making warning and coverage happy + } + + if (parseFlags & kParseTrailingCommasFlag) { + if (is.Peek() == '}') { + if (RAPIDJSON_UNLIKELY(!handler.EndObject(memberCount))) + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + is.Take(); + return; + } + } + } + } + + // Parse array: [ value, ... ] + template + void ParseArray(InputStream& is, Handler& handler) { + RAPIDJSON_ASSERT(is.Peek() == '['); + is.Take(); // Skip '[' + + if (RAPIDJSON_UNLIKELY(!handler.StartArray())) + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + + SkipWhitespaceAndComments(is); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + + if (Consume(is, ']')) { + if (RAPIDJSON_UNLIKELY(!handler.EndArray(0))) // empty array + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + return; + } + + for (SizeType elementCount = 0;;) { + ParseValue(is, handler); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + + ++elementCount; + SkipWhitespaceAndComments(is); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + + if (Consume(is, ',')) { + SkipWhitespaceAndComments(is); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + } + else if (Consume(is, ']')) { + if (RAPIDJSON_UNLIKELY(!handler.EndArray(elementCount))) + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + return; + } + else + RAPIDJSON_PARSE_ERROR(kParseErrorArrayMissCommaOrSquareBracket, is.Tell()); + + if (parseFlags & kParseTrailingCommasFlag) { + if (is.Peek() == ']') { + if (RAPIDJSON_UNLIKELY(!handler.EndArray(elementCount))) + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + is.Take(); + return; + } + } + } + } + + template + void ParseNull(InputStream& is, Handler& handler) { + RAPIDJSON_ASSERT(is.Peek() == 'n'); + is.Take(); + + if (RAPIDJSON_LIKELY(Consume(is, 'u') && Consume(is, 'l') && Consume(is, 'l'))) { + if (RAPIDJSON_UNLIKELY(!handler.Null())) + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + } + else + RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, is.Tell()); + } + + template + void ParseTrue(InputStream& is, Handler& handler) { + RAPIDJSON_ASSERT(is.Peek() == 't'); + is.Take(); + + if (RAPIDJSON_LIKELY(Consume(is, 'r') && Consume(is, 'u') && Consume(is, 'e'))) { + if (RAPIDJSON_UNLIKELY(!handler.Bool(true))) + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + } + else + RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, is.Tell()); + } + + template + void ParseFalse(InputStream& is, Handler& handler) { + RAPIDJSON_ASSERT(is.Peek() == 'f'); + is.Take(); + + if (RAPIDJSON_LIKELY(Consume(is, 'a') && Consume(is, 'l') && Consume(is, 's') && Consume(is, 'e'))) { + if (RAPIDJSON_UNLIKELY(!handler.Bool(false))) + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, is.Tell()); + } + else + RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, is.Tell()); + } + + template + RAPIDJSON_FORCEINLINE static bool Consume(InputStream& is, typename InputStream::Ch expect) { + if (RAPIDJSON_LIKELY(is.Peek() == expect)) { + is.Take(); + return true; + } + else + return false; + } + + // Helper function to parse four hexidecimal digits in \uXXXX in ParseString(). + template + unsigned ParseHex4(InputStream& is, size_t escapeOffset) { + unsigned codepoint = 0; + for (int i = 0; i < 4; i++) { + Ch c = is.Peek(); + codepoint <<= 4; + codepoint += static_cast(c); + if (c >= '0' && c <= '9') + codepoint -= '0'; + else if (c >= 'A' && c <= 'F') + codepoint -= 'A' - 10; + else if (c >= 'a' && c <= 'f') + codepoint -= 'a' - 10; + else { + RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorStringUnicodeEscapeInvalidHex, escapeOffset); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN(0); + } + is.Take(); + } + return codepoint; + } + + template + class StackStream { + public: + typedef CharType Ch; + + StackStream(internal::Stack& stack) : stack_(stack), length_(0) {} + RAPIDJSON_FORCEINLINE void Put(Ch c) { + *stack_.template Push() = c; + ++length_; + } + + RAPIDJSON_FORCEINLINE void* Push(SizeType count) { + length_ += count; + return stack_.template Push(count); + } + + size_t Length() const { return length_; } + + Ch* Pop() { + return stack_.template Pop(length_); + } + + private: + StackStream(const StackStream&); + StackStream& operator=(const StackStream&); + + internal::Stack& stack_; + SizeType length_; + }; + + // Parse string and generate String event. Different code paths for kParseInsituFlag. + template + void ParseString(InputStream& is, Handler& handler, bool isKey = false) { + internal::StreamLocalCopy copy(is); + InputStream& s(copy.s); + + RAPIDJSON_ASSERT(s.Peek() == '\"'); + s.Take(); // Skip '\"' + + bool success = false; + if (parseFlags & kParseInsituFlag) { + typename InputStream::Ch *head = s.PutBegin(); + ParseStringToStream(s, s); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + size_t length = s.PutEnd(head) - 1; + RAPIDJSON_ASSERT(length <= 0xFFFFFFFF); + const typename TargetEncoding::Ch* const str = reinterpret_cast(head); + success = (isKey ? handler.Key(str, SizeType(length), false) : handler.String(str, SizeType(length), false)); + } + else { + StackStream stackStream(stack_); + ParseStringToStream(s, stackStream); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + SizeType length = static_cast(stackStream.Length()) - 1; + const typename TargetEncoding::Ch* const str = stackStream.Pop(); + success = (isKey ? handler.Key(str, length, true) : handler.String(str, length, true)); + } + if (RAPIDJSON_UNLIKELY(!success)) + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, s.Tell()); + } + + // Parse string to an output is + // This function handles the prefix/suffix double quotes, escaping, and optional encoding validation. + template + RAPIDJSON_FORCEINLINE void ParseStringToStream(InputStream& is, OutputStream& os) { +//!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN +#define Z16 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + static const char escape[256] = { + Z16, Z16, 0, 0,'\"', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,'/', + Z16, Z16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,'\\', 0, 0, 0, + 0, 0,'\b', 0, 0, 0,'\f', 0, 0, 0, 0, 0, 0, 0,'\n', 0, + 0, 0,'\r', 0,'\t', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + Z16, Z16, Z16, Z16, Z16, Z16, Z16, Z16 + }; +#undef Z16 +//!@endcond + + for (;;) { + // Scan and copy string before "\\\"" or < 0x20. This is an optional optimzation. + if (!(parseFlags & kParseValidateEncodingFlag)) + ScanCopyUnescapedString(is, os); + + Ch c = is.Peek(); + if (RAPIDJSON_UNLIKELY(c == '\\')) { // Escape + size_t escapeOffset = is.Tell(); // For invalid escaping, report the inital '\\' as error offset + is.Take(); + Ch e = is.Peek(); + if ((sizeof(Ch) == 1 || unsigned(e) < 256) && RAPIDJSON_LIKELY(escape[static_cast(e)])) { + is.Take(); + os.Put(static_cast(escape[static_cast(e)])); + } + else if (RAPIDJSON_LIKELY(e == 'u')) { // Unicode + is.Take(); + unsigned codepoint = ParseHex4(is, escapeOffset); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + if (RAPIDJSON_UNLIKELY(codepoint >= 0xD800 && codepoint <= 0xDBFF)) { + // Handle UTF-16 surrogate pair + if (RAPIDJSON_UNLIKELY(!Consume(is, '\\') || !Consume(is, 'u'))) + RAPIDJSON_PARSE_ERROR(kParseErrorStringUnicodeSurrogateInvalid, escapeOffset); + unsigned codepoint2 = ParseHex4(is, escapeOffset); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; + if (RAPIDJSON_UNLIKELY(codepoint2 < 0xDC00 || codepoint2 > 0xDFFF)) + RAPIDJSON_PARSE_ERROR(kParseErrorStringUnicodeSurrogateInvalid, escapeOffset); + codepoint = (((codepoint - 0xD800) << 10) | (codepoint2 - 0xDC00)) + 0x10000; + } + TEncoding::Encode(os, codepoint); + } + else + RAPIDJSON_PARSE_ERROR(kParseErrorStringEscapeInvalid, escapeOffset); + } + else if (RAPIDJSON_UNLIKELY(c == '"')) { // Closing double quote + is.Take(); + os.Put('\0'); // null-terminate the string + return; + } + else if (RAPIDJSON_UNLIKELY(static_cast(c) < 0x20)) { // RFC 4627: unescaped = %x20-21 / %x23-5B / %x5D-10FFFF + if (c == '\0') + RAPIDJSON_PARSE_ERROR(kParseErrorStringMissQuotationMark, is.Tell()); + else + RAPIDJSON_PARSE_ERROR(kParseErrorStringEscapeInvalid, is.Tell()); + } + else { + size_t offset = is.Tell(); + if (RAPIDJSON_UNLIKELY((parseFlags & kParseValidateEncodingFlag ? + !Transcoder::Validate(is, os) : + !Transcoder::Transcode(is, os)))) + RAPIDJSON_PARSE_ERROR(kParseErrorStringInvalidEncoding, offset); + } + } + } + + template + static RAPIDJSON_FORCEINLINE void ScanCopyUnescapedString(InputStream&, OutputStream&) { + // Do nothing for generic version + } + +#if defined(RAPIDJSON_SSE2) || defined(RAPIDJSON_SSE42) + // StringStream -> StackStream + static RAPIDJSON_FORCEINLINE void ScanCopyUnescapedString(StringStream& is, StackStream& os) { + const char* p = is.src_; + + // Scan one by one until alignment (unaligned load may cross page boundary and cause crash) + const char* nextAligned = reinterpret_cast((reinterpret_cast(p) + 15) & static_cast(~15)); + while (p != nextAligned) + if (RAPIDJSON_UNLIKELY(*p == '\"') || RAPIDJSON_UNLIKELY(*p == '\\') || RAPIDJSON_UNLIKELY(static_cast(*p) < 0x20)) { + is.src_ = p; + return; + } + else + os.Put(*p++); + + // The rest of string using SIMD + static const char dquote[16] = { '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"' }; + static const char bslash[16] = { '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\' }; + static const char space[16] = { 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19 }; + const __m128i dq = _mm_loadu_si128(reinterpret_cast(&dquote[0])); + const __m128i bs = _mm_loadu_si128(reinterpret_cast(&bslash[0])); + const __m128i sp = _mm_loadu_si128(reinterpret_cast(&space[0])); + + for (;; p += 16) { + const __m128i s = _mm_load_si128(reinterpret_cast(p)); + const __m128i t1 = _mm_cmpeq_epi8(s, dq); + const __m128i t2 = _mm_cmpeq_epi8(s, bs); + const __m128i t3 = _mm_cmpeq_epi8(_mm_max_epu8(s, sp), sp); // s < 0x20 <=> max(s, 0x19) == 0x19 + const __m128i x = _mm_or_si128(_mm_or_si128(t1, t2), t3); + unsigned short r = static_cast(_mm_movemask_epi8(x)); + if (RAPIDJSON_UNLIKELY(r != 0)) { // some of characters is escaped + SizeType length; + #ifdef _MSC_VER // Find the index of first escaped + unsigned long offset; + _BitScanForward(&offset, r); + length = offset; + #else + length = static_cast(__builtin_ffs(r) - 1); + #endif + char* q = reinterpret_cast(os.Push(length)); + for (size_t i = 0; i < length; i++) + q[i] = p[i]; + + p += length; + break; + } + _mm_storeu_si128(reinterpret_cast<__m128i *>(os.Push(16)), s); + } + + is.src_ = p; + } + + // InsituStringStream -> InsituStringStream + static RAPIDJSON_FORCEINLINE void ScanCopyUnescapedString(InsituStringStream& is, InsituStringStream& os) { + RAPIDJSON_ASSERT(&is == &os); + (void)os; + + if (is.src_ == is.dst_) { + SkipUnescapedString(is); + return; + } + + char* p = is.src_; + char *q = is.dst_; + + // Scan one by one until alignment (unaligned load may cross page boundary and cause crash) + const char* nextAligned = reinterpret_cast((reinterpret_cast(p) + 15) & static_cast(~15)); + while (p != nextAligned) + if (RAPIDJSON_UNLIKELY(*p == '\"') || RAPIDJSON_UNLIKELY(*p == '\\') || RAPIDJSON_UNLIKELY(static_cast(*p) < 0x20)) { + is.src_ = p; + is.dst_ = q; + return; + } + else + *q++ = *p++; + + // The rest of string using SIMD + static const char dquote[16] = { '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"' }; + static const char bslash[16] = { '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\' }; + static const char space[16] = { 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19 }; + const __m128i dq = _mm_loadu_si128(reinterpret_cast(&dquote[0])); + const __m128i bs = _mm_loadu_si128(reinterpret_cast(&bslash[0])); + const __m128i sp = _mm_loadu_si128(reinterpret_cast(&space[0])); + + for (;; p += 16, q += 16) { + const __m128i s = _mm_load_si128(reinterpret_cast(p)); + const __m128i t1 = _mm_cmpeq_epi8(s, dq); + const __m128i t2 = _mm_cmpeq_epi8(s, bs); + const __m128i t3 = _mm_cmpeq_epi8(_mm_max_epu8(s, sp), sp); // s < 0x20 <=> max(s, 0x19) == 0x19 + const __m128i x = _mm_or_si128(_mm_or_si128(t1, t2), t3); + unsigned short r = static_cast(_mm_movemask_epi8(x)); + if (RAPIDJSON_UNLIKELY(r != 0)) { // some of characters is escaped + size_t length; +#ifdef _MSC_VER // Find the index of first escaped + unsigned long offset; + _BitScanForward(&offset, r); + length = offset; +#else + length = static_cast(__builtin_ffs(r) - 1); +#endif + for (const char* pend = p + length; p != pend; ) + *q++ = *p++; + break; + } + _mm_storeu_si128(reinterpret_cast<__m128i *>(q), s); + } + + is.src_ = p; + is.dst_ = q; + } + + // When read/write pointers are the same for insitu stream, just skip unescaped characters + static RAPIDJSON_FORCEINLINE void SkipUnescapedString(InsituStringStream& is) { + RAPIDJSON_ASSERT(is.src_ == is.dst_); + char* p = is.src_; + + // Scan one by one until alignment (unaligned load may cross page boundary and cause crash) + const char* nextAligned = reinterpret_cast((reinterpret_cast(p) + 15) & static_cast(~15)); + for (; p != nextAligned; p++) + if (RAPIDJSON_UNLIKELY(*p == '\"') || RAPIDJSON_UNLIKELY(*p == '\\') || RAPIDJSON_UNLIKELY(static_cast(*p) < 0x20)) { + is.src_ = is.dst_ = p; + return; + } + + // The rest of string using SIMD + static const char dquote[16] = { '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"' }; + static const char bslash[16] = { '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\' }; + static const char space[16] = { 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19 }; + const __m128i dq = _mm_loadu_si128(reinterpret_cast(&dquote[0])); + const __m128i bs = _mm_loadu_si128(reinterpret_cast(&bslash[0])); + const __m128i sp = _mm_loadu_si128(reinterpret_cast(&space[0])); + + for (;; p += 16) { + const __m128i s = _mm_load_si128(reinterpret_cast(p)); + const __m128i t1 = _mm_cmpeq_epi8(s, dq); + const __m128i t2 = _mm_cmpeq_epi8(s, bs); + const __m128i t3 = _mm_cmpeq_epi8(_mm_max_epu8(s, sp), sp); // s < 0x20 <=> max(s, 0x19) == 0x19 + const __m128i x = _mm_or_si128(_mm_or_si128(t1, t2), t3); + unsigned short r = static_cast(_mm_movemask_epi8(x)); + if (RAPIDJSON_UNLIKELY(r != 0)) { // some of characters is escaped + size_t length; +#ifdef _MSC_VER // Find the index of first escaped + unsigned long offset; + _BitScanForward(&offset, r); + length = offset; +#else + length = static_cast(__builtin_ffs(r) - 1); +#endif + p += length; + break; + } + } + + is.src_ = is.dst_ = p; + } +#endif + + template + class NumberStream; + + template + class NumberStream { + public: + typedef typename InputStream::Ch Ch; + + NumberStream(GenericReader& reader, InputStream& s) : is(s) { (void)reader; } + ~NumberStream() {} + + RAPIDJSON_FORCEINLINE Ch Peek() const { return is.Peek(); } + RAPIDJSON_FORCEINLINE Ch TakePush() { return is.Take(); } + RAPIDJSON_FORCEINLINE Ch Take() { return is.Take(); } + RAPIDJSON_FORCEINLINE void Push(char) {} + + size_t Tell() { return is.Tell(); } + size_t Length() { return 0; } + const char* Pop() { return 0; } + + protected: + NumberStream& operator=(const NumberStream&); + + InputStream& is; + }; + + template + class NumberStream : public NumberStream { + typedef NumberStream Base; + public: + NumberStream(GenericReader& reader, InputStream& is) : Base(reader, is), stackStream(reader.stack_) {} + ~NumberStream() {} + + RAPIDJSON_FORCEINLINE Ch TakePush() { + stackStream.Put(static_cast(Base::is.Peek())); + return Base::is.Take(); + } + + RAPIDJSON_FORCEINLINE void Push(char c) { + stackStream.Put(c); + } + + size_t Length() { return stackStream.Length(); } + + const char* Pop() { + stackStream.Put('\0'); + return stackStream.Pop(); + } + + private: + StackStream stackStream; + }; + + template + class NumberStream : public NumberStream { + typedef NumberStream Base; + public: + NumberStream(GenericReader& reader, InputStream& is) : Base(reader, is) {} + ~NumberStream() {} + + RAPIDJSON_FORCEINLINE Ch Take() { return Base::TakePush(); } + }; + + template + void ParseNumber(InputStream& is, Handler& handler) { + internal::StreamLocalCopy copy(is); + NumberStream s(*this, copy.s); + + size_t startOffset = s.Tell(); + double d = 0.0; + bool useNanOrInf = false; + + // Parse minus + bool minus = Consume(s, '-'); + + // Parse int: zero / ( digit1-9 *DIGIT ) + unsigned i = 0; + uint64_t i64 = 0; + bool use64bit = false; + int significandDigit = 0; + if (RAPIDJSON_UNLIKELY(s.Peek() == '0')) { + i = 0; + s.TakePush(); + } + else if (RAPIDJSON_LIKELY(s.Peek() >= '1' && s.Peek() <= '9')) { + i = static_cast(s.TakePush() - '0'); + + if (minus) + while (RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { + if (RAPIDJSON_UNLIKELY(i >= 214748364)) { // 2^31 = 2147483648 + if (RAPIDJSON_LIKELY(i != 214748364 || s.Peek() > '8')) { + i64 = i; + use64bit = true; + break; + } + } + i = i * 10 + static_cast(s.TakePush() - '0'); + significandDigit++; + } + else + while (RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { + if (RAPIDJSON_UNLIKELY(i >= 429496729)) { // 2^32 - 1 = 4294967295 + if (RAPIDJSON_LIKELY(i != 429496729 || s.Peek() > '5')) { + i64 = i; + use64bit = true; + break; + } + } + i = i * 10 + static_cast(s.TakePush() - '0'); + significandDigit++; + } + } + // Parse NaN or Infinity here + else if ((parseFlags & kParseNanAndInfFlag) && RAPIDJSON_LIKELY((s.Peek() == 'I' || s.Peek() == 'N'))) { + useNanOrInf = true; + if (RAPIDJSON_LIKELY(Consume(s, 'N') && Consume(s, 'a') && Consume(s, 'N'))) { + d = std::numeric_limits::quiet_NaN(); + } + else if (RAPIDJSON_LIKELY(Consume(s, 'I') && Consume(s, 'n') && Consume(s, 'f'))) { + d = (minus ? -std::numeric_limits::infinity() : std::numeric_limits::infinity()); + if (RAPIDJSON_UNLIKELY(s.Peek() == 'i' && !(Consume(s, 'i') && Consume(s, 'n') + && Consume(s, 'i') && Consume(s, 't') && Consume(s, 'y')))) + RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, s.Tell()); + } + else + RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, s.Tell()); + } + else + RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, s.Tell()); + + // Parse 64bit int + bool useDouble = false; + if (use64bit) { + if (minus) + while (RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { + if (RAPIDJSON_UNLIKELY(i64 >= RAPIDJSON_UINT64_C2(0x0CCCCCCC, 0xCCCCCCCC))) // 2^63 = 9223372036854775808 + if (RAPIDJSON_LIKELY(i64 != RAPIDJSON_UINT64_C2(0x0CCCCCCC, 0xCCCCCCCC) || s.Peek() > '8')) { + d = static_cast(i64); + useDouble = true; + break; + } + i64 = i64 * 10 + static_cast(s.TakePush() - '0'); + significandDigit++; + } + else + while (RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { + if (RAPIDJSON_UNLIKELY(i64 >= RAPIDJSON_UINT64_C2(0x19999999, 0x99999999))) // 2^64 - 1 = 18446744073709551615 + if (RAPIDJSON_LIKELY(i64 != RAPIDJSON_UINT64_C2(0x19999999, 0x99999999) || s.Peek() > '5')) { + d = static_cast(i64); + useDouble = true; + break; + } + i64 = i64 * 10 + static_cast(s.TakePush() - '0'); + significandDigit++; + } + } + + // Force double for big integer + if (useDouble) { + while (RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { + if (RAPIDJSON_UNLIKELY(d >= 1.7976931348623157e307)) // DBL_MAX / 10.0 + RAPIDJSON_PARSE_ERROR(kParseErrorNumberTooBig, startOffset); + d = d * 10 + (s.TakePush() - '0'); + } + } + + // Parse frac = decimal-point 1*DIGIT + int expFrac = 0; + size_t decimalPosition; + if (Consume(s, '.')) { + decimalPosition = s.Length(); + + if (RAPIDJSON_UNLIKELY(!(s.Peek() >= '0' && s.Peek() <= '9'))) + RAPIDJSON_PARSE_ERROR(kParseErrorNumberMissFraction, s.Tell()); + + if (!useDouble) { +#if RAPIDJSON_64BIT + // Use i64 to store significand in 64-bit architecture + if (!use64bit) + i64 = i; + + while (RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { + if (i64 > RAPIDJSON_UINT64_C2(0x1FFFFF, 0xFFFFFFFF)) // 2^53 - 1 for fast path + break; + else { + i64 = i64 * 10 + static_cast(s.TakePush() - '0'); + --expFrac; + if (i64 != 0) + significandDigit++; + } + } + + d = static_cast(i64); +#else + // Use double to store significand in 32-bit architecture + d = static_cast(use64bit ? i64 : i); +#endif + useDouble = true; + } + + while (RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { + if (significandDigit < 17) { + d = d * 10.0 + (s.TakePush() - '0'); + --expFrac; + if (RAPIDJSON_LIKELY(d > 0.0)) + significandDigit++; + } + else + s.TakePush(); + } + } + else + decimalPosition = s.Length(); // decimal position at the end of integer. + + // Parse exp = e [ minus / plus ] 1*DIGIT + int exp = 0; + if (Consume(s, 'e') || Consume(s, 'E')) { + if (!useDouble) { + d = static_cast(use64bit ? i64 : i); + useDouble = true; + } + + bool expMinus = false; + if (Consume(s, '+')) + ; + else if (Consume(s, '-')) + expMinus = true; + + if (RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { + exp = static_cast(s.Take() - '0'); + if (expMinus) { + while (RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { + exp = exp * 10 + static_cast(s.Take() - '0'); + if (exp >= 214748364) { // Issue #313: prevent overflow exponent + while (RAPIDJSON_UNLIKELY(s.Peek() >= '0' && s.Peek() <= '9')) // Consume the rest of exponent + s.Take(); + } + } + } + else { // positive exp + int maxExp = 308 - expFrac; + while (RAPIDJSON_LIKELY(s.Peek() >= '0' && s.Peek() <= '9')) { + exp = exp * 10 + static_cast(s.Take() - '0'); + if (RAPIDJSON_UNLIKELY(exp > maxExp)) + RAPIDJSON_PARSE_ERROR(kParseErrorNumberTooBig, startOffset); + } + } + } + else + RAPIDJSON_PARSE_ERROR(kParseErrorNumberMissExponent, s.Tell()); + + if (expMinus) + exp = -exp; + } + + // Finish parsing, call event according to the type of number. + bool cont = true; + + if (parseFlags & kParseNumbersAsStringsFlag) { + if (parseFlags & kParseInsituFlag) { + s.Pop(); // Pop stack no matter if it will be used or not. + typename InputStream::Ch* head = is.PutBegin(); + const size_t length = s.Tell() - startOffset; + RAPIDJSON_ASSERT(length <= 0xFFFFFFFF); + // unable to insert the \0 character here, it will erase the comma after this number + const typename TargetEncoding::Ch* const str = reinterpret_cast(head); + cont = handler.RawNumber(str, SizeType(length), false); + } + else { + SizeType numCharsToCopy = static_cast(s.Length()); + StringStream srcStream(s.Pop()); + StackStream dstStream(stack_); + while (numCharsToCopy--) { + Transcoder, TargetEncoding>::Transcode(srcStream, dstStream); + } + dstStream.Put('\0'); + const typename TargetEncoding::Ch* str = dstStream.Pop(); + const SizeType length = static_cast(dstStream.Length()) - 1; + cont = handler.RawNumber(str, SizeType(length), true); + } + } + else { + size_t length = s.Length(); + const char* decimal = s.Pop(); // Pop stack no matter if it will be used or not. + + if (useDouble) { + int p = exp + expFrac; + if (parseFlags & kParseFullPrecisionFlag) + d = internal::StrtodFullPrecision(d, p, decimal, length, decimalPosition, exp); + else + d = internal::StrtodNormalPrecision(d, p); + + cont = handler.Double(minus ? -d : d); + } + else if (useNanOrInf) { + cont = handler.Double(d); + } + else { + if (use64bit) { + if (minus) + cont = handler.Int64(static_cast(~i64 + 1)); + else + cont = handler.Uint64(i64); + } + else { + if (minus) + cont = handler.Int(static_cast(~i + 1)); + else + cont = handler.Uint(i); + } + } + } + if (RAPIDJSON_UNLIKELY(!cont)) + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, startOffset); + } + + // Parse any JSON value + template + void ParseValue(InputStream& is, Handler& handler) { + switch (is.Peek()) { + case 'n': ParseNull (is, handler); break; + case 't': ParseTrue (is, handler); break; + case 'f': ParseFalse (is, handler); break; + case '"': ParseString(is, handler); break; + case '{': ParseObject(is, handler); break; + case '[': ParseArray (is, handler); break; + default : + ParseNumber(is, handler); + break; + + } + } + + // Iterative Parsing + + // States + enum IterativeParsingState { + IterativeParsingStartState = 0, + IterativeParsingFinishState, + IterativeParsingErrorState, + + // Object states + IterativeParsingObjectInitialState, + IterativeParsingMemberKeyState, + IterativeParsingKeyValueDelimiterState, + IterativeParsingMemberValueState, + IterativeParsingMemberDelimiterState, + IterativeParsingObjectFinishState, + + // Array states + IterativeParsingArrayInitialState, + IterativeParsingElementState, + IterativeParsingElementDelimiterState, + IterativeParsingArrayFinishState, + + // Single value state + IterativeParsingValueState + }; + + enum { cIterativeParsingStateCount = IterativeParsingValueState + 1 }; + + // Tokens + enum Token { + LeftBracketToken = 0, + RightBracketToken, + + LeftCurlyBracketToken, + RightCurlyBracketToken, + + CommaToken, + ColonToken, + + StringToken, + FalseToken, + TrueToken, + NullToken, + NumberToken, + + kTokenCount + }; + + RAPIDJSON_FORCEINLINE Token Tokenize(Ch c) { + +//!@cond RAPIDJSON_HIDDEN_FROM_DOXYGEN +#define N NumberToken +#define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N + // Maps from ASCII to Token + static const unsigned char tokenMap[256] = { + N16, // 00~0F + N16, // 10~1F + N, N, StringToken, N, N, N, N, N, N, N, N, N, CommaToken, N, N, N, // 20~2F + N, N, N, N, N, N, N, N, N, N, ColonToken, N, N, N, N, N, // 30~3F + N16, // 40~4F + N, N, N, N, N, N, N, N, N, N, N, LeftBracketToken, N, RightBracketToken, N, N, // 50~5F + N, N, N, N, N, N, FalseToken, N, N, N, N, N, N, N, NullToken, N, // 60~6F + N, N, N, N, TrueToken, N, N, N, N, N, N, LeftCurlyBracketToken, N, RightCurlyBracketToken, N, N, // 70~7F + N16, N16, N16, N16, N16, N16, N16, N16 // 80~FF + }; +#undef N +#undef N16 +//!@endcond + + if (sizeof(Ch) == 1 || static_cast(c) < 256) + return static_cast(tokenMap[static_cast(c)]); + else + return NumberToken; + } + + RAPIDJSON_FORCEINLINE IterativeParsingState Predict(IterativeParsingState state, Token token) { + // current state x one lookahead token -> new state + static const char G[cIterativeParsingStateCount][kTokenCount] = { + // Start + { + IterativeParsingArrayInitialState, // Left bracket + IterativeParsingErrorState, // Right bracket + IterativeParsingObjectInitialState, // Left curly bracket + IterativeParsingErrorState, // Right curly bracket + IterativeParsingErrorState, // Comma + IterativeParsingErrorState, // Colon + IterativeParsingValueState, // String + IterativeParsingValueState, // False + IterativeParsingValueState, // True + IterativeParsingValueState, // Null + IterativeParsingValueState // Number + }, + // Finish(sink state) + { + IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, + IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, + IterativeParsingErrorState + }, + // Error(sink state) + { + IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, + IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, + IterativeParsingErrorState + }, + // ObjectInitial + { + IterativeParsingErrorState, // Left bracket + IterativeParsingErrorState, // Right bracket + IterativeParsingErrorState, // Left curly bracket + IterativeParsingObjectFinishState, // Right curly bracket + IterativeParsingErrorState, // Comma + IterativeParsingErrorState, // Colon + IterativeParsingMemberKeyState, // String + IterativeParsingErrorState, // False + IterativeParsingErrorState, // True + IterativeParsingErrorState, // Null + IterativeParsingErrorState // Number + }, + // MemberKey + { + IterativeParsingErrorState, // Left bracket + IterativeParsingErrorState, // Right bracket + IterativeParsingErrorState, // Left curly bracket + IterativeParsingErrorState, // Right curly bracket + IterativeParsingErrorState, // Comma + IterativeParsingKeyValueDelimiterState, // Colon + IterativeParsingErrorState, // String + IterativeParsingErrorState, // False + IterativeParsingErrorState, // True + IterativeParsingErrorState, // Null + IterativeParsingErrorState // Number + }, + // KeyValueDelimiter + { + IterativeParsingArrayInitialState, // Left bracket(push MemberValue state) + IterativeParsingErrorState, // Right bracket + IterativeParsingObjectInitialState, // Left curly bracket(push MemberValue state) + IterativeParsingErrorState, // Right curly bracket + IterativeParsingErrorState, // Comma + IterativeParsingErrorState, // Colon + IterativeParsingMemberValueState, // String + IterativeParsingMemberValueState, // False + IterativeParsingMemberValueState, // True + IterativeParsingMemberValueState, // Null + IterativeParsingMemberValueState // Number + }, + // MemberValue + { + IterativeParsingErrorState, // Left bracket + IterativeParsingErrorState, // Right bracket + IterativeParsingErrorState, // Left curly bracket + IterativeParsingObjectFinishState, // Right curly bracket + IterativeParsingMemberDelimiterState, // Comma + IterativeParsingErrorState, // Colon + IterativeParsingErrorState, // String + IterativeParsingErrorState, // False + IterativeParsingErrorState, // True + IterativeParsingErrorState, // Null + IterativeParsingErrorState // Number + }, + // MemberDelimiter + { + IterativeParsingErrorState, // Left bracket + IterativeParsingErrorState, // Right bracket + IterativeParsingErrorState, // Left curly bracket + IterativeParsingObjectFinishState, // Right curly bracket + IterativeParsingErrorState, // Comma + IterativeParsingErrorState, // Colon + IterativeParsingMemberKeyState, // String + IterativeParsingErrorState, // False + IterativeParsingErrorState, // True + IterativeParsingErrorState, // Null + IterativeParsingErrorState // Number + }, + // ObjectFinish(sink state) + { + IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, + IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, + IterativeParsingErrorState + }, + // ArrayInitial + { + IterativeParsingArrayInitialState, // Left bracket(push Element state) + IterativeParsingArrayFinishState, // Right bracket + IterativeParsingObjectInitialState, // Left curly bracket(push Element state) + IterativeParsingErrorState, // Right curly bracket + IterativeParsingErrorState, // Comma + IterativeParsingErrorState, // Colon + IterativeParsingElementState, // String + IterativeParsingElementState, // False + IterativeParsingElementState, // True + IterativeParsingElementState, // Null + IterativeParsingElementState // Number + }, + // Element + { + IterativeParsingErrorState, // Left bracket + IterativeParsingArrayFinishState, // Right bracket + IterativeParsingErrorState, // Left curly bracket + IterativeParsingErrorState, // Right curly bracket + IterativeParsingElementDelimiterState, // Comma + IterativeParsingErrorState, // Colon + IterativeParsingErrorState, // String + IterativeParsingErrorState, // False + IterativeParsingErrorState, // True + IterativeParsingErrorState, // Null + IterativeParsingErrorState // Number + }, + // ElementDelimiter + { + IterativeParsingArrayInitialState, // Left bracket(push Element state) + IterativeParsingArrayFinishState, // Right bracket + IterativeParsingObjectInitialState, // Left curly bracket(push Element state) + IterativeParsingErrorState, // Right curly bracket + IterativeParsingErrorState, // Comma + IterativeParsingErrorState, // Colon + IterativeParsingElementState, // String + IterativeParsingElementState, // False + IterativeParsingElementState, // True + IterativeParsingElementState, // Null + IterativeParsingElementState // Number + }, + // ArrayFinish(sink state) + { + IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, + IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, + IterativeParsingErrorState + }, + // Single Value (sink state) + { + IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, + IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, + IterativeParsingErrorState + } + }; // End of G + + return static_cast(G[state][token]); + } + + // Make an advance in the token stream and state based on the candidate destination state which was returned by Transit(). + // May return a new state on state pop. + template + RAPIDJSON_FORCEINLINE IterativeParsingState Transit(IterativeParsingState src, Token token, IterativeParsingState dst, InputStream& is, Handler& handler) { + (void)token; + + switch (dst) { + case IterativeParsingErrorState: + return dst; + + case IterativeParsingObjectInitialState: + case IterativeParsingArrayInitialState: + { + // Push the state(Element or MemeberValue) if we are nested in another array or value of member. + // In this way we can get the correct state on ObjectFinish or ArrayFinish by frame pop. + IterativeParsingState n = src; + if (src == IterativeParsingArrayInitialState || src == IterativeParsingElementDelimiterState) + n = IterativeParsingElementState; + else if (src == IterativeParsingKeyValueDelimiterState) + n = IterativeParsingMemberValueState; + // Push current state. + *stack_.template Push(1) = n; + // Initialize and push the member/element count. + *stack_.template Push(1) = 0; + // Call handler + bool hr = (dst == IterativeParsingObjectInitialState) ? handler.StartObject() : handler.StartArray(); + // On handler short circuits the parsing. + if (!hr) { + RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorTermination, is.Tell()); + return IterativeParsingErrorState; + } + else { + is.Take(); + return dst; + } + } + + case IterativeParsingMemberKeyState: + ParseString(is, handler, true); + if (HasParseError()) + return IterativeParsingErrorState; + else + return dst; + + case IterativeParsingKeyValueDelimiterState: + RAPIDJSON_ASSERT(token == ColonToken); + is.Take(); + return dst; + + case IterativeParsingMemberValueState: + // Must be non-compound value. Or it would be ObjectInitial or ArrayInitial state. + ParseValue(is, handler); + if (HasParseError()) { + return IterativeParsingErrorState; + } + return dst; + + case IterativeParsingElementState: + // Must be non-compound value. Or it would be ObjectInitial or ArrayInitial state. + ParseValue(is, handler); + if (HasParseError()) { + return IterativeParsingErrorState; + } + return dst; + + case IterativeParsingMemberDelimiterState: + case IterativeParsingElementDelimiterState: + is.Take(); + // Update member/element count. + *stack_.template Top() = *stack_.template Top() + 1; + return dst; + + case IterativeParsingObjectFinishState: + { + // Transit from delimiter is only allowed when trailing commas are enabled + if (!(parseFlags & kParseTrailingCommasFlag) && src == IterativeParsingMemberDelimiterState) { + RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorObjectMissName, is.Tell()); + return IterativeParsingErrorState; + } + // Get member count. + SizeType c = *stack_.template Pop(1); + // If the object is not empty, count the last member. + if (src == IterativeParsingMemberValueState) + ++c; + // Restore the state. + IterativeParsingState n = static_cast(*stack_.template Pop(1)); + // Transit to Finish state if this is the topmost scope. + if (n == IterativeParsingStartState) + n = IterativeParsingFinishState; + // Call handler + bool hr = handler.EndObject(c); + // On handler short circuits the parsing. + if (!hr) { + RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorTermination, is.Tell()); + return IterativeParsingErrorState; + } + else { + is.Take(); + return n; + } + } + + case IterativeParsingArrayFinishState: + { + // Transit from delimiter is only allowed when trailing commas are enabled + if (!(parseFlags & kParseTrailingCommasFlag) && src == IterativeParsingElementDelimiterState) { + RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorValueInvalid, is.Tell()); + return IterativeParsingErrorState; + } + // Get element count. + SizeType c = *stack_.template Pop(1); + // If the array is not empty, count the last element. + if (src == IterativeParsingElementState) + ++c; + // Restore the state. + IterativeParsingState n = static_cast(*stack_.template Pop(1)); + // Transit to Finish state if this is the topmost scope. + if (n == IterativeParsingStartState) + n = IterativeParsingFinishState; + // Call handler + bool hr = handler.EndArray(c); + // On handler short circuits the parsing. + if (!hr) { + RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorTermination, is.Tell()); + return IterativeParsingErrorState; + } + else { + is.Take(); + return n; + } + } + + default: + // This branch is for IterativeParsingValueState actually. + // Use `default:` rather than + // `case IterativeParsingValueState:` is for code coverage. + + // The IterativeParsingStartState is not enumerated in this switch-case. + // It is impossible for that case. And it can be caught by following assertion. + + // The IterativeParsingFinishState is not enumerated in this switch-case either. + // It is a "derivative" state which cannot triggered from Predict() directly. + // Therefore it cannot happen here. And it can be caught by following assertion. + RAPIDJSON_ASSERT(dst == IterativeParsingValueState); + + // Must be non-compound value. Or it would be ObjectInitial or ArrayInitial state. + ParseValue(is, handler); + if (HasParseError()) { + return IterativeParsingErrorState; + } + return IterativeParsingFinishState; + } + } + + template + void HandleError(IterativeParsingState src, InputStream& is) { + if (HasParseError()) { + // Error flag has been set. + return; + } + + switch (src) { + case IterativeParsingStartState: RAPIDJSON_PARSE_ERROR(kParseErrorDocumentEmpty, is.Tell()); return; + case IterativeParsingFinishState: RAPIDJSON_PARSE_ERROR(kParseErrorDocumentRootNotSingular, is.Tell()); return; + case IterativeParsingObjectInitialState: + case IterativeParsingMemberDelimiterState: RAPIDJSON_PARSE_ERROR(kParseErrorObjectMissName, is.Tell()); return; + case IterativeParsingMemberKeyState: RAPIDJSON_PARSE_ERROR(kParseErrorObjectMissColon, is.Tell()); return; + case IterativeParsingMemberValueState: RAPIDJSON_PARSE_ERROR(kParseErrorObjectMissCommaOrCurlyBracket, is.Tell()); return; + case IterativeParsingKeyValueDelimiterState: + case IterativeParsingArrayInitialState: + case IterativeParsingElementDelimiterState: RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, is.Tell()); return; + default: RAPIDJSON_ASSERT(src == IterativeParsingElementState); RAPIDJSON_PARSE_ERROR(kParseErrorArrayMissCommaOrSquareBracket, is.Tell()); return; + } + } + + template + ParseResult IterativeParse(InputStream& is, Handler& handler) { + parseResult_.Clear(); + ClearStackOnExit scope(*this); + IterativeParsingState state = IterativeParsingStartState; + + SkipWhitespaceAndComments(is); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_); + while (is.Peek() != '\0') { + Token t = Tokenize(is.Peek()); + IterativeParsingState n = Predict(state, t); + IterativeParsingState d = Transit(state, t, n, is, handler); + + if (d == IterativeParsingErrorState) { + HandleError(state, is); + break; + } + + state = d; + + // Do not further consume streams if a root JSON has been parsed. + if ((parseFlags & kParseStopWhenDoneFlag) && state == IterativeParsingFinishState) + break; + + SkipWhitespaceAndComments(is); + RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_); + } + + // Handle the end of file. + if (state != IterativeParsingFinishState) + HandleError(state, is); + + return parseResult_; + } + + static const size_t kDefaultStackCapacity = 256; //!< Default stack capacity in bytes for storing a single decoded string. + internal::Stack stack_; //!< A stack for storing decoded string temporarily during non-destructive parsing. + ParseResult parseResult_; +}; // class GenericReader + +//! Reader with UTF8 encoding and default allocator. +typedef GenericReader, UTF8<> > Reader; + +RAPIDJSON_NAMESPACE_END + +#ifdef __clang__ +RAPIDJSON_DIAG_POP +#endif + + +#ifdef __GNUC__ +RAPIDJSON_DIAG_POP +#endif + +#ifdef _MSC_VER +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_READER_H_ diff --git a/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/schema.h b/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/schema.h new file mode 100644 index 0000000..b182aa2 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/schema.h @@ -0,0 +1,2006 @@ +// Tencent is pleased to support the open source community by making RapidJSON available-> +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip-> All rights reserved-> +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License-> You may obtain a copy of the License at +// +// http://opensource->org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied-> See the License for the +// specific language governing permissions and limitations under the License-> + +#ifndef RAPIDJSON_SCHEMA_H_ +#define RAPIDJSON_SCHEMA_H_ + +#include "document.h" +#include "pointer.h" +#include // abs, floor + +#if !defined(RAPIDJSON_SCHEMA_USE_INTERNALREGEX) +#define RAPIDJSON_SCHEMA_USE_INTERNALREGEX 1 +#else +#define RAPIDJSON_SCHEMA_USE_INTERNALREGEX 0 +#endif + +#if !RAPIDJSON_SCHEMA_USE_INTERNALREGEX && !defined(RAPIDJSON_SCHEMA_USE_STDREGEX) && (__cplusplus >=201103L || (defined(_MSC_VER) && _MSC_VER >= 1800)) +#define RAPIDJSON_SCHEMA_USE_STDREGEX 1 +#else +#define RAPIDJSON_SCHEMA_USE_STDREGEX 0 +#endif + +#if RAPIDJSON_SCHEMA_USE_INTERNALREGEX +#include "internal/regex.h" +#elif RAPIDJSON_SCHEMA_USE_STDREGEX +#include +#endif + +#if RAPIDJSON_SCHEMA_USE_INTERNALREGEX || RAPIDJSON_SCHEMA_USE_STDREGEX +#define RAPIDJSON_SCHEMA_HAS_REGEX 1 +#else +#define RAPIDJSON_SCHEMA_HAS_REGEX 0 +#endif + +#ifndef RAPIDJSON_SCHEMA_VERBOSE +#define RAPIDJSON_SCHEMA_VERBOSE 0 +#endif + +#if RAPIDJSON_SCHEMA_VERBOSE +#include "stringbuffer.h" +#endif + +RAPIDJSON_DIAG_PUSH + +#if defined(__GNUC__) +RAPIDJSON_DIAG_OFF(effc++) +#endif + +#ifdef __clang__ +RAPIDJSON_DIAG_OFF(weak-vtables) +RAPIDJSON_DIAG_OFF(exit-time-destructors) +RAPIDJSON_DIAG_OFF(c++98-compat-pedantic) +RAPIDJSON_DIAG_OFF(variadic-macros) +#endif + +#ifdef _MSC_VER +RAPIDJSON_DIAG_OFF(4512) // assignment operator could not be generated +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +/////////////////////////////////////////////////////////////////////////////// +// Verbose Utilities + +#if RAPIDJSON_SCHEMA_VERBOSE + +namespace internal { + +inline void PrintInvalidKeyword(const char* keyword) { + printf("Fail keyword: %s\n", keyword); +} + +inline void PrintInvalidKeyword(const wchar_t* keyword) { + wprintf(L"Fail keyword: %ls\n", keyword); +} + +inline void PrintInvalidDocument(const char* document) { + printf("Fail document: %s\n\n", document); +} + +inline void PrintInvalidDocument(const wchar_t* document) { + wprintf(L"Fail document: %ls\n\n", document); +} + +inline void PrintValidatorPointers(unsigned depth, const char* s, const char* d) { + printf("S: %*s%s\nD: %*s%s\n\n", depth * 4, " ", s, depth * 4, " ", d); +} + +inline void PrintValidatorPointers(unsigned depth, const wchar_t* s, const wchar_t* d) { + wprintf(L"S: %*ls%ls\nD: %*ls%ls\n\n", depth * 4, L" ", s, depth * 4, L" ", d); +} + +} // namespace internal + +#endif // RAPIDJSON_SCHEMA_VERBOSE + +/////////////////////////////////////////////////////////////////////////////// +// RAPIDJSON_INVALID_KEYWORD_RETURN + +#if RAPIDJSON_SCHEMA_VERBOSE +#define RAPIDJSON_INVALID_KEYWORD_VERBOSE(keyword) internal::PrintInvalidKeyword(keyword) +#else +#define RAPIDJSON_INVALID_KEYWORD_VERBOSE(keyword) +#endif + +#define RAPIDJSON_INVALID_KEYWORD_RETURN(keyword)\ +RAPIDJSON_MULTILINEMACRO_BEGIN\ + context.invalidKeyword = keyword.GetString();\ + RAPIDJSON_INVALID_KEYWORD_VERBOSE(keyword.GetString());\ + return false;\ +RAPIDJSON_MULTILINEMACRO_END + +/////////////////////////////////////////////////////////////////////////////// +// Forward declarations + +template +class GenericSchemaDocument; + +namespace internal { + +template +class Schema; + +/////////////////////////////////////////////////////////////////////////////// +// ISchemaValidator + +class ISchemaValidator { +public: + virtual ~ISchemaValidator() {} + virtual bool IsValid() const = 0; +}; + +/////////////////////////////////////////////////////////////////////////////// +// ISchemaStateFactory + +template +class ISchemaStateFactory { +public: + virtual ~ISchemaStateFactory() {} + virtual ISchemaValidator* CreateSchemaValidator(const SchemaType&) = 0; + virtual void DestroySchemaValidator(ISchemaValidator* validator) = 0; + virtual void* CreateHasher() = 0; + virtual uint64_t GetHashCode(void* hasher) = 0; + virtual void DestroryHasher(void* hasher) = 0; + virtual void* MallocState(size_t size) = 0; + virtual void FreeState(void* p) = 0; +}; + +/////////////////////////////////////////////////////////////////////////////// +// Hasher + +// For comparison of compound value +template +class Hasher { +public: + typedef typename Encoding::Ch Ch; + + Hasher(Allocator* allocator = 0, size_t stackCapacity = kDefaultSize) : stack_(allocator, stackCapacity) {} + + bool Null() { return WriteType(kNullType); } + bool Bool(bool b) { return WriteType(b ? kTrueType : kFalseType); } + bool Int(int i) { Number n; n.u.i = i; n.d = static_cast(i); return WriteNumber(n); } + bool Uint(unsigned u) { Number n; n.u.u = u; n.d = static_cast(u); return WriteNumber(n); } + bool Int64(int64_t i) { Number n; n.u.i = i; n.d = static_cast(i); return WriteNumber(n); } + bool Uint64(uint64_t u) { Number n; n.u.u = u; n.d = static_cast(u); return WriteNumber(n); } + bool Double(double d) { + Number n; + if (d < 0) n.u.i = static_cast(d); + else n.u.u = static_cast(d); + n.d = d; + return WriteNumber(n); + } + + bool RawNumber(const Ch* str, SizeType len, bool) { + WriteBuffer(kNumberType, str, len * sizeof(Ch)); + return true; + } + + bool String(const Ch* str, SizeType len, bool) { + WriteBuffer(kStringType, str, len * sizeof(Ch)); + return true; + } + + bool StartObject() { return true; } + bool Key(const Ch* str, SizeType len, bool copy) { return String(str, len, copy); } + bool EndObject(SizeType memberCount) { + uint64_t h = Hash(0, kObjectType); + uint64_t* kv = stack_.template Pop(memberCount * 2); + for (SizeType i = 0; i < memberCount; i++) + h ^= Hash(kv[i * 2], kv[i * 2 + 1]); // Use xor to achieve member order insensitive + *stack_.template Push() = h; + return true; + } + + bool StartArray() { return true; } + bool EndArray(SizeType elementCount) { + uint64_t h = Hash(0, kArrayType); + uint64_t* e = stack_.template Pop(elementCount); + for (SizeType i = 0; i < elementCount; i++) + h = Hash(h, e[i]); // Use hash to achieve element order sensitive + *stack_.template Push() = h; + return true; + } + + bool IsValid() const { return stack_.GetSize() == sizeof(uint64_t); } + + uint64_t GetHashCode() const { + RAPIDJSON_ASSERT(IsValid()); + return *stack_.template Top(); + } + +private: + static const size_t kDefaultSize = 256; + struct Number { + union U { + uint64_t u; + int64_t i; + }u; + double d; + }; + + bool WriteType(Type type) { return WriteBuffer(type, 0, 0); } + + bool WriteNumber(const Number& n) { return WriteBuffer(kNumberType, &n, sizeof(n)); } + + bool WriteBuffer(Type type, const void* data, size_t len) { + // FNV-1a from http://isthe.com/chongo/tech/comp/fnv/ + uint64_t h = Hash(RAPIDJSON_UINT64_C2(0x84222325, 0xcbf29ce4), type); + const unsigned char* d = static_cast(data); + for (size_t i = 0; i < len; i++) + h = Hash(h, d[i]); + *stack_.template Push() = h; + return true; + } + + static uint64_t Hash(uint64_t h, uint64_t d) { + static const uint64_t kPrime = RAPIDJSON_UINT64_C2(0x00000100, 0x000001b3); + h ^= d; + h *= kPrime; + return h; + } + + Stack stack_; +}; + +/////////////////////////////////////////////////////////////////////////////// +// SchemaValidationContext + +template +struct SchemaValidationContext { + typedef Schema SchemaType; + typedef ISchemaStateFactory SchemaValidatorFactoryType; + typedef typename SchemaType::ValueType ValueType; + typedef typename ValueType::Ch Ch; + + enum PatternValidatorType { + kPatternValidatorOnly, + kPatternValidatorWithProperty, + kPatternValidatorWithAdditionalProperty + }; + + SchemaValidationContext(SchemaValidatorFactoryType& f, const SchemaType* s) : + factory(f), + schema(s), + valueSchema(), + invalidKeyword(), + hasher(), + arrayElementHashCodes(), + validators(), + validatorCount(), + patternPropertiesValidators(), + patternPropertiesValidatorCount(), + patternPropertiesSchemas(), + patternPropertiesSchemaCount(), + valuePatternValidatorType(kPatternValidatorOnly), + propertyExist(), + inArray(false), + valueUniqueness(false), + arrayUniqueness(false) + { + } + + ~SchemaValidationContext() { + if (hasher) + factory.DestroryHasher(hasher); + if (validators) { + for (SizeType i = 0; i < validatorCount; i++) + factory.DestroySchemaValidator(validators[i]); + factory.FreeState(validators); + } + if (patternPropertiesValidators) { + for (SizeType i = 0; i < patternPropertiesValidatorCount; i++) + factory.DestroySchemaValidator(patternPropertiesValidators[i]); + factory.FreeState(patternPropertiesValidators); + } + if (patternPropertiesSchemas) + factory.FreeState(patternPropertiesSchemas); + if (propertyExist) + factory.FreeState(propertyExist); + } + + SchemaValidatorFactoryType& factory; + const SchemaType* schema; + const SchemaType* valueSchema; + const Ch* invalidKeyword; + void* hasher; // Only validator access + void* arrayElementHashCodes; // Only validator access this + ISchemaValidator** validators; + SizeType validatorCount; + ISchemaValidator** patternPropertiesValidators; + SizeType patternPropertiesValidatorCount; + const SchemaType** patternPropertiesSchemas; + SizeType patternPropertiesSchemaCount; + PatternValidatorType valuePatternValidatorType; + PatternValidatorType objectPatternValidatorType; + SizeType arrayElementIndex; + bool* propertyExist; + bool inArray; + bool valueUniqueness; + bool arrayUniqueness; +}; + +/////////////////////////////////////////////////////////////////////////////// +// Schema + +template +class Schema { +public: + typedef typename SchemaDocumentType::ValueType ValueType; + typedef typename SchemaDocumentType::AllocatorType AllocatorType; + typedef typename SchemaDocumentType::PointerType PointerType; + typedef typename ValueType::EncodingType EncodingType; + typedef typename EncodingType::Ch Ch; + typedef SchemaValidationContext Context; + typedef Schema SchemaType; + typedef GenericValue SValue; + friend class GenericSchemaDocument; + + Schema(SchemaDocumentType* schemaDocument, const PointerType& p, const ValueType& value, const ValueType& document, AllocatorType* allocator) : + allocator_(allocator), + enum_(), + enumCount_(), + not_(), + type_((1 << kTotalSchemaType) - 1), // typeless + validatorCount_(), + properties_(), + additionalPropertiesSchema_(), + patternProperties_(), + patternPropertyCount_(), + propertyCount_(), + minProperties_(), + maxProperties_(SizeType(~0)), + additionalProperties_(true), + hasDependencies_(), + hasRequired_(), + hasSchemaDependencies_(), + additionalItemsSchema_(), + itemsList_(), + itemsTuple_(), + itemsTupleCount_(), + minItems_(), + maxItems_(SizeType(~0)), + additionalItems_(true), + uniqueItems_(false), + pattern_(), + minLength_(0), + maxLength_(~SizeType(0)), + exclusiveMinimum_(false), + exclusiveMaximum_(false) + { + typedef typename SchemaDocumentType::ValueType ValueType; + typedef typename ValueType::ConstValueIterator ConstValueIterator; + typedef typename ValueType::ConstMemberIterator ConstMemberIterator; + + if (!value.IsObject()) + return; + + if (const ValueType* v = GetMember(value, GetTypeString())) { + type_ = 0; + if (v->IsString()) + AddType(*v); + else if (v->IsArray()) + for (ConstValueIterator itr = v->Begin(); itr != v->End(); ++itr) + AddType(*itr); + } + + if (const ValueType* v = GetMember(value, GetEnumString())) + if (v->IsArray() && v->Size() > 0) { + enum_ = static_cast(allocator_->Malloc(sizeof(uint64_t) * v->Size())); + for (ConstValueIterator itr = v->Begin(); itr != v->End(); ++itr) { + typedef Hasher > EnumHasherType; + char buffer[256 + 24]; + MemoryPoolAllocator<> hasherAllocator(buffer, sizeof(buffer)); + EnumHasherType h(&hasherAllocator, 256); + itr->Accept(h); + enum_[enumCount_++] = h.GetHashCode(); + } + } + + if (schemaDocument) { + AssignIfExist(allOf_, *schemaDocument, p, value, GetAllOfString(), document); + AssignIfExist(anyOf_, *schemaDocument, p, value, GetAnyOfString(), document); + AssignIfExist(oneOf_, *schemaDocument, p, value, GetOneOfString(), document); + } + + if (const ValueType* v = GetMember(value, GetNotString())) { + schemaDocument->CreateSchema(¬_, p.Append(GetNotString(), allocator_), *v, document); + notValidatorIndex_ = validatorCount_; + validatorCount_++; + } + + // Object + + const ValueType* properties = GetMember(value, GetPropertiesString()); + const ValueType* required = GetMember(value, GetRequiredString()); + const ValueType* dependencies = GetMember(value, GetDependenciesString()); + { + // Gather properties from properties/required/dependencies + SValue allProperties(kArrayType); + + if (properties && properties->IsObject()) + for (ConstMemberIterator itr = properties->MemberBegin(); itr != properties->MemberEnd(); ++itr) + AddUniqueElement(allProperties, itr->name); + + if (required && required->IsArray()) + for (ConstValueIterator itr = required->Begin(); itr != required->End(); ++itr) + if (itr->IsString()) + AddUniqueElement(allProperties, *itr); + + if (dependencies && dependencies->IsObject()) + for (ConstMemberIterator itr = dependencies->MemberBegin(); itr != dependencies->MemberEnd(); ++itr) { + AddUniqueElement(allProperties, itr->name); + if (itr->value.IsArray()) + for (ConstValueIterator i = itr->value.Begin(); i != itr->value.End(); ++i) + if (i->IsString()) + AddUniqueElement(allProperties, *i); + } + + if (allProperties.Size() > 0) { + propertyCount_ = allProperties.Size(); + properties_ = static_cast(allocator_->Malloc(sizeof(Property) * propertyCount_)); + for (SizeType i = 0; i < propertyCount_; i++) { + new (&properties_[i]) Property(); + properties_[i].name = allProperties[i]; + properties_[i].schema = GetTypeless(); + } + } + } + + if (properties && properties->IsObject()) { + PointerType q = p.Append(GetPropertiesString(), allocator_); + for (ConstMemberIterator itr = properties->MemberBegin(); itr != properties->MemberEnd(); ++itr) { + SizeType index; + if (FindPropertyIndex(itr->name, &index)) + schemaDocument->CreateSchema(&properties_[index].schema, q.Append(itr->name, allocator_), itr->value, document); + } + } + + if (const ValueType* v = GetMember(value, GetPatternPropertiesString())) { + PointerType q = p.Append(GetPatternPropertiesString(), allocator_); + patternProperties_ = static_cast(allocator_->Malloc(sizeof(PatternProperty) * v->MemberCount())); + patternPropertyCount_ = 0; + + for (ConstMemberIterator itr = v->MemberBegin(); itr != v->MemberEnd(); ++itr) { + new (&patternProperties_[patternPropertyCount_]) PatternProperty(); + patternProperties_[patternPropertyCount_].pattern = CreatePattern(itr->name); + schemaDocument->CreateSchema(&patternProperties_[patternPropertyCount_].schema, q.Append(itr->name, allocator_), itr->value, document); + patternPropertyCount_++; + } + } + + if (required && required->IsArray()) + for (ConstValueIterator itr = required->Begin(); itr != required->End(); ++itr) + if (itr->IsString()) { + SizeType index; + if (FindPropertyIndex(*itr, &index)) { + properties_[index].required = true; + hasRequired_ = true; + } + } + + if (dependencies && dependencies->IsObject()) { + PointerType q = p.Append(GetDependenciesString(), allocator_); + hasDependencies_ = true; + for (ConstMemberIterator itr = dependencies->MemberBegin(); itr != dependencies->MemberEnd(); ++itr) { + SizeType sourceIndex; + if (FindPropertyIndex(itr->name, &sourceIndex)) { + if (itr->value.IsArray()) { + properties_[sourceIndex].dependencies = static_cast(allocator_->Malloc(sizeof(bool) * propertyCount_)); + std::memset(properties_[sourceIndex].dependencies, 0, sizeof(bool)* propertyCount_); + for (ConstValueIterator targetItr = itr->value.Begin(); targetItr != itr->value.End(); ++targetItr) { + SizeType targetIndex; + if (FindPropertyIndex(*targetItr, &targetIndex)) + properties_[sourceIndex].dependencies[targetIndex] = true; + } + } + else if (itr->value.IsObject()) { + hasSchemaDependencies_ = true; + schemaDocument->CreateSchema(&properties_[sourceIndex].dependenciesSchema, q.Append(itr->name, allocator_), itr->value, document); + properties_[sourceIndex].dependenciesValidatorIndex = validatorCount_; + validatorCount_++; + } + } + } + } + + if (const ValueType* v = GetMember(value, GetAdditionalPropertiesString())) { + if (v->IsBool()) + additionalProperties_ = v->GetBool(); + else if (v->IsObject()) + schemaDocument->CreateSchema(&additionalPropertiesSchema_, p.Append(GetAdditionalPropertiesString(), allocator_), *v, document); + } + + AssignIfExist(minProperties_, value, GetMinPropertiesString()); + AssignIfExist(maxProperties_, value, GetMaxPropertiesString()); + + // Array + if (const ValueType* v = GetMember(value, GetItemsString())) { + PointerType q = p.Append(GetItemsString(), allocator_); + if (v->IsObject()) // List validation + schemaDocument->CreateSchema(&itemsList_, q, *v, document); + else if (v->IsArray()) { // Tuple validation + itemsTuple_ = static_cast(allocator_->Malloc(sizeof(const Schema*) * v->Size())); + SizeType index = 0; + for (ConstValueIterator itr = v->Begin(); itr != v->End(); ++itr, index++) + schemaDocument->CreateSchema(&itemsTuple_[itemsTupleCount_++], q.Append(index, allocator_), *itr, document); + } + } + + AssignIfExist(minItems_, value, GetMinItemsString()); + AssignIfExist(maxItems_, value, GetMaxItemsString()); + + if (const ValueType* v = GetMember(value, GetAdditionalItemsString())) { + if (v->IsBool()) + additionalItems_ = v->GetBool(); + else if (v->IsObject()) + schemaDocument->CreateSchema(&additionalItemsSchema_, p.Append(GetAdditionalItemsString(), allocator_), *v, document); + } + + AssignIfExist(uniqueItems_, value, GetUniqueItemsString()); + + // String + AssignIfExist(minLength_, value, GetMinLengthString()); + AssignIfExist(maxLength_, value, GetMaxLengthString()); + + if (const ValueType* v = GetMember(value, GetPatternString())) + pattern_ = CreatePattern(*v); + + // Number + if (const ValueType* v = GetMember(value, GetMinimumString())) + if (v->IsNumber()) + minimum_.CopyFrom(*v, *allocator_); + + if (const ValueType* v = GetMember(value, GetMaximumString())) + if (v->IsNumber()) + maximum_.CopyFrom(*v, *allocator_); + + AssignIfExist(exclusiveMinimum_, value, GetExclusiveMinimumString()); + AssignIfExist(exclusiveMaximum_, value, GetExclusiveMaximumString()); + + if (const ValueType* v = GetMember(value, GetMultipleOfString())) + if (v->IsNumber() && v->GetDouble() > 0.0) + multipleOf_.CopyFrom(*v, *allocator_); + } + + ~Schema() { + if (allocator_) { + allocator_->Free(enum_); + } + if (properties_) { + for (SizeType i = 0; i < propertyCount_; i++) + properties_[i].~Property(); + AllocatorType::Free(properties_); + } + if (patternProperties_) { + for (SizeType i = 0; i < patternPropertyCount_; i++) + patternProperties_[i].~PatternProperty(); + AllocatorType::Free(patternProperties_); + } + AllocatorType::Free(itemsTuple_); +#if RAPIDJSON_SCHEMA_HAS_REGEX + if (pattern_) { + pattern_->~RegexType(); + allocator_->Free(pattern_); + } +#endif + } + + bool BeginValue(Context& context) const { + if (context.inArray) { + if (uniqueItems_) + context.valueUniqueness = true; + + if (itemsList_) + context.valueSchema = itemsList_; + else if (itemsTuple_) { + if (context.arrayElementIndex < itemsTupleCount_) + context.valueSchema = itemsTuple_[context.arrayElementIndex]; + else if (additionalItemsSchema_) + context.valueSchema = additionalItemsSchema_; + else if (additionalItems_) + context.valueSchema = GetTypeless(); + else + RAPIDJSON_INVALID_KEYWORD_RETURN(GetItemsString()); + } + else + context.valueSchema = GetTypeless(); + + context.arrayElementIndex++; + } + return true; + } + + RAPIDJSON_FORCEINLINE bool EndValue(Context& context) const { + if (context.patternPropertiesValidatorCount > 0) { + bool otherValid = false; + SizeType count = context.patternPropertiesValidatorCount; + if (context.objectPatternValidatorType != Context::kPatternValidatorOnly) + otherValid = context.patternPropertiesValidators[--count]->IsValid(); + + bool patternValid = true; + for (SizeType i = 0; i < count; i++) + if (!context.patternPropertiesValidators[i]->IsValid()) { + patternValid = false; + break; + } + + if (context.objectPatternValidatorType == Context::kPatternValidatorOnly) { + if (!patternValid) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetPatternPropertiesString()); + } + else if (context.objectPatternValidatorType == Context::kPatternValidatorWithProperty) { + if (!patternValid || !otherValid) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetPatternPropertiesString()); + } + else if (!patternValid && !otherValid) // kPatternValidatorWithAdditionalProperty) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetPatternPropertiesString()); + } + + if (enum_) { + const uint64_t h = context.factory.GetHashCode(context.hasher); + for (SizeType i = 0; i < enumCount_; i++) + if (enum_[i] == h) + goto foundEnum; + RAPIDJSON_INVALID_KEYWORD_RETURN(GetEnumString()); + foundEnum:; + } + + if (allOf_.schemas) + for (SizeType i = allOf_.begin; i < allOf_.begin + allOf_.count; i++) + if (!context.validators[i]->IsValid()) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetAllOfString()); + + if (anyOf_.schemas) { + for (SizeType i = anyOf_.begin; i < anyOf_.begin + anyOf_.count; i++) + if (context.validators[i]->IsValid()) + goto foundAny; + RAPIDJSON_INVALID_KEYWORD_RETURN(GetAnyOfString()); + foundAny:; + } + + if (oneOf_.schemas) { + bool oneValid = false; + for (SizeType i = oneOf_.begin; i < oneOf_.begin + oneOf_.count; i++) + if (context.validators[i]->IsValid()) { + if (oneValid) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetOneOfString()); + else + oneValid = true; + } + if (!oneValid) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetOneOfString()); + } + + if (not_ && context.validators[notValidatorIndex_]->IsValid()) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetNotString()); + + return true; + } + + bool Null(Context& context) const { + if (!(type_ & (1 << kNullSchemaType))) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetTypeString()); + return CreateParallelValidator(context); + } + + bool Bool(Context& context, bool) const { + if (!(type_ & (1 << kBooleanSchemaType))) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetTypeString()); + return CreateParallelValidator(context); + } + + bool Int(Context& context, int i) const { + if (!CheckInt(context, i)) + return false; + return CreateParallelValidator(context); + } + + bool Uint(Context& context, unsigned u) const { + if (!CheckUint(context, u)) + return false; + return CreateParallelValidator(context); + } + + bool Int64(Context& context, int64_t i) const { + if (!CheckInt(context, i)) + return false; + return CreateParallelValidator(context); + } + + bool Uint64(Context& context, uint64_t u) const { + if (!CheckUint(context, u)) + return false; + return CreateParallelValidator(context); + } + + bool Double(Context& context, double d) const { + if (!(type_ & (1 << kNumberSchemaType))) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetTypeString()); + + if (!minimum_.IsNull() && !CheckDoubleMinimum(context, d)) + return false; + + if (!maximum_.IsNull() && !CheckDoubleMaximum(context, d)) + return false; + + if (!multipleOf_.IsNull() && !CheckDoubleMultipleOf(context, d)) + return false; + + return CreateParallelValidator(context); + } + + bool String(Context& context, const Ch* str, SizeType length, bool) const { + if (!(type_ & (1 << kStringSchemaType))) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetTypeString()); + + if (minLength_ != 0 || maxLength_ != SizeType(~0)) { + SizeType count; + if (internal::CountStringCodePoint(str, length, &count)) { + if (count < minLength_) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMinLengthString()); + if (count > maxLength_) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMaxLengthString()); + } + } + + if (pattern_ && !IsPatternMatch(pattern_, str, length)) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetPatternString()); + + return CreateParallelValidator(context); + } + + bool StartObject(Context& context) const { + if (!(type_ & (1 << kObjectSchemaType))) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetTypeString()); + + if (hasDependencies_ || hasRequired_) { + context.propertyExist = static_cast(context.factory.MallocState(sizeof(bool) * propertyCount_)); + std::memset(context.propertyExist, 0, sizeof(bool) * propertyCount_); + } + + if (patternProperties_) { // pre-allocate schema array + SizeType count = patternPropertyCount_ + 1; // extra for valuePatternValidatorType + context.patternPropertiesSchemas = static_cast(context.factory.MallocState(sizeof(const SchemaType*) * count)); + context.patternPropertiesSchemaCount = 0; + std::memset(context.patternPropertiesSchemas, 0, sizeof(SchemaType*) * count); + } + + return CreateParallelValidator(context); + } + + bool Key(Context& context, const Ch* str, SizeType len, bool) const { + if (patternProperties_) { + context.patternPropertiesSchemaCount = 0; + for (SizeType i = 0; i < patternPropertyCount_; i++) + if (patternProperties_[i].pattern && IsPatternMatch(patternProperties_[i].pattern, str, len)) + context.patternPropertiesSchemas[context.patternPropertiesSchemaCount++] = patternProperties_[i].schema; + } + + SizeType index; + if (FindPropertyIndex(ValueType(str, len).Move(), &index)) { + if (context.patternPropertiesSchemaCount > 0) { + context.patternPropertiesSchemas[context.patternPropertiesSchemaCount++] = properties_[index].schema; + context.valueSchema = GetTypeless(); + context.valuePatternValidatorType = Context::kPatternValidatorWithProperty; + } + else + context.valueSchema = properties_[index].schema; + + if (context.propertyExist) + context.propertyExist[index] = true; + + return true; + } + + if (additionalPropertiesSchema_) { + if (additionalPropertiesSchema_ && context.patternPropertiesSchemaCount > 0) { + context.patternPropertiesSchemas[context.patternPropertiesSchemaCount++] = additionalPropertiesSchema_; + context.valueSchema = GetTypeless(); + context.valuePatternValidatorType = Context::kPatternValidatorWithAdditionalProperty; + } + else + context.valueSchema = additionalPropertiesSchema_; + return true; + } + else if (additionalProperties_) { + context.valueSchema = GetTypeless(); + return true; + } + + if (context.patternPropertiesSchemaCount == 0) // patternProperties are not additional properties + RAPIDJSON_INVALID_KEYWORD_RETURN(GetAdditionalPropertiesString()); + + return true; + } + + bool EndObject(Context& context, SizeType memberCount) const { + if (hasRequired_) + for (SizeType index = 0; index < propertyCount_; index++) + if (properties_[index].required) + if (!context.propertyExist[index]) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetRequiredString()); + + if (memberCount < minProperties_) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMinPropertiesString()); + + if (memberCount > maxProperties_) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMaxPropertiesString()); + + if (hasDependencies_) { + for (SizeType sourceIndex = 0; sourceIndex < propertyCount_; sourceIndex++) + if (context.propertyExist[sourceIndex]) { + if (properties_[sourceIndex].dependencies) { + for (SizeType targetIndex = 0; targetIndex < propertyCount_; targetIndex++) + if (properties_[sourceIndex].dependencies[targetIndex] && !context.propertyExist[targetIndex]) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetDependenciesString()); + } + else if (properties_[sourceIndex].dependenciesSchema) + if (!context.validators[properties_[sourceIndex].dependenciesValidatorIndex]->IsValid()) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetDependenciesString()); + } + } + + return true; + } + + bool StartArray(Context& context) const { + if (!(type_ & (1 << kArraySchemaType))) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetTypeString()); + + context.arrayElementIndex = 0; + context.inArray = true; + + return CreateParallelValidator(context); + } + + bool EndArray(Context& context, SizeType elementCount) const { + context.inArray = false; + + if (elementCount < minItems_) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMinItemsString()); + + if (elementCount > maxItems_) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMaxItemsString()); + + return true; + } + + // Generate functions for string literal according to Ch +#define RAPIDJSON_STRING_(name, ...) \ + static const ValueType& Get##name##String() {\ + static const Ch s[] = { __VA_ARGS__, '\0' };\ + static const ValueType v(s, sizeof(s) / sizeof(Ch) - 1);\ + return v;\ + } + + RAPIDJSON_STRING_(Null, 'n', 'u', 'l', 'l') + RAPIDJSON_STRING_(Boolean, 'b', 'o', 'o', 'l', 'e', 'a', 'n') + RAPIDJSON_STRING_(Object, 'o', 'b', 'j', 'e', 'c', 't') + RAPIDJSON_STRING_(Array, 'a', 'r', 'r', 'a', 'y') + RAPIDJSON_STRING_(String, 's', 't', 'r', 'i', 'n', 'g') + RAPIDJSON_STRING_(Number, 'n', 'u', 'm', 'b', 'e', 'r') + RAPIDJSON_STRING_(Integer, 'i', 'n', 't', 'e', 'g', 'e', 'r') + RAPIDJSON_STRING_(Type, 't', 'y', 'p', 'e') + RAPIDJSON_STRING_(Enum, 'e', 'n', 'u', 'm') + RAPIDJSON_STRING_(AllOf, 'a', 'l', 'l', 'O', 'f') + RAPIDJSON_STRING_(AnyOf, 'a', 'n', 'y', 'O', 'f') + RAPIDJSON_STRING_(OneOf, 'o', 'n', 'e', 'O', 'f') + RAPIDJSON_STRING_(Not, 'n', 'o', 't') + RAPIDJSON_STRING_(Properties, 'p', 'r', 'o', 'p', 'e', 'r', 't', 'i', 'e', 's') + RAPIDJSON_STRING_(Required, 'r', 'e', 'q', 'u', 'i', 'r', 'e', 'd') + RAPIDJSON_STRING_(Dependencies, 'd', 'e', 'p', 'e', 'n', 'd', 'e', 'n', 'c', 'i', 'e', 's') + RAPIDJSON_STRING_(PatternProperties, 'p', 'a', 't', 't', 'e', 'r', 'n', 'P', 'r', 'o', 'p', 'e', 'r', 't', 'i', 'e', 's') + RAPIDJSON_STRING_(AdditionalProperties, 'a', 'd', 'd', 'i', 't', 'i', 'o', 'n', 'a', 'l', 'P', 'r', 'o', 'p', 'e', 'r', 't', 'i', 'e', 's') + RAPIDJSON_STRING_(MinProperties, 'm', 'i', 'n', 'P', 'r', 'o', 'p', 'e', 'r', 't', 'i', 'e', 's') + RAPIDJSON_STRING_(MaxProperties, 'm', 'a', 'x', 'P', 'r', 'o', 'p', 'e', 'r', 't', 'i', 'e', 's') + RAPIDJSON_STRING_(Items, 'i', 't', 'e', 'm', 's') + RAPIDJSON_STRING_(MinItems, 'm', 'i', 'n', 'I', 't', 'e', 'm', 's') + RAPIDJSON_STRING_(MaxItems, 'm', 'a', 'x', 'I', 't', 'e', 'm', 's') + RAPIDJSON_STRING_(AdditionalItems, 'a', 'd', 'd', 'i', 't', 'i', 'o', 'n', 'a', 'l', 'I', 't', 'e', 'm', 's') + RAPIDJSON_STRING_(UniqueItems, 'u', 'n', 'i', 'q', 'u', 'e', 'I', 't', 'e', 'm', 's') + RAPIDJSON_STRING_(MinLength, 'm', 'i', 'n', 'L', 'e', 'n', 'g', 't', 'h') + RAPIDJSON_STRING_(MaxLength, 'm', 'a', 'x', 'L', 'e', 'n', 'g', 't', 'h') + RAPIDJSON_STRING_(Pattern, 'p', 'a', 't', 't', 'e', 'r', 'n') + RAPIDJSON_STRING_(Minimum, 'm', 'i', 'n', 'i', 'm', 'u', 'm') + RAPIDJSON_STRING_(Maximum, 'm', 'a', 'x', 'i', 'm', 'u', 'm') + RAPIDJSON_STRING_(ExclusiveMinimum, 'e', 'x', 'c', 'l', 'u', 's', 'i', 'v', 'e', 'M', 'i', 'n', 'i', 'm', 'u', 'm') + RAPIDJSON_STRING_(ExclusiveMaximum, 'e', 'x', 'c', 'l', 'u', 's', 'i', 'v', 'e', 'M', 'a', 'x', 'i', 'm', 'u', 'm') + RAPIDJSON_STRING_(MultipleOf, 'm', 'u', 'l', 't', 'i', 'p', 'l', 'e', 'O', 'f') + +#undef RAPIDJSON_STRING_ + +private: + enum SchemaValueType { + kNullSchemaType, + kBooleanSchemaType, + kObjectSchemaType, + kArraySchemaType, + kStringSchemaType, + kNumberSchemaType, + kIntegerSchemaType, + kTotalSchemaType + }; + +#if RAPIDJSON_SCHEMA_USE_INTERNALREGEX + typedef internal::GenericRegex RegexType; +#elif RAPIDJSON_SCHEMA_USE_STDREGEX + typedef std::basic_regex RegexType; +#else + typedef char RegexType; +#endif + + struct SchemaArray { + SchemaArray() : schemas(), count() {} + ~SchemaArray() { AllocatorType::Free(schemas); } + const SchemaType** schemas; + SizeType begin; // begin index of context.validators + SizeType count; + }; + + static const SchemaType* GetTypeless() { + static SchemaType typeless(0, PointerType(), ValueType(kObjectType).Move(), ValueType(kObjectType).Move(), 0); + return &typeless; + } + + template + void AddUniqueElement(V1& a, const V2& v) { + for (typename V1::ConstValueIterator itr = a.Begin(); itr != a.End(); ++itr) + if (*itr == v) + return; + V1 c(v, *allocator_); + a.PushBack(c, *allocator_); + } + + static const ValueType* GetMember(const ValueType& value, const ValueType& name) { + typename ValueType::ConstMemberIterator itr = value.FindMember(name); + return itr != value.MemberEnd() ? &(itr->value) : 0; + } + + static void AssignIfExist(bool& out, const ValueType& value, const ValueType& name) { + if (const ValueType* v = GetMember(value, name)) + if (v->IsBool()) + out = v->GetBool(); + } + + static void AssignIfExist(SizeType& out, const ValueType& value, const ValueType& name) { + if (const ValueType* v = GetMember(value, name)) + if (v->IsUint64() && v->GetUint64() <= SizeType(~0)) + out = static_cast(v->GetUint64()); + } + + void AssignIfExist(SchemaArray& out, SchemaDocumentType& schemaDocument, const PointerType& p, const ValueType& value, const ValueType& name, const ValueType& document) { + if (const ValueType* v = GetMember(value, name)) { + if (v->IsArray() && v->Size() > 0) { + PointerType q = p.Append(name, allocator_); + out.count = v->Size(); + out.schemas = static_cast(allocator_->Malloc(out.count * sizeof(const Schema*))); + memset(out.schemas, 0, sizeof(Schema*)* out.count); + for (SizeType i = 0; i < out.count; i++) + schemaDocument.CreateSchema(&out.schemas[i], q.Append(i, allocator_), (*v)[i], document); + out.begin = validatorCount_; + validatorCount_ += out.count; + } + } + } + +#if RAPIDJSON_SCHEMA_USE_INTERNALREGEX + template + RegexType* CreatePattern(const ValueType& value) { + if (value.IsString()) { + RegexType* r = new (allocator_->Malloc(sizeof(RegexType))) RegexType(value.GetString()); + if (!r->IsValid()) { + r->~RegexType(); + AllocatorType::Free(r); + r = 0; + } + return r; + } + return 0; + } + + static bool IsPatternMatch(const RegexType* pattern, const Ch *str, SizeType) { + return pattern->Search(str); + } +#elif RAPIDJSON_SCHEMA_USE_STDREGEX + template + RegexType* CreatePattern(const ValueType& value) { + if (value.IsString()) + try { + return new (allocator_->Malloc(sizeof(RegexType))) RegexType(value.GetString(), std::size_t(value.GetStringLength()), std::regex_constants::ECMAScript); + } + catch (const std::regex_error&) { + } + return 0; + } + + static bool IsPatternMatch(const RegexType* pattern, const Ch *str, SizeType length) { + std::match_results r; + return std::regex_search(str, str + length, r, *pattern); + } +#else + template + RegexType* CreatePattern(const ValueType&) { return 0; } + + static bool IsPatternMatch(const RegexType*, const Ch *, SizeType) { return true; } +#endif // RAPIDJSON_SCHEMA_USE_STDREGEX + + void AddType(const ValueType& type) { + if (type == GetNullString() ) type_ |= 1 << kNullSchemaType; + else if (type == GetBooleanString()) type_ |= 1 << kBooleanSchemaType; + else if (type == GetObjectString() ) type_ |= 1 << kObjectSchemaType; + else if (type == GetArrayString() ) type_ |= 1 << kArraySchemaType; + else if (type == GetStringString() ) type_ |= 1 << kStringSchemaType; + else if (type == GetIntegerString()) type_ |= 1 << kIntegerSchemaType; + else if (type == GetNumberString() ) type_ |= (1 << kNumberSchemaType) | (1 << kIntegerSchemaType); + } + + bool CreateParallelValidator(Context& context) const { + if (enum_ || context.arrayUniqueness) + context.hasher = context.factory.CreateHasher(); + + if (validatorCount_) { + RAPIDJSON_ASSERT(context.validators == 0); + context.validators = static_cast(context.factory.MallocState(sizeof(ISchemaValidator*) * validatorCount_)); + context.validatorCount = validatorCount_; + + if (allOf_.schemas) + CreateSchemaValidators(context, allOf_); + + if (anyOf_.schemas) + CreateSchemaValidators(context, anyOf_); + + if (oneOf_.schemas) + CreateSchemaValidators(context, oneOf_); + + if (not_) + context.validators[notValidatorIndex_] = context.factory.CreateSchemaValidator(*not_); + + if (hasSchemaDependencies_) { + for (SizeType i = 0; i < propertyCount_; i++) + if (properties_[i].dependenciesSchema) + context.validators[properties_[i].dependenciesValidatorIndex] = context.factory.CreateSchemaValidator(*properties_[i].dependenciesSchema); + } + } + + return true; + } + + void CreateSchemaValidators(Context& context, const SchemaArray& schemas) const { + for (SizeType i = 0; i < schemas.count; i++) + context.validators[schemas.begin + i] = context.factory.CreateSchemaValidator(*schemas.schemas[i]); + } + + // O(n) + bool FindPropertyIndex(const ValueType& name, SizeType* outIndex) const { + SizeType len = name.GetStringLength(); + const Ch* str = name.GetString(); + for (SizeType index = 0; index < propertyCount_; index++) + if (properties_[index].name.GetStringLength() == len && + (std::memcmp(properties_[index].name.GetString(), str, sizeof(Ch) * len) == 0)) + { + *outIndex = index; + return true; + } + return false; + } + + bool CheckInt(Context& context, int64_t i) const { + if (!(type_ & ((1 << kIntegerSchemaType) | (1 << kNumberSchemaType)))) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetTypeString()); + + if (!minimum_.IsNull()) { + if (minimum_.IsInt64()) { + if (exclusiveMinimum_ ? i <= minimum_.GetInt64() : i < minimum_.GetInt64()) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMinimumString()); + } + else if (minimum_.IsUint64()) { + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMinimumString()); // i <= max(int64_t) < minimum.GetUint64() + } + else if (!CheckDoubleMinimum(context, static_cast(i))) + return false; + } + + if (!maximum_.IsNull()) { + if (maximum_.IsInt64()) { + if (exclusiveMaximum_ ? i >= maximum_.GetInt64() : i > maximum_.GetInt64()) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMaximumString()); + } + else if (maximum_.IsUint64()) + /* do nothing */; // i <= max(int64_t) < maximum_.GetUint64() + else if (!CheckDoubleMaximum(context, static_cast(i))) + return false; + } + + if (!multipleOf_.IsNull()) { + if (multipleOf_.IsUint64()) { + if (static_cast(i >= 0 ? i : -i) % multipleOf_.GetUint64() != 0) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMultipleOfString()); + } + else if (!CheckDoubleMultipleOf(context, static_cast(i))) + return false; + } + + return true; + } + + bool CheckUint(Context& context, uint64_t i) const { + if (!(type_ & ((1 << kIntegerSchemaType) | (1 << kNumberSchemaType)))) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetTypeString()); + + if (!minimum_.IsNull()) { + if (minimum_.IsUint64()) { + if (exclusiveMinimum_ ? i <= minimum_.GetUint64() : i < minimum_.GetUint64()) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMinimumString()); + } + else if (minimum_.IsInt64()) + /* do nothing */; // i >= 0 > minimum.Getint64() + else if (!CheckDoubleMinimum(context, static_cast(i))) + return false; + } + + if (!maximum_.IsNull()) { + if (maximum_.IsUint64()) { + if (exclusiveMaximum_ ? i >= maximum_.GetUint64() : i > maximum_.GetUint64()) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMaximumString()); + } + else if (maximum_.IsInt64()) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMaximumString()); // i >= 0 > maximum_ + else if (!CheckDoubleMaximum(context, static_cast(i))) + return false; + } + + if (!multipleOf_.IsNull()) { + if (multipleOf_.IsUint64()) { + if (i % multipleOf_.GetUint64() != 0) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMultipleOfString()); + } + else if (!CheckDoubleMultipleOf(context, static_cast(i))) + return false; + } + + return true; + } + + bool CheckDoubleMinimum(Context& context, double d) const { + if (exclusiveMinimum_ ? d <= minimum_.GetDouble() : d < minimum_.GetDouble()) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMinimumString()); + return true; + } + + bool CheckDoubleMaximum(Context& context, double d) const { + if (exclusiveMaximum_ ? d >= maximum_.GetDouble() : d > maximum_.GetDouble()) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMaximumString()); + return true; + } + + bool CheckDoubleMultipleOf(Context& context, double d) const { + double a = std::abs(d), b = std::abs(multipleOf_.GetDouble()); + double q = std::floor(a / b); + double r = a - q * b; + if (r > 0.0) + RAPIDJSON_INVALID_KEYWORD_RETURN(GetMultipleOfString()); + return true; + } + + struct Property { + Property() : schema(), dependenciesSchema(), dependenciesValidatorIndex(), dependencies(), required(false) {} + ~Property() { AllocatorType::Free(dependencies); } + SValue name; + const SchemaType* schema; + const SchemaType* dependenciesSchema; + SizeType dependenciesValidatorIndex; + bool* dependencies; + bool required; + }; + + struct PatternProperty { + PatternProperty() : schema(), pattern() {} + ~PatternProperty() { + if (pattern) { + pattern->~RegexType(); + AllocatorType::Free(pattern); + } + } + const SchemaType* schema; + RegexType* pattern; + }; + + AllocatorType* allocator_; + uint64_t* enum_; + SizeType enumCount_; + SchemaArray allOf_; + SchemaArray anyOf_; + SchemaArray oneOf_; + const SchemaType* not_; + unsigned type_; // bitmask of kSchemaType + SizeType validatorCount_; + SizeType notValidatorIndex_; + + Property* properties_; + const SchemaType* additionalPropertiesSchema_; + PatternProperty* patternProperties_; + SizeType patternPropertyCount_; + SizeType propertyCount_; + SizeType minProperties_; + SizeType maxProperties_; + bool additionalProperties_; + bool hasDependencies_; + bool hasRequired_; + bool hasSchemaDependencies_; + + const SchemaType* additionalItemsSchema_; + const SchemaType* itemsList_; + const SchemaType** itemsTuple_; + SizeType itemsTupleCount_; + SizeType minItems_; + SizeType maxItems_; + bool additionalItems_; + bool uniqueItems_; + + RegexType* pattern_; + SizeType minLength_; + SizeType maxLength_; + + SValue minimum_; + SValue maximum_; + SValue multipleOf_; + bool exclusiveMinimum_; + bool exclusiveMaximum_; +}; + +template +struct TokenHelper { + RAPIDJSON_FORCEINLINE static void AppendIndexToken(Stack& documentStack, SizeType index) { + *documentStack.template Push() = '/'; + char buffer[21]; + size_t length = static_cast((sizeof(SizeType) == 4 ? u32toa(index, buffer) : u64toa(index, buffer)) - buffer); + for (size_t i = 0; i < length; i++) + *documentStack.template Push() = buffer[i]; + } +}; + +// Partial specialized version for char to prevent buffer copying. +template +struct TokenHelper { + RAPIDJSON_FORCEINLINE static void AppendIndexToken(Stack& documentStack, SizeType index) { + if (sizeof(SizeType) == 4) { + char *buffer = documentStack.template Push(1 + 10); // '/' + uint + *buffer++ = '/'; + const char* end = internal::u32toa(index, buffer); + documentStack.template Pop(static_cast(10 - (end - buffer))); + } + else { + char *buffer = documentStack.template Push(1 + 20); // '/' + uint64 + *buffer++ = '/'; + const char* end = internal::u64toa(index, buffer); + documentStack.template Pop(static_cast(20 - (end - buffer))); + } + } +}; + +} // namespace internal + +/////////////////////////////////////////////////////////////////////////////// +// IGenericRemoteSchemaDocumentProvider + +template +class IGenericRemoteSchemaDocumentProvider { +public: + typedef typename SchemaDocumentType::Ch Ch; + + virtual ~IGenericRemoteSchemaDocumentProvider() {} + virtual const SchemaDocumentType* GetRemoteDocument(const Ch* uri, SizeType length) = 0; +}; + +/////////////////////////////////////////////////////////////////////////////// +// GenericSchemaDocument + +//! JSON schema document. +/*! + A JSON schema document is a compiled version of a JSON schema. + It is basically a tree of internal::Schema. + + \note This is an immutable class (i.e. its instance cannot be modified after construction). + \tparam ValueT Type of JSON value (e.g. \c Value ), which also determine the encoding. + \tparam Allocator Allocator type for allocating memory of this document. +*/ +template +class GenericSchemaDocument { +public: + typedef ValueT ValueType; + typedef IGenericRemoteSchemaDocumentProvider IRemoteSchemaDocumentProviderType; + typedef Allocator AllocatorType; + typedef typename ValueType::EncodingType EncodingType; + typedef typename EncodingType::Ch Ch; + typedef internal::Schema SchemaType; + typedef GenericPointer PointerType; + friend class internal::Schema; + template + friend class GenericSchemaValidator; + + //! Constructor. + /*! + Compile a JSON document into schema document. + + \param document A JSON document as source. + \param remoteProvider An optional remote schema document provider for resolving remote reference. Can be null. + \param allocator An optional allocator instance for allocating memory. Can be null. + */ + explicit GenericSchemaDocument(const ValueType& document, IRemoteSchemaDocumentProviderType* remoteProvider = 0, Allocator* allocator = 0) : + remoteProvider_(remoteProvider), + allocator_(allocator), + ownAllocator_(), + root_(), + schemaMap_(allocator, kInitialSchemaMapSize), + schemaRef_(allocator, kInitialSchemaRefSize) + { + if (!allocator_) + ownAllocator_ = allocator_ = RAPIDJSON_NEW(Allocator()); + + // Generate root schema, it will call CreateSchema() to create sub-schemas, + // And call AddRefSchema() if there are $ref. + CreateSchemaRecursive(&root_, PointerType(), document, document); + + // Resolve $ref + while (!schemaRef_.Empty()) { + SchemaRefEntry* refEntry = schemaRef_.template Pop(1); + if (const SchemaType* s = GetSchema(refEntry->target)) { + if (refEntry->schema) + *refEntry->schema = s; + + // Create entry in map if not exist + if (!GetSchema(refEntry->source)) { + new (schemaMap_.template Push()) SchemaEntry(refEntry->source, const_cast(s), false, allocator_); + } + } + refEntry->~SchemaRefEntry(); + } + + RAPIDJSON_ASSERT(root_ != 0); + + schemaRef_.ShrinkToFit(); // Deallocate all memory for ref + } + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + //! Move constructor in C++11 + GenericSchemaDocument(GenericSchemaDocument&& rhs) RAPIDJSON_NOEXCEPT : + remoteProvider_(rhs.remoteProvider_), + allocator_(rhs.allocator_), + ownAllocator_(rhs.ownAllocator_), + root_(rhs.root_), + schemaMap_(std::move(rhs.schemaMap_)), + schemaRef_(std::move(rhs.schemaRef_)) + { + rhs.remoteProvider_ = 0; + rhs.allocator_ = 0; + rhs.ownAllocator_ = 0; + } +#endif + + //! Destructor + ~GenericSchemaDocument() { + while (!schemaMap_.Empty()) + schemaMap_.template Pop(1)->~SchemaEntry(); + + RAPIDJSON_DELETE(ownAllocator_); + } + + //! Get the root schema. + const SchemaType& GetRoot() const { return *root_; } + +private: + //! Prohibit copying + GenericSchemaDocument(const GenericSchemaDocument&); + //! Prohibit assignment + GenericSchemaDocument& operator=(const GenericSchemaDocument&); + + struct SchemaRefEntry { + SchemaRefEntry(const PointerType& s, const PointerType& t, const SchemaType** outSchema, Allocator *allocator) : source(s, allocator), target(t, allocator), schema(outSchema) {} + PointerType source; + PointerType target; + const SchemaType** schema; + }; + + struct SchemaEntry { + SchemaEntry(const PointerType& p, SchemaType* s, bool o, Allocator* allocator) : pointer(p, allocator), schema(s), owned(o) {} + ~SchemaEntry() { + if (owned) { + schema->~SchemaType(); + Allocator::Free(schema); + } + } + PointerType pointer; + SchemaType* schema; + bool owned; + }; + + void CreateSchemaRecursive(const SchemaType** schema, const PointerType& pointer, const ValueType& v, const ValueType& document) { + if (schema) + *schema = SchemaType::GetTypeless(); + + if (v.GetType() == kObjectType) { + const SchemaType* s = GetSchema(pointer); + if (!s) + CreateSchema(schema, pointer, v, document); + + for (typename ValueType::ConstMemberIterator itr = v.MemberBegin(); itr != v.MemberEnd(); ++itr) + CreateSchemaRecursive(0, pointer.Append(itr->name, allocator_), itr->value, document); + } + else if (v.GetType() == kArrayType) + for (SizeType i = 0; i < v.Size(); i++) + CreateSchemaRecursive(0, pointer.Append(i, allocator_), v[i], document); + } + + void CreateSchema(const SchemaType** schema, const PointerType& pointer, const ValueType& v, const ValueType& document) { + RAPIDJSON_ASSERT(pointer.IsValid()); + if (v.IsObject()) { + if (!HandleRefSchema(pointer, schema, v, document)) { + SchemaType* s = new (allocator_->Malloc(sizeof(SchemaType))) SchemaType(this, pointer, v, document, allocator_); + new (schemaMap_.template Push()) SchemaEntry(pointer, s, true, allocator_); + if (schema) + *schema = s; + } + } + } + + bool HandleRefSchema(const PointerType& source, const SchemaType** schema, const ValueType& v, const ValueType& document) { + static const Ch kRefString[] = { '$', 'r', 'e', 'f', '\0' }; + static const ValueType kRefValue(kRefString, 4); + + typename ValueType::ConstMemberIterator itr = v.FindMember(kRefValue); + if (itr == v.MemberEnd()) + return false; + + if (itr->value.IsString()) { + SizeType len = itr->value.GetStringLength(); + if (len > 0) { + const Ch* s = itr->value.GetString(); + SizeType i = 0; + while (i < len && s[i] != '#') // Find the first # + i++; + + if (i > 0) { // Remote reference, resolve immediately + if (remoteProvider_) { + if (const GenericSchemaDocument* remoteDocument = remoteProvider_->GetRemoteDocument(s, i - 1)) { + PointerType pointer(&s[i], len - i, allocator_); + if (pointer.IsValid()) { + if (const SchemaType* sc = remoteDocument->GetSchema(pointer)) { + if (schema) + *schema = sc; + return true; + } + } + } + } + } + else if (s[i] == '#') { // Local reference, defer resolution + PointerType pointer(&s[i], len - i, allocator_); + if (pointer.IsValid()) { + if (const ValueType* nv = pointer.Get(document)) + if (HandleRefSchema(source, schema, *nv, document)) + return true; + + new (schemaRef_.template Push()) SchemaRefEntry(source, pointer, schema, allocator_); + return true; + } + } + } + } + return false; + } + + const SchemaType* GetSchema(const PointerType& pointer) const { + for (const SchemaEntry* target = schemaMap_.template Bottom(); target != schemaMap_.template End(); ++target) + if (pointer == target->pointer) + return target->schema; + return 0; + } + + PointerType GetPointer(const SchemaType* schema) const { + for (const SchemaEntry* target = schemaMap_.template Bottom(); target != schemaMap_.template End(); ++target) + if (schema == target->schema) + return target->pointer; + return PointerType(); + } + + static const size_t kInitialSchemaMapSize = 64; + static const size_t kInitialSchemaRefSize = 64; + + IRemoteSchemaDocumentProviderType* remoteProvider_; + Allocator *allocator_; + Allocator *ownAllocator_; + const SchemaType* root_; //!< Root schema. + internal::Stack schemaMap_; // Stores created Pointer -> Schemas + internal::Stack schemaRef_; // Stores Pointer from $ref and schema which holds the $ref +}; + +//! GenericSchemaDocument using Value type. +typedef GenericSchemaDocument SchemaDocument; +//! IGenericRemoteSchemaDocumentProvider using SchemaDocument. +typedef IGenericRemoteSchemaDocumentProvider IRemoteSchemaDocumentProvider; + +/////////////////////////////////////////////////////////////////////////////// +// GenericSchemaValidator + +//! JSON Schema Validator. +/*! + A SAX style JSON schema validator. + It uses a \c GenericSchemaDocument to validate SAX events. + It delegates the incoming SAX events to an output handler. + The default output handler does nothing. + It can be reused multiple times by calling \c Reset(). + + \tparam SchemaDocumentType Type of schema document. + \tparam OutputHandler Type of output handler. Default handler does nothing. + \tparam StateAllocator Allocator for storing the internal validation states. +*/ +template < + typename SchemaDocumentType, + typename OutputHandler = BaseReaderHandler, + typename StateAllocator = CrtAllocator> +class GenericSchemaValidator : + public internal::ISchemaStateFactory, + public internal::ISchemaValidator +{ +public: + typedef typename SchemaDocumentType::SchemaType SchemaType; + typedef typename SchemaDocumentType::PointerType PointerType; + typedef typename SchemaType::EncodingType EncodingType; + typedef typename EncodingType::Ch Ch; + + //! Constructor without output handler. + /*! + \param schemaDocument The schema document to conform to. + \param allocator Optional allocator for storing internal validation states. + \param schemaStackCapacity Optional initial capacity of schema path stack. + \param documentStackCapacity Optional initial capacity of document path stack. + */ + GenericSchemaValidator( + const SchemaDocumentType& schemaDocument, + StateAllocator* allocator = 0, + size_t schemaStackCapacity = kDefaultSchemaStackCapacity, + size_t documentStackCapacity = kDefaultDocumentStackCapacity) + : + schemaDocument_(&schemaDocument), + root_(schemaDocument.GetRoot()), + outputHandler_(GetNullHandler()), + stateAllocator_(allocator), + ownStateAllocator_(0), + schemaStack_(allocator, schemaStackCapacity), + documentStack_(allocator, documentStackCapacity), + valid_(true) +#if RAPIDJSON_SCHEMA_VERBOSE + , depth_(0) +#endif + { + } + + //! Constructor with output handler. + /*! + \param schemaDocument The schema document to conform to. + \param allocator Optional allocator for storing internal validation states. + \param schemaStackCapacity Optional initial capacity of schema path stack. + \param documentStackCapacity Optional initial capacity of document path stack. + */ + GenericSchemaValidator( + const SchemaDocumentType& schemaDocument, + OutputHandler& outputHandler, + StateAllocator* allocator = 0, + size_t schemaStackCapacity = kDefaultSchemaStackCapacity, + size_t documentStackCapacity = kDefaultDocumentStackCapacity) + : + schemaDocument_(&schemaDocument), + root_(schemaDocument.GetRoot()), + outputHandler_(outputHandler), + stateAllocator_(allocator), + ownStateAllocator_(0), + schemaStack_(allocator, schemaStackCapacity), + documentStack_(allocator, documentStackCapacity), + valid_(true) +#if RAPIDJSON_SCHEMA_VERBOSE + , depth_(0) +#endif + { + } + + //! Destructor. + ~GenericSchemaValidator() { + Reset(); + RAPIDJSON_DELETE(ownStateAllocator_); + } + + //! Reset the internal states. + void Reset() { + while (!schemaStack_.Empty()) + PopSchema(); + documentStack_.Clear(); + valid_ = true; + } + + //! Checks whether the current state is valid. + // Implementation of ISchemaValidator + virtual bool IsValid() const { return valid_; } + + //! Gets the JSON pointer pointed to the invalid schema. + PointerType GetInvalidSchemaPointer() const { + return schemaStack_.Empty() ? PointerType() : schemaDocument_->GetPointer(&CurrentSchema()); + } + + //! Gets the keyword of invalid schema. + const Ch* GetInvalidSchemaKeyword() const { + return schemaStack_.Empty() ? 0 : CurrentContext().invalidKeyword; + } + + //! Gets the JSON pointer pointed to the invalid value. + PointerType GetInvalidDocumentPointer() const { + return documentStack_.Empty() ? PointerType() : PointerType(documentStack_.template Bottom(), documentStack_.GetSize() / sizeof(Ch)); + } + +#if RAPIDJSON_SCHEMA_VERBOSE +#define RAPIDJSON_SCHEMA_HANDLE_BEGIN_VERBOSE_() \ +RAPIDJSON_MULTILINEMACRO_BEGIN\ + *documentStack_.template Push() = '\0';\ + documentStack_.template Pop(1);\ + internal::PrintInvalidDocument(documentStack_.template Bottom());\ +RAPIDJSON_MULTILINEMACRO_END +#else +#define RAPIDJSON_SCHEMA_HANDLE_BEGIN_VERBOSE_() +#endif + +#define RAPIDJSON_SCHEMA_HANDLE_BEGIN_(method, arg1)\ + if (!valid_) return false; \ + if (!BeginValue() || !CurrentSchema().method arg1) {\ + RAPIDJSON_SCHEMA_HANDLE_BEGIN_VERBOSE_();\ + return valid_ = false;\ + } + +#define RAPIDJSON_SCHEMA_HANDLE_PARALLEL_(method, arg2)\ + for (Context* context = schemaStack_.template Bottom(); context != schemaStack_.template End(); context++) {\ + if (context->hasher)\ + static_cast(context->hasher)->method arg2;\ + if (context->validators)\ + for (SizeType i_ = 0; i_ < context->validatorCount; i_++)\ + static_cast(context->validators[i_])->method arg2;\ + if (context->patternPropertiesValidators)\ + for (SizeType i_ = 0; i_ < context->patternPropertiesValidatorCount; i_++)\ + static_cast(context->patternPropertiesValidators[i_])->method arg2;\ + } + +#define RAPIDJSON_SCHEMA_HANDLE_END_(method, arg2)\ + return valid_ = EndValue() && outputHandler_.method arg2 + +#define RAPIDJSON_SCHEMA_HANDLE_VALUE_(method, arg1, arg2) \ + RAPIDJSON_SCHEMA_HANDLE_BEGIN_ (method, arg1);\ + RAPIDJSON_SCHEMA_HANDLE_PARALLEL_(method, arg2);\ + RAPIDJSON_SCHEMA_HANDLE_END_ (method, arg2) + + bool Null() { RAPIDJSON_SCHEMA_HANDLE_VALUE_(Null, (CurrentContext() ), ( )); } + bool Bool(bool b) { RAPIDJSON_SCHEMA_HANDLE_VALUE_(Bool, (CurrentContext(), b), (b)); } + bool Int(int i) { RAPIDJSON_SCHEMA_HANDLE_VALUE_(Int, (CurrentContext(), i), (i)); } + bool Uint(unsigned u) { RAPIDJSON_SCHEMA_HANDLE_VALUE_(Uint, (CurrentContext(), u), (u)); } + bool Int64(int64_t i) { RAPIDJSON_SCHEMA_HANDLE_VALUE_(Int64, (CurrentContext(), i), (i)); } + bool Uint64(uint64_t u) { RAPIDJSON_SCHEMA_HANDLE_VALUE_(Uint64, (CurrentContext(), u), (u)); } + bool Double(double d) { RAPIDJSON_SCHEMA_HANDLE_VALUE_(Double, (CurrentContext(), d), (d)); } + bool RawNumber(const Ch* str, SizeType length, bool copy) + { RAPIDJSON_SCHEMA_HANDLE_VALUE_(String, (CurrentContext(), str, length, copy), (str, length, copy)); } + bool String(const Ch* str, SizeType length, bool copy) + { RAPIDJSON_SCHEMA_HANDLE_VALUE_(String, (CurrentContext(), str, length, copy), (str, length, copy)); } + + bool StartObject() { + RAPIDJSON_SCHEMA_HANDLE_BEGIN_(StartObject, (CurrentContext())); + RAPIDJSON_SCHEMA_HANDLE_PARALLEL_(StartObject, ()); + return valid_ = outputHandler_.StartObject(); + } + + bool Key(const Ch* str, SizeType len, bool copy) { + if (!valid_) return false; + AppendToken(str, len); + if (!CurrentSchema().Key(CurrentContext(), str, len, copy)) return valid_ = false; + RAPIDJSON_SCHEMA_HANDLE_PARALLEL_(Key, (str, len, copy)); + return valid_ = outputHandler_.Key(str, len, copy); + } + + bool EndObject(SizeType memberCount) { + if (!valid_) return false; + RAPIDJSON_SCHEMA_HANDLE_PARALLEL_(EndObject, (memberCount)); + if (!CurrentSchema().EndObject(CurrentContext(), memberCount)) return valid_ = false; + RAPIDJSON_SCHEMA_HANDLE_END_(EndObject, (memberCount)); + } + + bool StartArray() { + RAPIDJSON_SCHEMA_HANDLE_BEGIN_(StartArray, (CurrentContext())); + RAPIDJSON_SCHEMA_HANDLE_PARALLEL_(StartArray, ()); + return valid_ = outputHandler_.StartArray(); + } + + bool EndArray(SizeType elementCount) { + if (!valid_) return false; + RAPIDJSON_SCHEMA_HANDLE_PARALLEL_(EndArray, (elementCount)); + if (!CurrentSchema().EndArray(CurrentContext(), elementCount)) return valid_ = false; + RAPIDJSON_SCHEMA_HANDLE_END_(EndArray, (elementCount)); + } + +#undef RAPIDJSON_SCHEMA_HANDLE_BEGIN_VERBOSE_ +#undef RAPIDJSON_SCHEMA_HANDLE_BEGIN_ +#undef RAPIDJSON_SCHEMA_HANDLE_PARALLEL_ +#undef RAPIDJSON_SCHEMA_HANDLE_VALUE_ + + // Implementation of ISchemaStateFactory + virtual ISchemaValidator* CreateSchemaValidator(const SchemaType& root) { + return new (GetStateAllocator().Malloc(sizeof(GenericSchemaValidator))) GenericSchemaValidator(*schemaDocument_, root, +#if RAPIDJSON_SCHEMA_VERBOSE + depth_ + 1, +#endif + &GetStateAllocator()); + } + + virtual void DestroySchemaValidator(ISchemaValidator* validator) { + GenericSchemaValidator* v = static_cast(validator); + v->~GenericSchemaValidator(); + StateAllocator::Free(v); + } + + virtual void* CreateHasher() { + return new (GetStateAllocator().Malloc(sizeof(HasherType))) HasherType(&GetStateAllocator()); + } + + virtual uint64_t GetHashCode(void* hasher) { + return static_cast(hasher)->GetHashCode(); + } + + virtual void DestroryHasher(void* hasher) { + HasherType* h = static_cast(hasher); + h->~HasherType(); + StateAllocator::Free(h); + } + + virtual void* MallocState(size_t size) { + return GetStateAllocator().Malloc(size); + } + + virtual void FreeState(void* p) { + return StateAllocator::Free(p); + } + +private: + typedef typename SchemaType::Context Context; + typedef GenericValue, StateAllocator> HashCodeArray; + typedef internal::Hasher HasherType; + + GenericSchemaValidator( + const SchemaDocumentType& schemaDocument, + const SchemaType& root, +#if RAPIDJSON_SCHEMA_VERBOSE + unsigned depth, +#endif + StateAllocator* allocator = 0, + size_t schemaStackCapacity = kDefaultSchemaStackCapacity, + size_t documentStackCapacity = kDefaultDocumentStackCapacity) + : + schemaDocument_(&schemaDocument), + root_(root), + outputHandler_(GetNullHandler()), + stateAllocator_(allocator), + ownStateAllocator_(0), + schemaStack_(allocator, schemaStackCapacity), + documentStack_(allocator, documentStackCapacity), + valid_(true) +#if RAPIDJSON_SCHEMA_VERBOSE + , depth_(depth) +#endif + { + } + + StateAllocator& GetStateAllocator() { + if (!stateAllocator_) + stateAllocator_ = ownStateAllocator_ = RAPIDJSON_NEW(StateAllocator()); + return *stateAllocator_; + } + + bool BeginValue() { + if (schemaStack_.Empty()) + PushSchema(root_); + else { + if (CurrentContext().inArray) + internal::TokenHelper, Ch>::AppendIndexToken(documentStack_, CurrentContext().arrayElementIndex); + + if (!CurrentSchema().BeginValue(CurrentContext())) + return false; + + SizeType count = CurrentContext().patternPropertiesSchemaCount; + const SchemaType** sa = CurrentContext().patternPropertiesSchemas; + typename Context::PatternValidatorType patternValidatorType = CurrentContext().valuePatternValidatorType; + bool valueUniqueness = CurrentContext().valueUniqueness; + if (CurrentContext().valueSchema) + PushSchema(*CurrentContext().valueSchema); + + if (count > 0) { + CurrentContext().objectPatternValidatorType = patternValidatorType; + ISchemaValidator**& va = CurrentContext().patternPropertiesValidators; + SizeType& validatorCount = CurrentContext().patternPropertiesValidatorCount; + va = static_cast(MallocState(sizeof(ISchemaValidator*) * count)); + for (SizeType i = 0; i < count; i++) + va[validatorCount++] = CreateSchemaValidator(*sa[i]); + } + + CurrentContext().arrayUniqueness = valueUniqueness; + } + return true; + } + + bool EndValue() { + if (!CurrentSchema().EndValue(CurrentContext())) + return false; + +#if RAPIDJSON_SCHEMA_VERBOSE + GenericStringBuffer sb; + schemaDocument_->GetPointer(&CurrentSchema()).Stringify(sb); + + *documentStack_.template Push() = '\0'; + documentStack_.template Pop(1); + internal::PrintValidatorPointers(depth_, sb.GetString(), documentStack_.template Bottom()); +#endif + + uint64_t h = CurrentContext().arrayUniqueness ? static_cast(CurrentContext().hasher)->GetHashCode() : 0; + + PopSchema(); + + if (!schemaStack_.Empty()) { + Context& context = CurrentContext(); + if (context.valueUniqueness) { + HashCodeArray* a = static_cast(context.arrayElementHashCodes); + if (!a) + CurrentContext().arrayElementHashCodes = a = new (GetStateAllocator().Malloc(sizeof(HashCodeArray))) HashCodeArray(kArrayType); + for (typename HashCodeArray::ConstValueIterator itr = a->Begin(); itr != a->End(); ++itr) + if (itr->GetUint64() == h) + RAPIDJSON_INVALID_KEYWORD_RETURN(SchemaType::GetUniqueItemsString()); + a->PushBack(h, GetStateAllocator()); + } + } + + // Remove the last token of document pointer + while (!documentStack_.Empty() && *documentStack_.template Pop(1) != '/') + ; + + return true; + } + + void AppendToken(const Ch* str, SizeType len) { + documentStack_.template Reserve(1 + len * 2); // worst case all characters are escaped as two characters + *documentStack_.template PushUnsafe() = '/'; + for (SizeType i = 0; i < len; i++) { + if (str[i] == '~') { + *documentStack_.template PushUnsafe() = '~'; + *documentStack_.template PushUnsafe() = '0'; + } + else if (str[i] == '/') { + *documentStack_.template PushUnsafe() = '~'; + *documentStack_.template PushUnsafe() = '1'; + } + else + *documentStack_.template PushUnsafe() = str[i]; + } + } + + RAPIDJSON_FORCEINLINE void PushSchema(const SchemaType& schema) { new (schemaStack_.template Push()) Context(*this, &schema); } + + RAPIDJSON_FORCEINLINE void PopSchema() { + Context* c = schemaStack_.template Pop(1); + if (HashCodeArray* a = static_cast(c->arrayElementHashCodes)) { + a->~HashCodeArray(); + StateAllocator::Free(a); + } + c->~Context(); + } + + const SchemaType& CurrentSchema() const { return *schemaStack_.template Top()->schema; } + Context& CurrentContext() { return *schemaStack_.template Top(); } + const Context& CurrentContext() const { return *schemaStack_.template Top(); } + + static OutputHandler& GetNullHandler() { + static OutputHandler nullHandler; + return nullHandler; + } + + static const size_t kDefaultSchemaStackCapacity = 1024; + static const size_t kDefaultDocumentStackCapacity = 256; + const SchemaDocumentType* schemaDocument_; + const SchemaType& root_; + OutputHandler& outputHandler_; + StateAllocator* stateAllocator_; + StateAllocator* ownStateAllocator_; + internal::Stack schemaStack_; //!< stack to store the current path of schema (BaseSchemaType *) + internal::Stack documentStack_; //!< stack to store the current path of validating document (Ch) + bool valid_; +#if RAPIDJSON_SCHEMA_VERBOSE + unsigned depth_; +#endif +}; + +typedef GenericSchemaValidator SchemaValidator; + +/////////////////////////////////////////////////////////////////////////////// +// SchemaValidatingReader + +//! A helper class for parsing with validation. +/*! + This helper class is a functor, designed as a parameter of \ref GenericDocument::Populate(). + + \tparam parseFlags Combination of \ref ParseFlag. + \tparam InputStream Type of input stream, implementing Stream concept. + \tparam SourceEncoding Encoding of the input stream. + \tparam SchemaDocumentType Type of schema document. + \tparam StackAllocator Allocator type for stack. +*/ +template < + unsigned parseFlags, + typename InputStream, + typename SourceEncoding, + typename SchemaDocumentType = SchemaDocument, + typename StackAllocator = CrtAllocator> +class SchemaValidatingReader { +public: + typedef typename SchemaDocumentType::PointerType PointerType; + typedef typename InputStream::Ch Ch; + + //! Constructor + /*! + \param is Input stream. + \param sd Schema document. + */ + SchemaValidatingReader(InputStream& is, const SchemaDocumentType& sd) : is_(is), sd_(sd), invalidSchemaKeyword_(), isValid_(true) {} + + template + bool operator()(Handler& handler) { + GenericReader reader; + GenericSchemaValidator validator(sd_, handler); + parseResult_ = reader.template Parse(is_, validator); + + isValid_ = validator.IsValid(); + if (isValid_) { + invalidSchemaPointer_ = PointerType(); + invalidSchemaKeyword_ = 0; + invalidDocumentPointer_ = PointerType(); + } + else { + invalidSchemaPointer_ = validator.GetInvalidSchemaPointer(); + invalidSchemaKeyword_ = validator.GetInvalidSchemaKeyword(); + invalidDocumentPointer_ = validator.GetInvalidDocumentPointer(); + } + + return parseResult_; + } + + const ParseResult& GetParseResult() const { return parseResult_; } + bool IsValid() const { return isValid_; } + const PointerType& GetInvalidSchemaPointer() const { return invalidSchemaPointer_; } + const Ch* GetInvalidSchemaKeyword() const { return invalidSchemaKeyword_; } + const PointerType& GetInvalidDocumentPointer() const { return invalidDocumentPointer_; } + +private: + InputStream& is_; + const SchemaDocumentType& sd_; + + ParseResult parseResult_; + PointerType invalidSchemaPointer_; + const Ch* invalidSchemaKeyword_; + PointerType invalidDocumentPointer_; + bool isValid_; +}; + +RAPIDJSON_NAMESPACE_END +RAPIDJSON_DIAG_POP + +#endif // RAPIDJSON_SCHEMA_H_ diff --git a/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/stream.h b/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/stream.h new file mode 100644 index 0000000..fef82c2 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/stream.h @@ -0,0 +1,179 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#include "rapidjson.h" + +#ifndef RAPIDJSON_STREAM_H_ +#define RAPIDJSON_STREAM_H_ + +#include "encodings.h" + +RAPIDJSON_NAMESPACE_BEGIN + +/////////////////////////////////////////////////////////////////////////////// +// Stream + +/*! \class rapidjson::Stream + \brief Concept for reading and writing characters. + + For read-only stream, no need to implement PutBegin(), Put(), Flush() and PutEnd(). + + For write-only stream, only need to implement Put() and Flush(). + +\code +concept Stream { + typename Ch; //!< Character type of the stream. + + //! Read the current character from stream without moving the read cursor. + Ch Peek() const; + + //! Read the current character from stream and moving the read cursor to next character. + Ch Take(); + + //! Get the current read cursor. + //! \return Number of characters read from start. + size_t Tell(); + + //! Begin writing operation at the current read pointer. + //! \return The begin writer pointer. + Ch* PutBegin(); + + //! Write a character. + void Put(Ch c); + + //! Flush the buffer. + void Flush(); + + //! End the writing operation. + //! \param begin The begin write pointer returned by PutBegin(). + //! \return Number of characters written. + size_t PutEnd(Ch* begin); +} +\endcode +*/ + +//! Provides additional information for stream. +/*! + By using traits pattern, this type provides a default configuration for stream. + For custom stream, this type can be specialized for other configuration. + See TEST(Reader, CustomStringStream) in readertest.cpp for example. +*/ +template +struct StreamTraits { + //! Whether to make local copy of stream for optimization during parsing. + /*! + By default, for safety, streams do not use local copy optimization. + Stream that can be copied fast should specialize this, like StreamTraits. + */ + enum { copyOptimization = 0 }; +}; + +//! Reserve n characters for writing to a stream. +template +inline void PutReserve(Stream& stream, size_t count) { + (void)stream; + (void)count; +} + +//! Write character to a stream, presuming buffer is reserved. +template +inline void PutUnsafe(Stream& stream, typename Stream::Ch c) { + stream.Put(c); +} + +//! Put N copies of a character to a stream. +template +inline void PutN(Stream& stream, Ch c, size_t n) { + PutReserve(stream, n); + for (size_t i = 0; i < n; i++) + PutUnsafe(stream, c); +} + +/////////////////////////////////////////////////////////////////////////////// +// StringStream + +//! Read-only string stream. +/*! \note implements Stream concept +*/ +template +struct GenericStringStream { + typedef typename Encoding::Ch Ch; + + GenericStringStream(const Ch *src) : src_(src), head_(src) {} + + Ch Peek() const { return *src_; } + Ch Take() { return *src_++; } + size_t Tell() const { return static_cast(src_ - head_); } + + Ch* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } + void Put(Ch) { RAPIDJSON_ASSERT(false); } + void Flush() { RAPIDJSON_ASSERT(false); } + size_t PutEnd(Ch*) { RAPIDJSON_ASSERT(false); return 0; } + + const Ch* src_; //!< Current read position. + const Ch* head_; //!< Original head of the string. +}; + +template +struct StreamTraits > { + enum { copyOptimization = 1 }; +}; + +//! String stream with UTF8 encoding. +typedef GenericStringStream > StringStream; + +/////////////////////////////////////////////////////////////////////////////// +// InsituStringStream + +//! A read-write string stream. +/*! This string stream is particularly designed for in-situ parsing. + \note implements Stream concept +*/ +template +struct GenericInsituStringStream { + typedef typename Encoding::Ch Ch; + + GenericInsituStringStream(Ch *src) : src_(src), dst_(0), head_(src) {} + + // Read + Ch Peek() { return *src_; } + Ch Take() { return *src_++; } + size_t Tell() { return static_cast(src_ - head_); } + + // Write + void Put(Ch c) { RAPIDJSON_ASSERT(dst_ != 0); *dst_++ = c; } + + Ch* PutBegin() { return dst_ = src_; } + size_t PutEnd(Ch* begin) { return static_cast(dst_ - begin); } + void Flush() {} + + Ch* Push(size_t count) { Ch* begin = dst_; dst_ += count; return begin; } + void Pop(size_t count) { dst_ -= count; } + + Ch* src_; + Ch* dst_; + Ch* head_; +}; + +template +struct StreamTraits > { + enum { copyOptimization = 1 }; +}; + +//! Insitu string stream with UTF8 encoding. +typedef GenericInsituStringStream > InsituStringStream; + +RAPIDJSON_NAMESPACE_END + +#endif // RAPIDJSON_STREAM_H_ diff --git a/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/stringbuffer.h b/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/stringbuffer.h new file mode 100644 index 0000000..78f34d2 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/stringbuffer.h @@ -0,0 +1,117 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_STRINGBUFFER_H_ +#define RAPIDJSON_STRINGBUFFER_H_ + +#include "stream.h" +#include "internal/stack.h" + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS +#include // std::move +#endif + +#include "internal/stack.h" + +#if defined(__clang__) +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(c++98-compat) +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +//! Represents an in-memory output stream. +/*! + \tparam Encoding Encoding of the stream. + \tparam Allocator type for allocating memory buffer. + \note implements Stream concept +*/ +template +class GenericStringBuffer { +public: + typedef typename Encoding::Ch Ch; + + GenericStringBuffer(Allocator* allocator = 0, size_t capacity = kDefaultCapacity) : stack_(allocator, capacity) {} + +#if RAPIDJSON_HAS_CXX11_RVALUE_REFS + GenericStringBuffer(GenericStringBuffer&& rhs) : stack_(std::move(rhs.stack_)) {} + GenericStringBuffer& operator=(GenericStringBuffer&& rhs) { + if (&rhs != this) + stack_ = std::move(rhs.stack_); + return *this; + } +#endif + + void Put(Ch c) { *stack_.template Push() = c; } + void PutUnsafe(Ch c) { *stack_.template PushUnsafe() = c; } + void Flush() {} + + void Clear() { stack_.Clear(); } + void ShrinkToFit() { + // Push and pop a null terminator. This is safe. + *stack_.template Push() = '\0'; + stack_.ShrinkToFit(); + stack_.template Pop(1); + } + + void Reserve(size_t count) { stack_.template Reserve(count); } + Ch* Push(size_t count) { return stack_.template Push(count); } + Ch* PushUnsafe(size_t count) { return stack_.template PushUnsafe(count); } + void Pop(size_t count) { stack_.template Pop(count); } + + const Ch* GetString() const { + // Push and pop a null terminator. This is safe. + *stack_.template Push() = '\0'; + stack_.template Pop(1); + + return stack_.template Bottom(); + } + + size_t GetSize() const { return stack_.GetSize(); } + + static const size_t kDefaultCapacity = 256; + mutable internal::Stack stack_; + +private: + // Prohibit copy constructor & assignment operator. + GenericStringBuffer(const GenericStringBuffer&); + GenericStringBuffer& operator=(const GenericStringBuffer&); +}; + +//! String buffer with UTF8 encoding +typedef GenericStringBuffer > StringBuffer; + +template +inline void PutReserve(GenericStringBuffer& stream, size_t count) { + stream.Reserve(count); +} + +template +inline void PutUnsafe(GenericStringBuffer& stream, typename Encoding::Ch c) { + stream.PutUnsafe(c); +} + +//! Implement specialized version of PutN() with memset() for better performance. +template<> +inline void PutN(GenericStringBuffer >& stream, char c, size_t n) { + std::memset(stream.stack_.Push(n), c, n * sizeof(c)); +} + +RAPIDJSON_NAMESPACE_END + +#if defined(__clang__) +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_STRINGBUFFER_H_ diff --git a/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/writer.h b/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/writer.h new file mode 100644 index 0000000..94f22dd --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/rapidjson/1.1.0/include/rapidjson/writer.h @@ -0,0 +1,610 @@ +// Tencent is pleased to support the open source community by making RapidJSON available. +// +// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. +// +// Licensed under the MIT License (the "License"); you may not use this file except +// in compliance with the License. You may obtain a copy of the License at +// +// http://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software distributed +// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +#ifndef RAPIDJSON_WRITER_H_ +#define RAPIDJSON_WRITER_H_ + +#include "stream.h" +#include "internal/stack.h" +#include "internal/strfunc.h" +#include "internal/dtoa.h" +#include "internal/itoa.h" +#include "stringbuffer.h" +#include // placement new + +#if defined(RAPIDJSON_SIMD) && defined(_MSC_VER) +#include +#pragma intrinsic(_BitScanForward) +#endif +#ifdef RAPIDJSON_SSE42 +#include +#elif defined(RAPIDJSON_SSE2) +#include +#endif + +#ifdef _MSC_VER +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(4127) // conditional expression is constant +#endif + +#ifdef __clang__ +RAPIDJSON_DIAG_PUSH +RAPIDJSON_DIAG_OFF(padded) +RAPIDJSON_DIAG_OFF(unreachable-code) +#endif + +RAPIDJSON_NAMESPACE_BEGIN + +/////////////////////////////////////////////////////////////////////////////// +// WriteFlag + +/*! \def RAPIDJSON_WRITE_DEFAULT_FLAGS + \ingroup RAPIDJSON_CONFIG + \brief User-defined kWriteDefaultFlags definition. + + User can define this as any \c WriteFlag combinations. +*/ +#ifndef RAPIDJSON_WRITE_DEFAULT_FLAGS +#define RAPIDJSON_WRITE_DEFAULT_FLAGS kWriteNoFlags +#endif + +//! Combination of writeFlags +enum WriteFlag { + kWriteNoFlags = 0, //!< No flags are set. + kWriteValidateEncodingFlag = 1, //!< Validate encoding of JSON strings. + kWriteNanAndInfFlag = 2, //!< Allow writing of Infinity, -Infinity and NaN. + kWriteDefaultFlags = RAPIDJSON_WRITE_DEFAULT_FLAGS //!< Default write flags. Can be customized by defining RAPIDJSON_WRITE_DEFAULT_FLAGS +}; + +//! JSON writer +/*! Writer implements the concept Handler. + It generates JSON text by events to an output os. + + User may programmatically calls the functions of a writer to generate JSON text. + + On the other side, a writer can also be passed to objects that generates events, + + for example Reader::Parse() and Document::Accept(). + + \tparam OutputStream Type of output stream. + \tparam SourceEncoding Encoding of source string. + \tparam TargetEncoding Encoding of output stream. + \tparam StackAllocator Type of allocator for allocating memory of stack. + \note implements Handler concept +*/ +template, typename TargetEncoding = UTF8<>, typename StackAllocator = CrtAllocator, unsigned writeFlags = kWriteDefaultFlags> +class Writer { +public: + typedef typename SourceEncoding::Ch Ch; + + static const int kDefaultMaxDecimalPlaces = 324; + + //! Constructor + /*! \param os Output stream. + \param stackAllocator User supplied allocator. If it is null, it will create a private one. + \param levelDepth Initial capacity of stack. + */ + explicit + Writer(OutputStream& os, StackAllocator* stackAllocator = 0, size_t levelDepth = kDefaultLevelDepth) : + os_(&os), level_stack_(stackAllocator, levelDepth * sizeof(Level)), maxDecimalPlaces_(kDefaultMaxDecimalPlaces), hasRoot_(false) {} + + explicit + Writer(StackAllocator* allocator = 0, size_t levelDepth = kDefaultLevelDepth) : + os_(0), level_stack_(allocator, levelDepth * sizeof(Level)), maxDecimalPlaces_(kDefaultMaxDecimalPlaces), hasRoot_(false) {} + + //! Reset the writer with a new stream. + /*! + This function reset the writer with a new stream and default settings, + in order to make a Writer object reusable for output multiple JSONs. + + \param os New output stream. + \code + Writer writer(os1); + writer.StartObject(); + // ... + writer.EndObject(); + + writer.Reset(os2); + writer.StartObject(); + // ... + writer.EndObject(); + \endcode + */ + void Reset(OutputStream& os) { + os_ = &os; + hasRoot_ = false; + level_stack_.Clear(); + } + + //! Checks whether the output is a complete JSON. + /*! + A complete JSON has a complete root object or array. + */ + bool IsComplete() const { + return hasRoot_ && level_stack_.Empty(); + } + + int GetMaxDecimalPlaces() const { + return maxDecimalPlaces_; + } + + //! Sets the maximum number of decimal places for double output. + /*! + This setting truncates the output with specified number of decimal places. + + For example, + + \code + writer.SetMaxDecimalPlaces(3); + writer.StartArray(); + writer.Double(0.12345); // "0.123" + writer.Double(0.0001); // "0.0" + writer.Double(1.234567890123456e30); // "1.234567890123456e30" (do not truncate significand for positive exponent) + writer.Double(1.23e-4); // "0.0" (do truncate significand for negative exponent) + writer.EndArray(); + \endcode + + The default setting does not truncate any decimal places. You can restore to this setting by calling + \code + writer.SetMaxDecimalPlaces(Writer::kDefaultMaxDecimalPlaces); + \endcode + */ + void SetMaxDecimalPlaces(int maxDecimalPlaces) { + maxDecimalPlaces_ = maxDecimalPlaces; + } + + /*!@name Implementation of Handler + \see Handler + */ + //@{ + + bool Null() { Prefix(kNullType); return EndValue(WriteNull()); } + bool Bool(bool b) { Prefix(b ? kTrueType : kFalseType); return EndValue(WriteBool(b)); } + bool Int(int i) { Prefix(kNumberType); return EndValue(WriteInt(i)); } + bool Uint(unsigned u) { Prefix(kNumberType); return EndValue(WriteUint(u)); } + bool Int64(int64_t i64) { Prefix(kNumberType); return EndValue(WriteInt64(i64)); } + bool Uint64(uint64_t u64) { Prefix(kNumberType); return EndValue(WriteUint64(u64)); } + + //! Writes the given \c double value to the stream + /*! + \param d The value to be written. + \return Whether it is succeed. + */ + bool Double(double d) { Prefix(kNumberType); return EndValue(WriteDouble(d)); } + + bool RawNumber(const Ch* str, SizeType length, bool copy = false) { + (void)copy; + Prefix(kNumberType); + return EndValue(WriteString(str, length)); + } + + bool String(const Ch* str, SizeType length, bool copy = false) { + (void)copy; + Prefix(kStringType); + return EndValue(WriteString(str, length)); + } + +#if RAPIDJSON_HAS_STDSTRING + bool String(const std::basic_string& str) { + return String(str.data(), SizeType(str.size())); + } +#endif + + bool StartObject() { + Prefix(kObjectType); + new (level_stack_.template Push()) Level(false); + return WriteStartObject(); + } + + bool Key(const Ch* str, SizeType length, bool copy = false) { return String(str, length, copy); } + + bool EndObject(SizeType memberCount = 0) { + (void)memberCount; + RAPIDJSON_ASSERT(level_stack_.GetSize() >= sizeof(Level)); + RAPIDJSON_ASSERT(!level_stack_.template Top()->inArray); + level_stack_.template Pop(1); + return EndValue(WriteEndObject()); + } + + bool StartArray() { + Prefix(kArrayType); + new (level_stack_.template Push()) Level(true); + return WriteStartArray(); + } + + bool EndArray(SizeType elementCount = 0) { + (void)elementCount; + RAPIDJSON_ASSERT(level_stack_.GetSize() >= sizeof(Level)); + RAPIDJSON_ASSERT(level_stack_.template Top()->inArray); + level_stack_.template Pop(1); + return EndValue(WriteEndArray()); + } + //@} + + /*! @name Convenience extensions */ + //@{ + + //! Simpler but slower overload. + bool String(const Ch* str) { return String(str, internal::StrLen(str)); } + bool Key(const Ch* str) { return Key(str, internal::StrLen(str)); } + + //@} + + //! Write a raw JSON value. + /*! + For user to write a stringified JSON as a value. + + \param json A well-formed JSON value. It should not contain null character within [0, length - 1] range. + \param length Length of the json. + \param type Type of the root of json. + */ + bool RawValue(const Ch* json, size_t length, Type type) { Prefix(type); return EndValue(WriteRawValue(json, length)); } + +protected: + //! Information for each nested level + struct Level { + Level(bool inArray_) : valueCount(0), inArray(inArray_) {} + size_t valueCount; //!< number of values in this level + bool inArray; //!< true if in array, otherwise in object + }; + + static const size_t kDefaultLevelDepth = 32; + + bool WriteNull() { + PutReserve(*os_, 4); + PutUnsafe(*os_, 'n'); PutUnsafe(*os_, 'u'); PutUnsafe(*os_, 'l'); PutUnsafe(*os_, 'l'); return true; + } + + bool WriteBool(bool b) { + if (b) { + PutReserve(*os_, 4); + PutUnsafe(*os_, 't'); PutUnsafe(*os_, 'r'); PutUnsafe(*os_, 'u'); PutUnsafe(*os_, 'e'); + } + else { + PutReserve(*os_, 5); + PutUnsafe(*os_, 'f'); PutUnsafe(*os_, 'a'); PutUnsafe(*os_, 'l'); PutUnsafe(*os_, 's'); PutUnsafe(*os_, 'e'); + } + return true; + } + + bool WriteInt(int i) { + char buffer[11]; + const char* end = internal::i32toa(i, buffer); + PutReserve(*os_, static_cast(end - buffer)); + for (const char* p = buffer; p != end; ++p) + PutUnsafe(*os_, static_cast(*p)); + return true; + } + + bool WriteUint(unsigned u) { + char buffer[10]; + const char* end = internal::u32toa(u, buffer); + PutReserve(*os_, static_cast(end - buffer)); + for (const char* p = buffer; p != end; ++p) + PutUnsafe(*os_, static_cast(*p)); + return true; + } + + bool WriteInt64(int64_t i64) { + char buffer[21]; + const char* end = internal::i64toa(i64, buffer); + PutReserve(*os_, static_cast(end - buffer)); + for (const char* p = buffer; p != end; ++p) + PutUnsafe(*os_, static_cast(*p)); + return true; + } + + bool WriteUint64(uint64_t u64) { + char buffer[20]; + char* end = internal::u64toa(u64, buffer); + PutReserve(*os_, static_cast(end - buffer)); + for (char* p = buffer; p != end; ++p) + PutUnsafe(*os_, static_cast(*p)); + return true; + } + + bool WriteDouble(double d) { + if (internal::Double(d).IsNanOrInf()) { + if (!(writeFlags & kWriteNanAndInfFlag)) + return false; + if (internal::Double(d).IsNan()) { + PutReserve(*os_, 3); + PutUnsafe(*os_, 'N'); PutUnsafe(*os_, 'a'); PutUnsafe(*os_, 'N'); + return true; + } + if (internal::Double(d).Sign()) { + PutReserve(*os_, 9); + PutUnsafe(*os_, '-'); + } + else + PutReserve(*os_, 8); + PutUnsafe(*os_, 'I'); PutUnsafe(*os_, 'n'); PutUnsafe(*os_, 'f'); + PutUnsafe(*os_, 'i'); PutUnsafe(*os_, 'n'); PutUnsafe(*os_, 'i'); PutUnsafe(*os_, 't'); PutUnsafe(*os_, 'y'); + return true; + } + + char buffer[25]; + char* end = internal::dtoa(d, buffer, maxDecimalPlaces_); + PutReserve(*os_, static_cast(end - buffer)); + for (char* p = buffer; p != end; ++p) + PutUnsafe(*os_, static_cast(*p)); + return true; + } + + bool WriteString(const Ch* str, SizeType length) { + static const typename TargetEncoding::Ch hexDigits[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; + static const char escape[256] = { +#define Z16 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + //0 1 2 3 4 5 6 7 8 9 A B C D E F + 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'b', 't', 'n', 'u', 'f', 'r', 'u', 'u', // 00 + 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', // 10 + 0, 0, '"', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 20 + Z16, Z16, // 30~4F + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,'\\', 0, 0, 0, // 50 + Z16, Z16, Z16, Z16, Z16, Z16, Z16, Z16, Z16, Z16 // 60~FF +#undef Z16 + }; + + if (TargetEncoding::supportUnicode) + PutReserve(*os_, 2 + length * 6); // "\uxxxx..." + else + PutReserve(*os_, 2 + length * 12); // "\uxxxx\uyyyy..." + + PutUnsafe(*os_, '\"'); + GenericStringStream is(str); + while (ScanWriteUnescapedString(is, length)) { + const Ch c = is.Peek(); + if (!TargetEncoding::supportUnicode && static_cast(c) >= 0x80) { + // Unicode escaping + unsigned codepoint; + if (RAPIDJSON_UNLIKELY(!SourceEncoding::Decode(is, &codepoint))) + return false; + PutUnsafe(*os_, '\\'); + PutUnsafe(*os_, 'u'); + if (codepoint <= 0xD7FF || (codepoint >= 0xE000 && codepoint <= 0xFFFF)) { + PutUnsafe(*os_, hexDigits[(codepoint >> 12) & 15]); + PutUnsafe(*os_, hexDigits[(codepoint >> 8) & 15]); + PutUnsafe(*os_, hexDigits[(codepoint >> 4) & 15]); + PutUnsafe(*os_, hexDigits[(codepoint ) & 15]); + } + else { + RAPIDJSON_ASSERT(codepoint >= 0x010000 && codepoint <= 0x10FFFF); + // Surrogate pair + unsigned s = codepoint - 0x010000; + unsigned lead = (s >> 10) + 0xD800; + unsigned trail = (s & 0x3FF) + 0xDC00; + PutUnsafe(*os_, hexDigits[(lead >> 12) & 15]); + PutUnsafe(*os_, hexDigits[(lead >> 8) & 15]); + PutUnsafe(*os_, hexDigits[(lead >> 4) & 15]); + PutUnsafe(*os_, hexDigits[(lead ) & 15]); + PutUnsafe(*os_, '\\'); + PutUnsafe(*os_, 'u'); + PutUnsafe(*os_, hexDigits[(trail >> 12) & 15]); + PutUnsafe(*os_, hexDigits[(trail >> 8) & 15]); + PutUnsafe(*os_, hexDigits[(trail >> 4) & 15]); + PutUnsafe(*os_, hexDigits[(trail ) & 15]); + } + } + else if ((sizeof(Ch) == 1 || static_cast(c) < 256) && RAPIDJSON_UNLIKELY(escape[static_cast(c)])) { + is.Take(); + PutUnsafe(*os_, '\\'); + PutUnsafe(*os_, static_cast(escape[static_cast(c)])); + if (escape[static_cast(c)] == 'u') { + PutUnsafe(*os_, '0'); + PutUnsafe(*os_, '0'); + PutUnsafe(*os_, hexDigits[static_cast(c) >> 4]); + PutUnsafe(*os_, hexDigits[static_cast(c) & 0xF]); + } + } + else if (RAPIDJSON_UNLIKELY(!(writeFlags & kWriteValidateEncodingFlag ? + Transcoder::Validate(is, *os_) : + Transcoder::TranscodeUnsafe(is, *os_)))) + return false; + } + PutUnsafe(*os_, '\"'); + return true; + } + + bool ScanWriteUnescapedString(GenericStringStream& is, size_t length) { + return RAPIDJSON_LIKELY(is.Tell() < length); + } + + bool WriteStartObject() { os_->Put('{'); return true; } + bool WriteEndObject() { os_->Put('}'); return true; } + bool WriteStartArray() { os_->Put('['); return true; } + bool WriteEndArray() { os_->Put(']'); return true; } + + bool WriteRawValue(const Ch* json, size_t length) { + PutReserve(*os_, length); + for (size_t i = 0; i < length; i++) { + RAPIDJSON_ASSERT(json[i] != '\0'); + PutUnsafe(*os_, json[i]); + } + return true; + } + + void Prefix(Type type) { + (void)type; + if (RAPIDJSON_LIKELY(level_stack_.GetSize() != 0)) { // this value is not at root + Level* level = level_stack_.template Top(); + if (level->valueCount > 0) { + if (level->inArray) + os_->Put(','); // add comma if it is not the first element in array + else // in object + os_->Put((level->valueCount % 2 == 0) ? ',' : ':'); + } + if (!level->inArray && level->valueCount % 2 == 0) + RAPIDJSON_ASSERT(type == kStringType); // if it's in object, then even number should be a name + level->valueCount++; + } + else { + RAPIDJSON_ASSERT(!hasRoot_); // Should only has one and only one root. + hasRoot_ = true; + } + } + + // Flush the value if it is the top level one. + bool EndValue(bool ret) { + if (RAPIDJSON_UNLIKELY(level_stack_.Empty())) // end of json text + os_->Flush(); + return ret; + } + + OutputStream* os_; + internal::Stack level_stack_; + int maxDecimalPlaces_; + bool hasRoot_; + +private: + // Prohibit copy constructor & assignment operator. + Writer(const Writer&); + Writer& operator=(const Writer&); +}; + +// Full specialization for StringStream to prevent memory copying + +template<> +inline bool Writer::WriteInt(int i) { + char *buffer = os_->Push(11); + const char* end = internal::i32toa(i, buffer); + os_->Pop(static_cast(11 - (end - buffer))); + return true; +} + +template<> +inline bool Writer::WriteUint(unsigned u) { + char *buffer = os_->Push(10); + const char* end = internal::u32toa(u, buffer); + os_->Pop(static_cast(10 - (end - buffer))); + return true; +} + +template<> +inline bool Writer::WriteInt64(int64_t i64) { + char *buffer = os_->Push(21); + const char* end = internal::i64toa(i64, buffer); + os_->Pop(static_cast(21 - (end - buffer))); + return true; +} + +template<> +inline bool Writer::WriteUint64(uint64_t u) { + char *buffer = os_->Push(20); + const char* end = internal::u64toa(u, buffer); + os_->Pop(static_cast(20 - (end - buffer))); + return true; +} + +template<> +inline bool Writer::WriteDouble(double d) { + if (internal::Double(d).IsNanOrInf()) { + // Note: This code path can only be reached if (RAPIDJSON_WRITE_DEFAULT_FLAGS & kWriteNanAndInfFlag). + if (!(kWriteDefaultFlags & kWriteNanAndInfFlag)) + return false; + if (internal::Double(d).IsNan()) { + PutReserve(*os_, 3); + PutUnsafe(*os_, 'N'); PutUnsafe(*os_, 'a'); PutUnsafe(*os_, 'N'); + return true; + } + if (internal::Double(d).Sign()) { + PutReserve(*os_, 9); + PutUnsafe(*os_, '-'); + } + else + PutReserve(*os_, 8); + PutUnsafe(*os_, 'I'); PutUnsafe(*os_, 'n'); PutUnsafe(*os_, 'f'); + PutUnsafe(*os_, 'i'); PutUnsafe(*os_, 'n'); PutUnsafe(*os_, 'i'); PutUnsafe(*os_, 't'); PutUnsafe(*os_, 'y'); + return true; + } + + char *buffer = os_->Push(25); + char* end = internal::dtoa(d, buffer, maxDecimalPlaces_); + os_->Pop(static_cast(25 - (end - buffer))); + return true; +} + +#if defined(RAPIDJSON_SSE2) || defined(RAPIDJSON_SSE42) +template<> +inline bool Writer::ScanWriteUnescapedString(StringStream& is, size_t length) { + if (length < 16) + return RAPIDJSON_LIKELY(is.Tell() < length); + + if (!RAPIDJSON_LIKELY(is.Tell() < length)) + return false; + + const char* p = is.src_; + const char* end = is.head_ + length; + const char* nextAligned = reinterpret_cast((reinterpret_cast(p) + 15) & static_cast(~15)); + const char* endAligned = reinterpret_cast(reinterpret_cast(end) & static_cast(~15)); + if (nextAligned > end) + return true; + + while (p != nextAligned) + if (*p < 0x20 || *p == '\"' || *p == '\\') { + is.src_ = p; + return RAPIDJSON_LIKELY(is.Tell() < length); + } + else + os_->PutUnsafe(*p++); + + // The rest of string using SIMD + static const char dquote[16] = { '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"', '\"' }; + static const char bslash[16] = { '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\' }; + static const char space[16] = { 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19 }; + const __m128i dq = _mm_loadu_si128(reinterpret_cast(&dquote[0])); + const __m128i bs = _mm_loadu_si128(reinterpret_cast(&bslash[0])); + const __m128i sp = _mm_loadu_si128(reinterpret_cast(&space[0])); + + for (; p != endAligned; p += 16) { + const __m128i s = _mm_load_si128(reinterpret_cast(p)); + const __m128i t1 = _mm_cmpeq_epi8(s, dq); + const __m128i t2 = _mm_cmpeq_epi8(s, bs); + const __m128i t3 = _mm_cmpeq_epi8(_mm_max_epu8(s, sp), sp); // s < 0x20 <=> max(s, 0x19) == 0x19 + const __m128i x = _mm_or_si128(_mm_or_si128(t1, t2), t3); + unsigned short r = static_cast(_mm_movemask_epi8(x)); + if (RAPIDJSON_UNLIKELY(r != 0)) { // some of characters is escaped + SizeType len; +#ifdef _MSC_VER // Find the index of first escaped + unsigned long offset; + _BitScanForward(&offset, r); + len = offset; +#else + len = static_cast(__builtin_ffs(r) - 1); +#endif + char* q = reinterpret_cast(os_->PushUnsafe(len)); + for (size_t i = 0; i < len; i++) + q[i] = p[i]; + + p += len; + break; + } + _mm_storeu_si128(reinterpret_cast<__m128i *>(os_->PushUnsafe(16)), s); + } + + is.src_ = p; + return RAPIDJSON_LIKELY(is.Tell() < length); +} +#endif // defined(RAPIDJSON_SSE2) || defined(RAPIDJSON_SSE42) + +RAPIDJSON_NAMESPACE_END + +#ifdef _MSC_VER +RAPIDJSON_DIAG_POP +#endif + +#ifdef __clang__ +RAPIDJSON_DIAG_POP +#endif + +#endif // RAPIDJSON_RAPIDJSON_H_ diff --git a/src/3rdparty/mapbox-gl-native/deps/shelf-pack/2.1.1/LICENSE.md b/src/3rdparty/mapbox-gl-native/deps/shelf-pack/2.1.1/LICENSE.md new file mode 100644 index 0000000..6f4f868 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/shelf-pack/2.1.1/LICENSE.md @@ -0,0 +1,15 @@ +ISC License + +Copyright (c) 2017, Mapbox + +Permission to use, copy, modify, and/or distribute this software for any purpose +with or without fee is hereby granted, provided that the above copyright notice +and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. diff --git a/src/3rdparty/mapbox-gl-native/deps/shelf-pack/2.1.1/include/mapbox/shelf-pack.hpp b/src/3rdparty/mapbox-gl-native/deps/shelf-pack/2.1.1/include/mapbox/shelf-pack.hpp new file mode 100644 index 0000000..3a78bfe --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/shelf-pack/2.1.1/include/mapbox/shelf-pack.hpp @@ -0,0 +1,535 @@ +#ifndef SHELF_PACK_HPP +#define SHELF_PACK_HPP + +#include +#include +#include +#include +#include +#include + +namespace mapbox { + +const char * const SHELF_PACK_VERSION = "2.1.1"; + + + +class Bin { + friend class ShelfPack; + +public: + /** + * Create a new Bin. + * + * @class Bin + * @param {int32_t} id Unique bin identifier + * @param {int32_t} [w1=-1] Width of the new Bin + * @param {int32_t} [h1=-1] Height of the new Bin + * @param {int32_t} [maxw1=-1] Maximum Width of the new Bin + * @param {int32_t} [maxh1=-1] Maximum Height of the new Bin + * @param {int32_t} [x1=-1] X location of the Bin + * @param {int32_t} [y1=-1] Y location of the Bin + * + * @example + * Bin b(-1, 12, 16); + */ + explicit Bin( + int32_t id1 = -1, + int32_t w1 = -1, + int32_t h1 = -1, + int32_t maxw1 = -1, + int32_t maxh1 = -1, + int32_t x1 = -1, + int32_t y1 = -1 + ) : id(id1), w(w1), h(h1), maxw(maxw1), maxh(maxh1), x(x1), y(y1), refcount_(0) { + + if (maxw == -1) { + maxw = w; + } + if (maxh == -1) { + maxh = h; + } + } + + int32_t id; + int32_t w; + int32_t h; + int32_t maxw; + int32_t maxh; + int32_t x; + int32_t y; + + int32_t refcount() const { return refcount_; } + +private: + + int32_t refcount_; +}; + + +class Shelf { +public: + /** + * Create a new Shelf. + * + * @class Shelf + * @param {int32_t} y1 Top coordinate of the new shelf + * @param {int32_t} w1 Width of the new shelf + * @param {int32_t} h1 Height of the new shelf + * + * @example + * Shelf shelf(64, 512, 24); + */ + explicit Shelf(int32_t y1, int32_t w1, int32_t h1) : + x_(0), y_(y1), w_(w1), h_(h1), wfree_(w1) { } + + + /** + * Allocate a single bin into the shelf. + * Bin is stored in a `bins_` container. + * Returned pointer is stable until the shelf is destroyed. + * + * @param {int32_t} id Unique bin identifier, pass -1 to generate a new one + * @param {int32_t} w1 Width of the bin to allocate + * @param {int32_t} h1 Height of the bin to allocate + * @returns {Bin*} `Bin` pointer with `id`, `x`, `y`, `w`, `h` members + * + * @example + * Bin* result = shelf.alloc(-1, 12, 16); + */ + Bin* alloc(int32_t id, int32_t w1, int32_t h1) { + if (w1 > wfree_ || h1 > h_) { + return nullptr; + } + int32_t x1 = x_; + x_ += w1; + wfree_ -= w1; + bins_.emplace_back(id, w1, h1, w1, h_, x1, y_); + return &bins_.back(); + } + + + /** + * Resize the shelf. + * + * @param {int32_t} w1 Requested new width of the shelf + * @returns {bool} `true` if resize succeeded, `false` if failed + * + * @example + * shelf.resize(512); + */ + bool resize(int32_t w1) { + wfree_ += (w1 - w_); + w_ = w1; + return true; + } + + int32_t x() const { return x_; } + int32_t y() const { return y_; } + int32_t w() const { return w_; } + int32_t h() const { return h_; } + int32_t wfree() const { return wfree_; } + +private: + int32_t x_; + int32_t y_; + int32_t w_; + int32_t h_; + int32_t wfree_; + + std::deque bins_; +}; + + + +class ShelfPack { +public: + + struct ShelfPackOptions { + inline ShelfPackOptions() : autoResize(false) { }; + bool autoResize; + }; + + struct PackOptions { + inline PackOptions() : inPlace(false) { }; + bool inPlace; + }; + + + /** + * Create a new ShelfPack bin allocator. + * + * Uses the Shelf Best Height Fit algorithm from + * http://clb.demon.fi/files/RectangleBinPack.pdf + * + * @class ShelfPack + * @param {int32_t} [w=64] Initial width of the sprite + * @param {int32_t} [h=64] Initial width of the sprite + * @param {ShelfPackOptions} [options] + * @param {bool} [options.autoResize=false] If `true`, the sprite will automatically grow + * + * @example + * ShelfPack::ShelfPackOptions options; + * options.autoResize = false; + * ShelfPack sprite = new ShelfPack(64, 64, options); + */ + explicit ShelfPack(int32_t w = 0, int32_t h = 0, const ShelfPackOptions &options = ShelfPackOptions{}) { + width_ = w > 0 ? w : 64; + height_ = h > 0 ? h : 64; + autoResize_ = options.autoResize; + maxId_ = 0; + } + + + /** + * Batch pack multiple bins into the sprite. + * + * @param {vector} bins Array of requested bins - each object should have `w`, `h` values + * @param {PackOptions} [options] + * @param {bool} [options.inPlace=false] If `true`, the supplied bin objects will be updated inplace with `x` and `y` values + * @returns {vector} Array of Bin pointers - each bin is a struct with `x`, `y`, `w`, `h` values + * + * @example + * std::vector moreBins; + * moreBins.emplace_back(-1, 12, 24); + * moreBins.emplace_back(-1, 12, 12); + * moreBins.emplace_back(-1, 10, 10); + * + * ShelfPack::PackOptions options; + * options.inPlace = true; + * std::vector results = sprite.pack(moreBins, options); + */ + std::vector pack(std::vector &bins, const PackOptions &options = PackOptions{}) { + std::vector results; + + for (auto& bin : bins) { + if (bin.w > 0 && bin.h > 0) { + Bin* allocation = packOne(bin.id, bin.w, bin.h); + if (!allocation) { + continue; + } + if (options.inPlace) { + bin.id = allocation->id; + bin.x = allocation->x; + bin.y = allocation->y; + } + results.push_back(allocation); + } + } + + shrink(); + + return results; + } + + + /** + * Pack a single bin into the sprite. + * + * @param {int32_t} id Unique bin identifier, pass -1 to generate a new one + * @param {int32_t} w Width of the bin to allocate + * @param {int32_t} h Height of the bin to allocate + * @returns {Bin*} Pointer to a packed Bin with `id`, `x`, `y`, `w`, `h` members + * + * @example + * Bin* result = sprite.packOne(-1, 12, 16); + */ + Bin* packOne(int32_t id, int32_t w, int32_t h) { + int32_t y = 0; + int32_t waste = 0; + struct { + Shelf* pshelf = nullptr; + Bin* pfreebin = nullptr; + int32_t waste = std::numeric_limits::max(); + } best; + + // if id was supplied, attempt a lookup.. + if (id != -1) { + Bin* pbin = getBin(id); + if (pbin) { // we packed this bin already + ref(*pbin); + return pbin; + } + maxId_ = std::max(id, maxId_); + } else { + id = ++maxId_; + } + + // First try to reuse a free bin.. + for (auto& freebin : freebins_) { + // exactly the right height and width, use it.. + if (h == freebin->maxh && w == freebin->maxw) { + return allocFreebin(freebin, id, w, h); + } + // not enough height or width, skip it.. + if (h > freebin->maxh || w > freebin->maxw) { + continue; + } + // extra height or width, minimize wasted area.. + if (h <= freebin->maxh && w <= freebin->maxw) { + waste = (freebin->maxw * freebin->maxh) - (w * h); + if (waste < best.waste) { + best.waste = waste; + best.pfreebin = freebin; + } + } + } + + // Next find the best shelf + for (auto& shelf : shelves_) { + y += shelf.h(); + + // not enough width on this shelf, skip it.. + if (w > shelf.wfree()) { + continue; + } + // exactly the right height, pack it.. + if (h == shelf.h()) { + return allocShelf(shelf, id, w, h); + } + // not enough height, skip it.. + if (h > shelf.h()) { + continue; + } + // extra height, minimize wasted area.. + if (h < shelf.h()) { + waste = (shelf.h() - h) * w; + if (waste < best.waste) { + best.waste = waste; + best.pshelf = &shelf; + } + } + } + + if (best.pfreebin) { + return allocFreebin(best.pfreebin, id, w, h); + } + + if (best.pshelf) { + return allocShelf(*best.pshelf, id, w, h); + } + + // No free bins or shelves.. add shelf.. + if (h <= (height_ - y) && w <= width_) { + shelves_.emplace_back(y, width_, h); + return allocShelf(shelves_.back(), id, w, h); + } + + // No room for more shelves.. + // If `autoResize` option is set, grow the sprite as follows: + // * double whichever sprite dimension is smaller (`w1` or `h1`) + // * if sprite dimensions are equal, grow width before height + // * accomodate very large bin requests (big `w` or `h`) + if (autoResize_) { + int32_t h1, h2, w1, w2; + + h1 = h2 = height_; + w1 = w2 = width_; + + if (w1 <= h1 || w > w1) { // grow width.. + w2 = std::max(w, w1) * 2; + } + if (h1 < w1 || h > h1) { // grow height.. + h2 = std::max(h, h1) * 2; + } + + resize(w2, h2); + return packOne(id, w, h); // retry + } + + return nullptr; + } + + + /** + * + * Shrink the width/height of the sprite to the bare minimum. + * Since shelf-pack doubles first width, then height when running out of shelf space + * this can result in fairly large unused space both in width and height if that happens + * towards the end of bin packing. + */ + void shrink() { + if (shelves_.size()) { + int32_t w2 = 0; + int32_t h2 = 0; + + for (auto& shelf : shelves_) { + h2 += shelf.h(); + w2 = std::max(shelf.w() - shelf.wfree(), w2); + } + + resize(w2, h2); + } + } + + + /** + * Return a packed bin given its id, or nullptr if the id is not found + * + * @param {int32_t} id Unique identifier for this bin, + * @returns {Bin*} Pointer to a packed Bin with `id`, `x`, `y`, `w`, `h` members + * + * @example + * Bin* result = sprite.getBin(5); + */ + Bin* getBin(int32_t id) { + std::map::iterator it = usedbins_.find(id); + return (it == usedbins_.end()) ? nullptr : it->second; + } + + + /** + * Increment the ref count of a bin and update statistics. + * + * @param {Bin&} bin Bin reference + * @returns {int32_t} New refcount of the bin + * + * @example + * Bin* bin = sprite.getBin(5); + * if (bin) { + * sprite.ref(*bin); + * } + */ + int32_t ref(Bin& bin) { + if (++bin.refcount_ == 1) { // a new Bin.. record height in stats historgram.. + int32_t h = bin.h; + stats_[h] = (stats_[h] | 0) + 1; + } + + return bin.refcount_; + }; + + + /** + * Decrement the ref count of a bin and update statistics. + * The bin will be automatically marked as free space once the refcount reaches 0. + * Memory for the bin is not freed, as unreferenced bins may be reused later. + * + * @param {Bin&} bin Bin reference + * @returns {int32_t} New refcount of the bin + * + * @example + * Bin* bin = sprite.getBin(5); + * if (bin) { + * sprite.unref(*bin); + * } + */ + int32_t unref(Bin& bin) { + if (bin.refcount_ == 0) { + return 0; + } + + if (--bin.refcount_ == 0) { + stats_[bin.h]--; + usedbins_.erase(bin.id); + freebins_.push_back(&bin); + } + + return bin.refcount_; + } + + + /** + * Clear the sprite and reset statistics. + * + * @example + * sprite.clear(); + */ + void clear() { + shelves_.clear(); + freebins_.clear(); + usedbins_.clear(); + stats_.clear(); + maxId_ = 0; + } + + + /** + * Resize the sprite. + * + * @param {int32_t} w Requested new sprite width + * @param {int32_t} h Requested new sprite height + * @returns {bool} `true` if resize succeeded, `false` if failed + * + * @example + * sprite.resize(256, 256); + */ + bool resize(int32_t w, int32_t h) { + width_ = w; + height_ = h; + for (auto& shelf : shelves_) { + shelf.resize(width_); + } + return true; + } + + int32_t width() const { return width_; } + int32_t height() const { return height_; } + + +private: + + /** + * Called by packOne() to allocate a bin by reusing an existing freebin + * + * @private + * @param {Bin*} bin Pointer to a freebin to reuse + * @param {int32_t} w Width of the bin to allocate + * @param {int32_t} h Height of the bin to allocate + * @param {int32_t} id Unique identifier for this bin + * @returns {Bin*} Pointer to a Bin with `id`, `x`, `y`, `w`, `h` properties + * + * @example + * Bin* bin = sprite.allocFreebin(pfreebin, 12, 16, 5); + */ + Bin* allocFreebin(Bin* bin, int32_t id, int32_t w, int32_t h) { + freebins_.erase(std::remove(freebins_.begin(), freebins_.end(), bin), freebins_.end()); + bin->id = id; + bin->w = w; + bin->h = h; + bin->refcount_ = 0; + usedbins_[id] = bin; + ref(*bin); + return bin; + } + + + /** + * Called by `packOne() to allocate bin on an existing shelf + * Memory for the bin is allocated on the heap by `shelf.alloc()` + * + * @private + * @param {Shelf&} shelf Reference to the shelf to allocate the bin on + * @param {int32_t} w Width of the bin to allocate + * @param {int32_t} h Height of the bin to allocate + * @param {int32_t} id Unique identifier for this bin + * @returns {Bin*} Pointer to a Bin with `id`, `x`, `y`, `w`, `h` properties + * + * @example + * Bin* bin = sprite.allocShelf(shelf, 12, 16, 5); + */ + Bin* allocShelf(Shelf& shelf, int32_t id, int32_t w, int32_t h) { + Bin* pbin = shelf.alloc(id, w, h); + if (pbin) { + usedbins_[id] = pbin; + ref(*pbin); + } + return pbin; + } + + + int32_t width_; + int32_t height_; + int32_t maxId_; + bool autoResize_; + + std::deque shelves_; + std::map usedbins_; + std::vector freebins_; + std::map stats_; +}; + + +} // namespace mapbox + +#endif diff --git a/src/3rdparty/mapbox-gl-native/deps/supercluster/0.2.2/LICENSE b/src/3rdparty/mapbox-gl-native/deps/supercluster/0.2.2/LICENSE new file mode 100644 index 0000000..14101c2 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/supercluster/0.2.2/LICENSE @@ -0,0 +1,13 @@ +Copyright (c) 2016, Mapbox + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/src/3rdparty/mapbox-gl-native/deps/supercluster/0.2.2/include/supercluster.hpp b/src/3rdparty/mapbox-gl-native/deps/supercluster/0.2.2/include/supercluster.hpp new file mode 100644 index 0000000..3175564 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/supercluster/0.2.2/include/supercluster.hpp @@ -0,0 +1,229 @@ +#pragma once + +#include +#include +#include + +#include +#include +#include +#include + +#ifdef DEBUG_TIMER +#include +#include +#endif + +namespace mapbox { +namespace supercluster { + +using namespace mapbox::geometry; + +struct Cluster { + point pos; + std::uint32_t num_points; + std::uint32_t id = 0; + bool visited = false; + + Cluster(point pos_, + std::uint32_t num_points_, + std::uint32_t id_ = 0, + bool visited_ = false) + : pos(std::move(pos_)), + num_points(num_points_), + id(id_), + visited(visited_) {} +}; + +} // namespace supercluster +} // namespace mapbox + +namespace kdbush { + +using Cluster = mapbox::supercluster::Cluster; + +template <> +struct nth<0, Cluster> { + inline static double get(const Cluster &c) { + return c.pos.x; + }; +}; +template <> +struct nth<1, Cluster> { + inline static double get(const Cluster &c) { + return c.pos.y; + }; +}; + +} // namespace kdbush + +namespace mapbox { +namespace supercluster { + +#ifdef DEBUG_TIMER +class Timer { +public: + std::chrono::high_resolution_clock::time_point started; + Timer() { + started = std::chrono::high_resolution_clock::now(); + } + void operator()(std::string msg) { + const auto now = std::chrono::high_resolution_clock::now(); + const auto ms = std::chrono::duration_cast(now - started); + std::cerr << msg << ": " << double(ms.count()) / 1000 << "ms\n"; + started = now; + } +}; +#endif + +struct Options { + std::uint8_t minZoom = 0; // min zoom to generate clusters on + std::uint8_t maxZoom = 16; // max zoom level to cluster the points on + std::uint16_t radius = 40; // cluster radius in pixels + std::uint16_t extent = 512; // tile extent (radius is calculated relative to it) +}; + +class Supercluster { + using GeoJSONPoint = point; + using GeoJSONFeatures = feature_collection; + + using TilePoint = point; + using TileFeature = feature; + using TileFeatures = feature_collection; + +public: + const GeoJSONFeatures features; + const Options options; + + Supercluster(const GeoJSONFeatures &features_, const Options options_ = Options()) + : features(features_), options(options_) { + +#ifdef DEBUG_TIMER + Timer timer; +#endif + // convert and index initial points + zooms.emplace(options.maxZoom + 1, features); +#ifdef DEBUG_TIMER + timer(std::to_string(features.size()) + " initial points"); +#endif + for (int z = options.maxZoom; z >= options.minZoom; z--) { + // cluster points from the previous zoom level + const double r = options.radius / (options.extent * std::pow(2, z)); + zooms.emplace(z, Zoom(zooms[z + 1], r)); +#ifdef DEBUG_TIMER + timer(std::to_string(zooms[z].clusters.size()) + " clusters"); +#endif + } + } + + TileFeatures getTile(std::uint8_t z, std::uint32_t x_, std::uint32_t y) { + TileFeatures result; + auto &zoom = zooms[limitZoom(z)]; + + std::uint32_t z2 = std::pow(2, z); + double const r = static_cast(options.radius) / options.extent; + std::int32_t x = static_cast(x_); + + auto visitor = [&, this](const auto &id) { + auto const &c = zoom.clusters[id]; + + TilePoint point(::round(this->options.extent * (c.pos.x * z2 - x)), + ::round(this->options.extent * (c.pos.y * z2 - y))); + TileFeature feature{ point }; + + if (c.num_points == 1) { + feature.properties = this->features[c.id].properties; + } else { + feature.properties["cluster"] = true; + feature.properties["point_count"] = static_cast(c.num_points); + } + + result.push_back(feature); + }; + + double const top = (y - r) / z2; + double const bottom = (y + 1 + r) / z2; + + zoom.tree.range((x - r) / z2, top, (x + 1 + r) / z2, bottom, visitor); + + if (x_ == 0) { + x = z2; + zoom.tree.range(1 - r / z2, top, 1, bottom, visitor); + } + if (x_ == z2 - 1) { + x = -1; + zoom.tree.range(0, top, r / z2, bottom, visitor); + } + + return result; + } + +private: + struct Zoom { + kdbush::KDBush tree; + std::vector clusters; + + Zoom() = default; + + Zoom(const GeoJSONFeatures &features_) { + // generate a cluster object for each point + std::uint32_t i = 0; + + for (const auto &f : features_) { + clusters.push_back({ project(f.geometry.get()), 1, i++ }); + } + + tree.fill(clusters); + } + + Zoom(Zoom &previous, double r) { + for (auto &p : previous.clusters) { + if (p.visited) + continue; + p.visited = true; + + auto num_points = p.num_points; + point weight = p.pos * double(num_points); + + // find all nearby points + previous.tree.within(p.pos.x, p.pos.y, r, [&](const auto &id) { + auto &b = previous.clusters[id]; + + // filter out neighbors that are already processed + if (b.visited) + return; + b.visited = true; + + // accumulate coordinates for calculating weighted center + weight += b.pos * double(b.num_points); + num_points += b.num_points; + }); + + clusters.push_back({ weight / double(num_points), num_points, p.id }); + } + + tree.fill(clusters); + } + }; + + std::unordered_map zooms; + + std::uint8_t limitZoom(std::uint8_t z) { + if (z < options.minZoom) + return options.minZoom; + if (z > options.maxZoom + 1) + return options.maxZoom + 1; + return z; + } + + static point project(const GeoJSONPoint &p) { + auto lngX = p.x / 360 + 0.5; + const double sine = std::sin(p.y * M_PI / 180); + const double y = 0.5 - 0.25 * std::log((1 + sine) / (1 - sine)) / M_PI; + auto latY = std::min(std::max(y, 0.0), 1.0); + return { lngX, latY }; + } +}; + +} // namespace supercluster +} // namespace mapbox diff --git a/src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/LICENSE b/src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/LICENSE new file mode 100644 index 0000000..c9c0ca8 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/LICENSE @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright (c) 2015 Daniel Frey + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + diff --git a/src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/include/tao/seq/concatenate.hpp b/src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/include/tao/seq/concatenate.hpp new file mode 100644 index 0000000..fd74924 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/include/tao/seq/concatenate.hpp @@ -0,0 +1,29 @@ +// The Art of C++ / Sequences +// Copyright (c) 2015 Daniel Frey + +#ifndef TAOCPP_SEQUENCES_INCLUDE_CONCATENATE_HPP +#define TAOCPP_SEQUENCES_INCLUDE_CONCATENATE_HPP + +#include + +#include "integer_sequence.hpp" + +namespace tao +{ + namespace seq + { + template< typename, typename > + struct concatenate; + + template< typename TA, TA... As, typename TB, TB... Bs > + struct concatenate< integer_sequence< TA, As... >, integer_sequence< TB, Bs... > > + { + using type = integer_sequence< typename std::common_type< TA, TB >::type, As..., Bs... >; + }; + + template< typename A, typename B > + using concatenate_t = typename concatenate< A, B >::type; + } +} + +#endif // TAOCPP_SEQUENCES_INCLUDE_CONCATENATE_HPP diff --git a/src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/include/tao/seq/config.hpp b/src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/include/tao/seq/config.hpp new file mode 100644 index 0000000..2995876 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/include/tao/seq/config.hpp @@ -0,0 +1,25 @@ +// The Art of C++ / Sequences +// Copyright (c) 2015 Daniel Frey + +#ifndef TAOCPP_SEQUENCES_INCLUDE_CONFIG_HPP +#define TAOCPP_SEQUENCES_INCLUDE_CONFIG_HPP + +#if __cplusplus >= 201402L +# define TAOCPP_USE_STD_INTEGER_SEQUENCE +#endif + +#if (__cplusplus >= 201402L) && defined(_LIBCPP_VERSION) +# define TAOCPP_USE_STD_MAKE_INTEGER_SEQUENCE +#endif + +#if defined(__cpp_fold_expressions) +# define TAOCPP_FOLD_EXPRESSIONS +#elif __cplusplus > 201402L +# if defined(__apple_build_version__) && (__clang_major__ >= 7) +# define TAOCPP_FOLD_EXPRESSIONS +# elif defined(__clang__) && ((__clang_major__ > 3) || ((__clang_major__ == 3) && (__clang_minor__ >= 6))) +# define TAOCPP_FOLD_EXPRESSIONS +# endif +#endif + +#endif // TAOCPP_SEQUENCES_INCLUDE_CONFIG_HPP diff --git a/src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/include/tao/seq/exclusive_scan.hpp b/src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/include/tao/seq/exclusive_scan.hpp new file mode 100644 index 0000000..e8a7c28 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/include/tao/seq/exclusive_scan.hpp @@ -0,0 +1,43 @@ +// The Art of C++ / Sequences +// Copyright (c) 2015 Daniel Frey + +#ifndef TAOCPP_SEQUENCES_INCLUDE_EXCLUSIVE_SCAN_HPP +#define TAOCPP_SEQUENCES_INCLUDE_EXCLUSIVE_SCAN_HPP + +#include + +#include "make_integer_sequence.hpp" +#include "partial_sum.hpp" + +namespace tao +{ + namespace seq + { + namespace impl + { + template< typename S, typename = make_index_sequence< S::size() > > + struct exclusive_scan; + + template< typename S, std::size_t... Is > + struct exclusive_scan< S, index_sequence< Is... > > + { + using type = integer_sequence< typename S::value_type, partial_sum< Is, S >::value... >; + }; + } + + template< typename T, T... Ns > + struct exclusive_scan + : impl::exclusive_scan< integer_sequence< T, Ns... > > + {}; + + template< typename T, T... Ns > + struct exclusive_scan< integer_sequence< T, Ns... > > + : impl::exclusive_scan< integer_sequence< T, Ns... > > + {}; + + template< typename T, T... Ns > + using exclusive_scan_t = typename exclusive_scan< T, Ns... >::type; + } +} + +#endif // TAOCPP_SEQUENCES_INCLUDE_EXCLUSIVE_SCAN_HPP diff --git a/src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/include/tao/seq/fold.hpp b/src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/include/tao/seq/fold.hpp new file mode 100644 index 0000000..fa05c6f --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/include/tao/seq/fold.hpp @@ -0,0 +1,57 @@ +// The Art of C++ / Sequences +// Copyright (c) 2015 Daniel Frey + +#ifndef TAOCPP_SEQUENCES_INCLUDE_FOLD_HPP +#define TAOCPP_SEQUENCES_INCLUDE_FOLD_HPP + +#include + +#include "values.hpp" +#include "integer_sequence.hpp" +#include "make_integer_sequence.hpp" + +namespace tao +{ + namespace seq + { + namespace impl + { + template< template< typename U, U, U > class, typename, bool, typename T, T... > + struct folder; + + template< template< typename U, U, U > class OP, std::size_t... Is, typename T, T... Ns > + struct folder< OP, index_sequence< Is... >, false, T, Ns... > + { + using values = seq::values< T, Ns... >; + using type = integer_sequence< T, OP< T, values::data[ 2 * Is ], values::data[ 2 * Is + 1 ] >::value... >; + }; + + template< template< typename U, U, U > class OP, std::size_t... Is, typename T, T N, T... Ns > + struct folder< OP, index_sequence< Is... >, true, T, N, Ns... > + { + using values = seq::values< T, Ns... >; + using type = integer_sequence< T, N, OP< T, values::data[ 2 * Is ], values::data[ 2 * Is + 1 ] >::value... >; + }; + } + + template< template< typename U, U, U > class, typename T, T... > + struct fold; + + template< template< typename U, U, U > class OP, typename T, T N > + struct fold< OP, T, N > + : std::integral_constant< T, N > + {}; + + template< template< typename U, U, U > class OP, typename T, T... Ns > + struct fold + : fold< OP, typename impl::folder< OP, make_index_sequence< sizeof...( Ns ) / 2 >, sizeof...( Ns ) % 2 == 1, T, Ns... >::type > + {}; + + template< template< typename U, U, U > class OP, typename T, T... Ns > + struct fold< OP, integer_sequence< T, Ns... > > + : fold< OP, T, Ns... > + {}; + } +} + +#endif // TAOCPP_SEQUENCES_INCLUDE_FOLD_HPP diff --git a/src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/include/tao/seq/head.hpp b/src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/include/tao/seq/head.hpp new file mode 100644 index 0000000..fcfecf0 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/include/tao/seq/head.hpp @@ -0,0 +1,30 @@ +// The Art of C++ / Sequences +// Copyright (c) 2015 Daniel Frey + +#ifndef TAOCPP_SEQUENCES_INCLUDE_HEAD_HPP +#define TAOCPP_SEQUENCES_INCLUDE_HEAD_HPP + +#include + +#include "integer_sequence.hpp" + +namespace tao +{ + namespace seq + { + template< typename T, T... Ns > + struct head; + + template< typename T, T N, T... Ns > + struct head< T, N, Ns... > + : std::integral_constant< T, N > + {}; + + template< typename T, T... Ns > + struct head< integer_sequence< T, Ns... > > + : head< T, Ns... > + {}; + } +} + +#endif // TAOCPP_SEQUENCES_INCLUDE_HEAD_HPP diff --git a/src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/include/tao/seq/inclusive_scan.hpp b/src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/include/tao/seq/inclusive_scan.hpp new file mode 100644 index 0000000..dc4bf72 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/include/tao/seq/inclusive_scan.hpp @@ -0,0 +1,32 @@ +// The Art of C++ / Sequences +// Copyright (c) 2015 Daniel Frey + +#ifndef TAOCPP_SEQUENCES_INCLUDE_INCLUSIVE_SCAN_HPP +#define TAOCPP_SEQUENCES_INCLUDE_INCLUSIVE_SCAN_HPP + +#include + +#include "plus.hpp" +#include "exclusive_scan.hpp" +#include "integer_sequence.hpp" + +namespace tao +{ + namespace seq + { + template< typename T, T... Ns > + struct inclusive_scan + : plus< exclusive_scan_t< T, Ns... >, integer_sequence< T, Ns... > > + {}; + + template< typename T, T... Ns > + struct inclusive_scan< integer_sequence< T, Ns... > > + : plus< exclusive_scan_t< integer_sequence< T, Ns... > >, integer_sequence< T, Ns... > > + {}; + + template< typename T, T... Ns > + using inclusive_scan_t = typename inclusive_scan< T, Ns... >::type; + } +} + +#endif // TAOCPP_SEQUENCES_INCLUDE_INCLUSIVE_SCAN_HPP diff --git a/src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/include/tao/seq/integer_sequence.hpp b/src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/include/tao/seq/integer_sequence.hpp new file mode 100644 index 0000000..9f5cf64 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/include/tao/seq/integer_sequence.hpp @@ -0,0 +1,43 @@ +// The Art of C++ / Sequences +// Copyright (c) 2015 Daniel Frey + +#ifndef TAOCPP_SEQUENCES_INCLUDE_INTEGER_SEQUENCE_HPP +#define TAOCPP_SEQUENCES_INCLUDE_INTEGER_SEQUENCE_HPP + +#include +#include + +#include "config.hpp" + +namespace tao +{ + namespace seq + { + +#ifdef TAOCPP_USE_STD_INTEGER_SEQUENCE + + using std::integer_sequence; + using std::index_sequence; + +#else + + template< typename T, T... Ns > + struct integer_sequence + { + using value_type = T; + + static constexpr std::size_t size() noexcept + { + return sizeof...( Ns ); + } + }; + + template< std::size_t... Ns > + using index_sequence = integer_sequence< std::size_t, Ns... >; + +#endif + + } +} + +#endif // TAOCPP_SEQUENCES_INCLUDE_INTEGER_SEQUENCE_HPP diff --git a/src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/include/tao/seq/is_all.hpp b/src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/include/tao/seq/is_all.hpp new file mode 100644 index 0000000..5707058 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/include/tao/seq/is_all.hpp @@ -0,0 +1,35 @@ +// The Art of C++ / Sequences +// Copyright (c) 2015 Daniel Frey + +#ifndef TAOCPP_SEQUENCES_INCLUDE_IS_ALL_HPP +#define TAOCPP_SEQUENCES_INCLUDE_IS_ALL_HPP + +#include "config.hpp" + +#ifndef TAOCPP_FOLD_EXPRESSIONS +#include "integer_sequence.hpp" +#endif + +#include + +namespace tao +{ + namespace seq + { + +#ifdef TAOCPP_FOLD_EXPRESSIONS + + template< bool... Bs > + using is_all = std::integral_constant< bool, ( Bs && ... ) >; + +#else + + template< bool... Bs > + using is_all = std::integral_constant< bool, std::is_same< integer_sequence< bool, true, Bs... >, integer_sequence< bool, Bs..., true > >::value >; + +#endif + + } +} + +#endif // TAOCPP_SEQUENCES_INCLUDE_IS_ALL_HPP diff --git a/src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/include/tao/seq/is_any.hpp b/src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/include/tao/seq/is_any.hpp new file mode 100644 index 0000000..36c39f6 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/include/tao/seq/is_any.hpp @@ -0,0 +1,35 @@ +// The Art of C++ / Sequences +// Copyright (c) 2015 Daniel Frey + +#ifndef TAOCPP_SEQUENCES_INCLUDE_IS_ANY_HPP +#define TAOCPP_SEQUENCES_INCLUDE_IS_ANY_HPP + +#include "config.hpp" + +#ifndef TAOCPP_FOLD_EXPRESSIONS +#include "is_all.hpp" +#endif + +#include + +namespace tao +{ + namespace seq + { + +#ifdef TAOCPP_FOLD_EXPRESSIONS + + template< bool... Bs > + using is_any = std::integral_constant< bool, ( Bs || ... ) >; + +#else + + template< bool... Bs > + using is_any = std::integral_constant< bool, !is_all< !Bs... >::value >; + +#endif + + } +} + +#endif // TAOCPP_SEQUENCES_INCLUDE_IS_ANY_HPP diff --git a/src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/include/tao/seq/make_integer_sequence.hpp b/src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/include/tao/seq/make_integer_sequence.hpp new file mode 100644 index 0000000..23a4e97 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/include/tao/seq/make_integer_sequence.hpp @@ -0,0 +1,84 @@ +// The Art of C++ / Sequences +// Copyright (c) 2015 Daniel Frey + +#ifndef TAOCPP_SEQUENCES_INCLUDE_MAKE_INTEGER_SEQUENCE_HPP +#define TAOCPP_SEQUENCES_INCLUDE_MAKE_INTEGER_SEQUENCE_HPP + +#include +#include +#include + +#include "config.hpp" +#include "integer_sequence.hpp" + +namespace tao +{ + namespace seq + { + +#ifdef TAOCPP_USE_STD_MAKE_INTEGER_SEQUENCE + + using std::make_integer_sequence; + using std::make_index_sequence; + using std::index_sequence_for; + +#else + + // idea from http://stackoverflow.com/a/13073076 + + namespace impl + { + template< typename, std::size_t, bool > + struct double_up; + + template< typename T, T... Ns, std::size_t N > + struct double_up< integer_sequence< T, Ns... >, N, false > + { + using type = integer_sequence< T, Ns..., ( N + Ns )... >; + }; + + template< typename T, T... Ns, std::size_t N > + struct double_up< integer_sequence< T, Ns... >, N, true > + { + using type = integer_sequence< T, Ns..., ( N + Ns )..., 2 * N >; + }; + + template< typename T, T N, typename = void > + struct generate; + + template< typename T, T N > + using generate_t = typename generate< T, N >::type; + + template< typename T, T N, typename > + struct generate + : double_up< generate_t< T, N / 2 >, N / 2, N % 2 == 1 > + {}; + + template< typename T, T N > + struct generate< T, N, typename std::enable_if< ( N == 0 ) >::type > + { + using type = integer_sequence< T >; + }; + + template< typename T, T N > + struct generate< T, N, typename std::enable_if< ( N == 1 ) >::type > + { + using type = integer_sequence< T, 0 >; + }; + } + + template< typename T, T N > + using make_integer_sequence = impl::generate_t< T, N >; + + template< std::size_t N > + using make_index_sequence = make_integer_sequence< std::size_t, N >; + + template< typename... Ts > + using index_sequence_for = make_index_sequence< sizeof...( Ts ) >; + +#endif + + } +} + +#endif // TAOCPP_SEQUENCES_INCLUDE_MAKE_INTEGER_SEQUENCE_HPP diff --git a/src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/include/tao/seq/map.hpp b/src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/include/tao/seq/map.hpp new file mode 100644 index 0000000..e2ff85e --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/include/tao/seq/map.hpp @@ -0,0 +1,31 @@ +// The Art of C++ / Sequences +// Copyright (c) 2015 Daniel Frey + +#ifndef TAOCPP_SEQUENCES_INCLUDE_MAP_HPP +#define TAOCPP_SEQUENCES_INCLUDE_MAP_HPP + +#include +#include + +#include "integer_sequence.hpp" +#include "select.hpp" + +namespace tao +{ + namespace seq + { + template< typename, typename > + struct map; + + template< std::size_t... Ns, typename M > + struct map< index_sequence< Ns... >, M > + { + using type = integer_sequence< typename M::value_type, select< Ns, M >::value... >; + }; + + template< typename S, typename M > + using map_t = typename map< S, M >::type; + } +} + +#endif // TAOCPP_SEQUENCES_INCLUDE_MAP_HPP diff --git a/src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/include/tao/seq/max.hpp b/src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/include/tao/seq/max.hpp new file mode 100644 index 0000000..b3f5be7 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/include/tao/seq/max.hpp @@ -0,0 +1,33 @@ +// The Art of C++ / Sequences +// Copyright (c) 2015 Daniel Frey + +#ifndef TAOCPP_SEQUENCES_INCLUDE_MAX_HPP +#define TAOCPP_SEQUENCES_INCLUDE_MAX_HPP + +#include "fold.hpp" + +#include + +namespace tao +{ + namespace seq + { + namespace impl + { + template< typename T, T A, T B > + using max = std::integral_constant< T, ( ( A > B ) ? A : B ) >; + } + + template< typename T, T... Ns > + struct max + : fold< impl::max, T, Ns... > + {}; + + template< typename T, T... Ns > + struct max< integer_sequence< T, Ns... > > + : max< T, Ns... > + {}; + } +} + +#endif // TAOCPP_SEQUENCES_INCLUDE_MAX_HPP diff --git a/src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/include/tao/seq/min.hpp b/src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/include/tao/seq/min.hpp new file mode 100644 index 0000000..42bc6e1 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/include/tao/seq/min.hpp @@ -0,0 +1,33 @@ +// The Art of C++ / Sequences +// Copyright (c) 2015 Daniel Frey + +#ifndef TAOCPP_SEQUENCES_INCLUDE_MIN_HPP +#define TAOCPP_SEQUENCES_INCLUDE_MIN_HPP + +#include "fold.hpp" + +#include + +namespace tao +{ + namespace seq + { + namespace impl + { + template< typename T, T A, T B > + using min = std::integral_constant< T, ( ( A < B ) ? A : B ) >; + } + + template< typename T, T... Ns > + struct min + : fold< impl::min, T, Ns... > + {}; + + template< typename T, T... Ns > + struct min< integer_sequence< T, Ns... > > + : min< T, Ns... > + {}; + } +} + +#endif // TAOCPP_SEQUENCES_INCLUDE_MIN_HPP diff --git a/src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/include/tao/seq/minus.hpp b/src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/include/tao/seq/minus.hpp new file mode 100644 index 0000000..087443b --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/include/tao/seq/minus.hpp @@ -0,0 +1,29 @@ +// The Art of C++ / Sequences +// Copyright (c) 2015 Daniel Frey + +#ifndef TAOCPP_SEQUENCES_INCLUDE_MINUS_HPP +#define TAOCPP_SEQUENCES_INCLUDE_MINUS_HPP + +#include + +#include "zip.hpp" + +namespace tao +{ + namespace seq + { + namespace impl + { + template< typename T, T A, T B > + using minus = std::integral_constant< T, A - B >; + } + + template< typename A, typename B > + using minus = zip< impl::minus, A, B >; + + template< typename A, typename B > + using minus_t = typename minus< A, B >::type; + } +} + +#endif // TAOCPP_SEQUENCES_INCLUDE_MINUS_HPP diff --git a/src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/include/tao/seq/partial_sum.hpp b/src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/include/tao/seq/partial_sum.hpp new file mode 100644 index 0000000..b66a02d --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/include/tao/seq/partial_sum.hpp @@ -0,0 +1,42 @@ +// The Art of C++ / Sequences +// Copyright (c) 2015 Daniel Frey + +#ifndef TAOCPP_SEQUENCES_INCLUDE_PARTIAL_SUM_HPP +#define TAOCPP_SEQUENCES_INCLUDE_PARTIAL_SUM_HPP + +#include +#include + +#include "make_integer_sequence.hpp" +#include "sum.hpp" + +namespace tao +{ + namespace seq + { + namespace impl + { + template< std::size_t, typename S, typename = make_index_sequence< S::size() > > + struct partial_sum; + + template< std::size_t I, typename T, T... Ns, std::size_t... Is > + struct partial_sum< I, integer_sequence< T, Ns... >, index_sequence< Is... > > + : seq::sum< T, ( ( Is < I ) ? Ns : 0 )... > + { + static_assert( I <= sizeof...( Is ), "tao::seq::partial_sum: I is out of range" ); + }; + } + + template< std::size_t I, typename T, T... Ns > + struct partial_sum + : impl::partial_sum< I, integer_sequence< T, Ns... > > + {}; + + template< std::size_t I, typename T, T... Ns > + struct partial_sum< I, integer_sequence< T, Ns... > > + : impl::partial_sum< I, integer_sequence< T, Ns... > > + {}; + } +} + +#endif // TAOCPP_SEQUENCES_INCLUDE_PARTIAL_SUM_HPP diff --git a/src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/include/tao/seq/plus.hpp b/src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/include/tao/seq/plus.hpp new file mode 100644 index 0000000..18ac4c4 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/include/tao/seq/plus.hpp @@ -0,0 +1,29 @@ +// The Art of C++ / Sequences +// Copyright (c) 2015 Daniel Frey + +#ifndef TAOCPP_SEQUENCES_INCLUDE_PLUS_HPP +#define TAOCPP_SEQUENCES_INCLUDE_PLUS_HPP + +#include + +#include "zip.hpp" + +namespace tao +{ + namespace seq + { + namespace impl + { + template< typename T, T A, T B > + using plus = std::integral_constant< T, A + B >; + } + + template< typename A, typename B > + using plus = zip< impl::plus, A, B >; + + template< typename A, typename B > + using plus_t = typename plus< A, B >::type; + } +} + +#endif // TAOCPP_SEQUENCES_INCLUDE_PLUS_HPP diff --git a/src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/include/tao/seq/select.hpp b/src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/include/tao/seq/select.hpp new file mode 100644 index 0000000..c84c2e2 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/include/tao/seq/select.hpp @@ -0,0 +1,29 @@ +// The Art of C++ / Sequences +// Copyright (c) 2015 Daniel Frey + +#ifndef TAOCPP_SEQUENCES_INCLUDE_SELECT_HPP +#define TAOCPP_SEQUENCES_INCLUDE_SELECT_HPP + +#include +#include + +#include "integer_sequence.hpp" +#include "values.hpp" + +namespace tao +{ + namespace seq + { + template< std::size_t I, typename T, T... Ns > + struct select + : std::integral_constant< T, values< T, Ns... >::data[ I ] > + {}; + + template< std::size_t I, typename T, T... Ns > + struct select< I, integer_sequence< T, Ns... > > + : select< I, T, Ns... > + {}; + } +} + +#endif // TAOCPP_SEQUENCES_INCLUDE_SELECT_HPP diff --git a/src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/include/tao/seq/sum.hpp b/src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/include/tao/seq/sum.hpp new file mode 100644 index 0000000..67ac671 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/include/tao/seq/sum.hpp @@ -0,0 +1,72 @@ +// The Art of C++ / Sequences +// Copyright (c) 2015-2016 Daniel Frey + +#ifndef TAOCPP_SEQUENCES_INCLUDE_SUM_HPP +#define TAOCPP_SEQUENCES_INCLUDE_SUM_HPP + +#include +#include + +#include "integer_sequence.hpp" +#include "config.hpp" + +#ifndef TAOCPP_FOLD_EXPRESSIONS +#include +#include "make_integer_sequence.hpp" +#endif + +namespace tao +{ + namespace seq + { + +#ifdef TAOCPP_FOLD_EXPRESSIONS + + template< typename T, T... Ns > + struct sum + : std::integral_constant< T, ( Ns + ... + T( 0 ) ) > + {}; + +#else + + namespace impl + { + template< std::size_t, std::size_t N > + struct chars + { + char dummy[ N + 1 ]; + }; + + template< typename, std::size_t... > + struct collector; + + template< std::size_t... Is, std::size_t... Ns > + struct collector< index_sequence< Is... >, Ns... > + : chars< Is, Ns >... + {}; + + template< std::size_t N, typename T, T... Ns > + struct sum + { + using type = std::integral_constant< + T, + T( sizeof( collector< make_index_sequence< N >, ( ( Ns > 0 ) ? Ns : 0 )... > ) - N ) - + T( sizeof( collector< make_index_sequence< N >, ( ( Ns < 0 ) ? -Ns : 0 )... > ) - N ) >; + }; + } + + template< typename T, T... Ns > + struct sum + : impl::sum< sizeof...( Ns ) + 1, T, Ns..., 0 >::type + {}; + +#endif + + template< typename T, T... Ns > + struct sum< integer_sequence< T, Ns... > > + : sum< T, Ns... > + {}; + } +} + +#endif // TAOCPP_SEQUENCES_INCLUDE_SUM_HPP diff --git a/src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/include/tao/seq/tail.hpp b/src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/include/tao/seq/tail.hpp new file mode 100644 index 0000000..da0caa6 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/include/tao/seq/tail.hpp @@ -0,0 +1,34 @@ +// The Art of C++ / Sequences +// Copyright (c) 2015 Daniel Frey + +#ifndef TAOCPP_SEQUENCES_INCLUDE_TAIL_HPP +#define TAOCPP_SEQUENCES_INCLUDE_TAIL_HPP + +#include + +#include "integer_sequence.hpp" + +namespace tao +{ + namespace seq + { + template< typename T, T... Ns > + struct tail; + + template< typename T, T N, T... Ns > + struct tail< T, N, Ns... > + { + using type = integer_sequence< T, Ns... >; + }; + + template< typename T, T... Ns > + struct tail< integer_sequence< T, Ns... > > + : tail< T, Ns... > + {}; + + template< typename T, T... Ns > + using tail_t = typename tail< T, Ns... >::type; + } +} + +#endif // TAOCPP_SEQUENCES_INCLUDE_TAIL_HPP diff --git a/src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/include/tao/seq/type_by_index.hpp b/src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/include/tao/seq/type_by_index.hpp new file mode 100644 index 0000000..572c973 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/include/tao/seq/type_by_index.hpp @@ -0,0 +1,57 @@ +// The Art of C++ / Sequences +// Copyright (c) 2015 Daniel Frey + +#ifndef TAOCPP_SEQUENCES_INCLUDE_TYPE_BY_INDEX_HPP +#define TAOCPP_SEQUENCES_INCLUDE_TYPE_BY_INDEX_HPP + +#include +#include + +#include "make_integer_sequence.hpp" + +namespace tao +{ + namespace seq + { + // based on http://stackoverflow.com/questions/18942322 + + namespace impl + { + template< std::size_t > + struct any + { + any( ... ); + }; + + template< typename > + struct wrapper; + + template< typename > + struct unwrap; + + template< typename T > + struct unwrap< wrapper< T > > + { + using type = T; + }; + + template< typename > + struct get_nth; + + template< std::size_t... Is > + struct get_nth< index_sequence< Is... > > + { + template< typename T > + static T deduce( any< Is & 0 >..., T*, ... ); + }; + } + + template< std::size_t I, typename... Ts > + using type_by_index = impl::unwrap< decltype( impl::get_nth< make_index_sequence< I > >::deduce( std::declval< impl::wrapper< Ts >* >()... ) ) >; + + template< std::size_t I, typename... Ts > + using type_by_index_t = typename type_by_index< I, Ts... >::type; + } +} + +#endif // TAOCPP_SEQUENCES_INCLUDE_TYPE_BY_INDEX_HPP diff --git a/src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/include/tao/seq/values.hpp b/src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/include/tao/seq/values.hpp new file mode 100644 index 0000000..d7e3b5d --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/include/tao/seq/values.hpp @@ -0,0 +1,19 @@ +// The Art of C++ / Sequences +// Copyright (c) 2015 Daniel Frey + +#ifndef TAOCPP_SEQUENCES_INCLUDE_VALUES_HPP +#define TAOCPP_SEQUENCES_INCLUDE_VALUES_HPP + +namespace tao +{ + namespace seq + { + template< typename T, T... Ns > + struct values + { + static constexpr T data[] = { Ns... }; + }; + } +} + +#endif // TAOCPP_SEQUENCES_INCLUDE_VALUES_HPP diff --git a/src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/include/tao/seq/zip.hpp b/src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/include/tao/seq/zip.hpp new file mode 100644 index 0000000..42683b4 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/include/tao/seq/zip.hpp @@ -0,0 +1,30 @@ +// The Art of C++ / Sequences +// Copyright (c) 2015 Daniel Frey + +#ifndef TAOCPP_SEQUENCES_INCLUDE_ZIP_HPP +#define TAOCPP_SEQUENCES_INCLUDE_ZIP_HPP + +#include + +#include "integer_sequence.hpp" + +namespace tao +{ + namespace seq + { + template< template< typename U, U, U > class, typename, typename > + struct zip; + + template< template< typename U, U, U > class OP, typename TA, TA... As, typename TB, TB... Bs > + struct zip< OP, integer_sequence< TA, As... >, integer_sequence< TB, Bs... > > + { + using CT = typename std::common_type< TA, TB >::type; + using type = integer_sequence< CT, OP< CT, As, Bs >::value... >; + }; + + template< template< typename U, U, U > class OP, typename A, typename B > + using zip_t = typename zip< OP, A, B >::type; + } +} + +#endif // TAOCPP_SEQUENCES_INCLUDE_ZIP_HPP diff --git a/src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/include/tao/tuple/tuple.hpp b/src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/include/tao/tuple/tuple.hpp new file mode 100644 index 0000000..df48592 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/tao_tuple/28626e99/include/tao/tuple/tuple.hpp @@ -0,0 +1,817 @@ +// The Art of C++ / Tuple +// Copyright (c) 2015-2016 Daniel Frey + +#ifndef TAOCPP_INCLUDE_TUPLE_TUPLE_HPP +#define TAOCPP_INCLUDE_TUPLE_TUPLE_HPP + +#include "../seq/config.hpp" +#include "../seq/integer_sequence.hpp" +#include "../seq/is_all.hpp" +#include "../seq/type_by_index.hpp" +#include "../seq/sum.hpp" +#include "../seq/make_integer_sequence.hpp" +#include "../seq/inclusive_scan.hpp" +#include "../seq/minus.hpp" +#include "../seq/map.hpp" +#include "../seq/exclusive_scan.hpp" + +#include +#include +#include + +#if (__cplusplus >= 201402L) +#define TAOCPP_TUPLE_CONSTEXPR constexpr +#else +#define TAOCPP_TUPLE_CONSTEXPR +#endif + +namespace tao +{ + template< typename... Ts > + struct tuple; +} + +namespace std +{ + // 20.4.2.8 Tuple traits [tuple.traits] + + template< typename... Ts, typename A > + struct uses_allocator< tao::tuple< Ts... >, A > : true_type {}; +} + +namespace tao +{ + template< std::size_t I, typename... Ts > + TAOCPP_TUPLE_CONSTEXPR + const seq::type_by_index_t< I, Ts... >& get( const tuple< Ts... >& ) noexcept; + + template< std::size_t I, typename... Ts > + TAOCPP_TUPLE_CONSTEXPR + seq::type_by_index_t< I, Ts... >& get( tuple< Ts... >& ) noexcept; + + template< std::size_t I, typename... Ts > + TAOCPP_TUPLE_CONSTEXPR + seq::type_by_index_t< I, Ts... >&& get( const tuple< Ts... >&& ) noexcept; + + namespace impl + { + // TODO: std::pair support + // TODO: allocator support + + using swallow = bool[]; + + template< typename T, typename > + struct dependent_type : T {}; + + template< bool B, typename T = void > + using enable_if_t = typename std::enable_if< B, T >::type; + + // TODO: using std::swap? + template< typename T > + using is_nothrow_swappable = std::integral_constant< bool, noexcept( swap( std::declval< T& >(), std::declval< T& >() ) ) >; + +#if __cplusplus >= 201402L + template< typename T > + using is_final = std::is_final< T >; +#else + template< typename T > + using is_final = std::integral_constant< bool, __is_final( T ) >; +#endif + + template< bool, bool > + struct uses_alloc_ctor; + + template< typename T, typename A, typename... As > + using uses_alloc_ctor_t = uses_alloc_ctor< std::uses_allocator< T, A >::value, std::is_constructible< T, std::allocator_arg_t, A, As... >::value >*; + + template< std::size_t I, typename T, bool = std::is_empty< T >::value && !is_final< T >::value > + struct tuple_value + { + T value; + + constexpr tuple_value() + noexcept( std::is_nothrow_default_constructible< T >::value ) + : value() + { + static_assert( !std::is_reference< T >::value, "attempted to default construct a reference element in a tuple" ); + } + + template< bool B, typename A > + tuple_value( uses_alloc_ctor< false, B >*, const A& ) + : value() + { + static_assert( !std::is_reference< T >::value, "attempted to default construct a reference element in a tuple" ); + } + + template< typename A > + tuple_value( uses_alloc_ctor< true, true >*, const A& a ) + : value( std::allocator_arg_t(), a ) + { + static_assert( !std::is_reference< T >::value, "attempted to default construct a reference element in a tuple" ); + } + + template< typename A > + tuple_value( uses_alloc_ctor< true, false >*, const A& a ) + : value( a ) + { + static_assert( !std::is_reference< T >::value, "attempted to default construct a reference element in a tuple" ); + } + + template< typename U, + typename = impl::enable_if_t< !std::is_same< typename std::decay< U >::type, tuple_value >::value >, + typename = impl::enable_if_t< std::is_constructible< T, U >::value > > + TAOCPP_TUPLE_CONSTEXPR + explicit tuple_value( U&& v ) + noexcept( std::is_nothrow_constructible< T, U >::value ) + : value( std::forward< U >( v ) ) + {} + + template< bool B, typename A, typename U > + tuple_value( uses_alloc_ctor< false, B >*, const A&, U&& v ) + : value( std::forward< U >( v ) ) + { + // TODO: Add check for rvalue to lvalue reference + } + + template< typename A, typename U > + tuple_value( uses_alloc_ctor< true, true >*, const A& a, U&& v ) + : value( std::allocator_arg_t(), a, std::forward< U >( v ) ) + { + // TODO: Add check for rvalue to lvalue reference + } + + template< typename A, typename U > + tuple_value( uses_alloc_ctor< true, false >*, const A& a, U&& v ) + : value( std::forward< U >( v ), a ) + { + // TODO: Add check for rvalue to lvalue reference + } + + tuple_value( const tuple_value& ) = default; + tuple_value( tuple_value&& ) = default; + + template< typename U > + tuple_value& operator=( U&& v ) + noexcept( std::is_nothrow_assignable< T&, U >::value ) + { + value = std::forward< U >( v ); + return *this; + } + + void swap( tuple_value& v ) + noexcept( is_nothrow_swappable< T >::value ) + { + using std::swap; + swap( value, v.value ); + } + + TAOCPP_TUPLE_CONSTEXPR + T& get() noexcept + { + return value; + } + + TAOCPP_TUPLE_CONSTEXPR + const T& get() const noexcept + { + return value; + } + }; + + template< std::size_t I, typename T > + struct tuple_value< I, T, true > + : private T + { + constexpr tuple_value() + noexcept( std::is_nothrow_default_constructible< T >::value ) + : T() + {} + + template< bool B, typename A > + tuple_value( uses_alloc_ctor< false, B >*, const A& ) + : T() + {} + + template< typename A > + tuple_value( uses_alloc_ctor< true, true >*, const A& a ) + : T( std::allocator_arg_t(), a ) + {} + + template< typename A > + tuple_value( uses_alloc_ctor< true, false >*, const A& a ) + : T( a ) + {} + + template< typename U, + typename = impl::enable_if_t< !std::is_same< typename std::decay< U >::type, tuple_value >::value >, + typename = impl::enable_if_t< std::is_constructible< T, U >::value > > + TAOCPP_TUPLE_CONSTEXPR + explicit tuple_value( U&& v ) + noexcept( std::is_nothrow_constructible< T, U >::value ) + : T( std::forward< U >( v ) ) + {} + + template< bool B, typename A, typename U > + tuple_value( uses_alloc_ctor< false, B >*, const A&, U&& v ) + : T( std::forward< U >( v ) ) + {} + + template< typename A, typename U > + tuple_value( uses_alloc_ctor< true, true >*, const A& a, U&& v ) + : T( std::allocator_arg_t(), a, std::forward< U >( v ) ) + {} + + template< typename A, typename U > + tuple_value( uses_alloc_ctor< true, false >*, const A& a, U&& v ) + : T( std::forward< U >( v ), a ) + {} + + tuple_value( const tuple_value& ) = default; + tuple_value( tuple_value&& ) = default; + + template< typename U > + tuple_value& operator=( U&& v ) + noexcept( std::is_nothrow_assignable< T&, U >::value ) + { + T::operator=( std::forward< U >( v ) ); + return *this; + } + + void swap( tuple_value& v ) + noexcept( is_nothrow_swappable< T >::value ) + { + using std::swap; + swap( *this, v ); + } + + TAOCPP_TUPLE_CONSTEXPR + T& get() noexcept + { + return static_cast< T& >( *this ); + } + + TAOCPP_TUPLE_CONSTEXPR + const T& get() const noexcept + { + return static_cast< const T& >( *this ); + } + }; + + template< typename, typename... > + struct tuple_base; + + template< std::size_t... Is, typename... Ts > + struct tuple_base< seq::index_sequence< Is... >, Ts... > + : tuple_value< Is, Ts >... + { + constexpr tuple_base() = default; + + template< typename... Us > + TAOCPP_TUPLE_CONSTEXPR + explicit tuple_base( Us&&... us ) + : tuple_value< Is, Ts >( std::forward< Us >( us ) )... + {} + + template< typename A, typename... Us > + TAOCPP_TUPLE_CONSTEXPR + tuple_base( std::allocator_arg_t, const A& a, Us&&... us ) + : tuple_value< Is, Ts >( uses_alloc_ctor_t< Ts, A, Us >(), a, std::forward< Us >( us ) )... + {} + + tuple_base( const tuple_base& ) = default; + tuple_base( tuple_base&& ) = default; + + tuple_base& operator=( const tuple_base& v ) + noexcept( seq::is_all< std::is_nothrow_copy_assignable< Ts >::value... >::value ) + { +#ifdef TAOCPP_FOLD_EXPRESSIONS + ( tuple_value< Is, Ts >::operator=( static_cast< tuple_value< Is, Ts >& >( v ).get() ), ... ); +#else + (void)swallow{ ( tuple_value< Is, Ts >::operator=( static_cast< tuple_value< Is, Ts >& >( v ).get() ), true )..., true }; +#endif + return *this; + } + + tuple_base& operator=( tuple_base&& v ) + noexcept( seq::is_all< std::is_nothrow_move_assignable< Ts >::value... >::value ) + { +#ifdef TAOCPP_FOLD_EXPRESSIONS + ( tuple_value< Is, Ts >::operator=( std::forward< Ts >( static_cast< tuple_value< Is, Ts >& >( v ).get() ) ), ... ); +#else + (void)swallow{ ( tuple_value< Is, Ts >::operator=( static_cast< tuple_value< Is, Ts >& >( v ) ), true )..., true }; +#endif + return *this; + } + + template< typename... Us > + tuple_base& operator=( const tuple< Us... >& v ) + noexcept( seq::is_all< std::is_nothrow_assignable< Ts&, const Us& >::value... >::value ) + { +#ifdef TAOCPP_FOLD_EXPRESSIONS + ( tuple_value< Is, Ts >::operator=( get< Is >( v ) ), ... ); +#else + (void)swallow{ ( tuple_value< Is, Ts >::operator=( get< Is >( v ) ), true )..., true }; +#endif + return *this; + } + + template< typename... Us > + tuple_base& operator=( tuple< Us... >&& v ) + noexcept( seq::is_all< std::is_nothrow_assignable< Ts&, Us&& >::value... >::value ) + { +#ifdef TAOCPP_FOLD_EXPRESSIONS + ( tuple_value< Is, Ts >::operator=( get< Is >( std::move( v ) ) ), ... ); +#else + (void)swallow{ ( tuple_value< Is, Ts >::operator=( get< Is >( std::move( v ) ) ), true )..., true }; +#endif + return *this; + } + + void swap( tuple_base& v ) + noexcept( seq::is_all< impl::is_nothrow_swappable< Ts >::value... >::value ) + { +#ifdef TAOCPP_FOLD_EXPRESSIONS + ( static_cast< tuple_value< Is, Ts >& >( *this ).swap( static_cast< tuple_value< Is, Ts >& >( v ) ), ... ); +#else + (void)swallow{ ( static_cast< tuple_value< Is, Ts >& >( *this ).swap( static_cast< tuple_value< Is, Ts >& >( v ) ), true )..., true }; +#endif + } + }; + } + + // 20.4.2 Class template tuple [tuple.tuple] + + // tuple + template< typename... Ts > + struct tuple + { + private: + using base_t = impl::tuple_base< seq::index_sequence_for< Ts... >, Ts... >; + base_t base; + + template< std::size_t I, typename... Us > + friend TAOCPP_TUPLE_CONSTEXPR + const seq::type_by_index_t< I, Us... >& get( const tuple< Us... >& ) noexcept; + + template< std::size_t I, typename... Us > + friend TAOCPP_TUPLE_CONSTEXPR + seq::type_by_index_t< I, Us... >& get( tuple< Us... >& ) noexcept; + + template< std::size_t I, typename... Us > + friend TAOCPP_TUPLE_CONSTEXPR + seq::type_by_index_t< I, Us... >&& get( tuple< Us... >&& ) noexcept; + + public: + // 20.4.2.1 Construction [tuple.cnstr] + + // TODO: Move this templated condition to base? + template< typename dummy = void, + typename = impl::enable_if_t< seq::is_all< impl::dependent_type< std::is_default_constructible< Ts >, dummy >::value... >::value > > + constexpr tuple() + noexcept( seq::is_all< std::is_nothrow_default_constructible< Ts >::value... >::value ) + : base() + {} + + template< typename dummy = void, + typename = impl::enable_if_t< seq::is_all< impl::dependent_type< std::is_copy_constructible< Ts >, dummy >::value... >::value > > + TAOCPP_TUPLE_CONSTEXPR + explicit tuple( const Ts&... ts ) + noexcept( seq::is_all< std::is_nothrow_copy_constructible< Ts >::value... >::value ) + : base( ts... ) + {} + + template< typename... Us, + typename = impl::enable_if_t< sizeof...( Us ) == sizeof...( Ts ) >, + typename = impl::enable_if_t< seq::is_all< std::is_constructible< Ts, Us&& >::value... >::value > > + TAOCPP_TUPLE_CONSTEXPR + explicit tuple( Us&&... us ) + noexcept( seq::is_all< std::is_nothrow_constructible< Ts, Us&& >::value... >::value ) + : base( std::forward< Us >( us )... ) + {} + + tuple( const tuple& ) = default; + tuple( tuple&& ) = default; + + template< typename... Us, + typename = impl::enable_if_t< sizeof...( Us ) == sizeof...( Ts ) >, + typename = impl::enable_if_t< seq::is_all< std::is_constructible< Ts, const Us& >::value... >::value > > + TAOCPP_TUPLE_CONSTEXPR + explicit tuple( const tuple< Us... >& v ) + noexcept( seq::is_all< std::is_nothrow_constructible< Ts, const Us& >::value... >::value ) + : base( v ) + {} + + template< typename... Us, + typename = impl::enable_if_t< sizeof...( Us ) == sizeof...( Ts ) >, + typename = impl::enable_if_t< seq::is_all< std::is_constructible< Ts, Us&& >::value... >::value > > + TAOCPP_TUPLE_CONSTEXPR + explicit tuple( tuple< Us... >&& v ) + noexcept( seq::is_all< std::is_nothrow_constructible< Ts, Us&& >::value... >::value ) + : base( std::move( v ) ) + {} + + template< typename A, + typename dummy = void, + typename = impl::enable_if_t< seq::is_all< impl::dependent_type< std::is_default_constructible< Ts >, dummy >::value... >::value > > + tuple( std::allocator_arg_t, const A& a ) + : base( std::allocator_arg_t(), a ) + {} + + template< typename A, + typename dummy = void, + typename = impl::enable_if_t< seq::is_all< impl::dependent_type< std::is_copy_constructible< Ts >, dummy >::value... >::value > > + tuple( std::allocator_arg_t, const A& a, const Ts&... ts ) + : base( std::allocator_arg_t(), a, ts... ) + {} + + template< typename A, + typename... Us, + typename = impl::enable_if_t< sizeof...( Us ) == sizeof...( Ts ) >, + typename = impl::enable_if_t< seq::is_all< std::is_constructible< Ts, Us&& >::value... >::value > > + tuple( std::allocator_arg_t, const A& a, Us&&... us ) + : base( std::allocator_arg_t(), a, std::forward< Us >( us )... ) + {} + + template< typename A > + tuple( std::allocator_arg_t, const A& a, const tuple& v ) + : base( std::allocator_arg_t(), a, v ) + {} + + template< typename A > + tuple( std::allocator_arg_t, const A& a, tuple&& v ) + : base( std::allocator_arg_t(), a, std::move( v ) ) + {} + + template< typename A, + typename... Us, + typename = impl::enable_if_t< sizeof...( Us ) == sizeof...( Ts ) >, + typename = impl::enable_if_t< seq::is_all< std::is_constructible< Ts, const Us& >::value... >::value > > + tuple( std::allocator_arg_t, const A& a, const tuple< Us... >& v ) + : base( std::allocator_arg_t(), a, v ) + {} + + template< typename A, + typename... Us, + typename = impl::enable_if_t< sizeof...( Us ) == sizeof...( Ts ) >, + typename = impl::enable_if_t< seq::is_all< std::is_constructible< Ts, Us&& >::value... >::value > > + tuple( std::allocator_arg_t, const A& a, tuple< Us... >&& v ) + : base( std::allocator_arg_t(), a, std::move( v ) ) + {} + + // 20.4.2.2 Assignment [tuple.assign] + + template< typename T, + typename = impl::enable_if_t< std::is_assignable< base_t&, T >::value > > + tuple& operator=( T&& v ) + noexcept( std::is_nothrow_assignable< base_t&, T >::value ) + { + base = std::forward< T >( v ); + return *this; + } + + // 20.4.2.3 swap [tuple.swap] + + void swap( tuple& v ) + noexcept( noexcept( base.swap( v.base ) ) ) + { + base.swap( v.base ); + } + }; + + template<> + struct tuple<> + { + constexpr tuple() noexcept {} + template< typename A > tuple( std::allocator_arg_t, const A& ) noexcept {} + template< typename A > tuple( std::allocator_arg_t, const A&, const tuple& ) noexcept {} + void swap( tuple& ) noexcept {} + }; + + // 20.4.2.4 Tuple creation functions [tuple.creation] + + // ignore helper + namespace impl + { + struct ignore_t + { + template< typename U > + ignore_t& operator=( U&& ) + { + return *this; + } + }; + } + + // ignore + const impl::ignore_t ignore{}; + + // make_tuple helper + namespace impl + { + template< typename T > + struct make_tuple_return + { + using type = T; + }; + + template< typename T > + struct make_tuple_return< std::reference_wrapper< T > > + { + using type = T&; + }; + + template< typename T > + using make_tuple_return_t = typename make_tuple_return< T >::type; + } + + // make_tuple + template< typename... Ts, typename R = tuple< impl::make_tuple_return_t< typename std::decay< Ts >::type >... > > + TAOCPP_TUPLE_CONSTEXPR + R make_tuple( Ts&&... ts ) + { + return R( std::forward< Ts >( ts )... ); + } + + // forward_as_tuple + template< typename... Ts > + TAOCPP_TUPLE_CONSTEXPR + tuple< Ts&&... > forward_as_tuple( Ts&&... ts ) noexcept + { + return tuple< Ts&&... >( std::forward< Ts >( ts )... ); + } + + // tie + template< typename... Ts > + TAOCPP_TUPLE_CONSTEXPR + tuple< Ts&... > tie( Ts&... ts ) noexcept + { + return tuple< Ts&... >( ts... ); + } + + // tuple_cat is found at the end, as it requires access to tuple_element_t and get + + // 20.4.2.5 Tuple helper classes [tuple.helper] + + // tuple_size + template< typename T > struct tuple_size; + template< typename T > struct tuple_size< const T > : tuple_size< T > {}; + template< typename T > struct tuple_size< volatile T > : tuple_size< T > {}; + template< typename T > struct tuple_size< const volatile T > : tuple_size< T > {}; + + template< typename... Ts > + struct tuple_size< tuple< Ts... > > + : std::integral_constant< std::size_t, sizeof...( Ts ) > + {}; + + // tuple_element + template< std::size_t I, typename T > struct tuple_element; + template< std::size_t I, typename T > struct tuple_element< I, const T > : tuple_element< I, T > {}; + template< std::size_t I, typename T > struct tuple_element< I, volatile T > : tuple_element< I, T > {}; + template< std::size_t I, typename T > struct tuple_element< I, const volatile T > : tuple_element< I, T > {}; + + template< std::size_t I, typename... Ts > + struct tuple_element< I, tuple< Ts... > > + : seq::type_by_index< I, Ts... > + {}; + +#if __cplusplus >= 201402L + template< std::size_t I, typename T > + using tuple_element_t = typename tuple_element< I, T >::type; +#endif + + // 20.4.2.6 Element access [tuple.elem] + + // get + template< std::size_t I, typename... Ts > + TAOCPP_TUPLE_CONSTEXPR + const seq::type_by_index_t< I, Ts... >& get( const tuple< Ts... >& v ) noexcept + { + return static_cast< const impl::tuple_value< I, seq::type_by_index_t< I, Ts... > >& >( v.base ).get(); + } + + template< std::size_t I, typename... Ts > + TAOCPP_TUPLE_CONSTEXPR + seq::type_by_index_t< I, Ts... >& get( tuple< Ts... >& v ) noexcept + { + return static_cast< impl::tuple_value< I, seq::type_by_index_t< I, Ts... > >& >( v.base ).get(); + } + + template< std::size_t I, typename... Ts > + TAOCPP_TUPLE_CONSTEXPR + seq::type_by_index_t< I, Ts... >&& get( tuple< Ts... >&& v ) noexcept + { + using type = seq::type_by_index_t< I, Ts... >; + return static_cast< type&& >( static_cast< impl::tuple_value< I, type >& >( v.base ).get() ); + } + + // get helper + namespace impl + { + template< typename T, typename... Ts > + using count_of = seq::sum< std::size_t, ( std::is_same< T, Ts >::value ? 1 : 0 )... >; + + template< typename, typename, typename... > + struct index_of_impl; + + template< std::size_t... Is, typename T, typename... Ts > + struct index_of_impl< seq::index_sequence< Is... >, T, Ts... > + : seq::sum< std::size_t, ( std::is_same< T, Ts >::value ? Is : 0 )... > + { + static_assert( count_of< T, Ts... >::value > 0, "T not found within Ts..." ); + static_assert( count_of< T, Ts... >::value < 2, "T must be unique within Ts..." ); + }; + + template< typename T, typename... Ts > + using index_of = index_of_impl< seq::index_sequence_for< Ts... >, T, Ts... >; + } + + // get + template< typename T, typename... Ts > + TAOCPP_TUPLE_CONSTEXPR + const T& get( const tuple< Ts... >& v ) noexcept + { + return get< impl::index_of< T, Ts... >::value >( v ); + } + + template< typename T, typename... Ts > + TAOCPP_TUPLE_CONSTEXPR + T& get( tuple< Ts... >& v ) noexcept + { + return get< impl::index_of< T, Ts... >::value >( v ); + } + + template< typename T, typename... Ts > + TAOCPP_TUPLE_CONSTEXPR + T&& get( tuple< Ts... >&& v ) noexcept + { + return get< impl::index_of< T, Ts... >::value >( std::move( v ) ); + } + + // 20.4.2.7 Relational operators [tuple.rel] + + // operators helper + namespace impl + { + template< typename > + struct tuple_equal; + + template< std::size_t... Is > + struct tuple_equal< seq::index_sequence< Is... > > + { + template< typename T, typename U > + TAOCPP_TUPLE_CONSTEXPR + bool operator()( const T& lhs, const U& rhs ) const + { +#ifdef TAOCPP_FOLD_EXPRESSIONS + return ( static_cast< bool >( get< Is >( lhs ) == get< Is >( rhs ) ) && ... ); +#else + bool result = true; + (void)swallow{ ( result = result && static_cast< bool >( get< Is >( lhs ) == get< Is >( rhs ) ) )..., true }; + return result; +#endif + } + }; + + template< typename > + struct tuple_less; + + template< std::size_t... Is > + struct tuple_less< seq::index_sequence< Is... > > + { + template< typename T, typename U > + TAOCPP_TUPLE_CONSTEXPR + bool operator()( const T& lhs, const U& rhs ) const + { + bool result = false; +#ifdef TAOCPP_DUMMY // TAOCPP_FOLD_EXPRESSIONS + // TODO: This fold expression does not work as expected. Why? + (void)( ( ( result = static_cast< bool >( get< Is >( lhs ) < get< Is >( rhs ) ) ) || static_cast< bool >( get< Is >( rhs ) < get< Is >( lhs ) ) ) || ... ); +#else + bool no_result_yet = false; + (void)swallow{ ( no_result_yet = no_result_yet || ( result = static_cast< bool >( get< Is >( lhs ) < get< Is >( rhs ) ) ) || static_cast< bool >( get< Is >( rhs ) < get< Is >( lhs ) ) )..., true }; + (void)no_result_yet; +#endif + return result; + } + }; + } + + // operators + template< typename... Ts, typename... Us, typename = impl::enable_if_t< sizeof...( Ts ) == sizeof...( Us ) > > + TAOCPP_TUPLE_CONSTEXPR + bool operator==( const tuple< Ts... >& lhs, const tuple< Us... >& rhs ) + { + return impl::tuple_equal< seq::index_sequence_for< Ts... > >()( lhs, rhs ); + } + + template< typename... Ts, typename... Us > + TAOCPP_TUPLE_CONSTEXPR + bool operator!=( const tuple< Ts... >& lhs, const tuple< Us... >& rhs ) + { + return !( lhs == rhs ); + } + + template< typename... Ts, typename... Us, typename = impl::enable_if_t< sizeof...( Ts ) == sizeof...( Us ) > > + TAOCPP_TUPLE_CONSTEXPR + bool operator<( const tuple< Ts... >& lhs, const tuple< Us... >& rhs ) + { + return impl::tuple_less< seq::index_sequence_for< Ts... > >()( lhs, rhs ); + } + + template< typename... Ts, typename... Us > + TAOCPP_TUPLE_CONSTEXPR + bool operator>=( const tuple< Ts... >& lhs, const tuple< Us... >& rhs ) + { + return !( lhs < rhs ); + } + + template< typename... Ts, typename... Us > + TAOCPP_TUPLE_CONSTEXPR + bool operator>( const tuple< Ts... >& lhs, const tuple< Us... >& rhs ) + { + return rhs < lhs; + } + + template< typename... Ts, typename... Us > + TAOCPP_TUPLE_CONSTEXPR + bool operator<=( const tuple< Ts... >& lhs, const tuple< Us... >& rhs ) + { + return !( rhs < lhs ); + } + + // 20.4.2.9 Tuple specialized algorithms [tuple.special] + + // swap + template< typename... Ts > + void swap( tuple< Ts... >& lhs, tuple< Ts... >& rhs ) + noexcept( noexcept( lhs.swap( rhs ) ) ) + { + lhs.swap( rhs ); + } + + // (continued:) 20.4.2.4 Tuple creation functions [tuple.creation] + + // tuple_cat helper + namespace impl + { + template< std::size_t M, std::size_t... Ns > + struct count_less_or_equal + : seq::sum< std::size_t, ( ( Ns <= M ) ? 1 : 0 )... > + {}; + + template< typename, typename > + struct expand; + + template< std::size_t... Is, std::size_t... Ns > + struct expand< seq::index_sequence< Is... >, seq::index_sequence< Ns... > > + { + using type = seq::index_sequence< count_less_or_equal< Is, Ns... >::value... >; + }; + + template< typename I, typename S > + using expand_t = typename expand< I, S >::type; + + template< typename... > + struct tuple_cat_result; + + template< std::size_t... Os, std::size_t... Is, typename... Ts > + struct tuple_cat_result< seq::index_sequence< Os... >, seq::index_sequence< Is... >, Ts... > + { + using type = tuple< typename tuple_element< Is, seq::type_by_index_t< Os, Ts... > >::type... >; + }; + + template< typename... Ts > + using tuple_cat_result_t = typename tuple_cat_result< Ts... >::type; + + template< typename... Ts > + struct tuple_cat_helper + { + using tuple_size_sequence = seq::index_sequence< tuple_size< Ts >::value... >; + using result_index_sequence = seq::make_index_sequence< seq::sum< tuple_size_sequence >::value >; + + using outer_index_sequence = expand_t< result_index_sequence, seq::inclusive_scan_t< tuple_size_sequence > >; + using inner_index_sequence = seq::minus_t< result_index_sequence, seq::map_t< outer_index_sequence, seq::exclusive_scan_t< tuple_size_sequence > > >; + + using result_type = tuple_cat_result_t< outer_index_sequence, inner_index_sequence, Ts... >; + }; + + template< typename R, std::size_t... Os, std::size_t... Is, typename T > + TAOCPP_TUPLE_CONSTEXPR + R tuple_cat( seq::index_sequence< Os... >, seq::index_sequence< Is... >, T v ) + { + return R( get< Is >( get< Os >( v ) )... ); + } + } + + // tuple_cat + template< typename... Ts, typename H = impl::tuple_cat_helper< typename std::remove_reference< Ts >::type... >, typename R = typename H::result_type > + TAOCPP_TUPLE_CONSTEXPR + R tuple_cat( Ts&&... ts ) + { + return impl::tuple_cat< R >( typename H::outer_index_sequence(), typename H::inner_index_sequence(), tao::forward_as_tuple( std::forward< Ts >( ts )... ) ); + } +} + +#undef TAOCPP_TUPLE_CONSTEXPR + +#endif // TAOCPP_INCLUDE_TUPLE_TUPLE_HPP diff --git a/src/3rdparty/mapbox-gl-native/deps/unique_resource/cba309e/include/unique_resource.hpp b/src/3rdparty/mapbox-gl-native/deps/unique_resource/cba309e/include/unique_resource.hpp new file mode 100644 index 0000000..5b165b2 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/unique_resource/cba309e/include/unique_resource.hpp @@ -0,0 +1,101 @@ +// unique_resource +// Copyright (c) 2015 okdshin +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// This implementation is based on C++ standards committee paper N4189. +#ifndef UNIQUE_RESOURCE_H_ +#define UNIQUE_RESOURCE_H_ +#include +// workaround for GCC +#if defined(__GNUC__) +#ifdef UNIQUE_RESOURCE_ALLOW_DELETER_CALL_THROWING_EXCEPTION +#define UNIQUE_RESOURCE_NOEXCEPT +#else +#define UNIQUE_RESOURCE_NOEXCEPT noexcept +#endif +#define UNIQUE_RESOURCE_NOEXCEPT_NOEXCEPT_THIS_RESET UNIQUE_RESOURCE_NOEXCEPT +#define UNIQUE_RESOURCE_NOEXCEPT_NOEXCEPT_THIS_DELETER_CALL \ + UNIQUE_RESOURCE_NOEXCEPT +#else +#define UNIQUE_RESOURCE_NOEXCEPT_NOEXCEPT_THIS_RESET \ + noexcept(noexcept(this->reset())) +#define UNIQUE_RESOURCE_NOEXCEPT_NOEXCEPT_THIS_DELETER_CALL \ + noexcept(noexcept(this->get_deleter()(resource))) +#endif +namespace std_experimental { +template class unique_resource { + R resource; + D deleter; + bool execute_on_destruction; // exposition only + unique_resource &operator=(unique_resource const &) = delete; + unique_resource(unique_resource const &) = delete; // no copies! +public: + // construction + explicit unique_resource(R &&resource_, D &&deleter_, + bool shouldrun = true) noexcept + : resource(std::move(resource_)), + deleter(std::move(deleter_)), + execute_on_destruction{shouldrun} {} + // move + unique_resource(unique_resource &&other) noexcept + : resource(std::move(other.resource)), + deleter(std::move(other.deleter)), + execute_on_destruction{other.execute_on_destruction} { + other.release(); + } + unique_resource &operator=(unique_resource &&other) + UNIQUE_RESOURCE_NOEXCEPT_NOEXCEPT_THIS_RESET { + this->reset(); + this->deleter = std::move(other.deleter); + this->resource = std::move(other.resource); + this->execute_on_destruction = other.execute_on_destruction; + other.release(); + return *this; + } + // resource release + ~unique_resource() UNIQUE_RESOURCE_NOEXCEPT_NOEXCEPT_THIS_RESET { + this->reset(); + } + void reset() UNIQUE_RESOURCE_NOEXCEPT_NOEXCEPT_THIS_DELETER_CALL { + if (execute_on_destruction) { + this->execute_on_destruction = false; + this->get_deleter()(resource); + } + } + void reset(R &&newresource) UNIQUE_RESOURCE_NOEXCEPT_NOEXCEPT_THIS_RESET { + this->reset(); + this->resource = std::move(newresource); + this->execute_on_destruction = true; + } + R const &release() noexcept { + this->execute_on_destruction = false; + return this->get(); + } + // resource access + R const &get() const noexcept { return this->resource; } + operator R const &() const noexcept { return this->resource; } + R operator->() const noexcept { return this->resource; } + typename std::add_lvalue_reference< + typename std::remove_pointer::type>::type + operator*() const { + return *this->resource; + } + // deleter access + const D &get_deleter() const noexcept { return this->deleter; } +}; +// factories +template +unique_resource::type> +make_unique_resource(R &&r, D &&d) noexcept { + return unique_resource::type>( + std::move(r), std::forward::type>(d), + true); +} +template +unique_resource make_unique_resource_checked(R r, R invalid, + D d) noexcept { + bool shouldrun = not bool(r == invalid); + return unique_resource(std::move(r), std::move(d), shouldrun); +} +} +#endif /* UNIQUE_RESOURCE_H_ */ diff --git a/src/3rdparty/mapbox-gl-native/deps/variant/1.1.4/LICENSE b/src/3rdparty/mapbox-gl-native/deps/variant/1.1.4/LICENSE new file mode 100644 index 0000000..6c4ce40 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/variant/1.1.4/LICENSE @@ -0,0 +1,25 @@ +Copyright (c) MapBox +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +- Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. +- Redistributions in binary form must reproduce the above copyright notice, this + list of conditions and the following disclaimer in the documentation and/or + other materials provided with the distribution. +- Neither the name "MapBox" nor the names of its contributors may be + used to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/src/3rdparty/mapbox-gl-native/deps/variant/1.1.4/include/mapbox/optional.hpp b/src/3rdparty/mapbox-gl-native/deps/variant/1.1.4/include/mapbox/optional.hpp new file mode 100644 index 0000000..d84705c --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/variant/1.1.4/include/mapbox/optional.hpp @@ -0,0 +1,74 @@ +#ifndef MAPBOX_UTIL_OPTIONAL_HPP +#define MAPBOX_UTIL_OPTIONAL_HPP + +#pragma message("This implementation of optional is deprecated. See https://github.com/mapbox/variant/issues/64.") + +#include +#include + +#include + +namespace mapbox { +namespace util { + +template +class optional +{ + static_assert(!std::is_reference::value, "optional doesn't support references"); + + struct none_type + { + }; + + variant variant_; + +public: + optional() = default; + + optional(optional const& rhs) + { + if (this != &rhs) + { // protect against invalid self-assignment + variant_ = rhs.variant_; + } + } + + optional(T const& v) { variant_ = v; } + + explicit operator bool() const noexcept { return variant_.template is(); } + + T const& get() const { return variant_.template get(); } + T& get() { return variant_.template get(); } + + T const& operator*() const { return this->get(); } + T operator*() { return this->get(); } + + optional& operator=(T const& v) + { + variant_ = v; + return *this; + } + + optional& operator=(optional const& rhs) + { + if (this != &rhs) + { + variant_ = rhs.variant_; + } + return *this; + } + + template + void emplace(Args&&... args) + { + variant_ = T{std::forward(args)...}; + } + + void reset() { variant_ = none_type{}; } + +}; // class optional + +} // namespace util +} // namespace mapbox + +#endif // MAPBOX_UTIL_OPTIONAL_HPP diff --git a/src/3rdparty/mapbox-gl-native/deps/variant/1.1.4/include/mapbox/recursive_wrapper.hpp b/src/3rdparty/mapbox-gl-native/deps/variant/1.1.4/include/mapbox/recursive_wrapper.hpp new file mode 100644 index 0000000..4ffcbd7 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/variant/1.1.4/include/mapbox/recursive_wrapper.hpp @@ -0,0 +1,122 @@ +#ifndef MAPBOX_UTIL_RECURSIVE_WRAPPER_HPP +#define MAPBOX_UTIL_RECURSIVE_WRAPPER_HPP + +// Based on variant/recursive_wrapper.hpp from boost. +// +// Original license: +// +// Copyright (c) 2002-2003 +// Eric Friedman, Itay Maman +// +// Distributed under the Boost Software License, Version 1.0. (See +// accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +#include +#include + +namespace mapbox { +namespace util { + +template +class recursive_wrapper +{ + + T* p_; + + void assign(T const& rhs) + { + this->get() = rhs; + } + +public: + using type = T; + + /** + * Default constructor default initializes the internally stored value. + * For POD types this means nothing is done and the storage is + * uninitialized. + * + * @throws std::bad_alloc if there is insufficient memory for an object + * of type T. + * @throws any exception thrown by the default constructur of T. + */ + recursive_wrapper() + : p_(new T){} + + ~recursive_wrapper() noexcept { delete p_; } + + recursive_wrapper(recursive_wrapper const& operand) + : p_(new T(operand.get())) {} + + recursive_wrapper(T const& operand) + : p_(new T(operand)) {} + + recursive_wrapper(recursive_wrapper&& operand) + : p_(new T(std::move(operand.get()))) {} + + recursive_wrapper(T&& operand) + : p_(new T(std::move(operand))) {} + + inline recursive_wrapper& operator=(recursive_wrapper const& rhs) + { + assign(rhs.get()); + return *this; + } + + inline recursive_wrapper& operator=(T const& rhs) + { + assign(rhs); + return *this; + } + + inline void swap(recursive_wrapper& operand) noexcept + { + T* temp = operand.p_; + operand.p_ = p_; + p_ = temp; + } + + recursive_wrapper& operator=(recursive_wrapper&& rhs) noexcept + { + swap(rhs); + return *this; + } + + recursive_wrapper& operator=(T&& rhs) + { + get() = std::move(rhs); + return *this; + } + + T& get() + { + assert(p_); + return *get_pointer(); + } + + T const& get() const + { + assert(p_); + return *get_pointer(); + } + + T* get_pointer() { return p_; } + + const T* get_pointer() const { return p_; } + + operator T const&() const { return this->get(); } + + operator T&() { return this->get(); } + +}; // class recursive_wrapper + +template +inline void swap(recursive_wrapper& lhs, recursive_wrapper& rhs) noexcept +{ + lhs.swap(rhs); +} +} // namespace util +} // namespace mapbox + +#endif // MAPBOX_UTIL_RECURSIVE_WRAPPER_HPP diff --git a/src/3rdparty/mapbox-gl-native/deps/variant/1.1.4/include/mapbox/variant.hpp b/src/3rdparty/mapbox-gl-native/deps/variant/1.1.4/include/mapbox/variant.hpp new file mode 100644 index 0000000..fb0f77e --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/variant/1.1.4/include/mapbox/variant.hpp @@ -0,0 +1,1013 @@ +#ifndef MAPBOX_UTIL_VARIANT_HPP +#define MAPBOX_UTIL_VARIANT_HPP + +#include +#include // size_t +#include // operator new +#include // runtime_error +#include +#include +#include +#include +#include +#include + +#include +#include + +// clang-format off +// [[deprecated]] is only available in C++14, use this for the time being +#if __cplusplus <= 201103L +# ifdef __GNUC__ +# define MAPBOX_VARIANT_DEPRECATED __attribute__((deprecated)) +# elif defined(_MSC_VER) +# define MAPBOX_VARIANT_DEPRECATED __declspec(deprecated) +# else +# define MAPBOX_VARIANT_DEPRECATED +# endif +#else +# define MAPBOX_VARIANT_DEPRECATED [[deprecated]] +#endif + + +#ifdef _MSC_VER +// https://msdn.microsoft.com/en-us/library/bw1hbe6y.aspx +# ifdef NDEBUG +# define VARIANT_INLINE __forceinline +# else +# define VARIANT_INLINE //__declspec(noinline) +# endif +#else +# ifdef NDEBUG +# define VARIANT_INLINE //inline __attribute__((always_inline)) +# else +# define VARIANT_INLINE __attribute__((noinline)) +# endif +#endif +// clang-format on + +// Exceptions +#if defined( __EXCEPTIONS) || defined( _MSC_VER) +#define HAS_EXCEPTIONS +#endif + +#define VARIANT_MAJOR_VERSION 1 +#define VARIANT_MINOR_VERSION 1 +#define VARIANT_PATCH_VERSION 0 + +#define VARIANT_VERSION (VARIANT_MAJOR_VERSION * 100000) + (VARIANT_MINOR_VERSION * 100) + (VARIANT_PATCH_VERSION) + +namespace mapbox { +namespace util { + +// XXX This should derive from std::logic_error instead of std::runtime_error. +// See https://github.com/mapbox/variant/issues/48 for details. +class bad_variant_access : public std::runtime_error +{ + +public: + explicit bad_variant_access(const std::string& what_arg) + : runtime_error(what_arg) {} + + explicit bad_variant_access(const char* what_arg) + : runtime_error(what_arg) {} + +}; // class bad_variant_access + +template +struct MAPBOX_VARIANT_DEPRECATED static_visitor +{ + using result_type = R; + +protected: + static_visitor() {} + ~static_visitor() {} +}; + +namespace detail { + +static constexpr std::size_t invalid_value = std::size_t(-1); + +template +struct direct_type; + +template +struct direct_type +{ + static constexpr std::size_t index = std::is_same::value + ? sizeof...(Types) + : direct_type::index; +}; + +template +struct direct_type +{ + static constexpr std::size_t index = invalid_value; +}; + +#if __cpp_lib_logical_traits >= 201510L + +using std::disjunction; + +#else + +template +struct disjunction : std::false_type {}; + +template +struct disjunction : B1 {}; + +template +struct disjunction : std::conditional::type {}; + +template +struct disjunction : std::conditional>::type {}; + +#endif + +template +struct convertible_type; + +template +struct convertible_type +{ + static constexpr std::size_t index = std::is_convertible::value + ? disjunction...>::value ? invalid_value : sizeof...(Types) + : convertible_type::index; +}; + +template +struct convertible_type +{ + static constexpr std::size_t index = invalid_value; +}; + +template +struct value_traits +{ + using value_type = typename std::remove_const::type>::type; + static constexpr std::size_t direct_index = direct_type::index; + static constexpr bool is_direct = direct_index != invalid_value; + static constexpr std::size_t index = is_direct ? direct_index : convertible_type::index; + static constexpr bool is_valid = index != invalid_value; + static constexpr std::size_t tindex = is_valid ? sizeof...(Types)-index : 0; + using target_type = typename std::tuple_element>::type; +}; + +template +struct enable_if_type +{ + using type = R; +}; + +template +struct result_of_unary_visit +{ + using type = typename std::result_of::type; +}; + +template +struct result_of_unary_visit::type> +{ + using type = typename F::result_type; +}; + +template +struct result_of_binary_visit +{ + using type = typename std::result_of::type; +}; + +template +struct result_of_binary_visit::type> +{ + using type = typename F::result_type; +}; + +template +struct static_max; + +template +struct static_max +{ + static const std::size_t value = arg; +}; + +template +struct static_max +{ + static const std::size_t value = arg1 >= arg2 ? static_max::value : static_max::value; +}; + +template +struct variant_helper; + +template +struct variant_helper +{ + VARIANT_INLINE static void destroy(const std::size_t type_index, void* data) + { + if (type_index == sizeof...(Types)) + { + reinterpret_cast(data)->~T(); + } + else + { + variant_helper::destroy(type_index, data); + } + } + + VARIANT_INLINE static void move(const std::size_t old_type_index, void* old_value, void* new_value) + { + if (old_type_index == sizeof...(Types)) + { + new (new_value) T(std::move(*reinterpret_cast(old_value))); + } + else + { + variant_helper::move(old_type_index, old_value, new_value); + } + } + + VARIANT_INLINE static void copy(const std::size_t old_type_index, const void* old_value, void* new_value) + { + if (old_type_index == sizeof...(Types)) + { + new (new_value) T(*reinterpret_cast(old_value)); + } + else + { + variant_helper::copy(old_type_index, old_value, new_value); + } + } +}; + +template <> +struct variant_helper<> +{ + VARIANT_INLINE static void destroy(const std::size_t, void*) {} + VARIANT_INLINE static void move(const std::size_t, void*, void*) {} + VARIANT_INLINE static void copy(const std::size_t, const void*, void*) {} +}; + +template +struct unwrapper +{ + static T const& apply_const(T const& obj) { return obj; } + static T& apply(T& obj) { return obj; } +}; + +template +struct unwrapper> +{ + static auto apply_const(recursive_wrapper const& obj) + -> typename recursive_wrapper::type const& + { + return obj.get(); + } + static auto apply(recursive_wrapper& obj) + -> typename recursive_wrapper::type& + { + return obj.get(); + } +}; + +template +struct unwrapper> +{ + static auto apply_const(std::reference_wrapper const& obj) + -> typename std::reference_wrapper::type const& + { + return obj.get(); + } + static auto apply(std::reference_wrapper& obj) + -> typename std::reference_wrapper::type& + { + return obj.get(); + } +}; + +template +struct dispatcher; + +template +struct dispatcher +{ + VARIANT_INLINE static R apply_const(V const& v, F&& f) + { + if (v.template is()) + { + return f(unwrapper::apply_const(v.template get_unchecked())); + } + else + { + return dispatcher::apply_const(v, std::forward(f)); + } + } + + VARIANT_INLINE static R apply(V& v, F&& f) + { + if (v.template is()) + { + return f(unwrapper::apply(v.template get_unchecked())); + } + else + { + return dispatcher::apply(v, std::forward(f)); + } + } +}; + +template +struct dispatcher +{ + VARIANT_INLINE static R apply_const(V const& v, F&& f) + { + return f(unwrapper::apply_const(v.template get_unchecked())); + } + + VARIANT_INLINE static R apply(V& v, F&& f) + { + return f(unwrapper::apply(v.template get_unchecked())); + } +}; + +template +struct binary_dispatcher_rhs; + +template +struct binary_dispatcher_rhs +{ + VARIANT_INLINE static R apply_const(V const& lhs, V const& rhs, F&& f) + { + if (rhs.template is()) // call binary functor + { + return f(unwrapper::apply_const(lhs.template get_unchecked()), + unwrapper::apply_const(rhs.template get_unchecked())); + } + else + { + return binary_dispatcher_rhs::apply_const(lhs, rhs, std::forward(f)); + } + } + + VARIANT_INLINE static R apply(V& lhs, V& rhs, F&& f) + { + if (rhs.template is()) // call binary functor + { + return f(unwrapper::apply(lhs.template get_unchecked()), + unwrapper::apply(rhs.template get_unchecked())); + } + else + { + return binary_dispatcher_rhs::apply(lhs, rhs, std::forward(f)); + } + } +}; + +template +struct binary_dispatcher_rhs +{ + VARIANT_INLINE static R apply_const(V const& lhs, V const& rhs, F&& f) + { + return f(unwrapper::apply_const(lhs.template get_unchecked()), + unwrapper::apply_const(rhs.template get_unchecked())); + } + + VARIANT_INLINE static R apply(V& lhs, V& rhs, F&& f) + { + return f(unwrapper::apply(lhs.template get_unchecked()), + unwrapper::apply(rhs.template get_unchecked())); + } +}; + +template +struct binary_dispatcher_lhs; + +template +struct binary_dispatcher_lhs +{ + VARIANT_INLINE static R apply_const(V const& lhs, V const& rhs, F&& f) + { + if (lhs.template is()) // call binary functor + { + return f(unwrapper::apply_const(lhs.template get_unchecked()), + unwrapper::apply_const(rhs.template get_unchecked())); + } + else + { + return binary_dispatcher_lhs::apply_const(lhs, rhs, std::forward(f)); + } + } + + VARIANT_INLINE static R apply(V& lhs, V& rhs, F&& f) + { + if (lhs.template is()) // call binary functor + { + return f(unwrapper::apply(lhs.template get_unchecked()), + unwrapper::apply(rhs.template get_unchecked())); + } + else + { + return binary_dispatcher_lhs::apply(lhs, rhs, std::forward(f)); + } + } +}; + +template +struct binary_dispatcher_lhs +{ + VARIANT_INLINE static R apply_const(V const& lhs, V const& rhs, F&& f) + { + return f(unwrapper::apply_const(lhs.template get_unchecked()), + unwrapper::apply_const(rhs.template get_unchecked())); + } + + VARIANT_INLINE static R apply(V& lhs, V& rhs, F&& f) + { + return f(unwrapper::apply(lhs.template get_unchecked()), + unwrapper::apply(rhs.template get_unchecked())); + } +}; + +template +struct binary_dispatcher; + +template +struct binary_dispatcher +{ + VARIANT_INLINE static R apply_const(V const& v0, V const& v1, F&& f) + { + if (v0.template is()) + { + if (v1.template is()) + { + return f(unwrapper::apply_const(v0.template get_unchecked()), + unwrapper::apply_const(v1.template get_unchecked())); // call binary functor + } + else + { + return binary_dispatcher_rhs::apply_const(v0, v1, std::forward(f)); + } + } + else if (v1.template is()) + { + return binary_dispatcher_lhs::apply_const(v0, v1, std::forward(f)); + } + return binary_dispatcher::apply_const(v0, v1, std::forward(f)); + } + + VARIANT_INLINE static R apply(V& v0, V& v1, F&& f) + { + if (v0.template is()) + { + if (v1.template is()) + { + return f(unwrapper::apply(v0.template get_unchecked()), + unwrapper::apply(v1.template get_unchecked())); // call binary functor + } + else + { + return binary_dispatcher_rhs::apply(v0, v1, std::forward(f)); + } + } + else if (v1.template is()) + { + return binary_dispatcher_lhs::apply(v0, v1, std::forward(f)); + } + return binary_dispatcher::apply(v0, v1, std::forward(f)); + } +}; + +template +struct binary_dispatcher +{ + VARIANT_INLINE static R apply_const(V const& v0, V const& v1, F&& f) + { + return f(unwrapper::apply_const(v0.template get_unchecked()), + unwrapper::apply_const(v1.template get_unchecked())); // call binary functor + } + + VARIANT_INLINE static R apply(V& v0, V& v1, F&& f) + { + return f(unwrapper::apply(v0.template get_unchecked()), + unwrapper::apply(v1.template get_unchecked())); // call binary functor + } +}; + +// comparator functors +struct equal_comp +{ + template + bool operator()(T const& lhs, T const& rhs) const + { + return lhs == rhs; + } +}; + +struct less_comp +{ + template + bool operator()(T const& lhs, T const& rhs) const + { + return lhs < rhs; + } +}; + +template +class comparer +{ +public: + explicit comparer(Variant const& lhs) noexcept + : lhs_(lhs) {} + comparer& operator=(comparer const&) = delete; + // visitor + template + bool operator()(T const& rhs_content) const + { + T const& lhs_content = lhs_.template get_unchecked(); + return Comp()(lhs_content, rhs_content); + } + +private: + Variant const& lhs_; +}; + +// hashing visitor +struct hasher +{ + template + std::size_t operator()(const T& hashable) const + { + return std::hash{}(hashable); + } +}; + +} // namespace detail + +struct no_init +{ +}; + +template +class variant +{ + static_assert(sizeof...(Types) > 0, "Template parameter type list of variant can not be empty"); + static_assert(!detail::disjunction...>::value, "Variant can not hold reference types. Maybe use std::reference_wrapper?"); + +private: + static const std::size_t data_size = detail::static_max::value; + static const std::size_t data_align = detail::static_max::value; +public: + struct adapted_variant_tag; + using types = std::tuple; +private: + using first_type = typename std::tuple_element<0, types>::type; + using data_type = typename std::aligned_storage::type; + using helper_type = detail::variant_helper; + + std::size_t type_index; + data_type data; + +public: + VARIANT_INLINE variant() noexcept(std::is_nothrow_default_constructible::value) + : type_index(sizeof...(Types)-1) + { + static_assert(std::is_default_constructible::value, "First type in variant must be default constructible to allow default construction of variant"); + new (&data) first_type(); + } + + VARIANT_INLINE variant(no_init) noexcept + : type_index(detail::invalid_value) {} + + // http://isocpp.org/blog/2012/11/universal-references-in-c11-scott-meyers + template , + typename Enable = typename std::enable_if, typename Traits::value_type>::value>::type > + VARIANT_INLINE variant(T&& val) noexcept(std::is_nothrow_constructible::value) + : type_index(Traits::index) + { + new (&data) typename Traits::target_type(std::forward(val)); + } + + VARIANT_INLINE variant(variant const& old) + : type_index(old.type_index) + { + helper_type::copy(old.type_index, &old.data, &data); + } + + VARIANT_INLINE variant(variant&& old) noexcept(std::is_nothrow_move_constructible::value) + : type_index(old.type_index) + { + helper_type::move(old.type_index, &old.data, &data); + } + +private: + VARIANT_INLINE void copy_assign(variant const& rhs) + { + helper_type::destroy(type_index, &data); + type_index = detail::invalid_value; + helper_type::copy(rhs.type_index, &rhs.data, &data); + type_index = rhs.type_index; + } + + VARIANT_INLINE void move_assign(variant&& rhs) + { + helper_type::destroy(type_index, &data); + type_index = detail::invalid_value; + helper_type::move(rhs.type_index, &rhs.data, &data); + type_index = rhs.type_index; + } + +public: + VARIANT_INLINE variant& operator=(variant&& other) + { + move_assign(std::move(other)); + return *this; + } + + VARIANT_INLINE variant& operator=(variant const& other) + { + copy_assign(other); + return *this; + } + + // conversions + // move-assign + template + VARIANT_INLINE variant& operator=(T&& rhs) noexcept + { + variant temp(std::forward(rhs)); + move_assign(std::move(temp)); + return *this; + } + + // copy-assign + template + VARIANT_INLINE variant& operator=(T const& rhs) + { + variant temp(rhs); + copy_assign(temp); + return *this; + } + + template ::index != detail::invalid_value)>::type* = nullptr> + VARIANT_INLINE bool is() const + { + return type_index == detail::direct_type::index; + } + + template , Types...>::index != detail::invalid_value)>::type* = nullptr> + VARIANT_INLINE bool is() const + { + return type_index == detail::direct_type, Types...>::index; + } + + VARIANT_INLINE bool valid() const + { + return type_index != detail::invalid_value; + } + + template + VARIANT_INLINE void set(Args&&... args) + { + helper_type::destroy(type_index, &data); + type_index = detail::invalid_value; + new (&data) T(std::forward(args)...); + type_index = detail::direct_type::index; + } + + // get_unchecked() + template ::index != detail::invalid_value)>::type* = nullptr> + VARIANT_INLINE T& get_unchecked() + { + return *reinterpret_cast(&data); + } + +#ifdef HAS_EXCEPTIONS + // get() + template ::index != detail::invalid_value)>::type* = nullptr> + VARIANT_INLINE T& get() + { + if (type_index == detail::direct_type::index) + { + return *reinterpret_cast(&data); + } + else + { + throw bad_variant_access("in get()"); + } + } +#endif + + template ::index != detail::invalid_value)>::type* = nullptr> + VARIANT_INLINE T const& get_unchecked() const + { + return *reinterpret_cast(&data); + } + +#ifdef HAS_EXCEPTIONS + template ::index != detail::invalid_value)>::type* = nullptr> + VARIANT_INLINE T const& get() const + { + if (type_index == detail::direct_type::index) + { + return *reinterpret_cast(&data); + } + else + { + throw bad_variant_access("in get()"); + } + } +#endif + + // get_unchecked() - T stored as recursive_wrapper + template , Types...>::index != detail::invalid_value)>::type* = nullptr> + VARIANT_INLINE T& get_unchecked() + { + return (*reinterpret_cast*>(&data)).get(); + } + +#ifdef HAS_EXCEPTIONS + // get() - T stored as recursive_wrapper + template , Types...>::index != detail::invalid_value)>::type* = nullptr> + VARIANT_INLINE T& get() + { + if (type_index == detail::direct_type, Types...>::index) + { + return (*reinterpret_cast*>(&data)).get(); + } + else + { + throw bad_variant_access("in get()"); + } + } +#endif + + template , Types...>::index != detail::invalid_value)>::type* = nullptr> + VARIANT_INLINE T const& get_unchecked() const + { + return (*reinterpret_cast const*>(&data)).get(); + } + +#ifdef HAS_EXCEPTIONS + template , Types...>::index != detail::invalid_value)>::type* = nullptr> + VARIANT_INLINE T const& get() const + { + if (type_index == detail::direct_type, Types...>::index) + { + return (*reinterpret_cast const*>(&data)).get(); + } + else + { + throw bad_variant_access("in get()"); + } + } +#endif + + // get_unchecked() - T stored as std::reference_wrapper + template , Types...>::index != detail::invalid_value)>::type* = nullptr> + VARIANT_INLINE T& get_unchecked() + { + return (*reinterpret_cast*>(&data)).get(); + } + +#ifdef HAS_EXCEPTIONS + // get() - T stored as std::reference_wrapper + template , Types...>::index != detail::invalid_value)>::type* = nullptr> + VARIANT_INLINE T& get() + { + if (type_index == detail::direct_type, Types...>::index) + { + return (*reinterpret_cast*>(&data)).get(); + } + else + { + throw bad_variant_access("in get()"); + } + } +#endif + + template , Types...>::index != detail::invalid_value)>::type* = nullptr> + VARIANT_INLINE T const& get_unchecked() const + { + return (*reinterpret_cast const*>(&data)).get(); + } + +#ifdef HAS_EXCEPTIONS + template , Types...>::index != detail::invalid_value)>::type* = nullptr> + VARIANT_INLINE T const& get() const + { + if (type_index == detail::direct_type, Types...>::index) + { + return (*reinterpret_cast const*>(&data)).get(); + } + else + { + throw bad_variant_access("in get()"); + } + } +#endif + + // This function is deprecated because it returns an internal index field. + // Use which() instead. + MAPBOX_VARIANT_DEPRECATED VARIANT_INLINE std::size_t get_type_index() const + { + return type_index; + } + + VARIANT_INLINE int which() const noexcept + { + return static_cast(sizeof...(Types)-type_index - 1); + } + + template ::index != detail::invalid_value)>::type* = nullptr> + VARIANT_INLINE static constexpr int which() noexcept + { + return static_cast(sizeof...(Types)-detail::direct_type::index - 1); + } + + // visitor + // unary + template ::type> + auto VARIANT_INLINE static visit(V const& v, F&& f) + -> decltype(detail::dispatcher::apply_const(v, std::forward(f))) + { + return detail::dispatcher::apply_const(v, std::forward(f)); + } + // non-const + template ::type> + auto VARIANT_INLINE static visit(V& v, F&& f) + -> decltype(detail::dispatcher::apply(v, std::forward(f))) + { + return detail::dispatcher::apply(v, std::forward(f)); + } + + // binary + // const + template ::type> + auto VARIANT_INLINE static binary_visit(V const& v0, V const& v1, F&& f) + -> decltype(detail::binary_dispatcher::apply_const(v0, v1, std::forward(f))) + { + return detail::binary_dispatcher::apply_const(v0, v1, std::forward(f)); + } + // non-const + template ::type> + auto VARIANT_INLINE static binary_visit(V& v0, V& v1, F&& f) + -> decltype(detail::binary_dispatcher::apply(v0, v1, std::forward(f))) + { + return detail::binary_dispatcher::apply(v0, v1, std::forward(f)); + } + + // match + // unary + template + auto VARIANT_INLINE match(Fs&&... fs) const + -> decltype(variant::visit(*this, ::mapbox::util::make_visitor(std::forward(fs)...))) + { + return variant::visit(*this, ::mapbox::util::make_visitor(std::forward(fs)...)); + } + // non-const + template + auto VARIANT_INLINE match(Fs&&... fs) + -> decltype(variant::visit(*this, ::mapbox::util::make_visitor(std::forward(fs)...))) + { + return variant::visit(*this, ::mapbox::util::make_visitor(std::forward(fs)...)); + } + + ~variant() noexcept // no-throw destructor + { + helper_type::destroy(type_index, &data); + } + + // comparison operators + // equality + VARIANT_INLINE bool operator==(variant const& rhs) const + { + assert(valid() && rhs.valid()); + if (this->which() != rhs.which()) + { + return false; + } + detail::comparer visitor(*this); + return visit(rhs, visitor); + } + + VARIANT_INLINE bool operator!=(variant const& rhs) const + { + return !(*this == rhs); + } + + // less than + VARIANT_INLINE bool operator<(variant const& rhs) const + { + assert(valid() && rhs.valid()); + if (this->which() != rhs.which()) + { + return this->which() < rhs.which(); + } + detail::comparer visitor(*this); + return visit(rhs, visitor); + } + VARIANT_INLINE bool operator>(variant const& rhs) const + { + return rhs < *this; + } + VARIANT_INLINE bool operator<=(variant const& rhs) const + { + return !(*this > rhs); + } + VARIANT_INLINE bool operator>=(variant const& rhs) const + { + return !(*this < rhs); + } +}; + +// unary visitor interface +// const +template +auto VARIANT_INLINE apply_visitor(F&& f, V const& v) -> decltype(V::visit(v, std::forward(f))) +{ + return V::visit(v, std::forward(f)); +} + +// non-const +template +auto VARIANT_INLINE apply_visitor(F&& f, V& v) -> decltype(V::visit(v, std::forward(f))) +{ + return V::visit(v, std::forward(f)); +} + +// binary visitor interface +// const +template +auto VARIANT_INLINE apply_visitor(F&& f, V const& v0, V const& v1) -> decltype(V::binary_visit(v0, v1, std::forward(f))) +{ + return V::binary_visit(v0, v1, std::forward(f)); +} + +// non-const +template +auto VARIANT_INLINE apply_visitor(F&& f, V& v0, V& v1) -> decltype(V::binary_visit(v0, v1, std::forward(f))) +{ + return V::binary_visit(v0, v1, std::forward(f)); +} + +// getter interface + +#ifdef HAS_EXCEPTIONS +template +auto get(T& var)->decltype(var.template get()) +{ + return var.template get(); +} +#endif + +template +ResultType& get_unchecked(T& var) +{ + return var.template get_unchecked(); +} + +#ifdef HAS_EXCEPTIONS +template +auto get(T const& var)->decltype(var.template get()) +{ + return var.template get(); +} +#endif + +template +ResultType const& get_unchecked(T const& var) +{ + return var.template get_unchecked(); +} +} // namespace util +} // namespace mapbox + +// hashable iff underlying types are hashable +namespace std { +template +struct hash< ::mapbox::util::variant> { + std::size_t operator()(const ::mapbox::util::variant& v) const noexcept + { + return ::mapbox::util::apply_visitor(::mapbox::util::detail::hasher{}, v); + } +}; +} + +#endif // MAPBOX_UTIL_VARIANT_HPP diff --git a/src/3rdparty/mapbox-gl-native/deps/variant/1.1.4/include/mapbox/variant_io.hpp b/src/3rdparty/mapbox-gl-native/deps/variant/1.1.4/include/mapbox/variant_io.hpp new file mode 100644 index 0000000..1456cc5 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/variant/1.1.4/include/mapbox/variant_io.hpp @@ -0,0 +1,45 @@ +#ifndef MAPBOX_UTIL_VARIANT_IO_HPP +#define MAPBOX_UTIL_VARIANT_IO_HPP + +#include + +#include + +namespace mapbox { +namespace util { + +namespace detail { +// operator<< helper +template +class printer +{ +public: + explicit printer(Out& out) + : out_(out) {} + printer& operator=(printer const&) = delete; + + // visitor + template + void operator()(T const& operand) const + { + out_ << operand; + } + +private: + Out& out_; +}; +} + +// operator<< +template +VARIANT_INLINE std::basic_ostream& +operator<<(std::basic_ostream& out, variant const& rhs) +{ + detail::printer> visitor(out); + apply_visitor(visitor, rhs); + return out; +} +} // namespace util +} // namespace mapbox + +#endif // MAPBOX_UTIL_VARIANT_IO_HPP diff --git a/src/3rdparty/mapbox-gl-native/deps/variant/1.1.4/include/mapbox/variant_visitor.hpp b/src/3rdparty/mapbox-gl-native/deps/variant/1.1.4/include/mapbox/variant_visitor.hpp new file mode 100644 index 0000000..481eb65 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/variant/1.1.4/include/mapbox/variant_visitor.hpp @@ -0,0 +1,38 @@ +#ifndef MAPBOX_UTIL_VARIANT_VISITOR_HPP +#define MAPBOX_UTIL_VARIANT_VISITOR_HPP + +namespace mapbox { +namespace util { + +template +struct visitor; + +template +struct visitor : Fn +{ + using type = Fn; + using Fn::operator(); + + visitor(Fn fn) : Fn(fn) {} +}; + +template +struct visitor : Fn, visitor +{ + using type = visitor; + using Fn::operator(); + using visitor::operator(); + + visitor(Fn fn, Fns... fns) : Fn(fn), visitor(fns...) {} +}; + +template +visitor make_visitor(Fns... fns) +{ + return visitor(fns...); +} + +} // namespace util +} // namespace mapbox + +#endif // MAPBOX_UTIL_VARIANT_VISITOR_HPP diff --git a/src/3rdparty/mapbox-gl-native/deps/vector-tile/1.0.2/include/mapbox/vector_tile.hpp b/src/3rdparty/mapbox-gl-native/deps/vector-tile/1.0.2/include/mapbox/vector_tile.hpp new file mode 100644 index 0000000..5ddae48 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/vector-tile/1.0.2/include/mapbox/vector_tile.hpp @@ -0,0 +1,455 @@ +#pragma once + +#include "vector_tile/vector_tile_config.hpp" +#include +#include + +#include +#include +#include +#include // reference_wrapper +#include +#include + +#include + +template +using optional = std::experimental::optional; + +namespace mapbox { namespace vector_tile { + +using point_type = mapbox::geometry::point; + +class points_array_type : public std::vector { +public: + using coordinate_type = point_type::coordinate_type; + template + points_array_type(Args&&... args) : std::vector(std::forward(args)...) {} +}; + +class points_arrays_type : public std::vector { +public: + using coordinate_type = points_array_type::coordinate_type; + template + points_arrays_type(Args&&... args) : std::vector(std::forward(args)...) {} +}; + +class layer; + +class feature { +public: + using properties_type = mapbox::geometry::property_map; + using packed_iterator_type = protozero::iterator_range; + + feature(protozero::data_view const&, layer const&); + + GeomType getType() const { return type; } + optional getValue(std::string const&) const; + properties_type getProperties() const; + optional const& getID() const; + std::uint32_t getExtent() const; + std::uint32_t getVersion() const; + template + GeometryCollectionType getGeometries(float scale) const; + +private: + const layer& layer_; + optional id; + GeomType type = GeomType::UNKNOWN; + packed_iterator_type tags_iter; + packed_iterator_type geometry_iter; +}; + +class layer { +public: + layer(protozero::data_view const& layer_view); + + std::size_t featureCount() const { return features.size(); } + protozero::data_view const& getFeature(std::size_t) const; + std::string const& getName() const; + std::uint32_t getExtent() const { return extent; } + std::uint32_t getVersion() const { return version; } + +private: + friend class feature; + + std::string name; + std::uint32_t version; + std::uint32_t extent; + std::map keysMap; + std::vector> keys; + std::vector values; + std::vector features; +}; + +class buffer { +public: + buffer(std::string const& data); + std::vector layerNames() const; + std::map getLayers() const { return layers; }; + layer getLayer(const std::string&) const; + +private: + std::map layers; +}; + +static mapbox::geometry::value parseValue(protozero::data_view const& value_view) { + mapbox::geometry::value value; + protozero::pbf_reader value_reader(value_view); + while (value_reader.next()) + { + switch (value_reader.tag()) { + case ValueType::STRING: + value = value_reader.get_string(); + break; + case ValueType::FLOAT: + value = static_cast(value_reader.get_float()); + break; + case ValueType::DOUBLE: + value = value_reader.get_double(); + break; + case ValueType::INT: + value = value_reader.get_int64(); + break; + case ValueType::UINT: + value = value_reader.get_uint64(); + break; + case ValueType::SINT: + value = value_reader.get_sint64(); + break; + case ValueType::BOOL: + value = value_reader.get_bool(); + break; + default: + value_reader.skip(); + break; + } + } + return value; +} + +inline feature::feature(protozero::data_view const& feature_view, layer const& l) + : layer_(l), + id(), + type(GeomType::UNKNOWN), + tags_iter(), + geometry_iter() + { + protozero::pbf_reader feature_pbf(feature_view); + while (feature_pbf.next()) { + switch (feature_pbf.tag()) { + case FeatureType::ID: + id = optional{ feature_pbf.get_uint64() }; + break; + case FeatureType::TAGS: + tags_iter = feature_pbf.get_packed_uint32(); + break; + case FeatureType::TYPE: + type = static_cast(feature_pbf.get_enum()); + break; + case FeatureType::GEOMETRY: + geometry_iter = feature_pbf.get_packed_uint32(); + break; + default: + feature_pbf.skip(); + break; + } + } +} + +inline optional feature::getValue(const std::string& key) const { + auto keyIter = layer_.keysMap.find(key); + if (keyIter == layer_.keysMap.end()) { + return optional(); + } + + const auto values_count = layer_.values.size(); + const auto keymap_count = layer_.keysMap.size(); + auto start_itr = tags_iter.begin(); + const auto end_itr = tags_iter.end(); + while (start_itr != end_itr) { + std::uint32_t tag_key = static_cast(*start_itr++); + + if (keymap_count <= tag_key) { + throw std::runtime_error("feature referenced out of range key"); + } + + if (start_itr == end_itr) { + throw std::runtime_error("uneven number of feature tag ids"); + } + + std::uint32_t tag_val = static_cast(*start_itr++);; + if (values_count <= tag_val) { + throw std::runtime_error("feature referenced out of range value"); + } + + if (tag_key == keyIter->second) { + return parseValue(layer_.values[tag_val]); + } + } + + return optional(); +} + +inline feature::properties_type feature::getProperties() const { + auto start_itr = tags_iter.begin(); + const auto end_itr = tags_iter.end(); + properties_type properties; + auto iter_len = std::distance(start_itr,end_itr); + if (iter_len > 0) { + properties.reserve(static_cast(iter_len/2)); + while (start_itr != end_itr) { + std::uint32_t tag_key = static_cast(*start_itr++); + if (start_itr == end_itr) { + throw std::runtime_error("uneven number of feature tag ids"); + } + std::uint32_t tag_val = static_cast(*start_itr++); + properties.emplace(layer_.keys.at(tag_key),parseValue(layer_.values.at(tag_val))); + } + } + return properties; +} + +inline optional const& feature::getID() const { + return id; +} + +inline std::uint32_t feature::getExtent() const { + return layer_.getExtent(); +} + +inline std::uint32_t feature::getVersion() const { + return layer_.getVersion(); +} + +template +GeometryCollectionType feature::getGeometries(float scale) const { + std::uint8_t cmd = 1; + std::uint32_t length = 0; + std::int64_t x = 0; + std::int64_t y = 0; + + GeometryCollectionType paths; + + paths.emplace_back(); + + auto start_itr = geometry_iter.begin(); + const auto end_itr = geometry_iter.end(); + bool first = true; + std::uint32_t len_reserve = 0; + std::size_t extra_coords = 0; + if (type == GeomType::LINESTRING) { + extra_coords = 1; + } else if (type == GeomType::POLYGON) { + extra_coords = 2; + } + bool is_point = type == GeomType::POINT; + + while (start_itr != end_itr) { + if (length == 0) { + std::uint32_t cmd_length = static_cast(*start_itr++); + cmd = cmd_length & 0x7; + length = len_reserve = cmd_length >> 3; + // Prevents the creation of vector tiles that would cause + // a denial of service from massive over allocation. Protection + // limit is based on the assumption of an int64_t point which is + // 16 bytes in size and wanting to have a maximum of 1 MB of memory + // used. + constexpr std::uint32_t MAX_LENGTH = (1024 * 1024) / 16; + if (len_reserve > MAX_LENGTH) { + len_reserve = MAX_LENGTH; + } + } + + --length; + + if (cmd == CommandType::MOVE_TO || cmd == CommandType::LINE_TO) { + + if (is_point) { + if (first && cmd == CommandType::MOVE_TO) { + // note: this invalidates pointers. So we always + // dynamically get the path with paths.back() + paths.reserve(len_reserve); + first = false; + } + } else { + if (first && cmd == CommandType::LINE_TO) { + paths.back().reserve(len_reserve + extra_coords); + first = false; + } + } + + if (cmd == CommandType::MOVE_TO && !paths.back().empty()) { + if (paths.back().size() < paths.back().capacity()) { + // Assuming we had an invalid length before + // lets shrink to fit, just to make sure + // we don't have a large capacity vector + // just wasting memory + paths.back().shrink_to_fit(); + } + paths.emplace_back(); + if (!is_point) { + first = true; + } + } + + x += protozero::decode_zigzag32(static_cast(*start_itr++)); + y += protozero::decode_zigzag32(static_cast(*start_itr++)); + float px = ::roundf(static_cast(x) * scale); + float py = ::roundf(static_cast(y) * scale); + static const float max_coord = static_cast(std::numeric_limits::max()); + static const float min_coord = static_cast(std::numeric_limits::min()); + + if (px > max_coord || + px < min_coord || + py > max_coord || + py < min_coord + ) { + std::runtime_error("paths outside valid range of coordinate_type"); + } else { + paths.back().emplace_back( + static_cast(px), + static_cast(py)); + } + } else if (cmd == CommandType::CLOSE) { + if (!paths.back().empty()) { + paths.back().push_back(paths.back()[0]); + } + length = 0; + } else { + throw std::runtime_error("unknown command"); + } + } + if (paths.size() < paths.capacity()) { + // Assuming we had an invalid length before + // lets shrink to fit, just to make sure + // we don't have a large capacity vector + // just wasting memory + paths.shrink_to_fit(); + } +#if defined(DEBUG) + for (auto const& p : paths) { + assert(p.size() == p.capacity()); + } +#endif + return paths; +} + +inline buffer::buffer(std::string const& data) + : layers() { + protozero::pbf_reader data_reader(data); + while (data_reader.next(TileType::LAYERS)) { + const protozero::data_view layer_view = data_reader.get_view(); + protozero::pbf_reader layer_reader(layer_view); + std::string name; + bool has_name = false; + while (layer_reader.next(LayerType::NAME)) { + name = layer_reader.get_string(); + has_name = true; + } + if (!has_name) { + throw std::runtime_error("Layer missing name"); + } + layers.emplace(name, layer_view); + } +} + +inline std::vector buffer::layerNames() const { + std::vector names; + names.reserve(layers.size()); + for (auto const& layer : layers) { + names.emplace_back(layer.first); + } + return names; +} + +inline layer buffer::getLayer(const std::string& name) const { + auto layer_it = layers.find(name); + if (layer_it == layers.end()) { + throw std::runtime_error(std::string("no layer by the name of '")+name+"'"); + } + return layer(layer_it->second); +} + +inline layer::layer(protozero::data_view const& layer_view) : + name(), + version(1), + extent(4096), + keysMap(), + keys(), + values(), + features() +{ + bool has_name = false; + bool has_extent = false; + bool has_version = false; + protozero::pbf_reader layer_pbf(layer_view); + while (layer_pbf.next()) { + switch (layer_pbf.tag()) { + case LayerType::NAME: + { + name = layer_pbf.get_string(); + has_name = true; + } + break; + case LayerType::FEATURES: + { + features.push_back(layer_pbf.get_view()); + } + break; + case LayerType::KEYS: + { + // We want to keep the keys in the order of the vector tile + // https://github.com/mapbox/mapbox-gl-native/pull/5183 + auto iter = keysMap.emplace(layer_pbf.get_string(), keysMap.size()); + keys.emplace_back(std::reference_wrapper(iter.first->first)); + } + break; + case LayerType::VALUES: + { + values.emplace_back(layer_pbf.get_view()); + } + break; + case LayerType::EXTENT: + { + extent = layer_pbf.get_uint32(); + has_extent = true; + } + break; + case LayerType::VERSION: + { + version = layer_pbf.get_uint32(); + has_version = true; + } + break; + default: + { + layer_pbf.skip(); + } + break; + } + } + if (!has_version || !has_name || !has_extent) { + std::string msg("missing required field:"); + if (!has_version) { + msg += " version "; + } + if (!has_extent) { + msg += " extent "; + } + if (!has_name) { + msg += " name"; + } + throw std::runtime_error(msg.c_str()); + } +} + +inline protozero::data_view const& layer::getFeature(std::size_t i) const { + return features.at(i); +} + +inline std::string const& layer::getName() const { + return name; +} + +}} // namespace mapbox/vector_tile diff --git a/src/3rdparty/mapbox-gl-native/deps/vector-tile/1.0.2/include/mapbox/vector_tile/vector_tile_config.hpp b/src/3rdparty/mapbox-gl-native/deps/vector-tile/1.0.2/include/mapbox/vector_tile/vector_tile_config.hpp new file mode 100644 index 0000000..acf1185 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/vector-tile/1.0.2/include/mapbox/vector_tile/vector_tile_config.hpp @@ -0,0 +1,60 @@ +#pragma once + +#include + +namespace mapbox { namespace vector_tile { + + +enum TileType : std::uint32_t +{ + LAYERS = 3 +}; + +enum LayerType : std::uint32_t +{ + VERSION = 15, + NAME = 1, + FEATURES = 2, + KEYS = 3, + VALUES = 4, + EXTENT = 5 +}; + +enum FeatureType : std::uint32_t +{ + ID = 1, + TAGS = 2, + TYPE = 3, + GEOMETRY = 4, + RASTER = 5 +}; + +enum ValueType : std::uint32_t +{ + STRING = 1, + FLOAT = 2, + DOUBLE = 3, + INT = 4, + UINT = 5, + SINT = 6, + BOOL = 7 +}; + +enum GeomType : std::uint8_t +{ + UNKNOWN = 0, + POINT = 1, + LINESTRING = 2, + POLYGON = 3 +}; + +enum CommandType : std::uint8_t +{ + END = 0, + MOVE_TO = 1, + LINE_TO = 2, + CLOSE = 7 +}; + + +} } diff --git a/src/3rdparty/mapbox-gl-native/deps/vector-tile/1.0.2/include/mapbox/vector_tile/version.hpp b/src/3rdparty/mapbox-gl-native/deps/vector-tile/1.0.2/include/mapbox/vector_tile/version.hpp new file mode 100644 index 0000000..cc1974d --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/vector-tile/1.0.2/include/mapbox/vector_tile/version.hpp @@ -0,0 +1,16 @@ +#pragma once + +/// The major version number +#define VECTOR_TILE_VERSION_MAJOR 1 + +/// The minor version number +#define VECTOR_TILE_VERSION_MINOR 0 + +/// The patch number +#define VECTOR_TILE_VERSION_PATCH 2 + +/// The complete version number +#define VECTOR_TILE_VERSION_CODE (VECTOR_TILE_VERSION_MAJOR * 10000 + VECTOR_TILE_VERSION_MINOR * 100 + VECTOR_TILE_VERSION_PATCH) + +/// Version number as string +#define VECTOR_TILE_VERSION_STRING "1.0.2" diff --git a/src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/active_bound_list.hpp b/src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/active_bound_list.hpp new file mode 100644 index 0000000..153a365 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/active_bound_list.hpp @@ -0,0 +1,406 @@ +#pragma once + +#ifdef DEBUG +#include +#include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace mapbox { +namespace geometry { +namespace wagyu { + +template +using active_bound_list = std::vector>; + +template +using active_bound_list_itr = typename active_bound_list::iterator; + +template +using active_bound_list_rev_itr = typename active_bound_list::reverse_iterator; + +#ifdef DEBUG + +template +inline std::basic_ostream& operator<<(std::basic_ostream& out, + const active_bound_list& bnds) { + std::size_t c = 0; + for (auto const& bnd : bnds) { + out << "Index: " << c++ << std::endl; + out << *bnd; + } + return out; +} + +template +std::string output_edges(active_bound_list const& bnds) { + std::ostringstream out; + out << "["; + bool first = true; + for (auto const& bnd : bnds) { + if (first) { + first = false; + } else { + out << ","; + } + out << "[[" << bnd->current_edge->bot.x << "," << bnd->current_edge->bot.y << "],["; + out << bnd->current_edge->top.x << "," << bnd->current_edge->top.y << "]]"; + } + out << "]"; + return out.str(); +} + +#endif + +template +bool is_even_odd_fill_type(bound const& bound, + fill_type subject_fill_type, + fill_type clip_fill_type) { + if (bound.poly_type == polygon_type_subject) { + return subject_fill_type == fill_type_even_odd; + } else { + return clip_fill_type == fill_type_even_odd; + } +} + +template +bool is_even_odd_alt_fill_type(bound const& bound, + fill_type subject_fill_type, + fill_type clip_fill_type) { + if (bound.poly_type == polygon_type_subject) { + return clip_fill_type == fill_type_even_odd; + } else { + return subject_fill_type == fill_type_even_odd; + } +} + +template +struct bound_insert_location { + + bound const& bound2; + + bound_insert_location(bound const& b) : bound2(b) { + } + + bool operator()(bound_ptr const& b) { + auto const& bound1 = *b; + if (values_are_equal(bound2.current_x, bound1.current_x)) { + if (bound2.current_edge->top.y > bound1.current_edge->top.y) { + return static_cast(bound2.current_edge->top.x) < + get_current_x(*(bound1.current_edge), bound2.current_edge->top.y); + } else { + return static_cast(bound1.current_edge->top.x) > + get_current_x(*(bound2.current_edge), bound1.current_edge->top.y); + } + } else { + return bound2.current_x < bound1.current_x; + } + } +}; + +template +active_bound_list_itr +insert_bound_into_ABL(bound& left, bound& right, active_bound_list& active_bounds) { + + auto itr = + std::find_if(active_bounds.begin(), active_bounds.end(), bound_insert_location(left)); + return active_bounds.insert(itr, { &left, &right }); +} + +template +inline bool is_maxima(bound& bnd, T y) { + return bnd.next_edge == bnd.edges.end() && bnd.current_edge->top.y == y; +} + +template +inline bool is_maxima(active_bound_list_itr& bnd, T y) { + return is_maxima(*(*bnd), y); +} + +template +inline bool is_intermediate(bound& bnd, T y) { + return bnd.next_edge != bnd.edges.end() && bnd.current_edge->top.y == y; +} + +template +inline bool is_intermediate(active_bound_list_itr& bnd, T y) { + return is_intermediate(*(*bnd), y); +} + +template +inline bool current_edge_is_horizontal(active_bound_list_itr& bnd) { + return is_horizontal(*((*bnd)->current_edge)); +} + +template +inline bool next_edge_is_horizontal(active_bound_list_itr& bnd) { + return is_horizontal(*((*bnd)->next_edge)); +} + +template +void next_edge_in_bound(bound& bnd, scanbeam_list& scanbeam) { + auto& current_edge = bnd.current_edge; + ++current_edge; + if (current_edge != bnd.edges.end()) { + ++(bnd.next_edge); + bnd.current_x = static_cast(current_edge->bot.x); + if (!is_horizontal(*current_edge)) { + scanbeam.push_back(current_edge->top.y); + } + } +} + +template +active_bound_list_itr get_maxima_pair(active_bound_list_itr const& bnd, + active_bound_list& active_bounds) { + bound_ptr maximum = (*bnd)->maximum_bound; + return std::find(active_bounds.begin(), active_bounds.end(), maximum); +} + +template +void set_winding_count(active_bound_list_itr& bnd_itr, + active_bound_list& active_bounds, + fill_type subject_fill_type, + fill_type clip_fill_type) { + + auto rev_bnd_itr = active_bound_list_rev_itr(bnd_itr); + if (rev_bnd_itr == active_bounds.rend()) { + (*bnd_itr)->winding_count = (*bnd_itr)->winding_delta; + (*bnd_itr)->winding_count2 = 0; + return; + } + + // find the edge of the same polytype that immediately preceeds 'edge' in + // AEL + while (rev_bnd_itr != active_bounds.rend() && + (*rev_bnd_itr)->poly_type != (*bnd_itr)->poly_type) { + ++rev_bnd_itr; + } + if (rev_bnd_itr == active_bounds.rend()) { + (*bnd_itr)->winding_count = (*bnd_itr)->winding_delta; + (*bnd_itr)->winding_count2 = 0; + } else if (is_even_odd_fill_type(*(*bnd_itr), subject_fill_type, clip_fill_type)) { + // EvenOdd filling ... + (*bnd_itr)->winding_count = (*bnd_itr)->winding_delta; + (*bnd_itr)->winding_count2 = (*rev_bnd_itr)->winding_count2; + } else { + // nonZero, Positive or Negative filling ... + if ((*rev_bnd_itr)->winding_count * (*rev_bnd_itr)->winding_delta < 0) { + // prev edge is 'decreasing' WindCount (WC) toward zero + // so we're outside the previous polygon ... + if (std::abs(static_cast((*rev_bnd_itr)->winding_count)) > 1) { + // outside prev poly but still inside another. + // when reversing direction of prev poly use the same WC + if ((*rev_bnd_itr)->winding_delta * (*bnd_itr)->winding_delta < 0) { + (*bnd_itr)->winding_count = (*rev_bnd_itr)->winding_count; + } else { + // otherwise continue to 'decrease' WC ... + (*bnd_itr)->winding_count = + (*rev_bnd_itr)->winding_count + (*bnd_itr)->winding_delta; + } + } else { + // now outside all polys of same polytype so set own WC ... + (*bnd_itr)->winding_count = (*bnd_itr)->winding_delta; + } + } else { + // prev edge is 'increasing' WindCount (WC) away from zero + // so we're inside the previous polygon ... + if ((*rev_bnd_itr)->winding_delta * (*bnd_itr)->winding_delta < 0) { + // if wind direction is reversing prev then use same WC + (*bnd_itr)->winding_count = (*rev_bnd_itr)->winding_count; + } else { + // otherwise add to WC ... + (*bnd_itr)->winding_count = + (*rev_bnd_itr)->winding_count + (*bnd_itr)->winding_delta; + } + } + (*bnd_itr)->winding_count2 = (*rev_bnd_itr)->winding_count2; + } + + // update winding_count2 ... + auto bnd_itr_forward = rev_bnd_itr.base(); + if (is_even_odd_alt_fill_type(*(*bnd_itr), subject_fill_type, clip_fill_type)) { + // EvenOdd filling ... + while (bnd_itr_forward != bnd_itr) { + (*bnd_itr)->winding_count2 = ((*bnd_itr)->winding_count2 == 0 ? 1 : 0); + ++bnd_itr_forward; + } + } else { + // nonZero, Positive or Negative filling ... + while (bnd_itr_forward != bnd_itr) { + (*bnd_itr)->winding_count2 += (*bnd_itr_forward)->winding_delta; + ++bnd_itr_forward; + } + } +} + +template +bool is_contributing(bound const& bnd, + clip_type cliptype, + fill_type subject_fill_type, + fill_type clip_fill_type) { + fill_type pft = subject_fill_type; + fill_type pft2 = clip_fill_type; + if (bnd.poly_type != polygon_type_subject) { + pft = clip_fill_type; + pft2 = subject_fill_type; + } + + switch (pft) { + case fill_type_even_odd: + break; + case fill_type_non_zero: + if (std::abs(static_cast(bnd.winding_count)) != 1) { + return false; + } + break; + case fill_type_positive: + if (bnd.winding_count != 1) { + return false; + } + break; + case fill_type_negative: + default: + if (bnd.winding_count != -1) { + return false; + } + } + + switch (cliptype) { + case clip_type_intersection: + switch (pft2) { + case fill_type_even_odd: + case fill_type_non_zero: + return (bnd.winding_count2 != 0); + case fill_type_positive: + return (bnd.winding_count2 > 0); + case fill_type_negative: + default: + return (bnd.winding_count2 < 0); + } + break; + case clip_type_union: + switch (pft2) { + case fill_type_even_odd: + case fill_type_non_zero: + return (bnd.winding_count2 == 0); + case fill_type_positive: + return (bnd.winding_count2 <= 0); + case fill_type_negative: + default: + return (bnd.winding_count2 >= 0); + } + break; + case clip_type_difference: + if (bnd.poly_type == polygon_type_subject) { + switch (pft2) { + case fill_type_even_odd: + case fill_type_non_zero: + return (bnd.winding_count2 == 0); + case fill_type_positive: + return (bnd.winding_count2 <= 0); + case fill_type_negative: + default: + return (bnd.winding_count2 >= 0); + } + } else { + switch (pft2) { + case fill_type_even_odd: + case fill_type_non_zero: + return (bnd.winding_count2 != 0); + case fill_type_positive: + return (bnd.winding_count2 > 0); + case fill_type_negative: + default: + return (bnd.winding_count2 < 0); + } + } + break; + case clip_type_x_or: + return true; + break; + default: + return true; + } +} + +template +void insert_lm_left_and_right_bound(bound& left_bound, + bound& right_bound, + active_bound_list& active_bounds, + ring_manager& rings, + scanbeam_list& scanbeam, + clip_type cliptype, + fill_type subject_fill_type, + fill_type clip_fill_type) { + + // Both left and right bound + auto lb_abl_itr = insert_bound_into_ABL(left_bound, right_bound, active_bounds); + auto rb_abl_itr = std::next(lb_abl_itr); + set_winding_count(lb_abl_itr, active_bounds, subject_fill_type, clip_fill_type); + (*rb_abl_itr)->winding_count = (*lb_abl_itr)->winding_count; + (*rb_abl_itr)->winding_count2 = (*lb_abl_itr)->winding_count2; + if (is_contributing(left_bound, cliptype, subject_fill_type, clip_fill_type)) { + add_local_minimum_point(*(*lb_abl_itr), *(*rb_abl_itr), active_bounds, + (*lb_abl_itr)->current_edge->bot, rings); + } + + // Add top of edges to scanbeam + scanbeam.push_back((*lb_abl_itr)->current_edge->top.y); + + if (!current_edge_is_horizontal(rb_abl_itr)) { + scanbeam.push_back((*rb_abl_itr)->current_edge->top.y); + } +} + +template +void insert_local_minima_into_ABL(T const bot_y, + local_minimum_ptr_list const& minima_sorted, + local_minimum_ptr_list_itr& current_lm, + active_bound_list& active_bounds, + ring_manager& rings, + scanbeam_list& scanbeam, + clip_type cliptype, + fill_type subject_fill_type, + fill_type clip_fill_type) { + while (current_lm != minima_sorted.end() && bot_y == (*current_lm)->y) { + initialize_lm(current_lm); + auto& left_bound = (*current_lm)->left_bound; + auto& right_bound = (*current_lm)->right_bound; + insert_lm_left_and_right_bound(left_bound, right_bound, active_bounds, rings, scanbeam, + cliptype, subject_fill_type, clip_fill_type); + ++current_lm; + } +} + +template +void insert_horizontal_local_minima_into_ABL(T const top_y, + local_minimum_ptr_list const& minima_sorted, + local_minimum_ptr_list_itr& current_lm, + active_bound_list& active_bounds, + ring_manager& rings, + scanbeam_list& scanbeam, + clip_type cliptype, + fill_type subject_fill_type, + fill_type clip_fill_type) { + while (current_lm != minima_sorted.end() && top_y == (*current_lm)->y && + (*current_lm)->minimum_has_horizontal) { + initialize_lm(current_lm); + auto& left_bound = (*current_lm)->left_bound; + auto& right_bound = (*current_lm)->right_bound; + insert_lm_left_and_right_bound(left_bound, right_bound, active_bounds, rings, scanbeam, + cliptype, subject_fill_type, clip_fill_type); + ++current_lm; + } +} +} +} +} diff --git a/src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/bound.hpp b/src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/bound.hpp new file mode 100644 index 0000000..3028e08 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/bound.hpp @@ -0,0 +1,101 @@ +#pragma once + +#include + +#include + +#include +#include +#include + +#ifdef DEBUG +#include +#endif + +namespace mapbox { +namespace geometry { +namespace wagyu { + +template +struct bound { + + edge_list edges; + edge_list_itr current_edge; + edge_list_itr next_edge; + mapbox::geometry::point last_point; + ring_ptr ring; + bound_ptr maximum_bound; // the bound who's maximum connects with this bound + double current_x; + std::size_t pos; + std::int32_t winding_count; + std::int32_t winding_count2; // winding count of the opposite polytype + std::int8_t winding_delta; // 1 or -1 depending on winding direction - 0 for linestrings + polygon_type poly_type; + edge_side side; // side only refers to current side of solution poly + + bound() noexcept + : edges(), + current_edge(edges.end()), + next_edge(edges.end()), + last_point({ 0, 0 }), + ring(nullptr), + maximum_bound(nullptr), + current_x(0.0), + pos(0), + winding_count(0), + winding_count2(0), + winding_delta(0), + poly_type(polygon_type_subject), + side(edge_left) { + } + + bound(bound&& b) noexcept + : edges(std::move(b.edges)), + current_edge(std::move(b.current_edge)), + next_edge(std::move(b.next_edge)), + last_point(std::move(b.last_point)), + ring(std::move(b.ring)), + maximum_bound(std::move(b.maximum_bound)), + current_x(std::move(b.current_x)), + pos(std::move(b.pos)), + winding_count(std::move(b.winding_count)), + winding_count2(std::move(b.winding_count2)), + winding_delta(std::move(b.winding_delta)), + poly_type(std::move(b.poly_type)), + side(std::move(b.side)) { + } + + bound(boundconst& b) = delete; + bound& operator=(bound const&) = delete; + +}; + +#ifdef DEBUG + +template +inline std::basic_ostream& operator<<(std::basic_ostream& out, + const bound& bnd) { + out << " Bound: " << &bnd << std::endl; + out << " current_x: " << bnd.current_x << std::endl; + out << " last_point: " << bnd.last_point.x << ", " << bnd.last_point.y << std::endl; + out << *(bnd.current_edge); + out << " winding count: " << bnd.winding_count << std::endl; + out << " winding_count2: " << bnd.winding_count2 << std::endl; + out << " winding_delta: " << static_cast(bnd.winding_delta) << std::endl; + out << " maximum_bound: " << bnd.maximum_bound << std::endl; + if (bnd.side == edge_left) { + out << " side: left" << std::endl; + } else { + out << " side: right" << std::endl; + } + out << " ring: " << bnd.ring << std::endl; + if (bnd.ring) { + out << " ring index: " << bnd.ring->ring_index << std::endl; + } + return out; +} + +#endif +} +} +} diff --git a/src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/bubble_sort.hpp b/src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/bubble_sort.hpp new file mode 100644 index 0000000..8cfedd6 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/bubble_sort.hpp @@ -0,0 +1,28 @@ +#pragma once + +namespace mapbox { +namespace geometry { +namespace wagyu { + +template +void bubble_sort(It begin, It end, Compare c, MethodOnSwap m) { + if (begin == end) { + return; + } + bool modified = false; + auto last = end - 1; + do { + modified = false; + for (auto itr = begin; itr != last; ++itr) { + auto next = std::next(itr); + if (!c(*itr, *next)) { + m(*itr, *next); + std::iter_swap(itr, next); + modified = true; + } + } + } while (modified); +} +} +} +} diff --git a/src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/build_edges.hpp b/src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/build_edges.hpp new file mode 100644 index 0000000..07cc92b --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/build_edges.hpp @@ -0,0 +1,186 @@ +#pragma once + +#include +#include +#include + +#include +#include +#include + +namespace mapbox { +namespace geometry { +namespace wagyu { + +template +bool point_2_is_between_point_1_and_point_3(mapbox::geometry::point const& pt1, + mapbox::geometry::point const& pt2, + mapbox::geometry::point const& pt3) { + if ((pt1 == pt3) || (pt1 == pt2) || (pt3 == pt2)) { + return false; + } else if (pt1.x != pt3.x) { + return (pt2.x > pt1.x) == (pt2.x < pt3.x); + } else { + return (pt2.y > pt1.y) == (pt2.y < pt3.y); + } +} + +template +bool build_edge_list(mapbox::geometry::linear_ring const& path_geometry, edge_list& edges) { + + if (path_geometry.size() < 3) { + return false; + } + + // As this is a loop, we need to first go backwards from end to try and find + // the proper starting point for the iterators before the beginning + + auto itr_rev = path_geometry.rbegin(); + auto itr = path_geometry.begin(); + mapbox::geometry::point pt1 = *itr_rev; + mapbox::geometry::point pt2 = *itr; + + // Find next non repeated point going backwards from + // end for pt1 + while (pt1 == pt2) { + ++itr_rev; + if (itr_rev == path_geometry.rend()) { + return false; + } + pt1 = *itr_rev; + } + ++itr; + mapbox::geometry::point pt3 = *itr; + auto itr_last = itr_rev.base(); + mapbox::geometry::point front_pt; + mapbox::geometry::point back_pt; + while (true) { + if (pt3 == pt2) { + // Duplicate point advance itr, but do not + // advance other points + if (itr == itr_last) { + break; + } + ++itr; + if (itr == itr_last) { + if (edges.empty()) { + break; + } + pt3 = front_pt; + } else { + pt3 = *itr; + } + continue; + } + + // Now check if slopes are equal between two segments - either + // a spike or a collinear point - if so drop point number 2. + if (slopes_equal(pt1, pt2, pt3)) { + // We need to reconsider previously added points + // because the point it was using was found to be collinear + // or a spike + pt2 = pt1; + if (!edges.empty()) { + edges.pop_back(); // remove previous edge (pt1) + } + if (!edges.empty()) { + auto const& back_top = edges.back().top; + if (static_cast(back_pt.x) == back_top.x && + static_cast(back_pt.y) == back_top.y) { + auto const& back_bot = edges.back().bot; + pt1 = mapbox::geometry::point(static_cast(back_bot.x), + static_cast(back_bot.y)); + } else { + pt1 = mapbox::geometry::point(static_cast(back_top.x), + static_cast(back_top.y)); + } + back_pt = pt1; + } else { + // If this occurs we must look to the back of the + // ring for new points. + while (*itr_rev == pt2) { + ++itr_rev; + if ((itr + 1) == itr_rev.base()) { + return false; + } + } + pt1 = *itr_rev; + itr_last = itr_rev.base(); + } + continue; + } + + if (edges.empty()) { + front_pt = pt2; + } + edges.emplace_back(pt2, pt3); + back_pt = pt2; + if (itr == itr_last) { + break; + } + pt1 = pt2; + pt2 = pt3; + ++itr; + if (itr == itr_last) { + if (edges.empty()) { + break; + } + pt3 = front_pt; + } else { + pt3 = *itr; + } + } + + bool modified = false; + do { + modified = false; + if (edges.size() < 3) { + return false; + } + auto& f = edges.front(); + auto& b = edges.back(); + if (slopes_equal(f, b)) { + if (f.bot == b.top) { + if (f.top == b.bot) { + edges.pop_back(); + edges.erase(edges.begin()); + } else { + f.bot = b.bot; + edges.pop_back(); + } + modified = true; + } else if (f.top == b.bot) { + f.top = b.top; + edges.pop_back(); + modified = true; + } else if (f.top == b.top && f.bot == b.bot) { + edges.pop_back(); + edges.erase(edges.begin()); + modified = true; + } else if (f.top == b.top) { + if (point_2_is_between_point_1_and_point_3(f.top, f.bot, b.bot)) { + b.top = f.bot; + edges.erase(edges.begin()); + } else { + f.top = b.bot; + edges.pop_back(); + } + modified = true; + } else if (f.bot == b.bot) { + if (point_2_is_between_point_1_and_point_3(f.bot, f.top, b.top)) { + b.bot = f.top; + edges.erase(edges.begin()); + } else { + f.bot = b.top; + edges.pop_back(); + } + modified = true; + } + } + } while (modified); + + return true; +} +} +} +} diff --git a/src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/build_local_minima_list.hpp b/src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/build_local_minima_list.hpp new file mode 100644 index 0000000..8227383 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/build_local_minima_list.hpp @@ -0,0 +1,26 @@ +#pragma once + +#include +#include +#include +#include + +namespace mapbox { +namespace geometry { +namespace wagyu { + +template +bool add_linear_ring(mapbox::geometry::linear_ring const& path_geometry, + local_minimum_list& minima_list, + polygon_type p_type) { + edge_list new_edges; + new_edges.reserve(path_geometry.size()); + if (!build_edge_list(path_geometry, new_edges) || new_edges.empty()) { + return false; + } + add_ring_to_local_minima_list(new_edges, minima_list, p_type); + return true; +} +} +} +} diff --git a/src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/build_result.hpp b/src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/build_result.hpp new file mode 100644 index 0000000..a5f6155 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/build_result.hpp @@ -0,0 +1,72 @@ +#pragma once + +#include +#include + +#include + +namespace mapbox { +namespace geometry { +namespace wagyu { + +template +void push_ring_to_polygon(mapbox::geometry::polygon& poly, + ring_ptr r, + bool reverse_output) { + mapbox::geometry::linear_ring lr; + lr.reserve(r->size() + 1); + auto firstPt = r->points; + auto ptIt = r->points; + if (reverse_output) { + do { + lr.emplace_back(static_cast(ptIt->x), static_cast(ptIt->y)); + ptIt = ptIt->next; + } while (ptIt != firstPt); + } else { + do { + lr.emplace_back(static_cast(ptIt->x), static_cast(ptIt->y)); + ptIt = ptIt->prev; + } while (ptIt != firstPt); + } + lr.emplace_back(firstPt->x, firstPt->y); // close the ring + poly.push_back(lr); +} + +template +void build_result_polygons(mapbox::geometry::multi_polygon& solution, + ring_vectorconst& rings, + bool reverse_output) { + for (auto r : rings) { + if (r == nullptr) { + continue; + } + assert(r->points); + solution.emplace_back(); + push_ring_to_polygon(solution.back(), r, reverse_output); + for (auto c : r->children) { + if (c == nullptr) { + continue; + } + assert(c->points); + push_ring_to_polygon(solution.back(), c, reverse_output); + } + for (auto c : r->children) { + if (c == nullptr) { + continue; + } + if (!c->children.empty()) { + build_result_polygons(solution, c->children, reverse_output); + } + } + } +} + +template +void build_result(mapbox::geometry::multi_polygon& solution, + ring_managerconst& rings, + bool reverse_output) { + build_result_polygons(solution, rings.children, reverse_output); +} +} +} +} diff --git a/src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/config.hpp b/src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/config.hpp new file mode 100644 index 0000000..babff2a --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/config.hpp @@ -0,0 +1,53 @@ +#pragma once + +#include +#include +#include +#include + +namespace mapbox { +namespace geometry { +namespace wagyu { + +enum clip_type : std::uint8_t { + clip_type_intersection = 0, + clip_type_union, + clip_type_difference, + clip_type_x_or +}; + +enum polygon_type : std::uint8_t { polygon_type_subject = 0, polygon_type_clip }; + +enum fill_type : std::uint8_t { + fill_type_even_odd = 0, + fill_type_non_zero, + fill_type_positive, + fill_type_negative +}; + +static double const def_arc_tolerance = 0.25; + +static int const EDGE_UNASSIGNED = -1; // edge not currently 'owning' a solution +static int const EDGE_SKIP = -2; // edge that would otherwise close a path +static std::int64_t const LOW_RANGE = 0x3FFFFFFF; +static std::int64_t const HIGH_RANGE = 0x3FFFFFFFFFFFFFFFLL; + +enum horizontal_direction : std::uint8_t { right_to_left = 0, left_to_right = 1 }; + +enum edge_side : std::uint8_t { edge_left = 0, edge_right }; + +enum join_type : std::uint8_t { join_type_square = 0, join_type_round, join_type_miter }; + +enum end_type { + end_type_closed_polygon = 0, + end_type_closed_line, + end_type_open_butt, + end_type_open_square, + end_type_open_round +}; + +template +using maxima_list = std::list; +} +} +} diff --git a/src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/edge.hpp b/src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/edge.hpp new file mode 100644 index 0000000..855f3f0 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/edge.hpp @@ -0,0 +1,123 @@ +#pragma once + +#include +#include +#include + +#include +#include +#include + +#ifdef DEBUG +#include +#endif + +namespace mapbox { +namespace geometry { +namespace wagyu { + +template +struct bound; + +template +using bound_ptr = bound*; + +template +struct edge { + mapbox::geometry::point bot; + mapbox::geometry::point top; + double dx; + + edge(edge&& e) noexcept : bot(std::move(e.bot)), top(std::move(e.top)), dx(std::move(e.dx)) { + } + + edge& operator=(edge&& e) noexcept { + bot = std::move(e.bot); + top = std::move(e.top); + dx = std::move(e.dx); + return *this; + } + + template + edge(mapbox::geometry::point const& current, + mapbox::geometry::point const& next_pt) noexcept + : bot(static_cast(current.x), static_cast(current.y)), + top(static_cast(current.x), static_cast(current.y)), + dx(0.0) { + if (current.y >= next_pt.y) { + top = mapbox::geometry::point(static_cast(next_pt.x), static_cast(next_pt.y)); + } else { + bot = mapbox::geometry::point(static_cast(next_pt.x), static_cast(next_pt.y)); + } + double dy = static_cast(top.y - bot.y); + if (value_is_zero(dy)) { + dx = std::numeric_limits::infinity(); + } else { + dx = static_cast(top.x - bot.x) / dy; + } + } +}; + +template +using edge_ptr = edge*; + +template +using edge_list = std::vector>; + +template +using edge_list_itr = typename edge_list::iterator; + +template +bool slopes_equal(edge const& e1, edge const& e2) { + return (e1.top.y - e1.bot.y) * (e2.top.x - e2.bot.x) == + (e1.top.x - e1.bot.x) * (e2.top.y - e2.bot.y); +} + +template +inline bool is_horizontal(edge const& e) { + return std::isinf(e.dx); +} + +template +inline double get_current_x(edge const& edge, const T current_y) { + if (current_y == edge.top.y) { + return static_cast(edge.top.x); + } else { + return static_cast(edge.bot.x) + + edge.dx * static_cast(current_y - edge.bot.y); + } +} + +#ifdef DEBUG + +template +inline std::basic_ostream& operator<<(std::basic_ostream& out, + const edge& e) { + out << " Edge: " << std::endl; + out << " bot x: " << e.bot.x << " y: " << e.bot.y << std::endl; + out << " top x: " << e.top.x << " y: " << e.top.y << std::endl; + return out; +} + +template +inline std::basic_ostream& operator<<(std::basic_ostream& out, + edge_list const& edges) { + out << "["; + bool first = true; + for (auto const& e : edges) { + if (first) { + first = false; + } else { + out << ","; + } + out << "[[" << e.bot.x << "," << e.bot.y << "],["; + out << e.top.x << "," << e.top.y << "]]"; + } + out << "]"; + return out; +} + +#endif +} +} +} diff --git a/src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/intersect.hpp b/src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/intersect.hpp new file mode 100644 index 0000000..f9fbfd9 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/intersect.hpp @@ -0,0 +1,72 @@ +#pragma once + +#include + +#include + +#include + +#ifdef DEBUG +#include +#endif + +namespace mapbox { +namespace geometry { +namespace wagyu { + +template +struct intersect_node { + + bound_ptr bound1; + bound_ptr bound2; + mapbox::geometry::point pt; + + intersect_node(intersect_node&& n) + : bound1(std::move(n.bound1)), bound2(std::move(n.bound2)), pt(std::move(n.pt)) { + } + + intersect_node& operator=(intersect_node&& n) { + bound1 = std::move(n.bound1); + bound2 = std::move(n.bound2); + pt = std::move(n.pt); + return *this; + } + + intersect_node(bound_ptr const& bound1_, + bound_ptr const& bound2_, + mapbox::geometry::point const& pt_) + : bound1(bound1_), bound2(bound2_), pt(pt_) { + } +}; + +template +using intersect_list = std::vector>; + +#ifdef DEBUG + +template +inline std::basic_ostream& operator<<(std::basic_ostream& out, + const intersect_node& e) { + out << " point x: " << e.pt.x << " y: " << e.pt.y << std::endl; + out << " bound 1: " << std::endl; + out << *e.bound1 << std::endl; + out << " bound 2: " << std::endl; + out << *e.bound2 << std::endl; + return out; +} + +template +inline std::basic_ostream& operator<<(std::basic_ostream& out, + const intersect_list& ints) { + std::size_t c = 0; + for (auto const& i : ints) { + out << "Intersection: " << c++ << std::endl; + out << i; + } + return out; +} + +#endif +} +} +} diff --git a/src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/intersect_util.hpp b/src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/intersect_util.hpp new file mode 100644 index 0000000..4608f3b --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/intersect_util.hpp @@ -0,0 +1,372 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include + +#include + +namespace mapbox { +namespace geometry { +namespace wagyu { + +template +struct intersect_list_sorter { + inline bool operator()(intersect_node const& node1, intersect_node const& node2) { + if (!values_are_equal(node2.pt.y, node1.pt.y)) { + return node2.pt.y < node1.pt.y; + } else { + return (node2.bound1->winding_count2 + node2.bound2->winding_count2) > + (node1.bound1->winding_count2 + node1.bound2->winding_count2); + } + } +}; + +template +inline mapbox::geometry::point round_point(mapbox::geometry::point const& pt) { + return mapbox::geometry::point(round_towards_max(pt.x), round_towards_max(pt.y)); +} + +template +inline void swap_rings(bound& b1, bound& b2) { + ring_ptr ring = b1.ring; + b1.ring = b2.ring; + b2.ring = ring; +} + +template +inline void swap_sides(bound& b1, bound& b2) { + edge_side side = b1.side; + b1.side = b2.side; + b2.side = side; +} + +template +bool get_edge_intersection(edge const& e1, + edge const& e2, + mapbox::geometry::point& pt) { + T2 p0_x = static_cast(e1.bot.x); + T2 p0_y = static_cast(e1.bot.y); + T2 p1_x = static_cast(e1.top.x); + T2 p1_y = static_cast(e1.top.y); + T2 p2_x = static_cast(e2.bot.x); + T2 p2_y = static_cast(e2.bot.y); + T2 p3_x = static_cast(e2.top.x); + T2 p3_y = static_cast(e2.top.y); + T2 s1_x, s1_y, s2_x, s2_y; + s1_x = p1_x - p0_x; + s1_y = p1_y - p0_y; + s2_x = p3_x - p2_x; + s2_y = p3_y - p2_y; + + T2 s = (-s1_y * (p0_x - p2_x) + s1_x * (p0_y - p2_y)) / (-s2_x * s1_y + s1_x * s2_y); + T2 t = (s2_x * (p0_y - p2_y) - s2_y * (p0_x - p2_x)) / (-s2_x * s1_y + s1_x * s2_y); + + if (s >= 0.0 && s <= 1.0 && t >= 0.0 && t <= 1.0) { + pt.x = p0_x + (t * s1_x); + pt.y = p0_y + (t * s1_y); + return true; + } + // LCOV_EXCL_START + return false; + // LCOV_EXCL_END +} + +template +struct intersection_compare { + bool operator()(bound_ptr const& b1, bound_ptr const& b2) { + return !(b1->current_x > b2->current_x && + !slopes_equal(*(b1->current_edge), *(b2->current_edge))); + } +}; + +template +struct on_intersection_swap { + + intersect_list& intersects; + + on_intersection_swap(intersect_list& i) : intersects(i) { + } + + void operator()(bound_ptr const& b1, bound_ptr const& b2) { + mapbox::geometry::point pt; + if (!get_edge_intersection(*(b1->current_edge), *(b2->current_edge), pt)) { + // LCOV_EXCL_START + throw std::runtime_error("Trying to find intersection of lines that do not intersect"); + // LCOV_EXCL_END + } + intersects.emplace_back(b1, b2, pt); + } +}; + +template +void build_intersect_list(active_bound_list& active_bounds, intersect_list& intersects) { + bubble_sort(active_bounds.begin(), active_bounds.end(), intersection_compare(), + on_intersection_swap(intersects)); +} + +template +void intersect_bounds(bound& b1, + bound& b2, + mapbox::geometry::point const& pt, + clip_type cliptype, + fill_type subject_fill_type, + fill_type clip_fill_type, + ring_manager& rings, + active_bound_list& active_bounds) { + bool b1Contributing = (b1.ring != nullptr); + bool b2Contributing = (b2.ring != nullptr); + + // update winding counts... + // assumes that b1 will be to the Right of b2 ABOVE the intersection + if (b1.poly_type == b2.poly_type) { + if (is_even_odd_fill_type(b1, subject_fill_type, clip_fill_type)) { + std::swap(b1.winding_count, b2.winding_count); + } else { + if (b1.winding_count + b2.winding_delta == 0) { + b1.winding_count = -b1.winding_count; + } else { + b1.winding_count += b2.winding_delta; + } + if (b2.winding_count - b1.winding_delta == 0) { + b2.winding_count = -b2.winding_count; + } else { + b2.winding_count -= b1.winding_delta; + } + } + } else { + if (!is_even_odd_fill_type(b2, subject_fill_type, clip_fill_type)) { + b1.winding_count2 += b2.winding_delta; + } else { + b1.winding_count2 = (b1.winding_count2 == 0) ? 1 : 0; + } + if (!is_even_odd_fill_type(b1, subject_fill_type, clip_fill_type)) { + b2.winding_count2 -= b1.winding_delta; + } else { + b2.winding_count2 = (b2.winding_count2 == 0) ? 1 : 0; + } + } + + fill_type b1FillType, b2FillType, b1FillType2, b2FillType2; + if (b1.poly_type == polygon_type_subject) { + b1FillType = subject_fill_type; + b1FillType2 = clip_fill_type; + } else { + b1FillType = clip_fill_type; + b1FillType2 = subject_fill_type; + } + if (b2.poly_type == polygon_type_subject) { + b2FillType = subject_fill_type; + b2FillType2 = clip_fill_type; + } else { + b2FillType = clip_fill_type; + b2FillType2 = subject_fill_type; + } + + std::int32_t b1Wc, b2Wc; + switch (b1FillType) { + case fill_type_positive: + b1Wc = b1.winding_count; + break; + case fill_type_negative: + b1Wc = -b1.winding_count; + break; + case fill_type_even_odd: + case fill_type_non_zero: + default: + b1Wc = std::abs(static_cast(b1.winding_count)); + } + switch (b2FillType) { + case fill_type_positive: + b2Wc = b2.winding_count; + break; + case fill_type_negative: + b2Wc = -b2.winding_count; + break; + case fill_type_even_odd: + case fill_type_non_zero: + default: + b2Wc = std::abs(static_cast(b2.winding_count)); + } + if (b1Contributing && b2Contributing) { + if ((b1Wc != 0 && b1Wc != 1) || (b2Wc != 0 && b2Wc != 1) || + (b1.poly_type != b2.poly_type && cliptype != clip_type_x_or)) { + add_local_maximum_point(b1, b2, pt, rings, active_bounds); + } else { + add_point(b1, active_bounds, pt, rings); + add_point(b2, active_bounds, pt, rings); + swap_sides(b1, b2); + swap_rings(b1, b2); + } + } else if (b1Contributing) { + if (b2Wc == 0 || b2Wc == 1) { + add_point(b1, active_bounds, pt, rings); + b2.last_point = pt; + swap_sides(b1, b2); + swap_rings(b1, b2); + } + } else if (b2Contributing) { + if (b1Wc == 0 || b1Wc == 1) { + b1.last_point = pt; + add_point(b2, active_bounds, pt, rings); + swap_sides(b1, b2); + swap_rings(b1, b2); + } + } else if ((b1Wc == 0 || b1Wc == 1) && (b2Wc == 0 || b2Wc == 1)) { + // neither bound is currently contributing ... + + std::int32_t b1Wc2, b2Wc2; + switch (b1FillType2) { + case fill_type_positive: + b1Wc2 = b1.winding_count2; + break; + case fill_type_negative: + b1Wc2 = -b1.winding_count2; + break; + case fill_type_even_odd: + case fill_type_non_zero: + default: + b1Wc2 = std::abs(static_cast(b1.winding_count2)); + } + switch (b2FillType2) { + case fill_type_positive: + b2Wc2 = b2.winding_count2; + break; + case fill_type_negative: + b2Wc2 = -b2.winding_count2; + break; + case fill_type_even_odd: + case fill_type_non_zero: + default: + b2Wc2 = std::abs(static_cast(b2.winding_count2)); + } + + if (b1.poly_type != b2.poly_type) { + add_local_minimum_point(b1, b2, active_bounds, pt, rings); + } else if (b1Wc == 1 && b2Wc == 1) { + switch (cliptype) { + case clip_type_intersection: + if (b1Wc2 > 0 && b2Wc2 > 0) { + add_local_minimum_point(b1, b2, active_bounds, pt, rings); + } + break; + default: + case clip_type_union: + if (b1Wc2 <= 0 && b2Wc2 <= 0) { + add_local_minimum_point(b1, b2, active_bounds, pt, rings); + } + break; + case clip_type_difference: + if (((b1.poly_type == polygon_type_clip) && (b1Wc2 > 0) && (b2Wc2 > 0)) || + ((b1.poly_type == polygon_type_subject) && (b1Wc2 <= 0) && (b2Wc2 <= 0))) { + add_local_minimum_point(b1, b2, active_bounds, pt, rings); + } + break; + case clip_type_x_or: + add_local_minimum_point(b1, b2, active_bounds, pt, rings); + } + } else { + swap_sides(b1, b2); + } + } +} + +template +bool bounds_adjacent(intersect_node const& inode, bound_ptr next) { + return (next == inode.bound2) || (next == inode.bound1); +} + +template +struct find_first_bound { + bound_ptr b1; + bound_ptr b2; + + find_first_bound(intersect_node const& inode) : b1(inode.bound1), b2(inode.bound2) { + } + + bool operator()(bound_ptr const& b) { + return b == b1 || b == b2; + } +}; + +template +void process_intersect_list(intersect_list& intersects, + clip_type cliptype, + fill_type subject_fill_type, + fill_type clip_fill_type, + ring_manager& rings, + active_bound_list& active_bounds) { + for (auto node_itr = intersects.begin(); node_itr != intersects.end(); ++node_itr) { + auto b1 = std::find_if(active_bounds.begin(), active_bounds.end(), + find_first_bound(*node_itr)); + auto b2 = std::next(b1); + if (!bounds_adjacent(*node_itr, *b2)) { + auto next_itr = std::next(node_itr); + while (next_itr != intersects.end()) { + auto n1 = std::find_if(active_bounds.begin(), active_bounds.end(), + find_first_bound(*next_itr)); + auto n2 = std::next(n1); + if (bounds_adjacent(*next_itr, *n2)) { + b1 = n1; + b2 = n2; + break; + } + ++next_itr; + } + if (next_itr == intersects.end()) { + throw std::runtime_error("Could not properly correct intersection order."); + } + std::iter_swap(node_itr, next_itr); + } + mapbox::geometry::point pt = round_point(node_itr->pt); + intersect_bounds(*(node_itr->bound1), *(node_itr->bound2), pt, cliptype, subject_fill_type, + clip_fill_type, rings, active_bounds); + std::iter_swap(b1, b2); + } +} + +template +void update_current_x(active_bound_list& active_bounds, T top_y) { + std::size_t pos = 0; + for (auto& bnd : active_bounds) { + bnd->pos = pos++; + bnd->current_x = get_current_x(*bnd->current_edge, top_y); + } +} + +template +void process_intersections(T top_y, + active_bound_list& active_bounds, + clip_type cliptype, + fill_type subject_fill_type, + fill_type clip_fill_type, + ring_manager& rings) { + if (active_bounds.empty()) { + return; + } + update_current_x(active_bounds, top_y); + intersect_list intersects; + build_intersect_list(active_bounds, intersects); + + if (intersects.empty()) { + return; + } + + // Restore order of active bounds list + std::stable_sort( + active_bounds.begin(), active_bounds.end(), + [](bound_ptr const& b1, bound_ptr const& b2) { return b1->pos < b2->pos; }); + + // Sort the intersection list + std::stable_sort(intersects.begin(), intersects.end(), intersect_list_sorter()); + + process_intersect_list(intersects, cliptype, subject_fill_type, clip_fill_type, rings, + active_bounds); +} +} +} +} diff --git a/src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/local_minimum.hpp b/src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/local_minimum.hpp new file mode 100644 index 0000000..fe03d84 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/local_minimum.hpp @@ -0,0 +1,118 @@ +#pragma once + +#ifdef DEBUG +#include +#include +#endif + +#include + +#include + +namespace mapbox { +namespace geometry { +namespace wagyu { + +template +struct local_minimum { + bound left_bound; + bound right_bound; + T y; + bool minimum_has_horizontal; + + local_minimum(bound&& left_bound_, bound&& right_bound_, T y_, bool has_horz_) + : left_bound(std::move(left_bound_)), + right_bound(std::move(right_bound_)), + y(y_), + minimum_has_horizontal(has_horz_) { + } +}; + +template +using local_minimum_list = std::deque>; + +template +using local_minimum_itr = typename local_minimum_list::iterator; + +template +using local_minimum_ptr = local_minimum*; + +template +using local_minimum_ptr_list = std::vector>; + +template +using local_minimum_ptr_list_itr = typename local_minimum_ptr_list::iterator; + +template +struct local_minimum_sorter { + inline bool operator()(local_minimum_ptr const& locMin1, + local_minimum_ptr const& locMin2) { + if (locMin2->y == locMin1->y) { + return locMin2->minimum_has_horizontal != locMin1->minimum_has_horizontal && + locMin1->minimum_has_horizontal; + } + return locMin2->y < locMin1->y; + } +}; + +#ifdef DEBUG + +template +inline std::basic_ostream& operator<<(std::basic_ostream& out, + const local_minimum& lm) { + out << " Local Minimum:" << std::endl; + out << " y: " << lm.y << std::endl; + if (lm.minimum_has_horizontal) { + out << " minimum_has_horizontal: true" << std::endl; + } else { + out << " minimum_has_horizontal: false" << std::endl; + } + out << " left_bound: " << std::endl; + out << lm.left_bound << std::endl; + out << " right_bound: " << std::endl; + out << lm.right_bound << std::endl; + return out; +} + +template +inline std::basic_ostream& operator<<(std::basic_ostream& out, + const local_minimum_ptr_list& lms) { + for (auto const& lm : lms) { + out << *lm; + } + return out; +} + +template +std::string output_all_edges(local_minimum_ptr_list const& lms) { + std::ostringstream out; + out << "["; + bool first = true; + for (auto const& lm : lms) { + for (auto const& e : lm->left_bound.edges) { + if (first) { + first = false; + } else { + out << ","; + } + out << "[[" << e.bot.x << "," << e.bot.y << "],["; + out << e.top.x << "," << e.top.y << "]]"; + } + for (auto const& e : lm->right_bound.edges) { + if (first) { + first = false; + } else { + out << ","; + } + out << "[[" << e.bot.x << "," << e.bot.y << "],["; + out << e.top.x << "," << e.top.y << "]]"; + } + } + out << "]"; + return out.str(); +} + +#endif +} +} +} diff --git a/src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/local_minimum_util.hpp b/src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/local_minimum_util.hpp new file mode 100644 index 0000000..32fbf01 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/local_minimum_util.hpp @@ -0,0 +1,323 @@ +#pragma once + +#include +#include + +#include + +#ifdef DEBUG +#include +#endif + +namespace mapbox { +namespace geometry { +namespace wagyu { + +template +inline void reverse_horizontal(edge& e) { + // swap horizontal edges' top and bottom x's so they follow the natural + // progression of the bounds - ie so their xbots will align with the + // adjoining lower edge. [Helpful in the process_horizontal() method.] + std::swap(e.top.x, e.bot.x); +} + +// Make a list start on a local maximum by +// shifting all the points not on a local maximum to the +template +void start_list_on_local_maximum(edge_list& edges) { + if (edges.size() <= 2) { + return; + } + // Find the first local maximum going forward in the list + auto prev_edge = edges.end(); + --prev_edge; + bool prev_edge_is_horizontal = is_horizontal(*prev_edge); + auto edge = edges.begin(); + bool edge_is_horizontal; + bool y_decreasing_before_last_horizontal = false; // assume false at start + + while (edge != edges.end()) { + edge_is_horizontal = is_horizontal(*edge); + if ((!prev_edge_is_horizontal && !edge_is_horizontal && edge->top == prev_edge->top)) { + break; + } + if (!edge_is_horizontal && prev_edge_is_horizontal) { + if (y_decreasing_before_last_horizontal && + (edge->top == prev_edge->bot || edge->top == prev_edge->top)) { + break; + } + } else if (!y_decreasing_before_last_horizontal && !prev_edge_is_horizontal && + edge_is_horizontal && + (prev_edge->top == edge->top || prev_edge->top == edge->bot)) { + y_decreasing_before_last_horizontal = true; + } + prev_edge_is_horizontal = edge_is_horizontal; + prev_edge = edge; + ++edge; + } + std::rotate(edges.begin(), edge, edges.end()); +} + +template +bound create_bound_towards_minimum(edge_list& edges) { + if (edges.size() == 1) { + if (is_horizontal(edges.front())) { + reverse_horizontal(edges.front()); + } + bound bnd; + std::swap(bnd.edges, edges); + return bnd; + } + auto next_edge = edges.begin(); + auto edge = next_edge; + ++next_edge; + bool edge_is_horizontal = is_horizontal(*edge); + if (edge_is_horizontal) { + reverse_horizontal(*edge); + } + bool next_edge_is_horizontal; + bool y_increasing_before_last_horizontal = false; // assume false at start + + while (next_edge != edges.end()) { + next_edge_is_horizontal = is_horizontal(*next_edge); + if ((!next_edge_is_horizontal && !edge_is_horizontal && edge->bot == next_edge->bot)) { + break; + } + if (!next_edge_is_horizontal && edge_is_horizontal) { + if (y_increasing_before_last_horizontal && + (next_edge->bot == edge->bot || next_edge->bot == edge->top)) { + break; + } + } else if (!y_increasing_before_last_horizontal && !edge_is_horizontal && + next_edge_is_horizontal && + (edge->bot == next_edge->top || edge->bot == next_edge->bot)) { + y_increasing_before_last_horizontal = true; + } + edge_is_horizontal = next_edge_is_horizontal; + edge = next_edge; + if (edge_is_horizontal) { + reverse_horizontal(*edge); + } + ++next_edge; + } + bound bnd; + if (next_edge == edges.end()) { + std::swap(edges, bnd.edges); + } else { + bnd.edges.reserve(static_cast(std::distance(edges.begin(), next_edge))); + std::move(edges.begin(), next_edge, std::back_inserter(bnd.edges)); + edges.erase(edges.begin(), next_edge); + } + std::reverse(bnd.edges.begin(), bnd.edges.end()); + return bnd; +} + +template +bound create_bound_towards_maximum(edge_list& edges) { + if (edges.size() == 1) { + bound bnd; + std::swap(bnd.edges, edges); + return bnd; + } + auto next_edge = edges.begin(); + auto edge = next_edge; + ++next_edge; + bool edge_is_horizontal = is_horizontal(*edge); + bool next_edge_is_horizontal; + bool y_decreasing_before_last_horizontal = false; // assume false at start + + while (next_edge != edges.end()) { + next_edge_is_horizontal = is_horizontal(*next_edge); + if ((!next_edge_is_horizontal && !edge_is_horizontal && edge->top == next_edge->top)) { + break; + } + if (!next_edge_is_horizontal && edge_is_horizontal) { + if (y_decreasing_before_last_horizontal && + (next_edge->top == edge->bot || next_edge->top == edge->top)) { + break; + } + } else if (!y_decreasing_before_last_horizontal && !edge_is_horizontal && + next_edge_is_horizontal && + (edge->top == next_edge->top || edge->top == next_edge->bot)) { + y_decreasing_before_last_horizontal = true; + } + edge_is_horizontal = next_edge_is_horizontal; + edge = next_edge; + ++next_edge; + } + bound bnd; + if (next_edge == edges.end()) { + std::swap(bnd.edges, edges); + } else { + bnd.edges.reserve(static_cast(std::distance(edges.begin(), next_edge))); + std::move(edges.begin(), next_edge, std::back_inserter(bnd.edges)); + edges.erase(edges.begin(), next_edge); + } + return bnd; +} + +template +void fix_horizontals(bound& bnd) { + + auto edge_itr = bnd.edges.begin(); + auto next_itr = std::next(edge_itr); + if (next_itr == bnd.edges.end()) { + return; + } + if (is_horizontal(*edge_itr) && next_itr->bot != edge_itr->top) { + reverse_horizontal(*edge_itr); + } + auto prev_itr = edge_itr++; + while (edge_itr != bnd.edges.end()) { + if (is_horizontal(*edge_itr) && prev_itr->top != edge_itr->bot) { + reverse_horizontal(*edge_itr); + } + prev_itr = edge_itr; + ++edge_itr; + } +} + +template +void move_horizontals_on_left_to_right(bound& left_bound, bound& right_bound) { + // We want all the horizontal segments that are at the same Y as the minimum to be on the right + // bound + auto edge_itr = left_bound.edges.begin(); + while (edge_itr != left_bound.edges.end()) { + if (!is_horizontal(*edge_itr)) { + break; + } + reverse_horizontal(*edge_itr); + ++edge_itr; + } + if (edge_itr == left_bound.edges.begin()) { + return; + } + std::reverse(left_bound.edges.begin(), edge_itr); + auto dist = std::distance(left_bound.edges.begin(), edge_itr); + std::move(left_bound.edges.begin(), edge_itr, std::back_inserter(right_bound.edges)); + left_bound.edges.erase(left_bound.edges.begin(), edge_itr); + std::rotate(right_bound.edges.begin(), std::prev(right_bound.edges.end(), dist), + right_bound.edges.end()); +} + +template +void add_ring_to_local_minima_list(edge_list& edges, + local_minimum_list& minima_list, + polygon_type poly_type) { + + if (edges.empty()) { + return; + } + // Adjust the order of the ring so we start on a local maximum + // therefore we start right away on a bound. + start_list_on_local_maximum(edges); + + bound_ptr first_minimum = nullptr; + bound_ptr last_maximum = nullptr; + while (!edges.empty()) { + bool lm_minimum_has_horizontal = false; + auto to_minimum = create_bound_towards_minimum(edges); + if (edges.empty()) { + throw std::runtime_error("Edges is empty after only creating a single bound."); + } + auto to_maximum = create_bound_towards_maximum(edges); + fix_horizontals(to_minimum); + fix_horizontals(to_maximum); + auto to_max_first_non_horizontal = to_maximum.edges.begin(); + auto to_min_first_non_horizontal = to_minimum.edges.begin(); + bool minimum_is_left = true; + while (to_max_first_non_horizontal != to_maximum.edges.end() && + is_horizontal(*to_max_first_non_horizontal)) { + lm_minimum_has_horizontal = true; + ++to_max_first_non_horizontal; + } + while (to_min_first_non_horizontal != to_minimum.edges.end() && + is_horizontal(*to_min_first_non_horizontal)) { + lm_minimum_has_horizontal = true; + ++to_min_first_non_horizontal; + } + + if (to_max_first_non_horizontal == to_maximum.edges.end() || + to_min_first_non_horizontal == to_minimum.edges.end()) { + throw std::runtime_error("should not have a horizontal only bound for a ring"); + } + + if (lm_minimum_has_horizontal) { + if (to_max_first_non_horizontal->bot.x > to_min_first_non_horizontal->bot.x) { + minimum_is_left = true; + move_horizontals_on_left_to_right(to_minimum, to_maximum); + } else { + minimum_is_left = false; + move_horizontals_on_left_to_right(to_maximum, to_minimum); + } + } else { + if (to_max_first_non_horizontal->dx > to_min_first_non_horizontal->dx) { + minimum_is_left = false; + } else { + minimum_is_left = true; + } + } + assert(!to_minimum.edges.empty()); + assert(!to_maximum.edges.empty()); + auto const& min_front = to_minimum.edges.front(); + if (last_maximum) { + to_minimum.maximum_bound = last_maximum; + } + to_minimum.poly_type = poly_type; + to_maximum.poly_type = poly_type; + if (!minimum_is_left) { + to_minimum.side = edge_right; + to_maximum.side = edge_left; + to_minimum.winding_delta = -1; + to_maximum.winding_delta = 1; + minima_list.emplace_back(std::move(to_maximum), std::move(to_minimum), min_front.bot.y, + lm_minimum_has_horizontal); + if (!last_maximum) { + first_minimum = &(minima_list.back().right_bound); + } else { + last_maximum->maximum_bound = &(minima_list.back().right_bound); + } + last_maximum = &(minima_list.back().left_bound); + } else { + to_minimum.side = edge_left; + to_maximum.side = edge_right; + to_minimum.winding_delta = -1; + to_maximum.winding_delta = 1; + minima_list.emplace_back(std::move(to_minimum), std::move(to_maximum), min_front.bot.y, + lm_minimum_has_horizontal); + if (!last_maximum) { + first_minimum = &(minima_list.back().left_bound); + } else { + last_maximum->maximum_bound = &(minima_list.back().left_bound); + } + last_maximum = &(minima_list.back().right_bound); + } + } + last_maximum->maximum_bound = first_minimum; + first_minimum->maximum_bound = last_maximum; +} + +template +void initialize_lm(local_minimum_ptr_list_itr& lm) { + if (!(*lm)->left_bound.edges.empty()) { + (*lm)->left_bound.current_edge = (*lm)->left_bound.edges.begin(); + (*lm)->left_bound.next_edge = std::next((*lm)->left_bound.current_edge); + (*lm)->left_bound.current_x = static_cast((*lm)->left_bound.current_edge->bot.x); + (*lm)->left_bound.winding_count = 0; + (*lm)->left_bound.winding_count2 = 0; + (*lm)->left_bound.side = edge_left; + (*lm)->left_bound.ring = nullptr; + } + if (!(*lm)->right_bound.edges.empty()) { + (*lm)->right_bound.current_edge = (*lm)->right_bound.edges.begin(); + (*lm)->right_bound.next_edge = std::next((*lm)->right_bound.current_edge); + (*lm)->right_bound.current_x = static_cast((*lm)->right_bound.current_edge->bot.x); + (*lm)->right_bound.winding_count = 0; + (*lm)->right_bound.winding_count2 = 0; + (*lm)->right_bound.side = edge_right; + (*lm)->right_bound.ring = nullptr; + } +} +} +} +} diff --git a/src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/point.hpp b/src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/point.hpp new file mode 100644 index 0000000..949a834 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/point.hpp @@ -0,0 +1,111 @@ +#pragma once + +#include + +#ifdef DEBUG +#include +#endif + +namespace mapbox { +namespace geometry { +namespace wagyu { + +template +struct point; + +template +using point_ptr = point*; + +template +using const_point_ptr = point* const; + +template +struct ring; + +template +using ring_ptr = ring*; + +template +using const_ring_ptr = ring* const; + +template +struct point { + using coordinate_type = T; + ring_ptr ring; + T x; + T y; + point_ptr next; + point_ptr prev; + + point() : ring(nullptr), x(0), y(0), prev(this), next(this) { + } + + point(T x_, T y_) : ring(nullptr), x(x_), y(y_), next(this), prev(this) { + } + + point(ring_ptr ring_, mapbox::geometry::point const& pt) + : ring(ring_), x(pt.x), y(pt.y), next(this), prev(this) { + } + + point(ring_ptr ring_, mapbox::geometry::point const& pt, point_ptr before_this_point) + : ring(ring_), x(pt.x), y(pt.y), next(before_this_point), prev(before_this_point->prev) { + before_this_point->prev = this; + prev->next = this; + } +}; + +template +using point_vector = std::vector>; + +template +using point_vector_itr = typename point_vector::iterator; + +template +bool operator==(point const& lhs, point const& rhs) { + return lhs.x == rhs.x && lhs.y == rhs.y; +} + +template +bool operator==(mapbox::geometry::point const& lhs, point const& rhs) { + return lhs.x == rhs.x && lhs.y == rhs.y; +} + +template +bool operator==(point const& lhs, mapbox::geometry::point const& rhs) { + return lhs.x == rhs.x && lhs.y == rhs.y; +} + +template +bool operator!=(point const& lhs, point const& rhs) { + return lhs.x != rhs.x || lhs.y != rhs.y; +} + +template +bool operator!=(mapbox::geometry::point const& lhs, point const& rhs) { + return lhs.x != rhs.x || lhs.y != rhs.y; +} + +template +bool operator!=(point const& lhs, mapbox::geometry::point const& rhs) { + return lhs.x != rhs.x || lhs.y != rhs.y; +} + +#ifdef DEBUG + +template +inline std::basic_ostream& operator<<(std::basic_ostream& out, + const point& p) { + out << " point at: " << p.x << ", " << p.y; + return out; +} + +template +inline std::basic_ostream& operator<<(std::basic_ostream& out, + const mapbox::geometry::point& p) { + out << " point at: " << p.x << ", " << p.y; + return out; +} +#endif +} +} +} diff --git a/src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/process_horizontal.hpp b/src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/process_horizontal.hpp new file mode 100644 index 0000000..6ba9766 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/process_horizontal.hpp @@ -0,0 +1,268 @@ +#pragma once + +#include +#include +#include + +#include +#include +#include +#include + +namespace mapbox { +namespace geometry { +namespace wagyu { + +template +active_bound_list_itr process_horizontal_left_to_right(T scanline_y, + active_bound_list_itr& horz_bound, + active_bound_list& active_bounds, + ring_manager& rings, + scanbeam_list& scanbeam, + clip_type cliptype, + fill_type subject_fill_type, + fill_type clip_fill_type) { + auto horizontal_itr_behind = horz_bound; + bool shifted = false; + bool is_maxima_edge = is_maxima(horz_bound, scanline_y); + auto bound_max_pair = active_bounds.end(); + if (is_maxima_edge) { + bound_max_pair = get_maxima_pair(horz_bound, active_bounds); + } + + auto hp_itr = rings.current_hp_itr; + while (hp_itr != rings.hot_pixels.end() && + (hp_itr->y > scanline_y || + (hp_itr->y == scanline_y && hp_itr->x < (*horz_bound)->current_edge->bot.x))) { + ++hp_itr; + } + + auto bnd = std::next(horz_bound); + + while (bnd != active_bounds.end()) { + if (*bnd == nullptr) { + ++bnd; + continue; + } + // this code block inserts extra coords into horizontal edges (in output + // polygons) wherever hot pixels touch these horizontal edges. This helps + //'simplifying' polygons (ie if the Simplify property is set). + while (hp_itr != rings.hot_pixels.end() && hp_itr->y == scanline_y && + hp_itr->x < wround((*bnd)->current_x) && + hp_itr->x < (*horz_bound)->current_edge->top.x) { + if ((*horz_bound)->ring) { + add_point_to_ring(*(*horz_bound), *hp_itr, rings); + } + ++hp_itr; + } + + if ((*bnd)->current_x > static_cast((*horz_bound)->current_edge->top.x)) { + break; + } + + // Also break if we've got to the end of an intermediate horizontal edge ... + // nb: Smaller Dx's are to the right of larger Dx's ABOVE the horizontal. + if (wround((*bnd)->current_x) == (*horz_bound)->current_edge->top.x && + (*horz_bound)->next_edge != (*horz_bound)->edges.end() && + (*horz_bound)->current_edge->dx < (*horz_bound)->next_edge->dx) { + break; + } + + // note: may be done multiple times + if ((*horz_bound)->ring) { + add_point_to_ring(*(*horz_bound), + mapbox::geometry::point(wround((*bnd)->current_x), scanline_y), + rings); + } + + // OK, so far we're still in range of the horizontal Edge but make sure + // we're at the last of consec. horizontals when matching with eMaxPair + if (is_maxima_edge && bnd == bound_max_pair) { + if ((*horz_bound)->ring) { + add_local_maximum_point(*(*horz_bound), *(*bound_max_pair), + (*horz_bound)->current_edge->top, rings, active_bounds); + } + *bound_max_pair = nullptr; + *horz_bound = nullptr; + if (!shifted) { + ++horizontal_itr_behind; + } + return horizontal_itr_behind; + } + + intersect_bounds(*(*horz_bound), *(*bnd), + mapbox::geometry::point(wround((*bnd)->current_x), scanline_y), + cliptype, subject_fill_type, clip_fill_type, rings, active_bounds); + std::iter_swap(horz_bound, bnd); + horz_bound = bnd; + ++bnd; + shifted = true; + } // end while (bnd != active_bounds.end()) + + if ((*horz_bound)->ring) { + while (hp_itr != rings.hot_pixels.end() && hp_itr->y == scanline_y && + hp_itr->x < (*horz_bound)->current_edge->top.x) { + add_point_to_ring(*(*horz_bound), *hp_itr, rings); + ++hp_itr; + } + } + + if ((*horz_bound)->ring) { + add_point_to_ring(*(*horz_bound), (*horz_bound)->current_edge->top, rings); + } + + if ((*horz_bound)->next_edge != (*horz_bound)->edges.end()) { + next_edge_in_bound(*(*horz_bound), scanbeam); + } else { + *horz_bound = nullptr; + } + if (!shifted) { + ++horizontal_itr_behind; + } + return horizontal_itr_behind; +} + +template +active_bound_list_itr process_horizontal_right_to_left(T scanline_y, + active_bound_list_itr& horz_bound_fwd, + active_bound_list& active_bounds, + ring_manager& rings, + scanbeam_list& scanbeam, + clip_type cliptype, + fill_type subject_fill_type, + fill_type clip_fill_type) { + auto next_bnd_itr = std::next(horz_bound_fwd); + bool is_maxima_edge = is_maxima(horz_bound_fwd, scanline_y); + auto bound_max_pair = active_bounds.rend(); + if (is_maxima_edge) { + bound_max_pair = + active_bound_list_rev_itr(get_maxima_pair(horz_bound_fwd, active_bounds)); + --bound_max_pair; + } + auto hp_itr_fwd = rings.current_hp_itr; + while ( + hp_itr_fwd != rings.hot_pixels.end() && + (hp_itr_fwd->y < scanline_y || + (hp_itr_fwd->y == scanline_y && hp_itr_fwd->x < (*horz_bound_fwd)->current_edge->top.x))) { + ++hp_itr_fwd; + } + auto hp_itr = hot_pixel_rev_itr(hp_itr_fwd); + + auto bnd = active_bound_list_rev_itr(horz_bound_fwd); + auto horz_bound = std::prev(bnd); + while (bnd != active_bounds.rend()) { + if (*bnd == nullptr) { + ++bnd; + continue; + } + // this code block inserts extra coords into horizontal edges (in output + // polygons) wherever hot pixels touch these horizontal edges. + while (hp_itr != rings.hot_pixels.rend() && hp_itr->y == scanline_y && + hp_itr->x > wround((*bnd)->current_x) && + hp_itr->x > (*horz_bound)->current_edge->top.x) { + if ((*horz_bound)->ring) { + add_point_to_ring(*(*horz_bound), *hp_itr, rings); + } + ++hp_itr; + } + + if ((*bnd)->current_x < static_cast((*horz_bound)->current_edge->top.x)) { + break; + } + + // Also break if we've got to the end of an intermediate horizontal edge ... + // nb: Smaller Dx's are to the right of larger Dx's ABOVE the horizontal. + if (wround((*bnd)->current_x) == (*horz_bound)->current_edge->top.x && + (*horz_bound)->next_edge != (*horz_bound)->edges.end() && + (*horz_bound)->current_edge->dx < (*horz_bound)->next_edge->dx) { + break; + } + + // note: may be done multiple times + if ((*horz_bound)->ring) { + add_point_to_ring(*(*horz_bound), + mapbox::geometry::point(wround((*bnd)->current_x), scanline_y), + rings); + } + + // OK, so far we're still in range of the horizontal Edge but make sure + // we're at the last of consec. horizontals when matching with eMaxPair + if (is_maxima_edge && bnd == bound_max_pair) { + if ((*horz_bound)->ring) { + add_local_maximum_point(*(*horz_bound), *(*bound_max_pair), + (*horz_bound)->current_edge->top, rings, active_bounds); + } + *bound_max_pair = nullptr; + *horz_bound = nullptr; + return next_bnd_itr; + } + + intersect_bounds(*(*bnd), *(*horz_bound), + mapbox::geometry::point(wround((*bnd)->current_x), scanline_y), + cliptype, subject_fill_type, clip_fill_type, rings, active_bounds); + std::iter_swap(horz_bound, bnd); + horz_bound = bnd; + ++bnd; + } // end while (bnd != active_bounds.rend()) + + if ((*horz_bound)->ring) { + while (hp_itr != rings.hot_pixels.rend() && hp_itr->y == scanline_y && + hp_itr->x > (*horz_bound)->current_edge->top.x) { + add_point_to_ring(*(*horz_bound), *hp_itr, rings); + ++hp_itr; + } + } + if ((*horz_bound)->ring) { + add_point_to_ring(*(*horz_bound), (*horz_bound)->current_edge->top, rings); + } + + if ((*horz_bound)->next_edge != (*horz_bound)->edges.end()) { + next_edge_in_bound(*(*horz_bound), scanbeam); + } else { + *horz_bound = nullptr; + } + return next_bnd_itr; +} + +template +active_bound_list_itr process_horizontal(T scanline_y, + active_bound_list_itr& horz_bound, + active_bound_list& active_bounds, + ring_manager& rings, + scanbeam_list& scanbeam, + clip_type cliptype, + fill_type subject_fill_type, + fill_type clip_fill_type) { + if ((*horz_bound)->current_edge->bot.x < (*horz_bound)->current_edge->top.x) { + return process_horizontal_left_to_right(scanline_y, horz_bound, active_bounds, rings, + scanbeam, cliptype, subject_fill_type, + clip_fill_type); + } else { + return process_horizontal_right_to_left(scanline_y, horz_bound, active_bounds, rings, + scanbeam, cliptype, subject_fill_type, + clip_fill_type); + } +} + +template +void process_horizontals(T scanline_y, + active_bound_list& active_bounds, + ring_manager& rings, + scanbeam_list& scanbeam, + clip_type cliptype, + fill_type subject_fill_type, + fill_type clip_fill_type) { + for (auto bnd_itr = active_bounds.begin(); bnd_itr != active_bounds.end();) { + if (*bnd_itr != nullptr && current_edge_is_horizontal(bnd_itr)) { + bnd_itr = process_horizontal(scanline_y, bnd_itr, active_bounds, rings, scanbeam, + cliptype, subject_fill_type, clip_fill_type); + } else { + ++bnd_itr; + } + } + active_bounds.erase(std::remove(active_bounds.begin(), active_bounds.end(), nullptr), + active_bounds.end()); +} +} +} +} diff --git a/src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/process_maxima.hpp b/src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/process_maxima.hpp new file mode 100644 index 0000000..c133d87 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/process_maxima.hpp @@ -0,0 +1,127 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace mapbox { +namespace geometry { +namespace wagyu { + +template +active_bound_list_itr do_maxima(active_bound_list_itr& bnd, + active_bound_list_itr& bndMaxPair, + clip_type cliptype, + fill_type subject_fill_type, + fill_type clip_fill_type, + ring_manager& manager, + active_bound_list& active_bounds) { + auto bnd_next = std::next(bnd); + auto return_bnd = bnd; + bool skipped = false; + while (bnd_next != active_bounds.end() && bnd_next != bndMaxPair) { + if (*bnd_next == nullptr) { + ++bnd_next; + continue; + } + skipped = true; + intersect_bounds(*(*bnd), *(*bnd_next), (*bnd)->current_edge->top, cliptype, + subject_fill_type, clip_fill_type, manager, active_bounds); + std::iter_swap(bnd, bnd_next); + bnd = bnd_next; + ++bnd_next; + } + + if ((*bnd)->ring && (*bndMaxPair)->ring) { + add_local_maximum_point(*(*bnd), *(*bndMaxPair), (*bnd)->current_edge->top, manager, + active_bounds); + } else if ((*bnd)->ring || (*bndMaxPair)->ring) { + throw std::runtime_error("DoMaxima error"); + } + *bndMaxPair = nullptr; + *bnd = nullptr; + if (!skipped) { + ++return_bnd; + } + return return_bnd; +} + +template +void process_edges_at_top_of_scanbeam(T top_y, + active_bound_list& active_bounds, + scanbeam_list& scanbeam, + local_minimum_ptr_list const& minima_sorted, + local_minimum_ptr_list_itr& current_lm, + ring_manager& manager, + clip_type cliptype, + fill_type subject_fill_type, + fill_type clip_fill_type) { + + for (auto bnd = active_bounds.begin(); bnd != active_bounds.end();) { + if (*bnd == nullptr) { + ++bnd; + continue; + } + // 1. Process maxima, treating them as if they are "bent" horizontal edges, + // but exclude maxima with horizontal edges. + + bool is_maxima_edge = is_maxima(bnd, top_y); + + if (is_maxima_edge) { + auto bnd_max_pair = get_maxima_pair(bnd, active_bounds); + is_maxima_edge = ((bnd_max_pair == active_bounds.end() || + !current_edge_is_horizontal(bnd_max_pair)) && + is_maxima(bnd_max_pair, top_y)); + if (is_maxima_edge) { + bnd = do_maxima(bnd, bnd_max_pair, cliptype, subject_fill_type, clip_fill_type, + manager, active_bounds); + continue; + } + } + + // 2. Promote horizontal edges. + if (is_intermediate(bnd, top_y) && next_edge_is_horizontal(bnd)) { + if ((*bnd)->ring) { + insert_hot_pixels_in_path(*(*bnd), (*bnd)->current_edge->top, manager, false); + } + next_edge_in_bound(*(*bnd), scanbeam); + if ((*bnd)->ring) { + add_point_to_ring(*(*bnd), (*bnd)->current_edge->bot, manager); + } + } else { + (*bnd)->current_x = get_current_x(*((*bnd)->current_edge), top_y); + } + ++bnd; + } + active_bounds.erase(std::remove(active_bounds.begin(), active_bounds.end(), nullptr), + active_bounds.end()); + + insert_horizontal_local_minima_into_ABL(top_y, minima_sorted, current_lm, active_bounds, + manager, scanbeam, cliptype, subject_fill_type, + clip_fill_type); + + process_horizontals(top_y, active_bounds, manager, scanbeam, cliptype, subject_fill_type, + clip_fill_type); + + // 4. Promote intermediate vertices + + for (auto bnd = active_bounds.begin(); bnd != active_bounds.end(); ++bnd) { + if (is_intermediate(bnd, top_y)) { + if ((*bnd)->ring) { + add_point_to_ring(*(*bnd), (*bnd)->current_edge->top, manager); + } + next_edge_in_bound(*(*bnd), scanbeam); + } + } +} +} +} +} diff --git a/src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/quick_clip.hpp b/src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/quick_clip.hpp new file mode 100644 index 0000000..3ea358b --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/quick_clip.hpp @@ -0,0 +1,133 @@ +#pragma once + +#include +#include +#include +#include + +namespace mapbox { +namespace geometry { +namespace wagyu { +namespace quick_clip { + +template +mapbox::geometry::point intersect(mapbox::geometry::point a, + mapbox::geometry::point b, + size_t edge, + mapbox::geometry::box const& box) { + switch (edge) { + case 0: + return mapbox::geometry::point( + mapbox::geometry::wagyu::wround(static_cast(a.x) + static_cast(b.x - a.x) * static_cast(box.min.y - a.y) / static_cast(b.y - a.y)), + box.min.y); + + case 1: + return mapbox::geometry::point( + box.max.x, + mapbox::geometry::wagyu::wround(static_cast(a.y) + static_cast(b.y - a.y) * static_cast(box.max.x - a.x) / static_cast(b.x - a.x))); + + case 2: + return mapbox::geometry::point( + mapbox::geometry::wagyu::wround(static_cast(a.x) + static_cast(b.x - a.x) * static_cast(box.max.y - a.y) / static_cast(b.y - a.y)), + box.max.y); + + default: // case 3 + return mapbox::geometry::point( + box.min.x, + mapbox::geometry::wagyu::wround(static_cast(a.y) + static_cast(b.y - a.y) * static_cast(box.min.x - a.x) / static_cast(b.x - a.x))); + } +} + +template +bool inside(mapbox::geometry::point p, size_t edge, mapbox::geometry::box const& b) { + switch (edge) { + case 0: + return p.y > b.min.y; + + case 1: + return p.x < b.max.x; + + case 2: + return p.y < b.max.y; + + default: // case 3 + return p.x > b.min.x; + } +} + +template +mapbox::geometry::linear_ring quick_lr_clip(mapbox::geometry::linear_ring const& ring, + mapbox::geometry::box const& b) { + mapbox::geometry::linear_ring out = ring; + + for (size_t edge = 0; edge < 4; edge++) { + if (out.size() > 0) { + mapbox::geometry::linear_ring in = out; + mapbox::geometry::point S = in[in.size() - 1]; + out.resize(0); + + for (size_t e = 0; e < in.size(); e++) { + mapbox::geometry::point E = in[e]; + + if (inside(E, edge, b)) { + if (!inside(S, edge, b)) { + out.push_back(intersect(S, E, edge, b)); + } + out.push_back(E); + } else if (inside(S, edge, b)) { + out.push_back(intersect(S, E, edge, b)); + } + + S = E; + } + } + } + + if (out.size() < 3) { + out.clear(); + return out; + } + // Close the ring if the first/last point was outside + if (out[0] != out[out.size() - 1]) { + out.push_back(out[0]); + } + return out; +} +} + +template +mapbox::geometry::multi_polygon clip(mapbox::geometry::polygon const& poly, + mapbox::geometry::box const& b, + fill_type subject_fill_type) { + mapbox::geometry::multi_polygon result; + wagyu clipper; + for (auto const& lr : poly) { + auto new_lr = quick_clip::quick_lr_clip(lr, b); + if (!new_lr.empty()) { + clipper.add_ring(new_lr, polygon_type_subject); + } + } + clipper.execute(clip_type_union, result, subject_fill_type, fill_type_even_odd); + return result; +} + +template +mapbox::geometry::multi_polygon clip(mapbox::geometry::multi_polygon const& mp, + mapbox::geometry::box const& b, + fill_type subject_fill_type) { + mapbox::geometry::multi_polygon result; + wagyu clipper; + for (auto const& poly : mp) { + for (auto const& lr : poly) { + auto new_lr = quick_clip::quick_lr_clip(lr, b); + if (!new_lr.empty()) { + clipper.add_ring(new_lr, polygon_type_subject); + } + } + } + clipper.execute(clip_type_union, result, subject_fill_type, fill_type_even_odd); + return result; +} +} +} +} diff --git a/src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/ring.hpp b/src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/ring.hpp new file mode 100644 index 0000000..978d980 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/ring.hpp @@ -0,0 +1,645 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef DEBUG +#include +#include +#include +#include +// +// void* callstack[128]; +// int i, frames = backtrace(callstack, 128); +// char** strs = backtrace_symbols(callstack, frames); +// for (i = 0; i < frames; ++i) { +// printf("%s\n", strs[i]); +// } +// free(strs); +#endif + +namespace mapbox { +namespace geometry { +namespace wagyu { + +template +double area_from_point(point_ptr op, std::size_t& size, mapbox::geometry::box& bbox) { + point_ptr startOp = op; + size = 0; + double a = 0.0; + T min_x = op->x; + T max_x = op->x; + T min_y = op->y; + T max_y = op->y; + do { + ++size; + if (op->x > max_x) { + max_x = op->x; + } else if (op->x < min_x) { + min_x = op->x; + } + if (op->y > max_y) { + max_y = op->y; + } else if (op->y < min_y) { + min_y = op->y; + } + a += static_cast(op->prev->x + op->x) * static_cast(op->prev->y - op->y); + op = op->next; + } while (op != startOp); + bbox.min.x = min_x; + bbox.max.x = max_x; + bbox.min.y = min_y; + bbox.max.y = max_y; + return a * 0.5; +} + +// NOTE: ring and ring_ptr are forward declared in wagyu/point.hpp + +template +using ring_vector = std::vector>; + +template +struct ring { + std::size_t ring_index; // To support unset 0 is undefined and indexes offset by 1 + + std::size_t size_; // number of points in the ring + double area_; // area of the ring + mapbox::geometry::box bbox; // bounding box of the ring + + ring_ptr parent; + ring_vector children; + + point_ptr points; + point_ptr bottom_point; + bool is_hole_; + bool corrected; + + ring(ring const&) = delete; + ring& operator=(ring const&) = delete; + + ring() + : ring_index(0), + size_(0), + area_(std::numeric_limits::quiet_NaN()), + bbox({ 0, 0 }, { 0, 0 }), + parent(nullptr), + children(), + points(nullptr), + bottom_point(nullptr), + is_hole_(false), + corrected(false) { + } + + void reset_stats() { + area_ = std::numeric_limits::quiet_NaN(); + is_hole_ = false; + bbox.min.x = 0; + bbox.min.y = 0; + bbox.max.x = 0; + bbox.max.y = 0; + size_ = 0; + } + + void recalculate_stats() { + if (points != nullptr) { + area_ = area_from_point(points, size_, bbox); + is_hole_ = !(area_ > 0.0); + } + } + + void set_stats(double a, std::size_t s, mapbox::geometry::box const& b) { + bbox = b; + area_ = a; + size_ = s; + is_hole_ = !(area_ > 0.0); + } + + double area() { + if (std::isnan(area_)) { + recalculate_stats(); + } + return area_; + } + + bool is_hole() { + if (std::isnan(area_)) { + recalculate_stats(); + } + return is_hole_; + } + + std::size_t size() { + if (std::isnan(area_)) { + recalculate_stats(); + } + return size_; + } +}; + +template +using hot_pixel_vector = std::vector>; + +template +using hot_pixel_itr = typename hot_pixel_vector::iterator; + +template +using hot_pixel_rev_itr = typename hot_pixel_vector::reverse_iterator; + +template +struct ring_manager { + + ring_vector children; + point_vector all_points; + hot_pixel_vector hot_pixels; + hot_pixel_itr current_hp_itr; + std::deque> points; + std::deque> rings; + std::vector> storage; + std::size_t index; + + ring_manager(ring_manager const&) = delete; + ring_manager& operator=(ring_manager const&) = delete; + + ring_manager() + : children(), + all_points(), + hot_pixels(), + current_hp_itr(hot_pixels.end()), + points(), + rings(), + storage(), + index(0) { + } +}; + +template +void preallocate_point_memory(ring_manager& rings, std::size_t size) { + rings.storage.reserve(size); + rings.all_points.reserve(size); +} + +template +ring_ptr create_new_ring(ring_manager& manager) { + manager.rings.emplace_back(); + ring_ptr result = &manager.rings.back(); + result->ring_index = manager.index++; + return result; +} + +template +point_ptr +create_new_point(ring_ptr r, mapbox::geometry::point const& pt, ring_manager& rings) { + point_ptr point; + if (rings.storage.size() < rings.storage.capacity()) { + rings.storage.emplace_back(r, pt); + point = &rings.storage.back(); + } else { + rings.points.emplace_back(r, pt); + point = &rings.points.back(); + } + rings.all_points.push_back(point); + return point; +} + +template +point_ptr create_new_point(ring_ptr r, + mapbox::geometry::point const& pt, + point_ptr before_this_point, + ring_manager& rings) { + point_ptr point; + if (rings.storage.size() < rings.storage.capacity()) { + rings.storage.emplace_back(r, pt, before_this_point); + point = &rings.storage.back(); + } else { + rings.points.emplace_back(r, pt, before_this_point); + point = &rings.points.back(); + } + rings.all_points.push_back(point); + return point; +} + +template +void set_to_children(ring_ptr r, ring_vector& children) { + for (auto& c : children) { + if (c == nullptr) { + c = r; + return; + } + } + children.push_back(r); +} + +template +void remove_from_children(ring_ptr r, ring_vector& children) { + for (auto& c : children) { + if (c == r) { + c = nullptr; + return; + } + } +} + +template +void assign_as_child(ring_ptr new_ring, ring_ptr parent, ring_manager& manager) { + // Assigning as a child assumes that this is + // a brand new ring. Therefore it does + // not have any existing relationships + if ((parent == nullptr && new_ring->is_hole()) || + (parent != nullptr && new_ring->is_hole() == parent->is_hole())) { + throw std::runtime_error( + "Trying to assign a child that is the same orientation as the parent"); + } + auto& children = parent == nullptr ? manager.children : parent->children; + set_to_children(new_ring, children); + new_ring->parent = parent; +} + +template +void reassign_as_child(ring_ptr ring, ring_ptr parent, ring_manager& manager) { + // Reassigning a ring assumes it already + // has an existing parent + if ((parent == nullptr && ring->is_hole()) || + (parent != nullptr && ring->is_hole() == parent->is_hole())) { + throw std::runtime_error( + "Trying to re-assign a child that is the same orientation as the parent"); + } + + // Remove the old child relationship + auto& old_children = ring->parent == nullptr ? manager.children : ring->parent->children; + remove_from_children(ring, old_children); + + // Add new child relationship + auto& children = parent == nullptr ? manager.children : parent->children; + set_to_children(ring, children); + ring->parent = parent; +} + +template +void assign_as_sibling(ring_ptr new_ring, ring_ptr sibling, ring_manager& manager) { + // Assigning as a sibling assumes that this is + // a brand new ring. Therefore it does + // not have any existing relationships + if (new_ring->is_hole() != sibling->is_hole()) { + throw std::runtime_error( + "Trying to assign to be a sibling that is not the same orientation as the sibling"); + } + auto& children = sibling->parent == nullptr ? manager.children : sibling->parent->children; + set_to_children(new_ring, children); + new_ring->parent = sibling->parent; +} + +template +void reassign_as_sibling(ring_ptr ring, ring_ptr sibling, ring_manager& manager) { + if (ring->parent == sibling->parent) { + return; + } + // Assigning as a sibling assumes that this is + // a brand new ring. Therefore it does + // not have any existing relationships + if (ring->is_hole() != sibling->is_hole()) { + throw std::runtime_error( + "Trying to assign to be a sibling that is not the same orientation as the sibling"); + } + // Remove the old child relationship + auto& old_children = ring->parent == nullptr ? manager.children : ring->parent->children; + remove_from_children(ring, old_children); + // Add new relationship + auto& children = sibling->parent == nullptr ? manager.children : sibling->parent->children; + set_to_children(ring, children); + ring->parent = sibling->parent; +} + +template +void ring1_replaces_ring2(ring_ptr ring1, ring_ptr ring2, ring_manager& manager) { + assert(ring1 != ring2); + auto& ring1_children = ring1 == nullptr ? manager.children : ring1->children; + for (auto& c : ring2->children) { + if (c == nullptr) { + continue; + } + c->parent = ring1; + set_to_children(c, ring1_children); + c = nullptr; + } + // Remove the old child relationship + auto& old_children = ring2->parent == nullptr ? manager.children : ring2->parent->children; + remove_from_children(ring2, old_children); + ring2->points = nullptr; + ring2->reset_stats(); +} + +template +void remove_points(point_ptr pt) { + if (pt != nullptr) { + pt->prev->next = nullptr; + while (pt != nullptr) { + point_ptr tmp = pt; + pt = pt->next; + tmp->next = nullptr; + tmp->prev = nullptr; + tmp->ring = nullptr; + } + } +} + +template +void remove_ring_and_points(ring_ptr r, + ring_manager& manager, + bool remove_children = true, + bool remove_from_parent = true) { + // Removes a ring and any children that might be + // under that ring. + for (auto& c : r->children) { + if (c == nullptr) { + continue; + } + if (remove_children) { + remove_ring_and_points(c, manager, true, false); + } + c = nullptr; + } + if (remove_from_parent) { + // Remove the old child relationship + auto& old_children = r->parent == nullptr ? manager.children : r->parent->children; + remove_from_children(r, old_children); + } + point_ptr pt = r->points; + if (pt != nullptr) { + pt->prev->next = nullptr; + while (pt != nullptr) { + point_ptr tmp = pt; + pt = pt->next; + tmp->next = nullptr; + tmp->prev = nullptr; + tmp->ring = nullptr; + } + } + r->points = nullptr; + r->reset_stats(); +} + +template +void remove_ring(ring_ptr r, + ring_manager& manager, + bool remove_children = true, + bool remove_from_parent = true) { + // Removes a ring and any children that might be + // under that ring. + for (auto& c : r->children) { + if (c == nullptr) { + continue; + } + if (remove_children) { + remove_ring(c, manager, true, false); + } + c = nullptr; + } + if (remove_from_parent) { + // Remove the old child relationship + auto& old_children = r->parent == nullptr ? manager.children : r->parent->children; + remove_from_children(r, old_children); + } + r->points = nullptr; + r->reset_stats(); +} + +template +inline std::size_t ring_depth(ring_ptr r) { + std::size_t depth = 0; + if (!r) { + return depth; + } + while (r->parent) { + depth++; + r = r->parent; + } + return depth; +} + +template +inline bool ring_is_hole(ring_ptr r) { + // This is different then the "normal" way of determing if + // a ring is a hole or not because it uses the depth of the + // the ring to determine if it is a hole or not. This is only done + // intially when rings are output from Vatti. + return ring_depth(r) & 1; +} + +template +void set_next(const_point_ptr& node, const const_point_ptr& next_node) { + node->next = next_node; +} + +template +point_ptr get_next(const_point_ptr& node) { + return node->next; +} + +template +point_ptr get_prev(const_point_ptr& node) { + return node->prev; +} + +template +void set_prev(const_point_ptr& node, const const_point_ptr& prev_node) { + node->prev = prev_node; +} + +template +void init(const_point_ptr& node) { + set_next(node, node); + set_prev(node, node); +} + +template +void link_before(point_ptr& node, point_ptr& new_node) { + point_ptr prev_node = get_prev(node); + set_prev(new_node, prev_node); + set_next(new_node, node); + set_prev(node, new_node); + set_next(prev_node, new_node); +} + +template +void link_after(point_ptr& node, point_ptr& new_node) { + point_ptr next_node = get_next(node); + set_prev(new_node, node); + set_next(new_node, next_node); + set_next(node, new_node); + set_prev(next_node, new_node); +} + +template +void transfer_point(point_ptr& p, point_ptr& b, point_ptr& e) { + if (b != e) { + point_ptr prev_p = get_prev(p); + point_ptr prev_b = get_prev(b); + point_ptr prev_e = get_prev(e); + set_next(prev_e, p); + set_prev(p, prev_e); + set_next(prev_b, e); + set_prev(e, prev_b); + set_next(prev_p, b); + set_prev(b, prev_p); + } else { + link_before(p, b); + } +} + +template +void reverse_ring(point_ptr pp) { + if (!pp) { + return; + } + point_ptr pp1; + point_ptr pp2; + pp1 = pp; + do { + pp2 = pp1->next; + pp1->next = pp1->prev; + pp1->prev = pp2; + pp1 = pp2; + } while (pp1 != pp); +} + +#ifdef DEBUG + +template +inline std::basic_ostream& operator<<(std::basic_ostream& out, + ring& r) { + out << " ring_index: " << r.ring_index << std::endl; + if (!r.parent) { + // out << " parent_ring ptr: nullptr" << std::endl; + out << " parent_index: -----" << std::endl; + } else { + // out << " parent_ring ptr: " << r.parent << std::endl; + out << " parent_ring idx: " << r.parent->ring_index << std::endl; + } + ring_ptr n = const_cast>(&r); + if (ring_is_hole(n)) { + out << " is_hole: true " << std::endl; + } else { + out << " is_hole: false " << std::endl; + } + auto pt_itr = r.points; + if (pt_itr) { + out << " area: " << r.area() << std::endl; + out << " points:" << std::endl; + out << " [[[" << pt_itr->x << "," << pt_itr->y << "],"; + pt_itr = pt_itr->next; + while (pt_itr != r.points) { + out << "[" << pt_itr->x << "," << pt_itr->y << "],"; + pt_itr = pt_itr->next; + } + out << "[" << pt_itr->x << "," << pt_itr->y << "]]]" << std::endl; + } else { + out << " area: NONE" << std::endl; + out << " points: NONE" << std::endl; + } + return out; +} + +template +std::string debug_ring_addresses(ring_ptr r) { + std::ostringstream out; + out << "Ring: " << r->ring_index << std::endl; + if (r->points == nullptr) { + out << " Ring has no points" << std::endl; + return out.str(); + } + auto pt_itr = r->points; + do { + out << " [" << pt_itr->x << "," << pt_itr->y << "] - " << pt_itr << std::endl; + pt_itr = pt_itr->next; + } while (pt_itr != r->points); + return out.str(); +} + +template +std::string output_as_polygon(ring_ptr r) { + std::ostringstream out; + + auto pt_itr = r->points; + if (pt_itr) { + out << "["; + out << "[[" << pt_itr->x << "," << pt_itr->y << "],"; + pt_itr = pt_itr->next; + while (pt_itr != r->points) { + out << "[" << pt_itr->x << "," << pt_itr->y << "],"; + pt_itr = pt_itr->next; + } + out << "[" << pt_itr->x << "," << pt_itr->y << "]]"; + for (auto const& c : r->children) { + if (c == nullptr) { + continue; + } + pt_itr = c->points; + if (pt_itr) { + out << ",[[" << pt_itr->x << "," << pt_itr->y << "],"; + pt_itr = pt_itr->next; + while (pt_itr != c->points) { + out << "[" << pt_itr->x << "," << pt_itr->y << "],"; + pt_itr = pt_itr->next; + } + out << "[" << pt_itr->x << "," << pt_itr->y << "]]"; + } + } + out << "]" << std::endl; + } else { + out << "[]" << std::endl; + } + + return out.str(); +} + +template +inline std::basic_ostream& operator<<(std::basic_ostream& out, + ring_vector& rings) { + out << "START RING VECTOR" << std::endl; + for (auto& r : rings) { + if (r == nullptr || !r->points) { + continue; + } + out << " ring: " << r->ring_index << " - " << r << std::endl; + out << *r; + } + out << "END RING VECTOR" << std::endl; + return out; +} + +template +inline std::basic_ostream& operator<<(std::basic_ostream& out, + std::deque>& rings) { + out << "START RING VECTOR" << std::endl; + for (auto& r : rings) { + if (!r.points) { + continue; + } + out << " ring: " << r.ring_index << std::endl; + out << r; + } + out << "END RING VECTOR" << std::endl; + return out; +} + +template +inline std::basic_ostream& operator<<(std::basic_ostream& out, + hot_pixel_vector& hp_vec) { + out << "Hot Pixels: " << std::endl; + for (auto& hp : hp_vec) { + out << hp << std::endl; + } + return out; +} +#endif +} +} +} diff --git a/src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/ring_util.hpp b/src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/ring_util.hpp new file mode 100644 index 0000000..c499cb5 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/ring_util.hpp @@ -0,0 +1,852 @@ +#pragma once + +#ifdef DEBUG +#include +// Example debug print for backtrace - only works on IOS +#include +#include +// +// void* callstack[128]; +// int i, frames = backtrace(callstack, 128); +// char** strs = backtrace_symbols(callstack, frames); +// for (i = 0; i < frames; ++i) { +// printf("%s\n", strs[i]); +// } +// free(strs); +#endif + +#include + +#include +#include +#include +#include +#include + +namespace mapbox { +namespace geometry { +namespace wagyu { + +template +void set_hole_state(bound& bnd, + active_bound_list const& active_bounds, + ring_manager& rings) { + auto bnd_itr = std::find(active_bounds.rbegin(), active_bounds.rend(), &bnd); + ++bnd_itr; + bound_ptr bndTmp = nullptr; + // Find first non line ring to the left of current bound. + while (bnd_itr != active_bounds.rend()) { + if (*bnd_itr == nullptr) { + ++bnd_itr; + continue; + } + if ((*bnd_itr)->ring) { + if (!bndTmp) { + bndTmp = (*bnd_itr); + } else if (bndTmp->ring == (*bnd_itr)->ring) { + bndTmp = nullptr; + } + } + ++bnd_itr; + } + if (!bndTmp) { + bnd.ring->parent = nullptr; + rings.children.push_back(bnd.ring); + } else { + bnd.ring->parent = bndTmp->ring; + bndTmp->ring->children.push_back(bnd.ring); + } +} + +template +void update_current_hp_itr(T scanline_y, ring_manager& rings) { + while (rings.current_hp_itr->y > scanline_y) { + ++rings.current_hp_itr; + } +} + +template +struct hot_pixel_sorter { + inline bool operator()(mapbox::geometry::point const& pt1, + mapbox::geometry::point const& pt2) { + if (pt1.y == pt2.y) { + return pt1.x < pt2.x; + } else { + return pt1.y > pt2.y; + } + } +}; + +// Due to the nature of floating point calculations +// and the high likely hood of values around X.5, we +// need to fudge what is X.5 some for our rounding. +const double rounding_offset = 1e-12; +const double rounding_offset_y = 5e-13; + +template +T round_towards_min(double val) { + // 0.5 rounds to 0 + // 0.0 rounds to 0 + // -0.5 rounds to -1 + return static_cast(std::ceil(val - 0.5 + rounding_offset)); +} + +template +T round_towards_max(double val) { + // 0.5 rounds to 1 + // 0.0 rounds to 0 + // -0.5 rounds to 0 + return static_cast(std::floor(val + 0.5 + rounding_offset)); +} + +template +inline T get_edge_min_x(edge const& edge, const T current_y) { + if (is_horizontal(edge)) { + if (edge.bot.x < edge.top.x) { + return edge.bot.x; + } else { + return edge.top.x; + } + } else if (edge.dx > 0.0) { + if (current_y == edge.top.y) { + return edge.top.x; + } else { + double lower_range_y = static_cast(current_y - edge.bot.y) - 0.5; + double return_val = static_cast(edge.bot.x) + edge.dx * lower_range_y; + T value = round_towards_min(return_val); + return value; + } + } else { + if (current_y == edge.bot.y) { + return edge.bot.x; + } else { + double return_val = + static_cast(edge.bot.x) + + edge.dx * (static_cast(current_y - edge.bot.y) + 0.5 - rounding_offset_y); + T value = round_towards_min(return_val); + return value; + } + } +} + +template +inline T get_edge_max_x(edge const& edge, const T current_y) { + if (is_horizontal(edge)) { + if (edge.bot.x > edge.top.x) { + return edge.bot.x; + } else { + return edge.top.x; + } + } else if (edge.dx < 0.0) { + if (current_y == edge.top.y) { + return edge.top.x; + } else { + double lower_range_y = static_cast(current_y - edge.bot.y) - 0.5; + double return_val = static_cast(edge.bot.x) + edge.dx * lower_range_y; + T value = round_towards_max(return_val); + return value; + } + } else { + if (current_y == edge.bot.y) { + return edge.bot.x; + } else { + double return_val = + static_cast(edge.bot.x) + + edge.dx * (static_cast(current_y - edge.bot.y) + 0.5 - rounding_offset_y); + T value = round_towards_max(return_val); + return value; + } + } +} + +template +void hot_pixel_set_left_to_right(T y, + T start_x, + T end_x, + bound& bnd, + ring_manager& rings, + hot_pixel_itr& itr, + hot_pixel_itr& end, + bool add_end_point) { + T x_min = get_edge_min_x(*(bnd.current_edge), y); + x_min = std::max(x_min, start_x); + T x_max = get_edge_max_x(*(bnd.current_edge), y); + x_max = std::min(x_max, end_x); + for (; itr != end; ++itr) { + if (itr->x < x_min) { + continue; + } + if (itr->x > x_max) { + break; + } + if (!add_end_point && itr->x == end_x) { + continue; + } + point_ptr op = bnd.ring->points; + bool to_front = (bnd.side == edge_left); + if (to_front && (*itr == *op)) { + continue; + } else if (!to_front && (*itr == *op->prev)) { + continue; + } + point_ptr new_point = create_new_point(bnd.ring, *itr, op, rings); + if (to_front) { + bnd.ring->points = new_point; + } + } +} + +template +void hot_pixel_set_right_to_left(T y, + T start_x, + T end_x, + bound& bnd, + ring_manager& rings, + hot_pixel_rev_itr& itr, + hot_pixel_rev_itr& end, + bool add_end_point) { + T x_min = get_edge_min_x(*(bnd.current_edge), y); + x_min = std::max(x_min, end_x); + T x_max = get_edge_max_x(*(bnd.current_edge), y); + x_max = std::min(x_max, start_x); + for (; itr != end; ++itr) { + if (itr->x > x_max) { + continue; + } + if (itr->x < x_min) { + break; + } + if (!add_end_point && itr->x == end_x) { + continue; + } + point_ptr op = bnd.ring->points; + bool to_front = (bnd.side == edge_left); + if (to_front && (*itr == *op)) { + continue; + } else if (!to_front && (*itr == *op->prev)) { + continue; + } + point_ptr new_point = create_new_point(bnd.ring, *itr, op, rings); + if (to_front) { + bnd.ring->points = new_point; + } + } +} + +template +void sort_hot_pixels(ring_manager& rings) { + std::sort(rings.hot_pixels.begin(), rings.hot_pixels.end(), hot_pixel_sorter()); + auto last = std::unique(rings.hot_pixels.begin(), rings.hot_pixels.end()); + rings.hot_pixels.erase(last, rings.hot_pixels.end()); +} + +template +void insert_hot_pixels_in_path(bound& bnd, + mapbox::geometry::point const& end_pt, + ring_manager& rings, + bool add_end_point) { + if (end_pt == bnd.last_point) { + return; + } + + T start_y = bnd.last_point.y; + T start_x = bnd.last_point.x; + T end_y = end_pt.y; + T end_x = end_pt.x; + + auto itr = rings.current_hp_itr; + while (itr->y <= start_y && itr != rings.hot_pixels.begin()) { + --itr; + } + if (start_x > end_x) { + for (; itr != rings.hot_pixels.end();) { + if (itr->y > start_y) { + ++itr; + continue; + } + if (itr->y < end_y) { + break; + } + T y = itr->y; + auto last_itr = hot_pixel_rev_itr(itr); + while (itr != rings.hot_pixels.end() && itr->y == y) { + ++itr; + } + auto first_itr = hot_pixel_rev_itr(itr); + bool add_end_point_itr = (y != end_pt.y || add_end_point); + hot_pixel_set_right_to_left(y, start_x, end_x, bnd, rings, first_itr, last_itr, + add_end_point_itr); + } + } else { + for (; itr != rings.hot_pixels.end();) { + if (itr->y > start_y) { + ++itr; + continue; + } + if (itr->y < end_y) { + break; + } + T y = itr->y; + auto first_itr = itr; + while (itr != rings.hot_pixels.end() && itr->y == y) { + ++itr; + } + auto last_itr = itr; + bool add_end_point_itr = (y != end_pt.y || add_end_point); + hot_pixel_set_left_to_right(y, start_x, end_x, bnd, rings, first_itr, last_itr, + add_end_point_itr); + } + } + bnd.last_point = end_pt; +} + +template +void add_to_hot_pixels(mapbox::geometry::point const& pt, ring_manager& rings) { + rings.hot_pixels.push_back(pt); +} + +template +void add_first_point(bound& bnd, + active_bound_list& active_bounds, + mapbox::geometry::point const& pt, + ring_manager& rings) { + + ring_ptr r = create_new_ring(rings); + bnd.ring = r; + r->points = create_new_point(r, pt, rings); + set_hole_state(bnd, active_bounds, rings); + bnd.last_point = pt; +} + +template +void add_point_to_ring(bound& bnd, + mapbox::geometry::point const& pt, + ring_manager& rings) { + assert(bnd.ring); + // Handle hot pixels + insert_hot_pixels_in_path(bnd, pt, rings, false); + + // bnd.ring->points is the 'Left-most' point & bnd.ring->points->prev is the + // 'Right-most' + point_ptr op = bnd.ring->points; + bool to_front = (bnd.side == edge_left); + if (to_front && (pt == *op)) { + return; + } else if (!to_front && (pt == *op->prev)) { + return; + } + point_ptr new_point = create_new_point(bnd.ring, pt, bnd.ring->points, rings); + if (to_front) { + bnd.ring->points = new_point; + } +} + +template +void add_point(bound& bnd, + active_bound_list& active_bounds, + mapbox::geometry::point const& pt, + ring_manager& rings) { + if (bnd.ring == nullptr) { + add_first_point(bnd, active_bounds, pt, rings); + } else { + add_point_to_ring(bnd, pt, rings); + } +} + +template +void add_local_minimum_point(bound& b1, + bound& b2, + active_bound_list& active_bounds, + mapbox::geometry::point const& pt, + ring_manager& rings) { + if (is_horizontal(*b2.current_edge) || (b1.current_edge->dx > b2.current_edge->dx)) { + add_point(b1, active_bounds, pt, rings); + b2.last_point = pt; + b2.ring = b1.ring; + b1.side = edge_left; + b2.side = edge_right; + } else { + add_point(b2, active_bounds, pt, rings); + b1.last_point = pt; + b1.ring = b2.ring; + b1.side = edge_right; + b2.side = edge_left; + } +} + +template +inline double get_dx(point const& pt1, point const& pt2) { + if (pt1.y == pt2.y) { + return std::numeric_limits::infinity(); + } else { + return static_cast(pt2.x - pt1.x) / static_cast(pt2.y - pt1.y); + } +} + +template +bool first_is_bottom_point(const_point_ptr btmPt1, const_point_ptr btmPt2) { + point_ptr p = btmPt1->prev; + while ((*p == *btmPt1) && (p != btmPt1)) { + p = p->prev; + } + double dx1p = std::fabs(get_dx(*btmPt1, *p)); + + p = btmPt1->next; + while ((*p == *btmPt1) && (p != btmPt1)) { + p = p->next; + } + double dx1n = std::fabs(get_dx(*btmPt1, *p)); + + p = btmPt2->prev; + while ((*p == *btmPt2) && (p != btmPt2)) { + p = p->prev; + } + double dx2p = std::fabs(get_dx(*btmPt2, *p)); + + p = btmPt2->next; + while ((*p == *btmPt2) && (p != btmPt2)) { + p = p->next; + } + double dx2n = std::fabs(get_dx(*btmPt2, *p)); + + if (values_are_equal(std::max(dx1p, dx1n), std::max(dx2p, dx2n)) && + values_are_equal(std::min(dx1p, dx1n), std::min(dx2p, dx2n))) { + std::size_t s = 0; + mapbox::geometry::box bbox({ 0, 0 }, { 0, 0 }); + return area_from_point(btmPt1, s, bbox) > 0.0; // if otherwise identical use orientation + } else { + return (greater_than_or_equal(dx1p, dx2p) && greater_than_or_equal(dx1p, dx2n)) || + (greater_than_or_equal(dx1n, dx2p) && greater_than_or_equal(dx1n, dx2n)); + } +} + +template +point_ptr get_bottom_point(point_ptr pp) { + point_ptr dups = nullptr; + point_ptr p = pp->next; + while (p != pp) { + if (p->y > pp->y) { + pp = p; + dups = nullptr; + } else if (p->y == pp->y && p->x <= pp->x) { + if (p->x < pp->x) { + dups = nullptr; + pp = p; + } else { + if (p->next != pp && p->prev != pp) { + dups = p; + } + } + } + p = p->next; + } + if (dups) { + // there appears to be at least 2 vertices at bottom_point so ... + while (dups != p) { + if (!first_is_bottom_point(p, dups)) { + pp = dups; + } + dups = dups->next; + while (*dups != *pp) { + dups = dups->next; + } + } + } + return pp; +} + +template +ring_ptr get_lower_most_ring(ring_ptr outRec1, ring_ptr outRec2) { + // work out which polygon fragment has the correct hole state ... + if (!outRec1->bottom_point) { + outRec1->bottom_point = get_bottom_point(outRec1->points); + } + if (!outRec2->bottom_point) { + outRec2->bottom_point = get_bottom_point(outRec2->points); + } + point_ptr OutPt1 = outRec1->bottom_point; + point_ptr OutPt2 = outRec2->bottom_point; + if (OutPt1->y > OutPt2->y) { + return outRec1; + } else if (OutPt1->y < OutPt2->y) { + return outRec2; + } else if (OutPt1->x < OutPt2->x) { + return outRec1; + } else if (OutPt1->x > OutPt2->x) { + return outRec2; + } else if (OutPt1->next == OutPt1) { + return outRec2; + } else if (OutPt2->next == OutPt2) { + return outRec1; + } else if (first_is_bottom_point(OutPt1, OutPt2)) { + return outRec1; + } else { + return outRec2; + } +} + +template +bool ring1_child_below_ring2(ring_ptr ring1, ring_ptr ring2) { + do { + ring1 = ring1->parent; + if (ring1 == ring2) { + return true; + } + } while (ring1); + return false; +} + +template +void update_points_ring(ring_ptr ring) { + point_ptr op = ring->points; + do { + op->ring = ring; + op = op->prev; + } while (op != ring->points); +} + +template +void append_ring(bound& b1, + bound& b2, + active_bound_list& active_bounds, + ring_manager& manager) { + // get the start and ends of both output polygons ... + ring_ptr outRec1 = b1.ring; + ring_ptr outRec2 = b2.ring; + + ring_ptr keep_ring; + bound_ptr keep_bound; + ring_ptr remove_ring; + bound_ptr remove_bound; + if (ring1_child_below_ring2(outRec1, outRec2)) { + keep_ring = outRec2; + keep_bound = &b2; + remove_ring = outRec1; + remove_bound = &b1; + } else if (ring1_child_below_ring2(outRec2, outRec1)) { + keep_ring = outRec1; + keep_bound = &b1; + remove_ring = outRec2; + remove_bound = &b2; + } else if (outRec1 == get_lower_most_ring(outRec1, outRec2)) { + keep_ring = outRec1; + keep_bound = &b1; + remove_ring = outRec2; + remove_bound = &b2; + } else { + keep_ring = outRec2; + keep_bound = &b2; + remove_ring = outRec1; + remove_bound = &b1; + } + + // get the start and ends of both output polygons and + // join b2 poly onto b1 poly and delete pointers to b2 ... + + point_ptr p1_lft = keep_ring->points; + point_ptr p1_rt = p1_lft->prev; + point_ptr p2_lft = remove_ring->points; + point_ptr p2_rt = p2_lft->prev; + + // join b2 poly onto b1 poly and delete pointers to b2 ... + if (keep_bound->side == edge_left) { + if (remove_bound->side == edge_left) { + // z y x a b c + reverse_ring(p2_lft); + p2_lft->next = p1_lft; + p1_lft->prev = p2_lft; + p1_rt->next = p2_rt; + p2_rt->prev = p1_rt; + keep_ring->points = p2_rt; + } else { + // x y z a b c + p2_rt->next = p1_lft; + p1_lft->prev = p2_rt; + p2_lft->prev = p1_rt; + p1_rt->next = p2_lft; + keep_ring->points = p2_lft; + } + } else { + if (remove_bound->side == edge_right) { + // a b c z y x + reverse_ring(p2_lft); + p1_rt->next = p2_rt; + p2_rt->prev = p1_rt; + p2_lft->next = p1_lft; + p1_lft->prev = p2_lft; + } else { + // a b c x y z + p1_rt->next = p2_lft; + p2_lft->prev = p1_rt; + p1_lft->prev = p2_rt; + p2_rt->next = p1_lft; + } + } + + keep_ring->bottom_point = nullptr; + bool keep_is_hole = ring_is_hole(keep_ring); + bool remove_is_hole = ring_is_hole(remove_ring); + + remove_ring->points = nullptr; + remove_ring->bottom_point = nullptr; + if (keep_is_hole != remove_is_hole) { + ring1_replaces_ring2(keep_ring->parent, remove_ring, manager); + } else { + ring1_replaces_ring2(keep_ring, remove_ring, manager); + } + + update_points_ring(keep_ring); + + // nb: safe because we only get here via AddLocalMaxPoly + keep_bound->ring = nullptr; + remove_bound->ring = nullptr; + + for (auto& b : active_bounds) { + if (b == nullptr) { + continue; + } + if (b->ring == remove_ring) { + b->ring = keep_ring; + b->side = keep_bound->side; + break; // Not sure why there is a break here but was transfered logic from angus + } + } +} + +template +void add_local_maximum_point(bound& b1, + bound& b2, + mapbox::geometry::point const& pt, + ring_manager& rings, + active_bound_list& active_bounds) { + insert_hot_pixels_in_path(b2, pt, rings, false); + add_point(b1, active_bounds, pt, rings); + if (b1.ring == b2.ring) { + b1.ring = nullptr; + b2.ring = nullptr; + // I am not certain that order is important here? + } else if (b1.ring->ring_index < b2.ring->ring_index) { + append_ring(b1, b2, active_bounds, rings); + } else { + append_ring(b2, b1, active_bounds, rings); + } +} + +enum point_in_polygon_result : std::int8_t { + point_on_polygon = -1, + point_inside_polygon = 0, + point_outside_polygon = 1 +}; + +template +point_in_polygon_result point_in_polygon(point const& pt, point_ptr op) { + // returns 0 if false, +1 if true, -1 if pt ON polygon boundary + point_in_polygon_result result = point_outside_polygon; + point_ptr startOp = op; + do { + if (op->next->y == pt.y) { + if ((op->next->x == pt.x) || + (op->y == pt.y && ((op->next->x > pt.x) == (op->x < pt.x)))) { + return point_on_polygon; + } + } + if ((op->y < pt.y) != (op->next->y < pt.y)) { + if (op->x >= pt.x) { + if (op->next->x > pt.x) { + // Switch between point outside polygon and point inside + // polygon + if (result == point_outside_polygon) { + result = point_inside_polygon; + } else { + result = point_outside_polygon; + } + } else { + double d = + static_cast(op->x - pt.x) * + static_cast(op->next->y - pt.y) - + static_cast(op->next->x - pt.x) * static_cast(op->y - pt.y); + if (value_is_zero(d)) { + return point_on_polygon; + } + if ((d > 0) == (op->next->y > op->y)) { + // Switch between point outside polygon and point inside + // polygon + if (result == point_outside_polygon) { + result = point_inside_polygon; + } else { + result = point_outside_polygon; + } + } + } + } else { + if (op->next->x > pt.x) { + double d = + static_cast(op->x - pt.x) * + static_cast(op->next->y - pt.y) - + static_cast(op->next->x - pt.x) * static_cast(op->y - pt.y); + if (value_is_zero(d)) { + return point_on_polygon; + } + if ((d > 0) == (op->next->y > op->y)) { + // Switch between point outside polygon and point inside + // polygon + if (result == point_outside_polygon) { + result = point_inside_polygon; + } else { + result = point_outside_polygon; + } + } + } + } + } + op = op->next; + } while (startOp != op); + return result; +} + +template +point_in_polygon_result point_in_polygon(mapbox::geometry::point const& pt, + point_ptr op) { + // returns 0 if false, +1 if true, -1 if pt ON polygon boundary + point_in_polygon_result result = point_outside_polygon; + point_ptr startOp = op; + do { + double op_x = static_cast(op->x); + double op_y = static_cast(op->y); + double op_next_x = static_cast(op->next->x); + double op_next_y = static_cast(op->next->y); + if (values_are_equal(op_next_y, pt.y)) { + if (values_are_equal(op_next_x, pt.x) || + (values_are_equal(op_y, pt.y) && ((op_next_x > pt.x) == (op_x < pt.x)))) { + return point_on_polygon; + } + } + if ((op_y < pt.y) != (op_next_y < pt.y)) { + if (greater_than_or_equal(op_x, pt.x)) { + if (op_next_x > pt.x) { + // Switch between point outside polygon and point inside + // polygon + if (result == point_outside_polygon) { + result = point_inside_polygon; + } else { + result = point_outside_polygon; + } + } else { + double d = + (op_x - pt.x) * (op_next_y - pt.y) - (op_next_x - pt.x) * (op_y - pt.y); + if (value_is_zero(d)) { + return point_on_polygon; + } + if ((d > 0.0) == (op_next_y > op_y)) { + // Switch between point outside polygon and point inside + // polygon + if (result == point_outside_polygon) { + result = point_inside_polygon; + } else { + result = point_outside_polygon; + } + } + } + } else { + if (op_next_x > pt.x) { + double d = + (op_x - pt.x) * (op_next_y - pt.y) - (op_next_x - pt.x) * (op_y - pt.y); + if (value_is_zero(d)) { + return point_on_polygon; + } + if ((d > 0.0) == (op_next_y > op_y)) { + // Switch between point outside polygon and point inside + // polygon + if (result == point_outside_polygon) { + result = point_inside_polygon; + } else { + result = point_outside_polygon; + } + } + } + } + } + op = op->next; + } while (startOp != op); + return result; +} + +template +bool is_convex(point_ptr edge) { + point_ptr prev = edge->prev; + point_ptr next = edge->next; + T v1x = edge->x - prev->x; + T v1y = edge->y - prev->y; + T v2x = next->x - edge->x; + T v2y = next->y - edge->y; + T cross = v1x * v2y - v2x * v1y; + if (cross < 0 && edge->ring->area() > 0) { + return true; + } else if (cross > 0 && edge->ring->area() < 0) { + return true; + } else { + return false; + } +} + +template +mapbox::geometry::point centroid_of_points(point_ptr edge) { + point_ptr prev = edge->prev; + point_ptr next = edge->next; + return { static_cast(prev->x + edge->x + next->x) / 3.0, static_cast(prev->y + edge->y + next->y) / 3.0 }; +} + +template +point_in_polygon_result inside_or_outside_special(point_ptr first_pt, point_ptr other_poly) { + + // We are going to loop through all the points + // of the original triangle. The goal is to find a convex edge + // that with its next and previous forms a triangle with its centroid + // that is within the first ring. Then we will check the other polygon + // to see if it is within this polygon. + point_ptr itr = first_pt; + do { + if (is_convex(itr)) { + auto pt = centroid_of_points(itr); + if (point_inside_polygon == point_in_polygon(pt, first_pt)) { + return point_in_polygon(pt, other_poly); + } + } + itr = itr->next; + } while (itr != first_pt); + + throw std::runtime_error("Could not find a point within the polygon to test"); +} + +template +bool box2_contains_box1(mapbox::geometry::box const& box1, + mapbox::geometry::box const& box2) { + return (box2.max.x >= box1.max.x && box2.max.y >= box1.max.y && box2.min.x <= box1.min.x && + box2.min.y <= box1.min.y); +} + +template +bool poly2_contains_poly1(ring_ptr ring1, ring_ptr ring2) { + if (!box2_contains_box1(ring1->bbox, ring2->bbox)) { + return false; + } + if (std::fabs(ring2->area()) < std::fabs(ring1->area())) { + return false; + } + point_ptr outpt1 = ring1->points->next; + point_ptr outpt2 = ring2->points->next; + point_ptr op = outpt1; + do { + // nb: PointInPolygon returns 0 if false, +1 if true, -1 if pt on polygon + point_in_polygon_result res = point_in_polygon(*op, outpt2); + if (res != point_on_polygon) { + return res == point_inside_polygon; + } + op = op->next; + } while (op != outpt1); + point_in_polygon_result res = inside_or_outside_special(outpt1, outpt2); + return res == point_inside_polygon; +} +} +} +} diff --git a/src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/scanbeam.hpp b/src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/scanbeam.hpp new file mode 100644 index 0000000..5ec6408 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/scanbeam.hpp @@ -0,0 +1,36 @@ +#pragma once + +#include +#include + +#include + +namespace mapbox { +namespace geometry { +namespace wagyu { + +template +using scanbeam_list = std::vector; + +template +bool pop_from_scanbeam(T& Y, scanbeam_list& scanbeam) { + if (scanbeam.empty()) { + return false; + } + std::sort(scanbeam.begin(), scanbeam.end()); + scanbeam.erase(std::unique(scanbeam.begin(), scanbeam.end()), scanbeam.end()); + Y = scanbeam.back(); + scanbeam.pop_back(); + return true; +} + +template +void setup_scanbeam(local_minimum_list& minima_list, scanbeam_list& scanbeam) { + + for (auto lm = minima_list.begin(); lm != minima_list.end(); ++lm) { + scanbeam.push_back(lm->y); + } +} +} +} +} diff --git a/src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/snap_rounding.hpp b/src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/snap_rounding.hpp new file mode 100644 index 0000000..d10b3d0 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/snap_rounding.hpp @@ -0,0 +1,195 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace mapbox { +namespace geometry { +namespace wagyu { + +template +struct hp_intersection_swap { + + ring_manager& manager; + + hp_intersection_swap(ring_manager& m) : manager(m) { + } + + void operator()(bound_ptr const& b1, bound_ptr const& b2) { + mapbox::geometry::point pt; + if (!get_edge_intersection(*(b1->current_edge), *(b2->current_edge), pt)) { + // LCOV_EXCL_START + throw std::runtime_error("Trying to find intersection of lines that do not intersect"); + // LCOV_EXCL_END + } + add_to_hot_pixels(round_point(pt), manager); + } +}; + +template +void process_hot_pixel_intersections(T top_y, + active_bound_list& active_bounds, + ring_manager& manager) { + if (active_bounds.empty()) { + return; + } + update_current_x(active_bounds, top_y); + bubble_sort(active_bounds.begin(), active_bounds.end(), intersection_compare(), + hp_intersection_swap(manager)); +} + +template +bool horizontals_at_top_scanbeam(T top_y, + active_bound_list_itr& bnd_curr, + active_bound_list& active_bounds, + ring_manager& manager) { + bool shifted = false; + auto& current_edge = (*bnd_curr)->current_edge; + (*bnd_curr)->current_x = static_cast(current_edge->top.x); + if (current_edge->bot.x < current_edge->top.x) { + // left to right + auto bnd_next = std::next(bnd_curr); + while (bnd_next != active_bounds.end() && + (*bnd_next == nullptr || (*bnd_next)->current_x < (*bnd_curr)->current_x)) { + if (*bnd_next != nullptr && (*bnd_next)->current_edge->top.y != top_y && + (*bnd_next)->current_edge->bot.y != top_y) { + mapbox::geometry::point pt(wround((*bnd_next)->current_x), top_y); + add_to_hot_pixels(pt, manager); + } + std::iter_swap(bnd_curr, bnd_next); + ++bnd_curr; + ++bnd_next; + shifted = true; + } + } else { + // right to left + if (bnd_curr != active_bounds.begin()) { + auto bnd_prev = std::prev(bnd_curr); + while (bnd_curr != active_bounds.begin() && + (*bnd_prev == nullptr || (*bnd_prev)->current_x > (*bnd_curr)->current_x)) { + if (*bnd_prev != nullptr && (*bnd_prev)->current_edge->top.y != top_y && + (*bnd_prev)->current_edge->bot.y != top_y) { + mapbox::geometry::point pt(wround((*bnd_prev)->current_x), top_y); + add_to_hot_pixels(pt, manager); + } + std::iter_swap(bnd_curr, bnd_prev); + --bnd_curr; + if (bnd_curr != active_bounds.begin()) { + --bnd_prev; + } + } + } + } + return shifted; +} + +template +void process_hot_pixel_edges_at_top_of_scanbeam(T top_y, + scanbeam_list& scanbeam, + active_bound_list& active_bounds, + ring_manager& manager) { + for (auto bnd = active_bounds.begin(); bnd != active_bounds.end();) { + if (*bnd == nullptr) { + ++bnd; + continue; + } + bound& current_bound = *(*bnd); + auto bnd_curr = bnd; + bool shifted = false; + auto& current_edge = current_bound.current_edge; + while (current_edge != current_bound.edges.end() && current_edge->top.y == top_y) { + add_to_hot_pixels(current_edge->top, manager); + if (is_horizontal(*current_edge)) { + if (horizontals_at_top_scanbeam(top_y, bnd_curr, active_bounds, manager)) { + shifted = true; + } + } + next_edge_in_bound(current_bound, scanbeam); + } + if (current_edge == current_bound.edges.end()) { + *bnd_curr = nullptr; + } + if (!shifted) { + ++bnd; + } + } + active_bounds.erase(std::remove(active_bounds.begin(), active_bounds.end(), nullptr), + active_bounds.end()); +} + +template +void insert_local_minima_into_ABL_hot_pixel(T top_y, + local_minimum_ptr_list& minima_sorted, + local_minimum_ptr_list_itr& lm, + active_bound_list& active_bounds, + ring_manager& manager, + scanbeam_list& scanbeam) { + while (lm != minima_sorted.end() && (*lm)->y == top_y) { + add_to_hot_pixels((*lm)->left_bound.edges.front().bot, manager); + auto& left_bound = (*lm)->left_bound; + auto& right_bound = (*lm)->right_bound; + left_bound.current_edge = left_bound.edges.begin(); + left_bound.next_edge = std::next(left_bound.current_edge); + left_bound.current_x = static_cast(left_bound.current_edge->bot.x); + right_bound.current_edge = right_bound.edges.begin(); + right_bound.next_edge = std::next(right_bound.current_edge); + right_bound.current_x = static_cast(right_bound.current_edge->bot.x); + auto lb_abl_itr = insert_bound_into_ABL(left_bound, right_bound, active_bounds); + if (!current_edge_is_horizontal(lb_abl_itr)) { + scanbeam.push_back((*lb_abl_itr)->current_edge->top.y); + } + auto rb_abl_itr = std::next(lb_abl_itr); + if (!current_edge_is_horizontal(rb_abl_itr)) { + scanbeam.push_back((*rb_abl_itr)->current_edge->top.y); + } + ++lm; + } +} + +template +void build_hot_pixels(local_minimum_list& minima_list, ring_manager& manager) { + active_bound_list active_bounds; + scanbeam_list scanbeam; + T scanline_y = std::numeric_limits::max(); + + local_minimum_ptr_list minima_sorted; + minima_sorted.reserve(minima_list.size()); + for (auto& lm : minima_list) { + minima_sorted.push_back(&lm); + } + std::stable_sort(minima_sorted.begin(), minima_sorted.end(), local_minimum_sorter()); + local_minimum_ptr_list_itr current_lm = minima_sorted.begin(); + + setup_scanbeam(minima_list, scanbeam); + + // Estimate size for reserving hot pixels + std::size_t reserve = 0; + for (auto& lm : minima_list) { + reserve += lm.left_bound.edges.size() + 2; + reserve += lm.right_bound.edges.size() + 2; + } + manager.hot_pixels.reserve(reserve); + + while (pop_from_scanbeam(scanline_y, scanbeam) || current_lm != minima_sorted.end()) { + + process_hot_pixel_intersections(scanline_y, active_bounds, manager); + + insert_local_minima_into_ABL_hot_pixel(scanline_y, minima_sorted, current_lm, active_bounds, + manager, scanbeam); + + process_hot_pixel_edges_at_top_of_scanbeam(scanline_y, scanbeam, active_bounds, manager); + } + preallocate_point_memory(manager, manager.hot_pixels.size()); + sort_hot_pixels(manager); +} +} +} +} diff --git a/src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/topology_correction.hpp b/src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/topology_correction.hpp new file mode 100644 index 0000000..ffe27bc --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/topology_correction.hpp @@ -0,0 +1,1369 @@ +#pragma once + +#define _USE_MATH_DEFINES +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#ifdef DEBUG +#include +#include +#endif + +namespace mapbox { +namespace geometry { +namespace wagyu { + +template +struct point_ptr_pair { + point_ptr op1; + point_ptr op2; + + constexpr point_ptr_pair(point_ptr o1, point_ptr o2) : op1(o1), op2(o2) { + } + + point_ptr_pair(point_ptr_pair const& p) = default; + + point_ptr_pair(point_ptr_pair&& p) : op1(std::move(p.op1)), op2(std::move(p.op2)) { + } + + point_ptr_pair& operator=(point_ptr_pair&& p) { + op1 = std::move(p.op1); + op2 = std::move(p.op2); + return *this; + } +}; + +#ifdef DEBUG + +template +inline std::basic_ostream& +operator<<(std::basic_ostream& out, + const std::unordered_multimap, point_ptr_pair>& dupe_ring) { + + out << " BEGIN CONNECTIONS: " << std::endl; + for (auto& r : dupe_ring) { + out << " Ring: "; + if (r.second.op1->ring) { + out << r.second.op1->ring->ring_index; + } else { + out << "---"; + } + out << " to "; + if (r.second.op2->ring) { + out << r.second.op2->ring->ring_index; + } else { + out << "---"; + } + out << " ( at " << r.second.op1->x << ", " << r.second.op1->y << " )"; + out << " Ring1 ( "; + if (r.second.op1->ring) { + out << "area: " << r.second.op1->ring->area << " parent: "; + if (r.second.op1->ring->parent) { + out << r.second.op1->ring->parent->ring_index; + } else { + out << "---"; + } + } else { + out << "---"; + } + out << " )"; + out << " Ring2 ( "; + if (r.second.op2->ring) { + out << "area: " << r.second.op2->ring->area << " parent: "; + if (r.second.op2->ring->parent) { + out << r.second.op2->ring->parent->ring_index; + } else { + out << "---"; + } + } else { + out << "---"; + } + out << " )"; + out << std::endl; + } + out << " END CONNECTIONS: " << std::endl; + return out; +} + +#endif + +template +bool find_intersect_loop(std::unordered_multimap, point_ptr_pair>& dupe_ring, + std::list, point_ptr_pair>>& iList, + ring_ptr ring_parent, + ring_ptr ring_origin, + ring_ptr ring_search, + std::set>& visited, + point_ptr orig_pt, + point_ptr prev_pt, + ring_manager& rings) { + { + auto range = dupe_ring.equal_range(ring_search); + // Check for direct connection + for (auto& it = range.first; it != range.second;) { + ring_ptr it_ring1 = it->second.op1->ring; + ring_ptr it_ring2 = it->second.op2->ring; + if (!it_ring1 || !it_ring2 || it_ring1 != ring_search || + (!it_ring1->is_hole() && !it_ring2->is_hole())) { + it = dupe_ring.erase(it); + continue; + } + if (it_ring2 == ring_origin && + (ring_parent == it_ring2 || ring_parent == it_ring2->parent) && + *prev_pt != *it->second.op2 && *orig_pt != *it->second.op2) { + iList.emplace_front(ring_search, it->second); + return true; + } + ++it; + } + } + auto range = dupe_ring.equal_range(ring_search); + visited.insert(ring_search); + // Check for connection through chain of other intersections + for (auto& it = range.first; + it != range.second && it != dupe_ring.end() && it->first == ring_search; ++it) { + ring_ptr it_ring = it->second.op2->ring; + if (visited.count(it_ring) > 0 || it_ring == nullptr || + (ring_parent != it_ring && ring_parent != it_ring->parent) || + value_is_zero(it_ring->area()) || *prev_pt == *it->second.op2) { + continue; + } + if (find_intersect_loop(dupe_ring, iList, ring_parent, ring_origin, it_ring, visited, + orig_pt, it->second.op2, rings)) { + iList.emplace_front(ring_search, it->second); + return true; + } + } + return false; +} + +template +struct point_ptr_cmp { + inline bool operator()(point_ptr op1, point_ptr op2) { + if (op1->y != op2->y) { + return (op1->y > op2->y); + } else if (op1->x != op2->x) { + return (op1->x < op2->x); + } else { + std::size_t depth_1 = ring_depth(op1->ring); + std::size_t depth_2 = ring_depth(op2->ring); + return depth_1 > depth_2; + } + } +}; + +template +void correct_orientations(ring_manager& manager) { + for (auto& r : manager.rings) { + if (!r.points) { + continue; + } + r.recalculate_stats(); + if (r.size() < 3) { + remove_ring_and_points(&r, manager, false); + continue; + } + if (ring_is_hole(&r) != r.is_hole()) { + reverse_ring(r.points); + r.recalculate_stats(); + } + } +} + +template +point_vector sort_ring_points(ring_ptr r) { + point_vector sorted_points; + point_ptr point_itr = r->points; + point_ptr last_point = point_itr->prev; + while (point_itr != last_point) { + sorted_points.push_back(point_itr); + point_itr = point_itr->next; + } + sorted_points.push_back(last_point); + std::stable_sort(sorted_points.begin(), sorted_points.end(), + [](point_ptr const& pt1, point_ptr const& pt2) { + if (pt1->y != pt2->y) { + return (pt1->y > pt2->y); + } + return (pt1->x < pt2->x); + }); + return sorted_points; +} + +template +ring_ptr correct_self_intersection(point_ptr pt1, + point_ptr pt2, + ring_manager& manager) { + if (pt1->ring != pt2->ring) { + return static_cast>(nullptr); + } + + ring_ptr ring = pt1->ring; + + // split the polygon into two ... + point_ptr pt3 = pt1->prev; + point_ptr pt4 = pt2->prev; + pt1->prev = pt4; + pt4->next = pt1; + pt2->prev = pt3; + pt3->next = pt2; + + ring_ptr new_ring = create_new_ring(manager); + std::size_t size_1 = 0; + std::size_t size_2 = 0; + mapbox::geometry::box box1({ 0, 0 }, { 0, 0 }); + mapbox::geometry::box box2({ 0, 0 }, { 0, 0 }); + double area_1 = area_from_point(pt1, size_1, box1); + double area_2 = area_from_point(pt2, size_2, box2); + + if (std::fabs(area_1) > std::fabs(area_2)) { + ring->points = pt1; + ring->set_stats(area_1, size_1, box1); + new_ring->points = pt2; + new_ring->set_stats(area_2, size_2, box2); + } else { + ring->points = pt2; + ring->set_stats(area_2, size_2, box2); + new_ring->points = pt1; + new_ring->set_stats(area_1, size_1, box1); + } + update_points_ring(new_ring); + return new_ring; +} + +template +void correct_repeated_points(ring_manager& manager, + ring_vector& new_rings, + point_vector_itr const& begin, + point_vector_itr const& end) { + for (auto itr1 = begin; itr1 != end; ++itr1) { + if ((*itr1)->ring == nullptr) { + continue; + } + for (auto itr2 = std::next(itr1); itr2 != end; ++itr2) { + if ((*itr2)->ring == nullptr) { + continue; + } + ring_ptr new_ring = correct_self_intersection(*itr1, *itr2, manager); + if (new_ring != nullptr) { + new_rings.push_back(new_ring); + } + } + } +} + +template +void find_and_correct_repeated_points(ring_ptr r, + ring_manager& manager, + ring_vector& new_rings) { + auto sorted_points = sort_ring_points(r); + // Find sets of repeated points + std::size_t count = 0; + auto prev_itr = sorted_points.begin(); + auto itr = std::next(prev_itr); + while (itr != sorted_points.end()) { + if (*(*prev_itr) == *(*(itr))) { + ++count; + ++prev_itr; + ++itr; + if (itr != sorted_points.end()) { + continue; + } else { + ++prev_itr; + } + } else { + ++prev_itr; + ++itr; + } + if (count == 0) { + continue; + } + auto first = prev_itr; + std::advance(first, -(static_cast(count) + 1)); + correct_repeated_points(manager, new_rings, first, prev_itr); + count = 0; + } +} + +template +void reassign_children_if_necessary(ring_ptr new_ring, + ring_ptr sibling_ring, + ring_manager& manager, + ring_vector& new_rings) { + auto& children = sibling_ring == nullptr ? manager.children : sibling_ring->children; + for (auto c : children) { + if (c == nullptr) { + continue; + } + if (std::find(new_rings.begin(), new_rings.end(), c) != new_rings.end()) { + continue; + } + if (poly2_contains_poly1(c, new_ring)) { + reassign_as_child(c, new_ring, manager); + } + } +} + +template +bool find_parent_in_tree(ring_ptr r, ring_ptr possible_parent, ring_manager& manager) { + // Before starting this we are assuming that possible_parent + // and r have opposite signs of their areas + + // First we must search all grandchildren + for (auto c : possible_parent->children) { + if (c == nullptr) { + continue; + } + for (auto gc : c->children) { + if (gc == nullptr) { + continue; + } + if (find_parent_in_tree(r, gc, manager)) { + return true; + } + } + } + + if (poly2_contains_poly1(r, possible_parent)) { + reassign_as_child(r, possible_parent, manager); + return true; + } + return false; +} + +template +void assign_new_ring_parents(ring_manager& manager, + ring_ptr original_ring, + ring_vector& new_rings) { + + // First lets remove any rings that have zero area + // or have no points + new_rings.erase(std::remove_if(new_rings.begin(), new_rings.end(), + [](ring_ptr const& r) { + if (r->points == nullptr) { + return true; + } + return value_is_zero(r->area()); + }), + new_rings.end()); + + if (new_rings.empty()) { + // No new rings created simply return; + return; + } + + // We should not have to re-assign the parent of the original ring + // because we always maintained the largest ring during splitting + // on repeated points. + + double original_ring_area = original_ring->area(); + bool original_positive = original_ring_area > 0.0; + + // If there is only one new ring the logic is very simple and we + // do not have to check which ring contains, we only need to compare + // the areas of the original ring and that of the new ring. + if (new_rings.size() == 1) { + double new_ring_area = new_rings.front()->area(); + bool new_positive = new_ring_area > 0.0; + if (original_positive == new_positive) { + // The rings should be siblings + assign_as_child(new_rings.front(), original_ring->parent, manager); + reassign_children_if_necessary(new_rings.front(), original_ring, manager, new_rings); + } else { + // The new ring is a child of original ring + // Check the + assign_as_child(new_rings.front(), original_ring, manager); + reassign_children_if_necessary(new_rings.front(), original_ring->parent, manager, + new_rings); + } + return; + } + + // Now we want to sort rings from the largest in absolute area to the smallest + // as we will assign the rings with the largest areas first + std::stable_sort(new_rings.begin(), new_rings.end(), + [](ring_ptr const& r1, ring_ptr const& r2) { + return std::fabs(r1->area()) > std::fabs(r2->area()); + }); + + for (auto r_itr = new_rings.begin(); r_itr != new_rings.end(); ++r_itr) { + double new_ring_area = (*r_itr)->area(); + bool new_positive = new_ring_area > 0.0; + bool same_orientation = new_positive == original_positive; + bool found = false; + // First lets check the trees of any new_rings that might have + // been assigned as siblings to the original ring. + for (auto s_itr = new_rings.begin(); s_itr != r_itr; ++s_itr) { + if ((*s_itr)->parent != original_ring->parent) { + continue; + } + if (same_orientation) { + for (auto s_child : (*s_itr)->children) { + if (s_child == nullptr) { + continue; + } + if (find_parent_in_tree(*r_itr, s_child, manager)) { + reassign_children_if_necessary(*r_itr, original_ring, manager, new_rings); + found = true; + break; + } + } + } else { + if (find_parent_in_tree(*r_itr, *s_itr, manager)) { + reassign_children_if_necessary(*r_itr, original_ring->parent, manager, + new_rings); + found = true; + } + } + if (found) { + break; + } + } + + if (found) { + continue; + } + + // Next lets check the tree of the original_ring + if (same_orientation) { + for (auto o_child : original_ring->children) { + if (o_child == nullptr) { + continue; + } + if (find_parent_in_tree(*r_itr, o_child, manager)) { + reassign_children_if_necessary(*r_itr, original_ring, manager, new_rings); + found = true; + break; + } + } + if (!found) { + // If we didn't find any parent and the same orientation + // then it must be a sibling of the original ring + assign_as_child(*r_itr, original_ring->parent, manager); + reassign_children_if_necessary(*r_itr, original_ring, manager, new_rings); + } + } else { + if (find_parent_in_tree(*r_itr, original_ring, manager)) { + reassign_children_if_necessary(*r_itr, original_ring->parent, manager, new_rings); + } else { + throw std::runtime_error("Unable to find a proper parent ring"); + } + } + } +} + +template +bool correct_ring_self_intersections(ring_manager& manager, ring_ptr r, bool correct_tree) { + + if (r->corrected || !r->points) { + return false; + } + + ring_vector new_rings; + + find_and_correct_repeated_points(r, manager, new_rings); + + if (correct_tree) { + assign_new_ring_parents(manager, r, new_rings); + } + + r->corrected = true; + return true; +} + +template +void process_single_intersection( + std::unordered_multimap, point_ptr_pair>& connection_map, + point_ptr op_j, + point_ptr op_k, + ring_manager& manager) { + ring_ptr ring_j = op_j->ring; + ring_ptr ring_k = op_k->ring; + if (ring_j == ring_k) { + return; + } + + if (!ring_j->is_hole() && !ring_k->is_hole()) { + // Both are not holes, return nothing to do. + return; + } + + ring_ptr ring_origin; + ring_ptr ring_search; + ring_ptr ring_parent; + point_ptr op_origin_1; + point_ptr op_origin_2; + if (!ring_j->is_hole()) { + ring_origin = ring_j; + ring_parent = ring_origin; + ring_search = ring_k; + op_origin_1 = op_j; + op_origin_2 = op_k; + } else if (!ring_k->is_hole()) { + ring_origin = ring_k; + ring_parent = ring_origin; + ring_search = ring_j; + op_origin_1 = op_k; + op_origin_2 = op_j; + + } else { + // both are holes + // Order doesn't matter + ring_origin = ring_j; + ring_parent = ring_origin->parent; + ring_search = ring_k; + op_origin_1 = op_j; + op_origin_2 = op_k; + } + if (ring_parent != ring_search->parent) { + // The two holes do not have the same parent, do not add them + // simply return! + return; + } + bool found = false; + std::list, point_ptr_pair>> iList; + { + auto range = connection_map.equal_range(ring_search); + // Check for direct connection + for (auto& it = range.first; it != range.second;) { + if (!it->second.op1->ring) { + it = connection_map.erase(it); + continue; + } + if (!it->second.op2->ring) { + it = connection_map.erase(it); + continue; + } + ring_ptr it_ring2 = it->second.op2->ring; + if (it_ring2 == ring_origin) { + found = true; + if (*op_origin_1 != *(it->second.op2)) { + iList.emplace_back(ring_search, it->second); + break; + } + } + ++it; + } + } + if (iList.empty()) { + auto range = connection_map.equal_range(ring_search); + std::set> visited; + visited.insert(ring_search); + // Check for connection through chain of other intersections + for (auto& it = range.first; + it != range.second && it != connection_map.end() && it->first == ring_search; ++it) { + ring_ptr it_ring = it->second.op2->ring; + if (it_ring != ring_search && *op_origin_2 != *it->second.op2 && it_ring != nullptr && + (ring_parent == it_ring || ring_parent == it_ring->parent) && + !value_is_zero(it_ring->area()) && + find_intersect_loop(connection_map, iList, ring_parent, ring_origin, it_ring, + visited, op_origin_2, it->second.op2, manager)) { + found = true; + iList.emplace_front(ring_search, it->second); + break; + } + } + } + if (!found) { + point_ptr_pair intPt_origin = { op_origin_1, op_origin_2 }; + point_ptr_pair intPt_search = { op_origin_2, op_origin_1 }; + connection_map.emplace(ring_origin, std::move(intPt_origin)); + connection_map.emplace(ring_search, std::move(intPt_search)); + return; + } + + if (iList.empty()) { + // The situation where both origin and search are holes might have a missing + // search condition, we must check if a new pair must be added. + bool missing = true; + auto rng = connection_map.equal_range(ring_origin); + // Check for direct connection + for (auto& it = rng.first; it != rng.second; ++it) { + ring_ptr it_ring2 = it->second.op2->ring; + if (it_ring2 == ring_search) { + missing = false; + } + } + if (missing) { + point_ptr_pair intPt_origin = { op_origin_1, op_origin_2 }; + connection_map.emplace(ring_origin, std::move(intPt_origin)); + } + return; + } + if (ring_origin->is_hole()) { + for (auto& iRing : iList) { + ring_ptr ring_itr = iRing.first; + if (!ring_itr->is_hole()) { + // Make the hole the origin! + point_ptr op1 = op_origin_1; + op_origin_1 = iRing.second.op1; + iRing.second.op1 = op1; + point_ptr op2 = op_origin_2; + op_origin_2 = iRing.second.op2; + iRing.second.op2 = op2; + iRing.first = ring_origin; + ring_origin = ring_itr; + ring_parent = ring_origin; + break; + } + } + } + bool origin_is_hole = ring_origin->is_hole(); + + // Switch + point_ptr op_origin_1_next = op_origin_1->next; + point_ptr op_origin_2_next = op_origin_2->next; + op_origin_1->next = op_origin_2_next; + op_origin_2->next = op_origin_1_next; + op_origin_1_next->prev = op_origin_2; + op_origin_2_next->prev = op_origin_1; + + for (auto& iRing : iList) { + point_ptr op_search_1 = iRing.second.op1; + point_ptr op_search_2 = iRing.second.op2; + point_ptr op_search_1_next = op_search_1->next; + point_ptr op_search_2_next = op_search_2->next; + op_search_1->next = op_search_2_next; + op_search_2->next = op_search_1_next; + op_search_1_next->prev = op_search_2; + op_search_2_next->prev = op_search_1; + } + + ring_ptr ring_new = create_new_ring(manager); + ring_origin->corrected = false; + std::size_t size_1 = 0; + std::size_t size_2 = 0; + mapbox::geometry::box box1({ 0, 0 }, { 0, 0 }); + mapbox::geometry::box box2({ 0, 0 }, { 0, 0 }); + double area_1 = area_from_point(op_origin_1, size_1, box1); + double area_2 = area_from_point(op_origin_2, size_2, box2); + if (origin_is_hole && ((area_1 < 0.0))) { + ring_origin->points = op_origin_1; + ring_origin->set_stats(area_1, size_1, box1); + ring_new->points = op_origin_2; + ring_new->set_stats(area_2, size_2, box2); + } else { + ring_origin->points = op_origin_2; + ring_origin->set_stats(area_2, size_2, box2); + ring_new->points = op_origin_1; + ring_new->set_stats(area_1, size_1, box1); + } + + update_points_ring(ring_origin); + update_points_ring(ring_new); + + ring_origin->bottom_point = nullptr; + + for (auto& iRing : iList) { + ring_ptr ring_itr = iRing.first; + ring_itr->bottom_point = nullptr; + if (origin_is_hole) { + ring1_replaces_ring2(ring_origin, ring_itr, manager); + } else { + ring1_replaces_ring2(ring_origin->parent, ring_itr, manager); + } + } + if (origin_is_hole) { + assign_as_child(ring_new, ring_origin, manager); + // The parent ring in this situation might need to give up children + // to the new ring. + for (auto c : ring_parent->children) { + if (c == nullptr) { + continue; + } + if (poly2_contains_poly1(c, ring_new)) { + reassign_as_child(c, ring_new, manager); + } + } + } else { + // The new ring and the origin ring need to be siblings + // however some children ring from the ring origin might + // need to be re-assigned to the new ring + assign_as_sibling(ring_new, ring_origin, manager); + for (auto c : ring_origin->children) { + if (c == nullptr) { + continue; + } + if (poly2_contains_poly1(c, ring_new)) { + reassign_as_child(c, ring_new, manager); + } + } + } + + std::list, point_ptr_pair>> move_list; + + for (auto& iRing : iList) { + auto range_itr = connection_map.equal_range(iRing.first); + if (range_itr.first != range_itr.second) { + for (auto& it = range_itr.first; it != range_itr.second; ++it) { + ring_ptr it_ring = it->second.op1->ring; + ring_ptr it_ring2 = it->second.op2->ring; + if (it_ring == nullptr || it_ring2 == nullptr || it_ring == it_ring2) { + continue; + } + if (it_ring->is_hole() || it_ring2->is_hole()) { + move_list.emplace_back(it_ring, it->second); + } + } + connection_map.erase(iRing.first); + } + } + + auto range_itr = connection_map.equal_range(ring_origin); + for (auto& it = range_itr.first; it != range_itr.second;) { + ring_ptr it_ring = it->second.op1->ring; + ring_ptr it_ring2 = it->second.op2->ring; + if (it_ring == nullptr || it_ring2 == nullptr || it_ring == it_ring2) { + it = connection_map.erase(it); + continue; + } + if (it_ring != ring_origin) { + if (it_ring->is_hole() || it_ring2->is_hole()) { + move_list.emplace_back(it_ring, it->second); + } + it = connection_map.erase(it); + } else { + if (it_ring->is_hole() || it_ring2->is_hole()) { + ++it; + } else { + it = connection_map.erase(it); + } + } + } + + if (!move_list.empty()) { + connection_map.insert(move_list.begin(), move_list.end()); + } + + return; +} + +template +void correct_chained_repeats( + ring_manager& manager, + std::unordered_multimap, point_ptr_pair>& connection_map, + point_vector_itr const& begin, + point_vector_itr const& end) { + for (auto itr1 = begin; itr1 != end; ++itr1) { + if ((*itr1)->ring == nullptr) { + continue; + } + for (auto itr2 = std::next(itr1); itr2 != end; ++itr2) { + if ((*itr2)->ring == nullptr) { + continue; + } + process_single_intersection(connection_map, *itr1, *itr2, manager); + } + } +} + +template +void correct_chained_rings(ring_manager& manager) { + + if (manager.all_points.size() < 2) { + return; + } + // Setup connection map which is a map of rings and their + // connection point pairs with other rings. + std::unordered_multimap, point_ptr_pair> connection_map; + connection_map.reserve(manager.rings.size()); + + // Now lets find and process any points + // that overlap -- we should have solved + // all situations where these points + // would be self intersections of a ring with + // earlier processing so this should just be + // points where different rings are touching. + std::size_t count = 0; + auto prev_itr = manager.all_points.begin(); + auto itr = std::next(prev_itr); + while (itr != manager.all_points.end()) { + if (*(*prev_itr) == *(*(itr))) { + ++count; + ++prev_itr; + ++itr; + if (itr != manager.all_points.end()) { + continue; + } else { + ++prev_itr; + } + } else { + ++prev_itr; + ++itr; + } + if (count == 0) { + continue; + } + auto first = prev_itr; + std::advance(first, -(static_cast(count) + 1)); + correct_chained_repeats(manager, connection_map, first, prev_itr); + count = 0; + } +} + +template +ring_vector sort_rings_largest_to_smallest(ring_manager& manager) { + ring_vector sorted_rings; + sorted_rings.reserve(manager.rings.size()); + for (auto& r : manager.rings) { + sorted_rings.push_back(&r); + } + std::stable_sort(sorted_rings.begin(), sorted_rings.end(), + [](ring_ptr const& r1, ring_ptr const& r2) { + if (!r1->points || !r2->points) { + return r1->points != nullptr; + } + return std::fabs(r1->area()) > std::fabs(r2->area()); + }); + return sorted_rings; +} + +template +ring_vector sort_rings_smallest_to_largest(ring_manager& manager) { + ring_vector sorted_rings; + sorted_rings.reserve(manager.rings.size()); + for (auto& r : manager.rings) { + sorted_rings.push_back(&r); + } + std::stable_sort(sorted_rings.begin(), sorted_rings.end(), + [](ring_ptr const& r1, ring_ptr const& r2) { + if (!r1->points || !r2->points) { + return r1->points != nullptr; + } + return std::fabs(r1->area()) < std::fabs(r2->area()); + }); + return sorted_rings; +} + +template +struct collinear_path { + // Collinear edges are in opposite directions + // such that start_1 is at the same position + // of end_2 and vise versa. Start to end is + // always forward (next) on path. + point_ptr start_1; + point_ptr end_1; + point_ptr start_2; + point_ptr end_2; +}; + +template +struct collinear_result { + point_ptr pt1; + point_ptr pt2; +}; + +template +collinear_result fix_collinear_path(collinear_path& path) { + // Left and right are just the opposite ends of the + // collinear path, they may not be actually left + // and right of each other. + // The left end is start_1 and end_2 + // The right end is start_2 and end_1 + + // NOTE spike detection is checking that the + // pointers are the same values, not position! + // additionally duplicate points we will treat + // if they are a spike left. + bool spike_left = (path.start_1 == path.end_2); + bool spike_right = (path.start_2 == path.end_1); + + if (spike_left && spike_right) { + // If both ends are spikes we should simply + // delete all the points. (they should be in a loop) + point_ptr itr = path.start_1; + while (itr != nullptr) { + itr->prev->next = nullptr; + itr->prev = nullptr; + itr->ring = nullptr; + itr = itr->next; + } + return { nullptr, nullptr }; + } else if (spike_left) { + point_ptr prev = path.start_2->prev; + point_ptr itr = path.start_2; + while (itr != path.end_1) { + itr->prev->next = nullptr; + itr->prev = nullptr; + itr->ring = nullptr; + itr = itr->next; + } + prev->next = path.end_1; + path.end_1->prev = prev; + return { path.end_1, nullptr }; + } else if (spike_right) { + point_ptr prev = path.start_1->prev; + point_ptr itr = path.start_1; + while (itr != path.end_2) { + itr->prev->next = nullptr; + itr->prev = nullptr; + itr->ring = nullptr; + itr = itr->next; + } + prev->next = path.end_2; + path.end_2->prev = prev; + return { path.end_2, nullptr }; + } else { + point_ptr prev_1 = path.start_1->prev; + point_ptr prev_2 = path.start_2->prev; + point_ptr itr = path.start_1; + do { + itr->prev->next = nullptr; + itr->prev = nullptr; + itr->ring = nullptr; + itr = itr->next; + } while (itr != path.end_1 && itr != nullptr); + itr = path.start_2; + do { + itr->prev->next = nullptr; + itr->prev = nullptr; + itr->ring = nullptr; + itr = itr->next; + } while (itr != path.end_2 && itr != nullptr); + if (path.start_1 == path.end_1 && path.start_2 == path.end_2) { + return { nullptr, nullptr }; + } else if (path.start_1 == path.end_1) { + prev_2->next = path.end_2; + path.end_2->prev = prev_2; + return { path.end_2, nullptr }; + } else if (path.start_2 == path.end_2) { + prev_1->next = path.end_1; + path.end_1->prev = prev_1; + return { path.end_1, nullptr }; + } else { + prev_1->next = path.end_2; + path.end_2->prev = prev_1; + prev_2->next = path.end_1; + path.end_1->prev = prev_2; + return { path.end_1, path.end_2 }; + } + } +} + +template +collinear_path find_start_and_end_of_collinear_edges(point_ptr pt_a, point_ptr pt_b) { + // Search backward on A, forwards on B first + bool same_ring = pt_a->ring == pt_b->ring; + point_ptr back = pt_a; + point_ptr forward = pt_b; + bool first = true; + do { + while (*(back->prev) == *back && back != forward) { + back = back->prev; + if (back == pt_a) { + break; + } + } + if (back == forward) { + back = back->prev; + forward = forward->next; + break; + } + while (*(forward->next) == *forward && back != forward) { + forward = forward->next; + if (forward == pt_b) { + break; + } + } + if (!first && (back == pt_a || forward == pt_b)) { + break; + } + if (back == forward) { + back = back->prev; + forward = forward->next; + break; + } + back = back->prev; + forward = forward->next; + first = false; + } while (*back == *forward); + point_ptr start_a = back->next; + // If there are repeated points at the diverge we want to select + // only the first of those repeated points. + while (!same_ring && *start_a == *start_a->next && start_a != pt_a) { + start_a = start_a->next; + } + point_ptr end_b = forward->prev; + while (!same_ring && *end_b == *end_b->prev && end_b != pt_b) { + end_b = end_b->prev; + } + // Search backward on B, forwards on A next + back = pt_b; + forward = pt_a; + first = true; + do { + while (*(back->prev) == *back && back != forward) { + back = back->prev; + if (back == pt_b) { + break; + } + } + if (back == forward) { + back = back->prev; + forward = forward->next; + break; + } + while (*(forward->next) == *forward && back != forward) { + forward = forward->next; + if (forward == pt_a) { + break; + } + } + if (!first && (back == pt_b || forward == pt_a)) { + break; + } + if (back == forward || (!first && (back == end_b || forward == start_a))) { + back = back->prev; + forward = forward->next; + break; + } + back = back->prev; + forward = forward->next; + first = false; + } while (*back == *forward); + point_ptr start_b = back->next; + while (!same_ring && *start_b == *start_b->next && start_b != pt_b) { + start_b = start_b->next; + } + point_ptr end_a = forward->prev; + while (!same_ring && *end_a == *end_a->prev && end_a != pt_a) { + end_a = end_a->prev; + } + return { start_a, end_a, start_b, end_b }; +} + +template +bool has_collinear_edge(point_ptr pt_a, point_ptr pt_b) { + // It is assumed pt_a and pt_b are at the same location. + return (*pt_a->next == *pt_b->prev || *pt_b->next == *pt_a->prev); +} + +template +void process_collinear_edges_same_ring(point_ptr pt_a, + point_ptr pt_b, + ring_manager& manager) { + ring_ptr original_ring = pt_a->ring; + // As they are the same ring that are forming a collinear edge + // we should expect the creation of two different rings. + auto path = find_start_and_end_of_collinear_edges(pt_a, pt_b); + auto results = fix_collinear_path(path); + if (results.pt1 == nullptr) { + // If pt1 is a nullptr, both values + // are nullptrs. This mean the ring was + // removed during this processing. + remove_ring(original_ring, manager, false); + } else if (results.pt2 == nullptr) { + // If a single point is only returned, we simply removed a spike. + // In this case, we don't need to worry about parent or children + // and we simply need to set the points and clear the area + original_ring->points = results.pt1; + original_ring->recalculate_stats(); + } else { + // If we have two seperate points, the ring has split into + // two different rings. + ring_ptr ring_new = create_new_ring(manager); + ring_new->points = results.pt2; + ring_new->recalculate_stats(); + update_points_ring(ring_new); + original_ring->points = results.pt1; + original_ring->recalculate_stats(); + } +} + +template +void process_collinear_edges_different_rings(point_ptr pt_a, + point_ptr pt_b, + ring_manager& manager) { + ring_ptr ring_a = pt_a->ring; + ring_ptr ring_b = pt_b->ring; + bool ring_a_larger = std::fabs(ring_a->area()) > std::fabs(ring_b->area()); + auto path = find_start_and_end_of_collinear_edges(pt_a, pt_b); + // This should result in two rings becoming one. + auto results = fix_collinear_path(path); + if (results.pt1 == nullptr) { + remove_ring(ring_a, manager, false); + remove_ring(ring_b, manager, false); + return; + } + // Rings should merge into a single ring of the same orientation. + // Therefore, we we will need to replace one ring with the other + ring_ptr merged_ring = ring_a_larger ? ring_a : ring_b; + ring_ptr deleted_ring = ring_a_larger ? ring_b : ring_a; + + merged_ring->points = results.pt1; + update_points_ring(merged_ring); + merged_ring->recalculate_stats(); + if (merged_ring->size() < 3) { + remove_ring_and_points(merged_ring, manager, false); + } + remove_ring(deleted_ring, manager, false); +} + +template +bool remove_duplicate_points(point_ptr pt_a, point_ptr pt_b, ring_manager& manager) { + if (pt_a->ring == pt_b->ring) { + if (pt_a->next == pt_b) { + pt_a->next = pt_b->next; + pt_a->next->prev = pt_a; + pt_b->next = nullptr; + pt_b->prev = nullptr; + pt_b->ring = nullptr; + if (pt_a->ring->points == pt_b) { + pt_a->ring->points = pt_a; + } + return true; + } else if (pt_b->next == pt_a) { + pt_a->prev = pt_b->prev; + pt_a->prev->next = pt_a; + pt_b->next = nullptr; + pt_b->prev = nullptr; + pt_b->ring = nullptr; + if (pt_a->ring->points == pt_b) { + pt_a->ring->points = pt_a; + } + return true; + } + } + while (*pt_a->next == *pt_a && pt_a->next != pt_a) { + point_ptr remove = pt_a->next; + pt_a->next = remove->next; + pt_a->next->prev = pt_a; + remove->next = nullptr; + remove->prev = nullptr; + remove->ring = nullptr; + if (pt_a->ring->points == remove) { + pt_a->ring->points = pt_a; + } + } + while (*pt_a->prev == *pt_a && pt_a->prev != pt_a) { + point_ptr remove = pt_a->prev; + pt_a->prev = remove->prev; + pt_a->prev->next = pt_a; + remove->next = nullptr; + remove->prev = nullptr; + remove->ring = nullptr; + if (pt_a->ring->points == remove) { + pt_a->ring->points = pt_a; + } + } + if (pt_a->next == pt_a) { + remove_ring_and_points(pt_a->ring, manager, false); + return true; + } + if (pt_b->ring == nullptr) { + return true; + } + while (*pt_b->next == *pt_b && pt_b->next != pt_b) { + point_ptr remove = pt_b->next; + pt_b->next = remove->next; + pt_b->next->prev = pt_b; + remove->next = nullptr; + remove->prev = nullptr; + remove->ring = nullptr; + if (pt_b->ring->points == remove) { + pt_b->ring->points = pt_b; + } + } + while (*pt_b->prev == *pt_b && pt_b->prev != pt_b) { + point_ptr remove = pt_b->prev; + pt_b->prev = remove->prev; + pt_b->prev->next = pt_b; + remove->next = nullptr; + remove->prev = nullptr; + remove->ring = nullptr; + if (pt_b->ring->points == remove) { + pt_b->ring->points = pt_b; + } + } + if (pt_b->next == pt_b) { + remove_ring_and_points(pt_b->ring, manager, false); + return true; + } + if (pt_a->ring == nullptr) { + return true; + } + return false; +} + +template +bool process_collinear_edges(point_ptr pt_a, point_ptr pt_b, ring_manager& manager) { + // Neither point assigned to a ring (deleted points) + if (!pt_a->ring || !pt_b->ring) { + return false; + } + + if (remove_duplicate_points(pt_a, pt_b, manager)) { + return true; + } + + if (!has_collinear_edge(pt_a, pt_b)) { + if (pt_a->ring == pt_b->ring) { + correct_self_intersection(pt_a, pt_b, manager); + return true; + } + return false; + } + + if (pt_a->ring == pt_b->ring) { + process_collinear_edges_same_ring(pt_a, pt_b, manager); + } else { + process_collinear_edges_different_rings(pt_a, pt_b, manager); + } + return true; +} + +template +void correct_collinear_repeats(ring_manager& manager, + point_vector_itr const& begin, + point_vector_itr const& end) { + for (auto itr1 = begin; itr1 != end; ++itr1) { + if ((*itr1)->ring == nullptr) { + continue; + } + for (auto itr2 = begin; itr2 != end;) { + if ((*itr1)->ring == nullptr) { + break; + } + if ((*itr2)->ring == nullptr || *itr2 == *itr1) { + ++itr2; + continue; + } + if (process_collinear_edges(*itr1, *itr2, manager)) { + itr2 = begin; + } else { + ++itr2; + } + } + } +} + +template +void correct_collinear_edges(ring_manager& manager) { + + if (manager.all_points.size() < 2) { + return; + } + std::size_t count = 0; + auto prev_itr = manager.all_points.begin(); + auto itr = std::next(prev_itr); + while (itr != manager.all_points.end()) { + if (*(*prev_itr) == *(*(itr))) { + ++count; + ++prev_itr; + ++itr; + if (itr != manager.all_points.end()) { + continue; + } else { + ++prev_itr; + } + } else { + ++prev_itr; + ++itr; + } + if (count == 0) { + continue; + } + auto first = prev_itr; + std::advance(first, -(static_cast(count) + 1)); + correct_collinear_repeats(manager, first, prev_itr); + count = 0; + } +} + +template +void correct_tree(ring_manager& manager) { + + // It is possible that vatti resulted in some parent child + // relationships that are not quite right, therefore, we + // need to just rebuild the entire tree of rings + + // First lets process the rings in order of size from largest + // area to smallest, we know right away that no smaller ring could ever + // contain a larger ring so we can use this to our advantage + // as we iterate over the rings. + using rev_itr = typename ring_vector::reverse_iterator; + ring_vector sorted_rings = sort_rings_largest_to_smallest(manager); + for (auto itr = sorted_rings.begin(); itr != sorted_rings.end(); ++itr) { + if ((*itr)->points == nullptr) { + continue; + } + if ((*itr)->size() < 3 || value_is_zero((*itr)->area())) { + remove_ring_and_points(*itr, manager, false); + continue; + } + (*itr)->corrected = true; + bool found = false; + // Search in reverse from the current iterator back to the begining + // to see if any of those rings might be its parent. + for (auto r_itr = rev_itr(itr); r_itr != sorted_rings.rend(); ++r_itr) { + // If orientations are not different, this can't be its parent. + if ((*r_itr)->is_hole() == (*itr)->is_hole()) { + continue; + } + if (poly2_contains_poly1(*itr, *r_itr)) { + reassign_as_child(*itr, *r_itr, manager); + found = true; + break; + } + } + if (!found) { + if ((*itr)->is_hole()) { + throw std::runtime_error("Could not properly place hole to a parent."); + } else { + // Assign to base of tree by passing nullptr + reassign_as_child(*itr, static_cast>(nullptr), manager); + } + } + } +} + +template +bool correct_self_intersections(ring_manager& manager, bool correct_tree) { + bool fixed_intersections = false; + auto sorted_rings = sort_rings_smallest_to_largest(manager); + for (auto const& r : sorted_rings) { + if (correct_ring_self_intersections(manager, r, correct_tree)) { + fixed_intersections = true; + } + } + return fixed_intersections; +} + +template +void correct_topology(ring_manager& manager) { + + // Sort all the points, this will be used for the locating of chained rings + // and the collinear edges and only needs to be done once. + std::stable_sort(manager.all_points.begin(), manager.all_points.end(), point_ptr_cmp()); + + // Initially the orientations of the rings + // could be incorrect, we need to adjust them + correct_orientations(manager); + + // We should only have to fix collinear edges once. + // During this we also correct self intersections + correct_collinear_edges(manager); + + correct_self_intersections(manager, false); + + correct_tree(manager); + + bool fixed_intersections = true; + while (fixed_intersections) { + correct_chained_rings(manager); + fixed_intersections = correct_self_intersections(manager, true); + } +} +} +} +} diff --git a/src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/util.hpp b/src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/util.hpp new file mode 100644 index 0000000..c7fedae --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/util.hpp @@ -0,0 +1,85 @@ +#pragma once + +#include + +#include +#include +#include + +namespace mapbox { +namespace geometry { +namespace wagyu { + +template +double area(mapbox::geometry::linear_ring const& poly) { + std::size_t size = poly.size(); + if (size < 3) { + return 0.0; + } + + double a = 0.0; + auto itr = poly.begin(); + auto itr_prev = poly.end(); + --itr_prev; + a += static_cast(itr_prev->x + itr->x) * static_cast(itr_prev->y - itr->y); + ++itr; + itr_prev = poly.begin(); + for (; itr != poly.end(); ++itr, ++itr_prev) { + a += static_cast(itr_prev->x + itr->x) * static_cast(itr_prev->y - itr->y); + } + return -a * 0.5; +} + +inline bool value_is_zero(double val) { + return std::fabs(val) < (5.0 * std::numeric_limits::epsilon()); +} + +inline bool values_are_equal(double x, double y) { + return value_is_zero(x - y); +} + +inline bool greater_than_or_equal(double x, double y) { + return x > y || values_are_equal(x, y); +} + +template +bool slopes_equal(mapbox::geometry::point const& pt1, + mapbox::geometry::point const& pt2, + mapbox::geometry::point const& pt3) { + return (pt1.y - pt2.y) * (pt2.x - pt3.x) == (pt1.x - pt2.x) * (pt2.y - pt3.y); +} + +template +bool slopes_equal(mapbox::geometry::wagyu::point const& pt1, + mapbox::geometry::wagyu::point const& pt2, + mapbox::geometry::point const& pt3) { + return (pt1.y - pt2.y) * (pt2.x - pt3.x) == (pt1.x - pt2.x) * (pt2.y - pt3.y); +} + +template +bool slopes_equal(mapbox::geometry::wagyu::point const& pt1, + mapbox::geometry::wagyu::point const& pt2, + mapbox::geometry::wagyu::point const& pt3) { + return (pt1.y - pt2.y) * (pt2.x - pt3.x) == (pt1.x - pt2.x) * (pt2.y - pt3.y); +} + +template +bool slopes_equal(mapbox::geometry::point const& pt1, + mapbox::geometry::point const& pt2, + mapbox::geometry::point const& pt3, + mapbox::geometry::point const& pt4) { + return (pt1.y - pt2.y) * (pt3.x - pt4.x) == (pt1.x - pt2.x) * (pt3.y - pt4.y); +} + +template +inline T wround(double value) { + return static_cast(::llround(value)); +} + +template <> +inline std::int64_t wround(double value) { + return ::llround(value); +} +} +} +} diff --git a/src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/vatti.hpp b/src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/vatti.hpp new file mode 100644 index 0000000..e75e72c --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/vatti.hpp @@ -0,0 +1,66 @@ +#pragma once + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace mapbox { +namespace geometry { +namespace wagyu { + +template +void execute_vatti(local_minimum_list& minima_list, + ring_manager& manager, + clip_type cliptype, + fill_type subject_fill_type, + fill_type clip_fill_type) { + active_bound_list active_bounds; + scanbeam_list scanbeam; + T scanline_y = std::numeric_limits::max(); + + local_minimum_ptr_list minima_sorted; + minima_sorted.reserve(minima_list.size()); + for (auto& lm : minima_list) { + minima_sorted.push_back(&lm); + } + std::stable_sort(minima_sorted.begin(), minima_sorted.end(), local_minimum_sorter()); + local_minimum_ptr_list_itr current_lm = minima_sorted.begin(); + // std::clog << output_all_edges(minima_sorted) << std::endl; + + setup_scanbeam(minima_list, scanbeam); + manager.current_hp_itr = manager.hot_pixels.begin(); + + while (pop_from_scanbeam(scanline_y, scanbeam) || current_lm != minima_sorted.end()) { + + process_intersections(scanline_y, active_bounds, cliptype, subject_fill_type, + clip_fill_type, manager); + + update_current_hp_itr(scanline_y, manager); + + // First we process bounds that has already been added to the active bound list -- + // if the active bound list is empty local minima that are at this scanline_y and + // have a horizontal edge at the local minima will be processed + process_edges_at_top_of_scanbeam(scanline_y, active_bounds, scanbeam, minima_sorted, + current_lm, manager, cliptype, subject_fill_type, + clip_fill_type); + + // Next we will add local minima bounds to the active bounds list that are on the local + // minima queue at + // this current scanline_y + insert_local_minima_into_ABL(scanline_y, minima_sorted, current_lm, active_bounds, manager, + scanbeam, cliptype, subject_fill_type, clip_fill_type); + } +} +} +} +} diff --git a/src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/wagyu.hpp b/src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/wagyu.hpp new file mode 100644 index 0000000..8490337 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/deps/wagyu/0.4.3/include/mapbox/geometry/wagyu/wagyu.hpp @@ -0,0 +1,141 @@ +#pragma once + +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#define WAGYU_MAJOR_VERSION 0 +#define WAGYU_MINOR_VERSION 4 +#define WAGYU_PATCH_VERSION 3 + +#define WAGYU_VERSION \ + (WAGYU_MAJOR_VERSION * 100000) + (WAGYU_MINOR_VERSION * 100) + (WAGYU_PATCH_VERSION) + +namespace mapbox { +namespace geometry { +namespace wagyu { + +template +class wagyu { +private: + local_minimum_list minima_list; + bool reverse_output; + + wagyu(wagyu const&) = delete; + wagyu& operator=(wagyu const&) = delete; + +public: + wagyu() : minima_list(), reverse_output(false) { + } + + ~wagyu() { + clear(); + } + + template + bool add_ring(mapbox::geometry::linear_ring const& pg, + polygon_type p_type = polygon_type_subject) { + return add_linear_ring(pg, minima_list, p_type); + } + + template + bool add_polygon(mapbox::geometry::polygon const& ppg, + polygon_type p_type = polygon_type_subject) { + bool result = false; + for (auto const& r : ppg) { + if (add_ring(r, p_type)) { + result = true; + } + } + return result; + } + + void reverse_rings(bool value) { + reverse_output = value; + } + + void clear() { + minima_list.clear(); + } + + mapbox::geometry::box get_bounds() { + mapbox::geometry::point min = { 0, 0 }; + mapbox::geometry::point max = { 0, 0 }; + if (minima_list.empty()) { + return mapbox::geometry::box(min, max); + } + bool first_set = false; + for (auto const& lm : minima_list) { + if (!lm.left_bound.edges.empty()) { + if (!first_set) { + min = lm.left_bound.edges.front().top; + max = lm.left_bound.edges.back().bot; + first_set = true; + } else { + min.y = std::min(min.y, lm.left_bound.edges.front().top.y); + max.y = std::max(max.y, lm.left_bound.edges.back().bot.y); + max.x = std::max(max.x, lm.left_bound.edges.back().top.x); + min.x = std::min(min.x, lm.left_bound.edges.back().top.x); + } + for (auto const& e : lm.left_bound.edges) { + max.x = std::max(max.x, e.bot.x); + min.x = std::min(min.x, e.bot.x); + } + } + if (!lm.right_bound.edges.empty()) { + if (!first_set) { + min = lm.right_bound.edges.front().top; + max = lm.right_bound.edges.back().bot; + first_set = true; + } else { + min.y = std::min(min.y, lm.right_bound.edges.front().top.y); + max.y = std::max(max.y, lm.right_bound.edges.back().bot.y); + max.x = std::max(max.x, lm.right_bound.edges.back().top.x); + min.x = std::min(min.x, lm.right_bound.edges.back().top.x); + } + for (auto const& e : lm.right_bound.edges) { + max.x = std::max(max.x, e.bot.x); + min.x = std::min(min.x, e.bot.x); + } + } + } + return mapbox::geometry::box(min, max); + } + + template + bool execute(clip_type cliptype, + mapbox::geometry::multi_polygon& solution, + fill_type subject_fill_type, + fill_type clip_fill_type) { + + if (minima_list.empty()) { + return false; + } + + ring_manager manager; + + build_hot_pixels(minima_list, manager); + + execute_vatti(minima_list, manager, cliptype, subject_fill_type, clip_fill_type); + + correct_topology(manager); + + build_result(solution, manager, reverse_output); + + return true; + } +}; +} +} +} diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/actor/actor.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/actor/actor.hpp new file mode 100644 index 0000000..0052fad --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/actor/actor.hpp @@ -0,0 +1,69 @@ +#pragma once + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +namespace mbgl { + +/* + An `Actor` is an owning reference to an asynchronous object of type `O`: an "actor". + Communication with an actor happens via message passing: you send a message to the object + (using `invoke`), passing a pointer to the member function to call and arguments which + are then forwarded to the actor. + + The actor receives messages sent to it asynchronously, in a manner defined its `Scheduler`. + To store incoming messages before their receipt, each actor has a `Mailbox`, which acts as + a FIFO queue. Messages sent from actor S to actor R are guaranteed to be processed in the + order sent. However, relative order of messages sent by two *different* actors S1 and S2 + to R is *not* guaranteed (and can't be: S1 and S2 may be acting asynchronously with respect + to each other). + + An `Actor` can be converted to an `ActorRef`, a non-owning value object representing + a (weak) reference to the actor. Messages can be sent via the `Ref` as well. + + It's safe -- and encouraged -- to pass `Ref`s between actors via messages. This is how two-way + communication and other forms of collaboration between multiple actors is accomplished. + + It's safe for a `Ref` to outlive its `Actor` -- the reference is "weak", and does not extend + the lifetime of the owning Actor, and sending a message to a `Ref` whose `Actor` has died is + a no-op. (In the future, a dead-letters queue or log may be implemented.) + + Construction and destruction of an Actor is synchronous: the corresponding `O` + object is constructed synchronously by the `Actor` constructor, and destructed synchronously + by the `~Actor` destructor, after ensuring that the `O` is not currently receiving an + asynchronous message. The constructor of `O` is passed an `ActorRef` referring to itself + (which it can use to self-send messages), followed by the forwarded arguments passed to + `Actor`. Asynchronous object construction can be accomplished by directly using the + lower-level types, `AspiringActor` and `EstablishedActor`. + + Please don't send messages that contain shared pointers or references. That subverts the + purpose of the actor model: prohibiting direct concurrent access to shared state. +*/ +template +class Actor { +public: + template + Actor(Scheduler& scheduler, Args&&... args) + : target(scheduler, parent, std::forward(args)...) {} + + Actor(const Actor&) = delete; + + ActorRef> self() { + return parent.self(); + } + +private: + AspiringActor parent; + EstablishedActor target; +}; + +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/actor/actor_ref.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/actor/actor_ref.hpp new file mode 100644 index 0000000..958ee37 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/actor/actor_ref.hpp @@ -0,0 +1,64 @@ +#pragma once + +#include +#include + +#include + +namespace mbgl { + +/* + An `ActorRef` is a *non*-owning, weak reference to an actor of type `O`. You can send it + messages just like an `Actor`. It's a value object: safe to copy and pass between actors + via messages. + + An `ActorRef` does not extend the lifetime of the corresponding `Actor`. That's determined + entirely by whichever object owns the `Actor` -- the actor's "supervisor". + + It's safe for a `Ref` to outlive its `Actor` -- the reference is "weak", and does not extend + the lifetime of the owning Actor, and sending a message to a `Ref` whose `Actor` has died is + a no-op. (In the future, a dead-letters queue or log may be implemented.) +*/ + +template +class ActorRef { +public: + ActorRef(Object& object_, std::weak_ptr weakMailbox_) + : object(&object_), + weakMailbox(std::move(weakMailbox_)) { + } + + template + void invoke(Fn fn, Args&&... args) { + if (auto mailbox = weakMailbox.lock()) { + mailbox->push(actor::makeMessage(*object, fn, std::forward(args)...)); + } + } + + template + auto ask(Fn fn, Args&&... args) { + // Result type is deduced from the function's return type + using ResultType = typename std::result_of::type; + + std::promise promise; + auto future = promise.get_future(); + + if (auto mailbox = weakMailbox.lock()) { + mailbox->push( + actor::makeMessage( + std::move(promise), *object, fn, std::forward(args)... + ) + ); + } else { + promise.set_exception(std::make_exception_ptr(std::runtime_error("Actor has gone away"))); + } + + return future; + } + +private: + Object* object; + std::weak_ptr weakMailbox; +}; + +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/actor/aspiring_actor.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/actor/aspiring_actor.hpp new file mode 100644 index 0000000..6c410cd --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/actor/aspiring_actor.hpp @@ -0,0 +1,60 @@ +#pragma once + +#include +#include +#include + +#include +#include +#include +#include + +namespace mbgl { + +template +class EstablishedActor; + +template +class Actor; + +/* + An `AspiringActor` is one half of the pair of types that comprise an actor (see `Actor`), + the other half being `EstablishedActor`. It is responsible for: + - ownership of the actor's `Mailbox` + - allocating the memory for (but *not* constructing) the target object `O` + + Using these two pieces--the mailbox and a stable address for `O`--an `AspiringActor` can + accept messages for the target object, or provide `ActorRef`s that do so, before the object + has actually been constructed by the corresponding `EstablishedActor`. (Such messages are + queued in the mailbox until after the object is constructed.) + + This allows for an `AspiringActor` to be created and safely used by a thread other than the + one on which the target object will (eventually) live. +*/ +template +class AspiringActor { +public: + AspiringActor() : mailbox(std::make_shared()) { + // mailbox starts closed because the `Object` hasn't yet been constructed + assert(!mailbox->isOpen()); + } + + AspiringActor(const AspiringActor&) = delete; + + ActorRef> self() { + return ActorRef>(object(), mailbox); + } + +private: + std::shared_ptr mailbox; + std::aligned_storage_t objectStorage; + + Object& object() { + return *reinterpret_cast(&objectStorage); + } + + friend class EstablishedActor; + friend class Actor; +}; + +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/actor/established_actor.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/actor/established_actor.hpp new file mode 100644 index 0000000..da0d8ac --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/actor/established_actor.hpp @@ -0,0 +1,80 @@ +#pragma once + +#include +#include +#include +#include + +#include +#include +#include +#include + +namespace mbgl { + +/* + An `EstablishedActor` is one half of the pair of types that comprise an actor (see `Actor`), + the other half being `AspiringActor`. It is responsible for managing the lifetime of the + target object `O` and the open/closed state of the parent's `mailbox`. + + The `O` object's lifetime is contained by that of its owning `EstablishedActor`: the + `EstablishedActor` constructor executes the `O` constructor via "placement new", constructing + it at the address provided by the parent `AspiringActor`, and the `~EstablishedActor` destructor + similarly executes the `~O` destructor (after closing the mailbox). `EstablishedActor` should + therefore live entirely on the thread intended to own `O`. +*/ + +template +class EstablishedActor { +public: + // Construct the Object from a parameter pack `args` (i.e. `Object(args...)`) + template ::value || + std::is_constructible, Args...>::value + >::type * = nullptr> + EstablishedActor(Scheduler& scheduler, AspiringActor& parent_, Args&& ... args) + : parent(parent_) { + emplaceObject(std::forward(args)...); + parent.mailbox->open(scheduler); + } + + // Construct the `Object` from a tuple containing the constructor arguments (i.e. + // `Object(std::get<0>(args), std::get<1>(args), ...)`) + template >::value> + EstablishedActor(Scheduler& scheduler, AspiringActor& parent_, ArgsTuple&& args) + : parent(parent_) { + emplaceObject(std::forward(args), std::make_index_sequence{}); + parent.mailbox->open(scheduler); + } + + EstablishedActor(const EstablishedActor&) = delete; + + ~EstablishedActor() { + parent.mailbox->close(); + parent.object().~Object(); + } + +private: + // Enabled for Objects with a constructor taking ActorRef as the first parameter + template , Args...>::value>::type * = nullptr> + void emplaceObject(Args&&... args_) { + new (&parent.objectStorage) Object(parent.self(), std::forward(args_)...); + } + + // Enabled for plain Objects + template ::value>::type * = nullptr> + void emplaceObject(Args&&... args_) { + new (&parent.objectStorage) Object(std::forward(args_)...); + } + + // Used to expand a tuple holding the constructor arguments + template + void emplaceObject(ArgsTuple&& args, std::index_sequence) { + emplaceObject(std::move(std::get(std::forward(args)))...); + (void) args; // mark args as used: if it's empty tuple, it's not actually used above. + } + + AspiringActor& parent; +}; + +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/actor/mailbox.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/actor/mailbox.hpp new file mode 100644 index 0000000..23c5799 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/actor/mailbox.hpp @@ -0,0 +1,50 @@ +#pragma once + +#include + +#include +#include +#include + +namespace mbgl { + +class Scheduler; +class Message; + +class Mailbox : public std::enable_shared_from_this { +public: + + // Create a "holding" mailbox, messages to which will remain queued, + // unconsumed, until the mailbox is associated with a Scheduler using + // start(). This allows a Mailbox object to be created on one thread and + // later transferred to a different target thread that may not yet exist. + Mailbox(); + + Mailbox(Scheduler&); + + // Attach the given scheduler to this mailbox and begin processing messages + // sent to it. The mailbox must be a "holding" mailbox, as created by the + // default constructor Mailbox(). + void open(Scheduler& scheduler_); + void close(); + + bool isOpen() const; + + void push(std::unique_ptr); + void receive(); + + static void maybeReceive(std::weak_ptr); + +private: + optional scheduler; + + std::recursive_mutex receivingMutex; + std::mutex pushingMutex; + + bool closed { false }; + + std::mutex queueMutex; + std::queue> queue; +}; + +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/actor/message.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/actor/message.hpp new file mode 100644 index 0000000..0a20993 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/actor/message.hpp @@ -0,0 +1,108 @@ +#pragma once + +#include + +#include +#include + +namespace mbgl { + +// A movable type-erasing function wrapper. This allows to store arbitrary invokable +// things (like std::function<>, or the result of a movable-only std::bind()) in the queue. +// Source: http://stackoverflow.com/a/29642072/331379 +class Message { +public: + virtual ~Message() = default; + virtual void operator()() = 0; +}; + +template +class MessageImpl : public Message { +public: + MessageImpl(Object& object_, MemberFn memberFn_, ArgsTuple argsTuple_) + : object(object_), + memberFn(memberFn_), + argsTuple(std::move(argsTuple_)) { + } + + void operator()() override { + invoke(std::make_index_sequence::value>()); + } + + template + void invoke(std::index_sequence) { + (object.*memberFn)(std::move(std::get(argsTuple))...); + } + + Object& object; + MemberFn memberFn; + ArgsTuple argsTuple; +}; + +template +class AskMessageImpl : public Message { +public: + AskMessageImpl(std::promise promise_, Object& object_, MemberFn memberFn_, ArgsTuple argsTuple_) + : object(object_), + memberFn(memberFn_), + argsTuple(std::move(argsTuple_)), + promise(std::move(promise_)) { + } + + void operator()() override { + promise.set_value(ask(std::make_index_sequence::value>())); + } + + template + ResultType ask(std::index_sequence) { + return (object.*memberFn)(std::move(std::get(argsTuple))...); + } + + Object& object; + MemberFn memberFn; + ArgsTuple argsTuple; + std::promise promise; +}; + +template +class AskMessageImpl : public Message { +public: + AskMessageImpl(std::promise promise_, Object& object_, MemberFn memberFn_, ArgsTuple argsTuple_) + : object(object_), + memberFn(memberFn_), + argsTuple(std::move(argsTuple_)), + promise(std::move(promise_)) { + } + + void operator()() override { + ask(std::make_index_sequence::value>()); + promise.set_value(); + } + + template + void ask(std::index_sequence) { + (object.*memberFn)(std::move(std::get(argsTuple))...); + } + + Object& object; + MemberFn memberFn; + ArgsTuple argsTuple; + std::promise promise; +}; + +namespace actor { + +template +std::unique_ptr makeMessage(Object& object, MemberFn memberFn, Args&&... args) { + auto tuple = std::make_tuple(std::forward(args)...); + return std::make_unique>(object, memberFn, std::move(tuple)); +} + +template +std::unique_ptr makeMessage(std::promise&& promise, Object& object, MemberFn memberFn, Args&&... args) { + auto tuple = std::make_tuple(std::forward(args)...); + return std::make_unique>(std::move(promise), object, memberFn, std::move(tuple)); +} + +} // namespace actor +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/actor/scheduler.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/actor/scheduler.hpp new file mode 100644 index 0000000..75ead29 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/actor/scheduler.hpp @@ -0,0 +1,46 @@ +#pragma once + +#include + +namespace mbgl { + +class Mailbox; + +/* + A `Scheduler` is responsible for coordinating the processing of messages by + one or more actors via their mailboxes. It's an abstract interface. Currently, + the following concrete implementations exist: + + * `ThreadPool` can coordinate an unlimited number of actors over any number of + threads via a pool, preserving the following behaviors: + + - Messages from each individual mailbox are processed in order + - Only a single message from a mailbox is processed at a time; there is no + concurrency within a mailbox + + Subject to these constraints, processing can happen on whatever thread in the + pool is available. + + * `Scheduler::GetCurrent()` is typically used to create a mailbox and `ActorRef` + for an object that lives on the main thread and is not itself wrapped an + `Actor`. The underlying implementation of this Scheduler should usually be + a `RunLoop` + auto mailbox = std::make_shared(*Scheduler::Get()); + Actor worker(threadPool, ActorRef(*this, mailbox)); +*/ +class Scheduler { +public: + virtual ~Scheduler() = default; + + // Used by a Mailbox when it has a message in its queue to request that it + // be scheduled. Specifically, the scheduler is expected to asynchronously + // call `receive() on the given mailbox, provided it still exists at that + // time. + virtual void schedule(std::weak_ptr) = 0; + + // Set/Get the current Scheduler for this thread + static Scheduler* GetCurrent(); + static void SetCurrent(Scheduler*); +}; + +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/annotation/annotation.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/annotation/annotation.hpp new file mode 100644 index 0000000..bbe479b --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/annotation/annotation.hpp @@ -0,0 +1,73 @@ +#pragma once + +#include +#include +#include +#include +#include + +#include +#include +#include + +namespace mbgl { + +using AnnotationID = uint32_t; +using AnnotationIDs = std::vector; + +class SymbolAnnotation { +public: + SymbolAnnotation(Point geometry_, std::string icon_ = {}) + : geometry(std::move(geometry_)), + icon(std::move(icon_)) {} + + Point geometry; + std::string icon; +}; + +using ShapeAnnotationGeometry = variant< + LineString, + Polygon, + MultiLineString, + MultiPolygon>; + +class LineAnnotation { +public: + LineAnnotation(ShapeAnnotationGeometry geometry_, + style::DataDrivenPropertyValue opacity_ = 1.0f, + style::DataDrivenPropertyValue width_ = 1.0f, + style::DataDrivenPropertyValue color_ = Color::black()) + : geometry(std::move(geometry_)), + opacity(std::move(opacity_)), + width(std::move(width_)), + color(std::move(color_)) {} + + ShapeAnnotationGeometry geometry; + style::DataDrivenPropertyValue opacity; + style::DataDrivenPropertyValue width; + style::DataDrivenPropertyValue color; +}; + +class FillAnnotation { +public: + FillAnnotation(ShapeAnnotationGeometry geometry_, + style::DataDrivenPropertyValue opacity_ = 1.0f, + style::DataDrivenPropertyValue color_ = Color::black(), + style::DataDrivenPropertyValue outlineColor_ = {}) + : geometry(std::move(geometry_)), + opacity(std::move(opacity_)), + color(std::move(color_)), + outlineColor(std::move(outlineColor_)) {} + + ShapeAnnotationGeometry geometry; + style::DataDrivenPropertyValue opacity; + style::DataDrivenPropertyValue color; + style::DataDrivenPropertyValue outlineColor; +}; + +using Annotation = variant< + SymbolAnnotation, + LineAnnotation, + FillAnnotation>; + +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/map/camera.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/map/camera.hpp new file mode 100644 index 0000000..53b5b59 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/map/camera.hpp @@ -0,0 +1,90 @@ +#pragma once + +#include +#include +#include +#include + +#include + +namespace mbgl { + +/** Various options for describing the viewpoint of a map. All fields are + optional. */ +struct CameraOptions { + /** Coordinate at the center of the map. */ + optional center; + + /** Padding around the interior of the view that affects the frame of + reference for `center`. */ + EdgeInsets padding; + + /** Point of reference for `zoom` and `angle`, assuming an origin at the + top-left corner of the view. */ + optional anchor; + + /** Zero-based zoom level. Constrained to the minimum and maximum zoom + levels. */ + optional zoom; + + /** Bearing, measured in radians counterclockwise from true north. Wrapped + to [−π rad, π rad). */ + optional angle; + + /** Pitch toward the horizon measured in radians, with 0 rad resulting in a + two-dimensional map. */ + optional pitch; +}; + +constexpr bool operator==(const CameraOptions& a, const CameraOptions& b) { + return a.center == b.center + && a.padding == b.padding + && a.anchor == b.anchor + && a.zoom == b.zoom + && a.angle == b.angle + && a.pitch == b.pitch; +} + +constexpr bool operator!=(const CameraOptions& a, const CameraOptions& b) { + return !(a == b); +} + +/** Various options for describing a transition between viewpoints with + animation. All fields are optional; the default values depend on how this + struct is used. */ +struct AnimationOptions { + /** Time to animate to the viewpoint defined herein. */ + optional duration; + + /** Average velocity of a flyTo() transition, measured in screenfuls per + second, assuming a linear timing curve. + + A screenful is the visible span in pixels. It does not correspond + to a fixed physical distance but rather varies by zoom level. */ + optional velocity; + + /** Zero-based zoom level at the peak of the flyTo() transition’s flight + path. */ + optional minZoom; + + /** The easing timing curve of the transition. */ + optional easing; + + /** A function that is called on each frame of the transition, just before a + screen update, except on the last frame. The first parameter indicates + the elapsed time as a percentage of the duration. */ + std::function transitionFrameFn; + + /** A function that is called once on the last frame of the transition, just + before the corresponding screen update. */ + std::function transitionFinishFn; + + /** Creates an animation with no options specified. */ + AnimationOptions() {} + + /** Creates an animation with the specified duration. */ + AnimationOptions(Duration d) + : duration(d) {} +}; + +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/map/change.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/map/change.hpp new file mode 100644 index 0000000..3925d65 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/map/change.hpp @@ -0,0 +1,26 @@ +#pragma once + +#include + +namespace mbgl { + +enum MapChange : uint8_t { + MapChangeRegionWillChange = 0, + MapChangeRegionWillChangeAnimated = 1, + MapChangeRegionIsChanging = 2, + MapChangeRegionDidChange = 3, + MapChangeRegionDidChangeAnimated = 4, + MapChangeWillStartLoadingMap = 5, + MapChangeDidFinishLoadingMap = 6, + MapChangeDidFailLoadingMap = 7, + MapChangeWillStartRenderingFrame = 8, + MapChangeDidFinishRenderingFrame = 9, + MapChangeDidFinishRenderingFrameFullyRendered = 10, + MapChangeWillStartRenderingMap = 11, + MapChangeDidFinishRenderingMap = 12, + MapChangeDidFinishRenderingMapFullyRendered = 13, + MapChangeDidFinishLoadingStyle = 14, + MapChangeSourceDidChange = 15 +}; + +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/map/map.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/map/map.hpp new file mode 100644 index 0000000..3aee932 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/map/map.hpp @@ -0,0 +1,177 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +namespace mbgl { + +class FileSource; +class Scheduler; +class RendererFrontend; + +namespace style { +class Image; +class Style; +} // namespace style + +class Map : private util::noncopyable { +public: + explicit Map(RendererFrontend&, + MapObserver&, + Size size, + float pixelRatio, + FileSource&, + Scheduler&, + MapMode mapMode = MapMode::Continuous, + ConstrainMode constrainMode = ConstrainMode::HeightOnly, + ViewportMode viewportMode = ViewportMode::Default); + ~Map(); + + // Register a callback that will get called (on the render thread) when all resources have + // been loaded and a complete render occurs. + using StillImageCallback = std::function; + void renderStill(StillImageCallback); + void renderStill(const CameraOptions&, MapDebugOptions, StillImageCallback); + + // Triggers a repaint. + void triggerRepaint(); + + style::Style& getStyle(); + const style::Style& getStyle() const; + + void setStyle(std::unique_ptr); + + // Transition + void cancelTransitions(); + void setGestureInProgress(bool); + bool isGestureInProgress() const; + bool isRotating() const; + bool isScaling() const; + bool isPanning() const; + + // Camera + CameraOptions getCameraOptions(const EdgeInsets&) const; + void jumpTo(const CameraOptions&); + void easeTo(const CameraOptions&, const AnimationOptions&); + void flyTo(const CameraOptions&, const AnimationOptions&); + CameraOptions cameraForLatLngBounds(const LatLngBounds&, const EdgeInsets&, optional bearing = {}, optional pitch = {}) const; + CameraOptions cameraForLatLngs(const std::vector&, const EdgeInsets&, optional bearing = {}, optional pitch = {}) const; + CameraOptions cameraForGeometry(const Geometry&, const EdgeInsets&, optional bearing = {}, optional pitch = {}) const; + LatLngBounds latLngBoundsForCamera(const CameraOptions&) const; + + // Position + void moveBy(const ScreenCoordinate&, const AnimationOptions& = {}); + void setLatLng(const LatLng&, optional, const AnimationOptions& = {}); + void setLatLng(const LatLng&, const EdgeInsets&, const AnimationOptions& = {}); + void setLatLng(const LatLng&, const AnimationOptions& = {}); + LatLng getLatLng(const EdgeInsets& = {}) const; + void resetPosition(const EdgeInsets& = {}); + + // Zoom + void setZoom(double zoom, const AnimationOptions& = {}); + void setZoom(double zoom, optional, const AnimationOptions& = {}); + void setZoom(double zoom, const EdgeInsets&, const AnimationOptions& = {}); + double getZoom() const; + void setLatLngZoom(const LatLng&, double zoom, const AnimationOptions& = {}); + void setLatLngZoom(const LatLng&, double zoom, const EdgeInsets&, const AnimationOptions& = {}); + void resetZoom(); + + // Bounds + void setLatLngBounds(optional); + optional getLatLngBounds() const; + void setMinZoom(double); + double getMinZoom() const; + void setMaxZoom(double); + double getMaxZoom() const; + void setMinPitch(double); + double getMinPitch() const; + void setMaxPitch(double); + double getMaxPitch() const; + + // Rotation + void rotateBy(const ScreenCoordinate& first, const ScreenCoordinate& second, const AnimationOptions& = {}); + void setBearing(double degrees, const AnimationOptions& = {}); + void setBearing(double degrees, optional, const AnimationOptions& = {}); + void setBearing(double degrees, const EdgeInsets&, const AnimationOptions& = {}); + double getBearing() const; + void resetNorth(const AnimationOptions& = {{mbgl::Milliseconds(500)}}); + void resetNorth(const EdgeInsets&, const AnimationOptions& = {{mbgl::Milliseconds(500)}}); + + // Pitch + void setPitch(double pitch, const AnimationOptions& = {}); + void setPitch(double pitch, optional, const AnimationOptions& = {}); + double getPitch() const; + + // North Orientation + void setNorthOrientation(NorthOrientation); + NorthOrientation getNorthOrientation() const; + + // Constrain mode + void setConstrainMode(ConstrainMode); + ConstrainMode getConstrainMode() const; + + // Viewport mode + void setViewportMode(ViewportMode); + ViewportMode getViewportMode() const; + + // Projection mode + void setAxonometric(bool); + bool getAxonometric() const; + void setXSkew(double ySkew); + double getXSkew() const; + void setYSkew(double ySkew); + double getYSkew() const; + + // Size + void setSize(Size); + Size getSize() const; + + // Projection + ScreenCoordinate pixelForLatLng(const LatLng&) const; + LatLng latLngForPixel(const ScreenCoordinate&) const; + + // Annotations + void addAnnotationImage(std::unique_ptr); + void removeAnnotationImage(const std::string&); + double getTopOffsetPixelsForAnnotationImage(const std::string&); + + AnnotationID addAnnotation(const Annotation&); + void updateAnnotation(AnnotationID, const Annotation&); + void removeAnnotation(AnnotationID); + + // Tile prefetching + // + // When loading a map, if `PrefetchZoomDelta` is set to any number greater than 0, the map will + // first request a tile for `zoom = getZoom() - delta` in a attempt to display a full map at + // lower resolution as quick as possible. It will get clamped at the tile source minimum zoom. + // The default `delta` is 4. + void setPrefetchZoomDelta(uint8_t delta); + uint8_t getPrefetchZoomDelta() const; + + // Debug + void setDebug(MapDebugOptions); + void cycleDebugOptions(); + MapDebugOptions getDebug() const; + + bool isFullyLoaded() const; + void dumpDebugLogs() const; + +private: + class Impl; + const std::unique_ptr impl; +}; + +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/map/map_observer.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/map/map_observer.hpp new file mode 100644 index 0000000..f63e5f2 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/map/map_observer.hpp @@ -0,0 +1,44 @@ +#pragma once + +#include + +#include +#include +#include + +namespace mbgl { + +class MapObserver { +public: + virtual ~MapObserver() = default; + + static MapObserver& nullObserver() { + static MapObserver mapObserver; + return mapObserver; + } + + enum class CameraChangeMode : uint32_t { + Immediate, + Animated + }; + + enum class RenderMode : uint32_t { + Partial, + Full + }; + + virtual void onCameraWillChange(CameraChangeMode) {} + virtual void onCameraIsChanging() {} + virtual void onCameraDidChange(CameraChangeMode) {} + virtual void onWillStartLoadingMap() {} + virtual void onDidFinishLoadingMap() {} + virtual void onDidFailLoadingMap(std::exception_ptr) {} + virtual void onWillStartRenderingFrame() {} + virtual void onDidFinishRenderingFrame(RenderMode) {} + virtual void onWillStartRenderingMap() {} + virtual void onDidFinishRenderingMap(RenderMode) {} + virtual void onDidFinishLoadingStyle() {} + virtual void onSourceChanged(style::Source&) {} +}; + +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/map/mode.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/map/mode.hpp new file mode 100644 index 0000000..4ee289d --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/map/mode.hpp @@ -0,0 +1,67 @@ +#pragma once + +#include +#include + +#include + +namespace mbgl { + +using EnumType = uint32_t; + +enum class MapMode : EnumType { + Continuous, // continually updating map + Static, // a once-off still image of an arbitrary viewport + Tile // a once-off still image of a single tile +}; + +// We can choose to constrain the map both horizontally or vertically, or only +// vertically e.g. while panning. +enum class ConstrainMode : EnumType { + None, + HeightOnly, + WidthAndHeight, +}; + +// Satisfies embedding platforms that requires the viewport coordinate systems +// to be set according to its standards. +enum class ViewportMode : EnumType { + Default, + FlippedY, +}; + +enum class MapDebugOptions : EnumType { + NoDebug = 0, + TileBorders = 1 << 1, + ParseStatus = 1 << 2, + Timestamps = 1 << 3, + Collision = 1 << 4, + Overdraw = 1 << 5, +// FIXME: https://github.com/mapbox/mapbox-gl-native/issues/5117 +#if not MBGL_USE_GLES2 + StencilClip = 1 << 6, + DepthBuffer = 1 << 7, +#endif // MBGL_USE_GLES2 +}; + +MBGL_CONSTEXPR MapDebugOptions operator|(MapDebugOptions lhs, MapDebugOptions rhs) { + return MapDebugOptions(mbgl::underlying_type(lhs) | mbgl::underlying_type(rhs)); +} + +MBGL_CONSTEXPR MapDebugOptions& operator|=(MapDebugOptions& lhs, MapDebugOptions rhs) { + return (lhs = MapDebugOptions(mbgl::underlying_type(lhs) | mbgl::underlying_type(rhs))); +} + +MBGL_CONSTEXPR bool operator&(MapDebugOptions lhs, MapDebugOptions rhs) { + return mbgl::underlying_type(lhs) & mbgl::underlying_type(rhs); +} + +MBGL_CONSTEXPR MapDebugOptions& operator&=(MapDebugOptions& lhs, MapDebugOptions rhs) { + return (lhs = MapDebugOptions(mbgl::underlying_type(lhs) & mbgl::underlying_type(rhs))); +} + +MBGL_CONSTEXPR MapDebugOptions operator~(MapDebugOptions value) { + return MapDebugOptions(~mbgl::underlying_type(value)); +} + +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/math/clamp.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/math/clamp.hpp new file mode 100644 index 0000000..38d4305 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/math/clamp.hpp @@ -0,0 +1,14 @@ +#pragma once + +#include + +namespace mbgl { +namespace util { + +template +T clamp(T value, T min_, T max_) { + return max(min_, min(max_, value)); +} + +} // namespace util +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/math/log2.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/math/log2.hpp new file mode 100644 index 0000000..3136ac2 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/math/log2.hpp @@ -0,0 +1,30 @@ +#pragma once + +#include +#include +#include + +#if defined(__ANDROID__) +#include +#endif + +namespace mbgl { +namespace util { + +// Computes the log2(x) rounded up to the next integer. +// (== number of bits required to store x) +uint32_t ceil_log2(uint64_t x); + +} // namespace util +} // namespace mbgl + +// log2 is not available on Android before API 18. +#if defined(__ANDROID__) && defined(__GNUC__) && \ + defined(__ANDROID_API__) && __ANDROID_API__ < 18 + +template +typename std::enable_if_t::value, T> log2(T x) { + return ::log(x) / M_LN2; +} + +#endif diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/math/minmax.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/math/minmax.hpp new file mode 100644 index 0000000..e8c50a3 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/math/minmax.hpp @@ -0,0 +1,41 @@ +#pragma once + +#include +#include +#include + +namespace mbgl { +namespace util { + +template +typename std::enable_if_t::value, T> max(T a, T b) { + return std::max(a, b); +} + +template +typename std::enable_if_t::value, T> max(T a, T b) { + return ::fmax(a, b); +} + +template +typename std::enable_if_t::value, T> max(T a, T b, Ts... args) { + return max(a, max(b, args...)); +} + +template +typename std::enable_if_t::value, T> min(T a, T b) { + return std::min(a, b); +} + +template +typename std::enable_if_t::value, T> min(T a, T b) { + return ::fmin(a, b); +} + +template +typename std::enable_if_t::value, T> min(T a, T b, Ts... args) { + return min(a, min(b, args...)); +} + +} // namespace util +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/math/wrap.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/math/wrap.hpp new file mode 100644 index 0000000..16dc598 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/math/wrap.hpp @@ -0,0 +1,17 @@ +#pragma once + +#include + +namespace mbgl { +namespace util { + +// Constrains n to the given range (including min, excluding max) via modular +// arithmetic. +template +T wrap(T value, T min, T max) { + T d = max - min; + return std::fmod((std::fmod((value - min), d) + d), d) + min; +} + +} // namespace util +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/renderer/backend_scope.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/renderer/backend_scope.hpp new file mode 100644 index 0000000..73bafc8 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/renderer/backend_scope.hpp @@ -0,0 +1,35 @@ +#pragma once + +namespace mbgl { + +class RendererBackend; + +class BackendScope { +public: + // There are two types of scopes: Creating an "Implicit" scope tells Mapbox GL that the + // supporting windowing system has already activated the GL Backend and that no further actions + // are required. Creating an "Explicit" scope actually enables the GL Backend, and disables it + // when the BackendScope is destroyed. + enum class ScopeType : bool { + Implicit, + Explicit, + }; + + BackendScope(RendererBackend&, ScopeType = ScopeType::Explicit); + ~BackendScope(); + + // Returns true when there is currently a BackendScope active in this thread. + static bool exists(); + +private: + void activate(); + void deactivate(); + + BackendScope* priorScope; + BackendScope* nextScope; + RendererBackend& backend; + const ScopeType scopeType; + bool activated = false; +}; + +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/renderer/mode.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/renderer/mode.hpp new file mode 100644 index 0000000..6ff42d8 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/renderer/mode.hpp @@ -0,0 +1,18 @@ +#pragma once + +#include + +namespace mbgl { + +using EnumType = uint32_t; + +// We can avoid redundant GL calls when it is known that the GL context is not +// being shared. In a shared GL context case, we need to make sure that the +// correct GL configurations are in use - they might have changed between render +// calls. +enum class GLContextMode : EnumType { + Unique, + Shared, +}; + +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/renderer/query.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/renderer/query.hpp new file mode 100644 index 0000000..4cadf4f --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/renderer/query.hpp @@ -0,0 +1,43 @@ +#pragma once + +#include +#include + +#include +#include + +namespace mbgl { + +/** + * Options for query rendered features. + */ +class RenderedQueryOptions { +public: + RenderedQueryOptions(optional> layerIDs_ = {}, + optional filter_ = {}) + : layerIDs(std::move(layerIDs_)), + filter(std::move(filter_)) {} + + /** layerIDs to include in the query */ + optional> layerIDs; + + optional filter; +}; + +/** + * Options for query source features + */ +class SourceQueryOptions { +public: + SourceQueryOptions(optional> sourceLayers_ = {}, + optional filter_ = {}) + : sourceLayers(std::move(sourceLayers_)), + filter(std::move(filter_)) {} + + // Required for VectorSource, ignored for GeoJSONSource + optional> sourceLayers; + + optional filter; +}; + +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/renderer/renderer.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/renderer/renderer.hpp new file mode 100644 index 0000000..7989280 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/renderer/renderer.hpp @@ -0,0 +1,58 @@ +#pragma once + +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +namespace mbgl { + +class FileSource; +class RendererBackend; +class RendererObserver; +class RenderedQueryOptions; +class Scheduler; +class SourceQueryOptions; +class UpdateParameters; + +class Renderer { +public: + Renderer(RendererBackend&, float pixelRatio_, FileSource&, Scheduler&, + GLContextMode = GLContextMode::Unique, + const optional programCacheDir = {}, + const optional localFontFamily = {}); + ~Renderer(); + + void markContextLost(); + + void setObserver(RendererObserver*); + + void render(const UpdateParameters&); + + // Feature queries + std::vector queryRenderedFeatures(const ScreenLineString&, const RenderedQueryOptions& options = {}) const; + std::vector queryRenderedFeatures(const ScreenCoordinate& point, const RenderedQueryOptions& options = {}) const; + std::vector queryRenderedFeatures(const ScreenBox& box, const RenderedQueryOptions& options = {}) const; + std::vector querySourceFeatures(const std::string& sourceID, const SourceQueryOptions& options = {}) const; + AnnotationIDs queryPointAnnotations(const ScreenBox& box) const; + AnnotationIDs queryShapeAnnotations(const ScreenBox& box) const; + AnnotationIDs getAnnotationIDs(const std::vector&) const; + + // Debug + void dumpDebugLogs(); + + // Memory + void reduceMemoryUse(); + +private: + class Impl; + std::unique_ptr impl; +}; + +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/renderer/renderer_backend.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/renderer/renderer_backend.hpp new file mode 100644 index 0000000..1d5f4e8 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/renderer/renderer_backend.hpp @@ -0,0 +1,92 @@ +#pragma once + +#include +#include +#include +#include + +#include +#include + +namespace mbgl { + +namespace gl { +class Context; +using ProcAddress = void (*)(); +using FramebufferID = uint32_t; +} // namespace gl + +// The RendererBackend is used by the Renderer to facilitate +// the actual rendering. +class RendererBackend { +public: + RendererBackend(); + virtual ~RendererBackend(); + + // Returns the backend's context which manages OpenGL state. + gl::Context& getContext(); + + // Called prior to rendering to update the internally assumed OpenGL state. + virtual void updateAssumedState() = 0; + + // Called when this backend is used for rendering. Implementations should ensure that a renderable + // object is bound and glClear/glDraw* calls can be done. They should also make sure that + // calling .bind() repeatedly is a no-op and that the appropriate gl::Context values are + // set to the current state. + virtual void bind() = 0; + + virtual Size getFramebufferSize() const = 0; + +protected: + // Called with the name of an OpenGL extension that should be loaded. RendererBackend implementations + // must call the API-specific version that obtains the function pointer for this function, + // or a null pointer if unsupported/unavailable. + virtual gl::ProcAddress getExtensionFunctionPointer(const char*) = 0; + + // Called when the backend's GL context needs to be made active or inactive. These are called, + // as a matched pair, exclusively through BackendScope, in two situations: + // + // 1. When releasing GL resources during Renderer destruction + // (Including calling CustomLayerHost::deinitialize during RenderCustomLayer destruction) + // 2. When renderering through Renderer::render() + // (Including calling CustomLayerHost::initialize for newly added custom layers and + // CustomLayerHost::deinitialize on layer removal) + virtual void activate() = 0; + virtual void deactivate() = 0; + + // Reads the color pixel data from the currently bound framebuffer. + PremultipliedImage readFramebuffer(const Size&) const; + + // A constant to signal that a framebuffer is bound, but with an unknown ID. + static constexpr const gl::FramebufferID ImplicitFramebufferBinding = + std::numeric_limits::max(); + + // Tells the renderer that OpenGL state has already been set by the windowing toolkit. + // It sets the internal assumed state to the supplied values. + void assumeFramebufferBinding(gl::FramebufferID fbo); + void assumeViewport(int32_t x, int32_t y, const Size&); + void assumeScissorTest(bool); + + // Returns true when assumed framebuffer binding hasn't changed from the implicit binding. + bool implicitFramebufferBound(); + + // Triggers an OpenGL state update if the internal assumed state doesn't match the + // supplied values. + void setFramebufferBinding(gl::FramebufferID fbo); + void setViewport(int32_t x, int32_t y, const Size&); + void setScissorTest(bool); + +protected: + std::unique_ptr context; + +private: + std::once_flag initialized; + + friend class BackendScope; +}; + +MBGL_CONSTEXPR bool operator==(const RendererBackend& a, const RendererBackend& b) { + return &a == &b; +} + +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/renderer/renderer_frontend.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/renderer/renderer_frontend.hpp new file mode 100644 index 0000000..f72b0cc --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/renderer/renderer_frontend.hpp @@ -0,0 +1,31 @@ +#pragma once + +#include + +namespace mbgl { + +class RendererObserver; +class UpdateParameters; + +// The RenderFrontend is the bridge between the Map and +// platform used to update and observer the Renderer +// +// It hides any threading specifics and always replies on +// the original thread. +class RendererFrontend { +public: + + virtual ~RendererFrontend() = default; + + // Must synchronously clean up the Renderer if set + virtual void reset() = 0; + + // Implementer must bind the renderer observer to the renderer in a + // appropriate manner so that the callbacks occur on the main thread + virtual void setObserver(RendererObserver&) = 0; + + // Coalescing updates is up to the implementer + virtual void update(std::shared_ptr) = 0; +}; + +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/renderer/renderer_observer.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/renderer/renderer_observer.hpp new file mode 100644 index 0000000..551b5c8 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/renderer/renderer_observer.hpp @@ -0,0 +1,35 @@ +#pragma once + +#include + +namespace mbgl { + +class RendererObserver { +public: + virtual ~RendererObserver() = default; + + enum class RenderMode : uint32_t { + Partial, + Full + }; + + // Signals that a repaint is required + virtual void onInvalidate() {} + + // Resource failed to download / parse + virtual void onResourceError(std::exception_ptr) {} + + // First frame + virtual void onWillStartRenderingMap() {} + + // Start of frame, initial is the first frame for this map + virtual void onWillStartRenderingFrame() {} + + // End of frame, boolean flags that a repaint is required + virtual void onDidFinishRenderingFrame(RenderMode, bool) {} + + // Final frame + virtual void onDidFinishRenderingMap() {} +}; + +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/storage/default_file_source.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/storage/default_file_source.hpp new file mode 100644 index 0000000..b9c8de5 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/storage/default_file_source.hpp @@ -0,0 +1,160 @@ +#pragma once + +#include +#include +#include +#include +#include + +#include +#include + +namespace mbgl { + +namespace util { +template class Thread; +} // namespace util + +class ResourceTransform; + +class DefaultFileSource : public FileSource { +public: + /* + * The maximumCacheSize parameter is a limit applied to non-offline resources only, + * i.e. resources added to the database for the "ambient use" caching functionality. + * There is no size limit for offline resources. If a user never creates any offline + * regions, we want the database to remain fairly small (order tens or low hundreds + * of megabytes). + */ + DefaultFileSource(const std::string& cachePath, + const std::string& assetRoot, + uint64_t maximumCacheSize = util::DEFAULT_MAX_CACHE_SIZE); + DefaultFileSource(const std::string& cachePath, + std::unique_ptr&& assetFileSource, + uint64_t maximumCacheSize = util::DEFAULT_MAX_CACHE_SIZE); + ~DefaultFileSource() override; + + bool supportsCacheOnlyRequests() const override { + return true; + } + + void setAPIBaseURL(const std::string&); + std::string getAPIBaseURL(); + + void setAccessToken(const std::string&); + std::string getAccessToken(); + + void setResourceTransform(optional>&&); + + std::unique_ptr request(const Resource&, Callback) override; + + /* + * Retrieve all regions in the offline database. + * + * The query will be executed asynchronously and the results passed to the given + * callback, which will be executed on the database thread; it is the responsibility + * of the SDK bindings to re-execute a user-provided callback on the main thread. + */ + void listOfflineRegions(std::function>)>); + + /* + * Create an offline region in the database. + * + * When the initial database queries have completed, the provided callback will be + * executed on the database thread; it is the responsibility of the SDK bindings + * to re-execute a user-provided callback on the main thread. + * + * Note that the resulting region will be in an inactive download state; to begin + * downloading resources, call `setOfflineRegionDownloadState(OfflineRegionDownloadState::Active)`, + * optionally registering an `OfflineRegionObserver` beforehand. + */ + void createOfflineRegion(const OfflineRegionDefinition& definition, + const OfflineRegionMetadata& metadata, + std::function)>); + + /* + * Update an offline region metadata in the database. + */ + void updateOfflineMetadata(const int64_t regionID, + const OfflineRegionMetadata& metadata, + std::function)>); + /* + * Register an observer to be notified when the state of the region changes. + */ + void setOfflineRegionObserver(OfflineRegion&, std::unique_ptr); + + /* + * Pause or resume downloading of regional resources. + */ + void setOfflineRegionDownloadState(OfflineRegion&, OfflineRegionDownloadState); + + /* + * Retrieve the current status of the region. The query will be executed + * asynchronously and the results passed to the given callback, which will be + * executed on the database thread; it is the responsibility of the SDK bindings + * to re-execute a user-provided callback on the main thread. + */ + void getOfflineRegionStatus(OfflineRegion&, std::function)>) const; + + /* + * Remove an offline region from the database and perform any resources evictions + * necessary as a result. + * + * Eviction works by removing the least-recently requested resources not also required + * by other regions, until the database shrinks below a certain size. + * + * Note that this method takes ownership of the input, reflecting the fact that once + * region deletion is initiated, it is not legal to perform further actions with the + * region. + * + * When the operation is complete or encounters an error, the given callback will be + * executed on the database thread; it is the responsibility of the SDK bindings + * to re-execute a user-provided callback on the main thread. + */ + void deleteOfflineRegion(OfflineRegion&&, std::function); + + /* + * Changing or bypassing this limit without permission from Mapbox is prohibited + * by the Mapbox Terms of Service. + */ + void setOfflineMapboxTileCountLimit(uint64_t) const; + + /* + * Pause file request activity. + * + * If pause is called then no revalidation or network request activity + * will occur. + */ + void pause(); + + /* + * Resume file request activity. + * + * Calling resume will unpause the file source and process any tasks that + * expired while the file source was paused. + */ + void resume(); + + // For testing only. + void setOnlineStatus(bool); + void put(const Resource&, const Response&); + + class Impl; + +private: + // Shared so destruction is done on this thread + const std::shared_ptr assetFileSource; + const std::unique_ptr> impl; + + std::mutex cachedBaseURLMutex; + std::string cachedBaseURL = mbgl::util::API_BASE_URL; + + std::mutex cachedAccessTokenMutex; + std::string cachedAccessToken; +}; + +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/storage/file_source.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/storage/file_source.hpp new file mode 100644 index 0000000..0709a1c --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/storage/file_source.hpp @@ -0,0 +1,36 @@ +#pragma once + +#include +#include + +#include +#include + +#include +#include + +namespace mbgl { + +class FileSource : private util::noncopyable { +public: + virtual ~FileSource() = default; + + using Callback = std::function; + + // Request a resource. The callback will be called asynchronously, in the same + // thread as the request was made. This thread must have an active RunLoop. The + // request may be cancelled before completion by releasing the returned AsyncRequest. + // If the request is cancelled before the callback is executed, the callback will + // not be executed. + virtual std::unique_ptr request(const Resource&, Callback) = 0; + + // When a file source supports consulting a local cache only, it must return true. + // Cache-only requests are requests that aren't as urgent, but could be useful, e.g. + // to cover part of the map while loading. The FileSource should only do cheap actions to + // retrieve the data, e.g. load it from a cache, but not from the internet. + virtual bool supportsCacheOnlyRequests() const { + return false; + } +}; + +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/storage/network_status.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/storage/network_status.hpp new file mode 100644 index 0000000..0d1ae54 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/storage/network_status.hpp @@ -0,0 +1,34 @@ +#pragma once + +#include +#include +#include + +namespace mbgl { + +namespace util { +class AsyncTask; +} // namespace util + +class NetworkStatus { +public: + enum class Status : uint8_t { + Online, + Offline, + }; + + static Status Get(); + static void Set(Status); + + static void Reachable(); + + static void Subscribe(util::AsyncTask* async); + static void Unsubscribe(util::AsyncTask* async); + +private: + static std::atomic online; + static std::mutex mtx; + static std::unordered_set observers; +}; + +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/storage/offline.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/storage/offline.hpp new file mode 100644 index 0000000..ef4a499 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/storage/offline.hpp @@ -0,0 +1,213 @@ +#pragma once + +#include +#include +#include +#include +#include + +#include +#include +#include + +namespace mbgl { + +class TileID; + +/* + * An offline region defined by a style URL, geographic bounding box, zoom range, and + * device pixel ratio. + * + * Both minZoom and maxZoom must be ≥ 0, and maxZoom must be ≥ minZoom. + * + * maxZoom may be ∞, in which case for each tile source, the region will include + * tiles from minZoom up to the maximum zoom level provided by that source. + * + * pixelRatio must be ≥ 0 and should typically be 1.0 or 2.0. + */ +class OfflineTilePyramidRegionDefinition { +public: + OfflineTilePyramidRegionDefinition(std::string, LatLngBounds, double, double, float); + + /* Private */ + std::vector tileCover(style::SourceType, uint16_t tileSize, const Range& zoomRange) const; + uint64_t tileCount(style::SourceType, uint16_t tileSize, const Range& zoomRange) const; + const std::string styleURL; + const LatLngBounds bounds; + const double minZoom; + const double maxZoom; + const float pixelRatio; +private: + Range coveringZoomRange(style::SourceType, uint16_t tileSize, const Range& zoomRange) const; +}; + +/* + * For the present, a tile pyramid is the only type of offline region. In the future, + * other definition types will be available and this will be a variant type. + */ +using OfflineRegionDefinition = OfflineTilePyramidRegionDefinition; + +/* + * The encoded format is private. + */ +std::string encodeOfflineRegionDefinition(const OfflineRegionDefinition&); +OfflineRegionDefinition decodeOfflineRegionDefinition(const std::string&); + +/* + * Arbitrary binary region metadata. The contents are opaque to the mbgl implementation; + * it just stores and retrieves a BLOB. SDK bindings should leave the interpretation of + * this data up to the application; they _should not_ enforce a higher-level data format. + * In the future we want offline database to be portable across target platforms, and a + * platform-specific metadata format would prevent that. + */ +using OfflineRegionMetadata = std::vector; + +/* + * A region is either inactive (not downloading, but previously-downloaded + * resources are available for use), or active (resources are being downloaded + * or will be downloaded, if necessary, when network access is available). + * + * This state is independent of whether or not the complete set of resources + * is currently available for offline use. To check if that is the case, use + * `OfflineRegionStatus::complete()`. + */ +enum class OfflineRegionDownloadState { + Inactive, + Active +}; + +/* + * A region's status includes its active/inactive state as well as counts + * of the number of resources that have completed downloading, their total + * size in bytes, and the total number of resources that are required. + * + * Note that the total required size in bytes is not currently available. A + * future API release may provide an estimate of this number. + */ +class OfflineRegionStatus { +public: + OfflineRegionDownloadState downloadState = OfflineRegionDownloadState::Inactive; + + /** + * The number of resources that have been fully downloaded and are ready for + * offline access. + */ + uint64_t completedResourceCount = 0; + + /** + * The cumulative size, in bytes, of all resources (inclusive of tiles) that have + * been fully downloaded. + */ + uint64_t completedResourceSize = 0; + + /** + * The number of tiles that are known to be required for this region. This is a + * subset of `completedResourceCount`. + */ + uint64_t completedTileCount = 0; + + /** + * The cumulative size, in bytes, of all tiles that have been fully downloaded. + * This is a subset of `completedResourceSize`. + */ + uint64_t completedTileSize = 0; + + /** + * The number of resources that are known to be required for this region. See the + * documentation for `requiredResourceCountIsPrecise` for an important caveat + * about this number. + */ + uint64_t requiredResourceCount = 0; + + /** + * This property is true when the value of requiredResourceCount is a precise + * count of the number of required resources, and false when it is merely a lower + * bound. + * + * Specifically, it is false during early phases of an offline download. Once + * style and tile sources have been downloaded, it is possible to calculate the + * precise number of required resources, at which point it is set to true. + */ + bool requiredResourceCountIsPrecise = false; + + bool complete() const { + return completedResourceCount == requiredResourceCount; + } +}; + +/* + * A region can have a single observer, which gets notified whenever a change + * to the region's status occurs. + */ +class OfflineRegionObserver { +public: + virtual ~OfflineRegionObserver() = default; + + /* + * Implement this method to be notified of a change in the status of an + * offline region. Status changes include any change in state of the members + * of OfflineRegionStatus. + * + * Note that this method will be executed on the database thread; it is the + * responsibility of the SDK bindings to wrap this object in an interface that + * re-executes the user-provided implementation on the main thread. + */ + virtual void statusChanged(OfflineRegionStatus) {} + + /* + * Implement this method to be notified of errors encountered while downloading + * regional resources. Such errors may be recoverable; for example the implementation + * will attempt to re-request failed resources based on an exponential backoff + * algorithm, or when it detects that network access has been restored. + * + * Note that this method will be executed on the database thread; it is the + * responsibility of the SDK bindings to wrap this object in an interface that + * re-executes the user-provided implementation on the main thread. + */ + virtual void responseError(Response::Error) {} + + /* + * Implement this method to be notified when the limit on the number of Mapbox + * tiles stored for offline regions has been reached. + * + * Once the limit has been reached, the SDK will not download further offline + * tiles from Mapbox APIs until existing tiles have been removed. Contact your + * Mapbox sales representative to raise the limit. + * + * This limit does not apply to non-Mapbox tile sources. + * + * Note that this method will be executed on the database thread; it is the + * responsibility of the SDK bindings to wrap this object in an interface that + * re-executes the user-provided implementation on the main thread. + */ + virtual void mapboxTileCountLimitExceeded(uint64_t /* limit */) {} +}; + +class OfflineRegion { +public: + // Move-only; not publicly constructible. + OfflineRegion(OfflineRegion&&); + OfflineRegion& operator=(OfflineRegion&&); + ~OfflineRegion(); + + OfflineRegion() = delete; + OfflineRegion(const OfflineRegion&) = delete; + OfflineRegion& operator=(const OfflineRegion&) = delete; + + int64_t getID() const; + const OfflineRegionDefinition& getDefinition() const; + const OfflineRegionMetadata& getMetadata() const; + +private: + friend class OfflineDatabase; + + OfflineRegion(int64_t id, + OfflineRegionDefinition, + OfflineRegionMetadata); + + const int64_t id; + const OfflineRegionDefinition definition; + const OfflineRegionMetadata metadata; +}; + +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/storage/online_file_source.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/storage/online_file_source.hpp new file mode 100644 index 0000000..28d70ce --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/storage/online_file_source.hpp @@ -0,0 +1,39 @@ +#pragma once + +#include +#include +#include +#include + +namespace mbgl { + +class ResourceTransform; + +class OnlineFileSource : public FileSource { +public: + OnlineFileSource(); + ~OnlineFileSource() override; + + void setAPIBaseURL(const std::string& t) { apiBaseURL = t; } + std::string getAPIBaseURL() const { return apiBaseURL; } + + void setAccessToken(const std::string& t) { accessToken = t; } + std::string getAccessToken() const { return accessToken; } + + void setResourceTransform(optional>&&); + + std::unique_ptr request(const Resource&, Callback) override; + + // For testing only. + void setOnlineStatus(bool); + +private: + friend class OnlineFileRequest; + + class Impl; + const std::unique_ptr impl; + std::string accessToken; + std::string apiBaseURL = mbgl::util::API_BASE_URL; +}; + +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/storage/resource.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/storage/resource.hpp new file mode 100644 index 0000000..318fa38 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/storage/resource.hpp @@ -0,0 +1,103 @@ +#pragma once + +#include +#include +#include +#include +#include +#include + +#include + +namespace mbgl { + +class Resource { +public: + enum Kind : uint8_t { + Unknown = 0, + Style, + Source, + Tile, + Glyphs, + SpriteImage, + SpriteJSON, + Image + }; + + struct TileData { + std::string urlTemplate; + uint8_t pixelRatio; + int32_t x; + int32_t y; + int8_t z; + }; + + enum class LoadingMethod : uint8_t { + None = 0b00, + Cache = 0b01, + Network = 0b10, + + CacheOnly = Cache, + NetworkOnly = Network, + All = Cache | Network, + }; + + Resource(Kind kind_, + std::string url_, + optional tileData_ = {}, + LoadingMethod loadingMethod_ = LoadingMethod::All) + : kind(kind_), + loadingMethod(loadingMethod_), + url(std::move(url_)), + tileData(std::move(tileData_)) { + } + + bool hasLoadingMethod(LoadingMethod method); + + static Resource style(const std::string& url); + static Resource source(const std::string& url); + static Resource tile(const std::string& urlTemplate, + float pixelRatio, + int32_t x, + int32_t y, + int8_t z, + Tileset::Scheme scheme, + LoadingMethod = LoadingMethod::All); + static Resource glyphs(const std::string& urlTemplate, + const FontStack& fontStack, + const std::pair& glyphRange); + static Resource spriteImage(const std::string& base, float pixelRatio); + static Resource spriteJSON(const std::string& base, float pixelRatio); + static Resource image(const std::string& url); + + Kind kind; + LoadingMethod loadingMethod; + std::string url; + + // Includes auxiliary data if this is a tile request. + optional tileData; + + optional priorModified = {}; + optional priorExpires = {}; + optional priorEtag = {}; + std::shared_ptr priorData; +}; + + +MBGL_CONSTEXPR Resource::LoadingMethod operator|(Resource::LoadingMethod a, Resource::LoadingMethod b) { + return Resource::LoadingMethod(mbgl::underlying_type(a) | mbgl::underlying_type(b)); +} + +MBGL_CONSTEXPR Resource::LoadingMethod& operator|=(Resource::LoadingMethod& a, Resource::LoadingMethod b) { + return (a = a | b); +} + +MBGL_CONSTEXPR Resource::LoadingMethod operator&(Resource::LoadingMethod a, Resource::LoadingMethod b) { + return Resource::LoadingMethod(mbgl::underlying_type(a) & mbgl::underlying_type(b)); +} + +inline bool Resource::hasLoadingMethod(Resource::LoadingMethod method) { + return (loadingMethod & method) != Resource::LoadingMethod::None; +} + +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/storage/resource_transform.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/storage/resource_transform.hpp new file mode 100644 index 0000000..738c497 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/storage/resource_transform.hpp @@ -0,0 +1,26 @@ +#pragma once + +#include +#include + +#include +#include + +namespace mbgl { + +class Mailbox; + +class ResourceTransform { +public: + using TransformCallback = std::function; + using FinishedCallback = std::function; + + ResourceTransform(ActorRef, TransformCallback&&); + + void transform(Resource::Kind, const std::string&& url, FinishedCallback&&); + +private: + TransformCallback transformCallback; +}; + +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/storage/response.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/storage/response.hpp new file mode 100644 index 0000000..5084001 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/storage/response.hpp @@ -0,0 +1,74 @@ +#pragma once + +#include +#include + +#include +#include + +namespace mbgl { + +class Response { +public: + Response() = default; + Response(const Response&); + Response& operator=(const Response&); + +public: + class Error; + // When this object is empty, the response was successful. + std::unique_ptr error; + + // This is set to true for 204 Not Modified responses, and, for backward compatibility, + // for 404 Not Found responses for tiles. + bool noContent = false; + + // This is set to true for 304 Not Modified responses. + bool notModified = false; + + // This is set to true when the server requested that no expired resources be used by + // specifying "Cache-Control: must-revalidate". + bool mustRevalidate = false; + + // The actual data of the response. Present only for non-error, non-notModified responses. + std::shared_ptr data; + + optional modified; + optional expires; + optional etag; + + bool isFresh() const { + return expires ? *expires > util::now() : !error; + } + + // Indicates whether we are allowed to use this response according to HTTP caching rules. + // It may or may not be stale. + bool isUsable() const { + return !mustRevalidate || (expires && *expires > util::now()); + } +}; + +class Response::Error { +public: + enum class Reason : uint8_t { + Success = 1, + NotFound = 2, + Server = 3, + Connection = 4, + RateLimit = 5, + Other = 6, + } reason = Reason::Other; + + // An error message from the request handler, e.g. a server message or a system message + // informing the user about the reason for the failure. + std::string message; + + optional retryAfter; + +public: + Error(Reason, std::string = "", optional = {}); +}; + +std::ostream& operator<<(std::ostream&, Response::Error::Reason); + +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/style/color_ramp_property_value.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/style/color_ramp_property_value.hpp new file mode 100644 index 0000000..bc5639c --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/style/color_ramp_property_value.hpp @@ -0,0 +1,49 @@ +#pragma once + +#include +#include +#include + +namespace mbgl { +namespace style { + +/* + * Special-case implementation of (a subset of) the PropertyValue interface + * used for building the HeatmapColor paint property traits class. + */ +class ColorRampPropertyValue { +private: + std::shared_ptr value; + + friend bool operator==(const ColorRampPropertyValue& lhs, const ColorRampPropertyValue& rhs) { + return (lhs.isUndefined() && rhs.isUndefined()) || (lhs.value && rhs.value && *(lhs.value) == *(rhs.value)); + } + + friend bool operator!=(const ColorRampPropertyValue& lhs, const ColorRampPropertyValue& rhs) { + return !(lhs == rhs); + } + +public: + ColorRampPropertyValue() : value(nullptr) {} + ColorRampPropertyValue(std::shared_ptr value_) : value(std::move(value_)) {} + + bool isUndefined() const { return value.get() == nullptr; } + + // noop, needed for batch evaluation of paint property values to compile + template + Color evaluate(const Evaluator&, TimePoint = {}) const { return {}; } + + Color evaluate(double rampEvaluationParameter) const { + const auto result = value->evaluate(expression::EvaluationContext({}, nullptr, {rampEvaluationParameter})); + return *expression::fromExpressionValue(*result); + } + + bool isDataDriven() const { return false; } + bool hasDataDrivenPropertyDifference(const ColorRampPropertyValue&) const { return false; } + + const expression::Expression& getExpression() const { return *value; } +}; + + +} // namespace style +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/style/conversion.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/style/conversion.hpp new file mode 100644 index 0000000..71c2cec --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/style/conversion.hpp @@ -0,0 +1,306 @@ +#pragma once + +#include +#include +#include + +#include + +namespace mbgl { +namespace style { +namespace conversion { + +/* + The `conversion` namespace defines conversions from JSON structures conforming to the schema defined by + the Mapbox Style Specification, to the various C++ types that form the C++ model of that domain: + + * `std::unique_ptr` + * `std::unique_ptr` + * `Filter` + * `PropertyValue` + + A single template function serves as the public interface: + + template + optional convert(const Convertible& input, Error& error); + + Where `T` is one of the above types. If the conversion fails, the result is empty, and the + error parameter includes diagnostic text suitable for presentation to a library user. Otherwise, + a filled optional is returned. + + `Convertible` is a type that encapsulates a special form of polymorphism over various underlying types that + can serve as input to the conversion algorithm. For instance, on macOS, we need to support + conversion from both RapidJSON types, and a JSON structure represented with `NSArray`/`NSDictionary`/etc. + On Qt, we need to support conversion from RapidJSON types and QVariant. + + We don't want to use traditional forms of polymorphism to accomplish this: + + * Compile time polymorphism using a template parameter for the actual value type leads to + excessive code bloat and long compile times. + * Runtime polymorphism using virtual methods requires extra heap allocation and ubiquitous + use of std::unique_ptr, unsuitable for this performance-sensitive code. + + Therefore, we're using a custom implementation of runtime polymorphism where we manually create and + dispatch through a table of function pointers (vtable), while keeping the storage for any of the possible + underlying types inline on the stack, using `std::aligned_storage`. + + For a given underlying type T, an explicit specialization of `ConversionTraits` must be provided. This + specialization must provide the following static methods: + + * `isUndefined(v)` -- returns a boolean indication whether `v` is undefined or a JSON null + + * `isArray(v)` -- returns a boolean indicating whether `v` represents a JSON array + * `arrayLength(v)` -- called only if `isArray(v)`; returns a size_t length + * `arrayMember(v)` -- called only if `isArray(v)`; returns `V` or `V&` + + * `isObject(v)` -- returns a boolean indicating whether `v` represents a JSON object + * `objectMember(v, name)` -- called only if `isObject(v)`; `name` is `const char *`; return value: + * is true when evaluated in a boolean context iff the named member exists + * is convertable to a `V` or `V&` when dereferenced + * `eachMember(v, [] (const std::string&, const V&) -> optional {...})` -- called + only if `isObject(v)`; calls the provided lambda once for each key and value of the object; + short-circuits if any call returns an `Error` + + * `toBool(v)` -- returns `optional`, absence indicating `v` is not a JSON boolean + * `toNumber(v)` -- returns `optional`, absence indicating `v` is not a JSON number + * `toDouble(v)` -- returns `optional`, absence indicating `v` is not a JSON number + * `toString(v)` -- returns `optional`, absence indicating `v` is not a JSON string + * `toValue(v)` -- returns `optional`, a variant type, for generic conversion, + absence indicating `v` is not a boolean, number, or string. Numbers should be converted to + unsigned integer, signed integer, or floating point, in descending preference. + + In addition, the type T must be move-constructable. And finally, `Convertible::Storage`, a typedef for + `std::aligned_storage_t`, must be large enough to satisfy the memory requirements for any of the + possible underlying types. (A static assert will fail if this is not the case.) + + `Convertible` itself is movable, but not copyable. A moved-from `Convertible` is in an invalid state; + you must not do anything with it except let it go out of scope. +*/ + +struct Error { std::string message; }; + +template +class ConversionTraits; + +class Convertible { +public: + template + Convertible(T&& value) : vtable(vtableForType>()) { + static_assert(sizeof(Storage) >= sizeof(std::decay_t), "Storage must be large enough to hold value type"); + new (static_cast(&storage)) std::decay_t(std::forward(value)); + } + + Convertible(Convertible&& v) + : vtable(v.vtable) + { + if (vtable) { + vtable->move(std::move(v.storage), this->storage); + } + } + + ~Convertible() { + if (vtable) { + vtable->destroy(storage); + } + } + + Convertible& operator=(Convertible&& v) { + if (vtable) { + vtable->destroy(storage); + } + vtable = v.vtable; + if (vtable) { + vtable->move(std::move(v.storage), this->storage); + } + v.vtable = nullptr; + return *this; + } + + Convertible() = delete; + Convertible(const Convertible&) = delete; + Convertible& operator=(const Convertible&) = delete; + + friend inline bool isUndefined(const Convertible& v) { + assert(v.vtable); + return v.vtable->isUndefined(v.storage); + } + + friend inline bool isArray(const Convertible& v) { + assert(v.vtable); + return v.vtable->isArray(v.storage); + } + + friend inline std::size_t arrayLength(const Convertible& v) { + assert(v.vtable); + return v.vtable->arrayLength(v.storage); + } + + friend inline Convertible arrayMember(const Convertible& v, std::size_t i) { + assert(v.vtable); + return v.vtable->arrayMember(v.storage, i); + } + + friend inline bool isObject(const Convertible& v) { + assert(v.vtable); + return v.vtable->isObject(v.storage); + } + + friend inline optional objectMember(const Convertible& v, const char * name) { + assert(v.vtable); + return v.vtable->objectMember(v.storage, name); + } + + friend inline optional eachMember(const Convertible& v, const std::function (const std::string&, const Convertible&)>& fn) { + assert(v.vtable); + return v.vtable->eachMember(v.storage, fn); + } + + friend inline optional toBool(const Convertible& v) { + assert(v.vtable); + return v.vtable->toBool(v.storage); + } + + friend inline optional toNumber(const Convertible& v) { + assert(v.vtable); + return v.vtable->toNumber(v.storage); + } + + friend inline optional toDouble(const Convertible& v) { + assert(v.vtable); + return v.vtable->toDouble(v.storage); + } + + friend inline optional toString(const Convertible& v) { + assert(v.vtable); + return v.vtable->toString(v.storage); + } + + friend inline optional toValue(const Convertible& v) { + assert(v.vtable); + return v.vtable->toValue(v.storage); + } + + friend inline optional toGeoJSON(const Convertible& v, Error& error) { + assert(v.vtable); + return v.vtable->toGeoJSON(v.storage, error); + } + +private: +#if __ANDROID__ + // Android: JSValue* or mbgl::android::Value + using Storage = std::aligned_storage_t<32, 8>; +#elif __QT__ + // Qt: JSValue* or QVariant + using Storage = std::aligned_storage_t<32, 8>; +#else + // Node: JSValue* or v8::Local + // iOS/macOS: JSValue* or id + using Storage = std::aligned_storage_t<8, 8>; +#endif + + struct VTable { + void (*move) (Storage&& src, Storage& dest); + void (*destroy) (Storage&); + + bool (*isUndefined) (const Storage&); + + bool (*isArray) (const Storage&); + std::size_t (*arrayLength) (const Storage&); + Convertible (*arrayMember) (const Storage&, std::size_t); + + bool (*isObject) (const Storage&); + optional (*objectMember) (const Storage&, const char *); + optional (*eachMember) (const Storage&, const std::function (const std::string&, const Convertible&)>&); + + optional (*toBool) (const Storage&); + optional (*toNumber) (const Storage&); + optional (*toDouble) (const Storage&); + optional (*toString) (const Storage&); + optional (*toValue) (const Storage&); + + // https://github.com/mapbox/mapbox-gl-native/issues/5623 + optional (*toGeoJSON) (const Storage&, Error&); + }; + + // Extracted this function from the table below to work around a GCC bug with differing + // visibility settings for capturing lambdas: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80947 + template + static auto vtableEachMember(const Storage& s, const std::function(const std::string&, const Convertible&)>& fn) { + return ConversionTraits::eachMember(reinterpret_cast(s), [&](const std::string& k, T&& v) { + return fn(k, Convertible(std::move(v))); + }); + } + + template + static VTable* vtableForType() { + using Traits = ConversionTraits; + static VTable vtable = { + [] (Storage&& src, Storage& dest) { + auto srcValue = reinterpret_cast(src); + new (static_cast(&dest)) T(std::move(srcValue)); + srcValue.~T(); + }, + [] (Storage& s) { + reinterpret_cast(s).~T(); + }, + [] (const Storage& s) { + return Traits::isUndefined(reinterpret_cast(s)); + }, + [] (const Storage& s) { + return Traits::isArray(reinterpret_cast(s)); + }, + [] (const Storage& s) { + return Traits::arrayLength(reinterpret_cast(s)); + }, + [] (const Storage& s, std::size_t i) { + return Convertible(Traits::arrayMember(reinterpret_cast(s), i)); + }, + [] (const Storage& s) { + return Traits::isObject(reinterpret_cast(s)); + }, + [] (const Storage& s, const char * key) { + optional member = Traits::objectMember(reinterpret_cast(s), key); + if (member) { + return optional(Convertible(std::move(*member))); + } else { + return optional(); + } + }, + vtableEachMember, + [] (const Storage& s) { + return Traits::toBool(reinterpret_cast(s)); + }, + [] (const Storage& s) { + return Traits::toNumber(reinterpret_cast(s)); + }, + [] (const Storage& s) { + return Traits::toDouble(reinterpret_cast(s)); + }, + [] (const Storage& s) { + return Traits::toString(reinterpret_cast(s)); + }, + [] (const Storage& s) { + return Traits::toValue(reinterpret_cast(s)); + }, + [] (const Storage& s, Error& err) { + return Traits::toGeoJSON(reinterpret_cast(s), err); + } + }; + return &vtable; + } + + VTable* vtable; + Storage storage; +}; + +template +struct Converter; + +template +optional convert(const Convertible& value, Error& error, Args&&...args) { + return Converter()(value, error, std::forward(args)...); +} + +} // namespace conversion +} // namespace style +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/style/conversion/color_ramp_property_value.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/style/conversion/color_ramp_property_value.hpp new file mode 100644 index 0000000..290ee6a --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/style/conversion/color_ramp_property_value.hpp @@ -0,0 +1,47 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include + +namespace mbgl { +namespace style { +namespace conversion { + +template <> +struct Converter { + optional operator()(const Convertible& value, Error& error, bool /* convertTokens */ = false) const { + using namespace mbgl::style::expression; + if (isUndefined(value)) { + return ColorRampPropertyValue(); + } else if (isExpression(value)) { + ParsingContext ctx(type::Color); + ParseResult expression = ctx.parseLayerPropertyExpression(value); + if (!expression) { + error = { ctx.getCombinedErrors() }; + return {}; + } + assert(*expression); + if (!isFeatureConstant(**expression)) { + error = { "property expressions not supported" }; + return {}; + } + if (!isZoomConstant(**expression)) { + error = { "zoom expressions not supported" }; + return {}; + } + return {ColorRampPropertyValue(std::move(*expression))}; + } else { + error = { "color ramp must be an expression" }; + return {}; + } + } +}; + +} // namespace conversion +} // namespace style +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/style/conversion/constant.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/style/conversion/constant.hpp new file mode 100644 index 0000000..7b3249d --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/style/conversion/constant.hpp @@ -0,0 +1,88 @@ +#pragma once + +#include +#include +#include +#include + +#include +#include +#include + +namespace mbgl { +namespace style { +namespace conversion { + +template <> +struct Converter { + optional operator()(const Convertible& value, Error& error) const; +}; + +template <> +struct Converter { + optional operator()(const Convertible& value, Error& error) const; +}; + +template <> +struct Converter { + optional operator()(const Convertible& value, Error& error) const; +}; + +template +struct Converter::value>> { + optional operator()(const Convertible& value, Error& error) const { + optional string = toString(value); + if (!string) { + error = { "value must be a string" }; + return {}; + } + + const auto result = Enum::toEnum(*string); + if (!result) { + error = { "value must be a valid enumeration value" }; + return {}; + } + + return *result; + } +}; + +template <> +struct Converter { + optional operator()(const Convertible& value, Error& error) const; +}; + +template +struct Converter> { + optional> operator()(const Convertible& value, Error& error) const { + if (!isArray(value) || arrayLength(value) != N) { + error = { "value must be an array of " + util::toString(N) + " numbers" }; + return {}; + } + + std::array result; + for (size_t i = 0; i < N; i++) { + optional n = toNumber(arrayMember(value, i)); + if (!n) { + error = { "value must be an array of " + util::toString(N) + " numbers" }; + return {}; + } + result[i] = *n; + } + return result; + } +}; + +template <> +struct Converter> { + optional> operator()(const Convertible& value, Error& error) const; +}; + +template <> +struct Converter> { + optional> operator()(const Convertible& value, Error& error) const; +}; + +} // namespace conversion +} // namespace style +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/style/conversion/coordinate.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/style/conversion/coordinate.hpp new file mode 100644 index 0000000..e11db5e --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/style/conversion/coordinate.hpp @@ -0,0 +1,18 @@ +#pragma once + +#include +#include + +namespace mbgl { +namespace style { +namespace conversion { + +template<> +struct Converter { +public: + optional operator() (const Convertible& value, Error& error) const; +}; + +} // namespace conversion +} // namespace style +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/style/conversion/custom_geometry_source_options.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/style/conversion/custom_geometry_source_options.hpp new file mode 100644 index 0000000..dedecd1 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/style/conversion/custom_geometry_source_options.hpp @@ -0,0 +1,84 @@ +#pragma once + +#include +#include + +namespace mbgl { +namespace style { +namespace conversion { + +template <> +struct Converter { + + template + optional operator()(const V& value, Error& error) const { + CustomGeometrySource::Options options; + + const auto minzoomValue = objectMember(value, "minzoom"); + if (minzoomValue) { + if (toNumber(*minzoomValue)) { + options.zoomRange.min = static_cast(*toNumber(*minzoomValue)); + } else { + error = { "GeoJSON source minzoom value must be a number" }; + return {}; + } + } + + const auto maxzoomValue = objectMember(value, "maxzoom"); + if (maxzoomValue) { + if (toNumber(*maxzoomValue)) { + options.zoomRange.max = static_cast(*toNumber(*maxzoomValue)); + } else { + error = { "GeoJSON source maxzoom value must be a number" }; + return {}; + } + } + + const auto bufferValue = objectMember(value, "buffer"); + if (bufferValue) { + if (toNumber(*bufferValue)) { + options.tileOptions.buffer = static_cast(*toNumber(*bufferValue)); + } else { + error = { "GeoJSON source buffer value must be a number" }; + return {}; + } + } + + const auto toleranceValue = objectMember(value, "tolerance"); + if (toleranceValue) { + if (toNumber(*toleranceValue)) { + options.tileOptions.tolerance = static_cast(*toNumber(*toleranceValue)); + } else { + error = { "GeoJSON source tolerance value must be a number" }; + return {}; + } + } + + const auto wrapValue = objectMember(value, "wrap"); + if (wrapValue) { + if (toBool(*wrapValue)) { + options.tileOptions.wrap = static_cast(*toBool(*wrapValue)); + } else { + error = { "CustomGeometrySource TileOptions wrap value must be a boolean" }; + return {}; + } + } + + const auto clipValue = objectMember(value, "clip"); + if (clipValue) { + if (toBool(*clipValue)) { + options.tileOptions.clip = static_cast(*toBool(*clipValue)); + } else { + error = { "CustomGeometrySource TileOptiosn clip value must be a boolean" }; + return {}; + } + } + + return { options }; + } + +}; + +} // namespace conversion +} // namespace style +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/style/conversion/data_driven_property_value.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/style/conversion/data_driven_property_value.hpp new file mode 100644 index 0000000..59d197b --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/style/conversion/data_driven_property_value.hpp @@ -0,0 +1,78 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace mbgl { +namespace style { +namespace conversion { + +template +struct Converter> { + optional> operator()(const Convertible& value, Error& error, bool convertTokens) const { + using namespace mbgl::style::expression; + + if (isUndefined(value)) { + return DataDrivenPropertyValue(); + } + + optional> expression; + + if (isExpression(value)) { + ParsingContext ctx(valueTypeToExpressionType()); + ParseResult parsed = ctx.parseLayerPropertyExpression(value); + if (!parsed) { + error = { ctx.getCombinedErrors() }; + return {}; + } + expression = PropertyExpression(std::move(*parsed)); + } else if (isObject(value)) { + expression = convertFunctionToExpression(value, error, convertTokens); + } else { + optional constant = convert(value, error); + if (!constant) { + return {}; + } + return convertTokens ? maybeConvertTokens(*constant) : DataDrivenPropertyValue(*constant); + } + + if (!expression) { + return {}; + } else if (!(*expression).isFeatureConstant() || !(*expression).isZoomConstant()) { + return { std::move(*expression) }; + } else if ((*expression).getExpression().getKind() == Kind::Literal) { + optional constant = fromExpressionValue( + static_cast((*expression).getExpression()).getValue()); + if (!constant) { + return {}; + } + return DataDrivenPropertyValue(*constant); + } else { + assert(false); + error = { "expected a literal expression" }; + return {}; + } + } + + template + DataDrivenPropertyValue maybeConvertTokens(const S& t) const { + return DataDrivenPropertyValue(t); + }; + + DataDrivenPropertyValue maybeConvertTokens(const std::string& t) const { + return hasTokens(t) + ? DataDrivenPropertyValue(PropertyExpression(convertTokenStringToExpression(t))) + : DataDrivenPropertyValue(t); + } +}; + +} // namespace conversion +} // namespace style +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/style/conversion/filter.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/style/conversion/filter.hpp new file mode 100644 index 0000000..9daf6ea --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/style/conversion/filter.hpp @@ -0,0 +1,18 @@ +#pragma once + +#include +#include + +namespace mbgl { +namespace style { +namespace conversion { + +template <> +struct Converter { +public: + optional operator()(const Convertible& value, Error& error) const; +}; + +} // namespace conversion +} // namespace style +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/style/conversion/function.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/style/conversion/function.hpp new file mode 100644 index 0000000..8799e9f --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/style/conversion/function.hpp @@ -0,0 +1,41 @@ +#pragma once + +#include +#include +#include +#include +#include + +namespace mbgl { +namespace style { +namespace conversion { + +bool hasTokens(const std::string&); +std::unique_ptr convertTokenStringToExpression(const std::string&); + +optional> convertFunctionToExpression(expression::type::Type, const Convertible&, Error&, bool convertTokens); + +template +optional> convertFunctionToExpression(const Convertible& value, Error& error, bool convertTokens) { + auto expression = convertFunctionToExpression(expression::valueTypeToExpressionType(), value, error, convertTokens); + if (!expression) { + return {}; + } + + optional defaultValue; + + auto defaultValueValue = objectMember(value, "default"); + if (defaultValueValue) { + defaultValue = convert(*defaultValueValue, error); + if (!defaultValue) { + error = { R"(wrong type for "default": )" + error.message }; + return {}; + } + } + + return PropertyExpression(std::move(*expression), defaultValue); +} + +} // namespace conversion +} // namespace style +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/style/conversion/geojson.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/style/conversion/geojson.hpp new file mode 100644 index 0000000..403c5f9 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/style/conversion/geojson.hpp @@ -0,0 +1,21 @@ +#pragma once + +#include +#include + +namespace mbgl { +namespace style { +namespace conversion { + +// Workaround until https://github.com/mapbox/mapbox-gl-native/issues/5623 is done. +optional parseGeoJSON(const std::string&, Error&); + +template <> +struct Converter { +public: + optional operator()(const Convertible&, Error&) const; +}; + +} // namespace conversion +} // namespace style +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/style/conversion/geojson_options.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/style/conversion/geojson_options.hpp new file mode 100644 index 0000000..3f625ba --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/style/conversion/geojson_options.hpp @@ -0,0 +1,17 @@ +#pragma once + +#include +#include + +namespace mbgl { +namespace style { +namespace conversion { + +template <> +struct Converter { + optional operator()(const Convertible& value, Error& error) const; +}; + +} // namespace conversion +} // namespace style +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/style/conversion/get_json_type.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/style/conversion/get_json_type.hpp new file mode 100644 index 0000000..f7efebc --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/style/conversion/get_json_type.hpp @@ -0,0 +1,14 @@ +#pragma once + +#include +#include + +namespace mbgl { +namespace style { +namespace conversion { + +std::string getJSONType(const Convertible& value); + +} // namespace conversion +} // namespace style +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/style/conversion/layer.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/style/conversion/layer.hpp new file mode 100644 index 0000000..1c0e2e2 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/style/conversion/layer.hpp @@ -0,0 +1,24 @@ +#pragma once + +#include +#include + +#include + +namespace mbgl { +namespace style { +namespace conversion { + +template <> +struct Converter> { +public: + optional> operator()(const Convertible& value, Error& error) const; +}; + +optional setLayoutProperty(Layer& layer, const std::string& name, const Convertible& value); +optional setPaintProperty(Layer& layer, const std::string& name, const Convertible& value); +optional setPaintProperties(Layer& layer, const Convertible& value); + +} // namespace conversion +} // namespace style +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/style/conversion/light.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/style/conversion/light.hpp new file mode 100644 index 0000000..289fca2 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/style/conversion/light.hpp @@ -0,0 +1,18 @@ +#pragma once + +#include +#include + +namespace mbgl { +namespace style { +namespace conversion { + +template <> +struct Converter { +public: + optional operator()(const Convertible& value, Error& error) const; +}; + +} // namespace conversion +} // namespace style +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/style/conversion/position.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/style/conversion/position.hpp new file mode 100644 index 0000000..044c458 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/style/conversion/position.hpp @@ -0,0 +1,17 @@ +#pragma once + +#include +#include + +namespace mbgl { +namespace style { +namespace conversion { + +template <> +struct Converter { + optional operator()(const Convertible& value, Error& error) const; +}; + +} // namespace conversion +} // namespace style +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/style/conversion/property_value.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/style/conversion/property_value.hpp new file mode 100644 index 0000000..b03655a --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/style/conversion/property_value.hpp @@ -0,0 +1,74 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace mbgl { +namespace style { +namespace conversion { + +template +struct Converter> { + optional> operator()(const Convertible& value, Error& error, bool convertTokens = false) const { + using namespace mbgl::style::expression; + + // Only icon-image and text-field support tokens, and they are both data-driven. + assert(!convertTokens); + (void)convertTokens; + + if (isUndefined(value)) { + return PropertyValue(); + } + + optional> expression; + + if (isExpression(value)) { + ParsingContext ctx(valueTypeToExpressionType()); + ParseResult parsed = ctx.parseLayerPropertyExpression(value); + if (!parsed) { + error = { ctx.getCombinedErrors() }; + return {}; + } + expression = PropertyExpression(std::move(*parsed)); + } else if (isObject(value)) { + expression = convertFunctionToExpression(value, error, false); + } else { + optional constant = convert(value, error); + if (!constant) { + return {}; + } + return { *constant }; + } + + if (!expression) { + return {}; + } else if (!(*expression).isFeatureConstant()) { + error = { "data expressions not supported" }; + return {}; + } else if (!(*expression).isZoomConstant()) { + return { std::move(*expression) }; + } else if ((*expression).getExpression().getKind() == Kind::Literal) { + optional constant = fromExpressionValue( + static_cast((*expression).getExpression()).getValue()); + if (!constant) { + return {}; + } + return PropertyValue(*constant); + } else { + assert(false); + error = { "expected a literal expression" }; + return {}; + } + } +}; + +} // namespace conversion +} // namespace style +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/style/conversion/source.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/style/conversion/source.hpp new file mode 100644 index 0000000..2cf2e36 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/style/conversion/source.hpp @@ -0,0 +1,20 @@ +#pragma once + +#include +#include + +#include + +namespace mbgl { +namespace style { +namespace conversion { + +template <> +struct Converter> { +public: + optional> operator()(const Convertible& value, Error& error, const std::string& id) const; +}; + +} // namespace conversion +} // namespace style +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/style/conversion/tileset.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/style/conversion/tileset.hpp new file mode 100644 index 0000000..1fb4acf --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/style/conversion/tileset.hpp @@ -0,0 +1,18 @@ +#pragma once + +#include +#include + +namespace mbgl { +namespace style { +namespace conversion { + +template <> +struct Converter { +public: + optional operator()(const Convertible& value, Error& error) const; +}; + +} // namespace conversion +} // namespace style +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/style/conversion/transition_options.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/style/conversion/transition_options.hpp new file mode 100644 index 0000000..0563f39 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/style/conversion/transition_options.hpp @@ -0,0 +1,18 @@ +#pragma once + +#include +#include + +namespace mbgl { +namespace style { +namespace conversion { + +template <> +struct Converter { +public: + optional operator()(const Convertible& value, Error& error) const; +}; + +} // namespace conversion +} // namespace style +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/style/data_driven_property_value.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/style/data_driven_property_value.hpp new file mode 100644 index 0000000..baea861 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/style/data_driven_property_value.hpp @@ -0,0 +1,74 @@ +#pragma once + +#include +#include +#include + +namespace mbgl { +namespace style { + +template +class DataDrivenPropertyValue { +private: + using Value = variant< + Undefined, + T, + PropertyExpression>; + + Value value; + + friend bool operator==(const DataDrivenPropertyValue& lhs, + const DataDrivenPropertyValue& rhs) { + return lhs.value == rhs.value; + } + + friend bool operator!=(const DataDrivenPropertyValue& lhs, + const DataDrivenPropertyValue& rhs) { + return !(lhs == rhs); + } + +public: + DataDrivenPropertyValue() = default; + DataDrivenPropertyValue( T v) : value(std::move(v)) {} + DataDrivenPropertyValue(PropertyExpression v) : value(std::move(v)) {} + + bool isUndefined() const { + return value.template is(); + } + + bool isDataDriven() const { + return value.match( + [] (const Undefined&) { return false; }, + [] (const T&) { return false; }, + [] (const PropertyExpression& fn) { return !fn.isFeatureConstant(); } + ); + } + + bool isZoomConstant() const { + return value.match( + [] (const Undefined&) { return true; }, + [] (const T&) { return true; }, + [] (const PropertyExpression& fn) { return fn.isZoomConstant(); } + ); + } + + const T & asConstant() const { return value.template get< T >(); } + const PropertyExpression& asExpression() const { return value.template get>(); } + + template + auto match(Ts&&... ts) const { + return value.match(std::forward(ts)...); + } + + template + auto evaluate(const Evaluator& evaluator, TimePoint = {}) const { + return Value::visit(value, evaluator); + } + + bool hasDataDrivenPropertyDifference(const DataDrivenPropertyValue& other) const { + return *this != other && (isDataDriven() || other.isDataDriven()); + } +}; + +} // namespace style +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/array_assertion.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/array_assertion.hpp new file mode 100644 index 0000000..0c0912b --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/array_assertion.hpp @@ -0,0 +1,47 @@ +#pragma once + +#include +#include +#include +#include + +#include + +namespace mbgl { +namespace style { +namespace expression { + +class ArrayAssertion : public Expression { +public: + ArrayAssertion(type::Array type_, std::unique_ptr input_) : + Expression(Kind::ArrayAssertion, type_), + input(std::move(input_)) + {} + + static ParseResult parse(const mbgl::style::conversion::Convertible& value, ParsingContext& ctx); + + EvaluationResult evaluate(const EvaluationContext& params) const override; + void eachChild(const std::function& visit) const override; + + bool operator==(const Expression& e) const override { + if (e.getKind() == Kind::ArrayAssertion) { + auto rhs = static_cast(&e); + return getType() == rhs->getType() && *input == *(rhs->input); + } + return false; + } + + std::vector> possibleOutputs() const override { + return input->possibleOutputs(); + } + + mbgl::Value serialize() const override; + std::string getOperator() const override { return "array"; } + +private: + std::unique_ptr input; +}; + +} // namespace expression +} // namespace style +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/assertion.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/assertion.hpp new file mode 100644 index 0000000..90da16b --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/assertion.hpp @@ -0,0 +1,35 @@ +#pragma once + +#include +#include +#include + +#include +#include + +namespace mbgl { +namespace style { +namespace expression { + +class Assertion : public Expression { +public: + Assertion(type::Type type_, std::vector> inputs_); + + static ParseResult parse(const mbgl::style::conversion::Convertible& value, ParsingContext& ctx); + + EvaluationResult evaluate(const EvaluationContext& params) const override; + void eachChild(const std::function& visit) const override; + + bool operator==(const Expression& e) const override; + + std::vector> possibleOutputs() const override; + + std::string getOperator() const override; + +private: + std::vector> inputs; +}; + +} // namespace expression +} // namespace style +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/at.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/at.hpp new file mode 100644 index 0000000..f0dbccb --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/at.hpp @@ -0,0 +1,45 @@ +#pragma once + +#include +#include +#include + +namespace mbgl { +namespace style { +namespace expression { + +class At : public Expression { +public: + At(std::unique_ptr index_, std::unique_ptr input_) : + Expression(Kind::At, input_->getType().get().itemType), + index(std::move(index_)), + input(std::move(input_)) + {} + + static ParseResult parse(const mbgl::style::conversion::Convertible& value, ParsingContext& ctx); + + EvaluationResult evaluate(const EvaluationContext& params) const override; + void eachChild(const std::function&) const override; + + bool operator==(const Expression& e) const override { + if (e.getKind() == Kind::At) { + auto rhs = static_cast(&e); + return *index == *(rhs->index) && *input == *(rhs->input); + } + return false; + } + + std::vector> possibleOutputs() const override { + return { nullopt }; + } + + std::string getOperator() const override { return "at"; } + +private: + std::unique_ptr index; + std::unique_ptr input; +}; + +} // namespace expression +} // namespace style +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/boolean_operator.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/boolean_operator.hpp new file mode 100644 index 0000000..d254747 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/boolean_operator.hpp @@ -0,0 +1,52 @@ +#pragma once + +#include +#include + +#include + +namespace mbgl { +namespace style { +namespace expression { + +class Any : public Expression { +public: + Any(std::vector> inputs_) : + Expression(Kind::Any, type::Boolean), + inputs(std::move(inputs_)) + {} + + static ParseResult parse(const mbgl::style::conversion::Convertible& value, ParsingContext& ctx); + + EvaluationResult evaluate(const EvaluationContext& params) const override; + void eachChild(const std::function& visit) const override; + bool operator==(const Expression& e) const override; + std::vector> possibleOutputs() const override; + + std::string getOperator() const override { return "any"; } +private: + std::vector> inputs; +}; + +class All : public Expression { +public: + All(std::vector> inputs_) : + Expression(Kind::All, type::Boolean), + inputs(std::move(inputs_)) + {} + + static ParseResult parse(const mbgl::style::conversion::Convertible& value, ParsingContext& ctx); + + EvaluationResult evaluate(const EvaluationContext& params) const override; + void eachChild(const std::function& visit) const override; + bool operator==(const Expression& e) const override; + std::vector> possibleOutputs() const override; + + std::string getOperator() const override { return "all"; } +private: + std::vector> inputs; +}; + +} // namespace expression +} // namespace style +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/case.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/case.hpp new file mode 100644 index 0000000..02dc3bc --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/case.hpp @@ -0,0 +1,39 @@ +#pragma once + +#include +#include +#include + +#include +#include + +namespace mbgl { +namespace style { +namespace expression { + +class Case : public Expression { +public: + using Branch = std::pair, std::unique_ptr>; + + Case(type::Type type_, std::vector branches_, std::unique_ptr otherwise_) + : Expression(Kind::Case, type_), branches(std::move(branches_)), otherwise(std::move(otherwise_)) { + } + + static ParseResult parse(const mbgl::style::conversion::Convertible& value, ParsingContext& ctx); + + EvaluationResult evaluate(const EvaluationContext& params) const override; + void eachChild(const std::function& visit) const override; + + bool operator==(const Expression& e) const override; + + std::vector> possibleOutputs() const override; + + std::string getOperator() const override { return "case"; } +private: + std::vector branches; + std::unique_ptr otherwise; +}; + +} // namespace expression +} // namespace style +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/check_subtype.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/check_subtype.hpp new file mode 100644 index 0000000..90e5169 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/check_subtype.hpp @@ -0,0 +1,17 @@ +#pragma once + +#include +#include +#include + +namespace mbgl { +namespace style { +namespace expression { +namespace type { + +optional checkSubtype(const Type& expected, const Type& t); + +} // namespace type +} // namespace expression +} // namespace style +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/coalesce.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/coalesce.hpp new file mode 100644 index 0000000..cd60cee --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/coalesce.hpp @@ -0,0 +1,48 @@ +#pragma once + +#include +#include +#include + +#include +#include + +namespace mbgl { +namespace style { +namespace expression { + +class Coalesce : public Expression { +public: + using Args = std::vector>; + Coalesce(const type::Type& type_, Args args_) : + Expression(Kind::Coalesce, type_), + args(std::move(args_)) + {} + + static ParseResult parse(const mbgl::style::conversion::Convertible& value, ParsingContext& ctx); + + + EvaluationResult evaluate(const EvaluationContext& params) const override; + + void eachChild(const std::function& visit) const override; + + bool operator==(const Expression& e) const override; + + std::vector> possibleOutputs() const override; + + std::size_t getLength() const { + return args.size(); + } + + Expression* getChild(std::size_t i) const { + return args.at(i).get(); + } + + std::string getOperator() const override { return "coalesce"; } +private: + Args args; +}; + +} // namespace expression +} // namespace style +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/coercion.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/coercion.hpp new file mode 100644 index 0000000..d83bd6d --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/coercion.hpp @@ -0,0 +1,40 @@ +#pragma once + +#include +#include + +#include +#include + +namespace mbgl { +namespace style { +namespace expression { + +/** + * Special form for error-coalescing coercion expressions "to-number", + * "to-color". Since these coercions can fail at runtime, they accept multiple + * arguments, only evaluating one at a time until one succeeds. + */ +class Coercion : public Expression { +public: + Coercion(type::Type type_, std::vector> inputs_); + + static ParseResult parse(const mbgl::style::conversion::Convertible& value, ParsingContext& ctx); + + EvaluationResult evaluate(const EvaluationContext& params) const override; + void eachChild(const std::function& visit) const override; + + bool operator==(const Expression& e) const override; + + std::vector> possibleOutputs() const override; + + std::string getOperator() const override; +private: + EvaluationResult (*coerceSingleValue) (const Value& v); + std::vector> inputs; +}; + +} // namespace expression +} // namespace style +} // namespace mbgl + diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/collator.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/collator.hpp new file mode 100644 index 0000000..2a79e55 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/collator.hpp @@ -0,0 +1,29 @@ +#pragma once + +#include +#include + +#include +#include + +namespace mbgl { +namespace style { +namespace expression { + +class Collator { +public: + Collator(bool caseSensitive, bool diacriticSensitive, optional locale = {}); + + bool operator==(const Collator& other) const; + + int compare(const std::string& lhs, const std::string& rhs) const; + + std::string resolvedLocale() const; +private: + class Impl; + std::shared_ptr impl; +}; + +} // namespace expression +} // namespace style +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/collator_expression.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/collator_expression.hpp new file mode 100644 index 0000000..2551cd1 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/collator_expression.hpp @@ -0,0 +1,44 @@ +#pragma once + +#include +#include +#include + +#include + +namespace mbgl { +namespace style { +namespace expression { + +class CollatorExpression : public Expression { +public: + CollatorExpression(std::unique_ptr caseSensitive, + std::unique_ptr diacriticSensitive, + optional> locale); + + EvaluationResult evaluate(const EvaluationContext&) const override; + static ParseResult parse(const mbgl::style::conversion::Convertible&, ParsingContext&); + + void eachChild(const std::function&) const override; + + bool operator==(const Expression& e) const override; + + std::vector> possibleOutputs() const override { + // Technically the set of possible outputs is the combinatoric set of Collators produced + // by all possibleOutputs of locale/caseSensitive/diacriticSensitive + // But for the primary use of Collators in comparison operators, we ignore the Collator's + // possibleOutputs anyway, so we can get away with leaving this undefined for now. + return { nullopt }; + } + + mbgl::Value serialize() const override; + std::string getOperator() const override { return "collator"; } +private: + std::unique_ptr caseSensitive; + std::unique_ptr diacriticSensitive; + optional> locale; +}; + +} // namespace expression +} // namespace style +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/compound_expression.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/compound_expression.hpp new file mode 100644 index 0000000..c618f2f --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/compound_expression.hpp @@ -0,0 +1,147 @@ +#pragma once + +#include +#include +#include +#include +#include + +#include +#include + +#include +#include + +namespace mbgl { +namespace style { +namespace expression { + +/* + CompoundExpression provides a mechanism for implementing an expression + simply by providing a list of pure functions of the form + (const T0& arg0, const T1& arg1, ...) -> Result where T0, T1, ..., U are + member types of mbgl::style::expression::Value. + + The majority of expressions specified in the style-spec are implemented in + this fashion (see compound_expression.cpp). +*/ + + +/* + Represents the parameter list for an expression that takes an arbitrary + number of arguments (of a specific type). +*/ +struct VarargsType { type::Type type; }; +template +struct Varargs : std::vector { + template + Varargs(Args&&... args) : std::vector(std::forward(args)...) {} +}; + +namespace detail { +// Base class for the Signature structs that are used to determine +// each CompoundExpression definition's type::Type data from the type of its +// "evaluate" function. +struct SignatureBase { + SignatureBase(type::Type result_, variant, VarargsType> params_, std::string name_) : + result(std::move(result_)), + params(std::move(params_)), + name(std::move(name_)) + {} + virtual ~SignatureBase() = default; + virtual std::unique_ptr makeExpression(std::vector>) const = 0; + type::Type result; + variant, VarargsType> params; + std::string name; +}; +} // namespace detail + + +/* + Common base class for CompoundExpression instances. Used to + allow downcasting (and access to things like name & parameter list) during + an Expression tree traversal. +*/ +class CompoundExpressionBase : public Expression { +public: + CompoundExpressionBase(std::string name_, const detail::SignatureBase& signature) : + Expression(Kind::CompoundExpression, signature.result), + name(std::move(name_)), + params(signature.params) + {} + + std::string getName() const { return name; } + optional getParameterCount() const { + return params.match( + [&](const VarargsType&) { return optional(); }, + [&](const std::vector& p) -> optional { return p.size(); } + ); + } + + std::vector> possibleOutputs() const override { + return { nullopt }; + } + +private: + std::string name; + variant, VarargsType> params; +}; + +template +class CompoundExpression : public CompoundExpressionBase { +public: + using Args = typename Signature::Args; + + CompoundExpression(const std::string& name_, + Signature signature_, + typename Signature::Args args_) : + CompoundExpressionBase(name_, signature_), + signature(signature_), + args(std::move(args_)) + {} + + EvaluationResult evaluate(const EvaluationContext& evaluationParams) const override { + return signature.apply(evaluationParams, args); + } + + void eachChild(const std::function& visit) const override { + for (const std::unique_ptr& e : args) { + visit(*e); + } + } + + bool operator==(const Expression& e) const override { + if (e.getKind() == Kind::CompoundExpression) { + auto rhs = static_cast(&e); + return getName() == rhs->getName() && Expression::childrenEqual(args, rhs->args); + } + return false; + } + + std::string getOperator() const override { + return signature.name; + } + +private: + Signature signature; + typename Signature::Args args; +}; + +/* + Holds the map of expression name => implementation (which is just one or + more evaluation functions, each wrapped in a Signature struct). +*/ +struct CompoundExpressionRegistry { + using Definition = std::vector>; + static std::unordered_map definitions; +}; + +ParseResult parseCompoundExpression(const std::string name, const mbgl::style::conversion::Convertible& value, ParsingContext& ctx); + +ParseResult createCompoundExpression(const std::string& name, + std::vector> args, + ParsingContext& ctx); + +} // namespace expression +} // namespace style +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/dsl.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/dsl.hpp new file mode 100644 index 0000000..e9de20d --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/dsl.hpp @@ -0,0 +1,84 @@ +#pragma once + +#include +#include +#include +#include + +#include +#include +#include + +namespace mbgl { +namespace style { +namespace expression { +namespace dsl { + +// This convenience API does little to no expression validation or type-checking, and is intended for +// use only by test and other non-production code. + +template +std::vector> vec(Args... args) { + std::vector> result; + util::ignore({ (result.push_back(std::move(args)), 0)... }); + return result; +} + +std::unique_ptr error(std::string); + +std::unique_ptr literal(const char* value); +std::unique_ptr literal(Value value); +std::unique_ptr literal(std::initializer_list value); +std::unique_ptr literal(std::initializer_list value); + +std::unique_ptr number(std::unique_ptr); +std::unique_ptr string(std::unique_ptr); +std::unique_ptr boolean(std::unique_ptr); + +std::unique_ptr toColor(std::unique_ptr); +std::unique_ptr toString(std::unique_ptr); + +std::unique_ptr get(const char* value); +std::unique_ptr get(std::unique_ptr); + +std::unique_ptr id(); +std::unique_ptr zoom(); + +std::unique_ptr eq(std::unique_ptr, + std::unique_ptr); +std::unique_ptr ne(std::unique_ptr, + std::unique_ptr); +std::unique_ptr gt(std::unique_ptr, + std::unique_ptr); +std::unique_ptr lt(std::unique_ptr, + std::unique_ptr); + +std::unique_ptr step(std::unique_ptr input, + std::unique_ptr output0, + double input1, std::unique_ptr output1); + +Interpolator linear(); +Interpolator exponential(double base); +Interpolator cubicBezier(double x1, double y1, double x2, double y2); + +std::unique_ptr interpolate(Interpolator interpolator, + std::unique_ptr input, + double input1, std::unique_ptr output1); + +std::unique_ptr interpolate(Interpolator interpolator, + std::unique_ptr input, + double input1, std::unique_ptr output1, + double input2, std::unique_ptr output2); + +std::unique_ptr interpolate(Interpolator interpolator, + std::unique_ptr input, + double input1, std::unique_ptr output1, + double input2, std::unique_ptr output2, + double input3, std::unique_ptr output3); + +std::unique_ptr concat(std::vector> inputs); + +} // namespace dsl +} // namespace expression +} // namespace style +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/equals.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/equals.hpp new file mode 100644 index 0000000..1e8bf7a --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/equals.hpp @@ -0,0 +1,35 @@ +#pragma once + +#include +#include +#include +#include + +#include + +namespace mbgl { +namespace style { +namespace expression { + +class Equals : public Expression { +public: + Equals(std::unique_ptr lhs, std::unique_ptr rhs, optional> collator, bool negate); + + static ParseResult parse(const mbgl::style::conversion::Convertible&, ParsingContext&); + + void eachChild(const std::function& visit) const override; + bool operator==(const Expression&) const override; + EvaluationResult evaluate(const EvaluationContext&) const override; + std::vector> possibleOutputs() const override; + + std::string getOperator() const override { return negate ? "!=" : "=="; } +private: + std::unique_ptr lhs; + std::unique_ptr rhs; + optional> collator; + bool negate; +}; + +} // namespace expression +} // namespace style +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/error.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/error.hpp new file mode 100644 index 0000000..9e1da2f --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/error.hpp @@ -0,0 +1,39 @@ +#pragma once + +#include + +#include + +namespace mbgl { +namespace style { +namespace expression { + +class Error : public Expression { +public: + Error(std::string message_) + : Expression(Kind::Error, type::Error), + message(std::move(message_)) {} + + void eachChild(const std::function&) const override {} + + bool operator==(const Expression& e) const override { + return e.getKind() == Kind::Error; + } + + EvaluationResult evaluate(const EvaluationContext&) const override { + return EvaluationError{message}; + } + + std::vector> possibleOutputs() const override { + return {}; + } + + std::string getOperator() const override { return "error"; } + +private: + std::string message; +}; + +} // namespace expression +} // namespace style +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/expression.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/expression.hpp new file mode 100644 index 0000000..8301f15 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/expression.hpp @@ -0,0 +1,215 @@ +#pragma once + +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +namespace mbgl { + +class GeometryTileFeature; + +namespace style { +namespace expression { + +class EvaluationError { +public: + std::string message; +}; + +class EvaluationContext { +public: + EvaluationContext(float zoom_) : zoom(zoom_), feature(nullptr) {} + EvaluationContext(GeometryTileFeature const * feature_) : zoom(optional()), feature(feature_) {} + EvaluationContext(float zoom_, GeometryTileFeature const * feature_) : + zoom(zoom_), feature(feature_) + {} + EvaluationContext(optional zoom_, GeometryTileFeature const * feature_, optional heatmapDensity_) : + zoom(std::move(zoom_)), feature(feature_), heatmapDensity(std::move(heatmapDensity_)) + {} + + optional zoom; + GeometryTileFeature const * feature; + optional heatmapDensity; +}; + +template +class Result : private variant { +public: + using variant::variant; + using Value = T; + + Result() = default; + + explicit operator bool () const { + return this->template is(); + } + + // optional does some type trait magic for this one, so this might + // be problematic as is. + const T* operator->() const { + assert(this->template is()); + return std::addressof(this->template get()); + } + + T* operator->() { + assert(this->template is()); + return std::addressof(this->template get()); + } + + T& operator*() { + assert(this->template is()); + return this->template get(); + } + + const T& operator*() const { + assert(this->template is()); + return this->template get(); + } + + const EvaluationError& error() const { + assert(this->template is()); + return this->template get(); + } +}; + +class EvaluationResult : public Result { +public: + using Result::Result; // NOLINT + + EvaluationResult() = default; + + EvaluationResult(const std::array& arr) : + Result(toExpressionValue(arr)) + {} + + // used only for the special (private) "error" expression + EvaluationResult(const type::ErrorType&) { + assert(false); + } +}; + +/* + Expression is an abstract class that serves as an interface and base class + for particular expression implementations. + + CompoundExpression implements the majority of expressions in the spec by + inferring the argument and output from a simple function (const T0& arg0, + const T1& arg1, ...) -> Result where T0, T1, ..., U are member types of + mbgl::style::expression::Value. + + The other Expression subclasses (Let, Curve, Match, etc.) exist in order to + implement expressions that need specialized parsing, type checking, or + evaluation logic that can't be handled by CompoundExpression's inference + mechanism. + + Each Expression subclass also provides a static + ParseResult ExpressionClass::parse(const V&, ParsingContext), + which handles parsing a style-spec JSON representation of the expression. +*/ + +enum class Kind : int32_t { + Coalesce, + CompoundExpression, + Literal, + ArrayAssertion, + At, + Interpolate, + Assertion, + Length, + Step, + Let, + Var, + CollatorExpression, + Coercion, + Match, + Error, + Case, + Any, + All, + Equals, +}; + +class Expression { +public: + Expression(Kind kind_, type::Type type_) : kind(kind_), type(std::move(type_)) {} + virtual ~Expression() = default; + + virtual EvaluationResult evaluate(const EvaluationContext& params) const = 0; + virtual void eachChild(const std::function&) const = 0; + virtual bool operator==(const Expression&) const = 0; + bool operator!=(const Expression& rhs) const { + return !operator==(rhs); + } + + Kind getKind() const { return kind; }; + type::Type getType() const { return type; }; + + EvaluationResult evaluate(optional zoom, const Feature& feature, optional heatmapDensity) const; + + /** + * Statically analyze the expression, attempting to enumerate possible outputs. Returns + * an array of values plus the sentinel null optional value, used to indicate that the + * complete set of outputs is statically undecidable. + */ + virtual std::vector> possibleOutputs() const = 0; + + virtual mbgl::Value serialize() const { + std::vector serialized; + serialized.emplace_back(getOperator()); + eachChild([&](const Expression &child) { + serialized.emplace_back(child.serialize()); + }); + return serialized; + }; + + virtual std::string getOperator() const = 0; + +protected: + template + static bool childrenEqual(const T& lhs, const T& rhs) { + if (lhs.size() != rhs.size()) return false; + for (auto leftChild = lhs.begin(), rightChild = rhs.begin(); + leftChild != lhs.end(); + leftChild++, rightChild++) + { + if (!Expression::childEqual(*leftChild, *rightChild)) return false; + } + return true; + } + + static bool childEqual(const std::unique_ptr& lhs, const std::unique_ptr& rhs) { + return *lhs == *rhs; + } + + template + static bool childEqual(const std::pair>& lhs, + const std::pair>& rhs) { + return lhs.first == rhs.first && *(lhs.second) == *(rhs.second); + } + + template + static bool childEqual(const std::pair>& lhs, + const std::pair>& rhs) { + return lhs.first == rhs.first && *(lhs.second) == *(rhs.second); + } + + static bool childEqual(const std::pair, std::unique_ptr>& lhs, + const std::pair, std::unique_ptr>& rhs) { + return *(lhs.first) == *(rhs.first) && *(lhs.second) == *(rhs.second); + } + +private: + Kind kind; + type::Type type; +}; + +} // namespace expression +} // namespace style +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/find_zoom_curve.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/find_zoom_curve.hpp new file mode 100644 index 0000000..6f1419a --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/find_zoom_curve.hpp @@ -0,0 +1,20 @@ +#pragma once + +#include +#include +#include + +#include +#include + +namespace mbgl { +namespace style { +namespace expression { + +optional> findZoomCurve(const expression::Expression* e); + +variant findZoomCurveChecked(const expression::Expression* e); + +} // namespace expression +} // namespace style +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/get_covering_stops.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/get_covering_stops.hpp new file mode 100644 index 0000000..157aefe --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/get_covering_stops.hpp @@ -0,0 +1,18 @@ +#pragma once + +#include +#include +#include +#include + +namespace mbgl { +namespace style { +namespace expression { + +// Return the smallest range of stops that covers the interval [lower, upper] +Range getCoveringStops(const std::map>& stops, + const double lower, const double upper); + +} // namespace expression +} // namespace style +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/interpolate.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/interpolate.hpp new file mode 100644 index 0000000..0e78504 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/interpolate.hpp @@ -0,0 +1,86 @@ +#pragma once + +#include +#include +#include +#include +#include + +#include +#include +#include + +namespace mbgl { +namespace style { +namespace expression { + +ParseResult parseInterpolate(const mbgl::style::conversion::Convertible& value, ParsingContext& ctx); + +class Interpolate : public Expression { +public: + Interpolate(const type::Type& type_, + Interpolator interpolator_, + std::unique_ptr input_, + std::map> stops_); + + const std::unique_ptr& getInput() const { return input; } + const Interpolator& getInterpolator() const { return interpolator; } + + void eachChild(const std::function& visit) const override { + visit(*input); + for (const auto& stop : stops) { + visit(*stop.second); + } + } + + void eachStop(const std::function& visit) const { + for (const auto& stop : stops) { + visit(stop.first, *stop.second); + } + } + + // Return the smallest range of stops that covers the interval [lower, upper] + Range getCoveringStops(const double lower, const double upper) const { + return ::mbgl::style::expression::getCoveringStops(stops, lower, upper); + } + + double interpolationFactor(const Range& inputLevels, const double inputValue) const { + return interpolator.match( + [&](const auto& interp) { return interp.interpolationFactor(inputLevels, inputValue); } + ); + } + + bool operator==(const Expression& e) const override { + if (e.getKind() == Kind::Interpolate) { + auto rhs = static_cast(&e); + if (interpolator != rhs->interpolator || + *input != *(rhs->input) || + stops.size() != rhs->stops.size()) + { + return false; + } + + return Expression::childrenEqual(stops, rhs->stops); + } + return false; + } + + std::vector> possibleOutputs() const override; + mbgl::Value serialize() const override; + std::string getOperator() const override { return "interpolate"; } + +protected: + const Interpolator interpolator; + const std::unique_ptr input; + const std::map> stops; +}; + +ParseResult createInterpolate(type::Type type, + Interpolator interpolator, + std::unique_ptr input, + std::map> stops, + ParsingContext& ctx); + +} // namespace expression +} // namespace style +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/interpolator.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/interpolator.hpp new file mode 100644 index 0000000..f37fb2c --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/interpolator.hpp @@ -0,0 +1,50 @@ +#pragma once + +#include +#include +#include + +namespace mbgl { +namespace style { +namespace expression { + +class ExponentialInterpolator { +public: + ExponentialInterpolator(double base_) : base(base_) {} + + double base; + + double interpolationFactor(const Range& inputLevels, const double input) const { + return util::interpolationFactor(base, + Range { + static_cast(inputLevels.min), + static_cast(inputLevels.max) + }, + input); + } + + bool operator==(const ExponentialInterpolator& rhs) const { + return base == rhs.base; + } +}; + +class CubicBezierInterpolator { +public: + CubicBezierInterpolator(double x1_, double y1_, double x2_, double y2_) : ub(x1_, y1_, x2_, y2_) {} + + double interpolationFactor(const Range& inputLevels, const double input) const { + return ub.solve(input / (inputLevels.max - inputLevels.min), 1e-6); + } + + bool operator==(const CubicBezierInterpolator& rhs) const { + return ub == rhs.ub; + } + + util::UnitBezier ub; +}; + +using Interpolator = variant; + +} // namespace expression +} // namespace style +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/is_constant.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/is_constant.hpp new file mode 100644 index 0000000..065fa30 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/is_constant.hpp @@ -0,0 +1,36 @@ +#pragma once + +#include +#include + +namespace mbgl { +namespace style { +namespace expression { + +template +bool isGlobalPropertyConstant(const Expression& expression, const T& properties) { + if (expression.getKind() == Kind::CompoundExpression) { + auto e = static_cast(&expression); + for (const std::string& property : properties) { + if (e->getName() == property) { + return false; + } + } + } + + bool isConstant = true; + expression.eachChild([&](const Expression& e) { + if (isConstant && !isGlobalPropertyConstant(e, properties)) { + isConstant = false; + } + }); + return isConstant; +}; + +bool isFeatureConstant(const Expression& expression); +bool isZoomConstant(const Expression& e); + + +} // namespace expression +} // namespace style +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/is_expression.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/is_expression.hpp new file mode 100644 index 0000000..77c4896 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/is_expression.hpp @@ -0,0 +1,13 @@ +#pragma once + +#include + +namespace mbgl { +namespace style { +namespace expression { + +bool isExpression(const conversion::Convertible& value); + +} // namespace expression +} // namespace style +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/length.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/length.hpp new file mode 100644 index 0000000..1d754f1 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/length.hpp @@ -0,0 +1,32 @@ +#pragma once + +#include +#include +#include + +#include +#include + +namespace mbgl { +namespace style { +namespace expression { + +class Length : public Expression { +public: + Length(std::unique_ptr input); + + static ParseResult parse(const mbgl::style::conversion::Convertible& value, ParsingContext& ctx); + + EvaluationResult evaluate(const EvaluationContext& params) const override; + void eachChild(const std::function& visit) const override; + bool operator==(const Expression& e) const override; + std::vector> possibleOutputs() const override; + std::string getOperator() const override { return "length"; } + +private: + std::unique_ptr input; +}; + +} // namespace expression +} // namespace style +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/let.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/let.hpp new file mode 100644 index 0000000..d11ba1b --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/let.hpp @@ -0,0 +1,85 @@ +#pragma once + +#include +#include +#include + +#include +#include + +namespace mbgl { +namespace style { +namespace expression { + +class Let : public Expression { +public: + using Bindings = std::map>; + + Let(Bindings bindings_, std::unique_ptr result_) : + Expression(Kind::Let, result_->getType()), + bindings(std::move(bindings_)), + result(std::move(result_)) + {} + + static ParseResult parse(const mbgl::style::conversion::Convertible&, ParsingContext&); + + EvaluationResult evaluate(const EvaluationContext& params) const override; + void eachChild(const std::function&) const override; + + bool operator==(const Expression& e) const override { + if (e.getKind() == Kind::Let) { + auto rhs = static_cast(&e); + return *result == *(rhs->result); + } + return false; + } + + std::vector> possibleOutputs() const override; + + Expression* getResult() const { + return result.get(); + } + + mbgl::Value serialize() const override; + std::string getOperator() const override { return "let"; } +private: + Bindings bindings; + std::unique_ptr result; +}; + +class Var : public Expression { +public: + Var(std::string name_, std::shared_ptr value_) : + Expression(Kind::Var, value_->getType()), + name(std::move(name_)), + value(value_) + {} + + static ParseResult parse(const mbgl::style::conversion::Convertible&, ParsingContext&); + + EvaluationResult evaluate(const EvaluationContext& params) const override; + void eachChild(const std::function&) const override; + + bool operator==(const Expression& e) const override { + if (e.getKind() == Kind::Var) { + auto rhs = static_cast(&e); + return *value == *(rhs->value); + } + return false; + } + + std::vector> possibleOutputs() const override; + + mbgl::Value serialize() const override; + std::string getOperator() const override { return "var"; } + + const std::shared_ptr& getBoundExpression() const { return value; } + +private: + std::string name; + std::shared_ptr value; +}; + +} // namespace expression +} // namespace style +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/literal.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/literal.hpp new file mode 100644 index 0000000..bcae23b --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/literal.hpp @@ -0,0 +1,58 @@ +#pragma once + +#include +#include +#include + +#include + +namespace mbgl { +namespace style { +namespace expression { + +class Literal : public Expression { +public: + Literal(Value value_) + : Expression(Kind::Literal, typeOf(value_)) + , value(value_) + {} + + Literal(type::Array type_, std::vector value_) + : Expression(Kind::Literal, type_) + , value(value_) + {} + + EvaluationResult evaluate(const EvaluationContext&) const override { + return value; + } + + static ParseResult parse(const mbgl::style::conversion::Convertible&, ParsingContext&); + + void eachChild(const std::function&) const override {} + + bool operator==(const Expression& e) const override { + if (e.getKind() == Kind::Literal) { + auto rhs = static_cast(&e); + return value == rhs->value; + } + return false; + } + + std::vector> possibleOutputs() const override { + return {{ value }}; + } + + Value getValue() const { + return value; + } + + mbgl::Value serialize() const override; + std::string getOperator() const override { return "literal"; } + +private: + Value value; +}; + +} // namespace expression +} // namespace style +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/match.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/match.hpp new file mode 100644 index 0000000..2ce4b7a --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/match.hpp @@ -0,0 +1,48 @@ +#pragma once + +#include +#include +#include + +#include + +namespace mbgl { +namespace style { +namespace expression { + +template +class Match : public Expression { +public: + using Branches = std::unordered_map>; + + Match(type::Type type_, + std::unique_ptr input_, + Branches branches_, + std::unique_ptr otherwise_ + ) : Expression(Kind::Match, type_), + input(std::move(input_)), + branches(std::move(branches_)), + otherwise(std::move(otherwise_)) + {} + + EvaluationResult evaluate(const EvaluationContext& params) const override; + + void eachChild(const std::function& visit) const override; + + bool operator==(const Expression& e) const override; + + std::vector> possibleOutputs() const override; + + mbgl::Value serialize() const override; + std::string getOperator() const override { return "match"; } +private: + std::unique_ptr input; + Branches branches; + std::unique_ptr otherwise; +}; + +ParseResult parseMatch(const mbgl::style::conversion::Convertible& value, ParsingContext& ctx); + +} // namespace expression +} // namespace style +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/parsing_context.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/parsing_context.hpp new file mode 100644 index 0000000..c19974a --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/parsing_context.hpp @@ -0,0 +1,172 @@ +#pragma once + +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +namespace mbgl { +namespace style { +namespace expression { + +class Expression; + +struct ParsingError { + std::string message; + std::string key; + bool operator==(const ParsingError& rhs) const { return message == rhs.message && key == rhs.key; } +}; + +using ParseResult = optional>; + +namespace detail { + +class Scope { +public: + Scope(const std::map>& bindings_, std::shared_ptr parent_ = nullptr) : + bindings(bindings_), + parent(std::move(parent_)) + {} + + const std::map>& bindings; + std::shared_ptr parent; + + optional> get(const std::string& name) { + auto it = bindings.find(name); + if (it != bindings.end()) { + return {it->second}; + } else if (parent) { + return parent->get(name); + } else { + return optional>(); + } + } +}; + +} // namespace detail + +class ParsingContext { +public: + ParsingContext() : errors(std::make_shared>()) {} + ParsingContext(std::string key_) : key(std::move(key_)), errors(std::make_shared>()) {} + explicit ParsingContext(type::Type expected_) + : expected(std::move(expected_)), + errors(std::make_shared>()) + {} + ParsingContext(ParsingContext&&) = default; + + ParsingContext(const ParsingContext&) = delete; + ParsingContext& operator=(const ParsingContext&) = delete; + + std::string getKey() const { return key; } + optional getExpected() const { return expected; } + const std::vector& getErrors() const { return *errors; } + const std::string getCombinedErrors() const; + + enum TypeAnnotationOption { + includeTypeAnnotations, + omitTypeAnnotations + }; + + /* + Parse the given style-spec JSON value as an expression. + */ + ParseResult parseExpression(const mbgl::style::conversion::Convertible& value, + TypeAnnotationOption typeAnnotationOption = includeTypeAnnotations); + + /* + Parse the given style-spec JSON value as an expression intended to be used + in a layout or paint property. This entails checking additional constraints + that exist in that context but not, e.g., for filters. + */ + ParseResult parseLayerPropertyExpression(const mbgl::style::conversion::Convertible& value, + TypeAnnotationOption typeAnnotationOption = includeTypeAnnotations); + + /* + Parse a child expression. For use by individual Expression::parse() methods. + */ + ParseResult parse(const mbgl::style::conversion::Convertible&, + std::size_t, + optional = {}, + TypeAnnotationOption typeAnnotationOption = includeTypeAnnotations); + + /* + Parse a child expression. For use by individual Expression::parse() methods. + */ + ParseResult parse(const mbgl::style::conversion::Convertible&, + std::size_t index, + optional, + const std::map>&); + + /* + Check whether `t` is a subtype of `expected`, collecting an error if not. + */ + optional checkType(const type::Type& t); + + optional> getBinding(const std::string name) { + if (!scope) return optional>(); + return scope->get(name); + } + + void error(std::string message) { + errors->push_back({message, key}); + } + + void error(std::string message, std::size_t child) { + errors->push_back({message, key + "[" + util::toString(child) + "]"}); + } + + void error(std::string message, std::size_t child, std::size_t grandchild) { + errors->push_back({message, key + "[" + util::toString(child) + "][" + util::toString(grandchild) + "]"}); + } + + void appendErrors(ParsingContext&& ctx) { + errors->reserve(errors->size() + ctx.errors->size()); + std::move(ctx.errors->begin(), ctx.errors->end(), std::inserter(*errors, errors->end())); + ctx.errors->clear(); + } + + void clearErrors() { + errors->clear(); + } + +private: + ParsingContext(std::string key_, + std::shared_ptr> errors_, + optional expected_, + std::shared_ptr scope_) + : key(std::move(key_)), + expected(std::move(expected_)), + scope(std::move(scope_)), + errors(std::move(errors_)) + {} + + + /* + Parse the given style-spec JSON value into an Expression object. + Specifically, this function is responsible for determining the expression + type (either Literal, or the one named in value[0]) and dispatching to the + appropriate ParseXxxx::parse(const V&, ParsingContext) method. + */ + ParseResult parse(const mbgl::style::conversion::Convertible& value, + TypeAnnotationOption typeAnnotationOption = includeTypeAnnotations); + + std::string key; + optional expected; + std::shared_ptr scope; + std::shared_ptr> errors; +}; + +using ParseFunction = ParseResult (*)(const conversion::Convertible&, ParsingContext&); +using ExpressionRegistry = std::unordered_map; +const ExpressionRegistry& getExpressionRegistry(); + +} // namespace expression +} // namespace style +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/step.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/step.hpp new file mode 100644 index 0000000..24e29b1 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/step.hpp @@ -0,0 +1,45 @@ +#pragma once + +#include +#include +#include + +#include + +#include +#include + +namespace mbgl { +namespace style { +namespace expression { + +class Step : public Expression { +public: + Step(const type::Type& type_, + std::unique_ptr input_, + std::map> stops_); + + EvaluationResult evaluate(const EvaluationContext& params) const override; + void eachChild(const std::function& visit) const override; + void eachStop(const std::function& visit) const; + + const std::unique_ptr& getInput() const { return input; } + Range getCoveringStops(const double lower, const double upper) const; + + bool operator==(const Expression& e) const override; + + std::vector> possibleOutputs() const override; + + static ParseResult parse(const mbgl::style::conversion::Convertible& value, ParsingContext& ctx); + + mbgl::Value serialize() const override; + std::string getOperator() const override { return "step"; } + +private: + const std::unique_ptr input; + const std::map> stops; +}; + +} // namespace expression +} // namespace style +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/type.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/type.hpp new file mode 100644 index 0000000..3164968 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/type.hpp @@ -0,0 +1,120 @@ +#pragma once + +#include +#include +#include +#include + +namespace mbgl { +namespace style { +namespace expression { +namespace type { + +template +std::string toString(const T& t); + +struct NullType { + constexpr NullType() {}; + std::string getName() const { return "null"; } + bool operator==(const NullType&) const { return true; } +}; + +struct NumberType { + constexpr NumberType() {}; + std::string getName() const { return "number"; } + bool operator==(const NumberType&) const { return true; } +}; + +struct BooleanType { + constexpr BooleanType() {}; + std::string getName() const { return "boolean"; } + bool operator==(const BooleanType&) const { return true; } +}; + +struct StringType { + constexpr StringType() {}; + std::string getName() const { return "string"; } + bool operator==(const StringType&) const { return true; } +}; + +struct ColorType { + constexpr ColorType() {}; + std::string getName() const { return "color"; } + bool operator==(const ColorType&) const { return true; } +}; + +struct ObjectType { + constexpr ObjectType() {}; + std::string getName() const { return "object"; } + bool operator==(const ObjectType&) const { return true; } +}; + +struct ErrorType { + constexpr ErrorType() {}; + std::string getName() const { return "error"; } + bool operator==(const ErrorType&) const { return true; } +}; + +struct ValueType { + constexpr ValueType() {}; + std::string getName() const { return "value"; } + bool operator==(const ValueType&) const { return true; } +}; + +struct CollatorType { + constexpr CollatorType() {}; // NOLINT + std::string getName() const { return "collator"; } + bool operator==(const CollatorType&) const { return true; } +}; + +constexpr NullType Null; +constexpr NumberType Number; +constexpr StringType String; +constexpr BooleanType Boolean; +constexpr ColorType Color; +constexpr ValueType Value; +constexpr ObjectType Object; +constexpr CollatorType Collator; +constexpr ErrorType Error; + +struct Array; + +using Type = variant< + NullType, + NumberType, + BooleanType, + StringType, + ColorType, + ObjectType, + ValueType, + mapbox::util::recursive_wrapper, + CollatorType, + ErrorType>; + +struct Array { + explicit Array(Type itemType_) : itemType(std::move(itemType_)) {} + Array(Type itemType_, std::size_t N_) : itemType(std::move(itemType_)), N(N_) {} + Array(Type itemType_, optional N_) : itemType(std::move(itemType_)), N(std::move(N_)) {} + std::string getName() const { + if (N) { + return "array<" + toString(itemType) + ", " + util::toString(*N) + ">"; + } else if (itemType == Value) { + return "array"; + } else { + return "array<" + toString(itemType) + ">"; + } + } + + bool operator==(const Array& rhs) const { return itemType == rhs.itemType && N == rhs.N; } + + Type itemType; + optional N; +}; + +template +std::string toString(const T& type) { return type.match([&] (const auto& t) { return t.getName(); }); } + +} // namespace type +} // namespace expression +} // namespace style +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/value.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/value.hpp new file mode 100644 index 0000000..b112611 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/style/expression/value.hpp @@ -0,0 +1,147 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +namespace mbgl { +namespace style { +namespace expression { + +struct Value; + +using ValueBase = variant< + NullValue, + bool, + double, + std::string, + Color, + Collator, + mapbox::util::recursive_wrapper>, + mapbox::util::recursive_wrapper>>; +struct Value : ValueBase { + using ValueBase::ValueBase; + + // Javascript's Number.MAX_SAFE_INTEGER + static uint64_t maxSafeInteger() { return 9007199254740991ULL; } + + static bool isSafeInteger(uint64_t x) { return x <= maxSafeInteger(); }; + static bool isSafeInteger(int64_t x) { + return static_cast(x > 0 ? x : -x) <= maxSafeInteger(); + } + static bool isSafeInteger(double x) { + return static_cast(x > 0 ? x : -x) <= maxSafeInteger(); + } + +}; + +constexpr NullValue Null = NullValue(); + +type::Type typeOf(const Value& value); +std::string stringify(const Value& value); + +/* + Returns a Type object representing the expression type that corresponds to + the value type T. (Specialized for primitives and specific array types in + the .cpp.) +*/ +template +type::Type valueTypeToExpressionType(); + +/* + Conversions between style value types and expression::Value +*/ + +template +struct ValueConverter { + static Value toExpressionValue(const T& value) { + return Value(value); + } + + static optional fromExpressionValue(const Value& value) { + return value.template is() ? value.template get() : optional(); + } +}; + +template <> +struct ValueConverter { + static type::Type expressionType() { return type::Value; } + static Value toExpressionValue(const Value& value) { return value; } + static optional fromExpressionValue(const Value& value) { return value; } +}; + +template <> +struct ValueConverter { + static Value toExpressionValue(const mbgl::Value& value); + static mbgl::Value fromExpressionValue(const Value& value); +}; + +template <> +struct ValueConverter { + static type::Type expressionType() { return type::Number; } + static Value toExpressionValue(const float value); + static optional fromExpressionValue(const Value& value); +}; + +template +struct ValueConverter> { + static type::Type expressionType() { + return type::Array(valueTypeToExpressionType(), N); + } + static Value toExpressionValue(const std::array& value); + static optional> fromExpressionValue(const Value& value); +}; + +template +struct ValueConverter> { + static type::Type expressionType() { + return type::Array(valueTypeToExpressionType()); + } + static Value toExpressionValue(const std::vector& value); + static optional> fromExpressionValue(const Value& value); +}; + +template <> +struct ValueConverter { + static type::Type expressionType() { return type::Array(type::Number, 3); } + static Value toExpressionValue(const mbgl::style::Position& value); + static optional fromExpressionValue(const Value& v); +}; + +template +struct ValueConverter::value >> { + static type::Type expressionType() { return type::String; } + static Value toExpressionValue(const T& value); + static optional fromExpressionValue(const Value& value); +}; + +template +Value toExpressionValue(const T& value) { + return ValueConverter::toExpressionValue(value); +} + +template +optional fromExpressionValue(const Value& value) { + return ValueConverter::fromExpressionValue(value); +} + +template +std::vector> fromExpressionValues(const std::vector>& values) { + std::vector> result; + for (const auto& value : values) { + result.push_back(value ? fromExpressionValue(*value) : nullopt); + } + return result; +} + +} // namespace expression +} // namespace style +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/style/filter.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/style/filter.hpp new file mode 100644 index 0000000..c9dc9fb --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/style/filter.hpp @@ -0,0 +1,55 @@ +#pragma once + +#include +#include +#include +#include + +#include +#include +#include + +namespace mbgl { +namespace style { + +class Filter { +public: + optional> expression; +private: + optional legacyFilter; +public: + Filter() : expression() {} + + Filter(expression::ParseResult _expression, optional _filter = {}) + : expression(std::move(*_expression)), + legacyFilter(std::move(_filter)){ + assert(!expression || *expression != nullptr); + } + + bool operator()(const expression::EvaluationContext& context) const; + + friend bool operator==(const Filter& lhs, const Filter& rhs) { + if (!lhs.expression || !rhs.expression) { + return lhs.expression == rhs.expression; + } else { + return *(lhs.expression) == *(rhs.expression); + } + } + + friend bool operator!=(const Filter& lhs, const Filter& rhs) { + return !(lhs == rhs); + } + + mbgl::Value serialize() const { + if (legacyFilter) { + return *legacyFilter; + } + else if (expression) { + return (**expression).serialize(); + } + return NullValue(); + } +}; + +} // namespace style +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/style/image.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/style/image.hpp new file mode 100644 index 0000000..ff3bfed --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/style/image.hpp @@ -0,0 +1,31 @@ +#pragma once + +#include +#include + +#include + +namespace mbgl { +namespace style { + +class Image { +public: + Image(std::string id, PremultipliedImage&&, float pixelRatio, bool sdf = false); + Image(const Image&); + + std::string getID() const; + + const PremultipliedImage& getImage() const; + + // Pixel ratio of the sprite image. + float getPixelRatio() const; + + // Whether this image should be interpreted as a signed distance field icon. + bool isSdf() const; + + class Impl; + Immutable baseImpl; +}; + +} // namespace style +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/style/layer.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/style/layer.hpp new file mode 100644 index 0000000..12494f5 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/style/layer.hpp @@ -0,0 +1,139 @@ +#pragma once + +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +namespace mbgl { +namespace style { + +class FillLayer; +class LineLayer; +class CircleLayer; +class SymbolLayer; +class RasterLayer; +class HillshadeLayer; +class BackgroundLayer; +class CustomLayer; +class FillExtrusionLayer; +class HeatmapLayer; +class LayerObserver; + +/** + * The runtime representation of a [layer](https://www.mapbox.com/mapbox-gl-style-spec/#layers) from the Mapbox Style + * Specification. + * + * `Layer` is an abstract base class; concrete derived classes are provided for each layer type. `Layer` contains + * functionality that is common to all layer types: + * + * * Runtime type information: type predicates and casting + * * Accessors for properties common to all layer types: ID, visibility, etc. + * * Cloning and copying + * + * All other functionality lives in the derived classes. To instantiate a layer, create an instance of the desired + * type, passing the ID: + * + * auto circleLayer = std::make_unique("my-circle-layer"); + */ +class Layer : public mbgl::util::noncopyable { +public: + virtual ~Layer(); + + // Check whether this layer is of the given subtype. + template + bool is() const; + + // Dynamically cast this layer to the given subtype. + template + T* as() { + return is() ? reinterpret_cast(this) : nullptr; + } + + template + const T* as() const { + return is() ? reinterpret_cast(this) : nullptr; + } + + // Convenience method for dynamic dispatch on the concrete layer type. Using + // method overloading, this allows consolidation of logic common to vector-based + // layers (Fill, FillExtrusion, Line, Circle, or Symbol). For example: + // + // struct Visitor { + // void operator()(CustomLayer&) { ... } + // void operator()(RasterLayer&) { ... } + // void operator()(BackgroundLayer&) { ... } + // template + // void operator()(VectorLayer&) { ... } + // }; + // + template + auto accept(V&& visitor) { + switch (getType()) { + case LayerType::Fill: + return std::forward(visitor)(*as()); + case LayerType::Line: + return std::forward(visitor)(*as()); + case LayerType::Circle: + return std::forward(visitor)(*as()); + case LayerType::Symbol: + return std::forward(visitor)(*as()); + case LayerType::Raster: + return std::forward(visitor)(*as()); + case LayerType::Background: + return std::forward(visitor)(*as()); + case LayerType::Hillshade: + return std::forward(visitor)(*as()); + case LayerType::Custom: + return std::forward(visitor)(*as()); + case LayerType::FillExtrusion: + return std::forward(visitor)(*as()); + case LayerType::Heatmap: + return std::forward(visitor)(*as()); + } + + + // Not reachable, but placate GCC. + assert(false); + throw new std::runtime_error("unknown layer type"); + } + + LayerType getType() const; + std::string getID() const; + + // Visibility + VisibilityType getVisibility() const; + virtual void setVisibility(VisibilityType) = 0; + + // Zoom range + float getMinZoom() const; + float getMaxZoom() const; + virtual void setMinZoom(float) = 0; + virtual void setMaxZoom(float) = 0; + + // Private implementation + class Impl; + Immutable baseImpl; + + Layer(Immutable); + + // Create a layer, copying all properties except id and paint properties from this layer. + virtual std::unique_ptr cloneRef(const std::string& id) const = 0; + + LayerObserver* observer = nullptr; + void setObserver(LayerObserver*); + + // For use in SDK bindings, which store a reference to a platform-native peer + // object here, so that separately-obtained references to this object share + // identical platform-native peers. + util::unique_any peer; +}; + +} // namespace style +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/style/layer_type.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/style/layer_type.hpp new file mode 100644 index 0000000..0987ea4 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/style/layer_type.hpp @@ -0,0 +1,20 @@ +#pragma once + +namespace mbgl { +namespace style { + +enum class LayerType { + Fill, + Line, + Circle, + Symbol, + Raster, + Hillshade, + Background, + Custom, + FillExtrusion, + Heatmap, +}; + +} // namespace style +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/style/layers/background_layer.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/style/layers/background_layer.hpp new file mode 100644 index 0000000..9039838 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/style/layers/background_layer.hpp @@ -0,0 +1,65 @@ +// This file is generated. Do not edit. + +#pragma once + +#include +#include +#include +#include + +#include + +namespace mbgl { +namespace style { + +class TransitionOptions; + +class BackgroundLayer : public Layer { +public: + BackgroundLayer(const std::string& layerID); + ~BackgroundLayer() final; + + // Visibility + void setVisibility(VisibilityType) final; + + // Zoom range + void setMinZoom(float) final; + void setMaxZoom(float) final; + + // Paint properties + + static PropertyValue getDefaultBackgroundColor(); + PropertyValue getBackgroundColor() const; + void setBackgroundColor(PropertyValue); + void setBackgroundColorTransition(const TransitionOptions&); + TransitionOptions getBackgroundColorTransition() const; + + static PropertyValue getDefaultBackgroundPattern(); + PropertyValue getBackgroundPattern() const; + void setBackgroundPattern(PropertyValue); + void setBackgroundPatternTransition(const TransitionOptions&); + TransitionOptions getBackgroundPatternTransition() const; + + static PropertyValue getDefaultBackgroundOpacity(); + PropertyValue getBackgroundOpacity() const; + void setBackgroundOpacity(PropertyValue); + void setBackgroundOpacityTransition(const TransitionOptions&); + TransitionOptions getBackgroundOpacityTransition() const; + + // Private implementation + + class Impl; + const Impl& impl() const; + + Mutable mutableImpl() const; + BackgroundLayer(Immutable); + std::unique_ptr cloneRef(const std::string& id) const final; +}; + +template <> +inline bool Layer::is() const { + return getType() == LayerType::Background; +} + +} // namespace style +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/style/layers/circle_layer.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/style/layers/circle_layer.hpp new file mode 100644 index 0000000..942dd67 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/style/layers/circle_layer.hpp @@ -0,0 +1,121 @@ +// This file is generated. Do not edit. + +#pragma once + +#include +#include +#include +#include + +#include + +namespace mbgl { +namespace style { + +class TransitionOptions; + +class CircleLayer : public Layer { +public: + CircleLayer(const std::string& layerID, const std::string& sourceID); + ~CircleLayer() final; + + // Source + const std::string& getSourceID() const; + const std::string& getSourceLayer() const; + void setSourceLayer(const std::string& sourceLayer); + + void setFilter(const Filter&); + const Filter& getFilter() const; + + // Visibility + void setVisibility(VisibilityType) final; + + // Zoom range + void setMinZoom(float) final; + void setMaxZoom(float) final; + + // Paint properties + + static DataDrivenPropertyValue getDefaultCircleRadius(); + DataDrivenPropertyValue getCircleRadius() const; + void setCircleRadius(DataDrivenPropertyValue); + void setCircleRadiusTransition(const TransitionOptions&); + TransitionOptions getCircleRadiusTransition() const; + + static DataDrivenPropertyValue getDefaultCircleColor(); + DataDrivenPropertyValue getCircleColor() const; + void setCircleColor(DataDrivenPropertyValue); + void setCircleColorTransition(const TransitionOptions&); + TransitionOptions getCircleColorTransition() const; + + static DataDrivenPropertyValue getDefaultCircleBlur(); + DataDrivenPropertyValue getCircleBlur() const; + void setCircleBlur(DataDrivenPropertyValue); + void setCircleBlurTransition(const TransitionOptions&); + TransitionOptions getCircleBlurTransition() const; + + static DataDrivenPropertyValue getDefaultCircleOpacity(); + DataDrivenPropertyValue getCircleOpacity() const; + void setCircleOpacity(DataDrivenPropertyValue); + void setCircleOpacityTransition(const TransitionOptions&); + TransitionOptions getCircleOpacityTransition() const; + + static PropertyValue> getDefaultCircleTranslate(); + PropertyValue> getCircleTranslate() const; + void setCircleTranslate(PropertyValue>); + void setCircleTranslateTransition(const TransitionOptions&); + TransitionOptions getCircleTranslateTransition() const; + + static PropertyValue getDefaultCircleTranslateAnchor(); + PropertyValue getCircleTranslateAnchor() const; + void setCircleTranslateAnchor(PropertyValue); + void setCircleTranslateAnchorTransition(const TransitionOptions&); + TransitionOptions getCircleTranslateAnchorTransition() const; + + static PropertyValue getDefaultCirclePitchScale(); + PropertyValue getCirclePitchScale() const; + void setCirclePitchScale(PropertyValue); + void setCirclePitchScaleTransition(const TransitionOptions&); + TransitionOptions getCirclePitchScaleTransition() const; + + static PropertyValue getDefaultCirclePitchAlignment(); + PropertyValue getCirclePitchAlignment() const; + void setCirclePitchAlignment(PropertyValue); + void setCirclePitchAlignmentTransition(const TransitionOptions&); + TransitionOptions getCirclePitchAlignmentTransition() const; + + static DataDrivenPropertyValue getDefaultCircleStrokeWidth(); + DataDrivenPropertyValue getCircleStrokeWidth() const; + void setCircleStrokeWidth(DataDrivenPropertyValue); + void setCircleStrokeWidthTransition(const TransitionOptions&); + TransitionOptions getCircleStrokeWidthTransition() const; + + static DataDrivenPropertyValue getDefaultCircleStrokeColor(); + DataDrivenPropertyValue getCircleStrokeColor() const; + void setCircleStrokeColor(DataDrivenPropertyValue); + void setCircleStrokeColorTransition(const TransitionOptions&); + TransitionOptions getCircleStrokeColorTransition() const; + + static DataDrivenPropertyValue getDefaultCircleStrokeOpacity(); + DataDrivenPropertyValue getCircleStrokeOpacity() const; + void setCircleStrokeOpacity(DataDrivenPropertyValue); + void setCircleStrokeOpacityTransition(const TransitionOptions&); + TransitionOptions getCircleStrokeOpacityTransition() const; + + // Private implementation + + class Impl; + const Impl& impl() const; + + Mutable mutableImpl() const; + CircleLayer(Immutable); + std::unique_ptr cloneRef(const std::string& id) const final; +}; + +template <> +inline bool Layer::is() const { + return getType() == LayerType::Circle; +} + +} // namespace style +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/style/layers/custom_layer.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/style/layers/custom_layer.hpp new file mode 100644 index 0000000..fbe3a4a --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/style/layers/custom_layer.hpp @@ -0,0 +1,93 @@ +#pragma once + +#include + +#include + +namespace mbgl { +namespace style { + +/** + * Parameters that define the current camera position for a `CustomLayerHost::render()` function. + */ +struct CustomLayerRenderParameters { + double width; + double height; + double latitude; + double longitude; + double zoom; + double bearing; + double pitch; + double fieldOfView; + std::array projectionMatrix; +}; + +class CustomLayerHost { +public: + virtual ~CustomLayerHost() = default; + /** + * Initialize any GL state needed by the custom layer. This method is called once, from the + * main thread, at a point when the GL context is active but before rendering for the first + * time. + * + * Resources that are acquired in this method must be released in the `deinitialize` function. + */ + virtual void initialize() = 0; + + /** + * Render the layer. This method is called once per frame. The implementation should not make + * any assumptions about the GL state (other than that the correct context is active). It may + * make changes to the state, and is not required to reset values such as the depth mask, stencil + * mask, and corresponding test flags to their original values. + * Make sure that you are drawing your fragments with a z value of 1 to take advantage of the + * opaque fragment culling in case there are opaque layers above your custom layer. + */ + virtual void render(const CustomLayerRenderParameters&) = 0; + + /** + * Called when the system has destroyed the underlying GL context. The + * `deinitialize` function will not be called in this case, however + * `initialize` will be called instead to prepare for a new render. + * + */ + virtual void contextLost() = 0; + + /** + * Destroy any GL state needed by the custom layer, and deallocate context, if necessary. This + * method is called once, from the main thread, at a point when the GL context is active. + * + * Note that it may be called even when the `initialize` function has not been called. + */ + virtual void deinitialize() = 0; +}; + +class CustomLayer : public Layer { +public: + CustomLayer(const std::string& id, + std::unique_ptr host); + + ~CustomLayer() final; + + // Visibility + void setVisibility(VisibilityType) final; + + // Zoom range + void setMinZoom(float) final; + void setMaxZoom(float) final; + + // Private implementation + + class Impl; + const Impl& impl() const; + + Mutable mutableImpl() const; + std::unique_ptr cloneRef(const std::string& id) const final; + + CustomLayer(const CustomLayer&) = delete; +}; + +template <> +bool Layer::is() const; + +} // namespace style +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/style/layers/fill_extrusion_layer.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/style/layers/fill_extrusion_layer.hpp new file mode 100644 index 0000000..e1c54f5 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/style/layers/fill_extrusion_layer.hpp @@ -0,0 +1,97 @@ +// This file is generated. Do not edit. + +#pragma once + +#include +#include +#include +#include + +#include + +namespace mbgl { +namespace style { + +class TransitionOptions; + +class FillExtrusionLayer : public Layer { +public: + FillExtrusionLayer(const std::string& layerID, const std::string& sourceID); + ~FillExtrusionLayer() final; + + // Source + const std::string& getSourceID() const; + const std::string& getSourceLayer() const; + void setSourceLayer(const std::string& sourceLayer); + + void setFilter(const Filter&); + const Filter& getFilter() const; + + // Visibility + void setVisibility(VisibilityType) final; + + // Zoom range + void setMinZoom(float) final; + void setMaxZoom(float) final; + + // Paint properties + + static PropertyValue getDefaultFillExtrusionOpacity(); + PropertyValue getFillExtrusionOpacity() const; + void setFillExtrusionOpacity(PropertyValue); + void setFillExtrusionOpacityTransition(const TransitionOptions&); + TransitionOptions getFillExtrusionOpacityTransition() const; + + static DataDrivenPropertyValue getDefaultFillExtrusionColor(); + DataDrivenPropertyValue getFillExtrusionColor() const; + void setFillExtrusionColor(DataDrivenPropertyValue); + void setFillExtrusionColorTransition(const TransitionOptions&); + TransitionOptions getFillExtrusionColorTransition() const; + + static PropertyValue> getDefaultFillExtrusionTranslate(); + PropertyValue> getFillExtrusionTranslate() const; + void setFillExtrusionTranslate(PropertyValue>); + void setFillExtrusionTranslateTransition(const TransitionOptions&); + TransitionOptions getFillExtrusionTranslateTransition() const; + + static PropertyValue getDefaultFillExtrusionTranslateAnchor(); + PropertyValue getFillExtrusionTranslateAnchor() const; + void setFillExtrusionTranslateAnchor(PropertyValue); + void setFillExtrusionTranslateAnchorTransition(const TransitionOptions&); + TransitionOptions getFillExtrusionTranslateAnchorTransition() const; + + static PropertyValue getDefaultFillExtrusionPattern(); + PropertyValue getFillExtrusionPattern() const; + void setFillExtrusionPattern(PropertyValue); + void setFillExtrusionPatternTransition(const TransitionOptions&); + TransitionOptions getFillExtrusionPatternTransition() const; + + static DataDrivenPropertyValue getDefaultFillExtrusionHeight(); + DataDrivenPropertyValue getFillExtrusionHeight() const; + void setFillExtrusionHeight(DataDrivenPropertyValue); + void setFillExtrusionHeightTransition(const TransitionOptions&); + TransitionOptions getFillExtrusionHeightTransition() const; + + static DataDrivenPropertyValue getDefaultFillExtrusionBase(); + DataDrivenPropertyValue getFillExtrusionBase() const; + void setFillExtrusionBase(DataDrivenPropertyValue); + void setFillExtrusionBaseTransition(const TransitionOptions&); + TransitionOptions getFillExtrusionBaseTransition() const; + + // Private implementation + + class Impl; + const Impl& impl() const; + + Mutable mutableImpl() const; + FillExtrusionLayer(Immutable); + std::unique_ptr cloneRef(const std::string& id) const final; +}; + +template <> +inline bool Layer::is() const { + return getType() == LayerType::FillExtrusion; +} + +} // namespace style +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/style/layers/fill_layer.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/style/layers/fill_layer.hpp new file mode 100644 index 0000000..dfbe69d --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/style/layers/fill_layer.hpp @@ -0,0 +1,97 @@ +// This file is generated. Do not edit. + +#pragma once + +#include +#include +#include +#include + +#include + +namespace mbgl { +namespace style { + +class TransitionOptions; + +class FillLayer : public Layer { +public: + FillLayer(const std::string& layerID, const std::string& sourceID); + ~FillLayer() final; + + // Source + const std::string& getSourceID() const; + const std::string& getSourceLayer() const; + void setSourceLayer(const std::string& sourceLayer); + + void setFilter(const Filter&); + const Filter& getFilter() const; + + // Visibility + void setVisibility(VisibilityType) final; + + // Zoom range + void setMinZoom(float) final; + void setMaxZoom(float) final; + + // Paint properties + + static PropertyValue getDefaultFillAntialias(); + PropertyValue getFillAntialias() const; + void setFillAntialias(PropertyValue); + void setFillAntialiasTransition(const TransitionOptions&); + TransitionOptions getFillAntialiasTransition() const; + + static DataDrivenPropertyValue getDefaultFillOpacity(); + DataDrivenPropertyValue getFillOpacity() const; + void setFillOpacity(DataDrivenPropertyValue); + void setFillOpacityTransition(const TransitionOptions&); + TransitionOptions getFillOpacityTransition() const; + + static DataDrivenPropertyValue getDefaultFillColor(); + DataDrivenPropertyValue getFillColor() const; + void setFillColor(DataDrivenPropertyValue); + void setFillColorTransition(const TransitionOptions&); + TransitionOptions getFillColorTransition() const; + + static DataDrivenPropertyValue getDefaultFillOutlineColor(); + DataDrivenPropertyValue getFillOutlineColor() const; + void setFillOutlineColor(DataDrivenPropertyValue); + void setFillOutlineColorTransition(const TransitionOptions&); + TransitionOptions getFillOutlineColorTransition() const; + + static PropertyValue> getDefaultFillTranslate(); + PropertyValue> getFillTranslate() const; + void setFillTranslate(PropertyValue>); + void setFillTranslateTransition(const TransitionOptions&); + TransitionOptions getFillTranslateTransition() const; + + static PropertyValue getDefaultFillTranslateAnchor(); + PropertyValue getFillTranslateAnchor() const; + void setFillTranslateAnchor(PropertyValue); + void setFillTranslateAnchorTransition(const TransitionOptions&); + TransitionOptions getFillTranslateAnchorTransition() const; + + static PropertyValue getDefaultFillPattern(); + PropertyValue getFillPattern() const; + void setFillPattern(PropertyValue); + void setFillPatternTransition(const TransitionOptions&); + TransitionOptions getFillPatternTransition() const; + + // Private implementation + + class Impl; + const Impl& impl() const; + + Mutable mutableImpl() const; + FillLayer(Immutable); + std::unique_ptr cloneRef(const std::string& id) const final; +}; + +template <> +inline bool Layer::is() const { + return getType() == LayerType::Fill; +} + +} // namespace style +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/style/layers/heatmap_layer.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/style/layers/heatmap_layer.hpp new file mode 100644 index 0000000..4c434b2 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/style/layers/heatmap_layer.hpp @@ -0,0 +1,86 @@ +// This file is generated. Do not edit. + +#pragma once + +#include +#include +#include +#include +#include + +#include + +namespace mbgl { +namespace style { + +class TransitionOptions; + +class HeatmapLayer : public Layer { +public: + HeatmapLayer(const std::string& layerID, const std::string& sourceID); + ~HeatmapLayer() final; + + // Source + const std::string& getSourceID() const; + const std::string& getSourceLayer() const; + void setSourceLayer(const std::string& sourceLayer); + + void setFilter(const Filter&); + const Filter& getFilter() const; + + // Visibility + void setVisibility(VisibilityType) final; + + // Zoom range + void setMinZoom(float) final; + void setMaxZoom(float) final; + + // Paint properties + + static DataDrivenPropertyValue getDefaultHeatmapRadius(); + DataDrivenPropertyValue getHeatmapRadius() const; + void setHeatmapRadius(DataDrivenPropertyValue); + void setHeatmapRadiusTransition(const TransitionOptions&); + TransitionOptions getHeatmapRadiusTransition() const; + + static DataDrivenPropertyValue getDefaultHeatmapWeight(); + DataDrivenPropertyValue getHeatmapWeight() const; + void setHeatmapWeight(DataDrivenPropertyValue); + void setHeatmapWeightTransition(const TransitionOptions&); + TransitionOptions getHeatmapWeightTransition() const; + + static PropertyValue getDefaultHeatmapIntensity(); + PropertyValue getHeatmapIntensity() const; + void setHeatmapIntensity(PropertyValue); + void setHeatmapIntensityTransition(const TransitionOptions&); + TransitionOptions getHeatmapIntensityTransition() const; + + static ColorRampPropertyValue getDefaultHeatmapColor(); + ColorRampPropertyValue getHeatmapColor() const; + void setHeatmapColor(ColorRampPropertyValue); + void setHeatmapColorTransition(const TransitionOptions&); + TransitionOptions getHeatmapColorTransition() const; + + static PropertyValue getDefaultHeatmapOpacity(); + PropertyValue getHeatmapOpacity() const; + void setHeatmapOpacity(PropertyValue); + void setHeatmapOpacityTransition(const TransitionOptions&); + TransitionOptions getHeatmapOpacityTransition() const; + + // Private implementation + + class Impl; + const Impl& impl() const; + + Mutable mutableImpl() const; + HeatmapLayer(Immutable); + std::unique_ptr cloneRef(const std::string& id) const final; +}; + +template <> +inline bool Layer::is() const { + return getType() == LayerType::Heatmap; +} + +} // namespace style +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/style/layers/hillshade_layer.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/style/layers/hillshade_layer.hpp new file mode 100644 index 0000000..35664da --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/style/layers/hillshade_layer.hpp @@ -0,0 +1,86 @@ +// This file is generated. Do not edit. + +#pragma once + +#include +#include +#include +#include + +#include + +namespace mbgl { +namespace style { + +class TransitionOptions; + +class HillshadeLayer : public Layer { +public: + HillshadeLayer(const std::string& layerID, const std::string& sourceID); + ~HillshadeLayer() final; + + // Source + const std::string& getSourceID() const; + + // Visibility + void setVisibility(VisibilityType) final; + + // Zoom range + void setMinZoom(float) final; + void setMaxZoom(float) final; + + // Paint properties + + static PropertyValue getDefaultHillshadeIlluminationDirection(); + PropertyValue getHillshadeIlluminationDirection() const; + void setHillshadeIlluminationDirection(PropertyValue); + void setHillshadeIlluminationDirectionTransition(const TransitionOptions&); + TransitionOptions getHillshadeIlluminationDirectionTransition() const; + + static PropertyValue getDefaultHillshadeIlluminationAnchor(); + PropertyValue getHillshadeIlluminationAnchor() const; + void setHillshadeIlluminationAnchor(PropertyValue); + void setHillshadeIlluminationAnchorTransition(const TransitionOptions&); + TransitionOptions getHillshadeIlluminationAnchorTransition() const; + + static PropertyValue getDefaultHillshadeExaggeration(); + PropertyValue getHillshadeExaggeration() const; + void setHillshadeExaggeration(PropertyValue); + void setHillshadeExaggerationTransition(const TransitionOptions&); + TransitionOptions getHillshadeExaggerationTransition() const; + + static PropertyValue getDefaultHillshadeShadowColor(); + PropertyValue getHillshadeShadowColor() const; + void setHillshadeShadowColor(PropertyValue); + void setHillshadeShadowColorTransition(const TransitionOptions&); + TransitionOptions getHillshadeShadowColorTransition() const; + + static PropertyValue getDefaultHillshadeHighlightColor(); + PropertyValue getHillshadeHighlightColor() const; + void setHillshadeHighlightColor(PropertyValue); + void setHillshadeHighlightColorTransition(const TransitionOptions&); + TransitionOptions getHillshadeHighlightColorTransition() const; + + static PropertyValue getDefaultHillshadeAccentColor(); + PropertyValue getHillshadeAccentColor() const; + void setHillshadeAccentColor(PropertyValue); + void setHillshadeAccentColorTransition(const TransitionOptions&); + TransitionOptions getHillshadeAccentColorTransition() const; + + // Private implementation + + class Impl; + const Impl& impl() const; + + Mutable mutableImpl() const; + HillshadeLayer(Immutable); + std::unique_ptr cloneRef(const std::string& id) const final; +}; + +template <> +inline bool Layer::is() const { + return getType() == LayerType::Hillshade; +} + +} // namespace style +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/style/layers/layer.hpp.ejs b/src/3rdparty/mapbox-gl-native/include/mbgl/style/layers/layer.hpp.ejs new file mode 100644 index 0000000..e15ff74 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/style/layers/layer.hpp.ejs @@ -0,0 +1,93 @@ +<% + const type = locals.type; + const layoutProperties = locals.layoutProperties; + const paintProperties = locals.paintProperties; +-%> +// This file is generated. Do not edit. + +#pragma once + +<% if (type === 'heatmap') { -%> +#include +<% } -%> +#include +#include +#include +#include + +#include + +<% if (type === 'line' || type === 'symbol') { -%> +#include + +<% } -%> +namespace mbgl { +namespace style { + +class TransitionOptions; + +class <%- camelize(type) %>Layer : public Layer { +public: +<% if (type === 'background') { -%> + <%- camelize(type) %>Layer(const std::string& layerID); +<% } else { -%> + <%- camelize(type) %>Layer(const std::string& layerID, const std::string& sourceID); +<% } -%> + ~<%- camelize(type) %>Layer() final; + +<% if (type !== 'background') { -%> + // Source + const std::string& getSourceID() const; +<% if (type !== 'raster' && type !== 'hillshade') { -%> + const std::string& getSourceLayer() const; + void setSourceLayer(const std::string& sourceLayer); + + void setFilter(const Filter&); + const Filter& getFilter() const; +<% } -%> + +<% } -%> + // Visibility + void setVisibility(VisibilityType) final; + + // Zoom range + void setMinZoom(float) final; + void setMaxZoom(float) final; + +<% if (layoutProperties.length) { -%> + // Layout properties + +<% for (const property of layoutProperties) { -%> + static <%- propertyValueType(property) %> getDefault<%- camelize(property.name) %>(); + <%- propertyValueType(property) %> get<%- camelize(property.name) %>() const; + void set<%- camelize(property.name) %>(<%- propertyValueType(property) %>); + +<% } -%> +<% } -%> + // Paint properties + +<% for (const property of paintProperties) { -%> + static <%- propertyValueType(property) %> getDefault<%- camelize(property.name) %>(); + <%- propertyValueType(property) %> get<%- camelize(property.name) %>() const; + void set<%- camelize(property.name) %>(<%- propertyValueType(property) %>); + void set<%- camelize(property.name) %>Transition(const TransitionOptions&); + TransitionOptions get<%- camelize(property.name) %>Transition() const; + +<% } -%> + // Private implementation + + class Impl; + const Impl& impl() const; + + Mutable mutableImpl() const; + <%- camelize(type) %>Layer(Immutable); + std::unique_ptr cloneRef(const std::string& id) const final; +}; + +template <> +inline bool Layer::is<<%- camelize(type) %>Layer>() const { + return getType() == LayerType::<%- camelize(type) %>; +} + +} // namespace style +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/style/layers/line_layer.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/style/layers/line_layer.hpp new file mode 100644 index 0000000..4519296 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/style/layers/line_layer.hpp @@ -0,0 +1,135 @@ +// This file is generated. Do not edit. + +#pragma once + +#include +#include +#include +#include + +#include + +#include + +namespace mbgl { +namespace style { + +class TransitionOptions; + +class LineLayer : public Layer { +public: + LineLayer(const std::string& layerID, const std::string& sourceID); + ~LineLayer() final; + + // Source + const std::string& getSourceID() const; + const std::string& getSourceLayer() const; + void setSourceLayer(const std::string& sourceLayer); + + void setFilter(const Filter&); + const Filter& getFilter() const; + + // Visibility + void setVisibility(VisibilityType) final; + + // Zoom range + void setMinZoom(float) final; + void setMaxZoom(float) final; + + // Layout properties + + static PropertyValue getDefaultLineCap(); + PropertyValue getLineCap() const; + void setLineCap(PropertyValue); + + static DataDrivenPropertyValue getDefaultLineJoin(); + DataDrivenPropertyValue getLineJoin() const; + void setLineJoin(DataDrivenPropertyValue); + + static PropertyValue getDefaultLineMiterLimit(); + PropertyValue getLineMiterLimit() const; + void setLineMiterLimit(PropertyValue); + + static PropertyValue getDefaultLineRoundLimit(); + PropertyValue getLineRoundLimit() const; + void setLineRoundLimit(PropertyValue); + + // Paint properties + + static DataDrivenPropertyValue getDefaultLineOpacity(); + DataDrivenPropertyValue getLineOpacity() const; + void setLineOpacity(DataDrivenPropertyValue); + void setLineOpacityTransition(const TransitionOptions&); + TransitionOptions getLineOpacityTransition() const; + + static DataDrivenPropertyValue getDefaultLineColor(); + DataDrivenPropertyValue getLineColor() const; + void setLineColor(DataDrivenPropertyValue); + void setLineColorTransition(const TransitionOptions&); + TransitionOptions getLineColorTransition() const; + + static PropertyValue> getDefaultLineTranslate(); + PropertyValue> getLineTranslate() const; + void setLineTranslate(PropertyValue>); + void setLineTranslateTransition(const TransitionOptions&); + TransitionOptions getLineTranslateTransition() const; + + static PropertyValue getDefaultLineTranslateAnchor(); + PropertyValue getLineTranslateAnchor() const; + void setLineTranslateAnchor(PropertyValue); + void setLineTranslateAnchorTransition(const TransitionOptions&); + TransitionOptions getLineTranslateAnchorTransition() const; + + static DataDrivenPropertyValue getDefaultLineWidth(); + DataDrivenPropertyValue getLineWidth() const; + void setLineWidth(DataDrivenPropertyValue); + void setLineWidthTransition(const TransitionOptions&); + TransitionOptions getLineWidthTransition() const; + + static DataDrivenPropertyValue getDefaultLineGapWidth(); + DataDrivenPropertyValue getLineGapWidth() const; + void setLineGapWidth(DataDrivenPropertyValue); + void setLineGapWidthTransition(const TransitionOptions&); + TransitionOptions getLineGapWidthTransition() const; + + static DataDrivenPropertyValue getDefaultLineOffset(); + DataDrivenPropertyValue getLineOffset() const; + void setLineOffset(DataDrivenPropertyValue); + void setLineOffsetTransition(const TransitionOptions&); + TransitionOptions getLineOffsetTransition() const; + + static DataDrivenPropertyValue getDefaultLineBlur(); + DataDrivenPropertyValue getLineBlur() const; + void setLineBlur(DataDrivenPropertyValue); + void setLineBlurTransition(const TransitionOptions&); + TransitionOptions getLineBlurTransition() const; + + static PropertyValue> getDefaultLineDasharray(); + PropertyValue> getLineDasharray() const; + void setLineDasharray(PropertyValue>); + void setLineDasharrayTransition(const TransitionOptions&); + TransitionOptions getLineDasharrayTransition() const; + + static PropertyValue getDefaultLinePattern(); + PropertyValue getLinePattern() const; + void setLinePattern(PropertyValue); + void setLinePatternTransition(const TransitionOptions&); + TransitionOptions getLinePatternTransition() const; + + // Private implementation + + class Impl; + const Impl& impl() const; + + Mutable mutableImpl() const; + LineLayer(Immutable); + std::unique_ptr cloneRef(const std::string& id) const final; +}; + +template <> +inline bool Layer::is() const { + return getType() == LayerType::Line; +} + +} // namespace style +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/style/layers/raster_layer.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/style/layers/raster_layer.hpp new file mode 100644 index 0000000..8e7849c --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/style/layers/raster_layer.hpp @@ -0,0 +1,98 @@ +// This file is generated. Do not edit. + +#pragma once + +#include +#include +#include +#include + +#include + +namespace mbgl { +namespace style { + +class TransitionOptions; + +class RasterLayer : public Layer { +public: + RasterLayer(const std::string& layerID, const std::string& sourceID); + ~RasterLayer() final; + + // Source + const std::string& getSourceID() const; + + // Visibility + void setVisibility(VisibilityType) final; + + // Zoom range + void setMinZoom(float) final; + void setMaxZoom(float) final; + + // Paint properties + + static PropertyValue getDefaultRasterOpacity(); + PropertyValue getRasterOpacity() const; + void setRasterOpacity(PropertyValue); + void setRasterOpacityTransition(const TransitionOptions&); + TransitionOptions getRasterOpacityTransition() const; + + static PropertyValue getDefaultRasterHueRotate(); + PropertyValue getRasterHueRotate() const; + void setRasterHueRotate(PropertyValue); + void setRasterHueRotateTransition(const TransitionOptions&); + TransitionOptions getRasterHueRotateTransition() const; + + static PropertyValue getDefaultRasterBrightnessMin(); + PropertyValue getRasterBrightnessMin() const; + void setRasterBrightnessMin(PropertyValue); + void setRasterBrightnessMinTransition(const TransitionOptions&); + TransitionOptions getRasterBrightnessMinTransition() const; + + static PropertyValue getDefaultRasterBrightnessMax(); + PropertyValue getRasterBrightnessMax() const; + void setRasterBrightnessMax(PropertyValue); + void setRasterBrightnessMaxTransition(const TransitionOptions&); + TransitionOptions getRasterBrightnessMaxTransition() const; + + static PropertyValue getDefaultRasterSaturation(); + PropertyValue getRasterSaturation() const; + void setRasterSaturation(PropertyValue); + void setRasterSaturationTransition(const TransitionOptions&); + TransitionOptions getRasterSaturationTransition() const; + + static PropertyValue getDefaultRasterContrast(); + PropertyValue getRasterContrast() const; + void setRasterContrast(PropertyValue); + void setRasterContrastTransition(const TransitionOptions&); + TransitionOptions getRasterContrastTransition() const; + + static PropertyValue getDefaultRasterResampling(); + PropertyValue getRasterResampling() const; + void setRasterResampling(PropertyValue); + void setRasterResamplingTransition(const TransitionOptions&); + TransitionOptions getRasterResamplingTransition() const; + + static PropertyValue getDefaultRasterFadeDuration(); + PropertyValue getRasterFadeDuration() const; + void setRasterFadeDuration(PropertyValue); + void setRasterFadeDurationTransition(const TransitionOptions&); + TransitionOptions getRasterFadeDurationTransition() const; + + // Private implementation + + class Impl; + const Impl& impl() const; + + Mutable mutableImpl() const; + RasterLayer(Immutable); + std::unique_ptr cloneRef(const std::string& id) const final; +}; + +template <> +inline bool Layer::is() const { + return getType() == LayerType::Raster; +} + +} // namespace style +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/style/layers/symbol_layer.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/style/layers/symbol_layer.hpp new file mode 100644 index 0000000..f068e2d --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/style/layers/symbol_layer.hpp @@ -0,0 +1,287 @@ +// This file is generated. Do not edit. + +#pragma once + +#include +#include +#include +#include + +#include + +#include + +namespace mbgl { +namespace style { + +class TransitionOptions; + +class SymbolLayer : public Layer { +public: + SymbolLayer(const std::string& layerID, const std::string& sourceID); + ~SymbolLayer() final; + + // Source + const std::string& getSourceID() const; + const std::string& getSourceLayer() const; + void setSourceLayer(const std::string& sourceLayer); + + void setFilter(const Filter&); + const Filter& getFilter() const; + + // Visibility + void setVisibility(VisibilityType) final; + + // Zoom range + void setMinZoom(float) final; + void setMaxZoom(float) final; + + // Layout properties + + static PropertyValue getDefaultSymbolPlacement(); + PropertyValue getSymbolPlacement() const; + void setSymbolPlacement(PropertyValue); + + static PropertyValue getDefaultSymbolSpacing(); + PropertyValue getSymbolSpacing() const; + void setSymbolSpacing(PropertyValue); + + static PropertyValue getDefaultSymbolAvoidEdges(); + PropertyValue getSymbolAvoidEdges() const; + void setSymbolAvoidEdges(PropertyValue); + + static PropertyValue getDefaultIconAllowOverlap(); + PropertyValue getIconAllowOverlap() const; + void setIconAllowOverlap(PropertyValue); + + static PropertyValue getDefaultIconIgnorePlacement(); + PropertyValue getIconIgnorePlacement() const; + void setIconIgnorePlacement(PropertyValue); + + static PropertyValue getDefaultIconOptional(); + PropertyValue getIconOptional() const; + void setIconOptional(PropertyValue); + + static PropertyValue getDefaultIconRotationAlignment(); + PropertyValue getIconRotationAlignment() const; + void setIconRotationAlignment(PropertyValue); + + static DataDrivenPropertyValue getDefaultIconSize(); + DataDrivenPropertyValue getIconSize() const; + void setIconSize(DataDrivenPropertyValue); + + static PropertyValue getDefaultIconTextFit(); + PropertyValue getIconTextFit() const; + void setIconTextFit(PropertyValue); + + static PropertyValue> getDefaultIconTextFitPadding(); + PropertyValue> getIconTextFitPadding() const; + void setIconTextFitPadding(PropertyValue>); + + static DataDrivenPropertyValue getDefaultIconImage(); + DataDrivenPropertyValue getIconImage() const; + void setIconImage(DataDrivenPropertyValue); + + static DataDrivenPropertyValue getDefaultIconRotate(); + DataDrivenPropertyValue getIconRotate() const; + void setIconRotate(DataDrivenPropertyValue); + + static PropertyValue getDefaultIconPadding(); + PropertyValue getIconPadding() const; + void setIconPadding(PropertyValue); + + static PropertyValue getDefaultIconKeepUpright(); + PropertyValue getIconKeepUpright() const; + void setIconKeepUpright(PropertyValue); + + static DataDrivenPropertyValue> getDefaultIconOffset(); + DataDrivenPropertyValue> getIconOffset() const; + void setIconOffset(DataDrivenPropertyValue>); + + static DataDrivenPropertyValue getDefaultIconAnchor(); + DataDrivenPropertyValue getIconAnchor() const; + void setIconAnchor(DataDrivenPropertyValue); + + static PropertyValue getDefaultIconPitchAlignment(); + PropertyValue getIconPitchAlignment() const; + void setIconPitchAlignment(PropertyValue); + + static PropertyValue getDefaultTextPitchAlignment(); + PropertyValue getTextPitchAlignment() const; + void setTextPitchAlignment(PropertyValue); + + static PropertyValue getDefaultTextRotationAlignment(); + PropertyValue getTextRotationAlignment() const; + void setTextRotationAlignment(PropertyValue); + + static DataDrivenPropertyValue getDefaultTextField(); + DataDrivenPropertyValue getTextField() const; + void setTextField(DataDrivenPropertyValue); + + static DataDrivenPropertyValue> getDefaultTextFont(); + DataDrivenPropertyValue> getTextFont() const; + void setTextFont(DataDrivenPropertyValue>); + + static DataDrivenPropertyValue getDefaultTextSize(); + DataDrivenPropertyValue getTextSize() const; + void setTextSize(DataDrivenPropertyValue); + + static DataDrivenPropertyValue getDefaultTextMaxWidth(); + DataDrivenPropertyValue getTextMaxWidth() const; + void setTextMaxWidth(DataDrivenPropertyValue); + + static PropertyValue getDefaultTextLineHeight(); + PropertyValue getTextLineHeight() const; + void setTextLineHeight(PropertyValue); + + static DataDrivenPropertyValue getDefaultTextLetterSpacing(); + DataDrivenPropertyValue getTextLetterSpacing() const; + void setTextLetterSpacing(DataDrivenPropertyValue); + + static DataDrivenPropertyValue getDefaultTextJustify(); + DataDrivenPropertyValue getTextJustify() const; + void setTextJustify(DataDrivenPropertyValue); + + static DataDrivenPropertyValue getDefaultTextAnchor(); + DataDrivenPropertyValue getTextAnchor() const; + void setTextAnchor(DataDrivenPropertyValue); + + static PropertyValue getDefaultTextMaxAngle(); + PropertyValue getTextMaxAngle() const; + void setTextMaxAngle(PropertyValue); + + static DataDrivenPropertyValue getDefaultTextRotate(); + DataDrivenPropertyValue getTextRotate() const; + void setTextRotate(DataDrivenPropertyValue); + + static PropertyValue getDefaultTextPadding(); + PropertyValue getTextPadding() const; + void setTextPadding(PropertyValue); + + static PropertyValue getDefaultTextKeepUpright(); + PropertyValue getTextKeepUpright() const; + void setTextKeepUpright(PropertyValue); + + static DataDrivenPropertyValue getDefaultTextTransform(); + DataDrivenPropertyValue getTextTransform() const; + void setTextTransform(DataDrivenPropertyValue); + + static DataDrivenPropertyValue> getDefaultTextOffset(); + DataDrivenPropertyValue> getTextOffset() const; + void setTextOffset(DataDrivenPropertyValue>); + + static PropertyValue getDefaultTextAllowOverlap(); + PropertyValue getTextAllowOverlap() const; + void setTextAllowOverlap(PropertyValue); + + static PropertyValue getDefaultTextIgnorePlacement(); + PropertyValue getTextIgnorePlacement() const; + void setTextIgnorePlacement(PropertyValue); + + static PropertyValue getDefaultTextOptional(); + PropertyValue getTextOptional() const; + void setTextOptional(PropertyValue); + + // Paint properties + + static DataDrivenPropertyValue getDefaultIconOpacity(); + DataDrivenPropertyValue getIconOpacity() const; + void setIconOpacity(DataDrivenPropertyValue); + void setIconOpacityTransition(const TransitionOptions&); + TransitionOptions getIconOpacityTransition() const; + + static DataDrivenPropertyValue getDefaultIconColor(); + DataDrivenPropertyValue getIconColor() const; + void setIconColor(DataDrivenPropertyValue); + void setIconColorTransition(const TransitionOptions&); + TransitionOptions getIconColorTransition() const; + + static DataDrivenPropertyValue getDefaultIconHaloColor(); + DataDrivenPropertyValue getIconHaloColor() const; + void setIconHaloColor(DataDrivenPropertyValue); + void setIconHaloColorTransition(const TransitionOptions&); + TransitionOptions getIconHaloColorTransition() const; + + static DataDrivenPropertyValue getDefaultIconHaloWidth(); + DataDrivenPropertyValue getIconHaloWidth() const; + void setIconHaloWidth(DataDrivenPropertyValue); + void setIconHaloWidthTransition(const TransitionOptions&); + TransitionOptions getIconHaloWidthTransition() const; + + static DataDrivenPropertyValue getDefaultIconHaloBlur(); + DataDrivenPropertyValue getIconHaloBlur() const; + void setIconHaloBlur(DataDrivenPropertyValue); + void setIconHaloBlurTransition(const TransitionOptions&); + TransitionOptions getIconHaloBlurTransition() const; + + static PropertyValue> getDefaultIconTranslate(); + PropertyValue> getIconTranslate() const; + void setIconTranslate(PropertyValue>); + void setIconTranslateTransition(const TransitionOptions&); + TransitionOptions getIconTranslateTransition() const; + + static PropertyValue getDefaultIconTranslateAnchor(); + PropertyValue getIconTranslateAnchor() const; + void setIconTranslateAnchor(PropertyValue); + void setIconTranslateAnchorTransition(const TransitionOptions&); + TransitionOptions getIconTranslateAnchorTransition() const; + + static DataDrivenPropertyValue getDefaultTextOpacity(); + DataDrivenPropertyValue getTextOpacity() const; + void setTextOpacity(DataDrivenPropertyValue); + void setTextOpacityTransition(const TransitionOptions&); + TransitionOptions getTextOpacityTransition() const; + + static DataDrivenPropertyValue getDefaultTextColor(); + DataDrivenPropertyValue getTextColor() const; + void setTextColor(DataDrivenPropertyValue); + void setTextColorTransition(const TransitionOptions&); + TransitionOptions getTextColorTransition() const; + + static DataDrivenPropertyValue getDefaultTextHaloColor(); + DataDrivenPropertyValue getTextHaloColor() const; + void setTextHaloColor(DataDrivenPropertyValue); + void setTextHaloColorTransition(const TransitionOptions&); + TransitionOptions getTextHaloColorTransition() const; + + static DataDrivenPropertyValue getDefaultTextHaloWidth(); + DataDrivenPropertyValue getTextHaloWidth() const; + void setTextHaloWidth(DataDrivenPropertyValue); + void setTextHaloWidthTransition(const TransitionOptions&); + TransitionOptions getTextHaloWidthTransition() const; + + static DataDrivenPropertyValue getDefaultTextHaloBlur(); + DataDrivenPropertyValue getTextHaloBlur() const; + void setTextHaloBlur(DataDrivenPropertyValue); + void setTextHaloBlurTransition(const TransitionOptions&); + TransitionOptions getTextHaloBlurTransition() const; + + static PropertyValue> getDefaultTextTranslate(); + PropertyValue> getTextTranslate() const; + void setTextTranslate(PropertyValue>); + void setTextTranslateTransition(const TransitionOptions&); + TransitionOptions getTextTranslateTransition() const; + + static PropertyValue getDefaultTextTranslateAnchor(); + PropertyValue getTextTranslateAnchor() const; + void setTextTranslateAnchor(PropertyValue); + void setTextTranslateAnchorTransition(const TransitionOptions&); + TransitionOptions getTextTranslateAnchorTransition() const; + + // Private implementation + + class Impl; + const Impl& impl() const; + + Mutable mutableImpl() const; + SymbolLayer(Immutable); + std::unique_ptr cloneRef(const std::string& id) const final; +}; + +template <> +inline bool Layer::is() const { + return getType() == LayerType::Symbol; +} + +} // namespace style +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/style/light.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/style/light.hpp new file mode 100644 index 0000000..c82792b --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/style/light.hpp @@ -0,0 +1,53 @@ +// This file is generated. Do not edit. + +#pragma once + +#include +#include +#include +#include + +namespace mbgl { +namespace style { + +class LightObserver; + +class Light { +public: + Light(); + ~Light(); + + static LightAnchorType getDefaultAnchor(); + PropertyValue getAnchor() const; + void setAnchor(PropertyValue); + void setAnchorTransition(const TransitionOptions&); + TransitionOptions getAnchorTransition() const; + + static Position getDefaultPosition(); + PropertyValue getPosition() const; + void setPosition(PropertyValue); + void setPositionTransition(const TransitionOptions&); + TransitionOptions getPositionTransition() const; + + static Color getDefaultColor(); + PropertyValue getColor() const; + void setColor(PropertyValue); + void setColorTransition(const TransitionOptions&); + TransitionOptions getColorTransition() const; + + static float getDefaultIntensity(); + PropertyValue getIntensity() const; + void setIntensity(PropertyValue); + void setIntensityTransition(const TransitionOptions&); + TransitionOptions getIntensityTransition() const; + + class Impl; + Immutable impl; + Mutable mutableImpl() const; + + LightObserver* observer = nullptr; + void setObserver(LightObserver*); +}; + +} // namespace style +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/style/light.hpp.ejs b/src/3rdparty/mapbox-gl-native/include/mbgl/style/light.hpp.ejs new file mode 100644 index 0000000..adc5b65 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/style/light.hpp.ejs @@ -0,0 +1,40 @@ +<% + const properties = locals.properties; +-%> +// This file is generated. Do not edit. + +#pragma once + +#include +#include +#include +#include + +namespace mbgl { +namespace style { + +class LightObserver; + +class Light { +public: + Light(); + ~Light(); + +<% for (const property of properties) { -%> + static <%- evaluatedType(property) %> getDefault<%- camelize(property.name) %>(); + <%- propertyValueType(property) %> get<%- camelize(property.name) %>() const; + void set<%- camelize(property.name) %>(<%- propertyValueType(property) %>); + void set<%- camelize(property.name) %>Transition(const TransitionOptions&); + TransitionOptions get<%- camelize(property.name) %>Transition() const; + +<% } -%> + class Impl; + Immutable impl; + Mutable mutableImpl() const; + + LightObserver* observer = nullptr; + void setObserver(LightObserver*); +}; + +} // namespace style +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/style/position.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/style/position.hpp new file mode 100644 index 0000000..3be8d1c --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/style/position.hpp @@ -0,0 +1,68 @@ +#pragma once + +#include + +#include + +namespace mbgl { +namespace style { +class Position { +public: + Position() = default; + Position(std::array& position_) + : radial(position_[0]), azimuthal(position_[1]), polar(position_[2]) { + calculateCartesian(); + }; + + friend bool operator==(const Position& lhs, const Position& rhs) { + return lhs.radial == rhs.radial && lhs.azimuthal == rhs.azimuthal && lhs.polar == rhs.polar; + // TODO this doesn't address wrapping, which would be better addressed by comparing cartesian coordinates but being calculated floats are ont to be trusted. + } + + friend bool operator!=(const Position& lhs, const Position& rhs) { + return !(lhs == rhs); + } + + const std::array getCartesian() const { + return { { x, y, z } }; + }; + + const std::array getSpherical() const { + return { { radial, azimuthal, polar } }; + }; + + void set(std::array& position_) { + radial = position_[0]; + azimuthal = position_[1]; + polar = position_[2]; + calculateCartesian(); + }; + + // Utility function to be used only during interpolation; this leaves spherical coordinates undefined. + void setCartesian(std::array& position_) { + x = position_[0]; + y = position_[1]; + z = position_[2]; + } + +private: + float radial; + float azimuthal; + float polar; + float x; + float y; + float z; + + void calculateCartesian() { + // We abstract "north"/"up" (compass-wise) to be 0° when really this is 90° (π/2): we + // correct for that here + const float _a = (azimuthal + 90) * util::DEG2RAD; + const float _p = polar * util::DEG2RAD; + + x = radial * std::cos(_a) * std::sin(_p); + y = radial * std::sin(_a) * std::sin(_p); + z = radial * std::cos(_p); + }; +}; +} // namespace style +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/style/property_expression.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/style/property_expression.hpp new file mode 100644 index 0000000..b198de0 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/style/property_expression.hpp @@ -0,0 +1,117 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include + +namespace mbgl { +namespace style { + +template +class PropertyExpression { +public: + // Second parameter to be used only for conversions from legacy functions. + PropertyExpression(std::unique_ptr expression_, optional defaultValue_ = {}) + : expression(std::move(expression_)), + defaultValue(std::move(defaultValue_)), + zoomCurve(expression::findZoomCurveChecked(expression.get())) { + } + + bool isZoomConstant() const { return expression::isZoomConstant(*expression); } + bool isFeatureConstant() const { return expression::isFeatureConstant(*expression); } + + T evaluate(float zoom) const { + assert(!expression::isZoomConstant(*expression)); + assert(expression::isFeatureConstant(*expression)); + const expression::EvaluationResult result = expression->evaluate(expression::EvaluationContext(zoom, nullptr)); + if (result) { + const optional typed = expression::fromExpressionValue(*result); + return typed ? *typed : defaultValue ? *defaultValue : T(); + } + return defaultValue ? *defaultValue : T(); + } + + template + T evaluate(const Feature& feature, T finalDefaultValue) const { + assert(expression::isZoomConstant(*expression)); + assert(!expression::isFeatureConstant(*expression)); + const expression::EvaluationResult result = expression->evaluate(expression::EvaluationContext(&feature)); + if (result) { + const optional typed = expression::fromExpressionValue(*result); + return typed ? *typed : defaultValue ? *defaultValue : finalDefaultValue; + } + return defaultValue ? *defaultValue : finalDefaultValue; + } + + template + T evaluate(float zoom, const Feature& feature, T finalDefaultValue) const { + assert(!expression::isFeatureConstant(*expression)); + const expression::EvaluationResult result = expression->evaluate(expression::EvaluationContext({zoom}, &feature)); + if (result) { + const optional typed = expression::fromExpressionValue(*result); + return typed ? *typed : defaultValue ? *defaultValue : finalDefaultValue; + } + return defaultValue ? *defaultValue : finalDefaultValue; + } + + float interpolationFactor(const Range& inputLevels, const float inputValue) const { + return zoomCurve.match( + [](std::nullptr_t) { + assert(false); + return 0.0f; + }, + [&](const expression::Interpolate* z) { + return z->interpolationFactor(Range { inputLevels.min, inputLevels.max }, inputValue); + }, + [&](const expression::Step*) { + return 0.0f; + } + ); + } + + Range getCoveringStops(const float lower, const float upper) const { + return zoomCurve.match( + [](std::nullptr_t) { + assert(false); + return Range(0.0f, 0.0f); + }, + [&](auto z) { + return z->getCoveringStops(lower, upper); + } + ); + } + + // Return the range obtained by evaluating the function at each of the zoom levels in zoomRange + template + Range evaluate(const Range& zoomRange, const Feature& feature, T finalDefaultValue) { + return Range { + evaluate(zoomRange.min, feature, finalDefaultValue), + evaluate(zoomRange.max, feature, finalDefaultValue) + }; + } + + std::vector> possibleOutputs() const { + return expression::fromExpressionValues(expression->possibleOutputs()); + } + + const expression::Expression& getExpression() const { return *expression; } + + bool useIntegerZoom = false; + + friend bool operator==(const PropertyExpression& lhs, + const PropertyExpression& rhs) { + return *lhs.expression == *rhs.expression; + } + +private: + std::shared_ptr expression; + optional defaultValue; + variant zoomCurve; +}; + +} // namespace style +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/style/property_value.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/style/property_value.hpp new file mode 100644 index 0000000..1b0f3d2 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/style/property_value.hpp @@ -0,0 +1,55 @@ +#pragma once + +#include +#include +#include + +namespace mbgl { +namespace style { + +template +class PropertyValue { +private: + using Value = variant>; + Value value; + + friend bool operator==(const PropertyValue& lhs, const PropertyValue& rhs) { + return lhs.value == rhs.value; + } + + friend bool operator!=(const PropertyValue& lhs, const PropertyValue& rhs) { + return !(lhs == rhs); + } + +public: + PropertyValue() + : value() {} + + PropertyValue(T constant) + : value(constant) {} + + PropertyValue(PropertyExpression expression) + : value(expression) { + assert(expression.isFeatureConstant()); + } + + bool isUndefined() const { return value.which() == 0; } + bool isConstant() const { return value.which() == 1; } + bool isExpression() const { return value.which() == 2; } + bool isDataDriven() const { return false; } + + const T & asConstant() const { return value.template get< T >(); } + const PropertyExpression& asExpression() const { return value.template get>(); } + + template + auto evaluate(const Evaluator& evaluator, TimePoint = {}) const { + return Value::visit(value, evaluator); + } + + bool hasDataDrivenPropertyDifference(const PropertyValue&) const { + return false; + } +}; + +} // namespace style +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/style/source.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/style/source.hpp new file mode 100644 index 0000000..2f2838a --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/style/source.hpp @@ -0,0 +1,84 @@ +#pragma once + +#include +#include +#include +#include +#include + +#include +#include + +namespace mbgl { + +class FileSource; + +namespace style { + +class VectorSource; +class RasterSource; +class RasterDEMSource; +class GeoJSONSource; +class SourceObserver; + +/** + * The runtime representation of a [source](https://www.mapbox.com/mapbox-gl-style-spec/#sources) from the Mapbox Style + * Specification. + * + * `Source` is an abstract base class; concrete derived classes are provided for each source type. `Source` contains + * functionality that is common to all layer types: + * + * * Runtime type information: type predicates and casting + * * Accessors for properties common to all source types: ID, etc. + * * Cloning and copying + * + * All other functionality lives in the derived classes. To instantiate a source, create an instance of the desired + * type, passing the ID: + * + * auto vectorSource = std::make_unique("my-vector-source"); + */ +class Source : public mbgl::util::noncopyable { +public: + virtual ~Source(); + + // Check whether this source is of the given subtype. + template + bool is() const; + + // Dynamically cast this source to the given subtype. + template + T* as() { + return is() ? reinterpret_cast(this) : nullptr; + } + + template + const T* as() const { + return is() ? reinterpret_cast(this) : nullptr; + } + + SourceType getType() const; + std::string getID() const; + optional getAttribution() const; + + // Private implementation + class Impl; + Immutable baseImpl; + + Source(Immutable); + + void setObserver(SourceObserver*); + SourceObserver* observer = nullptr; + + virtual void loadDescription(FileSource&) = 0; + void dumpDebugLogs() const; + + bool loaded = false; + + // For use in SDK bindings, which store a reference to a platform-native peer + // object here, so that separately-obtained references to this object share + // identical platform-native peers. + util::unique_any peer; +}; + +} // namespace style +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/style/sources/custom_geometry_source.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/style/sources/custom_geometry_source.hpp new file mode 100644 index 0000000..9daeeb3 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/style/sources/custom_geometry_source.hpp @@ -0,0 +1,58 @@ +#pragma once + +#include +#include +#include +#include +#include + +namespace mbgl { + +class OverscaledTileID; +class CanonicalTileID; +template +class Actor; + +namespace style { + +using TileFunction = std::function; + +class CustomTileLoader; + +class CustomGeometrySource : public Source { +public: + struct TileOptions { + double tolerance = 0.375; + uint16_t tileSize = util::tileSize; + uint16_t buffer = 128; + bool clip = false; + bool wrap = false; + }; + + struct Options { + TileFunction fetchTileFunction; + TileFunction cancelTileFunction; + Range zoomRange = { 0, 18}; + TileOptions tileOptions; + }; +public: + CustomGeometrySource(std::string id, CustomGeometrySource::Options options); + ~CustomGeometrySource() final; + void loadDescription(FileSource&) final; + void setTileData(const CanonicalTileID&, const GeoJSON&); + void invalidateTile(const CanonicalTileID&); + void invalidateRegion(const LatLngBounds&); + // Private implementation + class Impl; + const Impl& impl() const; +private: + std::unique_ptr> loader; +}; + +template <> +inline bool Source::is() const { + return getType() == SourceType::CustomVector; +} + +} // namespace style +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/style/sources/geojson_source.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/style/sources/geojson_source.hpp new file mode 100644 index 0000000..372e7c7 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/style/sources/geojson_source.hpp @@ -0,0 +1,54 @@ +#pragma once + +#include +#include +#include +#include + +namespace mbgl { + +class AsyncRequest; + +namespace style { + +struct GeoJSONOptions { + // GeoJSON-VT options + uint8_t minzoom = 0; + uint8_t maxzoom = 18; + uint16_t tileSize = util::tileSize; + uint16_t buffer = 128; + double tolerance = 0.375; + + // Supercluster options + bool cluster = false; + uint16_t clusterRadius = 50; + uint8_t clusterMaxZoom = 17; +}; + +class GeoJSONSource : public Source { +public: + GeoJSONSource(const std::string& id, const GeoJSONOptions& = {}); + ~GeoJSONSource() final; + + void setURL(const std::string& url); + void setGeoJSON(const GeoJSON&); + + optional getURL() const; + + class Impl; + const Impl& impl() const; + + void loadDescription(FileSource&) final; + +private: + optional url; + std::unique_ptr req; +}; + +template <> +inline bool Source::is() const { + return getType() == SourceType::GeoJSON; +} + +} // namespace style +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/style/sources/image_source.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/style/sources/image_source.hpp new file mode 100644 index 0000000..0097642 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/style/sources/image_source.hpp @@ -0,0 +1,41 @@ +#pragma once + +#include +#include +#include + +namespace mbgl { +class LatLng; +class AsyncRequest; + +namespace style { + +class ImageSource : public Source { +public: + ImageSource(std::string id, const std::array); + ~ImageSource() override; + + optional getURL() const; + void setURL(const std::string& url); + + void setImage(PremultipliedImage&&); + + void setCoordinates(const std::array&); + std::array getCoordinates() const; + + class Impl; + const Impl& impl() const; + + void loadDescription(FileSource&) final; +private: + optional url; + std::unique_ptr req; +}; + +template <> +inline bool Source::is() const { + return getType() == SourceType::Image; +} + +} // namespace style +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/style/sources/raster_dem_source.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/style/sources/raster_dem_source.hpp new file mode 100644 index 0000000..8258861 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/style/sources/raster_dem_source.hpp @@ -0,0 +1,25 @@ +#pragma once + +#include +#include +#include + +namespace mbgl { + +class AsyncRequest; + +namespace style { + +class RasterDEMSource : public RasterSource { +public: + RasterDEMSource(std::string id, variant urlOrTileset, uint16_t tileSize); + +}; + +template <> +inline bool Source::is() const { + return getType() == SourceType::RasterDEM; +} + +} // namespace style +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/style/sources/raster_source.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/style/sources/raster_source.hpp new file mode 100644 index 0000000..5aa81aa --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/style/sources/raster_source.hpp @@ -0,0 +1,39 @@ +#pragma once + +#include +#include +#include + +namespace mbgl { + +class AsyncRequest; + +namespace style { + +class RasterSource : public Source { +public: + RasterSource(std::string id, variant urlOrTileset, uint16_t tileSize, SourceType sourceType = SourceType::Raster); + ~RasterSource() override; + + const variant& getURLOrTileset() const; + optional getURL() const; + + uint16_t getTileSize() const; + + class Impl; + const Impl& impl() const; + + void loadDescription(FileSource&) final; + +private: + const variant urlOrTileset; + std::unique_ptr req; +}; + +template <> +inline bool Source::is() const { + return getType() == SourceType::Raster; +} + +} // namespace style +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/style/sources/vector_source.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/style/sources/vector_source.hpp new file mode 100644 index 0000000..6f16974 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/style/sources/vector_source.hpp @@ -0,0 +1,37 @@ +#pragma once + +#include +#include +#include + +namespace mbgl { + +class AsyncRequest; + +namespace style { + +class VectorSource : public Source { +public: + VectorSource(std::string id, variant urlOrTileset); + ~VectorSource() final; + + const variant& getURLOrTileset() const; + optional getURL() const; + + class Impl; + const Impl& impl() const; + + void loadDescription(FileSource&) final; + +private: + const variant urlOrTileset; + std::unique_ptr req; +}; + +template <> +inline bool Source::is() const { + return getType() == SourceType::Vector; +} + +} // namespace style +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/style/style.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/style/style.hpp new file mode 100644 index 0000000..d6fdbd8 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/style/style.hpp @@ -0,0 +1,79 @@ +#pragma once + +#include +#include +#include + +#include +#include +#include + +namespace mbgl { + +class FileSource; +class Scheduler; + +namespace style { + +class Light; +class Image; +class Source; +class Layer; + +class Style { +public: + Style(Scheduler&, FileSource&, float pixelRatio); + ~Style(); + + void loadJSON(const std::string&); + void loadURL(const std::string&); + + std::string getJSON() const; + std::string getURL() const; + + // Defaults + std::string getName() const; + CameraOptions getDefaultCamera() const; + + // TransitionOptions + TransitionOptions getTransitionOptions() const; + void setTransitionOptions(const TransitionOptions&); + + // Light + Light* getLight(); + const Light* getLight() const; + + void setLight(std::unique_ptr); + + // Images + const Image* getImage(const std::string&) const; + void addImage(std::unique_ptr); + void removeImage(const std::string&); + + // Sources + std::vector< Source*> getSources(); + std::vector getSources() const; + + Source* getSource(const std::string&); + const Source* getSource(const std::string&) const; + + void addSource(std::unique_ptr); + std::unique_ptr removeSource(const std::string& sourceID); + + // Layers + std::vector< Layer*> getLayers(); + std::vector getLayers() const; + + Layer* getLayer(const std::string&); + const Layer* getLayer(const std::string&) const; + + void addLayer(std::unique_ptr, const optional& beforeLayerID = {}); + std::unique_ptr removeLayer(const std::string& layerID); + + // Private implementation + class Impl; + const std::unique_ptr impl; +}; + +} // namespace style +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/style/transition_options.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/style/transition_options.hpp new file mode 100644 index 0000000..87a8171 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/style/transition_options.hpp @@ -0,0 +1,32 @@ +#pragma once + +#include +#include + +namespace mbgl { +namespace style { + +class TransitionOptions { +public: + optional duration; + optional delay; + + TransitionOptions(optional duration_ = {}, + optional delay_ = {}) + : duration(std::move(duration_)), + delay(std::move(delay_)) {} + + TransitionOptions reverseMerge(const TransitionOptions& defaults) const { + return { + duration ? duration : defaults.duration, + delay ? delay : defaults.delay + }; + } + + bool isDefined() const { + return duration || delay; + } +}; + +} // namespace style +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/style/types.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/style/types.hpp new file mode 100644 index 0000000..805cff1 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/style/types.hpp @@ -0,0 +1,115 @@ +#pragma once + +#include + +namespace mbgl { + +namespace style { + +// TODO: should be in public source.hpp header +enum class SourceType : uint8_t { + Vector, + Raster, + RasterDEM, + GeoJSON, + Video, + Annotations, + Image, + CustomVector +}; + +enum class VisibilityType : bool { + Visible, + None, +}; + +enum class LineCapType : uint8_t { + Round, + Butt, + Square, +}; + +enum class LineJoinType : uint8_t { + Miter, + Bevel, + Round, + // the following two types are for internal use only + FakeRound, + FlipBevel +}; + +enum class RasterResamplingType : bool { + Linear, + Nearest +}; + +enum class HillshadeIlluminationAnchorType : bool { + Map, + Viewport +}; + +enum class TranslateAnchorType : bool { + Map, + Viewport +}; + +enum class RotateAnchorType : bool { + Map, + Viewport, +}; + +enum class CirclePitchScaleType : bool { + Map, + Viewport, +}; + +enum class SymbolPlacementType : uint8_t { + Point, + Line, + LineCenter +}; + +enum class AlignmentType : uint8_t { + Map, + Viewport, + Auto, +}; + +enum class TextJustifyType : uint8_t { + Center, + Left, + Right +}; + +enum class SymbolAnchorType : uint8_t { + Center, + Left, + Right, + Top, + Bottom, + TopLeft, + TopRight, + BottomLeft, + BottomRight +}; + +enum class TextTransformType : uint8_t { + None, + Uppercase, + Lowercase, +}; + +enum class IconTextFitType : uint8_t { + None, + Both, + Width, + Height +}; + +enum class LightAnchorType: bool { + Map, + Viewport +}; + +} // namespace style +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/style/undefined.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/style/undefined.hpp new file mode 100644 index 0000000..e43f132 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/style/undefined.hpp @@ -0,0 +1,12 @@ +#pragma once + +namespace mbgl { +namespace style { + +class Undefined {}; + +inline bool operator==(const Undefined&, const Undefined&) { return true; } +inline bool operator!=(const Undefined&, const Undefined&) { return false; } + +} // namespace style +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/tile/tile_id.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/tile/tile_id.hpp new file mode 100644 index 0000000..dd2fba5 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/tile/tile_id.hpp @@ -0,0 +1,273 @@ +#pragma once + +#include + +#include +#include +#include +#include +#include +#include +#include + +namespace mbgl { + +class OverscaledTileID; +class CanonicalTileID; +class UnwrappedTileID; + +// Has integer z/x/y coordinates +// All tiles must be derived from 0/0/0 (=no tiles outside of the main tile pyramid) +// Used for requesting data; represents data tiles that exist out there. +// z is never larger than the source's maxzoom +class CanonicalTileID { +public: + CanonicalTileID(uint8_t z, uint32_t x, uint32_t y); + bool operator==(const CanonicalTileID&) const; + bool operator!=(const CanonicalTileID&) const; + bool operator<(const CanonicalTileID&) const; + bool isChildOf(const CanonicalTileID&) const; + CanonicalTileID scaledTo(uint8_t z) const; + std::array children() const; + + uint8_t z; + uint32_t x; + uint32_t y; +}; + +::std::ostream& operator<<(::std::ostream& os, const CanonicalTileID& rhs); +namespace util { +std::string toString(const CanonicalTileID&); +} // namespace util + +// Has integer z/x/y coordinates +// overscaledZ describes the zoom level this tile is intented to represent, e.g. when parsing data +// z is never larger than the source's maxzoom +// z/x/y describe the +class OverscaledTileID { +public: + OverscaledTileID(uint8_t overscaledZ, int16_t wrap, CanonicalTileID); + OverscaledTileID(uint8_t overscaledZ, int16_t wrap, uint8_t z, uint32_t x, uint32_t y); + OverscaledTileID(uint8_t z, uint32_t x, uint32_t y); + explicit OverscaledTileID(const CanonicalTileID&); + explicit OverscaledTileID(CanonicalTileID&&); + bool operator==(const OverscaledTileID&) const; + bool operator!=(const OverscaledTileID&) const; + bool operator<(const OverscaledTileID&) const; + bool isChildOf(const OverscaledTileID&) const; + uint32_t overscaleFactor() const; + OverscaledTileID scaledTo(uint8_t z) const; + UnwrappedTileID toUnwrapped() const; + OverscaledTileID unwrapTo(int16_t wrap); + + uint8_t overscaledZ; + int16_t wrap; + CanonicalTileID canonical; +}; + +::std::ostream& operator<<(::std::ostream& os, const OverscaledTileID& rhs); +namespace util { +std::string toString(const OverscaledTileID&); +} // namespace util + +// Has integer z/x/y coordinates +// wrap describes tiles that are left/right of the main tile pyramid, e.g. when wrapping the world +// Used for describing what position tiles are getting rendered at (= calc the matrix) +// z is never larger than the source's maxzoom +class UnwrappedTileID { +public: + UnwrappedTileID(uint8_t z, int64_t x, int64_t y); + UnwrappedTileID(int16_t wrap, CanonicalTileID); + bool operator==(const UnwrappedTileID&) const; + bool operator!=(const UnwrappedTileID&) const; + bool operator<(const UnwrappedTileID&) const; + bool isChildOf(const UnwrappedTileID&) const; + std::array children() const; + OverscaledTileID overscaleTo(uint8_t z) const; + float pixelsToTileUnits(float pixelValue, float zoom) const; + UnwrappedTileID unwrapTo(int16_t wrap); + + int16_t wrap; + CanonicalTileID canonical; +}; + +::std::ostream& operator<<(::std::ostream& os, const UnwrappedTileID& rhs); +namespace util { +std::string toString(const UnwrappedTileID&); +} // namespace util + +inline CanonicalTileID::CanonicalTileID(uint8_t z_, uint32_t x_, uint32_t y_) : z(z_), x(x_), y(y_) { + assert(z <= 32); + assert(x < (1ull << z)); + assert(y < (1ull << z)); +} + +inline bool CanonicalTileID::operator==(const CanonicalTileID& rhs) const { + return z == rhs.z && x == rhs.x && y == rhs.y; +} + +inline bool CanonicalTileID::operator!=(const CanonicalTileID& rhs) const { + return z != rhs.z || x != rhs.x || y != rhs.y; +} + +inline bool CanonicalTileID::operator<(const CanonicalTileID& rhs) const { + return std::tie(z, x, y) < std::tie(rhs.z, rhs.x, rhs.y); +} + +inline bool CanonicalTileID::isChildOf(const CanonicalTileID& parent) const { + // We're first testing for z == 0, to avoid a 32 bit shift, which is undefined. + return parent.z == 0 || + (parent.z < z && parent.x == (x >> (z - parent.z)) && parent.y == (y >> (z - parent.z))); +} + +inline CanonicalTileID CanonicalTileID::scaledTo(uint8_t targetZ) const { + if (targetZ <= z) { + return { targetZ, x >> (z - targetZ), y >> (z - targetZ) }; // parent or same + } else { + return { targetZ, x << (targetZ - z), y << (targetZ - z) }; // child + } +} + +inline std::array CanonicalTileID::children() const { + const uint8_t childZ = z + 1; + const uint32_t childX = x * 2; + const uint32_t childY = y * 2; + return { { + { childZ, childX, childY }, + { childZ, childX, childY + 1 }, + { childZ, childX + 1, childY }, + { childZ, childX + 1, childY + 1 }, + } }; +} + +inline OverscaledTileID::OverscaledTileID(uint8_t overscaledZ_, int16_t wrap_, CanonicalTileID canonical_) + : overscaledZ(overscaledZ_), wrap(wrap_), canonical(std::move(canonical_)) { + assert(overscaledZ >= canonical.z); +} + +inline OverscaledTileID::OverscaledTileID(uint8_t overscaledZ_, int16_t wrap_, uint8_t z, uint32_t x, uint32_t y) + : overscaledZ(overscaledZ_), wrap(wrap_), canonical(z, x, y) { + assert(overscaledZ >= canonical.z); +} + +inline OverscaledTileID::OverscaledTileID(uint8_t z, uint32_t x, uint32_t y) + : overscaledZ(z), wrap(0), canonical(z, x, y) { +} + +inline OverscaledTileID::OverscaledTileID(const CanonicalTileID& canonical_) + : overscaledZ(canonical_.z), wrap(0), canonical(canonical_) { + assert(overscaledZ >= canonical.z); +} + +inline OverscaledTileID::OverscaledTileID(CanonicalTileID&& canonical_) + : overscaledZ(canonical_.z), wrap(0), canonical(std::forward(canonical_)) { + assert(overscaledZ >= canonical.z); +} + +inline bool OverscaledTileID::operator==(const OverscaledTileID& rhs) const { + return overscaledZ == rhs.overscaledZ && wrap == rhs.wrap &&canonical == rhs.canonical; +} + +inline bool OverscaledTileID::operator!=(const OverscaledTileID& rhs) const { + return overscaledZ != rhs.overscaledZ || wrap != rhs.wrap || canonical != rhs.canonical; +} + +inline bool OverscaledTileID::operator<(const OverscaledTileID& rhs) const { + return std::tie(overscaledZ, wrap, canonical) < std::tie(rhs.overscaledZ, rhs.wrap, rhs.canonical); +} + +inline uint32_t OverscaledTileID::overscaleFactor() const { + return 1u << (overscaledZ - canonical.z); +} + +inline bool OverscaledTileID::isChildOf(const OverscaledTileID& rhs) const { + return overscaledZ > rhs.overscaledZ && + (canonical == rhs.canonical || canonical.isChildOf(rhs.canonical)); +} + +inline OverscaledTileID OverscaledTileID::scaledTo(uint8_t z) const { + return { z, wrap, z >= canonical.z ? canonical : canonical.scaledTo(z) }; +} + +inline UnwrappedTileID OverscaledTileID::toUnwrapped() const { + return { wrap, canonical }; +} + +inline OverscaledTileID OverscaledTileID::unwrapTo(int16_t newWrap) { + return { overscaledZ, newWrap, canonical }; +} + +inline UnwrappedTileID::UnwrappedTileID(uint8_t z_, int64_t x_, int64_t y_) + : wrap((x_ < 0 ? x_ - (1ll << z_) + 1 : x_) / (1ll << z_)), + canonical( + z_, + static_cast(x_ - wrap * (1ll << z_)), + y_ < 0 ? 0 : std::min(static_cast(y_), static_cast(1ull << z_) - 1)) { +} + +inline UnwrappedTileID::UnwrappedTileID(int16_t wrap_, CanonicalTileID canonical_) + : wrap(wrap_), canonical(std::move(canonical_)) { +} + +inline bool UnwrappedTileID::operator==(const UnwrappedTileID& rhs) const { + return wrap == rhs.wrap && canonical == rhs.canonical; +} + +inline bool UnwrappedTileID::operator!=(const UnwrappedTileID& rhs) const { + return wrap != rhs.wrap || canonical != rhs.canonical; +} + +inline bool UnwrappedTileID::operator<(const UnwrappedTileID& rhs) const { + return std::tie(wrap, canonical) < std::tie(rhs.wrap, rhs.canonical); +} + +inline UnwrappedTileID UnwrappedTileID::unwrapTo(int16_t newWrap) { + return { newWrap, canonical }; +} + +inline bool UnwrappedTileID::isChildOf(const UnwrappedTileID& parent) const { + return wrap == parent.wrap && canonical.isChildOf(parent.canonical); +} + +inline std::array UnwrappedTileID::children() const { + const uint8_t childZ = canonical.z + 1; + const uint32_t childX = canonical.x * 2; + const uint32_t childY = canonical.y * 2; + return { { + { wrap, { childZ, childX, childY } }, + { wrap, { childZ, childX, childY + 1 } }, + { wrap, { childZ, childX + 1, childY } }, + { wrap, { childZ, childX + 1, childY + 1 } }, + } }; +} + +inline OverscaledTileID UnwrappedTileID::overscaleTo(const uint8_t overscaledZ) const { + assert(overscaledZ >= canonical.z); + return { overscaledZ, wrap, canonical }; +} + +inline float UnwrappedTileID::pixelsToTileUnits(const float pixelValue, const float zoom) const { + return pixelValue * (util::EXTENT / (util::tileSize * std::pow(2, zoom - canonical.z))); +} + +} // namespace mbgl + +namespace std { + +template <> +struct hash { + size_t operator()(const mbgl::CanonicalTileID& id) const; +}; + +template <> +struct hash { + size_t operator()(const mbgl::UnwrappedTileID& id) const; +}; + +template <> +struct hash { + size_t operator()(const mbgl::OverscaledTileID& id) const; +}; + +} // namespace std + diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/tile/tile_necessity.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/tile/tile_necessity.hpp new file mode 100644 index 0000000..e51bf51 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/tile/tile_necessity.hpp @@ -0,0 +1,15 @@ +#pragma once + +namespace mbgl { + +// Tiles can have two states: optional or required. +// - optional means that only low-cost actions should be taken to obtain the data +// (e.g. load from cache, but accept stale data) +// - required means that every effort should be taken to obtain the data (e.g. load +// from internet and keep the data fresh if it expires) +enum class TileNecessity : bool { + Optional = false, + Required = true, +}; + +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/util/async_request.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/util/async_request.hpp new file mode 100644 index 0000000..9e85094 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/util/async_request.hpp @@ -0,0 +1,12 @@ +#pragma once + +#include + +namespace mbgl { + +class AsyncRequest : private util::noncopyable { +public: + virtual ~AsyncRequest() = default; +}; + +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/util/async_task.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/util/async_task.hpp new file mode 100644 index 0000000..69746c3 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/util/async_task.hpp @@ -0,0 +1,24 @@ +#pragma once + +#include + +#include +#include + +namespace mbgl { +namespace util { + +class AsyncTask : private util::noncopyable { +public: + AsyncTask(std::function&&); + ~AsyncTask(); + + void send(); + +private: + class Impl; + std::unique_ptr impl; +}; + +} // namespace util +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/util/char_array_buffer.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/util/char_array_buffer.hpp new file mode 100644 index 0000000..177f005 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/util/char_array_buffer.hpp @@ -0,0 +1,55 @@ +#pragma once + +#include + +namespace mbgl { +namespace util { + +// ref https://artofcode.wordpress.com/2010/12/12/deriving-from-stdstreambuf/ + +class CharArrayBuffer : public std::streambuf +{ +public: + CharArrayBuffer(char const* data, std::size_t size) + : begin_(data), end_(data + size), current_(data) {} + +private: + int_type underflow() final { + if (current_ == end_) { + return traits_type::eof(); + } + return traits_type::to_int_type(*current_); + } + + int_type uflow() final { + if (current_ == end_) { + return traits_type::eof(); + } + return traits_type::to_int_type(*current_++); + } + + int_type pbackfail(int_type ch) final { + if (current_ == begin_ || (ch != traits_type::eof() && ch != current_[-1])) { + return traits_type::eof(); + } + return traits_type::to_int_type(*--current_); + } + + std::streamsize showmanyc() final { + return end_ - current_; + } + + pos_type seekoff(off_type off, std::ios_base::seekdir dir, std::ios_base::openmode) final { + if (dir == std::ios_base::beg) current_ = std::min(begin_ + off, end_); + else if (dir == std::ios_base::cur) current_ = std::min(current_ + off, end_); + else current_ = std::max(end_ - off, begin_); // dir == std::ios_base::end + return pos_type(off_type(current_ - begin_)); + } + + char const * const begin_; + char const * const end_; + char const * current_; +}; + +} // namespace util +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/util/chrono.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/util/chrono.hpp new file mode 100644 index 0000000..723cd13 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/util/chrono.hpp @@ -0,0 +1,45 @@ +#pragma once + +#include +#include + +namespace mbgl { + +using Clock = std::chrono::steady_clock; + +using Seconds = std::chrono::seconds; +using Milliseconds = std::chrono::milliseconds; + +using TimePoint = Clock::time_point; +using Duration = Clock::duration; + +// Used to measure second-precision times, such as times gathered from HTTP responses. +using Timestamp = std::chrono::time_point; + +namespace util { + +inline Timestamp now() { + return std::chrono::time_point_cast(std::chrono::system_clock::now()); +} + +// Returns the RFC1123 formatted date. E.g. "Tue, 04 Nov 2014 02:13:24 GMT" +std::string rfc1123(Timestamp); + +// YYYY-mm-dd HH:MM:SS e.g. "2015-11-26 16:11:23" +std::string iso8601(Timestamp); + +Timestamp parseTimestamp(const char *); + +Timestamp parseTimestamp(const int32_t timestamp); + +// C++17 polyfill +template ::min() < std::chrono::duration::zero()>> +constexpr std::chrono::duration abs(std::chrono::duration d) +{ + return d >= d.zero() ? d : -d; +} + +} // namespace util + +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/util/color.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/util/color.hpp new file mode 100644 index 0000000..01a4c8f --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/util/color.hpp @@ -0,0 +1,63 @@ +#pragma once + +#include + +#include +#include +#include + +namespace mbgl { + +// Stores a premultiplied color, with all four channels ranging from 0..1 +class Color { +public: + Color() = default; + Color(float r_, float g_, float b_, float a_) + : r(r_), g(g_), b(b_), a(a_) { + assert(r_ >= 0.0f); + assert(r_ <= 1.0f); + assert(g_ >= 0.0f); + assert(g_ <= 1.0f); + assert(b_ >= 0.0f); + assert(b_ <= 1.0f); + assert(a_ >= 0.0f); + assert(a_ <= 1.0f); + } + + float r = 0.0f; + float g = 0.0f; + float b = 0.0f; + float a = 0.0f; + + static Color black() { return { 0.0f, 0.0f, 0.0f, 1.0f }; }; + static Color white() { return { 1.0f, 1.0f, 1.0f, 1.0f }; }; + + static Color red() { return { 1.0f, 0.0f, 0.0f, 1.0f }; }; + static Color green() { return { 0.0f, 1.0f, 0.0f, 1.0f }; }; + static Color blue() { return { 0.0f, 0.0f, 1.0f, 1.0f }; }; + + static optional parse(const std::string&); + std::string stringify() const; + std::array toArray() const; +}; + +inline bool operator==(const Color& colorA, const Color& colorB) { + return colorA.r == colorB.r && colorA.g == colorB.g && colorA.b == colorB.b && colorA.a == colorB.a; +} + +inline bool operator!=(const Color& colorA, const Color& colorB) { + return !(colorA == colorB); +} + +inline Color operator*(const Color& color, float alpha) { + assert(alpha >= 0.0f); + assert(alpha <= 1.0f); + return { + color.r * alpha, + color.g * alpha, + color.b * alpha, + color.a * alpha + }; +} + +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/util/compression.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/util/compression.hpp new file mode 100644 index 0000000..93a3ddb --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/util/compression.hpp @@ -0,0 +1,12 @@ +#pragma once + +#include + +namespace mbgl { +namespace util { + +std::string compress(const std::string& raw); +std::string decompress(const std::string& raw); + +} // namespace util +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/util/constants.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/util/constants.hpp new file mode 100644 index 0000000..7110d9e --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/util/constants.hpp @@ -0,0 +1,72 @@ +#pragma once + +#include +#include + +#include +#include +#include + +namespace mbgl { + +namespace util { + +constexpr double tileSize = 512; + +/* + * The maximum extent of a feature that can be safely stored in the buffer. + * In practice, all features are converted to this extent before being added. + * + * Positions are stored as signed 16bit integers. + * One bit is lost for signedness to support features extending past the left edge of the tile. + * One bit is lost because the line vertex buffer used to pack 1 bit of other data into the int. + * This is no longer the case but we're reserving this bit anyway. + * One bit is lost to support features extending past the extent on the right edge of the tile. + * This leaves us with 2^13 = 8192 + */ +constexpr int32_t EXTENT = 8192; + +constexpr double DEG2RAD = M_PI / 180.0; +constexpr double RAD2DEG = 180.0 / M_PI; +constexpr double M2PI = M_PI * 2; +constexpr double EARTH_RADIUS_M = 6378137; +constexpr double LATITUDE_MAX = 85.051128779806604; +constexpr double LONGITUDE_MAX = 180; +constexpr double DEGREES_MAX = 360; +constexpr double PITCH_MAX = M_PI / 3; +constexpr double MIN_ZOOM = 0.0; +constexpr double MAX_ZOOM = 25.5; +constexpr float MIN_ZOOM_F = MIN_ZOOM; +constexpr float MAX_ZOOM_F = MAX_ZOOM; +constexpr uint8_t DEFAULT_MAX_ZOOM = 22; + +constexpr uint8_t DEFAULT_PREFETCH_ZOOM_DELTA = 4; + +constexpr uint64_t DEFAULT_MAX_CACHE_SIZE = 50 * 1024 * 1024; + +constexpr Duration DEFAULT_TRANSITION_DURATION = Milliseconds(300); +constexpr Seconds CLOCK_SKEW_RETRY_TIMEOUT { 30 }; + +constexpr UnitBezier DEFAULT_TRANSITION_EASE = { 0, 0, 0.25, 1 }; + +constexpr int DEFAULT_RATE_LIMIT_TIMEOUT = 5; + +constexpr const char* API_BASE_URL = "https://api.mapbox.com"; + +} // namespace util + +namespace debug { + +extern const bool tileParseWarnings; +extern const bool styleParseWarnings; +extern const bool spriteWarnings; +extern const bool renderWarnings; +extern const bool labelTextMissingWarning; +extern const bool missingFontStackWarning; +extern const bool missingFontFaceWarning; +extern const bool glyphWarning; +extern const bool shapingWarning; + +} // namespace debug + +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/util/convert.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/util/convert.hpp new file mode 100644 index 0000000..02ec7fe --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/util/convert.hpp @@ -0,0 +1,19 @@ +#include + +#include +#include +#include + +namespace mbgl { +namespace util { + +template::value>> +MBGL_CONSTEXPR std::array convert(const std::array&from) { + std::array to {{}}; + std::copy(std::begin(from), std::end(from), std::begin(to)); + return to; +} + +} // namespace util +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/util/enum.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/util/enum.hpp new file mode 100644 index 0000000..608befd --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/util/enum.hpp @@ -0,0 +1,37 @@ +#pragma once + +#include + +#include +#include +#include + +namespace mbgl { + +template +class Enum { +public: + using Type = T; + static const char * toString(T); + static optional toEnum(const std::string&); +}; + +#define MBGL_DEFINE_ENUM(T, values...) \ + \ +static const constexpr std::pair T##_names[] = values; \ + \ +template <> \ +const char * Enum::toString(T t) { \ + auto it = std::find_if(std::begin(T##_names), std::end(T##_names), \ + [&] (const auto& v) { return t == v.first; }); \ + assert(it != std::end(T##_names)); return it->second; \ +} \ + \ +template <> \ +optional Enum::toEnum(const std::string& s) { \ + auto it = std::find_if(std::begin(T##_names), std::end(T##_names), \ + [&] (const auto& v) { return s == v.second; }); \ + return it == std::end(T##_names) ? optional() : it->first; \ +} + +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/util/event.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/util/event.hpp new file mode 100644 index 0000000..15583e9 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/util/event.hpp @@ -0,0 +1,59 @@ +#pragma once + +#include + +namespace mbgl { + +enum class EventSeverity : uint8_t { + Debug, + Info, + Warning, + Error, +}; + +enum class Event : uint8_t { + General, + Setup, + Shader, + ParseStyle, + ParseTile, + Render, + Style, + Database, + HttpRequest, + Sprite, + Image, + OpenGL, + JNI, + Android, + Crash, + Glyph, + Timing +}; + +struct EventPermutation { + const EventSeverity severity; + const Event event; + + constexpr bool operator==(const EventPermutation &rhs) const { + return severity == rhs.severity && event == rhs.event; + } +}; + +constexpr EventSeverity disabledEventSeverities[] = { +#ifndef NDEBUG + EventSeverity(-1) // Avoid zero size array +#else + EventSeverity::Debug +#endif +}; + +constexpr Event disabledEvents[] = { + Event(-1) // Avoid zero size array +}; + +constexpr EventPermutation disabledEventPermutations[] = { + { EventSeverity::Debug, Event::Shader } +}; + +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/util/exception.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/util/exception.hpp new file mode 100644 index 0000000..a9804e9 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/util/exception.hpp @@ -0,0 +1,39 @@ +#pragma once + +#include + +namespace mbgl { +namespace util { + +struct Exception : std::runtime_error { + Exception(const char *msg) : std::runtime_error(msg) {} + Exception(const std::string &msg) : std::runtime_error(msg) {} +}; + +struct SpriteImageException : Exception { + SpriteImageException(const char *msg) : Exception(msg) {} + SpriteImageException(const std::string &msg) : Exception(msg) {} +}; + +struct MisuseException : Exception { + MisuseException(const char *msg) : Exception(msg) {} + MisuseException(const std::string &msg) : Exception(msg) {} +}; + +struct StyleParseException : Exception { + StyleParseException(const char *msg) : Exception(msg) {} + StyleParseException(const std::string &msg) : Exception(msg) {} +}; + +struct StyleLoadException : Exception { + StyleLoadException(const char *msg) : Exception(msg) {} + StyleLoadException(const std::string &msg) : Exception(msg) {} +}; + +struct NotFoundException : Exception { + NotFoundException(const char *msg) : Exception(msg) {} + NotFoundException(const std::string &msg) : Exception(msg) {} +}; + +} // namespace util +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/util/feature.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/util/feature.hpp new file mode 100644 index 0000000..4eeceda --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/util/feature.hpp @@ -0,0 +1,32 @@ +#pragma once + +#include + +#include + +namespace mbgl { + +using Value = mapbox::geometry::value; +using NullValue = mapbox::geometry::null_value_t; +using PropertyMap = mapbox::geometry::property_map; +using FeatureIdentifier = mapbox::geometry::identifier; +using Feature = mapbox::geometry::feature; + +template +optional numericValue(const Value& value) { + return value.match( + [] (uint64_t t) { + return optional(t); + }, + [] (int64_t t) { + return optional(t); + }, + [] (double t) { + return optional(t); + }, + [] (auto) { + return optional(); + }); +} + +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/util/font_stack.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/util/font_stack.hpp new file mode 100644 index 0000000..d0b431e --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/util/font_stack.hpp @@ -0,0 +1,17 @@ +#pragma once + +#include +#include + +namespace mbgl { + +// An array of font names +using FontStack = std::vector; + +std::string fontStackToString(const FontStack&); + +struct FontStackHash { + std::size_t operator()(const FontStack&) const; +}; + +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/util/geo.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/util/geo.hpp new file mode 100644 index 0000000..dacdb96 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/util/geo.hpp @@ -0,0 +1,249 @@ +#pragma once + +#include +#include +#include + +#include +#include +#include +#include + +#include +#include + +namespace mbgl { + +class CanonicalTileID; +class UnwrappedTileID; + +using ScreenCoordinate = mapbox::geometry::point; +using ScreenLineString = mapbox::geometry::line_string; +using ScreenBox = mapbox::geometry::box; + +class LatLng { +private: + double lat; + double lon; + +public: + enum WrapMode : bool { Unwrapped, Wrapped }; + + LatLng(double lat_ = 0, double lon_ = 0, WrapMode mode = Unwrapped) + : lat(lat_), lon(lon_) { + if (std::isnan(lat)) { + throw std::domain_error("latitude must not be NaN"); + } + if (std::isnan(lon)) { + throw std::domain_error("longitude must not be NaN"); + } + if (std::abs(lat) > 90.0) { + throw std::domain_error("latitude must be between -90 and 90"); + } + if (!std::isfinite(lon)) { + throw std::domain_error("longitude must not be infinite"); + } + if (mode == Wrapped) { + wrap(); + } + } + + double latitude() const { return lat; } + double longitude() const { return lon; } + + LatLng wrapped() const { return { lat, lon, Wrapped }; } + + void wrap() { + lon = util::wrap(lon, -util::LONGITUDE_MAX, util::LONGITUDE_MAX); + } + + // If the distance from start to end longitudes is between half and full + // world, unwrap the start longitude to ensure the shortest path is taken. + void unwrapForShortestPath(const LatLng& end) { + const double delta = std::abs(end.lon - lon); + if (delta < util::LONGITUDE_MAX || delta > util::DEGREES_MAX) return; + if (lon > 0 && end.lon < 0) lon -= util::DEGREES_MAX; + else if (lon < 0 && end.lon > 0) lon += util::DEGREES_MAX; + } + + // Constructs a LatLng object with the top left position of the specified tile. + LatLng(const CanonicalTileID& id); + LatLng(const UnwrappedTileID& id); + + friend bool operator==(const LatLng& a, const LatLng& b) { + return a.lat == b.lat && a.lon == b.lon; + } + + friend bool operator!=(const LatLng& a, const LatLng& b) { + return !(a == b); + } +}; + +class LatLngBounds { +public: + // Return a bounds covering the entire (unwrapped) world. + static LatLngBounds world() { + return LatLngBounds({-90, -180}, {90, 180}); + } + + // Return the bounds consisting of the single point. + static LatLngBounds singleton(const LatLng& a) { + return LatLngBounds(a, a); + } + + // Return the convex hull of two points; the smallest bounds that contains both. + static LatLngBounds hull(const LatLng& a, const LatLng& b) { + LatLngBounds bounds(a, a); + bounds.extend(b); + return bounds; + } + + // Return a bounds that may serve as the identity element for the extend operation. + static LatLngBounds empty() { + LatLngBounds bounds = world(); + std::swap(bounds.sw, bounds.ne); + return bounds; + } + + // Constructs a LatLngBounds object with the tile's exact boundaries. + LatLngBounds(const CanonicalTileID&); + + bool valid() const { + return (sw.latitude() <= ne.latitude()) && (sw.longitude() <= ne.longitude()); + } + + double south() const { return sw.latitude(); } + double west() const { return sw.longitude(); } + double north() const { return ne.latitude(); } + double east() const { return ne.longitude(); } + + LatLng southwest() const { return sw; } + LatLng northeast() const { return ne; } + LatLng southeast() const { return LatLng(south(), east()); } + LatLng northwest() const { return LatLng(north(), west()); } + + LatLng center() const { + return LatLng((sw.latitude() + ne.latitude()) / 2, + (sw.longitude() + ne.longitude()) / 2); + } + + LatLng constrain(const LatLng& p) const { + if (contains(p)) { + return p; + } + return LatLng { + util::clamp(p.latitude(), sw.latitude(), ne.latitude()), + util::clamp(p.longitude(), sw.longitude(), ne.longitude()) + }; + } + + void extend(const LatLng& point) { + sw = LatLng(std::min(point.latitude(), sw.latitude()), + std::min(point.longitude(), sw.longitude())); + ne = LatLng(std::max(point.latitude(), ne.latitude()), + std::max(point.longitude(), ne.longitude())); + } + + void extend(const LatLngBounds& bounds) { + extend(bounds.sw); + extend(bounds.ne); + } + + bool isEmpty() const { + return sw.latitude() > ne.latitude() || + sw.longitude() > ne.longitude(); + } + + bool crossesAntimeridian() const { + return (sw.wrapped().longitude() > ne.wrapped().longitude()); + } + + bool contains(const CanonicalTileID& tileID) const; + bool contains(const LatLng& point, LatLng::WrapMode wrap = LatLng::Unwrapped) const; + bool contains(const LatLngBounds& area, LatLng::WrapMode wrap = LatLng::Unwrapped) const; + + bool intersects(const LatLngBounds area, LatLng::WrapMode wrap = LatLng::Unwrapped) const; + +private: + LatLng sw; + LatLng ne; + + LatLngBounds(LatLng sw_, LatLng ne_) + : sw(std::move(sw_)), ne(std::move(ne_)) {} + + friend bool operator==(const LatLngBounds& a, const LatLngBounds& b) { + return a.sw == b.sw && a.ne == b.ne; + } + + friend bool operator!=(const LatLngBounds& a, const LatLngBounds& b) { + return !(a == b); + } +}; + +// Determines the orientation of the map. +enum class NorthOrientation : uint8_t { + Upwards, // Default + Rightwards, + Downwards, + Leftwards, +}; + +/// The distance on each side between a rectangle and a rectangle within. +class EdgeInsets { +private: + double _top; // Number of pixels inset from the top edge. + double _left; // Number of pixels inset from the left edge. + double _bottom; // Number of pixels inset from the bottom edge. + double _right; // Number of pixels inset from the right edge. + +public: + EdgeInsets(double t_ = 0, double l_ = 0, double b_ = 0, double r_ = 0) + : _top(t_), _left(l_), _bottom(b_), _right(r_) { + if (std::isnan(_top)) { + throw std::domain_error("top must not be NaN"); + } + if (std::isnan(_left)) { + throw std::domain_error("left must not be NaN"); + } + if (std::isnan(_bottom)) { + throw std::domain_error("bottom must not be NaN"); + } + if (std::isnan(_right)) { + throw std::domain_error("right must not be NaN"); + } + } + + double top() const { return _top; } + double left() const { return _left; } + double bottom() const { return _bottom; } + double right() const { return _right; } + + bool isFlush() const { + return _top == 0 && _left == 0 && _bottom == 0 && _right == 0; + } + + void operator+=(const EdgeInsets& o) { + _top += o._top; + _left += o._left; + _bottom += o._bottom; + _right += o._right; + } + + EdgeInsets operator+(const EdgeInsets& o) const { + return { + _top + o._top, _left + o._left, _bottom + o._bottom, _right + o._right, + }; + } + + ScreenCoordinate getCenter(uint16_t width, uint16_t height) const; + + friend bool operator==(const EdgeInsets& a, const EdgeInsets& b) { + return a._top == b._top && a._left == b._left && a._bottom == b._bottom && a._right == b._right; + } + + friend bool operator!=(const EdgeInsets& a, const EdgeInsets& b) { + return !(a == b); + } +}; + +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/util/geojson.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/util/geojson.hpp new file mode 100644 index 0000000..b4e789a --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/util/geojson.hpp @@ -0,0 +1,10 @@ +#pragma once + +#include + +namespace mbgl { + +using GeoJSON = mapbox::geojson::geojson; +using FeatureCollection = mapbox::geojson::feature_collection; + +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/util/geometry.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/util/geometry.hpp new file mode 100644 index 0000000..a28c59a --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/util/geometry.hpp @@ -0,0 +1,67 @@ +#pragma once + +#include +#include +#include + +namespace mbgl { + +enum class FeatureType : uint8_t { + Unknown = 0, + Point = 1, + LineString = 2, + Polygon = 3 +}; + +template +using Point = mapbox::geometry::point; + +template +using LineString = mapbox::geometry::line_string; + +template +using Polygon = mapbox::geometry::polygon; + +template +using MultiPoint = mapbox::geometry::multi_point; + +template +using MultiLineString = mapbox::geometry::multi_line_string; + +template +using MultiPolygon = mapbox::geometry::multi_polygon; + +template +using LinearRing = mapbox::geometry::linear_ring; + +template +using Geometry = mapbox::geometry::geometry; + +template +Point convertPoint(const Point& p) { + return Point(p.x, p.y); +} + +struct ToFeatureType { + template + FeatureType operator()(const Point &) const { return FeatureType::Point; } + template + FeatureType operator()(const MultiPoint &) const { return FeatureType::Point; } + template + FeatureType operator()(const LineString &) const { return FeatureType::LineString; } + template + FeatureType operator()(const MultiLineString &) const { return FeatureType::LineString; } + template + FeatureType operator()(const Polygon &) const { return FeatureType::Polygon; } + template + FeatureType operator()(const MultiPolygon &) const { return FeatureType::Polygon; } + template + FeatureType operator()(const mapbox::geometry::geometry_collection &) const { return FeatureType::Unknown; } +}; + +template +auto forEachPoint(const Geometry& g, F f) { + mapbox::geometry::for_each_point(g, f); +} + +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/util/ignore.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/util/ignore.hpp new file mode 100644 index 0000000..577bcf4 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/util/ignore.hpp @@ -0,0 +1,26 @@ +#pragma once + +#include + +namespace mbgl { +namespace util { + +// Accept any number of parameters of any types, and do nothing with them. +// Useful for providing a context for parameter pack expansion where a legal +// expansion context is not otherwise available. +// +// See https://github.com/mapbox/cpp/blob/master/C%2B%2B%20Structural%20Metaprogramming.md +// for more details. +// +template void ignore(Ts&&...) {} + +// std::initializer_list overload, for situations where you need sequenced +// modifications. +// +template void ignore(const std::initializer_list&) {} + +// Handle the zero-argument case. +inline void ignore(const std::initializer_list&) {} + +} // namespace util +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/util/image.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/util/image.hpp new file mode 100644 index 0000000..4887058 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/util/image.hpp @@ -0,0 +1,177 @@ +#pragma once + +#include +#include +#include + +#include +#include +#include +#include + +namespace mbgl { + +enum class ImageAlphaMode { + Unassociated, + Premultiplied, + Exclusive, // Alpha-channel only +}; + +template +class Image : private util::noncopyable { +public: + Image() = default; + + Image(Size size_) + : size(std::move(size_)), + data(std::make_unique(bytes())) {} + + Image(Size size_, const uint8_t* srcData, std::size_t srcLength) + : size(std::move(size_)) { + if (srcLength != bytes()) { + throw std::invalid_argument("mismatched image size"); + } + data = std::make_unique(bytes()); + std::copy(srcData, srcData + srcLength, data.get()); + } + + Image(Size size_, std::unique_ptr data_) + : size(std::move(size_)), + data(std::move(data_)) {} + + Image(Image&& o) + : size(o.size), + data(std::move(o.data)) { + o.size.width = o.size.height = 0; + } + + Image& operator=(Image&& o) { + size = o.size; + data = std::move(o.data); + o.size.width = o.size.height = 0; + return *this; + } + + friend bool operator==(const Image& lhs, const Image& rhs) { + return std::equal(lhs.data.get(), lhs.data.get() + lhs.bytes(), + rhs.data.get(), rhs.data.get() + rhs.bytes()); + } + + friend bool operator!=(const Image& lhs, const Image& rhs) { + return !(lhs == rhs); + } + + bool valid() const { + return !size.isEmpty() && data.get() != nullptr; + } + + template + T clone() const { + T copy_(size); + std::copy(data.get(), data.get() + bytes(), copy_.data.get()); + return copy_; + } + + size_t stride() const { return channels * size.width; } + size_t bytes() const { return stride() * size.height; } + + void fill(uint8_t value) { + std::fill(data.get(), data.get() + bytes(), value); + } + + void resize(Size size_) { + if (size == size_) { + return; + } + Image newImage(size_); + newImage.fill(0); + copy(*this, newImage, {0, 0}, {0, 0}, { + std::min(size.width, size_.width), + std::min(size.height, size_.height) + }); + operator=(std::move(newImage)); + } + + // Clears the rect area specified by `pt` and `size` from `dstImage`. + static void clear(Image& dstImg, const Point& pt, const Size& size) { + if (size.isEmpty()) { + return; + } + + if (!dstImg.valid()) { + throw std::invalid_argument("invalid destination for image clear"); + } + + if (size.width > dstImg.size.width || + size.height > dstImg.size.height || + pt.x > dstImg.size.width - size.width || + pt.y > dstImg.size.height - size.height) { + throw std::out_of_range("out of range destination coordinates for image clear"); + } + + uint8_t* dstData = dstImg.data.get(); + + for (uint32_t y = 0; y < size.height; y++) { + const std::size_t dstOffset = (pt.y + y) * dstImg.stride() + pt.x * channels; + std::memset(dstData + dstOffset, 0, size.width * channels); + } + } + + // Copy image data within `rect` from `src` to the rectangle of the same size at `pt` + // in `dst`. If the specified bounds exceed the bounds of the source or destination, + // throw `std::out_of_range`. Must not be used to move data within a single Image. + static void copy(const Image& srcImg, Image& dstImg, const Point& srcPt, const Point& dstPt, const Size& size) { + if (size.isEmpty()) { + return; + } + + if (!srcImg.valid()) { + throw std::invalid_argument("invalid source for image copy"); + } + + if (!dstImg.valid()) { + throw std::invalid_argument("invalid destination for image copy"); + } + + if (size.width > srcImg.size.width || + size.height > srcImg.size.height || + srcPt.x > srcImg.size.width - size.width || + srcPt.y > srcImg.size.height - size.height) { + throw std::out_of_range("out of range source coordinates for image copy"); + } + + if (size.width > dstImg.size.width || + size.height > dstImg.size.height || + dstPt.x > dstImg.size.width - size.width || + dstPt.y > dstImg.size.height - size.height) { + throw std::out_of_range("out of range destination coordinates for image copy"); + } + + const uint8_t* srcData = srcImg.data.get(); + uint8_t* dstData = dstImg.data.get(); + + assert(srcData != dstData); + + for (uint32_t y = 0; y < size.height; y++) { + const std::size_t srcOffset = (srcPt.y + y) * srcImg.stride() + srcPt.x * channels; + const std::size_t dstOffset = (dstPt.y + y) * dstImg.stride() + dstPt.x * channels; + std::copy(srcData + srcOffset, + srcData + srcOffset + size.width * channels, + dstData + dstOffset); + } + } + + Size size; + static constexpr size_t channels = Mode == ImageAlphaMode::Exclusive ? 1 : 4; + std::unique_ptr data; +}; + +using UnassociatedImage = Image; +using PremultipliedImage = Image; +using AlphaImage = Image; + +// TODO: don't use std::string for binary data. +PremultipliedImage decodeImage(const std::string&); +std::string encodePNG(const PremultipliedImage&); + +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/util/immutable.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/util/immutable.hpp new file mode 100644 index 0000000..eb26c0d --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/util/immutable.hpp @@ -0,0 +1,133 @@ +#pragma once + +#include + +namespace mbgl { + +/** + * `Mutable` is a non-nullable uniquely owning reference to a `T`. It can be efficiently converted + * to `Immutable`. + * + * The lifecycle of `Mutable` and `Immutable` is as follows: + * + * 1. Create a `Mutable` using `makeMutable(...)` + * 2. Mutate it freely + * 3. When you're ready to freeze its state and enable safe cross-thread sharing, move assign or + * move construct it to `Immutable` + * + * The reason that `Mutable` exists, rather than simply using a `std::unique_ptr`, is to take advantage + * of the underlying single-allocation optimization provided by `std::make_shared`. + */ +template +class Mutable { +public: + Mutable(Mutable&&) = default; + Mutable& operator=(Mutable&&) = default; + + Mutable(const Mutable&) = delete; + Mutable& operator=(const Mutable&) = delete; + + T* get() { return ptr.get(); } + T* operator->() { return ptr.get(); } + T& operator*() { return *ptr; } + +private: + Mutable(std::shared_ptr&& s) + : ptr(std::move(s)) {} + + std::shared_ptr ptr; + + template friend class Immutable; + template friend Mutable makeMutable(Args&&...); +}; + +template +Mutable makeMutable(Args&&... args) { + return Mutable(std::make_shared(std::forward(args)...)); +} + +/** + * `Immutable` is a non-nullable shared reference to a `const T`. Construction requires + * a transfer of unique ownership from a `Mutable`; once constructed it has the same behavior + * as `std::shared_ptr` but with better indication of intent. + * + * Normally one should not share state between threads because it's difficult to verify the + * absence of read/write data races. `Immutable` provides a guarantee that no writes are + * possible, and instances therefore can be freely transferred and shared between threads. + */ +template +class Immutable { +public: + template + Immutable(Mutable&& s) + : ptr(std::const_pointer_cast(std::move(s.ptr))) {} + + template + Immutable(Immutable&& s) + : ptr(std::move(s.ptr)) {} + + template + Immutable(const Immutable& s) + : ptr(s.ptr) {} + + template + Immutable& operator=(Mutable&& s) { + ptr = std::const_pointer_cast(std::move(s.ptr)); + return *this; + } + + template + Immutable& operator=(Immutable&& s) { + ptr = std::move(s.ptr); + return *this; + } + + template + Immutable& operator=(const Immutable& s) { + ptr = s.ptr; + return *this; + } + + const T* get() const { return ptr.get(); } + const T* operator->() const { return ptr.get(); } + const T& operator*() const { return *ptr; } + + friend bool operator==(const Immutable& lhs, const Immutable& rhs) { + return lhs.ptr == rhs.ptr; + } + + friend bool operator!=(const Immutable& lhs, const Immutable& rhs) { + return lhs.ptr != rhs.ptr; + } + +private: + Immutable(std::shared_ptr&& s) + : ptr(std::move(s)) {} + + std::shared_ptr ptr; + + template friend class Immutable; + template friend Immutable staticImmutableCast(const Immutable&); +}; + +template +Immutable staticImmutableCast(const Immutable& u) { + return Immutable(std::static_pointer_cast(u.ptr)); +} + +/** + * Constrained mutation of an immutable reference. Makes a temporarily-mutable copy of the + * input Immutable using the inner type's copy constructor, runs the given callable on the + * mutable copy, and then freezes the copy and reassigns it to the input reference. + * + * Note that other Immutables referring to the same inner instance are not affected; they + * continue to referencing the original immutable instance. + */ +template +void mutate(Immutable& immutable, Fn&& fn) { + Mutable mut = makeMutable(*immutable); + std::forward(fn)(*mut); + immutable = std::move(mut); +} + +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/util/indexed_tuple.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/util/indexed_tuple.hpp new file mode 100644 index 0000000..ea4fe74 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/util/indexed_tuple.hpp @@ -0,0 +1,53 @@ +#pragma once + +#include +#include + +#include + +namespace mbgl { + +template +struct TypeIndex; + +template +struct TypeIndex : std::integral_constant {}; + +template +struct TypeIndex : std::integral_constant::value> {}; + +template class IndexedTuple; + +// A tuple of Ts, where individual members can be accessed via `t.get()` for I ∈ Is. +// +// See https://github.com/mapbox/cpp/blob/master/C%2B%2B%20Structural%20Metaprogramming.md +// for motivation. +// +template +class IndexedTuple, TypeList> : public tuple_polyfill { +public: + static_assert(sizeof...(Is) == sizeof...(Ts), "IndexedTuple size mismatch"); + + using tuple_polyfill::tuple; + + template + auto& get() { + return get_polyfill::value>(*this); + } + + template + const auto& get() const { + return get_polyfill::value>(*this); + } + + template + IndexedTuple, TypeList> + concat(const IndexedTuple, TypeList>& other) const { + return IndexedTuple, TypeList> { + get()..., + other.template get()... + }; + } +}; + +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/util/interpolate.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/util/interpolate.hpp new file mode 100644 index 0000000..aff730a --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/util/interpolate.hpp @@ -0,0 +1,138 @@ +#pragma once + +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +namespace mbgl { +namespace util { + +float interpolationFactor(float base, Range range, float z); + +template +struct Interpolator; + +template +T interpolate(const T& a, const T& b, const double t) { + return Interpolator()(a, b, t); +} + + +template +struct Interpolator { + T operator()(const T& a, const T& b, const double t) const { + return a * (1.0 - t) + b * t; + } +}; + +template +struct Interpolator> { +private: + using Array = std::array; + + template + Array operator()(const Array& a, const Array& b, const double t, std::index_sequence) { + return {{ interpolate(a[I], b[I], t)... }}; + } + +public: + Array operator()(const Array& a, const Array& b, const double t) { + return operator()(a, b, t, std::make_index_sequence()); + } +}; + + +// In order to accept Array as an output value for Curve +// expressions, we need to have an interpolatable std::vector type. +// However, style properties like line-dasharray are represented using +// std::vector, and should NOT be considered interpolatable. +// So, we use std::vector to represent expression array values, +// asserting that (a) the vectors are the same size, and (b) they contain +// only numeric values. (These invariants should be relatively safe, +// being enforced by the expression type system.) +template<> +struct Interpolator> { + std::vector operator()(const std::vector& a, + const std::vector& b, + const double t) const { + assert(a.size() == b.size()); + if (a.size() == 0) return {}; + std::vector result; + for (std::size_t i = 0; i < a.size(); i++) { + assert(a[i].template is()); + assert(b[i].template is()); + style::expression::Value item = interpolate( + a[i].template get(), + b[i].template get(), + t); + result.push_back(item); + } + return result; + } +}; + +template <> +struct Interpolator { +public: + style::Position operator()(const style::Position& a, const style::Position& b, const double t) { + auto pos = style::Position(); + auto interpolated = interpolate(a.getCartesian(), b.getCartesian(), t); + pos.setCartesian(interpolated); + return { pos }; + } +}; + +template <> +struct Interpolator { +public: + Color operator()(const Color& a, const Color& b, const double t) { + return { + interpolate(a.r, b.r, t), + interpolate(a.g, b.g, t), + interpolate(a.b, b.b, t), + interpolate(a.a, b.a, t) + }; + } +}; + +struct Uninterpolated { + template + T operator()(const T& a, const T&, const double) const { + return a; + } +}; + +template <> +struct Interpolator + : Uninterpolated {}; + +template +struct Interpolator::value>> + : Uninterpolated {}; + +template <> +struct Interpolator + : Uninterpolated {}; + +template +struct Interpolator> + : Uninterpolated {}; + +template +struct Interpolatable + : std::conditional_t< + !std::is_base_of>::value, + std::true_type, + std::false_type> {}; + + + +} // namespace util +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/util/logging.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/util/logging.hpp new file mode 100644 index 0000000..03db2d7 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/util/logging.hpp @@ -0,0 +1,80 @@ +#pragma once + +#include + +#include + +#include +#include + +namespace mbgl { + +class Log { +public: + class Observer : private util::noncopyable { + public: + virtual ~Observer() = default; + + // When an observer is set, this function will be called for every log + // message. Returning true will consume the message. + virtual bool onRecord(EventSeverity severity, Event event, int64_t code, const std::string &msg) = 0; + }; + + class NullObserver : public Observer { + bool onRecord(EventSeverity, Event, int64_t, const std::string&) override { + return true; + } + }; + + static void setObserver(std::unique_ptr Observer); + static std::unique_ptr removeObserver(); + +private: + template + constexpr static bool includes(const T e, const T (&l)[N], const size_t i = 0) { + return i < N && (l[i] == e || includes(e, l, i + 1)); + } + +public: + template + static void Debug(Event event, Args&& ...args) { + Record(EventSeverity::Debug, event, ::std::forward(args)...); + } + + template + static void Info(Event event, Args&& ...args) { + Record(EventSeverity::Info, event, ::std::forward(args)...); + } + + template + static void Warning(Event event, Args&& ...args) { + Record(EventSeverity::Warning, event, ::std::forward(args)...); + } + + template + static void Error(Event event, Args&& ...args) { + Record(EventSeverity::Error, event, ::std::forward(args)...); + } + + template + static void Record(EventSeverity severity, Event event, Args&& ...args) { + if (!includes(severity, disabledEventSeverities) && + !includes(event, disabledEvents) && + !includes({ severity, event }, disabledEventPermutations)) { + record(severity, event, ::std::forward(args)...); + } + } + +private: + static void record(EventSeverity severity, Event event, const std::string &msg); + static void record(EventSeverity severity, Event event, const char* format = "", ...); + static void record(EventSeverity severity, Event event, int64_t code, const char* format = "", ...); + static void record(EventSeverity severity, Event event, int64_t code, const std::string &msg); + + // This method is the data sink that must be implemented by each platform we + // support. It should ideally output the error message in a human readable + // format to the developer. + static void platformRecord(EventSeverity severity, const std::string &msg); +}; + +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/util/noncopyable.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/util/noncopyable.hpp new file mode 100644 index 0000000..8cb7e19 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/util/noncopyable.hpp @@ -0,0 +1,23 @@ +#pragma once + +namespace mbgl { namespace util { + +namespace non_copyable_ +{ + +class noncopyable +{ +public: + noncopyable( noncopyable const& ) = delete; + noncopyable& operator=(noncopyable const& ) = delete; + +protected: + constexpr noncopyable() = default; + ~noncopyable() = default; +}; +} // namespace non_copyable_ + +using noncopyable = non_copyable_::noncopyable; + +} // namespace util +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/util/optional.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/util/optional.hpp new file mode 100644 index 0000000..abec02d --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/util/optional.hpp @@ -0,0 +1,13 @@ +#pragma once + +#include + +namespace mbgl { + +template +using optional = std::experimental::optional; + +using nullopt_t = std::experimental::nullopt_t; +constexpr nullopt_t nullopt = std::experimental::nullopt; + +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/util/platform.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/util/platform.hpp new file mode 100644 index 0000000..cc8327c --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/util/platform.hpp @@ -0,0 +1,32 @@ +#pragma once + +#include +#include + +namespace mbgl { +namespace platform { + +class Request; + +// Uppercase a string, potentially using platform-specific routines. +std::string uppercase(const std::string &string); + +// Lowercase a string, potentially using platform-specific routines. +std::string lowercase(const std::string &string); + +// Gets the name of the current thread. +std::string getCurrentThreadName(); + +// Set the name of the current thread, truncated at 15. +void setCurrentThreadName(const std::string& name); + +// Makes the current thread low priority. +void makeThreadLowPriority(); + +// Shows an alpha image with the specified dimensions in a named window. +void showDebugImage(std::string name, const char *data, size_t width, size_t height); + +// Shows an alpha image with the specified dimensions in a named window. +void showColorDebugImage(std::string name, const char *data, size_t logical_width, size_t logical_height, size_t width, size_t height); +} // namespace platform +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/util/premultiply.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/util/premultiply.hpp new file mode 100644 index 0000000..532c7cb --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/util/premultiply.hpp @@ -0,0 +1,12 @@ +#pragma once + +#include + +namespace mbgl { +namespace util { + +PremultipliedImage premultiply(UnassociatedImage&&); +UnassociatedImage unpremultiply(PremultipliedImage&&); + +} // namespace util +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/util/projection.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/util/projection.hpp new file mode 100644 index 0000000..9619a38 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/util/projection.hpp @@ -0,0 +1,105 @@ +#pragma once + +#include +#include +#include +#include + +namespace mbgl { + +class ProjectedMeters { +private: + double _northing; // Distance measured northwards. + double _easting; // Distance measured eastwards. + +public: + ProjectedMeters(double n_ = 0, double e_ = 0) + : _northing(n_), _easting(e_) { + if (std::isnan(_northing)) { + throw std::domain_error("northing must not be NaN"); + } + if (std::isnan(_easting)) { + throw std::domain_error("easting must not be NaN"); + } + } + + double northing() const { return _northing; } + double easting() const { return _easting; } + + friend bool operator==(const ProjectedMeters& a, const ProjectedMeters& b) { + return a._northing == b._northing && a._easting == b._easting; + } + + friend bool operator!=(const ProjectedMeters& a, const ProjectedMeters& b) { + return !(a == b); + } +}; + +// Spherical Mercator projection +// http://docs.openlayers.org/library/spherical_mercator.html +class Projection { +public: + // Map pixel width at given scale. + static double worldSize(double scale) { + return scale * util::tileSize; + } + + static double getMetersPerPixelAtLatitude(double lat, double zoom) { + const double constrainedZoom = util::clamp(zoom, util::MIN_ZOOM, util::MAX_ZOOM); + const double constrainedScale = std::pow(2.0, constrainedZoom); + const double constrainedLatitude = util::clamp(lat, -util::LATITUDE_MAX, util::LATITUDE_MAX); + return std::cos(constrainedLatitude * util::DEG2RAD) * util::M2PI * util::EARTH_RADIUS_M / worldSize(constrainedScale); + } + + static ProjectedMeters projectedMetersForLatLng(const LatLng& latLng) { + const double constrainedLatitude = util::clamp(latLng.latitude(), -util::LATITUDE_MAX, util::LATITUDE_MAX); + const double constrainedLongitude = util::clamp(latLng.longitude(), -util::LONGITUDE_MAX, util::LONGITUDE_MAX); + + const double m = 1 - 1e-15; + const double f = util::clamp(std::sin(util::DEG2RAD * constrainedLatitude), -m, m); + + const double easting = util::EARTH_RADIUS_M * constrainedLongitude * util::DEG2RAD; + const double northing = 0.5 * util::EARTH_RADIUS_M * std::log((1 + f) / (1 - f)); + + return ProjectedMeters(northing, easting); + } + + static LatLng latLngForProjectedMeters(const ProjectedMeters& projectedMeters) { + double latitude = (2 * std::atan(std::exp(projectedMeters.northing() / util::EARTH_RADIUS_M)) - (M_PI / 2.0)) * util::RAD2DEG; + double longitude = projectedMeters.easting() * util::RAD2DEG / util::EARTH_RADIUS_M; + + latitude = util::clamp(latitude, -util::LATITUDE_MAX, util::LATITUDE_MAX); + longitude = util::clamp(longitude, -util::LONGITUDE_MAX, util::LONGITUDE_MAX); + + return LatLng(latitude, longitude); + } + + static Point project(const LatLng& latLng, double scale) { + return project_(latLng, worldSize(scale)); + } + + //Returns point on tile + static Point project(const LatLng& latLng, int32_t zoom) { + return project_(latLng, 1 << zoom); + } + + static LatLng unproject(const Point& p, double scale, LatLng::WrapMode wrapMode = LatLng::Unwrapped) { + auto p2 = p * util::DEGREES_MAX / worldSize(scale); + return LatLng { + util::DEGREES_MAX / M_PI * std::atan(std::exp((util::LONGITUDE_MAX - p2.y) * util::DEG2RAD)) - 90.0, + p2.x - util::LONGITUDE_MAX, + wrapMode + }; + } + +private: + static Point project_(const LatLng& latLng, double worldSize) { + const double latitude = util::clamp(latLng.latitude(), -util::LATITUDE_MAX, util::LATITUDE_MAX); + return Point { + util::LONGITUDE_MAX + latLng.longitude(), + util::LONGITUDE_MAX - util::RAD2DEG * std::log(std::tan(M_PI / 4 + latitude * M_PI / util::DEGREES_MAX)) + } * worldSize / util::DEGREES_MAX; + } +}; + +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/util/range.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/util/range.hpp new file mode 100644 index 0000000..5591a22 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/util/range.hpp @@ -0,0 +1,27 @@ +#include + +#pragma once + +namespace mbgl { + +template +class Range { +public: + constexpr Range(T min_, T max_) + : min(std::move(min_)), max(std::move(max_)) {} + + T min; + T max; +}; + +template +bool operator==(const Range& a, const Range& b) { + return a.min == b.min && a.max == b.max; +} + +template +bool operator!=(const Range& a, const Range& b) { + return !(a == b); +} + +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/util/run_loop.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/util/run_loop.hpp new file mode 100644 index 0000000..381e3ae --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/util/run_loop.hpp @@ -0,0 +1,133 @@ +#pragma once + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +namespace mbgl { +namespace util { + +using LOOP_HANDLE = void *; + +class RunLoop : public Scheduler, + private util::noncopyable { +public: + enum class Type : uint8_t { + Default, + New, + }; + + enum class Priority : bool { + Default = false, + High = true, + }; + + enum class Event : uint8_t { + None = 0, + Read = 1, + Write = 2, + ReadWrite = Read | Write, + }; + + RunLoop(Type type = Type::Default); + ~RunLoop() override; + + static RunLoop* Get(); + static LOOP_HANDLE getLoopHandle(); + + void run(); + void runOnce(); + void stop(); + + // So far only needed by the libcurl backend. + void addWatch(int fd, Event, std::function&& callback); + void removeWatch(int fd); + + // Invoke fn(args...) on this RunLoop. + template + void invoke(Priority priority, Fn&& fn, Args&&... args) { + push(priority, WorkTask::make(std::forward(fn), std::forward(args)...)); + } + + // Invoke fn(args...) on this RunLoop. + template + void invoke(Fn&& fn, Args&&... args) { + invoke(Priority::Default, std::forward(fn), std::forward(args)...); + } + + // Post the cancellable work fn(args...) to this RunLoop. + template + std::unique_ptr + invokeCancellable(Fn&& fn, Args&&... args) { + std::shared_ptr task = WorkTask::make(std::forward(fn), std::forward(args)...); + push(Priority::Default, task); + return std::make_unique(task); + } + + void schedule(std::weak_ptr mailbox) override { + invoke([mailbox] () { + Mailbox::maybeReceive(mailbox); + }); + } + + class Impl; + +private: + MBGL_STORE_THREAD(tid) + + using Queue = std::queue>; + + // Wakes up the RunLoop so that it starts processing items in the queue. + void wake(); + + // Adds a WorkTask to the queue, and wakes it up. + void push(Priority priority, std::shared_ptr task) { + std::lock_guard lock(mutex); + if (priority == Priority::High) { + highPriorityQueue.emplace(std::move(task)); + } else { + defaultQueue.emplace(std::move(task)); + } + wake(); + } + + void process() { + std::shared_ptr task; + std::unique_lock lock(mutex); + while (true) { + if (!highPriorityQueue.empty()) { + task = std::move(highPriorityQueue.front()); + highPriorityQueue.pop(); + } else if (!defaultQueue.empty()) { + task = std::move(defaultQueue.front()); + defaultQueue.pop(); + } else { + break; + } + lock.unlock(); + (*task)(); + task.reset(); + lock.lock(); + } + } + + Queue defaultQueue; + Queue highPriorityQueue; + std::mutex mutex; + + std::unique_ptr impl; +}; + +} // namespace util +} // namespace mbgl + +#include diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/util/size.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/util/size.hpp new file mode 100644 index 0000000..12c0ad0 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/util/size.hpp @@ -0,0 +1,39 @@ +#pragma once + +#include +#include + +namespace mbgl { + +class Size { +public: + constexpr Size() = default; + + constexpr Size(const uint32_t width_, const uint32_t height_) : width(width_), height(height_) { + } + + constexpr uint32_t area() const { + return width * height; + } + + constexpr float aspectRatio() const { + return static_cast(width) / static_cast(height); + } + + constexpr bool isEmpty() const { + return width == 0 || height == 0; + } + + uint32_t width = 0; + uint32_t height = 0; +}; + +constexpr inline bool operator==(const Size& a, const Size& b) { + return a.width == b.width && a.height == b.height; +} + +constexpr inline bool operator!=(const Size& a, const Size& b) { + return !(a == b); +} + +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/util/string.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/util/string.hpp new file mode 100644 index 0000000..13498cc --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/util/string.hpp @@ -0,0 +1,77 @@ +#pragma once + +#include +#include +#include +#include +#include + +// Polyfill needed by Qt when building for Android with GCC +#if defined(__ANDROID__) && defined(__GLIBCXX__) + +namespace std { + +template +std::string to_string(T value) +{ + std::ostringstream oss; + oss << value; + + return oss.str(); +} + +inline int stoi(const std::string &str) +{ + return atoi(str.c_str()); +} + +inline float stof(const std::string &str) { + return static_cast(atof(str.c_str())); +} + +} // namespace std + +#endif + +namespace mbgl { +namespace util { + +template +inline std::string toString(T t) { + return std::to_string(t); +} + +inline std::string toString(int8_t num) { + return std::to_string(int(num)); +} + +inline std::string toString(uint8_t num) { + return std::to_string(unsigned(num)); +} + +std::string toString(float); +std::string toString(double); +std::string toString(long double); + +inline std::string toString(std::exception_ptr error) { + assert(error); + + if (!error) { + return "(null)"; + } + + try { + std::rethrow_exception(error); + } catch (const std::exception& ex) { + return ex.what(); + } catch (...) { + return "Unknown exception type"; + } +} + +inline float stof(const std::string& str) { + return std::stof(str); +} + +} // namespace util +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/util/thread.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/util/thread.hpp new file mode 100644 index 0000000..bc58427 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/util/thread.hpp @@ -0,0 +1,155 @@ +#pragma once + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace mbgl { +namespace util { + +// Manages a thread with `Object`. + +// Upon creation of this object, it launches a thread and creates an object of type `Object` +// in that thread. When the `Thread<>` object is destructed, the destructor waits +// for thread termination. The `Thread<>` constructor blocks until the thread and +// the `Object` are fully created, so after the object creation, it's safe to obtain the +// `Object` stored in this thread. The thread created will always have low priority on +// the platforms that support setting thread priority. +// +// The following properties make this class different from `ThreadPool`: +// +// - Only one thread is created. +// - `Object` will live in a single thread, providing thread affinity. +// - It is safe to use `ThreadLocal` in an `Object` managed by `Thread<>` +// - A `RunLoop` is created for the `Object` thread. +// - `Object` can use `Timer` and do asynchronous I/O, like wait for sockets events. +// +template +class Thread { +public: + template + Thread(const std::string& name, Args&&... args) { + + std::promise running_; + running = running_.get_future(); + + auto capturedArgs = std::make_tuple(std::forward(args)...); + + thread = std::thread([ + this, + name, + capturedArgs = std::move(capturedArgs), + runningPromise = std::move(running_) + ] () mutable { + platform::setCurrentThreadName(name); + platform::makeThreadLowPriority(); + + util::RunLoop loop_(util::RunLoop::Type::New); + loop = &loop_; + EstablishedActor establishedActor(loop_, object, std::move(capturedArgs)); + + runningPromise.set_value(); + + loop->run(); + + (void) establishedActor; + + loop = nullptr; + }); + } + + ~Thread() { + if (paused) { + resume(); + } + + std::promise stoppable; + + running.wait(); + + // Invoke a noop task on the run loop to ensure that we're executing + // run() before we call stop() + loop->invoke([&] { + stoppable.set_value(); + }); + + stoppable.get_future().get(); + + loop->stop(); + thread.join(); + } + + // Returns a non-owning reference to `Object` that + // can be used to send messages to `Object`. It is safe + // to the non-owning reference to outlive this object + // and be used after the `Thread<>` gets destroyed. + ActorRef> actor() { + return object.self(); + } + + // Pauses the `Object` thread. It will prevent the object to wake + // up from events such as timers and file descriptor I/O. Messages + // sent to a paused `Object` will be queued and only processed after + // `resume()` is called. + void pause() { + MBGL_VERIFY_THREAD(tid); + + assert(!paused); + + paused = std::make_unique>(); + resumed = std::make_unique>(); + + auto pausing = paused->get_future(); + + running.wait(); + + loop->invoke(RunLoop::Priority::High, [this] { + auto resuming = resumed->get_future(); + paused->set_value(); + resuming.get(); + }); + + pausing.get(); + } + + // Resumes the `Object` thread previously paused by `pause()`. + void resume() { + MBGL_VERIFY_THREAD(tid); + + assert(paused); + + resumed->set_value(); + + resumed.reset(); + paused.reset(); + } + +private: + MBGL_STORE_THREAD(tid); + + AspiringActor object; + + std::thread thread; + + std::future running; + + std::unique_ptr> paused; + std::unique_ptr> resumed; + + util::RunLoop* loop = nullptr; +}; + +} // namespace util +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/util/tileset.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/util/tileset.hpp new file mode 100644 index 0000000..ed2b907 --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/util/tileset.hpp @@ -0,0 +1,52 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace mbgl { + +class Tileset { +public: + enum class Scheme : bool { XYZ, TMS }; + enum class DEMEncoding : bool { Mapbox, Terrarium }; + + std::vector tiles; + Range zoomRange; + std::string attribution; + Scheme scheme; + // DEMEncoding is not supported by the TileJSON spec + DEMEncoding encoding; + optional bounds; + + + Tileset(std::vector tiles_ = std::vector(), + Range zoomRange_ = { 0, util::DEFAULT_MAX_ZOOM }, + std::string attribution_ = {}, + Scheme scheme_ = Scheme::XYZ, + DEMEncoding encoding_ = DEMEncoding::Mapbox) + : tiles(std::move(tiles_)), + zoomRange(std::move(zoomRange_)), + attribution(std::move(attribution_)), + scheme(scheme_), + encoding(encoding_), + bounds() {}; + + // TileJSON also includes center and zoom but they are not used by mbgl. + + friend bool operator==(const Tileset& lhs, const Tileset& rhs) { + return std::tie(lhs.tiles, lhs.zoomRange, lhs.attribution, lhs.scheme, lhs.bounds) + == std::tie(rhs.tiles, rhs.zoomRange, rhs.attribution, rhs.scheme, rhs.bounds); + } + + friend bool operator!=(const Tileset& lhs, const Tileset& rhs) { + return !(lhs == rhs); + } +}; + +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/util/timer.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/util/timer.hpp new file mode 100644 index 0000000..7d76e3b --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/util/timer.hpp @@ -0,0 +1,26 @@ +#pragma once + +#include +#include + +#include +#include + +namespace mbgl { +namespace util { + +class Timer : private util::noncopyable { +public: + Timer(); + ~Timer(); + + void start(Duration timeout, Duration repeat, std::function&&); + void stop(); + +private: + class Impl; + std::unique_ptr impl; +}; + +} // namespace util +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/util/traits.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/util/traits.hpp new file mode 100644 index 0000000..5b9401a --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/util/traits.hpp @@ -0,0 +1,28 @@ +#pragma once + +#include +#include + +namespace mbgl { + +template +constexpr auto underlying_type(T t) -> typename std::underlying_type_t { + return typename std::underlying_type_t(t); +} + +template struct is_utf16char_like: std::false_type {}; +template struct is_utf16char_like: is_utf16char_like {}; +template <> struct is_utf16char_like: std::true_type {}; +template <> struct is_utf16char_like: std::true_type {}; +template <> struct is_utf16char_like: std::true_type {}; + +template using is_utf16char_like_pointer = std::integral_constant::value + && is_utf16char_like::type>::value>; + +template +typename std::enable_if::value && is_utf16char_like_pointer::value, OutPointer>::type utf16char_cast(InChar *in) +{ + return reinterpret_cast(in); +} + +} // namespace mbgl diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/util/tuple.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/util/tuple.hpp new file mode 100644 index 0000000..3f6e80a --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/util/tuple.hpp @@ -0,0 +1,19 @@ +#pragma once + +// Polyfill needed by Windows because MSVC STL +// is not compatible with our IndexedTuple code +#if defined(_WINDOWS) + +#include + +#define get_polyfill tao::get +#define tuple_polyfill tao::tuple + +#else + +#include + +#define get_polyfill std::get +#define tuple_polyfill std::tuple + +#endif diff --git a/src/3rdparty/mapbox-gl-native/include/mbgl/util/type_list.hpp b/src/3rdparty/mapbox-gl-native/include/mbgl/util/type_list.hpp new file mode 100644 index 0000000..4a5e95c --- /dev/null +++ b/src/3rdparty/mapbox-gl-native/include/mbgl/util/type_list.hpp @@ -0,0 +1,40 @@ +#pragma once + +#include +#include + +namespace mbgl { + +template +class TypeList {}; + +namespace detail { + +template +struct TypeCons; + +template +struct TypeCons> { + using Type = TypeList; +}; + +template class> +struct TypeFilter; + +template

    Z6$bLU)QjYD6 z!_9;djAI^R$;8B|Rg!;#(N^pZ&Aj~bWU~b)Mj#Ou!k)9R_n<%_?q(v~qcQ}8mEely z%W`FIRmF}L?Wc_4&xo*~TD{Z)@WVyT%;DNfj`WUph8XyH(LujjSSU;XMJdce;(&1H zSl}d~$@B1zaZR0-o$a9nSZ3~)dvvl~{_Xd=Dz?C+8DFQSWvDsy+roZdrijkd3U6Ql zxA~_pzfkAiAbFnYpcPEsrSr`0>uXTO;{%7h%$Q{NCsA!*L(J|Rc=Z|h6 z&&JZ8h#abRh@JI_+ZoDtJHgG8e$_eYo&nhAZ|~IOL5!>cyhj@HKTarH$yuOsozgcDSFlcPs@dNmgp32C#R z3!%o4o(75a8xBIU8S0H4wdp+xpiJzjUl=sJb7t5qd-02Ll~~SI?&a&0aET|H#`)pl zj7&@-m}C&P0hc?es&)Q*#oCVD8o$sFQc{py5G6W?>6E6*kvTQ8)A@O@zG;hBoc+ec z;Y@H>EVxfaf)0U>J1(kOQid`|NcEdZp9hTeEBcVYhorz(#K^Od zx(mzZv&fWEJaHbLsD{~FxmYKU{4=?$WrmY&*VZSS#|?l|Suy{88GB_AaP_jq7NeYmS*yVvuSAf%mFTK9#5{WJ&X15 z&yc4!&^OJlj8tsOd5~P)`1~i3jREm)CB^+ju6}A2gY$>lBz0;y!|KAQU{fwPpLegR zT4&8N9=Q1P%xqe97nR7NAnb4CQMqWJoaQQKrwjtg|IqYR0a3MGxO;+>5)dgV>F$m} zknRR4r8|_a0i^sux>FD-3F)3er4bMi38lNc<81$P&gI^DAY4_fy=L&EK_rY2Ta4rB=>?8mxR3r4OC zJx@yIZF+HkhCebAClku?f0X2USlC}YJ(N0hg>!Q1i9Dxy@e>#QDbNt`Ga^P9@u&hi z76(IOkxZ&M=EZI*>29}$ts<7{T}z1*!m4^x=C(QKH2P8R+4Ozryc^?#Rtq^*8LjEO zgPU90Md)m)wm+~&((}q9!rL*Mp%=Q-^(bVI(aXvXCAdl&!13~$b$_xxSzDf zx-7zjp8;PvLbEeA&S4sKG@>xOrbUO<(&*5?u+oiZYw0KYY;(4pE?jiM#V%W*TMs0d z1jim5O7yODLhOp{6I(Gds^m1V8e!~GT37v}o7bEh+gKS#&muh*f`8ITLvgWP14Ta$ zc&1;4*OOoa!D=Cl!NcmF7v#oLKM)f$_P|}8mmmh-r@Qvg6O2wG|3VdBKo@epS)&LI z^*uk95U$7Ge7iZt1w^uiV0d4OYT)H(E{1bXJoiq}9MFEo1+B(~eKLeH)N3UB7 zV;gGR;r+>0J}q#dFQ_Q^txl)p!(`gnD0qS?&-xH~VvFfnVV;Aw!)_-v_o07Y6&Eb0 z)AHfyWihzD7llndKTD8jS}9PYRx(HkG-L#H$P&rT=s-MaAzOSN>j4^+t=EY9m0ERt z5MCp0hUJ=z1TGA{WX;%*#2eMIym1ue8R2E~ASk^=obX@7Z@J;zd1^XO{r>hj{|^WX zgOQu!rtX60Zomc?*oL}6e*!6T{5aQC$h9U>j?tn?RBXkNLD3l;kB&v!9OU#t% zp3mVm3M0DlYy07P|EV1ld0S%x_){Tm+XJPcN`5^r$hsz(qE=YBi{H=btB3}v)lr1# zHZ#F)Y-OEwNggiD&){`&%eowiPgnCQnaW;TDk2$V7zNaEU;S}a0*q4fR7zOx92Af8;Eh zNs+d2;Z$5>I|~+sqFoa0@J;7=F$rlzqg|V*@^oKu5|kG7Sgn4v&@QV;*iH~^EPFR% zt=}EU)m2Xq$FHZ{58ejSSc4V|p!nEsBPztdqb*C|eg$mf z^PSmvdktU%w|9YDEQFtbsjbb)zI*b6+`8w@&6Ed);M}*OwWnsgcrth15eEr+TzuFR zbn6Yj@pLfmPCg#(M3p2so~0mB1_Mu7_bV%Z9Q-|!|0$-!Z$cr5kUVuNCVE- z==Hn+0#H=+On;YB{Qg^aaRjP$_WSuvTm%5xI61%&72!m#e_P|4I?u>}ZtiX?B}CI~ zHyrhzgu&@Mp&p|Fgn!we=plkSN3S;Q5`NR2oK-*e_b24$^413{I+q)ApY)2GZ4VC_ z?kxIlqN4tTbRlcmJMEXx(rIO}ppN=Nz=;s{$GY*C!G^%~05pUI$Nf>LuLe{lWVrvO zTxxmzjfSl`81H0SxX!S(%fUsfqBKRoQ`X|4&NkdY;wG z!defowDQwK>cz2nP2&g0VI zYiJ&}h|Lp4K^Td;JyK$61@4G1F^Lm;NId^5j9+!16E;UX0}m|^)>b6%1pC(EF!qRK z#@4y=T$ev*XN~^1zBR9h7r)0u5xaXM1gFohbu%_jSLTR}!(u@#pW=hCjBD+T&2-z7 z@{r`rKv(+cOaAEI8NF7?q~tF@&Zoo<^5Aw|($ptRmkxgsYR|$^=Y-q`$>3L6xoM2+*KrS;XVT`|Yyw&*pKx5GU z712|pm+Zywx)wAElMOaf6neq46sQ7ZRvDp}IVDu4A?H$Kd!pSu#_h_^hDDGp9{pAC zSIXP9CY29ufz8K_`0m_ua%6G>; zdd$M)LA=yQ+e@Ws(r!mQ*mjW{ULkd!Tf*((nbL6Vb;Id%U?}Y;#QVO>of>+w+; zU_`S@Fi)GeTF8y z0~dBn|7iS8vv|qFVvO+Ss(#vRfd;K6rib zHw?uLd7;9_j{dPiFCg;qvRqu&?1Nof^pM4fb&k+&cEf9_Z$A7Fcq;E%uA$ZxA8G?2 zk(`hO&RvWefxwPW^OjwuZ)SJ0I=;`=mkE6kB?0lV^P*Nwwa-ZbGJUw{6_vkEulF~l zv+Er>w+=IVD(;sS9)8#Vo=}|RL2zo9R1p$K-9$S^V1}h!oV+rkuPXBH@_wQ$85sHK zpg>(EAW*mA-RjK6phLB#qij(t^PVZ?M&pwHcHLTm@Ub-8P^(-?$(_Jjkk>uObxu)O ztd;0=P2X;^6hJ3qZCp?|5-t%fxlgN<*1QocgV+Pr*}m7iO;pQ-w9>Jl#PSv0g_F8R^HIwAJPhC-1Xz2_Phc_{ZC5$8{U38hxg>2 z1MZ)3u^*QpEYwLlh_I41QeP?|bkwz7d2zcW@fg1m22lW>yo4|3t`7`=a1``Z{#O$5 zC?XFk^NWOF@}||%?gb`s%_c!hbnka-DFai3iFF;jabaQ|NhG>4(#`jmR0s9`o|w4VM+||!!?@z zo6a=$dru)6QL3l)wpM3B{ZQjN_lQOH*nh@!IJ`fP)w55R;7pu|JnW1-?xS687p*!C6Qa$y?zl5wt0Ma);wg9a?> zq7FNf&rC3kZNM0wlZ27*q2r95-x4XKeb?G?Vj1&FksDO`kT!OJIbt$)j_7$0<}Jri zIT9F5E3@{oj-@TNAV(w>!4>WSMaJp23hs#+bi-v1KI*V(CI6hb;8sn(K5Vj}+E&3t zS-fq{t?%LAb>aj<2FP@NYrcse%Oxc-KsrX4CcJ%21>jvVIHkixF{W`pVndIycQ!-a z9bbNh52z_ta7omhIxD5fLoNg&^225NUH6?i$T$|NQ{ikwLTgN_N$4jVAid-z#;TD*)3?b`Z#9VrSB!?(JbS}D&VW4o_yG&rZoiu5u?=xT zcsq?;W-Ld4Dc@IPv%cAd~)k= zmvc@DEU%>#VSa0}WCB7o9F0U;NlJNfIdM_pUoM0~?{67lR8-mjBI(~@A=EWAmdZ-< z@Onk(i$OggHNg{cQO8g$xT*Bxb_6tq9NOyFvA{8am7 z+~3Bix&HONZRu~9`Y=d(F(kr&lHxKJp5YXT)@4{Qg@U7tOvhGcbJnGmNkNN}@>S{F~eHOTv zo#BQRV;`kdQw;b!7hBPk)0{!Rz`Oj%XQsm}L$*4(GJOmU4Hd73uQ#JK2aR+PB4X2o zmX2uYX+GLjfh5bDMG?GyWCDRAb8v$j9FB&cQ3e)CzVZF62tA6v<6W-KKpQ07P?`tgUab_6G)VJ8xF!b?QQ#uA=UqRL4u5iTaZSHR$bA{0>*k zSbs1Do7^VlQ;LBm0<=EL0SD{04Z+$o3BUBq6O_4imvG6I;3mWD9{5BlBg4b*ca|D4 zJm<4GNZ!f6+-!Z^H3YSJc#%s*a96fz<~HFp^?^N?!;xD|Mwx8J5u;@@zpTE$swN`jTGwM{$U;iW z;A*UY92h3=rW@7@oKta4F`Ky!rd5om(MK`|Nr~}M>}O(Llm1!mP*DnNWPBT7z;=WP zrm(1=B(&>wrF&fN3>qAZVE9pfOJrpI51D{FO|-p)CMG7bI~%yERz^zsw+&Re^dZ2! z;bxFJ17@TRPH)D8^fBMH%o31J+uz3h)C=SatdGd>J9cUU&DB`&zl6{ORlr;2p=Veg zYq!OHoJDW$FA3Y0Vn>t!=MdeDiAM?$G2MJ> zqW{p_krPSO8PcJbxiF_hI9Y)y&Vqc~bsde^v8v;X95f5l@ ze_Cp0LqDuwubk2Vl-o-A_}E6TI|RvL&U5i1iZX-p1Zua6bTFm^&FZ4o(^LGw(+ZxK zK|$f)%FDs{S-XFSyqAuSjw_P0t>6p&x1Hjki7cJ$Q?GV@5|sp`8N|`O0F=%UxI8AUcoXKSE`SVsir^grn^r`_7-b zG%+n!3RcRm=90Zb_k-@&govDHguP0d^0Tb`O82#r#`WS77thHGQ-|bvFi51XMs{y! z`t?BjE|JfV5A*r;gG!WrbR$IPBBvfqmvB_9Cc*FX_;F*uMnDgDf*z4;j9c*IVkv;i!li$@B0dDyrq51iLuhoL}JnTNL5)H`+U*_p~y? zW4=?B5*|zNwY4<`Wlv(X=KC`7%r;sw0Jz9jf9PeFoxPd!t@{3|dT}^cqJPH%_`8FH z0QN3hV4|wMfx}BCpsJe%OeiR$r18#1mZLzY(vfP1%57v^V7<^6z7vE zS-1Ys;i@X9qLov9z})8BDQ7qeQVBtqcIgiyU{#prbA2r6s!$8mvfDYdwC0sb|7^xF z#5xTqcCM(uD@Rey4h3zig%k(b_R7)Zzc1nMtGG&trVuFX^YUW~)1pMOx!YL{6Tu^M zzuMPZsp{L(joQh7fFDgCr+VU~tFr?Opt=;M8KC<2XOW`E)#5l3QZl;MA8Zj?k9ocD zJKIWj*(mN&R)01{@PF>v((S1LrHrI4$J6R`!X0Tcr#(fr!C=hOw~`1Y*_s-*LhY=- zP0TQ5@$}?S=4Yewa03Gaunt!rxQ0OQj@M~hvITB@R%!fJOs%A-{-99J_3oCYr$6^P ziT)YM-U=gCiQ1*oX-(i}eo#Lk-R<}cJq&ZF>5YHVn;A6%jIN(<^Jw+YAx%~v zhB?|x0O?(W*o|tKK1WWg#%~P5Q%PI3Cz#?&R*a^PVLQ#OtG{!IlM4HhS6l<1@$Oo8 zpF`0q%4`}XAuNo@)CkPrUMje%1=fnF4YUD8vRc?5t-7W8juXSH($X}GP;Z{doCDjd z(V{M(^2#h8gIhHYCt&=fxhO!JTq5(;P*(?UUKRdoJpc3<|{8jj9F zNmkdo)qH@=5snK_=K%w?JuIIRm5WP45=8VRsp%#sYtgBO%o8ne@@CB<^_v-S-c@44 zi_TAjPFjNmYndqlnpD?sN%d-@x*Ui{)o^z*sfrRqLpMk9?$ifihE=9rV9Ic0Yn2D6 z0K*Ix|9KeP784Vr%|(C(Vqbjvz0KDx%Li`2h3s2_gt*zcIa>n-kt4&9Q^UjW%bE+| zcT`}--@t^H9T|S&b`h{~p?q?k?0ec^_@%CnOBKV5V4*noD-E9na5D)R#oLP+Q_b9@ zv!Nl$z~hg|TS+G~GFV%D)2;C<5#OVDOClA<24E6tU*OrZB2fhY;Sz=~8I=vV$su%B z-8ddJu8X!xanJG4#uwpJ39X*uV@W6JJr`p!$m6Xyom5nlyu88b?bgji{?}VSaMUo&=lVx2%DOk(?RK>5YnJ7fGfZxAk$J)+NR^CL$mxKyCkNuK z0?&Hr%r;fhft)ReLmHgxx8||h>%V0_wRTsx=Q8A*<0#OJwd*kIeFc+3@42^UVf;Xu zNT_N1dGz3a6D8DyVp)d!Lhm-8UCn$fa!=&w#=14s&99Msgez*%d-0Ad{X^a%wxwa& z@G0U%VpxnCV~6NHc~xPjwanl00p-~sPu|v|r{&-Dy&|t-+hT?M2#O^2vh{{vI`Zu zsoC$y7KwGO-xAHfhqMcmmDxl{EJ7VRc4(#i(tbD=!IIoaAoguc3~zpQhuEJeQq-Yt z@XuEXCIB)AE~o`%DoB((COdLxX8eJYC-7xX93VEb$58qB{ioXSUG}YxY51c!OrL?* zz(on!Ta}TNlh*dSwXQeH1_Z~A8Ze+aW-DW4saHzPf4y2r2t31{tCK_~tBRd(x%- zSmSyc^_qM5?pO1>K@I)Y(Ooau6{Gme17}77-}LO$A8L6={kC^}BPWk!TM4&PWrHKg z9M!}rlGjQt{MYKF9_aYYd?Px0TDop{`Qd2fGrl@i$OC~um3ik!edl;uv?*y=jg5_m zdu{uR=up^2pJHAw==wlIet`8gDqJJS*FJ?Y-^kR&*WdJ%-e(>g@#db7k^qza$*{ZC zC1&vAW9|r;8$b`iJvhCR6eF~(m5CvgI;IAze*}Dk3BrGzEfaA~!ytkvOCvSk(|Mk| zlDN52_^H8NIf+2al;5Y2UC#kWpe%7 zu(J8{(NI4E_b6d_R36cgzTW`x!!U^mR_!G`=Sy*hz$-`I(@I&sTP}g$^k49OX>}1_ z#{5mNQTNQVX2hf2XohZ``a<8xlZuMUcei0}*<5w+Up7xyIM(WEqjeydT}xrXPUH9o zqb@|!ngzq>z2S0hF9XCyjqo-nn!339qCJ?GZB+3#$#@=U;MPqH{Zl=B8Xr788xBRs zD_{yX+o{5p^S7Ib$JE2$5SEueYntuK6d+vgOMH4Ly?gf~)T3p&Hy(`3!dnRc6CYQ` zzO%>izlj42xU192IhU6C2q6eL+N!unwYV&ijl9=JR?iKdCsF*Tj%J~oHwW#_5TZYw{k&-2ih!e-P>U~$$^e!qDMZ{O|k z_+gGe)0&^1Q%9k6OY)G4Uvwl)Ubx3pwokr^d|NIry--Qc;Ts5zui5|3&CUHV@2hDB zZWk0~uC#;KtTkf*ZpeQ~$7h()z8=21?H|*RUIibTJV$)wQ}!zy`+Y$6teXXQ%kx>F zK92FIylEe>l3BFgFjnW%Crwd+fhJ^zLHD>Sp$T`aZj^XJ+o%3%H?Nva4M1XxRtn;LpXEFY6gHTKjkof{P`cI^qBR6n^ zH1EEzX<_OxYJmtl+{Y5VJ}u*D%weF4AIJUe_%B{<*emKRw*gX>mbG`u79K;SfmMgu zeGo$}SW)=tc)ox%W-#RbE%j(P{`CTZxTYkAzm*G;{lD#katnLavXJq)eq}P}D=3nH zTD7?J1Hyt@?1zouiojL|S6GMyBdtDTI{RtpU}aP_>JD>qa`HtgVsF|mzkBE;R_M1= zLK(IA6BFpdPk8AeOM&qhrUGlfa#L5F0*|3fKG{@BV}omL3UtJ9^4NA}-Q7k!104Yl z&icC0oQDW-^CAg?dEaONQOCyfb6|$5FWeUpg+5hOxY9tg0r?cV`oIq4e=ph-;9gtz z24s&lYJUxg54ng4iLNlL{*L@~8d7QlC4(>g+&($zYf(H{w9D@ey#!}!I{}#`%+#+= z@>GTg{$d0Gl5kIYg8a52mX;z=(H(w+Noe&ZM-~9 zNpp@r`y-+q_lM@+(gm5ow0Zs_&iR0(9~(zpxO0^zb8|DoPWS0N7Cj(oUdaz+HY{DP z%e=A>VX6s38kUTMY+L^qOb`Zvx+W{*>h*E8yioOhG4~`*{nZ5?`I$r4pj$rLI%_Q) zK0dnY8SLav;xQn`?KCJp)EZcQ^N!TmQZxELs$6Wm>)8h)e0+RcEr5(x% z57D%#4DIJe78WDIC(bS|OChL(^DpgzQn>6xBf-}KVe~JSm+I6@h_tIN(>2&7sFNx7Y)_)Bn$Cw&1X|o3YGTli}k^j z)c3xb;LW_x6+W&QA%kV%=|$pwq;q`#UEvunF4dVya_HL>Qo_}x-(+67N%$SGXk=QE zaEb=GTF8C`)lb|5m*sM-8b$a5$b*^1wvcAe`?1*p#)`6gJ38SsdstD(+@o$JJI~I3 z7h3k8XjTXM*-#(MkOKf1iP6;p`Y0CB`a!@A4kzft6B={(mzKz*8vDDbz0#pq9X&?+ z7~YSFNo~y4Y@4OJ+Las35w~|Au{!$t--~nhqqK4b3-m+Mhx5tV`5D)Ro2*T9P9XGc zZ60&K*G@Y*467DEgFb4pd_~$IQrf%GI>*;#%a5MG+}|wVXRhI7r1s~981jN~#1(mo zB@2CPH*b3KUjSp7?PWZq8IJq~*l+LrnSZ_L%`OV#2y)THq?9$!JU2_`%s!rd7#dh- zS(bl{>M$Y$C*lv$+9L%*4WSDH18yR<+vsFOp`RerdafgtR<#| zzRF8OUcI)*caTDN>AIiV8l68r}64SQ_pmpW9Xk0|^zlq@FR;Ia27vsn8pV|C#l5JA#~7 z#_opYpRsp6ZC^=#!Fzf;y4X;?`yF)0Y&dDl62kxNvn-UFZr9!8w^yDN8_Rc1RsP>#BzT<3WyC^X8X#5{>@t4QMa%ZqVuh+jHtN+&01Pd}e-2wX^+h<(= zM4A%0G&Hlb5*JI4QPEDntCwf*Cs<^oUN<`z^n|Q92*0F{OTl<-PMednvu!7?6F#y2 zQSxz!E_s0`x6!*N1+RZazN#)7H+rp8|i? z73=sxPa0V;r4kCsbroF_U_O#7$^G=1CuO=e7fKA{;YBG~QHJ+r15;VnbC^g6*Bn4; z&!x|*`DoyX^>jbMxwi4+QSpg7Ai>K?SmrdcfC5$GU^2AS>aRd7_9#ut0 znTf401aZOhl#mb3TXnEt4r7Zsa&eUJ2>{QnUG{yyCF?DhHC^stG5ytwt$pl?O_3%X zOEVQeC%*xvMtbGQde+K`|7uM(MVhZ=q2Q)ffgYI0wB&?aR-XYiZQvL@0$k){_W#RS z1drIG`}G0)huNr0rkgRIkcU*+RD5`&$dS5eLA=86pNZ2?e(>j2o4h1nlFej8^7|4| zl)(pf6b$87xu3K6t$oE|Ee{+QpS4zg@#ujFs)4jY_O#CJApBMurz(jw%^- zTd{0$V>bJyn1c8GO9``Ir{dM!s58k{6G2@r&vO4)}}Wn()x(ZV($tp~VFrEs%8mTtW7c!kTI@TiuO*s-RO1 z96m%R(qpxjVQ6V`5>PzsLv-NtDfO!+DVFWm5ofIy&&AC}TGPCkeF65wsB;<)4w1vF z?do{X&*dKZcPAwtM=LmN^FMt#B+)msU=W82duG`?nc*Ay5hi2YmCQn4v!R4cnbqx8 zY|}4e+FXp4=U#!#T}SS~mOE)pLQr39K6M4Tzst<5ai^GPcAi<^YYl_Y(mxv_4GfY; zj_+Kr_?xip#e4()2t6OK#Cxt2;Kj48SFVcH>|qQ89SF4a^}qSN;6IP~q6eLtl>%l! zei}8_feo-8*?)E&H1uQm!}#uz6MJ%UP~c9tTledc5V&sgc#S4I=|PyAB&37|{qm%! z3lr1A-N_7M{g*ZNycQA4HdtRold z_3WOq_S)hI9r0hjB^)j}7*a=0gD@D19*gXN>Xwv@c4(%r=O#slg(<`K=_ZU0%X<@PFdm%%}f`3K``_DA!e((CL@crNJNEbyRf zWBYdH-;fY^oqy#mQ7AacY!y3$4}dh@75E%(%{=iZ`bC%OgSBAoTn9Y&JCD!V0R>Ch z`%DXdZb0+XK!2f;_o2lup{~)N9&7cm~i}#J^fRLoq~r4UgAcUQB8Cl zyWtpjY@)rMro{Qh9-r`-A0&v|z@H`KzW#ao(Hp}}S%#{cWSJjBSI;0^7JE)4 zJR}*ajA+KYDvZvuj)VjK07UR;=EW{b0InxvN+9neLUD{)irFSGW4=6OtTl6f(^q+EHUXkrqDQbf zHGF$M)^U4g(|#Yk{o6ps6SPO4NB#ElEx-nVf7E?CWC&0&uh3b}4$_NWf&suCb8wPS z&>?4Wnf6+gCg9{t&ERAH|3=W+J#@IUo|M**nw|o^SXcH;56q29F^1gRHcl@_ezpU< zl>(5(!~fr>x+B*8qj{$3S69R_N=LN9$4x=$rwp-QhiYpm4JyvV4WJ#)5HZ!_h+ohP|-v2`K`$|Mu7?j2e zwI2_+b-P8xF46dJ&~x5QW4vkGG~U^)BM&J%eEu!a-=Dd?vm43y^*IX1&`J-M#V*VQ z6H72j_$2+*IBBrw3G&l**6pwoV3wHji>|siiSn@|cgwp=0d!FE`|&ZiC$?8FdPv_; z_^XxQ4Xl`)%yxM0qwXPd!PmQuOY{HiuK87|;R9zc{&rS(ppR-jH` zQ8uo6>xqOn9#8Og)6!06-O(NszEVPq^fS@Zh_CjP?It=lN$${e#&mueFEOh_+pWdOvH^~wpB7eC5l;WT%+Q1_Ke+j@`T0Zwm;VP z_BL24dykIz!N0;k`CCz9tZ60Be~T?}#I6(TZ`I$U6^Ga|j=0anhdEhUNs^`2`nF;F z(u6ET`c{)oEn_J2qhIGtSRFak6LVMNUy|0uqVYzjcs;)mv@t+U-UsW>b+7A&H=gJ^ zNDlb^zO|m^*U~uGFWcWAGi&q4cWXbieQ_A^5BL2l#b(rkWkXWn@o(PR1?R1J$i;Jj zr(PYj&JB&*rUK(16i_lTWo2y6E^do6GMBxgz6W%}xl&P4w87+x1hicf6ME#>8u()y zU-6ma78qll-?GWNCu!`@;usQwd?~(zcjOo3X<1#Hp^yTfUk=9Z(&pwb<^H@`nQ-%^ zhngP^nUDNL;Vk?@`XE!}TzI4i9ehh$|5}%la+Oi{()8j!&HYgP&d|&#(;byc>V(5e z5^}(-QdD5-SyLA*@j}+Bz0WA(%O$Nhk?FN|4uPZPELN$y%(h~`}ff-(&lq=t4o%zJtQU4B}b=S-4hS9`j~?S zPJY$NZ+*iqAcBIol2KG2vmS|)iGw-Vpzl4M6}t&`q&F>I(pY8 z!L%>1I9v&tcKG8D4i2taquRVcee(Q$P=5Dvyo|K`*tFB)BVO&R0ZLnpo#u%V%HF8S z@#Dp(_E@}x3s2@g{sdH~%bx5~?kv|a8sH6RMna1l&P|UB)@N0jk<1W1;X+~F{i|LT zGTBxHoHT&-CnQW|fkh%6 zazl?qMR;5DyavOTo4vNlPy(P!)?yJJs2db@UjV>0)O(OwwRCY91*RH?_m{D$o%nB@ z`Tyf6ZA~Ur3Nmc`5~1wR%TqZ8ji;HBAJ=8kBBJVaqAu1aYR@LRXc5%0-=m)%sbmD- zMh~3v2P~wODJI%7mKz+QuOmwgWeQ}CDTouUV&ui#+&*gx2utPpVq5E5bOQv(CfxtJ z9`^5oc(uk*##rF42XA=gS-3yLx5EjVkzJCZUvOFL=AbfD=aOgZA4eVu)lByjS|mK@ zm2v~8N;^BOY$_@vvj^*be_HC^fdrseHa4qO!lyzlAVcNmfbdpT)O*LscFC<3%67J1 z-t${%g;BMyPQxKp1%TNk+2!cjKg|kmv?u!ksJAjD!rCF{qwhEc{+H~6DUNiC68IvqeV!!e`(g#s8B4kWOnJ|3hpbDY{w+Q?kBw0iOZ9h}wpTG<2rm1)!-_QGd05Ko+!^pp#1Ir*Im48KB)prs*v*2H zH?ZE-sI14D*l(WkKQm`|s_$VMbyEr0rEop@^TCn(hexdz+L667S?BvE%$UE<2^CBz zf)V_rDh93@E7WIq2p@WeH>6+u#UsldodBa!uz8DWC2-nkI6pXS!+DdSv+Fd`5LM!2 z*6X$C9u59VCTz!dx*FG*PtMJ)Nke@B?ZzwBotZ3ls7fS)t^|WGqJqiC#|xQbV^D`G zwc<_Gep{_%-RgKWz`|3urff?J#4mY-0cG??fIy?%y}|>CG3JDtdGC66%o9C)p4Ruvd-yoy zi2(JCKE2!@m?qE%ruJ-(ft)ud>}=RbY+HNW4}525S4$fkjQx)Dx#s_7eXd>S{}u<_ zwX7dXz6}_38J)yL2V>ixJ zG?~^~2qIsWfw4<28>?GTlW~a8=;w)SH1JC`8uH^rYRv1N-T)uY1O!UZ9z@@ zogRM^pDG@dg)Fumd?(Qq{5*{-2=%=4W0$b+NKc<}EWRlErNVp#fBVq9zkF3!>-XY- zNncurwLqS@**GQSdzkECQ2)de%$pczY;|N!O07PEpBj7LhLlA|J4v9Sz64GdoNg*{_S;f?~A%ZunyVk{*HnO#z~RVAte=T{wZns=gAi@Cg z^&wqs+}lnA68^yn`;dz~@bW-ZApnqW{ePDi*QKu?@mTr_+PN&zNdlS&;7U;6(gqFG zSLRHcX5ASWm;HzPdt4d{baabAz(RtZeM)eJt!Dku-SLe2XHOt;6Z}f&$>=4V^2Wx@ zB0LG`$o%y<4J#`KdGgR0TB`BsGv2}=^DQ%R!tl<23PB987*54F6)57;;h*#?xIrMK zN~1P~zi;;iu=nBLRo-`i)O}6J4aVEzP{p%G1@NobZ3|e<^Sh!5JogC_0m)%G$a<%P z2cjfX>jFX6jP!6JP1Wg%2P647-X54-3mPqh*$8Re0g1zbKmv%zb-5Y*l(AEf3S;Fbvgy7f5e1rRuaBR(3M&#=FbSD#3 zjTBdYVY?rCfS|z$Y;yH*_yAh~#{C!nqYww_T);>x5p3l~Fg0lmt7-=yk-lC#qi+Ykk@kaY#>PJB>-= zd#M}{Wx1`&)A4q;X&)~oX0HcSzjca@K&ImU-A)3e#eX3oLY-m=>xJ%)is??U&Q$fQ ztEnx3eCKbvnvxN{G$GWw$-0=n4bwDQmKJb#-UX4+pyinm6WcTo_b%K~$cI+y8@V(f z^YXQ1=9NR5TW#aZS{}4Uf0PMyj6zx`8I`+P*Q=Y~?<|sWTl6`raoZ;Jqi&WuV4MT5 zd4w3*`JpB=JaWnVB`pm()v2HgbaOn2Zv3NUnDCq_vE@JY(Cq9=F2IWK9yVV9r}H`# zc!wffkTC{#mE>qbx`fbuDDRgjeek;XvS)t$_^}w%n~&Djl#X~EFBwLV-%jzTAk%+S ztL&2?<)8ny?~4+U8@1~8JvZ^b&aMaJN61@AvC3mzYBlpoO;*l_@B_>>A+ZE?Ad+Y* zRzKiXo(&F_}GJ90Hm_x9KU6Ec37ssy%Afd#h&io$@39jvETErmjw4 zfEaBwbdMInfsFp|lZRax12S#R^}MhJKA;51iT!_Rea^@N>lfmerJ?kY(b5*6xsTD9*eg2pjN+taXbwU8fc_vDIwxCm{?jP zY6zFOY6s{VC8 za_)NrBV_dOi;VBnJoqC-r)&>K{xp^>6{O<{iSt9P)g&qfOpujgvi}I(iD4=E?{D}J zal%mZjG$^}0ib>^`d`Zr-}^{Unaf=fnUKAOGtKxU+uI3sHOZs>t`;^Bni9vJ`3UO` zZV}f5oXJh`{xe)>e`GF{@~6<%@Qy${YuX4_iGfk66c_VHo0E|n`r(f2=>2j|vS4zu z?&pI--rr#pFH6R|c6RXmJ7VDW508I2JU9Mix&H?c(~tU4VA0ILB{zcYm8oQ^3=@5B zB)O7Jb+BZ}NLPq!pSShvF*4^Yn+H~Q)R8h+u-fH-|B}4ssab8I1#bC|S_Ge;T+UF^ zlf)0!3VB)Aa^-1^K*DrLec_70sSzgHMwdgVR$xx;C&T@@nB zjlu$VEm;o2l8?vs{i*xl=@6LlVD=_|-)uGY03O0XKw4wGST#g0W zis^Zz+MN2pkRDuA5k>uMnVPKRd3C)S5*E`xj$T1piJBEx(PS&i#7Jn~0VC9|bFB_T zK6AeT`!h!Sxptf(mb&sBys6Q*jmZqQ)j);~mH8izi zma%^#PVa-e!lJR{WD%gcd*yXdN`J+Q@kSk&?w)m5dWdqvVc?m* zRW~cjiv;gN*9n^x3n^nPJqAiw-S(Y}Uid6Uslm01o$ac~+%cjBK-Z3EE4fJ{Luan& z)LHsd0Y4VY`I8r|Z?K_XKa?{Z__|cmyGJoWPBtwvW*r)_OFzdIFhijW1A*1Y1@#z2 z=M($gnVs;ILz&D?J5QREuG%TKaAm~jikV;*c~H70ha}BkynSdAnT}&AOC#U;suG`1 zYlIxW@~z|N+d1$nPWMQK2Dj25fS!9rfmjQb;D{4s(>%5JM;bEa^StReLNka4J;v%F ztnml2zoAJV$iN3}fdnFurlD=s4;TTAT10jTtIKRLlCr|>?zx(|YnP26vV~wz@{r^p z*Wu?A8qwez&@Q{{ddkS+G1F?OJ(gB-MHmL~rJu&~*j4Mzw5)<*YU@kd9+sh9%n!}65(Fywaa#slfKPoRL?P+@pmlx~uViSmTa!!-rEZ`Ej0Yk;6Athiqqj&>d_*%gd@r)TAgTQ`wEiIcZ~Mn{wgaE3NAV6q+jhZoAkR&IMx zQqy`iH8-cwG#ehK!%S76H5QG76d69k`f(?eAi!6Hwt(KeNw%_e7=0NrU+(Z@_{4?D za(yMkG!re3$@Jjr;TAsHj;*Wrgjv3z|B;w%vZ=#6&8Hfb$1jMHRM911mc?Ca( zJkf8UYH~jFhKjvv*u21w;ZA4Gk1tA#a@Jz{LDB%Or3jpP<^Rxhl~GZBU;EC`(v5U? zgM`%3B_K#Q0@5vALy3ZC>Xx>$;>uU(#YSy?$v5ilo#^9)6kij89nX+$YhdOo_oKdV?tq?S7_fvgLZ% z4F5L?cgZ0$qh}ugalfRr?xS1n%ZSs4_?h6u&g( ze105HlSk^H#aZu7{Tu-#IKN-L95n#5>VD2W3z&Dq#O_PAxs&C@Rwg^6`C}#Xdl`E0TH zv&J$#F)p{NYaX0=wx#LIgiX+aXR{-x(wzKzAzL}`;QOY}VwFt|a7>V906qPz#s$$U zH|<2+o|&h6yE6%FHjD#GJ$te(4^l7 z^6^|qo<2=&Hhmgw&nkrKkvBhxY?EL!K>lzm=U*UC`}BX>4?&e?5wNG9En+@*LX|df zVjEF~!23|1{_a3Cg4o(AWT#*2{pzt1J?cNnYt6I8tQr!H1Ycr-eA}~VilrX=d$h-N zSGDf~^&z_2U2I<)b3Cwjl>8&>ay=_;v=mxPhiVL*F%Q81ZYqLtt#j})It9{1RPpon zWV89Ssi4*f(FN+Q_c-zoyV~RQ6U*N`Fb|4;d+teITwGl5b>~;&;8f8#snVTaM0d1R zsF^+cOuwQ?xn9feyxfN2+lzR~Q2H&g)B&qi7%}C*?BBm3943->npKp#qCc?&g)o*&oAr>1!`ZJH+=hgYnX0ZV zJhjjMVS6AusxiWMG^7X#@MbNAySgdG$uE%L+gUfN-%B7aXSPlHpGrml2HRhdQ*a=Q0?b0teM9SUVIHk0ZOSQqu50JvGZllWXw*G*|FVDMh@_ z?{Zh_2lw!O`jtGb2F#EijRc-6a`8}gk*Ar+q?fkj{d>XVLf>P!zrUn^=HgFl1r|L_ zFfi-uyG=W6TfbWBFK?DyuWi>0wj$oZV4Zg3^D@}zhFQ{DRjkP>Aq*iu62pHK{LwXx zV*fr<>|Qw7FTo%nWVY~HNNVBDSO0oNpH-6cwWGJ*{^z@C62TT1O;cs_m~>ja3R&W= zTB9-cGP;r^9gFl3=Vd7(2ZPA>IUh=&?4;=C-8bG?I^jnT6Ywvj6Jf1PzzckbFJ7#(a-% zLcEOP$L};e10O3H1)zxZ7i>LvVVk40hV}x1(^aQ4k$cBYwN|MovBQ+^bRHZxB6<9& zAoFkOX>F)nnYMDE_}=HkS+fiUqI{ptG2HK1Tb8zW-D1Sq&oi|TT5p`kcPtjXax;lZ zKlz6AE!N!F#iJCyH4;-NC`!{NJjU5W+-Acj?yC-FriwD$@M|)dwTWd?@`$||a|6$s z*f%{1UK+ar%jI~)1NrSouVaT_A_Vdfgh-ZHAN9}DH20Uy0;bITe0A!YNd{)>u6yV1 z1f)`V>U#?k=zCiPKD<7o-0XdpSRg@pEnqILEs>dgEG(Qse1h?++<^O^ZCqB6X7ug) z*|>v!Fpa#)pK^y<`xwTTEqD%5+o^-(TI~6M3e&Y_cYlb{-iB=Z-vs})LK+*$i zg_=;2z9@1cyB7n|NtKJ=&q!IBs=)>rpYpGj(>@X}>kH`wd1|D+kx0m!`QkE)yVt0V z;m3McjQ)bD`CEsXXxR3uLN;+gj5;jAziP z#VFJHcKa9YxSxXS@9*DcXHjQlA_|Pq^m<BI(x5x0wAoV{ zCy6lgi?}z>kF#c4-eS1tIO=1Dj+!>#;vJs$w&n2E4;B^Ds)4P6BjW@QyDiTuGw`5~ z)7ayG6y}}f*y_k|4793#jEngPzOI)gn|wL_Vtj7N7XvW3MkV@fs|&o^SN*U;Q{7Nb zgAX^IBHFLmknl!AecFepf7ZC$L_{wv%n^BpE3r&)n|sL9GpBmV@vqvfpHKFXFoF40 zAjGVNbP~vm2l9zwg+_QGi9~nVi(o`%Z;7qr8koHqqX2Lsngyeorv1OmVxlI)B)rgUkez3Mz?{9yG@U{sT(@@I;^h}dz zI0XF^2JOQ>vsWhsdZS;5R@ip+%0pkyqnY&ST?{qnr(|iTr5g^@QJ&d^^q-jM=16Cx zSGJzd)2-eJT6{wOcU|UT61r$VRpO%J*QD$}*S0m5Kf3jHF5UZI0{BQEFaR_qkbf5v z4tmnIV?Mj3%s)DEe|a3))Z~rPZe@LKrqkqYyW{)`@iz6sKiTtDwdu8}pt`ek!wblS zy*eKZgXL*q-h&9r!pQ{NTLOPCrPY5RZb!z$ZB=45RbFUUly|5n#bH>LYa-B6LbRUi*=Bk&l?rI@z}-qSv@Vh zQoaKRgDGjs0iJChN8@4oK-cs);zm6l7U>7}BjUZ+`?OEiYM2WxV!RMNDdLMxXf5$u4R07=n3N4!- zSeWV?-Wf!oEl0Be-yKm(-oxQPxPf+b4E}BkEhx?XByz0jZVP@MIA~cGO)@ESpTtMKc1#(?+fGFmG+Z*A&r}> zE+0B))h3^zZL!yiz$rQ2tw(wDpnw|WbzN(F(J-Y2E6*_85aX$CJoG;M-7179Zz6s% zchc#2g9HbATT=SH1+4=Uv<{woLOAN6XE4FDc&y+3p}k7Zt@xbNJH`l_{+}*w&+epC zpov5O@P>ncW&w*_4t1o*F5;PA4LT=MQ#f02SQyse`HdcWJ2NgtK1HErY4 zxP@Rug2@xn{&ZPX^EnJb;}hj86h%oX48z1Wh?*0Lugm=c0gU(zoY=kW+-5HB^P9*G zbfR~rT;qHz5F~o&twm+8Zt9*VVXEsmaG7ccdT_B3$r$(-LR*M-i=M&wt~f%!JSB-J ziS8#;A;`jmgbgNjy2p$Wh0X;2ami(p!~R}UJCVv*&%J4zv-#!$n!_-ZbAA-mv1kws z%v63kq$zRv>&=Fo5qREUA#)Ffg}$I`DtQbp^iD&!$nb-R&QshJ^)FwfXh-KgAni%} zXHuVgTb=%RV;t)&I?1B^&{w!PM9AE&I9tEf$yBZss+8h1_|}K+#*v+T5ols|aS$OA z>$W@17qIdv7(3~83*Kd*62MNtE6Vo)jm8IMzwyL*+~MpSt&-CBc;LgXBs=rN1n)>! zUOMl4g(|;a?7yE2HaDk*F6l=)E>{;N+G21i5*KqDnCWO)B!-2`5zY9s?NS|d+axm< z>}kuiZkJeBZ8B{}l2`3;pE4WNdfLX@^asQm%QQZS4tb&0AHxSdSDkQ9yunvv7Mxtz zEfEj6IMgDiw-qdafFKO+F)59FMrCF;GoX(p+UGTO^-UAtn$+Q4IumFy z>75Wk=S}oh{f=O}x3fgz57jSVTSlvwZ)i2mV|kcM@dcLOFgVwRI`Fg@Y^US$1|_O( zYU<&;?Spmq@l7n1*kO@g3%T%O0H(-5EvAgp+4!H^gRc1FAiR=p0$!z<3`TQwEN0nj zOnf7yGG;s-(c-WBRsV#ZzKlSWrYCyhJ8;b~iaU>~EV_~GZKLQZ>Bnx0dP>UPZR7sf z!gZhj&Rx8``YY9KefO`0h7sx^hXZ1JW*MVxy|WzhIh5^Id7LTNGH;#7AoMa%xx!WI z+n46TH)&X=r@-NRmLcvX^2REGtdML}AE5yhcSJybSwf{WQoIUOgf#Y#! zeh&n4V)md*fHvw*9Qwa*9+X(dAkX?CLE z%{@OwDsSlDkp9ys$ZB5g!H0=ZB^D&%%anRNdfU1E4_WWai9Z6S- z;*SiNKN5Yf>f&y(wt1okS8aZO3P?b9X%{-@0xltvVtV@nS4VZN*23^|q-m+mKt}o( z;0+IUc`#DYCV25}L8d$8pTzYx)#xgD*J>gWqS67=#`v<55e8?C!dJx4E{JB0#qY(R zDJ97kLAAvC2KH~3PGVa6McEJU_vI9jSGA5YGV$iVNFaUVylwKXvZXn&Gp*EkfH|kc zF^+O=+t8el<1`g|h){UhQ*-{G)O5y^x67_J*&LfZWa>OX)mFn$x#ki@5w4@3z$PTx-k!Ky&vE?oX29`KRKN(gc+ZQ)D=7&{`aAWbpYL?B$g!rroF5U{ zKl~#@cIE?X*B5QvS4R!K_5y|Zgh{U|hhuA8Yov+}>t<+cxDBiuVcfCAp$1OH?z_bc zo{+NV*E)CqByv zsSQNhd5)A)`x)t)c=uK-l$db1KINP9ioVzT88@q&qO)BtzefY(Q%^)zjHT`dAK6dR z--7qVKRMWLAz*ey0b#f|(j^OTxD=2mT|IWDNVX?}BzbrDmo2wZrKia?DOGKU$A+Rq z8k$8IlT8WxbI-haH5`_>=gTv}mZYT;b`|iEyYTD@P%en+@=fIkci)buj(+A%`m%j4 z=RW+B|FYqvK)9z}ME1=@)~!UjK>*J_573k;n5>=2OQF{1q?J5&9#5^4 z&irzcGPVSTVNi}$K7XU<8#ACw4zDBpqRY`_UmVlN7^*KC$C%bJ-6ez!nd;SSoM!DR z7%@H3C8=%20E&^Njxh&hHdmRno_cT}_Fq)usFdZ_zDmO`xRoLd(5Z={)1FGu!vA}P z&8GT8Q#S)MSDmgo`aJod09ouM#_@zQjA=6@O2pPP3;n9nc>#kRUDpj!+)kR=pZhc& z!c zL-`}dx8`DrCC>niAABg_Ed}T>A>vPDpTsq*P5U6d@*W&p$0OVmzAh+Z z^*@~+-;W66Y?CGlU!X>xe{~?YcN$KAQ7olG(9UE934TX%FMp-aN=hIto%Fg{&)RZm zxCv~ifKr`J((z%hAVzI1HsHB*0y$q_xNhA~n!W4Ne%B(5T0HT*C2vC}Z41sqBAeWb zeiWq%X3jk_`>`iKUp`yZdLNclTYRJ~oR2rIUBko?;)LOKRwa#IsaR+qdAxzopAX38 z)_gaI$wlOuQOa(`THMu!Z;NZogp@pJ&NtaF#nM2d-kHsJ%FObhAhdJ?b;DcOZZR!N zlfJX^+^@;ynDZ2!^TY)E)#aKD6J%_&M7(CbWB;1Cp4Nim@3ytw7WvHdtX=yJ2$`FhM( z(D94z@Z@4QvRKeLZHmoW-%a(&Po`q|P?eojl`(d{msSmvi|$2eD#ao8+uVc4X?VI< zX@eMwc2umH40d+ctWrB&($7ZpRQx61%%@~da51&Wp!d7!A}oB%W7bHl3;wnwYNum% z(_2cSqw>9s2)rsLW6WYiYQO^}Xo!Oe8=XVh!py0kebNgQk>}-!B&F(ZPW8ymzJ%<@ z-zRj?V-2P}rF35B5Y4P+H8vTVs1|%hi494*_$|Vu{OX&8Kd4*!*1obrpUt}MiKN@f z0=eC($!NwuL|%FhR$Lg6W`>6%0-%p}hD%xd%H_mPZQM}Fdk;C^tspk|uiKb5IIAt! z8uo0lICQ?6B&!l@vx8quuS=26?3T>Os{95ip0PvqT7OVebXi;u$m{LOU3>4O5piE9 z9Y{V#n}W~7!>}ia7waU?Tgz~Po23HaR|sC&GX|(K*{G@+&{*0*;v>lPwo^Q_w8ToW zKd4M^pLT%v8~(XTFV9}H>W0}<8aVywg|9Ski~I;0!~AW0LB}c>ptD5UmGfl*bJ{G1kg@k$uw}VU%WRdcm}!@n;7~VU+qE^Yw9!yIx9L)F|B1k-DARFLap0+pbPF z9xvpK4eP^o9Zc^1%%F#pps!=MXt*+f!SgIS6Y5IgI2J5>I6eL3^PRF>6KUJdVg#p8 z+;TVzB%c__CRmMdO|7-gGQ<@675bWwbvt>{va5G7=6dDa^v^fOxO0)XHWElNLsQ=> z-VMahtUgS{uw$hIWt;^x%2sS~N~HJk$84PHEkh*hl?3_fW5GwJNyI-oH0A#xM+m-Z zvf)Ns-IYDLW~rf)$4litB9?yHn`O6>i`{`Yqa6=5;Noj%IwYomS5BI#O+Oc9y*43$ zbf23UviF-7Tfwr8_qA;0zZZTb0rpH&Xtdj-D)&~rOBeh*~M*i*epVg$E&# zL@7)>5Jxc3<^H#67+My(dopqxGbY^4`TJQXJzfzFOrE6DZ~i3s{Y)VcD1X&fZjQshiSN?y^ zWZgz5y9O|@bK5u~avLe*>oPHJqmcV#V5yeu)mPt6lLK|A?)d4{*BJ89-Q_R!9PSz> zaSJ~|b2C)9$BjxbeRA)zdHN-|-iOT)74~XQ@bnZDK<1(5QY_r`v{adE?2Is@9iD#d zQZp8yyJ6i1O_O&vHH!8bGNJ`pGXb+Wmg$t3-+Y0k%9Ll1rYK(cI@eUD&?fOov|POy zisP^IcI+PGgz;v7gt1j9P$HFc=vZ4P9g@P&9xtfgiu0zT=#flC`cI zzMl)-L{*kCP#V4mN&W_|?afUSqViv(26?17EIDa@uB2%xCn|g-LPK=?tY{n~$A3v) z&?9H43~H_8lJR(U*h8n(phVK98TsgM_dJ-A(xC`62$;#0d9k3`rbxM2dN=EM*VZ=^ zBH9mVI^sL-2BY`6hB^;MW7WYmrlUE>D+(r?6JvtiD=P#;W+HKzq}*8(_Tap>61`cT z3Sf!lvHl)mC7)&Wfx6x;2cx?3yja%A=Jt7O`OI>i_Ji$|Z^euQE#38QZ)Em&+{zZ* zT5A{qBgVj!c(tx4Y)afP>KpXXecjC!=?J65i`0YENKSNReY?oDW}P`_I(S@=Kh*Ba zN=JmRas44HSd%+^&dBJgb((b@YYm*P^rXnk&*KFZnjb!3jN4<6?>q~);KHPXAwP3Z zC+Z6?E_kjr7(8)*ksWsR`J)m>+DK`*+Zzj>Tc{Pcu<}@!TK3Bnwo%-wTAlJct&g&^ z`Fi7=AHsF3{NAg2y%gtb>@lM%43B$5_a_BMr7=E66alm2g-QPyq-msAWfrt3N2jf6 zW80*%?rtbrDo1YAM9@GsnQr~{QA@1RUKLP;w@a4cK~<~twr%hDxbWafP_5PPDbd6H zxDCbuB!7La8~!{%WzZRwqeNmy_ur0efq&IMD=OgK-QAi`0*Hqpm!n|Nln~o~r-%(2 zEdy9;2LksfSou-_p2Y@9{GiUCZCu6-5!@GxTH~SYZO^!<8g&;3EHkm37U@w5B)o{; zyT=GWKSL`pn|}SVEnN1qs*T;Sg5Q8Q)CXzFGAj#m=mw92G((>BK$PAK;8NskmvWVk zCy>l8B$Y|JSA%7f@j+#hzP|n=H5N-PVSmPm4h5?s!_s$0M||Tu*n;HP;T8o#T385H z-hFw*K~e2^j)dY(QHqh>@wvBClX+pnr&`F5KZnKFKkV1m1cbUSn!5+D&1=gq(~|Pn z){(6OIWqT-=lV4hi=tPjUP+Qpv6Tu>q*qN&CHohp)mkjLoZhMpR!R@K1)B{ESdJ&B z@q{HoWrz;s_rrIat{Qw|WXLe-DqUyXJ_?$QN#30;jr9pWsHWa@ID~)*2;79Hk= zQP}spXxbUqCxa|wx{$_l|=YJQ32T9s(w|EkMXwc4!!7|vN zz{Y`Tk@qnn(`2xJv_cuFYH;vhHK-%Biv{LL(8UZ0VH~pIeTA+auu8=_T>O&T7%XRS z%2aUDJd+yCL$I#fdWO0ub^oZR>v633SaDZ6X<49uZ3>#p)5|zDU zR=?8qhO%wh14heGCS8-7etbS}n|XshzMc>H<#{6sPxivr9OT$hj!oru3-}i5?|e=~VzR800C`wC<&!y(awFwrT~P`o46_ZoqCmK=36y~q|8g&}h+<>AO90rt(2 zE}@UV`u(fE(2~1R@PmmQbE%$SR&}5Rv+51RYSdrbU+@Dj_N;fCMc%%%7*f%}g!

  • w8HR%LZ0Z{mv6 ze4PEcBd)AR@JGnNB`Za$uEh;^m%fg@V=T?<71s*E(qxY}$$iAG<-7xlhVYpZ#0i?v zgsow|{q%71iGK)|@=IOT;ZJTWNC1qaEo|fvoFR&>NQ}xbdo5SMgF&SPTxXAsb`SHF zc^@77TD^FRe4AVnw!-_r-&QO5BJa+uG8Z?3D_TqD2fS(QzDMN1$$V737{Gl9{}@73Yp7ta znCqFkH@ivSENYm+xrlhAGZz2BZfMmnorFw6EHVkUj7u+_yQOR?fqqW2c47W<1$gN- zUAP$eVe37qaddE)NCiM86Cf~&p3nRJcrat1<4@_6En{a(*Z05Qq_q}>2c;P}O>d^A zL>jkqfiw3KWB}Sm2?{CuKV0Y?p&<+fP~cm7Qa97Ey|&lLySw_D_Aw0bV*@Y#h-(PQ0*uH50Ky1jx$`?O zr{!|;>o#23K(Wl9HZSSq#$Zt$v%UMsD1;|bS@*hGzoX6)=;@uxjfhm1fyTDR8d}1~ zHC6NjobHxh8iM`6FimoxN4onC6OqF7bzDbZEF%K&f8g6$pmh2l>xS2YzYKbAgY!D# zN^+jPBsN9>p3@`1=)ejV^XL`yoA2O$%K{q*gBKGc&iC^~b&j0(VMT>50Q71ht1P_} zLU6Pn(*tIQ9a+&K5_rc4h$rBn>2KEp*)nrspt5#2RzDXIVYft}lt2H2Y{$Q>#HXS< zm*N?X zbMzK)`p)m&?CKT0h6hNeD=MbyalEUY3M$l8$u^WglEdwNSU(Nn$AIL`1uPNYZ403G zsGkFWOQ~k4j z8vUG>-d!TG)pA6w2LkAkjlv19wyqoX-1uU---E%SK{agv>cao~YJ1mNY>EnfTZ5o< zD0p`i5UsVNv${zgaS~e>-LtL%%a_8y#`N{=3%pcl8k~Sv1#I|r*jjwdGT&!!0T0AO@!WHiZ8OZbM1!=1sYi*bIP4JL3-E}U;sJ|M+W5{ zoRTv#q>)$lx|wHIfYoU)@DTun-~WBr)V=(oe!eeu8=8D!&?huhpA`g5EMU_(#~c3Y z5@_C_K^atE|L@M^e!hhp81N1j`(ueesro;hVJPeK{vFb}JOAd)?^x|HPYk|is~weq z#rh19<^89;;7kA^=fd z45%ryox^qA4v+?}brtx2iKvd-~;Dgl$jxkRL=OcV- z6YmUF32EJud0B;9g5J-XV6FI{bvDbYJs~a27i%4(i@+s?60``I(8RY}E0cCzqf@b# zz@&u^9cb-I&0e)60ZA57gb!*}O$BXNp)+{?k^rxawR;RurTe8z<65AZmZT&M=ZMR6ODp;8b{oCRncgm;!AYE(-0C%_%;0=C#MWmjIEH3>;=Us=5gM+@Y3EX#DX2&&0p7 z8n;h@9_I(ij~KV05dm?BFyM(KFHUA0{^JrA0?t2Z>9mGYN`C;*qh~+b&)Yi`vo3oB z^b{o!IjZi*3T>|Bc{t*iX<9nbvxy_8{J}FWW|L=2%W+y)Y z#KTNL-|*2=_`0ahUjZcw03Ch&W&RJ+o9hhV%7y~wd;oA^fE6XqqHRqTe1XBh!FRS; zzW@L8!Sq9EvOoDrfd>HP-~)W2QLFAcS~*P32#|!MD1^Ne z8!;fc#{i_y0=y`Hv!gtmmH+!32Z>h>e!%xKYU1>PK$&0{mXF|a?HmkhpFIQM*irc1 zXztVi>=Fe2A~JhrE`Sh1DZ!(o+A;oGbj{lTnt(q`AI%hkf}&*tj8`Q4*M){^8}7me zU?hPG*w6l83`c>B6*~$r~^S*;8!dN9~b;M_MJEfKd?O> zKGMSnPawW^4EQ^No2sD)1f>>T|ACEt-tPnd$l$5;%v0CZ#?#00r30LU1>%zi1vDrp1r3N81cf=)9%H~JFea@URqgtcuL`Lw1W}M*CXV;JndXx zLOOnyF6;`fPEPhOUb6GLdA#tlcD?n)P*oX>W4s=x@DjYl-qnR&&))e3q-N>jW%<&N z{hpAJ7~StpFEEPze~a>ZY4rlK^YnC+6coH(+5cW;m@-9w3ncOgXtx*@UfvLw~`ucAQRQRvF zD=wD2tu+0&Rv`S%8@*`#+jIfY0x{D2XzwNjhYDFFl~@wx-3U8`pl)Rtr6Je3C7RFtDJ9k3gs~)J)H;C@(l&J)(buS<3YU ze!-*(kh+iyPO{-VrQfS;4%9FhHYO^N^yUrq_3_oZ=-s9(f>?3)bs?G1VU3NdIxw*o zEYK^^>A8Ic5!a1c?d!uW`)2a)~Cv zdSxapgdJMl(A9A5ouTqg8Yl!88MkIdb>wJDf2%Bk{aQMv%D2frJ(iH`2 z>(2!d=CJ*CtWCqURg=UY5c)nML|8`bZtYZL%Il`r+}Fz&eNtu;4@cdA+F|VNeZ7Wc zP1yPP$WtH{hkq;MlfTwABc+V26Erg-1kd8gAxAt%lPg7)lQoWmHjaxnE+fRfTaZ;n zgi%SFRz-qYx#Fop?Ng;%HS}cp`;2~v+E+#uuhia!`M0(iO+pAC2t5am+Q8tbSVza8 z@ZVXhfemFrXgcWB>qz=lA^UWCHxfyXix({-U z!_vWlaAR1jz^KBzgmdYf0ugc_9Mh^pwz}GHwST7YR2~RMS4gaVYtM73yu46$Sqmmh z87o176_)dNje$VZBnJ&4gz$$oRu&p>O*oileVVqU*K3!S5&JY+kqX37c5PgGbT8V1 z_D&)6L!Kj&=p4>8zcR;3e}AH@4C2jLCbq#E~&)k4U2CblfpOCI4gAijUvM+y|bTe{na$&n4-BwvkBX<=u~hx;Xw+T3a+aWg{XIBp5?GPG zX$J3&TGs!)>#ND;DGlUPAyQ?1FZMxmRbTF+0au1P7CS@By_u@MW7)qM8>R5f%9YF0 z;K#$APY`AZDz5D0ySb%=E zP;|(`>FvbH^z}dO&0RLEM8WZ+7ph zH>~<#iNerK(3NGN(?f4h9i8}py7n;bYi|;SVni%?AJH#~#E0YUJ-nHESK60rck(U9 z)#G^N=*X43;aj02BPrYch(7#4LzP(~KkdaUXvU;^Io|Yu{8(0uIC+Z$IQqs&~E+qInlhe*W_QmF_OA^vY}V zNj^JeEITlEX42VYaijoNTZi-dH+OMHFOlC~BBCVag_$qxL(cO^YJZ!R@vo#AnD=D} z^BFB%nZwZ8B3QuZgU!)A14=Io(Yx~O>@EhlO|$qYXp=lSH*(wXI5!{njOgazrX=Wj z?k@Zm(K4U`E$>?`{PGKAz-~(PFG{qjfyv?ct+8(&w>Q6vS_>zW>G&qt9 z$ZDK@_Uw_f-StjxBfuF7!cgJ)ThvOO&h<-)LDRdZt@tB5>wQIcYpdAP)HyTM-Py^Q zzW>+GbXY9U9@gAG3pt*2W?DY0oG#dAY>i?cJ(iuMJXu+N7w3DfBHQuf$LkNRfxopN zG}#aQn#rs#!KQfK>c%8VANPZDtj0=zntU8)d zbh|vY>rPI+)-hWU(F1{w?S>x^&dDX6|2?sByXt4lms|H+Ztgv9uXK!2v>LGatjJ7x z7#4u$%Q>X`DVPZx_39^gTm3yM%95ZAzuh<@kJt+FzeFS|wN}t(`Z$dytmWl|d)v)>2Y7iT z$YJ8Qk@=xo=dlRa-WT0o7qqyZ^z}IT3i^XQw+!KOw&Bch1Pa}kRkb$rsi;DLL`wrY zO-#~2=jZeQQR!d%BT6vgZ6UEUzk8}p#x89%;wB+Qf-?acSB{xc>NmrEr7dx5_I;SJ zI&IBqSy%F~@cpvP^Q_dGU^xsgbgq zV{Kk$QrWo}pRS<@{(XXaLuP+5NRk?7G?PSxk)-av#11d%!lxh}m&SFm>ETEj5iF#j zdXbizgMwY}-tF|)t7UouQIHe78s68{D1u-;Qf(52gnO1nF8qN1{K5F<${lKF;2uic zk#f7(@qzZq0-k1;aHW6app12U-MHc!zW9C0vA2EuDS}~)^-i1(JpX9zkli(!swfCS z=<|bOy_Sz)B0ZggP(?i^zzEC4nRO|C4s+Wq;8Ne+sErkS-w{%ir&4=Vp)zO;>G0{4 znf!sdJwQC@S$2V>U=6pXa%B*o@JG%A+=1kG@H&jaf@z@^lKf@Y%oUAp-~G_&{PHPH z-x4hKE527@7)%(SE9Q+Xe4JG4On1Lt zwbN$3gStG5>FUL}2(qLk4QZ->Vn_w~FBX`l4_bgB&5rhHJxPy)C$aZ&nZuC*K-o(r z)BMUz(1Zvcbl=Fvq3_QXl``!BzM0hErV@@6RrVZjSxa8#zi~({XqiO-E4Ud~-VvF4 zru&z?Gw%RStyq-uU$rgMtmLxrh;)KSCmTf|Tc1B7BcI@1@l+~sbCWv2DfmNV-4KQa zT6Hw$tTYQdn47Kws@O8_a`V^3mBD47R_QqECs&^Gy^Ld=0B>cv@yyL{zsM7mP5lBo z^So2ZZ>n5W#KS}Od5$)^mk+2q&83;-N;a7Ao*?YFr=}i9|NiC`xQC}@X=z!oUTb}P z3ig#poT;kj@Zb@s4orY6=YY(i{c)($cx@GXGHHb#zIUMkQrRP+5)2-?C#iq+dj5wu z9bLYTW1ToLYm7hH6r8CiQT6ig4IxLS%KeH?C9hxg_7+3rI9De?`UQ*=Bk>(wt5|KP zm!)%lsmQ8$U|TMuiq~!s*w$x|s#8I%k+92)(LP5PLE$YZ7rsviVG1XkLUkHZ29V4K z&zhS=e6;MrBWhfA;{u#NohbXv#D@hPrWLy+S5IqTF34_dfpxKOl%D5#5rNJ7rJ;iN z@CVR2VzEkAPZY|@Po!m8B!}~4lWcQ?7-1L9k_bnTa3tb9;=WO9cAdt)`PxeXwPPVS zDBM2GdllP5SKtk=I+4$ARG}fdruaD#HvB4 z@ush;y<~uPvqlX{%7tvOgMEPQ;X`08%!qo3_-xQ(yu?x(P3{r!3<^lkE6kS_3~uOf z{F;aDn5->Jci1uu*-Q-O9iGDdI*B3t>Z7l{cVF6}q@1bZ`X~rf_o%8#mxQsZ+7FDR zv~U+hL3&%1A6r~3;PVJ>0S7gV84*(4Lfxn8)E?vg4vq?d+DX=i++??Sv?Z83*ODHD zE_u2-&V;X$dumW6q7%4RwL_ZsedNtVnB-tA%;D_x`wvz|8hUjxyZ*0V#P+V?M|VG* z(aqCnFPZAm)e2&YdmPub-7)3?bPO+?8x#R#uW>tYfvGPLB7LAhT*Sh`N0LSNeStsC z-fWQTOii#+O>AhWyk#3-d%qwdomS&f33}%ECVno@^HkOn6X%fy1f3!Ryw;G z-C)JhpA&}Cr|6n4M~=}{FpoI_(B|~R*)sMy`B+gx2WU_?Q z7|)Nej_>$(LpKQ{VJjzJx^9KM{5kI+)`4T0lmV-WU!}R?L>jx#x>2s~9@QHij4-Vn zAx0|Q5iU--Z`4cT>2A1N2xe0FV){ocUmkwk_-o@y*&zxh|0YlQ=#lC0Yh#%C3MfcU zu}}(-LDkg#qA}jjvob%=Uv6%1E8I*~;-^&+p_B*Z4mYC`_%1>jT4Mjq#Hed^73;t6 zYpXvf|D&b*)bM4KIlZawAWtx|+cNN{!f8XPhBUDqOP>ek^70afB*VhwBWy!|5Mhv= zY)@Ht$7DjpAVpt3R5uld{WlNe&iH=xyvBF2>Zq`iE%0_Zt=l`9-qBI=^YfRg?{qY=7uVU}mI>$i1xFPb zRje+aF7*cNwZ@$;h4@U8goW2H$6j8X2)~O6IMzbhHzlgOMl}y6Q6%7nV2BZRz3l;F zaw4rG^w^bd{^yH0e$!46LExAZ2+|;zh!lob&O$6JZuDh(WM1ylw%8E!eSi9BGPYGS zrcfK`4=~%eR7$*Qafb9sqf2CKG(QZAJOoY0p%$Wkc3*-%fw!enZ`vntfxoYm0}ihr zLNg$oN{^oE({Ocj(X%Xujg8%*XI%I>H=tY^VDfbZ54ew8e+Ml4K2g>P3dtvf8NeBcgO*CjzRMGpz{#CKD`$zq9PIz ztpTT&Be@?^gv_;xB;440nfz*r0@~Pua@UPW_S&ylm;6pym}T9+2fuUTDK5XA>-*=C z^*zH<{@pMSTkJ5|-3?Z+aO@jIezLdUH8O>jEc_f;>+pI?>@>*tA&)jceOq zT!-4s_YQ5f9vcD+7b!_&FDwa_4CJFrM74Q6ZF}42CCFjzrs4Ub`-AAqJNrkrx`V1M7#H zhVLH=1vh=-y^}ShktRBVKV1FrzD(X)}UYAn~3m>Jp z$PyA=I>S$871Mi7-M(t+>mUDJZ#W|;ML*&tB*7vZNX6LPM|b9VrY6^}zQ%>Ip#;{t z%WdPv+N4adJ-^^@jNl$07gNObN|Qi`7Z=y5@O!C0bXb2yY)NJ)26l_Iv4qpVy zqJd+61rP^M!?zDpl*ThjRwml6>Jch~q8d8k@v!uYYmDcB1OdR>&_;z1+AsBGk(Ga=+AG+nNjvaUp|&D(9LKG&ck! zUO>mEbPaxf8fU2%f1_FqKZso$Z_a*x@<#6sl}nd;w~4*`U8UP2(JgBuj^;YE>TH)k z*jF>FB|Ux-gL12X!LdPJ1kb8|RF)AGCxvv1stngBcO9{@tT;w;{|9&^h5QK)Fh8%e z94VoSZ%An9E48U1&~Sa|=rHQZ(qx0pOPK$jkXk9S{5^hTb`Z{t?nPv)xz*2}K`PXk zuxzmy?N^(N{n`FJ?6(>rhVYK_kM@j*jV+F{*j(kl6C;tbus|OPxKa&&*DOT1iG&)j zZF*7n+_@tU&rj>x#Fh5(;uFg6We}e>RsRqnS;h>DYgc#&*R($2jd0_Qem2Jfuh-lBo7)__a(aMXv&CR0S9saSQCEQ!UJoa0x8$i#4; zRpgG3E_%GQQdG;t-KY`D8n8Q2R(0AUAw^n8djQN~ze&UjN`LkL`@H!PZ zK0am#I;f>Z=C2bam7ywkH$h>!UC>nJol$33VI#}QDkp6^ZFNIK%=)^%A4@1Has-Ax z2m3vC$bRDR_XY{Vi``@H%Kpp!!@Wm;kp%JrU_ zbiff77Ji$P)A{|6x`7Qp{t(ExF<-KHQjC~Dl)0DQh}^pc)qhFFlvm8}k18awXSlUv zyWIe&S|vzGAK6+sOT|UFtf5vL$3ywtfp!*@ zF{dreC}_moe+wu3en20Minbm#ArAF9(ZI$KyM4Wt zv!e|+%k!{3F@pE)IQunbd-BOfA;17%@E>WnSHV%wq_*~2)?60c_cfV@i|2OY9cmeY zcyu1zvQk@`WT=Oj#?ET;*SeRxd4(1MiZ?EzSaes>sz=YYx!QJojO6)+eP$FUP}Zl0 z+ZEY7|84Q6y0QE3A*|UC2@T1o*fI>eQ4KTf^c|kD?wplKW=&YZ_KcGtF;^n-+4T{E}0H;!)6uR?tf zLj3`{N0c-C%)yzP1o2Jp*G<_F5@c+?y}o{L_-P2%w3%Z|Yo+N-YF>J}BXA&FxnKB5 z+pSJyyGWd;5DmlFj z)NTO&&I>PzQ{?nLPSLWuIAN(XZ{{L1ogQ-%)Bd18HlO9*I-ZLcLV-GaLdSq(#$`nL z1S{l7Fzq*mv^EkJkekwBZ4oqVeGfmntMUZd6nj{EFJ>X%Iv!q_Gk`wZuSeTe6LO5W z8~dFztPrg=9RjaiQ3GLyeeS$19OL!(Uub^Oe7FjmBKzZ~9Ja|EeA)2Ak{D~1YVTs+ zNzDEH*uLdrsri}N?hI+i;eQ=8pgm*~1(Jt6oc;Cuts>j>`o&RJH&v2awD-6`q6zdkTf z@Y<1C8YAF8r#ecHc)FG3PHoAbB=dY*CkXseCA?q%X6QtlNGvF!A(kw+dV_(0b>rZu z`Dc3M-y;-;l0dW~R@im~*?PLPGtt#)1?{r2Wl2oNelLD%{sU_G4q~AXD$%$(!LaB5wBW!v2 z#|wx&R1!gdH}lvPKjp;{JS4Y(9ZP0W0PXEI_llIRbJ-a`h6IcB=Y!A@6Y*x?jHKWp zkm}9Un0nuwTB7P;OSTSZ|DxG5Ju)sxEM{#3+aWWt2CVpJ8C6b$s2goZ_+f4Lwk}v~ zytTl20B(nd{Eyx>_rR4S*+}V)%OiPZ)~WX$^mmUYG4GcJ(GTLW3bNqRQ@lc#se|0l zKfT=>e!b)C1sUlo6g(mS65Z@$g`;g0A&xGP!lfw>i z>#`T0Z{ySEr9KSiPR4sCdwr;d9;m--|3%)#kI`D#s}gtxpV;=wmiEH39m!r{yaN*< zLymzYa<7V;s%$bnVEbNK?Sv~AJGy&Ci1p%_s>|8VFjjIbG7_g)=av>K)lY)OgQ$Ae z1riJ77pLe8ZTG@j{GDsmwJaIA=IVRjotBnPC?uuD`PMEdLZ zqQ#ru4@~xX=3-k&Tf8~)t?S`LfnCnD(YP`m!8}Y@a-67e_j!$nh@4PaRdG9?QY0Du zX*W|sR8Ey@uI&-N6J4=$dhhndd?9a&Dt3Ukc>)~IMOl)?t}8_!w?iD5ofY4pA_!u( zkN_2^+_d1RtFU5iYMi{_kx4I|`=Rez$h?${*RByb$+X%~dG1e-7gop7DG<@ZTgeyFgb5sw!nEue^Ux4R zrVLsyoE<`Zh#+3(dnY+Dit*0nMcP*G9Fv-uq^6P#V>|Ity9wp(uL=!`B|e+-#rXn5W~xi2}8rf^z-yJUbJ5# zOYHTs+~&J$Fi#r{Ihzyt(emM8@5P^?gm<3jCgRGh)ZMF}PaYQ&8QuEafF$eF$X+fl zWx_m7`#4uYiiYLew>hbBFEP+4$%8($SZeS7zED)O%4psQ*W!GfuXGzHN?{t->+7z~ zNukojlhD@2e11W+Ib=dUNCtRf|zOACX7Le|{3j?p{-=0zL44xRX| zIt+dM1T;7r7AUBi31TP;oobHUmE$>AKffa&kYCC(6cmudo6tV?V9Ptn+qfBr%P4(5 zlz;n#c~%D_@<-=aoH0ICuLD$i2YUa?q1|-2nPlKFWq*wxuTt`d+^)@}6Zkc?kWq6!kCqOn%}Np%5_^RbZE{pgV|sm~m|Kr|Nx ztb};Tm!`w4-Tw6;b?}L8FzbU`wx7(Bx2_(i3vgr&HFYU|mb5mHLg4QQ$76AMh)*c) z`*cRZMQ}U3-%iR9Pds*zX%rzGg*92Ss4K!KN+P4%bM~-6NT-bY$Ck*$0`jYK&p(@FnB%{bpG=IE zYoE%unz>%bT8m!$MOS_Sfzq`g1T zomY(9GXTxdxVSjy&OEfb4{xF|wis99x@&Nqq#VbwT+gS4U!}DBcq`tL8l2zD@$lS$ zw;3O&i*OAa7tw%1N*}0(_XAk2amO1XA^b5E+Wy|u4i)}h@X9}w(8mHv5c16B1IBwL z61>8U2n9z9G{yB5@)8q2w?4A5t_e!Nfv(u5PEbzKJmt*VQIKY}vVqS#QkgZEzJ9de z+noULwH@nOytOSvotdS;Bp~=$Bv@m3gZWf5uYt7>buNw!Nv8@Y%|G(KD@gq2>D1~Z z6{vTd*vm%X=HR6K&+{tgqIs#9*>J$ zn2f1X!^6X8L`0sq{77$7PNzc;E@OFGJxNyQPTAT4(5F@1Hf{ZjWbZ^Js|HLHQ_9v5 zN>jm37!d*hyV(EkzI$p4a1N<77)tDexHDs)sn62R;pve=o9EVZ3)Hv^mYdjsT@fN8 zN3(HAi1xWtsZFG|3(@WWvNnk;oNf(J{R$a!p%x?$dcLbWJRB420eRl+GRS+#u1}hV1R#9-NhpFOf9i_wfJR zu3$yq0Yw)vF|mcOFMX`uO zs!oW|#N`Rg&B?Qac&yur>slRbW{7Yq6+Bux+Un{Cxmpbg=EC_1douB#Ig&N`#oN1I zVujynO=a1Vlap_JArj2Si4JPTaklEtjDK90&a&IExXr<=U~vaPJYWMRwO&lh;;!=d zQi?0zdF;&8ZBC349TpaeqjUBuT!!&`#!}Tds0q(psHz+-B0(9{I{l}&qa%MWkl->9 zG`$ABDb>8RfMl37*yZMzeY;`Aq@-uB9%GXE(q2{NT>ARqmtGk{ud8b~u#2@ThtJl+U~QS=H;mE&XJlb47R`4UF%X z&PRwKOzIUp`$?MVS(8hV%6Z>RT|Ya^Wyjgk(H>eizCCZIg;W0B2pV~+0II@2tu|}` zZ`KU@b7Hu>k9T0GuV1Y5Af|t9q29NSr@LdOCLn2BbVlay74X6z=A|3;=z!DGe+u9X zQshzaTB**hz|Gwxx9*nUfxpTuDXKlwMZwm=7~0DNxyOB$30RBX0ZGR@R0_7kH*nd= zf}f8b?Ap(ZTE%0TPP?ykeQCAeXN()$=bDRhhS!HG*3mhMPs)6R_0-{w<9^icsf!yY zbuu2?VRzz5UXdI#!=8Cmf9b{1t|A?d!0cAyqSp>2y!Yn9?-vVTwbzDV1)g zt+tJg>*h`?c8X5_akjlcvO?x5+b{t(9Q0FFFS&Noj?;yO2W)4&&p$oej)?#@d(GH! z?O@Uk%==ZaAQ{xnKBhYkZ0-TcD}|C5_Ee?()ISO8%Ol7WBd&=s34NO? zGzoMJe%%;XpNU$R3#waeDwF=5N8)Ead=R<(z%ufJHH?wx>xP`Qkssajt1x*mFJV6{&W z0yP{VO}m7&H~hAK^wM;(Q7@<_8(M;_*lj$StBXGbOJLU+X2XeFLalD%{xMMpJMhE) zf3h(WiW&6v`lk-HQRAhu7IV?|WX-vnlI3@@mFeW7U8u-0V(LRCoGJMCGWer#qo43n zkERcC^t$Nu$PME*+0uJ(|7IYKOjZRRc!)hu5O^|dh48H8A?p~G(PyafW#NJT5-vcUdMqQcZH~#_e6ZYvS>D$(xqwA+shRW_CX6}~Diuf6R*@B1`e_8wP0sRYXn0#PP!1c`iIcj1Ct_J5F1P zqg!9@yq8iAT|B!VS+LTZZQ#?(K@1~b=lV^w*&r0e+S=NBQo?I8AiQOgBVJ`{(ue16 z`u%;Mhzr)BHDP)A6S*3uga?OERX}88Qja)7Cet#-jvAB;TT8^A8VUdf`vDqg|Iv=w ziR|n}n&t_FvqAp;{?%3&nh_5zn-ZCrF+Y9y7!w|9|9)mxNi;upp?1Gu%To}5s3fIJ z_qQ^_#x&{c6|U;pV~ZvE?!&A7h#mIv@$+qs_nYN}Ll6oVVCIz@kH+Y-*d0j);m z(DcDr*KwzL*$Z|%p44kvrgy%S$|*MV{>=5WY3CIMrdZn|hmN`a;OzUXFtb&R3mL~x z=aXtL+qoY8^pfourJ~I}!Tcw@GkdPp7k(RG@8ZJj>67V9$kV^8Z`>GLT>ll(DWU_~ zBg)Fk+M9bS(zNySSt8g???5tdD&_MSMTFD}9s$K%;aE)4QyOzYzN?fJik~k-^N3M@ zbs8JE>^RGY0c`Ps=U^yMIkF4#-dVUqyy2BUMHGzwy2xSd!bCt#Z{Lx^LSRoVWWg2M zPmkrzJj#*>53JV)mF|4d>s{*au#_B}#Zbv=kA;sE3SQYxJcKNdA3uJZllAEvR$)Bp zGvB|qbE=~^n@Z%hsjdAJwl39gK2}(+~K9-w#8} zCu8g6q=`V+)J#wV1qH7y2hVrPoozQAG-xHGzRZV85}1ClvgIh#b$RQ8>%_nRQE0V= z-)_i>MLol%RJT}4bwzbqx=P=HV`7jr1(64T__@Y&!FD89zNU;|PJsuhHI+B6te9n& znW!rA3V{CrQ75lqyU$%k=WbmfC_?P{q-<8`HYtg>3v=HbdsV_W%DWzb)w%iY#PVo> z7Z(?oBH{e1@_Z86L0;!Fi`#viynhN0*?wPsyKoG@H6Y*C@kjy4>f}$GMA+H#QMm(8U5 zu0`CO^_!Ba^N%g?XAt!{AG55e5r24d{3W2VPXLEIBib}D1kZ_e3?S+n*nVEmuqh;D`Nkbb{_Su!9RjQP^(|soM)?9E3)hcd zbguj61HXp6nN(5Xho@ofUV7BM3w(&kdeRh6%_owJaVsknmW-j85uL`(kokvYiPyTu zwLE?maB8+~FJGhkK0!G=xT1{gfbOz$mz=*|vtxAk(Cf3pif8#7CYRCAIVCxF78zc% z6b6jtCD=1Qi_el4WQi8Smh0jAt=KHzb5|xuN<7j(h(VKLp)biaM6-WsA`@SQlb)IW zOTELd1eEEhPh}xH={Vo`8yjM{L5cdsn9BLbimvRUAmt0G7cEo%zT^0yRO7pceSVQp zN@4PsD_gRdcCGYbwtdrd&B?)MT zb4w}A@4TSi1c-#~h~~W=`7e=+OP)+y{{Z#SF81@!LEmdFs^~nd5z5h@wif!}Irpii z+XNJCBzaLhd6B$r23JI{M3NjID)=rq!!U-0Pgy$&Rc2q^^#F81OtdHlSr^>KT@d#SA86W`lqA;6%AT)VFO?^ohQ3?ER9{RiH@qws0im{d4FdbaI0gti0GbF=xbLz)&4N~@>!Wy3C55=j*HhJ3X_+?}eNL7H|prgB6J8_dt*^ zAtLt4+m(g9sCVY*7XhgZxdV>+75XVL7XhVFICoBiLI7j4nIS&~W8JURc%Ox8`k9cF ztf@+?c0cGU2;ILQJ6Ki&dJJ9+k~yync~wgT!1hu`Hj)RAIjD8+SNllXy3lVregaGD zp(1Fqno8I}!2pfkqxH=o5yrEhAG&`!!IA8=h zn7_o$Z*HQIL6SkBo1MFFTWex`@&ejNYF*i})Xzq~bpgOtG7H^0?&4kdORsFH5Yp6C zTX*k6egP8+HtUFL&aI}zIJyn@gH>tJPo^v{=S&?0%T_Tr&-0V&4O~egDwj+nE6bQ= zAnuQj6&oLOa@gG3lIL7$Q+|$;VzGBbr7qqz)I1-+rc#j^ZG1G~c;|a14LS$gMDFt$ zAK=U+`0|I&HZlZ=S#1CJfg5c=faz055So^TjeSBRE z8#O)4#Vp@zniS5)NzN0$jHSICd%_csl_Nx`DsE5xEDDiQ&_U8v^CKYz^U12;ZFArF z*)zMKBp=aYdqx{u+q+UyL>+I9SXo#ApXTQK^1ol7HC_7FP#qn4fN&XBPH%iHmc@8@ z7MO2v*Z3?|B|2M%1kOW~!b24uDw}~IDO!EPz7av8B7;`4ml2i+_9;HHGz$sYzw6XjD-DzSjXl?QzjhzHnJWgrt| zT<^~W6{A~r1UCz1wdyJ6w<5mxc+(Ro-yGI?LE*|K8BwG{R)5r2t*;OAuQ4kX_rr-t z#AHbp*1p(db`vg-$0`Uk#@&FB?zI~75`qLZV&mChP)NOH2i78q!m7i#N?rFxL}S4Y zO&^p~S?gm`I*={2Hj}lhBmu}#qGdT4ZgewV$oa(*<4M?)c;X}rK)l*N?H&UNaD6b> z<66N+-2BI&zu^vfKt?j;OoWm9f+1%Hffb~9h-+kfeAPLmb@%T)3kBVYI*(dotfuPb zUW2WT&HmK9>necrKZx}%+uwQxLOv}1ZM|(vFkgl`?R@>tes;z|$nr8QIxlfy;2R$s z?s>d8IX;P?UtjXd&8L2Nk?88Cf;TFf*O3(&*X5@RAN>HXaMv_oF0f@}i+_jffNaq{ z)s#O&Tvi|r@ii-wIhBp7pXO%F8ZL*Qnarr4C}rPdLS!1?9ssa0!BcClvMS=rp~F17 zMmPWMkR*?twJ&!JteT`_5ei0%hw25q#s$mmckQV#t~|`Kf2Sj_mE^n8enNLiQN6*4 zBMGW>kMe0I--BMZwb7OOpy?M6?7dxRYdmWD95d_9Ubq?wOGqe6zwS$){vP@vwRUh& zn3%bIE~hRnNy^rzU&~gRc@fFQ<-US1MoNY$6ry!Ai-NJeP8S$1nzdt39aKYAF#;q^ zzC~CLJ$bW|gFLP`Wyt!jxa>w6Vxk=(0yPOVQdyk-oQJ?Qj6YJkdqejMA-C_-$;#|$qX$_AY9V@@2ec3wrwmR)ymu30f?w6vHjYws{ib6`8VXCx>j+9$ig zBtL)w_xsr7R&)2lsCV@2GTpC%iT?(pBil`_HR&Cl+&<$~H++f7nB5YPGw;gtIsQ)~ zF->~lrY)2U(5ngq$;TC{z@r5mIzvB?{4D7&*5Z0mt~zU>%WhQkGjy^a2N_lgGgaC4=k z1dHS?=o>5sa;I5T@X0IXJHp1C>G`J}Kp6;YG#U1NDA$#D-IC)7r1T{0oRsWiJSIzD2a93?vG++AU${x1Ott;&H%QS zB)_Xu_8|Mk+M<7x{)&f@|Q;&cMcb!F%}xh~Vm^BZC?1500PY(NQ(QD%lm?>v3h(Tp7F!y%9BtF|A<7XuJ#C|umC>~jRs#>g6| zKvBr>Q$Q}ANoi_1{QXVB$AvIS_Jn)&ph1_^vR{qaOWq{9Tx9e?_uHZmYd+DyC6mHu zB=}o`dMG+y6Ivy{S#TfBS1yVr8Xw;r*?=#Q+Top3Vx;|egs}pI85E1O+XKR!1i>vt zz^`6%{vfAw2MB3*;Ivuj=qz|S<8$25%p_*f3BVUlVelQOo)K z+$)hmw6(QOrKqQjWK{hsYzL{w!KwMx+^ZF~1V#7mzv8PNd6xu%sNE#?tQ}z=FRqn` zo~&WR1Gfax{p-cL`ZSRbVQg&|T)wCRt>+twrub!@OOHl=qa%+{tLc~@E+6XlE{NE_ zCOoz&IeNXXGRY~_^m)89;*;FZoOHNGu7vx78~4}lsL%&kf7dg|FqD|5-dG`+yKj5! z6=%hV6$3I=zd%d?9AB`9#7i|EgfYY3LDZMn)i}Y3;YViCAbPv66Q3pf$Jxg7+!p%1grk z4}K!+1I|DeXTG74k(Ga^jy~Yg-W0FH@jee^EY$4R=;3%g;Jw>Ib+}rcq3zt!WBGFZ zA(dyNJu0s2E&9Hk7fmuzi2U0RLD|&~6=7#_g#P2L+2_8Ut&`ead2b4NZDfDa#F2hS znH)O-UaRSwe|xz&zQ?)e7w~9YB;bev!bY#KE~dI9yL9}nbuL0U;?wWe=%%8gL(ms> zD^=yUuazVa;~^V*c~MoGz*2a$ahMSyG1iP7`&jw;NbxwVPAW}(C2E@tnG(&`3vQGJ z%C3z#xZ6`)oB1lZei<{ICeid(S>es^iNT4&#JrDbACCTK3s&E@qw1+t@IxqsG7fcA z)B=+~_ZF?b^)fRu>UkIWSYW0us$~;skkM+($7DNx<%(4Mf)!90JIdGUxjlmCOC3Id zBmWZLFHFX(?MF~B>UM^kit>j&8Z9BJj@GPeG6(t2Sf_5SS zMc=@fVf`?QP?EbeaG%ZKO`^n&SQb7P&fE?SJeR)cJq-S7T3fK*hspiPtCJVk-Tz(E ztUtc?qfG@G4-JTeC|C99-wJ)T2xC{b9p3)Ww`Z?BQHm5tw~59CPzZ3dC4Tx z)=)30hN>6D+{dbf&n%`Csy2ci!0!9CdMGoqCVOXt1O7DabJ0rrOxfX!Q!)0XH3RP zP1xq7JT8L1oW`lWy7zxvfOZ?{m#SV%fl)_N{st?X4ZrXRzqj0UACerk{4+MZh!djy zR_f|M_lAACh=VyLJ9>I|5smJJ1%46J)crk5G>MdXHV@NlwYuN}29D+Cay1-4T5sZ7 zu7^0sRKH08G}31XlE}eT70=d0gta?PXnCHO7>{S7hIN-6wr5e`l5yU}A1#ZEI+m`} z$P~99hGeD4%8`?H7qzD1Bg{H&1a^v)fFmz&dDzZ;-CF1co1$3OdhYyV(56B~S6$`Y zPqoqyjpCjBG_Lfn`@KZVEHtJLBXWLXQ8+TtcjE_s_p=%IE)(~eqktZcsvGbpW*5mI zC2a6KD1<HY-XbB1AFuWT08D)DLmA5?2rxsU!8~ zn+w$7n(tACIGT2Ts-uIQHFz_%&j^=xzj8QA6jv2P={DslH?XiDQ7bN$;dF|<+OeKjGM{R1$T4H0H z9dB5Zn&R2m*zPL?SpPN$h~o7vxP*&K?E4Kf(}v>Cympz|!_TC_-7LhzD}*4bUgvh& z!-5bfJUnYORZT%(A9w#(JNNO7TD2tv0MXsH?e4yZ{fP4upSIYoEu!qivBg>8&Yl#q z02j(1GgLPHj3oT@^7U}K6Y0&GzHqq8_5dSpr4YFaZlNAMO|)(>{c_FOnIFObW9q$w z;rjpY@w-;95xon7h|Wu|DM)k@omCUP_qK~5MU9AVl^`NYM6ZkJf<*7DMQ8QCe%Jdm z-9#e`3L{x;fQAgoz}gO8E|zLfMo}pwno{!SwJH0JXn$V8v3?-sbaeSsWmyK*rRBJRJFZsYmfpQ6#bmau`Qpg zj)@!c{%XdrgIR;~-wD>GNUw?y0vYhBd!((vn*&!puwvGMGMA`~Y$F?y?)2`+Rv>n? z>v9;~ItkYxx*2>I%3N_QP1Qz>#>b=!I2jaWaJ^ ztD4)5>>K%ZAn>*6_hitPFwXZKndwgS{AOvHT5;UkW3cYUWEw6ll|AKzn^^XCywvy2+p zU+%`VZJfSq!o~Q-PWFx*F6%hkqW63j*lO6wf^wUdHV35NdX1p&Z#|xf{FcAfqyeso zCmgh2(+h2^7C*j$N8i7a_Ue1I>%93GT;bs$m&0}) zD*1kr5jXGl8j`2_ZUF4I?kRH(sQQ~BB>9$}yz2SuERpcMV0ZzhBsF`n-_34abY%`7 zAO#$l!Nxl17Pb||`?*D%`D>?UNrh9Fx#@Z^CyOyV^nzemoRvP+OD~F=Bt%O@J{CWe z`IHb@%tNBar+UB~UT1bDR^h3l z=K$I2&KgbL`n#K#1e)JID&6+x&+x=MURVFW9{w1*NFt@d|47f!Us`14&h&?0wd3w| zl+rlSBce76BJq|l{AjRO2NnUCqSrvv^W3e5Oh_H+|5om4)5VcETYDax$PB|Irf3%7 zLYSJ^YYK@4%jTA=@SAC1vdV!Tv|)43+WXxM_mW%OW)?^gZytHK5?*l476;v=GhGNq z09`?(kM3PKK)z+~a#t+7vdq0NH7zH8k+PNzrvuNH+3{?-BXxYe`bO8(0j2v;JyiBs3%23vzCw}9vfg1E0pSp+`I z8~exi0)>DJtb!HwBsOR6)g;&reqV4O)(Hh2ARe=ai$ObV-=Y3@-#fcG#SCyJ@`CDx zmZ4Qu0lM?VoM@E5#R#d*ZC1kFIC_`g#lr6dXssmY-PwmZW7O3@_@5`!nJcY9{*DN< zFAHP*b}y5nAR}cQlRuZ}DS|tI(Rz6@sKmgCuq7GJ;Im#65%>FIBajz-H1>h|?X6H^ z>y>^6M0Lt6;a3t+`ZTP*x+DTj)V`M$6N?4uQBX1p+O>a}!Bq19D1q8Aj>IRTi6AkL z`1b8>r}eP&S<}|`H2J9s`x+cA0F;`kff+md_w?^o#eIsOIXKccv zZN7PeF6GysAGCIEQZ^>PXD&!WMug2nFTVe=y@-Bf1$us7 ze53LDVD*hi?S(F~GL7GNZ$36(HU8oo4E&c~Ly8~b=MOy^S>xI|>6w3Z*Vh|sXlhz* z&T@eyunyRo06*mu*AfCt`%-~HL9sj>fkA&jM%1m4PQJK`Y5fgl4@o{r52FBUR2WH= z2E8OXQHa9T&L?V}(w@QSf&${DA5zpWeU#_%jEUek2fQ-}2c8L)trLj{YP#UOr32N~ z<&UBT#zD2hVPacACfH-ET?i!s?!O2z%hjZ3r2mCRCp5cMK;=8+<;7x`dEzb= zUh`77XA$hF^i03$!A2t#&!OY7u_53U%HrR!53fbc7b#ngchrFf zSvEanPt(v_OTp}AUtt9`n&(PAoo&HG=rPC+UjkRu2p+)MwDi!x>1EU5uB`vsoF70x z~k_No>re)yVH%IMgK0@54{)spHbW)DNb$aik0}CcW-XXGMr&OW6>z( zg334ka^x>{!Ttls)7)6uN49AX+gken?~JOz0il~Fpg;k=lKk%B0RW&k#;xgG=9W|h z)r6o3isEE@KEn1JfoeRrZAZ)XMA(kFaqYD+!Dzz!7ktA(Euh?77f!N1^AmWb zkgG$eS^6xNy_D7+p*mrAxK7Kg5J;aQcs|3lIk}%N<$uXiS5<+q0S$(e`!=aaq*J4S zY%%DXU{>%XjE-l1Bry|RYFcC6zfQY6R+gz-4b`~Ypg}*$nHKjSsnPnDSqDPm#RlgP zJD|G@Iy|3?JRkt%_~)%fpwUZ1Q?c5{xzngxu-lC0xZpb5vgcu8rWu5tED8Vyrp}mfDFM^ zPw9byvjsM5fdXD)d;^nfprJ8Ixn-UC{R&?nV`>XKt4|Et)E zK?w_x8P|J0aq@=T24b4qT9M~fHpZbyd%?9Hs}*B|Pyz*0h;Q_b**{POm&OzOb9->Q zpFg*tn>&0d{fnFO6ZAr=o(wqrSIzBGQDGE0={G@d_QTXKH`Izo-ag686n%bnnOMja zzg~$C82g$NSOlJTDv^AI@I%jFx610ToOsD#_7vN#MjmojTc=TY-dGAgIZ@S{lN?(9 zb$++f;(JNGRn6<=R3q2HHYlETX)BKP8GMMhO)F5kA;;R|!1*`C*YWO;D+qoVAu}F`|I->N&a`}FPQc)AGr0~ z_veie5PF;7(eP39`7#s?%V2iUM~3GS)D#0u#MM#L^XV<2%1T@lF?R ziXS$t$plo1pb^nNrttA^9(m!jCo-W|^z;5=liV6x=HI?qPn69~Hha-g|A(u678JWA zk9La=gKESJvziI`foCfRE4V==c$-TuymA~}1$PQ)YgA@F0{{cf>t}1puc~zK*W$ba zuW1j8;YKX9<3}h0pvE+7E5t%BRhfVz(VqP*X;>U9Qw3K%K48OsKr{{R$S4X?9LzGB z8x(%LI>8aH4DeEwR5hUhEt0Bn%w75mLBwlA+S0L$Q0$j=TTpZ+6Ud0qoM=^T^0K`( zLXR2`wA6!3KfQ4A@BIZKjblA>)C7nUguFR^#_~!-mB0ubEH?s9k>ll7O4&2HIWhT9 z@-8`(tJl_ok@zd;3C4Fh7Uj!JodE+NHQ0WHH!wKpTdD!Bg zMoo;R!zK#fSNx!YEmb|;iMjYqKIQvC6>HnFYYcG0`pKS#efzlQQ1MWc9@?cS)N<7R zyhx$GQfBf6U!<*QB_bpOTt%rq+}>2r%hm-sYDwEg?{&wX?B z8Mw0&jyb*_Z=Vh9cd6Sz{q|Pfp#F9K9lBq)UlwlQNOtWT3qj_ry?K`-l)mf71g(PP zY{+mVz9q4D2J_-T-#t|R?s|d0TpTtSavsdOkuCnQnCsC!r>L-~*wq3ma)N}eQ%466 zq7+&|>%doxUS3`-mli)5!Qis3@>a@wFAH*q!dkt^!g1u)%$AKx4M4?obp5$BKS)Fb z1WXzIZow)3_8ttW@@}B3Z&9%QDb1Dij*JAZ2ih;Ce6Q#?k5{$q&P%{Ov2~<)Kq6eC z2?9P3Nhp|)2F>al@&8;$aea=XA{n12ER1mG{_x^kcl9$`68{TNjEejT50wSuV3uO^ za(DbumOEuh&$sNe7_xxPlen>3fqO zI_Z_yhVo&ts%EYXsZJ^M+BZQmXm^l_B< z?**TFYFb)b|TC!Bo7n8O#M-W21{hIOl%y9n|IU~KWOq<*Ss``gudjZ z#%!pvMK}tMdRF=kI)xa#9Gm4xEx$!pEo2cWMDJ>e)z zVK}*U<%3=4mh#vX(LiTo3=%jmkVIOC$vOA&AfNI0$&MKj57f6H{|?BTVRseLd*4Jvr{}t zOg3tw_)aCk>Dw(kUa735_NDtx7n=|LuVW{IHErety3HqBZvq)D3|@`DW*PP&n{pl( zr?wAJM&h`kje)!C9B{YwnXWLxi*{q+v@zShxCC;17X40n zV2Yvh)O(Q86G ztBXoVUUk{1w(V`w`5W|gSy}GJ8_{Nln3x#$l>TxbT?2E_6LQPv;WYRDeSEtIz_y;K z7*o^tOLQ1nzl4r^u`@lsbBBa;e**4Q)ct;^@>qE;(+Y#erCoRO!Kpd15qYsW z`8o4B^HbT)<^c>_TH<+Ua(9X0*vsEoopKINF^+>vj+VX4kbtLB0G1ZfT9e_+-~Xs& ztUZ!M8@;{Z)mGWWf$pB0mxTT4w_C=+8=De4h=G@wg z$l#ddWSZ^q_)IyEyK944su(^Eaf|S#LX;B4MfTd_$&TsS(R9(|yaK)9r9-iq;BwCu zrH1y<8=+LJT*6j^|K7FVj~a=O$3obM6j^B#tg*gBXe9Q&$=nARglZlso7%&eZwR+f2^Sw-d01)@>EX6&0HJ z|0{mo-kWTTp@2f$Gj{9Ytqa|;OcNeE7uA+TJ00rh!3x1^oXDXCH{X+3g^TsavuE2~ zt{GN9==Exf#W_qB^%wd~Q4*r$zIr1&iFcOr{=VGdwwM1>I~6?}lAaZl=KkhlHnnme z*hA_Y8pw^$Y}}@Ac9tlH&@^Y?w4*0lPJHApdh)*%d<~x@@0c|5zEm7}c_VCidPF}b z-u>^J8y0*vZ^hQ}*h-I<%mz$i2{t1;VRLpW{D)ca^5Rxfip!?NHvOvt%m zp_$;fy)`Za0|QIH_NlCLusI{uTNCcbo5^z$Blwu)+wrZYtT;mb8PW$ZNNc*<>!D1A zi1M3u$&S}v9*9=DT5M8g^ZIGp4^3=q>(7Y(6rn|MP&y~zi%g+PR3bzkBSRFk5EK28 zG$k0t(PLa(>h=GW5kyDThFI?56r4D5!|P0V=yx5A;vO}6^bYCO1`>-~IxbF28;7rD zj^hZq`p@PW#DZSpIJL$3y-gF_ufl3OhQ~lV+tNks7X9ZqHpMX2LHWENc>k>~*VnW} zoi4zIw(kCnj(gw90ZJ-9czCYuD;I(@-mK{e>zZ*+jast^-AFd&wA={GLw*3*{TKJ# zDD)>P`I|89bo-q`!9*tu^17dCyj7+W-UMM6wUWPW|COFoWGXwUU15IL61|ikuYdx_AWCM)svs@RI8!b_ z@4Rna`OERK56D=WKHkz(f|H`Rgj$dKu)$jaYU^R}My|6_x38<5hv#xFr*nJDB|@PB zG-oBYIA9y9`gj1K7@OkMG`@bv()|tvGv)Wh1~Y00ZYkmhr$<|vrfW@bULKEJ^eJj9 z+Lb$OqH(j^EtUAT9A$6*gdM$`&J!0h-Ff%f5qX zb6}~LC!6u2{ei6K7&2Qz|74%ku4WVNLdWQ6;Xi&e5V?E^Rk22-r1QH+!nT7 zVNq8ch?`eW_~nI&9#u zSGe3fpRIJR+hvy_$0xyx@T}z|2t9J|&J{|LQ+(2`p=^%tANbVqn<4Ltu3!r1@Cu5$ zFQHIX9Ex%|9F4LwR!9xZ#@Gx*(D8R{H3(irK=7|a=?O6<^HyaS z(e-m|=4mQ3pY8GuN+Pp(zbW-S47{(CP&Vx#FY1i_{!v;g4*AbBV8ts~Hacu8Z(+}7 zcrRaZ-Da3AN0A=obJ_OYPeZPR8u+&MqBg%Fv}I%mo#i*L9Q4+0mn0I$;_QlqmsZ^> zC{G6BOIWP6K13bX}=T9mPve~WN8St}{ zH?xy7w_zFLLMG`J64k~&(r}t)|0)olM>{(ZJ(0HVEpxWvRK8o27X1_NZlEO;VHvof z`0I|?RTj9}FI*3ntMsSdeIB$0^PR>HII;-;%QfO}s}UelOXC&_(@*dtfcnSe>hR_m z@v5vHQuUxL6}TZ}c&wT^I>j$KUXO9-thIsh6wKYq3dn`A59*1BbowoGd#53mOlL~t zJ3iO-6j3-KKCO2F`&#ImDujv+|F*XLS9OFC!H2F&$L2>Z2**+|z=cvnmGmy59&5p; zgKm1Wp^lSr+L{?t@anCF*~408@IAVXq-JKC@3q|h3M$>O^+S;-mDSZ@wex`_S-bYg z<28_17#v)j{IQ&xk#-34^>G$_gT%CZ*gTj_Xq9(2|6W?U^zZi&W}{lWqO!7b>p_$q zA2qT6(N#Y9_c&cnbN>7r=bjHfjGYq~0Wjyc+uSkb5AUxV%H#l+j#Q-fhR))Q!{X|| zuo{tkY}~qbK2j{&rNfup@z9hw-M9@l7*s}rf3qrfkDeX9cc@y^+bV^Lm$*J*jE(vX zZ}G0^mRs=(pkC*3Zsd|b`+(pEEKuIH6P;S|uwH8=tPQb8w_{LIFvv$HpDhm3P;Tt_T7L!&kxb_|G6 zIDy~Zd}plXNu%y>HTxL}R{0zHu5Pw%I$T4;y~V5;v8?Au_*W@7r@J)+_i_nD0YZc0 z%lOLiORKo|NR<@3=&LhvCVa|+b})$@OJt|sDQY4BzxRN$s(_u>MwlHR&$_iCI~v?zoSmHs5BhAr^l#NDUT&)t zIwVMgX7r_#of*!0&+N3c&Ywfei?5mgpB6yw!})ony@?$bMuq6@uKc7)OnnidP-cEf z4I1NV$5n*cTI`JdS7td=)1SBMtyz6Bt#w;GSXFOySXxYn_yf>eTmy#nHTKkf*;`Y* z!3(~2S`cQ{4%&h{IZ;JgO2Z)Ar}S6KgUcdO&+B6z<>uhDkYfJ~PAcUp(&tEzlMdBX_CeZR&uJHnVg?~Qahoqq{uRyQFHAz>g2O>knRJaMiu$t4A^XeM@^)gUkHv0OM+fXc)KF8U@`4(ovcj)NN>I3b*%0e3N^;f!Ioe{|$9{o&B zcRmlRA4(l!JLj2s>dpI#UlXhRKs_Rim(N|EuGV$_m+4+pyKP4#rz$ZIeLymrf% zTr?zbM?d&#f6S`n6p*_FX*vDu< zxBB}oX%E2mnLJ~3V&k~M$lRRFU{IalOor`nw{eg3SWC&klbK*`P(HjUJD4%HE49ub zViYMemvYGW_VojG0)t0<`-&oDbk+d&Bi34k<-qh13lLJ8%6=pQ#5 zba(y3AD@^&2XYU`hrg?12M~9-h=wh3;F?n^Hl#^O`pTxKYu^+%CwK*@iNRyA%{Pe2 z$*E+T;q)Vl4PXsek(?(LmS-=nH+L_MV6zKReTR4~)Ffc$mm@O^oeI21CD=X`NTm+ZdzPx7&u)@y^3>8>K zOryhDzq~_W)olUzOwIn5A~tpuEi`g+LQ5Rk-V&xr6(@3^jQ~qZn!RQ1<3n?;j3im( zSz&_>6izwsGM(v5`&($PE?eJhDp>$dYS&AWTmaYJT3~Y=rz)-RJTpb>wAw}QuRVZ} zUb~hQy(dK;Hz4#CJtT#!9Q+!Xvr73zFfmJaO0&|TZD9fYDX1>uO+FF|<2E<@1eO|s z*dK{4>U#XN`wv^M%$v>%%2m+X0mL`&8rW#m@ZmPbR;F+7=DdDFC|kA0`}w{9;vo!W zXmPbU44as3@F774AE1{^LC|r27*B56jE`1ix+fd`p7pIPpx*zX6(7xJSA3YyhNXY4 zg^U%jX}DOJoF#-tU*p{H4zY;otvQ$i;Lh}@=r>xCqSl4rI50#Tww?6gH%*AQ5A`uD zf%7r|sl2{5+}ySLj3te3!pGxu*WB5~jZgV~udDM6`IZoBogiVB=h>1xvD^RBxutE4wH?&6Ohv zG<}LE1K-7>0u_vq;Uq{kQd=N@Ftg!}Nm4wgJ9F-NdB7U9jl4S^VJ4wB*K#by)dMA)+q$HK1i(^?Bc(s`nvTG= zZ%h#nu67*m%a=?X$83yPmU?5Dr)`p!12hEJMx0P_8CQ!QDoEf%K58W@ebsf#nQ|sC zcq}#|CM62z@{)f(B!4OwdOp*7Hyo}e`gX*Hdq*rXD?H$SxB|wk`1=cODAp72 zLDleQft0?pO~aNb5;|74Z%85YhPSSMXUU8dGFdV{j+2dCvxnIk{o^JltN zC_HW9#fy@0j3IUmP8Jz{?hrQ1GdnDsCBc{M2*%yYVd$9Ud)E#FG-?ZVKLp@b8gjuj zOCAu&Nh9ymgbAAWwUJZ0a}d(XMO9b7{9abtg%5N-qI{`9BkZC*sX{1GZNf4#GSYiM z?;rPZrP4Y}O+pO)_lEfy9H z-jrbPE%0AxnL&yFW^d8yl~eZRQ&Uq@|K;Dg+~+nxwm-P6egEqiw#p}1e29Qcs)G%U zL(?BMHS9t(C)* z-?fsGlB|T7Xge#%Z;_GU+j~MkG8{dF_2sy2xAL-u`Rf=0L4_-kSjr1RYt}nMG^71= z2dNnuk}X_mYb7eg2q9&~!xXaYthA&vgVoW3Tn+K3pEg(SPDiKf&Bbm0!i7`~eermZ z(*L;miHx+!yZxA`BmE7Fr?zns-4S1sJI?TkxB3PJ{6Uwp) z0H_5u)8R_~;AOfN29n^083)rD)30MEL{~oS!W@{P)k7mAsrS9_dSlF+f~-Hvi4GGY z9v_lOHG*ih>!|Cd?SZDk{vV6qMtrCQ)7B-y083X z(tmq^cc&t=fVU^s5G;Yx5i|t<{yXqu(5{qX!kPeVn)|8yzfp$Z-SeT>|MvRE9!^dg z4Vmo;CoD@z`T6oP*Cy`A9at4TW&-#Hga#pJ2Ga+iccL>miY}JkX5Cwsm!S6W1n(+Y z&gXka1iZkcW8a2H=YgSKzasJ72yS}4^Sa5QzywvJIGkMCf&YMSc+YUMMV0sryCCIb zjx=H;V7l&=1N@pU!4^e#-DqcQUtM@DbJV1fye4dZTvB{vZ8?75QT;x=Iil(aEV2H~ zyB?O2Ut}IhL4sw-%eL~s0Ehp^7&k;4Jcn`r4zW(T8Dl3nVgnxss{(&(r1OZ9l6bTk zCWPNDAO2lc=Y%C=a&+<+TR+L*UaJTf4GiJ2OalP+XZq;r4_NTN(+@-1qfMj;JW8?K z_v)P&InLQgFg}Kj$%%E?6iYd&$K!y1UZ)VrdPIaMv3wZLg{RHHt~?}w%d8}b?C^GC zjC|AvuYCdp_XdeY?e7zP>Zf_8^05mC94ehKNd;cv+d)eRo1>;)ha)0YgwJ2l_KAiF z*pRXXyT98VK2hk_oL~Wi0&-}?;B6JuIP&$Ir*imR;c|22q4j3uzyIMrUlsjiFY+sZ z_)LRuX$^!GAAY`GYIXitJhQXZ6}zbLKyKaEm{u!mK>Pte4*{xG+S-?#pXDEbuKi0J zytL2r=e;q@hj7Irty)fv1FGjsKdqa2Q{* zvY>eI@T_OLkcF`GbLalPD+Q$jv;Cqy&1WfsFlr@{^^gk+{?w)VY64hGPtM-WO4H3@ zk4T^@$OKqBJI~(Cep2h;>P@X&bTh5M{94wwvmibjaYAnQYQzwP@g?_F#LK~(s+#KH z3r`kQWj;Yre-D@3G`ssb+tGlS7)YRQHWN9W>1fty|!%cr|Hn+P%l~-wzI) zUzPFHu_U*kuD1@GzhiW#rQI?Nqt`l2+a9I{d&6q z*S&mecFuHhhbRPmvBi}i&j2OavtLSWz0zmxB(MSR+94nF;H%!TIq#0JLaL6^2w@6z zC*@C1_6;3;pvV2V)!i0iV`I~`93w>*AS-aTb;!ZHM|U>!IdW<$Ks;lr4A)m(W;k9? zMUOXtdz%NXu4II7PB~EU>8J$QrB-^JO{7Mw#b7np6Y$tk9rwkA&!QCh`=<_~ce_A( z1bow7(*$8H^ge!P6!f@5 z7hA`FV8`9pU(GYhF0NH^+C+q840`B5_G?k(A~>5!L^(AHC(@)k`@8^UTI*^RL_ufQ zfP5jC^2bq=LjQO|^>@GWmkvhYO3I~;hZX+UKL$sk==bm6?$2QI?E3D{@!{!oZ5D&^ z_*ZLd@iDVg_jMVE*DP88J!>t#Wi-DYjgwmkbM5vqH>%L( zRT)Zgndt&42=-Q5^eQ`-Gjd(eUywc=XGEK=iXLLYM7`dvI?;*~KL8h#-Qsr{8QEYt zjb=Oluqu4uh9(CwGTX+_&}!JR;q~TEcwu;pPB+zb6$`=GbDFTkJNTm@95Ms9aD5(a zyN?@v$??7;0tD%CY_bX()ryT(P5wsvBLA^8yhDI!M;lP{fpu5%Gb@I2yliawb5To7 z!Fgs1yn6LYw|IMjIJ9Zu2%@C-yiHbm46@+vAWDe;n&yJJsl_b1|M5ZDT6+yYC`sNv z3j8YBWjXVi&kv_OwAlH8sHx~#etz2Y~at!&kaO8WW&!QQL+FIK@* zwW7ZMoyilkDu|_k z-QVAO){7olt3G?dmnIOE04&1f-Z z2Sh%gcclY@{abG`BKDQQiF%vB4tnmLGh|1>QUv>x$r$!2g0{V7>3)cWy#;@Nz;E0< z#(A@U@I7tV)kt{tECrD$Nl0c-2CtK2z{iU@H(~w^3EqnEoUapGy_;VOf)(QT_dRaT zLx~$gmt|O`{pJa7Qd2^I>d_7ton$bR{=x$i%RWE9@7>^nNVJUd3#d}|>RI#j|F^M* zQH5Vc7q2#XuI9Vb3~+gx)0vuPOis>{MwHLBXsk<-_pOS82<%%jUsqR`PRW?c-Crze zieQdEaMcZZFA-3cVkn|}5H`#gzx%%ZQ0`N|9h9BT8G}qsot=1%btqeZDr~5%jvKH^ z-J!Q1pr`upDV~>_{9>HxNbbY$vE9SJb4{Nl0ZI)(iX}Qja-=k2V#C`V ztbsH%H(;#ular{vEE=%3xb(X(9_lT*LO^3WIX&I}ykf|MIp)7E;c@3YX^AV*)m2Z1 zPHUoOXD7|8ThO*}3u0$i@}iSi*8#NA``3zQ?`C#fZcNSa5;&J7*7n%W;$vfDj~sbi z;JQWjIOpPFkAlh=W>^icm@?`z4buoSUKeSI|Q=F=^~8Qe%$=?CzRx4 zF#i>ut5<*URXbHN_&$O~a4;|BP<{~dm$$5wKO@R4y>iS^^KvTwf#b29HnitK z8_Z^SzYQ44eCQ}CaAwFyGcfRFGcGYJ_fsu6;m##n1!P z{qWZ^thKeZmQ$Z^t^*tq@otjO6zrV4yA-Tpufv=oUZ?EFxHcE@L_T^BEGZt~UC*8XUyc@N$y z*e^AL5rE6otnuW*ExTB4LN-$BP-QaGL*O^PWbf%I>I6<4*sl%%jT+7`Cdr12?*|#V zZfCDOb;IsK&OQXtpf`L?Ky2!nnlUrSxashKWqnIu5Sdxz8BHFO*x;$4L53(^)WkQU zF%tuLS=K6A()&=ot22|6N(xBTdob!%u`ebJu@8!qo_@w<4Hu;7CugI6@_-&aIrXZ* zSt6q@Ky2=CrqOSYoCSDu!bXMrb>?FW6BHQJPE}fPd$dR4+#mjWUj)?u(Gs(-wC~^Y zrX+NH%EHs!#OzfwTROOvU>=W=m|CElat{&qr>TQ|+doQo! zB<=Ag4eMa0K~d)ye5G1&h8leifuWGkx(Cj`3IL$~V29H5|2q+%KdgVqb58`0A&b6OMIqMm zLVRm~T=d5Eht}|rgn_J2P-`KYtHghwSHB-Aib|(F)k#04ZcmPVl9o;DwL5A-Kk6+n!Ob@TKD(SEtrgQ*SWPw&>M z*~$MC!o9bU@ux@?;s9dOk*PQsGrE!zKd?HDt54tTLNQaT z0Yd%X9OyI@qNi_6rmB3nEDC-M-UV#WtBx(Y0HyArzgO2B!`)#DRNQBji0qTByY8uQ z!f9{j848oH{CSq`C&dI(0QwhwN9jy0W(0iWR;T)&&Fj~y4@T_8D_b}#!L?O)b6C7b z#Zm*XAG09pYM(j?qZT;TmNcPNe85`V!r6;aj(3~f6P@x zYrAsod0v6c`|Tk**Y-#1th(aTlMYO=aNaV3(MiBI{(rPMMJN5|LsZsUg2>bk#Jyp)wD?$aL;Db zkLRX4k}3jnw)f;WxX5?AJG34?e0bZ~TADs~%H08lbY_L+%+~8+%_JBld;mOe+uC&S za%K>%9G~q>U%4A*u3bZK%oO75>(6zM@)MWZvisifYG2&PrPR~f(Oy^1e(Er)9hmU( zQr1y@N8hTIR^u4W7X!&z>AXJh-#Q3Iy12ULOl%b&JXrhO#{N`CsgLMd>D0;g?%>0X zmQ=}j20VXdHg9D}f(#*MO599?x7H~J9T z??i4)UD`al!kWnkj5I>upof5}LX)72S!8&qzbj;v2(6>ETm2xlqMnB0Ec0 zG6Kq8pamnE=qnICom};g0;-o|)U^7TlKjaxOUuf>9TY(P@AKv;5~0N*k?lcxI_&-T zW0RP<=)29xiBqQpeYnc1>)TTI^Ms!d`;In80 za?>g4E-kOYSGt1ORKImEiod_FiTcPwr*W>!)U7pAJw>Sfu*vEI9o7tWPi?^wE??)= zb$ZUmqfRj|sgBZcaA@2%_eawHu_A$98#bA;jC`;<-o$8sAHmV^T@)98| z#5;k9c*~eq$+|eZxmg7TG0nLeVn*`6%z$zUMmDg+#@xLxg#G&m-1-5X&5Br!udFUEKRW|$1g_Hg7OeZo246A%vTZ>w^7c1CD@j};y z!zl3vOG`CDG$U1$zZl(<@-&Jbn{27fIU=l7j>#G&&}|$2WGB6t6?$|)*L+cUuJc+S z(rkOv1Y5E3Zmn19{GgGekTB**Evz&ix)@YrCXdnE9^<1Y@88&&Jd9 z?y(73ryfI%U80rU8@w_bE$UPvKGfyH<5oq~^abDUT=R$OV;^T1mpE~DkeBMpPz<7q z?V>j@9QiFwWEtoX;PDSs%GCcSszOf4QV4D~C8*9vA_flYA|xL@`n$?j>#@57G1~<*w*9b&9Pt~)4&ds;$Wh43hRlKzn+y490* z=OF}2*))8+S_r$&W`K9?e*QcGW@zoOqwF<{dS!$LvJi64`!e(2umg@%l$N$|t{Eq*W;TZCDK@0?!Y75;;LjfhyP~`JEx@arp1Gz29{4`NW?) zel&lzRXpCVhfx4a1k*Rn?-;9@9aICRh`x3yINoyR4gbj>+}BJR>8Tq*D3FvIY|`oX z_49QT<>>HeX1@MJ*Y9Z|26?UGPN!@!$OE7Ufy)z=Ff4NAy!C zauhZ9%jxMIb=16mdYw&~x^bVW+!QQ>;ZRnd)*siEhlQzX9n@o3BdW4=K4XhO9_D$0 zs8*&_7-*xgva`cugCBrhF$o(x`g=PIj!u_q(GLK%YmthLfZVT`7OQhH;5mNb%6-lW z#*n5k3MjVok;fMyY(ahA>)c4aXkM9$;bJv%(P_3M9v@o^e`9I30ufY-j3)HoK`28V zm(J+FVw+D0L_b~CMxY=F7O(3c{_V>>iWQ_8O8FMY|M1yU)}?;#f+wk5D}P4r%cq2jkCX2G)|Z&uYOUeBg)_>?OOO&YK4x?017T)Nr5ZqdHE0eUoXQLyRb7-0 zK-y{PBkr+?vKO$8QgxU)V3Mi`)mKL|YMJuLtvV%Sr4yKd06i^7T|jAD4C}+lk)j^iS8sj@yzX zQ6<&+Y|$z-9OU|*v{K$~w+i|V161X<|4$3xhCstfnD@*$*46@9`De!I3kMn2Nnzp` zZxESMozcC28e^9Vm5<|H?~Z89oG9Y2GN2r`4pYtWB%nWb7*40$uFGFt^)?(YY|xb< zE$7>NhW=XkPsDPdm4qD^;+g(lvRLTv=(|PZb-&-C&2mvS;&vl{2emE=>`B_xQOxuY zFi|qho6=(rS+OHKYBwLtuBsK38U@ZF&s3AjF7O!Su=FVWKlI7;9pIRO)c;xl*!QB> zLMku~WHX-QSbVnS2#T%L<#x?@7L?`>zFoSa#DS;B6g!tYHD#=!p@rTYdsyeO9Hopg z|I?ugoTlj!00(zJYv@_0&!s#BOVer^KORd@>r=y<4J8<|a`^8rIUm>Dq};)mgVDvm zB8KBq4zLhu>Fl*V4H6plA8n$wN`T zHPPdUK2D#yAC=wvv`K{p{D!`rkM7|-Ex|^*ZiPTt;_GZY z>qA@j;CN4ExkjOHd{?E&K@YBROniL4*-{dJWQ4${*v-EkkCaW!7G7w`CmPR_>(^A5 zCO$qlyA25H7_}w2eG?!)^!km?F0XK`XO{$0rTlB9u>`XS3Qo6Vb;su6WIfSULz+*fYeEm)S>=JyYG z)6s7C+5bWj({Y0xeZ)Lfix9oBnHX0U1!<2X<)a2l{q1hA<^Y+J5XyU)x<=?aG zgZFfg7Jjk8zaGxkcO=Cck_;&v^3R8^2~^EAUYa0=|95laz!796iMWh$4f;AfPxN1_ zIiJer$3&-?P$5uDanpD+r!&c|Xt*g(X8E+3u%+=CQQf-UVE(pyhsV2Ob!A?;HTS0e z5Nc_ko4mQ2Ov_Dul59!DR-om;7~)F+sf2{2&eF&{_W@0Bipl3x5t>VZELPr-Ob(VP z8TrGz<)5zHdPyuT#0|KIi+u8stwS~gu!?A*X)5OurFfm_>Kvgn+CYtCJmMZE97LTZ z%33g{`Ma`(gLXsZBY8~{+Y}qwiY#W&IH+VQ(J(AzOf1XT`krIb1G}^r5};$`&Fkz? z+P&r**QJX)4~j+JtB^CYqyuOWIC!LdrdztK>f&quLPl=F3wc%a;o||)TVhO-gT$FFqnQd0N>Utdyz1-b{h)W zznaj$N~!S^$5K`s?!%)E0w|DnY-H}yR%VaC2Wfz z18<#D_1cYYURy>SqNL=;@e~-|@XZ_gRz)q{9jriCHo#4v4Y`sw60!EqOSG{E&+A-^ z60&NvcKX9W%7JIbPlBU&vvD3kr~ZE@7@z+u?GZ$M6AVX~ftev9sUH*x=9%$*@G2`p zGhtW~cP5Dyn=L5jTrL90ZEF!r+4iM=vK28wrWU0k+Dpm?ELwazsBy;Yk}_IZNtI>Jt_YBal_=)lycEbr0lwSo08~oH<(kC zNss#`kSn5f7@p|5S=lCNM-rY5Llt`nb(jC%B zcXz`8GjO)wIp+s>T>^W*`+c5uueG|9#9K+6a$wk+YcNnS19{q&+IYAAKumDfidu`h z8&NEL5pz$vT|(v%28vrY2GBJ=U7%@-Fkws97c@JJAId`e6wzeqgX*j0%RzvaW#7oj zJ15nyyUu-)dA#TDJ8SQ$qN-N3=?JSt3)=dme$zY*u_t}`1pyZJs0T-Ld zWNX8w3@jQKwK{A#gNh(w9vLRN@1gCvnM+C|VMV6SB|+@O=Y`+gBU5d9g0?OYCFX{) zXg5%p5v5}Wu{G$3w;l!TM-hJi+pq*~&?J6Ja|d+bPnUb);_IzVZ@95SjZ?V^t&;4* z3Rnw9i-D)y*+Y8~VKrqYiz}AcnVu)4%P84vA= zcCD$;l_gUtD>t_fm}hu$w!6b+d5BOxGt7tnVg!rAe5KY(n_D9;H`*AiWEV>Tn7{&{ zvw_v7%#X!*kFE{n9-V!Ds^$D)?`TipDK0Cwnfzj3isbw~%Hx*~%Qo~uJ}TQ3#uU<- z-8d~-E{zZR4V`B72LJw2b^_3-P0dXRFv39XbU^iwTz0?g;!y(5p32l_Bl|ONxVs_&3TdkrbL*9AO z$(W)^G#d7MR7SY9(p*M=qX5=~A{=Pb;vecVXIg^dw3ZvXM6lSsufA|;Seul# zQJ0h?YVIo-`OA272lRN}owS23&$X=zkT_?* z^Nx)_eoC_=^IT2`UQoc-ST0H+jR<;q_g4uy`=4-;=e>^E)bjO;OvYd0;vw1GJozeR zn}Qd@jifW;XN~FmSAc;xBWX~WVJcacb}lq!prsLsZHSPVYBRo5CZDOiniE%;u3%yV_gepHVs*syZzKlGFF~~8z;-$^s z)^-3pdbnuTtJ^I3Gn7FvO|7H!pc1(Ru6YS^LwU0Om zpdPWW%bL0;VN`GMt^jak54pc#ee%L`TD;qA@;T$i2*GE{dx+T)&=`SD##d8klq;L5 zVL+NJ&JJw5t>t*b@%&JgfyqMN_TSyc7hd9fl92OCOQKpi?NX@REir8p7=gAlmNl$B zxBS%~1jHzI4#9B4KLNJ|Cs{uJ(N`;VKNF)vus2mX4F%PA-jRPY9d8MWj~7NW|Bfkh ztU;BRd11oxnUhx#agf0*@Zwryk&YO+#+Ugs!P61b*ql_>$q&%0Savf#6OM2k;=eyS z5am zMAGiKFMp?OXY8bt5!QYL0)&ojk+j*O0%h`=R@OhUY35(Y&o;6$<(73TVYMpJL1Gs z^ETduL-Q$$5z0=DsTA@te{Ay7-RNhe{T+Hhisa-MrW}j^p2DowiML*ONgo?u_Pl>b zW+VST54i6R4>Mm*$t#Ke*>!8VSg;%t%T4$m zQHZdUwjx1wq%58ah}qGUXQfX>M%Kn0D8F7}(sA9wPGEGC(K2;AYe*x!9~7WTCDb1N zCN0Q}9T&+;>XmB@x9}=ae_ulf8CPhJ${B3SHwg1)I}l_xlldT+jMH5(V(+FUR8D{Q z2BqL}Lz;wj4QcrLUUwFxKw+t=Yrz)pSNw9yxZ3W|=(*^Bf40^6Liud;`+4AFjJ0Q5 zd6{byB7Mf7@@$R|jOUQs5`9;T7)_p_$7oK`a${k()SVo!;kAJ+z;W>kT9dikr^$uv zU)kj{SAth!>SJ=dZivA8V%YF>9YDCMY{VA9#nN0jlhar4ak_$$ zH~4@2g+bDi>H#B6H48SszUwd3O3T1N6F3eArj2i11^XYT`{;)gQ3ukm-|Y9MH*fM2 z&1GC$uv}98EDmK17jcyU#@X-gshTVy71Qz|j!zS>9`>a#p(CeQy*4GZEM{6G$B_@5 zgz(rx2EL?Q3(Tiz6{b-)*3#08{7Xw~p~r36M>k%65STc`#JDpEqZ4|1Zfi5EVyWGL zad;oMP5x2YEq@lrhkASb{yLxXV`8yZ^?U1GzP8nxdMqe&Ma=In)rGDgiI09HjrOXv zNi3boZrSJ+Y?%kh?~knN1&ca3p8ERe&Q=U?KKxaY2Cgabz^!y{ZZ=Jg7Yuy|3TB;& z!6YJw{72^kZKTYRpx`dO9`)Kl5*Ed}%#con{`WXdmS~9q|3<<>!vwhDg-V<)5d@o_ zuP}3*Bpxh=CTbzNvK{7VE=dAr$}-~*|H*681ph0qMOQTh01W%z*&BF_=M+l124%mm z#C_sow{n|UsgB^D1x=IWD;*oF z)z9}~>Hp-*yu4ohvABd+8iF`E~X3k=&R1>$(!3W^LSU<+a z79S33IpLt@Q3?JJ&n*iUzNWfQk8Dt?40HFtvbQORgJx)u$FI)cK@1lV0 z)CDBYzqYYzQd(~%hi7)EnH$qNG6Tuq3Yw?kW-fCJ(ui_u6i24c3)2Xe%2n}e%$X~S zmYP|&S`C7=GGl%#j1PG^sHn+tAP;xTHhwIm8n5Z&vgCqE z1;$$n+a~gItKVs}WVoCh)U&<&0D`h+tGRU@bRqqtvc(ZDqAqOANxmqRzD{JHWT1&+ zc8dB1%#0dL1Tq@0({lyR(3LE%>_7eLggsH@8dpzh-bMvUKQd%VNC zX!!k}Wt4ytFWT`q3{L#d{`K>IIn++VJow_*m15fT1$B>egq?EhO3bJ^=B64ee4b8%`Wp2&ziW;BPoy_ZVE zHlw30ISx3>MI1d5#V`A3B9pzchnI{Pcx4*?yX|jmUj|>-&RPCkZGWQBU%&v6V_Cu)hgd%%XpK+pj;&{IUITW<9$qw0VE9y zAmrdWyhVK9pI+ZG6`L%oPa|Q3=g8?HI;lpA7=Z>XpI`6mr2w{FHZsA~(h)@v#|NQd z@K^Zz*BiifvlbpwyV?0$6pxq064LJsrAZ_grd~yQ-@|w7ts;hQZtwQG*?Il0Q}!>I z9-E~il@O13AfQNt&XcA?s$7K}Ylr6zlT0FVNe}@x3BGwG5?VvS{H7Z{n88!$wR58( ze5sb*{af2dvr+ddZqlY;T8fz@XP)ug)R1Q?uy{F^_@lWxB_fK|}Pyl5A{D^=YjX6vH&zI#45BWuu$^keuTKC11)*r8f zaTwKd!>!{sI6xid#NUTG_ky*B1qD%AhoVCGXn+wUqB4xS3abcX$d@`{XF3cK&9_XB z1nW6f8g18-j)TM!D8Qm6nMJ`7^7MjBjt#8XrQcDU@UJkItJYo4_>u5vmWr6lR`!hax$zS(*jz&k=ZgYUgvc1Pr+o8K^1h!CWxTF*=f zET=l6MAmaJYBU*ISTC3{<~ZBpff~# zFxZ`GAC-uy@=qFuSc6`$CGM~U!8|#t(1R%P0l?Qm65B7u37K-8nn3-Gqy0Dd^Q?nf zxDpFfD?0}h_v`C^EiQrbVH{cCcG^^OBwnTia_y|6c;c;R4ZbkiR}+#LueFRW2Wq`P zyLNrsgSnE-Hx&z6h>9B%)ZoLNE2Kt@r1ym};imr<7{6rROt?U~Fi5n{OV8a07X<}} zuh&dgZ7(UVUM1D%LHiGuQtMci5!(L@cWviNM9|-Iw&_$ z6C)r_@|RLbml}Vvre2^-aa?|WZ>jb4AtcIFZJc{^6*wN-jgdMF;eH>?boIF(1t6sJ z5wR`bmHSOd06LFB2Z}8m#Iy{T3|j~rEOF8F@`6aU3{MJ~cr5UNqCy{&UdR&JllcV@ z*9XEKkM6Tv^w|bqGDod3_?&$G1`-i_P|L1@4kvkF;|G1oS=1^ z$gbWF*BGuZCd~!BSTG?+dsH6zwWHx^!^OeFASd8z2KERMz(9cUql6U+{v|JDx!GA6 z#;{msZWJPdx#^?m`yJUYIa88#JTmnrA^r^!(e;KO`$%a6B}|q)eqbT1^BYjnLkF8h zLXIUrJUZ~yY@}^mtrNM0m*H!ywSB4VkZuB!&2kmZ+*-*P7#Mzh`&(p8xzU0A@6*8z z3L=!)Ys~KUw z1tL33z*DF&7&cUeBw&|YUx76zmN)=sK`G;FqBKsuQ!KV)EvWvUR4bTL;t`Tosc&Qy z_s0Ek)^2ko7&zzIjeSIJA1~7Vghipn>(5cP$ahue-hvso(qt1pq;F64ZWS-!Lno;A z^-ffOR(G3+yhRq-o8Vdcmc;xPrJFZxy!3~3^gfQ`J5|q9yZiDB-lDN+Eyn^ag99IM z_CB;AJAYgYN(%f+j>fc+bI*>IL%R2IUudD{%-ou-#@+WF*P>*ierz5d8`7%K+=FYt z;h*Vgf(3iVB)W#TU2d{i#>~wPJN%12kb`@0@4exR4(rBzgnAJF13CU|tv&4Hd`q3J zB~p{7nLJ2W&NbJVLX+`ikQ3XKtWyr~?eoWFrsm%l$>fVPqT9J;zkxRdA=iJ&NZQuT zz|dt-M_%Lf&JJD2HS4vugdaL+p zqyv#B1Iv>;#|e=ysb!O9{)aC2y7^3$mqVT**XEc+G_cn`0)?}OKV2WLthZg4n_TZs z1OY{U;BBcEvAXCj9=mCP_$W^e2r7(K+j&Wn?{`Ez_4oA??+D{^GBdf{J_J%eDTvhK z5Mo%ZwnvN#QQJspDqT`i$zywqdYd*{2KMQW?9pKZE@6{S2n-sxek=;d!vUi4=h!#oqnYs}BEUH1= z16?a$2z%xY57&eOiF4M{vbW08MBjBJluJ?Vle3JQ)>_t(JA0;lsWIyDP$9=?KVEC3 zXW!TDQa8A_lwU4GnQO0p8eNEglMMMUujQW8<<`9kaC3<~L(=LuCYbkkE*6Rjzup78 zc1qZk_~6Kh8v=tHN^a^hHOo8lOD`k~pI-m-sOW;B z>Y%r(tvuYKag?wP`EKKd75%{Xo8siM$X<`4=zyb!e-LpJOF2?*V8d5vH!*$E(`1(& zY>5u=ui9y80&Y7@-!r~%A=lU?-_OLc8S0cwN3d0eLzQo2$%LEBfzn zk!)YWTp}W16#v>$1hw5wbd{^nYAlfS!Ay+BG@#%o_&mLH8;GU4mV4ww^_v3wef;KD zf7}3Ty;5svd4V5E0y=l=0|%;DtQ_rfrA*EK)_u^6cdvY~&P2me`Eb+E5QUS-`DddXb zhI}Y1GO&^u*SAU`Sbm@97>=s(&5mrl&^MqcER)@&ul*g&_yt(J=LcNb;l(Y^>(@Jy zCW+qZ@11wd|JA*mc)oa{-GD20bZt*|Wc^t*sYVM+c2q!;2H$8O+T>ykKM@0qYT#J2 z{43vDbHYd$)Obbr2w(3Qs3D=XlsQJ1BP2$3YOlSwjyUvHo45?G2IM2=xs4ohC;D#; zgu;b%=9a2e>-HuEU0CX{OyxY|xXM!b4)1#kk*6!s$M>^gQ?vYFWG;lp)jW1X2NB`t zBS=>;E{Nc1y^*dWL_U;Fn9wf&KMP>PCCEkGA&s3v&(v;?=NdvI@Rf;Dh)F@NnCq*R zyp@~ER#2eu<$fl{yL1jk(@44YB2V-0+=_1Bbr`Va`&-`2jH_;$d>d6DP4~{4Rv7)(pDSr)k3#x1=f%kd;BxLp>b#Wud z%4lko;gPf`aZC8?Y*V#L0Ro?;uGy?c8QSub>isrmm)7SVAPow6{RPJWE)9!e;xd@U zH$N^fPi$atu<>J9l;e;RE3?aq>(?w1?7}2Ok-bm8L54LtllH1;ajL+}_)Zfewo=2$}${}jEBT(Rk;2+$>Y1Q-6H-rwO;r%$#kFY1Y=@z~xRNNq4-A;wVv{(La5S{1 z&g}vs1~P}9rRHl~OuL^kI#ljR)5Qhxmu`a%&fsQ`vl;UJh(KAk05~rU>iAMRUK@1( zl$D>@@ft5M=j1@&=Qq$V#>RSimq0NIgH5?}n-KqS^UbG3@G(UIkTlLDae}N@or>h> zkD)&ZyCrn?c;uWsUWKwT$d|yIq|r`)vXw)|A0ap`-{%Lvuh5B25gZ^!9oOGcPUanx z9+KY=)!<+C(O6X3ep4P_!nxCbQyBV^!K!z$_-7(K5D;4|HktB$A6u*R3}SRDbX<;h zDpWkho=%X&9w6U+*`s2$q zVMqK-`9!Ly%EE^pcCju%_LeQxQVm$7#hh)u@)-%bEfuHMPYxatMtE+``NP1+PYyg2 zc(JLPuClk;Jo}2|?CMN<8oJ|H@SiU+sqFa?D499V2p_PPqyJpHKRP}*KbNP6MO4d< zBZn8nzs1Z{dRwlfxbA8ym3KR;K~C`a0K&0E|1W}S`c*I>P69o!80&|NXkUQ6(b5vh z*-Cp_+qnAkj+r^NzL>~jq{<;D9|GswvwA?ikxpk={ya!@w)QKoVwhRBqtFU&qC|~A z@IjF0H|dks4~|x~2FFhi-R0H>6%J(@OkJ*I;x0;M*LJVS@s=ipLBZgzZ96pe=CVt` z@kQrPb8+JiEl|i)Bfa&boy*DpaFHpo2H};s*&fI!qX_+JSpC?{908NjHAQ~kUZ=Vx zk(EC3M4hhAr|(ENQ36vDaUP5jYIg* z)fi}r=mhC_d40^Nv_e= zy}X`7yoAUBeXs&a_x>SYbF&L2i?#^UPVZZ};5d;v__M4Hd^$cUF*(kAbTyt2iwoOi znpR_0o$ptWOr`S2exrR#wEFhb8JJbprjB+(=`s;YTpbS{c*-B^r-i8kM-*5DEqb`a zMVS4&Y&l&n@0Ojn)h>Dp04r;o3toZ$v%5g5WBaWMU|Q>KbzeLi>3E#c+iZ1W0VZXI zIxL37jKBYVYE>PVVl#W@oy#GYA*q>Wk|*VvT&Vfzgrj2D;rqpI_mI zGS6LKc=}C|xurubT!=`BiaW}>`ckbtNF3zCY$KMA|^E^AU;%ame<&xA#wxD{Q8{0B$zYtX?R)@=~Mr6wm0 zXpE6+t(7I)Fd^fI$Sf+d5yB%tO%^{J`(XCP7fLZ32_tht%Z+B_bHivny`I7=s zK7fkW+UiS|ZFWI8+lIySm#7!GSD&rT1^Y4m3z(=eZVv@UMOn+j`ij*>jo)X7jtXl9 za?J|)$Li)UACEsi7lT*|bRy5x-^5LexACyBj@qkOIw?yWVJ;BJ$IP&Rir$3&2m;5QJD+@)0{!g=zVwBnTHw^bQLKJySy{6)w!o%mx8; z7~XvIpht6TU4En7V+(@1^2?jUv%sVy0BEDjT@hZUvBWy#_u#XdRyQa|XTJ9o$~yv} zkF_;9pl^;L$|ZlNp%*^jbA$c&ZONO;LuQO7?4>6gBigT`&11lp#}~A&Wb|y*39)(a z4C7`#N7S3Q%fDu(!X%gIMZYrVx_xho5bk068l|O%l%&&oF=Q7h34@b|sh^~jK!7)q zX}BEw*9vm{GHrJ*0vAtWxgCiPjPb6?c?L)j`JJB zS(N2Xx00qJ9jGEKrA!U|g$C=;iU9IQLaj+%>Bk=#Pf9!SH8A82sG_GFh<0NmD^h<& z!$^urN-R78W#aoYW>(Q{_{ePC6`usxHN+S^Ko#=YnyAIe77Bv${(|3Z(Vil1O~wK* z)=K9kxY@w5m~9NcC&x`2x88_2$voGZye@awP*HGPj>**?LZdUC7Gh8F7Oib4PW7>A z6PeuxC(%q;sVI`=bHnmMt!uZ~z{Pi3glNUMD_BtzaTc$VKmHDi&1} z{Q|#C9-}3?A!7u^h+Qs5Mbn2m`ZUwf?pvg11j*OpLNE9qEklzuAO1dKM|i7}lfR@^ zN5g6!G3<+H&l)Df{E*GXfm>U8(}rH>6>sWx*qf8rZ`)0iRIsfWX!Xl|ewo3DLwJ-; zu8wcpibAgkv6`$=W2=c&4|HgX6}@D*27W1r@CeZi4<#fj9OVo}%MMBrevI|$Pi}~5 zkVw<(Hrpase2A7m3m3o=ief0E!9pg6f(s3+F?a*dgS3h?CfQjXzK&8F$Ie|^Ex*1W zmH6IBjVgmfVN--z(S$#T;Tg4*x`FjoXaxwyY2qZh**=xq@5B?gxO*o=`TB~jq=9nk zqV}5Jm_d<`q)yfge^Jj6xKp4@0viMls$K7te`0Z)%a}{LuwJUoA%nYyWR}P_vT}g3 znSZ&2k-BccVL3C_K;4fY+v|vha{ct5(FYNFzT*tQ7ux^Eo~U(~NtI-cWEZB%OG&%L zCQI2_k)chzyS7W0&7K}+`%L%%-qc2JDRM}*n%TQeq?F2^ohxI(;t5pfojDm(aVrV| zl7w7scAE?)vc3>HD&L5sTu*0dElZ^nYSS$c+_LsX(!t)x=07|n{862=pg(Q;c9OgH>Ct3i?w?4AKb42S5c#ypo3m&_PGsBry;Ro5dZi* z+mA0|C99gHTC&xjpW#k>lf-yJDX13PYT|YD8kg~!`X`EaDjdO=O{L%=4a`WuqGI-C zk*ZRRX>v&F*cL)?!l3d_Tr%+ULI)$C=f9llGr`?$hpsKoG4j zQb1gZ&A1HrGxK&&A37jjx)^wu7w zC;&+w4-S`?W)X+}(>`Y+(;64EIm-_1U>{SGg+Z6s2~h|2WkNER0#r)Pca@WJPr>Yq z_PD=?TEbW?cO(O4fmq2DcAlX~43HZ_;25_M4SI|b8b%15T1;;#Si-&(m!iVAkyW%57+wA>eO z^3-dtNlH-1QrSy}0sfyNm@-bAXXYxiqMyw^F{t8(BJ-DtGEbc^AOw+{q0IFsRbp&J z9+8lkB4!agt)qsZxe{$Q_2ox3K`b{@)gM9?QR#_gM%A+%%r!M@(&C2?Ee=L~a^KFF z|97sz{)A(nKYWXqOt-+wzO=ME;b}gz)>5kyDdWn)?kZYt5ed_0{jCl65SCnlq=5$>y z1$CaUPIXdxeQ40#aDeUY!XZn@eal6rX#YHFZ}Dz zgyiXT+*G+{$sCh!4E0zG-XiIUrIEQQk>jKLas{G5{pEocQ~>g+7+XYyH1tIypMo!(vZ_5tjcBf8Eqek-o-#RHW5DkpH&+o}u;qcv^~3 z9`K_?F@P3Eeg8$Un72S8IoYqM9^luGZzpZDGHtBJ%s%rwT|_;6x>Sd5!J%I{Nv>e2 z_yn7CUewL3OO6lA4u)c)Vx*IXChteaLb|B<<^;c#q?20zG($Wu(SZ+ot#RET!Rg$L z1jVPotD}U2T27}7WhaXvytJ3s*K@7>%5?hBCG71~Jokm9)zR)&ul~&sColov{XEsL zb3|@BE&pu&pqz$<skgG#ik;3e)wL0P$3=%0;B!f*u-IVl~UHfqWhQntk|!#+?dH*O@E@jppP zx`lKF->il@4His_B>(UpqVS7vRLn9@1`}k!;n9sYia7C_@@skDGE2X;30pHA{L8 z0h@1NLOpS(r%r)j$bNJ!U=`~R0$en%U9UXxK~nTHnx$XO(y0$wjP7ww&%)B}gCPxy&O`^{$vbJd#NYI^qO{~p>jLfNuDt4cMM7KCVR2&rq^17O`2>O z8tj=c;c$f6R>x6a(}L@+Byb48Sfla1dVsSBKvOR-;Dzon2Z5IIFqOKu`2X)(byJ*7 za%4MtwpIp!c|Y(vTaIzhXipXY^IGF|1$=1$mTX0Ck91i2B^vFfgg}nobmSS!GJ02} zH>k(b&7V2QT+H028tp|5k?5bpLNKkF;rLY+?x4WUEXUeu&})i zKH0B*LM{)^uf)M3Kfd_vE|`YX2F@KpZ|!mWvH$|+Y0+TBp6)b`E@UJ1Sy;o&MdvEf zkh5naMi+?-i$(5A4`Ct|-{&Q(G!G$mwNj)aNfvg24Ts2`g~#NhKEN_BsZS|+j}mmi zAdttBW3b`^Lg37D@^7-$){Bupqu7lE_Uk#e^ICSnP7< z1y2GwE^l`N5<}U?(^OSMaSfzMd~##n9x;xkrBUlXr>mx&HpwGNc!%aAQhSw(9^&?8 zJQ?|n%7Psfb{*q6o^q{(=@MO>VU2amrFhrwsf)!dYOTLb-kz5)UPfmA>7}#X9V2yH z;N&TI-M{%B?#u;Qf(`|)P%*^WAe~J3d#uT>e!X@Rl)9c=58AEPzgxl*Q`xZQv)yoA zr`~FOMP0M-U{wx{){eoA`N^i4%FO)P$|%(_20Z&E^G#n~Daxthkg>J-6vpI$F4Y{K zkcmfM1>wcsT|*zmCmgd*&lerWSC^#q|G=#rzw1b4B0Z-(a5Y}{=(cmT&<6&Wlat(g zOygFr_w%QxjKMggO=}iC{tOic@2Vv6znK-h4~;C{CHNU+*r=@m6m1 zg+IEsn`U!L7*7&t@KSZ@E$|N-#R~~=1z=Te1@C=&mvPcoF`sFq7{3K;30U&@$EO%L zl&L&SJ@H!j5#p~V7eCcUrWq5soJ2hB=ncn<&O zq!?WCu*Z*$r{JGz=pUJs{78+7BpXQs1`)#5E6aX}OVXl{mtUdaJX3(E!`+;FA0NN) z>iLpokVeMhhB39h&@vtO#uign>#`aP29hQ-?cO{$wU6S~1mL|)Nl<8>$hI3`)ksrM zwBm(K_aQK}opYsZFYW)J@XCb!gm=n8unV?OY17-NJ}0-}1XGVmsDHYLVMJ+18CL5a z_{+3GgN%J+;)+N^fD~sB29D|!b-r>j{RD9bix|i!lmNO(pv~wOH#ti8ggeETv0$5jybyE^M?Yo9y()6;PaYO3fehHf!GQ{3(ZO zt!0QjW)y4{5PeMm%@)tUam}BCixv8lIo3q9P^K-Eh9sFb+2UzBt zk;}x4hY*lw)M~>1eD+#FGCJ{==!dC%iDkC1(%JNQdGm9)GspJU-|8IAuM_{s))`vyb;ri;j$*&mIJz84C;U>$lVlQxIQ zsW{o5x(#ieGk40LSfKc43a`4P)P=tkETkc2AEk5VDvt}&SCwZ1%37YyBl4SPCwYmH zr1o)CdA#6XHON01@0<_TKPcT!FCujy-=v?z z9jJvJj$iGIzrwze?1L;Tpm~4p3{pF2yyg99uhv^%q{noCp(PP9Pr~HeK7XQszfk_Z zcZTX9V~I6-xdOORkS53#H$!qpnBHU{Etki)k6N)88|%Jp-6xzICd{hGc2n;9q&^N8ew>LKDfo4)w%O+KR_}>cz^IwHJIs4K>x>XZ8n{b@ zH6nxYjqIaOprCGybQ2`Ic4$skgt{3COOtlY>Dw=|!5a8&rnM1FmFsVn40hj2vsSi( zNj(e{17wK7On7mId7tVr7mu$afXzp_bU|8B50KX2Mv8DsMpg)U%B;;nqr^2|CETFB zFeEMFcsiu(?*{_I|MEA%1YU?jURnVThqXAsOagdL{1&2fa!8Y3=8s-Xc#-~m(8f1k zMnFKRYa4G@UMHJhj;_pDKGzqUhhQ-J;_>nQow7ep>WHDhe`m(Ak9g+172T|x5*UP~ z@Nlo=P~CH!v82Y$bmV!TQe``8nvi8z5!3niLJAeDql!+9CIN6As;$E5OwAvwG34}j zWCtRpWcFy0?nM`~t@NyxyNgKYnolLMJZq6!vlMjj{3QSI>7EPm!VELbdp*!b#MWhxW7lU zXr~*h81h04HF?RooD?%4QjPWs&HeeGDG}3pTiOqkg?=PQh2zWm7SoeGgS^b z_oP{c*I*(!A`45!J4Xc}9-p5+GnG82ZTXwCE_?^T#%JlVoZ%WX!ca~7N z`nA_YVEH)FGSZ8e&%%m9YuMBMIhJ3uIMN0dUkLi1h&v4ptt&i zP>%M?{cX1Y=0$Ylfpg7Eh=+w3tf94aidRf)m%xwyzT&3sK>0G_=d7&QPbQ@3z?BR? zOUu<}35-xRpd|w0T>h&m0mFf9cCKD~_iXP;D$or+M1NQWbqbk%L^D(B=JxI`^ z=yayKJnZ$0xqDSq;1bxMQc1s-e@zH?RyQ6lPYwCJ{T?_dUVu(IAbX4`bMH=;ExRJU z(i2p~pxNR3L;y6jR7h?{eSXic+=moUw$L z$P%gb;K-HUbLMuji}`iV-uDdA1#|HSPFj#OeHGt(uTjUfd0W2sbRrh=psR;~d-kAK zOhrctei3fbgaG#1*st2ov+e_8`zv)H@Mz*Xmc_D`;Sb3&M$N0vy@=LMS4F=2>Mp}K z|M6PJY9?P?^rCqMB$3p!b07gmMEK_WjX^N9`SiqmvhPq%$^_}#TvKk&D%(lge1fGj z>(2E^AgBm&;pZBGyN$`9xRbdMzoRi@3oOy8dCM-t@MCn(JNpXF)amaQjaq0)L?ieC z`~5EN?%IBV+_{!Hh(@gZH=OY=XiO<+;2(Ls%lkd% zD#+-ZloO#`eFp&T<@#S^?B=lvMM!}e3j`v7YBlL7%*|Gtf}|TEy96^p=&riU@ks_w zL{OJM;remV4|TC)VbHA%T(Y7~I~=-WMIhY%BY(*;^U3PS{u&2%XD`0gMt4}DGT3Wv z<<@Nx%34t{qzK0xA&Rk#9d1^pTWi2?AjJ|_uc_TH9zeUt@mRc&mEuyhVuDKEJlPJO zq+65H7nLR*l(FBcou9L%seM(qf;6-zCDx%0Uvj6y+iRF#Qa45R@m31s_%v=Maj0|j zV2+R);a}HaSJ4Ylt*p&hAj7`D*2~Yw7im-Ai^RFLzL*D*XQ}Kn76HzV-b5 z#pDI(a#I(-!xfy%$UqBz^{r$Ja;>wDfobP+PKBi~?NT&7|*pp4l zpI!9Ra9;G>Kf8XfKI%^qss#+oEF9-@rq{j4!`r5M1K(#xJQrPGO~lK`&wqIraow?e zf4UrHlkfZ2*WZ!@lR_jMcaZX!kyRYDvHzqffU*_DaM@pnvmUhXxc|$)IbGj@! zl=rkGDU0-cI!Z9eTO{zU*KDXV=kNHS^b_RDTj9~q7b0d;Z@YruOju$gDLrXPRfV1jx$#2sKn_PbC9)FE8> zQ5h7u5fG4%w0UxD1D3!Ecn950Q#OD99`00a*{%=f59x8hYkD9?Y_c~RuS}&z{bKw< z0#~@&hDHynSvzK7%R^$@EWDsBO4K0gw9;a+%J@1p;=#8O(=#HdN?^|bx!P2+M(<1O z>^4GNkj`c15e2%yhm+C^mh>%%p{EEC&pY6Syn-abl3WzyA zA)$3YR;P2tN4tFi>UWbusTXr`H)CyK|{P`z3T^7yqEu!Esx9InB8vu zgojXqe4_y1%=!Bh#$yGh8$9aXaeUS@8K{)m)Q!8^_(e_i$yBB z2Gy1|VZrIRJNeZ87FKD?ms7OOF~-4!v{a-05HQ{HCBrO@S5{Y@ohUGgSq=P;VFN zJpzK-fVyi9Qhjb4odM(8pH~N=9D$kh06~QpEBo#n^<(~St);k)GbElx3T5_}_IBGA z!);Kh%cOI|yltbQZKLYFVtf#-T$4KRWtKxOW{1s4%lhuXM{Deslpo97Z7M5 zRu=EdS9S8YsE@eCxu_PWA7fi0HXJY|KKanpEwf$~0%cCN%|rXGnR z0Wz&m>p1;*8f2vNeT%0&KK;KtDLQGcdi)cG@<>fqHVNb4IOMIQH3} zRH9S4c=Sl%d%g18liLI8z!xP?DTirpn+2q`y47XeM5cTi`;NKMd zzVdZ&7;^XWM_lK5t-*!|r1gfSiy9R&JljvK2}^Cf+Bzc`)UBN31+V4Hq=uWx=l^Do z*;Ri9ykgFI!Q9g?kcHyGWrmN4t&ey5P$#m2FP*mlUiU#zu9nH9>2iTWbeRc zpz6w8of8{W82!pk$Ci(@#p94B))El+(I~rPaFZ;)@&s%)E0)gybZrWgV&WU%w#HKf zT{zi60YY?zXhd-8nwlc@Iv^2e+^Yl(-FoqonZ|rkupd8$KD^bnM)6@O+}{l`QTes{ z_YCzy_lT~6@VS{T>w16vO5_n=re43V7mLyrah_nLrsV^7wpc%Wnez2j2qS`~Ph zl+P0Bbiu)PzFdEW3B3IfK!Am!E1L<`)c6P35m?sPNVhvN>tg+0}J9UHAceW4j|z8bF0!t^NfwjmcP#wGU#F4OrJs@qZ|xZC_L!0pK?% z{`A*h!g`watQXj|Sx4ydXVYsO9^_|*o5O76zl*Rk&Fa^G2**C0@C% zGofNG**AtX_dJ=%$-cc2Y3X_ZE7%1M!N+8C~J{m(i zKEjTx^FY$|_>1B00-!7eKR>_cR3nhCYfrqIZZCTsv_63H12Il~N9sC|``#s=d1GLZF z$VQ3NU%~0K<*!n~oUt4$gTxF93-<;{%U_P3rcS&z*+icPMIRD-qHupUngI~{QMIL@ zM0a;3aEh5;nivuS8!Jfv3ee=v-ELq#+TLbu=(!SFYbZL1O>Jy?!s501W0ul59Yyas zy^lcA7p!$ahjgvu({n=N;``!>_M(z{mymuNUfNSnvd zdTgiEU>n$;zoE`CpTN{+zMpY1$p+OSpLKF58=N2j@bO`JEfMpGPxQhnejD7S35=3e zxCE?|+Gfyz0;e55sjF0;qwIctB*n9(j2&n!78aZNHu^?yT|S4;!XkZEsDEh>arJ&& z(LXkOa^I(=y;3Hnr^sbKXF~d_f5eZzZcU*ryz{#dc4y2DWGpBaPsAUV%_NWY;HqiJSHq6|P1W_pDvAAW(~EAf3QY?s@%M|h&2IdUm+HLr>=aHl^F;;(S2irBN~|h$ zJiNIn(D!0SixZGK$^V9B+uyR|#P)0R={G~ZXs$yxD7RhDso0(vX@Xm(fqtK}DrXMb zR%zs1)Yo~2dcYUXXrI90VN3K~Z#t5&8=tx8-00aLd|RM1r;0g+JI?j`f^b{u$buFx za_BG0d`r-5ByWgvbYA<>0hx|uylB+=hQ8FRr!PHTmXV#3Od5$85XnjSu^=1Rq5)PqSSXs=vod=dg+ftg zQtg|rW#f*eme^rx`#&oO>e(h?OUwgFLQHt3vE5#x2z%ez1T(?rUc9O8>8wc+f>?2# z%|?kwcX0#y&t_c#0~21QwBh5k@{;T?BSSrRff!l|7APRo1@AhX6|p-{N5{J_J8cR$ zH^oa*ch5V01mvT$q!b1PLD9ZLcdYc=Ac!8~KvNrHGf6N7S=j*6UJo%YRf}vrR)ss6 z)vFQosG|B{$xxn@OB0#bPJNVTwm5HpWfJRu@_ey%ehWLUDto|<`_rn+!S>$s3dd!y zi`!cJfElXuqn-s)+LZ_EI}ATh(o8h=l)$kQrH?8cd6(dK`up^uv0!*-%fUCtu-zar zw7@eRQ%(Y(GWUk-jJvWzP}+=^%UoXlNl!c&JDL9-yK6v4`c(I^9G|283nBBrO=hpz zz^UJ>PGB5KAnn?)(>0VNVUR~87^Hh9R)eu1LiP(SP)CAg3MLM|~oY{5W2 zm`Uo@md)~LoW9r<64%IuHZCcO8()-3`A92WrjFAbD!BR5OEQhYVW%n*5ZRLl5>#tTTT$8XtQJj;Y1Kw|CyaW&b1jVYjD2Lwb$ zCl-LD9oRO1V#OMtXB8>%#lLoKcmG4jyhwu|YuY(30xw=A+bdeDhx|kIH7xob;~fbu z=#CNJ02aN4Z&zN>b*~()^4;SBex2Z^91CEu*Ib9VYRICzq?BZqb^0p%;;GoGt34uE z>Aaj+pN=YT-(13*$Tlt6AF~;MtG%CM*9sMT0qC@* z`rv>ROT0&F#2ypS?PdS>rjUakafsG1;^uM}ZFZ=;O9_sxujjNBc}jbLVd#BwwYr9B zsvU5aJ#b0@^jYJiJ&+FnV58!-^3&)||3e_UJvG&&3+_%7R1+|j=6n9t32=Zf^Ddg_ zbCg?`Cv)kZ+(#@Qt<0cn3`)>aqFH4&PgYk(;c?*$h0fWMk2n}s*AKO9wo0`<7!gvc+JF`q8kocae!%K*3kY<1+rml-{PFy=Cr zct0@5epV$suLK8hAP@j`*kkF%K*p+vU{;Ep^M4)#rN6j@R8t{22e%O6Sx3i?-+ur= z>~Jo>QlQxP$`{rjwN;7sC%TjsM%AwHg;_9~D=WM$Z7}f|8E~Sub=2W?hewDmR@=vT z#xDi7P?zf8Hja|Y!-RnZ21~rY?*2g5h8L|Z{W>$CUSb%0Sni0Zsc<+65|D+1E`qYp zc1~~AM;;vT;Jc#ThUOBp#9zaP1+IzA3_lbGsL_OuY7wESkZ}BpDhRGt{J~F1AD;0$&9w_xL`ASorM)g8`?&16G zcJEl8faqANQug<94;0AUSP+$k#&nR``SA|yMW?_|wict(riTHD_<0gnV{tWO&J7t$dlpj5xD?Yr&|$pT{TO7KE-0ul zOZnIi0*Xg$4%c<5lFJoB>=Bp_5nP%G@$7QYaBmAa`9f8vlW&YF+*9M(rPW&ucfc2c zk~6iy3h{i6QqU#MxxbEK?%oZl1AJV9`o;}}`2G|A7X5PAk0t0|zAxF^TyikZM6k-s zSjkBhr(fPn?LOp7)51?N5X9?K1@wx9oSoH>t(5! z!kLYe6DslEpf8Gf^66Tlc`ge046TR}nc3V*o=mb$wBh zU1J(B<>~3zpD&@eu6rboYZ@URgsH#TExYT7|Jk_LUBAZ+qQz!?Ig4+D4U^Aj+g~X` z3gcvHyxd=kq!x%9p<+NlYOzPaxrNi(!>S*zj;c7OeL=8_hpYc6KF)DDF11aD`bN%9 z{m5n5pvw{<7hB=S!+)5yok0-5v~s>VAwbK76MRV`*ju*8@JH424y?cb#`DXX-781+ zX&D*%l3Cm#ry50y6V7b`*G{wq=ma%MQMH~ZEA-Tw;{dt1k2`CHX%QqmBj#VB! z3MSmwU=ZY>DAsySIrDO^DbRIaJy)9@0t4Gf1kvc!pzpOS^Od&eqRbyQ8yr^l14rDV zqVD85M#Q55^Tn&YF92>7(fT~$HjS^*A6VD|>?L`$0nj9{AV`l9lhcDwsPKB{ak(vH>leeK|T=Gt0agRwW6?UzPVHg+{d zBc{jS;?eR;H`!-r^Vj`64C7Xb;|gLan1)0HF?+p_i3Vy(JBOP4UGBAhtaYH8--z3- z{u=W`!z+MgZP-OX9_=X!dZr#$4uu&b6bfj&z(odxL*306!lC2x zHk06%-Q3+pGr#NjG7=W6;Kf+A*Zs#;&l=_W=9mb+Ey5k))W3zbi2bJ#zU7vQWyp|JoxWUx(7qz+e zlL6Dq$*;1Zc@l*GoE3T$40a*RK1fa9?%Ch3xsd79u?RKrS=v2-I$pgoFa8WW^ctoJ z$k{LBZUi563(44a2=uxQ-2S-2Y9hWSyXYShI2&XDQ-dvW&fkq{rOQr!@V7ZDKBr)# zm9}WdLn;pFwx~UtwO6cc zTyw3{rEOi&1||!zd=PQJKwJ&hvOghGhaa;OXHu8r2DbrTE_)TZcn3b6;DYrZ zx>J~8MMnRDEfqqy5P|J^z&q8CckxSnr2&PcjCOeruSKJ_2P ze*dJoT{0;yuW7fuOX-wsGY1{mzF(SY zmJ=svf3Wajsz1;wue_)cV*limy1x1q{8)pZ?A7g(zrPKF{Yy+aFwx-b-c;B`Ek(qA zqAn~a7r!SG2I$A@l54>T?ZmY7R^qIoYr}W@_0!y$&gDxJkkkouwVS)u#?tbss@llI zBRa{Yw9JQpO=ltjiD>qsRqc@8jryJfm~T*9_@F2LPf0_JvBB{Wtc3QJwmWWa!dIHe z>p0d8wcos?o7z3!Vd9v)AKH08dW*>nO{Yqt0wxpjNHBn1>qcRQ@)~bcEQ@XZ*A>~> zxFE67T=U`yX3~9!S^I{NV?!Rc9K!plL=K2I-w={KPsSTho|sAP+fm}!y`m$PoIPSD z6wjQ|#eeu^Tv=~<2Pf9~nkc|nI_RW$1lL% zK1V#on^y%c-5sDkdZS!q{{Xte1J1e#H0w9`uL%|3uH{$Vmith_|1Y1U)Z4ndXEEJd z0uT88qhQec=b;w0`GUfJi=*;qLhH|lW*N6XzDt&xP(aX~SX$%1&BYo;HK_ z?xhs(3bq`f(_KTd?c9>kxTGU zNhv`Skbp`3d5JrRA{9eEr!VrAma@)!{i7~}Hjhre?U61t$%&$YU_NkX(4$FxyX0TZ zft_?We#L`b@vLrwFq5fKqx;(4%BRt@0k0SzcHrfbAE|?y4+|pCB>vHQI9Bb0Dk=i= z|B`_;dj4KJ0~kggA{a&$+7_xR0g@Sz;9jr(!{Zo zuyxy`yP)7cC>nZ#%8e%)umzmQuzp(m`hrJk&g6wr(O@fTVIq2ecyj2>Z(RymG5o7O5K&IKpd>zFy zzdN}5iB#UYZ~Wy#9e_S6v&XYzEm#<*a&lM7^O088OM1$4a4k}9CXyPP9S;K48y24N=_ zqMdiCDZ#GER*|}y^7A%SwmoXJ@06rxylmD*2MV%qcjhVCVa}wyrtp@1x5kz}4Vd84 z7?1As0Ji_(!;$G%uhk;B1UT@j>C#U8P&tJbpENUDZ7%zO+W z5%Y)e{7oJL(rR+JaetoyuvGnw$g=NMJ`2j-L~KKL&A|oE>0d;nr}12dXFx)zAELq= zzZO13gCxvh*9KL(tor3ga!CS6BJTvV&OL`sR}m~~<1GRdvH(_hE{f34d#0Zk1GeJb z{I(Bbfj8zdJIaiwQzL6WpkCxuxqRLqE}>}-e)yRL|JX3AUD%G|ck>{NfMe&)$A5cG zlMG>Xy;%FNrgY;02xgNp)B_quUs!93(4|l}XrqE?6oN10&%JO_MI@i)1NfP!aW2e_ zk*OoWKEvN;1`3C>@7j|;v!8w|^o&OUb0*yM@;K>0hFHpL+3_RT!>8H1x@$B!(AZW+ z0OqyhZ^d06FJkm-4fOqpAHcAE!v^lDU|=6hu=}z+N|3}R$erWRp*?vC*Y4)`F;ctR zamWL5&wc_Ulp92As|r%PUCP1l{om;DKa zS_$0DH<{`CLayoA(zQ^DP1FSqehat^8)P+y8?iIYzALKMa*c%`wi-h{otuPW_bvk zO4Zjnggt|hGxR!5nGmjca+{vXLSRX{0L(Jv>{?`zq&bfc+Ac%~^`4JAh`GNwS!v** zaJ*S6YwO1L@I2wS_kr6J$uSrp7>L0Sm4txjPykEQ$1GYG8W?G|uv5clhHSWK>+ft> zpl~C3CyBE4`&w1d4!g0iR@nV)tVsWj{symj4Lw~C>xAPH)FAjI_4E1Sgy@6(BtR4- zF^2ykM?u1 z&+>p%(qZ>pMLiiqkudRda$w)&C~v#^?9PgD=@w&c-ugLaTFvwvJ&9 zL#cR7ZT zLQk_{({rMtIXr46ytrPAG)otH1#I*ZFSLsX&7C)2-RiVb81LO}qA>j7ta)$gs zf)<>Vl;Z7&MXIADKnoNwZ&pmCBFKDnoX(3hH|tyig+~CzEpL`lI>7-Ecn(E31De0R zEA`@<*^odu@YU?4*gQ8QuGq`jSn=kjp3N|0{gpsGFRK0o2?y(eRdsE6ZGfd|$q-A$ z3JsdFxBNCJC{?|P7J@KvdPxh_&`AdQ^MzPvg%hizl?a5^wmdf)$C{LsB+dU+`^-H) z9Vy}01|l3;~<3e-m zD-hKTtZ7F&>%P6c5VG$Hn6vwLxMnpJ7O@59G9XNJbPi(nDQ7XwNNXInItEHV0Z2V^ zogW0*OP>x}-FqgqqNrJdKcc8lc4x&0j>Uz)`ez0$hhYVoI3*#!0Th=~O?E}a1weEs ztf&xSQ?tPTqP$i^5kbnelKq7}Ugn~c@yxk;SZ>O1F7%xAy z97HZMoQgZvf^I1{at-zkn`jGioqjZWxc-e?Z!@_eh}iS7;K7n>$&i|og6h=gR>2i5e?wYaQzPTjRLB5g z9pNAU4%cFtN`*SPE~*m}Db`FRHi&2^W67dm)>sN0tP}m*oiVHsqCAEib-TI6oJdO0 zA#IbdP)iGO(2fjzIvkEb&|QX~n7c6$2gT{*P`sXi%Q1Q!rRym9`*zy>2bz>a6; z#!I0s<2_>88-J!8YY7A$sETPyE!1^9;c%RL@_lj<0~Xfk{)9OciD5MqT{QzAVr+!} z`xP{U#9V>r!bHI*4=d;e0r^7v0mLdsNMyt?XoF7)Bxs3MOd<@}#()3yzr*xjllaer h^xr4v|IJGz(hwuw$r62gWBd?!8D2KlE5_Uj{~vGHOq2is literal 0 HcmV?d00001 diff --git a/examples/positioning/weatherinfo/icons/weather-showers.png b/examples/positioning/weatherinfo/icons/weather-showers.png new file mode 100644 index 0000000000000000000000000000000000000000..07489aaafbc535d764bead3870e422ba237ac45d GIT binary patch literal 76340 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