From e973957f5190e2aeb8ffa5aec12efa9028b1be7e Mon Sep 17 00:00:00 2001 From: Mobile Roshka Date: Tue, 12 May 2020 07:55:15 -0700 Subject: [PATCH] primer commit del proyecto --- Podfile | 13 +++++++++++++ Podfile.lock | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ Pods/Alamofire/LICENSE | 19 +++++++++++++++++++ Pods/Alamofire/README.md | 200 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/Alamofire/Source/AFError.swift | 840 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/Alamofire/Source/Alamofire.swift | 29 +++++++++++++++++++++++++++++ Pods/Alamofire/Source/AlamofireExtended.swift | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/Alamofire/Source/CachedResponseHandler.swift | 91 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/Alamofire/Source/DispatchQueue+Alamofire.swift | 37 +++++++++++++++++++++++++++++++++++++ Pods/Alamofire/Source/EventMonitor.swift | 844 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/Alamofire/Source/HTTPHeaders.swift | 445 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/Alamofire/Source/HTTPMethod.swift | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/Alamofire/Source/MultipartFormData.swift | 544 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/Alamofire/Source/MultipartUpload.swift | 87 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/Alamofire/Source/NetworkReachabilityManager.swift | 266 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/Alamofire/Source/Notifications.swift | 115 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/Alamofire/Source/OperationQueue+Alamofire.swift | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ Pods/Alamofire/Source/ParameterEncoder.swift | 184 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/Alamofire/Source/ParameterEncoding.swift | 314 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/Alamofire/Source/Protector.swift | 167 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/Alamofire/Source/RedirectHandler.swift | 95 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/Alamofire/Source/Request.swift | 1460 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/Alamofire/Source/RequestInterceptor.swift | 243 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/Alamofire/Source/RequestTaskMap.swift | 136 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/Alamofire/Source/Response.swift | 399 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/Alamofire/Source/ResponseSerialization.swift | 800 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/Alamofire/Source/Result+Alamofire.swift | 109 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/Alamofire/Source/RetryPolicy.swift | 363 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/Alamofire/Source/ServerTrustEvaluation.swift | 606 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/Alamofire/Source/Session.swift | 1039 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/Alamofire/Source/SessionDelegate.swift | 326 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/Alamofire/Source/URLConvertible+URLRequestConvertible.swift | 105 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/Alamofire/Source/URLEncodedFormEncoder.swift | 973 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/Alamofire/Source/URLRequest+Alamofire.swift | 39 +++++++++++++++++++++++++++++++++++++++ Pods/Alamofire/Source/URLSessionConfiguration+Alamofire.swift | 37 +++++++++++++++++++++++++++++++++++++ Pods/Alamofire/Source/Validation.swift | 247 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/Google-Maps-iOS-Utils/LICENSE | 191 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/Google-Maps-iOS-Utils/README.md | 101 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/Google-Maps-iOS-Utils/src/Clustering/Algo/GMUClusterAlgorithm.h | 47 +++++++++++++++++++++++++++++++++++++++++++++++ Pods/Google-Maps-iOS-Utils/src/Clustering/Algo/GMUGridBasedClusterAlgorithm.h | 26 ++++++++++++++++++++++++++ Pods/Google-Maps-iOS-Utils/src/Clustering/Algo/GMUGridBasedClusterAlgorithm.m | 79 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/Google-Maps-iOS-Utils/src/Clustering/Algo/GMUNonHierarchicalDistanceBasedAlgorithm.h | 39 +++++++++++++++++++++++++++++++++++++++ Pods/Google-Maps-iOS-Utils/src/Clustering/Algo/GMUNonHierarchicalDistanceBasedAlgorithm.m | 198 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/Google-Maps-iOS-Utils/src/Clustering/Algo/GMUSimpleClusterAlgorithm.h | 25 +++++++++++++++++++++++++ Pods/Google-Maps-iOS-Utils/src/Clustering/Algo/GMUSimpleClusterAlgorithm.m | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/Google-Maps-iOS-Utils/src/Clustering/Algo/GMUWrappingDictionaryKey.h | 26 ++++++++++++++++++++++++++ Pods/Google-Maps-iOS-Utils/src/Clustering/Algo/GMUWrappingDictionaryKey.m | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/Google-Maps-iOS-Utils/src/Clustering/GMUCluster.h | 45 +++++++++++++++++++++++++++++++++++++++++++++ Pods/Google-Maps-iOS-Utils/src/Clustering/GMUClusterItem.h | 28 ++++++++++++++++++++++++++++ Pods/Google-Maps-iOS-Utils/src/Clustering/GMUClusterManager+Testing.h | 28 ++++++++++++++++++++++++++++ Pods/Google-Maps-iOS-Utils/src/Clustering/GMUClusterManager.h | 133 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/Google-Maps-iOS-Utils/src/Clustering/GMUClusterManager.m | 280 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/Google-Maps-iOS-Utils/src/Clustering/GMUStaticCluster.h | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/Google-Maps-iOS-Utils/src/Clustering/GMUStaticCluster.m | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/Google-Maps-iOS-Utils/src/Clustering/View/GMUClusterIconGenerator.h | 29 +++++++++++++++++++++++++++++ Pods/Google-Maps-iOS-Utils/src/Clustering/View/GMUClusterRenderer.h | 36 ++++++++++++++++++++++++++++++++++++ Pods/Google-Maps-iOS-Utils/src/Clustering/View/GMUDefaultClusterIconGenerator+Testing.h | 30 ++++++++++++++++++++++++++++++ Pods/Google-Maps-iOS-Utils/src/Clustering/View/GMUDefaultClusterIconGenerator.h | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/Google-Maps-iOS-Utils/src/Clustering/View/GMUDefaultClusterIconGenerator.m | 212 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/Google-Maps-iOS-Utils/src/Clustering/View/GMUDefaultClusterRenderer.h | 162 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/Google-Maps-iOS-Utils/src/Clustering/View/GMUDefaultClusterRenderer.m | 395 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/Google-Maps-iOS-Utils/src/Geometry/GMUGeoJSONParser.h | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/Google-Maps-iOS-Utils/src/Geometry/GMUGeoJSONParser.m | 334 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/Google-Maps-iOS-Utils/src/Geometry/GMUGeometryRenderer+Testing.h | 23 +++++++++++++++++++++++ Pods/Google-Maps-iOS-Utils/src/Geometry/GMUGeometryRenderer.h | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/Google-Maps-iOS-Utils/src/Geometry/GMUGeometryRenderer.m | 327 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/Google-Maps-iOS-Utils/src/Geometry/GMUKMLParser.h | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/Google-Maps-iOS-Utils/src/Geometry/GMUKMLParser.m | 721 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUFeature.h | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUFeature.m | 36 ++++++++++++++++++++++++++++++++++++ Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUGeometry.h | 32 ++++++++++++++++++++++++++++++++ Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUGeometryCollection.h | 41 +++++++++++++++++++++++++++++++++++++++++ Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUGeometryCollection.m | 30 ++++++++++++++++++++++++++++++ Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUGeometryContainer.h | 40 ++++++++++++++++++++++++++++++++++++++++ Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUGroundOverlay.h | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUGroundOverlay.m | 38 ++++++++++++++++++++++++++++++++++++++ Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMULineString.h | 43 +++++++++++++++++++++++++++++++++++++++++++ Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMULineString.m | 30 ++++++++++++++++++++++++++++++ Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUPair.h | 35 +++++++++++++++++++++++++++++++++++ Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUPair.m | 32 ++++++++++++++++++++++++++++++++ Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUPlacemark.h | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUPlacemark.m | 39 +++++++++++++++++++++++++++++++++++++++ Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUPoint.h | 42 ++++++++++++++++++++++++++++++++++++++++++ Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUPoint.m | 30 ++++++++++++++++++++++++++++++ Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUPolygon.h | 44 ++++++++++++++++++++++++++++++++++++++++++++ Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUPolygon.m | 30 ++++++++++++++++++++++++++++++ Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUStyle.h | 111 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUStyle.m | 47 +++++++++++++++++++++++++++++++++++++++++++++++ Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUStyleMap.h | 32 ++++++++++++++++++++++++++++++++ Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUStyleMap.m | 33 +++++++++++++++++++++++++++++++++ Pods/Google-Maps-iOS-Utils/src/Heatmap/GMUGradient.h | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/Google-Maps-iOS-Utils/src/Heatmap/GMUGradient.m | 125 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/Google-Maps-iOS-Utils/src/Heatmap/GMUHeatmapTileLayer.h | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/Google-Maps-iOS-Utils/src/Heatmap/GMUHeatmapTileLayer.m | 354 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/Google-Maps-iOS-Utils/src/Heatmap/GMUWeightedLatLng.h | 35 +++++++++++++++++++++++++++++++++++ Pods/Google-Maps-iOS-Utils/src/Heatmap/GMUWeightedLatLng.m | 42 ++++++++++++++++++++++++++++++++++++++++++ Pods/Google-Maps-iOS-Utils/src/QuadTree/GQTBounds.h | 23 +++++++++++++++++++++++ Pods/Google-Maps-iOS-Utils/src/QuadTree/GQTPoint.h | 19 +++++++++++++++++++ Pods/Google-Maps-iOS-Utils/src/QuadTree/GQTPointQuadTree.h | 73 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/Google-Maps-iOS-Utils/src/QuadTree/GQTPointQuadTree.m | 115 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/Google-Maps-iOS-Utils/src/QuadTree/GQTPointQuadTreeChild.h | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/Google-Maps-iOS-Utils/src/QuadTree/GQTPointQuadTreeChild.m | 222 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/Google-Maps-iOS-Utils/src/QuadTree/GQTPointQuadTreeItem.h | 23 +++++++++++++++++++++++ Pods/GoogleMaps/Base/Frameworks/GoogleMapsBase.framework/GoogleMapsBase | Bin 0 -> 42157725 bytes Pods/GoogleMaps/Base/Frameworks/GoogleMapsBase.framework/Headers/GMSCompatabilityMacros.h | 17 +++++++++++++++++ Pods/GoogleMaps/Base/Frameworks/GoogleMapsBase.framework/Headers/GMSCoordinateBounds.h | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GoogleMaps/Base/Frameworks/GoogleMapsBase.framework/Headers/GMSDeprecationMacros.h | 22 ++++++++++++++++++++++ Pods/GoogleMaps/Base/Frameworks/GoogleMapsBase.framework/Headers/GoogleMapsBase.h | 3 +++ Pods/GoogleMaps/Base/Frameworks/GoogleMapsBase.framework/Modules/module.modulemap | 14 ++++++++++++++ Pods/GoogleMaps/CHANGELOG.md | 2 ++ Pods/GoogleMaps/Example/GoogleMapsDemos.xcodeproj/project.pbxproj | 648 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GoogleMaps/Example/GoogleMapsDemos/DemoAppDelegate.h | 32 ++++++++++++++++++++++++++++++++ Pods/GoogleMaps/Example/GoogleMapsDemos/DemoAppDelegate.m | 113 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GoogleMaps/Example/GoogleMapsDemos/Info.plist | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GoogleMaps/Example/GoogleMapsDemos/MapsDemoAssets.xcassets/AppIcon.appiconset/Contents.json | 98 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GoogleMaps/Example/GoogleMapsDemos/MapsDemoAssets.xcassets/AppIcon.appiconset/Maps-SDK-Demo-App_120.png | Bin 0 -> 6322 bytes Pods/GoogleMaps/Example/GoogleMapsDemos/MapsDemoAssets.xcassets/AppIcon.appiconset/Maps-SDK-Demo-App_152.png | Bin 0 -> 8024 bytes Pods/GoogleMaps/Example/GoogleMapsDemos/MapsDemoAssets.xcassets/AppIcon.appiconset/Maps-SDK-Demo-App_167.png | Bin 0 -> 8869 bytes Pods/GoogleMaps/Example/GoogleMapsDemos/MapsDemoAssets.xcassets/AppIcon.appiconset/Maps-SDK-Demo-App_180.png | Bin 0 -> 9622 bytes Pods/GoogleMaps/Example/GoogleMapsDemos/MapsDemoAssets.xcassets/AppIcon.appiconset/Maps-SDK-Demo-App_76.png | Bin 0 -> 3849 bytes Pods/GoogleMaps/Example/GoogleMapsDemos/MapsDemoAssets.xcassets/Contents.json | 6 ++++++ Pods/GoogleMaps/Example/GoogleMapsDemos/MasterViewController.h | 27 +++++++++++++++++++++++++++ Pods/GoogleMaps/Example/GoogleMapsDemos/MasterViewController.m | 160 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/LaunchScreen.storyboard | 123 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/Museum-Icons/h1.png | Bin 0 -> 299 bytes Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/Museum-Icons/h1@2x.png | Bin 0 -> 542 bytes Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/Museum-Icons/spitfire.png | Bin 0 -> 353 bytes Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/Museum-Icons/spitfire@2x.png | Bin 0 -> 612 bytes Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/Museum-Icons/voyager.png | Bin 0 -> 416 bytes Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/Museum-Icons/voyager@2x.png | Bin 0 -> 799 bytes Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/Museum-Icons/x29.png | Bin 0 -> 338 bytes Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/Museum-Icons/x29@2x.png | Bin 0 -> 608 bytes Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/aeroplane.png | Bin 0 -> 1302 bytes Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/aeroplane@2x.png | Bin 0 -> 3069 bytes Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/ar.lproj/InfoPlist.strings | 2 ++ Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/argentina-large.png | Bin 0 -> 558 bytes Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/argentina.png | Bin 0 -> 499 bytes Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/arrow.png | Bin 0 -> 1241 bytes Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/arrow@2x.png | Bin 0 -> 2793 bytes Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/australia-large.png | Bin 0 -> 11344 bytes Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/australia-large@2x.png | Bin 0 -> 29365 bytes Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/australia.png | Bin 0 -> 1298 bytes Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/boat.png | Bin 0 -> 915 bytes Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/boat@2x.png | Bin 0 -> 2237 bytes Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/botswana-large.png | Bin 0 -> 170 bytes Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/botswana.png | Bin 0 -> 473 bytes Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/bulgaria-large.png | Bin 0 -> 378 bytes Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/bulgaria.png | Bin 0 -> 383 bytes Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/ca.lproj/InfoPlist.strings | 2 ++ Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/cs.lproj/InfoPlist.strings | 2 ++ Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/da.lproj/InfoPlist.strings | 2 ++ Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/de.lproj/InfoPlist.strings | 2 ++ Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/el.lproj/InfoPlist.strings | 2 ++ Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/en.lproj/InfoPlist.strings | 2 ++ Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/en_GB.lproj/InfoPlist.strings | 2 ++ Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/es.lproj/InfoPlist.strings | 2 ++ Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/fi.lproj/InfoPlist.strings | 2 ++ Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/fr.lproj/InfoPlist.strings | 2 ++ Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/glow-marker.png | Bin 0 -> 1800 bytes Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/glow-marker@2x.png | Bin 0 -> 4109 bytes Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/he.lproj/InfoPlist.strings | 2 ++ Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/hr.lproj/InfoPlist.strings | 2 ++ Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/hu.lproj/InfoPlist.strings | 2 ++ Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/id.lproj/InfoPlist.strings | 2 ++ Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/it.lproj/InfoPlist.strings | 2 ++ Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/ja.lproj/InfoPlist.strings | 2 ++ Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/ko.lproj/InfoPlist.strings | 2 ++ Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/mapstyle-night.json | 191 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/mapstyle-retro.json | 191 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/mapstyle-silver.json | 101 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/ms.lproj/InfoPlist.strings | 2 ++ Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/museum-exhibits.json | 30 ++++++++++++++++++++++++++++++ Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/nb.lproj/InfoPlist.strings | 2 ++ Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/newark_nj_1922.jpg | Bin 0 -> 143740 bytes Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/nl.lproj/InfoPlist.strings | 2 ++ Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/pl.lproj/InfoPlist.strings | 2 ++ Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/popup_santa.png | Bin 0 -> 7543 bytes Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/popup_santa@2x.png | Bin 0 -> 19306 bytes Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/pt.lproj/InfoPlist.strings | 2 ++ Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/pt_PT.lproj/InfoPlist.strings | 2 ++ Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/ro.lproj/InfoPlist.strings | 2 ++ Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/ru.lproj/InfoPlist.strings | 2 ++ Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/sk.lproj/InfoPlist.strings | 2 ++ Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step1.png | Bin 0 -> 2767 bytes Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step1@2x.png | Bin 0 -> 4866 bytes Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step2.png | Bin 0 -> 2787 bytes Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step2@2x.png | Bin 0 -> 4819 bytes Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step3.png | Bin 0 -> 2118 bytes Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step3@2x.png | Bin 0 -> 3845 bytes Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step4.png | Bin 0 -> 2559 bytes Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step4@2x.png | Bin 0 -> 4484 bytes Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step5.png | Bin 0 -> 2869 bytes Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step5@2x.png | Bin 0 -> 5031 bytes Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step6.png | Bin 0 -> 2667 bytes Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step6@2x.png | Bin 0 -> 4638 bytes Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step7.png | Bin 0 -> 2183 bytes Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step7@2x.png | Bin 0 -> 3838 bytes Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step8.png | Bin 0 -> 2676 bytes Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step8@2x.png | Bin 0 -> 4768 bytes Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/sv.lproj/InfoPlist.strings | 2 ++ Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/th.lproj/InfoPlist.strings | 2 ++ Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/tr.lproj/InfoPlist.strings | 2 ++ Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/track.json | 1 + Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/uk.lproj/InfoPlist.strings | 2 ++ Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/vi.lproj/InfoPlist.strings | 2 ++ Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/zh_CN.lproj/InfoPlist.strings | 2 ++ Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/zh_TW.lproj/InfoPlist.strings | 2 ++ Pods/GoogleMaps/Example/GoogleMapsDemos/SDKDemoAPIKey.h | 25 +++++++++++++++++++++++++ Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/AnimatedCurrentLocationViewController.h | 23 +++++++++++++++++++++++ Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/AnimatedCurrentLocationViewController.m | 105 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/AnimatedUIViewMarkerViewController.h | 20 ++++++++++++++++++++ Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/AnimatedUIViewMarkerViewController.m | 130 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/BasicMapViewController.h | 22 ++++++++++++++++++++++ Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/BasicMapViewController.m | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/CameraViewController.h | 20 ++++++++++++++++++++ Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/CameraViewController.m | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/CustomIndoorViewController.h | 19 +++++++++++++++++++ Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/CustomIndoorViewController.m | 150 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/CustomMarkersViewController.h | 20 ++++++++++++++++++++ Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/CustomMarkersViewController.m | 120 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/DoubleMapViewController.h | 20 ++++++++++++++++++++ Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/DoubleMapViewController.m | 77 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/FitBoundsViewController.h | 20 ++++++++++++++++++++ Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/FitBoundsViewController.m | 91 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/FixedPanoramaViewController.h | 20 ++++++++++++++++++++ Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/FixedPanoramaViewController.m | 44 ++++++++++++++++++++++++++++++++++++++++++++ Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/FrameRateViewController.h | 20 ++++++++++++++++++++ Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/FrameRateViewController.m | 88 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/GeocoderViewController.h | 22 ++++++++++++++++++++++ Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/GeocoderViewController.m | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/GestureControlViewController.h | 20 ++++++++++++++++++++ Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/GestureControlViewController.m | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/GradientPolylinesViewController.h | 20 ++++++++++++++++++++ Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/GradientPolylinesViewController.m | 87 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/GroundOverlayViewController.h | 20 ++++++++++++++++++++ Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/GroundOverlayViewController.m | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/IndoorMuseumNavigationViewController.h | 24 ++++++++++++++++++++++++ Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/IndoorMuseumNavigationViewController.m | 126 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/IndoorViewController.h | 20 ++++++++++++++++++++ Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/IndoorViewController.m | 94 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MapLayerViewController.h | 20 ++++++++++++++++++++ Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MapLayerViewController.m | 91 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MapTypesViewController.h | 20 ++++++++++++++++++++ Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MapTypesViewController.m | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MapZoomViewController.h | 20 ++++++++++++++++++++ Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MapZoomViewController.m | 85 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MarkerEventsViewController.h | 22 ++++++++++++++++++++++ Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MarkerEventsViewController.m | 81 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MarkerInfoWindowViewController.h | 20 ++++++++++++++++++++ Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MarkerInfoWindowViewController.m | 97 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MarkerLayerViewController.h | 22 ++++++++++++++++++++++ Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MarkerLayerViewController.m | 148 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MarkersViewController.h | 20 ++++++++++++++++++++ Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MarkersViewController.m | 74 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MyLocationViewController.h | 22 ++++++++++++++++++++++ Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MyLocationViewController.m | 88 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/PaddingBehaviorViewController.h | 20 ++++++++++++++++++++ Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/PaddingBehaviorViewController.m | 142 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/PanoramaViewController.h | 20 ++++++++++++++++++++ Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/PanoramaViewController.m | 84 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/PolygonsViewController.h | 22 ++++++++++++++++++++++ Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/PolygonsViewController.m | 274 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/PolylinesViewController.h | 20 ++++++++++++++++++++ Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/PolylinesViewController.m | 115 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/Samples.h | 24 ++++++++++++++++++++++++ Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/Samples.m | 183 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/SnapshotReadyViewController.h | 20 ++++++++++++++++++++ Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/SnapshotReadyViewController.m | 108 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/StructuredGeocoderViewController.h | 20 ++++++++++++++++++++ Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/StructuredGeocoderViewController.m | 91 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/StyledMapViewController.h | 20 ++++++++++++++++++++ Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/StyledMapViewController.m | 123 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/TileLayerViewController.h | 20 ++++++++++++++++++++ Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/TileLayerViewController.m | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/TrafficMapViewController.h | 20 ++++++++++++++++++++ Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/TrafficMapViewController.m | 33 +++++++++++++++++++++++++++++++++ Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/VisibleRegionViewController.h | 20 ++++++++++++++++++++ Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/VisibleRegionViewController.m | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GoogleMaps/Example/GoogleMapsDemos/UIViewController+GMSToastMessages.h | 26 ++++++++++++++++++++++++++ Pods/GoogleMaps/Example/GoogleMapsDemos/UIViewController+GMSToastMessages.m | 36 ++++++++++++++++++++++++++++++++++++ Pods/GoogleMaps/Example/GoogleMapsDemos/main.m | 24 ++++++++++++++++++++++++ Pods/GoogleMaps/Example/Podfile | 6 ++++++ Pods/GoogleMaps/Example/README.GoogleMapsDemos | 21 +++++++++++++++++++++ Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/GoogleMaps | Bin 0 -> 37121940 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSAddress.h | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSCALayer.h | 20 ++++++++++++++++++++ Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSCameraPosition.h | 166 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSCameraUpdate.h | 109 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSCircle.h | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSCoordinateBounds+GoogleMaps.h | 42 ++++++++++++++++++++++++++++++++++++++++++ Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSGeocoder.h | 74 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSGeometryUtils.h | 243 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSGroundOverlay.h | 85 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSIndoorBuilding.h | 43 +++++++++++++++++++++++++++++++++++++++++++ Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSIndoorDisplay.h | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSIndoorLevel.h | 32 ++++++++++++++++++++++++++++++++ Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSMapLayer.h | 110 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSMapStyle.h | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSMapView+Animation.h | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSMapView.h | 520 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSMarker.h | 179 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSMarkerLayer.h | 47 +++++++++++++++++++++++++++++++++++++++++++++++ Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSMutablePath.h | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSOrientation.h | 44 ++++++++++++++++++++++++++++++++++++++++++++ Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSOverlay.h | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSOverlayLayer.h | 30 ++++++++++++++++++++++++++++++ Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSPanorama.h | 34 ++++++++++++++++++++++++++++++++++ Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSPanoramaCamera.h | 81 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSPanoramaCameraUpdate.h | 37 +++++++++++++++++++++++++++++++++++++ Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSPanoramaLayer.h | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSPanoramaLink.h | 30 ++++++++++++++++++++++++++++++ Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSPanoramaService.h | 83 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSPanoramaSource.h | 30 ++++++++++++++++++++++++++++++ Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSPanoramaView.h | 300 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSPath.h | 112 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSPolygon.h | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSPolygonLayer.h | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSPolyline.h | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSProjection.h | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSServices.h | 77 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSStrokeStyle.h | 26 ++++++++++++++++++++++++++ Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSStyleSpan.h | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSSyncTileLayer.h | 35 +++++++++++++++++++++++++++++++++++ Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSTileLayer.h | 105 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSUISettings.h | 91 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSURLTileLayer.h | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GoogleMaps.h | 42 ++++++++++++++++++++++++++++++++++++++++++ Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Modules/module.modulemap | 21 +++++++++++++++++++++ Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCacheStorage.momd/Storage.mom | Bin 0 -> 4615 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCacheStorage.momd/StorageWithTileProto.mom | Bin 0 -> 5211 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCacheStorage.momd/StorageWithTileVersionID.mom | Bin 0 -> 4721 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCacheStorage.momd/VersionInfo.plist | Bin 0 -> 1197 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/Assets.car | Bin 0 -> 103536 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/DroidSansMerged-Regular.ttf | Bin 0 -> 392092 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/GMSNavNightModeSprites-0-1x.png | Bin 0 -> 3393 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/GMSNavNightModeSprites-0-2x.png | Bin 0 -> 7660 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/GMSNavNightModeSprites-0-3x.png | Bin 0 -> 12519 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/GMSNavSprites-0-1x.png | Bin 0 -> 5684 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/GMSNavSprites-0-2x.png | Bin 0 -> 13321 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/GMSNavSprites-0-3x.png | Bin 0 -> 20924 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/GMSSprites-0-1x.png | Bin 0 -> 11011 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/GMSSprites-0-2x.png | Bin 0 -> 27655 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/GMSSprites-0-3x.png | Bin 0 -> 62570 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/Info.plist | Bin 0 -> 364 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/Tharlon-Regular.ttf | Bin 0 -> 353228 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ar.lproj/GMSCore.strings | Bin 0 -> 4459 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/button_background.png | Bin 0 -> 334 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/button_background@2x.png | Bin 0 -> 433 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/button_background@3x.png | Bin 0 -> 515 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/button_compass.png | Bin 0 -> 631 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/button_compass@2x.png | Bin 0 -> 2560 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/button_compass_night.png | Bin 0 -> 720 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/button_compass_night@2x.png | Bin 0 -> 2221 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/button_my_location.png | Bin 0 -> 492 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/button_my_location@2x.png | Bin 0 -> 1229 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ca.lproj/GMSCore.strings | Bin 0 -> 3518 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/cs.lproj/GMSCore.strings | Bin 0 -> 3914 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/da.lproj/GMSCore.strings | Bin 0 -> 3584 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/dav_one_way_16_256.png | Bin 0 -> 315 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/de.lproj/GMSCore.strings | Bin 0 -> 3571 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/el.lproj/GMSCore.strings | Bin 0 -> 3947 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/en.lproj/GMSCore.strings | Bin 0 -> 3323 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/en_AU.lproj/GMSCore.strings | Bin 0 -> 3340 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/en_GB.lproj/GMSCore.strings | Bin 0 -> 3340 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/en_IN.lproj/GMSCore.strings | Bin 0 -> 3340 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/es.lproj/GMSCore.strings | Bin 0 -> 3620 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/es_419.lproj/GMSCore.strings | Bin 0 -> 3619 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/es_MX.lproj/GMSCore.strings | Bin 0 -> 3619 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/fi.lproj/GMSCore.strings | Bin 0 -> 3527 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/fr.lproj/GMSCore.strings | Bin 0 -> 3895 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/fr_CA.lproj/GMSCore.strings | Bin 0 -> 3604 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/he.lproj/GMSCore.strings | Bin 0 -> 3684 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/hi.lproj/GMSCore.strings | Bin 0 -> 3509 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/hr.lproj/GMSCore.strings | Bin 0 -> 3544 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/hu.lproj/GMSCore.strings | Bin 0 -> 3454 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_compass_needle.png | Bin 0 -> 483 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_compass_needle@2x.png | Bin 0 -> 992 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_compass_needle_32pt.png | Bin 0 -> 742 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_compass_needle_32pt@2x.png | Bin 0 -> 1360 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_compass_needle_32pt@3x.png | Bin 0 -> 1962 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_compass_needle_large.png | Bin 0 -> 1114 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_compass_needle_large@2x.png | Bin 0 -> 2446 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_compass_needle_large@3x.png | Bin 0 -> 3304 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_location_off.png | Bin 0 -> 498 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_location_off@2x.png | Bin 0 -> 860 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_location_off@3x.png | Bin 0 -> 1577 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_qu_direction_mylocation.png | Bin 0 -> 362 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_qu_direction_mylocation@2x.png | Bin 0 -> 663 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_qu_direction_mylocation@3x.png | Bin 0 -> 1240 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/id.lproj/GMSCore.strings | Bin 0 -> 3261 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/it.lproj/GMSCore.strings | Bin 0 -> 3395 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ja.lproj/GMSCore.strings | Bin 0 -> 3142 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ko.lproj/GMSCore.strings | Bin 0 -> 3184 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/lt.lproj/GMSCore.strings | Bin 0 -> 3601 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/lv.lproj/GMSCore.strings | Bin 0 -> 3897 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ms.lproj/GMSCore.strings | Bin 0 -> 3279 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/nb.lproj/GMSCore.strings | Bin 0 -> 3497 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/nl.lproj/GMSCore.strings | Bin 0 -> 3421 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/pl.lproj/GMSCore.strings | Bin 0 -> 3745 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/polyline_colors_texture.png | Bin 0 -> 7433 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/polyline_colors_texture_dim.png | Bin 0 -> 7485 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/pt.lproj/GMSCore.strings | Bin 0 -> 3668 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/pt_BR.lproj/GMSCore.strings | Bin 0 -> 3668 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/pt_PT.lproj/GMSCore.strings | Bin 0 -> 3651 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ro.lproj/GMSCore.strings | Bin 0 -> 3762 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/road_1-1.png | Bin 0 -> 95 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/road_128-32.png | Bin 0 -> 1029 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/road_16-4.png | Bin 0 -> 127 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/road_2-1.png | Bin 0 -> 84 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/road_256-64.png | Bin 0 -> 1934 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/road_32-8.png | Bin 0 -> 223 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/road_4-1.png | Bin 0 -> 74 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/road_64-16.png | Bin 0 -> 425 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/road_8-2.png | Bin 0 -> 93 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ru.lproj/GMSCore.strings | Bin 0 -> 4024 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/sk.lproj/GMSCore.strings | Bin 0 -> 3679 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/sv.lproj/GMSCore.strings | Bin 0 -> 3717 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/th.lproj/GMSCore.strings | Bin 0 -> 3458 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/tr.lproj/GMSCore.strings | Bin 0 -> 3455 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/uk.lproj/GMSCore.strings | Bin 0 -> 4204 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/vi.lproj/GMSCore.strings | Bin 0 -> 3510 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/zh_CN.lproj/GMSCore.strings | Bin 0 -> 3114 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/zh_HK.lproj/GMSCore.strings | Bin 0 -> 3112 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/zh_TW.lproj/GMSCore.strings | Bin 0 -> 3137 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/Info.plist | Bin 0 -> 367 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/bubble_left.png | Bin 0 -> 451 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/bubble_left@2x.png | Bin 0 -> 1055 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/bubble_left@3x.png | Bin 0 -> 2386 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/bubble_right.png | Bin 0 -> 455 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/bubble_right@2x.png | Bin 0 -> 1051 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/bubble_right@3x.png | Bin 0 -> 2374 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/default_marker.png | Bin 0 -> 1379 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/default_marker@2x.png | Bin 0 -> 2815 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/default_marker@3x.png | Bin 0 -> 4275 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/ic_error.png | Bin 0 -> 236 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/ic_error@2x.png | Bin 0 -> 454 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/ic_error@3x.png | Bin 0 -> 743 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/oss_licenses_maps.txt.gz | Bin 0 -> 53981 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMapsCore.framework/GoogleMapsCore | Bin 0 -> 94696876 bytes Pods/GoogleMaps/Maps/Frameworks/GoogleMapsCore.framework/Modules/module.modulemap | 20 ++++++++++++++++++++ Pods/GoogleMaps/README.md | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GooglePlaces/CHANGELOG.md | 2 ++ Pods/GooglePlaces/Example/GooglePlacesDemos.xcodeproj/project.pbxproj | 451 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GooglePlaces/Example/GooglePlacesDemos/DemoAppDelegate.h | 22 ++++++++++++++++++++++ Pods/GooglePlaces/Example/GooglePlacesDemos/DemoAppDelegate.m | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GooglePlaces/Example/GooglePlacesDemos/DemoData.h | 97 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GooglePlaces/Example/GooglePlacesDemos/DemoData.m | 102 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GooglePlaces/Example/GooglePlacesDemos/DemoListViewController.h | 32 ++++++++++++++++++++++++++++++++ Pods/GooglePlaces/Example/GooglePlacesDemos/DemoListViewController.m | 417 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GooglePlaces/Example/GooglePlacesDemos/Info.plist | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/Base.lproj/LaunchScreen.storyboard | 123 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/PlacesDemoAssets.xcassets/AppIcon.appiconset/Contents.json | 98 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/PlacesDemoAssets.xcassets/AppIcon.appiconset/Places-API-Demo-App_120.png | Bin 0 -> 6973 bytes Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/PlacesDemoAssets.xcassets/AppIcon.appiconset/Places-API-Demo-App_152.png | Bin 0 -> 8971 bytes Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/PlacesDemoAssets.xcassets/AppIcon.appiconset/Places-API-Demo-App_167.png | Bin 0 -> 10297 bytes Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/PlacesDemoAssets.xcassets/AppIcon.appiconset/Places-API-Demo-App_180.png | Bin 0 -> 11114 bytes Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/PlacesDemoAssets.xcassets/AppIcon.appiconset/Places-API-Demo-App_76.png | Bin 0 -> 3784 bytes Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/PlacesDemoAssets.xcassets/Contents.json | 6 ++++++ Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/ar.lproj/Localizable.strings | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/ca.lproj/Localizable.strings | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/cs.lproj/Localizable.strings | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/da.lproj/Localizable.strings | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/de.lproj/Localizable.strings | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/el.lproj/Localizable.strings | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/en.lproj/Localizable.strings | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/en_AU.lproj/Localizable.strings | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/en_GB.lproj/Localizable.strings | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/en_IN.lproj/Localizable.strings | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/es.lproj/Localizable.strings | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/es_419.lproj/Localizable.strings | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/es_MX.lproj/Localizable.strings | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/fi.lproj/Localizable.strings | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/fr.lproj/Localizable.strings | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/fr_CA.lproj/Localizable.strings | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/he.lproj/Localizable.strings | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/hi.lproj/Localizable.strings | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/hr.lproj/Localizable.strings | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/hu.lproj/Localizable.strings | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/id.lproj/Localizable.strings | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/it.lproj/Localizable.strings | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/ja.lproj/Localizable.strings | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/ko.lproj/Localizable.strings | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/ms.lproj/Localizable.strings | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/nb.lproj/Localizable.strings | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/nl.lproj/Localizable.strings | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/pl.lproj/Localizable.strings | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/pt.lproj/Localizable.strings | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/pt_BR.lproj/Localizable.strings | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/pt_PT.lproj/Localizable.strings | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/ro.lproj/Localizable.strings | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/ru.lproj/Localizable.strings | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/sk.lproj/Localizable.strings | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/sv.lproj/Localizable.strings | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/th.lproj/Localizable.strings | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/tr.lproj/Localizable.strings | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/uk.lproj/Localizable.strings | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/vi.lproj/Localizable.strings | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/zh_CN.lproj/Localizable.strings | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/zh_HK.lproj/Localizable.strings | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/zh_TW.lproj/Localizable.strings | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GooglePlaces/Example/GooglePlacesDemos/SDKDemoAPIKey.h | 25 +++++++++++++++++++++++++ Pods/GooglePlaces/Example/GooglePlacesDemos/Samples/Autocomplete/AutocompleteBaseViewController.h | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GooglePlaces/Example/GooglePlacesDemos/Samples/Autocomplete/AutocompleteBaseViewController.m | 220 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GooglePlaces/Example/GooglePlacesDemos/Samples/Autocomplete/AutocompleteModalViewController.h | 23 +++++++++++++++++++++++ Pods/GooglePlaces/Example/GooglePlacesDemos/Samples/Autocomplete/AutocompleteModalViewController.m | 86 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GooglePlaces/Example/GooglePlacesDemos/Samples/Autocomplete/AutocompletePushViewController.h | 23 +++++++++++++++++++++++ Pods/GooglePlaces/Example/GooglePlacesDemos/Samples/Autocomplete/AutocompletePushViewController.m | 95 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GooglePlaces/Example/GooglePlacesDemos/Samples/Autocomplete/AutocompleteWithCustomColors.h | 23 +++++++++++++++++++++++ Pods/GooglePlaces/Example/GooglePlacesDemos/Samples/Autocomplete/AutocompleteWithCustomColors.m | 389 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GooglePlaces/Example/GooglePlacesDemos/Samples/Autocomplete/AutocompleteWithSearchViewController.h | 23 +++++++++++++++++++++++ Pods/GooglePlaces/Example/GooglePlacesDemos/Samples/Autocomplete/AutocompleteWithSearchViewController.m | 114 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GooglePlaces/Example/GooglePlacesDemos/Samples/Autocomplete/AutocompleteWithTextFieldController.h | 24 ++++++++++++++++++++++++ Pods/GooglePlaces/Example/GooglePlacesDemos/Samples/Autocomplete/AutocompleteWithTextFieldController.m | 194 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GooglePlaces/Example/GooglePlacesDemos/Samples/FindPlaceLikelihoodListViewController.h | 25 +++++++++++++++++++++++++ Pods/GooglePlaces/Example/GooglePlacesDemos/Samples/FindPlaceLikelihoodListViewController.m | 274 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GooglePlaces/Example/GooglePlacesDemos/Samples/PagingPhotoView.h | 40 ++++++++++++++++++++++++++++++++++++++++ Pods/GooglePlaces/Example/GooglePlacesDemos/Samples/PagingPhotoView.m | 180 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GooglePlaces/Example/GooglePlacesDemos/Support/BaseDemoViewController.h | 31 +++++++++++++++++++++++++++++++ Pods/GooglePlaces/Example/GooglePlacesDemos/Support/BaseDemoViewController.m | 32 ++++++++++++++++++++++++++++++++ Pods/GooglePlaces/Example/GooglePlacesDemos/main.m | 24 ++++++++++++++++++++++++ Pods/GooglePlaces/Example/Podfile | 7 +++++++ Pods/GooglePlaces/Example/README.GooglePlacesDemos | 18 ++++++++++++++++++ Pods/GooglePlaces/Frameworks/GooglePlaces.framework/GooglePlaces | Bin 0 -> 5831924 bytes Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSAddressComponent.h | 43 +++++++++++++++++++++++++++++++++++++++++++ Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSAutocompleteBoundsMode.h | 32 ++++++++++++++++++++++++++++++++ Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSAutocompleteFetcher.h | 103 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSAutocompleteFilter.h | 112 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSAutocompleteMatchFragment.h | 40 ++++++++++++++++++++++++++++++++++++++++ Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSAutocompletePrediction.h | 106 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSAutocompleteResultsViewController.h | 152 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSAutocompleteSessionToken.h | 23 +++++++++++++++++++++++ Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSAutocompleteTableDataSource.h | 188 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSAutocompleteViewController.h | 167 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSOpeningHours.h | 136 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSPlace.h | 227 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSPlaceFieldMask.h | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSPlaceLikelihood.h | 47 +++++++++++++++++++++++++++++++++++++++++++++++ Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSPlaceLikelihoodList.h | 42 ++++++++++++++++++++++++++++++++++++++++++ Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSPlaceLocationOptions.h | 31 +++++++++++++++++++++++++++++++ Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSPlacePhotoMetadata.h | 43 +++++++++++++++++++++++++++++++++++++++++++ Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSPlacePhotoMetadataList.h | 29 +++++++++++++++++++++++++++++ Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSPlaceTypes.h | 164 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSPlacesClient.h | 327 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSPlacesErrors.h | 119 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSPlusCode.h | 29 +++++++++++++++++++++++++++++ Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GooglePlaces.h | 22 ++++++++++++++++++++++ Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Modules/module.modulemap | 17 +++++++++++++++++ Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/Info.plist | Bin 0 -> 343 bytes Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/ar.lproj/GooglePlaces.strings | Bin 0 -> 5120 bytes Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/build-with-google-black.png | Bin 0 -> 1204 bytes Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/build-with-google-black@2x.png | Bin 0 -> 2419 bytes Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/build-with-google-black@3x.png | Bin 0 -> 3701 bytes Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/build-with-google-white.png | Bin 0 -> 1173 bytes Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/build-with-google-white@2x.png | Bin 0 -> 2861 bytes Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/build-with-google-white@3x.png | Bin 0 -> 4372 bytes Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/ca.lproj/GooglePlaces.strings | Bin 0 -> 4929 bytes Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/cs.lproj/GooglePlaces.strings | Bin 0 -> 5251 bytes Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/da.lproj/GooglePlaces.strings | Bin 0 -> 4364 bytes Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/de.lproj/GooglePlaces.strings | Bin 0 -> 4440 bytes Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/el.lproj/GooglePlaces.strings | Bin 0 -> 5898 bytes Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/en.lproj/GooglePlaces.strings | Bin 0 -> 4114 bytes Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/en_AU.lproj/GooglePlaces.strings | Bin 0 -> 4090 bytes Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/en_GB.lproj/GooglePlaces.strings | Bin 0 -> 4090 bytes Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/en_IN.lproj/GooglePlaces.strings | Bin 0 -> 4087 bytes Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/es.lproj/GooglePlaces.strings | Bin 0 -> 5181 bytes Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/es_419.lproj/GooglePlaces.strings | Bin 0 -> 5067 bytes Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/es_MX.lproj/GooglePlaces.strings | Bin 0 -> 5067 bytes Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/fi.lproj/GooglePlaces.strings | Bin 0 -> 4545 bytes Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/fr.lproj/GooglePlaces.strings | Bin 0 -> 5117 bytes Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/fr_CA.lproj/GooglePlaces.strings | Bin 0 -> 5082 bytes Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/he.lproj/GooglePlaces.strings | Bin 0 -> 4972 bytes Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/hi.lproj/GooglePlaces.strings | Bin 0 -> 5694 bytes Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/hr.lproj/GooglePlaces.strings | Bin 0 -> 5002 bytes Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/hu.lproj/GooglePlaces.strings | Bin 0 -> 5096 bytes Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/id.lproj/GooglePlaces.strings | Bin 0 -> 4266 bytes Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/it.lproj/GooglePlaces.strings | Bin 0 -> 4506 bytes Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/ja.lproj/GooglePlaces.strings | Bin 0 -> 3949 bytes Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/ko.lproj/GooglePlaces.strings | Bin 0 -> 3807 bytes Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/lt.lproj/GooglePlaces.strings | Bin 0 -> 5587 bytes Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/lv.lproj/GooglePlaces.strings | Bin 0 -> 5605 bytes Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/ms.lproj/GooglePlaces.strings | Bin 0 -> 4373 bytes Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/nb.lproj/GooglePlaces.strings | Bin 0 -> 4273 bytes Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/nl.lproj/GooglePlaces.strings | Bin 0 -> 4122 bytes Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/oss_licenses_places.txt.gz | Bin 0 -> 7402 bytes Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/pl.lproj/GooglePlaces.strings | Bin 0 -> 4885 bytes Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/pt.lproj/GooglePlaces.strings | Bin 0 -> 4961 bytes Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/pt_BR.lproj/GooglePlaces.strings | Bin 0 -> 4961 bytes Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/pt_PT.lproj/GooglePlaces.strings | Bin 0 -> 5239 bytes Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/ro.lproj/GooglePlaces.strings | Bin 0 -> 5216 bytes Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/ru.lproj/GooglePlaces.strings | Bin 0 -> 5723 bytes Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/sad_cloud.png | Bin 0 -> 903 bytes Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/sad_cloud@2x.png | Bin 0 -> 1654 bytes Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/sad_cloud@3x.png | Bin 0 -> 2428 bytes Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/sad_cloud_dark.png | Bin 0 -> 905 bytes Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/sad_cloud_dark@2x.png | Bin 0 -> 1859 bytes Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/sad_cloud_dark@3x.png | Bin 0 -> 2738 bytes Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/sk.lproj/GooglePlaces.strings | Bin 0 -> 5419 bytes Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/sv.lproj/GooglePlaces.strings | Bin 0 -> 4496 bytes Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/th.lproj/GooglePlaces.strings | Bin 0 -> 5524 bytes Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/tr.lproj/GooglePlaces.strings | Bin 0 -> 4839 bytes Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/uk.lproj/GooglePlaces.strings | Bin 0 -> 5569 bytes Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/vi.lproj/GooglePlaces.strings | Bin 0 -> 5789 bytes Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/zh_CN.lproj/GooglePlaces.strings | Bin 0 -> 3634 bytes Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/zh_HK.lproj/GooglePlaces.strings | Bin 0 -> 3667 bytes Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/zh_TW.lproj/GooglePlaces.strings | Bin 0 -> 3675 bytes Pods/GooglePlaces/README.md | 92 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/Manifest.lock | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ Pods/Pods.xcodeproj/project.pbxproj | 1488 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/Pods.xcodeproj/xcuserdata/roshka.xcuserdatad/xcschemes/Alamofire.xcscheme | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/Pods.xcodeproj/xcuserdata/roshka.xcuserdatad/xcschemes/Google-Maps-iOS-Utils.xcscheme | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/Pods.xcodeproj/xcuserdata/roshka.xcuserdatad/xcschemes/GoogleMaps.xcscheme | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/Pods.xcodeproj/xcuserdata/roshka.xcuserdatad/xcschemes/GooglePlaces.xcscheme | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/Pods.xcodeproj/xcuserdata/roshka.xcuserdatad/xcschemes/Pods-ProductosPY.xcscheme | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/Pods.xcodeproj/xcuserdata/roshka.xcuserdatad/xcschemes/xcschememanagement.plist | 46 ++++++++++++++++++++++++++++++++++++++++++++++ Pods/Target Support Files/Alamofire/Alamofire-Info.plist | 26 ++++++++++++++++++++++++++ Pods/Target Support Files/Alamofire/Alamofire-dummy.m | 5 +++++ Pods/Target Support Files/Alamofire/Alamofire-prefix.pch | 12 ++++++++++++ Pods/Target Support Files/Alamofire/Alamofire-umbrella.h | 16 ++++++++++++++++ Pods/Target Support Files/Alamofire/Alamofire.debug.xcconfig | 11 +++++++++++ Pods/Target Support Files/Alamofire/Alamofire.modulemap | 6 ++++++ Pods/Target Support Files/Alamofire/Alamofire.release.xcconfig | 11 +++++++++++ Pods/Target Support Files/Google-Maps-iOS-Utils/Google-Maps-iOS-Utils-Info.plist | 26 ++++++++++++++++++++++++++ Pods/Target Support Files/Google-Maps-iOS-Utils/Google-Maps-iOS-Utils-dummy.m | 5 +++++ Pods/Target Support Files/Google-Maps-iOS-Utils/Google-Maps-iOS-Utils-prefix.pch | 12 ++++++++++++ Pods/Target Support Files/Google-Maps-iOS-Utils/Google-Maps-iOS-Utils-umbrella.h | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/Target Support Files/Google-Maps-iOS-Utils/Google-Maps-iOS-Utils.debug.xcconfig | 10 ++++++++++ Pods/Target Support Files/Google-Maps-iOS-Utils/Google-Maps-iOS-Utils.modulemap | 6 ++++++ Pods/Target Support Files/Google-Maps-iOS-Utils/Google-Maps-iOS-Utils.release.xcconfig | 10 ++++++++++ Pods/Target Support Files/GoogleMaps/GoogleMaps.debug.xcconfig | 11 +++++++++++ Pods/Target Support Files/GoogleMaps/GoogleMaps.release.xcconfig | 11 +++++++++++ Pods/Target Support Files/GooglePlaces/GooglePlaces.debug.xcconfig | 11 +++++++++++ Pods/Target Support Files/GooglePlaces/GooglePlaces.release.xcconfig | 11 +++++++++++ Pods/Target Support Files/Pods-ProductosPY/Pods-ProductosPY-Info.plist | 26 ++++++++++++++++++++++++++ Pods/Target Support Files/Pods-ProductosPY/Pods-ProductosPY-acknowledgements.markdown | 229 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/Target Support Files/Pods-ProductosPY/Pods-ProductosPY-acknowledgements.plist | 279 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/Target Support Files/Pods-ProductosPY/Pods-ProductosPY-dummy.m | 5 +++++ Pods/Target Support Files/Pods-ProductosPY/Pods-ProductosPY-frameworks-Debug-input-files.xcfilelist | 2 ++ Pods/Target Support Files/Pods-ProductosPY/Pods-ProductosPY-frameworks-Debug-output-files.xcfilelist | 1 + Pods/Target Support Files/Pods-ProductosPY/Pods-ProductosPY-frameworks-Release-input-files.xcfilelist | 2 ++ Pods/Target Support Files/Pods-ProductosPY/Pods-ProductosPY-frameworks-Release-output-files.xcfilelist | 1 + Pods/Target Support Files/Pods-ProductosPY/Pods-ProductosPY-frameworks.sh | 207 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/Target Support Files/Pods-ProductosPY/Pods-ProductosPY-resources-Debug-input-files.xcfilelist | 3 +++ Pods/Target Support Files/Pods-ProductosPY/Pods-ProductosPY-resources-Debug-output-files.xcfilelist | 2 ++ Pods/Target Support Files/Pods-ProductosPY/Pods-ProductosPY-resources-Release-input-files.xcfilelist | 3 +++ Pods/Target Support Files/Pods-ProductosPY/Pods-ProductosPY-resources-Release-output-files.xcfilelist | 2 ++ Pods/Target Support Files/Pods-ProductosPY/Pods-ProductosPY-resources.sh | 131 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Pods/Target Support Files/Pods-ProductosPY/Pods-ProductosPY-umbrella.h | 16 ++++++++++++++++ Pods/Target Support Files/Pods-ProductosPY/Pods-ProductosPY.debug.xcconfig | 12 ++++++++++++ Pods/Target Support Files/Pods-ProductosPY/Pods-ProductosPY.modulemap | 6 ++++++ Pods/Target Support Files/Pods-ProductosPY/Pods-ProductosPY.release.xcconfig | 12 ++++++++++++ ProductosPY.xcodeproj/project.pbxproj | 501 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ProductosPY.xcodeproj/project.xcworkspace/contents.xcworkspacedata | 7 +++++++ ProductosPY.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ ProductosPY.xcodeproj/xcuserdata/roshka.xcuserdatad/xcschemes/xcschememanagement.plist | 14 ++++++++++++++ ProductosPY.xcworkspace/contents.xcworkspacedata | 10 ++++++++++ ProductosPY.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ ProductosPY/AppDelegate.swift | 40 ++++++++++++++++++++++++++++++++++++++++ ProductosPY/Assets.xcassets/AppIcon.appiconset/Contents.json | 98 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ProductosPY/Assets.xcassets/Contents.json | 6 ++++++ ProductosPY/Assets.xcassets/circleOff.imageset/Contents.json | 21 +++++++++++++++++++++ ProductosPY/Assets.xcassets/circleOff.imageset/circleOff@2x.png | Bin 0 -> 498 bytes ProductosPY/Assets.xcassets/circleOn.imageset/Contents.json | 21 +++++++++++++++++++++ ProductosPY/Assets.xcassets/circleOn.imageset/circleOn@2x.png | Bin 0 -> 533 bytes ProductosPY/Assets.xcassets/closeButton.imageset/Contents.json | 21 +++++++++++++++++++++ ProductosPY/Assets.xcassets/closeButton.imageset/closeButton@2x.png | Bin 0 -> 4804 bytes ProductosPY/Assets.xcassets/favButton.imageset/Contents.json | 21 +++++++++++++++++++++ ProductosPY/Assets.xcassets/favButton.imageset/favButton@2x.png | Bin 0 -> 1141 bytes ProductosPY/Assets.xcassets/favDeselected.imageset/Contents.json | 21 +++++++++++++++++++++ ProductosPY/Assets.xcassets/favDeselected.imageset/favDeselected@2x.png | Bin 0 -> 2393 bytes ProductosPY/Assets.xcassets/favSelected.imageset/Contents.json | 21 +++++++++++++++++++++ ProductosPY/Assets.xcassets/favSelected.imageset/favSelected@2x.png | Bin 0 -> 1592 bytes ProductosPY/Assets.xcassets/features01.imageset/Contents.json | 21 +++++++++++++++++++++ ProductosPY/Assets.xcassets/features01.imageset/features01@2x.png | Bin 0 -> 30377 bytes ProductosPY/Assets.xcassets/features02.imageset/Contents.json | 21 +++++++++++++++++++++ ProductosPY/Assets.xcassets/features02.imageset/features02@2x.png | Bin 0 -> 19118 bytes ProductosPY/Assets.xcassets/features03.imageset/Contents.json | 21 +++++++++++++++++++++ ProductosPY/Assets.xcassets/features03.imageset/features03@2x.png | Bin 0 -> 32645 bytes ProductosPY/Assets.xcassets/infoButton.imageset/Contents.json | 21 +++++++++++++++++++++ ProductosPY/Assets.xcassets/infoButton.imageset/infoButton@2x.png | Bin 0 -> 1143 bytes ProductosPY/Assets.xcassets/logoBig.imageset/Contents.json | 21 +++++++++++++++++++++ ProductosPY/Assets.xcassets/logoBig.imageset/logoBig@2x.png | Bin 0 -> 9528 bytes ProductosPY/Assets.xcassets/logoSmall.imageset/Contents.json | 21 +++++++++++++++++++++ ProductosPY/Assets.xcassets/logoSmall.imageset/logoSmall@2x.png | Bin 0 -> 3213 bytes ProductosPY/Assets.xcassets/markerNormal.imageset/Contents.json | 21 +++++++++++++++++++++ ProductosPY/Assets.xcassets/markerNormal.imageset/markerNormal@2x.png | Bin 0 -> 2707 bytes ProductosPY/Assets.xcassets/markerSelected.imageset/Contents.json | 21 +++++++++++++++++++++ ProductosPY/Assets.xcassets/markerSelected.imageset/markerSelected@2x.png | Bin 0 -> 2521 bytes ProductosPY/Assets.xcassets/selector.imageset/Contents.json | 21 +++++++++++++++++++++ ProductosPY/Assets.xcassets/selector.imageset/selector@2x.png | Bin 0 -> 666 bytes ProductosPY/Base.lproj/LaunchScreen.storyboard | 25 +++++++++++++++++++++++++ ProductosPY/Base.lproj/Main.storyboard | 149 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ProductosPY/Info.plist | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ProductosPY/SceneDelegate.swift | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ ProductosPY/ViewControllers/ScreenTwoViewController.swift | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ProductosPY/ViewControllers/ViewController.swift | 136 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ProductosPY/entities/PageView.swift | 19 +++++++++++++++++++ ProductosPY/structs/Constants.swift | 17 +++++++++++++++++ ProductosPY/structs/Feature.swift | 45 +++++++++++++++++++++++++++++++++++++++++++++ ProductosPY/structs/FeatureCollection.swift | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ ProductosPY/utilities/APIError.swift | 20 ++++++++++++++++++++ ProductosPY/utilities/APISessionManager.swift | 23 +++++++++++++++++++++++ ProductosPY/utilities/HTTPClient.swift | 93 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ProductosPY/xib/Page.xib | 33 +++++++++++++++++++++++++++++++++ ProductosPY/xib/PageView.xib | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 704 files changed, 40740 insertions(+) create mode 100644 Podfile create mode 100644 Podfile.lock create mode 100644 Pods/Alamofire/LICENSE create mode 100644 Pods/Alamofire/README.md create mode 100644 Pods/Alamofire/Source/AFError.swift create mode 100644 Pods/Alamofire/Source/Alamofire.swift create mode 100644 Pods/Alamofire/Source/AlamofireExtended.swift create mode 100644 Pods/Alamofire/Source/CachedResponseHandler.swift create mode 100644 Pods/Alamofire/Source/DispatchQueue+Alamofire.swift create mode 100644 Pods/Alamofire/Source/EventMonitor.swift create mode 100644 Pods/Alamofire/Source/HTTPHeaders.swift create mode 100644 Pods/Alamofire/Source/HTTPMethod.swift create mode 100644 Pods/Alamofire/Source/MultipartFormData.swift create mode 100644 Pods/Alamofire/Source/MultipartUpload.swift create mode 100644 Pods/Alamofire/Source/NetworkReachabilityManager.swift create mode 100644 Pods/Alamofire/Source/Notifications.swift create mode 100644 Pods/Alamofire/Source/OperationQueue+Alamofire.swift create mode 100644 Pods/Alamofire/Source/ParameterEncoder.swift create mode 100644 Pods/Alamofire/Source/ParameterEncoding.swift create mode 100644 Pods/Alamofire/Source/Protector.swift create mode 100644 Pods/Alamofire/Source/RedirectHandler.swift create mode 100644 Pods/Alamofire/Source/Request.swift create mode 100644 Pods/Alamofire/Source/RequestInterceptor.swift create mode 100644 Pods/Alamofire/Source/RequestTaskMap.swift create mode 100644 Pods/Alamofire/Source/Response.swift create mode 100644 Pods/Alamofire/Source/ResponseSerialization.swift create mode 100644 Pods/Alamofire/Source/Result+Alamofire.swift create mode 100644 Pods/Alamofire/Source/RetryPolicy.swift create mode 100644 Pods/Alamofire/Source/ServerTrustEvaluation.swift create mode 100644 Pods/Alamofire/Source/Session.swift create mode 100644 Pods/Alamofire/Source/SessionDelegate.swift create mode 100644 Pods/Alamofire/Source/URLConvertible+URLRequestConvertible.swift create mode 100644 Pods/Alamofire/Source/URLEncodedFormEncoder.swift create mode 100644 Pods/Alamofire/Source/URLRequest+Alamofire.swift create mode 100644 Pods/Alamofire/Source/URLSessionConfiguration+Alamofire.swift create mode 100644 Pods/Alamofire/Source/Validation.swift create mode 100644 Pods/Google-Maps-iOS-Utils/LICENSE create mode 100644 Pods/Google-Maps-iOS-Utils/README.md create mode 100644 Pods/Google-Maps-iOS-Utils/src/Clustering/Algo/GMUClusterAlgorithm.h create mode 100644 Pods/Google-Maps-iOS-Utils/src/Clustering/Algo/GMUGridBasedClusterAlgorithm.h create mode 100644 Pods/Google-Maps-iOS-Utils/src/Clustering/Algo/GMUGridBasedClusterAlgorithm.m create mode 100644 Pods/Google-Maps-iOS-Utils/src/Clustering/Algo/GMUNonHierarchicalDistanceBasedAlgorithm.h create mode 100644 Pods/Google-Maps-iOS-Utils/src/Clustering/Algo/GMUNonHierarchicalDistanceBasedAlgorithm.m create mode 100644 Pods/Google-Maps-iOS-Utils/src/Clustering/Algo/GMUSimpleClusterAlgorithm.h create mode 100644 Pods/Google-Maps-iOS-Utils/src/Clustering/Algo/GMUSimpleClusterAlgorithm.m create mode 100644 Pods/Google-Maps-iOS-Utils/src/Clustering/Algo/GMUWrappingDictionaryKey.h create mode 100644 Pods/Google-Maps-iOS-Utils/src/Clustering/Algo/GMUWrappingDictionaryKey.m create mode 100644 Pods/Google-Maps-iOS-Utils/src/Clustering/GMUCluster.h create mode 100644 Pods/Google-Maps-iOS-Utils/src/Clustering/GMUClusterItem.h create mode 100644 Pods/Google-Maps-iOS-Utils/src/Clustering/GMUClusterManager+Testing.h create mode 100644 Pods/Google-Maps-iOS-Utils/src/Clustering/GMUClusterManager.h create mode 100644 Pods/Google-Maps-iOS-Utils/src/Clustering/GMUClusterManager.m create mode 100644 Pods/Google-Maps-iOS-Utils/src/Clustering/GMUStaticCluster.h create mode 100644 Pods/Google-Maps-iOS-Utils/src/Clustering/GMUStaticCluster.m create mode 100644 Pods/Google-Maps-iOS-Utils/src/Clustering/View/GMUClusterIconGenerator.h create mode 100644 Pods/Google-Maps-iOS-Utils/src/Clustering/View/GMUClusterRenderer.h create mode 100644 Pods/Google-Maps-iOS-Utils/src/Clustering/View/GMUDefaultClusterIconGenerator+Testing.h create mode 100644 Pods/Google-Maps-iOS-Utils/src/Clustering/View/GMUDefaultClusterIconGenerator.h create mode 100644 Pods/Google-Maps-iOS-Utils/src/Clustering/View/GMUDefaultClusterIconGenerator.m create mode 100644 Pods/Google-Maps-iOS-Utils/src/Clustering/View/GMUDefaultClusterRenderer.h create mode 100644 Pods/Google-Maps-iOS-Utils/src/Clustering/View/GMUDefaultClusterRenderer.m create mode 100644 Pods/Google-Maps-iOS-Utils/src/Geometry/GMUGeoJSONParser.h create mode 100644 Pods/Google-Maps-iOS-Utils/src/Geometry/GMUGeoJSONParser.m create mode 100644 Pods/Google-Maps-iOS-Utils/src/Geometry/GMUGeometryRenderer+Testing.h create mode 100644 Pods/Google-Maps-iOS-Utils/src/Geometry/GMUGeometryRenderer.h create mode 100644 Pods/Google-Maps-iOS-Utils/src/Geometry/GMUGeometryRenderer.m create mode 100644 Pods/Google-Maps-iOS-Utils/src/Geometry/GMUKMLParser.h create mode 100644 Pods/Google-Maps-iOS-Utils/src/Geometry/GMUKMLParser.m create mode 100644 Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUFeature.h create mode 100644 Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUFeature.m create mode 100644 Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUGeometry.h create mode 100644 Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUGeometryCollection.h create mode 100644 Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUGeometryCollection.m create mode 100644 Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUGeometryContainer.h create mode 100644 Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUGroundOverlay.h create mode 100644 Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUGroundOverlay.m create mode 100644 Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMULineString.h create mode 100644 Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMULineString.m create mode 100644 Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUPair.h create mode 100644 Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUPair.m create mode 100644 Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUPlacemark.h create mode 100644 Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUPlacemark.m create mode 100644 Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUPoint.h create mode 100644 Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUPoint.m create mode 100644 Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUPolygon.h create mode 100644 Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUPolygon.m create mode 100644 Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUStyle.h create mode 100644 Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUStyle.m create mode 100644 Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUStyleMap.h create mode 100644 Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUStyleMap.m create mode 100644 Pods/Google-Maps-iOS-Utils/src/Heatmap/GMUGradient.h create mode 100644 Pods/Google-Maps-iOS-Utils/src/Heatmap/GMUGradient.m create mode 100644 Pods/Google-Maps-iOS-Utils/src/Heatmap/GMUHeatmapTileLayer.h create mode 100644 Pods/Google-Maps-iOS-Utils/src/Heatmap/GMUHeatmapTileLayer.m create mode 100644 Pods/Google-Maps-iOS-Utils/src/Heatmap/GMUWeightedLatLng.h create mode 100644 Pods/Google-Maps-iOS-Utils/src/Heatmap/GMUWeightedLatLng.m create mode 100644 Pods/Google-Maps-iOS-Utils/src/QuadTree/GQTBounds.h create mode 100644 Pods/Google-Maps-iOS-Utils/src/QuadTree/GQTPoint.h create mode 100644 Pods/Google-Maps-iOS-Utils/src/QuadTree/GQTPointQuadTree.h create mode 100644 Pods/Google-Maps-iOS-Utils/src/QuadTree/GQTPointQuadTree.m create mode 100644 Pods/Google-Maps-iOS-Utils/src/QuadTree/GQTPointQuadTreeChild.h create mode 100644 Pods/Google-Maps-iOS-Utils/src/QuadTree/GQTPointQuadTreeChild.m create mode 100644 Pods/Google-Maps-iOS-Utils/src/QuadTree/GQTPointQuadTreeItem.h create mode 100755 Pods/GoogleMaps/Base/Frameworks/GoogleMapsBase.framework/GoogleMapsBase create mode 100755 Pods/GoogleMaps/Base/Frameworks/GoogleMapsBase.framework/Headers/GMSCompatabilityMacros.h create mode 100755 Pods/GoogleMaps/Base/Frameworks/GoogleMapsBase.framework/Headers/GMSCoordinateBounds.h create mode 100755 Pods/GoogleMaps/Base/Frameworks/GoogleMapsBase.framework/Headers/GMSDeprecationMacros.h create mode 100755 Pods/GoogleMaps/Base/Frameworks/GoogleMapsBase.framework/Headers/GoogleMapsBase.h create mode 100755 Pods/GoogleMaps/Base/Frameworks/GoogleMapsBase.framework/Modules/module.modulemap create mode 100755 Pods/GoogleMaps/CHANGELOG.md create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos.xcodeproj/project.pbxproj create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/DemoAppDelegate.h create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/DemoAppDelegate.m create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Info.plist create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/MapsDemoAssets.xcassets/AppIcon.appiconset/Contents.json create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/MapsDemoAssets.xcassets/AppIcon.appiconset/Maps-SDK-Demo-App_120.png create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/MapsDemoAssets.xcassets/AppIcon.appiconset/Maps-SDK-Demo-App_152.png create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/MapsDemoAssets.xcassets/AppIcon.appiconset/Maps-SDK-Demo-App_167.png create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/MapsDemoAssets.xcassets/AppIcon.appiconset/Maps-SDK-Demo-App_180.png create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/MapsDemoAssets.xcassets/AppIcon.appiconset/Maps-SDK-Demo-App_76.png create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/MapsDemoAssets.xcassets/Contents.json create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/MasterViewController.h create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/MasterViewController.m create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/LaunchScreen.storyboard create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/Museum-Icons/h1.png create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/Museum-Icons/h1@2x.png create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/Museum-Icons/spitfire.png create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/Museum-Icons/spitfire@2x.png create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/Museum-Icons/voyager.png create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/Museum-Icons/voyager@2x.png create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/Museum-Icons/x29.png create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/Museum-Icons/x29@2x.png create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/aeroplane.png create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/aeroplane@2x.png create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/ar.lproj/InfoPlist.strings create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/argentina-large.png create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/argentina.png create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/arrow.png create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/arrow@2x.png create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/australia-large.png create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/australia-large@2x.png create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/australia.png create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/boat.png create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/boat@2x.png create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/botswana-large.png create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/botswana.png create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/bulgaria-large.png create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/bulgaria.png create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/ca.lproj/InfoPlist.strings create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/cs.lproj/InfoPlist.strings create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/da.lproj/InfoPlist.strings create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/de.lproj/InfoPlist.strings create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/el.lproj/InfoPlist.strings create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/en.lproj/InfoPlist.strings create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/en_GB.lproj/InfoPlist.strings create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/es.lproj/InfoPlist.strings create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/fi.lproj/InfoPlist.strings create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/fr.lproj/InfoPlist.strings create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/glow-marker.png create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/glow-marker@2x.png create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/he.lproj/InfoPlist.strings create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/hr.lproj/InfoPlist.strings create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/hu.lproj/InfoPlist.strings create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/id.lproj/InfoPlist.strings create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/it.lproj/InfoPlist.strings create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/ja.lproj/InfoPlist.strings create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/ko.lproj/InfoPlist.strings create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/mapstyle-night.json create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/mapstyle-retro.json create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/mapstyle-silver.json create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/ms.lproj/InfoPlist.strings create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/museum-exhibits.json create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/nb.lproj/InfoPlist.strings create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/newark_nj_1922.jpg create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/nl.lproj/InfoPlist.strings create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/pl.lproj/InfoPlist.strings create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/popup_santa.png create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/popup_santa@2x.png create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/pt.lproj/InfoPlist.strings create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/pt_PT.lproj/InfoPlist.strings create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/ro.lproj/InfoPlist.strings create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/ru.lproj/InfoPlist.strings create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/sk.lproj/InfoPlist.strings create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step1.png create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step1@2x.png create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step2.png create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step2@2x.png create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step3.png create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step3@2x.png create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step4.png create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step4@2x.png create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step5.png create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step5@2x.png create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step6.png create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step6@2x.png create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step7.png create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step7@2x.png create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step8.png create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step8@2x.png create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/sv.lproj/InfoPlist.strings create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/th.lproj/InfoPlist.strings create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/tr.lproj/InfoPlist.strings create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/track.json create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/uk.lproj/InfoPlist.strings create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/vi.lproj/InfoPlist.strings create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/zh_CN.lproj/InfoPlist.strings create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/zh_TW.lproj/InfoPlist.strings create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/SDKDemoAPIKey.h create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/AnimatedCurrentLocationViewController.h create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/AnimatedCurrentLocationViewController.m create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/AnimatedUIViewMarkerViewController.h create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/AnimatedUIViewMarkerViewController.m create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/BasicMapViewController.h create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/BasicMapViewController.m create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/CameraViewController.h create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/CameraViewController.m create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/CustomIndoorViewController.h create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/CustomIndoorViewController.m create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/CustomMarkersViewController.h create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/CustomMarkersViewController.m create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/DoubleMapViewController.h create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/DoubleMapViewController.m create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/FitBoundsViewController.h create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/FitBoundsViewController.m create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/FixedPanoramaViewController.h create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/FixedPanoramaViewController.m create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/FrameRateViewController.h create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/FrameRateViewController.m create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/GeocoderViewController.h create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/GeocoderViewController.m create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/GestureControlViewController.h create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/GestureControlViewController.m create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/GradientPolylinesViewController.h create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/GradientPolylinesViewController.m create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/GroundOverlayViewController.h create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/GroundOverlayViewController.m create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/IndoorMuseumNavigationViewController.h create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/IndoorMuseumNavigationViewController.m create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/IndoorViewController.h create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/IndoorViewController.m create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MapLayerViewController.h create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MapLayerViewController.m create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MapTypesViewController.h create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MapTypesViewController.m create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MapZoomViewController.h create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MapZoomViewController.m create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MarkerEventsViewController.h create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MarkerEventsViewController.m create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MarkerInfoWindowViewController.h create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MarkerInfoWindowViewController.m create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MarkerLayerViewController.h create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MarkerLayerViewController.m create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MarkersViewController.h create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MarkersViewController.m create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MyLocationViewController.h create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MyLocationViewController.m create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/PaddingBehaviorViewController.h create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/PaddingBehaviorViewController.m create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/PanoramaViewController.h create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/PanoramaViewController.m create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/PolygonsViewController.h create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/PolygonsViewController.m create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/PolylinesViewController.h create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/PolylinesViewController.m create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/Samples.h create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/Samples.m create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/SnapshotReadyViewController.h create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/SnapshotReadyViewController.m create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/StructuredGeocoderViewController.h create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/StructuredGeocoderViewController.m create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/StyledMapViewController.h create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/StyledMapViewController.m create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/TileLayerViewController.h create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/TileLayerViewController.m create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/TrafficMapViewController.h create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/TrafficMapViewController.m create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/VisibleRegionViewController.h create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/VisibleRegionViewController.m create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/UIViewController+GMSToastMessages.h create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/UIViewController+GMSToastMessages.m create mode 100755 Pods/GoogleMaps/Example/GoogleMapsDemos/main.m create mode 100755 Pods/GoogleMaps/Example/Podfile create mode 100755 Pods/GoogleMaps/Example/README.GoogleMapsDemos create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/GoogleMaps create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSAddress.h create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSCALayer.h create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSCameraPosition.h create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSCameraUpdate.h create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSCircle.h create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSCoordinateBounds+GoogleMaps.h create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSGeocoder.h create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSGeometryUtils.h create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSGroundOverlay.h create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSIndoorBuilding.h create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSIndoorDisplay.h create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSIndoorLevel.h create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSMapLayer.h create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSMapStyle.h create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSMapView+Animation.h create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSMapView.h create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSMarker.h create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSMarkerLayer.h create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSMutablePath.h create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSOrientation.h create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSOverlay.h create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSOverlayLayer.h create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSPanorama.h create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSPanoramaCamera.h create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSPanoramaCameraUpdate.h create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSPanoramaLayer.h create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSPanoramaLink.h create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSPanoramaService.h create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSPanoramaSource.h create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSPanoramaView.h create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSPath.h create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSPolygon.h create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSPolygonLayer.h create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSPolyline.h create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSProjection.h create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSServices.h create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSStrokeStyle.h create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSStyleSpan.h create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSSyncTileLayer.h create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSTileLayer.h create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSUISettings.h create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSURLTileLayer.h create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GoogleMaps.h create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Modules/module.modulemap create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCacheStorage.momd/Storage.mom create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCacheStorage.momd/StorageWithTileProto.mom create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCacheStorage.momd/StorageWithTileVersionID.mom create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCacheStorage.momd/VersionInfo.plist create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/Assets.car create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/DroidSansMerged-Regular.ttf create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/GMSNavNightModeSprites-0-1x.png create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/GMSNavNightModeSprites-0-2x.png create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/GMSNavNightModeSprites-0-3x.png create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/GMSNavSprites-0-1x.png create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/GMSNavSprites-0-2x.png create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/GMSNavSprites-0-3x.png create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/GMSSprites-0-1x.png create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/GMSSprites-0-2x.png create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/GMSSprites-0-3x.png create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/Info.plist create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/Tharlon-Regular.ttf create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ar.lproj/GMSCore.strings create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/button_background.png create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/button_background@2x.png create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/button_background@3x.png create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/button_compass.png create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/button_compass@2x.png create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/button_compass_night.png create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/button_compass_night@2x.png create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/button_my_location.png create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/button_my_location@2x.png create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ca.lproj/GMSCore.strings create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/cs.lproj/GMSCore.strings create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/da.lproj/GMSCore.strings create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/dav_one_way_16_256.png create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/de.lproj/GMSCore.strings create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/el.lproj/GMSCore.strings create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/en.lproj/GMSCore.strings create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/en_AU.lproj/GMSCore.strings create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/en_GB.lproj/GMSCore.strings create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/en_IN.lproj/GMSCore.strings create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/es.lproj/GMSCore.strings create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/es_419.lproj/GMSCore.strings create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/es_MX.lproj/GMSCore.strings create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/fi.lproj/GMSCore.strings create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/fr.lproj/GMSCore.strings create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/fr_CA.lproj/GMSCore.strings create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/he.lproj/GMSCore.strings create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/hi.lproj/GMSCore.strings create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/hr.lproj/GMSCore.strings create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/hu.lproj/GMSCore.strings create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_compass_needle.png create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_compass_needle@2x.png create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_compass_needle_32pt.png create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_compass_needle_32pt@2x.png create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_compass_needle_32pt@3x.png create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_compass_needle_large.png create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_compass_needle_large@2x.png create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_compass_needle_large@3x.png create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_location_off.png create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_location_off@2x.png create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_location_off@3x.png create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_qu_direction_mylocation.png create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_qu_direction_mylocation@2x.png create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_qu_direction_mylocation@3x.png create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/id.lproj/GMSCore.strings create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/it.lproj/GMSCore.strings create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ja.lproj/GMSCore.strings create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ko.lproj/GMSCore.strings create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/lt.lproj/GMSCore.strings create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/lv.lproj/GMSCore.strings create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ms.lproj/GMSCore.strings create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/nb.lproj/GMSCore.strings create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/nl.lproj/GMSCore.strings create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/pl.lproj/GMSCore.strings create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/polyline_colors_texture.png create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/polyline_colors_texture_dim.png create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/pt.lproj/GMSCore.strings create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/pt_BR.lproj/GMSCore.strings create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/pt_PT.lproj/GMSCore.strings create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ro.lproj/GMSCore.strings create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/road_1-1.png create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/road_128-32.png create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/road_16-4.png create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/road_2-1.png create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/road_256-64.png create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/road_32-8.png create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/road_4-1.png create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/road_64-16.png create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/road_8-2.png create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ru.lproj/GMSCore.strings create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/sk.lproj/GMSCore.strings create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/sv.lproj/GMSCore.strings create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/th.lproj/GMSCore.strings create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/tr.lproj/GMSCore.strings create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/uk.lproj/GMSCore.strings create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/vi.lproj/GMSCore.strings create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/zh_CN.lproj/GMSCore.strings create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/zh_HK.lproj/GMSCore.strings create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/zh_TW.lproj/GMSCore.strings create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/Info.plist create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/bubble_left.png create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/bubble_left@2x.png create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/bubble_left@3x.png create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/bubble_right.png create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/bubble_right@2x.png create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/bubble_right@3x.png create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/default_marker.png create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/default_marker@2x.png create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/default_marker@3x.png create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/ic_error.png create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/ic_error@2x.png create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/ic_error@3x.png create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/oss_licenses_maps.txt.gz create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMapsCore.framework/GoogleMapsCore create mode 100755 Pods/GoogleMaps/Maps/Frameworks/GoogleMapsCore.framework/Modules/module.modulemap create mode 100755 Pods/GoogleMaps/README.md create mode 100755 Pods/GooglePlaces/CHANGELOG.md create mode 100755 Pods/GooglePlaces/Example/GooglePlacesDemos.xcodeproj/project.pbxproj create mode 100755 Pods/GooglePlaces/Example/GooglePlacesDemos/DemoAppDelegate.h create mode 100755 Pods/GooglePlaces/Example/GooglePlacesDemos/DemoAppDelegate.m create mode 100755 Pods/GooglePlaces/Example/GooglePlacesDemos/DemoData.h create mode 100755 Pods/GooglePlaces/Example/GooglePlacesDemos/DemoData.m create mode 100755 Pods/GooglePlaces/Example/GooglePlacesDemos/DemoListViewController.h create mode 100755 Pods/GooglePlaces/Example/GooglePlacesDemos/DemoListViewController.m create mode 100755 Pods/GooglePlaces/Example/GooglePlacesDemos/Info.plist create mode 100755 Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/Base.lproj/LaunchScreen.storyboard create mode 100755 Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/PlacesDemoAssets.xcassets/AppIcon.appiconset/Contents.json create mode 100755 Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/PlacesDemoAssets.xcassets/AppIcon.appiconset/Places-API-Demo-App_120.png create mode 100755 Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/PlacesDemoAssets.xcassets/AppIcon.appiconset/Places-API-Demo-App_152.png create mode 100755 Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/PlacesDemoAssets.xcassets/AppIcon.appiconset/Places-API-Demo-App_167.png create mode 100755 Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/PlacesDemoAssets.xcassets/AppIcon.appiconset/Places-API-Demo-App_180.png create mode 100755 Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/PlacesDemoAssets.xcassets/AppIcon.appiconset/Places-API-Demo-App_76.png create mode 100755 Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/PlacesDemoAssets.xcassets/Contents.json create mode 100755 Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/ar.lproj/Localizable.strings create mode 100755 Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/ca.lproj/Localizable.strings create mode 100755 Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/cs.lproj/Localizable.strings create mode 100755 Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/da.lproj/Localizable.strings create mode 100755 Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/de.lproj/Localizable.strings create mode 100755 Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/el.lproj/Localizable.strings create mode 100755 Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/en.lproj/Localizable.strings create mode 100755 Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/en_AU.lproj/Localizable.strings create mode 100755 Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/en_GB.lproj/Localizable.strings create mode 100755 Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/en_IN.lproj/Localizable.strings create mode 100755 Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/es.lproj/Localizable.strings create mode 100755 Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/es_419.lproj/Localizable.strings create mode 100755 Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/es_MX.lproj/Localizable.strings create mode 100755 Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/fi.lproj/Localizable.strings create mode 100755 Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/fr.lproj/Localizable.strings create mode 100755 Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/fr_CA.lproj/Localizable.strings create mode 100755 Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/he.lproj/Localizable.strings create mode 100755 Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/hi.lproj/Localizable.strings create mode 100755 Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/hr.lproj/Localizable.strings create mode 100755 Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/hu.lproj/Localizable.strings create mode 100755 Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/id.lproj/Localizable.strings create mode 100755 Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/it.lproj/Localizable.strings create mode 100755 Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/ja.lproj/Localizable.strings create mode 100755 Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/ko.lproj/Localizable.strings create mode 100755 Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/ms.lproj/Localizable.strings create mode 100755 Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/nb.lproj/Localizable.strings create mode 100755 Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/nl.lproj/Localizable.strings create mode 100755 Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/pl.lproj/Localizable.strings create mode 100755 Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/pt.lproj/Localizable.strings create mode 100755 Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/pt_BR.lproj/Localizable.strings create mode 100755 Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/pt_PT.lproj/Localizable.strings create mode 100755 Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/ro.lproj/Localizable.strings create mode 100755 Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/ru.lproj/Localizable.strings create mode 100755 Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/sk.lproj/Localizable.strings create mode 100755 Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/sv.lproj/Localizable.strings create mode 100755 Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/th.lproj/Localizable.strings create mode 100755 Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/tr.lproj/Localizable.strings create mode 100755 Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/uk.lproj/Localizable.strings create mode 100755 Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/vi.lproj/Localizable.strings create mode 100755 Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/zh_CN.lproj/Localizable.strings create mode 100755 Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/zh_HK.lproj/Localizable.strings create mode 100755 Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/zh_TW.lproj/Localizable.strings create mode 100755 Pods/GooglePlaces/Example/GooglePlacesDemos/SDKDemoAPIKey.h create mode 100755 Pods/GooglePlaces/Example/GooglePlacesDemos/Samples/Autocomplete/AutocompleteBaseViewController.h create mode 100755 Pods/GooglePlaces/Example/GooglePlacesDemos/Samples/Autocomplete/AutocompleteBaseViewController.m create mode 100755 Pods/GooglePlaces/Example/GooglePlacesDemos/Samples/Autocomplete/AutocompleteModalViewController.h create mode 100755 Pods/GooglePlaces/Example/GooglePlacesDemos/Samples/Autocomplete/AutocompleteModalViewController.m create mode 100755 Pods/GooglePlaces/Example/GooglePlacesDemos/Samples/Autocomplete/AutocompletePushViewController.h create mode 100755 Pods/GooglePlaces/Example/GooglePlacesDemos/Samples/Autocomplete/AutocompletePushViewController.m create mode 100755 Pods/GooglePlaces/Example/GooglePlacesDemos/Samples/Autocomplete/AutocompleteWithCustomColors.h create mode 100755 Pods/GooglePlaces/Example/GooglePlacesDemos/Samples/Autocomplete/AutocompleteWithCustomColors.m create mode 100755 Pods/GooglePlaces/Example/GooglePlacesDemos/Samples/Autocomplete/AutocompleteWithSearchViewController.h create mode 100755 Pods/GooglePlaces/Example/GooglePlacesDemos/Samples/Autocomplete/AutocompleteWithSearchViewController.m create mode 100755 Pods/GooglePlaces/Example/GooglePlacesDemos/Samples/Autocomplete/AutocompleteWithTextFieldController.h create mode 100755 Pods/GooglePlaces/Example/GooglePlacesDemos/Samples/Autocomplete/AutocompleteWithTextFieldController.m create mode 100755 Pods/GooglePlaces/Example/GooglePlacesDemos/Samples/FindPlaceLikelihoodListViewController.h create mode 100755 Pods/GooglePlaces/Example/GooglePlacesDemos/Samples/FindPlaceLikelihoodListViewController.m create mode 100755 Pods/GooglePlaces/Example/GooglePlacesDemos/Samples/PagingPhotoView.h create mode 100755 Pods/GooglePlaces/Example/GooglePlacesDemos/Samples/PagingPhotoView.m create mode 100755 Pods/GooglePlaces/Example/GooglePlacesDemos/Support/BaseDemoViewController.h create mode 100755 Pods/GooglePlaces/Example/GooglePlacesDemos/Support/BaseDemoViewController.m create mode 100755 Pods/GooglePlaces/Example/GooglePlacesDemos/main.m create mode 100755 Pods/GooglePlaces/Example/Podfile create mode 100755 Pods/GooglePlaces/Example/README.GooglePlacesDemos create mode 100755 Pods/GooglePlaces/Frameworks/GooglePlaces.framework/GooglePlaces create mode 100755 Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSAddressComponent.h create mode 100755 Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSAutocompleteBoundsMode.h create mode 100755 Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSAutocompleteFetcher.h create mode 100755 Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSAutocompleteFilter.h create mode 100755 Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSAutocompleteMatchFragment.h create mode 100755 Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSAutocompletePrediction.h create mode 100755 Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSAutocompleteResultsViewController.h create mode 100755 Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSAutocompleteSessionToken.h create mode 100755 Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSAutocompleteTableDataSource.h create mode 100755 Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSAutocompleteViewController.h create mode 100755 Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSOpeningHours.h create mode 100755 Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSPlace.h create mode 100755 Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSPlaceFieldMask.h create mode 100755 Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSPlaceLikelihood.h create mode 100755 Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSPlaceLikelihoodList.h create mode 100755 Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSPlaceLocationOptions.h create mode 100755 Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSPlacePhotoMetadata.h create mode 100755 Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSPlacePhotoMetadataList.h create mode 100755 Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSPlaceTypes.h create mode 100755 Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSPlacesClient.h create mode 100755 Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSPlacesErrors.h create mode 100755 Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSPlusCode.h create mode 100755 Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GooglePlaces.h create mode 100755 Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Modules/module.modulemap create mode 100755 Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/Info.plist create mode 100755 Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/ar.lproj/GooglePlaces.strings create mode 100755 Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/build-with-google-black.png create mode 100755 Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/build-with-google-black@2x.png create mode 100755 Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/build-with-google-black@3x.png create mode 100755 Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/build-with-google-white.png create mode 100755 Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/build-with-google-white@2x.png create mode 100755 Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/build-with-google-white@3x.png create mode 100755 Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/ca.lproj/GooglePlaces.strings create mode 100755 Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/cs.lproj/GooglePlaces.strings create mode 100755 Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/da.lproj/GooglePlaces.strings create mode 100755 Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/de.lproj/GooglePlaces.strings create mode 100755 Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/el.lproj/GooglePlaces.strings create mode 100755 Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/en.lproj/GooglePlaces.strings create mode 100755 Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/en_AU.lproj/GooglePlaces.strings create mode 100755 Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/en_GB.lproj/GooglePlaces.strings create mode 100755 Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/en_IN.lproj/GooglePlaces.strings create mode 100755 Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/es.lproj/GooglePlaces.strings create mode 100755 Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/es_419.lproj/GooglePlaces.strings create mode 100755 Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/es_MX.lproj/GooglePlaces.strings create mode 100755 Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/fi.lproj/GooglePlaces.strings create mode 100755 Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/fr.lproj/GooglePlaces.strings create mode 100755 Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/fr_CA.lproj/GooglePlaces.strings create mode 100755 Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/he.lproj/GooglePlaces.strings create mode 100755 Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/hi.lproj/GooglePlaces.strings create mode 100755 Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/hr.lproj/GooglePlaces.strings create mode 100755 Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/hu.lproj/GooglePlaces.strings create mode 100755 Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/id.lproj/GooglePlaces.strings create mode 100755 Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/it.lproj/GooglePlaces.strings create mode 100755 Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/ja.lproj/GooglePlaces.strings create mode 100755 Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/ko.lproj/GooglePlaces.strings create mode 100755 Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/lt.lproj/GooglePlaces.strings create mode 100755 Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/lv.lproj/GooglePlaces.strings create mode 100755 Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/ms.lproj/GooglePlaces.strings create mode 100755 Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/nb.lproj/GooglePlaces.strings create mode 100755 Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/nl.lproj/GooglePlaces.strings create mode 100755 Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/oss_licenses_places.txt.gz create mode 100755 Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/pl.lproj/GooglePlaces.strings create mode 100755 Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/pt.lproj/GooglePlaces.strings create mode 100755 Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/pt_BR.lproj/GooglePlaces.strings create mode 100755 Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/pt_PT.lproj/GooglePlaces.strings create mode 100755 Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/ro.lproj/GooglePlaces.strings create mode 100755 Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/ru.lproj/GooglePlaces.strings create mode 100755 Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/sad_cloud.png create mode 100755 Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/sad_cloud@2x.png create mode 100755 Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/sad_cloud@3x.png create mode 100755 Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/sad_cloud_dark.png create mode 100755 Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/sad_cloud_dark@2x.png create mode 100755 Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/sad_cloud_dark@3x.png create mode 100755 Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/sk.lproj/GooglePlaces.strings create mode 100755 Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/sv.lproj/GooglePlaces.strings create mode 100755 Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/th.lproj/GooglePlaces.strings create mode 100755 Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/tr.lproj/GooglePlaces.strings create mode 100755 Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/uk.lproj/GooglePlaces.strings create mode 100755 Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/vi.lproj/GooglePlaces.strings create mode 100755 Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/zh_CN.lproj/GooglePlaces.strings create mode 100755 Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/zh_HK.lproj/GooglePlaces.strings create mode 100755 Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/zh_TW.lproj/GooglePlaces.strings create mode 100755 Pods/GooglePlaces/README.md create mode 100644 Pods/Manifest.lock create mode 100644 Pods/Pods.xcodeproj/project.pbxproj create mode 100644 Pods/Pods.xcodeproj/xcuserdata/roshka.xcuserdatad/xcschemes/Alamofire.xcscheme create mode 100644 Pods/Pods.xcodeproj/xcuserdata/roshka.xcuserdatad/xcschemes/Google-Maps-iOS-Utils.xcscheme create mode 100644 Pods/Pods.xcodeproj/xcuserdata/roshka.xcuserdatad/xcschemes/GoogleMaps.xcscheme create mode 100644 Pods/Pods.xcodeproj/xcuserdata/roshka.xcuserdatad/xcschemes/GooglePlaces.xcscheme create mode 100644 Pods/Pods.xcodeproj/xcuserdata/roshka.xcuserdatad/xcschemes/Pods-ProductosPY.xcscheme create mode 100644 Pods/Pods.xcodeproj/xcuserdata/roshka.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 Pods/Target Support Files/Alamofire/Alamofire-Info.plist create mode 100644 Pods/Target Support Files/Alamofire/Alamofire-dummy.m create mode 100644 Pods/Target Support Files/Alamofire/Alamofire-prefix.pch create mode 100644 Pods/Target Support Files/Alamofire/Alamofire-umbrella.h create mode 100644 Pods/Target Support Files/Alamofire/Alamofire.debug.xcconfig create mode 100644 Pods/Target Support Files/Alamofire/Alamofire.modulemap create mode 100644 Pods/Target Support Files/Alamofire/Alamofire.release.xcconfig create mode 100644 Pods/Target Support Files/Google-Maps-iOS-Utils/Google-Maps-iOS-Utils-Info.plist create mode 100644 Pods/Target Support Files/Google-Maps-iOS-Utils/Google-Maps-iOS-Utils-dummy.m create mode 100644 Pods/Target Support Files/Google-Maps-iOS-Utils/Google-Maps-iOS-Utils-prefix.pch create mode 100644 Pods/Target Support Files/Google-Maps-iOS-Utils/Google-Maps-iOS-Utils-umbrella.h create mode 100644 Pods/Target Support Files/Google-Maps-iOS-Utils/Google-Maps-iOS-Utils.debug.xcconfig create mode 100644 Pods/Target Support Files/Google-Maps-iOS-Utils/Google-Maps-iOS-Utils.modulemap create mode 100644 Pods/Target Support Files/Google-Maps-iOS-Utils/Google-Maps-iOS-Utils.release.xcconfig create mode 100644 Pods/Target Support Files/GoogleMaps/GoogleMaps.debug.xcconfig create mode 100644 Pods/Target Support Files/GoogleMaps/GoogleMaps.release.xcconfig create mode 100644 Pods/Target Support Files/GooglePlaces/GooglePlaces.debug.xcconfig create mode 100644 Pods/Target Support Files/GooglePlaces/GooglePlaces.release.xcconfig create mode 100644 Pods/Target Support Files/Pods-ProductosPY/Pods-ProductosPY-Info.plist create mode 100644 Pods/Target Support Files/Pods-ProductosPY/Pods-ProductosPY-acknowledgements.markdown create mode 100644 Pods/Target Support Files/Pods-ProductosPY/Pods-ProductosPY-acknowledgements.plist create mode 100644 Pods/Target Support Files/Pods-ProductosPY/Pods-ProductosPY-dummy.m create mode 100644 Pods/Target Support Files/Pods-ProductosPY/Pods-ProductosPY-frameworks-Debug-input-files.xcfilelist create mode 100644 Pods/Target Support Files/Pods-ProductosPY/Pods-ProductosPY-frameworks-Debug-output-files.xcfilelist create mode 100644 Pods/Target Support Files/Pods-ProductosPY/Pods-ProductosPY-frameworks-Release-input-files.xcfilelist create mode 100644 Pods/Target Support Files/Pods-ProductosPY/Pods-ProductosPY-frameworks-Release-output-files.xcfilelist create mode 100755 Pods/Target Support Files/Pods-ProductosPY/Pods-ProductosPY-frameworks.sh create mode 100644 Pods/Target Support Files/Pods-ProductosPY/Pods-ProductosPY-resources-Debug-input-files.xcfilelist create mode 100644 Pods/Target Support Files/Pods-ProductosPY/Pods-ProductosPY-resources-Debug-output-files.xcfilelist create mode 100644 Pods/Target Support Files/Pods-ProductosPY/Pods-ProductosPY-resources-Release-input-files.xcfilelist create mode 100644 Pods/Target Support Files/Pods-ProductosPY/Pods-ProductosPY-resources-Release-output-files.xcfilelist create mode 100755 Pods/Target Support Files/Pods-ProductosPY/Pods-ProductosPY-resources.sh create mode 100644 Pods/Target Support Files/Pods-ProductosPY/Pods-ProductosPY-umbrella.h create mode 100644 Pods/Target Support Files/Pods-ProductosPY/Pods-ProductosPY.debug.xcconfig create mode 100644 Pods/Target Support Files/Pods-ProductosPY/Pods-ProductosPY.modulemap create mode 100644 Pods/Target Support Files/Pods-ProductosPY/Pods-ProductosPY.release.xcconfig create mode 100644 ProductosPY.xcodeproj/project.pbxproj create mode 100644 ProductosPY.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 ProductosPY.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 ProductosPY.xcodeproj/xcuserdata/roshka.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 ProductosPY.xcworkspace/contents.xcworkspacedata create mode 100644 ProductosPY.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 ProductosPY/AppDelegate.swift create mode 100644 ProductosPY/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 ProductosPY/Assets.xcassets/Contents.json create mode 100644 ProductosPY/Assets.xcassets/circleOff.imageset/Contents.json create mode 100644 ProductosPY/Assets.xcassets/circleOff.imageset/circleOff@2x.png create mode 100644 ProductosPY/Assets.xcassets/circleOn.imageset/Contents.json create mode 100644 ProductosPY/Assets.xcassets/circleOn.imageset/circleOn@2x.png create mode 100644 ProductosPY/Assets.xcassets/closeButton.imageset/Contents.json create mode 100644 ProductosPY/Assets.xcassets/closeButton.imageset/closeButton@2x.png create mode 100644 ProductosPY/Assets.xcassets/favButton.imageset/Contents.json create mode 100644 ProductosPY/Assets.xcassets/favButton.imageset/favButton@2x.png create mode 100644 ProductosPY/Assets.xcassets/favDeselected.imageset/Contents.json create mode 100644 ProductosPY/Assets.xcassets/favDeselected.imageset/favDeselected@2x.png create mode 100644 ProductosPY/Assets.xcassets/favSelected.imageset/Contents.json create mode 100644 ProductosPY/Assets.xcassets/favSelected.imageset/favSelected@2x.png create mode 100644 ProductosPY/Assets.xcassets/features01.imageset/Contents.json create mode 100644 ProductosPY/Assets.xcassets/features01.imageset/features01@2x.png create mode 100644 ProductosPY/Assets.xcassets/features02.imageset/Contents.json create mode 100644 ProductosPY/Assets.xcassets/features02.imageset/features02@2x.png create mode 100644 ProductosPY/Assets.xcassets/features03.imageset/Contents.json create mode 100644 ProductosPY/Assets.xcassets/features03.imageset/features03@2x.png create mode 100644 ProductosPY/Assets.xcassets/infoButton.imageset/Contents.json create mode 100644 ProductosPY/Assets.xcassets/infoButton.imageset/infoButton@2x.png create mode 100644 ProductosPY/Assets.xcassets/logoBig.imageset/Contents.json create mode 100644 ProductosPY/Assets.xcassets/logoBig.imageset/logoBig@2x.png create mode 100644 ProductosPY/Assets.xcassets/logoSmall.imageset/Contents.json create mode 100644 ProductosPY/Assets.xcassets/logoSmall.imageset/logoSmall@2x.png create mode 100644 ProductosPY/Assets.xcassets/markerNormal.imageset/Contents.json create mode 100644 ProductosPY/Assets.xcassets/markerNormal.imageset/markerNormal@2x.png create mode 100644 ProductosPY/Assets.xcassets/markerSelected.imageset/Contents.json create mode 100644 ProductosPY/Assets.xcassets/markerSelected.imageset/markerSelected@2x.png create mode 100644 ProductosPY/Assets.xcassets/selector.imageset/Contents.json create mode 100644 ProductosPY/Assets.xcassets/selector.imageset/selector@2x.png create mode 100644 ProductosPY/Base.lproj/LaunchScreen.storyboard create mode 100644 ProductosPY/Base.lproj/Main.storyboard create mode 100644 ProductosPY/Info.plist create mode 100644 ProductosPY/SceneDelegate.swift create mode 100644 ProductosPY/ViewControllers/ScreenTwoViewController.swift create mode 100644 ProductosPY/ViewControllers/ViewController.swift create mode 100644 ProductosPY/entities/PageView.swift create mode 100644 ProductosPY/structs/Constants.swift create mode 100644 ProductosPY/structs/Feature.swift create mode 100644 ProductosPY/structs/FeatureCollection.swift create mode 100644 ProductosPY/utilities/APIError.swift create mode 100644 ProductosPY/utilities/APISessionManager.swift create mode 100644 ProductosPY/utilities/HTTPClient.swift create mode 100644 ProductosPY/xib/Page.xib create mode 100644 ProductosPY/xib/PageView.xib diff --git a/Podfile b/Podfile new file mode 100644 index 0000000..5c7af25 --- /dev/null +++ b/Podfile @@ -0,0 +1,13 @@ +# Uncomment the next line to define a global platform for your project +# platform :ios, '9.0' + +target 'ProductosPY' do + # Comment the next line if you don't want to use dynamic frameworks + use_frameworks! + + pod 'GoogleMaps' + pod 'GooglePlaces' + pod 'Google-Maps-iOS-Utils' + pod 'Alamofire', '~> 5.0' + +end diff --git a/Podfile.lock b/Podfile.lock new file mode 100644 index 0000000..8c4550a --- /dev/null +++ b/Podfile.lock @@ -0,0 +1,48 @@ +PODS: + - Alamofire (5.0.2) + - Google-Maps-iOS-Utils (3.1.1): + - Google-Maps-iOS-Utils/Clustering (= 3.1.1) + - Google-Maps-iOS-Utils/Geometry (= 3.1.1) + - Google-Maps-iOS-Utils/Heatmap (= 3.1.1) + - Google-Maps-iOS-Utils/QuadTree (= 3.1.1) + - GoogleMaps + - Google-Maps-iOS-Utils/Clustering (3.1.1): + - Google-Maps-iOS-Utils/QuadTree + - GoogleMaps + - Google-Maps-iOS-Utils/Geometry (3.1.1): + - GoogleMaps + - Google-Maps-iOS-Utils/Heatmap (3.1.1): + - Google-Maps-iOS-Utils/QuadTree + - GoogleMaps + - Google-Maps-iOS-Utils/QuadTree (3.1.1): + - GoogleMaps + - GoogleMaps (3.8.0): + - GoogleMaps/Maps (= 3.8.0) + - GoogleMaps/Base (3.8.0) + - GoogleMaps/Maps (3.8.0): + - GoogleMaps/Base + - GooglePlaces (3.8.0): + - GoogleMaps/Base (= 3.8.0) + +DEPENDENCIES: + - Alamofire (~> 5.0) + - Google-Maps-iOS-Utils + - GoogleMaps + - GooglePlaces + +SPEC REPOS: + trunk: + - Alamofire + - Google-Maps-iOS-Utils + - GoogleMaps + - GooglePlaces + +SPEC CHECKSUMS: + Alamofire: 3ba7a4db18b4f62c4a1c0e1cb39d7f3d52e10ada + Google-Maps-iOS-Utils: f5d6ea55799d2ef47c113e1351b48e21cddd593c + GoogleMaps: 7c8d66d70e4e8c300f43a7219d8fdaad7b325a9a + GooglePlaces: d5f70c3e9e427964fdeca1301a665d276ccd8754 + +PODFILE CHECKSUM: 191e0d5d3ef49627c13ab8be970e982c2afabb4d + +COCOAPODS: 1.9.0 diff --git a/Pods/Alamofire/LICENSE b/Pods/Alamofire/LICENSE new file mode 100644 index 0000000..ccafad5 --- /dev/null +++ b/Pods/Alamofire/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2014-2020 Alamofire Software Foundation (http://alamofire.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 +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/Pods/Alamofire/README.md b/Pods/Alamofire/README.md new file mode 100644 index 0000000..72fd65b --- /dev/null +++ b/Pods/Alamofire/README.md @@ -0,0 +1,200 @@ +![Alamofire: Elegant Networking in Swift](https://raw.githubusercontent.com/Alamofire/Alamofire/master/alamofire.png) + +[![Build Status](https://github.com/Alamofire/Alamofire/workflows/Alamofire%20CI/badge.svg?branch=master)](https://github.com/Alamofire/Alamofire/actions) +[![CocoaPods Compatible](https://img.shields.io/cocoapods/v/Alamofire.svg)](https://img.shields.io/cocoapods/v/Alamofire.svg) +[![Carthage Compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) +[![Platform](https://img.shields.io/cocoapods/p/Alamofire.svg?style=flat)](https://alamofire.github.io/Alamofire) +[![Twitter](https://img.shields.io/badge/twitter-@AlamofireSF-blue.svg?style=flat)](https://twitter.com/AlamofireSF) +[![Gitter](https://badges.gitter.im/Alamofire/Alamofire.svg)](https://gitter.im/Alamofire/Alamofire?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) +[![Open Source Helpers](https://www.codetriage.com/alamofire/alamofire/badges/users.svg)](https://www.codetriage.com/alamofire/alamofire) + +Alamofire is an HTTP networking library written in Swift. + +- [Features](#features) +- [Component Libraries](#component-libraries) +- [Requirements](#requirements) +- [Migration Guides](#migration-guides) +- [Communication](#communication) +- [Installation](#installation) +- [Usage](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md#using-alamofire) + - [**Introduction -**](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md#introduction) [Making Requests](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md#making-requests), [Response Handling](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md#response-handling), [Response Validation](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md#response-validation), [Response Caching](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md#response-caching) + - **HTTP -** [HTTP Methods](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md#http-methods), [Parameters and Parameter Encoder](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md##request-parameters-and-parameter-encoders), [HTTP Headers](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md#http-headers), [Authentication](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md#authentication) + - **Large Data -** [Downloading Data to a File](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md#downloading-data-to-a-file), [Uploading Data to a Server](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md#uploading-data-to-a-server) + - **Tools -** [Statistical Metrics](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md#statistical-metrics), [cURL Command Output](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md#curl-command-output) +- [Advanced Usage](https://github.com/Alamofire/Alamofire/blob/master/Documentation/AdvancedUsage.md) + - **URL Session -** [Session Manager](https://github.com/Alamofire/Alamofire/blob/master/Documentation/AdvancedUsage.md#session), [Session Delegate](https://github.com/Alamofire/Alamofire/blob/master/Documentation/AdvancedUsage.md#sessiondelegate), [Request](https://github.com/Alamofire/Alamofire/blob/master/Documentation/AdvancedUsage.md#request) + - **Routing -** [Routing Requests](https://github.com/Alamofire/Alamofire/blob/master/Documentation/AdvancedUsage.md#routing-requests), [Adapting and Retrying Requests](https://github.com/Alamofire/Alamofire/blob/master/Documentation/AdvancedUsage.md#adapting-and-retrying-requests) + - **Model Objects -** [Custom Response Serialization](https://github.com/Alamofire/Alamofire/blob/master/Documentation/AdvancedUsage.md#custom-response-serialization) + - **Connection -** [Security](https://github.com/Alamofire/Alamofire/blob/master/Documentation/AdvancedUsage.md#security), [Network Reachability](https://github.com/Alamofire/Alamofire/blob/master/Documentation/AdvancedUsage.md#network-reachability) +- [Open Radars](#open-radars) +- [FAQ](#faq) +- [Credits](#credits) +- [Donations](#donations) +- [License](#license) + +## Features + +- [x] Chainable Request / Response Methods +- [x] URL / JSON Parameter Encoding +- [x] Upload File / Data / Stream / MultipartFormData +- [x] Download File using Request or Resume Data +- [x] Authentication with URLCredential +- [x] HTTP Response Validation +- [x] Upload and Download Progress Closures with Progress +- [x] cURL Command Output +- [x] Dynamically Adapt and Retry Requests +- [x] TLS Certificate and Public Key Pinning +- [x] Network Reachability +- [x] Comprehensive Unit and Integration Test Coverage +- [x] [Complete Documentation](https://alamofire.github.io/Alamofire) + +## Component Libraries + +In order to keep Alamofire focused specifically on core networking implementations, additional component libraries have been created by the [Alamofire Software Foundation](https://github.com/Alamofire/Foundation) to bring additional functionality to the Alamofire ecosystem. + +- [AlamofireImage](https://github.com/Alamofire/AlamofireImage) - An image library including image response serializers, `UIImage` and `UIImageView` extensions, custom image filters, an auto-purging in-memory cache and a priority-based image downloading system. +- [AlamofireNetworkActivityIndicator](https://github.com/Alamofire/AlamofireNetworkActivityIndicator) - Controls the visibility of the network activity indicator on iOS using Alamofire. It contains configurable delay timers to help mitigate flicker and can support `URLSession` instances not managed by Alamofire. + +## Requirements + +- iOS 10.0+ / macOS 10.12+ / tvOS 10.0+ / watchOS 3.0+ +- Xcode 10.2+ +- Swift 5+ + +## Migration Guides + +- [Alamofire 5.0 Migration Guide](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Alamofire%205.0%20Migration%20Guide.md) +- [Alamofire 4.0 Migration Guide](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Alamofire%204.0%20Migration%20Guide.md) +- [Alamofire 3.0 Migration Guide](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Alamofire%203.0%20Migration%20Guide.md) +- [Alamofire 2.0 Migration Guide](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Alamofire%202.0%20Migration%20Guide.md) + +## Communication +- If you **need help with making network requests** using Alamofire, use [Stack Overflow](https://stackoverflow.com/questions/tagged/alamofire) and tag `alamofire`. +- If you need to **find or understand an API**, check [our documentation](http://alamofire.github.io/Alamofire/) or [Apple's documentation for `URLSession`](https://developer.apple.com/documentation/foundation/url_loading_system), on top of which Alamofire is built. +- If you need **help with an Alamofire feature**, use [our forum on swift.org](https://forums.swift.org/c/related-projects/alamofire). +- If you'd like to **discuss Alamofire best practices**, use [our forum on swift.org](https://forums.swift.org/c/related-projects/alamofire). +- If you'd like to **discuss a feature request**, use [our forum on swift.org](https://forums.swift.org/c/related-projects/alamofire). +- If you **found a bug**, open an issue here on GitHub and follow the guide. The more detail the better! +- If you **want to contribute**, submit a pull request! + +## Installation + +### CocoaPods + +[CocoaPods](https://cocoapods.org) is a dependency manager for Cocoa projects. For usage and installation instructions, visit their website. To integrate Alamofire into your Xcode project using CocoaPods, specify it in your `Podfile`: + +```ruby +pod 'Alamofire', '~> 5.0' +``` + +### Carthage + +[Carthage](https://github.com/Carthage/Carthage) is a decentralized dependency manager that builds your dependencies and provides you with binary frameworks. To integrate Alamofire into your Xcode project using Carthage, specify it in your `Cartfile`: + +```ogdl +github "Alamofire/Alamofire" "5.0" +``` + +### Swift Package Manager + +The [Swift Package Manager](https://swift.org/package-manager/) is a tool for automating the distribution of Swift code and is integrated into the `swift` compiler. It is in early development, but Alamofire does support its use on supported platforms. + +Once you have your Swift package set up, adding Alamofire as a dependency is as easy as adding it to the `dependencies` value of your `Package.swift`. + +```swift +dependencies: [ + .package(url: "https://github.com/Alamofire/Alamofire.git", from: "5.0") +] +``` + +### Manually + +If you prefer not to use any of the aforementioned dependency managers, you can integrate Alamofire into your project manually. + +#### Embedded Framework + +- Open up Terminal, `cd` into your top-level project directory, and run the following command "if" your project is not initialized as a git repository: + + ```bash + $ git init + ``` + +- Add Alamofire as a git [submodule](https://git-scm.com/docs/git-submodule) by running the following command: + + ```bash + $ git submodule add https://github.com/Alamofire/Alamofire.git + ``` + +- Open the new `Alamofire` folder, and drag the `Alamofire.xcodeproj` into the Project Navigator of your application's Xcode project. + + > It should appear nested underneath your application's blue project icon. Whether it is above or below all the other Xcode groups does not matter. + +- Select the `Alamofire.xcodeproj` in the Project Navigator and verify the deployment target matches that of your application target. +- Next, select your application project in the Project Navigator (blue project icon) to navigate to the target configuration window and select the application target under the "Targets" heading in the sidebar. +- In the tab bar at the top of that window, open the "General" panel. +- Click on the `+` button under the "Embedded Binaries" section. +- You will see two different `Alamofire.xcodeproj` folders each with two different versions of the `Alamofire.framework` nested inside a `Products` folder. + + > It does not matter which `Products` folder you choose from, but it does matter whether you choose the top or bottom `Alamofire.framework`. + +- Select the top `Alamofire.framework` for iOS and the bottom one for macOS. + + > You can verify which one you selected by inspecting the build log for your project. The build target for `Alamofire` will be listed as either `Alamofire iOS`, `Alamofire macOS`, `Alamofire tvOS` or `Alamofire watchOS`. + +- And that's it! + + > The `Alamofire.framework` is automagically added as a target dependency, linked framework and embedded framework in a copy files build phase which is all you need to build on the simulator and a device. + +## Open Radars + +The following radars have some effect on the current implementation of Alamofire. + +- [`rdar://21349340`](http://www.openradar.me/radar?id=5517037090635776) - Compiler throwing warning due to toll-free bridging issue in test case +- `rdar://26870455` - Background URL Session Configurations do not work in the simulator +- `rdar://26849668` - Some URLProtocol APIs do not properly handle `URLRequest` + +## Resolved Radars + +The following radars have been resolved over time after being filed against the Alamofire project. + +- [`rdar://26761490`](http://www.openradar.me/radar?id=5010235949318144) - Swift string interpolation causing memory leak with common usage. + - (Resolved): 9/1/17 in Xcode 9 beta 6. +- [`rdar://36082113`](http://openradar.appspot.com/radar?id=4942308441063424) - `URLSessionTaskMetrics` failing to link on watchOS 3.0+ + - (Resolved): Just add `CFNetwork` to your linked frameworks. + +## FAQ + +### What's the origin of the name Alamofire? + +Alamofire is named after the [Alamo Fire flower](https://aggie-horticulture.tamu.edu/wildseed/alamofire.html), a hybrid variant of the Bluebonnet, the official state flower of Texas. + +## Credits + +Alamofire is owned and maintained by the [Alamofire Software Foundation](http://alamofire.org). You can follow them on Twitter at [@AlamofireSF](https://twitter.com/AlamofireSF) for project updates and releases. + +### Security Disclosure + +If you believe you have identified a security vulnerability with Alamofire, you should report it as soon as possible via email to security@alamofire.org. Please do not post it to a public issue tracker. + +## Donations + +The [ASF](https://github.com/Alamofire/Foundation#members) is looking to raise money to officially stay registered as a federal non-profit organization. +Registering will allow us members to gain some legal protections and also allow us to put donations to use, tax-free. +Donating to the ASF will enable us to: + +- Pay our yearly legal fees to keep the non-profit in good status +- Pay for our mail servers to help us stay on top of all questions and security issues +- Potentially fund test servers to make it easier for us to test the edge cases +- Potentially fund developers to work on one of our projects full-time + +The community adoption of the ASF libraries has been amazing. +We are greatly humbled by your enthusiasm around the projects and want to continue to do everything we can to move the needle forward. +With your continued support, the ASF will be able to improve its reach and also provide better legal safety for the core members. +If you use any of our libraries for work, see if your employers would be interested in donating. +Any amount you can donate today to help us reach our goal would be greatly appreciated. + +[![paypal](https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=W34WPEE74APJQ) + +## License + +Alamofire is released under the MIT license. [See LICENSE](https://github.com/Alamofire/Alamofire/blob/master/LICENSE) for details. diff --git a/Pods/Alamofire/Source/AFError.swift b/Pods/Alamofire/Source/AFError.swift new file mode 100644 index 0000000..8ab282c --- /dev/null +++ b/Pods/Alamofire/Source/AFError.swift @@ -0,0 +1,840 @@ +// +// AFError.swift +// +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.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 +// 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. +// + +import Foundation + +/// `AFError` is the error type returned by Alamofire. It encompasses a few different types of errors, each with +/// their own associated reasons. +public enum AFError: Error { + /// The underlying reason the `.multipartEncodingFailed` error occurred. + public enum MultipartEncodingFailureReason { + /// The `fileURL` provided for reading an encodable body part isn't a file `URL`. + case bodyPartURLInvalid(url: URL) + /// The filename of the `fileURL` provided has either an empty `lastPathComponent` or `pathExtension. + case bodyPartFilenameInvalid(in: URL) + /// The file at the `fileURL` provided was not reachable. + case bodyPartFileNotReachable(at: URL) + /// Attempting to check the reachability of the `fileURL` provided threw an error. + case bodyPartFileNotReachableWithError(atURL: URL, error: Error) + /// The file at the `fileURL` provided is actually a directory. + case bodyPartFileIsDirectory(at: URL) + /// The size of the file at the `fileURL` provided was not returned by the system. + case bodyPartFileSizeNotAvailable(at: URL) + /// The attempt to find the size of the file at the `fileURL` provided threw an error. + case bodyPartFileSizeQueryFailedWithError(forURL: URL, error: Error) + /// An `InputStream` could not be created for the provided `fileURL`. + case bodyPartInputStreamCreationFailed(for: URL) + /// An `OutputStream` could not be created when attempting to write the encoded data to disk. + case outputStreamCreationFailed(for: URL) + /// The encoded body data could not be written to disk because a file already exists at the provided `fileURL`. + case outputStreamFileAlreadyExists(at: URL) + /// The `fileURL` provided for writing the encoded body data to disk is not a file `URL`. + case outputStreamURLInvalid(url: URL) + /// The attempt to write the encoded body data to disk failed with an underlying error. + case outputStreamWriteFailed(error: Error) + /// The attempt to read an encoded body part `InputStream` failed with underlying system error. + case inputStreamReadFailed(error: Error) + } + + /// The underlying reason the `.parameterEncodingFailed` error occurred. + public enum ParameterEncodingFailureReason { + /// The `URLRequest` did not have a `URL` to encode. + case missingURL + /// JSON serialization failed with an underlying system error during the encoding process. + case jsonEncodingFailed(error: Error) + /// Custom parameter encoding failed due to the associated `Error`. + case customEncodingFailed(error: Error) + } + + /// The underlying reason the `.parameterEncoderFailed` error occurred. + public enum ParameterEncoderFailureReason { + /// Possible missing components. + public enum RequiredComponent { + /// The `URL` was missing or unable to be extracted from the passed `URLRequest` or during encoding. + case url + /// The `HTTPMethod` could not be extracted from the passed `URLRequest`. + case httpMethod(rawValue: String) + } + + /// A `RequiredComponent` was missing during encoding. + case missingRequiredComponent(RequiredComponent) + /// The underlying encoder failed with the associated error. + case encoderFailed(error: Error) + } + + /// The underlying reason the `.responseValidationFailed` error occurred. + public enum ResponseValidationFailureReason { + /// The data file containing the server response did not exist. + case dataFileNil + /// The data file containing the server response at the associated `URL` could not be read. + case dataFileReadFailed(at: URL) + /// The response did not contain a `Content-Type` and the `acceptableContentTypes` provided did not contain a + /// wildcard type. + case missingContentType(acceptableContentTypes: [String]) + /// The response `Content-Type` did not match any type in the provided `acceptableContentTypes`. + case unacceptableContentType(acceptableContentTypes: [String], responseContentType: String) + /// The response status code was not acceptable. + case unacceptableStatusCode(code: Int) + /// Custom response validation failed due to the associated `Error`. + case customValidationFailed(error: Error) + } + + /// The underlying reason the response serialization error occurred. + public enum ResponseSerializationFailureReason { + /// The server response contained no data or the data was zero length. + case inputDataNilOrZeroLength + /// The file containing the server response did not exist. + case inputFileNil + /// The file containing the server response could not be read from the associated `URL`. + case inputFileReadFailed(at: URL) + /// String serialization failed using the provided `String.Encoding`. + case stringSerializationFailed(encoding: String.Encoding) + /// JSON serialization failed with an underlying system error. + case jsonSerializationFailed(error: Error) + /// A `DataDecoder` failed to decode the response due to the associated `Error`. + case decodingFailed(error: Error) + /// A custom response serializer failed due to the associated `Error`. + case customSerializationFailed(error: Error) + /// Generic serialization failed for an empty response that wasn't type `Empty` but instead the associated type. + case invalidEmptyResponse(type: String) + } + + /// Underlying reason a server trust evaluation error occurred. + public enum ServerTrustFailureReason { + /// The output of a server trust evaluation. + public struct Output { + /// The host for which the evaluation was performed. + public let host: String + /// The `SecTrust` value which was evaluated. + public let trust: SecTrust + /// The `OSStatus` of evaluation operation. + public let status: OSStatus + /// The result of the evaluation operation. + public let result: SecTrustResultType + + /// Creates an `Output` value from the provided values. + init(_ host: String, _ trust: SecTrust, _ status: OSStatus, _ result: SecTrustResultType) { + self.host = host + self.trust = trust + self.status = status + self.result = result + } + } + + /// No `ServerTrustEvaluator` was found for the associated host. + case noRequiredEvaluator(host: String) + /// No certificates were found with which to perform the trust evaluation. + case noCertificatesFound + /// No public keys were found with which to perform the trust evaluation. + case noPublicKeysFound + /// During evaluation, application of the associated `SecPolicy` failed. + case policyApplicationFailed(trust: SecTrust, policy: SecPolicy, status: OSStatus) + /// During evaluation, setting the associated anchor certificates failed. + case settingAnchorCertificatesFailed(status: OSStatus, certificates: [SecCertificate]) + /// During evaluation, creation of the revocation policy failed. + case revocationPolicyCreationFailed + /// `SecTrust` evaluation failed with the associated `Error`, if one was produced. + case trustEvaluationFailed(error: Error?) + /// Default evaluation failed with the associated `Output`. + case defaultEvaluationFailed(output: Output) + /// Host validation failed with the associated `Output`. + case hostValidationFailed(output: Output) + /// Revocation check failed with the associated `Output` and options. + case revocationCheckFailed(output: Output, options: RevocationTrustEvaluator.Options) + /// Certificate pinning failed. + case certificatePinningFailed(host: String, trust: SecTrust, pinnedCertificates: [SecCertificate], serverCertificates: [SecCertificate]) + /// Public key pinning failed. + case publicKeyPinningFailed(host: String, trust: SecTrust, pinnedKeys: [SecKey], serverKeys: [SecKey]) + /// Custom server trust evaluation failed due to the associated `Error`. + case customEvaluationFailed(error: Error) + } + + /// The underlying reason the `.urlRequestValidationFailed` + public enum URLRequestValidationFailureReason { + /// URLRequest with GET method had body data. + case bodyDataInGETRequest(Data) + } + + /// `UploadableConvertible` threw an error in `createUploadable()`. + case createUploadableFailed(error: Error) + /// `URLRequestConvertible` threw an error in `asURLRequest()`. + case createURLRequestFailed(error: Error) + /// `SessionDelegate` threw an error while attempting to move downloaded file to destination URL. + case downloadedFileMoveFailed(error: Error, source: URL, destination: URL) + /// `Request` was explicitly cancelled. + case explicitlyCancelled + /// `URLConvertible` type failed to create a valid `URL`. + case invalidURL(url: URLConvertible) + /// Multipart form encoding failed. + case multipartEncodingFailed(reason: MultipartEncodingFailureReason) + /// `ParameterEncoding` threw an error during the encoding process. + case parameterEncodingFailed(reason: ParameterEncodingFailureReason) + /// `ParameterEncoder` threw an error while running the encoder. + case parameterEncoderFailed(reason: ParameterEncoderFailureReason) + /// `RequestAdapter` threw an error during adaptation. + case requestAdaptationFailed(error: Error) + /// `RequestRetrier` threw an error during the request retry process. + case requestRetryFailed(retryError: Error, originalError: Error) + /// Response validation failed. + case responseValidationFailed(reason: ResponseValidationFailureReason) + /// Response serialization failed. + case responseSerializationFailed(reason: ResponseSerializationFailureReason) + /// `ServerTrustEvaluating` instance threw an error during trust evaluation. + case serverTrustEvaluationFailed(reason: ServerTrustFailureReason) + /// `Session` which issued the `Request` was deinitialized, most likely because its reference went out of scope. + case sessionDeinitialized + /// `Session` was explicitly invalidated, possibly with the `Error` produced by the underlying `URLSession`. + case sessionInvalidated(error: Error?) + /// `URLSessionTask` completed with error. + case sessionTaskFailed(error: Error) + /// `URLRequest` failed validation. + case urlRequestValidationFailed(reason: URLRequestValidationFailureReason) +} + +extension Error { + /// Returns the instance cast as an `AFError`. + public var asAFError: AFError? { + return self as? AFError + } + + /// Returns the instance cast as an `AFError`. If casting fails, a `fatalError` with the specified `message` is thrown. + public func asAFError(orFailWith message: @autoclosure () -> String, file: StaticString = #file, line: UInt = #line) -> AFError { + guard let afError = self as? AFError else { + fatalError(message(), file: file, line: line) + } + return afError + } + + /// Casts the instance as `AFError` or returns `defaultAFError` + func asAFError(or defaultAFError: @autoclosure () -> AFError) -> AFError { + return self as? AFError ?? defaultAFError() + } +} + +// MARK: - Error Booleans + +extension AFError { + /// Returns whether the instance is `.sessionDeinitialized`. + public var isSessionDeinitializedError: Bool { + if case .sessionDeinitialized = self { return true } + return false + } + + /// Returns whether the instance is `.sessionInvalidated`. + public var isSessionInvalidatedError: Bool { + if case .sessionInvalidated = self { return true } + return false + } + + /// Returns whether the instance is `.explicitlyCancelled`. + public var isExplicitlyCancelledError: Bool { + if case .explicitlyCancelled = self { return true } + return false + } + + /// Returns whether the instance is `.invalidURL`. + public var isInvalidURLError: Bool { + if case .invalidURL = self { return true } + return false + } + + /// Returns whether the instance is `.parameterEncodingFailed`. When `true`, the `underlyingError` property will + /// contain the associated value. + public var isParameterEncodingError: Bool { + if case .parameterEncodingFailed = self { return true } + return false + } + + /// Returns whether the instance is `.parameterEncoderFailed`. When `true`, the `underlyingError` property will + /// contain the associated value. + public var isParameterEncoderError: Bool { + if case .parameterEncoderFailed = self { return true } + return false + } + + /// Returns whether the instance is `.multipartEncodingFailed`. When `true`, the `url` and `underlyingError` + /// properties will contain the associated values. + public var isMultipartEncodingError: Bool { + if case .multipartEncodingFailed = self { return true } + return false + } + + /// Returns whether the instance is `.requestAdaptationFailed`. When `true`, the `underlyingError` property will + /// contain the associated value. + public var isRequestAdaptationError: Bool { + if case .requestAdaptationFailed = self { return true } + return false + } + + /// Returns whether the instance is `.responseValidationFailed`. When `true`, the `acceptableContentTypes`, + /// `responseContentType`, `responseCode`, and `underlyingError` properties will contain the associated values. + public var isResponseValidationError: Bool { + if case .responseValidationFailed = self { return true } + return false + } + + /// Returns whether the instance is `.responseSerializationFailed`. When `true`, the `failedStringEncoding` and + /// `underlyingError` properties will contain the associated values. + public var isResponseSerializationError: Bool { + if case .responseSerializationFailed = self { return true } + return false + } + + /// Returns whether the instance is `.serverTrustEvaluationFailed`. When `true`, the `underlyingError` property will + /// contain the associated value. + public var isServerTrustEvaluationError: Bool { + if case .serverTrustEvaluationFailed = self { return true } + return false + } + + /// Returns whether the instance is `requestRetryFailed`. When `true`, the `underlyingError` property will + /// contain the associated value. + public var isRequestRetryError: Bool { + if case .requestRetryFailed = self { return true } + return false + } + + /// Returns whether the instance is `createUploadableFailed`. When `true`, the `underlyingError` property will + /// contain the associated value. + public var isCreateUploadableError: Bool { + if case .createUploadableFailed = self { return true } + return false + } + + /// Returns whether the instance is `createURLRequestFailed`. When `true`, the `underlyingError` property will + /// contain the associated value. + public var isCreateURLRequestError: Bool { + if case .createURLRequestFailed = self { return true } + return false + } + + /// Returns whether the instance is `downloadedFileMoveFailed`. When `true`, the `destination` and `underlyingError` properties will + /// contain the associated values. + public var isDownloadedFileMoveError: Bool { + if case .downloadedFileMoveFailed = self { return true } + return false + } + + /// Returns whether the instance is `createURLRequestFailed`. When `true`, the `underlyingError` property will + /// contain the associated value. + public var isSessionTaskError: Bool { + if case .sessionTaskFailed = self { return true } + return false + } +} + +// MARK: - Convenience Properties + +extension AFError { + /// The `URLConvertible` associated with the error. + public var urlConvertible: URLConvertible? { + guard case let .invalidURL(url) = self else { return nil } + return url + } + + /// The `URL` associated with the error. + public var url: URL? { + guard case let .multipartEncodingFailed(reason) = self else { return nil } + return reason.url + } + + /// The underlying `Error` responsible for generating the failure associated with `.sessionInvalidated`, + /// `.parameterEncodingFailed`, `.parameterEncoderFailed`, `.multipartEncodingFailed`, `.requestAdaptationFailed`, + /// `.responseSerializationFailed`, `.requestRetryFailed` errors. + public var underlyingError: Error? { + switch self { + case let .multipartEncodingFailed(reason): + return reason.underlyingError + case let .parameterEncodingFailed(reason): + return reason.underlyingError + case let .parameterEncoderFailed(reason): + return reason.underlyingError + case let .requestAdaptationFailed(error): + return error + case let .requestRetryFailed(retryError, _): + return retryError + case let .responseValidationFailed(reason): + return reason.underlyingError + case let .responseSerializationFailed(reason): + return reason.underlyingError + case let .serverTrustEvaluationFailed(reason): + return reason.underlyingError + case let .sessionInvalidated(error): + return error + case let .createUploadableFailed(error): + return error + case let .createURLRequestFailed(error): + return error + case let .downloadedFileMoveFailed(error, _, _): + return error + case let .sessionTaskFailed(error): + return error + case .explicitlyCancelled, + .invalidURL, + .sessionDeinitialized, + .urlRequestValidationFailed: + return nil + } + } + + /// The acceptable `Content-Type`s of a `.responseValidationFailed` error. + public var acceptableContentTypes: [String]? { + guard case let .responseValidationFailed(reason) = self else { return nil } + return reason.acceptableContentTypes + } + + /// The response `Content-Type` of a `.responseValidationFailed` error. + public var responseContentType: String? { + guard case let .responseValidationFailed(reason) = self else { return nil } + return reason.responseContentType + } + + /// The response code of a `.responseValidationFailed` error. + public var responseCode: Int? { + guard case let .responseValidationFailed(reason) = self else { return nil } + return reason.responseCode + } + + /// The `String.Encoding` associated with a failed `.stringResponse()` call. + public var failedStringEncoding: String.Encoding? { + guard case let .responseSerializationFailed(reason) = self else { return nil } + return reason.failedStringEncoding + } + + /// The `source` URL of a `.downloadedFileMoveFailed` error. + public var sourceURL: URL? { + guard case let .downloadedFileMoveFailed(_, source, _) = self else { return nil } + return source + } + + /// The `destination` URL of a `.downloadedFileMoveFailed` error. + public var destinationURL: URL? { + guard case let .downloadedFileMoveFailed(_, _, destination) = self else { return nil } + return destination + } +} + +extension AFError.ParameterEncodingFailureReason { + var underlyingError: Error? { + switch self { + case let .jsonEncodingFailed(error), + let .customEncodingFailed(error): + return error + case .missingURL: + return nil + } + } +} + +extension AFError.ParameterEncoderFailureReason { + var underlyingError: Error? { + switch self { + case let .encoderFailed(error): + return error + case .missingRequiredComponent: + return nil + } + } +} + +extension AFError.MultipartEncodingFailureReason { + var url: URL? { + switch self { + case let .bodyPartURLInvalid(url), + let .bodyPartFilenameInvalid(url), + let .bodyPartFileNotReachable(url), + let .bodyPartFileIsDirectory(url), + let .bodyPartFileSizeNotAvailable(url), + let .bodyPartInputStreamCreationFailed(url), + let .outputStreamCreationFailed(url), + let .outputStreamFileAlreadyExists(url), + let .outputStreamURLInvalid(url), + let .bodyPartFileNotReachableWithError(url, _), + let .bodyPartFileSizeQueryFailedWithError(url, _): + return url + case .outputStreamWriteFailed, + .inputStreamReadFailed: + return nil + } + } + + var underlyingError: Error? { + switch self { + case let .bodyPartFileNotReachableWithError(_, error), + let .bodyPartFileSizeQueryFailedWithError(_, error), + let .outputStreamWriteFailed(error), + let .inputStreamReadFailed(error): + return error + case .bodyPartURLInvalid, + .bodyPartFilenameInvalid, + .bodyPartFileNotReachable, + .bodyPartFileIsDirectory, + .bodyPartFileSizeNotAvailable, + .bodyPartInputStreamCreationFailed, + .outputStreamCreationFailed, + .outputStreamFileAlreadyExists, + .outputStreamURLInvalid: + return nil + } + } +} + +extension AFError.ResponseValidationFailureReason { + var acceptableContentTypes: [String]? { + switch self { + case let .missingContentType(types), + let .unacceptableContentType(types, _): + return types + case .dataFileNil, + .dataFileReadFailed, + .unacceptableStatusCode, + .customValidationFailed: + return nil + } + } + + var responseContentType: String? { + switch self { + case let .unacceptableContentType(_, responseType): + return responseType + case .dataFileNil, + .dataFileReadFailed, + .missingContentType, + .unacceptableStatusCode, + .customValidationFailed: + return nil + } + } + + var responseCode: Int? { + switch self { + case let .unacceptableStatusCode(code): + return code + case .dataFileNil, + .dataFileReadFailed, + .missingContentType, + .unacceptableContentType, + .customValidationFailed: + return nil + } + } + + var underlyingError: Error? { + switch self { + case let .customValidationFailed(error): + return error + case .dataFileNil, + .dataFileReadFailed, + .missingContentType, + .unacceptableContentType, + .unacceptableStatusCode: + return nil + } + } +} + +extension AFError.ResponseSerializationFailureReason { + var failedStringEncoding: String.Encoding? { + switch self { + case let .stringSerializationFailed(encoding): + return encoding + case .inputDataNilOrZeroLength, + .inputFileNil, + .inputFileReadFailed(_), + .jsonSerializationFailed(_), + .decodingFailed(_), + .customSerializationFailed(_), + .invalidEmptyResponse: + return nil + } + } + + var underlyingError: Error? { + switch self { + case let .jsonSerializationFailed(error), + let .decodingFailed(error), + let .customSerializationFailed(error): + return error + case .inputDataNilOrZeroLength, + .inputFileNil, + .inputFileReadFailed, + .stringSerializationFailed, + .invalidEmptyResponse: + return nil + } + } +} + +extension AFError.ServerTrustFailureReason { + var output: AFError.ServerTrustFailureReason.Output? { + switch self { + case let .defaultEvaluationFailed(output), + let .hostValidationFailed(output), + let .revocationCheckFailed(output, _): + return output + case .noRequiredEvaluator, + .noCertificatesFound, + .noPublicKeysFound, + .policyApplicationFailed, + .settingAnchorCertificatesFailed, + .revocationPolicyCreationFailed, + .trustEvaluationFailed, + .certificatePinningFailed, + .publicKeyPinningFailed, + .customEvaluationFailed: + return nil + } + } + + var underlyingError: Error? { + switch self { + case let .customEvaluationFailed(error): + return error + case let .trustEvaluationFailed(error): + return error + case .noRequiredEvaluator, + .noCertificatesFound, + .noPublicKeysFound, + .policyApplicationFailed, + .settingAnchorCertificatesFailed, + .revocationPolicyCreationFailed, + .defaultEvaluationFailed, + .hostValidationFailed, + .revocationCheckFailed, + .certificatePinningFailed, + .publicKeyPinningFailed: + return nil + } + } +} + +// MARK: - Error Descriptions + +extension AFError: LocalizedError { + public var errorDescription: String? { + switch self { + case .explicitlyCancelled: + return "Request explicitly cancelled." + case let .invalidURL(url): + return "URL is not valid: \(url)" + case let .parameterEncodingFailed(reason): + return reason.localizedDescription + case let .parameterEncoderFailed(reason): + return reason.localizedDescription + case let .multipartEncodingFailed(reason): + return reason.localizedDescription + case let .requestAdaptationFailed(error): + return "Request adaption failed with error: \(error.localizedDescription)" + case let .responseValidationFailed(reason): + return reason.localizedDescription + case let .responseSerializationFailed(reason): + return reason.localizedDescription + case let .requestRetryFailed(retryError, originalError): + return """ + Request retry failed with retry error: \(retryError.localizedDescription), \ + original error: \(originalError.localizedDescription) + """ + case .sessionDeinitialized: + return """ + Session was invalidated without error, so it was likely deinitialized unexpectedly. \ + Be sure to retain a reference to your Session for the duration of your requests. + """ + case let .sessionInvalidated(error): + return "Session was invalidated with error: \(error?.localizedDescription ?? "No description.")" + case let .serverTrustEvaluationFailed(reason): + return "Server trust evaluation failed due to reason: \(reason.localizedDescription)" + case let .urlRequestValidationFailed(reason): + return "URLRequest validation failed due to reason: \(reason.localizedDescription)" + case let .createUploadableFailed(error): + return "Uploadable creation failed with error: \(error.localizedDescription)" + case let .createURLRequestFailed(error): + return "URLRequest creation failed with error: \(error.localizedDescription)" + case let .downloadedFileMoveFailed(error, source, destination): + return "Moving downloaded file from: \(source) to: \(destination) failed with error: \(error.localizedDescription)" + case let .sessionTaskFailed(error): + return "URLSessionTask failed with error: \(error.localizedDescription)" + } + } +} + +extension AFError.ParameterEncodingFailureReason { + var localizedDescription: String { + switch self { + case .missingURL: + return "URL request to encode was missing a URL" + case let .jsonEncodingFailed(error): + return "JSON could not be encoded because of error:\n\(error.localizedDescription)" + case let .customEncodingFailed(error): + return "Custom parameter encoder failed with error: \(error.localizedDescription)" + } + } +} + +extension AFError.ParameterEncoderFailureReason { + var localizedDescription: String { + switch self { + case let .missingRequiredComponent(component): + return "Encoding failed due to a missing request component: \(component)" + case let .encoderFailed(error): + return "The underlying encoder failed with the error: \(error)" + } + } +} + +extension AFError.MultipartEncodingFailureReason { + var localizedDescription: String { + switch self { + case let .bodyPartURLInvalid(url): + return "The URL provided is not a file URL: \(url)" + case let .bodyPartFilenameInvalid(url): + return "The URL provided does not have a valid filename: \(url)" + case let .bodyPartFileNotReachable(url): + return "The URL provided is not reachable: \(url)" + case let .bodyPartFileNotReachableWithError(url, error): + return """ + The system returned an error while checking the provided URL for reachability. + URL: \(url) + Error: \(error) + """ + case let .bodyPartFileIsDirectory(url): + return "The URL provided is a directory: \(url)" + case let .bodyPartFileSizeNotAvailable(url): + return "Could not fetch the file size from the provided URL: \(url)" + case let .bodyPartFileSizeQueryFailedWithError(url, error): + return """ + The system returned an error while attempting to fetch the file size from the provided URL. + URL: \(url) + Error: \(error) + """ + case let .bodyPartInputStreamCreationFailed(url): + return "Failed to create an InputStream for the provided URL: \(url)" + case let .outputStreamCreationFailed(url): + return "Failed to create an OutputStream for URL: \(url)" + case let .outputStreamFileAlreadyExists(url): + return "A file already exists at the provided URL: \(url)" + case let .outputStreamURLInvalid(url): + return "The provided OutputStream URL is invalid: \(url)" + case let .outputStreamWriteFailed(error): + return "OutputStream write failed with error: \(error)" + case let .inputStreamReadFailed(error): + return "InputStream read failed with error: \(error)" + } + } +} + +extension AFError.ResponseSerializationFailureReason { + var localizedDescription: String { + switch self { + case .inputDataNilOrZeroLength: + return "Response could not be serialized, input data was nil or zero length." + case .inputFileNil: + return "Response could not be serialized, input file was nil." + case let .inputFileReadFailed(url): + return "Response could not be serialized, input file could not be read: \(url)." + case let .stringSerializationFailed(encoding): + return "String could not be serialized with encoding: \(encoding)." + case let .jsonSerializationFailed(error): + return "JSON could not be serialized because of error:\n\(error.localizedDescription)" + case let .invalidEmptyResponse(type): + return """ + Empty response could not be serialized to type: \(type). \ + Use Empty as the expected type for such responses. + """ + case let .decodingFailed(error): + return "Response could not be decoded because of error:\n\(error.localizedDescription)" + case let .customSerializationFailed(error): + return "Custom response serializer failed with error:\n\(error.localizedDescription)" + } + } +} + +extension AFError.ResponseValidationFailureReason { + var localizedDescription: String { + switch self { + case .dataFileNil: + return "Response could not be validated, data file was nil." + case let .dataFileReadFailed(url): + return "Response could not be validated, data file could not be read: \(url)." + case let .missingContentType(types): + return """ + Response Content-Type was missing and acceptable content types \ + (\(types.joined(separator: ","))) do not match "*/*". + """ + case let .unacceptableContentType(acceptableTypes, responseType): + return """ + Response Content-Type "\(responseType)" does not match any acceptable types: \ + \(acceptableTypes.joined(separator: ",")). + """ + case let .unacceptableStatusCode(code): + return "Response status code was unacceptable: \(code)." + case let .customValidationFailed(error): + return "Custom response validation failed with error: \(error.localizedDescription)" + } + } +} + +extension AFError.ServerTrustFailureReason { + var localizedDescription: String { + switch self { + case let .noRequiredEvaluator(host): + return "A ServerTrustEvaluating value is required for host \(host) but none was found." + case .noCertificatesFound: + return "No certificates were found or provided for evaluation." + case .noPublicKeysFound: + return "No public keys were found or provided for evaluation." + case .policyApplicationFailed: + return "Attempting to set a SecPolicy failed." + case .settingAnchorCertificatesFailed: + return "Attempting to set the provided certificates as anchor certificates failed." + case .revocationPolicyCreationFailed: + return "Attempting to create a revocation policy failed." + case let .trustEvaluationFailed(error): + return "SecTrust evaluation failed with error: \(error?.localizedDescription ?? "None")" + case let .defaultEvaluationFailed(output): + return "Default evaluation failed for host \(output.host)." + case let .hostValidationFailed(output): + return "Host validation failed for host \(output.host)." + case let .revocationCheckFailed(output, _): + return "Revocation check failed for host \(output.host)." + case let .certificatePinningFailed(host, _, _, _): + return "Certificate pinning failed for host \(host)." + case let .publicKeyPinningFailed(host, _, _, _): + return "Public key pinning failed for host \(host)." + case let .customEvaluationFailed(error): + return "Custom trust evaluation failed with error: \(error.localizedDescription)" + } + } +} + +extension AFError.URLRequestValidationFailureReason { + var localizedDescription: String { + switch self { + case let .bodyDataInGETRequest(data): + return """ + Invalid URLRequest: Requests with GET method cannot have body data: + \(String(decoding: data, as: UTF8.self)) + """ + } + } +} diff --git a/Pods/Alamofire/Source/Alamofire.swift b/Pods/Alamofire/Source/Alamofire.swift new file mode 100644 index 0000000..7f2ca5b --- /dev/null +++ b/Pods/Alamofire/Source/Alamofire.swift @@ -0,0 +1,29 @@ +// +// Alamofire.swift +// +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.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 +// 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. +// + +/// Reference to `Session.default` for quick bootstrapping and examples. +public let AF = Session.default + +/// Current Alamofire version. Necessary since SPM doesn't use dynamic libraries. Plus this will be more accurate. +let version = "5.0.2" diff --git a/Pods/Alamofire/Source/AlamofireExtended.swift b/Pods/Alamofire/Source/AlamofireExtended.swift new file mode 100644 index 0000000..cb9eccf --- /dev/null +++ b/Pods/Alamofire/Source/AlamofireExtended.swift @@ -0,0 +1,61 @@ +// +// AlamofireExtended.swift +// +// Copyright (c) 2019 Alamofire Software Foundation (http://alamofire.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 +// 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. +// + +/// Type that acts as a generic extension point for all `AlamofireExtended` types. +public struct AlamofireExtension { + /// Stores the type or meta-type of any extended type. + public private(set) var type: ExtendedType + + /// Create an instance from the provided value. + /// + /// - Parameter type: Instance being extended. + public init(_ type: ExtendedType) { + self.type = type + } +} + +/// Protocol describing the `af` extension points for Alamofire extended types. +public protocol AlamofireExtended { + /// Type being extended. + associatedtype ExtendedType + + /// Static Alamofire extension point. + static var af: AlamofireExtension.Type { get set } + /// Instance Alamofire extension point. + var af: AlamofireExtension { get set } +} + +public extension AlamofireExtended { + /// Static Alamofire extension point. + static var af: AlamofireExtension.Type { + get { return AlamofireExtension.self } + set {} + } + + /// Instance Alamofire extension point. + var af: AlamofireExtension { + get { return AlamofireExtension(self) } + set {} + } +} diff --git a/Pods/Alamofire/Source/CachedResponseHandler.swift b/Pods/Alamofire/Source/CachedResponseHandler.swift new file mode 100644 index 0000000..b6e0d4b --- /dev/null +++ b/Pods/Alamofire/Source/CachedResponseHandler.swift @@ -0,0 +1,91 @@ +// +// CachedResponseHandler.swift +// +// Copyright (c) 2019 Alamofire Software Foundation (http://alamofire.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 +// 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. +// + +import Foundation + +/// A type that handles whether the data task should store the HTTP response in the cache. +public protocol CachedResponseHandler { + /// Determines whether the HTTP response should be stored in the cache. + /// + /// The `completion` closure should be passed one of three possible options: + /// + /// 1. The cached response provided by the server (this is the most common use case). + /// 2. A modified version of the cached response (you may want to modify it in some way before caching). + /// 3. A `nil` value to prevent the cached response from being stored in the cache. + /// + /// - Parameters: + /// - task: The data task whose request resulted in the cached response. + /// - response: The cached response to potentially store in the cache. + /// - completion: The closure to execute containing cached response, a modified response, or `nil`. + func dataTask(_ task: URLSessionDataTask, + willCacheResponse response: CachedURLResponse, + completion: @escaping (CachedURLResponse?) -> Void) +} + +// MARK: - + +/// `ResponseCacher` is a convenience `CachedResponseHandler` making it easy to cache, not cache, or modify a cached +/// response. +public struct ResponseCacher { + /// Defines the behavior of the `ResponseCacher` type. + public enum Behavior { + /// Stores the cached response in the cache. + case cache + /// Prevents the cached response from being stored in the cache. + case doNotCache + /// Modifies the cached response before storing it in the cache. + case modify((URLSessionDataTask, CachedURLResponse) -> CachedURLResponse?) + } + + /// Returns a `ResponseCacher` with a follow `Behavior`. + public static let cache = ResponseCacher(behavior: .cache) + /// Returns a `ResponseCacher` with a do not follow `Behavior`. + public static let doNotCache = ResponseCacher(behavior: .doNotCache) + + /// The `Behavior` of the `ResponseCacher`. + public let behavior: Behavior + + /// Creates a `ResponseCacher` instance from the `Behavior`. + /// + /// - Parameter behavior: The `Behavior`. + public init(behavior: Behavior) { + self.behavior = behavior + } +} + +extension ResponseCacher: CachedResponseHandler { + public func dataTask(_ task: URLSessionDataTask, + willCacheResponse response: CachedURLResponse, + completion: @escaping (CachedURLResponse?) -> Void) { + switch behavior { + case .cache: + completion(response) + case .doNotCache: + completion(nil) + case let .modify(closure): + let response = closure(task, response) + completion(response) + } + } +} diff --git a/Pods/Alamofire/Source/DispatchQueue+Alamofire.swift b/Pods/Alamofire/Source/DispatchQueue+Alamofire.swift new file mode 100644 index 0000000..10cd273 --- /dev/null +++ b/Pods/Alamofire/Source/DispatchQueue+Alamofire.swift @@ -0,0 +1,37 @@ +// +// DispatchQueue+Alamofire.swift +// +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.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 +// 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. +// + +import Dispatch +import Foundation + +extension DispatchQueue { + /// Execute the provided closure after a `TimeInterval`. + /// + /// - Parameters: + /// - delay: `TimeInterval` to delay execution. + /// - closure: Closure to execute. + func after(_ delay: TimeInterval, execute closure: @escaping () -> Void) { + asyncAfter(deadline: .now() + delay, execute: closure) + } +} diff --git a/Pods/Alamofire/Source/EventMonitor.swift b/Pods/Alamofire/Source/EventMonitor.swift new file mode 100644 index 0000000..4363828 --- /dev/null +++ b/Pods/Alamofire/Source/EventMonitor.swift @@ -0,0 +1,844 @@ +// +// EventMonitor.swift +// +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.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 +// 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. +// + +import Foundation + +/// Protocol outlining the lifetime events inside Alamofire. It includes both events received from the various +/// `URLSession` delegate protocols as well as various events from the lifetime of `Request` and its subclasses. +public protocol EventMonitor { + /// The `DispatchQueue` onto which Alamofire's root `CompositeEventMonitor` will dispatch events. `.main` by default. + var queue: DispatchQueue { get } + + // MARK: - URLSession Events + + // MARK: URLSessionDelegate Events + + /// Event called during `URLSessionDelegate`'s `urlSession(_:didBecomeInvalidWithError:)` method. + func urlSession(_ session: URLSession, didBecomeInvalidWithError error: Error?) + + // MARK: URLSessionTaskDelegate Events + + /// Event called during `URLSessionTaskDelegate`'s `urlSession(_:task:didReceive:completionHandler:)` method. + func urlSession(_ session: URLSession, task: URLSessionTask, didReceive challenge: URLAuthenticationChallenge) + + /// Event called during `URLSessionTaskDelegate`'s `urlSession(_:task:didSendBodyData:totalBytesSent:totalBytesExpectedToSend:)` method. + func urlSession(_ session: URLSession, + task: URLSessionTask, + didSendBodyData bytesSent: Int64, + totalBytesSent: Int64, + totalBytesExpectedToSend: Int64) + + /// Event called during `URLSessionTaskDelegate`'s `urlSession(_:task:needNewBodyStream:)` method. + func urlSession(_ session: URLSession, taskNeedsNewBodyStream task: URLSessionTask) + + /// Event called during `URLSessionTaskDelegate`'s `urlSession(_:task:willPerformHTTPRedirection:newRequest:completionHandler:)` method. + func urlSession(_ session: URLSession, + task: URLSessionTask, + willPerformHTTPRedirection response: HTTPURLResponse, + newRequest request: URLRequest) + + /// Event called during `URLSessionTaskDelegate`'s `urlSession(_:task:didFinishCollecting:)` method. + func urlSession(_ session: URLSession, task: URLSessionTask, didFinishCollecting metrics: URLSessionTaskMetrics) + + /// Event called during `URLSessionTaskDelegate`'s `urlSession(_:task:didCompleteWithError:)` method. + func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) + + /// Event called during `URLSessionTaskDelegate`'s `urlSession(_:taskIsWaitingForConnectivity:)` method. + @available(macOS 10.13, iOS 11.0, tvOS 11.0, watchOS 4.0, *) + func urlSession(_ session: URLSession, taskIsWaitingForConnectivity task: URLSessionTask) + + // MARK: URLSessionDataDelegate Events + + /// Event called during `URLSessionDataDelegate`'s `urlSession(_:dataTask:didReceive:)` method. + func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data) + + /// Event called during `URLSessionDataDelegate`'s `urlSession(_:dataTask:willCacheResponse:completionHandler:)` method. + func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, willCacheResponse proposedResponse: CachedURLResponse) + + // MARK: URLSessionDownloadDelegate Events + + /// Event called during `URLSessionDownloadDelegate`'s `urlSession(_:downloadTask:didResumeAtOffset:expectedTotalBytes:)` method. + func urlSession(_ session: URLSession, + downloadTask: URLSessionDownloadTask, + didResumeAtOffset fileOffset: Int64, + expectedTotalBytes: Int64) + + /// Event called during `URLSessionDownloadDelegate`'s `urlSession(_:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite:)` method. + func urlSession(_ session: URLSession, + downloadTask: URLSessionDownloadTask, + didWriteData bytesWritten: Int64, + totalBytesWritten: Int64, + totalBytesExpectedToWrite: Int64) + + /// Event called during `URLSessionDownloadDelegate`'s `urlSession(_:downloadTask:didFinishDownloadingTo:)` method. + func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL) + + // MARK: - Request Events + + /// Event called when a `URLRequest` is first created for a `Request`. If a `RequestAdapter` is active, the + /// `URLRequest` will be adapted before being issued. + func request(_ request: Request, didCreateInitialURLRequest urlRequest: URLRequest) + + /// Event called when the attempt to create a `URLRequest` from a `Request`'s original `URLRequestConvertible` value fails. + func request(_ request: Request, didFailToCreateURLRequestWithError error: AFError) + + /// Event called when a `RequestAdapter` adapts the `Request`'s initial `URLRequest`. + func request(_ request: Request, didAdaptInitialRequest initialRequest: URLRequest, to adaptedRequest: URLRequest) + + /// Event called when a `RequestAdapter` fails to adapt the `Request`'s initial `URLRequest`. + func request(_ request: Request, didFailToAdaptURLRequest initialRequest: URLRequest, withError error: AFError) + + /// Event called when a final `URLRequest` is created for a `Request`. + func request(_ request: Request, didCreateURLRequest urlRequest: URLRequest) + + /// Event called when a `URLSessionTask` subclass instance is created for a `Request`. + func request(_ request: Request, didCreateTask task: URLSessionTask) + + /// Event called when a `Request` receives a `URLSessionTaskMetrics` value. + func request(_ request: Request, didGatherMetrics metrics: URLSessionTaskMetrics) + + /// Event called when a `Request` fails due to an error created by Alamofire. e.g. When certificate pinning fails. + func request(_ request: Request, didFailTask task: URLSessionTask, earlyWithError error: AFError) + + /// Event called when a `Request`'s task completes, possibly with an error. A `Request` may receive this event + /// multiple times if it is retried. + func request(_ request: Request, didCompleteTask task: URLSessionTask, with error: AFError?) + + /// Event called when a `Request` is about to be retried. + func requestIsRetrying(_ request: Request) + + /// Event called when a `Request` finishes and response serializers are being called. + func requestDidFinish(_ request: Request) + + /// Event called when a `Request` receives a `resume` call. + func requestDidResume(_ request: Request) + + /// Event called when a `Request`'s associated `URLSessionTask` is resumed. + func request(_ request: Request, didResumeTask task: URLSessionTask) + + /// Event called when a `Request` receives a `suspend` call. + func requestDidSuspend(_ request: Request) + + /// Event called when a `Request`'s associated `URLSessionTask` is suspended. + func request(_ request: Request, didSuspendTask task: URLSessionTask) + + /// Event called when a `Request` receives a `cancel` call. + func requestDidCancel(_ request: Request) + + /// Event called when a `Request`'s associated `URLSessionTask` is cancelled. + func request(_ request: Request, didCancelTask task: URLSessionTask) + + // MARK: DataRequest Events + + /// Event called when a `DataRequest` calls a `Validation`. + func request(_ request: DataRequest, + didValidateRequest urlRequest: URLRequest?, + response: HTTPURLResponse, + data: Data?, + withResult result: Request.ValidationResult) + + /// Event called when a `DataRequest` creates a `DataResponse` value without calling a `ResponseSerializer`. + func request(_ request: DataRequest, didParseResponse response: DataResponse) + + /// Event called when a `DataRequest` calls a `ResponseSerializer` and creates a generic `DataResponse`. + func request(_ request: DataRequest, didParseResponse response: DataResponse) + + // MARK: UploadRequest Events + + /// Event called when an `UploadRequest` creates its `Uploadable` value, indicating the type of upload it represents. + func request(_ request: UploadRequest, didCreateUploadable uploadable: UploadRequest.Uploadable) + + /// Event called when an `UploadRequest` failed to create its `Uploadable` value due to an error. + func request(_ request: UploadRequest, didFailToCreateUploadableWithError error: AFError) + + /// Event called when an `UploadRequest` provides the `InputStream` from its `Uploadable` value. This only occurs if + /// the `InputStream` does not wrap a `Data` value or file `URL`. + func request(_ request: UploadRequest, didProvideInputStream stream: InputStream) + + // MARK: DownloadRequest Events + + /// Event called when a `DownloadRequest`'s `URLSessionDownloadTask` finishes and the temporary file has been moved. + func request(_ request: DownloadRequest, didFinishDownloadingUsing task: URLSessionTask, with result: Result) + + /// Event called when a `DownloadRequest`'s `Destination` closure is called and creates the destination URL the + /// downloaded file will be moved to. + func request(_ request: DownloadRequest, didCreateDestinationURL url: URL) + + /// Event called when a `DownloadRequest` calls a `Validation`. + func request(_ request: DownloadRequest, + didValidateRequest urlRequest: URLRequest?, + response: HTTPURLResponse, + fileURL: URL?, + withResult result: Request.ValidationResult) + + /// Event called when a `DownloadRequest` creates a `DownloadResponse` without calling a `ResponseSerializer`. + func request(_ request: DownloadRequest, didParseResponse response: DownloadResponse) + + /// Event called when a `DownloadRequest` calls a `DownloadResponseSerializer` and creates a generic `DownloadResponse` + func request(_ request: DownloadRequest, didParseResponse response: DownloadResponse) +} + +extension EventMonitor { + /// The default queue on which `CompositeEventMonitor`s will call the `EventMonitor` methods. `.main` by default. + public var queue: DispatchQueue { return .main } + + // MARK: Default Implementations + + public func urlSession(_ session: URLSession, didBecomeInvalidWithError error: Error?) {} + public func urlSession(_ session: URLSession, + task: URLSessionTask, + didReceive challenge: URLAuthenticationChallenge) {} + public func urlSession(_ session: URLSession, + task: URLSessionTask, + didSendBodyData bytesSent: Int64, + totalBytesSent: Int64, + totalBytesExpectedToSend: Int64) {} + public func urlSession(_ session: URLSession, taskNeedsNewBodyStream task: URLSessionTask) {} + public func urlSession(_ session: URLSession, + task: URLSessionTask, + willPerformHTTPRedirection response: HTTPURLResponse, + newRequest request: URLRequest) {} + public func urlSession(_ session: URLSession, + task: URLSessionTask, + didFinishCollecting metrics: URLSessionTaskMetrics) {} + public func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) {} + public func urlSession(_ session: URLSession, taskIsWaitingForConnectivity task: URLSessionTask) {} + public func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data) {} + public func urlSession(_ session: URLSession, + dataTask: URLSessionDataTask, + willCacheResponse proposedResponse: CachedURLResponse) {} + public func urlSession(_ session: URLSession, + downloadTask: URLSessionDownloadTask, + didResumeAtOffset fileOffset: Int64, + expectedTotalBytes: Int64) {} + public func urlSession(_ session: URLSession, + downloadTask: URLSessionDownloadTask, + didWriteData bytesWritten: Int64, + totalBytesWritten: Int64, + totalBytesExpectedToWrite: Int64) {} + public func urlSession(_ session: URLSession, + downloadTask: URLSessionDownloadTask, + didFinishDownloadingTo location: URL) {} + public func request(_ request: Request, didCreateInitialURLRequest urlRequest: URLRequest) {} + public func request(_ request: Request, didFailToCreateURLRequestWithError error: AFError) {} + public func request(_ request: Request, + didAdaptInitialRequest initialRequest: URLRequest, + to adaptedRequest: URLRequest) {} + public func request(_ request: Request, + didFailToAdaptURLRequest initialRequest: URLRequest, + withError error: AFError) {} + public func request(_ request: Request, didCreateURLRequest urlRequest: URLRequest) {} + public func request(_ request: Request, didCreateTask task: URLSessionTask) {} + public func request(_ request: Request, didGatherMetrics metrics: URLSessionTaskMetrics) {} + public func request(_ request: Request, didFailTask task: URLSessionTask, earlyWithError error: AFError) {} + public func request(_ request: Request, didCompleteTask task: URLSessionTask, with error: AFError?) {} + public func requestIsRetrying(_ request: Request) {} + public func requestDidFinish(_ request: Request) {} + public func requestDidResume(_ request: Request) {} + public func request(_ request: Request, didResumeTask task: URLSessionTask) {} + public func requestDidSuspend(_ request: Request) {} + public func request(_ request: Request, didSuspendTask task: URLSessionTask) {} + public func requestDidCancel(_ request: Request) {} + public func request(_ request: Request, didCancelTask task: URLSessionTask) {} + public func request(_ request: DataRequest, + didValidateRequest urlRequest: URLRequest?, + response: HTTPURLResponse, + data: Data?, + withResult result: Request.ValidationResult) {} + public func request(_ request: DataRequest, didParseResponse response: DataResponse) {} + public func request(_ request: DataRequest, didParseResponse response: DataResponse) {} + public func request(_ request: UploadRequest, didCreateUploadable uploadable: UploadRequest.Uploadable) {} + public func request(_ request: UploadRequest, didFailToCreateUploadableWithError error: AFError) {} + public func request(_ request: UploadRequest, didProvideInputStream stream: InputStream) {} + public func request(_ request: DownloadRequest, didFinishDownloadingUsing task: URLSessionTask, with result: Result) {} + public func request(_ request: DownloadRequest, didCreateDestinationURL url: URL) {} + public func request(_ request: DownloadRequest, + didValidateRequest urlRequest: URLRequest?, + response: HTTPURLResponse, + fileURL: URL?, + withResult result: Request.ValidationResult) {} + public func request(_ request: DownloadRequest, didParseResponse response: DownloadResponse) {} + public func request(_ request: DownloadRequest, didParseResponse response: DownloadResponse) {} +} + +/// An `EventMonitor` which can contain multiple `EventMonitor`s and calls their methods on their queues. +public final class CompositeEventMonitor: EventMonitor { + public let queue = DispatchQueue(label: "org.alamofire.compositeEventMonitor", qos: .background) + + let monitors: [EventMonitor] + + init(monitors: [EventMonitor]) { + self.monitors = monitors + } + + func performEvent(_ event: @escaping (EventMonitor) -> Void) { + queue.async { + for monitor in self.monitors { + monitor.queue.async { event(monitor) } + } + } + } + + public func urlSession(_ session: URLSession, didBecomeInvalidWithError error: Error?) { + performEvent { $0.urlSession(session, didBecomeInvalidWithError: error) } + } + + public func urlSession(_ session: URLSession, + task: URLSessionTask, + didReceive challenge: URLAuthenticationChallenge) { + performEvent { $0.urlSession(session, task: task, didReceive: challenge) } + } + + public func urlSession(_ session: URLSession, + task: URLSessionTask, + didSendBodyData bytesSent: Int64, + totalBytesSent: Int64, + totalBytesExpectedToSend: Int64) { + performEvent { + $0.urlSession(session, + task: task, + didSendBodyData: bytesSent, + totalBytesSent: totalBytesSent, + totalBytesExpectedToSend: totalBytesExpectedToSend) + } + } + + public func urlSession(_ session: URLSession, taskNeedsNewBodyStream task: URLSessionTask) { + performEvent { + $0.urlSession(session, taskNeedsNewBodyStream: task) + } + } + + public func urlSession(_ session: URLSession, + task: URLSessionTask, + willPerformHTTPRedirection response: HTTPURLResponse, + newRequest request: URLRequest) { + performEvent { + $0.urlSession(session, + task: task, + willPerformHTTPRedirection: response, + newRequest: request) + } + } + + public func urlSession(_ session: URLSession, task: URLSessionTask, didFinishCollecting metrics: URLSessionTaskMetrics) { + performEvent { $0.urlSession(session, task: task, didFinishCollecting: metrics) } + } + + public func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) { + performEvent { $0.urlSession(session, task: task, didCompleteWithError: error) } + } + + @available(macOS 10.13, iOS 11.0, tvOS 11.0, watchOS 4.0, *) + public func urlSession(_ session: URLSession, taskIsWaitingForConnectivity task: URLSessionTask) { + performEvent { $0.urlSession(session, taskIsWaitingForConnectivity: task) } + } + + public func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data) { + performEvent { $0.urlSession(session, dataTask: dataTask, didReceive: data) } + } + + public func urlSession(_ session: URLSession, + dataTask: URLSessionDataTask, + willCacheResponse proposedResponse: CachedURLResponse) { + performEvent { $0.urlSession(session, dataTask: dataTask, willCacheResponse: proposedResponse) } + } + + public func urlSession(_ session: URLSession, + downloadTask: URLSessionDownloadTask, + didResumeAtOffset fileOffset: Int64, + expectedTotalBytes: Int64) { + performEvent { + $0.urlSession(session, + downloadTask: downloadTask, + didResumeAtOffset: fileOffset, + expectedTotalBytes: expectedTotalBytes) + } + } + + public func urlSession(_ session: URLSession, + downloadTask: URLSessionDownloadTask, + didWriteData bytesWritten: Int64, + totalBytesWritten: Int64, + totalBytesExpectedToWrite: Int64) { + performEvent { + $0.urlSession(session, + downloadTask: downloadTask, + didWriteData: bytesWritten, + totalBytesWritten: totalBytesWritten, + totalBytesExpectedToWrite: totalBytesExpectedToWrite) + } + } + + public func urlSession(_ session: URLSession, + downloadTask: URLSessionDownloadTask, + didFinishDownloadingTo location: URL) { + performEvent { $0.urlSession(session, downloadTask: downloadTask, didFinishDownloadingTo: location) } + } + + public func request(_ request: Request, didCreateInitialURLRequest urlRequest: URLRequest) { + performEvent { $0.request(request, didCreateInitialURLRequest: urlRequest) } + } + + public func request(_ request: Request, didFailToCreateURLRequestWithError error: AFError) { + performEvent { $0.request(request, didFailToCreateURLRequestWithError: error) } + } + + public func request(_ request: Request, didAdaptInitialRequest initialRequest: URLRequest, to adaptedRequest: URLRequest) { + performEvent { $0.request(request, didAdaptInitialRequest: initialRequest, to: adaptedRequest) } + } + + public func request(_ request: Request, didFailToAdaptURLRequest initialRequest: URLRequest, withError error: AFError) { + performEvent { $0.request(request, didFailToAdaptURLRequest: initialRequest, withError: error) } + } + + public func request(_ request: Request, didCreateURLRequest urlRequest: URLRequest) { + performEvent { $0.request(request, didCreateURLRequest: urlRequest) } + } + + public func request(_ request: Request, didCreateTask task: URLSessionTask) { + performEvent { $0.request(request, didCreateTask: task) } + } + + public func request(_ request: Request, didGatherMetrics metrics: URLSessionTaskMetrics) { + performEvent { $0.request(request, didGatherMetrics: metrics) } + } + + public func request(_ request: Request, didFailTask task: URLSessionTask, earlyWithError error: AFError) { + performEvent { $0.request(request, didFailTask: task, earlyWithError: error) } + } + + public func request(_ request: Request, didCompleteTask task: URLSessionTask, with error: AFError?) { + performEvent { $0.request(request, didCompleteTask: task, with: error) } + } + + public func requestIsRetrying(_ request: Request) { + performEvent { $0.requestIsRetrying(request) } + } + + public func requestDidFinish(_ request: Request) { + performEvent { $0.requestDidFinish(request) } + } + + public func requestDidResume(_ request: Request) { + performEvent { $0.requestDidResume(request) } + } + + public func request(_ request: Request, didResumeTask task: URLSessionTask) { + performEvent { $0.request(request, didResumeTask: task) } + } + + public func requestDidSuspend(_ request: Request) { + performEvent { $0.requestDidSuspend(request) } + } + + public func request(_ request: Request, didSuspendTask task: URLSessionTask) { + performEvent { $0.request(request, didSuspendTask: task) } + } + + public func requestDidCancel(_ request: Request) { + performEvent { $0.requestDidCancel(request) } + } + + public func request(_ request: Request, didCancelTask task: URLSessionTask) { + performEvent { $0.request(request, didCancelTask: task) } + } + + public func request(_ request: DataRequest, + didValidateRequest urlRequest: URLRequest?, + response: HTTPURLResponse, + data: Data?, + withResult result: Request.ValidationResult) { + performEvent { $0.request(request, + didValidateRequest: urlRequest, + response: response, + data: data, + withResult: result) + } + } + + public func request(_ request: DataRequest, didParseResponse response: DataResponse) { + performEvent { $0.request(request, didParseResponse: response) } + } + + public func request(_ request: DataRequest, didParseResponse response: DataResponse) { + performEvent { $0.request(request, didParseResponse: response) } + } + + public func request(_ request: UploadRequest, didCreateUploadable uploadable: UploadRequest.Uploadable) { + performEvent { $0.request(request, didCreateUploadable: uploadable) } + } + + public func request(_ request: UploadRequest, didFailToCreateUploadableWithError error: AFError) { + performEvent { $0.request(request, didFailToCreateUploadableWithError: error) } + } + + public func request(_ request: UploadRequest, didProvideInputStream stream: InputStream) { + performEvent { $0.request(request, didProvideInputStream: stream) } + } + + public func request(_ request: DownloadRequest, didFinishDownloadingUsing task: URLSessionTask, with result: Result) { + performEvent { $0.request(request, didFinishDownloadingUsing: task, with: result) } + } + + public func request(_ request: DownloadRequest, didCreateDestinationURL url: URL) { + performEvent { $0.request(request, didCreateDestinationURL: url) } + } + + public func request(_ request: DownloadRequest, + didValidateRequest urlRequest: URLRequest?, + response: HTTPURLResponse, + fileURL: URL?, + withResult result: Request.ValidationResult) { + performEvent { $0.request(request, + didValidateRequest: urlRequest, + response: response, + fileURL: fileURL, + withResult: result) } + } + + public func request(_ request: DownloadRequest, didParseResponse response: DownloadResponse) { + performEvent { $0.request(request, didParseResponse: response) } + } + + public func request(_ request: DownloadRequest, didParseResponse response: DownloadResponse) { + performEvent { $0.request(request, didParseResponse: response) } + } +} + +/// `EventMonitor` that allows optional closures to be set to receive events. +open class ClosureEventMonitor: EventMonitor { + /// Closure called on the `urlSession(_:didBecomeInvalidWithError:)` event. + open var sessionDidBecomeInvalidWithError: ((URLSession, Error?) -> Void)? + + /// Closure called on the `urlSession(_:task:didReceive:completionHandler:)`. + open var taskDidReceiveChallenge: ((URLSession, URLSessionTask, URLAuthenticationChallenge) -> Void)? + + /// Closure that receives `urlSession(_:task:didSendBodyData:totalBytesSent:totalBytesExpectedToSend:)` event. + open var taskDidSendBodyData: ((URLSession, URLSessionTask, Int64, Int64, Int64) -> Void)? + + /// Closure called on the `urlSession(_:task:needNewBodyStream:)` event. + open var taskNeedNewBodyStream: ((URLSession, URLSessionTask) -> Void)? + + /// Closure called on the `urlSession(_:task:willPerformHTTPRedirection:newRequest:completionHandler:)` event. + open var taskWillPerformHTTPRedirection: ((URLSession, URLSessionTask, HTTPURLResponse, URLRequest) -> Void)? + + /// Closure called on the `urlSession(_:task:didFinishCollecting:)` event. + open var taskDidFinishCollectingMetrics: ((URLSession, URLSessionTask, URLSessionTaskMetrics) -> Void)? + + /// Closure called on the `urlSession(_:task:didCompleteWithError:)` event. + open var taskDidComplete: ((URLSession, URLSessionTask, Error?) -> Void)? + + /// Closure called on the `urlSession(_:taskIsWaitingForConnectivity:)` event. + open var taskIsWaitingForConnectivity: ((URLSession, URLSessionTask) -> Void)? + + /// Closure that receives the `urlSession(_:dataTask:didReceive:)` event. + open var dataTaskDidReceiveData: ((URLSession, URLSessionDataTask, Data) -> Void)? + + /// Closure called on the `urlSession(_:dataTask:willCacheResponse:completionHandler:)` event. + open var dataTaskWillCacheResponse: ((URLSession, URLSessionDataTask, CachedURLResponse) -> Void)? + + /// Closure called on the `urlSession(_:downloadTask:didFinishDownloadingTo:)` event. + open var downloadTaskDidFinishDownloadingToURL: ((URLSession, URLSessionDownloadTask, URL) -> Void)? + + /// Closure called on the `urlSession(_:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite:)` + /// event. + open var downloadTaskDidWriteData: ((URLSession, URLSessionDownloadTask, Int64, Int64, Int64) -> Void)? + + /// Closure called on the `urlSession(_:downloadTask:didResumeAtOffset:expectedTotalBytes:)` event. + open var downloadTaskDidResumeAtOffset: ((URLSession, URLSessionDownloadTask, Int64, Int64) -> Void)? + + // MARK: - Request Events + + /// Closure called on the `request(_:didCreateInitialURLRequest:)` event. + open var requestDidCreateInitialURLRequest: ((Request, URLRequest) -> Void)? + + /// Closure called on the `request(_:didFailToCreateURLRequestWithError:)` event. + open var requestDidFailToCreateURLRequestWithError: ((Request, AFError) -> Void)? + + /// Closure called on the `request(_:didAdaptInitialRequest:to:)` event. + open var requestDidAdaptInitialRequestToAdaptedRequest: ((Request, URLRequest, URLRequest) -> Void)? + + /// Closure called on the `request(_:didFailToAdaptURLRequest:withError:)` event. + open var requestDidFailToAdaptURLRequestWithError: ((Request, URLRequest, AFError) -> Void)? + + /// Closure called on the `request(_:didCreateURLRequest:)` event. + open var requestDidCreateURLRequest: ((Request, URLRequest) -> Void)? + + /// Closure called on the `request(_:didCreateTask:)` event. + open var requestDidCreateTask: ((Request, URLSessionTask) -> Void)? + + /// Closure called on the `request(_:didGatherMetrics:)` event. + open var requestDidGatherMetrics: ((Request, URLSessionTaskMetrics) -> Void)? + + /// Closure called on the `request(_:didFailTask:earlyWithError:)` event. + open var requestDidFailTaskEarlyWithError: ((Request, URLSessionTask, AFError) -> Void)? + + /// Closure called on the `request(_:didCompleteTask:with:)` event. + open var requestDidCompleteTaskWithError: ((Request, URLSessionTask, AFError?) -> Void)? + + /// Closure called on the `requestIsRetrying(_:)` event. + open var requestIsRetrying: ((Request) -> Void)? + + /// Closure called on the `requestDidFinish(_:)` event. + open var requestDidFinish: ((Request) -> Void)? + + /// Closure called on the `requestDidResume(_:)` event. + open var requestDidResume: ((Request) -> Void)? + + /// Closure called on the `request(_:didResumeTask:)` event. + open var requestDidResumeTask: ((Request, URLSessionTask) -> Void)? + + /// Closure called on the `requestDidSuspend(_:)` event. + open var requestDidSuspend: ((Request) -> Void)? + + /// Closure called on the `request(_:didSuspendTask:)` event. + open var requestDidSuspendTask: ((Request, URLSessionTask) -> Void)? + + /// Closure called on the `requestDidCancel(_:)` event. + open var requestDidCancel: ((Request) -> Void)? + + /// Closure called on the `request(_:didCancelTask:)` event. + open var requestDidCancelTask: ((Request, URLSessionTask) -> Void)? + + /// Closure called on the `request(_:didValidateRequest:response:data:withResult:)` event. + open var requestDidValidateRequestResponseDataWithResult: ((DataRequest, URLRequest?, HTTPURLResponse, Data?, Request.ValidationResult) -> Void)? + + /// Closure called on the `request(_:didParseResponse:)` event. + open var requestDidParseResponse: ((DataRequest, DataResponse) -> Void)? + + /// Closure called on the `request(_:didCreateUploadable:)` event. + open var requestDidCreateUploadable: ((UploadRequest, UploadRequest.Uploadable) -> Void)? + + /// Closure called on the `request(_:didFailToCreateUploadableWithError:)` event. + open var requestDidFailToCreateUploadableWithError: ((UploadRequest, AFError) -> Void)? + + /// Closure called on the `request(_:didProvideInputStream:)` event. + open var requestDidProvideInputStream: ((UploadRequest, InputStream) -> Void)? + + /// Closure called on the `request(_:didFinishDownloadingUsing:with:)` event. + open var requestDidFinishDownloadingUsingTaskWithResult: ((DownloadRequest, URLSessionTask, Result) -> Void)? + + /// Closure called on the `request(_:didCreateDestinationURL:)` event. + open var requestDidCreateDestinationURL: ((DownloadRequest, URL) -> Void)? + + /// Closure called on the `request(_:didValidateRequest:response:temporaryURL:destinationURL:withResult:)` event. + open var requestDidValidateRequestResponseFileURLWithResult: ((DownloadRequest, URLRequest?, HTTPURLResponse, URL?, Request.ValidationResult) -> Void)? + + /// Closure called on the `request(_:didParseResponse:)` event. + open var requestDidParseDownloadResponse: ((DownloadRequest, DownloadResponse) -> Void)? + + public let queue: DispatchQueue + + /// Creates an instance using the provided queue. + /// + /// - Parameter queue: `DispatchQueue` on which events will fired. `.main` by default. + public init(queue: DispatchQueue = .main) { + self.queue = queue + } + + open func urlSession(_ session: URLSession, didBecomeInvalidWithError error: Error?) { + sessionDidBecomeInvalidWithError?(session, error) + } + + open func urlSession(_ session: URLSession, task: URLSessionTask, didReceive challenge: URLAuthenticationChallenge) { + taskDidReceiveChallenge?(session, task, challenge) + } + + open func urlSession(_ session: URLSession, + task: URLSessionTask, + didSendBodyData bytesSent: Int64, + totalBytesSent: Int64, + totalBytesExpectedToSend: Int64) { + taskDidSendBodyData?(session, task, bytesSent, totalBytesSent, totalBytesExpectedToSend) + } + + open func urlSession(_ session: URLSession, taskNeedsNewBodyStream task: URLSessionTask) { + taskNeedNewBodyStream?(session, task) + } + + open func urlSession(_ session: URLSession, + task: URLSessionTask, + willPerformHTTPRedirection response: HTTPURLResponse, + newRequest request: URLRequest) { + taskWillPerformHTTPRedirection?(session, task, response, request) + } + + open func urlSession(_ session: URLSession, task: URLSessionTask, didFinishCollecting metrics: URLSessionTaskMetrics) { + taskDidFinishCollectingMetrics?(session, task, metrics) + } + + open func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) { + taskDidComplete?(session, task, error) + } + + open func urlSession(_ session: URLSession, taskIsWaitingForConnectivity task: URLSessionTask) { + taskIsWaitingForConnectivity?(session, task) + } + + open func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data) { + dataTaskDidReceiveData?(session, dataTask, data) + } + + open func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, willCacheResponse proposedResponse: CachedURLResponse) { + dataTaskWillCacheResponse?(session, dataTask, proposedResponse) + } + + open func urlSession(_ session: URLSession, + downloadTask: URLSessionDownloadTask, + didResumeAtOffset fileOffset: Int64, + expectedTotalBytes: Int64) { + downloadTaskDidResumeAtOffset?(session, downloadTask, fileOffset, expectedTotalBytes) + } + + open func urlSession(_ session: URLSession, + downloadTask: URLSessionDownloadTask, + didWriteData bytesWritten: Int64, + totalBytesWritten: Int64, + totalBytesExpectedToWrite: Int64) { + downloadTaskDidWriteData?(session, downloadTask, bytesWritten, totalBytesWritten, totalBytesExpectedToWrite) + } + + open func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL) { + downloadTaskDidFinishDownloadingToURL?(session, downloadTask, location) + } + + // MARK: Request Events + + open func request(_ request: Request, didCreateInitialURLRequest urlRequest: URLRequest) { + requestDidCreateInitialURLRequest?(request, urlRequest) + } + + open func request(_ request: Request, didFailToCreateURLRequestWithError error: AFError) { + requestDidFailToCreateURLRequestWithError?(request, error) + } + + open func request(_ request: Request, didAdaptInitialRequest initialRequest: URLRequest, to adaptedRequest: URLRequest) { + requestDidAdaptInitialRequestToAdaptedRequest?(request, initialRequest, adaptedRequest) + } + + open func request(_ request: Request, didFailToAdaptURLRequest initialRequest: URLRequest, withError error: AFError) { + requestDidFailToAdaptURLRequestWithError?(request, initialRequest, error) + } + + open func request(_ request: Request, didCreateURLRequest urlRequest: URLRequest) { + requestDidCreateURLRequest?(request, urlRequest) + } + + open func request(_ request: Request, didCreateTask task: URLSessionTask) { + requestDidCreateTask?(request, task) + } + + open func request(_ request: Request, didGatherMetrics metrics: URLSessionTaskMetrics) { + requestDidGatherMetrics?(request, metrics) + } + + open func request(_ request: Request, didFailTask task: URLSessionTask, earlyWithError error: AFError) { + requestDidFailTaskEarlyWithError?(request, task, error) + } + + open func request(_ request: Request, didCompleteTask task: URLSessionTask, with error: AFError?) { + requestDidCompleteTaskWithError?(request, task, error) + } + + open func requestIsRetrying(_ request: Request) { + requestIsRetrying?(request) + } + + open func requestDidFinish(_ request: Request) { + requestDidFinish?(request) + } + + open func requestDidResume(_ request: Request) { + requestDidResume?(request) + } + + public func request(_ request: Request, didResumeTask task: URLSessionTask) { + requestDidResumeTask?(request, task) + } + + open func requestDidSuspend(_ request: Request) { + requestDidSuspend?(request) + } + + public func request(_ request: Request, didSuspendTask task: URLSessionTask) { + requestDidSuspendTask?(request, task) + } + + open func requestDidCancel(_ request: Request) { + requestDidCancel?(request) + } + + public func request(_ request: Request, didCancelTask task: URLSessionTask) { + requestDidCancelTask?(request, task) + } + + open func request(_ request: DataRequest, + didValidateRequest urlRequest: URLRequest?, + response: HTTPURLResponse, + data: Data?, + withResult result: Request.ValidationResult) { + requestDidValidateRequestResponseDataWithResult?(request, urlRequest, response, data, result) + } + + open func request(_ request: DataRequest, didParseResponse response: DataResponse) { + requestDidParseResponse?(request, response) + } + + open func request(_ request: UploadRequest, didCreateUploadable uploadable: UploadRequest.Uploadable) { + requestDidCreateUploadable?(request, uploadable) + } + + open func request(_ request: UploadRequest, didFailToCreateUploadableWithError error: AFError) { + requestDidFailToCreateUploadableWithError?(request, error) + } + + open func request(_ request: UploadRequest, didProvideInputStream stream: InputStream) { + requestDidProvideInputStream?(request, stream) + } + + open func request(_ request: DownloadRequest, didFinishDownloadingUsing task: URLSessionTask, with result: Result) { + requestDidFinishDownloadingUsingTaskWithResult?(request, task, result) + } + + open func request(_ request: DownloadRequest, didCreateDestinationURL url: URL) { + requestDidCreateDestinationURL?(request, url) + } + + open func request(_ request: DownloadRequest, + didValidateRequest urlRequest: URLRequest?, + response: HTTPURLResponse, + fileURL: URL?, + withResult result: Request.ValidationResult) { + requestDidValidateRequestResponseFileURLWithResult?(request, + urlRequest, + response, + fileURL, + result) + } + + open func request(_ request: DownloadRequest, didParseResponse response: DownloadResponse) { + requestDidParseDownloadResponse?(request, response) + } +} diff --git a/Pods/Alamofire/Source/HTTPHeaders.swift b/Pods/Alamofire/Source/HTTPHeaders.swift new file mode 100644 index 0000000..641087c --- /dev/null +++ b/Pods/Alamofire/Source/HTTPHeaders.swift @@ -0,0 +1,445 @@ +// +// HTTPHeaders.swift +// +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.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 +// 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. +// + +import Foundation + +/// An order-preserving and case-insensitive representation of HTTP headers. +public struct HTTPHeaders { + private var headers: [HTTPHeader] = [] + + /// Creates an empty instance. + public init() {} + + /// Creates an instance from an array of `HTTPHeader`s. Duplicate case-insensitive names are collapsed into the last + /// name and value encountered. + public init(_ headers: [HTTPHeader]) { + self.init() + + headers.forEach { update($0) } + } + + /// Creates an instance from a `[String: String]`. Duplicate case-insensitive names are collapsed into the last name + /// and value encountered. + public init(_ dictionary: [String: String]) { + self.init() + + dictionary.forEach { update(HTTPHeader(name: $0.key, value: $0.value)) } + } + + /// Case-insensitively updates or appends an `HTTPHeader` into the instance using the provided `name` and `value`. + /// + /// - Parameters: + /// - name: The `HTTPHeader` name. + /// - value: The `HTTPHeader value. + public mutating func add(name: String, value: String) { + update(HTTPHeader(name: name, value: value)) + } + + /// Case-insensitively updates or appends the provided `HTTPHeader` into the instance. + /// + /// - Parameter header: The `HTTPHeader` to update or append. + public mutating func add(_ header: HTTPHeader) { + update(header) + } + + /// Case-insensitively updates or appends an `HTTPHeader` into the instance using the provided `name` and `value`. + /// + /// - Parameters: + /// - name: The `HTTPHeader` name. + /// - value: The `HTTPHeader value. + public mutating func update(name: String, value: String) { + update(HTTPHeader(name: name, value: value)) + } + + /// Case-insensitively updates or appends the provided `HTTPHeader` into the instance. + /// + /// - Parameter header: The `HTTPHeader` to update or append. + public mutating func update(_ header: HTTPHeader) { + guard let index = headers.index(of: header.name) else { + headers.append(header) + return + } + + headers.replaceSubrange(index...index, with: [header]) + } + + /// Case-insensitively removes an `HTTPHeader`, if it exists, from the instance. + /// + /// - Parameter name: The name of the `HTTPHeader` to remove. + public mutating func remove(name: String) { + guard let index = headers.index(of: name) else { return } + + headers.remove(at: index) + } + + /// Sort the current instance by header name. + public mutating func sort() { + headers.sort { $0.name < $1.name } + } + + /// Returns an instance sorted by header name. + /// + /// - Returns: A copy of the current instance sorted by name. + public func sorted() -> HTTPHeaders { + return HTTPHeaders(headers.sorted { $0.name < $1.name }) + } + + /// Case-insensitively find a header's value by name. + /// + /// - Parameter name: The name of the header to search for, case-insensitively. + /// + /// - Returns: The value of header, if it exists. + public func value(for name: String) -> String? { + guard let index = headers.index(of: name) else { return nil } + + return headers[index].value + } + + /// Case-insensitively access the header with the given name. + /// + /// - Parameter name: The name of the header. + public subscript(_ name: String) -> String? { + get { return value(for: name) } + set { + if let value = newValue { + update(name: name, value: value) + } else { + remove(name: name) + } + } + } + + /// The dictionary representation of all headers. + /// + /// This representation does not preserve the current order of the instance. + public var dictionary: [String: String] { + let namesAndValues = headers.map { ($0.name, $0.value) } + + return Dictionary(namesAndValues, uniquingKeysWith: { _, last in last }) + } +} + +extension HTTPHeaders: ExpressibleByDictionaryLiteral { + public init(dictionaryLiteral elements: (String, String)...) { + self.init() + + elements.forEach { update(name: $0.0, value: $0.1) } + } +} + +extension HTTPHeaders: ExpressibleByArrayLiteral { + public init(arrayLiteral elements: HTTPHeader...) { + self.init(elements) + } +} + +extension HTTPHeaders: Sequence { + public func makeIterator() -> IndexingIterator<[HTTPHeader]> { + return headers.makeIterator() + } +} + +extension HTTPHeaders: Collection { + public var startIndex: Int { + return headers.startIndex + } + + public var endIndex: Int { + return headers.endIndex + } + + public subscript(position: Int) -> HTTPHeader { + return headers[position] + } + + public func index(after i: Int) -> Int { + return headers.index(after: i) + } +} + +extension HTTPHeaders: CustomStringConvertible { + public var description: String { + return headers.map { $0.description } + .joined(separator: "\n") + } +} + +// MARK: - HTTPHeader + +/// A representation of a single HTTP header's name / value pair. +public struct HTTPHeader: Hashable { + /// Name of the header. + public let name: String + + /// Value of the header. + public let value: String + + /// Creates an instance from the given `name` and `value`. + /// + /// - Parameters: + /// - name: The name of the header. + /// - value: The value of the header. + public init(name: String, value: String) { + self.name = name + self.value = value + } +} + +extension HTTPHeader: CustomStringConvertible { + public var description: String { + return "\(name): \(value)" + } +} + +extension HTTPHeader { + /// Returns an `Accept` header. + /// + /// - Parameter value: The `Accept` value. + /// - Returns: The header. + public static func accept(_ value: String) -> HTTPHeader { + return HTTPHeader(name: "Accept", value: value) + } + + /// Returns an `Accept-Charset` header. + /// + /// - Parameter value: The `Accept-Charset` value. + /// - Returns: The header. + public static func acceptCharset(_ value: String) -> HTTPHeader { + return HTTPHeader(name: "Accept-Charset", value: value) + } + + /// Returns an `Accept-Language` header. + /// + /// Alamofire offers a default Accept-Language header that accumulates and encodes the system's preferred languages. + /// Use `HTTPHeader.defaultAcceptLanguage`. + /// + /// - Parameter value: The `Accept-Language` value. + /// + /// - Returns: The header. + public static func acceptLanguage(_ value: String) -> HTTPHeader { + return HTTPHeader(name: "Accept-Language", value: value) + } + + /// Returns an `Accept-Encoding` header. + /// + /// Alamofire offers a default accept encoding value that provides the most common values. Use + /// `HTTPHeader.defaultAcceptEncoding`. + /// + /// - Parameter value: The `Accept-Encoding` value. + /// + /// - Returns: The header + public static func acceptEncoding(_ value: String) -> HTTPHeader { + return HTTPHeader(name: "Accept-Encoding", value: value) + } + + /// Returns a `Basic` `Authorization` header using the `username` and `password` provided. + /// + /// - Parameters: + /// - username: The username of the header. + /// - password: The password of the header. + /// + /// - Returns: The header. + public static func authorization(username: String, password: String) -> HTTPHeader { + let credential = Data("\(username):\(password)".utf8).base64EncodedString() + + return authorization("Basic \(credential)") + } + + /// Returns a `Bearer` `Authorization` header using the `bearerToken` provided + /// + /// - Parameter bearerToken: The bearer token. + /// + /// - Returns: The header. + public static func authorization(bearerToken: String) -> HTTPHeader { + return authorization("Bearer \(bearerToken)") + } + + /// Returns an `Authorization` header. + /// + /// Alamofire provides built-in methods to produce `Authorization` headers. For a Basic `Authorization` header use + /// `HTTPHeader.authorization(username:password:)`. For a Bearer `Authorization` header, use + /// `HTTPHeader.authorization(bearerToken:)`. + /// + /// - Parameter value: The `Authorization` value. + /// + /// - Returns: The header. + public static func authorization(_ value: String) -> HTTPHeader { + return HTTPHeader(name: "Authorization", value: value) + } + + /// Returns a `Content-Disposition` header. + /// + /// - Parameter value: The `Content-Disposition` value. + /// + /// - Returns: The header. + public static func contentDisposition(_ value: String) -> HTTPHeader { + return HTTPHeader(name: "Content-Disposition", value: value) + } + + /// Returns a `Content-Type` header. + /// + /// All Alamofire `ParameterEncoding`s and `ParameterEncoder`s set the `Content-Type` of the request, so it may not be necessary to manually + /// set this value. + /// + /// - Parameter value: The `Content-Type` value. + /// + /// - Returns: The header. + public static func contentType(_ value: String) -> HTTPHeader { + return HTTPHeader(name: "Content-Type", value: value) + } + + /// Returns a `User-Agent` header. + /// + /// - Parameter value: The `User-Agent` value. + /// + /// - Returns: The header. + public static func userAgent(_ value: String) -> HTTPHeader { + return HTTPHeader(name: "User-Agent", value: value) + } +} + +extension Array where Element == HTTPHeader { + /// Case-insensitively finds the index of an `HTTPHeader` with the provided name, if it exists. + func index(of name: String) -> Int? { + let lowercasedName = name.lowercased() + return firstIndex { $0.name.lowercased() == lowercasedName } + } +} + +// MARK: - Defaults + +public extension HTTPHeaders { + /// The default set of `HTTPHeaders` used by Alamofire. Includes `Accept-Encoding`, `Accept-Language`, and + /// `User-Agent`. + static let `default`: HTTPHeaders = [.defaultAcceptEncoding, + .defaultAcceptLanguage, + .defaultUserAgent] +} + +extension HTTPHeader { + /// Returns Alamofire's default `Accept-Encoding` header, appropriate for the encodings supported by particular OS + /// versions. + /// + /// See the [Accept-Encoding HTTP header documentation](https://tools.ietf.org/html/rfc7230#section-4.2.3) . + public static let defaultAcceptEncoding: HTTPHeader = { + let encodings: [String] + if #available(iOS 11.0, macOS 10.13, tvOS 11.0, watchOS 4.0, *) { + encodings = ["br", "gzip", "deflate"] + } else { + encodings = ["gzip", "deflate"] + } + + return .acceptEncoding(encodings.qualityEncoded()) + }() + + /// Returns Alamofire's default `Accept-Language` header, generated by querying `Locale` for the user's + /// `preferredLanguages`. + /// + /// See the [Accept-Language HTTP header documentation](https://tools.ietf.org/html/rfc7231#section-5.3.5). + public static let defaultAcceptLanguage: HTTPHeader = { + .acceptLanguage(Locale.preferredLanguages.prefix(6).qualityEncoded()) + }() + + /// Returns Alamofire's default `User-Agent` header. + /// + /// See the [User-Agent header documentation](https://tools.ietf.org/html/rfc7231#section-5.5.3). + /// + /// Example: `iOS Example/1.0 (org.alamofire.iOS-Example; build:1; iOS 13.0.0) Alamofire/5.0.0` + public static let defaultUserAgent: HTTPHeader = { + let userAgent: String = { + if let info = Bundle.main.infoDictionary { + let executable = info[kCFBundleExecutableKey as String] as? String ?? "Unknown" + let bundle = info[kCFBundleIdentifierKey as String] as? String ?? "Unknown" + let appVersion = info["CFBundleShortVersionString"] as? String ?? "Unknown" + let appBuild = info[kCFBundleVersionKey as String] as? String ?? "Unknown" + + let osNameVersion: String = { + let version = ProcessInfo.processInfo.operatingSystemVersion + let versionString = "\(version.majorVersion).\(version.minorVersion).\(version.patchVersion)" + // swiftformat:disable indent + let osName: String = { + #if os(iOS) + return "iOS" + #elseif os(watchOS) + return "watchOS" + #elseif os(tvOS) + return "tvOS" + #elseif os(macOS) + return "macOS" + #elseif os(Linux) + return "Linux" + #else + return "Unknown" + #endif + }() + // swiftformat:enable indent + + return "\(osName) \(versionString)" + }() + + let alamofireVersion = "Alamofire/\(version)" + + return "\(executable)/\(appVersion) (\(bundle); build:\(appBuild); \(osNameVersion)) \(alamofireVersion)" + } + + return "Alamofire" + }() + + return .userAgent(userAgent) + }() +} + +extension Collection where Element == String { + func qualityEncoded() -> String { + return enumerated().map { index, encoding in + let quality = 1.0 - (Double(index) * 0.1) + return "\(encoding);q=\(quality)" + }.joined(separator: ", ") + } +} + +// MARK: - System Type Extensions + +extension URLRequest { + /// Returns `allHTTPHeaderFields` as `HTTPHeaders`. + public var headers: HTTPHeaders { + get { return allHTTPHeaderFields.map(HTTPHeaders.init) ?? HTTPHeaders() } + set { allHTTPHeaderFields = newValue.dictionary } + } +} + +extension HTTPURLResponse { + /// Returns `allHeaderFields` as `HTTPHeaders`. + public var headers: HTTPHeaders { + return (allHeaderFields as? [String: String]).map(HTTPHeaders.init) ?? HTTPHeaders() + } +} + +public extension URLSessionConfiguration { + /// Returns `httpAdditionalHeaders` as `HTTPHeaders`. + var headers: HTTPHeaders { + get { return (httpAdditionalHeaders as? [String: String]).map(HTTPHeaders.init) ?? HTTPHeaders() } + set { httpAdditionalHeaders = newValue.dictionary } + } +} diff --git a/Pods/Alamofire/Source/HTTPMethod.swift b/Pods/Alamofire/Source/HTTPMethod.swift new file mode 100644 index 0000000..4867c1e --- /dev/null +++ b/Pods/Alamofire/Source/HTTPMethod.swift @@ -0,0 +1,54 @@ +// +// HTTPMethod.swift +// +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.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 +// 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. +// + +/// Type representing HTTP methods. Raw `String` value is stored and compared case-sensitively, so +/// `HTTPMethod.get != HTTPMethod(rawValue: "get")`. +/// +/// See https://tools.ietf.org/html/rfc7231#section-4.3 +public struct HTTPMethod: RawRepresentable, Equatable, Hashable { + /// `CONNECT` method. + public static let connect = HTTPMethod(rawValue: "CONNECT") + /// `DELETE` method. + public static let delete = HTTPMethod(rawValue: "DELETE") + /// `GET` method. + public static let get = HTTPMethod(rawValue: "GET") + /// `HEAD` method. + public static let head = HTTPMethod(rawValue: "HEAD") + /// `OPTIONS` method. + public static let options = HTTPMethod(rawValue: "OPTIONS") + /// `PATCH` method. + public static let patch = HTTPMethod(rawValue: "PATCH") + /// `POST` method. + public static let post = HTTPMethod(rawValue: "POST") + /// `PUT` method. + public static let put = HTTPMethod(rawValue: "PUT") + /// `TRACE` method. + public static let trace = HTTPMethod(rawValue: "TRACE") + + public let rawValue: String + + public init(rawValue: String) { + self.rawValue = rawValue + } +} diff --git a/Pods/Alamofire/Source/MultipartFormData.swift b/Pods/Alamofire/Source/MultipartFormData.swift new file mode 100644 index 0000000..4ef54aa --- /dev/null +++ b/Pods/Alamofire/Source/MultipartFormData.swift @@ -0,0 +1,544 @@ +// +// MultipartFormData.swift +// +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.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 +// 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. +// + +import Foundation + +#if os(iOS) || os(watchOS) || os(tvOS) +import MobileCoreServices +#elseif os(macOS) +import CoreServices +#endif + +/// Constructs `multipart/form-data` for uploads within an HTTP or HTTPS body. There are currently two ways to encode +/// multipart form data. The first way is to encode the data directly in memory. This is very efficient, but can lead +/// to memory issues if the dataset is too large. The second way is designed for larger datasets and will write all the +/// data to a single file on disk with all the proper boundary segmentation. The second approach MUST be used for +/// larger datasets such as video content, otherwise your app may run out of memory when trying to encode the dataset. +/// +/// For more information on `multipart/form-data` in general, please refer to the RFC-2388 and RFC-2045 specs as well +/// and the w3 form documentation. +/// +/// - https://www.ietf.org/rfc/rfc2388.txt +/// - https://www.ietf.org/rfc/rfc2045.txt +/// - https://www.w3.org/TR/html401/interact/forms.html#h-17.13 +open class MultipartFormData { + // MARK: - Helper Types + + struct EncodingCharacters { + static let crlf = "\r\n" + } + + struct BoundaryGenerator { + enum BoundaryType { + case initial, encapsulated, final + } + + static func randomBoundary() -> String { + return String(format: "alamofire.boundary.%08x%08x", arc4random(), arc4random()) + } + + static func boundaryData(forBoundaryType boundaryType: BoundaryType, boundary: String) -> Data { + let boundaryText: String + + switch boundaryType { + case .initial: + boundaryText = "--\(boundary)\(EncodingCharacters.crlf)" + case .encapsulated: + boundaryText = "\(EncodingCharacters.crlf)--\(boundary)\(EncodingCharacters.crlf)" + case .final: + boundaryText = "\(EncodingCharacters.crlf)--\(boundary)--\(EncodingCharacters.crlf)" + } + + return Data(boundaryText.utf8) + } + } + + class BodyPart { + let headers: HTTPHeaders + let bodyStream: InputStream + let bodyContentLength: UInt64 + var hasInitialBoundary = false + var hasFinalBoundary = false + + init(headers: HTTPHeaders, bodyStream: InputStream, bodyContentLength: UInt64) { + self.headers = headers + self.bodyStream = bodyStream + self.bodyContentLength = bodyContentLength + } + } + + // MARK: - Properties + + /// Default memory threshold used when encoding `MultipartFormData`, in bytes. + public static let encodingMemoryThreshold: UInt64 = 10_000_000 + + /// The `Content-Type` header value containing the boundary used to generate the `multipart/form-data`. + open lazy var contentType: String = "multipart/form-data; boundary=\(self.boundary)" + + /// The content length of all body parts used to generate the `multipart/form-data` not including the boundaries. + public var contentLength: UInt64 { return bodyParts.reduce(0) { $0 + $1.bodyContentLength } } + + /// The boundary used to separate the body parts in the encoded form data. + public let boundary: String + + let fileManager: FileManager + + private var bodyParts: [BodyPart] + private var bodyPartError: AFError? + private let streamBufferSize: Int + + // MARK: - Lifecycle + + /// Creates an instance. + /// + /// - Parameters: + /// - fileManager: `FileManager` to use for file operations, if needed. + /// - boundary: Boundary `String` used to separate body parts. + public init(fileManager: FileManager = .default, boundary: String? = nil) { + self.fileManager = fileManager + self.boundary = boundary ?? BoundaryGenerator.randomBoundary() + bodyParts = [] + + // + // The optimal read/write buffer size in bytes for input and output streams is 1024 (1KB). For more + // information, please refer to the following article: + // - https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Streams/Articles/ReadingInputStreams.html + // + streamBufferSize = 1024 + } + + // MARK: - Body Parts + + /// Creates a body part from the data and appends it to the instance. + /// + /// The body part data will be encoded using the following format: + /// + /// - `Content-Disposition: form-data; name=#{name}; filename=#{filename}` (HTTP Header) + /// - `Content-Type: #{mimeType}` (HTTP Header) + /// - Encoded file data + /// - Multipart form boundary + /// + /// - Parameters: + /// - data: `Data` to encoding into the instance. + /// - name: Name to associate with the `Data` in the `Content-Disposition` HTTP header. + /// - fileName: Filename to associate with the `Data` in the `Content-Disposition` HTTP header. + /// - mimeType: MIME type to associate with the data in the `Content-Type` HTTP header. + public func append(_ data: Data, withName name: String, fileName: String? = nil, mimeType: String? = nil) { + let headers = contentHeaders(withName: name, fileName: fileName, mimeType: mimeType) + let stream = InputStream(data: data) + let length = UInt64(data.count) + + append(stream, withLength: length, headers: headers) + } + + /// Creates a body part from the file and appends it to the instance. + /// + /// The body part data will be encoded using the following format: + /// + /// - `Content-Disposition: form-data; name=#{name}; filename=#{generated filename}` (HTTP Header) + /// - `Content-Type: #{generated mimeType}` (HTTP Header) + /// - Encoded file data + /// - Multipart form boundary + /// + /// The filename in the `Content-Disposition` HTTP header is generated from the last path component of the + /// `fileURL`. The `Content-Type` HTTP header MIME type is generated by mapping the `fileURL` extension to the + /// system associated MIME type. + /// + /// - Parameters: + /// - fileURL: `URL` of the file whose content will be encoded into the instance. + /// - name: Name to associate with the file content in the `Content-Disposition` HTTP header. + public func append(_ fileURL: URL, withName name: String) { + let fileName = fileURL.lastPathComponent + let pathExtension = fileURL.pathExtension + + if !fileName.isEmpty && !pathExtension.isEmpty { + let mime = mimeType(forPathExtension: pathExtension) + append(fileURL, withName: name, fileName: fileName, mimeType: mime) + } else { + setBodyPartError(withReason: .bodyPartFilenameInvalid(in: fileURL)) + } + } + + /// Creates a body part from the file and appends it to the instance. + /// + /// The body part data will be encoded using the following format: + /// + /// - Content-Disposition: form-data; name=#{name}; filename=#{filename} (HTTP Header) + /// - Content-Type: #{mimeType} (HTTP Header) + /// - Encoded file data + /// - Multipart form boundary + /// + /// - Parameters: + /// - fileURL: `URL` of the file whose content will be encoded into the instance. + /// - name: Name to associate with the file content in the `Content-Disposition` HTTP header. + /// - fileName: Filename to associate with the file content in the `Content-Disposition` HTTP header. + /// - mimeType: MIME type to associate with the file content in the `Content-Type` HTTP header. + public func append(_ fileURL: URL, withName name: String, fileName: String, mimeType: String) { + let headers = contentHeaders(withName: name, fileName: fileName, mimeType: mimeType) + + //============================================================ + // Check 1 - is file URL? + //============================================================ + + guard fileURL.isFileURL else { + setBodyPartError(withReason: .bodyPartURLInvalid(url: fileURL)) + return + } + + //============================================================ + // Check 2 - is file URL reachable? + //============================================================ + + do { + let isReachable = try fileURL.checkPromisedItemIsReachable() + guard isReachable else { + setBodyPartError(withReason: .bodyPartFileNotReachable(at: fileURL)) + return + } + } catch { + setBodyPartError(withReason: .bodyPartFileNotReachableWithError(atURL: fileURL, error: error)) + return + } + + //============================================================ + // Check 3 - is file URL a directory? + //============================================================ + + var isDirectory: ObjCBool = false + let path = fileURL.path + + guard fileManager.fileExists(atPath: path, isDirectory: &isDirectory) && !isDirectory.boolValue else { + setBodyPartError(withReason: .bodyPartFileIsDirectory(at: fileURL)) + return + } + + //============================================================ + // Check 4 - can the file size be extracted? + //============================================================ + + let bodyContentLength: UInt64 + + do { + guard let fileSize = try fileManager.attributesOfItem(atPath: path)[.size] as? NSNumber else { + setBodyPartError(withReason: .bodyPartFileSizeNotAvailable(at: fileURL)) + return + } + + bodyContentLength = fileSize.uint64Value + } catch { + setBodyPartError(withReason: .bodyPartFileSizeQueryFailedWithError(forURL: fileURL, error: error)) + return + } + + //============================================================ + // Check 5 - can a stream be created from file URL? + //============================================================ + + guard let stream = InputStream(url: fileURL) else { + setBodyPartError(withReason: .bodyPartInputStreamCreationFailed(for: fileURL)) + return + } + + append(stream, withLength: bodyContentLength, headers: headers) + } + + /// Creates a body part from the stream and appends it to the instance. + /// + /// The body part data will be encoded using the following format: + /// + /// - `Content-Disposition: form-data; name=#{name}; filename=#{filename}` (HTTP Header) + /// - `Content-Type: #{mimeType}` (HTTP Header) + /// - Encoded stream data + /// - Multipart form boundary + /// + /// - Parameters: + /// - stream: `InputStream` to encode into the instance. + /// - length: Length, in bytes, of the stream. + /// - name: Name to associate with the stream content in the `Content-Disposition` HTTP header. + /// - fileName: Filename to associate with the stream content in the `Content-Disposition` HTTP header. + /// - mimeType: MIME type to associate with the stream content in the `Content-Type` HTTP header. + public func append(_ stream: InputStream, + withLength length: UInt64, + name: String, + fileName: String, + mimeType: String) { + let headers = contentHeaders(withName: name, fileName: fileName, mimeType: mimeType) + append(stream, withLength: length, headers: headers) + } + + /// Creates a body part with the stream, length, and headers and appends it to the instance. + /// + /// The body part data will be encoded using the following format: + /// + /// - HTTP headers + /// - Encoded stream data + /// - Multipart form boundary + /// + /// - Parameters: + /// - stream: `InputStream` to encode into the instance. + /// - length: Length, in bytes, of the stream. + /// - headers: `HTTPHeaders` for the body part. + public func append(_ stream: InputStream, withLength length: UInt64, headers: HTTPHeaders) { + let bodyPart = BodyPart(headers: headers, bodyStream: stream, bodyContentLength: length) + bodyParts.append(bodyPart) + } + + // MARK: - Data Encoding + + /// Encodes all appended body parts into a single `Data` value. + /// + /// - Note: This method will load all the appended body parts into memory all at the same time. This method should + /// only be used when the encoded data will have a small memory footprint. For large data cases, please use + /// the `writeEncodedData(to:))` method. + /// + /// - Returns: The encoded `Data`, if encoding is successful. + /// - Throws: An `AFError` if encoding encounters an error. + public func encode() throws -> Data { + if let bodyPartError = bodyPartError { + throw bodyPartError + } + + var encoded = Data() + + bodyParts.first?.hasInitialBoundary = true + bodyParts.last?.hasFinalBoundary = true + + for bodyPart in bodyParts { + let encodedData = try encode(bodyPart) + encoded.append(encodedData) + } + + return encoded + } + + /// Writes all appended body parts to the given file `URL`. + /// + /// This process is facilitated by reading and writing with input and output streams, respectively. Thus, + /// this approach is very memory efficient and should be used for large body part data. + /// + /// - Parameter fileURL: File `URL` to which to write the form data. + /// - Throws: An `AFError` if encoding encounters an error. + public func writeEncodedData(to fileURL: URL) throws { + if let bodyPartError = bodyPartError { + throw bodyPartError + } + + if fileManager.fileExists(atPath: fileURL.path) { + throw AFError.multipartEncodingFailed(reason: .outputStreamFileAlreadyExists(at: fileURL)) + } else if !fileURL.isFileURL { + throw AFError.multipartEncodingFailed(reason: .outputStreamURLInvalid(url: fileURL)) + } + + guard let outputStream = OutputStream(url: fileURL, append: false) else { + throw AFError.multipartEncodingFailed(reason: .outputStreamCreationFailed(for: fileURL)) + } + + outputStream.open() + defer { outputStream.close() } + + bodyParts.first?.hasInitialBoundary = true + bodyParts.last?.hasFinalBoundary = true + + for bodyPart in bodyParts { + try write(bodyPart, to: outputStream) + } + } + + // MARK: - Private - Body Part Encoding + + private func encode(_ bodyPart: BodyPart) throws -> Data { + var encoded = Data() + + let initialData = bodyPart.hasInitialBoundary ? initialBoundaryData() : encapsulatedBoundaryData() + encoded.append(initialData) + + let headerData = encodeHeaders(for: bodyPart) + encoded.append(headerData) + + let bodyStreamData = try encodeBodyStream(for: bodyPart) + encoded.append(bodyStreamData) + + if bodyPart.hasFinalBoundary { + encoded.append(finalBoundaryData()) + } + + return encoded + } + + private func encodeHeaders(for bodyPart: BodyPart) -> Data { + let headerText = bodyPart.headers.map { "\($0.name): \($0.value)\(EncodingCharacters.crlf)" } + .joined() + + EncodingCharacters.crlf + + return Data(headerText.utf8) + } + + private func encodeBodyStream(for bodyPart: BodyPart) throws -> Data { + let inputStream = bodyPart.bodyStream + inputStream.open() + defer { inputStream.close() } + + var encoded = Data() + + while inputStream.hasBytesAvailable { + var buffer = [UInt8](repeating: 0, count: streamBufferSize) + let bytesRead = inputStream.read(&buffer, maxLength: streamBufferSize) + + if let error = inputStream.streamError { + throw AFError.multipartEncodingFailed(reason: .inputStreamReadFailed(error: error)) + } + + if bytesRead > 0 { + encoded.append(buffer, count: bytesRead) + } else { + break + } + } + + return encoded + } + + // MARK: - Private - Writing Body Part to Output Stream + + private func write(_ bodyPart: BodyPart, to outputStream: OutputStream) throws { + try writeInitialBoundaryData(for: bodyPart, to: outputStream) + try writeHeaderData(for: bodyPart, to: outputStream) + try writeBodyStream(for: bodyPart, to: outputStream) + try writeFinalBoundaryData(for: bodyPart, to: outputStream) + } + + private func writeInitialBoundaryData(for bodyPart: BodyPart, to outputStream: OutputStream) throws { + let initialData = bodyPart.hasInitialBoundary ? initialBoundaryData() : encapsulatedBoundaryData() + return try write(initialData, to: outputStream) + } + + private func writeHeaderData(for bodyPart: BodyPart, to outputStream: OutputStream) throws { + let headerData = encodeHeaders(for: bodyPart) + return try write(headerData, to: outputStream) + } + + private func writeBodyStream(for bodyPart: BodyPart, to outputStream: OutputStream) throws { + let inputStream = bodyPart.bodyStream + + inputStream.open() + defer { inputStream.close() } + + while inputStream.hasBytesAvailable { + var buffer = [UInt8](repeating: 0, count: streamBufferSize) + let bytesRead = inputStream.read(&buffer, maxLength: streamBufferSize) + + if let streamError = inputStream.streamError { + throw AFError.multipartEncodingFailed(reason: .inputStreamReadFailed(error: streamError)) + } + + if bytesRead > 0 { + if buffer.count != bytesRead { + buffer = Array(buffer[0.. 0, outputStream.hasSpaceAvailable { + let bytesWritten = outputStream.write(buffer, maxLength: bytesToWrite) + + if let error = outputStream.streamError { + throw AFError.multipartEncodingFailed(reason: .outputStreamWriteFailed(error: error)) + } + + bytesToWrite -= bytesWritten + + if bytesToWrite > 0 { + buffer = Array(buffer[bytesWritten.. String { + if + let id = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, pathExtension as CFString, nil)?.takeRetainedValue(), + let contentType = UTTypeCopyPreferredTagWithClass(id, kUTTagClassMIMEType)?.takeRetainedValue() { + return contentType as String + } + + return "application/octet-stream" + } + + // MARK: - Private - Content Headers + + private func contentHeaders(withName name: String, fileName: String? = nil, mimeType: String? = nil) -> HTTPHeaders { + var disposition = "form-data; name=\"\(name)\"" + if let fileName = fileName { disposition += "; filename=\"\(fileName)\"" } + + var headers: HTTPHeaders = [.contentDisposition(disposition)] + if let mimeType = mimeType { headers.add(.contentType(mimeType)) } + + return headers + } + + // MARK: - Private - Boundary Encoding + + private func initialBoundaryData() -> Data { + return BoundaryGenerator.boundaryData(forBoundaryType: .initial, boundary: boundary) + } + + private func encapsulatedBoundaryData() -> Data { + return BoundaryGenerator.boundaryData(forBoundaryType: .encapsulated, boundary: boundary) + } + + private func finalBoundaryData() -> Data { + return BoundaryGenerator.boundaryData(forBoundaryType: .final, boundary: boundary) + } + + // MARK: - Private - Errors + + private func setBodyPartError(withReason reason: AFError.MultipartEncodingFailureReason) { + guard bodyPartError == nil else { return } + bodyPartError = AFError.multipartEncodingFailed(reason: reason) + } +} diff --git a/Pods/Alamofire/Source/MultipartUpload.swift b/Pods/Alamofire/Source/MultipartUpload.swift new file mode 100644 index 0000000..4772c30 --- /dev/null +++ b/Pods/Alamofire/Source/MultipartUpload.swift @@ -0,0 +1,87 @@ +// +// MultipartUpload.swift +// +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.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 +// 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. +// + +import Foundation + +/// Internal type which encapsulates a `MultipartFormData` upload. +final class MultipartUpload { + lazy var result = Result { try build() } + + let isInBackgroundSession: Bool + let multipartFormData: MultipartFormData + let encodingMemoryThreshold: UInt64 + let request: URLRequestConvertible + let fileManager: FileManager + + init(isInBackgroundSession: Bool, + encodingMemoryThreshold: UInt64, + request: URLRequestConvertible, + multipartFormData: MultipartFormData) { + self.isInBackgroundSession = isInBackgroundSession + self.encodingMemoryThreshold = encodingMemoryThreshold + self.request = request + fileManager = multipartFormData.fileManager + self.multipartFormData = multipartFormData + } + + func build() throws -> (request: URLRequest, uploadable: UploadRequest.Uploadable) { + var urlRequest = try request.asURLRequest() + urlRequest.setValue(multipartFormData.contentType, forHTTPHeaderField: "Content-Type") + + let uploadable: UploadRequest.Uploadable + if multipartFormData.contentLength < encodingMemoryThreshold && !isInBackgroundSession { + let data = try multipartFormData.encode() + + uploadable = .data(data) + } else { + let tempDirectoryURL = fileManager.temporaryDirectory + let directoryURL = tempDirectoryURL.appendingPathComponent("org.alamofire.manager/multipart.form.data") + let fileName = UUID().uuidString + let fileURL = directoryURL.appendingPathComponent(fileName) + + try fileManager.createDirectory(at: directoryURL, withIntermediateDirectories: true, attributes: nil) + + do { + try multipartFormData.writeEncodedData(to: fileURL) + } catch { + // Cleanup after attempted write if it fails. + try? fileManager.removeItem(at: fileURL) + } + + uploadable = .file(fileURL, shouldRemove: true) + } + + return (request: urlRequest, uploadable: uploadable) + } +} + +extension MultipartUpload: UploadConvertible { + func asURLRequest() throws -> URLRequest { + return try result.get().request + } + + func createUploadable() throws -> UploadRequest.Uploadable { + return try result.get().uploadable + } +} diff --git a/Pods/Alamofire/Source/NetworkReachabilityManager.swift b/Pods/Alamofire/Source/NetworkReachabilityManager.swift new file mode 100644 index 0000000..a07aa1d --- /dev/null +++ b/Pods/Alamofire/Source/NetworkReachabilityManager.swift @@ -0,0 +1,266 @@ +// +// NetworkReachabilityManager.swift +// +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.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 +// 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. +// + +#if !(os(watchOS) || os(Linux)) + +import Foundation +import SystemConfiguration + +/// The `NetworkReachabilityManager` class listens for reachability changes of hosts and addresses for both cellular and +/// WiFi network interfaces. +/// +/// Reachability can be used to determine background information about why a network operation failed, or to retry +/// network requests when a connection is established. It should not be used to prevent a user from initiating a network +/// request, as it's possible that an initial request may be required to establish reachability. +open class NetworkReachabilityManager { + /// Defines the various states of network reachability. + public enum NetworkReachabilityStatus { + /// It is unknown whether the network is reachable. + case unknown + /// The network is not reachable. + case notReachable + /// The network is reachable on the associated `ConnectionType`. + case reachable(ConnectionType) + + init(_ flags: SCNetworkReachabilityFlags) { + guard flags.isActuallyReachable else { self = .notReachable; return } + + var networkStatus: NetworkReachabilityStatus = .reachable(.ethernetOrWiFi) + + if flags.isCellular { networkStatus = .reachable(.cellular) } + + self = networkStatus + } + + /// Defines the various connection types detected by reachability flags. + public enum ConnectionType { + /// The connection type is either over Ethernet or WiFi. + case ethernetOrWiFi + /// The connection type is a cellular connection. + case cellular + } + } + + /// A closure executed when the network reachability status changes. The closure takes a single argument: the + /// network reachability status. + public typealias Listener = (NetworkReachabilityStatus) -> Void + + /// Default `NetworkReachabilityManager` for the zero address and a `listenerQueue` of `.main`. + public static let `default` = NetworkReachabilityManager() + + // MARK: - Properties + + /// Whether the network is currently reachable. + open var isReachable: Bool { return isReachableOnCellular || isReachableOnEthernetOrWiFi } + + /// Whether the network is currently reachable over the cellular interface. + /// + /// - Note: Using this property to decide whether to make a high or low bandwidth request is not recommended. + /// Instead, set the `allowsCellularAccess` on any `URLRequest`s being issued. + /// + open var isReachableOnCellular: Bool { return status == .reachable(.cellular) } + + /// Whether the network is currently reachable over Ethernet or WiFi interface. + open var isReachableOnEthernetOrWiFi: Bool { return status == .reachable(.ethernetOrWiFi) } + + /// `DispatchQueue` on which reachability will update. + public let reachabilityQueue = DispatchQueue(label: "org.alamofire.reachabilityQueue") + + /// Flags of the current reachability type, if any. + open var flags: SCNetworkReachabilityFlags? { + var flags = SCNetworkReachabilityFlags() + + return (SCNetworkReachabilityGetFlags(reachability, &flags)) ? flags : nil + } + + /// The current network reachability status. + open var status: NetworkReachabilityStatus { + return flags.map(NetworkReachabilityStatus.init) ?? .unknown + } + + /// Mutable state storage. + struct MutableState { + /// A closure executed when the network reachability status changes. + var listener: Listener? + /// `DispatchQueue` on which listeners will be called. + var listenerQueue: DispatchQueue? + /// Previously calculated status. + var previousStatus: NetworkReachabilityStatus? + } + + /// `SCNetworkReachability` instance providing notifications. + private let reachability: SCNetworkReachability + + /// Protected storage for mutable state. + private let mutableState = Protector(MutableState()) + + // MARK: - Initialization + + /// Creates an instance with the specified host. + /// + /// - Note: The `host` value must *not* contain a scheme, just the hostname. + /// + /// - Parameters: + /// - host: Host used to evaluate network reachability. Must *not* include the scheme (e.g. `https`). + public convenience init?(host: String) { + guard let reachability = SCNetworkReachabilityCreateWithName(nil, host) else { return nil } + + self.init(reachability: reachability) + } + + /// Creates an instance that monitors the address 0.0.0.0. + /// + /// Reachability treats the 0.0.0.0 address as a special token that causes it to monitor the general routing + /// status of the device, both IPv4 and IPv6. + public convenience init?() { + var zero = sockaddr() + zero.sa_len = UInt8(MemoryLayout.size) + zero.sa_family = sa_family_t(AF_INET) + + guard let reachability = SCNetworkReachabilityCreateWithAddress(nil, &zero) else { return nil } + + self.init(reachability: reachability) + } + + private init(reachability: SCNetworkReachability) { + self.reachability = reachability + } + + deinit { + stopListening() + } + + // MARK: - Listening + + /// Starts listening for changes in network reachability status. + /// + /// - Note: Stops and removes any existing listener. + /// + /// - Parameters: + /// - queue: `DispatchQueue` on which to call the `listener` closure. `.main` by default. + /// - listener: `Listener` closure called when reachability changes. + /// + /// - Returns: `true` if listening was started successfully, `false` otherwise. + @discardableResult + open func startListening(onQueue queue: DispatchQueue = .main, + onUpdatePerforming listener: @escaping Listener) -> Bool { + stopListening() + + mutableState.write { state in + state.listenerQueue = queue + state.listener = listener + } + + var context = SCNetworkReachabilityContext(version: 0, + info: Unmanaged.passRetained(self).toOpaque(), + retain: nil, + release: nil, + copyDescription: nil) + let callback: SCNetworkReachabilityCallBack = { _, flags, info in + guard let info = info else { return } + + let instance = Unmanaged.fromOpaque(info).takeUnretainedValue() + instance.notifyListener(flags) + } + + let queueAdded = SCNetworkReachabilitySetDispatchQueue(reachability, reachabilityQueue) + let callbackAdded = SCNetworkReachabilitySetCallback(reachability, callback, &context) + + // Manually call listener to give initial state, since the framework may not. + if let currentFlags = flags { + reachabilityQueue.async { + self.notifyListener(currentFlags) + } + } + + return callbackAdded && queueAdded + } + + /// Stops listening for changes in network reachability status. + open func stopListening() { + SCNetworkReachabilitySetCallback(reachability, nil, nil) + SCNetworkReachabilitySetDispatchQueue(reachability, nil) + mutableState.write { state in + state.listener = nil + state.listenerQueue = nil + state.previousStatus = nil + } + } + + // MARK: - Internal - Listener Notification + + /// Calls the `listener` closure of the `listenerQueue` if the computed status hasn't changed. + /// + /// - Note: Should only be called from the `reachabilityQueue`. + /// + /// - Parameter flags: `SCNetworkReachabilityFlags` to use to calculate the status. + func notifyListener(_ flags: SCNetworkReachabilityFlags) { + let newStatus = NetworkReachabilityStatus(flags) + + mutableState.write { state in + guard state.previousStatus != newStatus else { return } + + state.previousStatus = newStatus + + let listener = state.listener + state.listenerQueue?.async { listener?(newStatus) } + } + } +} + +// MARK: - + +extension NetworkReachabilityManager.NetworkReachabilityStatus: Equatable {} + +extension SCNetworkReachabilityFlags { + var isReachable: Bool { return contains(.reachable) } + var isConnectionRequired: Bool { return contains(.connectionRequired) } + var canConnectAutomatically: Bool { return contains(.connectionOnDemand) || contains(.connectionOnTraffic) } + var canConnectWithoutUserInteraction: Bool { return canConnectAutomatically && !contains(.interventionRequired) } + var isActuallyReachable: Bool { return isReachable && (!isConnectionRequired || canConnectWithoutUserInteraction) } + var isCellular: Bool { + #if os(iOS) || os(tvOS) + return contains(.isWWAN) + #else + return false + #endif + } + + /// Human readable `String` for all states, to help with debugging. + var readableDescription: String { + let W = isCellular ? "W" : "-" + let R = isReachable ? "R" : "-" + let c = isConnectionRequired ? "c" : "-" + let t = contains(.transientConnection) ? "t" : "-" + let i = contains(.interventionRequired) ? "i" : "-" + let C = contains(.connectionOnTraffic) ? "C" : "-" + let D = contains(.connectionOnDemand) ? "D" : "-" + let l = contains(.isLocalAddress) ? "l" : "-" + let d = contains(.isDirect) ? "d" : "-" + let a = contains(.connectionAutomatic) ? "a" : "-" + + return "\(W)\(R) \(c)\(t)\(i)\(C)\(D)\(l)\(d)\(a)" + } +} +#endif diff --git a/Pods/Alamofire/Source/Notifications.swift b/Pods/Alamofire/Source/Notifications.swift new file mode 100644 index 0000000..4a4b25a --- /dev/null +++ b/Pods/Alamofire/Source/Notifications.swift @@ -0,0 +1,115 @@ +// +// Notifications.swift +// +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.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 +// 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. +// + +import Foundation + +public extension Request { + /// Posted when a `Request` is resumed. The `Notification` contains the resumed `Request`. + static let didResumeNotification = Notification.Name(rawValue: "org.alamofire.notification.name.request.didResume") + /// Posted when a `Request` is suspended. The `Notification` contains the suspended `Request`. + static let didSuspendNotification = Notification.Name(rawValue: "org.alamofire.notification.name.request.didSuspend") + /// Posted when a `Request` is cancelled. The `Notification` contains the cancelled `Request`. + static let didCancelNotification = Notification.Name(rawValue: "org.alamofire.notification.name.request.didCancel") + /// Posted when a `Request` is finished. The `Notification` contains the completed `Request`. + static let didFinishNotification = Notification.Name(rawValue: "org.alamofire.notification.name.request.didFinish") + + /// Posted when a `URLSessionTask` is resumed. The `Notification` contains the `Request` associated with the `URLSessionTask`. + static let didResumeTaskNotification = Notification.Name(rawValue: "org.alamofire.notification.name.request.didResumeTask") + /// Posted when a `URLSessionTask` is suspended. The `Notification` contains the `Request` associated with the `URLSessionTask`. + static let didSuspendTaskNotification = Notification.Name(rawValue: "org.alamofire.notification.name.request.didSuspendTask") + /// Posted when a `URLSessionTask` is cancelled. The `Notification` contains the `Request` associated with the `URLSessionTask`. + static let didCancelTaskNotification = Notification.Name(rawValue: "org.alamofire.notification.name.request.didCancelTask") + /// Posted when a `URLSessionTask` is completed. The `Notification` contains the `Request` associated with the `URLSessionTask`. + static let didCompleteTaskNotification = Notification.Name(rawValue: "org.alamofire.notification.name.request.didCompleteTask") +} + +// MARK: - + +extension Notification { + /// The `Request` contained by the instance's `userInfo`, `nil` otherwise. + public var request: Request? { + return userInfo?[String.requestKey] as? Request + } + + /// Convenience initializer for a `Notification` containing a `Request` payload. + /// + /// - Parameters: + /// - name: The name of the notification. + /// - request: The `Request` payload. + init(name: Notification.Name, request: Request) { + self.init(name: name, object: nil, userInfo: [String.requestKey: request]) + } +} + +extension NotificationCenter { + /// Convenience function for posting notifications with `Request` payloads. + /// + /// - Parameters: + /// - name: The name of the notification. + /// - request: The `Request` payload. + func postNotification(named name: Notification.Name, with request: Request) { + let notification = Notification(name: name, request: request) + post(notification) + } +} + +extension String { + /// User info dictionary key representing the `Request` associated with the notification. + fileprivate static let requestKey = "org.alamofire.notification.key.request" +} + +/// `EventMonitor` that provides Alamofire's notifications. +public final class AlamofireNotifications: EventMonitor { + public func requestDidResume(_ request: Request) { + NotificationCenter.default.postNotification(named: Request.didResumeNotification, with: request) + } + + public func requestDidSuspend(_ request: Request) { + NotificationCenter.default.postNotification(named: Request.didSuspendNotification, with: request) + } + + public func requestDidCancel(_ request: Request) { + NotificationCenter.default.postNotification(named: Request.didCancelNotification, with: request) + } + + public func requestDidFinish(_ request: Request) { + NotificationCenter.default.postNotification(named: Request.didFinishNotification, with: request) + } + + public func request(_ request: Request, didResumeTask task: URLSessionTask) { + NotificationCenter.default.postNotification(named: Request.didResumeTaskNotification, with: request) + } + + public func request(_ request: Request, didSuspendTask task: URLSessionTask) { + NotificationCenter.default.postNotification(named: Request.didSuspendTaskNotification, with: request) + } + + public func request(_ request: Request, didCancelTask task: URLSessionTask) { + NotificationCenter.default.postNotification(named: Request.didCancelTaskNotification, with: request) + } + + public func request(_ request: Request, didCompleteTask task: URLSessionTask, with error: AFError?) { + NotificationCenter.default.postNotification(named: Request.didCompleteTaskNotification, with: request) + } +} diff --git a/Pods/Alamofire/Source/OperationQueue+Alamofire.swift b/Pods/Alamofire/Source/OperationQueue+Alamofire.swift new file mode 100644 index 0000000..b06a0cc --- /dev/null +++ b/Pods/Alamofire/Source/OperationQueue+Alamofire.swift @@ -0,0 +1,49 @@ +// +// OperationQueue+Alamofire.swift +// +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.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 +// 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. +// + +import Foundation + +extension OperationQueue { + /// Creates an instance using the provided parameters. + /// + /// - Parameters: + /// - qualityOfService: `QualityOfService` to be applied to the queue. `.default` by default. + /// - maxConcurrentOperationCount: Maximum concurrent operations. + /// `OperationQueue.defaultMaxConcurrentOperationCount` by default. + /// - underlyingQueue: Underlying `DispatchQueue`. `nil` by default. + /// - name: Name for the queue. `nil` by default. + /// - startSuspended: Whether the queue starts suspended. `false` by default. + convenience init(qualityOfService: QualityOfService = .default, + maxConcurrentOperationCount: Int = OperationQueue.defaultMaxConcurrentOperationCount, + underlyingQueue: DispatchQueue? = nil, + name: String? = nil, + startSuspended: Bool = false) { + self.init() + self.qualityOfService = qualityOfService + self.maxConcurrentOperationCount = maxConcurrentOperationCount + self.underlyingQueue = underlyingQueue + self.name = name + isSuspended = startSuspended + } +} diff --git a/Pods/Alamofire/Source/ParameterEncoder.swift b/Pods/Alamofire/Source/ParameterEncoder.swift new file mode 100644 index 0000000..1e5c70a --- /dev/null +++ b/Pods/Alamofire/Source/ParameterEncoder.swift @@ -0,0 +1,184 @@ +// +// ParameterEncoder.swift +// +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.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 +// 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. +// + +import Foundation + +/// A type that can encode any `Encodable` type into a `URLRequest`. +public protocol ParameterEncoder { + /// Encode the provided `Encodable` parameters into `request`. + /// + /// - Parameters: + /// - parameters: The `Encodable` parameter value. + /// - request: The `URLRequest` into which to encode the parameters. + /// + /// - Returns: A `URLRequest` with the result of the encoding. + /// - Throws: An `Error` when encoding fails. For Alamofire provided encoders, this will be an instance of + /// `AFError.parameterEncoderFailed` with an associated `ParameterEncoderFailureReason`. + func encode(_ parameters: Parameters?, into request: URLRequest) throws -> URLRequest +} + +/// A `ParameterEncoder` that encodes types as JSON body data. +/// +/// If no `Content-Type` header is already set on the provided `URLRequest`s, it's set to `application/json`. +open class JSONParameterEncoder: ParameterEncoder { + /// Returns an encoder with default parameters. + public static var `default`: JSONParameterEncoder { return JSONParameterEncoder() } + + /// Returns an encoder with `JSONEncoder.outputFormatting` set to `.prettyPrinted`. + public static var prettyPrinted: JSONParameterEncoder { + let encoder = JSONEncoder() + encoder.outputFormatting = .prettyPrinted + + return JSONParameterEncoder(encoder: encoder) + } + + /// Returns an encoder with `JSONEncoder.outputFormatting` set to `.sortedKeys`. + @available(macOS 10.13, iOS 11.0, tvOS 11.0, watchOS 4.0, *) + public static var sortedKeys: JSONParameterEncoder { + let encoder = JSONEncoder() + encoder.outputFormatting = .sortedKeys + + return JSONParameterEncoder(encoder: encoder) + } + + /// `JSONEncoder` used to encode parameters. + public let encoder: JSONEncoder + + /// Creates an instance with the provided `JSONEncoder`. + /// + /// - Parameter encoder: The `JSONEncoder`. `JSONEncoder()` by default. + public init(encoder: JSONEncoder = JSONEncoder()) { + self.encoder = encoder + } + + open func encode(_ parameters: Parameters?, + into request: URLRequest) throws -> URLRequest { + guard let parameters = parameters else { return request } + + var request = request + + do { + let data = try encoder.encode(parameters) + request.httpBody = data + if request.headers["Content-Type"] == nil { + request.headers.update(.contentType("application/json")) + } + } catch { + throw AFError.parameterEncodingFailed(reason: .jsonEncodingFailed(error: error)) + } + + return request + } +} + +/// A `ParameterEncoder` that encodes types as URL-encoded query strings to be set on the URL or as body data, depending +/// on the `Destination` set. +/// +/// If no `Content-Type` header is already set on the provided `URLRequest`s, it will be set to +/// `application/x-www-form-urlencoded; charset=utf-8`. +/// +/// Encoding behavior can be customized by passing an instance of `URLEncodedFormEncoder` to the initializer. +open class URLEncodedFormParameterEncoder: ParameterEncoder { + /// Defines where the URL-encoded string should be set for each `URLRequest`. + public enum Destination { + /// Applies the encoded query string to any existing query string for `.get`, `.head`, and `.delete` request. + /// Sets it to the `httpBody` for all other methods. + case methodDependent + /// Applies the encoded query string to any existing query string from the `URLRequest`. + case queryString + /// Applies the encoded query string to the `httpBody` of the `URLRequest`. + case httpBody + + /// Determines whether the URL-encoded string should be applied to the `URLRequest`'s `url`. + /// + /// - Parameter method: The `HTTPMethod`. + /// + /// - Returns: Whether the URL-encoded string should be applied to a `URL`. + func encodesParametersInURL(for method: HTTPMethod) -> Bool { + switch self { + case .methodDependent: return [.get, .head, .delete].contains(method) + case .queryString: return true + case .httpBody: return false + } + } + } + + /// Returns an encoder with default parameters. + public static var `default`: URLEncodedFormParameterEncoder { return URLEncodedFormParameterEncoder() } + + /// The `URLEncodedFormEncoder` to use. + public let encoder: URLEncodedFormEncoder + + /// The `Destination` for the URL-encoded string. + public let destination: Destination + + /// Creates an instance with the provided `URLEncodedFormEncoder` instance and `Destination` value. + /// + /// - Parameters: + /// - encoder: The `URLEncodedFormEncoder`. `URLEncodedFormEncoder()` by default. + /// - destination: The `Destination`. `.methodDependent` by default. + public init(encoder: URLEncodedFormEncoder = URLEncodedFormEncoder(), destination: Destination = .methodDependent) { + self.encoder = encoder + self.destination = destination + } + + open func encode(_ parameters: Parameters?, + into request: URLRequest) throws -> URLRequest { + guard let parameters = parameters else { return request } + + var request = request + + guard let url = request.url else { + throw AFError.parameterEncoderFailed(reason: .missingRequiredComponent(.url)) + } + + guard let method = request.method else { + let rawValue = request.method?.rawValue ?? "nil" + throw AFError.parameterEncoderFailed(reason: .missingRequiredComponent(.httpMethod(rawValue: rawValue))) + } + + if destination.encodesParametersInURL(for: method), + var components = URLComponents(url: url, resolvingAgainstBaseURL: false) { + let query: String = try Result { try encoder.encode(parameters) } + .mapError { AFError.parameterEncoderFailed(reason: .encoderFailed(error: $0)) }.get() + let newQueryString = [components.percentEncodedQuery, query].compactMap { $0 }.joinedWithAmpersands() + components.percentEncodedQuery = newQueryString.isEmpty ? nil : newQueryString + + guard let newURL = components.url else { + throw AFError.parameterEncoderFailed(reason: .missingRequiredComponent(.url)) + } + + request.url = newURL + } else { + if request.headers["Content-Type"] == nil { + request.headers.update(.contentType("application/x-www-form-urlencoded; charset=utf-8")) + } + + request.httpBody = try Result { try encoder.encode(parameters) } + .mapError { AFError.parameterEncoderFailed(reason: .encoderFailed(error: $0)) }.get() + } + + return request + } +} diff --git a/Pods/Alamofire/Source/ParameterEncoding.swift b/Pods/Alamofire/Source/ParameterEncoding.swift new file mode 100644 index 0000000..fbf1701 --- /dev/null +++ b/Pods/Alamofire/Source/ParameterEncoding.swift @@ -0,0 +1,314 @@ +// +// ParameterEncoding.swift +// +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.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 +// 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. +// + +import Foundation + +/// A dictionary of parameters to apply to a `URLRequest`. +public typealias Parameters = [String: Any] + +/// A type used to define how a set of parameters are applied to a `URLRequest`. +public protocol ParameterEncoding { + /// Creates a `URLRequest` by encoding parameters and applying them on the passed request. + /// + /// - Parameters: + /// - urlRequest: `URLRequestConvertible` value onto which parameters will be encoded. + /// - parameters: `Parameters` to encode onto the request. + /// + /// - Returns: The encoded `URLRequest`. + /// - Throws: Any `Error` produced during parameter encoding. + func encode(_ urlRequest: URLRequestConvertible, with parameters: Parameters?) throws -> URLRequest +} + +// MARK: - + +/// Creates a url-encoded query string to be set as or appended to any existing URL query string or set as the HTTP +/// body of the URL request. Whether the query string is set or appended to any existing URL query string or set as +/// the HTTP body depends on the destination of the encoding. +/// +/// The `Content-Type` HTTP header field of an encoded request with HTTP body is set to +/// `application/x-www-form-urlencoded; charset=utf-8`. +/// +/// There is no published specification for how to encode collection types. By default the convention of appending +/// `[]` to the key for array values (`foo[]=1&foo[]=2`), and appending the key surrounded by square brackets for +/// nested dictionary values (`foo[bar]=baz`) is used. Optionally, `ArrayEncoding` can be used to omit the +/// square brackets appended to array keys. +/// +/// `BoolEncoding` can be used to configure how boolean values are encoded. The default behavior is to encode +/// `true` as 1 and `false` as 0. +public struct URLEncoding: ParameterEncoding { + // MARK: Helper Types + + /// Defines whether the url-encoded query string is applied to the existing query string or HTTP body of the + /// resulting URL request. + public enum Destination { + /// Applies encoded query string result to existing query string for `GET`, `HEAD` and `DELETE` requests and + /// sets as the HTTP body for requests with any other HTTP method. + case methodDependent + /// Sets or appends encoded query string result to existing query string. + case queryString + /// Sets encoded query string result as the HTTP body of the URL request. + case httpBody + + func encodesParametersInURL(for method: HTTPMethod) -> Bool { + switch self { + case .methodDependent: return [.get, .head, .delete].contains(method) + case .queryString: return true + case .httpBody: return false + } + } + } + + /// Configures how `Array` parameters are encoded. + public enum ArrayEncoding { + /// An empty set of square brackets is appended to the key for every value. This is the default behavior. + case brackets + /// No brackets are appended. The key is encoded as is. + case noBrackets + + func encode(key: String) -> String { + switch self { + case .brackets: + return "\(key)[]" + case .noBrackets: + return key + } + } + } + + /// Configures how `Bool` parameters are encoded. + public enum BoolEncoding { + /// Encode `true` as `1` and `false` as `0`. This is the default behavior. + case numeric + /// Encode `true` and `false` as string literals. + case literal + + func encode(value: Bool) -> String { + switch self { + case .numeric: + return value ? "1" : "0" + case .literal: + return value ? "true" : "false" + } + } + } + + // MARK: Properties + + /// Returns a default `URLEncoding` instance with a `.methodDependent` destination. + public static var `default`: URLEncoding { return URLEncoding() } + + /// Returns a `URLEncoding` instance with a `.queryString` destination. + public static var queryString: URLEncoding { return URLEncoding(destination: .queryString) } + + /// Returns a `URLEncoding` instance with an `.httpBody` destination. + public static var httpBody: URLEncoding { return URLEncoding(destination: .httpBody) } + + /// The destination defining where the encoded query string is to be applied to the URL request. + public let destination: Destination + + /// The encoding to use for `Array` parameters. + public let arrayEncoding: ArrayEncoding + + /// The encoding to use for `Bool` parameters. + public let boolEncoding: BoolEncoding + + // MARK: Initialization + + /// Creates an instance using the specified parameters. + /// + /// - Parameters: + /// - destination: `Destination` defining where the encoded query string will be applied. `.methodDependent` by + /// default. + /// - arrayEncoding: `ArrayEncoding` to use. `.brackets` by default. + /// - boolEncoding: `BoolEncoding` to use. `.numeric` by default. + public init(destination: Destination = .methodDependent, + arrayEncoding: ArrayEncoding = .brackets, + boolEncoding: BoolEncoding = .numeric) { + self.destination = destination + self.arrayEncoding = arrayEncoding + self.boolEncoding = boolEncoding + } + + // MARK: Encoding + + public func encode(_ urlRequest: URLRequestConvertible, with parameters: Parameters?) throws -> URLRequest { + var urlRequest = try urlRequest.asURLRequest() + + guard let parameters = parameters else { return urlRequest } + + if let method = urlRequest.method, destination.encodesParametersInURL(for: method) { + guard let url = urlRequest.url else { + throw AFError.parameterEncodingFailed(reason: .missingURL) + } + + if var urlComponents = URLComponents(url: url, resolvingAgainstBaseURL: false), !parameters.isEmpty { + let percentEncodedQuery = (urlComponents.percentEncodedQuery.map { $0 + "&" } ?? "") + query(parameters) + urlComponents.percentEncodedQuery = percentEncodedQuery + urlRequest.url = urlComponents.url + } + } else { + if urlRequest.value(forHTTPHeaderField: "Content-Type") == nil { + urlRequest.setValue("application/x-www-form-urlencoded; charset=utf-8", forHTTPHeaderField: "Content-Type") + } + + urlRequest.httpBody = Data(query(parameters).utf8) + } + + return urlRequest + } + + /// Creates a percent-escaped, URL encoded query string components from the given key-value pair recursively. + /// + /// - Parameters: + /// - key: Key of the query component. + /// - value: Value of the query component. + /// + /// - Returns: The percent-escaped, URL encoded query string components. + public func queryComponents(fromKey key: String, value: Any) -> [(String, String)] { + var components: [(String, String)] = [] + + if let dictionary = value as? [String: Any] { + for (nestedKey, value) in dictionary { + components += queryComponents(fromKey: "\(key)[\(nestedKey)]", value: value) + } + } else if let array = value as? [Any] { + for value in array { + components += queryComponents(fromKey: arrayEncoding.encode(key: key), value: value) + } + } else if let value = value as? NSNumber { + if value.isBool { + components.append((escape(key), escape(boolEncoding.encode(value: value.boolValue)))) + } else { + components.append((escape(key), escape("\(value)"))) + } + } else if let bool = value as? Bool { + components.append((escape(key), escape(boolEncoding.encode(value: bool)))) + } else { + components.append((escape(key), escape("\(value)"))) + } + + return components + } + + /// Creates a percent-escaped string following RFC 3986 for a query string key or value. + /// + /// - Parameter string: `String` to be percent-escaped. + /// + /// - Returns: The percent-escaped `String`. + public func escape(_ string: String) -> String { + return string.addingPercentEncoding(withAllowedCharacters: .afURLQueryAllowed) ?? string + } + + private func query(_ parameters: [String: Any]) -> String { + var components: [(String, String)] = [] + + for key in parameters.keys.sorted(by: <) { + let value = parameters[key]! + components += queryComponents(fromKey: key, value: value) + } + return components.map { "\($0)=\($1)" }.joined(separator: "&") + } +} + +// MARK: - + +/// Uses `JSONSerialization` to create a JSON representation of the parameters object, which is set as the body of the +/// request. The `Content-Type` HTTP header field of an encoded request is set to `application/json`. +public struct JSONEncoding: ParameterEncoding { + // MARK: Properties + + /// Returns a `JSONEncoding` instance with default writing options. + public static var `default`: JSONEncoding { return JSONEncoding() } + + /// Returns a `JSONEncoding` instance with `.prettyPrinted` writing options. + public static var prettyPrinted: JSONEncoding { return JSONEncoding(options: .prettyPrinted) } + + /// The options for writing the parameters as JSON data. + public let options: JSONSerialization.WritingOptions + + // MARK: Initialization + + /// Creates an instance using the specified `WritingOptions`. + /// + /// - Parameter options: `JSONSerialization.WritingOptions` to use. + public init(options: JSONSerialization.WritingOptions = []) { + self.options = options + } + + // MARK: Encoding + + public func encode(_ urlRequest: URLRequestConvertible, with parameters: Parameters?) throws -> URLRequest { + var urlRequest = try urlRequest.asURLRequest() + + guard let parameters = parameters else { return urlRequest } + + do { + let data = try JSONSerialization.data(withJSONObject: parameters, options: options) + + if urlRequest.value(forHTTPHeaderField: "Content-Type") == nil { + urlRequest.setValue("application/json", forHTTPHeaderField: "Content-Type") + } + + urlRequest.httpBody = data + } catch { + throw AFError.parameterEncodingFailed(reason: .jsonEncodingFailed(error: error)) + } + + return urlRequest + } + + /// Encodes any JSON compatible object into a `URLRequest`. + /// + /// - Parameters: + /// - urlRequest: `URLRequestConvertible` value into which the object will be encoded. + /// - jsonObject: `Any` value (must be JSON compatible` to be encoded into the `URLRequest`. `nil` by default. + /// + /// - Returns: The encoded `URLRequest`. + /// - Throws: Any `Error` produced during encoding. + public func encode(_ urlRequest: URLRequestConvertible, withJSONObject jsonObject: Any? = nil) throws -> URLRequest { + var urlRequest = try urlRequest.asURLRequest() + + guard let jsonObject = jsonObject else { return urlRequest } + + do { + let data = try JSONSerialization.data(withJSONObject: jsonObject, options: options) + + if urlRequest.value(forHTTPHeaderField: "Content-Type") == nil { + urlRequest.setValue("application/json", forHTTPHeaderField: "Content-Type") + } + + urlRequest.httpBody = data + } catch { + throw AFError.parameterEncodingFailed(reason: .jsonEncodingFailed(error: error)) + } + + return urlRequest + } +} + +// MARK: - + +extension NSNumber { + fileprivate var isBool: Bool { return CFBooleanGetTypeID() == CFGetTypeID(self) } +} diff --git a/Pods/Alamofire/Source/Protector.swift b/Pods/Alamofire/Source/Protector.swift new file mode 100644 index 0000000..3e42a53 --- /dev/null +++ b/Pods/Alamofire/Source/Protector.swift @@ -0,0 +1,167 @@ +// +// Protector.swift +// +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.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 +// 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. +// + +import Foundation + +// MARK: - + +/// An `os_unfair_lock` wrapper. +final class UnfairLock { + private let unfairLock: os_unfair_lock_t + + init() { + unfairLock = .allocate(capacity: 1) + unfairLock.initialize(to: os_unfair_lock()) + } + + deinit { + unfairLock.deinitialize(count: 1) + unfairLock.deallocate() + } + + private func lock() { + os_unfair_lock_lock(unfairLock) + } + + private func unlock() { + os_unfair_lock_unlock(unfairLock) + } + + /// Executes a closure returning a value while acquiring the lock. + /// + /// - Parameter closure: The closure to run. + /// + /// - Returns: The value the closure generated. + func around(_ closure: () -> T) -> T { + lock(); defer { unlock() } + return closure() + } + + /// Execute a closure while acquiring the lock. + /// + /// - Parameter closure: The closure to run. + func around(_ closure: () -> Void) { + lock(); defer { unlock() } + return closure() + } +} + +/// A thread-safe wrapper around a value. +final class Protector { + private let lock = UnfairLock() + private var value: T + + init(_ value: T) { + self.value = value + } + + /// The contained value. Unsafe for anything more than direct read or write. + var directValue: T { + get { return lock.around { value } } + set { lock.around { value = newValue } } + } + + /// Synchronously read or transform the contained value. + /// + /// - Parameter closure: The closure to execute. + /// + /// - Returns: The return value of the closure passed. + func read(_ closure: (T) -> U) -> U { + return lock.around { closure(self.value) } + } + + /// Synchronously modify the protected value. + /// + /// - Parameter closure: The closure to execute. + /// + /// - Returns: The modified value. + @discardableResult + func write(_ closure: (inout T) -> U) -> U { + return lock.around { closure(&self.value) } + } +} + +extension Protector where T: RangeReplaceableCollection { + /// Adds a new element to the end of this protected collection. + /// + /// - Parameter newElement: The `Element` to append. + func append(_ newElement: T.Element) { + write { (ward: inout T) in + ward.append(newElement) + } + } + + /// Adds the elements of a sequence to the end of this protected collection. + /// + /// - Parameter newElements: The `Sequence` to append. + func append(contentsOf newElements: S) where S.Element == T.Element { + write { (ward: inout T) in + ward.append(contentsOf: newElements) + } + } + + /// Add the elements of a collection to the end of the protected collection. + /// + /// - Parameter newElements: The `Collection` to append. + func append(contentsOf newElements: C) where C.Element == T.Element { + write { (ward: inout T) in + ward.append(contentsOf: newElements) + } + } +} + +extension Protector where T == Data? { + /// Adds the contents of a `Data` value to the end of the protected `Data`. + /// + /// - Parameter data: The `Data` to be appended. + func append(_ data: Data) { + write { (ward: inout T) in + ward?.append(data) + } + } +} + +extension Protector where T == Request.MutableState { + /// Attempts to transition to the passed `State`. + /// + /// - Parameter state: The `State` to attempt transition to. + /// + /// - Returns: Whether the transition occurred. + func attemptToTransitionTo(_ state: Request.State) -> Bool { + return lock.around { + guard value.state.canTransitionTo(state) else { return false } + + value.state = state + + return true + } + } + + /// Perform a closure while locked with the provided `Request.State`. + /// + /// - Parameter perform: The closure to perform while locked. + func withState(perform: (Request.State) -> Void) { + lock.around { perform(value.state) } + } +} diff --git a/Pods/Alamofire/Source/RedirectHandler.swift b/Pods/Alamofire/Source/RedirectHandler.swift new file mode 100644 index 0000000..b6c069c --- /dev/null +++ b/Pods/Alamofire/Source/RedirectHandler.swift @@ -0,0 +1,95 @@ +// +// RedirectHandler.swift +// +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.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 +// 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. +// + +import Foundation + +/// A type that handles how an HTTP redirect response from a remote server should be redirected to the new request. +public protocol RedirectHandler { + /// Determines how the HTTP redirect response should be redirected to the new request. + /// + /// The `completion` closure should be passed one of three possible options: + /// + /// 1. The new request specified by the redirect (this is the most common use case). + /// 2. A modified version of the new request (you may want to route it somewhere else). + /// 3. A `nil` value to deny the redirect request and return the body of the redirect response. + /// + /// - Parameters: + /// - task: The `URLSessionTask` whose request resulted in a redirect. + /// - request: The `URLRequest` to the new location specified by the redirect response. + /// - response: The `HTTPURLResponse` containing the server's response to the original request. + /// - completion: The closure to execute containing the new `URLRequest`, a modified `URLRequest`, or `nil`. + func task(_ task: URLSessionTask, + willBeRedirectedTo request: URLRequest, + for response: HTTPURLResponse, + completion: @escaping (URLRequest?) -> Void) +} + +// MARK: - + +/// `Redirector` is a convenience `RedirectHandler` making it easy to follow, not follow, or modify a redirect. +public struct Redirector { + /// Defines the behavior of the `Redirector` type. + public enum Behavior { + /// Follow the redirect as defined in the response. + case follow + /// Do not follow the redirect defined in the response. + case doNotFollow + /// Modify the redirect request defined in the response. + case modify((URLSessionTask, URLRequest, HTTPURLResponse) -> URLRequest?) + } + + /// Returns a `Redirector` with a `.follow` `Behavior`. + public static let follow = Redirector(behavior: .follow) + /// Returns a `Redirector` with a `.doNotFollow` `Behavior`. + public static let doNotFollow = Redirector(behavior: .doNotFollow) + + /// The `Behavior` of the `Redirector`. + public let behavior: Behavior + + /// Creates a `Redirector` instance from the `Behavior`. + /// + /// - Parameter behavior: The `Behavior`. + public init(behavior: Behavior) { + self.behavior = behavior + } +} + +// MARK: - + +extension Redirector: RedirectHandler { + public func task(_ task: URLSessionTask, + willBeRedirectedTo request: URLRequest, + for response: HTTPURLResponse, + completion: @escaping (URLRequest?) -> Void) { + switch behavior { + case .follow: + completion(request) + case .doNotFollow: + completion(nil) + case let .modify(closure): + let request = closure(task, request, response) + completion(request) + } + } +} diff --git a/Pods/Alamofire/Source/Request.swift b/Pods/Alamofire/Source/Request.swift new file mode 100644 index 0000000..6398d96 --- /dev/null +++ b/Pods/Alamofire/Source/Request.swift @@ -0,0 +1,1460 @@ +// +// Request.swift +// +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.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 +// 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. +// + +import Foundation + +/// `Request` is the common superclass of all Alamofire request types and provides common state, delegate, and callback +/// handling. +public class Request { + /// State of the `Request`, with managed transitions between states set when calling `resume()`, `suspend()`, or + /// `cancel()` on the `Request`. + public enum State { + /// Initial state of the `Request`. + case initialized + /// `State` set when `resume()` is called. Any tasks created for the `Request` will have `resume()` called on + /// them in this state. + case resumed + /// `State` set when `suspend()` is called. Any tasks created for the `Request` will have `suspend()` called on + /// them in this state. + case suspended + /// `State` set when `cancel()` is called. Any tasks created for the `Request` will have `cancel()` called on + /// them. Unlike `resumed` or `suspended`, once in the `cancelled` state, the `Request` can no longer transition + /// to any other state. + case cancelled + /// `State` set when all response serialization completion closures have been cleared on the `Request` and + /// enqueued on their respective queues. + case finished + + /// Determines whether `self` can be transitioned to the provided `State`. + func canTransitionTo(_ state: State) -> Bool { + switch (self, state) { + case (.initialized, _): + return true + case (_, .initialized), (.cancelled, _), (.finished, _): + return false + case (.resumed, .cancelled), (.suspended, .cancelled), (.resumed, .suspended), (.suspended, .resumed): + return true + case (.suspended, .suspended), (.resumed, .resumed): + return false + case (_, .finished): + return true + } + } + } + + // MARK: - Initial State + + /// `UUID` providing a unique identifier for the `Request`, used in the `Hashable` and `Equatable` conformances. + public let id: UUID + /// The serial queue for all internal async actions. + public let underlyingQueue: DispatchQueue + /// The queue used for all serialization actions. By default it's a serial queue that targets `underlyingQueue`. + public let serializationQueue: DispatchQueue + /// `EventMonitor` used for event callbacks. + public let eventMonitor: EventMonitor? + /// The `Request`'s interceptor. + public let interceptor: RequestInterceptor? + /// The `Request`'s delegate. + public private(set) weak var delegate: RequestDelegate? + + // MARK: - Mutable State + + /// Type encapsulating all mutable state that may need to be accessed from anything other than the `underlyingQueue`. + struct MutableState { + /// State of the `Request`. + var state: State = .initialized + /// `ProgressHandler` and `DispatchQueue` provided for upload progress callbacks. + var uploadProgressHandler: (handler: ProgressHandler, queue: DispatchQueue)? + /// `ProgressHandler` and `DispatchQueue` provided for download progress callbacks. + var downloadProgressHandler: (handler: ProgressHandler, queue: DispatchQueue)? + /// `RedirectHandler` provided for to handle request redirection. + var redirectHandler: RedirectHandler? + /// `CachedResponseHandler` provided to handle response caching. + var cachedResponseHandler: CachedResponseHandler? + /// Closure called when the `Request` is able to create a cURL description of itself. + var cURLHandler: ((String) -> Void)? + /// Response serialization closures that handle response parsing. + var responseSerializers: [() -> Void] = [] + /// Response serialization completion closures executed once all response serializers are complete. + var responseSerializerCompletions: [() -> Void] = [] + /// Whether response serializer processing is finished. + var responseSerializerProcessingFinished = false + /// `URLCredential` used for authentication challenges. + var credential: URLCredential? + /// All `URLRequest`s created by Alamofire on behalf of the `Request`. + var requests: [URLRequest] = [] + /// All `URLSessionTask`s created by Alamofire on behalf of the `Request`. + var tasks: [URLSessionTask] = [] + /// All `URLSessionTaskMetrics` values gathered by Alamofire on behalf of the `Request`. Should correspond + /// exactly the the `tasks` created. + var metrics: [URLSessionTaskMetrics] = [] + /// Number of times any retriers provided retried the `Request`. + var retryCount = 0 + /// Final `AFError` for the `Request`, whether from various internal Alamofire calls or as a result of a `task`. + var error: AFError? + } + + /// Protected `MutableState` value that provides thread-safe access to state values. + fileprivate let protectedMutableState: Protector = Protector(MutableState()) + + /// `State` of the `Request`. + public var state: State { return protectedMutableState.directValue.state } + /// Returns whether `state` is `.initialized`. + public var isInitialized: Bool { return state == .initialized } + /// Returns whether `state is `.resumed`. + public var isResumed: Bool { return state == .resumed } + /// Returns whether `state` is `.suspended`. + public var isSuspended: Bool { return state == .suspended } + /// Returns whether `state` is `.cancelled`. + public var isCancelled: Bool { return state == .cancelled } + /// Returns whether `state` is `.finished`. + public var isFinished: Bool { return state == .finished } + + // MARK: Progress + + /// Closure type executed when monitoring the upload or download progress of a request. + public typealias ProgressHandler = (Progress) -> Void + + /// `Progress` of the upload of the body of the executed `URLRequest`. Reset to `0` if the `Request` is retried. + public let uploadProgress = Progress(totalUnitCount: 0) + /// `Progress` of the download of any response data. Reset to `0` if the `Request` is retried. + public let downloadProgress = Progress(totalUnitCount: 0) + /// `ProgressHandler` called when `uploadProgress` is updated, on the provided `DispatchQueue`. + fileprivate var uploadProgressHandler: (handler: ProgressHandler, queue: DispatchQueue)? { + get { return protectedMutableState.directValue.uploadProgressHandler } + set { protectedMutableState.write { $0.uploadProgressHandler = newValue } } + } + + /// `ProgressHandler` called when `downloadProgress` is updated, on the provided `DispatchQueue`. + fileprivate var downloadProgressHandler: (handler: ProgressHandler, queue: DispatchQueue)? { + get { return protectedMutableState.directValue.downloadProgressHandler } + set { protectedMutableState.write { $0.downloadProgressHandler = newValue } } + } + + // MARK: Redirect Handling + + /// `RedirectHandler` set on the instance. + public private(set) var redirectHandler: RedirectHandler? { + get { return protectedMutableState.directValue.redirectHandler } + set { protectedMutableState.write { $0.redirectHandler = newValue } } + } + + // MARK: Cached Response Handling + + /// `CachedResponseHandler` set on the instance. + public private(set) var cachedResponseHandler: CachedResponseHandler? { + get { return protectedMutableState.directValue.cachedResponseHandler } + set { protectedMutableState.write { $0.cachedResponseHandler = newValue } } + } + + // MARK: URLCredential + + /// `URLCredential` used for authentication challenges. Created by calling one of the `authenticate` methods. + public private(set) var credential: URLCredential? { + get { return protectedMutableState.directValue.credential } + set { protectedMutableState.write { $0.credential = newValue } } + } + + // MARK: Validators + + /// `Validator` callback closures that store the validation calls enqueued. + fileprivate var protectedValidators: Protector<[() -> Void]> = Protector([]) + + // MARK: URLRequests + + /// All `URLRequests` created on behalf of the `Request`, including original and adapted requests. + public var requests: [URLRequest] { return protectedMutableState.directValue.requests } + /// First `URLRequest` created on behalf of the `Request`. May not be the first one actually executed. + public var firstRequest: URLRequest? { return requests.first } + /// Last `URLRequest` created on behalf of the `Request`. + public var lastRequest: URLRequest? { return requests.last } + /// Current `URLRequest` created on behalf of the `Request`. + public var request: URLRequest? { return lastRequest } + + /// `URLRequest`s from all of the `URLSessionTask`s executed on behalf of the `Request`. May be different from + /// `requests` due to `URLSession` manipulation. + public var performedRequests: [URLRequest] { + return protectedMutableState.read { $0.tasks.compactMap { $0.currentRequest } } + } + + // MARK: HTTPURLResponse + + /// `HTTPURLResponse` received from the server, if any. If the `Request` was retried, this is the response of the + /// last `URLSessionTask`. + public var response: HTTPURLResponse? { return lastTask?.response as? HTTPURLResponse } + + // MARK: Tasks + + /// All `URLSessionTask`s created on behalf of the `Request`. + public var tasks: [URLSessionTask] { return protectedMutableState.directValue.tasks } + /// First `URLSessionTask` created on behalf of the `Request`. + public var firstTask: URLSessionTask? { return tasks.first } + /// Last `URLSessionTask` crated on behalf of the `Request`. + public var lastTask: URLSessionTask? { return tasks.last } + /// Current `URLSessionTask` created on behalf of the `Request`. + public var task: URLSessionTask? { return lastTask } + + // MARK: Metrics + + /// All `URLSessionTaskMetrics` gathered on behalf of the `Request`. Should correspond to the `tasks` created. + public var allMetrics: [URLSessionTaskMetrics] { return protectedMutableState.directValue.metrics } + /// First `URLSessionTaskMetrics` gathered on behalf of the `Request`. + public var firstMetrics: URLSessionTaskMetrics? { return allMetrics.first } + /// Last `URLSessionTaskMetrics` gathered on behalf of the `Request`. + public var lastMetrics: URLSessionTaskMetrics? { return allMetrics.last } + /// Current `URLSessionTaskMetrics` gathered on behalf of the `Request`. + public var metrics: URLSessionTaskMetrics? { return lastMetrics } + + // MARK: Retry Count + + /// Number of times the `Request` has been retried. + public var retryCount: Int { return protectedMutableState.directValue.retryCount } + + // MARK: Error + + /// `Error` returned from Alamofire internally, from the network request directly, or any validators executed. + public fileprivate(set) var error: AFError? { + get { return protectedMutableState.directValue.error } + set { protectedMutableState.write { $0.error = newValue } } + } + + /// Default initializer for the `Request` superclass. + /// + /// - Parameters: + /// - id: `UUID` used for the `Hashable` and `Equatable` implementations. `UUID()` by default. + /// - underlyingQueue: `DispatchQueue` on which all internal `Request` work is performed. + /// - serializationQueue: `DispatchQueue` on which all serialization work is performed. By default targets + /// `underlyingQueue`, but can be passed another queue from a `Session`. + /// - eventMonitor: `EventMonitor` called for event callbacks from internal `Request` actions. + /// - interceptor: `RequestInterceptor` used throughout the request lifecycle. + /// - delegate: `RequestDelegate` that provides an interface to actions not performed by the `Request`. + init(id: UUID = UUID(), + underlyingQueue: DispatchQueue, + serializationQueue: DispatchQueue, + eventMonitor: EventMonitor?, + interceptor: RequestInterceptor?, + delegate: RequestDelegate) { + self.id = id + self.underlyingQueue = underlyingQueue + self.serializationQueue = serializationQueue + self.eventMonitor = eventMonitor + self.interceptor = interceptor + self.delegate = delegate + } + + // MARK: - Internal Event API + + // All API must be called from underlyingQueue. + + /// Called when an initial `URLRequest` has been created on behalf of the instance. If a `RequestAdapter` is active, + /// the `URLRequest` will be adapted before being issued. + /// + /// - Parameter request: The `URLRequest` created. + func didCreateInitialURLRequest(_ request: URLRequest) { + protectedMutableState.write { $0.requests.append(request) } + + eventMonitor?.request(self, didCreateInitialURLRequest: request) + } + + /// Called when initial `URLRequest` creation has failed, typically through a `URLRequestConvertible`. + /// + /// - Note: Triggers retry. + /// + /// - Parameter error: `AFError` thrown from the failed creation. + func didFailToCreateURLRequest(with error: AFError) { + self.error = error + + eventMonitor?.request(self, didFailToCreateURLRequestWithError: error) + + callCURLHandlerIfNecessary() + + retryOrFinish(error: error) + } + + /// Called when a `RequestAdapter` has successfully adapted a `URLRequest`. + /// + /// - Parameters: + /// - initialRequest: The `URLRequest` that was adapted. + /// - adaptedRequest: The `URLRequest` returned by the `RequestAdapter`. + func didAdaptInitialRequest(_ initialRequest: URLRequest, to adaptedRequest: URLRequest) { + protectedMutableState.write { $0.requests.append(adaptedRequest) } + + eventMonitor?.request(self, didAdaptInitialRequest: initialRequest, to: adaptedRequest) + } + + /// Called when a `RequestAdapter` fails to adapt a `URLRequest`. + /// + /// - Note: Triggers retry. + /// + /// - Parameters: + /// - request: The `URLRequest` the adapter was called with. + /// - error: The `AFError` returned by the `RequestAdapter`. + func didFailToAdaptURLRequest(_ request: URLRequest, withError error: AFError) { + self.error = error + + eventMonitor?.request(self, didFailToAdaptURLRequest: request, withError: error) + + callCURLHandlerIfNecessary() + + retryOrFinish(error: error) + } + + /// Final `URLRequest` has been created for the instance. + /// + /// - Parameter request: The `URLRequest` created. + func didCreateURLRequest(_ request: URLRequest) { + eventMonitor?.request(self, didCreateURLRequest: request) + + callCURLHandlerIfNecessary() + } + + /// Asynchronously calls any stored `cURLHandler` and then removes it from `mutableState`. + private func callCURLHandlerIfNecessary() { + protectedMutableState.write { mutableState in + guard let cURLHandler = mutableState.cURLHandler else { return } + + self.underlyingQueue.async { cURLHandler(self.cURLDescription()) } + mutableState.cURLHandler = nil + } + } + + /// Called when a `URLSessionTask` is created on behalf of the instance. + /// + /// - Parameter task: The `URLSessionTask` created. + func didCreateTask(_ task: URLSessionTask) { + protectedMutableState.write { $0.tasks.append(task) } + + eventMonitor?.request(self, didCreateTask: task) + } + + /// Called when resumption is completed. + func didResume() { + eventMonitor?.requestDidResume(self) + } + + /// Called when a `URLSessionTask` is resumed on behalf of the instance. + /// + /// - Parameter task: The `URLSessionTask` resumed. + func didResumeTask(_ task: URLSessionTask) { + eventMonitor?.request(self, didResumeTask: task) + } + + /// Called when suspension is completed. + func didSuspend() { + eventMonitor?.requestDidSuspend(self) + } + + /// Called when a `URLSessionTask` is suspended on behalf of the instance. + /// + /// - Parameter task: The `URLSessionTask` suspended. + func didSuspendTask(_ task: URLSessionTask) { + eventMonitor?.request(self, didSuspendTask: task) + } + + /// Called when cancellation is completed, sets `error` to `AFError.explicitlyCancelled`. + func didCancel() { + error = AFError.explicitlyCancelled + + eventMonitor?.requestDidCancel(self) + } + + /// Called when a `URLSessionTask` is cancelled on behalf of the instance. + /// + /// - Parameter task: The `URLSessionTask` cancelled. + func didCancelTask(_ task: URLSessionTask) { + eventMonitor?.request(self, didCancelTask: task) + } + + /// Called when a `URLSessionTaskMetrics` value is gathered on behalf of the instance. + /// + /// - Parameter metrics: The `URLSessionTaskMetrics` gathered. + func didGatherMetrics(_ metrics: URLSessionTaskMetrics) { + protectedMutableState.write { $0.metrics.append(metrics) } + + eventMonitor?.request(self, didGatherMetrics: metrics) + } + + /// Called when a `URLSessionTask` fails before it is finished, typically during certificate pinning. + /// + /// - Parameters: + /// - task: The `URLSessionTask` which failed. + /// - error: The early failure `AFError`. + func didFailTask(_ task: URLSessionTask, earlyWithError error: AFError) { + self.error = error + + // Task will still complete, so didCompleteTask(_:with:) will handle retry. + eventMonitor?.request(self, didFailTask: task, earlyWithError: error) + } + + /// Called when a `URLSessionTask` completes. All tasks will eventually call this method. + /// + /// - Note: Response validation is synchronously triggered in this step. + /// + /// - Parameters: + /// - task: The `URLSessionTask` which completed. + /// - error: The `AFError` `task` may have completed with. If `error` has already been set on the instance, this + /// value is ignored. + func didCompleteTask(_ task: URLSessionTask, with error: AFError?) { + self.error = self.error ?? error + protectedValidators.directValue.forEach { $0() } + + eventMonitor?.request(self, didCompleteTask: task, with: error) + + retryOrFinish(error: self.error) + } + + /// Called when the `RequestDelegate` is going to retry this `Request`. Calls `reset()`. + func prepareForRetry() { + protectedMutableState.write { $0.retryCount += 1 } + + reset() + + eventMonitor?.requestIsRetrying(self) + } + + /// Called to determine whether retry will be triggered for the particular error, or whether the instance should + /// call `finish()`. + /// + /// - Parameter error: The possible `AFError` which may trigger retry. + func retryOrFinish(error: AFError?) { + guard let error = error, let delegate = delegate else { finish(); return } + + delegate.retryResult(for: self, dueTo: error) { retryResult in + switch retryResult { + case .doNotRetry: + self.finish() + case let .doNotRetryWithError(retryError): + self.finish(error: retryError.asAFError(orFailWith: "Received retryError was not already AFError")) + case .retry, .retryWithDelay: + delegate.retryRequest(self, withDelay: retryResult.delay) + } + } + } + + /// Finishes this `Request` and starts the response serializers. + /// + /// - Parameter error: The possible `Error` with which the instance will finish. + func finish(error: AFError? = nil) { + if let error = error { self.error = error } + + // Start response handlers + processNextResponseSerializer() + + eventMonitor?.requestDidFinish(self) + } + + /// Appends the response serialization closure to the instance. + /// + /// - Note: This method will also `resume` the instance if `delegate.startImmediately` returns `true`. + /// + /// - Parameter closure: The closure containing the response serialization call. + func appendResponseSerializer(_ closure: @escaping () -> Void) { + protectedMutableState.write { mutableState in + mutableState.responseSerializers.append(closure) + + if mutableState.state == .finished { + mutableState.state = .resumed + } + + if mutableState.responseSerializerProcessingFinished { + underlyingQueue.async { self.processNextResponseSerializer() } + } + + if mutableState.state.canTransitionTo(.resumed) { + underlyingQueue.async { if self.delegate?.startImmediately == true { self.resume() } } + } + } + } + + /// Returns the next response serializer closure to execute if there's one left. + /// + /// - Returns: The next response serialization closure, if there is one. + func nextResponseSerializer() -> (() -> Void)? { + var responseSerializer: (() -> Void)? + + protectedMutableState.write { mutableState in + let responseSerializerIndex = mutableState.responseSerializerCompletions.count + + if responseSerializerIndex < mutableState.responseSerializers.count { + responseSerializer = mutableState.responseSerializers[responseSerializerIndex] + } + } + + return responseSerializer + } + + /// Processes the next response serializer and calls all completions if response serialization is complete. + func processNextResponseSerializer() { + guard let responseSerializer = nextResponseSerializer() else { + // Execute all response serializer completions and clear them + var completions: [() -> Void] = [] + + protectedMutableState.write { mutableState in + completions = mutableState.responseSerializerCompletions + + // Clear out all response serializers and response serializer completions in mutable state since the + // request is complete. It's important to do this prior to calling the completion closures in case + // the completions call back into the request triggering a re-processing of the response serializers. + // An example of how this can happen is by calling cancel inside a response completion closure. + mutableState.responseSerializers.removeAll() + mutableState.responseSerializerCompletions.removeAll() + + if mutableState.state.canTransitionTo(.finished) { + mutableState.state = .finished + } + + mutableState.responseSerializerProcessingFinished = true + } + + completions.forEach { $0() } + + // Cleanup the request + cleanup() + + return + } + + serializationQueue.async { responseSerializer() } + } + + /// Notifies the `Request` that the response serializer is complete. + /// + /// - Parameter completion: The completion handler provided with the response serializer, called when all serializers + /// are complete. + func responseSerializerDidComplete(completion: @escaping () -> Void) { + protectedMutableState.write { $0.responseSerializerCompletions.append(completion) } + processNextResponseSerializer() + } + + /// Resets all task and response serializer related state for retry. + func reset() { + error = nil + + uploadProgress.totalUnitCount = 0 + uploadProgress.completedUnitCount = 0 + downloadProgress.totalUnitCount = 0 + downloadProgress.completedUnitCount = 0 + + protectedMutableState.write { $0.responseSerializerCompletions = [] } + } + + /// Called when updating the upload progress. + /// + /// - Parameters: + /// - totalBytesSent: Total bytes sent so far. + /// - totalBytesExpectedToSend: Total bytes expected to send. + func updateUploadProgress(totalBytesSent: Int64, totalBytesExpectedToSend: Int64) { + uploadProgress.totalUnitCount = totalBytesExpectedToSend + uploadProgress.completedUnitCount = totalBytesSent + + uploadProgressHandler?.queue.async { self.uploadProgressHandler?.handler(self.uploadProgress) } + } + + /// Perform a closure on the current `state` while locked. + /// + /// - Parameter perform: The closure to perform. + func withState(perform: (State) -> Void) { + protectedMutableState.withState(perform: perform) + } + + // MARK: Task Creation + + /// Called when creating a `URLSessionTask` for this `Request`. Subclasses must override. + /// + /// - Parameters: + /// - request: `URLRequest` to use to create the `URLSessionTask`. + /// - session: `URLSession` which creates the `URLSessionTask`. + /// + /// - Returns: The `URLSessionTask` created. + func task(for request: URLRequest, using session: URLSession) -> URLSessionTask { + fatalError("Subclasses must override.") + } + + // MARK: - Public API + + // These APIs are callable from any queue. + + // MARK: State + + /// Cancels the instance. Once cancelled, a `Request` can no longer be resumed or suspended. + /// + /// - Returns: The instance. + @discardableResult + public func cancel() -> Self { + protectedMutableState.write { mutableState in + guard mutableState.state.canTransitionTo(.cancelled) else { return } + + mutableState.state = .cancelled + + underlyingQueue.async { self.didCancel() } + + guard let task = mutableState.tasks.last, task.state != .completed else { + underlyingQueue.async { self.finish() } + return + } + + // Resume to ensure metrics are gathered. + task.resume() + task.cancel() + underlyingQueue.async { self.didCancelTask(task) } + } + + return self + } + + /// Suspends the instance. + /// + /// - Returns: The instance. + @discardableResult + public func suspend() -> Self { + protectedMutableState.write { mutableState in + guard mutableState.state.canTransitionTo(.suspended) else { return } + + mutableState.state = .suspended + + underlyingQueue.async { self.didSuspend() } + + guard let task = mutableState.tasks.last, task.state != .completed else { return } + + task.suspend() + underlyingQueue.async { self.didSuspendTask(task) } + } + + return self + } + + /// Resumes the instance. + /// + /// - Returns: The instance. + @discardableResult + public func resume() -> Self { + protectedMutableState.write { mutableState in + guard mutableState.state.canTransitionTo(.resumed) else { return } + + mutableState.state = .resumed + + underlyingQueue.async { self.didResume() } + + guard let task = mutableState.tasks.last, task.state != .completed else { return } + + task.resume() + underlyingQueue.async { self.didResumeTask(task) } + } + + return self + } + + // MARK: - Closure API + + /// Associates a credential using the provided values with the instance. + /// + /// - Parameters: + /// - username: The username. + /// - password: The password. + /// - persistence: The `URLCredential.Persistence` for the created `URLCredential`. `.forSession` by default. + /// + /// - Returns: The instance. + @discardableResult + public func authenticate(username: String, password: String, persistence: URLCredential.Persistence = .forSession) -> Self { + let credential = URLCredential(user: username, password: password, persistence: persistence) + + return authenticate(with: credential) + } + + /// Associates the provided credential with the instance. + /// + /// - Parameter credential: The `URLCredential`. + /// + /// - Returns: The instance. + @discardableResult + public func authenticate(with credential: URLCredential) -> Self { + protectedMutableState.write { $0.credential = credential } + + return self + } + + /// Sets a closure to be called periodically during the lifecycle of the instance as data is read from the server. + /// + /// - Note: Only the last closure provided is used. + /// + /// - Parameters: + /// - queue: The `DispatchQueue` to execute the closure on. `.main` by default. + /// - closure: The closure to be executed periodically as data is read from the server. + /// + /// - Returns: The instance. + @discardableResult + public func downloadProgress(queue: DispatchQueue = .main, closure: @escaping ProgressHandler) -> Self { + protectedMutableState.write { $0.downloadProgressHandler = (handler: closure, queue: queue) } + + return self + } + + /// Sets a closure to be called periodically during the lifecycle of the instance as data is sent to the server. + /// + /// - Note: Only the last closure provided is used. + /// + /// - Parameters: + /// - queue: The `DispatchQueue` to execute the closure on. `.main` by default. + /// - closure: The closure to be executed periodically as data is sent to the server. + /// + /// - Returns: The instance. + @discardableResult + public func uploadProgress(queue: DispatchQueue = .main, closure: @escaping ProgressHandler) -> Self { + protectedMutableState.write { $0.uploadProgressHandler = (handler: closure, queue: queue) } + + return self + } + + // MARK: Redirects + + /// Sets the redirect handler for the instance which will be used if a redirect response is encountered. + /// + /// - Note: Attempting to set the redirect handler more than once is a logic error and will crash. + /// + /// - Parameter handler: The `RedirectHandler`. + /// + /// - Returns: The instance. + @discardableResult + public func redirect(using handler: RedirectHandler) -> Self { + protectedMutableState.write { mutableState in + precondition(mutableState.redirectHandler == nil, "Redirect handler has already been set.") + mutableState.redirectHandler = handler + } + + return self + } + + // MARK: Cached Responses + + /// Sets the cached response handler for the `Request` which will be used when attempting to cache a response. + /// + /// - Note: Attempting to set the cache handler more than once is a logic error and will crash. + /// + /// - Parameter handler: The `CachedResponseHandler`. + /// + /// - Returns: The instance. + @discardableResult + public func cacheResponse(using handler: CachedResponseHandler) -> Self { + protectedMutableState.write { mutableState in + precondition(mutableState.cachedResponseHandler == nil, "Cached response handler has already been set.") + mutableState.cachedResponseHandler = handler + } + + return self + } + + /// Sets a handler to be called when the cURL description of the request is available. + /// + /// - Note: When waiting for a `Request`'s `URLRequest` to be created, only the last `handler` will be called. + /// + /// - Parameter handler: Closure to be called when the cURL description is available. + /// + /// - Returns: The instance. + @discardableResult + public func cURLDescription(calling handler: @escaping (String) -> Void) -> Self { + protectedMutableState.write { mutableState in + if mutableState.requests.last != nil { + underlyingQueue.async { handler(self.cURLDescription()) } + } else { + mutableState.cURLHandler = handler + } + } + + return self + } + + // MARK: Cleanup + + /// Final cleanup step executed when the instance finishes response serialization. + func cleanup() { + delegate?.cleanup(after: self) + // No-op: override in subclass + } +} + +// MARK: - Protocol Conformances + +extension Request: Equatable { + public static func ==(lhs: Request, rhs: Request) -> Bool { + return lhs.id == rhs.id + } +} + +extension Request: Hashable { + public func hash(into hasher: inout Hasher) { + hasher.combine(id) + } +} + +extension Request: CustomStringConvertible { + /// A textual representation of this instance, including the `HTTPMethod` and `URL` if the `URLRequest` has been + /// created, as well as the response status code, if a response has been received. + public var description: String { + guard let request = performedRequests.last ?? lastRequest, + let url = request.url, + let method = request.httpMethod else { return "No request created yet." } + + let requestDescription = "\(method) \(url.absoluteString)" + + return response.map { "\(requestDescription) (\($0.statusCode))" } ?? requestDescription + } +} + +extension Request { + /// cURL representation of the instance. + /// + /// - Returns: The cURL equivalent of the instance. + public func cURLDescription() -> String { + guard + let request = lastRequest, + let url = request.url, + let host = url.host, + let method = request.httpMethod else { return "$ curl command could not be created" } + + var components = ["$ curl -v"] + + components.append("-X \(method)") + + if let credentialStorage = delegate?.sessionConfiguration.urlCredentialStorage { + let protectionSpace = URLProtectionSpace(host: host, + port: url.port ?? 0, + protocol: url.scheme, + realm: host, + authenticationMethod: NSURLAuthenticationMethodHTTPBasic) + + if let credentials = credentialStorage.credentials(for: protectionSpace)?.values { + for credential in credentials { + guard let user = credential.user, let password = credential.password else { continue } + components.append("-u \(user):\(password)") + } + } else { + if let credential = credential, let user = credential.user, let password = credential.password { + components.append("-u \(user):\(password)") + } + } + } + + if let configuration = delegate?.sessionConfiguration, configuration.httpShouldSetCookies { + if + let cookieStorage = configuration.httpCookieStorage, + let cookies = cookieStorage.cookies(for: url), !cookies.isEmpty { + let allCookies = cookies.map { "\($0.name)=\($0.value)" }.joined(separator: ";") + + components.append("-b \"\(allCookies)\"") + } + } + + var headers = HTTPHeaders() + + if let sessionHeaders = delegate?.sessionConfiguration.headers { + for header in sessionHeaders where header.name != "Cookie" { + headers[header.name] = header.value + } + } + + for header in request.headers where header.name != "Cookie" { + headers[header.name] = header.value + } + + for header in headers { + let escapedValue = header.value.replacingOccurrences(of: "\"", with: "\\\"") + components.append("-H \"\(header.name): \(escapedValue)\"") + } + + if let httpBodyData = request.httpBody { + let httpBody = String(decoding: httpBodyData, as: UTF8.self) + var escapedBody = httpBody.replacingOccurrences(of: "\\\"", with: "\\\\\"") + escapedBody = escapedBody.replacingOccurrences(of: "\"", with: "\\\"") + + components.append("-d \"\(escapedBody)\"") + } + + components.append("\"\(url.absoluteString)\"") + + return components.joined(separator: " \\\n\t") + } +} + +/// Protocol abstraction for `Request`'s communication back to the `SessionDelegate`. +public protocol RequestDelegate: AnyObject { + /// `URLSessionConfiguration` used to create the underlying `URLSessionTask`s. + var sessionConfiguration: URLSessionConfiguration { get } + + /// Determines whether the `Request` should automatically call `resume()` when adding the first response handler. + var startImmediately: Bool { get } + + /// Notifies the delegate the `Request` has reached a point where it needs cleanup. + /// + /// - Parameter request: The `Request` to cleanup after. + func cleanup(after request: Request) + + /// Asynchronously ask the delegate whether a `Request` will be retried. + /// + /// - Parameters: + /// - request: `Request` which failed. + /// - error: `Error` which produced the failure. + /// - completion: Closure taking the `RetryResult` for evaluation. + func retryResult(for request: Request, dueTo error: AFError, completion: @escaping (RetryResult) -> Void) + + /// Asynchronously retry the `Request`. + /// + /// - Parameters: + /// - request: `Request` which will be retried. + /// - timeDelay: `TimeInterval` after which the retry will be triggered. + func retryRequest(_ request: Request, withDelay timeDelay: TimeInterval?) +} + +// MARK: - Subclasses + +// MARK: - DataRequest + +/// `Request` subclass which handles in-memory `Data` download using `URLSessionDataTask`. +public class DataRequest: Request { + /// `URLRequestConvertible` value used to create `URLRequest`s for this instance. + public let convertible: URLRequestConvertible + /// `Data` read from the server so far. + public var data: Data? { return protectedData.directValue } + + /// Protected storage for the `Data` read by the instance. + private var protectedData: Protector = Protector(nil) + + /// Creates a `DataRequest` using the provided parameters. + /// + /// - Parameters: + /// - id: `UUID` used for the `Hashable` and `Equatable` implementations. `UUID()` by default. + /// - convertible: `URLRequestConvertible` value used to create `URLRequest`s for this instance. + /// - underlyingQueue: `DispatchQueue` on which all internal `Request` work is performed. + /// - serializationQueue: `DispatchQueue` on which all serialization work is performed. By default targets + /// `underlyingQueue`, but can be passed another queue from a `Session`. + /// - eventMonitor: `EventMonitor` called for event callbacks from internal `Request` actions. + /// - interceptor: `RequestInterceptor` used throughout the request lifecycle. + /// - delegate: `RequestDelegate` that provides an interface to actions not performed by the `Request`. + init(id: UUID = UUID(), + convertible: URLRequestConvertible, + underlyingQueue: DispatchQueue, + serializationQueue: DispatchQueue, + eventMonitor: EventMonitor?, + interceptor: RequestInterceptor?, + delegate: RequestDelegate) { + self.convertible = convertible + + super.init(id: id, + underlyingQueue: underlyingQueue, + serializationQueue: serializationQueue, + eventMonitor: eventMonitor, + interceptor: interceptor, + delegate: delegate) + } + + override func reset() { + super.reset() + + protectedData.directValue = nil + } + + /// Called when `Data` is received by this instance. + /// + /// - Note: Also calls `updateDownloadProgress`. + /// + /// - Parameter data: The `Data` received. + func didReceive(data: Data) { + if self.data == nil { + protectedData.directValue = data + } else { + protectedData.append(data) + } + + updateDownloadProgress() + } + + override func task(for request: URLRequest, using session: URLSession) -> URLSessionTask { + let copiedRequest = request + return session.dataTask(with: copiedRequest) + } + + /// Called to updated the `downloadProgress` of the instance. + func updateDownloadProgress() { + let totalBytesReceived = Int64(data?.count ?? 0) + let totalBytesExpected = task?.response?.expectedContentLength ?? NSURLSessionTransferSizeUnknown + + downloadProgress.totalUnitCount = totalBytesExpected + downloadProgress.completedUnitCount = totalBytesReceived + + downloadProgressHandler?.queue.async { self.downloadProgressHandler?.handler(self.downloadProgress) } + } + + /// Validates the request, using the specified closure. + /// + /// - Note: If validation fails, subsequent calls to response handlers will have an associated error. + /// + /// - Parameter validation: `Validation` closure used to validate the response. + /// + /// - Returns: The instance. + @discardableResult + public func validate(_ validation: @escaping Validation) -> Self { + let validator: () -> Void = { [unowned self] in + guard self.error == nil, let response = self.response else { return } + + let result = validation(self.request, response, self.data) + + if case let .failure(error) = result { self.error = error.asAFError(or: .responseValidationFailed(reason: .customValidationFailed(error: error))) } + + self.eventMonitor?.request(self, + didValidateRequest: self.request, + response: response, + data: self.data, + withResult: result) + } + + protectedValidators.append(validator) + + return self + } +} + +// MARK: - DownloadRequest + +/// `Request` subclass which downloads `Data` to a file on disk using `URLSessionDownloadTask`. +public class DownloadRequest: Request { + /// A set of options to be executed prior to moving a downloaded file from the temporary `URL` to the destination + /// `URL`. + public struct Options: OptionSet { + /// Specifies that intermediate directories for the destination URL should be created. + public static let createIntermediateDirectories = Options(rawValue: 1 << 0) + /// Specifies that any previous file at the destination `URL` should be removed. + public static let removePreviousFile = Options(rawValue: 1 << 1) + + public let rawValue: Int + + public init(rawValue: Int) { + self.rawValue = rawValue + } + } + + // MARK: Destination + + /// A closure executed once a `DownloadRequest` has successfully completed in order to determine where to move the + /// temporary file written to during the download process. The closure takes two arguments: the temporary file URL + /// and the URL response, and returns a two arguments: the file URL where the temporary file should be moved and + /// the options defining how the file should be moved. + public typealias Destination = (_ temporaryURL: URL, + _ response: HTTPURLResponse) -> (destinationURL: URL, options: Options) + + /// Creates a download file destination closure which uses the default file manager to move the temporary file to a + /// file URL in the first available directory with the specified search path directory and search path domain mask. + /// + /// - Parameters: + /// - directory: The search path directory. `.documentDirectory` by default. + /// - domain: The search path domain mask. `.userDomainMask` by default. + /// - options: `DownloadRequest.Options` used when moving the downloaded file to its destination. None by + /// default. + /// - Returns: The `Destination` closure. + public class func suggestedDownloadDestination(for directory: FileManager.SearchPathDirectory = .documentDirectory, + in domain: FileManager.SearchPathDomainMask = .userDomainMask, + options: Options = []) -> Destination { + return { temporaryURL, response in + let directoryURLs = FileManager.default.urls(for: directory, in: domain) + let url = directoryURLs.first?.appendingPathComponent(response.suggestedFilename!) ?? temporaryURL + + return (url, options) + } + } + + /// Default `Destination` used by Alamofire to ensure all downloads persist. This `Destination` prepends + /// `Alamofire_` to the automatically generated download name and moves it within the temporary directory. Files + /// with this destination must be additionally moved if they should survive the system reclamation of temporary + /// space. + static let defaultDestination: Destination = { url, _ in + let filename = "Alamofire_\(url.lastPathComponent)" + let destination = url.deletingLastPathComponent().appendingPathComponent(filename) + + return (destination, []) + } + + // MARK: Downloadable + + /// Type describing the source used to create the underlying `URLSessionDownloadTask`. + public enum Downloadable { + /// Download should be started from the `URLRequest` produced by the associated `URLRequestConvertible` value. + case request(URLRequestConvertible) + /// Download should be started from the associated resume `Data` value. + case resumeData(Data) + } + + // MARK: Mutable State + + /// Type containing all mutable state for `DownloadRequest` instances. + private struct DownloadRequestMutableState { + /// Possible resume `Data` produced when cancelling the instance. + var resumeData: Data? + /// `URL` to which `Data` is being downloaded. + var fileURL: URL? + } + + /// Protected mutable state specific to `DownloadRequest`. + private let protectedDownloadMutableState: Protector = Protector(DownloadRequestMutableState()) + + /// If the download is resumable and eventually cancelled, this value may be used to resume the download using the + /// `download(resumingWith data:)` API. + /// + /// - Note: For more information about `resumeData`, see [Apple's documentation](https://developer.apple.com/documentation/foundation/urlsessiondownloadtask/1411634-cancel). + public var resumeData: Data? { return protectedDownloadMutableState.directValue.resumeData } + /// If the download is successful, the `URL` where the file was downloaded. + public var fileURL: URL? { return protectedDownloadMutableState.directValue.fileURL } + + // MARK: Initial State + + /// `Downloadable` value used for this instance. + public let downloadable: Downloadable + /// The `Destination` to which the downloaded file is moved. + let destination: Destination + + /// Creates a `DownloadRequest` using the provided parameters. + /// + /// - Parameters: + /// - id: `UUID` used for the `Hashable` and `Equatable` implementations. `UUID()` by default. + /// - downloadable: `Downloadable` value used to create `URLSessionDownloadTasks` for the instance. + /// - underlyingQueue: `DispatchQueue` on which all internal `Request` work is performed. + /// - serializationQueue: `DispatchQueue` on which all serialization work is performed. By default targets + /// `underlyingQueue`, but can be passed another queue from a `Session`. + /// - eventMonitor: `EventMonitor` called for event callbacks from internal `Request` actions. + /// - interceptor: `RequestInterceptor` used throughout the request lifecycle. + /// - delegate: `RequestDelegate` that provides an interface to actions not performed by the `Request` + /// - destination: `Destination` closure used to move the downloaded file to its final location. + init(id: UUID = UUID(), + downloadable: Downloadable, + underlyingQueue: DispatchQueue, + serializationQueue: DispatchQueue, + eventMonitor: EventMonitor?, + interceptor: RequestInterceptor?, + delegate: RequestDelegate, + destination: @escaping Destination) { + self.downloadable = downloadable + self.destination = destination + + super.init(id: id, + underlyingQueue: underlyingQueue, + serializationQueue: serializationQueue, + eventMonitor: eventMonitor, + interceptor: interceptor, + delegate: delegate) + } + + override func reset() { + super.reset() + + protectedDownloadMutableState.write { + $0.resumeData = nil + $0.fileURL = nil + } + } + + /// Called when a download has finished. + /// + /// - Parameters: + /// - task: `URLSessionTask` that finished the download. + /// - result: `Result` of the automatic move to `destination`. + func didFinishDownloading(using task: URLSessionTask, with result: Result) { + eventMonitor?.request(self, didFinishDownloadingUsing: task, with: result) + + switch result { + case let .success(url): protectedDownloadMutableState.write { $0.fileURL = url } + case let .failure(error): self.error = error + } + } + + /// Updates the `downloadProgress` using the provided values. + /// + /// - Parameters: + /// - bytesWritten: Total bytes written so far. + /// - totalBytesExpectedToWrite: Total bytes expected to write. + func updateDownloadProgress(bytesWritten: Int64, totalBytesExpectedToWrite: Int64) { + downloadProgress.totalUnitCount = totalBytesExpectedToWrite + downloadProgress.completedUnitCount += bytesWritten + + downloadProgressHandler?.queue.async { self.downloadProgressHandler?.handler(self.downloadProgress) } + } + + override func task(for request: URLRequest, using session: URLSession) -> URLSessionTask { + return session.downloadTask(with: request) + } + + /// Creates a `URLSessionTask` from the provided resume data. + /// + /// - Parameters: + /// - data: `Data` used to resume the download. + /// - session: `URLSession` used to create the `URLSessionTask`. + /// + /// - Returns: The `URLSessionTask` created. + public func task(forResumeData data: Data, using session: URLSession) -> URLSessionTask { + return session.downloadTask(withResumeData: data) + } + + /// Cancels the instance. Once cancelled, a `DownloadRequest` can no longer be resumed or suspended. + /// + /// - Note: This method will NOT produce resume data. If you wish to cancel and produce resume data, use + /// `cancel(producingResumeData:)` or `cancel(byProducingResumeData:)`. + /// + /// - Returns: The instance. + @discardableResult + public override func cancel() -> Self { + return cancel(producingResumeData: false) + } + + /// Cancels the instance, optionally producing resume data. Once cancelled, a `DownloadRequest` can no longer be + /// resumed or suspended. + /// + /// - Note: If `producingResumeData` is `true`, the `resumeData` property will be populated with any resume data, if + /// available. + /// + /// - Returns: The instance. + @discardableResult + public func cancel(producingResumeData shouldProduceResumeData: Bool) -> Self { + return cancel(optionallyProducingResumeData: shouldProduceResumeData ? { _ in } : nil) + } + + /// Cancels the instance while producing resume data. Once cancelled, a `DownloadRequest` can no longer be resumed + /// or suspended. + /// + /// - Note: The resume data passed to the completion handler will also be available on the instance's `resumeData` + /// property. + /// + /// - Parameter completionHandler: The completion handler that is called when the download has been successfully + /// cancelled. It is not guaranteed to be called on a particular queue, so you may + /// want use an appropriate queue to perform your work. + /// + /// - Returns: The instance. + @discardableResult + public func cancel(byProducingResumeData completionHandler: @escaping (_ data: Data?) -> Void) -> Self { + return cancel(optionallyProducingResumeData: completionHandler) + } + + /// Internal implementation of cancellation that optionally takes a resume data handler. If no handler is passed, + /// cancellation is performed without producing resume data. + /// + /// - Parameter completionHandler: Optional resume data handler. + /// + /// - Returns: The instance. + private func cancel(optionallyProducingResumeData completionHandler: ((_ resumeData: Data?) -> Void)?) -> Self { + protectedMutableState.write { mutableState in + guard mutableState.state.canTransitionTo(.cancelled) else { return } + + mutableState.state = .cancelled + + underlyingQueue.async { self.didCancel() } + + guard let task = mutableState.tasks.last as? URLSessionDownloadTask, task.state != .completed else { + underlyingQueue.async { self.finish() } + return + } + + if let completionHandler = completionHandler { + // Resume to ensure metrics are gathered. + task.resume() + task.cancel { resumeData in + self.protectedDownloadMutableState.write { $0.resumeData = resumeData } + self.underlyingQueue.async { self.didCancelTask(task) } + completionHandler(resumeData) + } + } else { + // Resume to ensure metrics are gathered. + task.resume() + task.cancel() + self.underlyingQueue.async { self.didCancelTask(task) } + } + } + + return self + } + + /// Validates the request, using the specified closure. + /// + /// - Note: If validation fails, subsequent calls to response handlers will have an associated error. + /// + /// - Parameter validation: `Validation` closure to validate the response. + /// + /// - Returns: The instance. + @discardableResult + public func validate(_ validation: @escaping Validation) -> Self { + let validator: () -> Void = { [unowned self] in + guard self.error == nil, let response = self.response else { return } + + let result = validation(self.request, response, self.fileURL) + + if case let .failure(error) = result { self.error = error.asAFError(or: .responseValidationFailed(reason: .customValidationFailed(error: error))) } + + self.eventMonitor?.request(self, + didValidateRequest: self.request, + response: response, + fileURL: self.fileURL, + withResult: result) + } + + protectedValidators.append(validator) + + return self + } +} + +// MARK: - UploadRequest + +/// `DataRequest` subclass which handles `Data` upload from memory, file, or stream using `URLSessionUploadTask`. +public class UploadRequest: DataRequest { + /// Type describing the origin of the upload, whether `Data`, file, or stream. + public enum Uploadable { + /// Upload from the provided `Data` value. + case data(Data) + /// Upload from the provided file `URL`, as well as a `Bool` determining whether the source file should be + /// automatically removed once uploaded. + case file(URL, shouldRemove: Bool) + /// Upload from the provided `InputStream`. + case stream(InputStream) + } + + // MARK: Initial State + + /// The `UploadableConvertible` value used to produce the `Uploadable` value for this instance. + public let upload: UploadableConvertible + + /// `FileManager` used to perform cleanup tasks, including the removal of multipart form encoded payloads written + /// to disk. + public let fileManager: FileManager + + // MARK: Mutable State + + /// `Uploadable` value used by the instance. + public var uploadable: Uploadable? + + /// Creates an `UploadRequest` using the provided parameters. + /// + /// - Parameters: + /// - id: `UUID` used for the `Hashable` and `Equatable` implementations. `UUID()` by default. + /// - convertible: `UploadConvertible` value used to determine the type of upload to be performed. + /// - underlyingQueue: `DispatchQueue` on which all internal `Request` work is performed. + /// - serializationQueue: `DispatchQueue` on which all serialization work is performed. By default targets + /// `underlyingQueue`, but can be passed another queue from a `Session`. + /// - eventMonitor: `EventMonitor` called for event callbacks from internal `Request` actions. + /// - interceptor: `RequestInterceptor` used throughout the request lifecycle. + /// - delegate: `RequestDelegate` that provides an interface to actions not performed by the `Request`. + init(id: UUID = UUID(), + convertible: UploadConvertible, + underlyingQueue: DispatchQueue, + serializationQueue: DispatchQueue, + eventMonitor: EventMonitor?, + interceptor: RequestInterceptor?, + fileManager: FileManager, + delegate: RequestDelegate) { + upload = convertible + self.fileManager = fileManager + + super.init(id: id, + convertible: convertible, + underlyingQueue: underlyingQueue, + serializationQueue: serializationQueue, + eventMonitor: eventMonitor, + interceptor: interceptor, + delegate: delegate) + } + + /// Called when the `Uploadable` value has been created from the `UploadConvertible`. + /// + /// - Parameter uploadable: The `Uploadable` that was created. + func didCreateUploadable(_ uploadable: Uploadable) { + self.uploadable = uploadable + + eventMonitor?.request(self, didCreateUploadable: uploadable) + } + + /// Called when the `Uploadable` value could not be created. + /// + /// - Parameter error: `AFError` produced by the failure. + func didFailToCreateUploadable(with error: AFError) { + self.error = error + + eventMonitor?.request(self, didFailToCreateUploadableWithError: error) + + retryOrFinish(error: error) + } + + override func task(for request: URLRequest, using session: URLSession) -> URLSessionTask { + guard let uploadable = uploadable else { + fatalError("Attempting to create a URLSessionUploadTask when Uploadable value doesn't exist.") + } + + switch uploadable { + case let .data(data): return session.uploadTask(with: request, from: data) + case let .file(url, _): return session.uploadTask(with: request, fromFile: url) + case .stream: return session.uploadTask(withStreamedRequest: request) + } + } + + /// Produces the `InputStream` from `uploadable`, if it can. + /// + /// - Note: Calling this method with a non-`.stream` `Uploadable` is a logic error and will crash. + /// + /// - Returns: The `InputStream`. + func inputStream() -> InputStream { + guard let uploadable = uploadable else { + fatalError("Attempting to access the input stream but the uploadable doesn't exist.") + } + + guard case let .stream(stream) = uploadable else { + fatalError("Attempted to access the stream of an UploadRequest that wasn't created with one.") + } + + eventMonitor?.request(self, didProvideInputStream: stream) + + return stream + } + + public override func cleanup() { + defer { super.cleanup() } + + guard + let uploadable = self.uploadable, + case let .file(url, shouldRemove) = uploadable, + shouldRemove + else { return } + + try? fileManager.removeItem(at: url) + } +} + +/// A type that can produce an `UploadRequest.Uploadable` value. +public protocol UploadableConvertible { + /// Produces an `UploadRequest.Uploadable` value from the instance. + /// + /// - Returns: The `UploadRequest.Uploadable`. + /// - Throws: Any `Error` produced during creation. + func createUploadable() throws -> UploadRequest.Uploadable +} + +extension UploadRequest.Uploadable: UploadableConvertible { + public func createUploadable() throws -> UploadRequest.Uploadable { + return self + } +} + +/// A type that can be converted to an upload, whether from an `UploadRequest.Uploadable` or `URLRequestConvertible`. +public protocol UploadConvertible: UploadableConvertible & URLRequestConvertible {} diff --git a/Pods/Alamofire/Source/RequestInterceptor.swift b/Pods/Alamofire/Source/RequestInterceptor.swift new file mode 100644 index 0000000..09ba4ee --- /dev/null +++ b/Pods/Alamofire/Source/RequestInterceptor.swift @@ -0,0 +1,243 @@ +// +// RequestInterceptor.swift +// +// Copyright (c) 2019 Alamofire Software Foundation (http://alamofire.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 +// 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. +// + +import Foundation + +/// A type that can inspect and optionally adapt a `URLRequest` in some manner if necessary. +public protocol RequestAdapter { + /// Inspects and adapts the specified `URLRequest` in some manner and calls the completion handler with the Result. + /// + /// - Parameters: + /// - urlRequest: The `URLRequest` to adapt. + /// - session: The `Session` that will execute the `URLRequest`. + /// - completion: The completion handler that must be called when adaptation is complete. + func adapt(_ urlRequest: URLRequest, for session: Session, completion: @escaping (Result) -> Void) +} + +// MARK: - + +/// Outcome of determination whether retry is necessary. +public enum RetryResult { + /// Retry should be attempted immediately. + case retry + /// Retry should be attempted after the associated `TimeInterval`. + case retryWithDelay(TimeInterval) + /// Do not retry. + case doNotRetry + /// Do not retry due to the associated `Error`. + case doNotRetryWithError(Error) +} + +extension RetryResult { + var retryRequired: Bool { + switch self { + case .retry, .retryWithDelay: return true + default: return false + } + } + + var delay: TimeInterval? { + switch self { + case let .retryWithDelay(delay): return delay + default: return nil + } + } + + var error: Error? { + guard case let .doNotRetryWithError(error) = self else { return nil } + return error + } +} + +/// A type that determines whether a request should be retried after being executed by the specified session manager +/// and encountering an error. +public protocol RequestRetrier { + /// Determines whether the `Request` should be retried by calling the `completion` closure. + /// + /// This operation is fully asynchronous. Any amount of time can be taken to determine whether the request needs + /// to be retried. The one requirement is that the completion closure is called to ensure the request is properly + /// cleaned up after. + /// + /// - Parameters: + /// - request: `Request` that failed due to the provided `Error`. + /// - session: `Session` that produced the `Request`. + /// - error: `Error` encountered while executing the `Request`. + /// - completion: Completion closure to be executed when a retry decision has been determined. + func retry(_ request: Request, for session: Session, dueTo error: Error, completion: @escaping (RetryResult) -> Void) +} + +// MARK: - + +/// Type that provides both `RequestAdapter` and `RequestRetrier` functionality. +public protocol RequestInterceptor: RequestAdapter, RequestRetrier {} + +extension RequestInterceptor { + public func adapt(_ urlRequest: URLRequest, for session: Session, completion: @escaping (Result) -> Void) { + completion(.success(urlRequest)) + } + + public func retry(_ request: Request, + for session: Session, + dueTo error: Error, + completion: @escaping (RetryResult) -> Void) { + completion(.doNotRetry) + } +} + +/// `RequestAdapter` closure definition. +public typealias AdaptHandler = (URLRequest, Session, _ completion: @escaping (Result) -> Void) -> Void +/// `RequestRetrier` closure definition. +public typealias RetryHandler = (Request, Session, Error, _ completion: @escaping (RetryResult) -> Void) -> Void + +// MARK: - + +/// Closure-based `RequestAdapter`. +open class Adapter: RequestInterceptor { + private let adaptHandler: AdaptHandler + + /// Creates an instance using the provided closure. + /// + /// - Parameter adaptHandler: `AdaptHandler` closure to be executed when handling request adaptation. + public init(_ adaptHandler: @escaping AdaptHandler) { + self.adaptHandler = adaptHandler + } + + open func adapt(_ urlRequest: URLRequest, for session: Session, completion: @escaping (Result) -> Void) { + adaptHandler(urlRequest, session, completion) + } +} + +// MARK: - + +/// Closure-based `RequestRetrier`. +open class Retrier: RequestInterceptor { + private let retryHandler: RetryHandler + + /// Creates an instance using the provided closure. + /// + /// - Parameter retryHandler: `RetryHandler` closure to be executed when handling request retry. + public init(_ retryHandler: @escaping RetryHandler) { + self.retryHandler = retryHandler + } + + open func retry(_ request: Request, + for session: Session, + dueTo error: Error, + completion: @escaping (RetryResult) -> Void) { + retryHandler(request, session, error, completion) + } +} + +// MARK: - + +/// `RequestInterceptor` which can use multiple `RequestAdapter` and `RequestRetrier` values. +open class Interceptor: RequestInterceptor { + /// All `RequestAdapter`s associated with the instance. These adapters will be run until one fails. + public let adapters: [RequestAdapter] + /// All `RequestRetrier`s associated with the instance. These retriers will be run one at a time until one triggers retry. + public let retriers: [RequestRetrier] + + /// Creates an instance from `AdaptHandler` and `RetryHandler` closures. + /// + /// - Parameters: + /// - adaptHandler: `AdaptHandler` closure to be used. + /// - retryHandler: `RetryHandler` closure to be used. + public init(adaptHandler: @escaping AdaptHandler, retryHandler: @escaping RetryHandler) { + adapters = [Adapter(adaptHandler)] + retriers = [Retrier(retryHandler)] + } + + /// Creates an instance from `RequestAdapter` and `RequestRetrier` values. + /// + /// - Parameters: + /// - adapter: `RequestAdapter` value to be used. + /// - retrier: `RequestRetrier` value to be used. + public init(adapter: RequestAdapter, retrier: RequestRetrier) { + adapters = [adapter] + retriers = [retrier] + } + + /// Creates an instance from the arrays of `RequestAdapter` and `RequestRetrier` values. + /// + /// - Parameters: + /// - adapters: `RequestAdapter` values to be used. + /// - retriers: `RequestRetrier` values to be used. + public init(adapters: [RequestAdapter] = [], retriers: [RequestRetrier] = []) { + self.adapters = adapters + self.retriers = retriers + } + + open func adapt(_ urlRequest: URLRequest, for session: Session, completion: @escaping (Result) -> Void) { + adapt(urlRequest, for: session, using: adapters, completion: completion) + } + + private func adapt(_ urlRequest: URLRequest, + for session: Session, + using adapters: [RequestAdapter], + completion: @escaping (Result) -> Void) { + var pendingAdapters = adapters + + guard !pendingAdapters.isEmpty else { completion(.success(urlRequest)); return } + + let adapter = pendingAdapters.removeFirst() + + adapter.adapt(urlRequest, for: session) { result in + switch result { + case let .success(urlRequest): + self.adapt(urlRequest, for: session, using: pendingAdapters, completion: completion) + case .failure: + completion(result) + } + } + } + + open func retry(_ request: Request, + for session: Session, + dueTo error: Error, + completion: @escaping (RetryResult) -> Void) { + retry(request, for: session, dueTo: error, using: retriers, completion: completion) + } + + private func retry(_ request: Request, + for session: Session, + dueTo error: Error, + using retriers: [RequestRetrier], + completion: @escaping (RetryResult) -> Void) { + var pendingRetriers = retriers + + guard !pendingRetriers.isEmpty else { completion(.doNotRetry); return } + + let retrier = pendingRetriers.removeFirst() + + retrier.retry(request, for: session, dueTo: error) { result in + switch result { + case .retry, .retryWithDelay, .doNotRetryWithError: + completion(result) + case .doNotRetry: + // Only continue to the next retrier if retry was not triggered and no error was encountered + self.retry(request, for: session, dueTo: error, using: pendingRetriers, completion: completion) + } + } + } +} diff --git a/Pods/Alamofire/Source/RequestTaskMap.swift b/Pods/Alamofire/Source/RequestTaskMap.swift new file mode 100644 index 0000000..8d4f33d --- /dev/null +++ b/Pods/Alamofire/Source/RequestTaskMap.swift @@ -0,0 +1,136 @@ +// +// RequestTaskMap.swift +// +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.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 +// 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. +// + +import Foundation + +/// A type that maintains a two way, one to one map of `URLSessionTask`s to `Request`s. +struct RequestTaskMap { + private var tasksToRequests: [URLSessionTask: Request] + private var requestsToTasks: [Request: URLSessionTask] + private var taskEvents: [URLSessionTask: (completed: Bool, metricsGathered: Bool)] + + var requests: [Request] { + return Array(tasksToRequests.values) + } + + init(tasksToRequests: [URLSessionTask: Request] = [:], + requestsToTasks: [Request: URLSessionTask] = [:], + taskEvents: [URLSessionTask: (completed: Bool, metricsGathered: Bool)] = [:]) { + self.tasksToRequests = tasksToRequests + self.requestsToTasks = requestsToTasks + self.taskEvents = taskEvents + } + + subscript(_ request: Request) -> URLSessionTask? { + get { return requestsToTasks[request] } + set { + guard let newValue = newValue else { + guard let task = requestsToTasks[request] else { + fatalError("RequestTaskMap consistency error: no task corresponding to request found.") + } + + requestsToTasks.removeValue(forKey: request) + tasksToRequests.removeValue(forKey: task) + taskEvents.removeValue(forKey: task) + + return + } + + requestsToTasks[request] = newValue + tasksToRequests[newValue] = request + taskEvents[newValue] = (completed: false, metricsGathered: false) + } + } + + subscript(_ task: URLSessionTask) -> Request? { + get { return tasksToRequests[task] } + set { + guard let newValue = newValue else { + guard let request = tasksToRequests[task] else { + fatalError("RequestTaskMap consistency error: no request corresponding to task found.") + } + + tasksToRequests.removeValue(forKey: task) + requestsToTasks.removeValue(forKey: request) + taskEvents.removeValue(forKey: task) + + return + } + + tasksToRequests[task] = newValue + requestsToTasks[newValue] = task + taskEvents[task] = (completed: false, metricsGathered: false) + } + } + + var count: Int { + precondition(tasksToRequests.count == requestsToTasks.count, + "RequestTaskMap.count invalid, requests.count: \(tasksToRequests.count) != tasks.count: \(requestsToTasks.count)") + + return tasksToRequests.count + } + + var eventCount: Int { + precondition(taskEvents.count == count, "RequestTaskMap.eventCount invalid, count: \(count) != taskEvents.count: \(taskEvents.count)") + + return taskEvents.count + } + + var isEmpty: Bool { + precondition(tasksToRequests.isEmpty == requestsToTasks.isEmpty, + "RequestTaskMap.isEmpty invalid, requests.isEmpty: \(tasksToRequests.isEmpty) != tasks.isEmpty: \(requestsToTasks.isEmpty)") + + return tasksToRequests.isEmpty + } + + var isEventsEmpty: Bool { + precondition(taskEvents.isEmpty == isEmpty, "RequestTaskMap.isEventsEmpty invalid, isEmpty: \(isEmpty) != taskEvents.isEmpty: \(taskEvents.isEmpty)") + + return taskEvents.isEmpty + } + + mutating func disassociateIfNecessaryAfterGatheringMetricsForTask(_ task: URLSessionTask) { + guard let events = taskEvents[task] else { + fatalError("RequestTaskMap consistency error: no events corresponding to task found.") + } + + switch (events.completed, events.metricsGathered) { + case (_, true): fatalError("RequestTaskMap consistency error: duplicate metricsGatheredForTask call.") + case (false, false): taskEvents[task] = (completed: false, metricsGathered: true) + case (true, false): self[task] = nil + } + } + + mutating func disassociateIfNecessaryAfterCompletingTask(_ task: URLSessionTask) { + guard let events = taskEvents[task] else { + fatalError("RequestTaskMap consistency error: no events corresponding to task found.") + } + + switch (events.completed, events.metricsGathered) { + case (true, _): fatalError("RequestTaskMap consistency error: duplicate completionReceivedForTask call.") + case (false, false): taskEvents[task] = (completed: true, metricsGathered: false) + case (false, true): self[task] = nil + } + } +} diff --git a/Pods/Alamofire/Source/Response.swift b/Pods/Alamofire/Source/Response.swift new file mode 100644 index 0000000..5874b28 --- /dev/null +++ b/Pods/Alamofire/Source/Response.swift @@ -0,0 +1,399 @@ +// +// Response.swift +// +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.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 +// 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. +// + +import Foundation + +/// Default type of `DataResponse` returned by Alamofire, with an `AFError` `Failure` type. +public typealias AFDataResponse = DataResponse +/// Default type of `DownloadResponse` returned by Alamofire, with an `AFError` `Failure` type. +public typealias AFDownloadResponse = DownloadResponse + +/// Type used to store all values associated with a serialized response of a `DataRequest` or `UploadRequest`. +public struct DataResponse { + /// The URL request sent to the server. + public let request: URLRequest? + + /// The server's response to the URL request. + public let response: HTTPURLResponse? + + /// The data returned by the server. + public let data: Data? + + /// The final metrics of the response. + public let metrics: URLSessionTaskMetrics? + + /// The time taken to serialize the response. + public let serializationDuration: TimeInterval + + /// The result of response serialization. + public let result: Result + + /// Returns the associated value of the result if it is a success, `nil` otherwise. + public var value: Success? { return result.success } + + /// Returns the associated error value if the result if it is a failure, `nil` otherwise. + public var error: Failure? { return result.failure } + + /// Creates a `DataResponse` instance with the specified parameters derived from the response serialization. + /// + /// - Parameters: + /// - request: The `URLRequest` sent to the server. + /// - response: The `HTTPURLResponse` from the server. + /// - data: The `Data` returned by the server. + /// - metrics: The `URLSessionTaskMetrics` of the `DataRequest` or `UploadRequest`. + /// - serializationDuration: The duration taken by serialization. + /// - result: The `Result` of response serialization. + public init(request: URLRequest?, + response: HTTPURLResponse?, + data: Data?, + metrics: URLSessionTaskMetrics?, + serializationDuration: TimeInterval, + result: Result) { + self.request = request + self.response = response + self.data = data + self.metrics = metrics + self.serializationDuration = serializationDuration + self.result = result + } +} + +// MARK: - + +extension DataResponse: CustomStringConvertible, CustomDebugStringConvertible { + /// The textual representation used when written to an output stream, which includes whether the result was a + /// success or failure. + public var description: String { + return "\(result)" + } + + /// The debug textual representation used when written to an output stream, which includes the URL request, the URL + /// response, the server data, the duration of the network and serialization actions, and the response serialization + /// result. + public var debugDescription: String { + let requestDescription = request.map { "\($0.httpMethod!) \($0)" } ?? "nil" + let requestBody = request?.httpBody.map { String(decoding: $0, as: UTF8.self) } ?? "None" + let responseDescription = response.map { response in + let sortedHeaders = response.headers.sorted() + + return """ + [Status Code]: \(response.statusCode) + [Headers]: + \(sortedHeaders) + """ + } ?? "nil" + let responseBody = data.map { String(decoding: $0, as: UTF8.self) } ?? "None" + let metricsDescription = metrics.map { "\($0.taskInterval.duration)s" } ?? "None" + + return """ + [Request]: \(requestDescription) + [Request Body]: \n\(requestBody) + [Response]: \n\(responseDescription) + [Response Body]: \n\(responseBody) + [Data]: \(data?.description ?? "None") + [Network Duration]: \(metricsDescription) + [Serialization Duration]: \(serializationDuration)s + [Result]: \(result) + """ + } +} + +// MARK: - + +extension DataResponse { + /// Evaluates the specified closure when the result of this `DataResponse` is a success, passing the unwrapped + /// result value as a parameter. + /// + /// Use the `map` method with a closure that does not throw. For example: + /// + /// let possibleData: DataResponse = ... + /// let possibleInt = possibleData.map { $0.count } + /// + /// - parameter transform: A closure that takes the success value of the instance's result. + /// + /// - returns: A `DataResponse` whose result wraps the value returned by the given closure. If this instance's + /// result is a failure, returns a response wrapping the same failure. + public func map(_ transform: (Success) -> NewSuccess) -> DataResponse { + return DataResponse(request: request, + response: response, + data: data, + metrics: metrics, + serializationDuration: serializationDuration, + result: result.map(transform)) + } + + /// Evaluates the given closure when the result of this `DataResponse` is a success, passing the unwrapped result + /// value as a parameter. + /// + /// Use the `tryMap` method with a closure that may throw an error. For example: + /// + /// let possibleData: DataResponse = ... + /// let possibleObject = possibleData.tryMap { + /// try JSONSerialization.jsonObject(with: $0) + /// } + /// + /// - parameter transform: A closure that takes the success value of the instance's result. + /// + /// - returns: A success or failure `DataResponse` depending on the result of the given closure. If this instance's + /// result is a failure, returns the same failure. + public func tryMap(_ transform: (Success) throws -> NewSuccess) -> DataResponse { + return DataResponse(request: request, + response: response, + data: data, + metrics: metrics, + serializationDuration: serializationDuration, + result: result.tryMap(transform)) + } + + /// Evaluates the specified closure when the `DataResponse` is a failure, passing the unwrapped error as a parameter. + /// + /// Use the `mapError` function with a closure that does not throw. For example: + /// + /// let possibleData: DataResponse = ... + /// let withMyError = possibleData.mapError { MyError.error($0) } + /// + /// - Parameter transform: A closure that takes the error of the instance. + /// + /// - Returns: A `DataResponse` instance containing the result of the transform. + public func mapError(_ transform: (Failure) -> NewFailure) -> DataResponse { + return DataResponse(request: request, + response: response, + data: data, + metrics: metrics, + serializationDuration: serializationDuration, + result: result.mapError(transform)) + } + + /// Evaluates the specified closure when the `DataResponse` is a failure, passing the unwrapped error as a parameter. + /// + /// Use the `tryMapError` function with a closure that may throw an error. For example: + /// + /// let possibleData: DataResponse = ... + /// let possibleObject = possibleData.tryMapError { + /// try someFailableFunction(taking: $0) + /// } + /// + /// - Parameter transform: A throwing closure that takes the error of the instance. + /// + /// - Returns: A `DataResponse` instance containing the result of the transform. + public func tryMapError(_ transform: (Failure) throws -> NewFailure) -> DataResponse { + return DataResponse(request: request, + response: response, + data: data, + metrics: metrics, + serializationDuration: serializationDuration, + result: result.tryMapError(transform)) + } +} + +// MARK: - + +/// Used to store all data associated with a serialized response of a download request. +public struct DownloadResponse { + /// The URL request sent to the server. + public let request: URLRequest? + + /// The server's response to the URL request. + public let response: HTTPURLResponse? + + /// The final destination URL of the data returned from the server after it is moved. + public let fileURL: URL? + + /// The resume data generated if the request was cancelled. + public let resumeData: Data? + + /// The final metrics of the response. + public let metrics: URLSessionTaskMetrics? + + /// The time taken to serialize the response. + public let serializationDuration: TimeInterval + + /// The result of response serialization. + public let result: Result + + /// Returns the associated value of the result if it is a success, `nil` otherwise. + public var value: Success? { return result.success } + + /// Returns the associated error value if the result if it is a failure, `nil` otherwise. + public var error: Failure? { return result.failure } + + /// Creates a `DownloadResponse` instance with the specified parameters derived from response serialization. + /// + /// - Parameters: + /// - request: The `URLRequest` sent to the server. + /// - response: The `HTTPURLResponse` from the server. + /// - temporaryURL: The temporary destination `URL` of the data returned from the server. + /// - destinationURL: The final destination `URL` of the data returned from the server, if it was moved. + /// - resumeData: The resume `Data` generated if the request was cancelled. + /// - metrics: The `URLSessionTaskMetrics` of the `DownloadRequest`. + /// - serializationDuration: The duration taken by serialization. + /// - result: The `Result` of response serialization. + public init(request: URLRequest?, + response: HTTPURLResponse?, + fileURL: URL?, + resumeData: Data?, + metrics: URLSessionTaskMetrics?, + serializationDuration: TimeInterval, + result: Result) { + self.request = request + self.response = response + self.fileURL = fileURL + self.resumeData = resumeData + self.metrics = metrics + self.serializationDuration = serializationDuration + self.result = result + } +} + +// MARK: - + +extension DownloadResponse: CustomStringConvertible, CustomDebugStringConvertible { + /// The textual representation used when written to an output stream, which includes whether the result was a + /// success or failure. + public var description: String { + return "\(result)" + } + + /// The debug textual representation used when written to an output stream, which includes the URL request, the URL + /// response, the temporary and destination URLs, the resume data, the durations of the network and serialization + /// actions, and the response serialization result. + public var debugDescription: String { + let requestDescription = request.map { "\($0.httpMethod!) \($0)" } ?? "nil" + let requestBody = request?.httpBody.map { String(decoding: $0, as: UTF8.self) } ?? "None" + let responseDescription = response.map { response in + let sortedHeaders = response.headers.sorted() + + return """ + [Status Code]: \(response.statusCode) + [Headers]: + \(sortedHeaders) + """ + } ?? "nil" + let metricsDescription = metrics.map { "\($0.taskInterval.duration)s" } ?? "None" + let resumeDataDescription = resumeData.map { "\($0)" } ?? "None" + + return """ + [Request]: \(requestDescription) + [Request Body]: \n\(requestBody) + [Response]: \n\(responseDescription) + [File URL]: \(fileURL?.path ?? "nil") + [ResumeData]: \(resumeDataDescription) + [Network Duration]: \(metricsDescription) + [Serialization Duration]: \(serializationDuration)s + [Result]: \(result) + """ + } +} + +// MARK: - + +extension DownloadResponse { + /// Evaluates the given closure when the result of this `DownloadResponse` is a success, passing the unwrapped + /// result value as a parameter. + /// + /// Use the `map` method with a closure that does not throw. For example: + /// + /// let possibleData: DownloadResponse = ... + /// let possibleInt = possibleData.map { $0.count } + /// + /// - parameter transform: A closure that takes the success value of the instance's result. + /// + /// - returns: A `DownloadResponse` whose result wraps the value returned by the given closure. If this instance's + /// result is a failure, returns a response wrapping the same failure. + public func map(_ transform: (Success) -> NewSuccess) -> DownloadResponse { + return DownloadResponse(request: request, + response: response, + fileURL: fileURL, + resumeData: resumeData, + metrics: metrics, + serializationDuration: serializationDuration, + result: result.map(transform)) + } + + /// Evaluates the given closure when the result of this `DownloadResponse` is a success, passing the unwrapped + /// result value as a parameter. + /// + /// Use the `tryMap` method with a closure that may throw an error. For example: + /// + /// let possibleData: DownloadResponse = ... + /// let possibleObject = possibleData.tryMap { + /// try JSONSerialization.jsonObject(with: $0) + /// } + /// + /// - parameter transform: A closure that takes the success value of the instance's result. + /// + /// - returns: A success or failure `DownloadResponse` depending on the result of the given closure. If this + /// instance's result is a failure, returns the same failure. + public func tryMap(_ transform: (Success) throws -> NewSuccess) -> DownloadResponse { + return DownloadResponse(request: request, + response: response, + fileURL: fileURL, + resumeData: resumeData, + metrics: metrics, + serializationDuration: serializationDuration, + result: result.tryMap(transform)) + } + + /// Evaluates the specified closure when the `DownloadResponse` is a failure, passing the unwrapped error as a parameter. + /// + /// Use the `mapError` function with a closure that does not throw. For example: + /// + /// let possibleData: DownloadResponse = ... + /// let withMyError = possibleData.mapError { MyError.error($0) } + /// + /// - Parameter transform: A closure that takes the error of the instance. + /// + /// - Returns: A `DownloadResponse` instance containing the result of the transform. + public func mapError(_ transform: (Failure) -> NewFailure) -> DownloadResponse { + return DownloadResponse(request: request, + response: response, + fileURL: fileURL, + resumeData: resumeData, + metrics: metrics, + serializationDuration: serializationDuration, + result: result.mapError(transform)) + } + + /// Evaluates the specified closure when the `DownloadResponse` is a failure, passing the unwrapped error as a parameter. + /// + /// Use the `tryMapError` function with a closure that may throw an error. For example: + /// + /// let possibleData: DownloadResponse = ... + /// let possibleObject = possibleData.tryMapError { + /// try someFailableFunction(taking: $0) + /// } + /// + /// - Parameter transform: A throwing closure that takes the error of the instance. + /// + /// - Returns: A `DownloadResponse` instance containing the result of the transform. + public func tryMapError(_ transform: (Failure) throws -> NewFailure) -> DownloadResponse { + return DownloadResponse(request: request, + response: response, + fileURL: fileURL, + resumeData: resumeData, + metrics: metrics, + serializationDuration: serializationDuration, + result: result.tryMapError(transform)) + } +} diff --git a/Pods/Alamofire/Source/ResponseSerialization.swift b/Pods/Alamofire/Source/ResponseSerialization.swift new file mode 100644 index 0000000..61b2cd5 --- /dev/null +++ b/Pods/Alamofire/Source/ResponseSerialization.swift @@ -0,0 +1,800 @@ +// +// ResponseSerialization.swift +// +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.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 +// 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. +// + +import Foundation + +// MARK: Protocols + +/// The type to which all data response serializers must conform in order to serialize a response. +public protocol DataResponseSerializerProtocol { + /// The type of serialized object to be created. + associatedtype SerializedObject + + /// Serialize the response `Data` into the provided type.. + /// + /// - Parameters: + /// - request: `URLRequest` which was used to perform the request, if any. + /// - response: `HTTPURLResponse` received from the server, if any. + /// - data: `Data` returned from the server, if any. + /// - error: `Error` produced by Alamofire or the underlying `URLSession` during the request. + /// + /// - Returns: The `SerializedObject`. + /// - Throws: Any `Error` produced during serialization. + func serialize(request: URLRequest?, response: HTTPURLResponse?, data: Data?, error: Error?) throws -> SerializedObject +} + +/// The type to which all download response serializers must conform in order to serialize a response. +public protocol DownloadResponseSerializerProtocol { + /// The type of serialized object to be created. + associatedtype SerializedObject + + /// Serialize the downloaded response `Data` from disk into the provided type.. + /// + /// - Parameters: + /// - request: `URLRequest` which was used to perform the request, if any. + /// - response: `HTTPURLResponse` received from the server, if any. + /// - fileURL: File `URL` to which the response data was downloaded. + /// - error: `Error` produced by Alamofire or the underlying `URLSession` during the request. + /// + /// - Returns: The `SerializedObject`. + /// - Throws: Any `Error` produced during serialization. + func serializeDownload(request: URLRequest?, response: HTTPURLResponse?, fileURL: URL?, error: Error?) throws -> SerializedObject +} + +/// A serializer that can handle both data and download responses. +public protocol ResponseSerializer: DataResponseSerializerProtocol & DownloadResponseSerializerProtocol { + /// `DataPreprocessor` used to prepare incoming `Data` for serialization. + var dataPreprocessor: DataPreprocessor { get } + /// `HTTPMethod`s for which empty response bodies are considered appropriate. + var emptyRequestMethods: Set { get } + /// HTTP response codes for which empty response bodies are considered appropriate. + var emptyResponseCodes: Set { get } +} + +/// Type used to preprocess `Data` before it handled by a serializer. +public protocol DataPreprocessor { + /// Process `Data` before it's handled by a serializer. + /// - Parameter data: The raw `Data` to process. + func preprocess(_ data: Data) throws -> Data +} + +/// `DataPreprocessor` that returns passed `Data` without any transform. +public struct PassthroughPreprocessor: DataPreprocessor { + public init() {} + + public func preprocess(_ data: Data) throws -> Data { return data } +} + +/// `DataPreprocessor` that trims Google's typical `)]}',\n` XSSI JSON header. +public struct GoogleXSSIPreprocessor: DataPreprocessor { + public init() {} + + public func preprocess(_ data: Data) throws -> Data { + return (data.prefix(6) == Data(")]}',\n".utf8)) ? data.dropFirst(6) : data + } +} + +extension ResponseSerializer { + /// Default `DataPreprocessor`. `PassthroughPreprocessor` by default. + public static var defaultDataPreprocessor: DataPreprocessor { return PassthroughPreprocessor() } + /// Default `HTTPMethod`s for which empty response bodies are considered appropriate. `[.head]` by default. + public static var defaultEmptyRequestMethods: Set { return [.head] } + /// HTTP response codes for which empty response bodies are considered appropriate. `[204, 205]` by default. + public static var defaultEmptyResponseCodes: Set { return [204, 205] } + + public var dataPreprocessor: DataPreprocessor { return Self.defaultDataPreprocessor } + public var emptyRequestMethods: Set { return Self.defaultEmptyRequestMethods } + public var emptyResponseCodes: Set { return Self.defaultEmptyResponseCodes } + + /// Determines whether the `request` allows empty response bodies, if `request` exists. + /// + /// - Parameter request: `URLRequest` to evaluate. + /// + /// - Returns: `Bool` representing the outcome of the evaluation, or `nil` if `request` was `nil`. + public func requestAllowsEmptyResponseData(_ request: URLRequest?) -> Bool? { + return request.flatMap { $0.httpMethod } + .flatMap(HTTPMethod.init) + .map { emptyRequestMethods.contains($0) } + } + + /// Determines whether the `response` allows empty response bodies, if `response` exists`. + /// + /// - Parameter response: `HTTPURLResponse` to evaluate. + /// + /// - Returns: `Bool` representing the outcome of the evaluation, or `nil` if `response` was `nil`. + public func responseAllowsEmptyResponseData(_ response: HTTPURLResponse?) -> Bool? { + return response.flatMap { $0.statusCode } + .map { emptyResponseCodes.contains($0) } + } + + /// Determines whether `request` and `response` allow empty response bodies. + /// + /// - Parameters: + /// - request: `URLRequest` to evaluate. + /// - response: `HTTPURLResponse` to evaluate. + /// + /// - Returns: `true` if `request` or `response` allow empty bodies, `false` otherwise. + public func emptyResponseAllowed(forRequest request: URLRequest?, response: HTTPURLResponse?) -> Bool { + return (requestAllowsEmptyResponseData(request) == true) || (responseAllowsEmptyResponseData(response) == true) + } +} + +/// By default, any serializer declared to conform to both types will get file serialization for free, as it just feeds +/// the data read from disk into the data response serializer. +public extension DownloadResponseSerializerProtocol where Self: DataResponseSerializerProtocol { + func serializeDownload(request: URLRequest?, response: HTTPURLResponse?, fileURL: URL?, error: Error?) throws -> Self.SerializedObject { + guard error == nil else { throw error! } + + guard let fileURL = fileURL else { + throw AFError.responseSerializationFailed(reason: .inputFileNil) + } + + let data: Data + do { + data = try Data(contentsOf: fileURL) + } catch { + throw AFError.responseSerializationFailed(reason: .inputFileReadFailed(at: fileURL)) + } + + do { + return try serialize(request: request, response: response, data: data, error: error) + } catch { + throw error + } + } +} + +// MARK: - Default + +extension DataRequest { + /// Adds a handler to be called once the request has finished. + /// + /// - Parameters: + /// - queue: The queue on which the completion handler is dispatched. `.main` by default. + /// - completionHandler: The code to be executed once the request has finished. + /// + /// - Returns: The request. + @discardableResult + public func response(queue: DispatchQueue = .main, completionHandler: @escaping (AFDataResponse) -> Void) -> Self { + appendResponseSerializer { + // Start work that should be on the serialization queue. + let result = AFResult(value: self.data, error: self.error) + // End work that should be on the serialization queue. + + self.underlyingQueue.async { + let response = DataResponse(request: self.request, + response: self.response, + data: self.data, + metrics: self.metrics, + serializationDuration: 0, + result: result) + + self.eventMonitor?.request(self, didParseResponse: response) + + self.responseSerializerDidComplete { queue.async { completionHandler(response) } } + } + } + + return self + } + + /// Adds a handler to be called once the request has finished. + /// + /// - Parameters: + /// - queue: The queue on which the completion handler is dispatched. `.main` by default + /// - responseSerializer: The response serializer responsible for serializing the request, response, and data. + /// - completionHandler: The code to be executed once the request has finished. + /// + /// - Returns: The request. + @discardableResult + public func response(queue: DispatchQueue = .main, + responseSerializer: Serializer, + completionHandler: @escaping (AFDataResponse) -> Void) + -> Self { + appendResponseSerializer { + // Start work that should be on the serialization queue. + let start = CFAbsoluteTimeGetCurrent() + let result: AFResult = Result { + try responseSerializer.serialize(request: self.request, + response: self.response, + data: self.data, + error: self.error) + }.mapError { error in + error.asAFError(or: .responseSerializationFailed(reason: .customSerializationFailed(error: error))) + } + + let end = CFAbsoluteTimeGetCurrent() + // End work that should be on the serialization queue. + + self.underlyingQueue.async { + let response = DataResponse(request: self.request, + response: self.response, + data: self.data, + metrics: self.metrics, + serializationDuration: end - start, + result: result) + + self.eventMonitor?.request(self, didParseResponse: response) + + guard let serializerError = result.failure, let delegate = self.delegate else { + self.responseSerializerDidComplete { queue.async { completionHandler(response) } } + return + } + + delegate.retryResult(for: self, dueTo: serializerError) { retryResult in + var didComplete: (() -> Void)? + + defer { + if let didComplete = didComplete { + self.responseSerializerDidComplete { queue.async { didComplete() } } + } + } + + switch retryResult { + case .doNotRetry: + didComplete = { completionHandler(response) } + + case let .doNotRetryWithError(retryError): + let result: AFResult = .failure(retryError.asAFError(orFailWith: "Received retryError was not already AFError")) + + let response = DataResponse(request: self.request, + response: self.response, + data: self.data, + metrics: self.metrics, + serializationDuration: end - start, + result: result) + + didComplete = { completionHandler(response) } + + case .retry, .retryWithDelay: + delegate.retryRequest(self, withDelay: retryResult.delay) + } + } + } + } + + return self + } +} + +extension DownloadRequest { + /// Adds a handler to be called once the request has finished. + /// + /// - Parameters: + /// - queue: The queue on which the completion handler is dispatched. `.main` by default. + /// - completionHandler: The code to be executed once the request has finished. + /// + /// - Returns: The request. + @discardableResult + public func response(queue: DispatchQueue = .main, + completionHandler: @escaping (AFDownloadResponse) -> Void) + -> Self { + appendResponseSerializer { + // Start work that should be on the serialization queue. + let result = AFResult(value: self.fileURL, error: self.error) + // End work that should be on the serialization queue. + + self.underlyingQueue.async { + let response = DownloadResponse(request: self.request, + response: self.response, + fileURL: self.fileURL, + resumeData: self.resumeData, + metrics: self.metrics, + serializationDuration: 0, + result: result) + + self.eventMonitor?.request(self, didParseResponse: response) + + self.responseSerializerDidComplete { queue.async { completionHandler(response) } } + } + } + + return self + } + + /// Adds a handler to be called once the request has finished. + /// + /// - Parameters: + /// - queue: The queue on which the completion handler is dispatched. `.main` by default. + /// - responseSerializer: The response serializer responsible for serializing the request, response, and data + /// contained in the destination `URL`. + /// - completionHandler: The code to be executed once the request has finished. + /// + /// - Returns: The request. + @discardableResult + public func response(queue: DispatchQueue = .main, + responseSerializer: Serializer, + completionHandler: @escaping (AFDownloadResponse) -> Void) + -> Self { + appendResponseSerializer { + // Start work that should be on the serialization queue. + let start = CFAbsoluteTimeGetCurrent() + let result: AFResult = Result { + try responseSerializer.serializeDownload(request: self.request, + response: self.response, + fileURL: self.fileURL, + error: self.error) + }.mapError { error in + error.asAFError(or: .responseSerializationFailed(reason: .customSerializationFailed(error: error))) + } + let end = CFAbsoluteTimeGetCurrent() + // End work that should be on the serialization queue. + + self.underlyingQueue.async { + let response = DownloadResponse(request: self.request, + response: self.response, + fileURL: self.fileURL, + resumeData: self.resumeData, + metrics: self.metrics, + serializationDuration: end - start, + result: result) + + self.eventMonitor?.request(self, didParseResponse: response) + + guard let serializerError = result.failure, let delegate = self.delegate else { + self.responseSerializerDidComplete { queue.async { completionHandler(response) } } + return + } + + delegate.retryResult(for: self, dueTo: serializerError) { retryResult in + var didComplete: (() -> Void)? + + defer { + if let didComplete = didComplete { + self.responseSerializerDidComplete { queue.async { didComplete() } } + } + } + + switch retryResult { + case .doNotRetry: + didComplete = { completionHandler(response) } + + case let .doNotRetryWithError(retryError): + let result: AFResult = .failure(retryError.asAFError(orFailWith: "Received retryError was not already AFError")) + + let response = DownloadResponse(request: self.request, + response: self.response, + fileURL: self.fileURL, + resumeData: self.resumeData, + metrics: self.metrics, + serializationDuration: end - start, + result: result) + + didComplete = { completionHandler(response) } + + case .retry, .retryWithDelay: + delegate.retryRequest(self, withDelay: retryResult.delay) + } + } + } + } + + return self + } +} + +// MARK: - Data + +extension DataRequest { + /// Adds a handler to be called once the request has finished. + /// + /// - Parameters: + /// - queue: The queue on which the completion handler is dispatched. `.main` by default. + /// - completionHandler: The code to be executed once the request has finished. + /// + /// - Returns: The request. + @discardableResult + public func responseData(queue: DispatchQueue = .main, + completionHandler: @escaping (AFDataResponse) -> Void) + -> Self { + return response(queue: queue, + responseSerializer: DataResponseSerializer(), + completionHandler: completionHandler) + } +} + +/// A `ResponseSerializer` that performs minimal response checking and returns any response data as-is. By default, a +/// request returning `nil` or no data is considered an error. However, if the response is has a status code valid for +/// empty responses (`204`, `205`), then an empty `Data` value is returned. +public final class DataResponseSerializer: ResponseSerializer { + public let dataPreprocessor: DataPreprocessor + public let emptyResponseCodes: Set + public let emptyRequestMethods: Set + + /// Creates an instance using the provided values. + /// + /// - Parameters: + /// - dataPreprocessor: `DataPreprocessor` used to prepare the received `Data` for serialization. + /// - emptyResponseCodes: The HTTP response codes for which empty responses are allowed. `[204, 205]` by default. + /// - emptyRequestMethods: The HTTP request methods for which empty responses are allowed. `[.head]` by default. + public init(dataPreprocessor: DataPreprocessor = DataResponseSerializer.defaultDataPreprocessor, + emptyResponseCodes: Set = DataResponseSerializer.defaultEmptyResponseCodes, + emptyRequestMethods: Set = DataResponseSerializer.defaultEmptyRequestMethods) { + self.dataPreprocessor = dataPreprocessor + self.emptyResponseCodes = emptyResponseCodes + self.emptyRequestMethods = emptyRequestMethods + } + + public func serialize(request: URLRequest?, response: HTTPURLResponse?, data: Data?, error: Error?) throws -> Data { + guard error == nil else { throw error! } + + guard var data = data, !data.isEmpty else { + guard emptyResponseAllowed(forRequest: request, response: response) else { + throw AFError.responseSerializationFailed(reason: .inputDataNilOrZeroLength) + } + + return Data() + } + + data = try dataPreprocessor.preprocess(data) + + return data + } +} + +extension DownloadRequest { + /// Adds a handler to be called once the request has finished. + /// + /// - Parameters: + /// - queue: The queue on which the completion handler is dispatched. `.main` by default. + /// - completionHandler: The code to be executed once the request has finished. + /// + /// - Returns: The request. + @discardableResult + public func responseData(queue: DispatchQueue = .main, + completionHandler: @escaping (AFDownloadResponse) -> Void) + -> Self { + return response(queue: queue, + responseSerializer: DataResponseSerializer(), + completionHandler: completionHandler) + } +} + +// MARK: - String + +/// A `ResponseSerializer` that decodes the response data as a `String`. By default, a request returning `nil` or no +/// data is considered an error. However, if the response is has a status code valid for empty responses (`204`, `205`), +/// then an empty `String` is returned. +public final class StringResponseSerializer: ResponseSerializer { + public let dataPreprocessor: DataPreprocessor + /// Optional string encoding used to validate the response. + public let encoding: String.Encoding? + public let emptyResponseCodes: Set + public let emptyRequestMethods: Set + + /// Creates an instance with the provided values. + /// + /// - Parameters: + /// - dataPreprocessor: `DataPreprocessor` used to prepare the received `Data` for serialization. + /// - encoding: A string encoding. Defaults to `nil`, in which case the encoding will be determined + /// from the server response, falling back to the default HTTP character set, `ISO-8859-1`. + /// - emptyResponseCodes: The HTTP response codes for which empty responses are allowed. `[204, 205]` by default. + /// - emptyRequestMethods: The HTTP request methods for which empty responses are allowed. `[.head]` by default. + public init(dataPreprocessor: DataPreprocessor = StringResponseSerializer.defaultDataPreprocessor, + encoding: String.Encoding? = nil, + emptyResponseCodes: Set = StringResponseSerializer.defaultEmptyResponseCodes, + emptyRequestMethods: Set = StringResponseSerializer.defaultEmptyRequestMethods) { + self.dataPreprocessor = dataPreprocessor + self.encoding = encoding + self.emptyResponseCodes = emptyResponseCodes + self.emptyRequestMethods = emptyRequestMethods + } + + public func serialize(request: URLRequest?, response: HTTPURLResponse?, data: Data?, error: Error?) throws -> String { + guard error == nil else { throw error! } + + guard var data = data, !data.isEmpty else { + guard emptyResponseAllowed(forRequest: request, response: response) else { + throw AFError.responseSerializationFailed(reason: .inputDataNilOrZeroLength) + } + + return "" + } + + data = try dataPreprocessor.preprocess(data) + + var convertedEncoding = encoding + + if let encodingName = response?.textEncodingName as CFString?, convertedEncoding == nil { + let ianaCharSet = CFStringConvertIANACharSetNameToEncoding(encodingName) + let nsStringEncoding = CFStringConvertEncodingToNSStringEncoding(ianaCharSet) + convertedEncoding = String.Encoding(rawValue: nsStringEncoding) + } + + let actualEncoding = convertedEncoding ?? .isoLatin1 + + guard let string = String(data: data, encoding: actualEncoding) else { + throw AFError.responseSerializationFailed(reason: .stringSerializationFailed(encoding: actualEncoding)) + } + + return string + } +} + +extension DataRequest { + /// Adds a handler to be called once the request has finished. + /// + /// - Parameters: + /// - queue: The queue on which the completion handler is dispatched. `.main` by default. + /// - encoding: The string encoding. Defaults to `nil`, in which case the encoding will be determined from + /// the server response, falling back to the default HTTP character set, `ISO-8859-1`. + /// - completionHandler: A closure to be executed once the request has finished. + /// + /// - Returns: The request. + @discardableResult + public func responseString(queue: DispatchQueue = .main, + encoding: String.Encoding? = nil, + completionHandler: @escaping (AFDataResponse) -> Void) -> Self { + return response(queue: queue, + responseSerializer: StringResponseSerializer(encoding: encoding), + completionHandler: completionHandler) + } +} + +extension DownloadRequest { + /// Adds a handler to be called once the request has finished. + /// + /// - Parameters: + /// - queue: The queue on which the completion handler is dispatched. `.main` by default. + /// - encoding: The string encoding. Defaults to `nil`, in which case the encoding will be determined from + /// the server response, falling back to the default HTTP character set, `ISO-8859-1`. + /// - completionHandler: A closure to be executed once the request has finished. + /// + /// - Returns: The request. + @discardableResult + public func responseString(queue: DispatchQueue = .main, + encoding: String.Encoding? = nil, + completionHandler: @escaping (AFDownloadResponse) -> Void) + -> Self { + return response(queue: queue, + responseSerializer: StringResponseSerializer(encoding: encoding), + completionHandler: completionHandler) + } +} + +// MARK: - JSON + +/// A `ResponseSerializer` that decodes the response data using `JSONSerialization`. By default, a request returning +/// `nil` or no data is considered an error. However, if the response is has a status code valid for empty responses +/// (`204`, `205`), then an `NSNull` value is returned. +public final class JSONResponseSerializer: ResponseSerializer { + public let dataPreprocessor: DataPreprocessor + public let emptyResponseCodes: Set + public let emptyRequestMethods: Set + /// `JSONSerialization.ReadingOptions` used when serializing a response. + public let options: JSONSerialization.ReadingOptions + + /// Creates an instance with the provided values. + /// + /// - Parameters: + /// - dataPreprocessor: `DataPreprocessor` used to prepare the received `Data` for serialization. + /// - emptyResponseCodes: The HTTP response codes for which empty responses are allowed. `[204, 205]` by default. + /// - emptyRequestMethods: The HTTP request methods for which empty responses are allowed. `[.head]` by default. + /// - options: The options to use. `.allowFragments` by default. + public init(dataPreprocessor: DataPreprocessor = JSONResponseSerializer.defaultDataPreprocessor, + emptyResponseCodes: Set = JSONResponseSerializer.defaultEmptyResponseCodes, + emptyRequestMethods: Set = JSONResponseSerializer.defaultEmptyRequestMethods, + options: JSONSerialization.ReadingOptions = .allowFragments) { + self.dataPreprocessor = dataPreprocessor + self.emptyResponseCodes = emptyResponseCodes + self.emptyRequestMethods = emptyRequestMethods + self.options = options + } + + public func serialize(request: URLRequest?, response: HTTPURLResponse?, data: Data?, error: Error?) throws -> Any { + guard error == nil else { throw error! } + + guard var data = data, !data.isEmpty else { + guard emptyResponseAllowed(forRequest: request, response: response) else { + throw AFError.responseSerializationFailed(reason: .inputDataNilOrZeroLength) + } + + return NSNull() + } + + data = try dataPreprocessor.preprocess(data) + + do { + return try JSONSerialization.jsonObject(with: data, options: options) + } catch { + throw AFError.responseSerializationFailed(reason: .jsonSerializationFailed(error: error)) + } + } +} + +extension DataRequest { + /// Adds a handler to be called once the request has finished. + /// + /// - Parameters: + /// - queue: The queue on which the completion handler is dispatched. `.main` by default. + /// - options: The JSON serialization reading options. `.allowFragments` by default. + /// - completionHandler: A closure to be executed once the request has finished. + /// + /// - Returns: The request. + @discardableResult + public func responseJSON(queue: DispatchQueue = .main, + options: JSONSerialization.ReadingOptions = .allowFragments, + completionHandler: @escaping (AFDataResponse) -> Void) -> Self { + return response(queue: queue, + responseSerializer: JSONResponseSerializer(options: options), + completionHandler: completionHandler) + } +} + +extension DownloadRequest { + /// Adds a handler to be called once the request has finished. + /// + /// - Parameters: + /// - queue: The queue on which the completion handler is dispatched. `.main` by default. + /// - options: The JSON serialization reading options. `.allowFragments` by default. + /// - completionHandler: A closure to be executed once the request has finished. + /// + /// - Returns: The request. + @discardableResult + public func responseJSON(queue: DispatchQueue = .main, + options: JSONSerialization.ReadingOptions = .allowFragments, + completionHandler: @escaping (AFDownloadResponse) -> Void) + -> Self { + return response(queue: queue, + responseSerializer: JSONResponseSerializer(options: options), + completionHandler: completionHandler) + } +} + +// MARK: - Empty + +/// Protocol representing an empty response. Use `T.emptyValue()` to get an instance. +public protocol EmptyResponse { + /// Empty value for the conforming type. + /// + /// - Returns: Value of `Self` to use for empty values. + static func emptyValue() -> Self +} + +/// Type representing an empty response. Use `Empty.value` to get the static instance. +public struct Empty: Decodable { + /// Static `Empty` instance used for all `Empty` responses. + public static let value = Empty() +} + +extension Empty: EmptyResponse { + public static func emptyValue() -> Empty { + return value + } +} + +// MARK: - DataDecoder Protocol + +/// Any type which can decode `Data` into a `Decodable` type. +public protocol DataDecoder { + /// Decode `Data` into the provided type. + /// + /// - Parameters: + /// - type: The `Type` to be decoded. + /// - data: The `Data` to be decoded. + /// + /// - Returns: The decoded value of type `D`. + /// - Throws: Any error that occurs during decode. + func decode(_ type: D.Type, from data: Data) throws -> D +} + +/// `JSONDecoder` automatically conforms to `DataDecoder`. +extension JSONDecoder: DataDecoder {} + +// MARK: - Decodable + +/// A `ResponseSerializer` that decodes the response data as a generic value using any type that conforms to +/// `DataDecoder`. By default, this is an instance of `JSONDecoder`. Additionally, a request returning `nil` or no data +/// is considered an error. However, if the response is has a status code valid for empty responses (`204`, `205`), then +/// the `Empty.value` value is returned. +public final class DecodableResponseSerializer: ResponseSerializer { + public let dataPreprocessor: DataPreprocessor + /// The `DataDecoder` instance used to decode responses. + public let decoder: DataDecoder + public let emptyResponseCodes: Set + public let emptyRequestMethods: Set + + /// Creates an instance using the values provided. + /// + /// - Parameters: + /// - dataPreprocessor: `DataPreprocessor` used to prepare the received `Data` for serialization. + /// - decoder: The `DataDecoder`. `JSONDecoder()` by default. + /// - emptyResponseCodes: The HTTP response codes for which empty responses are allowed. `[204, 205]` by default. + /// - emptyRequestMethods: The HTTP request methods for which empty responses are allowed. `[.head]` by default. + public init(dataPreprocessor: DataPreprocessor = DecodableResponseSerializer.defaultDataPreprocessor, + decoder: DataDecoder = JSONDecoder(), + emptyResponseCodes: Set = DecodableResponseSerializer.defaultEmptyResponseCodes, + emptyRequestMethods: Set = DecodableResponseSerializer.defaultEmptyRequestMethods) { + self.dataPreprocessor = dataPreprocessor + self.decoder = decoder + self.emptyResponseCodes = emptyResponseCodes + self.emptyRequestMethods = emptyRequestMethods + } + + public func serialize(request: URLRequest?, response: HTTPURLResponse?, data: Data?, error: Error?) throws -> T { + guard error == nil else { throw error! } + + guard var data = data, !data.isEmpty else { + guard emptyResponseAllowed(forRequest: request, response: response) else { + throw AFError.responseSerializationFailed(reason: .inputDataNilOrZeroLength) + } + + guard let emptyResponseType = T.self as? EmptyResponse.Type, let emptyValue = emptyResponseType.emptyValue() as? T else { + throw AFError.responseSerializationFailed(reason: .invalidEmptyResponse(type: "\(T.self)")) + } + + return emptyValue + } + + data = try dataPreprocessor.preprocess(data) + + do { + return try decoder.decode(T.self, from: data) + } catch { + throw AFError.responseSerializationFailed(reason: .decodingFailed(error: error)) + } + } +} + +extension DataRequest { + /// Adds a handler to be called once the request has finished. + /// + /// - Parameters: + /// - type: `Decodable` type to decode from response data. + /// - queue: The queue on which the completion handler is dispatched. `.main` by default. + /// - decoder: `DataDecoder` to use to decode the response. `JSONDecoder()` by default. + /// - completionHandler: A closure to be executed once the request has finished. + /// + /// - Returns: The request. + @discardableResult + public func responseDecodable(of type: T.Type = T.self, + queue: DispatchQueue = .main, + decoder: DataDecoder = JSONDecoder(), + completionHandler: @escaping (AFDataResponse) -> Void) -> Self { + return response(queue: queue, + responseSerializer: DecodableResponseSerializer(decoder: decoder), + completionHandler: completionHandler) + } +} + +extension DownloadRequest { + /// Adds a handler to be called once the request has finished. + /// + /// - Parameters: + /// - type: `Decodable` type to decode from response data. + /// - queue: The queue on which the completion handler is dispatched. `.main` by default. + /// - decoder: `DataDecoder` to use to decode the response. `JSONDecoder()` by default. + /// - completionHandler: A closure to be executed once the request has finished. + /// + /// - Returns: The request. + @discardableResult + public func responseDecodable(of type: T.Type = T.self, + queue: DispatchQueue = .main, + decoder: DataDecoder = JSONDecoder(), + completionHandler: @escaping (AFDownloadResponse) -> Void) -> Self { + return response(queue: queue, + responseSerializer: DecodableResponseSerializer(decoder: decoder), + completionHandler: completionHandler) + } +} diff --git a/Pods/Alamofire/Source/Result+Alamofire.swift b/Pods/Alamofire/Source/Result+Alamofire.swift new file mode 100644 index 0000000..60b35f8 --- /dev/null +++ b/Pods/Alamofire/Source/Result+Alamofire.swift @@ -0,0 +1,109 @@ +// +// Result+Alamofire.swift +// +// Copyright (c) 2019 Alamofire Software Foundation (http://alamofire.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 +// 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. +// + +import Foundation + +/// Default type of `Result` returned by Alamofire, with an `AFError` `Failure` type. +public typealias AFResult = Result + +// MARK: - Internal APIs + +extension Result { + /// Returns the associated value if the result is a success, `nil` otherwise. + var success: Success? { + guard case let .success(value) = self else { return nil } + return value + } + + /// Returns the associated error value if the result is a failure, `nil` otherwise. + var failure: Failure? { + guard case let .failure(error) = self else { return nil } + return error + } + + /// Initializes a `Result` from value or error. Returns `.failure` if the error is non-nil, `.success` otherwise. + /// + /// - Parameters: + /// - value: A value. + /// - error: An `Error`. + init(value: Success, error: Failure?) { + if let error = error { + self = .failure(error) + } else { + self = .success(value) + } + } + + /// Evaluates the specified closure when the `Result` is a success, passing the unwrapped value as a parameter. + /// + /// Use the `tryMap` method with a closure that may throw an error. For example: + /// + /// let possibleData: Result = .success(Data(...)) + /// let possibleObject = possibleData.tryMap { + /// try JSONSerialization.jsonObject(with: $0) + /// } + /// + /// - parameter transform: A closure that takes the success value of the instance. + /// + /// - returns: A `Result` containing the result of the given closure. If this instance is a failure, returns the + /// same failure. + func tryMap(_ transform: (Success) throws -> NewSuccess) -> Result { + switch self { + case let .success(value): + do { + return try .success(transform(value)) + } catch { + return .failure(error) + } + case let .failure(error): + return .failure(error) + } + } + + /// Evaluates the specified closure when the `Result` is a failure, passing the unwrapped error as a parameter. + /// + /// Use the `tryMapError` function with a closure that may throw an error. For example: + /// + /// let possibleData: Result = .success(Data(...)) + /// let possibleObject = possibleData.tryMapError { + /// try someFailableFunction(taking: $0) + /// } + /// + /// - Parameter transform: A throwing closure that takes the error of the instance. + /// + /// - Returns: A `Result` instance containing the result of the transform. If this instance is a success, returns + /// the same success. + func tryMapError(_ transform: (Failure) throws -> NewFailure) -> Result { + switch self { + case let .failure(error): + do { + return try .failure(transform(error)) + } catch { + return .failure(error) + } + case let .success(value): + return .success(value) + } + } +} diff --git a/Pods/Alamofire/Source/RetryPolicy.swift b/Pods/Alamofire/Source/RetryPolicy.swift new file mode 100644 index 0000000..7400718 --- /dev/null +++ b/Pods/Alamofire/Source/RetryPolicy.swift @@ -0,0 +1,363 @@ +// +// RetryPolicy.swift +// +// Copyright (c) 2019 Alamofire Software Foundation (http://alamofire.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 +// 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. +// + +import Foundation + +/// A retry policy that retries requests using an exponential backoff for allowed HTTP methods and HTTP status codes +/// as well as certain types of networking errors. +open class RetryPolicy: RequestInterceptor { + /// The default retry limit for retry policies. + public static let defaultRetryLimit: UInt = 2 + + /// The default exponential backoff base for retry policies (must be a minimum of 2). + public static let defaultExponentialBackoffBase: UInt = 2 + + /// The default exponential backoff scale for retry policies. + public static let defaultExponentialBackoffScale: Double = 0.5 + + /// The default HTTP methods to retry. + /// See [RFC 2616 - Section 9.1.2](https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html) for more information. + public static let defaultRetryableHTTPMethods: Set = [.delete, // [Delete](https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.7) - not always idempotent + .get, // [GET](https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.3) - generally idempotent + .head, // [HEAD](https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.4) - generally idempotent + .options, // [OPTIONS](https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.2) - inherently idempotent + .put, // [PUT](https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.6) - not always idempotent + .trace // [TRACE](https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.8) - inherently idempotent + ] + + /// The default HTTP status codes to retry. + /// See [RFC 2616 - Section 10](https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10) for more information. + public static let defaultRetryableHTTPStatusCodes: Set = [408, // [Request Timeout](https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.9) + 500, // [Internal Server Error](https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.5.1) + 502, // [Bad Gateway](https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.5.3) + 503, // [Service Unavailable](https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.5.4) + 504 // [Gateway Timeout](https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.5.5) + ] + + /// The default URL error codes to retry. + public static let defaultRetryableURLErrorCodes: Set = [// [Security] App Transport Security disallowed a connection because there is no secure network connection. + // - [Disabled] ATS settings do not change at runtime. + // .appTransportSecurityRequiresSecureConnection, + + // [System] An app or app extension attempted to connect to a background session that is already connected to a + // process. + // - [Enabled] The other process could release the background session. + .backgroundSessionInUseByAnotherProcess, + + // [System] The shared container identifier of the URL session configuration is needed but has not been set. + // - [Disabled] Cannot change at runtime. + // .backgroundSessionRequiresSharedContainer, + + // [System] The app is suspended or exits while a background data task is processing. + // - [Enabled] App can be foregrounded or launched to recover. + .backgroundSessionWasDisconnected, + + // [Network] The URL Loading system received bad data from the server. + // - [Enabled] Server could return valid data when retrying. + .badServerResponse, + + // [Resource] A malformed URL prevented a URL request from being initiated. + // - [Disabled] URL was most likely constructed incorrectly. + // .badURL, + + // [System] A connection was attempted while a phone call is active on a network that does not support + // simultaneous phone and data communication (EDGE or GPRS). + // - [Enabled] Phone call could be ended to allow request to recover. + .callIsActive, + + // [Client] An asynchronous load has been canceled. + // - [Disabled] Request was cancelled by the client. + // .cancelled, + + // [File System] A download task couldn’t close the downloaded file on disk. + // - [Disabled] File system error is unlikely to recover with retry. + // .cannotCloseFile, + + // [Network] An attempt to connect to a host failed. + // - [Enabled] Server or DNS lookup could recover during retry. + .cannotConnectToHost, + + // [File System] A download task couldn’t create the downloaded file on disk because of an I/O failure. + // - [Disabled] File system error is unlikely to recover with retry. + // .cannotCreateFile, + + // [Data] Content data received during a connection request had an unknown content encoding. + // - [Disabled] Server is unlikely to modify the content encoding during a retry. + // .cannotDecodeContentData, + + // [Data] Content data received during a connection request could not be decoded for a known content encoding. + // - [Disabled] Server is unlikely to modify the content encoding during a retry. + // .cannotDecodeRawData, + + // [Network] The host name for a URL could not be resolved. + // - [Enabled] Server or DNS lookup could recover during retry. + .cannotFindHost, + + // [Network] A request to load an item only from the cache could not be satisfied. + // - [Enabled] Cache could be populated during a retry. + .cannotLoadFromNetwork, + + // [File System] A download task was unable to move a downloaded file on disk. + // - [Disabled] File system error is unlikely to recover with retry. + // .cannotMoveFile, + + // [File System] A download task was unable to open the downloaded file on disk. + // - [Disabled] File system error is unlikely to recover with retry. + // .cannotOpenFile, + + // [Data] A task could not parse a response. + // - [Disabled] Invalid response is unlikely to recover with retry. + // .cannotParseResponse, + + // [File System] A download task was unable to remove a downloaded file from disk. + // - [Disabled] File system error is unlikely to recover with retry. + // .cannotRemoveFile, + + // [File System] A download task was unable to write to the downloaded file on disk. + // - [Disabled] File system error is unlikely to recover with retry. + // .cannotWriteToFile, + + // [Security] A client certificate was rejected. + // - [Disabled] Client certificate is unlikely to change with retry. + // .clientCertificateRejected, + + // [Security] A client certificate was required to authenticate an SSL connection during a request. + // - [Disabled] Client certificate is unlikely to be provided with retry. + // .clientCertificateRequired, + + // [Data] The length of the resource data exceeds the maximum allowed. + // - [Disabled] Resource will likely still exceed the length maximum on retry. + // .dataLengthExceedsMaximum, + + // [System] The cellular network disallowed a connection. + // - [Enabled] WiFi connection could be established during retry. + .dataNotAllowed, + + // [Network] The host address could not be found via DNS lookup. + // - [Enabled] DNS lookup could succeed during retry. + .dnsLookupFailed, + + // [Data] A download task failed to decode an encoded file during the download. + // - [Enabled] Server could correct the decoding issue with retry. + .downloadDecodingFailedMidStream, + + // [Data] A download task failed to decode an encoded file after downloading. + // - [Enabled] Server could correct the decoding issue with retry. + .downloadDecodingFailedToComplete, + + // [File System] A file does not exist. + // - [Disabled] File system error is unlikely to recover with retry. + // .fileDoesNotExist, + + // [File System] A request for an FTP file resulted in the server responding that the file is not a plain file, + // but a directory. + // - [Disabled] FTP directory is not likely to change to a file during a retry. + // .fileIsDirectory, + + // [Network] A redirect loop has been detected or the threshold for number of allowable redirects has been + // exceeded (currently 16). + // - [Disabled] The redirect loop is unlikely to be resolved within the retry window. + // .httpTooManyRedirects, + + // [System] The attempted connection required activating a data context while roaming, but international roaming + // is disabled. + // - [Enabled] WiFi connection could be established during retry. + .internationalRoamingOff, + + // [Connectivity] A client or server connection was severed in the middle of an in-progress load. + // - [Enabled] A network connection could be established during retry. + .networkConnectionLost, + + // [File System] A resource couldn’t be read because of insufficient permissions. + // - [Disabled] Permissions are unlikely to be granted during retry. + // .noPermissionsToReadFile, + + // [Connectivity] A network resource was requested, but an internet connection has not been established and + // cannot be established automatically. + // - [Enabled] A network connection could be established during retry. + .notConnectedToInternet, + + // [Resource] A redirect was specified by way of server response code, but the server did not accompany this + // code with a redirect URL. + // - [Disabled] The redirect URL is unlikely to be supplied during a retry. + // .redirectToNonExistentLocation, + + // [Client] A body stream is needed but the client did not provide one. + // - [Disabled] The client will be unlikely to supply a body stream during retry. + // .requestBodyStreamExhausted, + + // [Resource] A requested resource couldn’t be retrieved. + // - [Disabled] The resource is unlikely to become available during the retry window. + // .resourceUnavailable, + + // [Security] An attempt to establish a secure connection failed for reasons that can’t be expressed more + // specifically. + // - [Enabled] The secure connection could be established during a retry given the lack of specificity + // provided by the error. + .secureConnectionFailed, + + // [Security] A server certificate had a date which indicates it has expired, or is not yet valid. + // - [Enabled] The server certificate could become valid within the retry window. + .serverCertificateHasBadDate, + + // [Security] A server certificate was not signed by any root server. + // - [Disabled] The server certificate is unlikely to change during the retry window. + // .serverCertificateHasUnknownRoot, + + // [Security] A server certificate is not yet valid. + // - [Enabled] The server certificate could become valid within the retry window. + .serverCertificateNotYetValid, + + // [Security] A server certificate was signed by a root server that isn’t trusted. + // - [Disabled] The server certificate is unlikely to become trusted within the retry window. + // .serverCertificateUntrusted, + + // [Network] An asynchronous operation timed out. + // - [Enabled] The request timed out for an unknown reason and should be retried. + .timedOut + + // [System] The URL Loading System encountered an error that it can’t interpret. + // - [Disabled] The error could not be interpreted and is unlikely to be recovered from during a retry. + // .unknown, + + // [Resource] A properly formed URL couldn’t be handled by the framework. + // - [Disabled] The URL is unlikely to change during a retry. + // .unsupportedURL, + + // [Client] Authentication is required to access a resource. + // - [Disabled] The user authentication is unlikely to be provided by retrying. + // .userAuthenticationRequired, + + // [Client] An asynchronous request for authentication has been canceled by the user. + // - [Disabled] The user cancelled authentication and explicitly took action to not retry. + // .userCancelledAuthentication, + + // [Resource] A server reported that a URL has a non-zero content length, but terminated the network connection + // gracefully without sending any data. + // - [Disabled] The server is unlikely to provide data during the retry window. + // .zeroByteResource, + ] + + /// The total number of times the request is allowed to be retried. + public let retryLimit: UInt + + /// The base of the exponential backoff policy (should always be greater than or equal to 2). + public let exponentialBackoffBase: UInt + + /// The scale of the exponential backoff. + public let exponentialBackoffScale: Double + + /// The HTTP methods that are allowed to be retried. + public let retryableHTTPMethods: Set + + /// The HTTP status codes that are automatically retried by the policy. + public let retryableHTTPStatusCodes: Set + + /// The URL error codes that are automatically retried by the policy. + public let retryableURLErrorCodes: Set + + /// Creates an `ExponentialBackoffRetryPolicy` from the specified parameters. + /// + /// - Parameters: + /// - retryLimit: The total number of times the request is allowed to be retried. `2` by default. + /// - exponentialBackoffBase: The base of the exponential backoff policy. `2` by default. + /// - exponentialBackoffScale: The scale of the exponential backoff. `0.5` by default. + /// - retryableHTTPMethods: The HTTP methods that are allowed to be retried. + /// `RetryPolicy.defaultRetryableHTTPMethods` by default. + /// - retryableHTTPStatusCodes: The HTTP status codes that are automatically retried by the policy. + /// `RetryPolicy.defaultRetryableHTTPStatusCodes` by default. + /// - retryableURLErrorCodes: The URL error codes that are automatically retried by the policy. + /// `RetryPolicy.defaultRetryableURLErrorCodes` by default. + public init(retryLimit: UInt = RetryPolicy.defaultRetryLimit, + exponentialBackoffBase: UInt = RetryPolicy.defaultExponentialBackoffBase, + exponentialBackoffScale: Double = RetryPolicy.defaultExponentialBackoffScale, + retryableHTTPMethods: Set = RetryPolicy.defaultRetryableHTTPMethods, + retryableHTTPStatusCodes: Set = RetryPolicy.defaultRetryableHTTPStatusCodes, + retryableURLErrorCodes: Set = RetryPolicy.defaultRetryableURLErrorCodes) { + precondition(exponentialBackoffBase >= 2, "The `exponentialBackoffBase` must be a minimum of 2.") + + self.retryLimit = retryLimit + self.exponentialBackoffBase = exponentialBackoffBase + self.exponentialBackoffScale = exponentialBackoffScale + self.retryableHTTPMethods = retryableHTTPMethods + self.retryableHTTPStatusCodes = retryableHTTPStatusCodes + self.retryableURLErrorCodes = retryableURLErrorCodes + } + + open func retry(_ request: Request, + for session: Session, + dueTo error: Error, + completion: @escaping (RetryResult) -> Void) { + if + request.retryCount < retryLimit, + let httpMethod = request.request?.method, + retryableHTTPMethods.contains(httpMethod), + shouldRetry(response: request.response, error: error) { + let timeDelay = pow(Double(exponentialBackoffBase), Double(request.retryCount)) * exponentialBackoffScale + completion(.retryWithDelay(timeDelay)) + } else { + completion(.doNotRetry) + } + } + + private func shouldRetry(response: HTTPURLResponse?, error: Error) -> Bool { + if let statusCode = response?.statusCode, retryableHTTPStatusCodes.contains(statusCode) { + return true + } else if let errorCode = (error as? URLError)?.code, retryableURLErrorCodes.contains(errorCode) { + return true + } + + return false + } +} + +// MARK: - + +/// A retry policy that automatically retries idempotent requests for network connection lost errors. For more +/// information about retrying network connection lost errors, please refer to Apple's +/// [technical document](https://developer.apple.com/library/content/qa/qa1941/_index.html). +open class ConnectionLostRetryPolicy: RetryPolicy { + /// Creates a `ConnectionLostRetryPolicy` instance from the specified parameters. + /// + /// - Parameters: + /// - retryLimit: The total number of times the request is allowed to be retried. + /// `RetryPolicy.defaultRetryLimit` by default. + /// - exponentialBackoffBase: The base of the exponential backoff policy. + /// `RetryPolicy.defaultExponentialBackoffBase` by default. + /// - exponentialBackoffScale: The scale of the exponential backoff. + /// `RetryPolicy.defaultExponentialBackoffScale` by default. + /// - retryableHTTPMethods: The idempotent http methods to retry. + /// `RetryPolicy.defaultRetryableHTTPMethods` by default. + public init(retryLimit: UInt = RetryPolicy.defaultRetryLimit, + exponentialBackoffBase: UInt = RetryPolicy.defaultExponentialBackoffBase, + exponentialBackoffScale: Double = RetryPolicy.defaultExponentialBackoffScale, + retryableHTTPMethods: Set = RetryPolicy.defaultRetryableHTTPMethods) { + super.init(retryLimit: retryLimit, + exponentialBackoffBase: exponentialBackoffBase, + exponentialBackoffScale: exponentialBackoffScale, + retryableHTTPMethods: retryableHTTPMethods, + retryableHTTPStatusCodes: [], + retryableURLErrorCodes: [.networkConnectionLost]) + } +} diff --git a/Pods/Alamofire/Source/ServerTrustEvaluation.swift b/Pods/Alamofire/Source/ServerTrustEvaluation.swift new file mode 100644 index 0000000..e3af5ed --- /dev/null +++ b/Pods/Alamofire/Source/ServerTrustEvaluation.swift @@ -0,0 +1,606 @@ +// +// ServerTrustPolicy.swift +// +// Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.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 +// 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. +// + +import Foundation + +/// Responsible for managing the mapping of `ServerTrustEvaluating` values to given hosts. +open class ServerTrustManager { + /// Determines whether all hosts for this `ServerTrustManager` must be evaluated. `true` by default. + public let allHostsMustBeEvaluated: Bool + + /// The dictionary of policies mapped to a particular host. + public let evaluators: [String: ServerTrustEvaluating] + + /// Initializes the `ServerTrustManager` instance with the given evaluators. + /// + /// Since different servers and web services can have different leaf certificates, intermediate and even root + /// certificates, it is important to have the flexibility to specify evaluation policies on a per host basis. This + /// allows for scenarios such as using default evaluation for host1, certificate pinning for host2, public key + /// pinning for host3 and disabling evaluation for host4. + /// + /// - Parameters: + /// - allHostsMustBeEvaluated: The value determining whether all hosts for this instance must be evaluated. `true` + /// by default. + /// - evaluators: A dictionary of evaluators mapped to hosts. + public init(allHostsMustBeEvaluated: Bool = true, evaluators: [String: ServerTrustEvaluating]) { + self.allHostsMustBeEvaluated = allHostsMustBeEvaluated + self.evaluators = evaluators + } + + /// Returns the `ServerTrustEvaluating` value for the given host, if one is set. + /// + /// By default, this method will return the policy that perfectly matches the given host. Subclasses could override + /// this method and implement more complex mapping implementations such as wildcards. + /// + /// - Parameter host: The host to use when searching for a matching policy. + /// + /// - Returns: The `ServerTrustEvaluating` value for the given host if found, `nil` otherwise. + /// - Throws: `AFError.serverTrustEvaluationFailed` if `allHostsMustBeEvaluated` is `true` and no matching + /// evaluators are found. + open func serverTrustEvaluator(forHost host: String) throws -> ServerTrustEvaluating? { + guard let evaluator = evaluators[host] else { + if allHostsMustBeEvaluated { + throw AFError.serverTrustEvaluationFailed(reason: .noRequiredEvaluator(host: host)) + } + + return nil + } + + return evaluator + } +} + +/// A protocol describing the API used to evaluate server trusts. +public protocol ServerTrustEvaluating { + #if os(Linux) + // Implement this once Linux has API for evaluating server trusts. + #else + /// Evaluates the given `SecTrust` value for the given `host`. + /// + /// - Parameters: + /// - trust: The `SecTrust` value to evaluate. + /// - host: The host for which to evaluate the `SecTrust` value. + /// + /// - Returns: A `Bool` indicating whether the evaluator considers the `SecTrust` value valid for `host`. + func evaluate(_ trust: SecTrust, forHost host: String) throws + #endif +} + +// MARK: - Server Trust Evaluators + +/// An evaluator which uses the default server trust evaluation while allowing you to control whether to validate the +/// host provided by the challenge. Applications are encouraged to always validate the host in production environments +/// to guarantee the validity of the server's certificate chain. +public final class DefaultTrustEvaluator: ServerTrustEvaluating { + private let validateHost: Bool + + /// Creates a `DefaultTrustEvaluator`. + /// + /// - Parameter validateHost: Determines whether or not the evaluator should validate the host. `true` by default. + public init(validateHost: Bool = true) { + self.validateHost = validateHost + } + + public func evaluate(_ trust: SecTrust, forHost host: String) throws { + if validateHost { + try trust.af.performValidation(forHost: host) + } + + try trust.af.performDefaultValidation(forHost: host) + } +} + +/// An evaluator which Uses the default and revoked server trust evaluations allowing you to control whether to validate +/// the host provided by the challenge as well as specify the revocation flags for testing for revoked certificates. +/// Apple platforms did not start testing for revoked certificates automatically until iOS 10.1, macOS 10.12 and tvOS +/// 10.1 which is demonstrated in our TLS tests. Applications are encouraged to always validate the host in production +/// environments to guarantee the validity of the server's certificate chain. +public final class RevocationTrustEvaluator: ServerTrustEvaluating { + /// Represents the options to be use when evaluating the status of a certificate. + /// Only Revocation Policy Constants are valid, and can be found in [Apple's documentation](https://developer.apple.com/documentation/security/certificate_key_and_trust_services/policies/1563600-revocation_policy_constants). + public struct Options: OptionSet { + /// Perform revocation checking using the CRL (Certification Revocation List) method. + public static let crl = Options(rawValue: kSecRevocationCRLMethod) + /// Consult only locally cached replies; do not use network access. + public static let networkAccessDisabled = Options(rawValue: kSecRevocationNetworkAccessDisabled) + /// Perform revocation checking using OCSP (Online Certificate Status Protocol). + public static let ocsp = Options(rawValue: kSecRevocationOCSPMethod) + /// Prefer CRL revocation checking over OCSP; by default, OCSP is preferred. + public static let preferCRL = Options(rawValue: kSecRevocationPreferCRL) + /// Require a positive response to pass the policy. If the flag is not set, revocation checking is done on a + /// "best attempt" basis, where failure to reach the server is not considered fatal. + public static let requirePositiveResponse = Options(rawValue: kSecRevocationRequirePositiveResponse) + /// Perform either OCSP or CRL checking. The checking is performed according to the method(s) specified in the + /// certificate and the value of `preferCRL`. + public static let any = Options(rawValue: kSecRevocationUseAnyAvailableMethod) + + /// The raw value of the option. + public let rawValue: CFOptionFlags + + /// Creates an `Options` value with the given `CFOptionFlags`. + /// + /// - Parameter rawValue: The `CFOptionFlags` value to initialize with. + public init(rawValue: CFOptionFlags) { + self.rawValue = rawValue + } + } + + private let performDefaultValidation: Bool + private let validateHost: Bool + private let options: Options + + /// Creates a `RevocationTrustEvaluator`. + /// + /// - Note: Default and host validation will fail when using this evaluator with self-signed certificates. Use + /// `PinnedCertificatesTrustEvaluator` if you need to use self-signed certificates. + /// + /// - Parameters: + /// - performDefaultValidation: Determines whether default validation should be performed in addition to + /// evaluating the pinned certificates. `true` by default. + /// - validateHost: Determines whether or not the evaluator should validate the host, in addition + /// to performing the default evaluation, even if `performDefaultValidation` is + /// `false`. `true` by default. + /// - options: The `Options` to use to check the revocation status of the certificate. `.any` + /// by default. + public init(performDefaultValidation: Bool = true, validateHost: Bool = true, options: Options = .any) { + self.performDefaultValidation = performDefaultValidation + self.validateHost = validateHost + self.options = options + } + + public func evaluate(_ trust: SecTrust, forHost host: String) throws { + if performDefaultValidation { + try trust.af.performDefaultValidation(forHost: host) + } + + if validateHost { + try trust.af.performValidation(forHost: host) + } + + if #available(iOS 12, macOS 10.14, tvOS 12, watchOS 5, *) { + try trust.af.evaluate(afterApplying: SecPolicy.af.revocation(options: options)) + } else { + try trust.af.validate(policy: SecPolicy.af.revocation(options: options)) { status, result in + AFError.serverTrustEvaluationFailed(reason: .revocationCheckFailed(output: .init(host, trust, status, result), options: options)) + } + } + } +} + +/// Uses the pinned certificates to validate the server trust. The server trust is considered valid if one of the pinned +/// certificates match one of the server certificates. By validating both the certificate chain and host, certificate +/// pinning provides a very secure form of server trust validation mitigating most, if not all, MITM attacks. +/// Applications are encouraged to always validate the host and require a valid certificate chain in production +/// environments. +public final class PinnedCertificatesTrustEvaluator: ServerTrustEvaluating { + private let certificates: [SecCertificate] + private let acceptSelfSignedCertificates: Bool + private let performDefaultValidation: Bool + private let validateHost: Bool + + /// Creates a `PinnedCertificatesTrustEvaluator`. + /// + /// - Parameters: + /// - certificates: The certificates to use to evaluate the trust. All `cer`, `crt`, and `der` + /// certificates in `Bundle.main` by default. + /// - acceptSelfSignedCertificates: Adds the provided certificates as anchors for the trust evaluation, allowing + /// self-signed certificates to pass. `false` by default. THIS SETTING SHOULD BE + /// FALSE IN PRODUCTION! + /// - performDefaultValidation: Determines whether default validation should be performed in addition to + /// evaluating the pinned certificates. `true` by default. + /// - validateHost: Determines whether or not the evaluator should validate the host, in addition + /// to performing the default evaluation, even if `performDefaultValidation` is + /// `false`. `true` by default. + public init(certificates: [SecCertificate] = Bundle.main.af.certificates, + acceptSelfSignedCertificates: Bool = false, + performDefaultValidation: Bool = true, + validateHost: Bool = true) { + self.certificates = certificates + self.acceptSelfSignedCertificates = acceptSelfSignedCertificates + self.performDefaultValidation = performDefaultValidation + self.validateHost = validateHost + } + + public func evaluate(_ trust: SecTrust, forHost host: String) throws { + guard !certificates.isEmpty else { + throw AFError.serverTrustEvaluationFailed(reason: .noCertificatesFound) + } + + if acceptSelfSignedCertificates { + try trust.af.setAnchorCertificates(certificates) + } + + if performDefaultValidation { + try trust.af.performDefaultValidation(forHost: host) + } + + if validateHost { + try trust.af.performValidation(forHost: host) + } + + let serverCertificatesData = Set(trust.af.certificateData) + let pinnedCertificatesData = Set(certificates.af.data) + let pinnedCertificatesInServerData = !serverCertificatesData.isDisjoint(with: pinnedCertificatesData) + if !pinnedCertificatesInServerData { + throw AFError.serverTrustEvaluationFailed(reason: .certificatePinningFailed(host: host, + trust: trust, + pinnedCertificates: certificates, + serverCertificates: trust.af.certificates)) + } + } +} + +/// Uses the pinned public keys to validate the server trust. The server trust is considered valid if one of the pinned +/// public keys match one of the server certificate public keys. By validating both the certificate chain and host, +/// public key pinning provides a very secure form of server trust validation mitigating most, if not all, MITM attacks. +/// Applications are encouraged to always validate the host and require a valid certificate chain in production +/// environments. +public final class PublicKeysTrustEvaluator: ServerTrustEvaluating { + private let keys: [SecKey] + private let performDefaultValidation: Bool + private let validateHost: Bool + + /// Creates a `PublicKeysTrustEvaluator`. + /// + /// - Note: Default and host validation will fail when using this evaluator with self-signed certificates. Use + /// `PinnedCertificatesTrustEvaluator` if you need to use self-signed certificates. + /// + /// - Parameters: + /// - keys: The `SecKey`s to use to validate public keys. Defaults to the public keys of all + /// certificates included in the main bundle. + /// - performDefaultValidation: Determines whether default validation should be performed in addition to + /// evaluating the pinned certificates. `true` by default. + /// - validateHost: Determines whether or not the evaluator should validate the host, in addition to + /// performing the default evaluation, even if `performDefaultValidation` is `false`. + /// `true` by default. + public init(keys: [SecKey] = Bundle.main.af.publicKeys, + performDefaultValidation: Bool = true, + validateHost: Bool = true) { + self.keys = keys + self.performDefaultValidation = performDefaultValidation + self.validateHost = validateHost + } + + public func evaluate(_ trust: SecTrust, forHost host: String) throws { + guard !keys.isEmpty else { + throw AFError.serverTrustEvaluationFailed(reason: .noPublicKeysFound) + } + + if performDefaultValidation { + try trust.af.performDefaultValidation(forHost: host) + } + + if validateHost { + try trust.af.performValidation(forHost: host) + } + + let pinnedKeysInServerKeys: Bool = { + for serverPublicKey in trust.af.publicKeys { + for pinnedPublicKey in keys { + if serverPublicKey == pinnedPublicKey { + return true + } + } + } + return false + }() + + if !pinnedKeysInServerKeys { + throw AFError.serverTrustEvaluationFailed(reason: .publicKeyPinningFailed(host: host, + trust: trust, + pinnedKeys: keys, + serverKeys: trust.af.publicKeys)) + } + } +} + +/// Uses the provided evaluators to validate the server trust. The trust is only considered valid if all of the +/// evaluators consider it valid. +public final class CompositeTrustEvaluator: ServerTrustEvaluating { + private let evaluators: [ServerTrustEvaluating] + + /// Creates a `CompositeTrustEvaluator`. + /// + /// - Parameter evaluators: The `ServerTrustEvaluating` values used to evaluate the server trust. + public init(evaluators: [ServerTrustEvaluating]) { + self.evaluators = evaluators + } + + public func evaluate(_ trust: SecTrust, forHost host: String) throws { + try evaluators.evaluate(trust, forHost: host) + } +} + +/// Disables all evaluation which in turn will always consider any server trust as valid. +/// +/// **THIS EVALUATOR SHOULD NEVER BE USED IN PRODUCTION!** +public final class DisabledEvaluator: ServerTrustEvaluating { + /// Creates an instance. + public init() {} + + public func evaluate(_ trust: SecTrust, forHost host: String) throws {} +} + +// MARK: - Extensions + +public extension Array where Element == ServerTrustEvaluating { + #if os(Linux) + // Add this same convenience method for Linux. + #else + /// Evaluates the given `SecTrust` value for the given `host`. + /// + /// - Parameters: + /// - trust: The `SecTrust` value to evaluate. + /// - host: The host for which to evaluate the `SecTrust` value. + /// + /// - Returns: Whether or not the evaluator considers the `SecTrust` value valid for `host`. + func evaluate(_ trust: SecTrust, forHost host: String) throws { + for evaluator in self { + try evaluator.evaluate(trust, forHost: host) + } + } + #endif +} + +extension Bundle: AlamofireExtended {} +public extension AlamofireExtension where ExtendedType: Bundle { + /// Returns all valid `cer`, `crt`, and `der` certificates in the bundle. + var certificates: [SecCertificate] { + return paths(forResourcesOfTypes: [".cer", ".CER", ".crt", ".CRT", ".der", ".DER"]).compactMap { path in + guard + let certificateData = try? Data(contentsOf: URL(fileURLWithPath: path)) as CFData, + let certificate = SecCertificateCreateWithData(nil, certificateData) else { return nil } + + return certificate + } + } + + /// Returns all public keys for the valid certificates in the bundle. + var publicKeys: [SecKey] { + return certificates.af.publicKeys + } + + /// Returns all pathnames for the resources identified by the provided file extensions. + /// + /// - Parameter types: The filename extensions locate. + /// + /// - Returns: All pathnames for the given filename extensions. + func paths(forResourcesOfTypes types: [String]) -> [String] { + return Array(Set(types.flatMap { type.paths(forResourcesOfType: $0, inDirectory: nil) })) + } +} + +extension SecTrust: AlamofireExtended {} +public extension AlamofireExtension where ExtendedType == SecTrust { + /// Evaluates `self` after applying the `SecPolicy` value provided. + /// + /// - Parameter policy: The `SecPolicy` to apply to `self` before evaluation. + /// + /// - Throws: Any `Error` from applying the `SecPolicy` or from evaluation. + @available(iOS 12, macOS 10.14, tvOS 12, watchOS 5, *) + func evaluate(afterApplying policy: SecPolicy) throws { + try apply(policy: policy).af.evaluate() + } + + /// Attempts to validate `self` using the `SecPolicy` provided and transforming any error produced using the closure passed. + /// + /// - Parameters: + /// - policy: The `SecPolicy` used to evaluate `self`. + /// - errorProducer: The closure used transform the failed `OSStatus` and `SecTrustResultType`. + /// - Throws: Any `Error` from applying the `policy`, or the result of `errorProducer` if validation fails. + @available(iOS, introduced: 10, deprecated: 12, renamed: "evaluate(afterApplying:)") + @available(macOS, introduced: 10.12, deprecated: 10.14, renamed: "evaluate(afterApplying:)") + @available(tvOS, introduced: 10, deprecated: 12, renamed: "evaluate(afterApplying:)") + @available(watchOS, introduced: 3, deprecated: 5, renamed: "evaluate(afterApplying:)") + func validate(policy: SecPolicy, errorProducer: (_ status: OSStatus, _ result: SecTrustResultType) -> Error) throws { + try apply(policy: policy).af.validate(errorProducer: errorProducer) + } + + /// Applies a `SecPolicy` to `self`, throwing if it fails. + /// + /// - Parameter policy: The `SecPolicy`. + /// + /// - Returns: `self`, with the policy applied. + /// - Throws: An `AFError.serverTrustEvaluationFailed` instance with a `.policyApplicationFailed` reason. + func apply(policy: SecPolicy) throws -> SecTrust { + let status = SecTrustSetPolicies(type, policy) + + guard status.af.isSuccess else { + throw AFError.serverTrustEvaluationFailed(reason: .policyApplicationFailed(trust: type, + policy: policy, + status: status)) + } + + return type + } + + /// Evaluate `self`, throwing an `Error` if evaluation fails. + /// + /// - Throws: `AFError.serverTrustEvaluationFailed` with reason `.trustValidationFailed` and associated error from + /// the underlying evaluation. + @available(iOS 12, macOS 10.14, tvOS 12, watchOS 5, *) + func evaluate() throws { + var error: CFError? + let evaluationSucceeded = SecTrustEvaluateWithError(type, &error) + + if !evaluationSucceeded { + throw AFError.serverTrustEvaluationFailed(reason: .trustEvaluationFailed(error: error)) + } + } + + /// Validate `self`, passing any failure values through `errorProducer`. + /// + /// - Parameter errorProducer: The closure used to transform the failed `OSStatus` and `SecTrustResultType` into an + /// `Error`. + /// - Throws: The `Error` produced by the `errorProducer` closure. + @available(iOS, introduced: 10, deprecated: 12, renamed: "evaluate()") + @available(macOS, introduced: 10.12, deprecated: 10.14, renamed: "evaluate()") + @available(tvOS, introduced: 10, deprecated: 12, renamed: "evaluate()") + @available(watchOS, introduced: 3, deprecated: 5, renamed: "evaluate()") + func validate(errorProducer: (_ status: OSStatus, _ result: SecTrustResultType) -> Error) throws { + var result = SecTrustResultType.invalid + let status = SecTrustEvaluate(type, &result) + + guard status.af.isSuccess && result.af.isSuccess else { + throw errorProducer(status, result) + } + } + + /// Sets a custom certificate chain on `self`, allowing full validation of a self-signed certificate and its chain. + /// + /// - Parameter certificates: The `SecCertificate`s to add to the chain. + /// - Throws: Any error produced when applying the new certificate chain. + func setAnchorCertificates(_ certificates: [SecCertificate]) throws { + // Add additional anchor certificates. + let status = SecTrustSetAnchorCertificates(type, certificates as CFArray) + guard status.af.isSuccess else { + throw AFError.serverTrustEvaluationFailed(reason: .settingAnchorCertificatesFailed(status: status, + certificates: certificates)) + } + + // Reenable system anchor certificates. + let systemStatus = SecTrustSetAnchorCertificatesOnly(type, true) + guard systemStatus.af.isSuccess else { + throw AFError.serverTrustEvaluationFailed(reason: .settingAnchorCertificatesFailed(status: systemStatus, + certificates: certificates)) + } + } + + /// The public keys contained in `self`. + var publicKeys: [SecKey] { + return certificates.af.publicKeys + } + + /// The `SecCertificate`s contained i `self`. + var certificates: [SecCertificate] { + return (0.. SecPolicy { + return SecPolicyCreateSSL(true, hostname as CFString) + } + + /// Creates a `SecPolicy` which checks the revocation of certificates. + /// + /// - Parameter options: The `RevocationTrustEvaluator.Options` for evaluation. + /// + /// - Returns: The `SecPolicy`. + /// - Throws: An `AFError.serverTrustEvaluationFailed` error with reason `.revocationPolicyCreationFailed` + /// if the policy cannot be created. + static func revocation(options: RevocationTrustEvaluator.Options) throws -> SecPolicy { + guard let policy = SecPolicyCreateRevocation(options.rawValue) else { + throw AFError.serverTrustEvaluationFailed(reason: .revocationPolicyCreationFailed) + } + + return policy + } +} + +extension Array: AlamofireExtended {} +public extension AlamofireExtension where ExtendedType == [SecCertificate] { + /// All `Data` values for the contained `SecCertificate`s. + var data: [Data] { + return type.map { SecCertificateCopyData($0) as Data } + } + + /// All public `SecKey` values for the contained `SecCertificate`s. + var publicKeys: [SecKey] { + return type.compactMap { $0.af.publicKey } + } +} + +extension SecCertificate: AlamofireExtended {} +public extension AlamofireExtension where ExtendedType == SecCertificate { + /// The public key for `self`, if it can be extracted. + var publicKey: SecKey? { + let policy = SecPolicyCreateBasicX509() + var trust: SecTrust? + let trustCreationStatus = SecTrustCreateWithCertificates(type, policy, &trust) + + guard let createdTrust = trust, trustCreationStatus == errSecSuccess else { return nil } + + return SecTrustCopyPublicKey(createdTrust) + } +} + +extension OSStatus: AlamofireExtended {} +public extension AlamofireExtension where ExtendedType == OSStatus { + /// Returns whether `self` is `errSecSuccess`. + var isSuccess: Bool { return type == errSecSuccess } +} + +extension SecTrustResultType: AlamofireExtended {} +public extension AlamofireExtension where ExtendedType == SecTrustResultType { + /// Returns whether `self is `.unspecified` or `.proceed`. + var isSuccess: Bool { + return (type == .unspecified || type == .proceed) + } +} diff --git a/Pods/Alamofire/Source/Session.swift b/Pods/Alamofire/Source/Session.swift new file mode 100644 index 0000000..c73cfc1 --- /dev/null +++ b/Pods/Alamofire/Source/Session.swift @@ -0,0 +1,1039 @@ +// +// Session.swift +// +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.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 +// 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. +// + +import Foundation + +/// `Session` creates and manages Alamofire's `Request` types during their lifetimes. It also provides common +/// functionality for all `Request`s, including queuing, interception, trust management, redirect handling, and response +/// cache handling. +open class Session { + /// Shared singleton instance used by all `AF.request` APIs. Cannot be modified. + public static let `default` = Session() + + /// Underlying `URLSession` used to create `URLSessionTasks` for this instance, and for which this instance's + /// `delegate` handles `URLSessionDelegate` callbacks. + public let session: URLSession + /// Instance's `SessionDelegate`, which handles the `URLSessionDelegate` methods and `Request` interaction. + public let delegate: SessionDelegate + /// Root `DispatchQueue` for all internal callbacks and state update. **MUST** be a serial queue. + public let rootQueue: DispatchQueue + /// Value determining whether this instance automatically calls `resume()` on all created `Request`s. + public let startRequestsImmediately: Bool + /// `DispatchQueue` on which `URLRequest`s are created asynchronously. By default this queue uses `rootQueue` as its + /// `target`, but a separate queue can be used if request creation is determined to be a bottleneck. Always profile + /// and test before introducing an additional queue. + public let requestQueue: DispatchQueue + /// `DispatchQueue` passed to all `Request`s on which they perform their response serialization. By default this + /// queue uses `rootQueue` as its `target` but a separate queue can be used if response serialization is determined + /// to be a bottleneck. Always profile and test before introducing an additional queue. + public let serializationQueue: DispatchQueue + /// `RequestInterceptor` used for all `Request` created by the instance. `RequestInterceptor`s can also be set on a + /// per-`Request` basis, in which case the `Request`'s interceptor takes precedence over this value. + public let interceptor: RequestInterceptor? + /// `ServerTrustManager` instance used to evaluate all trust challenges and provide certificate and key pinning. + public let serverTrustManager: ServerTrustManager? + /// `RedirectHandler` instance used to provide customization for request redirection. + public let redirectHandler: RedirectHandler? + /// `CachedResponseHandler` instance used to provide customization of cached response handling. + public let cachedResponseHandler: CachedResponseHandler? + /// `CompositeEventMonitor` used to compose Alamofire's `defaultEventMonitors` and any passed `EventMonitor`s. + public let eventMonitor: CompositeEventMonitor + /// `EventMonitor`s included in all instances. `[AlamofireNotifications()]` by default. + public let defaultEventMonitors: [EventMonitor] = [AlamofireNotifications()] + + /// Internal map between `Request`s and any `URLSessionTasks` that may be in flight for them. + var requestTaskMap = RequestTaskMap() + /// Set of currently active `Request`s. + var activeRequests: Set = [] + + /// Creates a `Session` from a `URLSession` and other parameters. + /// + /// - Note: When passing a `URLSession`, you must create the `URLSession` with a specific `delegateQueue` value and + /// pass the `delegateQueue`'s `underlyingQueue` as the `rootQueue` parameter of this initializer. + /// + /// - Parameters: + /// - session: Underlying `URLSession` for this instance. + /// - delegate: `SessionDelegate` that handles `session`'s delegate callbacks as well as `Request` + /// interaction. + /// - rootQueue: Root `DispatchQueue` for all internal callbacks and state updates. **MUST** be a + /// serial queue. + /// - startRequestsImmediately: Determines whether this instance will automatically start all `Request`s. `true` + /// by default. If set to `false`, all `Request`s created must have `.resume()` called. + /// on them for them to start. + /// - requestQueue: `DispatchQueue` on which to perform `URLRequest` creation. By default this queue + /// will use the `rootQueue` as its `target`. A separate queue can be used if it's + /// determined request creation is a bottleneck, but that should only be done after + /// careful testing and profiling. `nil` by default. + /// - serializationQueue: `DispatchQueue` on which to perform all response serialization. By default this + /// queue will use the `rootQueue` as its `target`. A separate queue can be used if + /// it's determined response serialization is a bottleneck, but that should only be + /// done after careful testing and profiling. `nil` by default. + /// - interceptor: `RequestInterceptor` to be used for all `Request`s created by this instance. `nil` + /// by default. + /// - serverTrustManager: `ServerTrustManager` to be used for all trust evaluations by this instance. `nil` + /// by default. + /// - redirectHandler: `RedirectHandler` to be used by all `Request`s created by this instance. `nil` by + /// default. + /// - cachedResponseHandler: `CachedResponseHandler` to be used by all `Request`s created by this instance. + /// `nil` by default. + /// - eventMonitors: Additional `EventMonitor`s used by the instance. Alamofire always adds a + /// `AlamofireNotifications` `EventMonitor` to the array passed here. `[]` by default. + public init(session: URLSession, + delegate: SessionDelegate, + rootQueue: DispatchQueue, + startRequestsImmediately: Bool = true, + requestQueue: DispatchQueue? = nil, + serializationQueue: DispatchQueue? = nil, + interceptor: RequestInterceptor? = nil, + serverTrustManager: ServerTrustManager? = nil, + redirectHandler: RedirectHandler? = nil, + cachedResponseHandler: CachedResponseHandler? = nil, + eventMonitors: [EventMonitor] = []) { + precondition(session.configuration.identifier == nil, + "Alamofire does not support background URLSessionConfigurations.") + precondition(session.delegateQueue.underlyingQueue === rootQueue, + "Session(session:) initializer must be passed the DispatchQueue used as the delegateQueue's underlyingQueue as rootQueue.") + + self.session = session + self.delegate = delegate + self.rootQueue = rootQueue + self.startRequestsImmediately = startRequestsImmediately + self.requestQueue = requestQueue ?? DispatchQueue(label: "\(rootQueue.label).requestQueue", target: rootQueue) + self.serializationQueue = serializationQueue ?? DispatchQueue(label: "\(rootQueue.label).serializationQueue", target: rootQueue) + self.interceptor = interceptor + self.serverTrustManager = serverTrustManager + self.redirectHandler = redirectHandler + self.cachedResponseHandler = cachedResponseHandler + eventMonitor = CompositeEventMonitor(monitors: defaultEventMonitors + eventMonitors) + delegate.eventMonitor = eventMonitor + delegate.stateProvider = self + } + + /// Creates a `Session` from a `URLSessionConfiguration`. + /// + /// - Note: This initializer lets Alamofire handle the creation of the underlying `URLSession` and its + /// `delegateQueue`, and is the recommended initializer for most uses. + /// + /// - Parameters: + /// - configuration: `URLSessionConfiguration` to be used to create the underlying `URLSession`. Changes + /// to this value after being passed to this initializer will have no effect. + /// `URLSessionConfiguration.af.default` by default. + /// - delegate: `SessionDelegate` that handles `session`'s delegate callbacks as well as `Request` + /// interaction. `SessionDelegate()` by default. + /// - rootQueue: Root `DispatchQueue` for all internal callbacks and state updates. **MUST** be a + /// serial queue. `DispatchQueue(label: "org.alamofire.session.rootQueue")` by default. + /// - startRequestsImmediately: Determines whether this instance will automatically start all `Request`s. `true` + /// by default. If set to `false`, all `Request`s created must have `.resume()` called. + /// on them for them to start. + /// - requestQueue: `DispatchQueue` on which to perform `URLRequest` creation. By default this queue + /// will use the `rootQueue` as its `target`. A separate queue can be used if it's + /// determined request creation is a bottleneck, but that should only be done after + /// careful testing and profiling. `nil` by default. + /// - serializationQueue: `DispatchQueue` on which to perform all response serialization. By default this + /// queue will use the `rootQueue` as its `target`. A separate queue can be used if + /// it's determined response serialization is a bottleneck, but that should only be + /// done after careful testing and profiling. `nil` by default. + /// - interceptor: `RequestInterceptor` to be used for all `Request`s created by this instance. `nil` + /// by default. + /// - serverTrustManager: `ServerTrustManager` to be used for all trust evaluations by this instance. `nil` + /// by default. + /// - redirectHandler: `RedirectHandler` to be used by all `Request`s created by this instance. `nil` by + /// default. + /// - cachedResponseHandler: `CachedResponseHandler` to be used by all `Request`s created by this instance. + /// `nil` by default. + /// - eventMonitors: Additional `EventMonitor`s used by the instance. Alamofire always adds a + /// `AlamofireNotifications` `EventMonitor` to the array passed here. `[]` by default. + public convenience init(configuration: URLSessionConfiguration = URLSessionConfiguration.af.default, + delegate: SessionDelegate = SessionDelegate(), + rootQueue: DispatchQueue = DispatchQueue(label: "org.alamofire.session.rootQueue"), + startRequestsImmediately: Bool = true, + requestQueue: DispatchQueue? = nil, + serializationQueue: DispatchQueue? = nil, + interceptor: RequestInterceptor? = nil, + serverTrustManager: ServerTrustManager? = nil, + redirectHandler: RedirectHandler? = nil, + cachedResponseHandler: CachedResponseHandler? = nil, + eventMonitors: [EventMonitor] = []) { + precondition(configuration.identifier == nil, "Alamofire does not support background URLSessionConfigurations.") + + let delegateQueue = OperationQueue(maxConcurrentOperationCount: 1, underlyingQueue: rootQueue, name: "org.alamofire.session.sessionDelegateQueue") + let session = URLSession(configuration: configuration, delegate: delegate, delegateQueue: delegateQueue) + + self.init(session: session, + delegate: delegate, + rootQueue: rootQueue, + startRequestsImmediately: startRequestsImmediately, + requestQueue: requestQueue, + serializationQueue: serializationQueue, + interceptor: interceptor, + serverTrustManager: serverTrustManager, + redirectHandler: redirectHandler, + cachedResponseHandler: cachedResponseHandler, + eventMonitors: eventMonitors) + } + + deinit { + finishRequestsForDeinit() + session.invalidateAndCancel() + } + + // MARK: - Cancellation + + /// Cancel all active `Request`s, optionally calling a completion handler when complete. + /// + /// - Note: This is an asynchronous operation and does not block the creation of future `Request`s. Cancelled + /// `Request`s may not cancel immediately due internal work, and may not cancel at all if they are close to + /// completion when cancelled. + /// + /// - Parameters: + /// - queue: `DispatchQueue` on which the completion handler is run. `.main` by default. + /// - completion: Closure to be called when all `Request`s have been cancelled. + public func cancelAllRequests(completingOnQueue queue: DispatchQueue = .main, completion: (() -> Void)? = nil) { + rootQueue.async { + self.activeRequests.forEach { $0.cancel() } + queue.async { completion?() } + } + } + + // MARK: - DataRequest + + struct RequestConvertible: URLRequestConvertible { + let url: URLConvertible + let method: HTTPMethod + let parameters: Parameters? + let encoding: ParameterEncoding + let headers: HTTPHeaders? + + func asURLRequest() throws -> URLRequest { + let request = try URLRequest(url: url, method: method, headers: headers) + return try encoding.encode(request, with: parameters) + } + } + + /// Creates a `DataRequest` from a `URLRequest` created using the passed components and a `RequestInterceptor`. + /// + /// - Parameters: + /// - convertible: `URLConvertible` value to be used as the `URLRequest`'s `URL`. + /// - method: `HTTPMethod` for the `URLRequest`. `.get` by default. + /// - parameters: `Parameters` (a.k.a. `[String: Any]`) value to be encoded into the `URLRequest`. `nil` by default. + /// - encoding: `ParameterEncoding` to be used to encode the `parameters` value into the `URLRequest`. + /// `URLEncoding.default` by default. + /// - headers: `HTTPHeaders` value to be added to the `URLRequest`. `nil` by default. + /// - interceptor: `RequestInterceptor` value to be used by the returned `DataRequest`. `nil` by default. + /// + /// - Returns: The created `DataRequest`. + open func request(_ convertible: URLConvertible, + method: HTTPMethod = .get, + parameters: Parameters? = nil, + encoding: ParameterEncoding = URLEncoding.default, + headers: HTTPHeaders? = nil, + interceptor: RequestInterceptor? = nil) -> DataRequest { + let convertible = RequestConvertible(url: convertible, + method: method, + parameters: parameters, + encoding: encoding, + headers: headers) + + return request(convertible, interceptor: interceptor) + } + + struct RequestEncodableConvertible: URLRequestConvertible { + let url: URLConvertible + let method: HTTPMethod + let parameters: Parameters? + let encoder: ParameterEncoder + let headers: HTTPHeaders? + + func asURLRequest() throws -> URLRequest { + let request = try URLRequest(url: url, method: method, headers: headers) + + return try parameters.map { try encoder.encode($0, into: request) } ?? request + } + } + + /// Creates a `DataRequest` from a `URLRequest` created using the passed components, `Encodable` parameters, and a + /// `RequestInterceptor`. + /// + /// - Parameters: + /// - convertible: `URLConvertible` value to be used as the `URLRequest`'s `URL`. + /// - method: `HTTPMethod` for the `URLRequest`. `.get` by default. + /// - parameters: `Encodable` value to be encoded into the `URLRequest`. `nil` by default. + /// - encoder: `ParameterEncoder` to be used to encode the `parameters` value into the `URLRequest`. + /// `URLEncodedFormParameterEncoder.default` by default. + /// - headers: `HTTPHeaders` value to be added to the `URLRequest`. `nil` by default. + /// - interceptor: `RequestInterceptor` value to be used by the returned `DataRequest`. `nil` by default. + /// + /// - Returns: The created `DataRequest`. + open func request(_ convertible: URLConvertible, + method: HTTPMethod = .get, + parameters: Parameters? = nil, + encoder: ParameterEncoder = URLEncodedFormParameterEncoder.default, + headers: HTTPHeaders? = nil, + interceptor: RequestInterceptor? = nil) -> DataRequest { + let convertible = RequestEncodableConvertible(url: convertible, + method: method, + parameters: parameters, + encoder: encoder, + headers: headers) + + return request(convertible, interceptor: interceptor) + } + + /// Creates a `DataRequest` from a `URLRequestConvertible` value and a `RequestInterceptor`. + /// + /// - Parameters: + /// - convertible: `URLRequestConvertible` value to be used to create the `URLRequest`. + /// - interceptor: `RequestInterceptor` value to be used by the returned `DataRequest`. `nil` by default. + /// + /// - Returns: The created `DataRequest`. + open func request(_ convertible: URLRequestConvertible, interceptor: RequestInterceptor? = nil) -> DataRequest { + let request = DataRequest(convertible: convertible, + underlyingQueue: rootQueue, + serializationQueue: serializationQueue, + eventMonitor: eventMonitor, + interceptor: interceptor, + delegate: self) + + perform(request) + + return request + } + + // MARK: - DownloadRequest + + /// Creates a `DownloadRequest` using a `URLRequest` created using the passed components, `RequestInterceptor`, and + /// `Destination`. + /// + /// - Parameters: + /// - convertible: `URLConvertible` value to be used as the `URLRequest`'s `URL`. + /// - method: `HTTPMethod` for the `URLRequest`. `.get` by default. + /// - parameters: `Parameters` (a.k.a. `[String: Any]`) value to be encoded into the `URLRequest`. `nil` by default. + /// - encoding: `ParameterEncoding` to be used to encode the `parameters` value into the `URLRequest`. Defaults + /// to `URLEncoding.default`. + /// - headers: `HTTPHeaders` value to be added to the `URLRequest`. `nil` by default. + /// - interceptor: `RequestInterceptor` value to be used by the returned `DataRequest`. `nil` by default. + /// - destination: `DownloadRequest.Destination` closure used to determine how and where the downloaded file + /// should be moved. `nil` by default. + /// + /// - Returns: The created `DownloadRequest`. + open func download(_ convertible: URLConvertible, + method: HTTPMethod = .get, + parameters: Parameters? = nil, + encoding: ParameterEncoding = URLEncoding.default, + headers: HTTPHeaders? = nil, + interceptor: RequestInterceptor? = nil, + to destination: DownloadRequest.Destination? = nil) -> DownloadRequest { + let convertible = RequestConvertible(url: convertible, + method: method, + parameters: parameters, + encoding: encoding, + headers: headers) + + return download(convertible, interceptor: interceptor, to: destination) + } + + /// Creates a `DownloadRequest` from a `URLRequest` created using the passed components, `Encodable` parameters, and + /// a `RequestInterceptor`. + /// + /// - Parameters: + /// - convertible: `URLConvertible` value to be used as the `URLRequest`'s `URL`. + /// - method: `HTTPMethod` for the `URLRequest`. `.get` by default. + /// - parameters: Value conforming to `Encodable` to be encoded into the `URLRequest`. `nil` by default. + /// - encoder: `ParameterEncoder` to be used to encode the `parameters` value into the `URLRequest`. Defaults + /// to `URLEncodedFormParameterEncoder.default`. + /// - headers: `HTTPHeaders` value to be added to the `URLRequest`. `nil` by default. + /// - interceptor: `RequestInterceptor` value to be used by the returned `DataRequest`. `nil` by default. + /// - destination: `DownloadRequest.Destination` closure used to determine how and where the downloaded file + /// should be moved. `nil` by default. + /// + /// - Returns: The created `DownloadRequest`. + open func download(_ convertible: URLConvertible, + method: HTTPMethod = .get, + parameters: Parameters? = nil, + encoder: ParameterEncoder = URLEncodedFormParameterEncoder.default, + headers: HTTPHeaders? = nil, + interceptor: RequestInterceptor? = nil, + to destination: DownloadRequest.Destination? = nil) -> DownloadRequest { + let convertible = RequestEncodableConvertible(url: convertible, + method: method, + parameters: parameters, + encoder: encoder, + headers: headers) + + return download(convertible, interceptor: interceptor, to: destination) + } + + /// Creates a `DownloadRequest` from a `URLRequestConvertible` value, a `RequestInterceptor`, and a `Destination`. + /// + /// - Parameters: + /// - convertible: `URLRequestConvertible` value to be used to create the `URLRequest`. + /// - interceptor: `RequestInterceptor` value to be used by the returned `DataRequest`. `nil` by default. + /// - destination: `DownloadRequest.Destination` closure used to determine how and where the downloaded file + /// should be moved. `nil` by default. + /// + /// - Returns: The created `DownloadRequest`. + open func download(_ convertible: URLRequestConvertible, + interceptor: RequestInterceptor? = nil, + to destination: DownloadRequest.Destination? = nil) -> DownloadRequest { + let request = DownloadRequest(downloadable: .request(convertible), + underlyingQueue: rootQueue, + serializationQueue: serializationQueue, + eventMonitor: eventMonitor, + interceptor: interceptor, + delegate: self, + destination: destination ?? DownloadRequest.defaultDestination) + + perform(request) + + return request + } + + /// Creates a `DownloadRequest` from the `resumeData` produced from a previously cancelled `DownloadRequest`, as + /// well as a `RequestInterceptor`, and a `Destination`. + /// + /// - Note: If `destination` is not specified, the download will be moved to a temporary location determined by + /// Alamofire. The file will not be deleted until the system purges the temporary files. + /// + /// - Note: On some versions of all Apple platforms (iOS 10 - 10.2, macOS 10.12 - 10.12.2, tvOS 10 - 10.1, watchOS 3 - 3.1.1), + /// `resumeData` is broken on background URL session configurations. There's an underlying bug in the `resumeData` + /// generation logic where the data is written incorrectly and will always fail to resume the download. For more + /// information about the bug and possible workarounds, please refer to the [this Stack Overflow post](http://stackoverflow.com/a/39347461/1342462). + /// + /// - Parameters: + /// - data: The resume data from a previously cancelled `DownloadRequest` or `URLSessionDownloadTask`. + /// - interceptor: `RequestInterceptor` value to be used by the returned `DataRequest`. `nil` by default. + /// - destination: `DownloadRequest.Destination` closure used to determine how and where the downloaded file + /// should be moved. `nil` by default. + /// + /// - Returns: The created `DownloadRequest`. + open func download(resumingWith data: Data, + interceptor: RequestInterceptor? = nil, + to destination: DownloadRequest.Destination? = nil) -> DownloadRequest { + let request = DownloadRequest(downloadable: .resumeData(data), + underlyingQueue: rootQueue, + serializationQueue: serializationQueue, + eventMonitor: eventMonitor, + interceptor: interceptor, + delegate: self, + destination: destination ?? DownloadRequest.defaultDestination) + + perform(request) + + return request + } + + // MARK: - UploadRequest + + struct ParameterlessRequestConvertible: URLRequestConvertible { + let url: URLConvertible + let method: HTTPMethod + let headers: HTTPHeaders? + + func asURLRequest() throws -> URLRequest { + return try URLRequest(url: url, method: method, headers: headers) + } + } + + struct Upload: UploadConvertible { + let request: URLRequestConvertible + let uploadable: UploadableConvertible + + func createUploadable() throws -> UploadRequest.Uploadable { + return try uploadable.createUploadable() + } + + func asURLRequest() throws -> URLRequest { + return try request.asURLRequest() + } + } + + // MARK: Data + + /// Creates an `UploadRequest` for the given `Data`, `URLRequest` components, and `RequestInterceptor`. + /// + /// - Parameters: + /// - data: The `Data` to upload. + /// - convertible: `URLConvertible` value to be used as the `URLRequest`'s `URL`. + /// - method: `HTTPMethod` for the `URLRequest`. `.post` by default. + /// - headers: `HTTPHeaders` value to be added to the `URLRequest`. `nil` by default. + /// - interceptor: `RequestInterceptor` value to be used by the returned `DataRequest`. `nil` by default. + /// - fileManager: `FileManager` instance to be used by the returned `UploadRequest`. `.default` instance by + /// default. + /// + /// - Returns: The created `UploadRequest`. + open func upload(_ data: Data, + to convertible: URLConvertible, + method: HTTPMethod = .post, + headers: HTTPHeaders? = nil, + interceptor: RequestInterceptor? = nil, + fileManager: FileManager = .default) -> UploadRequest { + let convertible = ParameterlessRequestConvertible(url: convertible, method: method, headers: headers) + + return upload(data, with: convertible, interceptor: interceptor, fileManager: fileManager) + } + + /// Creates an `UploadRequest` for the given `Data` using the `URLRequestConvertible` value and `RequestInterceptor`. + /// + /// - Parameters: + /// - data: The `Data` to upload. + /// - convertible: `URLRequestConvertible` value to be used to create the `URLRequest`. + /// - interceptor: `RequestInterceptor` value to be used by the returned `DataRequest`. `nil` by default. + /// - fileManager: `FileManager` instance to be used by the returned `UploadRequest`. `.default` instance by + /// default. + /// + /// - Returns: The created `UploadRequest`. + open func upload(_ data: Data, + with convertible: URLRequestConvertible, + interceptor: RequestInterceptor? = nil, + fileManager: FileManager = .default) -> UploadRequest { + return upload(.data(data), with: convertible, interceptor: interceptor, fileManager: fileManager) + } + + // MARK: File + + /// Creates an `UploadRequest` for the file at the given file `URL`, using a `URLRequest` from the provided + /// components and `RequestInterceptor`. + /// + /// - Parameters: + /// - fileURL: The `URL` of the file to upload. + /// - convertible: `URLConvertible` value to be used as the `URLRequest`'s `URL`. + /// - method: `HTTPMethod` for the `URLRequest`. `.post` by default. + /// - headers: `HTTPHeaders` value to be added to the `URLRequest`. `nil` by default. + /// - interceptor: `RequestInterceptor` value to be used by the returned `UploadRequest`. `nil` by default. + /// - fileManager: `FileManager` instance to be used by the returned `UploadRequest`. `.default` instance by + /// default. + /// + /// - Returns: The created `UploadRequest`. + open func upload(_ fileURL: URL, + to convertible: URLConvertible, + method: HTTPMethod = .post, + headers: HTTPHeaders? = nil, + interceptor: RequestInterceptor? = nil, + fileManager: FileManager = .default) -> UploadRequest { + let convertible = ParameterlessRequestConvertible(url: convertible, method: method, headers: headers) + + return upload(fileURL, with: convertible, interceptor: interceptor, fileManager: fileManager) + } + + /// Creates an `UploadRequest` for the file at the given file `URL` using the `URLRequestConvertible` value and + /// `RequestInterceptor`. + /// + /// - Parameters: + /// - fileURL: The `URL` of the file to upload. + /// - convertible: `URLRequestConvertible` value to be used to create the `URLRequest`. + /// - interceptor: `RequestInterceptor` value to be used by the returned `DataRequest`. `nil` by default. + /// - fileManager: `FileManager` instance to be used by the returned `UploadRequest`. `.default` instance by + /// default. + /// + /// - Returns: The created `UploadRequest`. + open func upload(_ fileURL: URL, + with convertible: URLRequestConvertible, + interceptor: RequestInterceptor? = nil, + fileManager: FileManager = .default) -> UploadRequest { + return upload(.file(fileURL, shouldRemove: false), with: convertible, interceptor: interceptor, fileManager: fileManager) + } + + // MARK: InputStream + + /// Creates an `UploadRequest` from the `InputStream` provided using a `URLRequest` from the provided components and + /// `RequestInterceptor`. + /// + /// - Parameters: + /// - stream: The `InputStream` that provides the data to upload. + /// - convertible: `URLConvertible` value to be used as the `URLRequest`'s `URL`. + /// - method: `HTTPMethod` for the `URLRequest`. `.post` by default. + /// - headers: `HTTPHeaders` value to be added to the `URLRequest`. `nil` by default. + /// - interceptor: `RequestInterceptor` value to be used by the returned `DataRequest`. `nil` by default. + /// - fileManager: `FileManager` instance to be used by the returned `UploadRequest`. `.default` instance by + /// default. + /// + /// - Returns: The created `UploadRequest`. + open func upload(_ stream: InputStream, + to convertible: URLConvertible, + method: HTTPMethod = .post, + headers: HTTPHeaders? = nil, + interceptor: RequestInterceptor? = nil, + fileManager: FileManager = .default) -> UploadRequest { + let convertible = ParameterlessRequestConvertible(url: convertible, method: method, headers: headers) + + return upload(stream, with: convertible, interceptor: interceptor, fileManager: fileManager) + } + + /// Creates an `UploadRequest` from the provided `InputStream` using the `URLRequestConvertible` value and + /// `RequestInterceptor`. + /// + /// - Parameters: + /// - stream: The `InputStream` that provides the data to upload. + /// - convertible: `URLRequestConvertible` value to be used to create the `URLRequest`. + /// - interceptor: `RequestInterceptor` value to be used by the returned `DataRequest`. `nil` by default. + /// - fileManager: `FileManager` instance to be used by the returned `UploadRequest`. `.default` instance by + /// default. + /// + /// - Returns: The created `UploadRequest`. + open func upload(_ stream: InputStream, + with convertible: URLRequestConvertible, + interceptor: RequestInterceptor? = nil, + fileManager: FileManager = .default) -> UploadRequest { + return upload(.stream(stream), with: convertible, interceptor: interceptor, fileManager: fileManager) + } + + // MARK: MultipartFormData + + /// Creates an `UploadRequest` for the multipart form data built using a closure and sent using the provided + /// `URLRequest` components and `RequestInterceptor`. + /// + /// It is important to understand the memory implications of uploading `MultipartFormData`. If the cumulative + /// payload is small, encoding the data in-memory and directly uploading to a server is the by far the most + /// efficient approach. However, if the payload is too large, encoding the data in-memory could cause your app to + /// be terminated. Larger payloads must first be written to disk using input and output streams to keep the memory + /// footprint low, then the data can be uploaded as a stream from the resulting file. Streaming from disk MUST be + /// used for larger payloads such as video content. + /// + /// The `encodingMemoryThreshold` parameter allows Alamofire to automatically determine whether to encode in-memory + /// or stream from disk. If the content length of the `MultipartFormData` is below the `encodingMemoryThreshold`, + /// encoding takes place in-memory. If the content length exceeds the threshold, the data is streamed to disk + /// during the encoding process. Then the result is uploaded as data or as a stream depending on which encoding + /// technique was used. + /// + /// - Parameters: + /// - multipartFormData: `MultipartFormData` building closure. + /// - convertible: `URLConvertible` value to be used as the `URLRequest`'s `URL`. + /// - encodingMemoryThreshold: Byte threshold used to determine whether the form data is encoded into memory or + /// onto disk before being uploaded. `MultipartFormData.encodingMemoryThreshold` by + /// default. + /// - method: `HTTPMethod` for the `URLRequest`. `.post` by default. + /// - headers: `HTTPHeaders` value to be added to the `URLRequest`. `nil` by default. + /// - interceptor: `RequestInterceptor` value to be used by the returned `DataRequest`. `nil` by default. + /// - fileManager: `FileManager` to be used if the form data exceeds the memory threshold and is + /// written to disk before being uploaded. `.default` instance by default. + /// + /// - Returns: The created `UploadRequest`. + open func upload(multipartFormData: @escaping (MultipartFormData) -> Void, + to url: URLConvertible, + usingThreshold encodingMemoryThreshold: UInt64 = MultipartFormData.encodingMemoryThreshold, + method: HTTPMethod = .post, + headers: HTTPHeaders? = nil, + interceptor: RequestInterceptor? = nil, + fileManager: FileManager = .default) -> UploadRequest { + let convertible = ParameterlessRequestConvertible(url: url, method: method, headers: headers) + + let formData = MultipartFormData(fileManager: fileManager) + multipartFormData(formData) + + return upload(multipartFormData: formData, + with: convertible, + usingThreshold: encodingMemoryThreshold, + interceptor: interceptor, + fileManager: fileManager) + } + + /// Creates an `UploadRequest` using a `MultipartFormData` building closure, the provided `URLRequestConvertible` + /// value, and a `RequestInterceptor`. + /// + /// It is important to understand the memory implications of uploading `MultipartFormData`. If the cumulative + /// payload is small, encoding the data in-memory and directly uploading to a server is the by far the most + /// efficient approach. However, if the payload is too large, encoding the data in-memory could cause your app to + /// be terminated. Larger payloads must first be written to disk using input and output streams to keep the memory + /// footprint low, then the data can be uploaded as a stream from the resulting file. Streaming from disk MUST be + /// used for larger payloads such as video content. + /// + /// The `encodingMemoryThreshold` parameter allows Alamofire to automatically determine whether to encode in-memory + /// or stream from disk. If the content length of the `MultipartFormData` is below the `encodingMemoryThreshold`, + /// encoding takes place in-memory. If the content length exceeds the threshold, the data is streamed to disk + /// during the encoding process. Then the result is uploaded as data or as a stream depending on which encoding + /// technique was used. + /// + /// - Parameters: + /// - multipartFormData: `MultipartFormData` building closure. + /// - request: `URLRequestConvertible` value to be used to create the `URLRequest`. + /// - encodingMemoryThreshold: Byte threshold used to determine whether the form data is encoded into memory or + /// onto disk before being uploaded. `MultipartFormData.encodingMemoryThreshold` by + /// default. + /// - interceptor: `RequestInterceptor` value to be used by the returned `DataRequest`. `nil` by default. + /// - fileManager: `FileManager` to be used if the form data exceeds the memory threshold and is + /// written to disk before being uploaded. `.default` instance by default. + /// + /// - Returns: The created `UploadRequest`. + open func upload(multipartFormData: @escaping (MultipartFormData) -> Void, + with request: URLRequestConvertible, + usingThreshold encodingMemoryThreshold: UInt64 = MultipartFormData.encodingMemoryThreshold, + interceptor: RequestInterceptor? = nil, + fileManager: FileManager = .default) -> UploadRequest { + let formData = MultipartFormData(fileManager: fileManager) + multipartFormData(formData) + + return upload(multipartFormData: formData, + with: request, + usingThreshold: encodingMemoryThreshold, + interceptor: interceptor, + fileManager: fileManager) + } + + /// Creates an `UploadRequest` for the prebuilt `MultipartFormData` value using the provided `URLRequest` components + /// and `RequestInterceptor`. + /// + /// It is important to understand the memory implications of uploading `MultipartFormData`. If the cumulative + /// payload is small, encoding the data in-memory and directly uploading to a server is the by far the most + /// efficient approach. However, if the payload is too large, encoding the data in-memory could cause your app to + /// be terminated. Larger payloads must first be written to disk using input and output streams to keep the memory + /// footprint low, then the data can be uploaded as a stream from the resulting file. Streaming from disk MUST be + /// used for larger payloads such as video content. + /// + /// The `encodingMemoryThreshold` parameter allows Alamofire to automatically determine whether to encode in-memory + /// or stream from disk. If the content length of the `MultipartFormData` is below the `encodingMemoryThreshold`, + /// encoding takes place in-memory. If the content length exceeds the threshold, the data is streamed to disk + /// during the encoding process. Then the result is uploaded as data or as a stream depending on which encoding + /// technique was used. + /// + /// - Parameters: + /// - multipartFormData: `MultipartFormData` instance to upload. + /// - url: `URLConvertible` value to be used as the `URLRequest`'s `URL`. + /// - encodingMemoryThreshold: Byte threshold used to determine whether the form data is encoded into memory or + /// onto disk before being uploaded. `MultipartFormData.encodingMemoryThreshold` by + /// default. + /// - method: `HTTPMethod` for the `URLRequest`. `.post` by default. + /// - headers: `HTTPHeaders` value to be added to the `URLRequest`. `nil` by default. + /// - interceptor: `RequestInterceptor` value to be used by the returned `DataRequest`. `nil` by default. + /// - fileManager: `FileManager` to be used if the form data exceeds the memory threshold and is + /// written to disk before being uploaded. `.default` instance by default. + /// + /// - Returns: The created `UploadRequest`. + open func upload(multipartFormData: MultipartFormData, + to url: URLConvertible, + usingThreshold encodingMemoryThreshold: UInt64 = MultipartFormData.encodingMemoryThreshold, + method: HTTPMethod = .post, + headers: HTTPHeaders? = nil, + interceptor: RequestInterceptor? = nil, + fileManager: FileManager = .default) -> UploadRequest { + let convertible = ParameterlessRequestConvertible(url: url, method: method, headers: headers) + + let multipartUpload = MultipartUpload(isInBackgroundSession: session.configuration.identifier != nil, + encodingMemoryThreshold: encodingMemoryThreshold, + request: convertible, + multipartFormData: multipartFormData) + + return upload(multipartUpload, interceptor: interceptor, fileManager: fileManager) + } + + /// Creates an `UploadRequest` for the prebuilt `MultipartFormData` value using the providing `URLRequestConvertible` + /// value and `RequestInterceptor`. + /// + /// It is important to understand the memory implications of uploading `MultipartFormData`. If the cumulative + /// payload is small, encoding the data in-memory and directly uploading to a server is the by far the most + /// efficient approach. However, if the payload is too large, encoding the data in-memory could cause your app to + /// be terminated. Larger payloads must first be written to disk using input and output streams to keep the memory + /// footprint low, then the data can be uploaded as a stream from the resulting file. Streaming from disk MUST be + /// used for larger payloads such as video content. + /// + /// The `encodingMemoryThreshold` parameter allows Alamofire to automatically determine whether to encode in-memory + /// or stream from disk. If the content length of the `MultipartFormData` is below the `encodingMemoryThreshold`, + /// encoding takes place in-memory. If the content length exceeds the threshold, the data is streamed to disk + /// during the encoding process. Then the result is uploaded as data or as a stream depending on which encoding + /// technique was used. + /// + /// - Parameters: + /// - multipartFormData: `MultipartFormData` instance to upload. + /// - request: `URLRequestConvertible` value to be used to create the `URLRequest`. + /// - encodingMemoryThreshold: Byte threshold used to determine whether the form data is encoded into memory or + /// onto disk before being uploaded. `MultipartFormData.encodingMemoryThreshold` by + /// default. + /// - interceptor: `RequestInterceptor` value to be used by the returned `DataRequest`. `nil` by default. + /// - fileManager: `FileManager` instance to be used by the returned `UploadRequest`. `.default` instance by + /// default. + /// + /// - Returns: The created `UploadRequest`. + open func upload(multipartFormData: MultipartFormData, + with request: URLRequestConvertible, + usingThreshold encodingMemoryThreshold: UInt64 = MultipartFormData.encodingMemoryThreshold, + interceptor: RequestInterceptor? = nil, + fileManager: FileManager = .default) -> UploadRequest { + let multipartUpload = MultipartUpload(isInBackgroundSession: session.configuration.identifier != nil, + encodingMemoryThreshold: encodingMemoryThreshold, + request: request, + multipartFormData: multipartFormData) + + return upload(multipartUpload, interceptor: interceptor, fileManager: fileManager) + } + + // MARK: - Internal API + + // MARK: Uploadable + + func upload(_ uploadable: UploadRequest.Uploadable, + with convertible: URLRequestConvertible, + interceptor: RequestInterceptor?, + fileManager: FileManager) -> UploadRequest { + let uploadable = Upload(request: convertible, uploadable: uploadable) + + return upload(uploadable, interceptor: interceptor, fileManager: fileManager) + } + + func upload(_ upload: UploadConvertible, interceptor: RequestInterceptor?, fileManager: FileManager) -> UploadRequest { + let request = UploadRequest(convertible: upload, + underlyingQueue: rootQueue, + serializationQueue: serializationQueue, + eventMonitor: eventMonitor, + interceptor: interceptor, + fileManager: fileManager, + delegate: self) + + perform(request) + + return request + } + + // MARK: Perform + + /// Perform `Request`. + /// + /// - Note: Called during retry. + /// + /// - Parameter request: The `Request` to perform. + func perform(_ request: Request) { + switch request { + case let r as DataRequest: perform(r) + case let r as UploadRequest: perform(r) + case let r as DownloadRequest: perform(r) + default: fatalError("Attempted to perform unsupported Request subclass: \(type(of: request))") + } + } + + func perform(_ request: DataRequest) { + requestQueue.async { + guard !request.isCancelled else { return } + + self.activeRequests.insert(request) + + self.performSetupOperations(for: request, convertible: request.convertible) + } + } + + func perform(_ request: UploadRequest) { + requestQueue.async { + guard !request.isCancelled else { return } + + self.activeRequests.insert(request) + + do { + let uploadable = try request.upload.createUploadable() + self.rootQueue.async { request.didCreateUploadable(uploadable) } + + self.performSetupOperations(for: request, convertible: request.convertible) + } catch { + self.rootQueue.async { request.didFailToCreateUploadable(with: error.asAFError(or: .createUploadableFailed(error: error))) } + } + } + } + + func perform(_ request: DownloadRequest) { + requestQueue.async { + guard !request.isCancelled else { return } + + self.activeRequests.insert(request) + + switch request.downloadable { + case let .request(convertible): + self.performSetupOperations(for: request, convertible: convertible) + case let .resumeData(resumeData): + self.rootQueue.async { self.didReceiveResumeData(resumeData, for: request) } + } + } + } + + func performSetupOperations(for request: Request, convertible: URLRequestConvertible) { + let initialRequest: URLRequest + + do { + initialRequest = try convertible.asURLRequest() + try initialRequest.validate() + } catch { + rootQueue.async { request.didFailToCreateURLRequest(with: error.asAFError(or: .createURLRequestFailed(error: error))) } + return + } + + rootQueue.async { request.didCreateInitialURLRequest(initialRequest) } + + guard !request.isCancelled else { return } + + guard let adapter = adapter(for: request) else { + rootQueue.async { self.didCreateURLRequest(initialRequest, for: request) } + return + } + + adapter.adapt(initialRequest, for: self) { result in + do { + let adaptedRequest = try result.get() + try adaptedRequest.validate() + + self.rootQueue.async { + request.didAdaptInitialRequest(initialRequest, to: adaptedRequest) + self.didCreateURLRequest(adaptedRequest, for: request) + } + } catch { + self.rootQueue.async { request.didFailToAdaptURLRequest(initialRequest, withError: .requestAdaptationFailed(error: error)) } + } + } + } + + // MARK: - Task Handling + + func didCreateURLRequest(_ urlRequest: URLRequest, for request: Request) { + request.didCreateURLRequest(urlRequest) + + guard !request.isCancelled else { return } + + let task = request.task(for: urlRequest, using: session) + requestTaskMap[request] = task + request.didCreateTask(task) + + updateStatesForTask(task, request: request) + } + + func didReceiveResumeData(_ data: Data, for request: DownloadRequest) { + guard !request.isCancelled else { return } + + let task = request.task(forResumeData: data, using: session) + requestTaskMap[request] = task + request.didCreateTask(task) + + updateStatesForTask(task, request: request) + } + + func updateStatesForTask(_ task: URLSessionTask, request: Request) { + request.withState { state in + switch state { + case .initialized, .finished: + // Do nothing. + break + case .resumed: + task.resume() + rootQueue.async { request.didResumeTask(task) } + case .suspended: + task.suspend() + rootQueue.async { request.didSuspendTask(task) } + case .cancelled: + // Resume to ensure metrics are gathered. + task.resume() + task.cancel() + rootQueue.async { request.didCancelTask(task) } + } + } + } + + // MARK: - Adapters and Retriers + + func adapter(for request: Request) -> RequestAdapter? { + if let requestInterceptor = request.interceptor, let sessionInterceptor = interceptor { + return Interceptor(adapters: [requestInterceptor, sessionInterceptor]) + } else { + return request.interceptor ?? interceptor + } + } + + func retrier(for request: Request) -> RequestRetrier? { + if let requestInterceptor = request.interceptor, let sessionInterceptor = interceptor { + return Interceptor(retriers: [requestInterceptor, sessionInterceptor]) + } else { + return request.interceptor ?? interceptor + } + } + + // MARK: - Invalidation + + func finishRequestsForDeinit() { + requestTaskMap.requests.forEach { $0.finish(error: AFError.sessionDeinitialized) } + } +} + +// MARK: - RequestDelegate + +extension Session: RequestDelegate { + public var sessionConfiguration: URLSessionConfiguration { + return session.configuration + } + + public var startImmediately: Bool { return startRequestsImmediately } + + public func cleanup(after request: Request) { + activeRequests.remove(request) + } + + public func retryResult(for request: Request, dueTo error: AFError, completion: @escaping (RetryResult) -> Void) { + guard let retrier = retrier(for: request) else { + rootQueue.async { completion(.doNotRetry) } + return + } + + retrier.retry(request, for: self, dueTo: error) { retryResult in + self.rootQueue.async { + guard let retryResultError = retryResult.error else { completion(retryResult); return } + + let retryError = AFError.requestRetryFailed(retryError: retryResultError, originalError: error) + completion(.doNotRetryWithError(retryError)) + } + } + } + + public func retryRequest(_ request: Request, withDelay timeDelay: TimeInterval?) { + rootQueue.async { + let retry: () -> Void = { + guard !request.isCancelled else { return } + + request.prepareForRetry() + self.perform(request) + } + + if let retryDelay = timeDelay { + self.rootQueue.after(retryDelay) { retry() } + } else { + retry() + } + } + } +} + +// MARK: - SessionStateProvider + +extension Session: SessionStateProvider { + func request(for task: URLSessionTask) -> Request? { + return requestTaskMap[task] + } + + func didGatherMetricsForTask(_ task: URLSessionTask) { + requestTaskMap.disassociateIfNecessaryAfterGatheringMetricsForTask(task) + } + + func didCompleteTask(_ task: URLSessionTask) { + requestTaskMap.disassociateIfNecessaryAfterCompletingTask(task) + } + + func credential(for task: URLSessionTask, in protectionSpace: URLProtectionSpace) -> URLCredential? { + return requestTaskMap[task]?.credential ?? + session.configuration.urlCredentialStorage?.defaultCredential(for: protectionSpace) + } + + func cancelRequestsForSessionInvalidation(with error: Error?) { + requestTaskMap.requests.forEach { $0.finish(error: AFError.sessionInvalidated(error: error)) } + } +} diff --git a/Pods/Alamofire/Source/SessionDelegate.swift b/Pods/Alamofire/Source/SessionDelegate.swift new file mode 100644 index 0000000..77f5379 --- /dev/null +++ b/Pods/Alamofire/Source/SessionDelegate.swift @@ -0,0 +1,326 @@ +// +// SessionDelegate.swift +// +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.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 +// 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. +// + +import Foundation + +/// Class which implements the various `URLSessionDelegate` methods to connect various Alamofire features. +open class SessionDelegate: NSObject { + private let fileManager: FileManager + + weak var stateProvider: SessionStateProvider? + var eventMonitor: EventMonitor? + + /// Creates an instance from the given `FileManager`. + /// + /// - Parameter fileManager: `FileManager` to use for underlying file management, such as moving downloaded files. + /// `.default` by default. + public init(fileManager: FileManager = .default) { + self.fileManager = fileManager + } + + /// Internal method to find and cast requests while maintaining some integrity checking. + /// + /// - Parameters: + /// - task: The `URLSessionTask` for which to find the associated `Request`. + /// - type: The `Request` subclass type to cast any `Request` associate with `task`. + func request(for task: URLSessionTask, as type: R.Type) -> R? { + guard let provider = stateProvider else { + assertionFailure("StateProvider is nil.") + return nil + } + + guard let request = provider.request(for: task) as? R else { + fatalError("Returned Request is not of expected type: \(R.self).") + } + + return request + } +} + +/// Type which provides various `Session` state values. +protocol SessionStateProvider: AnyObject { + var serverTrustManager: ServerTrustManager? { get } + var redirectHandler: RedirectHandler? { get } + var cachedResponseHandler: CachedResponseHandler? { get } + + func request(for task: URLSessionTask) -> Request? + func didGatherMetricsForTask(_ task: URLSessionTask) + func didCompleteTask(_ task: URLSessionTask) + func credential(for task: URLSessionTask, in protectionSpace: URLProtectionSpace) -> URLCredential? + func cancelRequestsForSessionInvalidation(with error: Error?) +} + +// MARK: URLSessionDelegate + +extension SessionDelegate: URLSessionDelegate { + open func urlSession(_ session: URLSession, didBecomeInvalidWithError error: Error?) { + eventMonitor?.urlSession(session, didBecomeInvalidWithError: error) + + stateProvider?.cancelRequestsForSessionInvalidation(with: error) + } +} + +// MARK: URLSessionTaskDelegate + +extension SessionDelegate: URLSessionTaskDelegate { + /// Result of a `URLAuthenticationChallenge` evaluation. + typealias ChallengeEvaluation = (disposition: URLSession.AuthChallengeDisposition, credential: URLCredential?, error: AFError?) + + open func urlSession(_ session: URLSession, + task: URLSessionTask, + didReceive challenge: URLAuthenticationChallenge, + completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) { + eventMonitor?.urlSession(session, task: task, didReceive: challenge) + + let evaluation: ChallengeEvaluation + switch challenge.protectionSpace.authenticationMethod { + case NSURLAuthenticationMethodServerTrust: + evaluation = attemptServerTrustAuthentication(with: challenge) + case NSURLAuthenticationMethodHTTPBasic, NSURLAuthenticationMethodHTTPDigest, NSURLAuthenticationMethodNTLM, + NSURLAuthenticationMethodNegotiate, NSURLAuthenticationMethodClientCertificate: + evaluation = attemptCredentialAuthentication(for: challenge, belongingTo: task) + default: + evaluation = (.performDefaultHandling, nil, nil) + } + + if let error = evaluation.error { + stateProvider?.request(for: task)?.didFailTask(task, earlyWithError: error) + } + + completionHandler(evaluation.disposition, evaluation.credential) + } + + /// Evaluates the server trust `URLAuthenticationChallenge` received. + /// + /// - Parameter challenge: The `URLAuthenticationChallenge`. + /// + /// - Returns: The `ChallengeEvaluation`. + func attemptServerTrustAuthentication(with challenge: URLAuthenticationChallenge) -> ChallengeEvaluation { + let host = challenge.protectionSpace.host + + guard challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust, + let trust = challenge.protectionSpace.serverTrust + else { + return (.performDefaultHandling, nil, nil) + } + + do { + guard let evaluator = try stateProvider?.serverTrustManager?.serverTrustEvaluator(forHost: host) else { + return (.performDefaultHandling, nil, nil) + } + + try evaluator.evaluate(trust, forHost: host) + + return (.useCredential, URLCredential(trust: trust), nil) + } catch { + return (.cancelAuthenticationChallenge, nil, error.asAFError(or: .serverTrustEvaluationFailed(reason: .customEvaluationFailed(error: error)))) + } + } + + /// Evaluates the credential-based authentication `URLAuthenticationChallenge` received for `task`. + /// + /// - Parameters: + /// - challenge: The `URLAuthenticationChallenge`. + /// - task: The `URLSessionTask` which received the challenge. + /// + /// - Returns: The `ChallengeEvaluation`. + func attemptCredentialAuthentication(for challenge: URLAuthenticationChallenge, + belongingTo task: URLSessionTask) -> ChallengeEvaluation { + guard challenge.previousFailureCount == 0 else { + return (.rejectProtectionSpace, nil, nil) + } + + guard let credential = stateProvider?.credential(for: task, in: challenge.protectionSpace) else { + return (.performDefaultHandling, nil, nil) + } + + return (.useCredential, credential, nil) + } + + open func urlSession(_ session: URLSession, + task: URLSessionTask, + didSendBodyData bytesSent: Int64, + totalBytesSent: Int64, + totalBytesExpectedToSend: Int64) { + eventMonitor?.urlSession(session, + task: task, + didSendBodyData: bytesSent, + totalBytesSent: totalBytesSent, + totalBytesExpectedToSend: totalBytesExpectedToSend) + + stateProvider?.request(for: task)?.updateUploadProgress(totalBytesSent: totalBytesSent, + totalBytesExpectedToSend: totalBytesExpectedToSend) + } + + open func urlSession(_ session: URLSession, + task: URLSessionTask, + needNewBodyStream completionHandler: @escaping (InputStream?) -> Void) { + eventMonitor?.urlSession(session, taskNeedsNewBodyStream: task) + + guard let request = request(for: task, as: UploadRequest.self) else { + assertionFailure("needNewBodyStream did not find UploadRequest.") + completionHandler(nil) + return + } + + completionHandler(request.inputStream()) + } + + open func urlSession(_ session: URLSession, + task: URLSessionTask, + willPerformHTTPRedirection response: HTTPURLResponse, + newRequest request: URLRequest, + completionHandler: @escaping (URLRequest?) -> Void) { + eventMonitor?.urlSession(session, task: task, willPerformHTTPRedirection: response, newRequest: request) + + if let redirectHandler = stateProvider?.request(for: task)?.redirectHandler ?? stateProvider?.redirectHandler { + redirectHandler.task(task, willBeRedirectedTo: request, for: response, completion: completionHandler) + } else { + completionHandler(request) + } + } + + open func urlSession(_ session: URLSession, task: URLSessionTask, didFinishCollecting metrics: URLSessionTaskMetrics) { + eventMonitor?.urlSession(session, task: task, didFinishCollecting: metrics) + + stateProvider?.request(for: task)?.didGatherMetrics(metrics) + + stateProvider?.didGatherMetricsForTask(task) + } + + open func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) { + eventMonitor?.urlSession(session, task: task, didCompleteWithError: error) + + stateProvider?.request(for: task)?.didCompleteTask(task, with: error.map { $0.asAFError(or: .sessionTaskFailed(error: $0)) }) + + stateProvider?.didCompleteTask(task) + } + + @available(macOS 10.13, iOS 11.0, tvOS 11.0, watchOS 4.0, *) + open func urlSession(_ session: URLSession, taskIsWaitingForConnectivity task: URLSessionTask) { + eventMonitor?.urlSession(session, taskIsWaitingForConnectivity: task) + } +} + +// MARK: URLSessionDataDelegate + +extension SessionDelegate: URLSessionDataDelegate { + open func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data) { + eventMonitor?.urlSession(session, dataTask: dataTask, didReceive: data) + + guard let request = request(for: dataTask, as: DataRequest.self) else { + assertionFailure("dataTask did not find DataRequest.") + return + } + + request.didReceive(data: data) + } + + open func urlSession(_ session: URLSession, + dataTask: URLSessionDataTask, + willCacheResponse proposedResponse: CachedURLResponse, + completionHandler: @escaping (CachedURLResponse?) -> Void) { + eventMonitor?.urlSession(session, dataTask: dataTask, willCacheResponse: proposedResponse) + + if let handler = stateProvider?.request(for: dataTask)?.cachedResponseHandler ?? stateProvider?.cachedResponseHandler { + handler.dataTask(dataTask, willCacheResponse: proposedResponse, completion: completionHandler) + } else { + completionHandler(proposedResponse) + } + } +} + +// MARK: URLSessionDownloadDelegate + +extension SessionDelegate: URLSessionDownloadDelegate { + open func urlSession(_ session: URLSession, + downloadTask: URLSessionDownloadTask, + didResumeAtOffset fileOffset: Int64, + expectedTotalBytes: Int64) { + eventMonitor?.urlSession(session, + downloadTask: downloadTask, + didResumeAtOffset: fileOffset, + expectedTotalBytes: expectedTotalBytes) + guard let downloadRequest = request(for: downloadTask, as: DownloadRequest.self) else { + assertionFailure("downloadTask did not find DownloadRequest.") + return + } + + downloadRequest.updateDownloadProgress(bytesWritten: fileOffset, + totalBytesExpectedToWrite: expectedTotalBytes) + } + + open func urlSession(_ session: URLSession, + downloadTask: URLSessionDownloadTask, + didWriteData bytesWritten: Int64, + totalBytesWritten: Int64, + totalBytesExpectedToWrite: Int64) { + eventMonitor?.urlSession(session, + downloadTask: downloadTask, + didWriteData: bytesWritten, + totalBytesWritten: totalBytesWritten, + totalBytesExpectedToWrite: totalBytesExpectedToWrite) + guard let downloadRequest = request(for: downloadTask, as: DownloadRequest.self) else { + assertionFailure("downloadTask did not find DownloadRequest.") + return + } + + downloadRequest.updateDownloadProgress(bytesWritten: bytesWritten, + totalBytesExpectedToWrite: totalBytesExpectedToWrite) + } + + open func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL) { + eventMonitor?.urlSession(session, downloadTask: downloadTask, didFinishDownloadingTo: location) + + guard let request = request(for: downloadTask, as: DownloadRequest.self) else { + assertionFailure("downloadTask did not find DownloadRequest.") + return + } + + guard let response = request.response else { + fatalError("URLSessionDownloadTask finished downloading with no response.") + } + + let (destination, options) = (request.destination)(location, response) + + eventMonitor?.request(request, didCreateDestinationURL: destination) + + do { + if options.contains(.removePreviousFile), fileManager.fileExists(atPath: destination.path) { + try fileManager.removeItem(at: destination) + } + + if options.contains(.createIntermediateDirectories) { + let directory = destination.deletingLastPathComponent() + try fileManager.createDirectory(at: directory, withIntermediateDirectories: true) + } + + try fileManager.moveItem(at: location, to: destination) + + request.didFinishDownloading(using: downloadTask, with: .success(destination)) + } catch { + request.didFinishDownloading(using: downloadTask, with: .failure(.downloadedFileMoveFailed(error: error, source: location, destination: destination))) + } + } +} diff --git a/Pods/Alamofire/Source/URLConvertible+URLRequestConvertible.swift b/Pods/Alamofire/Source/URLConvertible+URLRequestConvertible.swift new file mode 100644 index 0000000..9ac00ef --- /dev/null +++ b/Pods/Alamofire/Source/URLConvertible+URLRequestConvertible.swift @@ -0,0 +1,105 @@ +// +// URLConvertible+URLRequestConvertible.swift +// +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.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 +// 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. +// + +import Foundation + +/// Types adopting the `URLConvertible` protocol can be used to construct `URL`s, which can then be used to construct +/// `URLRequests`. +public protocol URLConvertible { + /// Returns a `URL` from the conforming instance or throws. + /// + /// - Returns: The `URL` created from the instance. + /// - Throws: Any error thrown while creating the `URL`. + func asURL() throws -> URL +} + +extension String: URLConvertible { + /// Returns a `URL` if `self` can be used to initialize a `URL` instance, otherwise throws. + /// + /// - Returns: The `URL` initialized with `self`. + /// - Throws: An `AFError.invalidURL` instance. + public func asURL() throws -> URL { + guard let url = URL(string: self) else { throw AFError.invalidURL(url: self) } + + return url + } +} + +extension URL: URLConvertible { + /// Returns `self`. + public func asURL() throws -> URL { return self } +} + +extension URLComponents: URLConvertible { + /// Returns a `URL` if the `self`'s `url` is not nil, otherwise throws. + /// + /// - Returns: The `URL` from the `url` property. + /// - Throws: An `AFError.invalidURL` instance. + public func asURL() throws -> URL { + guard let url = url else { throw AFError.invalidURL(url: self) } + + return url + } +} + +// MARK: - + +/// Types adopting the `URLRequestConvertible` protocol can be used to safely construct `URLRequest`s. +public protocol URLRequestConvertible { + /// Returns a `URLRequest` or throws if an `Error` was encountered. + /// + /// - Returns: A `URLRequest`. + /// - Throws: Any error thrown while constructing the `URLRequest`. + func asURLRequest() throws -> URLRequest +} + +extension URLRequestConvertible { + /// The `URLRequest` returned by discarding any `Error` encountered. + public var urlRequest: URLRequest? { return try? asURLRequest() } +} + +extension URLRequest: URLRequestConvertible { + /// Returns `self`. + public func asURLRequest() throws -> URLRequest { return self } +} + +// MARK: - + +extension URLRequest { + /// Creates an instance with the specified `url`, `method`, and `headers`. + /// + /// - Parameters: + /// - url: The `URLConvertible` value. + /// - method: The `HTTPMethod`. + /// - headers: The `HTTPHeaders`, `nil` by default. + /// - Throws: Any error thrown while converting the `URLConvertible` to a `URL`. + public init(url: URLConvertible, method: HTTPMethod, headers: HTTPHeaders? = nil) throws { + let url = try url.asURL() + + self.init(url: url) + + httpMethod = method.rawValue + allHTTPHeaderFields = headers?.dictionary + } +} diff --git a/Pods/Alamofire/Source/URLEncodedFormEncoder.swift b/Pods/Alamofire/Source/URLEncodedFormEncoder.swift new file mode 100644 index 0000000..8da3576 --- /dev/null +++ b/Pods/Alamofire/Source/URLEncodedFormEncoder.swift @@ -0,0 +1,973 @@ +// +// URLEncodedFormEncoder.swift +// +// Copyright (c) 2019 Alamofire Software Foundation (http://alamofire.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 +// 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. +// + +import Foundation + +/// An object that encodes instances into URL-encoded query strings. +/// +/// There is no published specification for how to encode collection types. By default, the convention of appending +/// `[]` to the key for array values (`foo[]=1&foo[]=2`), and appending the key surrounded by square brackets for +/// nested dictionary values (`foo[bar]=baz`) is used. Optionally, `ArrayEncoding` can be used to omit the +/// square brackets appended to array keys. +/// +/// `BoolEncoding` can be used to configure how `Bool` values are encoded. The default behavior is to encode +/// `true` as 1 and `false` as 0. +/// +/// `DateEncoding` can be used to configure how `Date` values are encoded. By default, the `.deferredToDate` +/// strategy is used, which formats dates from their structure. +/// +/// `SpaceEncoding` can be used to configure how spaces are encoded. Modern encodings use percent replacement (`%20`), +/// while older encodings may expect spaces to be replaced with `+`. +/// +/// This type is largely based on Vapor's [`url-encoded-form`](https://github.com/vapor/url-encoded-form) project. +public final class URLEncodedFormEncoder { + /// Encoding to use for `Array` values. + public enum ArrayEncoding { + /// An empty set of square brackets ("[]") are appended to the key for every value. This is the default encoding. + case brackets + /// No brackets are appended to the key and the key is encoded as is. + case noBrackets + + /// Encodes the key according to the encoding. + /// + /// - Parameter key: The `key` to encode. + /// - Returns: The encoded key. + func encode(_ key: String) -> String { + switch self { + case .brackets: return "\(key)[]" + case .noBrackets: return key + } + } + } + + /// Encoding to use for `Bool` values. + public enum BoolEncoding { + /// Encodes `true` as `1`, `false` as `0`. + case numeric + /// Encodes `true` as "true", `false` as "false". This is the default encoding. + case literal + + /// Encodes the given `Bool` as a `String`. + /// + /// - Parameter value: The `Bool` to encode. + /// + /// - Returns: The encoded `String`. + func encode(_ value: Bool) -> String { + switch self { + case .numeric: return value ? "1" : "0" + case .literal: return value ? "true" : "false" + } + } + } + + /// Encoding to use for `Data` values. + public enum DataEncoding { + /// Defers encoding to the `Data` type. + case deferredToData + /// Encodes `Data` as a Base64-encoded string. This is the default encoding. + case base64 + /// Encode the `Data` as a custom value encoded by the given closure. + case custom((Data) throws -> String) + + /// Encodes `Data` according to the encoding. + /// + /// - Parameter data: The `Data` to encode. + /// + /// - Returns: The encoded `String`, or `nil` if the `Data` should be encoded according to its + /// `Encodable` implementation. + func encode(_ data: Data) throws -> String? { + switch self { + case .deferredToData: return nil + case .base64: return data.base64EncodedString() + case let .custom(encoding): return try encoding(data) + } + } + } + + /// Encoding to use for `Date` values. + public enum DateEncoding { + /// ISO8601 and RFC3339 formatter. + private static let iso8601Formatter: ISO8601DateFormatter = { + let formatter = ISO8601DateFormatter() + formatter.formatOptions = .withInternetDateTime + return formatter + }() + + /// Defers encoding to the `Date` type. This is the default encoding. + case deferredToDate + /// Encodes `Date`s as seconds since midnight UTC on January 1, 1970. + case secondsSince1970 + /// Encodes `Date`s as milliseconds since midnight UTC on January 1, 1970. + case millisecondsSince1970 + /// Encodes `Date`s according to the ISO8601 and RFC3339 standards. + case iso8601 + /// Encodes `Date`s using the given `DateFormatter`. + case formatted(DateFormatter) + /// Encodes `Date`s using the given closure. + case custom((Date) throws -> String) + + /// Encodes the date according to the encoding. + /// + /// - Parameter date: The `Date` to encode. + /// + /// - Returns: The encoded `String`, or `nil` if the `Date` should be encoded according to its + /// `Encodable` implementation. + func encode(_ date: Date) throws -> String? { + switch self { + case .deferredToDate: + return nil + case .secondsSince1970: + return String(date.timeIntervalSince1970) + case .millisecondsSince1970: + return String(date.timeIntervalSince1970 * 1000.0) + case .iso8601: + return DateEncoding.iso8601Formatter.string(from: date) + case let .formatted(formatter): + return formatter.string(from: date) + case let .custom(closure): + return try closure(date) + } + } + } + + /// Encoding to use for keys. + /// + /// This type is derived from [`JSONEncoder`'s `KeyEncodingStrategy`](https://github.com/apple/swift/blob/6aa313b8dd5f05135f7f878eccc1db6f9fbe34ff/stdlib/public/Darwin/Foundation/JSONEncoder.swift#L128) + /// and [`XMLEncoder`s `KeyEncodingStrategy`](https://github.com/MaxDesiatov/XMLCoder/blob/master/Sources/XMLCoder/Encoder/XMLEncoder.swift#L102). + public enum KeyEncoding { + /// Use the keys specified by each type. This is the default encoding. + case useDefaultKeys + /// Convert from "camelCaseKeys" to "snake_case_keys" before writing a key. + /// + /// Capital characters are determined by testing membership in + /// `CharacterSet.uppercaseLetters` and `CharacterSet.lowercaseLetters` + /// (Unicode General Categories Lu and Lt). + /// The conversion to lower case uses `Locale.system`, also known as + /// the ICU "root" locale. This means the result is consistent + /// regardless of the current user's locale and language preferences. + /// + /// Converting from camel case to snake case: + /// 1. Splits words at the boundary of lower-case to upper-case + /// 2. Inserts `_` between words + /// 3. Lowercases the entire string + /// 4. Preserves starting and ending `_`. + /// + /// For example, `oneTwoThree` becomes `one_two_three`. `_oneTwoThree_` becomes `_one_two_three_`. + /// + /// - Note: Using a key encoding strategy has a nominal performance cost, as each string key has to be converted. + case convertToSnakeCase + /// Same as convertToSnakeCase, but using `-` instead of `_`. + /// For example `oneTwoThree` becomes `one-two-three`. + case convertToKebabCase + /// Capitalize the first letter only. + /// For example `oneTwoThree` becomes `OneTwoThree`. + case capitalized + /// Uppercase all letters. + /// For example `oneTwoThree` becomes `ONETWOTHREE`. + case uppercased + /// Lowercase all letters. + /// For example `oneTwoThree` becomes `onetwothree`. + case lowercased + /// A custom encoding using the provided closure. + case custom((String) -> String) + + func encode(_ key: String) -> String { + switch self { + case .useDefaultKeys: return key + case .convertToSnakeCase: return convertToSnakeCase(key) + case .convertToKebabCase: return convertToKebabCase(key) + case .capitalized: return String(key.prefix(1).uppercased() + key.dropFirst()) + case .uppercased: return key.uppercased() + case .lowercased: return key.lowercased() + case let .custom(encoding): return encoding(key) + } + } + + private func convertToSnakeCase(_ key: String) -> String { + return convert(key, usingSeparator: "_") + } + + private func convertToKebabCase(_ key: String) -> String { + return convert(key, usingSeparator: "-") + } + + private func convert(_ key: String, usingSeparator separator: String) -> String { + guard !key.isEmpty else { return key } + + var words: [Range] = [] + // The general idea of this algorithm is to split words on + // transition from lower to upper case, then on transition of >1 + // upper case characters to lowercase + // + // myProperty -> my_property + // myURLProperty -> my_url_property + // + // It is assumed, per Swift naming conventions, that the first character of the key is lowercase. + var wordStart = key.startIndex + var searchRange = key.index(after: wordStart)..1 capital letters. Turn those into a word, stopping at the capital before the lower case character. + let beforeLowerIndex = key.index(before: lowerCaseRange.lowerBound) + words.append(upperCaseRange.lowerBound.. String { + switch self { + case .percentEscaped: return string.replacingOccurrences(of: " ", with: "%20") + case .plusReplaced: return string.replacingOccurrences(of: " ", with: "+") + } + } + } + + /// `URLEncodedFormEncoder` error. + public enum Error: Swift.Error { + /// An invalid root object was created by the encoder. Only keyed values are valid. + case invalidRootObject(String) + + var localizedDescription: String { + switch self { + case let .invalidRootObject(object): + return "URLEncodedFormEncoder requires keyed root object. Received \(object) instead." + } + } + } + + /// Whether or not to sort the encoded key value pairs. + /// + /// - Note: This setting ensures a consistent ordering for all encodings of the same parameters. When set to `false`, + /// encoded `Dictionary` values may have a different encoded order each time they're encoded due to + /// ` Dictionary`'s random storage order, but `Encodable` types will maintain their encoded order. + public let alphabetizeKeyValuePairs: Bool + /// The `ArrayEncoding` to use. + public let arrayEncoding: ArrayEncoding + /// The `BoolEncoding` to use. + public let boolEncoding: BoolEncoding + /// THe `DataEncoding` to use. + public let dataEncoding: DataEncoding + /// The `DateEncoding` to use. + public let dateEncoding: DateEncoding + /// The `KeyEncoding` to use. + public let keyEncoding: KeyEncoding + /// The `SpaceEncoding` to use. + public let spaceEncoding: SpaceEncoding + /// The `CharacterSet` of allowed (non-escaped) characters. + public var allowedCharacters: CharacterSet + + /// Creates an instance from the supplied parameters. + /// + /// - Parameters: + /// - alphabetizeKeyValuePairs: Whether or not to sort the encoded key value pairs. `true` by default. + /// - arrayEncoding: The `ArrayEncoding` to use. `.brackets` by default. + /// - boolEncoding: The `BoolEncoding` to use. `.numeric` by default. + /// - dataEncoding: The `DataEncoding` to use. `.base64` by default. + /// - dateEncoding: The `DateEncoding` to use. `.deferredToDate` by default. + /// - keyEncoding: The `KeyEncoding` to use. `.useDefaultKeys` by default. + /// - spaceEncoding: The `SpaceEncoding` to use. `.percentEscaped` by default. + /// - allowedCharacters: The `CharacterSet` of allowed (non-escaped) characters. `.afURLQueryAllowed` by + /// default. + public init(alphabetizeKeyValuePairs: Bool = true, + arrayEncoding: ArrayEncoding = .brackets, + boolEncoding: BoolEncoding = .numeric, + dataEncoding: DataEncoding = .base64, + dateEncoding: DateEncoding = .deferredToDate, + keyEncoding: KeyEncoding = .useDefaultKeys, + spaceEncoding: SpaceEncoding = .percentEscaped, + allowedCharacters: CharacterSet = .afURLQueryAllowed) { + self.alphabetizeKeyValuePairs = alphabetizeKeyValuePairs + self.arrayEncoding = arrayEncoding + self.boolEncoding = boolEncoding + self.dataEncoding = dataEncoding + self.dateEncoding = dateEncoding + self.keyEncoding = keyEncoding + self.spaceEncoding = spaceEncoding + self.allowedCharacters = allowedCharacters + } + + func encode(_ value: Encodable) throws -> URLEncodedFormComponent { + let context = URLEncodedFormContext(.object([])) + let encoder = _URLEncodedFormEncoder(context: context, + boolEncoding: boolEncoding, + dataEncoding: dataEncoding, + dateEncoding: dateEncoding) + try value.encode(to: encoder) + + return context.component + } + + /// Encodes the `value` as a URL form encoded `String`. + /// + /// - Parameter value: The `Encodable` value.` + /// + /// - Returns: The encoded `String`. + /// - Throws: An `Error` or `EncodingError` instance if encoding fails. + public func encode(_ value: Encodable) throws -> String { + let component: URLEncodedFormComponent = try encode(value) + + guard case let .object(object) = component else { + throw Error.invalidRootObject("\(component)") + } + + let serializer = URLEncodedFormSerializer(alphabetizeKeyValuePairs: alphabetizeKeyValuePairs, + arrayEncoding: arrayEncoding, + keyEncoding: keyEncoding, + spaceEncoding: spaceEncoding, + allowedCharacters: allowedCharacters) + let query = serializer.serialize(object) + + return query + } + + /// Encodes the value as `Data`. This is performed by first creating an encoded `String` and then returning the + /// `.utf8` data. + /// + /// - Parameter value: The `Encodable` value. + /// + /// - Returns: The encoded `Data`. + /// + /// - Throws: An `Error` or `EncodingError` instance if encoding fails. + public func encode(_ value: Encodable) throws -> Data { + let string: String = try encode(value) + + return Data(string.utf8) + } +} + +final class _URLEncodedFormEncoder { + var codingPath: [CodingKey] + // Returns an empty dictionary, as this encoder doesn't support userInfo. + var userInfo: [CodingUserInfoKey: Any] { return [:] } + + let context: URLEncodedFormContext + + private let boolEncoding: URLEncodedFormEncoder.BoolEncoding + private let dataEncoding: URLEncodedFormEncoder.DataEncoding + private let dateEncoding: URLEncodedFormEncoder.DateEncoding + + init(context: URLEncodedFormContext, + codingPath: [CodingKey] = [], + boolEncoding: URLEncodedFormEncoder.BoolEncoding, + dataEncoding: URLEncodedFormEncoder.DataEncoding, + dateEncoding: URLEncodedFormEncoder.DateEncoding) { + self.context = context + self.codingPath = codingPath + self.boolEncoding = boolEncoding + self.dataEncoding = dataEncoding + self.dateEncoding = dateEncoding + } +} + +extension _URLEncodedFormEncoder: Encoder { + func container(keyedBy type: Key.Type) -> KeyedEncodingContainer where Key: CodingKey { + let container = _URLEncodedFormEncoder.KeyedContainer(context: context, + codingPath: codingPath, + boolEncoding: boolEncoding, + dataEncoding: dataEncoding, + dateEncoding: dateEncoding) + return KeyedEncodingContainer(container) + } + + func unkeyedContainer() -> UnkeyedEncodingContainer { + return _URLEncodedFormEncoder.UnkeyedContainer(context: context, + codingPath: codingPath, + boolEncoding: boolEncoding, + dataEncoding: dataEncoding, + dateEncoding: dateEncoding) + } + + func singleValueContainer() -> SingleValueEncodingContainer { + return _URLEncodedFormEncoder.SingleValueContainer(context: context, + codingPath: codingPath, + boolEncoding: boolEncoding, + dataEncoding: dataEncoding, + dateEncoding: dateEncoding) + } +} + +final class URLEncodedFormContext { + var component: URLEncodedFormComponent + + init(_ component: URLEncodedFormComponent) { + self.component = component + } +} + +enum URLEncodedFormComponent { + typealias Object = [(key: String, value: URLEncodedFormComponent)] + + case string(String) + case array([URLEncodedFormComponent]) + case object(Object) + + /// Converts self to an `[URLEncodedFormData]` or returns `nil` if not convertible. + var array: [URLEncodedFormComponent]? { + switch self { + case let .array(array): return array + default: return nil + } + } + + /// Converts self to an `Object` or returns `nil` if not convertible. + var object: Object? { + switch self { + case let .object(object): return object + default: return nil + } + } + + /// Sets self to the supplied value at a given path. + /// + /// data.set(to: "hello", at: ["path", "to", "value"]) + /// + /// - parameters: + /// - value: Value of `Self` to set at the supplied path. + /// - path: `CodingKey` path to update with the supplied value. + public mutating func set(to value: URLEncodedFormComponent, at path: [CodingKey]) { + set(&self, to: value, at: path) + } + + /// Recursive backing method to `set(to:at:)`. + private func set(_ context: inout URLEncodedFormComponent, to value: URLEncodedFormComponent, at path: [CodingKey]) { + guard path.count >= 1 else { + context = value + return + } + + let end = path[0] + var child: URLEncodedFormComponent + switch path.count { + case 1: + child = value + case 2...: + if let index = end.intValue { + let array = context.array ?? [] + if array.count > index { + child = array[index] + } else { + child = .array([]) + } + set(&child, to: value, at: Array(path[1...])) + } else { + child = context.object?.first { $0.key == end.stringValue }?.value ?? .object(.init()) + set(&child, to: value, at: Array(path[1...])) + } + default: fatalError("Unreachable") + } + + if let index = end.intValue { + if var array = context.array { + if array.count > index { + array[index] = child + } else { + array.append(child) + } + context = .array(array) + } else { + context = .array([child]) + } + } else { + if var object = context.object { + if let index = object.firstIndex(where: { $0.key == end.stringValue }) { + object[index] = (key: end.stringValue, value: child) + } else { + object.append((key: end.stringValue, value: child)) + } + context = .object(object) + } else { + context = .object([(key: end.stringValue, value: child)]) + } + } + } +} + +struct AnyCodingKey: CodingKey, Hashable { + let stringValue: String + let intValue: Int? + + init?(stringValue: String) { + self.stringValue = stringValue + intValue = nil + } + + init?(intValue: Int) { + stringValue = "\(intValue)" + self.intValue = intValue + } + + init(_ base: Key) where Key: CodingKey { + if let intValue = base.intValue { + self.init(intValue: intValue)! + } else { + self.init(stringValue: base.stringValue)! + } + } +} + +extension _URLEncodedFormEncoder { + final class KeyedContainer where Key: CodingKey { + var codingPath: [CodingKey] + + private let context: URLEncodedFormContext + private let boolEncoding: URLEncodedFormEncoder.BoolEncoding + private let dataEncoding: URLEncodedFormEncoder.DataEncoding + private let dateEncoding: URLEncodedFormEncoder.DateEncoding + + init(context: URLEncodedFormContext, + codingPath: [CodingKey], + boolEncoding: URLEncodedFormEncoder.BoolEncoding, + dataEncoding: URLEncodedFormEncoder.DataEncoding, + dateEncoding: URLEncodedFormEncoder.DateEncoding) { + self.context = context + self.codingPath = codingPath + self.boolEncoding = boolEncoding + self.dataEncoding = dataEncoding + self.dateEncoding = dateEncoding + } + + private func nestedCodingPath(for key: CodingKey) -> [CodingKey] { + return codingPath + [key] + } + } +} + +extension _URLEncodedFormEncoder.KeyedContainer: KeyedEncodingContainerProtocol { + func encodeNil(forKey key: Key) throws { + let context = EncodingError.Context(codingPath: codingPath, + debugDescription: "URLEncodedFormEncoder cannot encode nil values.") + throw EncodingError.invalidValue("\(key): nil", context) + } + + func encode(_ value: T, forKey key: Key) throws where T: Encodable { + var container = nestedSingleValueEncoder(for: key) + try container.encode(value) + } + + func nestedSingleValueEncoder(for key: Key) -> SingleValueEncodingContainer { + let container = _URLEncodedFormEncoder.SingleValueContainer(context: context, + codingPath: nestedCodingPath(for: key), + boolEncoding: boolEncoding, + dataEncoding: dataEncoding, + dateEncoding: dateEncoding) + + return container + } + + func nestedUnkeyedContainer(forKey key: Key) -> UnkeyedEncodingContainer { + let container = _URLEncodedFormEncoder.UnkeyedContainer(context: context, + codingPath: nestedCodingPath(for: key), + boolEncoding: boolEncoding, + dataEncoding: dataEncoding, + dateEncoding: dateEncoding) + + return container + } + + func nestedContainer(keyedBy keyType: NestedKey.Type, forKey key: Key) -> KeyedEncodingContainer where NestedKey: CodingKey { + let container = _URLEncodedFormEncoder.KeyedContainer(context: context, + codingPath: nestedCodingPath(for: key), + boolEncoding: boolEncoding, + dataEncoding: dataEncoding, + dateEncoding: dateEncoding) + + return KeyedEncodingContainer(container) + } + + func superEncoder() -> Encoder { + return _URLEncodedFormEncoder(context: context, + codingPath: codingPath, + boolEncoding: boolEncoding, + dataEncoding: dataEncoding, + dateEncoding: dateEncoding) + } + + func superEncoder(forKey key: Key) -> Encoder { + return _URLEncodedFormEncoder(context: context, + codingPath: nestedCodingPath(for: key), + boolEncoding: boolEncoding, + dataEncoding: dataEncoding, + dateEncoding: dateEncoding) + } +} + +extension _URLEncodedFormEncoder { + final class SingleValueContainer { + var codingPath: [CodingKey] + + private var canEncodeNewValue = true + + private let context: URLEncodedFormContext + private let boolEncoding: URLEncodedFormEncoder.BoolEncoding + private let dataEncoding: URLEncodedFormEncoder.DataEncoding + private let dateEncoding: URLEncodedFormEncoder.DateEncoding + + init(context: URLEncodedFormContext, + codingPath: [CodingKey], + boolEncoding: URLEncodedFormEncoder.BoolEncoding, + dataEncoding: URLEncodedFormEncoder.DataEncoding, + dateEncoding: URLEncodedFormEncoder.DateEncoding) { + self.context = context + self.codingPath = codingPath + self.boolEncoding = boolEncoding + self.dataEncoding = dataEncoding + self.dateEncoding = dateEncoding + } + + private func checkCanEncode(value: Any?) throws { + guard canEncodeNewValue else { + let context = EncodingError.Context(codingPath: codingPath, + debugDescription: "Attempt to encode value through single value container when previously value already encoded.") + throw EncodingError.invalidValue(value as Any, context) + } + } + } +} + +extension _URLEncodedFormEncoder.SingleValueContainer: SingleValueEncodingContainer { + func encodeNil() throws { + try checkCanEncode(value: nil) + defer { canEncodeNewValue = false } + + let context = EncodingError.Context(codingPath: codingPath, + debugDescription: "URLEncodedFormEncoder cannot encode nil values.") + throw EncodingError.invalidValue("nil", context) + } + + func encode(_ value: Bool) throws { + try encode(value, as: String(boolEncoding.encode(value))) + } + + func encode(_ value: String) throws { + try encode(value, as: value) + } + + func encode(_ value: Double) throws { + try encode(value, as: String(value)) + } + + func encode(_ value: Float) throws { + try encode(value, as: String(value)) + } + + func encode(_ value: Int) throws { + try encode(value, as: String(value)) + } + + func encode(_ value: Int8) throws { + try encode(value, as: String(value)) + } + + func encode(_ value: Int16) throws { + try encode(value, as: String(value)) + } + + func encode(_ value: Int32) throws { + try encode(value, as: String(value)) + } + + func encode(_ value: Int64) throws { + try encode(value, as: String(value)) + } + + func encode(_ value: UInt) throws { + try encode(value, as: String(value)) + } + + func encode(_ value: UInt8) throws { + try encode(value, as: String(value)) + } + + func encode(_ value: UInt16) throws { + try encode(value, as: String(value)) + } + + func encode(_ value: UInt32) throws { + try encode(value, as: String(value)) + } + + func encode(_ value: UInt64) throws { + try encode(value, as: String(value)) + } + + private func encode(_ value: T, as string: String) throws where T: Encodable { + try checkCanEncode(value: value) + defer { canEncodeNewValue = false } + + context.component.set(to: .string(string), at: codingPath) + } + + func encode(_ value: T) throws where T: Encodable { + switch value { + case let date as Date: + guard let string = try dateEncoding.encode(date) else { + try attemptToEncode(value) + return + } + + try encode(value, as: string) + case let data as Data: + guard let string = try dataEncoding.encode(data) else { + try attemptToEncode(value) + return + } + + try encode(value, as: string) + default: + try attemptToEncode(value) + } + } + + private func attemptToEncode(_ value: T) throws where T: Encodable { + try checkCanEncode(value: value) + defer { canEncodeNewValue = false } + + let encoder = _URLEncodedFormEncoder(context: context, + codingPath: codingPath, + boolEncoding: boolEncoding, + dataEncoding: dataEncoding, + dateEncoding: dateEncoding) + try value.encode(to: encoder) + } +} + +extension _URLEncodedFormEncoder { + final class UnkeyedContainer { + var codingPath: [CodingKey] + + var count = 0 + var nestedCodingPath: [CodingKey] { + return codingPath + [AnyCodingKey(intValue: count)!] + } + + private let context: URLEncodedFormContext + private let boolEncoding: URLEncodedFormEncoder.BoolEncoding + private let dataEncoding: URLEncodedFormEncoder.DataEncoding + private let dateEncoding: URLEncodedFormEncoder.DateEncoding + + init(context: URLEncodedFormContext, + codingPath: [CodingKey], + boolEncoding: URLEncodedFormEncoder.BoolEncoding, + dataEncoding: URLEncodedFormEncoder.DataEncoding, + dateEncoding: URLEncodedFormEncoder.DateEncoding) { + self.context = context + self.codingPath = codingPath + self.boolEncoding = boolEncoding + self.dataEncoding = dataEncoding + self.dateEncoding = dateEncoding + } + } +} + +extension _URLEncodedFormEncoder.UnkeyedContainer: UnkeyedEncodingContainer { + func encodeNil() throws { + let context = EncodingError.Context(codingPath: codingPath, + debugDescription: "URLEncodedFormEncoder cannot encode nil values.") + throw EncodingError.invalidValue("nil", context) + } + + func encode(_ value: T) throws where T: Encodable { + var container = nestedSingleValueContainer() + try container.encode(value) + } + + func nestedSingleValueContainer() -> SingleValueEncodingContainer { + defer { count += 1 } + + return _URLEncodedFormEncoder.SingleValueContainer(context: context, + codingPath: nestedCodingPath, + boolEncoding: boolEncoding, + dataEncoding: dataEncoding, + dateEncoding: dateEncoding) + } + + func nestedContainer(keyedBy keyType: NestedKey.Type) -> KeyedEncodingContainer where NestedKey: CodingKey { + defer { count += 1 } + let container = _URLEncodedFormEncoder.KeyedContainer(context: context, + codingPath: nestedCodingPath, + boolEncoding: boolEncoding, + dataEncoding: dataEncoding, + dateEncoding: dateEncoding) + + return KeyedEncodingContainer(container) + } + + func nestedUnkeyedContainer() -> UnkeyedEncodingContainer { + defer { count += 1 } + + return _URLEncodedFormEncoder.UnkeyedContainer(context: context, + codingPath: nestedCodingPath, + boolEncoding: boolEncoding, + dataEncoding: dataEncoding, + dateEncoding: dateEncoding) + } + + func superEncoder() -> Encoder { + defer { count += 1 } + + return _URLEncodedFormEncoder(context: context, + codingPath: codingPath, + boolEncoding: boolEncoding, + dataEncoding: dataEncoding, + dateEncoding: dateEncoding) + } +} + +final class URLEncodedFormSerializer { + private let alphabetizeKeyValuePairs: Bool + private let arrayEncoding: URLEncodedFormEncoder.ArrayEncoding + private let keyEncoding: URLEncodedFormEncoder.KeyEncoding + private let spaceEncoding: URLEncodedFormEncoder.SpaceEncoding + private let allowedCharacters: CharacterSet + + init(alphabetizeKeyValuePairs: Bool, + arrayEncoding: URLEncodedFormEncoder.ArrayEncoding, + keyEncoding: URLEncodedFormEncoder.KeyEncoding, + spaceEncoding: URLEncodedFormEncoder.SpaceEncoding, + allowedCharacters: CharacterSet) { + self.alphabetizeKeyValuePairs = alphabetizeKeyValuePairs + self.arrayEncoding = arrayEncoding + self.keyEncoding = keyEncoding + self.spaceEncoding = spaceEncoding + self.allowedCharacters = allowedCharacters + } + + func serialize(_ object: URLEncodedFormComponent.Object) -> String { + var output: [String] = [] + for (key, component) in object { + let value = serialize(component, forKey: key) + output.append(value) + } + output = alphabetizeKeyValuePairs ? output.sorted() : output + + return output.joinedWithAmpersands() + } + + func serialize(_ component: URLEncodedFormComponent, forKey key: String) -> String { + switch component { + case let .string(string): return "\(escape(keyEncoding.encode(key)))=\(escape(string))" + case let .array(array): return serialize(array, forKey: key) + case let .object(object): return serialize(object, forKey: key) + } + } + + func serialize(_ object: URLEncodedFormComponent.Object, forKey key: String) -> String { + var segments: [String] = object.map { subKey, value in + let keyPath = "[\(subKey)]" + return serialize(value, forKey: key + keyPath) + } + segments = alphabetizeKeyValuePairs ? segments.sorted() : segments + + return segments.joinedWithAmpersands() + } + + func serialize(_ array: [URLEncodedFormComponent], forKey key: String) -> String { + var segments: [String] = array.map { component in + let keyPath = arrayEncoding.encode(key) + return serialize(component, forKey: keyPath) + } + segments = alphabetizeKeyValuePairs ? segments.sorted() : segments + + return segments.joinedWithAmpersands() + } + + func escape(_ query: String) -> String { + var allowedCharactersWithSpace = allowedCharacters + allowedCharactersWithSpace.insert(charactersIn: " ") + let escapedQuery = query.addingPercentEncoding(withAllowedCharacters: allowedCharactersWithSpace) ?? query + let spaceEncodedQuery = spaceEncoding.encode(escapedQuery) + + return spaceEncodedQuery + } +} + +extension Array where Element == String { + func joinedWithAmpersands() -> String { + return joined(separator: "&") + } +} + +public extension CharacterSet { + /// Creates a CharacterSet from RFC 3986 allowed characters. + /// + /// RFC 3986 states that the following characters are "reserved" characters. + /// + /// - General Delimiters: ":", "#", "[", "]", "@", "?", "/" + /// - Sub-Delimiters: "!", "$", "&", "'", "(", ")", "*", "+", ",", ";", "=" + /// + /// In RFC 3986 - Section 3.4, it states that the "?" and "/" characters should not be escaped to allow + /// query strings to include a URL. Therefore, all "reserved" characters with the exception of "?" and "/" + /// should be percent-escaped in the query string. + static let afURLQueryAllowed: CharacterSet = { + let generalDelimitersToEncode = ":#[]@" // does not include "?" or "/" due to RFC 3986 - Section 3.4 + let subDelimitersToEncode = "!$&'()*+,;=" + let encodableDelimiters = CharacterSet(charactersIn: "\(generalDelimitersToEncode)\(subDelimitersToEncode)") + + return CharacterSet.urlQueryAllowed.subtracting(encodableDelimiters) + }() +} diff --git a/Pods/Alamofire/Source/URLRequest+Alamofire.swift b/Pods/Alamofire/Source/URLRequest+Alamofire.swift new file mode 100644 index 0000000..b198fe0 --- /dev/null +++ b/Pods/Alamofire/Source/URLRequest+Alamofire.swift @@ -0,0 +1,39 @@ +// +// URLRequest+Alamofire.swift +// +// Copyright (c) 2019 Alamofire Software Foundation (http://alamofire.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 +// 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. +// + +import Foundation + +public extension URLRequest { + /// Returns the `httpMethod` as Alamofire's `HTTPMethod` type. + var method: HTTPMethod? { + get { return httpMethod.flatMap(HTTPMethod.init) } + set { httpMethod = newValue?.rawValue } + } + + func validate() throws { + if method == .get, let bodyData = httpBody { + throw AFError.urlRequestValidationFailed(reason: .bodyDataInGETRequest(bodyData)) + } + } +} diff --git a/Pods/Alamofire/Source/URLSessionConfiguration+Alamofire.swift b/Pods/Alamofire/Source/URLSessionConfiguration+Alamofire.swift new file mode 100644 index 0000000..de3e290 --- /dev/null +++ b/Pods/Alamofire/Source/URLSessionConfiguration+Alamofire.swift @@ -0,0 +1,37 @@ +// +// URLSessionConfiguration+Alamofire.swift +// +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.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 +// 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. +// + +import Foundation + +extension URLSessionConfiguration: AlamofireExtended {} +extension AlamofireExtension where ExtendedType: URLSessionConfiguration { + /// Alamofire's default configuration. Same as `URLSessionConfiguration.default` but adds Alamofire default + /// `Accept-Language`, `Accept-Encoding`, and `User-Agent` headers. + public static var `default`: URLSessionConfiguration { + let configuration = URLSessionConfiguration.default + configuration.headers = .default + + return configuration + } +} diff --git a/Pods/Alamofire/Source/Validation.swift b/Pods/Alamofire/Source/Validation.swift new file mode 100644 index 0000000..d0def32 --- /dev/null +++ b/Pods/Alamofire/Source/Validation.swift @@ -0,0 +1,247 @@ +// +// Validation.swift +// +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.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 +// 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. +// + +import Foundation + +extension Request { + // MARK: Helper Types + + fileprivate typealias ErrorReason = AFError.ResponseValidationFailureReason + + /// Used to represent whether a validation succeeded or failed. + public typealias ValidationResult = Result + + fileprivate struct MIMEType { + let type: String + let subtype: String + + var isWildcard: Bool { return type == "*" && subtype == "*" } + + init?(_ string: String) { + let components: [String] = { + let stripped = string.trimmingCharacters(in: .whitespacesAndNewlines) + let split = stripped[..<(stripped.range(of: ";")?.lowerBound ?? stripped.endIndex)] + + return split.components(separatedBy: "/") + }() + + if let type = components.first, let subtype = components.last { + self.type = type + self.subtype = subtype + } else { + return nil + } + } + + func matches(_ mime: MIMEType) -> Bool { + switch (type, subtype) { + case (mime.type, mime.subtype), (mime.type, "*"), ("*", mime.subtype), ("*", "*"): + return true + default: + return false + } + } + } + + // MARK: Properties + + fileprivate var acceptableStatusCodes: Range { return 200..<300 } + + fileprivate var acceptableContentTypes: [String] { + if let accept = request?.value(forHTTPHeaderField: "Accept") { + return accept.components(separatedBy: ",") + } + + return ["*/*"] + } + + // MARK: Status Code + + fileprivate func validate(statusCode acceptableStatusCodes: S, + response: HTTPURLResponse) + -> ValidationResult + where S.Iterator.Element == Int { + if acceptableStatusCodes.contains(response.statusCode) { + return .success(Void()) + } else { + let reason: ErrorReason = .unacceptableStatusCode(code: response.statusCode) + return .failure(AFError.responseValidationFailed(reason: reason)) + } + } + + // MARK: Content Type + + fileprivate func validate(contentType acceptableContentTypes: S, + response: HTTPURLResponse, + data: Data?) + -> ValidationResult + where S.Iterator.Element == String { + guard let data = data, !data.isEmpty else { return .success(Void()) } + + guard + let responseContentType = response.mimeType, + let responseMIMEType = MIMEType(responseContentType) + else { + for contentType in acceptableContentTypes { + if let mimeType = MIMEType(contentType), mimeType.isWildcard { + return .success(Void()) + } + } + + let error: AFError = { + let reason: ErrorReason = .missingContentType(acceptableContentTypes: Array(acceptableContentTypes)) + return AFError.responseValidationFailed(reason: reason) + }() + + return .failure(error) + } + + for contentType in acceptableContentTypes { + if let acceptableMIMEType = MIMEType(contentType), acceptableMIMEType.matches(responseMIMEType) { + return .success(Void()) + } + } + + let error: AFError = { + let reason: ErrorReason = .unacceptableContentType(acceptableContentTypes: Array(acceptableContentTypes), + responseContentType: responseContentType) + + return AFError.responseValidationFailed(reason: reason) + }() + + return .failure(error) + } +} + +// MARK: - + +extension DataRequest { + /// A closure used to validate a request that takes a URL request, a URL response and data, and returns whether the + /// request was valid. + public typealias Validation = (URLRequest?, HTTPURLResponse, Data?) -> ValidationResult + + /// Validates that the response has a status code in the specified sequence. + /// + /// If validation fails, subsequent calls to response handlers will have an associated error. + /// + /// - parameter range: The range of acceptable status codes. + /// + /// - returns: The request. + @discardableResult + public func validate(statusCode acceptableStatusCodes: S) -> Self where S.Iterator.Element == Int { + return validate { [unowned self] _, response, _ in + self.validate(statusCode: acceptableStatusCodes, response: response) + } + } + + /// Validates that the response has a content type in the specified sequence. + /// + /// If validation fails, subsequent calls to response handlers will have an associated error. + /// + /// - parameter contentType: The acceptable content types, which may specify wildcard types and/or subtypes. + /// + /// - returns: The request. + @discardableResult + public func validate(contentType acceptableContentTypes: @escaping @autoclosure () -> S) -> Self where S.Iterator.Element == String { + return validate { [unowned self] _, response, data in + self.validate(contentType: acceptableContentTypes(), response: response, data: data) + } + } + + /// Validates that the response has a status code in the default acceptable range of 200...299, and that the content + /// type matches any specified in the Accept HTTP header field. + /// + /// If validation fails, subsequent calls to response handlers will have an associated error. + /// + /// - returns: The request. + @discardableResult + public func validate() -> Self { + let contentTypes: () -> [String] = { [unowned self] in + self.acceptableContentTypes + } + return validate(statusCode: acceptableStatusCodes).validate(contentType: contentTypes()) + } +} + +// MARK: - + +extension DownloadRequest { + /// A closure used to validate a request that takes a URL request, a URL response, a temporary URL and a + /// destination URL, and returns whether the request was valid. + public typealias Validation = (_ request: URLRequest?, + _ response: HTTPURLResponse, + _ fileURL: URL?) + -> ValidationResult + + /// Validates that the response has a status code in the specified sequence. + /// + /// If validation fails, subsequent calls to response handlers will have an associated error. + /// + /// - parameter range: The range of acceptable status codes. + /// + /// - returns: The request. + @discardableResult + public func validate(statusCode acceptableStatusCodes: S) -> Self where S.Iterator.Element == Int { + return validate { [unowned self] _, response, _ in + self.validate(statusCode: acceptableStatusCodes, response: response) + } + } + + /// Validates that the response has a content type in the specified sequence. + /// + /// If validation fails, subsequent calls to response handlers will have an associated error. + /// + /// - parameter contentType: The acceptable content types, which may specify wildcard types and/or subtypes. + /// + /// - returns: The request. + @discardableResult + public func validate(contentType acceptableContentTypes: @escaping @autoclosure () -> S) -> Self where S.Iterator.Element == String { + return validate { [unowned self] _, response, fileURL in + guard let validFileURL = fileURL else { + return .failure(AFError.responseValidationFailed(reason: .dataFileNil)) + } + + do { + let data = try Data(contentsOf: validFileURL) + return self.validate(contentType: acceptableContentTypes(), response: response, data: data) + } catch { + return .failure(AFError.responseValidationFailed(reason: .dataFileReadFailed(at: validFileURL))) + } + } + } + + /// Validates that the response has a status code in the default acceptable range of 200...299, and that the content + /// type matches any specified in the Accept HTTP header field. + /// + /// If validation fails, subsequent calls to response handlers will have an associated error. + /// + /// - returns: The request. + @discardableResult + public func validate() -> Self { + let contentTypes = { [unowned self] in + self.acceptableContentTypes + } + return validate(statusCode: acceptableStatusCodes).validate(contentType: contentTypes()) + } +} diff --git a/Pods/Google-Maps-iOS-Utils/LICENSE b/Pods/Google-Maps-iOS-Utils/LICENSE new file mode 100644 index 0000000..37ec93a --- /dev/null +++ b/Pods/Google-Maps-iOS-Utils/LICENSE @@ -0,0 +1,191 @@ +Apache License +Version 2.0, January 2004 +http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, and +distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the copyright +owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other entities +that control, are controlled by, or are under common control with that entity. +For the purposes of this definition, "control" means (i) the power, direct or +indirect, to cause the direction or management of such entity, whether by +contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the +outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising +permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, including +but not limited to software source code, documentation source, and configuration +files. + +"Object" form shall mean any form resulting from mechanical transformation or +translation of a Source form, including but not limited to compiled object code, +generated documentation, and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, made +available under the License, as indicated by a copyright notice that is included +in or attached to the work (an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that +is based on (or derived from) the Work and for which the editorial revisions, +annotations, elaborations, or other modifications represent, as a whole, an +original work of authorship. For the purposes of this License, Derivative Works +shall not include works that remain separable from, or merely link (or bind by +name) to the interfaces of, the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original version +of the Work and any modifications or additions to that Work or Derivative Works +thereof, that is intentionally submitted to Licensor for inclusion in the Work +by the copyright owner or by an individual or Legal Entity authorized to submit +on behalf of the copyright owner. For the purposes of this definition, +"submitted" means any form of electronic, verbal, or written communication sent +to the Licensor or its representatives, including but not limited to +communication on electronic mailing lists, source code control systems, and +issue tracking systems that are managed by, or on behalf of, the Licensor for +the purpose of discussing and improving the Work, but excluding communication +that is conspicuously marked or otherwise designated in writing by the copyright +owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf +of whom a Contribution has been received by Licensor and subsequently +incorporated within the Work. + +2. Grant of Copyright License. + +Subject to the terms and conditions of this License, each Contributor hereby +grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, +irrevocable copyright license to reproduce, prepare Derivative Works of, +publicly display, publicly perform, sublicense, and distribute the Work and such +Derivative Works in Source or Object form. + +3. Grant of Patent License. + +Subject to the terms and conditions of this License, each Contributor hereby +grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, +irrevocable (except as stated in this section) patent license to make, have +made, use, offer to sell, sell, import, and otherwise transfer the Work, where +such license applies only to those patent claims licensable by such Contributor +that are necessarily infringed by their Contribution(s) alone or by combination +of their Contribution(s) with the Work to which such Contribution(s) was +submitted. If You institute patent litigation against any entity (including a +cross-claim or counterclaim in a lawsuit) alleging that the Work or a +Contribution incorporated within the Work constitutes direct or contributory +patent infringement, then any patent licenses granted to You under this License +for that Work shall terminate as of the date such litigation is filed. + +4. Redistribution. + +You may reproduce and distribute copies of the Work or Derivative Works thereof +in any medium, with or without modifications, and in Source or Object form, +provided that You meet the following conditions: + +You must give any other recipients of the Work or Derivative Works a copy of +this License; and +You must cause any modified files to carry prominent notices stating that You +changed the files; and +You must retain, in the Source form of any Derivative Works that You distribute, +all copyright, patent, trademark, and attribution notices from the Source form +of the Work, excluding those notices that do not pertain to any part of the +Derivative Works; and +If the Work includes a "NOTICE" text file as part of its distribution, then any +Derivative Works that You distribute must include a readable copy of the +attribution notices contained within such NOTICE file, excluding those notices +that do not pertain to any part of the Derivative Works, in at least one of the +following places: within a NOTICE text file distributed as part of the +Derivative Works; within the Source form or documentation, if provided along +with the Derivative Works; or, within a display generated by the Derivative +Works, if and wherever such third-party notices normally appear. The contents of +the NOTICE file are for informational purposes only and do not modify the +License. You may add Your own attribution notices within Derivative Works that +You distribute, alongside or as an addendum to the NOTICE text from the Work, +provided that such additional attribution notices cannot be construed as +modifying the License. +You may add Your own copyright statement to Your modifications and may provide +additional or different license terms and conditions for use, reproduction, or +distribution of Your modifications, or for any such Derivative Works as a whole, +provided Your use, reproduction, and distribution of the Work otherwise complies +with the conditions stated in this License. + +5. Submission of Contributions. + +Unless You explicitly state otherwise, any Contribution intentionally submitted +for inclusion in the Work by You to the Licensor shall be under the terms and +conditions of this License, without any additional terms or conditions. +Notwithstanding the above, nothing herein shall supersede or modify the terms of +any separate license agreement you may have executed with Licensor regarding +such Contributions. + +6. Trademarks. + +This License does not grant permission to use the trade names, trademarks, +service marks, or product names of the Licensor, except as required for +reasonable and customary use in describing the origin of the Work and +reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. + +Unless required by applicable law or agreed to in writing, Licensor provides the +Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, +including, without limitation, any warranties or conditions of TITLE, +NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are +solely responsible for determining the appropriateness of using or +redistributing the Work and assume any risks associated with Your exercise of +permissions under this License. + +8. Limitation of Liability. + +In no event and under no legal theory, whether in tort (including negligence), +contract, or otherwise, unless required by applicable law (such as deliberate +and grossly negligent acts) or agreed to in writing, shall any Contributor be +liable to You for damages, including any direct, indirect, special, incidental, +or consequential damages of any character arising as a result of this License or +out of the use or inability to use the Work (including but not limited to +damages for loss of goodwill, work stoppage, computer failure or malfunction, or +any and all other commercial damages or losses), even if such Contributor has +been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. + +While redistributing the Work or Derivative Works thereof, You may choose to +offer, and charge a fee for, acceptance of support, warranty, indemnity, or +other liability obligations and/or rights consistent with this License. However, +in accepting such obligations, You may act only on Your own behalf and on Your +sole responsibility, not on behalf of any other Contributor, and only if You +agree to indemnify, defend, and hold each Contributor harmless for any liability +incurred by, or claims asserted against, such Contributor by reason of your +accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work + +To apply the Apache License to your work, attach the following boilerplate +notice, with the fields enclosed by brackets "[]" replaced with your own +identifying information. (Don't include the brackets!) The text should be +enclosed in the appropriate comment syntax for the file format. We also +recommend that a file or class name and description of purpose be included on +the same "printed page" as the copyright notice for easier identification within +third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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/Pods/Google-Maps-iOS-Utils/README.md b/Pods/Google-Maps-iOS-Utils/README.md new file mode 100644 index 0000000..71cb984 --- /dev/null +++ b/Pods/Google-Maps-iOS-Utils/README.md @@ -0,0 +1,101 @@ +[![Build Status](https://travis-ci.org/googlemaps/google-maps-ios-utils.svg?branch=master)](https://travis-ci.org/googlemaps/google-maps-ios-utils) +[![pod](https://img.shields.io/cocoapods/v/Google-Maps-iOS-Utils.svg)](https://cocoapods.org/pods/Google-Maps-iOS-Utils) +![GitHub contributors](https://img.shields.io/github/contributors/googlemaps/google-maps-ios-utils) +![Apache-2.0](https://img.shields.io/badge/license-Apache-blue) + +Google Maps SDK for iOS Utility Library +======================================= + +## Description + +This open-source library contains classes that are useful for a wide +range of applications using the [Google Maps SDK for iOS][sdk]. + +- **Marker clustering** — handles the display of a large number of points +- **Marker customization** - [display custom markers][customizing-markers] +- **Quadtree data structure** - indexes 2D geometry points and performs +2D range queries +- **Geometry libraries** - [KML and GeoJSON rendering][geometry-rendering] +- **Heatmaps** - [Heatmap rendering][heatmap-rendering] + +

+ +## Requirements + +* iOS 9.0+ +* CocoaPods + +## Installation + +### [CocoaPods](https://guides.cocoapods.org/using/using-cocoapods.html) + +In your `Podfile`: + +```ruby +use_frameworks! + +target 'TARGET_NAME' do + pod 'Google-Maps-iOS-Utils', '~> 3.1.1' +end +``` + +Replace `TARGET_NAME` and then, in the `Podfile` directory, type: + +```bash +$ pod install +``` + +### [Carthage](https://github.com/Carthage/Carthage) + +Coming soon! See [#249]. + +## Samples and Example Usage + +e.g. Displaying KML data + +```swift +import GoogleMapsUtils + +func renderKml() { + // Parse KML + let path: String = // Path to your KML file... + let kmlUrl = URL(fileURLWithPath: path) + let kmlParser = GMUKmlParser(url: kmlUrl) + kmlParser.parse() + + // Render parsed KML + let renderer = GMUGeometryRenderer( + map: mapView, + geometries: kmlParser.placemarks, + styles: kmlParser.styles, + styleMaps: kmlParser.styleMaps + ) + renderer.render() +} +``` + +You can see more example usages in our [sample][samples] projects. + +## Support + +Encounter an issue while using this library? + +If you find a bug or have a feature request, please file an [issue]. +Or, if you'd like to contribute, please refer to our [contributing guide][contributing] and our [code of conduct]. + +You can also reach us on our [Discord channel]. + +For more information, check out the detailed guide on the +[Google Developers site][devsite-guide]. + +[#249]: https://github.com/googlemaps/google-maps-ios-utils/issues/249 +[Discord channel]: https://discord.gg/9fwRNWg +[contributing]: CONTRIBUTING.md +[code of conduct]: CODE_OF_CONDUCT.md +[devsite-guide]: https://developers.google.com/maps/documentation/ios-sdk/utility/ +[sdk]: https://developers.google.com/maps/documentation/ios-sdk +[issue]: https://github.com/googlemaps/google-maps-ios-utils/issues +[customizing-markers]: CustomMarkers.md +[geometry-rendering]: GeometryRendering.md +[heatmap-rendering]: HeatmapRendering.md +[samples]: https://github.com/googlemaps/google-maps-ios-utils/tree/master/samples diff --git a/Pods/Google-Maps-iOS-Utils/src/Clustering/Algo/GMUClusterAlgorithm.h b/Pods/Google-Maps-iOS-Utils/src/Clustering/Algo/GMUClusterAlgorithm.h new file mode 100644 index 0000000..e6637f5 --- /dev/null +++ b/Pods/Google-Maps-iOS-Utils/src/Clustering/Algo/GMUClusterAlgorithm.h @@ -0,0 +1,47 @@ +/* Copyright (c) 2016 Google 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. + */ + +#import + +#import "GMUCluster.h" +#import "GMUClusterItem.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + * Generic protocol for arranging cluster items into groups. + */ +@protocol GMUClusterAlgorithm + +- (void)addItems:(NSArray> *)items; + +/** + * Removes an item. + */ +- (void)removeItem:(id)item; + +/** + * Clears all items. + */ +- (void)clearItems; + +/** + * Returns the set of clusters of the added items. + */ +- (NSArray> *)clustersAtZoom:(float)zoom; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/Google-Maps-iOS-Utils/src/Clustering/Algo/GMUGridBasedClusterAlgorithm.h b/Pods/Google-Maps-iOS-Utils/src/Clustering/Algo/GMUGridBasedClusterAlgorithm.h new file mode 100644 index 0000000..47fb1fc --- /dev/null +++ b/Pods/Google-Maps-iOS-Utils/src/Clustering/Algo/GMUGridBasedClusterAlgorithm.h @@ -0,0 +1,26 @@ +/* Copyright (c) 2016 Google 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. + */ + +#import + +#import "GMUClusterAlgorithm.h" + +/** + * A simple algorithm which devides the map into a grid where a cell has fixed dimension in + * screen space. + */ +@interface GMUGridBasedClusterAlgorithm : NSObject + +@end diff --git a/Pods/Google-Maps-iOS-Utils/src/Clustering/Algo/GMUGridBasedClusterAlgorithm.m b/Pods/Google-Maps-iOS-Utils/src/Clustering/Algo/GMUGridBasedClusterAlgorithm.m new file mode 100644 index 0000000..bfad509 --- /dev/null +++ b/Pods/Google-Maps-iOS-Utils/src/Clustering/Algo/GMUGridBasedClusterAlgorithm.m @@ -0,0 +1,79 @@ +/* Copyright (c) 2016 Google 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. + */ + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +#import "GMUGridBasedClusterAlgorithm.h" + +#import + +#import "GMUStaticCluster.h" +#import "GMUClusterItem.h" + +// Grid cell dimension in pixels to keep clusters about 100 pixels apart on screen. +static const NSUInteger kGMUGridCellSizePoints = 100; + +@implementation GMUGridBasedClusterAlgorithm { + NSMutableArray> *_items; +} + +- (instancetype)init { + if ((self = [super init])) { + _items = [[NSMutableArray alloc] init]; + } + return self; +} + +- (void)addItems:(NSArray> *)items { + [_items addObjectsFromArray:items]; +} + +- (void)removeItem:(id)item { + [_items removeObject:item]; +} + +- (void)clearItems { + [_items removeAllObjects]; +} + +- (NSArray> *)clustersAtZoom:(float)zoom { + NSMutableDictionary> *clusters = [[NSMutableDictionary alloc] init]; + + // Divide the whole map into a numCells x numCells grid and assign items to them. + long numCells = (long)ceil(256 * pow(2, zoom) / kGMUGridCellSizePoints); + for (id item in _items) { + GMSMapPoint point = GMSProject(item.position); + long col = (long)(numCells * (1.0 + point.x) / 2); // point.x is in [-1, 1] range + long row = (long)(numCells * (1.0 + point.y) / 2); // point.y is in [-1, 1] range + long index = numCells * row + col; + NSNumber *cellKey = [NSNumber numberWithLong:index]; + GMUStaticCluster *cluster = clusters[cellKey]; + if (cluster == nil) { + // Normalize cluster's centroid to center of the cell. + GMSMapPoint point2 = {(double)(col + 0.5) * 2.0 / numCells - 1, + (double)(row + 0.5) * 2.0 / numCells - 1}; + CLLocationCoordinate2D position = GMSUnproject(point2); + cluster = [[GMUStaticCluster alloc] initWithPosition:position]; + clusters[cellKey] = cluster; + } + [cluster addItem:item]; + } + return [clusters allValues]; +} + +@end + diff --git a/Pods/Google-Maps-iOS-Utils/src/Clustering/Algo/GMUNonHierarchicalDistanceBasedAlgorithm.h b/Pods/Google-Maps-iOS-Utils/src/Clustering/Algo/GMUNonHierarchicalDistanceBasedAlgorithm.h new file mode 100644 index 0000000..1c8fdf1 --- /dev/null +++ b/Pods/Google-Maps-iOS-Utils/src/Clustering/Algo/GMUNonHierarchicalDistanceBasedAlgorithm.h @@ -0,0 +1,39 @@ +/* Copyright (c) 2016 Google 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. + */ + +#import + +#import "GMUClusterAlgorithm.h" + +/** + * A simple clustering algorithm with O(nlog n) performance. Resulting clusters are not + * hierarchical. + * High level algorithm: + * 1. Iterate over items in the order they were added (candidate clusters). + * 2. Create a cluster with the center of the item. + * 3. Add all items that are within a certain distance to the cluster. + * 4. Move any items out of an existing cluster if they are closer to another cluster. + * 5. Remove those items from the list of candidate clusters. + * Clusters have the center of the first element (not the centroid of the items within it). + */ +@interface GMUNonHierarchicalDistanceBasedAlgorithm : NSObject + +/** + * Initializes this GMUNonHierarchicalDistanceBasedAlgorithm with clusterDistancePoints for + * the distance it uses to cluster items (default is 100). + */ +- (instancetype)initWithClusterDistancePoints:(NSUInteger)clusterDistancePoints; + +@end diff --git a/Pods/Google-Maps-iOS-Utils/src/Clustering/Algo/GMUNonHierarchicalDistanceBasedAlgorithm.m b/Pods/Google-Maps-iOS-Utils/src/Clustering/Algo/GMUNonHierarchicalDistanceBasedAlgorithm.m new file mode 100644 index 0000000..c227fea --- /dev/null +++ b/Pods/Google-Maps-iOS-Utils/src/Clustering/Algo/GMUNonHierarchicalDistanceBasedAlgorithm.m @@ -0,0 +1,198 @@ +/* Copyright (c) 2016 Google 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. + */ + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +#import "GMUNonHierarchicalDistanceBasedAlgorithm.h" + +#import + +#import "GMUStaticCluster.h" +#import "GMUClusterItem.h" +#import "GMUWrappingDictionaryKey.h" +#import "GQTPointQuadTree.h" + +static const NSUInteger kGMUDefaultClusterDistancePoints = 100; +static const double kGMUMapPointWidth = 2.0; // MapPoint is in a [-1,1]x[-1,1] space. + +#pragma mark Utilities Classes + +@interface GMUClusterItemQuadItem : NSObject + +@property(nonatomic, readonly) id clusterItem; + +- (instancetype)initWithClusterItem:(id)clusterItem; + +@end + +@implementation GMUClusterItemQuadItem { + id _clusterItem; + GQTPoint _clusterItemPoint; +} + +- (instancetype)initWithClusterItem:(id)clusterItem { + if ((self = [super init])) { + _clusterItem = clusterItem; + GMSMapPoint point = GMSProject(clusterItem.position); + _clusterItemPoint.x = point.x; + _clusterItemPoint.y = point.y; + } + return self; +} + +- (GQTPoint)point { + return _clusterItemPoint; +} + +// Forwards hash to clusterItem. +- (NSUInteger)hash { + return [_clusterItem hash]; +} + +// Forwards isEqual to clusterItem. +- (BOOL)isEqual:(id)object { + if (self == object) return YES; + + if ([object class] != [self class]) return NO; + + GMUClusterItemQuadItem *other = (GMUClusterItemQuadItem *)object; + return [_clusterItem isEqual:other->_clusterItem]; +} + +@end + +#pragma mark GMUNonHierarchicalDistanceBasedAlgorithm + +@implementation GMUNonHierarchicalDistanceBasedAlgorithm { + NSMutableArray> *_items; + GQTPointQuadTree *_quadTree; + NSUInteger _clusterDistancePoints; +} + +- (instancetype)init { + return [self initWithClusterDistancePoints:kGMUDefaultClusterDistancePoints]; +} + +- (instancetype)initWithClusterDistancePoints:(NSUInteger)clusterDistancePoints { + if ((self = [super init])) { + _items = [[NSMutableArray alloc] init]; + GQTBounds bounds = {-1, -1, 1, 1}; + _quadTree = [[GQTPointQuadTree alloc] initWithBounds:bounds]; + _clusterDistancePoints = clusterDistancePoints; + } + return self; +} + +- (void)addItems:(NSArray> *)items { + [_items addObjectsFromArray:items]; + for (id item in items) { + GMUClusterItemQuadItem *quadItem = [[GMUClusterItemQuadItem alloc] initWithClusterItem:item]; + [_quadTree add:quadItem]; + } +} + +/** + * Removes an item. + */ +- (void)removeItem:(id)item { + [_items removeObject:item]; + + GMUClusterItemQuadItem *quadItem = [[GMUClusterItemQuadItem alloc] initWithClusterItem:item]; + // This should remove the corresponding quad item since GMUClusterItemQuadItem forwards its hash + // and isEqual to the underlying item. + [_quadTree remove:quadItem]; +} + +/** + * Clears all items. + */ +- (void)clearItems { + [_items removeAllObjects]; + [_quadTree clear]; +} + +/** + * Returns the set of clusters of the added items. + */ +- (NSArray> *)clustersAtZoom:(float)zoom { + NSMutableArray> *clusters = [[NSMutableArray alloc] init]; + NSMutableDictionary> *itemToClusterMap = + [[NSMutableDictionary alloc] init]; + NSMutableDictionary *itemToClusterDistanceMap = + [[NSMutableDictionary alloc] init]; + NSMutableSet> *processedItems = [[NSMutableSet alloc] init]; + + for (id item in _items) { + if ([processedItems containsObject:item]) continue; + + GMUStaticCluster *cluster = [[GMUStaticCluster alloc] initWithPosition:item.position]; + + GMSMapPoint point = GMSProject(item.position); + + // Query for items within a fixed point distance from the current item to make up a cluster + // around it. + double radius = _clusterDistancePoints * kGMUMapPointWidth / pow(2.0, zoom + 8.0); + GQTBounds bounds = {point.x - radius, point.y - radius, point.x + radius, point.y + radius}; + NSArray *nearbyItems = [_quadTree searchWithBounds:bounds]; + for (GMUClusterItemQuadItem *quadItem in nearbyItems) { + id nearbyItem = quadItem.clusterItem; + [processedItems addObject:nearbyItem]; + GMSMapPoint nearbyItemPoint = GMSProject(nearbyItem.position); + GMUWrappingDictionaryKey *key = [[GMUWrappingDictionaryKey alloc] initWithObject:nearbyItem]; + + NSNumber *existingDistance = [itemToClusterDistanceMap objectForKey:key]; + double distanceSquared = [self distanceSquaredBetweenPointA:point andPointB:nearbyItemPoint]; + if (existingDistance != nil) { + if ([existingDistance doubleValue] < distanceSquared) { + // Already belongs to a closer cluster. + continue; + } + GMUStaticCluster *existingCluster = [itemToClusterMap objectForKey:key]; + [existingCluster removeItem:nearbyItem]; + } + NSNumber *number = [NSNumber numberWithDouble:distanceSquared]; + [itemToClusterDistanceMap setObject:number forKey:key]; + [itemToClusterMap setObject:cluster forKey:key]; + [cluster addItem:nearbyItem]; + } + [clusters addObject:cluster]; + } + NSAssert(itemToClusterDistanceMap.count == _items.count, + @"All items should be mapped to a distance"); + NSAssert(itemToClusterMap.count == _items.count, + @"All items should be mapped to a cluster"); + +#if DEBUG + NSUInteger totalCount = 0; + for (id cluster in clusters) { + totalCount += cluster.count; + } + NSAssert(_items.count == totalCount, @"All clusters combined should make up original item set"); +#endif + return clusters; +} + +#pragma mark Private + +- (double)distanceSquaredBetweenPointA:(GMSMapPoint)pointA andPointB:(GMSMapPoint)pointB { + double deltaX = pointA.x - pointB.x; + double deltaY = pointA.y - pointB.y; + return deltaX * deltaX + deltaY * deltaY; +} + +@end + diff --git a/Pods/Google-Maps-iOS-Utils/src/Clustering/Algo/GMUSimpleClusterAlgorithm.h b/Pods/Google-Maps-iOS-Utils/src/Clustering/Algo/GMUSimpleClusterAlgorithm.h new file mode 100644 index 0000000..05d0a60 --- /dev/null +++ b/Pods/Google-Maps-iOS-Utils/src/Clustering/Algo/GMUSimpleClusterAlgorithm.h @@ -0,0 +1,25 @@ +/* Copyright (c) 2016 Google 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. + */ + +#import + +#import "GMUClusterAlgorithm.h" + +/** + * Not for production: used for experimenting with new clustering algorithms only. + */ +@interface GMUSimpleClusterAlgorithm : NSObject + +@end diff --git a/Pods/Google-Maps-iOS-Utils/src/Clustering/Algo/GMUSimpleClusterAlgorithm.m b/Pods/Google-Maps-iOS-Utils/src/Clustering/Algo/GMUSimpleClusterAlgorithm.m new file mode 100644 index 0000000..eb0ce6d --- /dev/null +++ b/Pods/Google-Maps-iOS-Utils/src/Clustering/Algo/GMUSimpleClusterAlgorithm.m @@ -0,0 +1,71 @@ +/* Copyright (c) 2016 Google 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. + */ + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +#import "GMUSimpleClusterAlgorithm.h" + +#import "GMUStaticCluster.h" +#import "GMUClusterItem.h" + +static const NSUInteger kClusterCount = 10; + +@implementation GMUSimpleClusterAlgorithm { + NSMutableArray> *_items; +} + +- (instancetype)init { + if ((self = [super init])) { + _items = [[NSMutableArray alloc] init]; + } + return self; +} + +- (void)addItems:(NSArray> *)items { + [_items addObjectsFromArray:items]; +} + +- (void)removeItem:(id)item { + [_items removeObject:item]; +} + +- (void)clearItems { + [_items removeAllObjects]; +} + +- (NSArray> *)clustersAtZoom:(float)zoom { + NSMutableArray> *clusters = + [[NSMutableArray alloc] initWithCapacity:kClusterCount]; + + for (int i = 0; i < kClusterCount; ++i) { + if (i >= _items.count) break; + id item = _items[i]; + [clusters addObject:[[GMUStaticCluster alloc] initWithPosition:item.position]]; + } + + NSUInteger clusterIndex = 0; + for (int i = kClusterCount; i < _items.count; ++i) { + id item = _items[i]; + GMUStaticCluster *cluster = clusters[clusterIndex % kClusterCount]; + [cluster addItem:item]; + ++clusterIndex; + } + return clusters; +} + +@end + diff --git a/Pods/Google-Maps-iOS-Utils/src/Clustering/Algo/GMUWrappingDictionaryKey.h b/Pods/Google-Maps-iOS-Utils/src/Clustering/Algo/GMUWrappingDictionaryKey.h new file mode 100644 index 0000000..bd47ec7 --- /dev/null +++ b/Pods/Google-Maps-iOS-Utils/src/Clustering/Algo/GMUWrappingDictionaryKey.h @@ -0,0 +1,26 @@ +/* Copyright (c) 2016 Google 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. + */ + +#import + +/** + * Wraps an object which does not implement NSCopying to be used as NSDictionary keys. + * This class will forward -hash and -isEqual methods to the underlying object. + */ +@interface GMUWrappingDictionaryKey : NSObject + +- (instancetype)initWithObject:(id)object; + +@end diff --git a/Pods/Google-Maps-iOS-Utils/src/Clustering/Algo/GMUWrappingDictionaryKey.m b/Pods/Google-Maps-iOS-Utils/src/Clustering/Algo/GMUWrappingDictionaryKey.m new file mode 100644 index 0000000..9632b74 --- /dev/null +++ b/Pods/Google-Maps-iOS-Utils/src/Clustering/Algo/GMUWrappingDictionaryKey.m @@ -0,0 +1,57 @@ +/* Copyright (c) 2016 Google 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. + */ + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +#import "GMUWrappingDictionaryKey.h" + +@implementation GMUWrappingDictionaryKey { + id _object; +} + +- (instancetype)initWithObject:(id)object { + if ((self = [super init])) { + _object = object; + } + return self; +} + +- (id)copyWithZone:(NSZone *)zone { + GMUWrappingDictionaryKey *newKey = [[self class] allocWithZone:zone]; + if (newKey) { + newKey->_object = _object; + } + return newKey; +} + +// Forwards hash to _object. +- (NSUInteger)hash { + return [_object hash]; +} + +// Forwards isEqual to _object. +- (BOOL)isEqual:(id)object { + if (self == object) return YES; + + if ([object class] != [self class]) return NO; + + GMUWrappingDictionaryKey *other = (GMUWrappingDictionaryKey *)object; + return [_object isEqual:other->_object]; +} + +@end + diff --git a/Pods/Google-Maps-iOS-Utils/src/Clustering/GMUCluster.h b/Pods/Google-Maps-iOS-Utils/src/Clustering/GMUCluster.h new file mode 100644 index 0000000..4794560 --- /dev/null +++ b/Pods/Google-Maps-iOS-Utils/src/Clustering/GMUCluster.h @@ -0,0 +1,45 @@ +/* Copyright (c) 2016 Google 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. + */ + +#import +#import + +#import "GMUClusterItem.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + * Defines a generic cluster object. + */ +@protocol GMUCluster + +/** + * Returns the position of the cluster. + */ +@property(nonatomic, readonly) CLLocationCoordinate2D position; + +/** + * Returns the number of items in the cluster. + */ +@property(nonatomic, readonly) NSUInteger count; + +/** + * Returns a copy of the list of items in the cluster. + */ +@property(nonatomic, readonly) NSArray> *items; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/Google-Maps-iOS-Utils/src/Clustering/GMUClusterItem.h b/Pods/Google-Maps-iOS-Utils/src/Clustering/GMUClusterItem.h new file mode 100644 index 0000000..a9137a5 --- /dev/null +++ b/Pods/Google-Maps-iOS-Utils/src/Clustering/GMUClusterItem.h @@ -0,0 +1,28 @@ +/* Copyright (c) 2016 Google 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. + */ + +#import + +/** + * This protocol defines the contract for a cluster item. + */ +@protocol GMUClusterItem + +/** + * Returns the position of the item. + */ +@property(nonatomic, readonly) CLLocationCoordinate2D position; + +@end diff --git a/Pods/Google-Maps-iOS-Utils/src/Clustering/GMUClusterManager+Testing.h b/Pods/Google-Maps-iOS-Utils/src/Clustering/GMUClusterManager+Testing.h new file mode 100644 index 0000000..5b7ef78 --- /dev/null +++ b/Pods/Google-Maps-iOS-Utils/src/Clustering/GMUClusterManager+Testing.h @@ -0,0 +1,28 @@ +/* Copyright (c) 2016 Google 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. + */ + +#import "GMUClusterManager.h" + +/** + * Extensions for testing purposes only. + */ +@interface GMUClusterManager (Testing) + +/** + * Returns in number of cluster requests. + */ +- (NSUInteger)clusterRequestCount; + +@end diff --git a/Pods/Google-Maps-iOS-Utils/src/Clustering/GMUClusterManager.h b/Pods/Google-Maps-iOS-Utils/src/Clustering/GMUClusterManager.h new file mode 100644 index 0000000..d62e269 --- /dev/null +++ b/Pods/Google-Maps-iOS-Utils/src/Clustering/GMUClusterManager.h @@ -0,0 +1,133 @@ +/* Copyright (c) 2016 Google 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. + */ + +#import + +#import + +#import "GMUClusterAlgorithm.h" +#import "GMUClusterItem.h" +#import "GMUClusterRenderer.h" + +NS_ASSUME_NONNULL_BEGIN + +@class GMUClusterManager; + +/** + * Delegate for events on the GMUClusterManager. + */ +@protocol GMUClusterManagerDelegate + +@optional + +/** + * Called when the user taps on a cluster marker. + * @return YES if this delegate handled the tap event, + * and NO to pass this tap event to other handlers. + */ +- (BOOL)clusterManager:(GMUClusterManager *)clusterManager didTapCluster:(id)cluster; + +/** + * Called when the user taps on a cluster item marker. + * @return YES if this delegate handled the tap event, + * and NO to pass this tap event to other handlers. + */ +- (BOOL)clusterManager:(GMUClusterManager *)clusterManager + didTapClusterItem:(id)clusterItem; + +@end + +/** + * This class groups many items on a map based on zoom level. + * Cluster items should be added to the map via this class. + */ +@interface GMUClusterManager : NSObject + +/** + * The default initializer is not available. Use initWithMap:algorithm:renderer instead. + */ +- (instancetype)init NS_UNAVAILABLE; + +/** + * Returns a new instance of the GMUClusterManager class defined by it's |algorithm| and |renderer|. + */ +- (instancetype)initWithMap:(GMSMapView *)mapView + algorithm:(id)algorithm + renderer:(id)renderer NS_DESIGNATED_INITIALIZER; + +/** + * Returns the clustering algorithm. + */ +@property(nonatomic, readonly) id algorithm; + +/** + * GMUClusterManager |delegate|. + * To set it use the setDelegate:mapDelegate: method. + */ +@property(nonatomic, readonly, weak, nullable) id delegate; + +/** + * The GMSMapViewDelegate delegate that map events are being forwarded to. + * To set it use the setDelegate:mapDelegate: method. + */ +@property(nonatomic, readonly, weak, nullable) id mapDelegate; + +/** + * Sets GMUClusterManagerDelegate |delegate| and optionally + * provides a |mapDelegate| to listen to forwarded map events. + * + * NOTES: This method changes the |delegate| property of the + * managed |mapView| to this object, intercepting events that + * the GMUClusterManager wants to action or rebroadcast + * to the GMUClusterManagerDelegate. Any remaining events are + * then forwarded to the new |mapDelegate| provided here. + * + * EXAMPLE: [clusterManager setDelegate:self mapDelegate:_map.delegate]; + * In this example self will receive type-safe GMUClusterManagerDelegate + * events and other map events will be forwarded to the current map delegate. + */ +- (void)setDelegate:(id _Nullable)delegate + mapDelegate:(id _Nullable)mapDelegate; + +/** + * Adds a cluster item to the collection. + */ +- (void)addItem:(id)item; + +/** + * Adds multiple cluster items to the collection. + */ +- (void)addItems:(NSArray> *)items; + +/** + * Removes a cluster item from the collection. + */ +- (void)removeItem:(id)item; + +/** + * Removes all items from the collection. + */ +- (void)clearItems; + +/** + * Called to arrange items into groups. + * - This method will be automatically invoked when the map's zoom level changes. + * - Manually invoke this method when new items have been added to rearrange items. + */ +- (void)cluster; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/Google-Maps-iOS-Utils/src/Clustering/GMUClusterManager.m b/Pods/Google-Maps-iOS-Utils/src/Clustering/GMUClusterManager.m new file mode 100644 index 0000000..d6a9fe5 --- /dev/null +++ b/Pods/Google-Maps-iOS-Utils/src/Clustering/GMUClusterManager.m @@ -0,0 +1,280 @@ +/* Copyright (c) 2016 Google 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. + */ + +#import "GMUClusterManager+Testing.h" + +#import "GMUClusterRenderer.h" +#import "GMUSimpleClusterAlgorithm.h" + +static NSString *const kGMUCameraKeyPath = @"camera"; + +// How long to wait for a cluster request before actually performing the clustering operation +// to avoid continuous clustering when the camera is moving which can affect performance. +static const double kGMUClusterWaitIntervalSeconds = 0.2; + +@implementation GMUClusterManager { + // The map view that this object is associated with. + GMSMapView *_mapView; + + // Position of the camera on the previous cluster invocation. + GMSCameraPosition *_previousCamera; + + // Tracks number of cluster requests so that we can safely ignore stale (redundant) ones. + NSUInteger _clusterRequestCount; + + // Renderer. + id _renderer; +} + +- (instancetype)initWithMap:(GMSMapView *)mapView + algorithm:(id)algorithm + renderer:(id)renderer { + if ((self = [super init])) { + _algorithm = [[GMUSimpleClusterAlgorithm alloc] init]; + _mapView = mapView; + _previousCamera = _mapView.camera; + _algorithm = algorithm; + _renderer = renderer; + + [_mapView addObserver:self + forKeyPath:kGMUCameraKeyPath + options:NSKeyValueObservingOptionNew + context:nil]; + } + + return self; +} + +- (void)dealloc { + [_mapView removeObserver:self forKeyPath:kGMUCameraKeyPath]; +} + +- (void)setDelegate:(id)delegate + mapDelegate:(id _Nullable)mapDelegate { + _delegate = delegate; + _mapView.delegate = self; + _mapDelegate = mapDelegate; +} + +- (void)addItem:(id)item { + [_algorithm addItems:[[NSMutableArray alloc] initWithObjects:item, nil]]; +} + +- (void)addItems:(NSArray> *)items { + [_algorithm addItems:items]; +} + +- (void)removeItem:(id)item { + [_algorithm removeItem:item]; +} + +- (void)clearItems { + [_algorithm clearItems]; + [self requestCluster]; +} + +- (void)cluster { + NSUInteger integralZoom = (NSUInteger)floorf(_mapView.camera.zoom + 0.5f); + NSArray> *clusters = [_algorithm clustersAtZoom:integralZoom]; + [_renderer renderClusters:clusters]; + _previousCamera = _mapView.camera; +} + +#pragma mark GMSMapViewDelegate + +- (BOOL)mapView:(GMSMapView *)mapView didTapMarker:(GMSMarker *)marker { + if ([_delegate respondsToSelector:@selector(clusterManager:didTapCluster:)] && + [marker.userData conformsToProtocol:@protocol(GMUCluster)]) { + id cluster = marker.userData; + if ([_delegate clusterManager:self didTapCluster:cluster]) { + return YES; + } + } + + if ([_delegate respondsToSelector:@selector(clusterManager:didTapClusterItem:)] && + [marker.userData conformsToProtocol:@protocol(GMUClusterItem)]) { + id clusterItem = marker.userData; + if ([_delegate clusterManager:self didTapClusterItem:clusterItem]) { + return YES; + } + } + + // Forward to _mapDelegate as a fallback. + if ([_mapDelegate respondsToSelector:@selector(mapView:didTapMarker:)]) { + return [_mapDelegate mapView:mapView didTapMarker:marker]; + } + + return NO; +} + +#pragma mark Delegate Forwards + +- (void)mapView:(GMSMapView *)mapView willMove:(BOOL)gesture { + if ([_mapDelegate respondsToSelector:@selector(mapView:willMove:)]) { + [_mapDelegate mapView:mapView willMove:gesture]; + } +} + +- (void)mapView:(GMSMapView *)mapView didChangeCameraPosition:(GMSCameraPosition *)position { + if ([_mapDelegate respondsToSelector:@selector(mapView:didChangeCameraPosition:)]) { + [_mapDelegate mapView:mapView didChangeCameraPosition:position]; + } +} + +- (void)mapView:(GMSMapView *)mapView idleAtCameraPosition:(GMSCameraPosition *)position { + if ([_mapDelegate respondsToSelector:@selector(mapView:idleAtCameraPosition:)]) { + [_mapDelegate mapView:mapView idleAtCameraPosition:position]; + } +} + +- (void)mapView:(GMSMapView *)mapView didTapAtCoordinate:(CLLocationCoordinate2D)coordinate { + if ([_mapDelegate respondsToSelector:@selector(mapView:didTapAtCoordinate:)]) { + [_mapDelegate mapView:mapView didTapAtCoordinate:coordinate]; + } +} + +- (void)mapView:(GMSMapView *)mapView didLongPressAtCoordinate:(CLLocationCoordinate2D)coordinate { + if ([_mapDelegate respondsToSelector:@selector(mapView:didLongPressAtCoordinate:)]) { + [_mapDelegate mapView:mapView didLongPressAtCoordinate:coordinate]; + } +} + +- (void)mapView:(GMSMapView *)mapView didTapInfoWindowOfMarker:(GMSMarker *)marker { + if ([_mapDelegate respondsToSelector:@selector(mapView:didTapInfoWindowOfMarker:)]) { + [_mapDelegate mapView:mapView didTapInfoWindowOfMarker:marker]; + } +} + +- (void)mapView:(GMSMapView *)mapView didLongPressInfoWindowOfMarker:(GMSMarker *)marker { + if ([_mapDelegate respondsToSelector:@selector(mapView:didLongPressInfoWindowOfMarker:)]) { + [_mapDelegate mapView:mapView didLongPressInfoWindowOfMarker:marker]; + } +} + +- (void)mapView:(GMSMapView *)mapView didTapOverlay:(GMSOverlay *)overlay { + if ([_mapDelegate respondsToSelector:@selector(mapView:didTapOverlay:)]) { + [_mapDelegate mapView:mapView didTapOverlay:overlay]; + } +} + +- (UIView *)mapView:(GMSMapView *)mapView markerInfoWindow:(GMSMarker *)marker { + if ([_mapDelegate respondsToSelector:@selector(mapView:markerInfoWindow:)]) { + return [_mapDelegate mapView:mapView markerInfoWindow:marker]; + } + return nil; +} + +- (void)mapView:(GMSMapView *)mapView + didTapPOIWithPlaceID:(NSString *)placeID + name:(NSString *)name + location:(CLLocationCoordinate2D)location { + if ([_mapDelegate respondsToSelector:@selector(mapView:didTapPOIWithPlaceID:name:location:)]) { + [_mapDelegate mapView:mapView didTapPOIWithPlaceID:placeID name:name location:location]; + } +} + +- (UIView *)mapView:(GMSMapView *)mapView markerInfoContents:(GMSMarker *)marker { + if ([_mapDelegate respondsToSelector:@selector(mapView:markerInfoContents:)]) { + return [_mapDelegate mapView:mapView markerInfoContents:marker]; + } + return nil; +} + +- (void)mapView:(GMSMapView *)mapView didCloseInfoWindowOfMarker:(GMSMarker *)marker { + if ([_mapDelegate respondsToSelector:@selector(mapView:didCloseInfoWindowOfMarker:)]) { + [_mapDelegate mapView:mapView didCloseInfoWindowOfMarker:marker]; + } +} + +- (void)mapView:(GMSMapView *)mapView didBeginDraggingMarker:(GMSMarker *)marker { + if ([_mapDelegate respondsToSelector:@selector(mapView:didBeginDraggingMarker:)]) { + [_mapDelegate mapView:mapView didBeginDraggingMarker:marker]; + } +} + +- (void)mapView:(GMSMapView *)mapView didEndDraggingMarker:(GMSMarker *)marker { + if ([_mapDelegate respondsToSelector:@selector(mapView:didEndDraggingMarker:)]) { + [_mapDelegate mapView:mapView didEndDraggingMarker:marker]; + } +} + +- (void)mapView:(GMSMapView *)mapView didDragMarker:(GMSMarker *)marker { + if ([_mapDelegate respondsToSelector:@selector(mapView:didDragMarker:)]) { + [_mapDelegate mapView:mapView didDragMarker:marker]; + } +} + +- (BOOL)didTapMyLocationButtonForMapView:(GMSMapView *)mapView { + if ([_mapDelegate respondsToSelector:@selector(didTapMyLocationButtonForMapView:)]) { + return [_mapDelegate didTapMyLocationButtonForMapView:mapView]; + } + return NO; +} + +- (void)mapViewDidStartTileRendering:(GMSMapView *)mapView { + if ([_mapDelegate respondsToSelector:@selector(mapViewDidStartTileRendering:)]) { + [_mapDelegate mapViewDidStartTileRendering:mapView]; + } +} + +- (void)mapViewDidFinishTileRendering:(GMSMapView *)mapView { + if ([_mapDelegate respondsToSelector:@selector(mapViewDidFinishTileRendering:)]) { + [_mapDelegate mapViewDidFinishTileRendering:mapView]; + } +} + +#pragma mark Testing + +- (NSUInteger)clusterRequestCount { + return _clusterRequestCount; +} + +#pragma mark Private + +- (void)observeValueForKeyPath:(NSString *)keyPath + ofObject:(id)object + change:(NSDictionary *)change + context:(void *)context { + GMSCameraPosition *camera = _mapView.camera; + NSUInteger previousIntegralZoom = (NSUInteger)floorf(_previousCamera.zoom + 0.5f); + NSUInteger currentIntegralZoom = (NSUInteger)floorf(camera.zoom + 0.5f); + if (previousIntegralZoom != currentIntegralZoom) { + [self requestCluster]; + } else { + [_renderer update]; + } +} + +- (void)requestCluster { + __weak GMUClusterManager *weakSelf = self; + ++_clusterRequestCount; + NSUInteger requestNumber = _clusterRequestCount; + dispatch_after( + dispatch_time(DISPATCH_TIME_NOW, (int64_t)(kGMUClusterWaitIntervalSeconds * NSEC_PER_SEC)), + dispatch_get_main_queue(), ^{ + GMUClusterManager *strongSelf = weakSelf; + if (strongSelf == nil) { + return; + } + + // Ignore if there are newer requests. + if (requestNumber != strongSelf->_clusterRequestCount) { + return; + } + [strongSelf cluster]; + }); +} + +@end diff --git a/Pods/Google-Maps-iOS-Utils/src/Clustering/GMUStaticCluster.h b/Pods/Google-Maps-iOS-Utils/src/Clustering/GMUStaticCluster.h new file mode 100644 index 0000000..9a14210 --- /dev/null +++ b/Pods/Google-Maps-iOS-Utils/src/Clustering/GMUStaticCluster.h @@ -0,0 +1,64 @@ +/* Copyright (c) 2016 Google 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. + */ + +#import + +#import "GMUCluster.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + * Defines a cluster where its position is fixed upon construction. + */ +@interface GMUStaticCluster : NSObject + +/** + * The default initializer is not available. Use initWithPosition: instead. + */ +- (instancetype)init NS_UNAVAILABLE; + +/** + * Returns a new instance of the GMUStaticCluster class defined by it's position. + */ +- (instancetype)initWithPosition:(CLLocationCoordinate2D)position NS_DESIGNATED_INITIALIZER; + +/** + * Returns the position of the cluster. + */ +@property(nonatomic, readonly) CLLocationCoordinate2D position; + +/** + * Returns the number of items in the cluster. + */ +@property(nonatomic, readonly) NSUInteger count; + +/** + * Returns a copy of the list of items in the cluster. + */ +@property(nonatomic, readonly) NSArray> *items; + +/** + * Adds an item to the cluster. + */ +- (void)addItem:(id)item; + +/** + * Removes an item to the cluster. + */ +- (void)removeItem:(id)item; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/Google-Maps-iOS-Utils/src/Clustering/GMUStaticCluster.m b/Pods/Google-Maps-iOS-Utils/src/Clustering/GMUStaticCluster.m new file mode 100644 index 0000000..4fde3d8 --- /dev/null +++ b/Pods/Google-Maps-iOS-Utils/src/Clustering/GMUStaticCluster.m @@ -0,0 +1,50 @@ +/* Copyright (c) 2016 Google 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. + */ + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +#import "GMUStaticCluster.h" + +@implementation GMUStaticCluster { + NSMutableArray> *_items; +} + +- (instancetype)initWithPosition:(CLLocationCoordinate2D)position { + if ((self = [super init])) { + _items = [[NSMutableArray alloc] init]; + _position = position; + } + return self; +} + +- (NSUInteger)count { + return _items.count; +} + +- (NSArray> *)items { + return [_items copy]; +} + +- (void)addItem:(id)item { + [_items addObject:item]; +} + +- (void)removeItem:(id)item { + [_items removeObject:item]; +} + +@end diff --git a/Pods/Google-Maps-iOS-Utils/src/Clustering/View/GMUClusterIconGenerator.h b/Pods/Google-Maps-iOS-Utils/src/Clustering/View/GMUClusterIconGenerator.h new file mode 100644 index 0000000..36df061 --- /dev/null +++ b/Pods/Google-Maps-iOS-Utils/src/Clustering/View/GMUClusterIconGenerator.h @@ -0,0 +1,29 @@ +/* Copyright (c) 2016 Google 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. + */ + +#import +#import + +/** + * Defines a contract for cluster icon generation. + */ +@protocol GMUClusterIconGenerator + +/** + * Generates an icon with the given size. + */ +- (UIImage *)iconForSize:(NSUInteger)size; + +@end diff --git a/Pods/Google-Maps-iOS-Utils/src/Clustering/View/GMUClusterRenderer.h b/Pods/Google-Maps-iOS-Utils/src/Clustering/View/GMUClusterRenderer.h new file mode 100644 index 0000000..e7e06b5 --- /dev/null +++ b/Pods/Google-Maps-iOS-Utils/src/Clustering/View/GMUClusterRenderer.h @@ -0,0 +1,36 @@ +/* Copyright (c) 2016 Google 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. + */ + +#import + +#import "GMUCluster.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + * Defines a common contract for a cluster renderer. + */ +@protocol GMUClusterRenderer + +// Renders a list of clusters. +- (void)renderClusters:(NSArray> *)clusters; + +// Notifies renderer that the viewport has changed and renderer needs to update. +// For example new clusters may become visible and need to be shown on map. +- (void)update; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/Google-Maps-iOS-Utils/src/Clustering/View/GMUDefaultClusterIconGenerator+Testing.h b/Pods/Google-Maps-iOS-Utils/src/Clustering/View/GMUDefaultClusterIconGenerator+Testing.h new file mode 100644 index 0000000..e48bd53 --- /dev/null +++ b/Pods/Google-Maps-iOS-Utils/src/Clustering/View/GMUDefaultClusterIconGenerator+Testing.h @@ -0,0 +1,30 @@ +/* Copyright (c) 2016 Google 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. + */ + +#import "GMUDefaultClusterIconGenerator.h" + +/* Extensions for testing purposes only. */ +@interface GMUDefaultClusterIconGenerator (Testing) + +/* Draws |text| on top of an |image| and returns the resultant image. */ +- (UIImage *)iconForText:(NSString *)text withBaseImage:(UIImage *)image; + +/** + * Draws |text| on top of a circle whose background color is determined by |bucketIndex| + * and returns the resultant image. + */ +- (UIImage *)iconForText:(NSString *)text withBucketIndex:(NSUInteger)bucketIndex; + +@end diff --git a/Pods/Google-Maps-iOS-Utils/src/Clustering/View/GMUDefaultClusterIconGenerator.h b/Pods/Google-Maps-iOS-Utils/src/Clustering/View/GMUDefaultClusterIconGenerator.h new file mode 100644 index 0000000..86814fc --- /dev/null +++ b/Pods/Google-Maps-iOS-Utils/src/Clustering/View/GMUDefaultClusterIconGenerator.h @@ -0,0 +1,70 @@ +/* Copyright (c) 2016 Google 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. + */ + +#import +#import + +#import "GMUClusterIconGenerator.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + * This class places clusters into range-based buckets of size to avoid having too many distinct + * cluster icons. For example a small cluster of 1 to 9 items will have a icon with a text label + * of 1 to 9. Whereas clusters with a size of 100 to 199 items will be placed in the 100+ bucket + * and have the '100+' icon shown. + * This caches already generated icons for performance reasons. + */ +@interface GMUDefaultClusterIconGenerator : NSObject + +/** + * Initializes the object with default buckets and auto generated background images. + */ +- (instancetype)init; + +/** + * Initializes the object with given |buckets| and auto generated background images. + */ +- (instancetype)initWithBuckets:(NSArray *)buckets; + +/** + * Initializes the class with a list of buckets and the corresponding background images. + * The backgroundImages array should ideally be big enough to hold the cluster label. + * Notes: + * - |buckets| should be strictly increasing. For example: @[@10, @20, @100, @1000]. + * - |buckets| and |backgroundImages| must have equal non zero lengths. + */ +- (instancetype)initWithBuckets:(NSArray *)buckets + backgroundImages:(NSArray *)backgroundImages; + +/** + * Initializes the class with a list of buckets and the corresponding background colors. + * + * Notes: + * - |buckets| should be strictly increasing. For example: @[@10, @20, @100, @1000]. + * - |buckets| and |backgroundColors| must have equal non zero lengths. + */ +- (instancetype)initWithBuckets:(NSArray *)buckets + backgroundColors:(NSArray *)backgroundColors; + +/** + * Generates an icon with the given size. + */ +- (UIImage *)iconForSize:(NSUInteger)size; + +@end + +NS_ASSUME_NONNULL_END + diff --git a/Pods/Google-Maps-iOS-Utils/src/Clustering/View/GMUDefaultClusterIconGenerator.m b/Pods/Google-Maps-iOS-Utils/src/Clustering/View/GMUDefaultClusterIconGenerator.m new file mode 100644 index 0000000..a33b019 --- /dev/null +++ b/Pods/Google-Maps-iOS-Utils/src/Clustering/View/GMUDefaultClusterIconGenerator.m @@ -0,0 +1,212 @@ +/* Copyright (c) 2016 Google 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. + */ + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +#import "GMUDefaultClusterIconGenerator+Testing.h" + +#define UIColorFromHEX(hexValue) \ + [UIColor colorWithRed:((CGFloat)((hexValue & 0xff0000) >> 16)) / 255.0 \ + green:((CGFloat)((hexValue & 0x00ff00) >> 8)) / 255.0 \ + blue:((CGFloat)((hexValue & 0x0000ff) >> 0)) / 255.0 \ + alpha:1.0] + +// Default bucket background colors when no background images are set. +static NSArray *kGMUBucketBackgroundColors; + +@implementation GMUDefaultClusterIconGenerator { + NSCache *_iconCache; + NSArray *_buckets; + NSArray *_backgroundImages; + NSArray *_backgroundColors; +} + ++ (void)initialize { + kGMUBucketBackgroundColors = @[ + UIColorFromHEX(0x0099cc), + UIColorFromHEX(0x669900), + UIColorFromHEX(0xff8800), + UIColorFromHEX(0xcc0000), + UIColorFromHEX(0x9933cc), + ]; +} + +- (instancetype)init { + if ((self = [super init]) != nil) { + _iconCache = [[NSCache alloc] init]; + _buckets = @[ @10, @50, @100, @200, @1000 ]; + _backgroundColors = [kGMUBucketBackgroundColors copy]; + } + return self; +} + +- (instancetype)initWithBuckets:(NSArray *)buckets + backgroundImages:(NSArray *)backgroundImages { + if ((self = [self initWithBuckets:buckets]) != nil) { + if (buckets.count != backgroundImages.count) { + [NSException raise:NSInvalidArgumentException + format:@"buckets' size: %lu is not equal to backgroundImages' size: %lu", + (unsigned long)buckets.count, (unsigned long)backgroundImages.count]; + } + + _backgroundImages = [backgroundImages copy]; + } + return self; +} + +- (instancetype)initWithBuckets:(NSArray *)buckets + backgroundColors:(NSArray *)backgroundColors { + if ((self = [self initWithBuckets:buckets]) != nil) { + if (buckets.count != backgroundColors.count) { + [NSException raise:NSInvalidArgumentException + format:@"buckets' size: %lu is not equal to backgroundColors' size: %lu", + (unsigned long) buckets.count, (unsigned long) backgroundColors.count]; + } + + _backgroundColors = [backgroundColors copy]; + } + return self; +} + +- (instancetype)initWithBuckets:(NSArray *)buckets { + if ((self = [self init]) != nil) { + if (buckets.count == 0) { + [NSException raise:NSInvalidArgumentException format:@"buckets are empty"]; + } + for (int i = 0; i < buckets.count; ++i) { + if (buckets[i].longLongValue <= 0) { + [NSException raise:NSInvalidArgumentException + format:@"buckets have non positive values"]; + } + } + for (int i = 0; i < buckets.count - 1; ++i) { + if (buckets[i].longLongValue >= buckets[i+1].longLongValue) { + [NSException raise:NSInvalidArgumentException + format:@"buckets are not strictly increasing"]; + } + } + _buckets = [buckets copy]; + } + return self; +} + +- (UIImage *)iconForSize:(NSUInteger)size { + NSUInteger bucketIndex = [self bucketIndexForSize:size]; + NSString *text; + + // If size is smaller to first bucket size, use the size as is otherwise round it down to the + // nearest bucket to limit the number of cluster icons we need to generate. + if (size < _buckets[0].unsignedLongValue) { + text = [NSString stringWithFormat:@"%ld", (unsigned long)size]; + } else { + text = [NSString stringWithFormat:@"%ld+", _buckets[bucketIndex].unsignedLongValue]; + } + if (_backgroundImages != nil) { + UIImage *image = _backgroundImages[bucketIndex]; + return [self iconForText:text withBaseImage:image]; + } + return [self iconForText:text withBucketIndex:bucketIndex]; +} + +#pragma mark Private + +// Finds the smallest bucket which is greater than |size|. If none exists return the last bucket +// index (i.e |_buckets.count - 1|). +- (NSUInteger)bucketIndexForSize:(NSUInteger)size { + NSUInteger index = 0; + while (index + 1 < _buckets.count && _buckets[index + 1].unsignedLongValue <= size) { + ++index; + } + return index; +} + +- (UIImage *)iconForText:(NSString *)text withBaseImage:(UIImage *)image { + UIImage *icon = [_iconCache objectForKey:text]; + if (icon != nil) { + return icon; + } + + UIFont *font = [UIFont boldSystemFontOfSize:12]; + CGSize size = image.size; + UIGraphicsBeginImageContextWithOptions(size, NO, 0.0f); + [image drawInRect:CGRectMake(0, 0, size.width, size.height)]; + CGRect rect = CGRectMake(0, 0, image.size.width, image.size.height); + + NSMutableParagraphStyle *paragraphStyle = [[NSParagraphStyle defaultParagraphStyle] mutableCopy]; + paragraphStyle.alignment = NSTextAlignmentCenter; + NSDictionary *attributes = @{ + NSFontAttributeName : font, + NSParagraphStyleAttributeName : paragraphStyle, + NSForegroundColorAttributeName : [UIColor whiteColor] + }; + CGSize textSize = [text sizeWithAttributes:attributes]; + CGRect textRect = CGRectInset(rect, (rect.size.width - textSize.width) / 2, + (rect.size.height - textSize.height) / 2); + [text drawInRect:CGRectIntegral(textRect) withAttributes:attributes]; + + UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); + UIGraphicsEndImageContext(); + + [_iconCache setObject:newImage forKey:text]; + return newImage; +} + +- (UIImage *)iconForText:(NSString *)text withBucketIndex:(NSUInteger)bucketIndex { + UIImage *icon = [_iconCache objectForKey:text]; + if (icon != nil) { + return icon; + } + + UIFont *font = [UIFont boldSystemFontOfSize:14]; + NSMutableParagraphStyle *paragraphStyle = [[NSParagraphStyle defaultParagraphStyle] mutableCopy]; + paragraphStyle.alignment = NSTextAlignmentCenter; + NSDictionary *attributes = @{ + NSFontAttributeName : font, + NSParagraphStyleAttributeName : paragraphStyle, + NSForegroundColorAttributeName : [UIColor whiteColor] + }; + CGSize textSize = [text sizeWithAttributes:attributes]; + + // Create an image context with a square shape to contain the text (with more padding for + // larger buckets). + CGFloat rectDimension = MAX(20, MAX(textSize.width, textSize.height)) + 3 * bucketIndex + 6; + CGRect rect = CGRectMake(0.f, 0.f, rectDimension, rectDimension); + UIGraphicsBeginImageContext(rect.size); + + // Draw background circle. + UIGraphicsBeginImageContextWithOptions(rect.size, NO, 0.0f); + CGContextRef ctx = UIGraphicsGetCurrentContext(); + CGContextSaveGState(ctx); + bucketIndex = MIN(bucketIndex, _backgroundColors.count - 1); + UIColor *backColor = _backgroundColors[bucketIndex]; + CGContextSetFillColorWithColor(ctx, backColor.CGColor); + CGContextFillEllipseInRect(ctx, rect); + CGContextRestoreGState(ctx); + + // Draw text. + [[UIColor whiteColor] set]; + CGRect textRect = CGRectInset(rect, (rect.size.width - textSize.width) / 2, + (rect.size.height - textSize.height) / 2); + [text drawInRect:CGRectIntegral(textRect) withAttributes:attributes]; + UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); + UIGraphicsEndImageContext(); + + [_iconCache setObject:newImage forKey:text]; + return newImage; +} + +@end diff --git a/Pods/Google-Maps-iOS-Utils/src/Clustering/View/GMUDefaultClusterRenderer.h b/Pods/Google-Maps-iOS-Utils/src/Clustering/View/GMUDefaultClusterRenderer.h new file mode 100644 index 0000000..c965708 --- /dev/null +++ b/Pods/Google-Maps-iOS-Utils/src/Clustering/View/GMUDefaultClusterRenderer.h @@ -0,0 +1,162 @@ +/* Copyright (c) 2016 Google 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. + */ + +#import + +#import "GMUClusterRenderer.h" + +NS_ASSUME_NONNULL_BEGIN + +@class GMSMapView; +@class GMSMarker; + +@protocol GMUCluster; +@protocol GMUClusterIconGenerator; +@protocol GMUClusterRenderer; + +/** + * Delegate for id to provide extra functionality to the default + * renderer. + */ +@protocol GMUClusterRendererDelegate + +@optional + +/** + * Returns a marker for an |object|. The |object| can be either an id + * or an id. Use this delegate to control of the life cycle of + * the marker. Any properties set on the returned marker will be honoured except + * for: .position, .icon, .groundAnchor, .zIndex and .userData. To customize + * these properties use renderer:willRenderMarker. + * Note that changing a marker's position is not recommended because it will + * interfere with the marker animation. + */ +- (nullable GMSMarker *)renderer:(id)renderer markerForObject:(id)object; + +/** + * Raised when a marker (for a cluster or an item) is about to be added to the map. + * Use the marker.userData property to check whether it is a cluster marker or an + * item marker. + */ +- (void)renderer:(id)renderer willRenderMarker:(GMSMarker *)marker; + +/** + * Raised when a marker (for a cluster or an item) has just been added to the map + * and animation has been added. + * Use the marker.userData property to check whether it is a cluster marker or an + * item marker. + */ +- (void)renderer:(id)renderer didRenderMarker:(GMSMarker *)marker; + +@end + +/** + * Default cluster renderer which shows clusters as markers with specialized icons. + * There is logic to decide whether to expand a cluster or not depending on the number of + * items or the zoom level. + * There is also some performance optimization where only clusters within the visisble + * region are shown. + */ +@interface GMUDefaultClusterRenderer : NSObject + +/** + * Creates a new cluster renderer with a given map view and icon generator. + * + * @param mapView The map view to use. + * @param iconGenerator The icon generator to use. Can be subclassed if required. + */ +- (instancetype)initWithMapView:(GMSMapView *)mapView + clusterIconGenerator:(id)iconGenerator; + +/** + * Animates the clusters to achieve splitting (when zooming in) and merging + * (when zooming out) effects: + * - splitting large clusters into smaller ones when zooming in. + * - merging small clusters into bigger ones when zooming out. + * + * NOTES: the position to animate to/from for each cluster is heuristically + * calculated by finding the first overlapping cluster. This means that: + * - when zooming in: + * if a cluster on a higher zoom level is made from multiple clusters on + * a lower zoom level the split will only animate the new cluster from + * one of them. + * - when zooming out: + * if a cluster on a higher zoom level is split into multiple parts to join + * multiple clusters at a lower zoom level, the merge will only animate + * the old cluster into one of them. + * Because of these limitations, the actual cluster sizes may not add up, for + * example people may see 3 clusters of size 3, 4, 5 joining to make up a cluster + * of only 8 for non-hierachical clusters. And vice versa, a cluster of 8 may + * split into 3 clusters of size 3, 4, 5. For hierarchical clusters, the numbers + * should add up however. + * + * Defaults to YES. + */ +@property(nonatomic) BOOL animatesClusters; + +/** + * Determines the minimum number of cluster items inside a cluster. + * Clusters smaller than this threshold will be expanded. + * + * Defaults to 4. + */ +@property(nonatomic) NSUInteger minimumClusterSize; + +/** + * Sets the maximium zoom level of the map on which the clustering + * should be applied. At zooms above this level, clusters will be expanded. + * This is to prevent cases where items are so close to each other than they + * are always grouped. + * + * Defaults to 20. + */ +@property(nonatomic) NSUInteger maximumClusterZoom; + +/** + * Sets the animation duration for marker splitting/merging effects. + * Measured in seconds. + * + * Defaults to 0.5. + */ +@property(nonatomic) double animationDuration; + +/** + * Allows setting a zIndex value for the clusters. This becomes useful + * when using multiple cluster data sets on the map and require a predictable + * way of displaying multiple sets with a predictable layering order. + * + * If no specific zIndex is not specified during the initialization, the + * default zIndex is '1'. Larger zIndex values are drawn over lower ones + * similar to the zIndex value of GMSMarkers. + */ +@property(nonatomic) int zIndex; + +/** Sets to further customize the renderer. */ +@property(nonatomic, nullable, weak) id delegate; + +/** + * Returns currently active markers. + */ +@property(nonatomic, readonly) NSArray *markers; + +/** + * If returns NO, cluster items will be expanded and rendered as normal markers. + * Subclass can override this method to provide custom logic. + */ +- (BOOL)shouldRenderAsCluster:(id)cluster atZoom:(float)zoom; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/Google-Maps-iOS-Utils/src/Clustering/View/GMUDefaultClusterRenderer.m b/Pods/Google-Maps-iOS-Utils/src/Clustering/View/GMUDefaultClusterRenderer.m new file mode 100644 index 0000000..ec6b4bf --- /dev/null +++ b/Pods/Google-Maps-iOS-Utils/src/Clustering/View/GMUDefaultClusterRenderer.m @@ -0,0 +1,395 @@ +/* Copyright (c) 2016 Google 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. + */ + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +#import + +#import "GMUDefaultClusterRenderer.h" +#import "GMUClusterIconGenerator.h" +#import "GMUWrappingDictionaryKey.h" + +// Clusters smaller than this threshold will be expanded. +static const NSUInteger kGMUMinClusterSize = 4; + +// At zooms above this level, clusters will be expanded. +// This is to prevent cases where items are so close to each other than they are always grouped. +static const float kGMUMaxClusterZoom = 20; + +// Animation duration for marker splitting/merging effects. +static const double kGMUAnimationDuration = 0.5; // seconds. + +@implementation GMUDefaultClusterRenderer { + // Map view to render clusters on. + __weak GMSMapView *_mapView; + + // Collection of markers added to the map. + NSMutableArray *_mutableMarkers; + + // Icon generator used to create cluster icon. + id _clusterIconGenerator; + + // Current clusters being rendered. + NSArray> *_clusters; + + // Tracks clusters that have been rendered to the map. + NSMutableSet *_renderedClusters; + + // Tracks cluster items that have been rendered to the map. + NSMutableSet *_renderedClusterItems; + + // Stores previous zoom level to determine zooming direction (in/out). + float _previousZoom; + + // Lookup map from cluster item to an old cluster. + NSMutableDictionary> *_itemToOldClusterMap; + + // Lookup map from cluster item to a new cluster. + NSMutableDictionary> *_itemToNewClusterMap; +} + +- (instancetype)initWithMapView:(GMSMapView *)mapView + clusterIconGenerator:(id)iconGenerator { + if ((self = [super init])) { + _mapView = mapView; + _mutableMarkers = [[NSMutableArray alloc] init]; + _clusterIconGenerator = iconGenerator; + _renderedClusters = [[NSMutableSet alloc] init]; + _renderedClusterItems = [[NSMutableSet alloc] init]; + _animatesClusters = YES; + _minimumClusterSize = kGMUMinClusterSize; + _maximumClusterZoom = kGMUMaxClusterZoom; + _animationDuration = kGMUAnimationDuration; + + _zIndex = 1; + } + return self; +} + +- (void)dealloc { + [self clear]; +} + +- (BOOL)shouldRenderAsCluster:(id)cluster atZoom:(float)zoom { + return cluster.count >= _minimumClusterSize && zoom <= _maximumClusterZoom; +} + +#pragma mark GMUClusterRenderer + +- (void)renderClusters:(NSArray> *)clusters { + [_renderedClusters removeAllObjects]; + [_renderedClusterItems removeAllObjects]; + + if (_animatesClusters) { + [self renderAnimatedClusters:clusters]; + } else { + // No animation, just remove existing markers and add new ones. + _clusters = [clusters copy]; + [self clearMarkers:_mutableMarkers]; + _mutableMarkers = [[NSMutableArray alloc] init]; + [self addOrUpdateClusters:clusters animated:NO]; + } +} + +- (void)renderAnimatedClusters:(NSArray> *)clusters { + float zoom = _mapView.camera.zoom; + BOOL isZoomingIn = zoom > _previousZoom; + + [self prepareClustersForAnimation:clusters isZoomingIn:isZoomingIn]; + + _previousZoom = zoom; + + _clusters = [clusters copy]; + + NSArray *existingMarkers = _mutableMarkers; + _mutableMarkers = [[NSMutableArray alloc] init]; + + [self addOrUpdateClusters:clusters animated:isZoomingIn]; + + if (isZoomingIn) { + [self clearMarkers:existingMarkers]; + } else { + [self clearMarkersAnimated:existingMarkers]; + } +} + +- (void)clearMarkersAnimated:(NSArray *)markers { + // Remove existing markers: animate to nearest new cluster. + GMSCoordinateBounds *visibleBounds = + [[GMSCoordinateBounds alloc] initWithRegion:[_mapView.projection visibleRegion]]; + + for (GMSMarker *marker in markers) { + // If the marker for the attached userData has just been added, do not perform animation. + if ([_renderedClusterItems containsObject:marker.userData]) { + marker.map = nil; + continue; + } + // If the marker is outside the visible view port, do not perform animation. + if (![visibleBounds containsCoordinate:marker.position]) { + marker.map = nil; + continue; + } + + // Find a candidate cluster to animate to. + id toCluster = nil; + if ([marker.userData conformsToProtocol:@protocol(GMUCluster)]) { + id cluster = marker.userData; + toCluster = [self overlappingClusterForCluster:cluster itemMap:_itemToNewClusterMap]; + } else { + GMUWrappingDictionaryKey *key = + [[GMUWrappingDictionaryKey alloc] initWithObject:marker.userData]; + toCluster = [_itemToNewClusterMap objectForKey:key]; + } + // If there is not near by cluster to animate to, do not perform animation. + if (toCluster == nil) { + marker.map = nil; + continue; + } + + // All is good, perform the animation. + [CATransaction begin]; + [CATransaction setAnimationDuration:_animationDuration]; + CLLocationCoordinate2D toPosition = toCluster.position; + marker.layer.latitude = toPosition.latitude; + marker.layer.longitude = toPosition.longitude; + [CATransaction commit]; + } + + // Clears existing markers after animation has presumably ended. + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, _animationDuration * NSEC_PER_SEC), + dispatch_get_main_queue(), ^{ + [self clearMarkers:markers]; + }); +} + +// Called when camera is changed to reevaluate if new clusters need to be displayed because +// they become visible. +- (void)update { + [self addOrUpdateClusters:_clusters animated:NO]; +} + +- (NSArray *)markers { + return [_mutableMarkers copy]; +} + +#pragma mark Private + +// Builds lookup map for item to old clusters, new clusters. +- (void)prepareClustersForAnimation:(NSArray> *)newClusters + isZoomingIn:(BOOL)isZoomingIn { + float zoom = _mapView.camera.zoom; + + if (isZoomingIn) { + _itemToOldClusterMap = + [[NSMutableDictionary> alloc] init]; + for (id cluster in _clusters) { + if (![self shouldRenderAsCluster:cluster atZoom:zoom] + && ![self shouldRenderAsCluster:cluster atZoom:_previousZoom]) { + continue; + } + for (id clusterItem in cluster.items) { + GMUWrappingDictionaryKey *key = + [[GMUWrappingDictionaryKey alloc] initWithObject:clusterItem]; + [_itemToOldClusterMap setObject:cluster forKey:key]; + } + } + _itemToNewClusterMap = nil; + } else { + _itemToOldClusterMap = nil; + _itemToNewClusterMap = + [[NSMutableDictionary> alloc] init]; + for (id cluster in newClusters) { + if (![self shouldRenderAsCluster:cluster atZoom:zoom]) continue; + for (id clusterItem in cluster.items) { + GMUWrappingDictionaryKey *key = + [[GMUWrappingDictionaryKey alloc] initWithObject:clusterItem]; + [_itemToNewClusterMap setObject:cluster forKey:key]; + } + } + } +} + +// Goes through each cluster |clusters| and add a marker for it if it is: +// - inside the visible region of the camera. +// - not yet already added. +- (void)addOrUpdateClusters:(NSArray> *)clusters animated:(BOOL)animated { + GMSCoordinateBounds *visibleBounds = + [[GMSCoordinateBounds alloc] initWithRegion:[_mapView.projection visibleRegion]]; + + for (id cluster in clusters) { + if ([_renderedClusters containsObject:cluster]) continue; + + BOOL shouldShowCluster = [visibleBounds containsCoordinate:cluster.position]; + BOOL shouldRenderAsCluster = [self shouldRenderAsCluster:cluster atZoom: _mapView.camera.zoom]; + + if (!shouldShowCluster) { + for (id item in cluster.items) { + if (!shouldRenderAsCluster && [visibleBounds containsCoordinate:item.position]) { + shouldShowCluster = YES; + break; + } + if (animated) { + GMUWrappingDictionaryKey *key = [[GMUWrappingDictionaryKey alloc] initWithObject:item]; + id oldCluster = [_itemToOldClusterMap objectForKey:key]; + if (oldCluster != nil && [visibleBounds containsCoordinate:oldCluster.position]) { + shouldShowCluster = YES; + break; + } + } + } + } + if (shouldShowCluster) { + [self renderCluster:cluster animated:animated]; + } + } +} + +- (void)renderCluster:(id)cluster animated:(BOOL)animated { + float zoom = _mapView.camera.zoom; + if ([self shouldRenderAsCluster:cluster atZoom:zoom]) { + CLLocationCoordinate2D fromPosition = kCLLocationCoordinate2DInvalid; + if (animated) { + id fromCluster = + [self overlappingClusterForCluster:cluster itemMap:_itemToOldClusterMap]; + animated = fromCluster != nil; + fromPosition = fromCluster.position; + } + + UIImage *icon = [_clusterIconGenerator iconForSize:cluster.count]; + GMSMarker *marker = [self markerWithPosition:cluster.position + from:fromPosition + userData:cluster + clusterIcon:icon + animated:animated]; + [_mutableMarkers addObject:marker]; + } else { + for (id item in cluster.items) { + CLLocationCoordinate2D fromPosition = kCLLocationCoordinate2DInvalid; + BOOL shouldAnimate = animated; + if (shouldAnimate) { + GMUWrappingDictionaryKey *key = [[GMUWrappingDictionaryKey alloc] initWithObject:item]; + id fromCluster = [_itemToOldClusterMap objectForKey:key]; + shouldAnimate = fromCluster != nil; + fromPosition = fromCluster.position; + } + + GMSMarker *marker = [self markerWithPosition:item.position + from:fromPosition + userData:item + clusterIcon:nil + animated:shouldAnimate]; + [_mutableMarkers addObject:marker]; + [_renderedClusterItems addObject:item]; + } + } + [_renderedClusters addObject:cluster]; +} + +- (GMSMarker *)markerForObject:(id)object { + GMSMarker *marker; + if ([_delegate respondsToSelector:@selector(renderer:markerForObject:)]) { + marker = [_delegate renderer:self markerForObject:object]; + } + return marker ?: [[GMSMarker alloc] init]; +} + +// Returns a marker at final position of |position| with attached |userData|. +// If animated is YES, animates from the closest point from |points|. +- (GMSMarker *)markerWithPosition:(CLLocationCoordinate2D)position + from:(CLLocationCoordinate2D)from + userData:(id)userData + clusterIcon:(UIImage *)clusterIcon + animated:(BOOL)animated { + GMSMarker *marker = [self markerForObject:userData]; + CLLocationCoordinate2D initialPosition = animated ? from : position; + marker.position = initialPosition; + marker.userData = userData; + if (clusterIcon != nil) { + marker.icon = clusterIcon; + marker.groundAnchor = CGPointMake(0.5, 0.5); + } + marker.zIndex = _zIndex; + + if ([_delegate respondsToSelector:@selector(renderer:willRenderMarker:)]) { + [_delegate renderer:self willRenderMarker:marker]; + } + marker.map = _mapView; + + if (animated) { + [CATransaction begin]; + [CATransaction setAnimationDuration:_animationDuration]; + marker.layer.latitude = position.latitude; + marker.layer.longitude = position.longitude; + [CATransaction commit]; + } + + if ([_delegate respondsToSelector:@selector(renderer:didRenderMarker:)]) { + [_delegate renderer:self didRenderMarker:marker]; + } + return marker; +} + +// Returns clusters which should be rendered and is inside the camera visible region. +- (NSArray> *)visibleClustersFromClusters:(NSArray> *)clusters { + NSMutableArray *visibleClusters = [[NSMutableArray alloc] init]; + float zoom = _mapView.camera.zoom; + GMSCoordinateBounds *visibleBounds = + [[GMSCoordinateBounds alloc] initWithRegion:[_mapView.projection visibleRegion]]; + for (id cluster in clusters) { + if (![visibleBounds containsCoordinate:cluster.position]) continue; + if (![self shouldRenderAsCluster:cluster atZoom:zoom]) continue; + [visibleClusters addObject:cluster]; + } + return visibleClusters; +} + +// Returns the first cluster in |itemMap| that shares a common item with the input |cluster|. +// Used for heuristically finding candidate cluster to animate to/from. +- (id)overlappingClusterForCluster: + (id)cluster + itemMap:(NSDictionary> *)itemMap { + id found = nil; + for (id item in cluster.items) { + GMUWrappingDictionaryKey *key = [[GMUWrappingDictionaryKey alloc] initWithObject:item]; + id candidate = [itemMap objectForKey:key]; + if (candidate != nil) { + found = candidate; + break; + } + } + return found; +} + +// Removes all existing markers from the attached map. +- (void)clear { + [self clearMarkers:_mutableMarkers]; + [_mutableMarkers removeAllObjects]; + [_renderedClusters removeAllObjects]; + [_renderedClusterItems removeAllObjects]; + [_itemToNewClusterMap removeAllObjects]; + [_itemToOldClusterMap removeAllObjects]; + _clusters = nil; +} + +- (void)clearMarkers:(NSArray *)markers { + for (GMSMarker *marker in markers) { + marker.userData = nil; + marker.map = nil; + } +} + +@end diff --git a/Pods/Google-Maps-iOS-Utils/src/Geometry/GMUGeoJSONParser.h b/Pods/Google-Maps-iOS-Utils/src/Geometry/GMUGeoJSONParser.h new file mode 100644 index 0000000..904e6e4 --- /dev/null +++ b/Pods/Google-Maps-iOS-Utils/src/Geometry/GMUGeoJSONParser.h @@ -0,0 +1,61 @@ +/* Copyright (c) 2016 Google 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. + */ + +#import + +NS_ASSUME_NONNULL_BEGIN + +@protocol GMUGeometryContainer; + +/** + * Instances of this class parse GeoJSON data. The parsed features are stored in NSArray objects + * which can then be passed to a GMUGeometryRenderer to display on a Google Map. + */ +@interface GMUGeoJSONParser : NSObject + +/** + * The features parsed from the GeoJSON file. + */ +@property(nonatomic, readonly) NSArray> *features; + +/** + * Initializes a GMUGeoJSONParser with GeoJSON data contained in a URL. + * + * @param url The url containing GeoJSON data. + */ +- (instancetype)initWithURL:(NSURL *)url; + +/** + * Initializes a GMUGeoJSONParser with GeoJSON data. + * + * @param data The GeoJSON data. + */ +- (instancetype)initWithData:(NSData *)data; + +/** + * Initializes a GMUGeoJSONParser with GeoJSON data contained in an input stream. + * + * @param stream The stream to use to access GeoJSON data. + */ +- (instancetype)initWithStream:(NSInputStream *)stream; + +/** + * Parses the stored GeoJSON data. + */ +- (void)parse; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/Google-Maps-iOS-Utils/src/Geometry/GMUGeoJSONParser.m b/Pods/Google-Maps-iOS-Utils/src/Geometry/GMUGeoJSONParser.m new file mode 100644 index 0000000..33364ad --- /dev/null +++ b/Pods/Google-Maps-iOS-Utils/src/Geometry/GMUGeoJSONParser.m @@ -0,0 +1,334 @@ +/* Copyright (c) 2016 Google 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. + */ + +#import "GMUGeoJSONParser.h" + +#import + +#import + +#import "GMUFeature.h" +#import "GMUGeometryCollection.h" +#import "GMULineString.h" +#import "GMUPoint.h" +#import "GMUPolygon.h" + +static NSString *const kGMUTypeMember = @"type"; +static NSString *const kGMUIdMember = @"id"; +static NSString *const kGMUGeometryMember = @"geometry"; +static NSString *const kGMUGeometriesMember = @"geometries"; +static NSString *const kGMUPropertiesMember = @"properties"; +static NSString *const kGMUBoundingBoxMember = @"bbox"; +static NSString *const kGMUCoordinatesMember = @"coordinates"; +static NSString *const kGMUFeaturesMember = @"features"; +static NSString *const kGMUFeatureValue = @"Feature"; +static NSString *const kGMUFeatureCollectionValue = @"FeatureCollection"; +static NSString *const kGMUPointValue = @"Point"; +static NSString *const kGMUMultiPointValue = @"MultiPoint"; +static NSString *const kGMULineStringValue = @"LineString"; +static NSString *const kGMUMultiLineStringValue = @"MultiLineString"; +static NSString *const kGMUPolygonValue = @"Polygon"; +static NSString *const kGMUMultiPolygonValue = @"MultiPolygon"; +static NSString *const kGMUGeometryCollectionValue = @"GeometryCollection"; +static NSString *const kGMUGeometryRegex = + @"^(Point|MultiPoint|LineString|MultiLineString|Polygon|MultiPolygon|GeometryCollection)$"; + +@implementation GMUGeoJSONParser { + /** + * The data object containing the GeoJSON to be parsed. + */ + NSData *_data; + + /** + * The stream containing the GeoJSON to be parsed. + */ + NSInputStream *_stream; + + /** + * The parsed GeoJSON file. + */ + NSDictionary *_JSONDict; + + /** + * The list of parsed Features. + */ + NSMutableArray *_features; + + /** + * The bounding box for a FeatureCollection. This will only be set when parsing a + * FeatureCollection. + */ + GMSCoordinateBounds *_boundingBox; + + /** + * The format that a geometry element may take. + */ + NSRegularExpression *_geometryRegex; + + /** + * The format that a multigeometry element may take. + */ + NSRegularExpression *_multiGeometryRegex; + + /** + * Whether the parser has completed parsing the input file. + */ + BOOL _isParsed; +} + +- (instancetype)initWithData:(NSData *)data { + if (self = [super init]) { + _data = data; + [self sharedInit]; + } + return self; +} + +- (instancetype)initWithStream:(NSInputStream *)stream { + if (self = [super init]) { + _stream = stream; + [self sharedInit]; + } + return self; +} + +- (instancetype)initWithURL:(NSURL *)url { + if (self = [super init]) { + _data = [[NSData alloc] initWithContentsOfURL:url]; + [self sharedInit]; + } + return self; +} + +- (void)sharedInit { + _features = [[NSMutableArray alloc] init]; + _geometryRegex = [NSRegularExpression regularExpressionWithPattern:kGMUGeometryRegex + options:0 + error:nil]; +} + +- (NSArray *)features { + return _features; +} + +- (void)parse { + if (_isParsed) { + return; + } + if (_data) { + _JSONDict = [NSJSONSerialization JSONObjectWithData:_data options:0 error:nil]; + } else if (_stream) { + [_stream open]; + _JSONDict = [NSJSONSerialization JSONObjectWithStream:_stream options:0 error:nil]; + [_stream close]; + } + if (!_JSONDict || ![_JSONDict isKindOfClass:[NSDictionary class]]) { + return; + } + NSString *type = [_JSONDict objectForKey:kGMUTypeMember]; + if (type == nil) { + return; + } + GMUFeature *feature; + if ([type isEqual:kGMUFeatureValue]) { + feature = [self featureFromDict:_JSONDict]; + if (feature) { + [_features addObject:feature]; + } + } else if ([type isEqual:kGMUFeatureCollectionValue]) { + NSArray *featureCollection = [self featureCollectionFromDict:_JSONDict]; + if (featureCollection) { + [_features addObjectsFromArray:featureCollection]; + } + } else if ([_geometryRegex firstMatchInString:type + options:0 + range:NSMakeRange(0, [type length])]) { + feature = [self featureFromGeometryDict:_JSONDict]; + if (feature) { + [_features addObject:feature]; + } + } + _isParsed = true; +} + +- (GMUFeature *)featureFromDict:(NSDictionary *)feature { + id geometry; + NSString *identifier = [feature objectForKey:kGMUIdMember]; + GMSCoordinateBounds *boundingBox; + NSDictionary *properties = [feature objectForKey:kGMUPropertiesMember]; + if ([feature objectForKey:kGMUGeometryMember]) { + geometry = [self geometryFromDict:[feature objectForKey:kGMUGeometryMember]]; + } + if (_boundingBox) { + boundingBox = _boundingBox; + } else if ([feature objectForKey:kGMUBoundingBoxMember]) { + boundingBox = [self boundingBoxFromCoordinates:[feature objectForKey:kGMUBoundingBoxMember]]; + } + return [[GMUFeature alloc] initWithGeometry:geometry + identifier:identifier + properties:properties + boundingBox:boundingBox]; +} + +- (NSArray *)featureCollectionFromDict:(NSDictionary *)features { + NSMutableArray *parsedFeatures = [[NSMutableArray alloc] init]; + if ([features objectForKey:kGMUBoundingBoxMember]) { + _boundingBox = [self boundingBoxFromCoordinates:[features objectForKey:kGMUBoundingBoxMember]]; + } + NSArray *geoJSONFeatures = [features objectForKey:kGMUFeaturesMember]; + for (NSDictionary *feature in geoJSONFeatures) { + if ([[feature objectForKey:kGMUTypeMember] isEqual:kGMUFeatureValue]) { + GMUFeature *parsedFeature = [self featureFromDict:feature]; + if (parsedFeature) { + [parsedFeatures addObject:parsedFeature]; + } + } + } + return parsedFeatures; +} + +/** + * Creates a GMSCoordinateBounds object from a set of coordinates. + * + * @param coordinates The coordinates for the bounding box in the order west, south, east, north. + * @return A bounding box with the specified coordinates. + */ +- (GMSCoordinateBounds *)boundingBoxFromCoordinates:(NSArray *)coordinates { + CLLocationCoordinate2D southWest = + CLLocationCoordinate2DMake([coordinates[1] doubleValue], [coordinates[0] doubleValue]); + CLLocationCoordinate2D northEast = + CLLocationCoordinate2DMake([coordinates[3] doubleValue], [coordinates[2] doubleValue]); + return [[GMSCoordinateBounds alloc] initWithCoordinate:northEast coordinate:southWest]; +} + +- (id)geometryFromDict:(NSDictionary *)dict { + NSString *geometryType = [dict objectForKey:kGMUTypeMember]; + NSArray *geometryArray; + if ([geometryType isEqual:kGMUGeometryCollectionValue]) { + geometryArray = [dict objectForKey:kGMUGeometriesMember]; + } else if ([geometryType isEqual:kGMUGeometriesMember]) { + geometryArray = [dict objectForKey:kGMUGeometryCollectionValue]; + } else if ([_geometryRegex firstMatchInString:geometryType + options:0 + range:NSMakeRange(0, [geometryType length])]) { + geometryArray = [dict objectForKey:kGMUCoordinatesMember]; + } else { + return nil; + } + return [self geometryWithGeometryType:geometryType geometryArray:geometryArray]; +} + +- (GMUFeature *)featureFromGeometryDict:(NSDictionary *)JSONGeometry { + id geometry = [self geometryFromDict:JSONGeometry]; + if (geometry) { + return [[GMUFeature alloc] initWithGeometry:geometry + identifier:nil + properties:nil + boundingBox:nil]; + } + return nil; +} + +- (id)geometryWithGeometryType:(NSString *)geometryType + geometryArray:(NSArray *)geometryArray { + if ([geometryType isEqual:kGMUPointValue]) { + return [self pointWithCoordinate:geometryArray]; + } else if ([geometryType isEqual:kGMUMultiPointValue]) { + return [self multiPointWithCoordinates:geometryArray]; + } else if ([geometryType isEqual:kGMULineStringValue]) { + return [self lineStringWithCoordinates:geometryArray]; + } else if ([geometryType isEqual:kGMUMultiLineStringValue]) { + return [self multiLineStringWithCoordinates:geometryArray]; + } else if ([geometryType isEqual:kGMUPolygonValue]) { + return [self polygonWithCoordinates:geometryArray]; + } else if ([geometryType isEqual:kGMUMultiPolygonValue]) { + return [self multiPolygonWithCoordinates:geometryArray]; + } else if ([geometryType isEqual:kGMUGeometryCollectionValue]) { + return [self geometryCollectionWithGeometries:geometryArray]; + } + return nil; +} + +- (GMUPoint *)pointWithCoordinate:(NSArray *)coordinate { + return [[GMUPoint alloc] initWithCoordinate:[self locationFromCoordinate:coordinate].coordinate]; +} + +- (GMUGeometryCollection *)multiPointWithCoordinates:(NSArray *)coordinates { + NSMutableArray *points = [[NSMutableArray alloc] init]; + for (NSArray *coordinate in coordinates) { + [points addObject:[self pointWithCoordinate:coordinate]]; + } + return [[GMUGeometryCollection alloc] initWithGeometries:points]; +} + +- (GMULineString *)lineStringWithCoordinates:(NSArray *)coordinates { + GMSPath *path = [self pathFromCoordinateArray:coordinates]; + return [[GMULineString alloc] initWithPath:path]; +} + +- (GMUGeometryCollection *)multiLineStringWithCoordinates:(NSArray *)coordinates { + NSMutableArray *lineStrings = [[NSMutableArray alloc] init]; + for (NSArray *coordinate in coordinates) { + [lineStrings addObject:[self lineStringWithCoordinates:coordinate]]; + } + return [[GMUGeometryCollection alloc] initWithGeometries:lineStrings]; +} + +- (GMUPolygon *)polygonWithCoordinates:(NSArray *)coordinates { + NSArray *pathArray = [self pathArrayFromCoordinateArrays:coordinates]; + return [[GMUPolygon alloc] initWithPaths:pathArray]; +} + +- (GMUGeometryCollection *)multiPolygonWithCoordinates:(NSArray *)coordinates { + NSMutableArray *polygons = [[NSMutableArray alloc] init]; + for (NSArray *coordinate in coordinates) { + [polygons addObject:[self polygonWithCoordinates:coordinate]]; + } + return [[GMUGeometryCollection alloc] initWithGeometries:polygons]; +} + +- (GMUGeometryCollection *)geometryCollectionWithGeometries:(NSArray *)geometries { + NSMutableArray *elements = [[NSMutableArray alloc] init]; + for (NSDictionary *geometry in geometries) { + id parsedGeometry = [self geometryFromDict:geometry]; + if (parsedGeometry) { + [elements addObject:parsedGeometry]; + } + } + return [[GMUGeometryCollection alloc] initWithGeometries:elements]; +} + +- (CLLocation *)locationFromCoordinate:(NSArray *)coordinate { + return [[CLLocation alloc] initWithLatitude:[coordinate[1] doubleValue] + longitude:[coordinate[0] doubleValue]]; +} + +- (GMSPath *)pathFromCoordinateArray:(NSArray *)coordinates { + GMSMutablePath *path = [[GMSMutablePath alloc] init]; + for (NSArray *coordinate in coordinates) { + [path addCoordinate:[self locationFromCoordinate:coordinate].coordinate]; + } + return path; +} + +- (NSArray *)pathArrayFromCoordinateArrays:(NSArray *)coordinates { + NSMutableArray *parsedPaths = [[NSMutableArray alloc] init]; + for (NSArray *coordinateArray in coordinates) { + [parsedPaths addObject:[self pathFromCoordinateArray:coordinateArray]]; + } + return parsedPaths; +} + +@end diff --git a/Pods/Google-Maps-iOS-Utils/src/Geometry/GMUGeometryRenderer+Testing.h b/Pods/Google-Maps-iOS-Utils/src/Geometry/GMUGeometryRenderer+Testing.h new file mode 100644 index 0000000..44a80d2 --- /dev/null +++ b/Pods/Google-Maps-iOS-Utils/src/Geometry/GMUGeometryRenderer+Testing.h @@ -0,0 +1,23 @@ +/* Copyright (c) 2016 Google 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. + */ + +#import "GMUGeometryRenderer.h" + +/* Extensions for testing purposes only. */ +@interface GMUGeometryRenderer (Testing) + +- (NSArray *)mapOverlays; + +@end diff --git a/Pods/Google-Maps-iOS-Utils/src/Geometry/GMUGeometryRenderer.h b/Pods/Google-Maps-iOS-Utils/src/Geometry/GMUGeometryRenderer.h new file mode 100644 index 0000000..17016af --- /dev/null +++ b/Pods/Google-Maps-iOS-Utils/src/Geometry/GMUGeometryRenderer.h @@ -0,0 +1,76 @@ +/* Copyright (c) 2016 Google 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. + */ + +#import + +#import + +#import "GMUGeometryContainer.h" +#import "GMUStyle.h" +#import "GMUStyleMap.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + * Instances of this class render geometries generated by a GMUKMLParser or + * GMUGeoJSONParser object. These geometries can have specified style information + * applied to them when being rendered. + */ +@interface GMUGeometryRenderer : NSObject + +/** + * Initializes a new renderer. + * + * @param map the Google Map layer to render the geometries onto. + * @param geometries the geometries to be rendered. + */ +- (instancetype)initWithMap:(GMSMapView *)map + geometries:(NSArray> *)geometries; +/** + * Initializes a new renderer. + * + * @param map the Google Map layer to render the geometries onto. + * @param geometries the geometries to be rendered. + * @param styles the styles to be applied to the geometries. + */ +- (instancetype)initWithMap:(GMSMapView *)map + geometries:(NSArray> *)geometries + styles:(NSArray *_Nullable)styles; +/** + * Initializes a new renderer. + * + * @param map the Google Map layer to render the geometries onto. + * @param geometries the geometries to be rendered. + * @param styles the styles to be applied to the geometries. + * @param styleMaps the styleMaps to be applied to the geometries + */ +- (instancetype)initWithMap:(GMSMapView *)map + geometries:(NSArray> *)geometries + styles:(NSArray * _Nullable)styles + styleMaps:(NSArray *_Nullable)styleMaps; +/** + * Renders the geometries onto the Google Map. + */ +- (void)render; + +/** + * Removes the rendered geometries from the Google Map. Markup that was not added by the renderer is + * preserved. + */ +- (void)clear; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/Google-Maps-iOS-Utils/src/Geometry/GMUGeometryRenderer.m b/Pods/Google-Maps-iOS-Utils/src/Geometry/GMUGeometryRenderer.m new file mode 100644 index 0000000..28af6b1 --- /dev/null +++ b/Pods/Google-Maps-iOS-Utils/src/Geometry/GMUGeometryRenderer.m @@ -0,0 +1,327 @@ +/* Copyright (c) 2016 Google 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. + */ + +#import "GMUGeometryRenderer.h" + +#import "GMUFeature.h" +#import "GMUGeometryCollection.h" +#import "GMUGroundOverlay.h" +#import "GMULineString.h" +#import "GMUPlacemark.h" +#import "GMUPoint.h" +#import "GMUPolygon.h" +#import "GMUStyle.h" + +static NSString *const kStyleMapDefaultState = @"normal"; + +@implementation GMUGeometryRenderer { + NSMutableArray *_mapOverlays; + + /** + * The Google Map to render the placemarks onto. + */ + __weak GMSMapView *_map; + + /** + * The list of parsed geometries to render onto the map. + */ + NSArray> *_geometryContainers; + + /** + * The list of parsed styles to be applied to the placemarks. + */ + NSDictionary *_styles; + + /** + * The list of parsed style maps to be applied to the placemarks. + */ + NSDictionary *_styleMaps; + + /** + * The dispatch queue used to download images for ground overlays and point icons. + */ + dispatch_queue_t _queue; + + /** + * Whether the map has been marked as cleared. + */ + BOOL _isMapCleared; +} + +- (instancetype)initWithMap:(GMSMapView *)map + geometries:(NSArray> *)geometries { + return [self initWithMap:map geometries:geometries styles:nil]; +} + +- (instancetype)initWithMap:(GMSMapView *)map + geometries:(NSArray> *)geometries + styles:(NSArray *)styles { + return [self initWithMap:map geometries:geometries styles:styles styleMaps:nil]; +} + +- (instancetype)initWithMap:(GMSMapView *)map + geometries:(NSArray> *)geometries + styles:(NSArray *)styles + styleMaps:(NSArray *)styleMaps { + if (self = [super init]) { + _map = map; + _geometryContainers = geometries; + _styles = [[self class] stylesDictionaryFromArray:styles]; + _styleMaps = [[self class] styleMapsDictionaryFromArray: styleMaps]; + _mapOverlays = [[NSMutableArray alloc] init]; + _queue = dispatch_queue_create("com.google.gmsutils", DISPATCH_QUEUE_CONCURRENT); + } + return self; +} + +- (void)render { + _isMapCleared = NO; + [self renderGeometryContainers:_geometryContainers]; +} + +- (void)clear { + _isMapCleared = YES; + for (GMSOverlay *overlay in _mapOverlays) { + overlay.map = nil; + } + [_mapOverlays removeAllObjects]; +} + +- (NSArray *)mapOverlays { + return _mapOverlays; +} + ++ (NSDictionary *)stylesDictionaryFromArray:(NSArray *)styles { + NSMutableDictionary *dict = [[NSMutableDictionary alloc] initWithCapacity:styles.count]; + for (GMUStyle *style in styles) { + [dict setObject:style forKey:style.styleID]; + } + return dict; +} + ++ (NSDictionary *)styleMapsDictionaryFromArray:(NSArray *)styleMaps { + NSMutableDictionary *dict = [[NSMutableDictionary alloc] initWithCapacity:styleMaps.count]; + for (GMUStyleMap *styleMap in styleMaps) { + [dict setObject:styleMap forKey:styleMap.styleMapId]; + } + return dict; +} + ++ (UIImage *)imageFromPath:(NSString *)path { + // URLWithString returns nil for a path formatted as a local file reference. + NSURL *url = [NSURL URLWithString:path]; + + NSData *data; + if (url) { + // Get the image data from an external file. + data = [NSData dataWithContentsOfURL:url]; + } else { + // Get the image data from a local file. + data = [NSData dataWithContentsOfFile:path]; + } + return [UIImage imageWithData:data]; +} + +- (GMUStyle *)getStyleFromStyleMaps:(NSString *)styleUrl { + GMUStyleMap *styleMap = [_styleMaps objectForKey:styleUrl]; + if (styleMap) { + for (GMUPair *pair in styleMap.pairs) { + if ([pair.key isEqual:kStyleMapDefaultState]) { + return [_styles objectForKey:pair.styleUrl]; + } + } + } + return nil; +} + +- (void)renderGeometryContainers:(NSArray> *)containers { + for (id container in containers) { + GMUStyle *style = container.style; + if (!style && [container isKindOfClass:[GMUPlacemark class]]) { + GMUPlacemark *placemark = container; + style = [_styles objectForKey:placemark.styleUrl]; + // If not found, look it up in one of the StyleMaps + style = style ?: [self getStyleFromStyleMaps:placemark.styleUrl]; + } + [self renderGeometryContainer:container style:style]; + } +} + +- (void)renderGeometryContainer:(id)container style:(GMUStyle *)style { + id geometry = container.geometry; + if ([geometry isKindOfClass:[GMUGeometryCollection class]]) { + [self renderMultiGeometry:geometry container:container style:style]; + } else { + [self renderGeometry:geometry container:container style:style]; + } +} + +- (void)renderGeometry:(id)geometry + container:(id)container + style:(GMUStyle *)style { + if ([geometry isKindOfClass:[GMUPoint class]]) { + [self renderPoint:geometry container:container style:style]; + } else if ([geometry isKindOfClass:[GMULineString class]]) { + [self renderLineString:geometry container:container style:style]; + } else if ([geometry isKindOfClass:[GMUPolygon class]]) { + [self renderPolygon:geometry container:container style:style]; + } else if ([geometry isKindOfClass:[GMUGroundOverlay class]]) { + [self renderGroundOverlay:geometry placemark:container style:style]; + } +} + +- (void)renderPoint:(GMUPoint *)point + container:(id)container + style:(GMUStyle *)style { + CLLocationCoordinate2D coordinate = point.coordinate; + GMSMarker *marker = [GMSMarker markerWithPosition:coordinate]; + if ([container isKindOfClass:[GMUPlacemark class]]) { + GMUPlacemark *placemark = container; + marker.title = style.title ?: placemark.title; + marker.snippet = placemark.snippet; + } else { + marker.title = style.title; + } + if (style.anchor.x && style.anchor.y) { + marker.groundAnchor = style.anchor; + } + if (style.heading) { + marker.rotation = style.heading; + } + if (style.iconUrl) { + __weak GMSMarker *weakMarker = marker; + __weak GMSMapView *weakMap = _map; + dispatch_async(_queue, ^{ + UIImage *image = [[self class] imageFromPath:style.iconUrl]; + image = [UIImage imageWithCGImage:image.CGImage + scale:(image.scale * style.scale) + orientation:image.imageOrientation]; + dispatch_async(dispatch_get_main_queue(), ^{ + GMSMarker *strongMarker = weakMarker; + GMSMapView *strongMap = weakMap; + strongMarker.icon = image; + if (!self->_isMapCleared) { + strongMarker.map = strongMap; + } + }); + }); + } else { + marker.map = _map; + } + [_mapOverlays addObject:marker]; +} + +- (void)renderLineString:(GMULineString *)lineString + container:(id)container + style:(GMUStyle *)style { + GMSPolyline *line = [GMSPolyline polylineWithPath:lineString.path]; + if (style.width) { + line.strokeWidth = style.width; + } + if (style.strokeColor) { + line.strokeColor = style.strokeColor; + } + if ([container isKindOfClass:[GMUPlacemark class]]) { + GMUPlacemark *placemark = container; + line.title = placemark.title; + } + line.map = _map; + [_mapOverlays addObject:line]; +} + +- (void)renderPolygon:(GMUPolygon *)polygon + container:(id)container + style:(GMUStyle *)style { + GMSPath *outerBoundaries = polygon.paths.firstObject; + NSArray *innerBoundaries = [[NSArray alloc] init]; + if (polygon.paths.count > 1) { + innerBoundaries = [polygon.paths subarrayWithRange:NSMakeRange(1, polygon.paths.count - 1)]; + } + NSMutableArray *holes = [[NSMutableArray alloc] init]; + for (GMSPath *hole in innerBoundaries) { + [holes addObject:hole]; + } + GMSPolygon *poly = [GMSPolygon polygonWithPath:outerBoundaries]; + if (style.hasFill && style.fillColor) { + poly.fillColor = style.fillColor; + } + if (style.hasStroke) { + if (style.strokeColor) { + poly.strokeColor = style.strokeColor; + } + if (style.width) { + poly.strokeWidth = style.width; + } + } + if (holes.count) { + poly.holes = holes; + } + if ([container isKindOfClass:[GMUPlacemark class]]) { + GMUPlacemark *placemark = container; + poly.title = placemark.title; + } + poly.map = _map; + [_mapOverlays addObject:poly]; +} + +- (void)renderGroundOverlay:(GMUGroundOverlay *)overlay + placemark:(GMUPlacemark *)placemark + style:(GMUStyle *)style { + CLLocationCoordinate2D northEast = overlay.northEast; + CLLocationCoordinate2D southWest = overlay.southWest; + CLLocationDegrees centerLatitude = (northEast.latitude + southWest.latitude) / 2.0; + CLLocationDegrees centerLongitude = (northEast.longitude + southWest.longitude) / 2.0; + if (northEast.longitude < southWest.longitude) { + if (centerLongitude >= 0) { + centerLongitude -= 180; + } else { + centerLongitude += 180; + } + } + CLLocationCoordinate2D center = CLLocationCoordinate2DMake(centerLatitude, centerLongitude); + GMSCoordinateBounds *northEastBounds = [[GMSCoordinateBounds alloc] initWithCoordinate:northEast + coordinate:center]; + GMSCoordinateBounds *southWestBounds = [[GMSCoordinateBounds alloc] initWithCoordinate:southWest + coordinate:center]; + GMSCoordinateBounds *bounds = [northEastBounds includingBounds:southWestBounds]; + GMSGroundOverlay *groundOverlay = [GMSGroundOverlay groundOverlayWithBounds:bounds icon:nil]; + groundOverlay.zIndex = overlay.zIndex; + groundOverlay.bearing = overlay.rotation; + __weak GMSGroundOverlay *weakGroundOverlay = groundOverlay; + __weak GMSMapView *weakMap = _map; + dispatch_async(_queue, ^{ + UIImage *image = [[self class] imageFromPath:overlay.href]; + dispatch_async(dispatch_get_main_queue(), ^{ + GMSGroundOverlay *strongGroundOverlay = weakGroundOverlay; + GMSMapView *strongMap = weakMap; + strongGroundOverlay.icon = image; + if (!self->_isMapCleared) { + strongGroundOverlay.map = strongMap; + } + }); + }); + [_mapOverlays addObject:groundOverlay]; +} + +- (void)renderMultiGeometry:(id)geometry + container:(id)container + style:(GMUStyle *)style { + GMUGeometryCollection *multiGeometry = geometry; + for (id singleGeometry in multiGeometry.geometries) { + [self renderGeometry:singleGeometry container:container style:style]; + } +} + +@end diff --git a/Pods/Google-Maps-iOS-Utils/src/Geometry/GMUKMLParser.h b/Pods/Google-Maps-iOS-Utils/src/Geometry/GMUKMLParser.h new file mode 100644 index 0000000..f5e12c9 --- /dev/null +++ b/Pods/Google-Maps-iOS-Utils/src/Geometry/GMUKMLParser.h @@ -0,0 +1,75 @@ +/* Copyright (c) 2016 Google 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. + */ + +#import +#import + +#import + +#import "GMUStyleMap.h" + +NS_ASSUME_NONNULL_BEGIN + +@class GMUStyle; +@protocol GMUGeometryContainer; + +/** + * Instances of this class parse KML documents in an event-driven manner. The + * parsed placemarks and styles are stored in NSArray objects which can then be + * passed to a GMUGeometryRenderer to display on a Google Map. + */ +@interface GMUKMLParser : NSObject + +/** + * The placemarks parsed from the KML file. + */ +@property(nonatomic, readonly) NSArray> *placemarks; + +/** + * The styles parsed from the KML file. + */ +@property(nonatomic, readonly) NSArray *styles; + +@property(nonatomic, readonly) NSArray *styleMaps; + +/** + * Parses the stored KML document. + */ +- (void)parse; + +/** + * Initializes a KMLParser with a KML file contained in a URL. + * + * @param url The url containing the KML file. + */ +- (instancetype)initWithURL:(NSURL *)url; + +/** + * Initializes a KMLParser with a KML file contained in a data file. + * + * @param data The data file containing the contents of a KML file. + */ +- (instancetype)initWithData:(NSData *)data; + +/** + * Initializes a KMLParser with a KML file contained in an input stream. + * + * @param stream The stream to use to access the KML file. + */ +- (instancetype)initWithStream:(NSInputStream *)stream; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/Google-Maps-iOS-Utils/src/Geometry/GMUKMLParser.m b/Pods/Google-Maps-iOS-Utils/src/Geometry/GMUKMLParser.m new file mode 100644 index 0000000..0201802 --- /dev/null +++ b/Pods/Google-Maps-iOS-Utils/src/Geometry/GMUKMLParser.m @@ -0,0 +1,721 @@ +/* Copyright (c) 2016 Google 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. + */ + +#import "GMUKMLParser.h" + +#import "GMUGeometry.h" +#import "GMUGeometryCollection.h" +#import "GMUGroundOverlay.h" +#import "GMULineString.h" +#import "GMUPlacemark.h" +#import "GMUPoint.h" +#import "GMUPolygon.h" +#import "GMUStyle.h" +#import "GMUPair.h" +#import "GMUStyleMap.h" + +static NSString *const kGMUPlacemarkElementName = @"Placemark"; +static NSString *const kGMUGroundOverlayElementName = @"GroundOverlay"; +static NSString *const kGMUStyleElementName = @"Style"; +static NSString *const kGMUStyleMapElementName = @"StyleMap"; +static NSString *const kGMULineStyleElementName = @"LineStyle"; +static NSString *const kGMUPointElementName = @"Point"; +static NSString *const kGMULineStringElementName = @"LineString"; +static NSString *const kGMUPolygonElementName = @"Polygon"; +static NSString *const kGMUMultiGeometryElementName = @"MultiGeometry"; +static NSString *const kGMUInnerBoundariesAttributeName = @"innerBoundaries"; +static NSString *const kGMUOuterBoundariesAttributeName = @"outerBoundaries"; +static NSString *const kGMUHotspotElementName = @"hotSpot"; +static NSString *const kGMUCoordinatesElementName = @"coordinates"; +static NSString *const kGMURandomAttributeValue = @"random"; +static NSString *const kGMUFractionAttributeValue = @"fraction"; +static NSString *const kGMUNameElementName = @"name"; +static NSString *const kGMUDescriptionElementName = @"description"; +static NSString *const kGMURotationElementName = @"rotation"; +static NSString *const kGMUStyleUrlElementName = @"styleUrl"; +static NSString *const kGMUDrawOrderElementName = @"drawOrder"; +static NSString *const kGMUNorthElementName = @"north"; +static NSString *const kGMUEastElementName = @"east"; +static NSString *const kGMUSouthElementName = @"south"; +static NSString *const kGMUWestElementName = @"west"; +static NSString *const kGMUZIndexElementName = @"ZIndex"; +static NSString *const kGMUHrefElementName = @"href"; +static NSString *const kGMUTextElementName = @"text"; +static NSString *const kGMUScaleElementName = @"scale"; +static NSString *const kGMUXAttributeName = @"x"; +static NSString *const kGMUYAttributeName = @"y"; +static NSString *const kGMUXUnitsElementName = @"xunits"; +static NSString *const kGMUYUnitsElementName = @"yunits"; +static NSString *const kGMUIdAttributeName = @"id"; +static NSString *const kGMUOuterBoundaryIsElementName = @"outerBoundaryIs"; +static NSString *const kGMUHeadingElementName = @"heading"; +static NSString *const kGMUFillElementName = @"fill"; +static NSString *const kGMUOutlineElementName = @"outline"; +static NSString *const kGMUWidthElementName = @"width"; +static NSString *const kGMUColorElementName = @"color"; +static NSString *const kGMUColorModeElementName = @"colorMode"; +static NSString *const kGMUPairElementName = @"Pair"; +static NSString *const kGMUKeyAttributeValue = @"key"; +static NSString *const kGMUPairAttributeRegex = @"^(key|styleUrl)$"; +static NSString *const kGMUGeometryRegex = @"^(Point|LineString|Polygon|MultiGeometry)$"; +static NSString *const kGMUGeometryAttributeRegex = + @"^(coordinates|name|description|rotation|drawOrder|href|styleUrl)$"; +static NSString *const kGMUCompassRegex = @"^(north|east|south|west)$"; +static NSString *const kGMUBoundaryRegex = @"^(outerBoundaryIs|innerBoundaryIs)$"; +static NSString *const kGMUStyleRegex = @"^(Style|StyleMap|LineStyle|Pair)$"; +static NSString *const kGMUStyleAttributeRegex = + @"^(text|scale|heading|fill|outline|width|color|colorMode)$"; +static NSString *const kGMUStyleUrlRegex = @"#.+"; + +/** + * Stores the current state of the parser with regards to the type of KML node that is being + * processed. + */ +typedef NS_OPTIONS(NSUInteger, GMUParserState) { + kGMUParserStatePlacemark = 1 << 0, + kGMUParserStateOuterBoundary = 1 << 1, + kGMUParserStateMultiGeometry = 1 << 2, + kGMUParserStateStyle = 1 << 3, + kGMUParserStateStyleMap = 1 << 4, + kGMUParserStateLineStyle = 1 << 5, + kGMUParserStatePair = 1 << 6, + kGMUParserStateLeafNode = 1 << 7, +}; + +@interface GMUKMLParser () + +@end + +@implementation GMUKMLParser { + /** + * The XML parser used to read the specified document. + */ + NSXMLParser *_parser; + + /** + * The format that a geometry element may take. + */ + NSRegularExpression *_geometryRegex; + + /** + * The format that a compass coordinate element may take. + */ + NSRegularExpression *_compassRegex; + + /** + * The format that a boundary element may take. + */ + NSRegularExpression *_boundaryRegex; + + /** + * The format that a style element may take. + */ + NSRegularExpression *_styleRegex; + + /** + * The format that a style attribute element may take. + */ + NSRegularExpression *_styleAttributeRegex; + + /** + * The format that a style url element may take. + */ + NSRegularExpression *_styleUrlRegex; + + /** + * The format that a geometry attribute element may take. + */ + NSRegularExpression *_geometryAttributeRegex; + + /** + * The format that a pair in a style map may take + */ + NSRegularExpression *_pairAttributeRegex; + + /** + * The list of placemarks that have been parsed. + */ + NSMutableArray *_placemarks; + + /** + * The list of styles that have been parsed. + */ + NSMutableArray *_styles; + + /** + * The list of styles maps that have been parsed. + */ + NSMutableArray *_styleMaps; + + /** + * The list of pairs that currently parsed style map contains + */ + NSMutableArray *_pairs; + + /** + * The characters contained within the element being parsed. + */ + NSMutableString *_characters; + + /** + * The properties to be propagated into the KMLPlacemark object being parsed. + */ + id _geometry; + NSMutableArray> *_geometries; + NSString *_title; + NSString *_snippet; + GMUStyle *_inlineStyle; + NSString *_styleUrl; + + /** + * The properties to be propagated into the KMLStyle object being parsed. + */ + NSString *_styleID; + UIColor *_strokeColor; + UIColor *_fillColor; + CGFloat _width; + CGFloat _scale; + CGFloat _heading; + CGPoint _anchor; + NSString *_strokeColorMode; + NSString *_fillColorMode; + NSString *_iconUrl; + NSString *_styleTitle; + BOOL _hasFill; + BOOL _hasStroke; + + /** + * The properties to be propagated into the KMLElement object being parsed. + */ + NSMutableDictionary *_attributes; + NSString *_geometryType; + + /** + * The properties to be propagated into the KMLPair object being parsed. + */ + NSString *_key; + + /** + * The current state of the parser. + */ + GMUParserState _parserState; +} + +- (instancetype)initWithParser:(NSXMLParser *)parser { + if (self = [super init]) { + _parser = parser; + _placemarks = [[NSMutableArray alloc] init]; + _styles = [[NSMutableArray alloc] init]; + _styleMaps = [[NSMutableArray alloc] init]; + _pairs = [[NSMutableArray alloc] init]; + _geometries = [[NSMutableArray alloc] init]; + _attributes = [[NSMutableDictionary alloc] init]; + + _geometryRegex = [NSRegularExpression regularExpressionWithPattern:kGMUGeometryRegex + options:0 + error:nil]; + _compassRegex = [NSRegularExpression regularExpressionWithPattern:kGMUCompassRegex + options:0 + error:nil]; + _boundaryRegex = [NSRegularExpression regularExpressionWithPattern:kGMUBoundaryRegex + options:0 + error:nil]; + _styleRegex = [NSRegularExpression regularExpressionWithPattern:kGMUStyleRegex + options:0 + error:nil]; + _styleAttributeRegex = [NSRegularExpression regularExpressionWithPattern:kGMUStyleAttributeRegex + options:0 + error:nil]; + _geometryAttributeRegex = + [NSRegularExpression regularExpressionWithPattern:kGMUGeometryAttributeRegex + options:0 + error:nil]; + _styleUrlRegex = [NSRegularExpression regularExpressionWithPattern:kGMUStyleUrlRegex + options:0 + error:nil]; + + _pairAttributeRegex = [NSRegularExpression regularExpressionWithPattern:kGMUPairAttributeRegex + options:0 + error:nil]; + _hasFill = YES; + _hasStroke = YES; + [_parser setDelegate:self]; + } + return self; +} + +- (instancetype)initWithURL:(NSURL *)url { + return [self initWithParser:[[NSXMLParser alloc] initWithContentsOfURL:url]]; +} + +- (instancetype)initWithData:(NSData *)data { + return [self initWithParser:[[NSXMLParser alloc] initWithData:data]]; +} + +- (instancetype)initWithStream:(NSInputStream *)stream { + return [self initWithParser:[[NSXMLParser alloc] initWithStream:stream]]; +} + +- (NSArray *)placemarks { + return _placemarks; +} + +- (NSArray *)styles { + return _styles; +} + +- (NSArray *)styleMaps { + return _styleMaps; +} + +- (void)parse { + [_parser parse]; +} + +- (BOOL)isParsing:(GMUParserState)state { + return state & _parserState; +} + +- (CLLocation *)locationFromString:(NSString *)string { + NSString *trimmedString = + [string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; + NSArray *coordinateStrings = [trimmedString componentsSeparatedByString:@","]; + CLLocationDegrees longitude = [coordinateStrings[0] doubleValue]; + CLLocationDegrees latitude = [coordinateStrings[1] doubleValue]; + + return [[CLLocation alloc] initWithLatitude:latitude longitude:longitude]; +} + +- (GMSPath *)pathFromString:(NSString *)string { + NSCharacterSet *characterSet = [NSCharacterSet whitespaceAndNewlineCharacterSet]; + NSString *coordinateStrings = + [string stringByReplacingOccurrencesOfString:@"\\s+" + withString:@" " + options:NSRegularExpressionSearch + range:NSMakeRange(0, string.length)]; + NSString *trimmed = [coordinateStrings stringByTrimmingCharactersInSet:characterSet]; + NSArray *coordinateArray = [trimmed componentsSeparatedByCharactersInSet:characterSet]; + GMSMutablePath *path = [[GMSMutablePath alloc] init]; + for (NSString *str in coordinateArray) { + [path addCoordinate:[self locationFromString:str].coordinate]; + } + return path; +} + +- (UIColor *)colorFromString:(NSString *)string { + unsigned long long color; + NSScanner *scanner = [NSScanner scannerWithString:string]; + [scanner scanHexLongLong:&color]; + CGFloat alpha = ((CGFloat)((color >> 24) & 0xff)) / 255; + CGFloat blue = ((CGFloat)((color >> 16) & 0xff)) / 255; + CGFloat green = ((CGFloat)((color >> 8) & 0xff)) / 255; + CGFloat red = ((CGFloat)(color & 0xff)) / 255; + return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; +} + +/** + * Generates a random color by applying a random linear scale to each color component, ranging from + * 0x00 to the maximum values specified for each component. The alpha component of the input color + * is never randomized. + * + * @param color The color range to generate random values between. + * @return The randomly generated color. + */ +- (UIColor *)randomColorFromColor:(UIColor *)color { + CGFloat red, green, blue, alpha; + [color getRed:&red green:&green blue:&blue alpha:&alpha]; + red = ((CGFloat)arc4random_uniform((int)(red * 255))) / 255.0; + green = ((CGFloat)arc4random_uniform((int)(green * 255))) / 255.0; + blue = ((CGFloat)arc4random_uniform((int)(blue * 255))) / 255.0; + return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; +} + +- (void)parseBeginLeafNode { + _parserState |= kGMUParserStateLeafNode; +} + +- (void)parseBeginHotspotWithAttributes:(NSDictionary *)attributeDict { + double x = 0.0; + double y = 0.0; + BOOL isValidHotspot = YES; + if ([[attributeDict objectForKey:kGMUXUnitsElementName] isEqual:kGMUFractionAttributeValue]) { + x = [[attributeDict objectForKey:kGMUXAttributeName] doubleValue]; + } else { + isValidHotspot = NO; + } + if ([[attributeDict objectForKey:kGMUYUnitsElementName] isEqual:kGMUFractionAttributeValue]) { + y = [[attributeDict objectForKey:kGMUYAttributeName] doubleValue]; + } else { + isValidHotspot = NO; + } + _anchor = isValidHotspot ? CGPointMake(x, y) : CGPointMake(0.5f, 1.0f); +} + +- (void)parseBeginBoundaryWithElementName:(NSString *)elementName { + if ([elementName isEqual:kGMUOuterBoundaryIsElementName]) { + _parserState |= kGMUParserStateOuterBoundary; + } else { + _parserState &= ~kGMUParserStateOuterBoundary; + } +} + +- (void)parseBeginStyleWithElementName:(NSString *)elementName styleID:(NSString *)styleID { + if ([elementName isEqual:kGMUStyleElementName]) { + _styleID = [NSString stringWithFormat:@"#%@", styleID]; + _parserState |= kGMUParserStateStyle; + } else if ([elementName isEqual:kGMUStyleMapElementName]) { + _styleID = [NSString stringWithFormat:@"#%@", styleID]; + _parserState |= kGMUParserStateStyleMap; + } else if ([elementName isEqual:kGMULineStyleElementName]) { + _parserState |= kGMUParserStateLineStyle; + } else if ([elementName isEqual:kGMUPairElementName]) { + _parserState |= kGMUParserStatePair; + } +} + +- (void)parseEndStyle { + if ([self isParsing:kGMUParserStateLineStyle]) { + _parserState &= ~kGMUParserStateLineStyle; + } else if ([self isParsing:kGMUParserStatePair]) { + _parserState &= ~kGMUParserStatePair; + [self parseEndPair]; + } else if([self isParsing:kGMUParserStateStyleMap]) { + _parserState &= ~kGMUParserStateStyleMap; + + GMUStyleMap *styleMap = [[GMUStyleMap alloc] initWithId:_styleID + pairs: [_pairs copy]]; + + [_styleMaps addObject:styleMap]; + [_pairs removeAllObjects]; + } else { + _parserState &= ~kGMUParserStateStyle; + if ([_fillColorMode isEqual:kGMURandomAttributeValue]) { + _fillColor = [self randomColorFromColor:_fillColor]; + } + if ([_strokeColorMode isEqual:kGMURandomAttributeValue]) { + _strokeColor = [self randomColorFromColor:_strokeColor]; + } + GMUStyle *style = [[GMUStyle alloc] initWithStyleID:_styleID + strokeColor:_strokeColor + fillColor:_fillColor + width:_width + scale:_scale + heading:_heading + anchor:_anchor + iconUrl:_iconUrl + title:_styleTitle + hasFill:_hasFill + hasStroke:_hasStroke]; + _styleID = nil; + _strokeColor = nil; + _fillColor = nil; + _width = 0; + _scale = 0; + _heading = 0; + _anchor = CGPointZero; + _iconUrl = nil; + _styleTitle = nil; + _hasFill = YES; + _hasStroke = YES; + + // A style embedded in a Placemark is guaranteed to be an inline style. + if ([self isParsing:kGMUParserStatePlacemark]) { + _inlineStyle = style; + } else { + [_styles addObject:style]; + } + } +} + +- (void)parseEndStyleAttribute:(NSString *)attribute { + if ([attribute isEqual:kGMUTextElementName]) { + _styleTitle = [_characters copy]; + } else if ([attribute isEqual:kGMUScaleElementName]) { + _scale = [_characters floatValue]; + } else if ([attribute isEqual:kGMUHeadingElementName]) { + _heading = [_characters floatValue]; + } else if ([attribute isEqual:kGMUFillElementName]) { + _hasFill = [_characters boolValue]; + } else if ([attribute isEqual:kGMUOutlineElementName]) { + _hasStroke = [_characters boolValue]; + } else if ([attribute isEqual:kGMUWidthElementName]) { + _width = [_characters floatValue]; + } else if ([attribute isEqual:kGMUColorElementName]) { + if ([self isParsing:kGMUParserStateLineStyle]) { + _strokeColor = [self colorFromString:_characters]; + } else { + _fillColor = [self colorFromString:_characters]; + } + } else if ([attribute isEqual:kGMUColorModeElementName]) { + if ([self isParsing:kGMUParserStateLineStyle]) { + _strokeColorMode = [_characters copy]; + } else { + _fillColorMode = [_characters copy]; + } + } +} + +- (void)parseBeginPlacemark { + _parserState |= kGMUParserStatePlacemark; +} + +- (void)parseEndPlacemark { + _parserState &= ~kGMUParserStatePlacemark; + [_placemarks addObject:[[GMUPlacemark alloc] initWithGeometry:_geometry + title:_title + snippet:_snippet + style:_inlineStyle + styleUrl:_styleUrl]]; + _geometryType = nil; + _attributes = [[NSMutableDictionary alloc] init]; + _geometry = nil; + _geometries = [[NSMutableArray alloc] init]; + _title = nil; + _snippet = nil; + _inlineStyle = nil; + _styleUrl = nil; +} + +- (void)parseEndGroundOverlay { + CLLocationCoordinate2D northEast = + CLLocationCoordinate2DMake([[_attributes objectForKey:kGMUNorthElementName] doubleValue], + [[_attributes objectForKey:kGMUEastElementName] doubleValue]); + CLLocationCoordinate2D southWest = + CLLocationCoordinate2DMake([[_attributes objectForKey:kGMUSouthElementName] doubleValue], + [[_attributes objectForKey:kGMUWestElementName] doubleValue]); + int zIndex = [[_attributes objectForKey:kGMUZIndexElementName] intValue]; + double rotation = [[_attributes objectForKey:kGMURotationElementName] doubleValue]; + NSString *href = [_attributes objectForKey:kGMUHrefElementName]; + _geometry = [[GMUGroundOverlay alloc] initWithCoordinate:northEast + southWest:southWest + zIndex:zIndex + rotation:rotation + href:href]; + [self parseEndPlacemark]; +} + +- (void)parseBeginGeometryWithElementName:(NSString *)elementName { + if ([elementName isEqual:kGMUMultiGeometryElementName]) { + _parserState |= kGMUParserStateMultiGeometry; + } else { + _geometryType = elementName; + } +} + +- (void)parseEndGeometryWithElementName:(NSString *)elementName { + if ([elementName isEqual:kGMUMultiGeometryElementName]) { + _parserState &= ~kGMUParserStateMultiGeometry; + _geometry = [[GMUGeometryCollection alloc] initWithGeometries:_geometries]; + } else { + if ([elementName isEqual:kGMUPointElementName]) { + CLLocation *coordinate = [_attributes objectForKey:kGMUCoordinatesElementName]; + _geometry = [[GMUPoint alloc] initWithCoordinate:coordinate.coordinate]; + } else if ([elementName isEqual:kGMULineStringElementName]) { + GMSPath *path = [_attributes objectForKey:kGMUCoordinatesElementName]; + _geometry = [[GMULineString alloc] initWithPath:path]; + } else if ([elementName isEqual:kGMUPolygonElementName]) { + GMSPath *outerBoundaries = [_attributes objectForKey:kGMUOuterBoundariesAttributeName]; + NSMutableArray *paths = [NSMutableArray arrayWithObject:outerBoundaries]; + NSArray *holes = [_attributes objectForKey:kGMUInnerBoundariesAttributeName]; + for (GMSPath *hole in holes) { + [paths addObject:hole]; + } + _geometry = [[GMUPolygon alloc] initWithPaths:paths]; + } + if ([self isParsing:kGMUParserStateMultiGeometry]) { + [_geometries addObject:_geometry]; + _geometry = nil; + _attributes = [[NSMutableDictionary alloc] init]; + } + } +} + +- (void)parseEndGeometryAttribute:(NSString *)attribute { + if ([attribute isEqual:kGMUCoordinatesElementName]) { + [self parseEndCoordinates]; + } else if ([attribute isEqual:kGMUNameElementName]) { + _title = [_characters copy]; + } else if ([attribute isEqual:kGMUDescriptionElementName]) { + _snippet = [_characters copy]; + } else if ([attribute isEqual:kGMURotationElementName]) { + [self parseEndRotation]; + } else if ([attribute isEqual:kGMUDrawOrderElementName]) { + [_attributes setObject:@([_characters intValue]) forKey:kGMUZIndexElementName]; + } else if ([attribute isEqual:kGMUHrefElementName]) { + if ([self isParsing:kGMUParserStateStyle]) { + _iconUrl = [_characters copy]; + } else { + [_attributes setObject:[_characters copy] forKey:attribute]; + } + } else if ([attribute isEqual:kGMUStyleUrlElementName]) { + if ([_styleUrlRegex firstMatchInString:_characters + options:0 + range:NSMakeRange(0, [_characters length])]) { + _styleUrl = [_characters copy]; + } + } +} + +- (void)parseEndCompassAttribute:(NSString *)attribute { + NSNumber *value = [[NSNumber alloc] initWithDouble:[_characters doubleValue]]; + [_attributes setObject:value forKey:attribute]; +} + +- (void)parseEndRotation { + double rotation = [_characters doubleValue]; + + // Handle invalid rotation inputs. + if (rotation > 180 || rotation < -180) { + rotation = 0; + } + + // Maps from [-180, 180] where the value is an angle in degrees counterclockwise starting from + // north to [0, 360] clockwise starting from north. + if (rotation <= 0) { + rotation = -rotation; + } else { + rotation = 360 - rotation; + } + [_attributes setObject:@(rotation) forKey:kGMURotationElementName]; +} + +- (void)parseEndCoordinates { + if ([_geometryType isEqual:kGMUPointElementName]) { + CLLocation *location = [self locationFromString:_characters]; + [_attributes setObject:location forKey:kGMUCoordinatesElementName]; + } else if ([_geometryType isEqual:kGMULineStringElementName]) { + GMSPath *path = [self pathFromString:_characters]; + [_attributes setObject:path forKey:kGMUCoordinatesElementName]; + } else if ([_geometryType isEqual:kGMUPolygonElementName]) { + GMSPath *boundary = [self pathFromString:_characters]; + if ([self isParsing:kGMUParserStateOuterBoundary]) { + [_attributes setObject:boundary forKey:kGMUOuterBoundariesAttributeName]; + } else { + NSMutableArray *innerBoundaries = [NSMutableArray + arrayWithArray:[_attributes objectForKey:kGMUInnerBoundariesAttributeName]]; + [innerBoundaries addObject:boundary]; + [_attributes setObject:innerBoundaries forKey:kGMUInnerBoundariesAttributeName]; + } + } +} + +- (void)parseEndPairAttribute:(NSString *)attribute { + if ([attribute isEqual:kGMUKeyAttributeValue]) { + _key = [_characters copy]; + } else if ([attribute isEqual:kGMUStyleUrlElementName]) { + _styleUrl = [_characters copy]; + } +} + +- (void)parseEndPair { + GMUPair *pair = [[GMUPair alloc] initWithKey:_key + styleUrl:_styleUrl]; + _key = nil; + _styleUrl = nil; + + [_pairs addObject:pair]; +} + +#pragma mark - NSXMLParserDelegate + +- (void)parser:(NSXMLParser *)parser + didStartElement:(nonnull NSString *)elementName + namespaceURI:(nullable NSString *)namespaceURI + qualifiedName:(nullable NSString *)qualifiedName + attributes:(nonnull NSDictionary *)attributeDict { + _characters = nil; + if ([_styleRegex firstMatchInString:elementName + options:0 + range:NSMakeRange(0, elementName.length)]) { + [self parseBeginStyleWithElementName:elementName + styleID:[attributeDict objectForKey:kGMUIdAttributeName]]; + } else if ([elementName isEqual:kGMUPlacemarkElementName] || + [elementName isEqual:kGMUGroundOverlayElementName]) { + [self parseBeginPlacemark]; + } else if ([elementName isEqual:kGMUHotspotElementName]) { + [self parseBeginHotspotWithAttributes:attributeDict]; + } else if ([_geometryRegex firstMatchInString:elementName + options:0 + range:NSMakeRange(0, elementName.length)] || + [elementName isEqual:kGMUGroundOverlayElementName]) { + [self parseBeginGeometryWithElementName:elementName]; + } else if ([_boundaryRegex firstMatchInString:elementName + options:0 + range:NSMakeRange(0, elementName.length)]) { + [self parseBeginBoundaryWithElementName:elementName]; + } else if ([_styleAttributeRegex firstMatchInString:elementName + options:0 + range:NSMakeRange(0, elementName.length)] || + [_geometryAttributeRegex firstMatchInString:elementName + options:0 + range:NSMakeRange(0, elementName.length)] || + [_compassRegex firstMatchInString:elementName + options:0 + range:NSMakeRange(0, elementName.length)] || + [_pairAttributeRegex firstMatchInString:elementName + options:0 + range:NSMakeRange(0, elementName.length)]) { + [self parseBeginLeafNode]; + } +} + +- (void)parser:(NSXMLParser *)parser + didEndElement:(nonnull NSString *)elementName + namespaceURI:(nullable NSString *)namespaceURI + qualifiedName:(nullable NSString *)qualifiedName { + if ([_styleRegex firstMatchInString:elementName + options:0 + range:NSMakeRange(0, elementName.length)]) { + [self parseEndStyle]; + } else if ([_styleAttributeRegex firstMatchInString:elementName + options:0 + range:NSMakeRange(0, elementName.length)]) { + [self parseEndStyleAttribute:elementName]; + } else if ([elementName isEqual:kGMUPlacemarkElementName]) { + [self parseEndPlacemark]; + } else if ([_pairAttributeRegex firstMatchInString:elementName + options:0 + range:NSMakeRange(0, elementName.length)]) { + [self parseEndPairAttribute:elementName]; + } else if ([elementName isEqual:kGMUGroundOverlayElementName]) { + [self parseEndGroundOverlay]; + } else if ([_geometryRegex firstMatchInString:elementName + options:0 + range:NSMakeRange(0, elementName.length)]) { + [self parseEndGeometryWithElementName:elementName]; + } else if ([_geometryAttributeRegex firstMatchInString:elementName + options:0 + range:NSMakeRange(0, elementName.length)]) { + [self parseEndGeometryAttribute:elementName]; + } else if ([_compassRegex firstMatchInString:elementName + options:0 + range:NSMakeRange(0, elementName.length)]) { + [self parseEndCompassAttribute:elementName]; + } + _parserState &= ~kGMUParserStateLeafNode; + _characters = nil; +} + +- (void)parser:(NSXMLParser *)parser foundCharacters:(nonnull NSString *)string { + if ([self isParsing:kGMUParserStateLeafNode]) { + if (!_characters) { + _characters = [string mutableCopy]; + } else { + [_characters appendString:string]; + } + } +} + +@end diff --git a/Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUFeature.h b/Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUFeature.h new file mode 100644 index 0000000..0d43c45 --- /dev/null +++ b/Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUFeature.h @@ -0,0 +1,58 @@ +/* Copyright (c) 2016 Google 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. + */ + +#import + +#import + +#import "GMUGeometryContainer.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + * Instances of this class represent a GeoJSON Feature object. + */ +@interface GMUFeature : NSObject + +/** + * The identifier of the feature. + */ +@property(nonatomic, nullable, readonly) NSString *identifier; + +/** + * The properties of the geometry in the feature. + */ +@property(nonatomic, nullable, readonly) NSDictionary *properties; + +/** + * The bounding box of the geometry in the feature. + */ +@property(nonatomic, nullable, readonly) GMSCoordinateBounds *boundingBox; + +/** + * + * @param geometry The geometry object in the feature. + * @param identifier The identifier of the feature. + * @param properties The properties of the geometry in the feature. + * @param boundingBox The bounding box of the geometry in the feature. + */ +- (instancetype)initWithGeometry:(id)geometry + identifier:(NSString * _Nullable)identifier + properties:(NSDictionary * _Nullable)properties + boundingBox:(GMSCoordinateBounds * _Nullable)boundingBox; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUFeature.m b/Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUFeature.m new file mode 100644 index 0000000..ae5b629 --- /dev/null +++ b/Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUFeature.m @@ -0,0 +1,36 @@ +/* Copyright (c) 2016 Google 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. + */ + +#import "GMUFeature.h" + +@implementation GMUFeature + +@synthesize geometry = _geometry; +@synthesize style = _style; + +- (instancetype)initWithGeometry:(id)geometry + identifier:(NSString * _Nullable)identifier + properties:(NSDictionary * _Nullable)properties + boundingBox:(GMSCoordinateBounds * _Nullable)boundingBox { + if (self = [super init]) { + _geometry = geometry; + _identifier = identifier; + _boundingBox = boundingBox; + _properties = properties ?: [[[NSDictionary alloc] init] copy]; + } + return self; +} + +@end diff --git a/Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUGeometry.h b/Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUGeometry.h new file mode 100644 index 0000000..d9b1b74 --- /dev/null +++ b/Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUGeometry.h @@ -0,0 +1,32 @@ +/* Copyright (c) 2016 Google 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. + */ + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** + * Defines a generic geometry object. + */ +@protocol GMUGeometry + +/** + * The type of the geometry. + */ +@property(nonatomic, readonly) NSString *type; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUGeometryCollection.h b/Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUGeometryCollection.h new file mode 100644 index 0000000..9fb3be0 --- /dev/null +++ b/Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUGeometryCollection.h @@ -0,0 +1,41 @@ +/* Copyright (c) 2016 Google 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. + */ + +#import + +#import "GMUGeometry.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + * Instances of this class represent a GeometryCollection object. + */ +@interface GMUGeometryCollection : NSObject + +/** + * The array of geometry objects for the GeometryCollection. + */ +@property(nonatomic, readonly) NSArray> *geometries; + +/** + * Initializes a GMUGeometryCollection object with a set of geometry objects. + * + * @param geometries The array of geometry objects. + */ +- (instancetype)initWithGeometries:(NSArray> *)geometries; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUGeometryCollection.m b/Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUGeometryCollection.m new file mode 100644 index 0000000..e99f63d --- /dev/null +++ b/Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUGeometryCollection.m @@ -0,0 +1,30 @@ +/* Copyright (c) 2016 Google 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. + */ + +#import "GMUGeometryCollection.h" + +@implementation GMUGeometryCollection + +@synthesize type = _type; + +- (instancetype)initWithGeometries:(NSArray> *)geometries { + if (self = [super init]) { + _type = @"GeometryCollection"; + _geometries = geometries; + } + return self; +} + +@end diff --git a/Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUGeometryContainer.h b/Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUGeometryContainer.h new file mode 100644 index 0000000..659fc00 --- /dev/null +++ b/Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUGeometryContainer.h @@ -0,0 +1,40 @@ +/* Copyright (c) 2016 Google 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. + */ + +#import + +#import "GMUGeometry.h" +#import "GMUStyle.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + * Defines a generic geometry container. + */ +@protocol GMUGeometryContainer + +/** + * The geometry object in the container. + */ +@property(nonatomic, readonly) id geometry; + +/** + * Style information that should be applied to the contained geometry object. + */ +@property(nonatomic, nullable) GMUStyle *style; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUGroundOverlay.h b/Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUGroundOverlay.h new file mode 100644 index 0000000..0f4091e --- /dev/null +++ b/Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUGroundOverlay.h @@ -0,0 +1,70 @@ +/* Copyright (c) 2016 Google 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. + */ + +#import +#import + +#import "GMUGeometry.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + * Instances of this class represent a Ground Overlay object. + */ +@interface GMUGroundOverlay : NSObject + +/** + * The North-East corner of the overlay. + */ +@property(nonatomic, readonly) CLLocationCoordinate2D northEast; + +/** + * The South-West corner of the overlay. + */ +@property(nonatomic, readonly) CLLocationCoordinate2D southWest; + +/** + * The Z-Index of the overlay. + */ +@property(nonatomic, readonly) int zIndex; + +/** + * The rotation of the overlay on the map. + */ +@property(nonatomic, readonly) double rotation; + +/** + * The image to be rendered on the overlay. + */ +@property(nonatomic, readonly) NSString *href; + +/** + * Initializes a GMUGroundOverlay object. + * + * @param northEast The North-East corner of the overlay. + * @param southWest The South-West corner of the overlay. + * @param zIndex The Z-Index of the overlay. + * @param rotation The rotation of the overlay. + * @param href The image to be rendered on the overlay. + */ +- (instancetype)initWithCoordinate:(CLLocationCoordinate2D)northEast + southWest:(CLLocationCoordinate2D)southWest + zIndex:(int)zIndex + rotation:(double)rotation + href:(NSString *)href; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUGroundOverlay.m b/Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUGroundOverlay.m new file mode 100644 index 0000000..d17103c --- /dev/null +++ b/Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUGroundOverlay.m @@ -0,0 +1,38 @@ +/* Copyright (c) 2016 Google 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. + */ + +#import "GMUGroundOverlay.h" + +@implementation GMUGroundOverlay + +@synthesize type = _type; + +- (instancetype)initWithCoordinate:(CLLocationCoordinate2D)northEast + southWest:(CLLocationCoordinate2D)southWest + zIndex:(int)zIndex + rotation:(double)rotation + href:(NSString *)href { + if (self = [super init]) { + _type = @"GroundOverlay"; + _northEast = northEast; + _southWest = southWest; + _zIndex = zIndex; + _rotation = rotation; + _href = href; + } + return self; +} + +@end diff --git a/Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMULineString.h b/Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMULineString.h new file mode 100644 index 0000000..9e2124f --- /dev/null +++ b/Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMULineString.h @@ -0,0 +1,43 @@ +/* Copyright (c) 2016 Google 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. + */ + +#import +#import +#import + +#import "GMUGeometry.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + * Instances of this class represent a LineString object. + */ +@interface GMULineString : NSObject + +/** + * The path of the LineString. + */ +@property(nonatomic, readonly) GMSPath *path; + +/** + * Initializes a GMULineString object with a path. + * + * @param path The path of the LineString. + */ +- (instancetype)initWithPath:(GMSPath *)path; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMULineString.m b/Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMULineString.m new file mode 100644 index 0000000..fdf647e --- /dev/null +++ b/Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMULineString.m @@ -0,0 +1,30 @@ +/* Copyright (c) 2016 Google 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. + */ + +#import "GMULineString.h" + +@implementation GMULineString + +@synthesize type = _type; + +- (instancetype)initWithPath:(GMSPath *)path { + if (self = [super init]) { + _type = @"LineString"; + _path = path; + } + return self; +} + +@end diff --git a/Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUPair.h b/Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUPair.h new file mode 100644 index 0000000..9d9fb01 --- /dev/null +++ b/Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUPair.h @@ -0,0 +1,35 @@ +/* Copyright (c) 2018 Google 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. + */ + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** + * Instances of this class represent a geometry Style. It is used to define the + * stylings of any number of GMUGeometry objects. + */ +@interface GMUPair : NSObject + +@property(nonatomic, readonly) NSString *key; +@property(nonatomic, readonly) NSString *styleUrl; + +- (instancetype)initWithKey:(NSString *)styleID + styleUrl:(NSString *)strokeColor; + +@end + +NS_ASSUME_NONNULL_END + diff --git a/Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUPair.m b/Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUPair.m new file mode 100644 index 0000000..164c842 --- /dev/null +++ b/Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUPair.m @@ -0,0 +1,32 @@ +/* Copyright (c) 2018 Google 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. + */ + +#import "GMUPair.h" + +@implementation GMUPair + +@synthesize key = _key; +@synthesize styleUrl = _styleUrl; + +- (instancetype)initWithKey:(NSString *)key + styleUrl:(NSString *)styleUrl { + if (self = [super init]) { + _key = key; + _styleUrl = styleUrl; + } + return self; +} + +@end diff --git a/Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUPlacemark.h b/Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUPlacemark.h new file mode 100644 index 0000000..67dc656 --- /dev/null +++ b/Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUPlacemark.h @@ -0,0 +1,60 @@ +/* Copyright (c) 2016 Google 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. + */ + +#import + +#import "GMUGeometryContainer.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + * Represents a placemark which is either a Point, LineString, Polygon, or MultiGeometry. Contains + * the properties and styles of the place. + */ +@interface GMUPlacemark : NSObject + +/** + * The name element of the placemark. + */ +@property(nonatomic, nullable, readonly) NSString *title; + +/** + * The description element of the placemark. + */ +@property(nonatomic, nullable, readonly) NSString *snippet; + +/** + * The StyleUrl element of the placemark; used to reference a style defined in the file. + */ +@property(nonatomic, nullable, readonly) NSString *styleUrl; + +/** + * Initializes a new KMLPlacemark object. + * + * @param geometry The geometry of the placemark. + * @param title The title of the placemark. + * @param snippet The snippet text of the placemark. + * @param style The inline style of the placemark. + * @param styleUrl The url to the style of the placemark. + */ +- (instancetype)initWithGeometry:(id _Nullable)geometry + title:(NSString *_Nullable)title + snippet:(NSString *_Nullable)snippet + style:(GMUStyle *_Nullable)style + styleUrl:(NSString *_Nullable)styleUrl; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUPlacemark.m b/Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUPlacemark.m new file mode 100644 index 0000000..499ba34 --- /dev/null +++ b/Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUPlacemark.m @@ -0,0 +1,39 @@ +/* Copyright (c) 2016 Google 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. + */ + +#import "GMUPlacemark.h" + +@implementation GMUPlacemark + +@synthesize geometry = _geometry; + +@synthesize style = _style; + +- (instancetype)initWithGeometry:(id)geometry + title:(NSString *)title + snippet:(NSString *)snippet + style:(GMUStyle *)style + styleUrl:(NSString *)styleUrl { + if (self = [super init]) { + _geometry = geometry; + _title = [title copy]; + _snippet = [snippet copy]; + _style = style; + _styleUrl = [styleUrl copy]; + } + return self; +} + +@end diff --git a/Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUPoint.h b/Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUPoint.h new file mode 100644 index 0000000..918efd2 --- /dev/null +++ b/Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUPoint.h @@ -0,0 +1,42 @@ +/* Copyright (c) 2016 Google 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. + */ + +#import +#import + +#import "GMUGeometry.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + * Instances of this class represent a Point object. + */ +@interface GMUPoint : NSObject + +/** + * The 2D coordinate of the Point, containing a latitude and longitude. + */ +@property(nonatomic, readonly) CLLocationCoordinate2D coordinate; + +/** + * Initializes a GMUPoint object with a coordinate. + * + * @param coordinate A location with a latitude and longitude. + */ +- (instancetype)initWithCoordinate:(CLLocationCoordinate2D)coordinate; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUPoint.m b/Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUPoint.m new file mode 100644 index 0000000..4d27f72 --- /dev/null +++ b/Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUPoint.m @@ -0,0 +1,30 @@ +/* Copyright (c) 2016 Google 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. + */ + +#import "GMUPoint.h" + +@implementation GMUPoint + +@synthesize type = _type; + +- (instancetype)initWithCoordinate:(CLLocationCoordinate2D)coordinate { + if (self = [super init]) { + _type = @"Point"; + _coordinate = coordinate; + } + return self; +} + +@end diff --git a/Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUPolygon.h b/Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUPolygon.h new file mode 100644 index 0000000..dc0f747 --- /dev/null +++ b/Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUPolygon.h @@ -0,0 +1,44 @@ +/* Copyright (c) 2016 Google 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. + */ + +#import +#import +#import + +#import "GMUGeometry.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + * Instances of this class represent a Polygon object. + */ +@interface GMUPolygon : NSObject + +/** + * The array of LinearRing paths for the Polygon. The first is the exterior ring of the Polygon; any + * subsequent rings are holes. + */ +@property(nonatomic, readonly) NSArray *paths; + +/** + * Initializes a GMUGeoJSONPolygon object with a set of paths. + * + * @param paths The paths of the Polygon. + */ +- (instancetype)initWithPaths:(NSArray *)paths; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUPolygon.m b/Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUPolygon.m new file mode 100644 index 0000000..d144a49 --- /dev/null +++ b/Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUPolygon.m @@ -0,0 +1,30 @@ +/* Copyright (c) 2016 Google 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. + */ + +#import "GMUPolygon.h" + +@implementation GMUPolygon + +@synthesize type = _type; + +- (instancetype)initWithPaths:(NSArray *)paths { + if (self = [super init]) { + _type = @"Polygon"; + _paths = [paths copy]; + } + return self; +} + +@end diff --git a/Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUStyle.h b/Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUStyle.h new file mode 100644 index 0000000..b558001 --- /dev/null +++ b/Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUStyle.h @@ -0,0 +1,111 @@ +/* Copyright (c) 2016 Google 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. + */ + +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +/** + * Instances of this class represent a geometry Style. It is used to define the + * stylings of any number of GMUGeometry objects. + */ +@interface GMUStyle : NSObject + +/** + * The unique identifier of the style + */ +@property(nonatomic, readonly) NSString *styleID; + +/** + * The color for the stroke of a LineString or Polygon. + */ +@property(nonatomic, nullable, readonly) UIColor *strokeColor; + +/** + * The color for the fill of a Polygon. + */ +@property(nonatomic, nullable, readonly) UIColor *fillColor; + +/** + * The width of a LineString + */ +@property(nonatomic, readonly) CGFloat width; + +/** + * The scale that a Point's icon should be rendered at. + */ +@property(nonatomic, readonly) CGFloat scale; + +/** + * The direction, in degrees, that a Point's icon should be rendered at. + */ +@property(nonatomic, readonly) CGFloat heading; + +/** + * The position within an icon that is anchored to the Point. + */ +@property(nonatomic, readonly) CGPoint anchor; + +/** + * The href for the icon to be used for a Point. + */ +@property(nonatomic, nullable, readonly) NSString *iconUrl; + +/** + * The title to use for a Point. + */ +@property(nonatomic, nullable, readonly) NSString *title; + +/** + * Whether the Polygon has a defined fill color. + */ +@property(nonatomic, readonly) BOOL hasFill; + +/** + * Whether the LineString or Polygon has a defined stroke color. + */ +@property(nonatomic, readonly) BOOL hasStroke; + +/** + * Initalizer that defines the style's identifier. + * + * @param styleID The unique identifier string for the style. + * @param strokeColor The color of the geometry stroke. + * @param fillColor The color of the geometry fill. + * @param width The width of the geometry stroke. + * @param scale The scale at which point icons will be rendered + * @param heading The heading of the point icon. + * @param anchor The anchor coordinate of the point icon. + * @param iconUrl The reference url to the point icon image. + * @param title The title of the point. + * @param hasFill Whether the geometry should be filled. + * @param hasStroke Whether the geometry has a stroke. + */ +- (instancetype)initWithStyleID:(NSString *)styleID + strokeColor:(UIColor *_Nullable)strokeColor + fillColor:(UIColor *_Nullable)fillColor + width:(CGFloat)width + scale:(CGFloat)scale + heading:(CGFloat)heading + anchor:(CGPoint)anchor + iconUrl:(NSString *_Nullable)iconUrl + title:(NSString *_Nullable)title + hasFill:(BOOL)hasFill + hasStroke:(BOOL)hasStroke; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUStyle.m b/Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUStyle.m new file mode 100644 index 0000000..c61ab3b --- /dev/null +++ b/Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUStyle.m @@ -0,0 +1,47 @@ +/* Copyright (c) 2016 Google 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. + */ + +#import "GMUStyle.h" + +@implementation GMUStyle + +- (instancetype)initWithStyleID:(NSString *)styleID + strokeColor:(UIColor *)strokeColor + fillColor:(UIColor *)fillColor + width:(CGFloat)width + scale:(CGFloat)scale + heading:(CGFloat)heading + anchor:(CGPoint)anchor + iconUrl:(NSString *)iconUrl + title:(NSString *)title + hasFill:(BOOL)hasFill + hasStroke:(BOOL)hasStroke { + if (self = [super init]) { + _styleID = [styleID copy]; + _strokeColor = strokeColor; + _fillColor = fillColor; + _width = width; + _scale = scale; + _heading = heading; + _anchor = anchor; + _iconUrl = [iconUrl copy]; + _title = [title copy]; + _hasFill = hasFill; + _hasStroke = hasStroke; + } + return self; +} + +@end diff --git a/Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUStyleMap.h b/Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUStyleMap.h new file mode 100644 index 0000000..cf81238 --- /dev/null +++ b/Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUStyleMap.h @@ -0,0 +1,32 @@ +/* Copyright (c) 2018 Google 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. + */ + +#import + +#import "GMUPair.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface GMUStyleMap : NSObject + +@property(nonatomic, readonly) NSString *styleMapId; +@property(nonatomic, readonly) NSArray *pairs; + +- (instancetype)initWithId:(NSString *)styleMapId + pairs:(NSArray *)pairs; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUStyleMap.m b/Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUStyleMap.m new file mode 100644 index 0000000..35c09d6 --- /dev/null +++ b/Pods/Google-Maps-iOS-Utils/src/Geometry/Model/GMUStyleMap.m @@ -0,0 +1,33 @@ +/* Copyright (c) 2018 Google 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. + */ + +#import "GMUPair.h" +#import "GMUStyleMap.h" + +@implementation GMUStyleMap + +@synthesize styleMapId = _id; +@synthesize pairs = _pairs; + +- (instancetype)initWithId:(NSString *)styleMapId + pairs:(NSArray *)pairs { + if (self = [super init]) { + _id = styleMapId; + _pairs = pairs; + } + return self; +} + +@end diff --git a/Pods/Google-Maps-iOS-Utils/src/Heatmap/GMUGradient.h b/Pods/Google-Maps-iOS-Utils/src/Heatmap/GMUGradient.h new file mode 100644 index 0000000..1a5f6c0 --- /dev/null +++ b/Pods/Google-Maps-iOS-Utils/src/Heatmap/GMUGradient.h @@ -0,0 +1,51 @@ +/* Copyright (c) 2017 Google 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. + */ + +#import + +NS_ASSUME_NONNULL_BEGIN + +// Represents a mapping of intensity to color. Interpolates between given set intensity and +// color values to produce a full mapping for the range [0, 1]. +@interface GMUGradient : NSObject + +// Number of entries in the generated color map. +@property(nonatomic, readonly) NSUInteger mapSize; + +// The specific colors for the specific intensities specified by startPoints. +@property(nonatomic, readonly) NSArray *colors; + +// The intensities which will be the specific colors specified in colors. +@property(nonatomic, readonly) NSArray *startPoints; + +// Designated initializer. +// +// |colors| and |startPoints| must not be empty, and must have the same number of elements. +// |startPoints| values must be in non-descending order and be float values in the range [0, 1]. +// |mapSize| must be at least two. Using more than 256 * colors.count is unlikely to provide any +// quality improvement. +- (instancetype)initWithColors:(NSArray *)colors + startPoints:(NSArray *)startPoints + colorMapSize:(NSUInteger)mapSize; + +// Generates an array of mapSize colors for the interpolated colors for intensities between 0 and 1 +// inclusive. +// If the provided startPoints do not cover the range 0 to 1, lower values interpolate towards +// transparent black and higher values repeat the last provided color. +- (NSArray *)generateColorMap; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/Google-Maps-iOS-Utils/src/Heatmap/GMUGradient.m b/Pods/Google-Maps-iOS-Utils/src/Heatmap/GMUGradient.m new file mode 100644 index 0000000..4e960ef --- /dev/null +++ b/Pods/Google-Maps-iOS-Utils/src/Heatmap/GMUGradient.m @@ -0,0 +1,125 @@ +/* Copyright (c) 2017 Google 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. + */ + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +#import "GMUGradient.h" + +@implementation GMUGradient + +- (instancetype)initWithColors:(NSArray *)colors + startPoints:(NSArray *)startPoints + colorMapSize:(NSUInteger)mapSize { + if ((self = [super init])) { + if (colors.count == 0 || colors.count != startPoints.count) { + [NSException raise:NSInvalidArgumentException + format:@"colors' size: %lu is not equal to startPoints' size: %lu", + (unsigned long)colors.count, (unsigned long)startPoints.count]; + } + for (int i = 1; i < startPoints.count; i++) { + if ([startPoints[i - 1] floatValue] > [startPoints[i] floatValue]) { + [NSException raise:NSInvalidArgumentException + format:@"startPoints' are not in non-descending order."]; + return nil; + } + } + if ([startPoints[0] floatValue] < 0 || [startPoints[startPoints.count - 1] floatValue] > 1.0f) { + [NSException raise:NSInvalidArgumentException + format:@"startPoints' are not all in the range [0,1]."]; + return nil; + } + if (mapSize < 2) { + [NSException raise:NSInvalidArgumentException format:@"mapSize is less than 2."]; + return nil; + } + _colors = [colors copy]; + _startPoints = [startPoints copy]; + _mapSize = mapSize; + } + return self; +} + +- (NSArray *)generateColorMap { + NSMutableArray *colorMap = [NSMutableArray arrayWithCapacity:_mapSize]; + int curStartPoint = 0; + for (int i = 0; i < _mapSize; i++) { + float targetValue = i * 1.0f / (_mapSize - 1); + while (curStartPoint < _startPoints.count && + targetValue >= [_startPoints[curStartPoint] floatValue]) { + curStartPoint++; + } + // Three cases. + // curStartPoint is length - use the previous color + // curStartPoint is 0 - interpolate between current color and transparent. + // else interpolate between curStartPoint and curStartPoint - 1 + if (curStartPoint == _startPoints.count) { + colorMap[i] = _colors[curStartPoint - 1]; + continue; + } + float curValue = [_startPoints[curStartPoint] floatValue]; + float prevValue = curStartPoint == 0 ? 0 : [_startPoints[curStartPoint - 1] floatValue]; + UIColor *curColor = _colors[curStartPoint]; + UIColor *prevColor = curStartPoint == 0 ? [UIColor clearColor] : _colors[curStartPoint - 1]; + colorMap[i] = [self interpolateColorFrom:prevColor + to:curColor + ratio:(targetValue - prevValue) / (curValue - prevValue)]; + } + return colorMap; +} + +// Perform HSB and alpha interpolation. +- (UIColor *)interpolateColorFrom:(UIColor *)fromColor to:(UIColor *)toColor ratio:(float)ratio { + CGFloat fromHue = 0; + CGFloat fromSaturation = 0; + CGFloat fromBrightness = 0; + CGFloat fromAlpha = 0; + if (![fromColor getHue:&fromHue + saturation:&fromSaturation + brightness:&fromBrightness + alpha:&fromAlpha]) { + // If color can't be converted, fallback to bands of color. + // TODO: raise an error instead? + return fromColor; + } + CGFloat toHue = 0; + CGFloat toSaturation = 0; + CGFloat toBrightness = 0; + CGFloat toAlpha = 0; + if (![toColor getHue:&toHue saturation:&toSaturation brightness:&toBrightness alpha:&toAlpha]) { + // If color can't be converted, fallback to bands of color. + // TODO: raise an error instead? + return fromColor; + } + CGFloat targetHue = fromHue + (toHue - fromHue) * ratio; + // Use 'shortest path' around the color wheel. + // Note: this logic is nonsense in the presence of extended color spaces as the color wheel isn't + // 0.0 to 1.0 in that case. + if (toHue - fromHue > 0.5f) { + targetHue = fmod((1.0f + fromHue) + (toHue - fromHue - 1.0f) * ratio, 1.0f); + } else if (toHue - fromHue < -0.5f) { + targetHue = fmod((fromHue) + (toHue + 1.0f - fromHue) * ratio, 1.0f); + } + CGFloat targetSaturation = fromSaturation + (toSaturation - fromSaturation) * ratio; + CGFloat targetBrightness = fromBrightness + (toBrightness - fromBrightness) * ratio; + CGFloat targetAlpha = fromAlpha + (toAlpha - fromAlpha) * ratio; + return [UIColor colorWithHue:targetHue + saturation:targetSaturation + brightness:targetBrightness + alpha:targetAlpha]; +} + +@end diff --git a/Pods/Google-Maps-iOS-Utils/src/Heatmap/GMUHeatmapTileLayer.h b/Pods/Google-Maps-iOS-Utils/src/Heatmap/GMUHeatmapTileLayer.h new file mode 100644 index 0000000..0eb0505 --- /dev/null +++ b/Pods/Google-Maps-iOS-Utils/src/Heatmap/GMUHeatmapTileLayer.h @@ -0,0 +1,55 @@ +/* Copyright (c) 2017 Google 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. + */ + +#import + +#import "GMUGradient.h" +#import "GMUWeightedLatLng.h" + +NS_ASSUME_NONNULL_BEGIN + +// A tile layer which renders a heat map. +// The heat map uses convolutional smoothing of specific raidus with weighted data points in +// combination with a gradient which maps intensity to colors to dynamically generate tiles. +// Note: tiles are loaded on background threads, but the configuration properties are non-atomic. +// To ensure consistency, the configuration properties are captured when changing the map property. +// In order to change the values of a live layer, the map property must be reset. +// +// Overrides the default value for opacity to be 0.7 and sets the tile size to 512. Changing the +// tile size is not supported. +@interface GMUHeatmapTileLayer : GMSSyncTileLayer + +// Positions and individual intensitites of the data which will be smoothed for display on the +// tiles. +@property(nonatomic, copy) NSArray *weightedData; + +// Radius of smoothing. +// Larger values smooth the data out over a larger area, but also have a greater cost for generating +// tiles. +// It is not recommended to set this to a value greater than 50. +@property(nonatomic) NSUInteger radius; + +// The gradient used to map smoothed intensities to colors in the tiles. +@property(nonatomic) GMUGradient *gradient; + +// The minimum zoom intensity used for normalizing intensities, defaults to 5 +@property(nonatomic) NSUInteger minimumZoomIntensity; + +// The maximum zoom intensity used for normalizing intensities, defaults to 10 +@property(nonatomic) NSUInteger maximumZoomIntensity; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/Google-Maps-iOS-Utils/src/Heatmap/GMUHeatmapTileLayer.m b/Pods/Google-Maps-iOS-Utils/src/Heatmap/GMUHeatmapTileLayer.m new file mode 100644 index 0000000..4e82f05 --- /dev/null +++ b/Pods/Google-Maps-iOS-Utils/src/Heatmap/GMUHeatmapTileLayer.m @@ -0,0 +1,354 @@ +/* Copyright (c) 2017 Google 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. + */ + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +#import "GMUHeatmapTileLayer.h" + +#import "GQTBounds.h" +#import "GQTPointQuadTree.h" + +static const int kGMUTileSize = 512; +static const int kGMUMaxZoom = 22; + +static void FreeDataProviderData(void *info, const void *data, size_t size) { free((void *)data); } + +// Holder for data which must be consistent when accessed from tile creation threads. +@interface GMUHeatmapTileCreationData : NSObject { + @public + GQTPointQuadTree *_quadTree; + GQTBounds _bounds; + NSUInteger _radius; + NSUInteger _minimumZoomIntensity; + NSUInteger _maximumZoomIntensity; + NSArray *_colorMap; + NSArray *_maxIntensities; + NSArray *_kernel; +} +@end + +@implementation GMUHeatmapTileCreationData +@end + +@implementation GMUHeatmapTileLayer { + BOOL _dirty; + GMUHeatmapTileCreationData *_data; +} + +- (instancetype)init { + if ((self = [super init])) { + _radius = 20; + _minimumZoomIntensity = 5; + _maximumZoomIntensity = 10; + + NSArray *gradientColors = @[ + [UIColor colorWithRed:102.f / 255.f green:225.f / 255.f blue:0 alpha:1], + [UIColor colorWithRed:1.0f green:0 blue:0 alpha:1] + ]; + _gradient = [[GMUGradient alloc] initWithColors:gradientColors + startPoints:@[ @0.2f, @1.0f ] + colorMapSize:1000]; + _dirty = YES; + self.opacity = 0.7; + self.tileSize = kGMUTileSize; + } + return self; +} + +- (void)setRadius:(NSUInteger)value { + _radius = value; + _dirty = YES; +} + +- (void)setGradient:(GMUGradient *)gradient { + _gradient = gradient; + _dirty = YES; +} + +- (void)setMinimumZoomIntensity:(NSUInteger)minimumZoomIntensity { + _minimumZoomIntensity = minimumZoomIntensity; + _dirty = YES; +} + +- (void)setMaximumZoomIntensity:(NSUInteger)maximumZoomIntensity { + _maximumZoomIntensity = maximumZoomIntensity; + _dirty = YES; +} + +- (void)setWeightedData:(NSArray *)weightedData { + _weightedData = [weightedData copy]; + _dirty = YES; +} + +- (void)setMap:(GMSMapView *)map { + if (_dirty) { + [self prepare]; + _dirty = NO; + } + [super setMap:map]; +} + +- (GQTBounds)calculateBounds { + GQTBounds result; + result.minX = 0; + result.minY = 0; + result.maxX = 0; + result.maxY = 0; + if (_weightedData.count == 0) { + return result; + } + GQTPoint point = [_weightedData[0] point]; + result.minX = result.maxX = point.x; + result.minY = result.maxY = point.y; + for (int i = 1; i < _weightedData.count; i++) { + point = [_weightedData[i] point]; + if (result.minX > point.x) result.minX = point.x; + if (result.maxX < point.x) result.maxX = point.x; + if (result.minY > point.y) result.minY = point.y; + if (result.maxY < point.y) result.maxY = point.y; + } + return result; +} + +- (NSNumber *)maxValueForZoom:(NSUInteger)zoom { + // Bucket data in to areas equal to twice radius at the given zoom. + // At zoom 0, one tile covers the entire range of -1 to 1. + // So for zoom 0 bucket size should be 2*2*radius/512. + // However in practice these buckets are too big, as it kind of assumes convolution with a kernel + // which is 1 for the entire diameter. + // Unless all the points are practically coincident within the bucket, this is quite wrong. + // Therefore apply a magical factor to give something which is a bit better in practice. + // TODO: apply magical factor squared to the final result rather than changing the bucket size? + double magicalFactor = 0.5; + double bucketSize = _radius / 128.0 / pow(2, zoom) * magicalFactor; + NSMutableDictionary *> *lookupX = + [NSMutableDictionary dictionary]; + float max = 0; + for (GMUWeightedLatLng *dataPoint in _weightedData) { + GQTPoint point = [dataPoint point]; + NSNumber *xBucket = @((int)((point.x + 1) / bucketSize)); + NSNumber *yBucket = @((int)((point.y + 1) / bucketSize)); + NSMutableDictionary *lookupY = lookupX[xBucket]; + if (!lookupY) { + lookupY = [NSMutableDictionary dictionary]; + lookupX[xBucket] = lookupY; + } + NSNumber *value = lookupY[yBucket]; + float newValue = [value floatValue] + dataPoint.intensity; + if (newValue > max) max = newValue; + lookupY[yBucket] = @(newValue); + } + return @(max); +} + +- (NSArray *)calculateIntensities { + // TODO: extract constants; + NSMutableArray *intensities = [NSMutableArray arrayWithCapacity:kGMUMaxZoom]; + // Populate the array up to the min intensity with place holders until the min intensity is + // calculated. + for (NSUInteger i = 0; i < _minimumZoomIntensity; i++) { + intensities[i] = @0; + } + for (NSUInteger i = _minimumZoomIntensity; i <= _maximumZoomIntensity; i++) { + intensities[i] = [self maxValueForZoom:i]; + } + for (NSUInteger i = 0; i < _minimumZoomIntensity; i++) { + intensities[i] = intensities[_minimumZoomIntensity]; + } + for (NSUInteger i = _maximumZoomIntensity + 1; i < kGMUMaxZoom; i++) { + intensities[i] = intensities[_maximumZoomIntensity]; + } + return intensities; +} + +- (NSArray *)generateKernel { + float sd = _radius / 3.0; + NSMutableArray *values = [NSMutableArray arrayWithCapacity:_radius * 2 + 1]; + for (int i = -(int)_radius; i <= (int)_radius; i++) { + values[i + _radius] = @(expf(-i * i / (2 * sd * sd))); + } + return values; +} + +- (void)prepare { + GMUHeatmapTileCreationData *data = [[GMUHeatmapTileCreationData alloc] init]; + data->_bounds = [self calculateBounds]; + data->_quadTree = [[GQTPointQuadTree alloc] initWithBounds:data->_bounds]; + for (GMUWeightedLatLng *dataPoint in _weightedData) { + [data->_quadTree add:dataPoint]; + } + data->_colorMap = [_gradient generateColorMap]; + data->_maxIntensities = [self calculateIntensities]; + data->_kernel = [self generateKernel]; + data->_radius = _radius; + @synchronized(self) { + _data = data; + } +} + +- (UIImage *)tileForX:(NSUInteger)x y:(NSUInteger)y zoom:(NSUInteger)zoom { + GMUHeatmapTileCreationData *data; + @synchronized(self) { + data = _data; + } + // Zoom 0 tile covers the world [-1, 1]. + double tileWidth = 2.0 / pow(2.0, zoom); + double padding = tileWidth * data->_radius / kGMUTileSize; + // One bucket per pixel. + double bucketWidth = tileWidth / kGMUTileSize; + double minX = -1 + x * tileWidth - padding; + double maxX = -1 + (x + 1) * tileWidth + padding; + // y axis for tile coordinates goes north to south, but y axis of world space goes south to north, + // so this is inverted. + double maxY = 1 - y * tileWidth + padding; + double minY = 1 - (y + 1) * tileWidth - padding; + + double wrappedPointsOffset = 0; + NSArray *wrappedPoints; + if (minX < -1) { + GQTBounds wrappedBounds; + wrappedBounds.minX = minX + 2; + wrappedBounds.maxX = 1.0; + wrappedBounds.minY = minY; + wrappedBounds.maxY = maxY; + wrappedPoints = [data->_quadTree searchWithBounds:wrappedBounds]; + wrappedPointsOffset = -2; + } else if (maxX > 1) { + GQTBounds wrappedBounds; + wrappedBounds.minX = -1.0; + wrappedBounds.maxX = maxX - 2.0; + wrappedBounds.minY = minY; + wrappedBounds.maxY = maxY; + wrappedPoints = [data->_quadTree searchWithBounds:wrappedBounds]; + wrappedPointsOffset = 2; + } + GQTBounds bounds; + bounds.minX = minX; + bounds.maxX = maxX; + bounds.minY = minY; + bounds.maxY = maxY; + NSArray *points = [data->_quadTree searchWithBounds:bounds]; + // If there is no data at all return empty tile. + if (points.count + wrappedPoints.count == 0) { + return kGMSTileLayerNoTile; + } + + // Quantize points. + int paddedTileSize = kGMUTileSize + 2 * (int)data->_radius; + float *intensity = calloc(paddedTileSize * paddedTileSize, sizeof(float)); + for (GMUWeightedLatLng *item in points) { + GQTPoint p = [item point]; + int x = (int)((p.x - minX) / bucketWidth); + // Flip y axis as world space goes south to north, but tile content goes north to south. + int y = (int)((maxY - p.y) / bucketWidth); + // If the point is just on the edge of the query area, the bucketing could put it outside + // bounds. + if (x >= paddedTileSize) x = paddedTileSize - 1; + if (y >= paddedTileSize) y = paddedTileSize - 1; + intensity[y * paddedTileSize + x] += item.intensity; + } + for (GMUWeightedLatLng *item in wrappedPoints) { + GQTPoint p = [item point]; + int x = (int)((p.x + wrappedPointsOffset - minX) / bucketWidth); + // Flip y axis as world space goes south to north, but tile content goes north to south. + int y = (int)((maxY - p.y) / bucketWidth); + // If the point is just on the edge of the query area, the bucketing could put it outside + // bounds. + if (x >= paddedTileSize) x = paddedTileSize - 1; + if (y >= paddedTileSize) y = paddedTileSize - 1; + // For wrapped points, additional shifting risks bucketing slipping just outside due to + // numerical instability. + if (x < 0) x = 0; + intensity[y * paddedTileSize + x] += item.intensity; + } + + // Convolve data. + int lowerLimit = (int)data->_radius; + int upperLimit = paddedTileSize - (int)data->_radius - 1; + // Convolve horizontally first. + float *intermediate = calloc(paddedTileSize * paddedTileSize, sizeof(float)); + for (int y = 0; y < paddedTileSize; y++) { + for (int x = 0; x < paddedTileSize; x++) { + float value = intensity[y * paddedTileSize + x]; + if (value != 0) { + // convolve to x +/- radius bounded by the limit we care about. + int start = MAX(lowerLimit, x - (int)data->_radius); + int end = MIN(upperLimit, x + (int)data->_radius); + for (int x2 = start; x2 <= end; x2++) { + float scaledKernel = value * [data->_kernel[x2 - x + data->_radius] floatValue]; + intermediate[y * paddedTileSize + x2] += scaledKernel; + } + } + } + } + free(intensity); + // Convole vertically to get final intensity. + float *finalIntensity = calloc(kGMUTileSize * kGMUTileSize, sizeof(float)); + for (int x = lowerLimit; x <= upperLimit; x++) { + for (int y = 0; y < paddedTileSize; y++) { + float value = intermediate[y * paddedTileSize + x]; + if (value != 0) { + int start = MAX(lowerLimit, y - (int)data->_radius); + int end = MIN(upperLimit, y + (int)data->_radius); + for (int y2 = start; y2 <= end; y2++) { + float scaledKernel = value * [data->_kernel[y2 - y + data->_radius] floatValue]; + finalIntensity[(y2 - lowerLimit) * kGMUTileSize + x - lowerLimit] += scaledKernel; + } + } + } + } + free(intermediate); + + // Generate coloring. + uint32_t *rawpixels = malloc(4 * kGMUTileSize * kGMUTileSize); + float max = [data->_maxIntensities[zoom] floatValue]; + float scaling = (data->_colorMap.count - 1) / max; + for (int y = 0; y < kGMUTileSize; y++) { + for (int x = 0; x < kGMUTileSize; x++) { + NSUInteger colorMapIndex = (NSUInteger)(finalIntensity[y * kGMUTileSize + x] * scaling); + // Clamp out of range to the last color. + if (colorMapIndex >= data->_colorMap.count) colorMapIndex = data->_colorMap.count - 1; + UIColor *color = data->_colorMap[colorMapIndex]; + uint32_t rgba; + CGFloat r, g, b, a; + if ([color getRed:&r green:&g blue:&b alpha:&a]) { + rgba = (((uint32_t)(a * 255)) << 24) + (((uint32_t)(b * 255)) << 16) + + (((uint32_t)(g * 255)) << 8) + ((uint32_t)(r * 255)); + } else { + // TODO: handle this error condition? + rgba = 0; + } + rawpixels[y * kGMUTileSize + x] = rgba; + } + } + free(finalIntensity); + + CGDataProviderRef provider = CGDataProviderCreateWithData( + NULL, rawpixels, kGMUTileSize * kGMUTileSize * 4, FreeDataProviderData); + + CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB(); + CGImageRef imageRef = CGImageCreate(kGMUTileSize, kGMUTileSize, 8, 32, 4 * kGMUTileSize, + colorSpaceRef, kCGBitmapByteOrder32Big | kCGImageAlphaLast, + provider, NULL, NO, kCGRenderingIntentDefault); + UIImage *newImage = [UIImage imageWithCGImage:imageRef]; + CGImageRelease(imageRef); + CGColorSpaceRelease(colorSpaceRef); + CGDataProviderRelease(provider); + return newImage; +} + +@end diff --git a/Pods/Google-Maps-iOS-Utils/src/Heatmap/GMUWeightedLatLng.h b/Pods/Google-Maps-iOS-Utils/src/Heatmap/GMUWeightedLatLng.h new file mode 100644 index 0000000..5af3e6a --- /dev/null +++ b/Pods/Google-Maps-iOS-Utils/src/Heatmap/GMUWeightedLatLng.h @@ -0,0 +1,35 @@ +/* Copyright (c) 2017 Google 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. + */ + +#import "GQTPointQuadTreeItem.h" + +#import + +NS_ASSUME_NONNULL_BEGIN + +// A quad tree item which represents a data point of given intensity at a given point on the earth's +// surface. +@interface GMUWeightedLatLng : NSObject + +// The intensity of the data point. Scale is arbitrary but assumed to be linear. Intensity three +// should be equivalent to three co-located points of intensity one. +@property(nonatomic, readonly) float intensity; + +// Designated initializer. +- (instancetype)initWithCoordinate:(CLLocationCoordinate2D)coordinate intensity:(float)intensity; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/Google-Maps-iOS-Utils/src/Heatmap/GMUWeightedLatLng.m b/Pods/Google-Maps-iOS-Utils/src/Heatmap/GMUWeightedLatLng.m new file mode 100644 index 0000000..e401ecd --- /dev/null +++ b/Pods/Google-Maps-iOS-Utils/src/Heatmap/GMUWeightedLatLng.m @@ -0,0 +1,42 @@ +/* Copyright (c) 2017 Google 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. + */ + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +#import "GMUWeightedLatLng.h" + +#import + +@implementation GMUWeightedLatLng { + GQTPoint _point; +} + +- (instancetype)initWithCoordinate:(CLLocationCoordinate2D)coordinate intensity:(float)intensity { + if ((self = [super init])) { + _intensity = intensity; + GMSMapPoint mapPoint = GMSProject(coordinate); + _point.x = mapPoint.x; + _point.y = mapPoint.y; + } + return self; +} + +- (GQTPoint)point { + return _point; +} + +@end diff --git a/Pods/Google-Maps-iOS-Utils/src/QuadTree/GQTBounds.h b/Pods/Google-Maps-iOS-Utils/src/QuadTree/GQTBounds.h new file mode 100644 index 0000000..e7fb9a4 --- /dev/null +++ b/Pods/Google-Maps-iOS-Utils/src/QuadTree/GQTBounds.h @@ -0,0 +1,23 @@ +/* Copyright (c) 2016 Google 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. + */ + +#import "GQTPoint.h" + +typedef struct { + double minX; + double minY; + double maxX; + double maxY; +} GQTBounds; diff --git a/Pods/Google-Maps-iOS-Utils/src/QuadTree/GQTPoint.h b/Pods/Google-Maps-iOS-Utils/src/QuadTree/GQTPoint.h new file mode 100644 index 0000000..b78902d --- /dev/null +++ b/Pods/Google-Maps-iOS-Utils/src/QuadTree/GQTPoint.h @@ -0,0 +1,19 @@ +/* Copyright (c) 2016 Google 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. + */ + +typedef struct { + double x; + double y; +} GQTPoint; diff --git a/Pods/Google-Maps-iOS-Utils/src/QuadTree/GQTPointQuadTree.h b/Pods/Google-Maps-iOS-Utils/src/QuadTree/GQTPointQuadTree.h new file mode 100644 index 0000000..797da60 --- /dev/null +++ b/Pods/Google-Maps-iOS-Utils/src/QuadTree/GQTPointQuadTree.h @@ -0,0 +1,73 @@ +/* Copyright (c) 2016 Google 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. + */ + +#import +#import "GQTBounds.h" +#import "GQTPointQuadTreeItem.h" + +@interface GQTPointQuadTree : NSObject + +/** + * Create a QuadTree with bounds. Please note, this class is not thread safe. + * + * @param bounds The bounds of this PointQuadTree. The tree will only accept items that fall + within the bounds. The bounds are inclusive. + */ +- (id)initWithBounds:(GQTBounds)bounds; + +/** + * Create a QuadTree with the inclusive bounds of (-1,-1) to (1,1). + */ +- (id)init; + +/** + * Insert an item into this PointQuadTree. + * + * @param item The item to insert. Must not be nil. + * @return |NO| if the item is not contained within the bounds of this tree. + * Otherwise adds the item and returns |YES|. + */ +- (BOOL)add:(id)item; + +/** + * Delete an item from this PointQuadTree. + * + * @param item The item to delete. + * @return |NO| if the items was not found in the tree, |YES| otherwise. + */ +- (BOOL)remove:(id)item; + +/** + * Delete all items from this PointQuadTree. + */ +- (void)clear; + +/** + * Retreive all items in this PointQuadTree within a bounding box. + * + * @param bounds The bounds of the search box. + * @return The collection of items within |bounds|, returned as an NSArray + * of id. + */ +- (NSArray *)searchWithBounds:(GQTBounds)bounds; + +/** + * The number of items in this entire tree. + * + * @return The number of items. + */ +- (NSUInteger)count; + +@end diff --git a/Pods/Google-Maps-iOS-Utils/src/QuadTree/GQTPointQuadTree.m b/Pods/Google-Maps-iOS-Utils/src/QuadTree/GQTPointQuadTree.m new file mode 100644 index 0000000..3c72b37 --- /dev/null +++ b/Pods/Google-Maps-iOS-Utils/src/QuadTree/GQTPointQuadTree.m @@ -0,0 +1,115 @@ +/* Copyright (c) 2016 Google 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. + */ + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +#import "GQTPointQuadTree.h" +#import "GQTPointQuadTreeChild.h" + +@implementation GQTPointQuadTree { + /** + * The bounds of this PointQuadTree. + */ + GQTBounds bounds_; + + /** + * The Quad Tree data structure. + */ + GQTPointQuadTreeChild *root_; + + /** + * The number of items in this tree. + */ + NSUInteger count_; +} + +- (id)initWithBounds:(GQTBounds)bounds { + if (self = [super init]) { + bounds_ = bounds; + [self clear]; + } + return self; +} + +- (id)init { + return [self initWithBounds:(GQTBounds){-1, -1, 1, 1}]; +} + +- (BOOL)add:(id)item { + if (item == nil) { + // Item must not be nil. + return NO; + } + + GQTPoint point = item.point; + if (point.x > bounds_.maxX || point.x < bounds_.minX || point.y > bounds_.maxY || + point.y < bounds_.minY) { + return NO; + } + + [root_ add:item withOwnBounds:bounds_ atDepth:0]; + + ++count_; + + return YES; +} + +/** + * Delete an item from this PointQuadTree + * + * @param item The item to delete. + */ +- (BOOL)remove:(id)item { + GQTPoint point = item.point; + if (point.x > bounds_.maxX || point.x < bounds_.minX || point.y > bounds_.maxY || + point.y < bounds_.minY) { + return NO; + } + + BOOL removed = [root_ remove:item withOwnBounds:bounds_]; + + if (removed) { + --count_; + } + + return removed; +} + +/** + * Delete all items from this PointQuadTree + */ +- (void)clear { + root_ = [[GQTPointQuadTreeChild alloc] init]; + count_ = 0; +} + +/** + * Retreive all items in this PointQuadTree within a bounding box. + * + * @param searchBounds The bounds of the search box. + */ +- (NSArray *)searchWithBounds:(GQTBounds)searchBounds { + NSMutableArray *results = [NSMutableArray array]; + [root_ searchWithBounds:searchBounds withOwnBounds:bounds_ results:results]; + return results; +} + +- (NSUInteger)count { + return count_; +} + +@end diff --git a/Pods/Google-Maps-iOS-Utils/src/QuadTree/GQTPointQuadTreeChild.h b/Pods/Google-Maps-iOS-Utils/src/QuadTree/GQTPointQuadTreeChild.h new file mode 100644 index 0000000..ed723cc --- /dev/null +++ b/Pods/Google-Maps-iOS-Utils/src/QuadTree/GQTPointQuadTreeChild.h @@ -0,0 +1,67 @@ +/* Copyright (c) 2016 Google 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. + */ + +#import +#import "GQTBounds.h" +#import "GQTPointQuadTreeItem.h" + +/** + * This is an internal class, use |GQTPointQuadTree| instead. + * Please note, this class is not thread safe. + * + * This class represents an internal node of a |GQTPointQuadTree|. + */ + +@interface GQTPointQuadTreeChild : NSObject + +/** + * Insert an item into this PointQuadTreeChild + * + * @param item The item to insert. Must not be nil. + * @param bounds The bounds of this node. + * @param depth The depth of this node. + */ +- (void)add:(id)item + withOwnBounds:(GQTBounds)bounds + atDepth:(NSUInteger)depth; + +/** + * Delete an item from this PointQuadTree. + * + * @param item The item to delete. + * @param bounds The bounds of this node. + * @return |NO| if the items was not found in the tree, |YES| otherwise. + */ +- (BOOL)remove:(id)item withOwnBounds:(GQTBounds)bounds; + +/** + * Retreive all items in this PointQuadTree within a bounding box. + * + * @param searchBounds The bounds of the search box. + * @param ownBounds The bounds of this node. + * @param accumulator The results of the search. + */ +- (void)searchWithBounds:(GQTBounds)searchBounds + withOwnBounds:(GQTBounds)ownBounds + results:(NSMutableArray *)accumulator; + +/** + * Split the contents of this Quad over four child quads. + * @param ownBounds The bounds of this node. + * @param depth The depth of this node. + */ +- (void)splitWithOwnBounds:(GQTBounds)ownBounds atDepth:(NSUInteger)depth; + +@end diff --git a/Pods/Google-Maps-iOS-Utils/src/QuadTree/GQTPointQuadTreeChild.m b/Pods/Google-Maps-iOS-Utils/src/QuadTree/GQTPointQuadTreeChild.m new file mode 100644 index 0000000..0a35105 --- /dev/null +++ b/Pods/Google-Maps-iOS-Utils/src/QuadTree/GQTPointQuadTreeChild.m @@ -0,0 +1,222 @@ +/* Copyright (c) 2016 Google 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. + */ + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +#import "GQTPointQuadTreeChild.h" + +static const unsigned kMaxElements = 64; +static const unsigned kMaxDepth = 30; + +#include "GQTBounds.h" + +static GQTPoint boundsMidpoint(GQTBounds bounds) { + return (GQTPoint){(bounds.minX + bounds.maxX) / 2, (bounds.minY + bounds.maxY) / 2}; +} + +static GQTBounds boundsTopRightChildQuadBounds(GQTBounds parentBounds) { + GQTPoint midPoint = boundsMidpoint(parentBounds); + double minX = midPoint.x; + double minY = midPoint.y; + double maxX = parentBounds.maxX; + double maxY = parentBounds.maxY; + return (GQTBounds){minX, minY, maxX, maxY}; +} + +static GQTBounds boundsTopLeftChildQuadBounds(GQTBounds parentBounds) { + GQTPoint midPoint = boundsMidpoint(parentBounds); + double minX = parentBounds.minX; + double minY = midPoint.y; + double maxX = midPoint.x; + double maxY = parentBounds.maxY; + return (GQTBounds){minX, minY, maxX, maxY}; +} + +static GQTBounds boundsBottomRightChildQuadBounds(GQTBounds parentBounds) { + GQTPoint midPoint = boundsMidpoint(parentBounds); + double minX = midPoint.x; + double minY = parentBounds.minY; + double maxX = parentBounds.maxX; + double maxY = midPoint.y; + return (GQTBounds){minX, minY, maxX, maxY}; +} + +static GQTBounds boundsBottomLeftChildQuadBounds(GQTBounds parentBounds) { + GQTPoint midPoint = boundsMidpoint(parentBounds); + double minX = parentBounds.minX; + double minY = parentBounds.minY; + double maxX = midPoint.x; + double maxY = midPoint.y; + return (GQTBounds){minX, minY, maxX, maxY}; +} + +static BOOL boundsIntersectsBounds(GQTBounds bounds1, GQTBounds bounds2) { + return (!(bounds1.maxY < bounds2.minY || bounds2.maxY < bounds1.minY) && + !(bounds1.maxX < bounds2.minX || bounds2.maxX < bounds1.minX)); +} + +@implementation GQTPointQuadTreeChild { + /** Top Right child quad. Nil until this node is split. */ + GQTPointQuadTreeChild *topRight_; + + /** Top Left child quad. Nil until this node is split. */ + GQTPointQuadTreeChild *topLeft_; + + /** Bottom Right child quad. Nil until this node is split. */ + GQTPointQuadTreeChild *bottomRight_; + + /** Bottom Left child quad. Nil until this node is split. */ + GQTPointQuadTreeChild *bottomLeft_; + + /** + * Items in this PointQuadTree node, if this node has yet to be split. If we have items, children + * will be nil, likewise, if we have children then items_ will be nil. + */ + NSMutableArray *items_; +} + +- (id)init { + if (self = [super init]) { + topRight_ = nil; + topLeft_ = nil; + bottomRight_ = nil; + bottomLeft_ = nil; + items_ = [NSMutableArray array]; + } + return self; +} + +- (void)add:(id)item + withOwnBounds:(GQTBounds)bounds + atDepth:(NSUInteger)depth { + if (item == nil) { + // Note, this should not happen, as GQTPointQuadTree's add method also does a nil check. + [NSException raise:@"Invalid item argument" format:@"item must not be null"]; + } + + if (items_.count >= kMaxElements && depth < kMaxDepth) { + [self splitWithOwnBounds:bounds atDepth:depth]; + } + + if (topRight_ != nil) { + GQTPoint itemPoint = item.point; + GQTPoint midPoint = boundsMidpoint(bounds); + + if (itemPoint.y > midPoint.y) { + if (itemPoint.x > midPoint.x) { + [topRight_ add:item withOwnBounds:boundsTopRightChildQuadBounds(bounds) atDepth:depth + 1]; + } else { + [topLeft_ add:item withOwnBounds:boundsTopLeftChildQuadBounds(bounds) atDepth:depth + 1]; + } + } else { + if (itemPoint.x > midPoint.x) { + [bottomRight_ add:item + withOwnBounds:boundsBottomRightChildQuadBounds(bounds) + atDepth:depth + 1]; + } else { + [bottomLeft_ add:item + withOwnBounds:boundsBottomLeftChildQuadBounds(bounds) + atDepth:depth + 1]; + } + } + } else { + [items_ addObject:item]; + } +} + +- (void)splitWithOwnBounds:(GQTBounds)ownBounds atDepth:(NSUInteger)depth { + assert(items_ != nil); + + topRight_ = [[GQTPointQuadTreeChild alloc] init]; + topLeft_ = [[GQTPointQuadTreeChild alloc] init]; + bottomRight_ = [[GQTPointQuadTreeChild alloc] init]; + bottomLeft_ = [[GQTPointQuadTreeChild alloc] init]; + + NSArray *items = items_; + items_ = nil; + + for (id item in items) { + [self add:item withOwnBounds:ownBounds atDepth:depth]; + } +} + +- (BOOL)remove:(id)item withOwnBounds:(GQTBounds)bounds { + if (topRight_ != nil) { + GQTPoint itemPoint = item.point; + GQTPoint midPoint = boundsMidpoint(bounds); + + if (itemPoint.y > midPoint.y) { + if (itemPoint.x > midPoint.x) { + return [topRight_ remove:item withOwnBounds:boundsTopRightChildQuadBounds(bounds)]; + } else { + return [topLeft_ remove:item withOwnBounds:boundsTopLeftChildQuadBounds(bounds)]; + } + } else { + if (itemPoint.x > midPoint.x) { + return [bottomRight_ remove:item withOwnBounds:boundsBottomRightChildQuadBounds(bounds)]; + } else { + return [bottomLeft_ remove:item withOwnBounds:boundsBottomLeftChildQuadBounds(bounds)]; + } + } + } + + NSUInteger index = [items_ indexOfObject:item]; + if (index != NSNotFound) { + [items_ removeObjectAtIndex:index]; + return YES; + } else { + return NO; + } +} + +- (void)searchWithBounds:(GQTBounds)searchBounds + withOwnBounds:(GQTBounds)ownBounds + results:(NSMutableArray *)accumulator { + if (topRight_ != nil) { + GQTBounds topRightBounds = boundsTopRightChildQuadBounds(ownBounds); + GQTBounds topLeftBounds = boundsTopLeftChildQuadBounds(ownBounds); + GQTBounds bottomRightBounds = boundsBottomRightChildQuadBounds(ownBounds); + GQTBounds bottomLeftBounds = boundsBottomLeftChildQuadBounds(ownBounds); + + if (boundsIntersectsBounds(topRightBounds, searchBounds)) { + [topRight_ searchWithBounds:searchBounds withOwnBounds:topRightBounds results:accumulator]; + } + if (boundsIntersectsBounds(topLeftBounds, searchBounds)) { + [topLeft_ searchWithBounds:searchBounds withOwnBounds:topLeftBounds results:accumulator]; + } + if (boundsIntersectsBounds(bottomRightBounds, searchBounds)) { + [bottomRight_ searchWithBounds:searchBounds + withOwnBounds:bottomRightBounds + results:accumulator]; + } + if (boundsIntersectsBounds(bottomLeftBounds, searchBounds)) { + [bottomLeft_ searchWithBounds:searchBounds + withOwnBounds:bottomLeftBounds + results:accumulator]; + } + } else { + for (id item in items_) { + GQTPoint point = item.point; + if (point.x <= searchBounds.maxX && point.x >= searchBounds.minX && + point.y <= searchBounds.maxY && point.y >= searchBounds.minY) { + [accumulator addObject:item]; + } + } + } +} + +@end diff --git a/Pods/Google-Maps-iOS-Utils/src/QuadTree/GQTPointQuadTreeItem.h b/Pods/Google-Maps-iOS-Utils/src/QuadTree/GQTPointQuadTreeItem.h new file mode 100644 index 0000000..e8ee760 --- /dev/null +++ b/Pods/Google-Maps-iOS-Utils/src/QuadTree/GQTPointQuadTreeItem.h @@ -0,0 +1,23 @@ +/* Copyright (c) 2016 Google 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. + */ + +#import +#import "GQTPoint.h" + +@protocol GQTPointQuadTreeItem + +- (GQTPoint)point; + +@end diff --git a/Pods/GoogleMaps/Base/Frameworks/GoogleMapsBase.framework/GoogleMapsBase b/Pods/GoogleMaps/Base/Frameworks/GoogleMapsBase.framework/GoogleMapsBase new file mode 100755 index 0000000..a34d76a Binary files /dev/null and b/Pods/GoogleMaps/Base/Frameworks/GoogleMapsBase.framework/GoogleMapsBase differ diff --git a/Pods/GoogleMaps/Base/Frameworks/GoogleMapsBase.framework/Headers/GMSCompatabilityMacros.h b/Pods/GoogleMaps/Base/Frameworks/GoogleMapsBase.framework/Headers/GMSCompatabilityMacros.h new file mode 100755 index 0000000..ea51991 --- /dev/null +++ b/Pods/GoogleMaps/Base/Frameworks/GoogleMapsBase.framework/Headers/GMSCompatabilityMacros.h @@ -0,0 +1,17 @@ +// +// GMSCompatabilityMacros.h +// Google Maps SDK for iOS +// +// Copyright 2015 Google LLC +// +// Usage of this SDK is subject to the Google Maps/Google Earth APIs Terms of +// Service: https://developers.google.com/maps/terms +// + +#import + +#if defined(SWIFT_SDK_OVERLAY_UIKIT_EPOCH) +#define GMS_SWIFT_NAME_2_0_3_0(name_swift_2, name_swift_3) NS_SWIFT_NAME(name_swift_3) +#else +#define GMS_SWIFT_NAME_2_0_3_0(name_swift_2, name_swift_3) NS_SWIFT_NAME(name_swift_2) +#endif diff --git a/Pods/GoogleMaps/Base/Frameworks/GoogleMapsBase.framework/Headers/GMSCoordinateBounds.h b/Pods/GoogleMaps/Base/Frameworks/GoogleMapsBase.framework/Headers/GMSCoordinateBounds.h new file mode 100755 index 0000000..0f6c2cd --- /dev/null +++ b/Pods/GoogleMaps/Base/Frameworks/GoogleMapsBase.framework/Headers/GMSCoordinateBounds.h @@ -0,0 +1,75 @@ +// +// GMSCoordinateBounds.h +// Google Maps SDK for iOS +// +// Copyright 2013 Google LLC +// +// Usage of this SDK is subject to the Google Maps/Google Earth APIs Terms of +// Service: https://developers.google.com/maps/terms +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** + * GMSCoordinateBounds represents a rectangular bounding box on the Earth's surface. + * GMSCoordinateBounds is immutable and can't be modified after construction. + */ +@interface GMSCoordinateBounds : NSObject + +/** The North-East corner of these bounds. */ +@property(nonatomic, readonly) CLLocationCoordinate2D northEast; + +/** The South-West corner of these bounds. */ +@property(nonatomic, readonly) CLLocationCoordinate2D southWest; + +/** + * Returns NO if this bounds does not contain any points. For example, + * [[GMSCoordinateBounds alloc] init].valid == NO. + * + * When an invalid bounds is expanded with valid coordinates via includingCoordinate: or + * includingBounds:, the resulting bounds will be valid but contain only the new coordinates. + */ +@property(nonatomic, readonly, getter=isValid) BOOL valid; + +/** + * Inits the northEast and southWest bounds corresponding to the rectangular region defined by the + * two corners. + * + * It is ambiguous whether the longitude of the box extends from |coord1| to |coord2| or vice-versa; + * the box is constructed as the smaller of the two variants, eliminating the ambiguity. + */ +- (id)initWithCoordinate:(CLLocationCoordinate2D)coord1 coordinate:(CLLocationCoordinate2D)coord2; + +/** + * Returns a GMSCoordinateBounds representing the current bounds extended to include the passed-in + * coordinate. + * + * If the current bounds is invalid, the result is a valid bounds containing only |coordinate|. + */ +- (GMSCoordinateBounds *)includingCoordinate:(CLLocationCoordinate2D)coordinate; + +/** + * Returns a GMSCoordinateBounds representing the current bounds extended to include the entire + * other bounds. + * + * If the current bounds is invalid, the result is a valid bounds equal to |other|. + */ +- (GMSCoordinateBounds *)includingBounds:(GMSCoordinateBounds *)other; + +/** + * Returns YES if |coordinate| is contained within this bounds. This includes points that lie + * exactly on the edge of the bounds. + */ +- (BOOL)containsCoordinate:(CLLocationCoordinate2D)coordinate; + +/** + * Returns YES if |other| overlaps with this bounds. Two bounds are overlapping if there is at least + * one coordinate point contained by both. + */ +- (BOOL)intersectsBounds:(GMSCoordinateBounds *)other; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleMaps/Base/Frameworks/GoogleMapsBase.framework/Headers/GMSDeprecationMacros.h b/Pods/GoogleMaps/Base/Frameworks/GoogleMapsBase.framework/Headers/GMSDeprecationMacros.h new file mode 100755 index 0000000..07da74e --- /dev/null +++ b/Pods/GoogleMaps/Base/Frameworks/GoogleMapsBase.framework/Headers/GMSDeprecationMacros.h @@ -0,0 +1,22 @@ +// +// GMSDeprecationMacros.h +// Google Maps SDK for iOS +// +// Copyright 2015 Google LLC +// +// Usage of this SDK is subject to the Google Maps/Google Earth APIs Terms of +// Service: https://developers.google.com/maps/terms +// + +#ifndef IPHONE_MAPS_SDK_BASE_GMSDEPRECATIONMACROS_H_ +#define IPHONE_MAPS_SDK_BASE_GMSDEPRECATIONMACROS_H_ + +#ifndef __GMS_AVAILABLE_BUT_DEPRECATED +#define __GMS_AVAILABLE_BUT_DEPRECATED __deprecated +#endif + +#ifndef __GMS_AVAILABLE_BUT_DEPRECATED_MSG +#define __GMS_AVAILABLE_BUT_DEPRECATED_MSG(msg) __deprecated_msg(msg) +#endif + +#endif diff --git a/Pods/GoogleMaps/Base/Frameworks/GoogleMapsBase.framework/Headers/GoogleMapsBase.h b/Pods/GoogleMaps/Base/Frameworks/GoogleMapsBase.framework/Headers/GoogleMapsBase.h new file mode 100755 index 0000000..95ec44c --- /dev/null +++ b/Pods/GoogleMaps/Base/Frameworks/GoogleMapsBase.framework/Headers/GoogleMapsBase.h @@ -0,0 +1,3 @@ +#import "GMSCompatabilityMacros.h" +#import "GMSCoordinateBounds.h" +#import "GMSDeprecationMacros.h" diff --git a/Pods/GoogleMaps/Base/Frameworks/GoogleMapsBase.framework/Modules/module.modulemap b/Pods/GoogleMaps/Base/Frameworks/GoogleMapsBase.framework/Modules/module.modulemap new file mode 100755 index 0000000..ab89f82 --- /dev/null +++ b/Pods/GoogleMaps/Base/Frameworks/GoogleMapsBase.framework/Modules/module.modulemap @@ -0,0 +1,14 @@ +framework module GoogleMapsBase { + umbrella header "GoogleMapsBase.h" + export * + module * { export * } + link "z" + link framework "CoreFoundation" + link framework "CoreLocation" + link framework "CoreTelephony" + link framework "CoreText" + link framework "Foundation" + link framework "QuartzCore" + link framework "Security" + link framework "UIKit" +} diff --git a/Pods/GoogleMaps/CHANGELOG.md b/Pods/GoogleMaps/CHANGELOG.md new file mode 100755 index 0000000..45a3b9f --- /dev/null +++ b/Pods/GoogleMaps/CHANGELOG.md @@ -0,0 +1,2 @@ +Please go to https://developers.google.com/maps/documentation/ios-sdk/releases +to view the Maps iOS release notes. diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos.xcodeproj/project.pbxproj b/Pods/GoogleMaps/Example/GoogleMapsDemos.xcodeproj/project.pbxproj new file mode 100755 index 0000000..7867b54 --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos.xcodeproj/project.pbxproj @@ -0,0 +1,648 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 01C8D1488E89B8A200C8582E /* australia-large@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A1D521E4FF1F8F85E084ED60 /* australia-large@2x.png */; }; + 023D5C0EB12D723906E5318C /* mapstyle-silver.json in Resources */ = {isa = PBXBuildFile; fileRef = B4C89E62C05816B590F45D57 /* mapstyle-silver.json */; }; + 02EC898A205A1E81940406E5 /* step8@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D5E5AF68BBC86BA530755A20 /* step8@2x.png */; }; + 06A69C6EAF7D7E8FF2197EC3 /* arrow@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 66DE8D273E896D7FF5B86DC9 /* arrow@2x.png */; }; + 0B07C58295A7BE58E96F34A3 /* aeroplane@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 3F716156C215C436D55F5696 /* aeroplane@2x.png */; }; + 0D9B023D6E709FAB165A29C9 /* MasterViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = EE1D504741871952487BB5BE /* MasterViewController.m */; }; + 0E2E093D159271A7FB585759 /* GroundOverlayViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 8038AEC0AF9CBD2EBB975F54 /* GroundOverlayViewController.m */; }; + 141E2BE7C525DC36CB1FE54F /* Samples.m in Sources */ = {isa = PBXBuildFile; fileRef = 115963CCE082409262D179F3 /* Samples.m */; }; + 1511EFFE20A68F00B873A930 /* GeocoderViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A77C64C5A8B8109E6AFC41F /* GeocoderViewController.m */; }; + 162AF3F1216374886C841719 /* MarkerInfoWindowViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 89DFB3350D98DA617A2ECE85 /* MarkerInfoWindowViewController.m */; }; + 16717F377D18DD00AA691F18 /* argentina-large.png in Resources */ = {isa = PBXBuildFile; fileRef = 4D8E4A10394122CD9C9CD157 /* argentina-large.png */; }; + 16B31F7A9AF98310188109DC /* popup_santa.png in Resources */ = {isa = PBXBuildFile; fileRef = EF01EFEF0FC77447C02FE86C /* popup_santa.png */; }; + 19BA16967B625E9962C0EDCC /* UIViewController+GMSToastMessages.m in Sources */ = {isa = PBXBuildFile; fileRef = 141DC0E7977DE53BB4C0ACE6 /* UIViewController+GMSToastMessages.m */; }; + 1E38E739DB90F691064AB0A9 /* FitBoundsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 721936633CF79A85B5EF0E92 /* FitBoundsViewController.m */; }; + 212AC00650E55AC8C5EE5C02 /* PanoramaViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = A9ECA1CA359738BB8B17657F /* PanoramaViewController.m */; }; + 22EB466DA6512BAA95E23367 /* MarkerEventsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = B9450C49DDD49AF9182779EB /* MarkerEventsViewController.m */; }; + 2522616BC4EFE2F27AA3C31D /* step8.png in Resources */ = {isa = PBXBuildFile; fileRef = B7B684AAFC3CA2232721C6D0 /* step8.png */; }; + 2BB7EAB853CF12FF8B728EB0 /* step1@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 6C6A156792608F06437E5931 /* step1@2x.png */; }; + 2BB91ECAAD82A6BD9AA5A31C /* GestureControlViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 71CE23C2A26FD3C29E6AEEA7 /* GestureControlViewController.m */; }; + 2C6A65E1DD60EA63447C3263 /* spitfire.png in Resources */ = {isa = PBXBuildFile; fileRef = 91BCD28A8D5451665C5B3FDE /* spitfire.png */; }; + 2D5C0726D35B29E07C3C45F4 /* step6.png in Resources */ = {isa = PBXBuildFile; fileRef = F64D45825D2647898331A1FF /* step6.png */; }; + 30CE808B1E98D7A20A2AB60E /* aeroplane.png in Resources */ = {isa = PBXBuildFile; fileRef = 937B2FC602E80ADC11CF364F /* aeroplane.png */; }; + 30EA088C289C5AE5A564CB7B /* AnimatedCurrentLocationViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = C37F2216D5D94A3F8B698AF2 /* AnimatedCurrentLocationViewController.m */; }; + 37AA7110FDDEA5425209ADDA /* step5@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = AB708C911CD9B99ADBB07D08 /* step5@2x.png */; }; + 37FEE000C69584FD7194FF6B /* PaddingBehaviorViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3679BC5053A9702AE4FC85B3 /* PaddingBehaviorViewController.m */; }; + 3863ECD2CA69536521AD365E /* VisibleRegionViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = A0518A8C9E543FFBA7F8305E /* VisibleRegionViewController.m */; }; + 3AC5F611874DBEBD37627398 /* MyLocationViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = BF0878372A9A7274B74BCBE0 /* MyLocationViewController.m */; }; + 3ADDFA115AB009524ED62A24 /* step6@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = C0E7585025B57F969D8C3CCD /* step6@2x.png */; }; + 43F1D3292C4928A90E1F2ECC /* voyager.png in Resources */ = {isa = PBXBuildFile; fileRef = 5B3B4C44092471CA56ACFD4C /* voyager.png */; }; + 465832A7B8B8E273B905F029 /* IndoorMuseumNavigationViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1318E0A2BA2A41F2E8759CFE /* IndoorMuseumNavigationViewController.m */; }; + 4921EFA284C51B00D03795C3 /* glow-marker@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 430314741C873551A75A6748 /* glow-marker@2x.png */; }; + 4A2C42ED6FE29D017AE4A947 /* MapZoomViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B3D673FA7036FA5D07CB287 /* MapZoomViewController.m */; }; + 4EEE7F0A05EA0200D46C3158 /* x29.png in Resources */ = {isa = PBXBuildFile; fileRef = 77E4A5AC4E17EB252D617792 /* x29.png */; }; + 4FA6BC3F01C6B9CEDA448E26 /* spitfire@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = B15768E1EE7E314DF1B0A395 /* spitfire@2x.png */; }; + 51E192046D546D886F450F79 /* FixedPanoramaViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = C762E469D796AFF83D3516EF /* FixedPanoramaViewController.m */; }; + 52964EB41C2A98E1B3B67C8D /* track.json in Resources */ = {isa = PBXBuildFile; fileRef = AD6B1AF49A87CC079E9CA862 /* track.json */; }; + 52D6B181D0B7A7439CCDB3D1 /* IndoorViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 8DA013030BC14C994AEA2428 /* IndoorViewController.m */; }; + 53A6B686C7620ACB24603D89 /* CameraViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 09A36E26A0818D4F0DF21051 /* CameraViewController.m */; }; + 5746390C8A605B40841AE0F5 /* australia-large.png in Resources */ = {isa = PBXBuildFile; fileRef = 9F4CB893BCACB294FBCEC850 /* australia-large.png */; }; + 58522D14C5843238B3B684B7 /* mapstyle-retro.json in Resources */ = {isa = PBXBuildFile; fileRef = 118A0FE8CA1D110B3C694A8D /* mapstyle-retro.json */; }; + 5C91A963E5BF4ECDD5ADA417 /* h1@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 16C4B08486C9905568685983 /* h1@2x.png */; }; + 5E4A600A723EAD16564CE99A /* MarkerLayerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = C3E84ED0331DFB2A7082CA36 /* MarkerLayerViewController.m */; }; + 67BB1551A52FE25B519698E7 /* PolylinesViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = FA4145303F340FC3675AABA5 /* PolylinesViewController.m */; }; + 6C605BC471B85B1304719717 /* DoubleMapViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = F8DFCC9D1D1F70D492149D65 /* DoubleMapViewController.m */; }; + 6CCF16F2F014A3E746833201 /* MapTypesViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = F371BFD608DCF4DA1671DB03 /* MapTypesViewController.m */; }; + 6FD2C9C23995654D55280DCC /* MapLayerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3E7BBD64FA078FC4259FCBD2 /* MapLayerViewController.m */; }; + 70C609604B6E16310749BEE1 /* step3.png in Resources */ = {isa = PBXBuildFile; fileRef = 6533FA4161283F8F6A5F2CC3 /* step3.png */; }; + 7130108058B7212F6C7FD1FE /* CustomMarkersViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = DC77B503E93E88F6E254A170 /* CustomMarkersViewController.m */; }; + 78251F0B2F404EDD815FF5C5 /* boat@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 03E00AE555F58259DD31C383 /* boat@2x.png */; }; + 7C990DA60F735AF48D770DC5 /* h1.png in Resources */ = {isa = PBXBuildFile; fileRef = 6B05E27C8BB92E89D2DC78AC /* h1.png */; }; + 7D840080EF0D790EA1F194A8 /* australia.png in Resources */ = {isa = PBXBuildFile; fileRef = 304A2B780A4A9B2D32261355 /* australia.png */; }; + 85D9288290263792177A1F62 /* MarkersViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D4CFDA7D44E2CF33EB10072B /* MarkersViewController.m */; }; + 870CD271BCF4C0A11F72DF98 /* TileLayerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 0CEA86A42848E5BAA7B523FB /* TileLayerViewController.m */; }; + 8BE208DD6AC74D59735122F6 /* newark_nj_1922.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 2B0884C720D5AE0BDCC1903D /* newark_nj_1922.jpg */; }; + 8CD768E0261BFDCCCA116EFC /* step1.png in Resources */ = {isa = PBXBuildFile; fileRef = D66EF243066A58A0D10280D4 /* step1.png */; }; + 8F5472876D59BE14593D0FD2 /* boat.png in Resources */ = {isa = PBXBuildFile; fileRef = 2B049CFC81E59949D0184B8B /* boat.png */; }; + 9201EE4D315D2663EE849ACB /* step4@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 60944672BB9D460BE315ECB8 /* step4@2x.png */; }; + 966D736517085B56D65BFF5A /* StructuredGeocoderViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 2AAFE928C9FDAA1B5703AE31 /* StructuredGeocoderViewController.m */; }; + 98DEEDA226C3C3AFD58A0ED9 /* step2@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 4F955F74654756E7F7DBD9C1 /* step2@2x.png */; }; + A0E8E3B87D9EEC0D785B1DC5 /* FrameRateViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7DB963F858613E50A64CFAE6 /* FrameRateViewController.m */; }; + A182EF7F4411ABF7BF943036 /* StyledMapViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3408578DDDF6D8B183D9B91E /* StyledMapViewController.m */; }; + A335061AB0909CB860ED2D91 /* step2.png in Resources */ = {isa = PBXBuildFile; fileRef = BB85B60A794D982F001E5D1D /* step2.png */; }; + A64080332C06F6DD1B1D8FFD /* DemoAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = C7AD415580B4A6B35532456A /* DemoAppDelegate.m */; }; + A6E90219EA860C586F543A4A /* glow-marker.png in Resources */ = {isa = PBXBuildFile; fileRef = 57D0C4A29B66857C926387F0 /* glow-marker.png */; }; + A7177552BD808915E2D171C6 /* MapsDemoAssets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = B53B4C2097A6AD4A98746495 /* MapsDemoAssets.xcassets */; }; + AB5636020377CA4EEDDD54E2 /* arrow.png in Resources */ = {isa = PBXBuildFile; fileRef = 6614BE28012C7A7508437047 /* arrow.png */; }; + B28BAAE9307E182E27F1971D /* step7.png in Resources */ = {isa = PBXBuildFile; fileRef = 3B0B37F0669CF34418A263F9 /* step7.png */; }; + B94EC3B15FAA49100E840A46 /* step7@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D0E3C8118FBF6DF1D4996693 /* step7@2x.png */; }; + B96B00239590850A49AC33AD /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6F4C119D42CF37317FA0DFA9 /* UIKit.framework */; }; + BCDF7FA5469D1D2344028550 /* SnapshotReadyViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 15E621C7788D69B720052601 /* SnapshotReadyViewController.m */; }; + BE9A04B467C3AEFF9F055139 /* argentina.png in Resources */ = {isa = PBXBuildFile; fileRef = A6B80BDCF78F436799462F76 /* argentina.png */; }; + BEF92FBE50408C13E57D677C /* step4.png in Resources */ = {isa = PBXBuildFile; fileRef = 99C6A64731FB5249BA53255D /* step4.png */; }; + C24E551B4F0F381D7F6E4A67 /* x29@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DD1DD5592D028FDD5E527FDF /* x29@2x.png */; }; + C29A6A1CD63D938B4A8CDCC0 /* botswana.png in Resources */ = {isa = PBXBuildFile; fileRef = 6C186E84CB691DD6239C5E57 /* botswana.png */; }; + C9767A9B1C49EE0C94893D7F /* botswana-large.png in Resources */ = {isa = PBXBuildFile; fileRef = 440513A7769094565EA82DD2 /* botswana-large.png */; }; + CDAFCD46473B6ED74EF20AB8 /* bulgaria-large.png in Resources */ = {isa = PBXBuildFile; fileRef = DA6BF21C0287E5828A770C09 /* bulgaria-large.png */; }; + CEA937D53AEA30A22D2AF43A /* AnimatedUIViewMarkerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 2EB950AA302B77F16CF18088 /* AnimatedUIViewMarkerViewController.m */; }; + D07832F6FE5AD1A2170EFFEC /* GradientPolylinesViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B4378F4DBE15BB0E32690CE /* GradientPolylinesViewController.m */; }; + DDA4B1B496975C801B592AFD /* TrafficMapViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 611E9F57BD5274878732C0BE /* TrafficMapViewController.m */; }; + E2EBC4612218EA7304B27935 /* voyager@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = C56541EDCEFDB922783385B5 /* voyager@2x.png */; }; + EA1C6FDB09359F6A2E98414F /* CustomIndoorViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 5563ED82E4E77A76707DAF12 /* CustomIndoorViewController.m */; }; + EB1E6BF7EC8A504C23509548 /* BasicMapViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = FC5AD93CD72DE8F5B004A621 /* BasicMapViewController.m */; }; + EFB6792DEB7FB555FFB13CB0 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 21267D205F7EC280F26D97ED /* main.m */; }; + F0DB8FF9FBF256B3CB85A8E0 /* mapstyle-night.json in Resources */ = {isa = PBXBuildFile; fileRef = FFEED4DDB04F69C84A1924F1 /* mapstyle-night.json */; }; + F5B169917A264494AF0CF434 /* step5.png in Resources */ = {isa = PBXBuildFile; fileRef = B1763EA929EC73C50D294134 /* step5.png */; }; + FCA2894A159A2C5995A921BC /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = DBB8C9AD891A00824AE32343 /* LaunchScreen.storyboard */; }; + FD207FD6DF50468AD7A901D7 /* PolygonsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 2ED9C84A592EB6464725BB9C /* PolygonsViewController.m */; }; + FEEB324EBD6CD86B7E2F3D23 /* popup_santa@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 5E2E2B19EF6846F007A7A909 /* popup_santa@2x.png */; }; + FF9DA2C517D5682ADD75D0AF /* museum-exhibits.json in Resources */ = {isa = PBXBuildFile; fileRef = 346BE94E21267BA7E00E1B94 /* museum-exhibits.json */; }; + FFB50913C7C92104C44FC4E6 /* step3@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A3AE3B168663EA43D3F2F259 /* step3@2x.png */; }; + FFBC92DCB78E89B548CBEFCB /* bulgaria.png in Resources */ = {isa = PBXBuildFile; fileRef = 2BC67BDB51522BC85EBFED8E /* bulgaria.png */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 02A7C56A409A0CB977458251 /* DemoAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DemoAppDelegate.h; sourceTree = ""; }; + 03E00AE555F58259DD31C383 /* boat@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "boat@2x.png"; sourceTree = ""; }; + 09A36E26A0818D4F0DF21051 /* CameraViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CameraViewController.m; sourceTree = ""; }; + 0C5E03510539F570D757CAEE /* GestureControlViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GestureControlViewController.h; sourceTree = ""; }; + 0CEA86A42848E5BAA7B523FB /* TileLayerViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TileLayerViewController.m; sourceTree = ""; }; + 115963CCE082409262D179F3 /* Samples.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = Samples.m; sourceTree = ""; }; + 118A0FE8CA1D110B3C694A8D /* mapstyle-retro.json */ = {isa = PBXFileReference; lastKnownFileType = text; path = "mapstyle-retro.json"; sourceTree = ""; }; + 1318E0A2BA2A41F2E8759CFE /* IndoorMuseumNavigationViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = IndoorMuseumNavigationViewController.m; sourceTree = ""; }; + 141DC0E7977DE53BB4C0ACE6 /* UIViewController+GMSToastMessages.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "UIViewController+GMSToastMessages.m"; sourceTree = ""; }; + 15E621C7788D69B720052601 /* SnapshotReadyViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SnapshotReadyViewController.m; sourceTree = ""; }; + 15E6F2AA55437CFAC24BCFEE /* MarkerInfoWindowViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MarkerInfoWindowViewController.h; sourceTree = ""; }; + 16C4B08486C9905568685983 /* h1@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "h1@2x.png"; sourceTree = ""; }; + 1B4378F4DBE15BB0E32690CE /* GradientPolylinesViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GradientPolylinesViewController.m; sourceTree = ""; }; + 21267D205F7EC280F26D97ED /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + 281FB700EEAC3323C52CB587 /* AnimatedCurrentLocationViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AnimatedCurrentLocationViewController.h; sourceTree = ""; }; + 2A77C64C5A8B8109E6AFC41F /* GeocoderViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GeocoderViewController.m; sourceTree = ""; }; + 2AAFE928C9FDAA1B5703AE31 /* StructuredGeocoderViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = StructuredGeocoderViewController.m; sourceTree = ""; }; + 2B049CFC81E59949D0184B8B /* boat.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = boat.png; sourceTree = ""; }; + 2B0884C720D5AE0BDCC1903D /* newark_nj_1922.jpg */ = {isa = PBXFileReference; lastKnownFileType = text; path = newark_nj_1922.jpg; sourceTree = ""; }; + 2BC67BDB51522BC85EBFED8E /* bulgaria.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = bulgaria.png; sourceTree = ""; }; + 2D030F81AEB6D3278B8EA303 /* VisibleRegionViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = VisibleRegionViewController.h; sourceTree = ""; }; + 2EB950AA302B77F16CF18088 /* AnimatedUIViewMarkerViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AnimatedUIViewMarkerViewController.m; sourceTree = ""; }; + 2ED9C84A592EB6464725BB9C /* PolygonsViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PolygonsViewController.m; sourceTree = ""; }; + 304A2B780A4A9B2D32261355 /* australia.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = australia.png; sourceTree = ""; }; + 33BC04FF4445AA4649D16101 /* TileLayerViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TileLayerViewController.h; sourceTree = ""; }; + 3408578DDDF6D8B183D9B91E /* StyledMapViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = StyledMapViewController.m; sourceTree = ""; }; + 346BE94E21267BA7E00E1B94 /* museum-exhibits.json */ = {isa = PBXFileReference; lastKnownFileType = text; path = "museum-exhibits.json"; sourceTree = ""; }; + 3679BC5053A9702AE4FC85B3 /* PaddingBehaviorViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PaddingBehaviorViewController.m; sourceTree = ""; }; + 3B0B37F0669CF34418A263F9 /* step7.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = step7.png; sourceTree = ""; }; + 3B3D673FA7036FA5D07CB287 /* MapZoomViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MapZoomViewController.m; sourceTree = ""; }; + 3E7BBD64FA078FC4259FCBD2 /* MapLayerViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MapLayerViewController.m; sourceTree = ""; }; + 3F716156C215C436D55F5696 /* aeroplane@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "aeroplane@2x.png"; sourceTree = ""; }; + 430314741C873551A75A6748 /* glow-marker@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "glow-marker@2x.png"; sourceTree = ""; }; + 440513A7769094565EA82DD2 /* botswana-large.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "botswana-large.png"; sourceTree = ""; }; + 4B436F286FDDDE125BA44AEE /* MapTypesViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MapTypesViewController.h; sourceTree = ""; }; + 4D8E4A10394122CD9C9CD157 /* argentina-large.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "argentina-large.png"; sourceTree = ""; }; + 4F955F74654756E7F7DBD9C1 /* step2@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "step2@2x.png"; sourceTree = ""; }; + 51B3E8FEDF5AFB146C099C21 /* MapLayerViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MapLayerViewController.h; sourceTree = ""; }; + 5563ED82E4E77A76707DAF12 /* CustomIndoorViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CustomIndoorViewController.m; sourceTree = ""; }; + 56200E1874E08933C65BFE11 /* PaddingBehaviorViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PaddingBehaviorViewController.h; sourceTree = ""; }; + 57D0C4A29B66857C926387F0 /* glow-marker.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "glow-marker.png"; sourceTree = ""; }; + 5B3B4C44092471CA56ACFD4C /* voyager.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voyager.png; sourceTree = ""; }; + 5C9035433ADBDA49B4FF973F /* StructuredGeocoderViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = StructuredGeocoderViewController.h; sourceTree = ""; }; + 5E2E2B19EF6846F007A7A909 /* popup_santa@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "popup_santa@2x.png"; sourceTree = ""; }; + 5F34640A0EABB50A24705F03 /* MyLocationViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MyLocationViewController.h; sourceTree = ""; }; + 60944672BB9D460BE315ECB8 /* step4@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "step4@2x.png"; sourceTree = ""; }; + 611E9F57BD5274878732C0BE /* TrafficMapViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TrafficMapViewController.m; sourceTree = ""; }; + 6140C36D94B102F62C26B713 /* IndoorMuseumNavigationViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = IndoorMuseumNavigationViewController.h; sourceTree = ""; }; + 6533FA4161283F8F6A5F2CC3 /* step3.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = step3.png; sourceTree = ""; }; + 658307DB8F671E9CA0B1A2E6 /* GoogleMapsDemos.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = GoogleMapsDemos.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 6614BE28012C7A7508437047 /* arrow.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = arrow.png; sourceTree = ""; }; + 66DE8D273E896D7FF5B86DC9 /* arrow@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "arrow@2x.png"; sourceTree = ""; }; + 6B05E27C8BB92E89D2DC78AC /* h1.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = h1.png; sourceTree = ""; }; + 6C186E84CB691DD6239C5E57 /* botswana.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = botswana.png; sourceTree = ""; }; + 6C6A156792608F06437E5931 /* step1@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "step1@2x.png"; sourceTree = ""; }; + 6F4C119D42CF37317FA0DFA9 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; + 71CE23C2A26FD3C29E6AEEA7 /* GestureControlViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GestureControlViewController.m; sourceTree = ""; }; + 721936633CF79A85B5EF0E92 /* FitBoundsViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FitBoundsViewController.m; sourceTree = ""; }; + 726F8CE865076A20EE4C4408 /* PanoramaViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PanoramaViewController.h; sourceTree = ""; }; + 77E4A5AC4E17EB252D617792 /* x29.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = x29.png; sourceTree = ""; }; + 7BAA2BF38E0B41197BB6CA14 /* GroundOverlayViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GroundOverlayViewController.h; sourceTree = ""; }; + 7DB963F858613E50A64CFAE6 /* FrameRateViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FrameRateViewController.m; sourceTree = ""; }; + 8038AEC0AF9CBD2EBB975F54 /* GroundOverlayViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GroundOverlayViewController.m; sourceTree = ""; }; + 805803DEB0E29A1395C6ABB6 /* TrafficMapViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TrafficMapViewController.h; sourceTree = ""; }; + 8348F1BC33E5DCAAB85BBA43 /* DoubleMapViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DoubleMapViewController.h; sourceTree = ""; }; + 87C50C8E191C32391FCDE143 /* CameraViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CameraViewController.h; sourceTree = ""; }; + 89DFB3350D98DA617A2ECE85 /* MarkerInfoWindowViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MarkerInfoWindowViewController.m; sourceTree = ""; }; + 8BEC50A442A8A75604D7007D /* FixedPanoramaViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FixedPanoramaViewController.h; sourceTree = ""; }; + 8DA013030BC14C994AEA2428 /* IndoorViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = IndoorViewController.m; sourceTree = ""; }; + 90AFC572AAEC55CB23E0EDB4 /* BasicMapViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = BasicMapViewController.h; sourceTree = ""; }; + 91BCD28A8D5451665C5B3FDE /* spitfire.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = spitfire.png; sourceTree = ""; }; + 937B2FC602E80ADC11CF364F /* aeroplane.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = aeroplane.png; sourceTree = ""; }; + 99C6A64731FB5249BA53255D /* step4.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = step4.png; sourceTree = ""; }; + 9F4CB893BCACB294FBCEC850 /* australia-large.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "australia-large.png"; sourceTree = ""; }; + A0518A8C9E543FFBA7F8305E /* VisibleRegionViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = VisibleRegionViewController.m; sourceTree = ""; }; + A1D521E4FF1F8F85E084ED60 /* australia-large@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "australia-large@2x.png"; sourceTree = ""; }; + A3AE3B168663EA43D3F2F259 /* step3@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "step3@2x.png"; sourceTree = ""; }; + A6B80BDCF78F436799462F76 /* argentina.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = argentina.png; sourceTree = ""; }; + A9ECA1CA359738BB8B17657F /* PanoramaViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PanoramaViewController.m; sourceTree = ""; }; + AA7FD859248BB356AA73A407 /* FrameRateViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FrameRateViewController.h; sourceTree = ""; }; + AAB5CC69AA4A14C0B11D0F2B /* MapZoomViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MapZoomViewController.h; sourceTree = ""; }; + AB6D8FD2BBEB798B9D0A33DE /* IndoorViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = IndoorViewController.h; sourceTree = ""; }; + AB708C911CD9B99ADBB07D08 /* step5@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "step5@2x.png"; sourceTree = ""; }; + AD6B1AF49A87CC079E9CA862 /* track.json */ = {isa = PBXFileReference; lastKnownFileType = text; path = track.json; sourceTree = ""; }; + B15768E1EE7E314DF1B0A395 /* spitfire@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "spitfire@2x.png"; sourceTree = ""; }; + B1763EA929EC73C50D294134 /* step5.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = step5.png; sourceTree = ""; }; + B4C89E62C05816B590F45D57 /* mapstyle-silver.json */ = {isa = PBXFileReference; lastKnownFileType = text; path = "mapstyle-silver.json"; sourceTree = ""; }; + B53058D6D185A08DDEF65436 /* Samples.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Samples.h; sourceTree = ""; }; + B53B4C2097A6AD4A98746495 /* MapsDemoAssets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = MapsDemoAssets.xcassets; sourceTree = ""; }; + B7B684AAFC3CA2232721C6D0 /* step8.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = step8.png; sourceTree = ""; }; + B9450C49DDD49AF9182779EB /* MarkerEventsViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MarkerEventsViewController.m; sourceTree = ""; }; + BB653990DAD6FDE28A9E4158 /* FitBoundsViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FitBoundsViewController.h; sourceTree = ""; }; + BB85B60A794D982F001E5D1D /* step2.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = step2.png; sourceTree = ""; }; + BEDC49669DBDA8BE37BFAB29 /* GeocoderViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeocoderViewController.h; sourceTree = ""; }; + BF0878372A9A7274B74BCBE0 /* MyLocationViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MyLocationViewController.m; sourceTree = ""; }; + C0E7585025B57F969D8C3CCD /* step6@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "step6@2x.png"; sourceTree = ""; }; + C37F2216D5D94A3F8B698AF2 /* AnimatedCurrentLocationViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AnimatedCurrentLocationViewController.m; sourceTree = ""; }; + C3E84ED0331DFB2A7082CA36 /* MarkerLayerViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MarkerLayerViewController.m; sourceTree = ""; }; + C4C3F5556675D1A9408F7C5F /* MasterViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MasterViewController.h; sourceTree = ""; }; + C56541EDCEFDB922783385B5 /* voyager@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "voyager@2x.png"; sourceTree = ""; }; + C762E469D796AFF83D3516EF /* FixedPanoramaViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FixedPanoramaViewController.m; sourceTree = ""; }; + C7AD415580B4A6B35532456A /* DemoAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DemoAppDelegate.m; sourceTree = ""; }; + CF8997BED409E528D34BA344 /* PolylinesViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PolylinesViewController.h; sourceTree = ""; }; + D0E3C8118FBF6DF1D4996693 /* step7@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "step7@2x.png"; sourceTree = ""; }; + D30CF0DFCD652D6DF10187D7 /* MarkerLayerViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MarkerLayerViewController.h; sourceTree = ""; }; + D4CFDA7D44E2CF33EB10072B /* MarkersViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MarkersViewController.m; sourceTree = ""; }; + D5E5AF68BBC86BA530755A20 /* step8@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "step8@2x.png"; sourceTree = ""; }; + D66EF243066A58A0D10280D4 /* step1.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = step1.png; sourceTree = ""; }; + D78B4ACC4D102CC9EC32C8A3 /* SnapshotReadyViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SnapshotReadyViewController.h; sourceTree = ""; }; + DA6BF21C0287E5828A770C09 /* bulgaria-large.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "bulgaria-large.png"; sourceTree = ""; }; + DB481265195ED47C9D3588AB /* CustomIndoorViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CustomIndoorViewController.h; sourceTree = ""; }; + DBB8C9AD891A00824AE32343 /* LaunchScreen.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = LaunchScreen.storyboard; sourceTree = ""; }; + DC77B503E93E88F6E254A170 /* CustomMarkersViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CustomMarkersViewController.m; sourceTree = ""; }; + DD1DD5592D028FDD5E527FDF /* x29@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "x29@2x.png"; sourceTree = ""; }; + DD87868F23D05E5CFADEAB4F /* MarkerEventsViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MarkerEventsViewController.h; sourceTree = ""; }; + E40A76286C824B75258FDF5E /* StyledMapViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = StyledMapViewController.h; sourceTree = ""; }; + E4F81E0232539CC089AE8893 /* CustomMarkersViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CustomMarkersViewController.h; sourceTree = ""; }; + E85063B5DC5D93C8875E3EBC /* PolygonsViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PolygonsViewController.h; sourceTree = ""; }; + EE1D504741871952487BB5BE /* MasterViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MasterViewController.m; sourceTree = ""; }; + EF01EFEF0FC77447C02FE86C /* popup_santa.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = popup_santa.png; sourceTree = ""; }; + F371BFD608DCF4DA1671DB03 /* MapTypesViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MapTypesViewController.m; sourceTree = ""; }; + F59393018D5AC385BE80BE57 /* MarkersViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MarkersViewController.h; sourceTree = ""; }; + F63E5BE6BF5B9E3D7AF192E0 /* UIViewController+GMSToastMessages.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "UIViewController+GMSToastMessages.h"; sourceTree = ""; }; + F64D45825D2647898331A1FF /* step6.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = step6.png; sourceTree = ""; }; + F8DFCC9D1D1F70D492149D65 /* DoubleMapViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DoubleMapViewController.m; sourceTree = ""; }; + FA4145303F340FC3675AABA5 /* PolylinesViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PolylinesViewController.m; sourceTree = ""; }; + FAF7CEAC34C5EBC5F05412EC /* GradientPolylinesViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GradientPolylinesViewController.h; sourceTree = ""; }; + FC2C54DF6BAAE16F877D8A66 /* AnimatedUIViewMarkerViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AnimatedUIViewMarkerViewController.h; sourceTree = ""; }; + FC5AD93CD72DE8F5B004A621 /* BasicMapViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = BasicMapViewController.m; sourceTree = ""; }; + FCA64CCA86165B04BDDE0A93 /* SDKDemoAPIKey.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDKDemoAPIKey.h; sourceTree = ""; }; + FFEED4DDB04F69C84A1924F1 /* mapstyle-night.json */ = {isa = PBXFileReference; lastKnownFileType = text; path = "mapstyle-night.json"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 8B9B135C626B0FF8CC12CB4D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + B96B00239590850A49AC33AD /* UIKit.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 1D27564BB990E3F72332953D = { + isa = PBXGroup; + children = ( + 3F84FF5646DF0F79669A6A34 /* Source */, + 89188BA529E9696AD04AD794 /* Frameworks */, + 9C667AD7285A7D36180D29BE /* Products */, + ); + sourceTree = ""; + }; + 3F84FF5646DF0F79669A6A34 /* Source */ = { + isa = PBXGroup; + children = ( + E430A2BC04AE9A99EA6DACA3 /* GoogleMapsDemos */, + ); + name = Source; + sourceTree = ""; + }; + 89188BA529E9696AD04AD794 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 6F4C119D42CF37317FA0DFA9 /* UIKit.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 8AEE26F54DD8496915CC250C /* Museum-Icons */ = { + isa = PBXGroup; + children = ( + 6B05E27C8BB92E89D2DC78AC /* h1.png */, + 16C4B08486C9905568685983 /* h1@2x.png */, + 91BCD28A8D5451665C5B3FDE /* spitfire.png */, + B15768E1EE7E314DF1B0A395 /* spitfire@2x.png */, + 5B3B4C44092471CA56ACFD4C /* voyager.png */, + C56541EDCEFDB922783385B5 /* voyager@2x.png */, + 77E4A5AC4E17EB252D617792 /* x29.png */, + DD1DD5592D028FDD5E527FDF /* x29@2x.png */, + ); + path = "Museum-Icons"; + sourceTree = ""; + }; + 9C667AD7285A7D36180D29BE /* Products */ = { + isa = PBXGroup; + children = ( + 658307DB8F671E9CA0B1A2E6 /* GoogleMapsDemos.app */, + ); + name = Products; + sourceTree = ""; + }; + BB93A9CC7ED94895B527E2F2 /* Samples */ = { + isa = PBXGroup; + children = ( + 281FB700EEAC3323C52CB587 /* AnimatedCurrentLocationViewController.h */, + C37F2216D5D94A3F8B698AF2 /* AnimatedCurrentLocationViewController.m */, + FC2C54DF6BAAE16F877D8A66 /* AnimatedUIViewMarkerViewController.h */, + 2EB950AA302B77F16CF18088 /* AnimatedUIViewMarkerViewController.m */, + 90AFC572AAEC55CB23E0EDB4 /* BasicMapViewController.h */, + FC5AD93CD72DE8F5B004A621 /* BasicMapViewController.m */, + 87C50C8E191C32391FCDE143 /* CameraViewController.h */, + 09A36E26A0818D4F0DF21051 /* CameraViewController.m */, + DB481265195ED47C9D3588AB /* CustomIndoorViewController.h */, + 5563ED82E4E77A76707DAF12 /* CustomIndoorViewController.m */, + E4F81E0232539CC089AE8893 /* CustomMarkersViewController.h */, + DC77B503E93E88F6E254A170 /* CustomMarkersViewController.m */, + 8348F1BC33E5DCAAB85BBA43 /* DoubleMapViewController.h */, + F8DFCC9D1D1F70D492149D65 /* DoubleMapViewController.m */, + BB653990DAD6FDE28A9E4158 /* FitBoundsViewController.h */, + 721936633CF79A85B5EF0E92 /* FitBoundsViewController.m */, + 8BEC50A442A8A75604D7007D /* FixedPanoramaViewController.h */, + C762E469D796AFF83D3516EF /* FixedPanoramaViewController.m */, + AA7FD859248BB356AA73A407 /* FrameRateViewController.h */, + 7DB963F858613E50A64CFAE6 /* FrameRateViewController.m */, + BEDC49669DBDA8BE37BFAB29 /* GeocoderViewController.h */, + 2A77C64C5A8B8109E6AFC41F /* GeocoderViewController.m */, + 0C5E03510539F570D757CAEE /* GestureControlViewController.h */, + 71CE23C2A26FD3C29E6AEEA7 /* GestureControlViewController.m */, + FAF7CEAC34C5EBC5F05412EC /* GradientPolylinesViewController.h */, + 1B4378F4DBE15BB0E32690CE /* GradientPolylinesViewController.m */, + 7BAA2BF38E0B41197BB6CA14 /* GroundOverlayViewController.h */, + 8038AEC0AF9CBD2EBB975F54 /* GroundOverlayViewController.m */, + 6140C36D94B102F62C26B713 /* IndoorMuseumNavigationViewController.h */, + 1318E0A2BA2A41F2E8759CFE /* IndoorMuseumNavigationViewController.m */, + AB6D8FD2BBEB798B9D0A33DE /* IndoorViewController.h */, + 8DA013030BC14C994AEA2428 /* IndoorViewController.m */, + 51B3E8FEDF5AFB146C099C21 /* MapLayerViewController.h */, + 3E7BBD64FA078FC4259FCBD2 /* MapLayerViewController.m */, + 4B436F286FDDDE125BA44AEE /* MapTypesViewController.h */, + F371BFD608DCF4DA1671DB03 /* MapTypesViewController.m */, + AAB5CC69AA4A14C0B11D0F2B /* MapZoomViewController.h */, + 3B3D673FA7036FA5D07CB287 /* MapZoomViewController.m */, + DD87868F23D05E5CFADEAB4F /* MarkerEventsViewController.h */, + B9450C49DDD49AF9182779EB /* MarkerEventsViewController.m */, + 15E6F2AA55437CFAC24BCFEE /* MarkerInfoWindowViewController.h */, + 89DFB3350D98DA617A2ECE85 /* MarkerInfoWindowViewController.m */, + D30CF0DFCD652D6DF10187D7 /* MarkerLayerViewController.h */, + C3E84ED0331DFB2A7082CA36 /* MarkerLayerViewController.m */, + F59393018D5AC385BE80BE57 /* MarkersViewController.h */, + D4CFDA7D44E2CF33EB10072B /* MarkersViewController.m */, + 5F34640A0EABB50A24705F03 /* MyLocationViewController.h */, + BF0878372A9A7274B74BCBE0 /* MyLocationViewController.m */, + 56200E1874E08933C65BFE11 /* PaddingBehaviorViewController.h */, + 3679BC5053A9702AE4FC85B3 /* PaddingBehaviorViewController.m */, + 726F8CE865076A20EE4C4408 /* PanoramaViewController.h */, + A9ECA1CA359738BB8B17657F /* PanoramaViewController.m */, + E85063B5DC5D93C8875E3EBC /* PolygonsViewController.h */, + 2ED9C84A592EB6464725BB9C /* PolygonsViewController.m */, + CF8997BED409E528D34BA344 /* PolylinesViewController.h */, + FA4145303F340FC3675AABA5 /* PolylinesViewController.m */, + B53058D6D185A08DDEF65436 /* Samples.h */, + 115963CCE082409262D179F3 /* Samples.m */, + D78B4ACC4D102CC9EC32C8A3 /* SnapshotReadyViewController.h */, + 15E621C7788D69B720052601 /* SnapshotReadyViewController.m */, + 5C9035433ADBDA49B4FF973F /* StructuredGeocoderViewController.h */, + 2AAFE928C9FDAA1B5703AE31 /* StructuredGeocoderViewController.m */, + E40A76286C824B75258FDF5E /* StyledMapViewController.h */, + 3408578DDDF6D8B183D9B91E /* StyledMapViewController.m */, + 33BC04FF4445AA4649D16101 /* TileLayerViewController.h */, + 0CEA86A42848E5BAA7B523FB /* TileLayerViewController.m */, + 805803DEB0E29A1395C6ABB6 /* TrafficMapViewController.h */, + 611E9F57BD5274878732C0BE /* TrafficMapViewController.m */, + 2D030F81AEB6D3278B8EA303 /* VisibleRegionViewController.h */, + A0518A8C9E543FFBA7F8305E /* VisibleRegionViewController.m */, + ); + path = Samples; + sourceTree = ""; + }; + E430A2BC04AE9A99EA6DACA3 /* GoogleMapsDemos */ = { + isa = PBXGroup; + children = ( + E9C287B2214772B64F89F90B /* Resources */, + BB93A9CC7ED94895B527E2F2 /* Samples */, + 02A7C56A409A0CB977458251 /* DemoAppDelegate.h */, + C7AD415580B4A6B35532456A /* DemoAppDelegate.m */, + B53B4C2097A6AD4A98746495 /* MapsDemoAssets.xcassets */, + C4C3F5556675D1A9408F7C5F /* MasterViewController.h */, + EE1D504741871952487BB5BE /* MasterViewController.m */, + FCA64CCA86165B04BDDE0A93 /* SDKDemoAPIKey.h */, + F63E5BE6BF5B9E3D7AF192E0 /* UIViewController+GMSToastMessages.h */, + 141DC0E7977DE53BB4C0ACE6 /* UIViewController+GMSToastMessages.m */, + 21267D205F7EC280F26D97ED /* main.m */, + ); + path = GoogleMapsDemos; + sourceTree = ""; + }; + E9C287B2214772B64F89F90B /* Resources */ = { + isa = PBXGroup; + children = ( + 8AEE26F54DD8496915CC250C /* Museum-Icons */, + DBB8C9AD891A00824AE32343 /* LaunchScreen.storyboard */, + 937B2FC602E80ADC11CF364F /* aeroplane.png */, + 3F716156C215C436D55F5696 /* aeroplane@2x.png */, + 4D8E4A10394122CD9C9CD157 /* argentina-large.png */, + A6B80BDCF78F436799462F76 /* argentina.png */, + 6614BE28012C7A7508437047 /* arrow.png */, + 66DE8D273E896D7FF5B86DC9 /* arrow@2x.png */, + 9F4CB893BCACB294FBCEC850 /* australia-large.png */, + A1D521E4FF1F8F85E084ED60 /* australia-large@2x.png */, + 304A2B780A4A9B2D32261355 /* australia.png */, + 2B049CFC81E59949D0184B8B /* boat.png */, + 03E00AE555F58259DD31C383 /* boat@2x.png */, + 440513A7769094565EA82DD2 /* botswana-large.png */, + 6C186E84CB691DD6239C5E57 /* botswana.png */, + DA6BF21C0287E5828A770C09 /* bulgaria-large.png */, + 2BC67BDB51522BC85EBFED8E /* bulgaria.png */, + 57D0C4A29B66857C926387F0 /* glow-marker.png */, + 430314741C873551A75A6748 /* glow-marker@2x.png */, + FFEED4DDB04F69C84A1924F1 /* mapstyle-night.json */, + 118A0FE8CA1D110B3C694A8D /* mapstyle-retro.json */, + B4C89E62C05816B590F45D57 /* mapstyle-silver.json */, + 346BE94E21267BA7E00E1B94 /* museum-exhibits.json */, + 2B0884C720D5AE0BDCC1903D /* newark_nj_1922.jpg */, + EF01EFEF0FC77447C02FE86C /* popup_santa.png */, + 5E2E2B19EF6846F007A7A909 /* popup_santa@2x.png */, + D66EF243066A58A0D10280D4 /* step1.png */, + 6C6A156792608F06437E5931 /* step1@2x.png */, + BB85B60A794D982F001E5D1D /* step2.png */, + 4F955F74654756E7F7DBD9C1 /* step2@2x.png */, + 6533FA4161283F8F6A5F2CC3 /* step3.png */, + A3AE3B168663EA43D3F2F259 /* step3@2x.png */, + 99C6A64731FB5249BA53255D /* step4.png */, + 60944672BB9D460BE315ECB8 /* step4@2x.png */, + B1763EA929EC73C50D294134 /* step5.png */, + AB708C911CD9B99ADBB07D08 /* step5@2x.png */, + F64D45825D2647898331A1FF /* step6.png */, + C0E7585025B57F969D8C3CCD /* step6@2x.png */, + 3B0B37F0669CF34418A263F9 /* step7.png */, + D0E3C8118FBF6DF1D4996693 /* step7@2x.png */, + B7B684AAFC3CA2232721C6D0 /* step8.png */, + D5E5AF68BBC86BA530755A20 /* step8@2x.png */, + AD6B1AF49A87CC079E9CA862 /* track.json */, + ); + path = Resources; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + F934453EF090BCCB93E78E83 /* GoogleMapsDemos */ = { + isa = PBXNativeTarget; + buildConfigurationList = 56D55B92E97A2AAB3D261D4A /* Build configuration list for PBXNativeTarget "GoogleMapsDemos" */; + buildPhases = ( + C434996613C0A2FED463783D /* Resources */, + 06DE6F27AD1DD8E5163683B6 /* Sources */, + 8B9B135C626B0FF8CC12CB4D /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = GoogleMapsDemos; + productName = GoogleMapsDemos; + productReference = 658307DB8F671E9CA0B1A2E6 /* GoogleMapsDemos.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + E1E34A01E38954F1DD4BCD39 /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = YES; + }; + buildConfigurationList = 80C3BB6A64A9375104C7ACB9 /* Build configuration list for PBXProject "GoogleMapsDemos" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = en; + hasScannedForEncodings = 1; + knownRegions = ( + en, + ); + mainGroup = 1D27564BB990E3F72332953D; + projectDirPath = ""; + projectRoot = ""; + targets = ( + F934453EF090BCCB93E78E83 /* GoogleMapsDemos */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + C434996613C0A2FED463783D /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 30CE808B1E98D7A20A2AB60E /* aeroplane.png in Resources */, + 0B07C58295A7BE58E96F34A3 /* aeroplane@2x.png in Resources */, + 16717F377D18DD00AA691F18 /* argentina-large.png in Resources */, + BE9A04B467C3AEFF9F055139 /* argentina.png in Resources */, + AB5636020377CA4EEDDD54E2 /* arrow.png in Resources */, + 06A69C6EAF7D7E8FF2197EC3 /* arrow@2x.png in Resources */, + 5746390C8A605B40841AE0F5 /* australia-large.png in Resources */, + 01C8D1488E89B8A200C8582E /* australia-large@2x.png in Resources */, + 7D840080EF0D790EA1F194A8 /* australia.png in Resources */, + 8F5472876D59BE14593D0FD2 /* boat.png in Resources */, + 78251F0B2F404EDD815FF5C5 /* boat@2x.png in Resources */, + C9767A9B1C49EE0C94893D7F /* botswana-large.png in Resources */, + C29A6A1CD63D938B4A8CDCC0 /* botswana.png in Resources */, + CDAFCD46473B6ED74EF20AB8 /* bulgaria-large.png in Resources */, + FFBC92DCB78E89B548CBEFCB /* bulgaria.png in Resources */, + A6E90219EA860C586F543A4A /* glow-marker.png in Resources */, + 4921EFA284C51B00D03795C3 /* glow-marker@2x.png in Resources */, + 7C990DA60F735AF48D770DC5 /* h1.png in Resources */, + 5C91A963E5BF4ECDD5ADA417 /* h1@2x.png in Resources */, + 2C6A65E1DD60EA63447C3263 /* spitfire.png in Resources */, + 4FA6BC3F01C6B9CEDA448E26 /* spitfire@2x.png in Resources */, + 43F1D3292C4928A90E1F2ECC /* voyager.png in Resources */, + E2EBC4612218EA7304B27935 /* voyager@2x.png in Resources */, + 4EEE7F0A05EA0200D46C3158 /* x29.png in Resources */, + C24E551B4F0F381D7F6E4A67 /* x29@2x.png in Resources */, + 16B31F7A9AF98310188109DC /* popup_santa.png in Resources */, + FEEB324EBD6CD86B7E2F3D23 /* popup_santa@2x.png in Resources */, + 8CD768E0261BFDCCCA116EFC /* step1.png in Resources */, + 2BB7EAB853CF12FF8B728EB0 /* step1@2x.png in Resources */, + A335061AB0909CB860ED2D91 /* step2.png in Resources */, + 98DEEDA226C3C3AFD58A0ED9 /* step2@2x.png in Resources */, + 70C609604B6E16310749BEE1 /* step3.png in Resources */, + FFB50913C7C92104C44FC4E6 /* step3@2x.png in Resources */, + BEF92FBE50408C13E57D677C /* step4.png in Resources */, + 9201EE4D315D2663EE849ACB /* step4@2x.png in Resources */, + F5B169917A264494AF0CF434 /* step5.png in Resources */, + 37AA7110FDDEA5425209ADDA /* step5@2x.png in Resources */, + 2D5C0726D35B29E07C3C45F4 /* step6.png in Resources */, + 3ADDFA115AB009524ED62A24 /* step6@2x.png in Resources */, + B28BAAE9307E182E27F1971D /* step7.png in Resources */, + B94EC3B15FAA49100E840A46 /* step7@2x.png in Resources */, + 2522616BC4EFE2F27AA3C31D /* step8.png in Resources */, + 02EC898A205A1E81940406E5 /* step8@2x.png in Resources */, + 8BE208DD6AC74D59735122F6 /* newark_nj_1922.jpg in Resources */, + F0DB8FF9FBF256B3CB85A8E0 /* mapstyle-night.json in Resources */, + 58522D14C5843238B3B684B7 /* mapstyle-retro.json in Resources */, + 023D5C0EB12D723906E5318C /* mapstyle-silver.json in Resources */, + FF9DA2C517D5682ADD75D0AF /* museum-exhibits.json in Resources */, + 52964EB41C2A98E1B3B67C8D /* track.json in Resources */, + FCA2894A159A2C5995A921BC /* LaunchScreen.storyboard in Resources */, + A7177552BD808915E2D171C6 /* MapsDemoAssets.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 06DE6F27AD1DD8E5163683B6 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + A64080332C06F6DD1B1D8FFD /* DemoAppDelegate.m in Sources */, + EFB6792DEB7FB555FFB13CB0 /* main.m in Sources */, + 0D9B023D6E709FAB165A29C9 /* MasterViewController.m in Sources */, + 30EA088C289C5AE5A564CB7B /* AnimatedCurrentLocationViewController.m in Sources */, + CEA937D53AEA30A22D2AF43A /* AnimatedUIViewMarkerViewController.m in Sources */, + EB1E6BF7EC8A504C23509548 /* BasicMapViewController.m in Sources */, + 53A6B686C7620ACB24603D89 /* CameraViewController.m in Sources */, + EA1C6FDB09359F6A2E98414F /* CustomIndoorViewController.m in Sources */, + 7130108058B7212F6C7FD1FE /* CustomMarkersViewController.m in Sources */, + 6C605BC471B85B1304719717 /* DoubleMapViewController.m in Sources */, + 1E38E739DB90F691064AB0A9 /* FitBoundsViewController.m in Sources */, + 51E192046D546D886F450F79 /* FixedPanoramaViewController.m in Sources */, + A0E8E3B87D9EEC0D785B1DC5 /* FrameRateViewController.m in Sources */, + 1511EFFE20A68F00B873A930 /* GeocoderViewController.m in Sources */, + 2BB91ECAAD82A6BD9AA5A31C /* GestureControlViewController.m in Sources */, + D07832F6FE5AD1A2170EFFEC /* GradientPolylinesViewController.m in Sources */, + 0E2E093D159271A7FB585759 /* GroundOverlayViewController.m in Sources */, + 465832A7B8B8E273B905F029 /* IndoorMuseumNavigationViewController.m in Sources */, + 52D6B181D0B7A7439CCDB3D1 /* IndoorViewController.m in Sources */, + 6FD2C9C23995654D55280DCC /* MapLayerViewController.m in Sources */, + 6CCF16F2F014A3E746833201 /* MapTypesViewController.m in Sources */, + 4A2C42ED6FE29D017AE4A947 /* MapZoomViewController.m in Sources */, + 22EB466DA6512BAA95E23367 /* MarkerEventsViewController.m in Sources */, + 162AF3F1216374886C841719 /* MarkerInfoWindowViewController.m in Sources */, + 5E4A600A723EAD16564CE99A /* MarkerLayerViewController.m in Sources */, + 85D9288290263792177A1F62 /* MarkersViewController.m in Sources */, + 3AC5F611874DBEBD37627398 /* MyLocationViewController.m in Sources */, + 37FEE000C69584FD7194FF6B /* PaddingBehaviorViewController.m in Sources */, + 212AC00650E55AC8C5EE5C02 /* PanoramaViewController.m in Sources */, + FD207FD6DF50468AD7A901D7 /* PolygonsViewController.m in Sources */, + 67BB1551A52FE25B519698E7 /* PolylinesViewController.m in Sources */, + 141E2BE7C525DC36CB1FE54F /* Samples.m in Sources */, + BCDF7FA5469D1D2344028550 /* SnapshotReadyViewController.m in Sources */, + 966D736517085B56D65BFF5A /* StructuredGeocoderViewController.m in Sources */, + A182EF7F4411ABF7BF943036 /* StyledMapViewController.m in Sources */, + 870CD271BCF4C0A11F72DF98 /* TileLayerViewController.m in Sources */, + DDA4B1B496975C801B592AFD /* TrafficMapViewController.m in Sources */, + 3863ECD2CA69536521AD365E /* VisibleRegionViewController.m in Sources */, + 19BA16967B625E9962C0EDCC /* UIViewController+GMSToastMessages.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 2723CC697F2C564456B7C001 /* Default */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_OBJC_ARC = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + INFOPLIST_FILE = ./GoogleMapsDemos/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LIBRARY_SEARCH_PATHS = ( + ., + "$(SDKROOT)/System/Library/Frameworks", + ); + PRODUCT_NAME = GoogleMapsDemos; + TARGETED_DEVICE_FAMILY = "1,2"; + USER_HEADER_SEARCH_PATHS = "$(SRCROOT)"; + USE_HEADERMAP = NO; + WRAPPER_PREFIX = ""; + }; + name = Default; + }; + C39588D2DC04B7B9CBE846E5 /* Default */ = { + isa = XCBuildConfiguration; + buildSettings = { + INTERMEDIATE_DIR = "$(PROJECT_DERIVED_FILE_DIR)/$(CONFIGURATION)"; + SDKROOT = iphoneos; + SHARED_INTERMEDIATE_DIR = "$(SYMROOT)/DerivedSources/$(CONFIGURATION)"; + }; + name = Default; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 56D55B92E97A2AAB3D261D4A /* Build configuration list for PBXNativeTarget "GoogleMapsDemos" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 2723CC697F2C564456B7C001 /* Default */, + ); + defaultConfigurationIsVisible = 1; + defaultConfigurationName = Default; + }; + 80C3BB6A64A9375104C7ACB9 /* Build configuration list for PBXProject "GoogleMapsDemos" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + C39588D2DC04B7B9CBE846E5 /* Default */, + ); + defaultConfigurationIsVisible = 1; + defaultConfigurationName = Default; + }; +/* End XCConfigurationList section */ + }; + rootObject = E1E34A01E38954F1DD4BCD39 /* Project object */; +} diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/DemoAppDelegate.h b/Pods/GoogleMaps/Example/GoogleMapsDemos/DemoAppDelegate.h new file mode 100755 index 0000000..4a51db5 --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/DemoAppDelegate.h @@ -0,0 +1,32 @@ +/* + * Copyright 2016 Google LLC. All rights reserved. + * + * + * 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. + */ + +#import + +@interface DemoAppDelegate : UIResponder < + UIApplicationDelegate, + UISplitViewControllerDelegate> + +@property(nonatomic) UIWindow *window; +@property(nonatomic) UINavigationController *navigationController; +@property(nonatomic) UISplitViewController *splitViewController; + +/** + * If the device is an iPad, this property controls the sample displayed in the + * right side of its split view controller. + */ +@property(nonatomic) UIViewController *sample; + +@end diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/DemoAppDelegate.m b/Pods/GoogleMaps/Example/GoogleMapsDemos/DemoAppDelegate.m new file mode 100755 index 0000000..0366000 --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/DemoAppDelegate.m @@ -0,0 +1,113 @@ +/* + * Copyright 2016 Google LLC. All rights reserved. + * + * + * 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. + */ + +#import "GoogleMapsDemos/DemoAppDelegate.h" + +#import "GoogleMapsDemos/MasterViewController.h" +#import "GoogleMapsDemos/SDKDemoAPIKey.h" +#import + +@implementation DemoAppDelegate { + id _services; +} + +@synthesize window = _window; + +- (BOOL)application:(UIApplication *)application + didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { + NSLog(@"Build version: %s", __VERSION__); + + if (kAPIKey.length == 0) { + // Blow up if APIKey has not yet been set. + NSString *bundleId = [[NSBundle mainBundle] bundleIdentifier]; + NSString *format = @"Configure APIKey inside SDKDemoAPIKey.h for your " + @"bundle `%@`, see README.GoogleMapsDemos for more information"; + @throw [NSException exceptionWithName:@"DemoAppDelegate" + reason:[NSString stringWithFormat:format, bundleId] + userInfo:nil]; + } + [GMSServices provideAPIKey:kAPIKey]; + _services = [GMSServices sharedServices]; + + // Log the required open source licenses! Yes, just NSLog-ing them is not enough but is good for + // a demo. + NSLog(@"Open source licenses:\n%@", [GMSServices openSourceLicenseInfo]); + + self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; + MasterViewController *master = [[MasterViewController alloc] init]; + master.appDelegate = self; + + if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) { + // This is an iPhone; configure the top-level navigation controller as the + // rootViewController, which contains the 'master' list of samples. + self.navigationController = + [[UINavigationController alloc] initWithRootViewController:master]; + + // Force non-translucent navigation bar for consistency of demo between + // iOS 6 and iOS 7. + self.navigationController.navigationBar.translucent = NO; + + self.window.rootViewController = self.navigationController; + } else { + // This is an iPad; configure a split-view controller that contains the + // the 'master' list of samples on the left side, and the current displayed + // sample on the right (begins empty). + UINavigationController *masterNavigationController = + [[UINavigationController alloc] initWithRootViewController:master]; + + UIViewController *empty = [[UIViewController alloc] init]; + UINavigationController *detailNavigationController = + [[UINavigationController alloc] initWithRootViewController:empty]; + + // Force non-translucent navigation bar for consistency of demo between + // iOS 6 and iOS 7. + detailNavigationController.navigationBar.translucent = NO; + + self.splitViewController = [[UISplitViewController alloc] init]; + self.splitViewController.delegate = master; + self.splitViewController.viewControllers = + @[masterNavigationController, detailNavigationController]; + self.splitViewController.presentsWithGesture = NO; + + self.window.rootViewController = self.splitViewController; + } + + [self.window makeKeyAndVisible]; + return YES; +} + +- (void)setSample:(UIViewController *)sample { + NSAssert([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad, + @"Expected device to be iPad inside setSample:"); + + // Finds the UINavigationController in the right side of the sample, and + // replace its displayed controller with the new sample. + UINavigationController *nav = + [self.splitViewController.viewControllers objectAtIndex:1]; + [nav setViewControllers:[NSArray arrayWithObject:sample] animated:NO]; +} + +- (UIViewController *)sample { + NSAssert([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad, + @"Expected device to be iPad inside sample"); + + // The current sample is the top-most VC in the right-hand pane of the + // splitViewController. + UINavigationController *nav = + [self.splitViewController.viewControllers objectAtIndex:1]; + return [[nav viewControllers] objectAtIndex:0]; +} + +@end diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Info.plist b/Pods/GoogleMaps/Example/GoogleMapsDemos/Info.plist new file mode 100755 index 0000000..d5172fe --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Info.plist @@ -0,0 +1,49 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleDisplayName + ${PRODUCT_NAME} + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + com.example.GoogleMapsDemos + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1.0 + LSRequiresIPhoneOS + + NSLocationWhenInUseUsageDescription + Show your location on the map + UILaunchStoryboardName + LaunchScreen + UIRequiredDeviceCapabilities + + armv7 + + UIStatusBarHidden + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/MapsDemoAssets.xcassets/AppIcon.appiconset/Contents.json b/Pods/GoogleMaps/Example/GoogleMapsDemos/MapsDemoAssets.xcassets/AppIcon.appiconset/Contents.json new file mode 100755 index 0000000..5fce6cf --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/MapsDemoAssets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,98 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "3x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Maps-SDK-Demo-App_120.png", + "scale" : "2x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Maps-SDK-Demo-App_180.png", + "scale" : "3x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "2x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Maps-SDK-Demo-App_76.png", + "scale" : "1x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Maps-SDK-Demo-App_152.png", + "scale" : "2x" + }, + { + "size" : "83.5x83.5", + "idiom" : "ipad", + "filename" : "Maps-SDK-Demo-App_167.png", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/MapsDemoAssets.xcassets/AppIcon.appiconset/Maps-SDK-Demo-App_120.png b/Pods/GoogleMaps/Example/GoogleMapsDemos/MapsDemoAssets.xcassets/AppIcon.appiconset/Maps-SDK-Demo-App_120.png new file mode 100755 index 0000000..46d9c3f Binary files /dev/null and b/Pods/GoogleMaps/Example/GoogleMapsDemos/MapsDemoAssets.xcassets/AppIcon.appiconset/Maps-SDK-Demo-App_120.png differ diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/MapsDemoAssets.xcassets/AppIcon.appiconset/Maps-SDK-Demo-App_152.png b/Pods/GoogleMaps/Example/GoogleMapsDemos/MapsDemoAssets.xcassets/AppIcon.appiconset/Maps-SDK-Demo-App_152.png new file mode 100755 index 0000000..237bba1 Binary files /dev/null and b/Pods/GoogleMaps/Example/GoogleMapsDemos/MapsDemoAssets.xcassets/AppIcon.appiconset/Maps-SDK-Demo-App_152.png differ diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/MapsDemoAssets.xcassets/AppIcon.appiconset/Maps-SDK-Demo-App_167.png b/Pods/GoogleMaps/Example/GoogleMapsDemos/MapsDemoAssets.xcassets/AppIcon.appiconset/Maps-SDK-Demo-App_167.png new file mode 100755 index 0000000..8bee0dd Binary files /dev/null and b/Pods/GoogleMaps/Example/GoogleMapsDemos/MapsDemoAssets.xcassets/AppIcon.appiconset/Maps-SDK-Demo-App_167.png differ diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/MapsDemoAssets.xcassets/AppIcon.appiconset/Maps-SDK-Demo-App_180.png b/Pods/GoogleMaps/Example/GoogleMapsDemos/MapsDemoAssets.xcassets/AppIcon.appiconset/Maps-SDK-Demo-App_180.png new file mode 100755 index 0000000..0299a1d Binary files /dev/null and b/Pods/GoogleMaps/Example/GoogleMapsDemos/MapsDemoAssets.xcassets/AppIcon.appiconset/Maps-SDK-Demo-App_180.png differ diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/MapsDemoAssets.xcassets/AppIcon.appiconset/Maps-SDK-Demo-App_76.png b/Pods/GoogleMaps/Example/GoogleMapsDemos/MapsDemoAssets.xcassets/AppIcon.appiconset/Maps-SDK-Demo-App_76.png new file mode 100755 index 0000000..db89154 Binary files /dev/null and b/Pods/GoogleMaps/Example/GoogleMapsDemos/MapsDemoAssets.xcassets/AppIcon.appiconset/Maps-SDK-Demo-App_76.png differ diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/MapsDemoAssets.xcassets/Contents.json b/Pods/GoogleMaps/Example/GoogleMapsDemos/MapsDemoAssets.xcassets/Contents.json new file mode 100755 index 0000000..da4a164 --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/MapsDemoAssets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/MasterViewController.h b/Pods/GoogleMaps/Example/GoogleMapsDemos/MasterViewController.h new file mode 100755 index 0000000..68a8fbe --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/MasterViewController.h @@ -0,0 +1,27 @@ +/* + * Copyright 2016 Google LLC. All rights reserved. + * + * + * 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. + */ + +#import + +@class DemoAppDelegate; + +@interface MasterViewController : UITableViewController < + UISplitViewControllerDelegate, + UITableViewDataSource, + UITableViewDelegate> + +@property(nonatomic, weak) DemoAppDelegate *appDelegate; + +@end diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/MasterViewController.m b/Pods/GoogleMaps/Example/GoogleMapsDemos/MasterViewController.m new file mode 100755 index 0000000..02fe812 --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/MasterViewController.m @@ -0,0 +1,160 @@ +/* + * Copyright 2016 Google LLC. All rights reserved. + * + * + * 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. + */ + +#import "GoogleMapsDemos/MasterViewController.h" + +#import "GoogleMapsDemos/DemoAppDelegate.h" +#import "GoogleMapsDemos/Samples/Samples.h" +#import + + +@implementation MasterViewController { + NSArray *_demos; + NSArray *_demoSections; + BOOL _isPhone; + UIPopoverController *_popover; + UIBarButtonItem *_samplesButton; + __weak UIViewController *_controller; + CLLocationManager *_locationManager; +} + +- (void)viewDidLoad { + [super viewDidLoad]; + + _isPhone = [[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone; + + if (!_isPhone) { + self.clearsSelectionOnViewWillAppear = NO; + } else { + UIBarButtonItem *backButton = + [[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"Back", @"Back") + style:UIBarButtonItemStylePlain + target:nil + action:nil]; + [self.navigationItem setBackBarButtonItem:backButton]; + } + + self.title = NSLocalizedString(@"Maps SDK Demos", @"Maps SDK Demos"); + self.title = [NSString stringWithFormat:@"%@: %@", self.title, [GMSServices SDKLongVersion]]; + + self.tableView.autoresizingMask = + UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth; + self.tableView.delegate = self; + self.tableView.dataSource = self; + + _demoSections = [Samples loadSections]; + _demos = [Samples loadDemos]; + + if (!_isPhone) { + [self loadDemo:0 atIndex:0]; + } +} + +#pragma mark - UITableViewController + +- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { + return _demoSections.count; +} + +- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { + return 35.0; +} + +- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { + return [_demoSections objectAtIndex:section]; +} + +- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { + NSArray *demosInSection = [_demos objectAtIndex:section]; + return demosInSection.count; +} + +- (UITableViewCell *)tableView:(UITableView *)tableView + cellForRowAtIndexPath:(NSIndexPath *)indexPath { + static NSString *cellIdentifier = @"Cell"; + UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; + if (cell == nil) { + cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle + reuseIdentifier:cellIdentifier]; + + if (_isPhone) { + [cell setAccessoryType:UITableViewCellAccessoryDisclosureIndicator]; + } + } + + NSDictionary *demo = [[_demos objectAtIndex:indexPath.section] objectAtIndex:indexPath.row]; + cell.textLabel.text = [demo objectForKey:@"title"]; + cell.detailTextLabel.text = [demo objectForKey:@"description"]; + + return cell; +} + +- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { + // The user has chosen a sample; load it and clear the selection! + [self loadDemo:indexPath.section atIndex:indexPath.row]; + [tableView deselectRowAtIndexPath:indexPath animated:YES]; +} + +#pragma mark - Split view + +- (void)splitViewController:(UISplitViewController *)splitController + willHideViewController:(UIViewController *)viewController + withBarButtonItem:(UIBarButtonItem *)barButtonItem + forPopoverController:(UIPopoverController *)popoverController { + _popover = popoverController; + _samplesButton = barButtonItem; + _samplesButton.title = NSLocalizedString(@"Samples", @"Samples"); + _samplesButton.style = UIBarButtonItemStyleDone; + [self updateSamplesButton]; +} + +- (void)splitViewController:(UISplitViewController *)splitController + willShowViewController:(UIViewController *)viewController + invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem { + _popover = nil; + _samplesButton = nil; + [self updateSamplesButton]; +} + +#pragma mark - Private methods + +- (void)loadDemo:(NSUInteger)section atIndex:(NSUInteger)index { + NSDictionary *demo = [[_demos objectAtIndex:section] objectAtIndex:index]; + UIViewController *controller = [[[demo objectForKey:@"controller"] alloc] init]; + _controller = controller; + + if (controller != nil) { + controller.title = [demo objectForKey:@"title"]; + + if (_isPhone) { + [self.navigationController pushViewController:controller animated:YES]; + } else { + [self.appDelegate setSample:controller]; + [_popover dismissPopoverAnimated:YES]; + } + + [self updateSamplesButton]; + } +} + +// This method is invoked when the left 'back' button in the split view +// controller on iPad should be updated (either made visible or hidden). +// It assumes that the left bar button item may be safely modified to contain +// the samples button. +- (void)updateSamplesButton { + _controller.navigationItem.leftBarButtonItem = _samplesButton; +} + +@end diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/LaunchScreen.storyboard b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/LaunchScreen.storyboard new file mode 100755 index 0000000..8c740c7 --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/LaunchScreen.storyboard @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/Museum-Icons/h1.png b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/Museum-Icons/h1.png new file mode 100755 index 0000000..fff8197 Binary files /dev/null and b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/Museum-Icons/h1.png differ diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/Museum-Icons/h1@2x.png b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/Museum-Icons/h1@2x.png new file mode 100755 index 0000000..ce36c63 Binary files /dev/null and b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/Museum-Icons/h1@2x.png differ diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/Museum-Icons/spitfire.png b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/Museum-Icons/spitfire.png new file mode 100755 index 0000000..5c76dc9 Binary files /dev/null and b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/Museum-Icons/spitfire.png differ diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/Museum-Icons/spitfire@2x.png b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/Museum-Icons/spitfire@2x.png new file mode 100755 index 0000000..a09b75c Binary files /dev/null and b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/Museum-Icons/spitfire@2x.png differ diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/Museum-Icons/voyager.png b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/Museum-Icons/voyager.png new file mode 100755 index 0000000..d657f22 Binary files /dev/null and b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/Museum-Icons/voyager.png differ diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/Museum-Icons/voyager@2x.png b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/Museum-Icons/voyager@2x.png new file mode 100755 index 0000000..b2a668e Binary files /dev/null and b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/Museum-Icons/voyager@2x.png differ diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/Museum-Icons/x29.png b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/Museum-Icons/x29.png new file mode 100755 index 0000000..0edd3f1 Binary files /dev/null and b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/Museum-Icons/x29.png differ diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/Museum-Icons/x29@2x.png b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/Museum-Icons/x29@2x.png new file mode 100755 index 0000000..eda3d15 Binary files /dev/null and b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/Museum-Icons/x29@2x.png differ diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/aeroplane.png b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/aeroplane.png new file mode 100755 index 0000000..5114ee4 Binary files /dev/null and b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/aeroplane.png differ diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/aeroplane@2x.png b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/aeroplane@2x.png new file mode 100755 index 0000000..5c5012c Binary files /dev/null and b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/aeroplane@2x.png differ diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/ar.lproj/InfoPlist.strings b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/ar.lproj/InfoPlist.strings new file mode 100755 index 0000000..477b28f --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/ar.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/argentina-large.png b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/argentina-large.png new file mode 100755 index 0000000..b75247c Binary files /dev/null and b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/argentina-large.png differ diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/argentina.png b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/argentina.png new file mode 100755 index 0000000..9095376 Binary files /dev/null and b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/argentina.png differ diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/arrow.png b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/arrow.png new file mode 100755 index 0000000..8d8c3f7 Binary files /dev/null and b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/arrow.png differ diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/arrow@2x.png b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/arrow@2x.png new file mode 100755 index 0000000..4b0ff7c Binary files /dev/null and b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/arrow@2x.png differ diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/australia-large.png b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/australia-large.png new file mode 100755 index 0000000..787aed5 Binary files /dev/null and b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/australia-large.png differ diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/australia-large@2x.png b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/australia-large@2x.png new file mode 100755 index 0000000..15d4d2a Binary files /dev/null and b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/australia-large@2x.png differ diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/australia.png b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/australia.png new file mode 100755 index 0000000..12afbb9 Binary files /dev/null and b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/australia.png differ diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/boat.png b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/boat.png new file mode 100755 index 0000000..67221da Binary files /dev/null and b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/boat.png differ diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/boat@2x.png b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/boat@2x.png new file mode 100755 index 0000000..3f316d3 Binary files /dev/null and b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/boat@2x.png differ diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/botswana-large.png b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/botswana-large.png new file mode 100755 index 0000000..c150491 Binary files /dev/null and b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/botswana-large.png differ diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/botswana.png b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/botswana.png new file mode 100755 index 0000000..a006d99 Binary files /dev/null and b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/botswana.png differ diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/bulgaria-large.png b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/bulgaria-large.png new file mode 100755 index 0000000..0107da0 Binary files /dev/null and b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/bulgaria-large.png differ diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/bulgaria.png b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/bulgaria.png new file mode 100755 index 0000000..04cdb29 Binary files /dev/null and b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/bulgaria.png differ diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/ca.lproj/InfoPlist.strings b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/ca.lproj/InfoPlist.strings new file mode 100755 index 0000000..477b28f --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/ca.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/cs.lproj/InfoPlist.strings b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/cs.lproj/InfoPlist.strings new file mode 100755 index 0000000..477b28f --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/cs.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/da.lproj/InfoPlist.strings b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/da.lproj/InfoPlist.strings new file mode 100755 index 0000000..477b28f --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/da.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/de.lproj/InfoPlist.strings b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/de.lproj/InfoPlist.strings new file mode 100755 index 0000000..477b28f --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/de.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/el.lproj/InfoPlist.strings b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/el.lproj/InfoPlist.strings new file mode 100755 index 0000000..477b28f --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/el.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/en.lproj/InfoPlist.strings b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/en.lproj/InfoPlist.strings new file mode 100755 index 0000000..477b28f --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/en.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/en_GB.lproj/InfoPlist.strings b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/en_GB.lproj/InfoPlist.strings new file mode 100755 index 0000000..477b28f --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/en_GB.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/es.lproj/InfoPlist.strings b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/es.lproj/InfoPlist.strings new file mode 100755 index 0000000..477b28f --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/es.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/fi.lproj/InfoPlist.strings b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/fi.lproj/InfoPlist.strings new file mode 100755 index 0000000..477b28f --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/fi.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/fr.lproj/InfoPlist.strings b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/fr.lproj/InfoPlist.strings new file mode 100755 index 0000000..477b28f --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/fr.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/glow-marker.png b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/glow-marker.png new file mode 100755 index 0000000..eb0f596 Binary files /dev/null and b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/glow-marker.png differ diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/glow-marker@2x.png b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/glow-marker@2x.png new file mode 100755 index 0000000..e415c3f Binary files /dev/null and b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/glow-marker@2x.png differ diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/he.lproj/InfoPlist.strings b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/he.lproj/InfoPlist.strings new file mode 100755 index 0000000..477b28f --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/he.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/hr.lproj/InfoPlist.strings b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/hr.lproj/InfoPlist.strings new file mode 100755 index 0000000..477b28f --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/hr.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/hu.lproj/InfoPlist.strings b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/hu.lproj/InfoPlist.strings new file mode 100755 index 0000000..477b28f --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/hu.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/id.lproj/InfoPlist.strings b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/id.lproj/InfoPlist.strings new file mode 100755 index 0000000..477b28f --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/id.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/it.lproj/InfoPlist.strings b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/it.lproj/InfoPlist.strings new file mode 100755 index 0000000..477b28f --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/it.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/ja.lproj/InfoPlist.strings b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/ja.lproj/InfoPlist.strings new file mode 100755 index 0000000..477b28f --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/ja.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/ko.lproj/InfoPlist.strings b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/ko.lproj/InfoPlist.strings new file mode 100755 index 0000000..477b28f --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/ko.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/mapstyle-night.json b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/mapstyle-night.json new file mode 100755 index 0000000..1cbd616 --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/mapstyle-night.json @@ -0,0 +1,191 @@ +[ + { + "featureType": "all", + "elementType": "geometry", + "stylers": [ + { + "color": "#242f3e" + } + ] + }, + { + "featureType": "all", + "elementType": "labels.text.stroke", + "stylers": [ + { + "lightness": -80 + } + ] + }, + { + "featureType": "administrative", + "elementType": "labels.text.fill", + "stylers": [ + { + "color": "#746855" + } + ] + }, + { + "featureType": "administrative.locality", + "elementType": "labels.text.fill", + "stylers": [ + { + "color": "#d59563" + } + ] + }, + { + "featureType": "poi", + "elementType": "labels.text.fill", + "stylers": [ + { + "color": "#d59563" + } + ] + }, + { + "featureType": "poi.park", + "elementType": "geometry", + "stylers": [ + { + "color": "#263c3f" + } + ] + }, + { + "featureType": "poi.park", + "elementType": "labels.text.fill", + "stylers": [ + { + "color": "#6b9a76" + } + ] + }, + { + "featureType": "road", + "elementType": "geometry.fill", + "stylers": [ + { + "color": "#2b3544" + } + ] + }, + { + "featureType": "road", + "elementType": "labels.text.fill", + "stylers": [ + { + "color": "#9ca5b3" + } + ] + }, + { + "featureType": "road.arterial", + "elementType": "geometry.fill", + "stylers": [ + { + "color": "#38414e" + } + ] + }, + { + "featureType": "road.arterial", + "elementType": "geometry.stroke", + "stylers": [ + { + "color": "#212a37" + } + ] + }, + { + "featureType": "road.highway", + "elementType": "geometry.fill", + "stylers": [ + { + "color": "#746855" + } + ] + }, + { + "featureType": "road.highway", + "elementType": "geometry.stroke", + "stylers": [ + { + "color": "#1f2835" + } + ] + }, + { + "featureType": "road.highway", + "elementType": "labels.text.fill", + "stylers": [ + { + "color": "#f3d19c" + } + ] + }, + { + "featureType": "road.local", + "elementType": "geometry.fill", + "stylers": [ + { + "color": "#38414e" + } + ] + }, + { + "featureType": "road.local", + "elementType": "geometry.stroke", + "stylers": [ + { + "color": "#212a37" + } + ] + }, + { + "featureType": "transit", + "elementType": "geometry", + "stylers": [ + { + "color": "#2f3948" + } + ] + }, + { + "featureType": "transit.station", + "elementType": "labels.text.fill", + "stylers": [ + { + "color": "#d59563" + } + ] + }, + { + "featureType": "water", + "elementType": "geometry", + "stylers": [ + { + "color": "#17263c" + } + ] + }, + { + "featureType": "water", + "elementType": "labels.text.fill", + "stylers": [ + { + "color": "#515c6d" + } + ] + }, + { + "featureType": "water", + "elementType": "labels.text.stroke", + "stylers": [ + { + "lightness": -20 + } + ] + } +] diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/mapstyle-retro.json b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/mapstyle-retro.json new file mode 100755 index 0000000..f6a16e8 --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/mapstyle-retro.json @@ -0,0 +1,191 @@ +[ + { + "featureType": "all", + "elementType": "labels.text.fill", + "stylers": [ + { + "color": "#755f5d" + } + ] + }, + { + "featureType": "administrative", + "elementType": "geometry.fill", + "stylers": [ + { + "color": "#d4ccb9" + } + ] + }, + { + "featureType": "administrative.country", + "elementType": "geometry.stroke", + "stylers": [ + { + "color": "#baafae" + } + ] + }, + { + "featureType": "administrative.land_parcel", + "elementType": "geometry.stroke", + "stylers": [ + { + "color": "#d4ccb9" + } + ] + }, + { + "featureType": "landscape.man_made", + "elementType": "geometry.fill", + "stylers": [ + { + "color": "#ebe3cd" + } + ] + }, + { + "featureType": "landscape.natural", + "elementType": "geometry", + "stylers": [ + { + "color": "#ebe3cd" + } + ] + }, + { + "featureType": "landscape.natural", + "elementType": "geometry.fill", + "stylers": [ + { + "lightness": -10 + } + ] + }, + { + "featureType": "poi", + "elementType": "geometry.fill", + "stylers": [ + { + "color": "#d4ccb9" + } + ] + }, + { + "featureType": "poi", + "elementType": "labels.icon", + "stylers": [ + { + "hue": "#ff7f00" + } + ] + }, + { + "featureType": "poi.park", + "elementType": "geometry.fill", + "stylers": [ + { + "color": "#9ba56f" + } + ] + }, + { + "featureType": "road", + "elementType": "geometry.fill", + "stylers": [ + { + "color": "#f5f1e6" + } + ] + }, + { + "featureType": "road", + "elementType": "geometry.stroke", + "stylers": [ + { + "color": "#dfd8c3" + } + ] + }, + { + "featureType": "road.arterial", + "elementType": "geometry.fill", + "stylers": [ + { + "color": "#fdfcf8" + } + ] + }, + { + "featureType": "road.arterial", + "elementType": "geometry.stroke", + "stylers": [ + { + "color": "#e4e3df" + } + ] + }, + { + "featureType": "road.highway", + "elementType": "geometry.fill", + "stylers": [ + { + "color": "#f2cb77" + } + ] + }, + { + "featureType": "road.highway", + "elementType": "geometry.stroke", + "stylers": [ + { + "color": "#ecb43d" + } + ] + }, + { + "featureType": "road.highway.controlled_access", + "elementType": "geometry.fill", + "stylers": [ + { + "color": "#e98d58" + } + ] + }, + { + "featureType": "road.highway.controlled_access", + "elementType": "geometry.stroke", + "stylers": [ + { + "color": "#d27f4f" + } + ] + }, + { + "featureType": "transit.line", + "elementType": "geometry", + "stylers": [ + { + "color": "#d4ccb9" + } + ] + }, + { + "featureType": "transit.station.airport", + "elementType": "geometry.fill", + "stylers": [ + { + "color": "#d4ccb9" + } + ] + }, + { + "featureType": "water", + "elementType": "geometry.fill", + "stylers": [ + { + "color": "#b9d3c2" + } + ] + } +] diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/mapstyle-silver.json b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/mapstyle-silver.json new file mode 100755 index 0000000..340e5d6 --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/mapstyle-silver.json @@ -0,0 +1,101 @@ +[ + { + "featureType": "all", + "elementType": "geometry", + "stylers": [ + { + "color": "#f5f5f5" + } + ] + }, + { + "featureType": "all", + "elementType": "labels.icon", + "stylers": [ + { + "saturation": -100 + } + ] + }, + { + "featureType": "all", + "elementType": "labels.text", + "stylers": [ + { + "saturation": -100 + } + ] + }, + { + "featureType": "poi", + "elementType": "geometry", + "stylers": [ + { + "color": "#eeeeee" + } + ] + }, + { + "featureType": "poi.park", + "elementType": "geometry", + "stylers": [ + { + "color": "#e5e5e5" + } + ] + }, + { + "featureType": "road", + "elementType": "geometry", + "stylers": [ + { + "color": "#ffffff" + } + ] + }, + { + "featureType": "road.highway", + "elementType": "geometry", + "stylers": [ + { + "color": "#dadada" + } + ] + }, + { + "featureType": "road.highway", + "elementType": "labels.icon", + "stylers": [ + { + "lightness": 30 + } + ] + }, + { + "featureType": "transit.line", + "elementType": "geometry", + "stylers": [ + { + "color": "#e5e5e5" + } + ] + }, + { + "featureType": "transit.station", + "elementType": "geometry", + "stylers": [ + { + "color": "#eeeeee" + } + ] + }, + { + "featureType": "water", + "elementType": "geometry", + "stylers": [ + { + "color": "#c9c9c9" + } + ] + } +] diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/ms.lproj/InfoPlist.strings b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/ms.lproj/InfoPlist.strings new file mode 100755 index 0000000..477b28f --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/ms.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/museum-exhibits.json b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/museum-exhibits.json new file mode 100755 index 0000000..25b0a5d --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/museum-exhibits.json @@ -0,0 +1,30 @@ +[ + { + "key": "h1", + "name": "Hughes H-1", + "lat": 38.8879, + "lng": -77.02085, + "level": "1" + }, + { + "key": "voyager", + "name": "Rutan Voyager", + "lat": 38.8880, + "lng": -77.0199, + "level": "1" + }, + { + "key": "spitfire", + "name": "Supermarine Spitfire", + "lat": 38.8879, + "lng": -77.0208, + "level": "2" + }, + { + "key": "x29", + "name": "Grumman X-29", + "lat": 38.88845, + "lng": -77.01875, + "level": "2" + } +] diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/nb.lproj/InfoPlist.strings b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/nb.lproj/InfoPlist.strings new file mode 100755 index 0000000..477b28f --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/nb.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/newark_nj_1922.jpg b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/newark_nj_1922.jpg new file mode 100755 index 0000000..1f4ae59 Binary files /dev/null and b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/newark_nj_1922.jpg differ diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/nl.lproj/InfoPlist.strings b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/nl.lproj/InfoPlist.strings new file mode 100755 index 0000000..477b28f --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/nl.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/pl.lproj/InfoPlist.strings b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/pl.lproj/InfoPlist.strings new file mode 100755 index 0000000..477b28f --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/pl.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/popup_santa.png b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/popup_santa.png new file mode 100755 index 0000000..f2968ef Binary files /dev/null and b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/popup_santa.png differ diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/popup_santa@2x.png b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/popup_santa@2x.png new file mode 100755 index 0000000..3f90828 Binary files /dev/null and b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/popup_santa@2x.png differ diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/pt.lproj/InfoPlist.strings b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/pt.lproj/InfoPlist.strings new file mode 100755 index 0000000..477b28f --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/pt.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/pt_PT.lproj/InfoPlist.strings b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/pt_PT.lproj/InfoPlist.strings new file mode 100755 index 0000000..477b28f --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/pt_PT.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/ro.lproj/InfoPlist.strings b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/ro.lproj/InfoPlist.strings new file mode 100755 index 0000000..477b28f --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/ro.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/ru.lproj/InfoPlist.strings b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/ru.lproj/InfoPlist.strings new file mode 100755 index 0000000..477b28f --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/ru.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/sk.lproj/InfoPlist.strings b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/sk.lproj/InfoPlist.strings new file mode 100755 index 0000000..477b28f --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/sk.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step1.png b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step1.png new file mode 100755 index 0000000..1cac697 Binary files /dev/null and b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step1.png differ diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step1@2x.png b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step1@2x.png new file mode 100755 index 0000000..8d99108 Binary files /dev/null and b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step1@2x.png differ diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step2.png b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step2.png new file mode 100755 index 0000000..18ee7f2 Binary files /dev/null and b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step2.png differ diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step2@2x.png b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step2@2x.png new file mode 100755 index 0000000..5c37b1d Binary files /dev/null and b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step2@2x.png differ diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step3.png b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step3.png new file mode 100755 index 0000000..795b90f Binary files /dev/null and b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step3.png differ diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step3@2x.png b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step3@2x.png new file mode 100755 index 0000000..950d754 Binary files /dev/null and b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step3@2x.png differ diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step4.png b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step4.png new file mode 100755 index 0000000..3d7416b Binary files /dev/null and b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step4.png differ diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step4@2x.png b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step4@2x.png new file mode 100755 index 0000000..7ae50e5 Binary files /dev/null and b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step4@2x.png differ diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step5.png b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step5.png new file mode 100755 index 0000000..3a8bd1e Binary files /dev/null and b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step5.png differ diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step5@2x.png b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step5@2x.png new file mode 100755 index 0000000..236f3a0 Binary files /dev/null and b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step5@2x.png differ diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step6.png b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step6.png new file mode 100755 index 0000000..c6580e6 Binary files /dev/null and b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step6.png differ diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step6@2x.png b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step6@2x.png new file mode 100755 index 0000000..2bed812 Binary files /dev/null and b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step6@2x.png differ diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step7.png b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step7.png new file mode 100755 index 0000000..4e17178 Binary files /dev/null and b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step7.png differ diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step7@2x.png b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step7@2x.png new file mode 100755 index 0000000..88932e6 Binary files /dev/null and b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step7@2x.png differ diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step8.png b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step8.png new file mode 100755 index 0000000..7eefde7 Binary files /dev/null and b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step8.png differ diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step8@2x.png b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step8@2x.png new file mode 100755 index 0000000..6f49e3d Binary files /dev/null and b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step8@2x.png differ diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/sv.lproj/InfoPlist.strings b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/sv.lproj/InfoPlist.strings new file mode 100755 index 0000000..477b28f --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/sv.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/th.lproj/InfoPlist.strings b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/th.lproj/InfoPlist.strings new file mode 100755 index 0000000..477b28f --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/th.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/tr.lproj/InfoPlist.strings b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/tr.lproj/InfoPlist.strings new file mode 100755 index 0000000..477b28f --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/tr.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/track.json b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/track.json new file mode 100755 index 0000000..6a0ed63 --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/track.json @@ -0,0 +1 @@ +[{"lat": "44.145331", "lng": "9.661942", "elevation": "173.8000030517578", "time": "2013-09-20T08:40:00.855Z"}, {"lat": "44.145157", "lng": "9.661917", "elevation": "177.3000030517578", "time": "2013-09-20T08:40:01.824Z"}, {"lat": "44.14505", "lng": "9.662049", "elevation": "170.60000610351563", "time": "2013-09-20T08:40:02.945Z"}, {"lat": "44.145", "lng": "9.662165", "elevation": "156.5", "time": "2013-09-20T08:40:03.828Z"}, {"lat": "44.144918", "lng": "9.662227", "elevation": "130.6999969482422", "time": "2013-09-20T08:40:04.823Z"}, {"lat": "44.144945", "lng": "9.662122", "elevation": "149.5", "time": "2013-09-20T08:40:06.123Z"}, {"lat": "44.14503", "lng": "9.662141", "elevation": "152.89999389648438", "time": "2013-09-20T08:40:07.122Z"}, {"lat": "44.144943", "lng": "9.662169", "elevation": "155.3000030517578", "time": "2013-09-20T08:40:19.117Z"}, {"lat": "44.144937", "lng": "9.66217", "elevation": "155.5", "time": "2013-09-20T08:40:20.157Z"}, {"lat": "44.144933", "lng": "9.662171", "elevation": "154.8000030517578", "time": "2013-09-20T08:40:22.132Z"}, {"lat": "44.144933", "lng": "9.662173", "elevation": "155.0", "time": "2013-09-20T08:40:23.141Z"}, {"lat": "44.144937", "lng": "9.662186", "elevation": "155.8000030517578", "time": "2013-09-20T08:40:45.224Z"}, {"lat": "44.144934", "lng": "9.66219", "elevation": "158.5", "time": "2013-09-20T08:40:46.191Z"}, {"lat": "44.144911", "lng": "9.662248", "elevation": "161.6999969482422", "time": "2013-09-20T08:40:59.133Z"}, {"lat": "44.144911", "lng": "9.662249", "elevation": "161.8000030517578", "time": "2013-09-20T08:41:00.124Z"}, {"lat": "44.14491", "lng": "9.662258", "elevation": "161.6999969482422", "time": "2013-09-20T08:41:09.127Z"}, {"lat": "44.144907", "lng": "9.662263", "elevation": "162.0", "time": "2013-09-20T08:41:10.185Z"}, {"lat": "44.144884", "lng": "9.662378", "elevation": "161.3000030517578", "time": "2013-09-20T08:41:17.137Z"}, {"lat": "44.144879", "lng": "9.662397", "elevation": "161.1999969482422", "time": "2013-09-20T08:41:18.211Z"}, {"lat": "44.144874", "lng": "9.662517", "elevation": "163.0", "time": "2013-09-20T08:41:26.217Z"}, {"lat": "44.144877", "lng": "9.66253", "elevation": "163.39999389648438", "time": "2013-09-20T08:41:27.220Z"}, {"lat": "44.144812", "lng": "9.662617", "elevation": "166.8000030517578", "time": "2013-09-20T08:41:36.137Z"}, {"lat": "44.144806", "lng": "9.662625", "elevation": "166.89999389648438", "time": "2013-09-20T08:41:37.146Z"}, {"lat": "44.14477", "lng": "9.662604", "elevation": "167.10000610351563", "time": "2013-09-20T08:41:49.143Z"}, {"lat": "44.14477", "lng": "9.662607", "elevation": "167.1999969482422", "time": "2013-09-20T08:41:50.138Z"}, {"lat": "44.144763", "lng": "9.662619", "elevation": "168.0", "time": "2013-09-20T08:41:58.146Z"}, {"lat": "44.14476", "lng": "9.662618", "elevation": "168.3000030517578", "time": "2013-09-20T08:41:59.133Z"}, {"lat": "44.144755", "lng": "9.662616", "elevation": "168.5", "time": "2013-09-20T08:42:01.147Z"}, {"lat": "44.144755", "lng": "9.662616", "elevation": "168.6999969482422", "time": "2013-09-20T08:42:02.133Z"}, {"lat": "44.144754", "lng": "9.662623", "elevation": "169.8000030517578", "time": "2013-09-20T08:43:18.202Z"}, {"lat": "44.144753", "lng": "9.662633", "elevation": "169.39999389648438", "time": "2013-09-20T08:43:19.274Z"}, {"lat": "44.144768", "lng": "9.662683", "elevation": "173.8000030517578", "time": "2013-09-20T08:43:28.140Z"}, {"lat": "44.144768", "lng": "9.662684", "elevation": "174.0", "time": "2013-09-20T08:43:29.177Z"}, {"lat": "44.144764", "lng": "9.662687", "elevation": "172.89999389648438", "time": "2013-09-20T08:43:33.140Z"}, {"lat": "44.144761", "lng": "9.662692", "elevation": "173.3000030517578", "time": "2013-09-20T08:43:34.147Z"}, {"lat": "44.144755", "lng": "9.662699", "elevation": "173.1999969482422", "time": "2013-09-20T08:43:37.220Z"}, {"lat": "44.144754", "lng": "9.6627", "elevation": "173.1999969482422", "time": "2013-09-20T08:43:38.164Z"}, {"lat": "44.144755", "lng": "9.662702", "elevation": "173.3000030517578", "time": "2013-09-20T08:43:43.148Z"}, {"lat": "44.144756", "lng": "9.662709", "elevation": "172.6999969482422", "time": "2013-09-20T08:43:44.141Z"}, {"lat": "44.144716", "lng": "9.662816", "elevation": "179.5", "time": "2013-09-20T08:43:51.157Z"}, {"lat": "44.144717", "lng": "9.662831", "elevation": "180.8000030517578", "time": "2013-09-20T08:43:52.141Z"}, {"lat": "44.1447", "lng": "9.662945", "elevation": "182.3000030517578", "time": "2013-09-20T08:44:01.165Z"}, {"lat": "44.144696", "lng": "9.662956", "elevation": "181.89999389648438", "time": "2013-09-20T08:44:02.153Z"}, {"lat": "44.144679", "lng": "9.662965", "elevation": "181.6999969482422", "time": "2013-09-20T08:44:08.135Z"}, {"lat": "44.144679", "lng": "9.662966", "elevation": "181.60000610351563", "time": "2013-09-20T08:44:09.139Z"}, {"lat": "44.14469", "lng": "9.66299", "elevation": "183.1999969482422", "time": "2013-09-20T08:44:26.146Z"}, {"lat": "44.144687", "lng": "9.662998", "elevation": "182.89999389648438", "time": "2013-09-20T08:44:27.145Z"}, {"lat": "44.144661", "lng": "9.663117", "elevation": "193.1999969482422", "time": "2013-09-20T08:44:38.177Z"}, {"lat": "44.144658", "lng": "9.66312", "elevation": "193.1999969482422", "time": "2013-09-20T08:44:39.232Z"}, {"lat": "44.144581", "lng": "9.663173", "elevation": "199.3000030517578", "time": "2013-09-20T08:44:51.156Z"}, {"lat": "44.144572", "lng": "9.66319", "elevation": "199.39999389648438", "time": "2013-09-20T08:44:52.153Z"}, {"lat": "44.144518", "lng": "9.663271", "elevation": "201.1999969482422", "time": "2013-09-20T08:44:57.156Z"}, {"lat": "44.144506", "lng": "9.663276", "elevation": "202.5", "time": "2013-09-20T08:44:58.141Z"}, {"lat": "44.144498", "lng": "9.663277", "elevation": "202.3000030517578", "time": "2013-09-20T08:45:02.212Z"}, {"lat": "44.144506", "lng": "9.663277", "elevation": "201.8000030517578", "time": "2013-09-20T08:45:03.249Z"}, {"lat": "44.144513", "lng": "9.66328", "elevation": "201.1999969482422", "time": "2013-09-20T08:45:04.186Z"}, {"lat": "44.144526", "lng": "9.663302", "elevation": "199.5", "time": "2013-09-20T08:45:09.163Z"}, {"lat": "44.144526", "lng": "9.663298", "elevation": "199.89999389648438", "time": "2013-09-20T08:45:10.157Z"}, {"lat": "44.144527", "lng": "9.663291", "elevation": "200.6999969482422", "time": "2013-09-20T08:45:11.229Z"}, {"lat": "44.144527", "lng": "9.663281", "elevation": "201.8000030517578", "time": "2013-09-20T08:45:12.229Z"}, {"lat": "44.144522", "lng": "9.663257", "elevation": "202.0", "time": "2013-09-20T08:45:17.165Z"}, {"lat": "44.14452", "lng": "9.663259", "elevation": "201.60000610351563", "time": "2013-09-20T08:45:18.220Z"}, {"lat": "44.144511", "lng": "9.663258", "elevation": "202.0", "time": "2013-09-20T08:45:27.262Z"}, {"lat": "44.144503", "lng": "9.663259", "elevation": "200.39999389648438", "time": "2013-09-20T08:45:28.141Z"}, {"lat": "44.144419", "lng": "9.663262", "elevation": "198.3000030517578", "time": "2013-09-20T08:45:33.164Z"}, {"lat": "44.144404", "lng": "9.663262", "elevation": "197.3000030517578", "time": "2013-09-20T08:45:34.204Z"}, {"lat": "44.144364", "lng": "9.663282", "elevation": "198.3000030517578", "time": "2013-09-20T08:45:42.142Z"}, {"lat": "44.144366", "lng": "9.663283", "elevation": "198.10000610351563", "time": "2013-09-20T08:45:43.149Z"}, {"lat": "44.144362", "lng": "9.663275", "elevation": "199.3000030517578", "time": "2013-09-20T08:46:03.152Z"}, {"lat": "44.144358", "lng": "9.663284", "elevation": "199.1999969482422", "time": "2013-09-20T08:46:04.142Z"}, {"lat": "44.144319", "lng": "9.663392", "elevation": "201.60000610351563", "time": "2013-09-20T08:46:12.160Z"}, {"lat": "44.144313", "lng": "9.663404", "elevation": "201.0", "time": "2013-09-20T08:46:13.153Z"}, {"lat": "44.144264", "lng": "9.663501", "elevation": "204.89999389648438", "time": "2013-09-20T08:46:20.144Z"}, {"lat": "44.144256", "lng": "9.663513", "elevation": "206.60000610351563", "time": "2013-09-20T08:46:21.170Z"}, {"lat": "44.144207", "lng": "9.663617", "elevation": "207.89999389648438", "time": "2013-09-20T08:46:31.257Z"}, {"lat": "44.144203", "lng": "9.663625", "elevation": "208.6999969482422", "time": "2013-09-20T08:46:32.221Z"}, {"lat": "44.144194", "lng": "9.6637", "elevation": "210.10000610351563", "time": "2013-09-20T08:46:44.148Z"}, {"lat": "44.144195", "lng": "9.663701", "elevation": "210.0", "time": "2013-09-20T08:46:45.162Z"}, {"lat": "44.144193", "lng": "9.663706", "elevation": "210.0", "time": "2013-09-20T08:47:02.176Z"}, {"lat": "44.144194", "lng": "9.663712", "elevation": "209.39999389648438", "time": "2013-09-20T08:47:03.180Z"}, {"lat": "44.144242", "lng": "9.663813", "elevation": "205.8000030517578", "time": "2013-09-20T08:47:19.246Z"}, {"lat": "44.144247", "lng": "9.663822", "elevation": "205.1999969482422", "time": "2013-09-20T08:47:20.183Z"}, {"lat": "44.144316", "lng": "9.663899", "elevation": "202.10000610351563", "time": "2013-09-20T08:47:34.231Z"}, {"lat": "44.14432", "lng": "9.663909", "elevation": "201.89999389648438", "time": "2013-09-20T08:47:35.229Z"}, {"lat": "44.144355", "lng": "9.66397", "elevation": "205.89999389648438", "time": "2013-09-20T08:47:43.176Z"}, {"lat": "44.144354", "lng": "9.663968", "elevation": "205.8000030517578", "time": "2013-09-20T08:47:44.172Z"}, {"lat": "44.144359", "lng": "9.663989", "elevation": "207.8000030517578", "time": "2013-09-20T08:47:53.213Z"}, {"lat": "44.14436", "lng": "9.663996", "elevation": "207.89999389648438", "time": "2013-09-20T08:47:54.162Z"}, {"lat": "44.144404", "lng": "9.664094", "elevation": "210.10000610351563", "time": "2013-09-20T08:48:01.203Z"}, {"lat": "44.14441", "lng": "9.664112", "elevation": "209.89999389648438", "time": "2013-09-20T08:48:02.167Z"}, {"lat": "44.144445", "lng": "9.664217", "elevation": "208.39999389648438", "time": "2013-09-20T08:48:09.225Z"}, {"lat": "44.14445", "lng": "9.664226", "elevation": "207.39999389648438", "time": "2013-09-20T08:48:10.169Z"}, {"lat": "44.14451", "lng": "9.664318", "elevation": "207.6999969482422", "time": "2013-09-20T08:48:19.190Z"}, {"lat": "44.144516", "lng": "9.664334", "elevation": "206.0", "time": "2013-09-20T08:48:20.177Z"}, {"lat": "44.144565", "lng": "9.664426", "elevation": "205.0", "time": "2013-09-20T08:48:27.171Z"}, {"lat": "44.144574", "lng": "9.664434", "elevation": "205.10000610351563", "time": "2013-09-20T08:48:28.180Z"}, {"lat": "44.144609", "lng": "9.664543", "elevation": "206.6999969482422", "time": "2013-09-20T08:48:40.184Z"}, {"lat": "44.14461", "lng": "9.664554", "elevation": "206.39999389648438", "time": "2013-09-20T08:48:41.182Z"}, {"lat": "44.144638", "lng": "9.664672", "elevation": "205.10000610351563", "time": "2013-09-20T08:48:51.188Z"}, {"lat": "44.144642", "lng": "9.664682", "elevation": "205.60000610351563", "time": "2013-09-20T08:48:52.230Z"}, {"lat": "44.144682", "lng": "9.664781", "elevation": "205.8000030517578", "time": "2013-09-20T08:49:02.254Z"}, {"lat": "44.144687", "lng": "9.664793", "elevation": "206.0", "time": "2013-09-20T08:49:03.262Z"}, {"lat": "44.144653", "lng": "9.664906", "elevation": "206.60000610351563", "time": "2013-09-20T08:49:15.287Z"}, {"lat": "44.14465", "lng": "9.664912", "elevation": "207.10000610351563", "time": "2013-09-20T08:49:16.261Z"}, {"lat": "44.144651", "lng": "9.664916", "elevation": "205.89999389648438", "time": "2013-09-20T08:49:18.271Z"}, {"lat": "44.144656", "lng": "9.664914", "elevation": "205.89999389648438", "time": "2013-09-20T08:49:19.343Z"}, {"lat": "44.144661", "lng": "9.664911", "elevation": "206.0", "time": "2013-09-20T08:49:20.304Z"}, {"lat": "44.144685", "lng": "9.664912", "elevation": "205.89999389648438", "time": "2013-09-20T08:49:28.388Z"}, {"lat": "44.144686", "lng": "9.664914", "elevation": "206.0", "time": "2013-09-20T08:49:29.371Z"}, {"lat": "44.144687", "lng": "9.66492", "elevation": "205.89999389648438", "time": "2013-09-20T08:49:35.323Z"}, {"lat": "44.144691", "lng": "9.664926", "elevation": "205.39999389648438", "time": "2013-09-20T08:49:36.247Z"}, {"lat": "44.144753", "lng": "9.665007", "elevation": "203.6999969482422", "time": "2013-09-20T08:49:42.194Z"}, {"lat": "44.144764", "lng": "9.665024", "elevation": "203.89999389648438", "time": "2013-09-20T08:49:43.371Z"}, {"lat": "44.144819", "lng": "9.66512", "elevation": "204.10000610351563", "time": "2013-09-20T08:49:51.386Z"}, {"lat": "44.14482", "lng": "9.665126", "elevation": "204.3000030517578", "time": "2013-09-20T08:49:52.321Z"}, {"lat": "44.144856", "lng": "9.665239", "elevation": "205.89999389648438", "time": "2013-09-20T08:50:03.402Z"}, {"lat": "44.144859", "lng": "9.665241", "elevation": "205.60000610351563", "time": "2013-09-20T08:50:04.370Z"}, {"lat": "44.144862", "lng": "9.665246", "elevation": "205.5", "time": "2013-09-20T08:50:07.377Z"}, {"lat": "44.144862", "lng": "9.665247", "elevation": "205.5", "time": "2013-09-20T08:50:08.322Z"}, {"lat": "44.144864", "lng": "9.665254", "elevation": "206.1999969482422", "time": "2013-09-20T08:50:17.332Z"}, {"lat": "44.144867", "lng": "9.665261", "elevation": "206.10000610351563", "time": "2013-09-20T08:50:18.349Z"}, {"lat": "44.144931", "lng": "9.665342", "elevation": "207.6999969482422", "time": "2013-09-20T08:50:23.347Z"}, {"lat": "44.144945", "lng": "9.66536", "elevation": "208.0", "time": "2013-09-20T08:50:24.325Z"}, {"lat": "44.144995", "lng": "9.665457", "elevation": "206.39999389648438", "time": "2013-09-20T08:50:30.244Z"}, {"lat": "44.144997", "lng": "9.665466", "elevation": "206.3000030517578", "time": "2013-09-20T08:50:31.187Z"}, {"lat": "44.144991", "lng": "9.6655", "elevation": "206.1999969482422", "time": "2013-09-20T08:50:41.277Z"}, {"lat": "44.144991", "lng": "9.665502", "elevation": "205.8000030517578", "time": "2013-09-20T08:50:42.244Z"}, {"lat": "44.144995", "lng": "9.665519", "elevation": "204.1999969482422", "time": "2013-09-20T08:50:54.344Z"}, {"lat": "44.144995", "lng": "9.665528", "elevation": "204.1999969482422", "time": "2013-09-20T08:50:55.360Z"}, {"lat": "44.144992", "lng": "9.665644", "elevation": "206.8000030517578", "time": "2013-09-20T08:51:02.176Z"}, {"lat": "44.14499", "lng": "9.665659", "elevation": "206.6999969482422", "time": "2013-09-20T08:51:03.176Z"}, {"lat": "44.145013", "lng": "9.665772", "elevation": "204.60000610351563", "time": "2013-09-20T08:51:12.336Z"}, {"lat": "44.145022", "lng": "9.665786", "elevation": "204.10000610351563", "time": "2013-09-20T08:51:13.305Z"}, {"lat": "44.14507", "lng": "9.665875", "elevation": "204.3000030517578", "time": "2013-09-20T08:51:20.280Z"}, {"lat": "44.145072", "lng": "9.665891", "elevation": "202.89999389648438", "time": "2013-09-20T08:51:21.363Z"}, {"lat": "44.145067", "lng": "9.666001", "elevation": "197.8000030517578", "time": "2013-09-20T08:51:37.323Z"}, {"lat": "44.145074", "lng": "9.666025", "elevation": "197.5", "time": "2013-09-20T08:51:38.322Z"}, {"lat": "44.145099", "lng": "9.666122", "elevation": "196.3000030517578", "time": "2013-09-20T08:51:41.330Z"}, {"lat": "44.145112", "lng": "9.666149", "elevation": "196.3000030517578", "time": "2013-09-20T08:51:42.355Z"}, {"lat": "44.14516", "lng": "9.666228", "elevation": "197.6999969482422", "time": "2013-09-20T08:51:46.256Z"}, {"lat": "44.14517", "lng": "9.666247", "elevation": "197.3000030517578", "time": "2013-09-20T08:51:47.227Z"}, {"lat": "44.145223", "lng": "9.666331", "elevation": "199.89999389648438", "time": "2013-09-20T08:51:54.211Z"}, {"lat": "44.145231", "lng": "9.666343", "elevation": "201.0", "time": "2013-09-20T08:51:55.178Z"}, {"lat": "44.145287", "lng": "9.666436", "elevation": "202.60000610351563", "time": "2013-09-20T08:52:02.194Z"}, {"lat": "44.145294", "lng": "9.666447", "elevation": "202.89999389648438", "time": "2013-09-20T08:52:03.228Z"}, {"lat": "44.145377", "lng": "9.666465", "elevation": "201.0", "time": "2013-09-20T08:52:13.181Z"}, {"lat": "44.145386", "lng": "9.666461", "elevation": "201.10000610351563", "time": "2013-09-20T08:52:14.212Z"}, {"lat": "44.14542", "lng": "9.666575", "elevation": "199.1999969482422", "time": "2013-09-20T08:52:29.348Z"}, {"lat": "44.145421", "lng": "9.666594", "elevation": "199.0", "time": "2013-09-20T08:52:30.327Z"}, {"lat": "44.145417", "lng": "9.666709", "elevation": "195.39999389648438", "time": "2013-09-20T08:52:36.199Z"}, {"lat": "44.145418", "lng": "9.666721", "elevation": "196.10000610351563", "time": "2013-09-20T08:52:37.197Z"}, {"lat": "44.145423", "lng": "9.666843", "elevation": "195.6999969482422", "time": "2013-09-20T08:52:49.192Z"}, {"lat": "44.145426", "lng": "9.666855", "elevation": "195.10000610351563", "time": "2013-09-20T08:52:50.233Z"}, {"lat": "44.145455", "lng": "9.666967", "elevation": "194.1999969482422", "time": "2013-09-20T08:52:58.191Z"}, {"lat": "44.145459", "lng": "9.66698", "elevation": "194.0", "time": "2013-09-20T08:52:59.184Z"}, {"lat": "44.145496", "lng": "9.667082", "elevation": "191.10000610351563", "time": "2013-09-20T08:53:09.183Z"}, {"lat": "44.1455", "lng": "9.667098", "elevation": "191.1999969482422", "time": "2013-09-20T08:53:10.200Z"}, {"lat": "44.145552", "lng": "9.667184", "elevation": "191.8000030517578", "time": "2013-09-20T08:53:16.329Z"}, {"lat": "44.145557", "lng": "9.667196", "elevation": "191.8000030517578", "time": "2013-09-20T08:53:17.356Z"}, {"lat": "44.145562", "lng": "9.667214", "elevation": "189.60000610351563", "time": "2013-09-20T08:53:22.291Z"}, {"lat": "44.14556", "lng": "9.667212", "elevation": "189.6999969482422", "time": "2013-09-20T08:53:23.241Z"}, {"lat": "44.145553", "lng": "9.66721", "elevation": "188.6999969482422", "time": "2013-09-20T08:53:50.175Z"}, {"lat": "44.145559", "lng": "9.66721", "elevation": "189.1999969482422", "time": "2013-09-20T08:53:51.175Z"}, {"lat": "44.145641", "lng": "9.667257", "elevation": "192.10000610351563", "time": "2013-09-20T08:53:58.197Z"}, {"lat": "44.14565", "lng": "9.667267", "elevation": "192.5", "time": "2013-09-20T08:53:59.181Z"}, {"lat": "44.145691", "lng": "9.66735", "elevation": "193.1999969482422", "time": "2013-09-20T08:54:05.205Z"}, {"lat": "44.145695", "lng": "9.667379", "elevation": "193.39999389648438", "time": "2013-09-20T08:54:06.190Z"}, {"lat": "44.145706", "lng": "9.66749", "elevation": "194.60000610351563", "time": "2013-09-20T08:54:09.182Z"}, {"lat": "44.145712", "lng": "9.667534", "elevation": "195.3000030517578", "time": "2013-09-20T08:54:10.213Z"}, {"lat": "44.145739", "lng": "9.667573", "elevation": "194.89999389648438", "time": "2013-09-20T08:54:19.207Z"}, {"lat": "44.145739", "lng": "9.667574", "elevation": "194.0", "time": "2013-09-20T08:54:20.196Z"}, {"lat": "44.14574", "lng": "9.667582", "elevation": "195.39999389648438", "time": "2013-09-20T08:54:22.213Z"}, {"lat": "44.145741", "lng": "9.667587", "elevation": "194.5", "time": "2013-09-20T08:54:23.191Z"}, {"lat": "44.145733", "lng": "9.667644", "elevation": "198.1999969482422", "time": "2013-09-20T08:54:32.207Z"}, {"lat": "44.145733", "lng": "9.667643", "elevation": "198.89999389648438", "time": "2013-09-20T08:54:33.214Z"}, {"lat": "44.145739", "lng": "9.667633", "elevation": "198.10000610351563", "time": "2013-09-20T08:54:42.192Z"}, {"lat": "44.145741", "lng": "9.667637", "elevation": "198.39999389648438", "time": "2013-09-20T08:54:43.214Z"}, {"lat": "44.145724", "lng": "9.667754", "elevation": "199.8000030517578", "time": "2013-09-20T08:54:52.188Z"}, {"lat": "44.145723", "lng": "9.667775", "elevation": "198.5", "time": "2013-09-20T08:54:53.202Z"}, {"lat": "44.145703", "lng": "9.667889", "elevation": "197.0", "time": "2013-09-20T08:55:07.208Z"}, {"lat": "44.145707", "lng": "9.667901", "elevation": "196.6999969482422", "time": "2013-09-20T08:55:08.242Z"}, {"lat": "44.14571", "lng": "9.667922", "elevation": "195.6999969482422", "time": "2013-09-20T08:55:13.217Z"}, {"lat": "44.145707", "lng": "9.667921", "elevation": "196.6999969482422", "time": "2013-09-20T08:55:14.251Z"}, {"lat": "44.145704", "lng": "9.66792", "elevation": "196.1999969482422", "time": "2013-09-20T08:55:15.210Z"}, {"lat": "44.1457", "lng": "9.667919", "elevation": "196.60000610351563", "time": "2013-09-20T08:55:16.230Z"}, {"lat": "44.145617", "lng": "9.667918", "elevation": "196.3000030517578", "time": "2013-09-20T08:55:29.211Z"}, {"lat": "44.145603", "lng": "9.667908", "elevation": "197.39999389648438", "time": "2013-09-20T08:55:30.197Z"}, {"lat": "44.145516", "lng": "9.667888", "elevation": "197.10000610351563", "time": "2013-09-20T08:55:37.203Z"}, {"lat": "44.145508", "lng": "9.667883", "elevation": "198.60000610351563", "time": "2013-09-20T08:55:38.212Z"}, {"lat": "44.14545", "lng": "9.667852", "elevation": "196.8000030517578", "time": "2013-09-20T08:55:56.193Z"}, {"lat": "44.14545", "lng": "9.667852", "elevation": "197.0", "time": "2013-09-20T08:55:57.198Z"}, {"lat": "44.145443", "lng": "9.667863", "elevation": "195.6999969482422", "time": "2013-09-20T08:56:10.210Z"}, {"lat": "44.145437", "lng": "9.667863", "elevation": "198.1999969482422", "time": "2013-09-20T08:56:11.230Z"}, {"lat": "44.145349", "lng": "9.667869", "elevation": "197.10000610351563", "time": "2013-09-20T08:56:18.200Z"}, {"lat": "44.145335", "lng": "9.66787", "elevation": "198.0", "time": "2013-09-20T08:56:19.231Z"}, {"lat": "44.145254", "lng": "9.667841", "elevation": "193.89999389648438", "time": "2013-09-20T08:56:25.279Z"}, {"lat": "44.145241", "lng": "9.667831", "elevation": "192.6999969482422", "time": "2013-09-20T08:56:26.230Z"}, {"lat": "44.145155", "lng": "9.667803", "elevation": "194.10000610351563", "time": "2013-09-20T08:56:32.207Z"}, {"lat": "44.145141", "lng": "9.667805", "elevation": "194.3000030517578", "time": "2013-09-20T08:56:33.233Z"}, {"lat": "44.145086", "lng": "9.667807", "elevation": "191.8000030517578", "time": "2013-09-20T08:56:46.216Z"}, {"lat": "44.145085", "lng": "9.667808", "elevation": "191.8000030517578", "time": "2013-09-20T08:56:47.207Z"}, {"lat": "44.145082", "lng": "9.667807", "elevation": "192.1999969482422", "time": "2013-09-20T08:56:48.217Z"}, {"lat": "44.145076", "lng": "9.667807", "elevation": "192.39999389648438", "time": "2013-09-20T08:56:49.217Z"}, {"lat": "44.144992", "lng": "9.667778", "elevation": "194.0", "time": "2013-09-20T08:56:55.208Z"}, {"lat": "44.144977", "lng": "9.667771", "elevation": "194.10000610351563", "time": "2013-09-20T08:56:56.234Z"}, {"lat": "44.1449", "lng": "9.66773", "elevation": "195.39999389648438", "time": "2013-09-20T08:57:02.217Z"}, {"lat": "44.144888", "lng": "9.667724", "elevation": "196.10000610351563", "time": "2013-09-20T08:57:03.267Z"}, {"lat": "44.144801", "lng": "9.667719", "elevation": "193.3000030517578", "time": "2013-09-20T08:57:15.224Z"}, {"lat": "44.144792", "lng": "9.667717", "elevation": "193.10000610351563", "time": "2013-09-20T08:57:16.310Z"}, {"lat": "44.144702", "lng": "9.667699", "elevation": "189.5", "time": "2013-09-20T08:57:30.220Z"}, {"lat": "44.144698", "lng": "9.667704", "elevation": "189.5", "time": "2013-09-20T08:57:31.220Z"}, {"lat": "44.144612", "lng": "9.667714", "elevation": "184.1999969482422", "time": "2013-09-20T08:57:41.244Z"}, {"lat": "44.144597", "lng": "9.667713", "elevation": "184.39999389648438", "time": "2013-09-20T08:57:42.215Z"}, {"lat": "44.144547", "lng": "9.667816", "elevation": "194.1999969482422", "time": "2013-09-20T08:57:57.230Z"}, {"lat": "44.144544", "lng": "9.667823", "elevation": "195.39999389648438", "time": "2013-09-20T08:57:58.256Z"}, {"lat": "44.144581", "lng": "9.667931", "elevation": "200.8000030517578", "time": "2013-09-20T08:58:12.304Z"}, {"lat": "44.144579", "lng": "9.667938", "elevation": "201.10000610351563", "time": "2013-09-20T08:58:13.264Z"}, {"lat": "44.144543", "lng": "9.668047", "elevation": "200.6999969482422", "time": "2013-09-20T08:58:22.288Z"}, {"lat": "44.144541", "lng": "9.668063", "elevation": "201.10000610351563", "time": "2013-09-20T08:58:23.381Z"}, {"lat": "44.144542", "lng": "9.668181", "elevation": "200.39999389648438", "time": "2013-09-20T08:58:32.226Z"}, {"lat": "44.144542", "lng": "9.66819", "elevation": "201.89999389648438", "time": "2013-09-20T08:58:33.213Z"}, {"lat": "44.144476", "lng": "9.668256", "elevation": "198.6999969482422", "time": "2013-09-20T08:58:44.323Z"}, {"lat": "44.14447", "lng": "9.668272", "elevation": "199.3000030517578", "time": "2013-09-20T08:58:45.291Z"}, {"lat": "44.144473", "lng": "9.668395", "elevation": "207.10000610351563", "time": "2013-09-20T08:58:59.284Z"}, {"lat": "44.144475", "lng": "9.668399", "elevation": "207.5", "time": "2013-09-20T08:59:00.355Z"}, {"lat": "44.144447", "lng": "9.668515", "elevation": "205.5", "time": "2013-09-20T08:59:12.285Z"}, {"lat": "44.144445", "lng": "9.668528", "elevation": "205.8000030517578", "time": "2013-09-20T08:59:13.231Z"}, {"lat": "44.144438", "lng": "9.668644", "elevation": "205.3000030517578", "time": "2013-09-20T08:59:25.359Z"}, {"lat": "44.144429", "lng": "9.668653", "elevation": "205.3000030517578", "time": "2013-09-20T08:59:26.367Z"}, {"lat": "44.144408", "lng": "9.668772", "elevation": "207.5", "time": "2013-09-20T08:59:39.319Z"}, {"lat": "44.144411", "lng": "9.668783", "elevation": "208.10000610351563", "time": "2013-09-20T08:59:40.365Z"}, {"lat": "44.144481", "lng": "9.668861", "elevation": "211.1999969482422", "time": "2013-09-20T08:59:52.223Z"}, {"lat": "44.144485", "lng": "9.66887", "elevation": "211.39999389648438", "time": "2013-09-20T08:59:53.240Z"}, {"lat": "44.144481", "lng": "9.668992", "elevation": "210.39999389648438", "time": "2013-09-20T09:00:04.345Z"}, {"lat": "44.144482", "lng": "9.669003", "elevation": "210.60000610351563", "time": "2013-09-20T09:00:05.306Z"}, {"lat": "44.144454", "lng": "9.66906", "elevation": "210.39999389648438", "time": "2013-09-20T09:00:15.349Z"}, {"lat": "44.144453", "lng": "9.66906", "elevation": "210.3000030517578", "time": "2013-09-20T09:00:16.373Z"}, {"lat": "44.144451", "lng": "9.669059", "elevation": "210.1999969482422", "time": "2013-09-20T09:00:17.328Z"}, {"lat": "44.144447", "lng": "9.669058", "elevation": "210.1999969482422", "time": "2013-09-20T09:00:18.393Z"}, {"lat": "44.144438", "lng": "9.669054", "elevation": "210.10000610351563", "time": "2013-09-20T09:00:22.266Z"}, {"lat": "44.144438", "lng": "9.669054", "elevation": "210.0", "time": "2013-09-20T09:00:23.234Z"}, {"lat": "44.144439", "lng": "9.669063", "elevation": "210.1999969482422", "time": "2013-09-20T09:00:41.226Z"}, {"lat": "44.144439", "lng": "9.669074", "elevation": "210.60000610351563", "time": "2013-09-20T09:00:42.241Z"}, {"lat": "44.144431", "lng": "9.669184", "elevation": "213.1999969482422", "time": "2013-09-20T09:00:48.323Z"}, {"lat": "44.144428", "lng": "9.669204", "elevation": "213.6999969482422", "time": "2013-09-20T09:00:49.323Z"}, {"lat": "44.144437", "lng": "9.669318", "elevation": "212.39999389648438", "time": "2013-09-20T09:00:54.282Z"}, {"lat": "44.14444", "lng": "9.669341", "elevation": "212.0", "time": "2013-09-20T09:00:55.227Z"}, {"lat": "44.144402", "lng": "9.669447", "elevation": "211.3000030517578", "time": "2013-09-20T09:01:02.394Z"}, {"lat": "44.144399", "lng": "9.669458", "elevation": "211.3000030517578", "time": "2013-09-20T09:01:03.344Z"}, {"lat": "44.144371", "lng": "9.669565", "elevation": "213.89999389648438", "time": "2013-09-20T09:01:13.236Z"}, {"lat": "44.144368", "lng": "9.669583", "elevation": "214.8000030517578", "time": "2013-09-20T09:01:14.244Z"}, {"lat": "44.144391", "lng": "9.669694", "elevation": "215.0", "time": "2013-09-20T09:01:21.336Z"}, {"lat": "44.144397", "lng": "9.669703", "elevation": "214.6999969482422", "time": "2013-09-20T09:01:22.334Z"}, {"lat": "44.144386", "lng": "9.66982", "elevation": "215.1999969482422", "time": "2013-09-20T09:01:31.282Z"}, {"lat": "44.144379", "lng": "9.669826", "elevation": "216.3000030517578", "time": "2013-09-20T09:01:32.321Z"}, {"lat": "44.144351", "lng": "9.669856", "elevation": "217.0", "time": "2013-09-20T09:01:41.344Z"}, {"lat": "44.144351", "lng": "9.669857", "elevation": "216.6999969482422", "time": "2013-09-20T09:01:42.295Z"}, {"lat": "44.144337", "lng": "9.66986", "elevation": "214.39999389648438", "time": "2013-09-20T09:01:55.249Z"}, {"lat": "44.144331", "lng": "9.669859", "elevation": "213.3000030517578", "time": "2013-09-20T09:01:56.251Z"}, {"lat": "44.144244", "lng": "9.669859", "elevation": "210.6999969482422", "time": "2013-09-20T09:02:04.326Z"}, {"lat": "44.144229", "lng": "9.669855", "elevation": "209.6999969482422", "time": "2013-09-20T09:02:05.266Z"}, {"lat": "44.144145", "lng": "9.669813", "elevation": "210.3000030517578", "time": "2013-09-20T09:02:12.254Z"}, {"lat": "44.144133", "lng": "9.669806", "elevation": "211.60000610351563", "time": "2013-09-20T09:02:13.307Z"}, {"lat": "44.144084", "lng": "9.669726", "elevation": "211.8000030517578", "time": "2013-09-20T09:02:18.230Z"}, {"lat": "44.144075", "lng": "9.669703", "elevation": "211.60000610351563", "time": "2013-09-20T09:02:19.260Z"}, {"lat": "44.144018", "lng": "9.669627", "elevation": "213.5", "time": "2013-09-20T09:02:24.285Z"}, {"lat": "44.144005", "lng": "9.669616", "elevation": "214.3000030517578", "time": "2013-09-20T09:02:25.259Z"}, {"lat": "44.143925", "lng": "9.669578", "elevation": "214.0", "time": "2013-09-20T09:02:30.279Z"}, {"lat": "44.143911", "lng": "9.669575", "elevation": "213.5", "time": "2013-09-20T09:02:31.326Z"}, {"lat": "44.143833", "lng": "9.669571", "elevation": "214.3000030517578", "time": "2013-09-20T09:02:37.235Z"}, {"lat": "44.143818", "lng": "9.669571", "elevation": "214.10000610351563", "time": "2013-09-20T09:02:38.282Z"}, {"lat": "44.143755", "lng": "9.669483", "elevation": "213.1999969482422", "time": "2013-09-20T09:02:46.284Z"}, {"lat": "44.143748", "lng": "9.669477", "elevation": "212.3000030517578", "time": "2013-09-20T09:02:47.326Z"}, {"lat": "44.143667", "lng": "9.669444", "elevation": "211.1999969482422", "time": "2013-09-20T09:02:57.271Z"}, {"lat": "44.143659", "lng": "9.669438", "elevation": "211.39999389648438", "time": "2013-09-20T09:02:58.247Z"}, {"lat": "44.143598", "lng": "9.669348", "elevation": "216.1999969482422", "time": "2013-09-20T09:03:06.234Z"}, {"lat": "44.143589", "lng": "9.669334", "elevation": "217.0", "time": "2013-09-20T09:03:07.235Z"}, {"lat": "44.143531", "lng": "9.669243", "elevation": "218.8000030517578", "time": "2013-09-20T09:03:13.238Z"}, {"lat": "44.143523", "lng": "9.66923", "elevation": "219.0", "time": "2013-09-20T09:03:14.235Z"}, {"lat": "44.143485", "lng": "9.669128", "elevation": "219.1999969482422", "time": "2013-09-20T09:03:22.241Z"}, {"lat": "44.143479", "lng": "9.66912", "elevation": "219.10000610351563", "time": "2013-09-20T09:03:23.255Z"}, {"lat": "44.143393", "lng": "9.669141", "elevation": "220.3000030517578", "time": "2013-09-20T09:03:42.332Z"}, {"lat": "44.143389", "lng": "9.66914", "elevation": "220.8000030517578", "time": "2013-09-20T09:03:43.343Z"}, {"lat": "44.143316", "lng": "9.669112", "elevation": "224.60000610351563", "time": "2013-09-20T09:03:57.267Z"}, {"lat": "44.143317", "lng": "9.669111", "elevation": "224.6999969482422", "time": "2013-09-20T09:03:58.315Z"}, {"lat": "44.143317", "lng": "9.669118", "elevation": "224.10000610351563", "time": "2013-09-20T09:04:03.241Z"}, {"lat": "44.143314", "lng": "9.669121", "elevation": "224.1999969482422", "time": "2013-09-20T09:04:04.306Z"}, {"lat": "44.143311", "lng": "9.669125", "elevation": "224.6999969482422", "time": "2013-09-20T09:04:06.251Z"}, {"lat": "44.14331", "lng": "9.669126", "elevation": "225.10000610351563", "time": "2013-09-20T09:04:07.261Z"}, {"lat": "44.143303", "lng": "9.66912", "elevation": "225.39999389648438", "time": "2013-09-20T09:04:14.248Z"}, {"lat": "44.1433", "lng": "9.669122", "elevation": "224.1999969482422", "time": "2013-09-20T09:04:15.253Z"}, {"lat": "44.143214", "lng": "9.669147", "elevation": "221.60000610351563", "time": "2013-09-20T09:04:23.285Z"}, {"lat": "44.143201", "lng": "9.669156", "elevation": "220.5", "time": "2013-09-20T09:04:24.292Z"}, {"lat": "44.143132", "lng": "9.669228", "elevation": "218.8000030517578", "time": "2013-09-20T09:04:31.331Z"}, {"lat": "44.143125", "lng": "9.669245", "elevation": "219.1999969482422", "time": "2013-09-20T09:04:32.334Z"}, {"lat": "44.143048", "lng": "9.669309", "elevation": "216.0", "time": "2013-09-20T09:04:40.320Z"}, {"lat": "44.143039", "lng": "9.669316", "elevation": "217.39999389648438", "time": "2013-09-20T09:04:41.273Z"}, {"lat": "44.14297", "lng": "9.669391", "elevation": "220.1999969482422", "time": "2013-09-20T09:04:52.254Z"}, {"lat": "44.142966", "lng": "9.669397", "elevation": "220.3000030517578", "time": "2013-09-20T09:04:53.262Z"}, {"lat": "44.14292", "lng": "9.669493", "elevation": "231.0", "time": "2013-09-20T09:05:08.249Z"}, {"lat": "44.142916", "lng": "9.669504", "elevation": "231.6999969482422", "time": "2013-09-20T09:05:09.270Z"}, {"lat": "44.142854", "lng": "9.669583", "elevation": "229.3000030517578", "time": "2013-09-20T09:05:17.264Z"}, {"lat": "44.142843", "lng": "9.669591", "elevation": "229.0", "time": "2013-09-20T09:05:18.267Z"}, {"lat": "44.142811", "lng": "9.669699", "elevation": "229.1999969482422", "time": "2013-09-20T09:05:38.291Z"}, {"lat": "44.142812", "lng": "9.6697", "elevation": "229.39999389648438", "time": "2013-09-20T09:05:39.265Z"}, {"lat": "44.142807", "lng": "9.669704", "elevation": "229.10000610351563", "time": "2013-09-20T09:05:53.343Z"}, {"lat": "44.142802", "lng": "9.66971", "elevation": "228.60000610351563", "time": "2013-09-20T09:05:54.266Z"}, {"lat": "44.142739", "lng": "9.669788", "elevation": "226.89999389648438", "time": "2013-09-20T09:06:00.365Z"}, {"lat": "44.142725", "lng": "9.669803", "elevation": "225.60000610351563", "time": "2013-09-20T09:06:01.348Z"}, {"lat": "44.142665", "lng": "9.669875", "elevation": "224.6999969482422", "time": "2013-09-20T09:06:06.260Z"}, {"lat": "44.142658", "lng": "9.669893", "elevation": "225.39999389648438", "time": "2013-09-20T09:06:07.262Z"}, {"lat": "44.142614", "lng": "9.669987", "elevation": "223.60000610351563", "time": "2013-09-20T09:06:12.262Z"}, {"lat": "44.1426", "lng": "9.670006", "elevation": "223.5", "time": "2013-09-20T09:06:13.255Z"}, {"lat": "44.142532", "lng": "9.670084", "elevation": "221.60000610351563", "time": "2013-09-20T09:06:18.269Z"}, {"lat": "44.142521", "lng": "9.670096", "elevation": "221.0", "time": "2013-09-20T09:06:19.292Z"}, {"lat": "44.142444", "lng": "9.670138", "elevation": "220.39999389648438", "time": "2013-09-20T09:06:28.263Z"}, {"lat": "44.142433", "lng": "9.670138", "elevation": "219.5", "time": "2013-09-20T09:06:29.275Z"}, {"lat": "44.142349", "lng": "9.67018", "elevation": "215.10000610351563", "time": "2013-09-20T09:06:37.272Z"}, {"lat": "44.14234", "lng": "9.670191", "elevation": "215.0", "time": "2013-09-20T09:06:38.255Z"}, {"lat": "44.142282", "lng": "9.670284", "elevation": "212.60000610351563", "time": "2013-09-20T09:06:47.259Z"}, {"lat": "44.142278", "lng": "9.670289", "elevation": "211.6999969482422", "time": "2013-09-20T09:06:48.281Z"}, {"lat": "44.142205", "lng": "9.670358", "elevation": "212.3000030517578", "time": "2013-09-20T09:06:58.282Z"}, {"lat": "44.142197", "lng": "9.670374", "elevation": "212.0", "time": "2013-09-20T09:06:59.264Z"}, {"lat": "44.142145", "lng": "9.670464", "elevation": "211.60000610351563", "time": "2013-09-20T09:07:07.267Z"}, {"lat": "44.142132", "lng": "9.670468", "elevation": "211.89999389648438", "time": "2013-09-20T09:07:08.264Z"}, {"lat": "44.142055", "lng": "9.670509", "elevation": "208.5", "time": "2013-09-20T09:07:19.283Z"}, {"lat": "44.142045", "lng": "9.670511", "elevation": "207.8000030517578", "time": "2013-09-20T09:07:20.310Z"}, {"lat": "44.141963", "lng": "9.670544", "elevation": "205.1999969482422", "time": "2013-09-20T09:07:28.260Z"}, {"lat": "44.141956", "lng": "9.670557", "elevation": "204.89999389648438", "time": "2013-09-20T09:07:29.274Z"}, {"lat": "44.141916", "lng": "9.670662", "elevation": "203.6999969482422", "time": "2013-09-20T09:07:37.269Z"}, {"lat": "44.141911", "lng": "9.670673", "elevation": "204.0", "time": "2013-09-20T09:07:38.292Z"}, {"lat": "44.141832", "lng": "9.670726", "elevation": "203.5", "time": "2013-09-20T09:07:56.270Z"}, {"lat": "44.141829", "lng": "9.670736", "elevation": "203.89999389648438", "time": "2013-09-20T09:07:57.278Z"}, {"lat": "44.141775", "lng": "9.67069", "elevation": "208.89999389648438", "time": "2013-09-20T09:08:14.343Z"}, {"lat": "44.141775", "lng": "9.670689", "elevation": "208.6999969482422", "time": "2013-09-20T09:08:15.377Z"}, {"lat": "44.141772", "lng": "9.670694", "elevation": "208.89999389648438", "time": "2013-09-20T09:08:29.334Z"}, {"lat": "44.141767", "lng": "9.6707", "elevation": "209.8000030517578", "time": "2013-09-20T09:08:30.313Z"}, {"lat": "44.141695", "lng": "9.670774", "elevation": "209.0", "time": "2013-09-20T09:08:36.290Z"}, {"lat": "44.141682", "lng": "9.670793", "elevation": "206.3000030517578", "time": "2013-09-20T09:08:37.303Z"}, {"lat": "44.141676", "lng": "9.670903", "elevation": "206.3000030517578", "time": "2013-09-20T09:08:42.272Z"}, {"lat": "44.141676", "lng": "9.670921", "elevation": "206.5", "time": "2013-09-20T09:08:43.264Z"}, {"lat": "44.141665", "lng": "9.671042", "elevation": "209.10000610351563", "time": "2013-09-20T09:08:51.284Z"}, {"lat": "44.141658", "lng": "9.671052", "elevation": "208.60000610351563", "time": "2013-09-20T09:08:52.281Z"}, {"lat": "44.141598", "lng": "9.671141", "elevation": "207.5", "time": "2013-09-20T09:09:01.265Z"}, {"lat": "44.141586", "lng": "9.671158", "elevation": "207.8000030517578", "time": "2013-09-20T09:09:02.296Z"}, {"lat": "44.141525", "lng": "9.671237", "elevation": "208.8000030517578", "time": "2013-09-20T09:09:07.275Z"}, {"lat": "44.141513", "lng": "9.67125", "elevation": "209.1999969482422", "time": "2013-09-20T09:09:08.265Z"}, {"lat": "44.141455", "lng": "9.671324", "elevation": "210.39999389648438", "time": "2013-09-20T09:09:13.267Z"}, {"lat": "44.141449", "lng": "9.671346", "elevation": "210.89999389648438", "time": "2013-09-20T09:09:14.305Z"}, {"lat": "44.141409", "lng": "9.671437", "elevation": "212.5", "time": "2013-09-20T09:09:19.330Z"}, {"lat": "44.141397", "lng": "9.67145", "elevation": "212.10000610351563", "time": "2013-09-20T09:09:20.267Z"}, {"lat": "44.141331", "lng": "9.671521", "elevation": "211.39999389648438", "time": "2013-09-20T09:09:27.267Z"}, {"lat": "44.141326", "lng": "9.671536", "elevation": "211.3000030517578", "time": "2013-09-20T09:09:28.285Z"}, {"lat": "44.141303", "lng": "9.671647", "elevation": "212.6999969482422", "time": "2013-09-20T09:09:34.347Z"}, {"lat": "44.141298", "lng": "9.671664", "elevation": "212.60000610351563", "time": "2013-09-20T09:09:35.362Z"}, {"lat": "44.141252", "lng": "9.671752", "elevation": "211.3000030517578", "time": "2013-09-20T09:09:41.277Z"}, {"lat": "44.141247", "lng": "9.671769", "elevation": "211.1999969482422", "time": "2013-09-20T09:09:42.325Z"}, {"lat": "44.141196", "lng": "9.671864", "elevation": "213.8000030517578", "time": "2013-09-20T09:09:48.287Z"}, {"lat": "44.141177", "lng": "9.671877", "elevation": "213.3000030517578", "time": "2013-09-20T09:09:49.287Z"}, {"lat": "44.141107", "lng": "9.671917", "elevation": "214.3000030517578", "time": "2013-09-20T09:09:53.318Z"}, {"lat": "44.141094", "lng": "9.671927", "elevation": "214.10000610351563", "time": "2013-09-20T09:09:54.286Z"}, {"lat": "44.141035", "lng": "9.672006", "elevation": "213.6999969482422", "time": "2013-09-20T09:10:00.393Z"}, {"lat": "44.141027", "lng": "9.672018", "elevation": "212.60000610351563", "time": "2013-09-20T09:10:01.294Z"}, {"lat": "44.14094", "lng": "9.672043", "elevation": "213.1999969482422", "time": "2013-09-20T09:10:07.286Z"}, {"lat": "44.140927", "lng": "9.672048", "elevation": "214.39999389648438", "time": "2013-09-20T09:10:08.301Z"}, {"lat": "44.140852", "lng": "9.672109", "elevation": "217.5", "time": "2013-09-20T09:10:15.367Z"}, {"lat": "44.140845", "lng": "9.672117", "elevation": "217.0", "time": "2013-09-20T09:10:16.345Z"}, {"lat": "44.140788", "lng": "9.672193", "elevation": "215.60000610351563", "time": "2013-09-20T09:10:28.273Z"}, {"lat": "44.140779", "lng": "9.672203", "elevation": "216.1999969482422", "time": "2013-09-20T09:10:29.281Z"}, {"lat": "44.140702", "lng": "9.672256", "elevation": "214.89999389648438", "time": "2013-09-20T09:10:45.297Z"}, {"lat": "44.140699", "lng": "9.672262", "elevation": "214.1999969482422", "time": "2013-09-20T09:10:46.331Z"}, {"lat": "44.140637", "lng": "9.672337", "elevation": "216.10000610351563", "time": "2013-09-20T09:10:57.306Z"}, {"lat": "44.140626", "lng": "9.672344", "elevation": "216.1999969482422", "time": "2013-09-20T09:10:58.274Z"}, {"lat": "44.140567", "lng": "9.67243", "elevation": "216.10000610351563", "time": "2013-09-20T09:11:05.308Z"}, {"lat": "44.140564", "lng": "9.672447", "elevation": "216.8000030517578", "time": "2013-09-20T09:11:06.283Z"}, {"lat": "44.140541", "lng": "9.672555", "elevation": "218.5", "time": "2013-09-20T09:11:12.293Z"}, {"lat": "44.140535", "lng": "9.672568", "elevation": "218.89999389648438", "time": "2013-09-20T09:11:13.309Z"}, {"lat": "44.14053", "lng": "9.672691", "elevation": "218.0", "time": "2013-09-20T09:11:23.294Z"}, {"lat": "44.140535", "lng": "9.672708", "elevation": "216.89999389648438", "time": "2013-09-20T09:11:24.308Z"}, {"lat": "44.140551", "lng": "9.672822", "elevation": "221.10000610351563", "time": "2013-09-20T09:11:36.304Z"}, {"lat": "44.140552", "lng": "9.672832", "elevation": "221.5", "time": "2013-09-20T09:11:37.287Z"}, {"lat": "44.140572", "lng": "9.672943", "elevation": "219.8000030517578", "time": "2013-09-20T09:11:47.311Z"}, {"lat": "44.140574", "lng": "9.672955", "elevation": "219.3000030517578", "time": "2013-09-20T09:11:48.303Z"}, {"lat": "44.140561", "lng": "9.673054", "elevation": "218.5", "time": "2013-09-20T09:12:00.309Z"}, {"lat": "44.140562", "lng": "9.673054", "elevation": "218.6999969482422", "time": "2013-09-20T09:12:01.281Z"}, {"lat": "44.140573", "lng": "9.673073", "elevation": "217.6999969482422", "time": "2013-09-20T09:12:42.300Z"}, {"lat": "44.140572", "lng": "9.673081", "elevation": "216.60000610351563", "time": "2013-09-20T09:12:43.380Z"}, {"lat": "44.140562", "lng": "9.673203", "elevation": "212.5", "time": "2013-09-20T09:12:50.300Z"}, {"lat": "44.140571", "lng": "9.673217", "elevation": "212.39999389648438", "time": "2013-09-20T09:12:51.357Z"}, {"lat": "44.140627", "lng": "9.673314", "elevation": "209.8000030517578", "time": "2013-09-20T09:12:59.363Z"}, {"lat": "44.140628", "lng": "9.673317", "elevation": "210.10000610351563", "time": "2013-09-20T09:13:00.451Z"}, {"lat": "44.140604", "lng": "9.673426", "elevation": "208.89999389648438", "time": "2013-09-20T09:13:09.349Z"}, {"lat": "44.140605", "lng": "9.673443", "elevation": "206.89999389648438", "time": "2013-09-20T09:13:10.332Z"}, {"lat": "44.140649", "lng": "9.67355", "elevation": "204.89999389648438", "time": "2013-09-20T09:13:18.320Z"}, {"lat": "44.140649", "lng": "9.673571", "elevation": "204.8000030517578", "time": "2013-09-20T09:13:19.320Z"}, {"lat": "44.140614", "lng": "9.673678", "elevation": "208.0", "time": "2013-09-20T09:13:24.313Z"}, {"lat": "44.140609", "lng": "9.673696", "elevation": "208.5", "time": "2013-09-20T09:13:25.307Z"}, {"lat": "44.140609", "lng": "9.673815", "elevation": "209.1999969482422", "time": "2013-09-20T09:13:33.316Z"}, {"lat": "44.140604", "lng": "9.673838", "elevation": "208.8000030517578", "time": "2013-09-20T09:13:34.347Z"}, {"lat": "44.140612", "lng": "9.673959", "elevation": "205.10000610351563", "time": "2013-09-20T09:13:41.294Z"}, {"lat": "44.140623", "lng": "9.673962", "elevation": "205.5", "time": "2013-09-20T09:13:42.294Z"}, {"lat": "44.140633", "lng": "9.67408", "elevation": "206.60000610351563", "time": "2013-09-20T09:13:56.327Z"}, {"lat": "44.140625", "lng": "9.674094", "elevation": "205.3000030517578", "time": "2013-09-20T09:13:57.367Z"}, {"lat": "44.14059", "lng": "9.674206", "elevation": "204.5", "time": "2013-09-20T09:14:04.403Z"}, {"lat": "44.140588", "lng": "9.674225", "elevation": "204.89999389648438", "time": "2013-09-20T09:14:05.377Z"}, {"lat": "44.140568", "lng": "9.674345", "elevation": "206.0", "time": "2013-09-20T09:14:19.314Z"}, {"lat": "44.140567", "lng": "9.674357", "elevation": "206.39999389648438", "time": "2013-09-20T09:14:20.324Z"}, {"lat": "44.140591", "lng": "9.674469", "elevation": "207.1999969482422", "time": "2013-09-20T09:14:28.305Z"}, {"lat": "44.140591", "lng": "9.674481", "elevation": "206.89999389648438", "time": "2013-09-20T09:14:29.331Z"}, {"lat": "44.140605", "lng": "9.674598", "elevation": "209.60000610351563", "time": "2013-09-20T09:14:41.301Z"}, {"lat": "44.140609", "lng": "9.674611", "elevation": "210.60000610351563", "time": "2013-09-20T09:14:42.300Z"}, {"lat": "44.140588", "lng": "9.674654", "elevation": "211.3000030517578", "time": "2013-09-20T09:14:52.377Z"}, {"lat": "44.140587", "lng": "9.674654", "elevation": "211.10000610351563", "time": "2013-09-20T09:14:53.377Z"}, {"lat": "44.140596", "lng": "9.674662", "elevation": "210.3000030517578", "time": "2013-09-20T09:15:08.326Z"}, {"lat": "44.140596", "lng": "9.674669", "elevation": "210.10000610351563", "time": "2013-09-20T09:15:09.303Z"}, {"lat": "44.140624", "lng": "9.674769", "elevation": "205.1999969482422", "time": "2013-09-20T09:15:15.295Z"}, {"lat": "44.140634", "lng": "9.67479", "elevation": "204.60000610351563", "time": "2013-09-20T09:15:16.295Z"}, {"lat": "44.140666", "lng": "9.67489", "elevation": "206.10000610351563", "time": "2013-09-20T09:15:21.336Z"}, {"lat": "44.140673", "lng": "9.67491", "elevation": "207.39999389648438", "time": "2013-09-20T09:15:22.319Z"}, {"lat": "44.140681", "lng": "9.67502", "elevation": "207.6999969482422", "time": "2013-09-20T09:15:26.308Z"}, {"lat": "44.140676", "lng": "9.675045", "elevation": "209.3000030517578", "time": "2013-09-20T09:15:27.294Z"}, {"lat": "44.140648", "lng": "9.675161", "elevation": "210.10000610351563", "time": "2013-09-20T09:15:33.304Z"}, {"lat": "44.140649", "lng": "9.675166", "elevation": "210.0", "time": "2013-09-20T09:15:34.317Z"}, {"lat": "44.140668", "lng": "9.675164", "elevation": "210.0", "time": "2013-09-20T09:15:41.295Z"}, {"lat": "44.140669", "lng": "9.675165", "elevation": "210.0", "time": "2013-09-20T09:15:42.312Z"}, {"lat": "44.140668", "lng": "9.675169", "elevation": "209.1999969482422", "time": "2013-09-20T09:16:01.315Z"}, {"lat": "44.140663", "lng": "9.675176", "elevation": "208.1999969482422", "time": "2013-09-20T09:16:02.333Z"}, {"lat": "44.140639", "lng": "9.675219", "elevation": "207.10000610351563", "time": "2013-09-20T09:16:06.354Z"}, {"lat": "44.140631", "lng": "9.675516", "elevation": "195.5", "time": "2013-09-20T09:16:40.254Z"}, {"lat": "44.1406", "lng": "9.675602", "elevation": "206.89999389648438", "time": "2013-09-20T09:16:44.253Z"}, {"lat": "44.140593", "lng": "9.675632", "elevation": "209.0", "time": "2013-09-20T09:16:45.231Z"}, {"lat": "44.140526", "lng": "9.675678", "elevation": "207.89999389648438", "time": "2013-09-20T09:16:50.222Z"}, {"lat": "44.140505", "lng": "9.675667", "elevation": "207.3000030517578", "time": "2013-09-20T09:16:51.262Z"}, {"lat": "44.140521", "lng": "9.675644", "elevation": "205.60000610351563", "time": "2013-09-20T09:16:59.234Z"}, {"lat": "44.140522", "lng": "9.675644", "elevation": "205.6999969482422", "time": "2013-09-20T09:17:00.270Z"}, {"lat": "44.140515", "lng": "9.675657", "elevation": "206.0", "time": "2013-09-20T09:17:55.237Z"}, {"lat": "44.140517", "lng": "9.675663", "elevation": "207.5", "time": "2013-09-20T09:17:56.239Z"}, {"lat": "44.14057", "lng": "9.675754", "elevation": "209.39999389648438", "time": "2013-09-20T09:18:03.245Z"}, {"lat": "44.14058", "lng": "9.675765", "elevation": "209.1999969482422", "time": "2013-09-20T09:18:04.238Z"}, {"lat": "44.140586", "lng": "9.675823", "elevation": "211.5", "time": "2013-09-20T09:18:16.245Z"}, {"lat": "44.140586", "lng": "9.675825", "elevation": "211.60000610351563", "time": "2013-09-20T09:18:17.255Z"}, {"lat": "44.140592", "lng": "9.675829", "elevation": "211.6999969482422", "time": "2013-09-20T09:18:27.265Z"}, {"lat": "44.140593", "lng": "9.675839", "elevation": "212.6999969482422", "time": "2013-09-20T09:18:28.239Z"}, {"lat": "44.140558", "lng": "9.675943", "elevation": "219.39999389648438", "time": "2013-09-20T09:18:35.254Z"}, {"lat": "44.140548", "lng": "9.675955", "elevation": "220.1999969482422", "time": "2013-09-20T09:18:36.272Z"}, {"lat": "44.140505", "lng": "9.676063", "elevation": "222.6999969482422", "time": "2013-09-20T09:18:41.262Z"}, {"lat": "44.140501", "lng": "9.676086", "elevation": "223.3000030517578", "time": "2013-09-20T09:18:42.242Z"}, {"lat": "44.140424", "lng": "9.676136", "elevation": "223.60000610351563", "time": "2013-09-20T09:18:48.329Z"}, {"lat": "44.140408", "lng": "9.676142", "elevation": "223.60000610351563", "time": "2013-09-20T09:18:49.258Z"}, {"lat": "44.14036", "lng": "9.676245", "elevation": "221.0", "time": "2013-09-20T09:18:57.256Z"}, {"lat": "44.140359", "lng": "9.67626", "elevation": "219.8000030517578", "time": "2013-09-20T09:18:58.264Z"}, {"lat": "44.140321", "lng": "9.676372", "elevation": "220.60000610351563", "time": "2013-09-20T09:19:08.242Z"}, {"lat": "44.140317", "lng": "9.676377", "elevation": "221.0", "time": "2013-09-20T09:19:09.241Z"}, {"lat": "44.140239", "lng": "9.676438", "elevation": "218.89999389648438", "time": "2013-09-20T09:19:25.242Z"}, {"lat": "44.140236", "lng": "9.676448", "elevation": "220.5", "time": "2013-09-20T09:19:26.252Z"}, {"lat": "44.140213", "lng": "9.676558", "elevation": "213.5", "time": "2013-09-20T09:19:36.244Z"}, {"lat": "44.140218", "lng": "9.67658", "elevation": "212.3000030517578", "time": "2013-09-20T09:19:37.252Z"}, {"lat": "44.140208", "lng": "9.676694", "elevation": "208.10000610351563", "time": "2013-09-20T09:19:44.317Z"}, {"lat": "44.140202", "lng": "9.676706", "elevation": "207.1999969482422", "time": "2013-09-20T09:19:45.245Z"}, {"lat": "44.140178", "lng": "9.67682", "elevation": "206.60000610351563", "time": "2013-09-20T09:19:53.350Z"}, {"lat": "44.140177", "lng": "9.676834", "elevation": "207.3000030517578", "time": "2013-09-20T09:19:54.269Z"}, {"lat": "44.140178", "lng": "9.676951", "elevation": "204.5", "time": "2013-09-20T09:20:07.247Z"}, {"lat": "44.140184", "lng": "9.676964", "elevation": "204.10000610351563", "time": "2013-09-20T09:20:08.249Z"}, {"lat": "44.140158", "lng": "9.677077", "elevation": "206.10000610351563", "time": "2013-09-20T09:20:17.254Z"}, {"lat": "44.140146", "lng": "9.677089", "elevation": "206.60000610351563", "time": "2013-09-20T09:20:18.257Z"}, {"lat": "44.140076", "lng": "9.677164", "elevation": "208.10000610351563", "time": "2013-09-20T09:20:24.263Z"}, {"lat": "44.140066", "lng": "9.677187", "elevation": "207.3000030517578", "time": "2013-09-20T09:20:25.240Z"}, {"lat": "44.140011", "lng": "9.677273", "elevation": "208.39999389648438", "time": "2013-09-20T09:20:31.239Z"}, {"lat": "44.140003", "lng": "9.677287", "elevation": "208.3000030517578", "time": "2013-09-20T09:20:32.354Z"}, {"lat": "44.139937", "lng": "9.677346", "elevation": "209.39999389648438", "time": "2013-09-20T09:20:38.400Z"}, {"lat": "44.139926", "lng": "9.677353", "elevation": "210.0", "time": "2013-09-20T09:20:39.352Z"}, {"lat": "44.139849", "lng": "9.677395", "elevation": "208.39999389648438", "time": "2013-09-20T09:20:46.251Z"}, {"lat": "44.139841", "lng": "9.677402", "elevation": "210.39999389648438", "time": "2013-09-20T09:20:47.272Z"}, {"lat": "44.13977", "lng": "9.677457", "elevation": "211.60000610351563", "time": "2013-09-20T09:20:54.275Z"}, {"lat": "44.139763", "lng": "9.677472", "elevation": "212.0", "time": "2013-09-20T09:20:55.243Z"}, {"lat": "44.139711", "lng": "9.677569", "elevation": "214.0", "time": "2013-09-20T09:21:04.245Z"}, {"lat": "44.139705", "lng": "9.677577", "elevation": "213.60000610351563", "time": "2013-09-20T09:21:05.251Z"}, {"lat": "44.139645", "lng": "9.677534", "elevation": "217.1999969482422", "time": "2013-09-20T09:21:20.247Z"}, {"lat": "44.139644", "lng": "9.677533", "elevation": "217.1999969482422", "time": "2013-09-20T09:21:21.252Z"}, {"lat": "44.139635", "lng": "9.677543", "elevation": "216.89999389648438", "time": "2013-09-20T09:21:30.277Z"}, {"lat": "44.139631", "lng": "9.677547", "elevation": "217.10000610351563", "time": "2013-09-20T09:21:31.253Z"}, {"lat": "44.139551", "lng": "9.677589", "elevation": "218.8000030517578", "time": "2013-09-20T09:21:35.259Z"}, {"lat": "44.139524", "lng": "9.67759", "elevation": "218.60000610351563", "time": "2013-09-20T09:21:36.248Z"}, {"lat": "44.139454", "lng": "9.677585", "elevation": "219.10000610351563", "time": "2013-09-20T09:21:39.283Z"}, {"lat": "44.139433", "lng": "9.677585", "elevation": "218.89999389648438", "time": "2013-09-20T09:21:40.253Z"}, {"lat": "44.13935", "lng": "9.677614", "elevation": "219.1999969482422", "time": "2013-09-20T09:21:44.252Z"}, {"lat": "44.139334", "lng": "9.677625", "elevation": "218.60000610351563", "time": "2013-09-20T09:21:45.262Z"}, {"lat": "44.139269", "lng": "9.677702", "elevation": "216.5", "time": "2013-09-20T09:21:49.284Z"}, {"lat": "44.139256", "lng": "9.677719", "elevation": "214.89999389648438", "time": "2013-09-20T09:21:50.277Z"}, {"lat": "44.13917", "lng": "9.677756", "elevation": "220.89999389648438", "time": "2013-09-20T09:21:57.255Z"}, {"lat": "44.139157", "lng": "9.677764", "elevation": "221.5", "time": "2013-09-20T09:21:58.270Z"}, {"lat": "44.13907", "lng": "9.677779", "elevation": "221.5", "time": "2013-09-20T09:22:06.319Z"}, {"lat": "44.139058", "lng": "9.677776", "elevation": "220.6999969482422", "time": "2013-09-20T09:22:07.350Z"}, {"lat": "44.139001", "lng": "9.677871", "elevation": "224.0", "time": "2013-09-20T09:22:15.265Z"}, {"lat": "44.138985", "lng": "9.677885", "elevation": "225.0", "time": "2013-09-20T09:22:16.321Z"}, {"lat": "44.138915", "lng": "9.677936", "elevation": "227.10000610351563", "time": "2013-09-20T09:22:20.255Z"}, {"lat": "44.138896", "lng": "9.677943", "elevation": "227.39999389648438", "time": "2013-09-20T09:22:21.280Z"}, {"lat": "44.138807", "lng": "9.677963", "elevation": "228.60000610351563", "time": "2013-09-20T09:22:27.258Z"}, {"lat": "44.138795", "lng": "9.677966", "elevation": "228.5", "time": "2013-09-20T09:22:28.288Z"}, {"lat": "44.13872", "lng": "9.677989", "elevation": "229.60000610351563", "time": "2013-09-20T09:22:33.282Z"}, {"lat": "44.138702", "lng": "9.677992", "elevation": "232.39999389648438", "time": "2013-09-20T09:22:34.279Z"}, {"lat": "44.138622", "lng": "9.677985", "elevation": "231.39999389648438", "time": "2013-09-20T09:22:38.282Z"}, {"lat": "44.138604", "lng": "9.677982", "elevation": "232.10000610351563", "time": "2013-09-20T09:22:39.282Z"}, {"lat": "44.138516", "lng": "9.677967", "elevation": "234.60000610351563", "time": "2013-09-20T09:22:45.267Z"}, {"lat": "44.138508", "lng": "9.677969", "elevation": "236.3000030517578", "time": "2013-09-20T09:22:46.285Z"}, {"lat": "44.138439", "lng": "9.678037", "elevation": "238.89999389648438", "time": "2013-09-20T09:22:54.343Z"}, {"lat": "44.138428", "lng": "9.678039", "elevation": "240.1999969482422", "time": "2013-09-20T09:22:55.326Z"}, {"lat": "44.138345", "lng": "9.678053", "elevation": "235.39999389648438", "time": "2013-09-20T09:23:07.297Z"}, {"lat": "44.138338", "lng": "9.678057", "elevation": "236.39999389648438", "time": "2013-09-20T09:23:08.282Z"}, {"lat": "44.138254", "lng": "9.678067", "elevation": "240.89999389648438", "time": "2013-09-20T09:23:17.285Z"}, {"lat": "44.138247", "lng": "9.678071", "elevation": "240.8000030517578", "time": "2013-09-20T09:23:18.359Z"}, {"lat": "44.138243", "lng": "9.678189", "elevation": "224.6999969482422", "time": "2013-09-20T09:23:38.272Z"}, {"lat": "44.138243", "lng": "9.678197", "elevation": "224.5", "time": "2013-09-20T09:23:39.280Z"}, {"lat": "44.138248", "lng": "9.678206", "elevation": "223.8000030517578", "time": "2013-09-20T09:23:43.366Z"}, {"lat": "44.138248", "lng": "9.678205", "elevation": "224.8000030517578", "time": "2013-09-20T09:23:44.326Z"}, {"lat": "44.13825", "lng": "9.678205", "elevation": "223.10000610351563", "time": "2013-09-20T09:23:46.278Z"}, {"lat": "44.138254", "lng": "9.678206", "elevation": "222.89999389648438", "time": "2013-09-20T09:23:47.294Z"}, {"lat": "44.138273", "lng": "9.678225", "elevation": "219.39999389648438", "time": "2013-09-20T09:23:55.289Z"}, {"lat": "44.138273", "lng": "9.678226", "elevation": "219.3000030517578", "time": "2013-09-20T09:23:56.295Z"}, {"lat": "44.138272", "lng": "9.678229", "elevation": "219.0", "time": "2013-09-20T09:23:59.366Z"}, {"lat": "44.138272", "lng": "9.678235", "elevation": "216.6999969482422", "time": "2013-09-20T09:24:00.358Z"}, {"lat": "44.13827", "lng": "9.678347", "elevation": "205.6999969482422", "time": "2013-09-20T09:24:06.311Z"}, {"lat": "44.138268", "lng": "9.678371", "elevation": "204.8000030517578", "time": "2013-09-20T09:24:07.289Z"}, {"lat": "44.138286", "lng": "9.678438", "elevation": "204.8000030517578", "time": "2013-09-20T09:24:17.283Z"}, {"lat": "44.138286", "lng": "9.678439", "elevation": "204.5", "time": "2013-09-20T09:24:18.321Z"}, {"lat": "44.138282", "lng": "9.678456", "elevation": "202.89999389648438", "time": "2013-09-20T09:24:32.284Z"}, {"lat": "44.13828", "lng": "9.678465", "elevation": "202.3000030517578", "time": "2013-09-20T09:24:33.275Z"}, {"lat": "44.138262", "lng": "9.678573", "elevation": "197.1999969482422", "time": "2013-09-20T09:24:39.282Z"}, {"lat": "44.138254", "lng": "9.678589", "elevation": "197.6999969482422", "time": "2013-09-20T09:24:40.350Z"}, {"lat": "44.1382", "lng": "9.678683", "elevation": "196.39999389648438", "time": "2013-09-20T09:24:52.299Z"}, {"lat": "44.138196", "lng": "9.678692", "elevation": "195.0", "time": "2013-09-20T09:24:53.310Z"}, {"lat": "44.138166", "lng": "9.678792", "elevation": "196.10000610351563", "time": "2013-09-20T09:25:00.368Z"}, {"lat": "44.138159", "lng": "9.678807", "elevation": "196.3000030517578", "time": "2013-09-20T09:25:01.268Z"}, {"lat": "44.138194", "lng": "9.678917", "elevation": "198.6999969482422", "time": "2013-09-20T09:25:12.278Z"}, {"lat": "44.138197", "lng": "9.678928", "elevation": "198.8000030517578", "time": "2013-09-20T09:25:13.270Z"}, {"lat": "44.138226", "lng": "9.678961", "elevation": "197.39999389648438", "time": "2013-09-20T09:25:22.286Z"}, {"lat": "44.138225", "lng": "9.678964", "elevation": "197.1999969482422", "time": "2013-09-20T09:25:23.295Z"}, {"lat": "44.13823", "lng": "9.678985", "elevation": "194.39999389648438", "time": "2013-09-20T09:25:41.296Z"}, {"lat": "44.138232", "lng": "9.678992", "elevation": "194.6999969482422", "time": "2013-09-20T09:25:42.279Z"}, {"lat": "44.138286", "lng": "9.679026", "elevation": "190.8000030517578", "time": "2013-09-20T09:25:53.328Z"}, {"lat": "44.138286", "lng": "9.679026", "elevation": "190.5", "time": "2013-09-20T09:25:54.291Z"}, {"lat": "44.138286", "lng": "9.679034", "elevation": "191.0", "time": "2013-09-20T09:25:58.330Z"}, {"lat": "44.138288", "lng": "9.679045", "elevation": "190.1999969482422", "time": "2013-09-20T09:25:59.291Z"}, {"lat": "44.138312", "lng": "9.679158", "elevation": "185.89999389648438", "time": "2013-09-20T09:26:07.275Z"}, {"lat": "44.138313", "lng": "9.679171", "elevation": "184.6999969482422", "time": "2013-09-20T09:26:08.298Z"}, {"lat": "44.138306", "lng": "9.679292", "elevation": "183.10000610351563", "time": "2013-09-20T09:26:21.294Z"}, {"lat": "44.138303", "lng": "9.679298", "elevation": "183.39999389648438", "time": "2013-09-20T09:26:22.282Z"}, {"lat": "44.138285", "lng": "9.679396", "elevation": "176.60000610351563", "time": "2013-09-20T09:26:40.299Z"}, {"lat": "44.138285", "lng": "9.679395", "elevation": "176.6999969482422", "time": "2013-09-20T09:26:41.292Z"}, {"lat": "44.138283", "lng": "9.679398", "elevation": "176.60000610351563", "time": "2013-09-20T09:26:43.291Z"}, {"lat": "44.138279", "lng": "9.679403", "elevation": "176.3000030517578", "time": "2013-09-20T09:26:44.301Z"}, {"lat": "44.138229", "lng": "9.679493", "elevation": "172.5", "time": "2013-09-20T09:26:55.358Z"}, {"lat": "44.138228", "lng": "9.679506", "elevation": "172.89999389648438", "time": "2013-09-20T09:26:56.326Z"}, {"lat": "44.138213", "lng": "9.679581", "elevation": "172.60000610351563", "time": "2013-09-20T09:27:06.325Z"}, {"lat": "44.138215", "lng": "9.679582", "elevation": "172.6999969482422", "time": "2013-09-20T09:27:07.294Z"}, {"lat": "44.138199", "lng": "9.679572", "elevation": "172.0", "time": "2013-09-20T09:27:23.288Z"}, {"lat": "44.138195", "lng": "9.679574", "elevation": "172.1999969482422", "time": "2013-09-20T09:27:24.287Z"}, {"lat": "44.138114", "lng": "9.679621", "elevation": "169.5", "time": "2013-09-20T09:27:32.315Z"}, {"lat": "44.138106", "lng": "9.679629", "elevation": "170.60000610351563", "time": "2013-09-20T09:27:33.290Z"}, {"lat": "44.138108", "lng": "9.67968", "elevation": "168.1999969482422", "time": "2013-09-20T09:27:41.305Z"}, {"lat": "44.138107", "lng": "9.679679", "elevation": "168.1999969482422", "time": "2013-09-20T09:27:42.305Z"}, {"lat": "44.138102", "lng": "9.679695", "elevation": "165.39999389648438", "time": "2013-09-20T09:27:54.314Z"}, {"lat": "44.138099", "lng": "9.6797", "elevation": "165.5", "time": "2013-09-20T09:27:55.296Z"}, {"lat": "44.138052", "lng": "9.679789", "elevation": "166.0", "time": "2013-09-20T09:28:04.304Z"}, {"lat": "44.138043", "lng": "9.679801", "elevation": "166.60000610351563", "time": "2013-09-20T09:28:05.322Z"}, {"lat": "44.137982", "lng": "9.679877", "elevation": "163.5", "time": "2013-09-20T09:28:14.289Z"}, {"lat": "44.137973", "lng": "9.679881", "elevation": "163.6999969482422", "time": "2013-09-20T09:28:15.376Z"}, {"lat": "44.137898", "lng": "9.679945", "elevation": "163.1999969482422", "time": "2013-09-20T09:28:22.307Z"}, {"lat": "44.137892", "lng": "9.679957", "elevation": "163.10000610351563", "time": "2013-09-20T09:28:23.299Z"}, {"lat": "44.137811", "lng": "9.680002", "elevation": "161.0", "time": "2013-09-20T09:28:33.301Z"}, {"lat": "44.137806", "lng": "9.680006", "elevation": "161.6999969482422", "time": "2013-09-20T09:28:34.301Z"}, {"lat": "44.137785", "lng": "9.680024", "elevation": "160.6999969482422", "time": "2013-09-20T09:28:40.318Z"}, {"lat": "44.137789", "lng": "9.680023", "elevation": "161.10000610351563", "time": "2013-09-20T09:28:41.318Z"}, {"lat": "44.137792", "lng": "9.680034", "elevation": "162.5", "time": "2013-09-20T09:28:49.325Z"}, {"lat": "44.137787", "lng": "9.680036", "elevation": "162.1999969482422", "time": "2013-09-20T09:28:50.318Z"}, {"lat": "44.137728", "lng": "9.680109", "elevation": "156.8000030517578", "time": "2013-09-20T09:28:58.302Z"}, {"lat": "44.137718", "lng": "9.680118", "elevation": "155.6999969482422", "time": "2013-09-20T09:28:59.309Z"}, {"lat": "44.13766", "lng": "9.680206", "elevation": "153.60000610351563", "time": "2013-09-20T09:29:07.310Z"}, {"lat": "44.137658", "lng": "9.680217", "elevation": "152.39999389648438", "time": "2013-09-20T09:29:08.311Z"}, {"lat": "44.137629", "lng": "9.68033", "elevation": "151.39999389648438", "time": "2013-09-20T09:29:25.294Z"}, {"lat": "44.137629", "lng": "9.680338", "elevation": "151.1999969482422", "time": "2013-09-20T09:29:26.322Z"}, {"lat": "44.137663", "lng": "9.680357", "elevation": "148.1999969482422", "time": "2013-09-20T09:29:35.304Z"}, {"lat": "44.137662", "lng": "9.680357", "elevation": "148.1999969482422", "time": "2013-09-20T09:29:36.298Z"}, {"lat": "44.137657", "lng": "9.680357", "elevation": "147.8000030517578", "time": "2013-09-20T09:29:38.260Z"}, {"lat": "44.137652", "lng": "9.680356", "elevation": "147.89999389648438", "time": "2013-09-20T09:29:38.294Z"}, {"lat": "44.137566", "lng": "9.680328", "elevation": "147.89999389648438", "time": "2013-09-20T09:29:49.322Z"}, {"lat": "44.137562", "lng": "9.680335", "elevation": "148.3000030517578", "time": "2013-09-20T09:29:50.307Z"}, {"lat": "44.137504", "lng": "9.680421", "elevation": "146.0", "time": "2013-09-20T09:30:01.319Z"}, {"lat": "44.137495", "lng": "9.680429", "elevation": "146.8000030517578", "time": "2013-09-20T09:30:02.322Z"}, {"lat": "44.137471", "lng": "9.68045", "elevation": "142.1999969482422", "time": "2013-09-20T09:30:08.322Z"}, {"lat": "44.137475", "lng": "9.680451", "elevation": "142.39999389648438", "time": "2013-09-20T09:30:09.305Z"}, {"lat": "44.13748", "lng": "9.68045", "elevation": "142.60000610351563", "time": "2013-09-20T09:30:10.322Z"}, {"lat": "44.137481", "lng": "9.68045", "elevation": "142.60000610351563", "time": "2013-09-20T09:30:11.308Z"}, {"lat": "44.137477", "lng": "9.680446", "elevation": "142.8000030517578", "time": "2013-09-20T09:30:13.300Z"}, {"lat": "44.137471", "lng": "9.680443", "elevation": "145.0", "time": "2013-09-20T09:30:14.308Z"}, {"lat": "44.137448", "lng": "9.680447", "elevation": "144.60000610351563", "time": "2013-09-20T09:30:35.325Z"}, {"lat": "44.137448", "lng": "9.680446", "elevation": "144.5", "time": "2013-09-20T09:30:36.319Z"}, {"lat": "44.137441", "lng": "9.680445", "elevation": "144.10000610351563", "time": "2013-09-20T09:30:41.373Z"}, {"lat": "44.137436", "lng": "9.680444", "elevation": "143.6999969482422", "time": "2013-09-20T09:30:42.333Z"}, {"lat": "44.137362", "lng": "9.680377", "elevation": "140.89999389648438", "time": "2013-09-20T09:30:58.336Z"}, {"lat": "44.137354", "lng": "9.680371", "elevation": "141.89999389648438", "time": "2013-09-20T09:30:59.326Z"}, {"lat": "44.137318", "lng": "9.680375", "elevation": "141.3000030517578", "time": "2013-09-20T09:31:07.407Z"}, {"lat": "44.137319", "lng": "9.680376", "elevation": "141.1999969482422", "time": "2013-09-20T09:31:08.446Z"}, {"lat": "44.137316", "lng": "9.680386", "elevation": "140.6999969482422", "time": "2013-09-20T09:31:12.376Z"}, {"lat": "44.137313", "lng": "9.680391", "elevation": "140.1999969482422", "time": "2013-09-20T09:31:13.304Z"}, {"lat": "44.137241", "lng": "9.680448", "elevation": "140.5", "time": "2013-09-20T09:31:22.335Z"}, {"lat": "44.137234", "lng": "9.680452", "elevation": "140.10000610351563", "time": "2013-09-20T09:31:23.426Z"}, {"lat": "44.137146", "lng": "9.680462", "elevation": "139.60000610351563", "time": "2013-09-20T09:31:38.435Z"}, {"lat": "44.137138", "lng": "9.680468", "elevation": "137.39999389648438", "time": "2013-09-20T09:31:39.355Z"}, {"lat": "44.137067", "lng": "9.680541", "elevation": "134.8000030517578", "time": "2013-09-20T09:31:48.350Z"}, {"lat": "44.137056", "lng": "9.680546", "elevation": "135.1999969482422", "time": "2013-09-20T09:31:48.378Z"}, {"lat": "44.136989", "lng": "9.680622", "elevation": "132.10000610351563", "time": "2013-09-20T09:31:58.072Z"}, {"lat": "44.136983", "lng": "9.680626", "elevation": "131.8000030517578", "time": "2013-09-20T09:31:58.411Z"}, {"lat": "44.13691", "lng": "9.680685", "elevation": "122.5", "time": "2013-09-20T09:32:14.311Z"}, {"lat": "44.1369", "lng": "9.680693", "elevation": "122.0999984741211", "time": "2013-09-20T09:32:15.324Z"}, {"lat": "44.136825", "lng": "9.680753", "elevation": "122.30000305175781", "time": "2013-09-20T09:32:24.311Z"}, {"lat": "44.13682", "lng": "9.680757", "elevation": "122.4000015258789", "time": "2013-09-20T09:32:25.318Z"}, {"lat": "44.13679", "lng": "9.680869", "elevation": "118.9000015258789", "time": "2013-09-20T09:32:35.310Z"}, {"lat": "44.136793", "lng": "9.680883", "elevation": "117.69999694824219", "time": "2013-09-20T09:32:36.325Z"}, {"lat": "44.136808", "lng": "9.680865", "elevation": "119.30000305175781", "time": "2013-09-20T09:32:43.487Z"}, {"lat": "44.136807", "lng": "9.680862", "elevation": "119.4000015258789", "time": "2013-09-20T09:32:44.399Z"}, {"lat": "44.136809", "lng": "9.680865", "elevation": "118.0", "time": "2013-09-20T09:32:46.322Z"}, {"lat": "44.136816", "lng": "9.680872", "elevation": "116.0", "time": "2013-09-20T09:32:47.375Z"}, {"lat": "44.136808", "lng": "9.680989", "elevation": "115.19999694824219", "time": "2013-09-20T09:33:01.335Z"}, {"lat": "44.136796", "lng": "9.680997", "elevation": "115.80000305175781", "time": "2013-09-20T09:33:02.329Z"}, {"lat": "44.136744", "lng": "9.681017", "elevation": "122.0", "time": "2013-09-20T09:33:15.387Z"}, {"lat": "44.136743", "lng": "9.681018", "elevation": "122.0", "time": "2013-09-20T09:33:16.440Z"}, {"lat": "44.136747", "lng": "9.681026", "elevation": "122.0", "time": "2013-09-20T09:33:34.434Z"}, {"lat": "44.136746", "lng": "9.681032", "elevation": "121.69999694824219", "time": "2013-09-20T09:33:35.447Z"}, {"lat": "44.136743", "lng": "9.681041", "elevation": "121.80000305175781", "time": "2013-09-20T09:33:38.809Z"}, {"lat": "44.136743", "lng": "9.681042", "elevation": "121.5999984741211", "time": "2013-09-20T09:33:39.348Z"}, {"lat": "44.136738", "lng": "9.681053", "elevation": "121.0999984741211", "time": "2013-09-20T09:33:55.372Z"}, {"lat": "44.136735", "lng": "9.68106", "elevation": "120.5", "time": "2013-09-20T09:33:56.339Z"}, {"lat": "44.13669", "lng": "9.681147", "elevation": "117.0", "time": "2013-09-20T09:34:09.499Z"}, {"lat": "44.136683", "lng": "9.681162", "elevation": "117.0", "time": "2013-09-20T09:34:10.421Z"}, {"lat": "44.136632", "lng": "9.681262", "elevation": "109.9000015258789", "time": "2013-09-20T09:34:18.314Z"}, {"lat": "44.13663", "lng": "9.681274", "elevation": "110.19999694824219", "time": "2013-09-20T09:34:18.356Z"}, {"lat": "44.136596", "lng": "9.681383", "elevation": "107.5", "time": "2013-09-20T09:34:43.441Z"}, {"lat": "44.136597", "lng": "9.681385", "elevation": "106.80000305175781", "time": "2013-09-20T09:34:43.473Z"}, {"lat": "44.136606", "lng": "9.681394", "elevation": "104.80000305175781", "time": "2013-09-20T09:34:48.412Z"}, {"lat": "44.136609", "lng": "9.681397", "elevation": "102.30000305175781", "time": "2013-09-20T09:34:48.444Z"}, {"lat": "44.13664", "lng": "9.681501", "elevation": "102.80000305175781", "time": "2013-09-20T09:35:01.438Z"}, {"lat": "44.13664", "lng": "9.6815", "elevation": "102.9000015258789", "time": "2013-09-20T09:35:02.371Z"}, {"lat": "44.13665", "lng": "9.681504", "elevation": "103.0", "time": "2013-09-20T09:35:31.443Z"}, {"lat": "44.13665", "lng": "9.681513", "elevation": "101.4000015258789", "time": "2013-09-20T09:35:32.341Z"}, {"lat": "44.13667", "lng": "9.681625", "elevation": "97.5", "time": "2013-09-20T09:35:38.483Z"}, {"lat": "44.136679", "lng": "9.681646", "elevation": "97.30000305175781", "time": "2013-09-20T09:35:39.341Z"}, {"lat": "44.13673", "lng": "9.681748", "elevation": "92.80000305175781", "time": "2013-09-20T09:35:50.359Z"}, {"lat": "44.136739", "lng": "9.681759", "elevation": "92.5999984741211", "time": "2013-09-20T09:35:51.437Z"}, {"lat": "44.136706", "lng": "9.681826", "elevation": "94.80000305175781", "time": "2013-09-20T09:36:08.146Z"}, {"lat": "44.136707", "lng": "9.681825", "elevation": "94.5", "time": "2013-09-20T09:36:08.390Z"}, {"lat": "44.136707", "lng": "9.681837", "elevation": "94.5", "time": "2013-09-20T09:36:39.352Z"}, {"lat": "44.136704", "lng": "9.681846", "elevation": "94.19999694824219", "time": "2013-09-20T09:36:40.378Z"}, {"lat": "44.136751", "lng": "9.68195", "elevation": "92.9000015258789", "time": "2013-09-20T09:36:48.422Z"}, {"lat": "44.136759", "lng": "9.681955", "elevation": "92.80000305175781", "time": "2013-09-20T09:36:49.442Z"}, {"lat": "44.136748", "lng": "9.682016", "elevation": "91.69999694824219", "time": "2013-09-20T09:37:00.429Z"}, {"lat": "44.136748", "lng": "9.682016", "elevation": "91.80000305175781", "time": "2013-09-20T09:37:01.458Z"}, {"lat": "44.136742", "lng": "9.682022", "elevation": "90.19999694824219", "time": "2013-09-20T09:37:20.330Z"}, {"lat": "44.136735", "lng": "9.68226", "elevation": "91.80000305175781", "time": "2013-09-20T09:37:38.350Z"}, {"lat": "44.136665", "lng": "9.682325", "elevation": "95.69999694824219", "time": "2013-09-20T09:37:52.361Z"}, {"lat": "44.136658", "lng": "9.682328", "elevation": "96.5", "time": "2013-09-20T09:37:53.354Z"}, {"lat": "44.136652", "lng": "9.682356", "elevation": "96.80000305175781", "time": "2013-09-20T09:38:01.402Z"}, {"lat": "44.136653", "lng": "9.682355", "elevation": "96.5", "time": "2013-09-20T09:38:02.353Z"}, {"lat": "44.136645", "lng": "9.682335", "elevation": "96.80000305175781", "time": "2013-09-20T09:38:21.350Z"}, {"lat": "44.136642", "lng": "9.682327", "elevation": "96.9000015258789", "time": "2013-09-20T09:38:22.352Z"}, {"lat": "44.136583", "lng": "9.682238", "elevation": "96.9000015258789", "time": "2013-09-20T09:38:29.385Z"}, {"lat": "44.136569", "lng": "9.682232", "elevation": "97.4000015258789", "time": "2013-09-20T09:38:30.362Z"}, {"lat": "44.136498", "lng": "9.682229", "elevation": "98.5", "time": "2013-09-20T09:38:34.355Z"}, {"lat": "44.136478", "lng": "9.68223", "elevation": "98.5999984741211", "time": "2013-09-20T09:38:35.346Z"}, {"lat": "44.136424", "lng": "9.682296", "elevation": "96.19999694824219", "time": "2013-09-20T09:38:50.350Z"}, {"lat": "44.136424", "lng": "9.682297", "elevation": "96.0999984741211", "time": "2013-09-20T09:38:51.347Z"}, {"lat": "44.136423", "lng": "9.682303", "elevation": "97.5999984741211", "time": "2013-09-20T09:40:53.088Z"}, {"lat": "44.136423", "lng": "9.682312", "elevation": "98.19999694824219", "time": "2013-09-20T09:40:53.412Z"}, {"lat": "44.1364", "lng": "9.682417", "elevation": "94.5", "time": "2013-09-20T09:40:58.346Z"}, {"lat": "44.136392", "lng": "9.682442", "elevation": "93.69999694824219", "time": "2013-09-20T09:40:59.357Z"}, {"lat": "44.136363", "lng": "9.682493", "elevation": "92.9000015258789", "time": "2013-09-20T09:41:02.357Z"}, {"lat": "44.136197", "lng": "9.682553", "elevation": "95.30000305175781", "time": "2013-09-20T09:41:56.360Z"}, {"lat": "44.136195", "lng": "9.682557", "elevation": "95.19999694824219", "time": "2013-09-20T09:41:57.381Z"}, {"lat": "44.136195", "lng": "9.682557", "elevation": "95.19999694824219", "time": "2013-09-20T09:41:58.201Z"}, {"lat": "44.136191", "lng": "9.682562", "elevation": "95.0999984741211", "time": "2013-09-20T09:41:58.415Z"}, {"lat": "44.136141", "lng": "9.682635", "elevation": "95.5", "time": "2013-09-20T09:42:01.418Z"}, {"lat": "44.136117", "lng": "9.68266", "elevation": "95.30000305175781", "time": "2013-09-20T09:42:02.411Z"}, {"lat": "44.136062", "lng": "9.682709", "elevation": "95.30000305175781", "time": "2013-09-20T09:42:04.388Z"}, {"lat": "44.136034", "lng": "9.682733", "elevation": "94.30000305175781", "time": "2013-09-20T09:42:05.350Z"}, {"lat": "44.135954", "lng": "9.682785", "elevation": "94.30000305175781", "time": "2013-09-20T09:42:08.350Z"}, {"lat": "44.135928", "lng": "9.682794", "elevation": "94.19999694824219", "time": "2013-09-20T09:42:09.434Z"}, {"lat": "44.135858", "lng": "9.682798", "elevation": "95.80000305175781", "time": "2013-09-20T09:42:17.378Z"}, {"lat": "44.135863", "lng": "9.682797", "elevation": "95.5999984741211", "time": "2013-09-20T09:42:18.394Z"}, {"lat": "44.135866", "lng": "9.682803", "elevation": "95.19999694824219", "time": "2013-09-20T09:42:27.370Z"}, {"lat": "44.135862", "lng": "9.682808", "elevation": "93.5999984741211", "time": "2013-09-20T09:42:28.402Z"}, {"lat": "44.135818", "lng": "9.682786", "elevation": "88.5999984741211", "time": "2013-09-20T09:42:38.527Z"}, {"lat": "44.135817", "lng": "9.682786", "elevation": "88.5999984741211", "time": "2013-09-20T09:42:39.437Z"}, {"lat": "44.135806", "lng": "9.682802", "elevation": "87.69999694824219", "time": "2013-09-20T09:42:49.407Z"}, {"lat": "44.1358", "lng": "9.682803", "elevation": "87.19999694824219", "time": "2013-09-20T09:42:50.384Z"}, {"lat": "44.135722", "lng": "9.682807", "elevation": "87.69999694824219", "time": "2013-09-20T09:42:55.448Z"}, {"lat": "44.135702", "lng": "9.682807", "elevation": "87.4000015258789", "time": "2013-09-20T09:42:56.430Z"}, {"lat": "44.13562", "lng": "9.682857", "elevation": "82.0", "time": "2013-09-20T09:43:03.346Z"}, {"lat": "44.135619", "lng": "9.682872", "elevation": "81.5", "time": "2013-09-20T09:43:03.379Z"}, {"lat": "44.13562", "lng": "9.682894", "elevation": "81.69999694824219", "time": "2013-09-20T09:43:08.423Z"}, {"lat": "44.135619", "lng": "9.68289", "elevation": "82.0", "time": "2013-09-20T09:43:09.374Z"}, {"lat": "44.135616", "lng": "9.682886", "elevation": "82.19999694824219", "time": "2013-09-20T09:43:10.438Z"}, {"lat": "44.135614", "lng": "9.682881", "elevation": "82.19999694824219", "time": "2013-09-20T09:43:11.446Z"}, {"lat": "44.135599", "lng": "9.682876", "elevation": "82.0999984741211", "time": "2013-09-20T09:43:17.377Z"}, {"lat": "44.135598", "lng": "9.682876", "elevation": "82.0999984741211", "time": "2013-09-20T09:43:18.486Z"}, {"lat": "44.135599", "lng": "9.682874", "elevation": "82.30000305175781", "time": "2013-09-20T09:44:03.157Z"}, {"lat": "44.135593", "lng": "9.682876", "elevation": "82.30000305175781", "time": "2013-09-20T09:44:03.443Z"}, {"lat": "44.135517", "lng": "9.682874", "elevation": "82.30000305175781", "time": "2013-09-20T09:44:09.412Z"}, {"lat": "44.1355", "lng": "9.682868", "elevation": "82.19999694824219", "time": "2013-09-20T09:44:10.395Z"}, {"lat": "44.135417", "lng": "9.682881", "elevation": "84.5999984741211", "time": "2013-09-20T09:44:14.495Z"}, {"lat": "44.135402", "lng": "9.682891", "elevation": "85.0", "time": "2013-09-20T09:44:15.483Z"}, {"lat": "44.135328", "lng": "9.682879", "elevation": "83.30000305175781", "time": "2013-09-20T09:44:28.361Z"}, {"lat": "44.135333", "lng": "9.682882", "elevation": "83.30000305175781", "time": "2013-09-20T09:44:29.374Z"}, {"lat": "44.135338", "lng": "9.682885", "elevation": "83.30000305175781", "time": "2013-09-20T09:44:30.412Z"}, {"lat": "44.135343", "lng": "9.682889", "elevation": "83.30000305175781", "time": "2013-09-20T09:44:31.399Z"}, {"lat": "44.135358", "lng": "9.682907", "elevation": "83.30000305175781", "time": "2013-09-20T09:44:37.373Z"}, {"lat": "44.134955", "lng": "9.683342", "elevation": "82.30000305175781", "time": "2013-09-20T09:45:28.402Z"}, {"lat": "44.135033", "lng": "9.683385", "elevation": "82.0999984741211", "time": "2013-09-20T09:45:33.739Z"}, {"lat": "44.135044", "lng": "9.683382", "elevation": "82.0999984741211", "time": "2013-09-20T09:45:34.380Z"}, {"lat": "44.135052", "lng": "9.68337", "elevation": "82.19999694824219", "time": "2013-09-20T09:45:39.418Z"}, {"lat": "44.135049", "lng": "9.683368", "elevation": "82.19999694824219", "time": "2013-09-20T09:45:40.395Z"}, {"lat": "44.135041", "lng": "9.683368", "elevation": "82.0999984741211", "time": "2013-09-20T09:45:42.379Z"}, {"lat": "44.135027", "lng": "9.683364", "elevation": "82.0999984741211", "time": "2013-09-20T09:45:43.366Z"}, {"lat": "44.134971", "lng": "9.683342", "elevation": "82.0999984741211", "time": "2013-09-20T09:45:53.383Z"}, {"lat": "44.134971", "lng": "9.683342", "elevation": "82.0999984741211", "time": "2013-09-20T09:45:54.394Z"}, {"lat": "44.134975", "lng": "9.683344", "elevation": "82.0999984741211", "time": "2013-09-20T09:46:03.372Z"}, {"lat": "44.134663", "lng": "9.685106", "elevation": "53.70000076293945", "time": "2013-09-20T11:43:28.836Z"}, {"lat": "44.134807", "lng": "9.685014", "elevation": "31.0", "time": "2013-09-20T11:43:29.744Z"}, {"lat": "44.134857", "lng": "9.68503", "elevation": "39.400001525878906", "time": "2013-09-20T11:43:30.744Z"}, {"lat": "44.134907", "lng": "9.685014", "elevation": "22.299999237060547", "time": "2013-09-20T11:43:31.765Z"}, {"lat": "44.134884", "lng": "9.685022", "elevation": "36.20000076293945", "time": "2013-09-20T11:43:32.744Z"}, {"lat": "44.134806", "lng": "9.684967", "elevation": "65.0", "time": "2013-09-20T11:43:33.745Z"}, {"lat": "44.134806", "lng": "9.684967", "elevation": "65.0", "time": "2013-09-20T11:43:33.845Z"}, {"lat": "44.134683", "lng": "9.685084", "elevation": "65.30000305175781", "time": "2013-09-20T11:43:34.761Z"}, {"lat": "44.134762", "lng": "9.685107", "elevation": "42.70000076293945", "time": "2013-09-20T11:43:35.764Z"}, {"lat": "44.134857", "lng": "9.685136", "elevation": "41.099998474121094", "time": "2013-09-20T11:43:36.749Z"}, {"lat": "44.134875", "lng": "9.685044", "elevation": "59.5", "time": "2013-09-20T11:43:40.751Z"}, {"lat": "44.134842", "lng": "9.68501", "elevation": "51.5", "time": "2013-09-20T11:43:41.759Z"}, {"lat": "44.134779", "lng": "9.684951", "elevation": "56.0", "time": "2013-09-20T11:43:44.756Z"}, {"lat": "44.13472", "lng": "9.684971", "elevation": "65.19999694824219", "time": "2013-09-20T11:43:45.758Z"}, {"lat": "44.13465", "lng": "9.684897", "elevation": "68.5", "time": "2013-09-20T11:44:01.151Z"}, {"lat": "44.134646", "lng": "9.684896", "elevation": "69.30000305175781", "time": "2013-09-20T11:44:02.144Z"}, {"lat": "44.134566", "lng": "9.684845", "elevation": "69.19999694824219", "time": "2013-09-20T11:44:31.143Z"}, {"lat": "44.134553", "lng": "9.684842", "elevation": "69.0999984741211", "time": "2013-09-20T11:44:32.151Z"}, {"lat": "44.134488", "lng": "9.684778", "elevation": "72.9000015258789", "time": "2013-09-20T11:44:39.145Z"}, {"lat": "44.134478", "lng": "9.684769", "elevation": "72.80000305175781", "time": "2013-09-20T11:44:40.148Z"}, {"lat": "44.134453", "lng": "9.684716", "elevation": "71.9000015258789", "time": "2013-09-20T11:44:49.178Z"}, {"lat": "44.134452", "lng": "9.684716", "elevation": "72.0999984741211", "time": "2013-09-20T11:44:50.145Z"}, {"lat": "44.134453", "lng": "9.684705", "elevation": "72.9000015258789", "time": "2013-09-20T11:45:05.201Z"}, {"lat": "44.134451", "lng": "9.684696", "elevation": "74.30000305175781", "time": "2013-09-20T11:45:06.153Z"}, {"lat": "44.134457", "lng": "9.684581", "elevation": "77.19999694824219", "time": "2013-09-20T11:45:19.243Z"}, {"lat": "44.134457", "lng": "9.684581", "elevation": "77.30000305175781", "time": "2013-09-20T11:45:20.223Z"}, {"lat": "44.134455", "lng": "9.684583", "elevation": "77.5", "time": "2013-09-20T11:45:36.233Z"}, {"lat": "44.134449", "lng": "9.684583", "elevation": "78.0999984741211", "time": "2013-09-20T11:45:37.173Z"}, {"lat": "44.134413", "lng": "9.684617", "elevation": "80.4000015258789", "time": "2013-09-20T11:45:43.284Z"}, {"lat": "44.134391", "lng": "9.684664", "elevation": "82.30000305175781", "time": "2013-09-20T11:45:48.165Z"}, {"lat": "44.134324", "lng": "9.684725", "elevation": "79.80000305175781", "time": "2013-09-20T11:46:00.155Z"}, {"lat": "44.134327", "lng": "9.684724", "elevation": "79.9000015258789", "time": "2013-09-20T11:46:01.160Z"}, {"lat": "44.134329", "lng": "9.684725", "elevation": "80.19999694824219", "time": "2013-09-20T11:46:02.155Z"}, {"lat": "44.13434", "lng": "9.68473", "elevation": "80.9000015258789", "time": "2013-09-20T11:46:03.152Z"}, {"lat": "44.134355", "lng": "9.684735", "elevation": "80.69999694824219", "time": "2013-09-20T11:46:06.161Z"}, {"lat": "44.134355", "lng": "9.684736", "elevation": "80.80000305175781", "time": "2013-09-20T11:46:07.157Z"}, {"lat": "44.134354", "lng": "9.684733", "elevation": "81.19999694824219", "time": "2013-09-20T11:46:12.212Z"}, {"lat": "44.134351", "lng": "9.68473", "elevation": "81.19999694824219", "time": "2013-09-20T11:46:13.160Z"}, {"lat": "44.134286", "lng": "9.684733", "elevation": "83.5", "time": "2013-09-20T11:46:27.161Z"}, {"lat": "44.134287", "lng": "9.684733", "elevation": "83.4000015258789", "time": "2013-09-20T11:46:28.168Z"}, {"lat": "44.134277", "lng": "9.684726", "elevation": "87.5999984741211", "time": "2013-09-20T11:48:06.183Z"}, {"lat": "44.134276", "lng": "9.684735", "elevation": "88.5", "time": "2013-09-20T11:48:07.274Z"}, {"lat": "44.134284", "lng": "9.684856", "elevation": "90.0", "time": "2013-09-20T11:48:16.232Z"}, {"lat": "44.134286", "lng": "9.684878", "elevation": "90.5", "time": "2013-09-20T11:48:17.215Z"}, {"lat": "44.134275", "lng": "9.684992", "elevation": "88.9000015258789", "time": "2013-09-20T11:48:23.341Z"}, {"lat": "44.134271", "lng": "9.685005", "elevation": "88.30000305175781", "time": "2013-09-20T11:48:24.244Z"}, {"lat": "44.134207", "lng": "9.685056", "elevation": "88.19999694824219", "time": "2013-09-20T11:48:37.186Z"}, {"lat": "44.134207", "lng": "9.685055", "elevation": "88.19999694824219", "time": "2013-09-20T11:48:38.203Z"}, {"lat": "44.134212", "lng": "9.685062", "elevation": "88.4000015258789", "time": "2013-09-20T11:48:45.212Z"}, {"lat": "44.134217", "lng": "9.685065", "elevation": "87.80000305175781", "time": "2013-09-20T11:48:46.171Z"}, {"lat": "44.134234", "lng": "9.68509", "elevation": "87.0999984741211", "time": "2013-09-20T11:48:53.125Z"}, {"lat": "44.134234", "lng": "9.68509", "elevation": "86.80000305175781", "time": "2013-09-20T11:48:53.208Z"}, {"lat": "44.13423", "lng": "9.685092", "elevation": "87.0", "time": "2013-09-20T11:48:56.175Z"}, {"lat": "44.134225", "lng": "9.685089", "elevation": "86.5", "time": "2013-09-20T11:48:57.241Z"}, {"lat": "44.134191", "lng": "9.685074", "elevation": "90.30000305175781", "time": "2013-09-20T11:49:07.183Z"}, {"lat": "44.13419", "lng": "9.685075", "elevation": "90.19999694824219", "time": "2013-09-20T11:49:08.182Z"}, {"lat": "44.134185", "lng": "9.685077", "elevation": "91.0999984741211", "time": "2013-09-20T11:49:14.181Z"}, {"lat": "44.134182", "lng": "9.685085", "elevation": "90.69999694824219", "time": "2013-09-20T11:49:15.193Z"}, {"lat": "44.134132", "lng": "9.685179", "elevation": "91.0999984741211", "time": "2013-09-20T11:49:23.282Z"}, {"lat": "44.13413", "lng": "9.685195", "elevation": "91.0", "time": "2013-09-20T11:49:24.179Z"}, {"lat": "44.134134", "lng": "9.685243", "elevation": "92.5", "time": "2013-09-20T11:49:30.174Z"}, {"lat": "44.134135", "lng": "9.685239", "elevation": "92.4000015258789", "time": "2013-09-20T11:49:31.178Z"}, {"lat": "44.134131", "lng": "9.685253", "elevation": "94.0", "time": "2013-09-20T11:50:03.199Z"}, {"lat": "44.134127", "lng": "9.685259", "elevation": "94.5", "time": "2013-09-20T11:50:04.179Z"}, {"lat": "44.134111", "lng": "9.685357", "elevation": "98.0999984741211", "time": "2013-09-20T11:50:16.243Z"}, {"lat": "44.13411", "lng": "9.685357", "elevation": "98.30000305175781", "time": "2013-09-20T11:50:17.221Z"}, {"lat": "44.134101", "lng": "9.685357", "elevation": "99.5", "time": "2013-09-20T11:50:28.418Z"}, {"lat": "44.134095", "lng": "9.685358", "elevation": "100.0999984741211", "time": "2013-09-20T11:50:29.194Z"}, {"lat": "44.13401", "lng": "9.685381", "elevation": "100.69999694824219", "time": "2013-09-20T11:50:38.677Z"}, {"lat": "44.134001", "lng": "9.685388", "elevation": "99.80000305175781", "time": "2013-09-20T11:50:39.276Z"}, {"lat": "44.133965", "lng": "9.685502", "elevation": "90.30000305175781", "time": "2013-09-20T11:50:44.181Z"}, {"lat": "44.133962", "lng": "9.685525", "elevation": "90.0", "time": "2013-09-20T11:50:45.215Z"}, {"lat": "44.133912", "lng": "9.68562", "elevation": "91.0", "time": "2013-09-20T11:50:53.178Z"}, {"lat": "44.133905", "lng": "9.685635", "elevation": "90.80000305175781", "time": "2013-09-20T11:50:54.180Z"}, {"lat": "44.133842", "lng": "9.685708", "elevation": "91.80000305175781", "time": "2013-09-20T11:51:01.181Z"}, {"lat": "44.133834", "lng": "9.685717", "elevation": "90.69999694824219", "time": "2013-09-20T11:51:02.196Z"}, {"lat": "44.133794", "lng": "9.685815", "elevation": "90.5999984741211", "time": "2013-09-20T11:51:10.184Z"}, {"lat": "44.133788", "lng": "9.685826", "elevation": "91.5999984741211", "time": "2013-09-20T11:51:11.186Z"}, {"lat": "44.133727", "lng": "9.685894", "elevation": "96.0999984741211", "time": "2013-09-20T11:51:17.190Z"}, {"lat": "44.133715", "lng": "9.685901", "elevation": "95.5", "time": "2013-09-20T11:51:18.182Z"}, {"lat": "44.133657", "lng": "9.685932", "elevation": "98.5", "time": "2013-09-20T11:51:28.938Z"}, {"lat": "44.133658", "lng": "9.68593", "elevation": "99.69999694824219", "time": "2013-09-20T11:51:29.213Z"}, {"lat": "44.133655", "lng": "9.685926", "elevation": "101.0", "time": "2013-09-20T11:51:30.182Z"}, {"lat": "44.133635", "lng": "9.685912", "elevation": "103.0", "time": "2013-09-20T11:51:37.203Z"}, {"lat": "44.133633", "lng": "9.685913", "elevation": "103.69999694824219", "time": "2013-09-20T11:51:38.197Z"}, {"lat": "44.133632", "lng": "9.685919", "elevation": "110.4000015258789", "time": "2013-09-20T11:51:47.194Z"}, {"lat": "44.133627", "lng": "9.685926", "elevation": "110.5", "time": "2013-09-20T11:51:48.197Z"}, {"lat": "44.133579", "lng": "9.686024", "elevation": "112.0", "time": "2013-09-20T11:51:58.253Z"}, {"lat": "44.133574", "lng": "9.68603", "elevation": "112.9000015258789", "time": "2013-09-20T11:51:59.286Z"}, {"lat": "44.13351", "lng": "9.686115", "elevation": "113.19999694824219", "time": "2013-09-20T11:52:15.260Z"}, {"lat": "44.133508", "lng": "9.686117", "elevation": "111.4000015258789", "time": "2013-09-20T11:52:16.195Z"}, {"lat": "44.133449", "lng": "9.6862", "elevation": "120.0999984741211", "time": "2013-09-20T11:52:30.195Z"}, {"lat": "44.133443", "lng": "9.686208", "elevation": "119.69999694824219", "time": "2013-09-20T11:52:31.202Z"}, {"lat": "44.133378", "lng": "9.68628", "elevation": "124.69999694824219", "time": "2013-09-20T11:52:41.234Z"}, {"lat": "44.133366", "lng": "9.686279", "elevation": "125.19999694824219", "time": "2013-09-20T11:52:42.203Z"}, {"lat": "44.133279", "lng": "9.68631", "elevation": "125.80000305175781", "time": "2013-09-20T11:52:51.199Z"}, {"lat": "44.133273", "lng": "9.686313", "elevation": "126.0999984741211", "time": "2013-09-20T11:52:52.207Z"}, {"lat": "44.133205", "lng": "9.686391", "elevation": "129.89999389648438", "time": "2013-09-20T11:53:05.190Z"}, {"lat": "44.133198", "lng": "9.686383", "elevation": "129.6999969482422", "time": "2013-09-20T11:53:06.199Z"}, {"lat": "44.133194", "lng": "9.686363", "elevation": "129.39999389648438", "time": "2013-09-20T11:53:11.197Z"}, {"lat": "44.133194", "lng": "9.686364", "elevation": "128.89999389648438", "time": "2013-09-20T11:53:12.211Z"}, {"lat": "44.133195", "lng": "9.686378", "elevation": "129.10000610351563", "time": "2013-09-20T11:53:15.348Z"}, {"lat": "44.133196", "lng": "9.686384", "elevation": "128.6999969482422", "time": "2013-09-20T11:53:16.197Z"}, {"lat": "44.133205", "lng": "9.68641", "elevation": "129.5", "time": "2013-09-20T11:53:22.202Z"}, {"lat": "44.133205", "lng": "9.68641", "elevation": "129.5", "time": "2013-09-20T11:53:23.205Z"}, {"lat": "44.133202", "lng": "9.686414", "elevation": "128.60000610351563", "time": "2013-09-20T11:53:49.203Z"}, {"lat": "44.133203", "lng": "9.686419", "elevation": "128.39999389648438", "time": "2013-09-20T11:53:50.325Z"}, {"lat": "44.133202", "lng": "9.686527", "elevation": "126.5999984741211", "time": "2013-09-20T11:54:00.263Z"}, {"lat": "44.133202", "lng": "9.686549", "elevation": "125.69999694824219", "time": "2013-09-20T11:54:01.240Z"}, {"lat": "44.133192", "lng": "9.686659", "elevation": "127.30000305175781", "time": "2013-09-20T11:54:06.214Z"}, {"lat": "44.133187", "lng": "9.686677", "elevation": "127.0", "time": "2013-09-20T11:54:07.201Z"}, {"lat": "44.133136", "lng": "9.686765", "elevation": "129.1999969482422", "time": "2013-09-20T11:54:14.205Z"}, {"lat": "44.133128", "lng": "9.686776", "elevation": "129.3000030517578", "time": "2013-09-20T11:54:15.298Z"}, {"lat": "44.133068", "lng": "9.686852", "elevation": "131.10000610351563", "time": "2013-09-20T11:54:23.211Z"}, {"lat": "44.133064", "lng": "9.686867", "elevation": "131.0", "time": "2013-09-20T11:54:24.209Z"}, {"lat": "44.133024", "lng": "9.686974", "elevation": "128.60000610351563", "time": "2013-09-20T11:54:33.237Z"}, {"lat": "44.133018", "lng": "9.686986", "elevation": "128.5", "time": "2013-09-20T11:54:34.206Z"}, {"lat": "44.132967", "lng": "9.687078", "elevation": "131.1999969482422", "time": "2013-09-20T11:54:47.329Z"}, {"lat": "44.132962", "lng": "9.687087", "elevation": "129.8000030517578", "time": "2013-09-20T11:54:48.300Z"}, {"lat": "44.132916", "lng": "9.68719", "elevation": "128.8000030517578", "time": "2013-09-20T11:54:55.296Z"}, {"lat": "44.132911", "lng": "9.6872", "elevation": "128.89999389648438", "time": "2013-09-20T11:54:56.281Z"}, {"lat": "44.132873", "lng": "9.6873", "elevation": "130.1999969482422", "time": "2013-09-20T11:55:06.211Z"}, {"lat": "44.132865", "lng": "9.687314", "elevation": "131.39999389648438", "time": "2013-09-20T11:55:07.215Z"}, {"lat": "44.13282", "lng": "9.687412", "elevation": "134.1999969482422", "time": "2013-09-20T11:55:14.225Z"}, {"lat": "44.132812", "lng": "9.687425", "elevation": "134.5", "time": "2013-09-20T11:55:15.211Z"}, {"lat": "44.132782", "lng": "9.687533", "elevation": "130.5", "time": "2013-09-20T11:55:22.210Z"}, {"lat": "44.132784", "lng": "9.687551", "elevation": "130.89999389648438", "time": "2013-09-20T11:55:23.215Z"}, {"lat": "44.132749", "lng": "9.687664", "elevation": "133.6999969482422", "time": "2013-09-20T11:55:31.210Z"}, {"lat": "44.132745", "lng": "9.68768", "elevation": "134.1999969482422", "time": "2013-09-20T11:55:32.223Z"}, {"lat": "44.132741", "lng": "9.687762", "elevation": "133.89999389648438", "time": "2013-09-20T11:55:43.210Z"}, {"lat": "44.132742", "lng": "9.687762", "elevation": "134.3000030517578", "time": "2013-09-20T11:55:44.224Z"}, {"lat": "44.13274", "lng": "9.687767", "elevation": "135.10000610351563", "time": "2013-09-20T11:55:47.211Z"}, {"lat": "44.132738", "lng": "9.687772", "elevation": "136.39999389648438", "time": "2013-09-20T11:55:48.204Z"}, {"lat": "44.132731", "lng": "9.687895", "elevation": "138.1999969482422", "time": "2013-09-20T11:56:00.256Z"}, {"lat": "44.132735", "lng": "9.687903", "elevation": "137.6999969482422", "time": "2013-09-20T11:56:01.214Z"}, {"lat": "44.132757", "lng": "9.688023", "elevation": "137.6999969482422", "time": "2013-09-20T11:56:13.312Z"}, {"lat": "44.132754", "lng": "9.688027", "elevation": "138.3000030517578", "time": "2013-09-20T11:56:14.220Z"}, {"lat": "44.132759", "lng": "9.688064", "elevation": "141.3000030517578", "time": "2013-09-20T11:56:24.216Z"}, {"lat": "44.132759", "lng": "9.688065", "elevation": "141.3000030517578", "time": "2013-09-20T11:56:25.213Z"}, {"lat": "44.13275", "lng": "9.688102", "elevation": "143.39999389648438", "time": "2013-09-20T11:56:49.219Z"}, {"lat": "44.13275", "lng": "9.688108", "elevation": "143.3000030517578", "time": "2013-09-20T11:56:50.290Z"}, {"lat": "44.132754", "lng": "9.688224", "elevation": "144.1999969482422", "time": "2013-09-20T11:56:57.274Z"}, {"lat": "44.132755", "lng": "9.688243", "elevation": "144.39999389648438", "time": "2013-09-20T11:56:58.229Z"}, {"lat": "44.132775", "lng": "9.688359", "elevation": "141.8000030517578", "time": "2013-09-20T11:57:05.219Z"}, {"lat": "44.132778", "lng": "9.688378", "elevation": "141.5", "time": "2013-09-20T11:57:06.218Z"}, {"lat": "44.132775", "lng": "9.688494", "elevation": "142.0", "time": "2013-09-20T11:57:12.226Z"}, {"lat": "44.132773", "lng": "9.688514", "elevation": "140.8000030517578", "time": "2013-09-20T11:57:13.327Z"}, {"lat": "44.132758", "lng": "9.688635", "elevation": "142.39999389648438", "time": "2013-09-20T11:57:19.222Z"}, {"lat": "44.132756", "lng": "9.688659", "elevation": "142.39999389648438", "time": "2013-09-20T11:57:20.225Z"}, {"lat": "44.132744", "lng": "9.688781", "elevation": "142.3000030517578", "time": "2013-09-20T11:57:25.257Z"}, {"lat": "44.132741", "lng": "9.688806", "elevation": "142.5", "time": "2013-09-20T11:57:26.309Z"}, {"lat": "44.132725", "lng": "9.688919", "elevation": "141.6999969482422", "time": "2013-09-20T11:57:31.226Z"}, {"lat": "44.132725", "lng": "9.688943", "elevation": "141.10000610351563", "time": "2013-09-20T11:57:32.270Z"}, {"lat": "44.132733", "lng": "9.689059", "elevation": "138.89999389648438", "time": "2013-09-20T11:57:37.226Z"}, {"lat": "44.132738", "lng": "9.689083", "elevation": "139.39999389648438", "time": "2013-09-20T11:57:38.218Z"}, {"lat": "44.132716", "lng": "9.689201", "elevation": "137.89999389648438", "time": "2013-09-20T11:57:45.262Z"}, {"lat": "44.132707", "lng": "9.689214", "elevation": "138.6999969482422", "time": "2013-09-20T11:57:46.421Z"}, {"lat": "44.13265", "lng": "9.689307", "elevation": "137.3000030517578", "time": "2013-09-20T11:58:02.222Z"}, {"lat": "44.132656", "lng": "9.689324", "elevation": "137.8000030517578", "time": "2013-09-20T11:58:03.306Z"}, {"lat": "44.13269", "lng": "9.689431", "elevation": "135.6999969482422", "time": "2013-09-20T11:58:11.338Z"}, {"lat": "44.132692", "lng": "9.689446", "elevation": "134.89999389648438", "time": "2013-09-20T11:58:12.383Z"}, {"lat": "44.132681", "lng": "9.689563", "elevation": "135.1999969482422", "time": "2013-09-20T11:58:20.266Z"}, {"lat": "44.132678", "lng": "9.689578", "elevation": "135.1999969482422", "time": "2013-09-20T11:58:21.231Z"}, {"lat": "44.13266", "lng": "9.689694", "elevation": "137.10000610351563", "time": "2013-09-20T11:58:30.227Z"}, {"lat": "44.132654", "lng": "9.689707", "elevation": "136.60000610351563", "time": "2013-09-20T11:58:31.226Z"}, {"lat": "44.132598", "lng": "9.689803", "elevation": "138.39999389648438", "time": "2013-09-20T11:58:39.221Z"}, {"lat": "44.132596", "lng": "9.689812", "elevation": "138.10000610351563", "time": "2013-09-20T11:58:40.275Z"}, {"lat": "44.132594", "lng": "9.689823", "elevation": "137.89999389648438", "time": "2013-09-20T11:58:45.241Z"}, {"lat": "44.132593", "lng": "9.689823", "elevation": "138.39999389648438", "time": "2013-09-20T11:58:46.230Z"}, {"lat": "44.132585", "lng": "9.689827", "elevation": "138.3000030517578", "time": "2013-09-20T11:58:55.225Z"}, {"lat": "44.132582", "lng": "9.689834", "elevation": "137.89999389648438", "time": "2013-09-20T11:58:56.231Z"}, {"lat": "44.132518", "lng": "9.689917", "elevation": "139.1999969482422", "time": "2013-09-20T11:59:03.223Z"}, {"lat": "44.132503", "lng": "9.689923", "elevation": "139.1999969482422", "time": "2013-09-20T11:59:04.391Z"}, {"lat": "44.132441", "lng": "9.689981", "elevation": "135.5", "time": "2013-09-20T11:59:10.226Z"}, {"lat": "44.13243", "lng": "9.689998", "elevation": "136.39999389648438", "time": "2013-09-20T11:59:11.227Z"}, {"lat": "44.132368", "lng": "9.690086", "elevation": "136.89999389648438", "time": "2013-09-20T11:59:16.265Z"}, {"lat": "44.132359", "lng": "9.690106", "elevation": "137.6999969482422", "time": "2013-09-20T11:59:17.276Z"}, {"lat": "44.132334", "lng": "9.690212", "elevation": "133.1999969482422", "time": "2013-09-20T11:59:22.229Z"}, {"lat": "44.132329", "lng": "9.690232", "elevation": "133.89999389648438", "time": "2013-09-20T11:59:23.234Z"}, {"lat": "44.132301", "lng": "9.690341", "elevation": "130.0", "time": "2013-09-20T11:59:30.317Z"}, {"lat": "44.132303", "lng": "9.690363", "elevation": "130.3000030517578", "time": "2013-09-20T11:59:31.239Z"}, {"lat": "44.132272", "lng": "9.690465", "elevation": "127.9000015258789", "time": "2013-09-20T11:59:38.243Z"}, {"lat": "44.132265", "lng": "9.690477", "elevation": "129.60000610351563", "time": "2013-09-20T11:59:39.334Z"}, {"lat": "44.132224", "lng": "9.690581", "elevation": "129.39999389648438", "time": "2013-09-20T11:59:48.453Z"}, {"lat": "44.132226", "lng": "9.690597", "elevation": "128.8000030517578", "time": "2013-09-20T11:59:49.327Z"}, {"lat": "44.132231", "lng": "9.690711", "elevation": "127.19999694824219", "time": "2013-09-20T11:59:56.311Z"}, {"lat": "44.132231", "lng": "9.690723", "elevation": "125.9000015258789", "time": "2013-09-20T11:59:57.255Z"}, {"lat": "44.13221", "lng": "9.690783", "elevation": "129.0", "time": "2013-09-20T12:00:11.240Z"}, {"lat": "44.132213", "lng": "9.690787", "elevation": "129.0", "time": "2013-09-20T12:00:12.304Z"}, {"lat": "44.132218", "lng": "9.690793", "elevation": "128.60000610351563", "time": "2013-09-20T12:00:13.262Z"}, {"lat": "44.132238", "lng": "9.690817", "elevation": "128.10000610351563", "time": "2013-09-20T12:00:20.231Z"}, {"lat": "44.132239", "lng": "9.690817", "elevation": "128.1999969482422", "time": "2013-09-20T12:00:21.233Z"}, {"lat": "44.132235", "lng": "9.690816", "elevation": "128.1999969482422", "time": "2013-09-20T12:00:31.234Z"}, {"lat": "44.132228", "lng": "9.690816", "elevation": "128.5", "time": "2013-09-20T12:00:32.233Z"}, {"lat": "44.132147", "lng": "9.690857", "elevation": "129.8000030517578", "time": "2013-09-20T12:00:38.262Z"}, {"lat": "44.132133", "lng": "9.690872", "elevation": "130.5", "time": "2013-09-20T12:00:39.241Z"}, {"lat": "44.132094", "lng": "9.690973", "elevation": "131.10000610351563", "time": "2013-09-20T12:00:44.244Z"}, {"lat": "44.132088", "lng": "9.690988", "elevation": "131.3000030517578", "time": "2013-09-20T12:00:45.234Z"}, {"lat": "44.132052", "lng": "9.691091", "elevation": "130.8000030517578", "time": "2013-09-20T12:00:55.233Z"}, {"lat": "44.132049", "lng": "9.691105", "elevation": "131.60000610351563", "time": "2013-09-20T12:00:56.232Z"}, {"lat": "44.132004", "lng": "9.691212", "elevation": "131.39999389648438", "time": "2013-09-20T12:01:03.239Z"}, {"lat": "44.131997", "lng": "9.691229", "elevation": "131.3000030517578", "time": "2013-09-20T12:01:04.244Z"}, {"lat": "44.13198", "lng": "9.69126", "elevation": "131.0", "time": "2013-09-20T12:01:06.256Z"}, {"lat": "44.131924", "lng": "9.691412", "elevation": "132.6999969482422", "time": "2013-09-20T12:01:16.223Z"}, {"lat": "44.131908", "lng": "9.691519", "elevation": "131.89999389648438", "time": "2013-09-20T12:01:22.282Z"}, {"lat": "44.131905", "lng": "9.691535", "elevation": "131.60000610351563", "time": "2013-09-20T12:01:23.256Z"}, {"lat": "44.131852", "lng": "9.691635", "elevation": "133.10000610351563", "time": "2013-09-20T12:01:32.270Z"}, {"lat": "44.131838", "lng": "9.691635", "elevation": "133.8000030517578", "time": "2013-09-20T12:01:33.237Z"}, {"lat": "44.131776", "lng": "9.691718", "elevation": "134.10000610351563", "time": "2013-09-20T12:01:42.268Z"}, {"lat": "44.131766", "lng": "9.691726", "elevation": "134.0", "time": "2013-09-20T12:01:43.254Z"}, {"lat": "44.131685", "lng": "9.691775", "elevation": "133.39999389648438", "time": "2013-09-20T12:01:50.249Z"}, {"lat": "44.131671", "lng": "9.691779", "elevation": "132.60000610351563", "time": "2013-09-20T12:01:51.242Z"}, {"lat": "44.131625", "lng": "9.691876", "elevation": "129.89999389648438", "time": "2013-09-20T12:01:59.401Z"}, {"lat": "44.13162", "lng": "9.691888", "elevation": "130.5", "time": "2013-09-20T12:02:00.452Z"}, {"lat": "44.13156", "lng": "9.691973", "elevation": "133.1999969482422", "time": "2013-09-20T12:02:09.242Z"}, {"lat": "44.131555", "lng": "9.691984", "elevation": "133.39999389648438", "time": "2013-09-20T12:02:10.252Z"}, {"lat": "44.13151", "lng": "9.692083", "elevation": "133.6999969482422", "time": "2013-09-20T12:02:19.252Z"}, {"lat": "44.131508", "lng": "9.692097", "elevation": "133.8000030517578", "time": "2013-09-20T12:02:20.245Z"}, {"lat": "44.13145", "lng": "9.692182", "elevation": "134.3000030517578", "time": "2013-09-20T12:02:29.238Z"}, {"lat": "44.131441", "lng": "9.692189", "elevation": "134.39999389648438", "time": "2013-09-20T12:02:30.245Z"}, {"lat": "44.131361", "lng": "9.692245", "elevation": "140.89999389648438", "time": "2013-09-20T12:02:40.358Z"}, {"lat": "44.131355", "lng": "9.69225", "elevation": "140.6999969482422", "time": "2013-09-20T12:02:41.279Z"}, {"lat": "44.131277", "lng": "9.692304", "elevation": "144.1999969482422", "time": "2013-09-20T12:02:53.277Z"}, {"lat": "44.131271", "lng": "9.692311", "elevation": "143.89999389648438", "time": "2013-09-20T12:02:54.368Z"}, {"lat": "44.131207", "lng": "9.692396", "elevation": "149.89999389648438", "time": "2013-09-20T12:03:07.248Z"}, {"lat": "44.131205", "lng": "9.692406", "elevation": "149.60000610351563", "time": "2013-09-20T12:03:08.265Z"}, {"lat": "44.1312", "lng": "9.692455", "elevation": "149.8000030517578", "time": "2013-09-20T12:03:15.265Z"}, {"lat": "44.131202", "lng": "9.692456", "elevation": "149.60000610351563", "time": "2013-09-20T12:03:16.256Z"}, {"lat": "44.131204", "lng": "9.692461", "elevation": "149.5", "time": "2013-09-20T12:03:19.361Z"}, {"lat": "44.131203", "lng": "9.692466", "elevation": "149.6999969482422", "time": "2013-09-20T12:03:20.312Z"}, {"lat": "44.131145", "lng": "9.692559", "elevation": "153.0", "time": "2013-09-20T12:03:32.242Z"}, {"lat": "44.131137", "lng": "9.692568", "elevation": "152.8000030517578", "time": "2013-09-20T12:03:33.275Z"}, {"lat": "44.131071", "lng": "9.692643", "elevation": "153.89999389648438", "time": "2013-09-20T12:03:45.243Z"}, {"lat": "44.131065", "lng": "9.692646", "elevation": "154.8000030517578", "time": "2013-09-20T12:03:46.251Z"}, {"lat": "44.131004", "lng": "9.692735", "elevation": "162.6999969482422", "time": "2013-09-20T12:04:00.249Z"}, {"lat": "44.130998", "lng": "9.692735", "elevation": "161.89999389648438", "time": "2013-09-20T12:04:01.252Z"}, {"lat": "44.130974", "lng": "9.69277", "elevation": "162.8000030517578", "time": "2013-09-20T12:04:10.244Z"}, {"lat": "44.130975", "lng": "9.692769", "elevation": "163.6999969482422", "time": "2013-09-20T12:04:11.252Z"}, {"lat": "44.13096", "lng": "9.692758", "elevation": "165.60000610351563", "time": "2013-09-20T12:05:04.248Z"}, {"lat": "44.130953", "lng": "9.692763", "elevation": "165.1999969482422", "time": "2013-09-20T12:05:05.256Z"}, {"lat": "44.130945", "lng": "9.692876", "elevation": "160.10000610351563", "time": "2013-09-20T12:05:14.265Z"}, {"lat": "44.130943", "lng": "9.692887", "elevation": "160.5", "time": "2013-09-20T12:05:15.256Z"}, {"lat": "44.130979", "lng": "9.692999", "elevation": "169.10000610351563", "time": "2013-09-20T12:05:39.270Z"}, {"lat": "44.130976", "lng": "9.693003", "elevation": "169.89999389648438", "time": "2013-09-20T12:05:40.264Z"}, {"lat": "44.130921", "lng": "9.693018", "elevation": "171.39999389648438", "time": "2013-09-20T12:05:50.347Z"}, {"lat": "44.13092", "lng": "9.693017", "elevation": "172.3000030517578", "time": "2013-09-20T12:05:51.355Z"}, {"lat": "44.130914", "lng": "9.693011", "elevation": "172.89999389648438", "time": "2013-09-20T12:06:20.277Z"}, {"lat": "44.130908", "lng": "9.693012", "elevation": "173.89999389648438", "time": "2013-09-20T12:06:21.281Z"}, {"lat": "44.130823", "lng": "9.693026", "elevation": "172.5", "time": "2013-09-20T12:06:28.273Z"}, {"lat": "44.13081", "lng": "9.693039", "elevation": "170.3000030517578", "time": "2013-09-20T12:06:29.270Z"}, {"lat": "44.130792", "lng": "9.693152", "elevation": "166.39999389648438", "time": "2013-09-20T12:06:33.302Z"}, {"lat": "44.130789", "lng": "9.693182", "elevation": "165.89999389648438", "time": "2013-09-20T12:06:34.265Z"}, {"lat": "44.130722", "lng": "9.693263", "elevation": "166.6999969482422", "time": "2013-09-20T12:06:42.283Z"}, {"lat": "44.130721", "lng": "9.69327", "elevation": "166.8000030517578", "time": "2013-09-20T12:06:43.292Z"}, {"lat": "44.130718", "lng": "9.69328", "elevation": "167.5", "time": "2013-09-20T12:06:48.361Z"}, {"lat": "44.130717", "lng": "9.693279", "elevation": "167.39999389648438", "time": "2013-09-20T12:06:49.323Z"}, {"lat": "44.130711", "lng": "9.693278", "elevation": "168.39999389648438", "time": "2013-09-20T12:06:52.273Z"}, {"lat": "44.130706", "lng": "9.693278", "elevation": "168.8000030517578", "time": "2013-09-20T12:06:53.377Z"}, {"lat": "44.130619", "lng": "9.69328", "elevation": "174.5", "time": "2013-09-20T12:07:06.282Z"}, {"lat": "44.130612", "lng": "9.693275", "elevation": "174.6999969482422", "time": "2013-09-20T12:07:07.273Z"}, {"lat": "44.130602", "lng": "9.693267", "elevation": "174.89999389648438", "time": "2013-09-20T12:07:12.271Z"}, {"lat": "44.130603", "lng": "9.693267", "elevation": "174.89999389648438", "time": "2013-09-20T12:07:13.263Z"}, {"lat": "44.130599", "lng": "9.693273", "elevation": "178.1999969482422", "time": "2013-09-20T12:07:58.269Z"}, {"lat": "44.130594", "lng": "9.693271", "elevation": "179.5", "time": "2013-09-20T12:07:59.267Z"}, {"lat": "44.130574", "lng": "9.693262", "elevation": "180.1999969482422", "time": "2013-09-20T12:08:06.271Z"}, {"lat": "44.130573", "lng": "9.693263", "elevation": "180.3000030517578", "time": "2013-09-20T12:08:07.271Z"}, {"lat": "44.130558", "lng": "9.693261", "elevation": "180.5", "time": "2013-09-20T12:09:44.286Z"}, {"lat": "44.130556", "lng": "9.69326", "elevation": "180.8000030517578", "time": "2013-09-20T12:09:45.282Z"}, {"lat": "44.13054", "lng": "9.693267", "elevation": "180.5", "time": "2013-09-20T12:09:51.288Z"}, {"lat": "44.130539", "lng": "9.693268", "elevation": "180.60000610351563", "time": "2013-09-20T12:09:52.279Z"}, {"lat": "44.130536", "lng": "9.693273", "elevation": "180.89999389648438", "time": "2013-09-20T12:10:40.324Z"}, {"lat": "44.130534", "lng": "9.693277", "elevation": "181.0", "time": "2013-09-20T12:10:41.273Z"}, {"lat": "44.130497", "lng": "9.693262", "elevation": "184.0", "time": "2013-09-20T12:10:49.271Z"}, {"lat": "44.130496", "lng": "9.693261", "elevation": "184.0", "time": "2013-09-20T12:10:50.323Z"}, {"lat": "44.130496", "lng": "9.693252", "elevation": "186.10000610351563", "time": "2013-09-20T12:11:13.302Z"}, {"lat": "44.130495", "lng": "9.693244", "elevation": "185.6999969482422", "time": "2013-09-20T12:11:14.285Z"}, {"lat": "44.13048", "lng": "9.693198", "elevation": "189.6999969482422", "time": "2013-09-20T12:11:24.287Z"}, {"lat": "44.13048", "lng": "9.693199", "elevation": "189.1999969482422", "time": "2013-09-20T12:11:25.286Z"}, {"lat": "44.130479", "lng": "9.693214", "elevation": "192.39999389648438", "time": "2013-09-20T12:11:39.289Z"}, {"lat": "44.130476", "lng": "9.693218", "elevation": "190.6999969482422", "time": "2013-09-20T12:11:40.286Z"}, {"lat": "44.130508", "lng": "9.693334", "elevation": "197.5", "time": "2013-09-20T12:11:52.324Z"}, {"lat": "44.130514", "lng": "9.693345", "elevation": "197.1999969482422", "time": "2013-09-20T12:11:53.332Z"}, {"lat": "44.130525", "lng": "9.693463", "elevation": "196.10000610351563", "time": "2013-09-20T12:12:04.317Z"}, {"lat": "44.130519", "lng": "9.693474", "elevation": "196.60000610351563", "time": "2013-09-20T12:12:05.373Z"}, {"lat": "44.13049", "lng": "9.693587", "elevation": "198.6999969482422", "time": "2013-09-20T12:12:19.306Z"}, {"lat": "44.13049", "lng": "9.693596", "elevation": "199.3000030517578", "time": "2013-09-20T12:12:20.297Z"}, {"lat": "44.130512", "lng": "9.693715", "elevation": "200.0", "time": "2013-09-20T12:12:34.299Z"}, {"lat": "44.130511", "lng": "9.693722", "elevation": "200.0", "time": "2013-09-20T12:12:35.307Z"}, {"lat": "44.130487", "lng": "9.693839", "elevation": "203.6999969482422", "time": "2013-09-20T12:12:51.308Z"}, {"lat": "44.130481", "lng": "9.693851", "elevation": "204.60000610351563", "time": "2013-09-20T12:12:52.298Z"}, {"lat": "44.130447", "lng": "9.693964", "elevation": "207.5", "time": "2013-09-20T12:13:03.396Z"}, {"lat": "44.130444", "lng": "9.693975", "elevation": "208.3000030517578", "time": "2013-09-20T12:13:04.382Z"}, {"lat": "44.130406", "lng": "9.69408", "elevation": "210.10000610351563", "time": "2013-09-20T12:13:12.317Z"}, {"lat": "44.130399", "lng": "9.694092", "elevation": "210.1999969482422", "time": "2013-09-20T12:13:13.334Z"}, {"lat": "44.130349", "lng": "9.694189", "elevation": "213.1999969482422", "time": "2013-09-20T12:13:22.314Z"}, {"lat": "44.130347", "lng": "9.694202", "elevation": "213.6999969482422", "time": "2013-09-20T12:13:23.311Z"}, {"lat": "44.130305", "lng": "9.6943", "elevation": "217.39999389648438", "time": "2013-09-20T12:13:33.398Z"}, {"lat": "44.130299", "lng": "9.694309", "elevation": "217.1999969482422", "time": "2013-09-20T12:13:34.295Z"}, {"lat": "44.13023", "lng": "9.694378", "elevation": "217.8000030517578", "time": "2013-09-20T12:13:42.425Z"}, {"lat": "44.130222", "lng": "9.694384", "elevation": "216.3000030517578", "time": "2013-09-20T12:13:43.388Z"}, {"lat": "44.130217", "lng": "9.694383", "elevation": "217.60000610351563", "time": "2013-09-20T12:13:47.297Z"}, {"lat": "44.130218", "lng": "9.694382", "elevation": "217.89999389648438", "time": "2013-09-20T12:13:48.305Z"}, {"lat": "44.130224", "lng": "9.694398", "elevation": "218.6999969482422", "time": "2013-09-20T12:14:10.330Z"}, {"lat": "44.13022", "lng": "9.694404", "elevation": "219.8000030517578", "time": "2013-09-20T12:14:11.311Z"}, {"lat": "44.130142", "lng": "9.694452", "elevation": "222.10000610351563", "time": "2013-09-20T12:14:17.301Z"}, {"lat": "44.130127", "lng": "9.694465", "elevation": "223.0", "time": "2013-09-20T12:14:18.305Z"}, {"lat": "44.130056", "lng": "9.694534", "elevation": "228.10000610351563", "time": "2013-09-20T12:14:23.410Z"}, {"lat": "44.130044", "lng": "9.694544", "elevation": "229.39999389648438", "time": "2013-09-20T12:14:24.362Z"}, {"lat": "44.130043", "lng": "9.694603", "elevation": "229.6999969482422", "time": "2013-09-20T12:14:34.310Z"}, {"lat": "44.130043", "lng": "9.694603", "elevation": "229.8000030517578", "time": "2013-09-20T12:14:35.301Z"}, {"lat": "44.13004", "lng": "9.694613", "elevation": "231.89999389648438", "time": "2013-09-20T12:14:48.355Z"}, {"lat": "44.130038", "lng": "9.694621", "elevation": "233.10000610351563", "time": "2013-09-20T12:14:49.341Z"}, {"lat": "44.13003", "lng": "9.69474", "elevation": "231.3000030517578", "time": "2013-09-20T12:14:56.306Z"}, {"lat": "44.130032", "lng": "9.694756", "elevation": "231.5", "time": "2013-09-20T12:14:57.298Z"}, {"lat": "44.130048", "lng": "9.694868", "elevation": "234.60000610351563", "time": "2013-09-20T12:15:09.300Z"}, {"lat": "44.13005", "lng": "9.694878", "elevation": "234.5", "time": "2013-09-20T12:15:10.323Z"}, {"lat": "44.130062", "lng": "9.695001", "elevation": "240.39999389648438", "time": "2013-09-20T12:15:24.409Z"}, {"lat": "44.130061", "lng": "9.695013", "elevation": "239.60000610351563", "time": "2013-09-20T12:15:25.381Z"}, {"lat": "44.130046", "lng": "9.695119", "elevation": "242.5", "time": "2013-09-20T12:15:32.423Z"}, {"lat": "44.130044", "lng": "9.695139", "elevation": "242.1999969482422", "time": "2013-09-20T12:15:33.383Z"}, {"lat": "44.130013", "lng": "9.695249", "elevation": "244.10000610351563", "time": "2013-09-20T12:15:44.327Z"}, {"lat": "44.130008", "lng": "9.69526", "elevation": "243.39999389648438", "time": "2013-09-20T12:15:45.378Z"}, {"lat": "44.129972", "lng": "9.695373", "elevation": "240.89999389648438", "time": "2013-09-20T12:15:53.316Z"}, {"lat": "44.129971", "lng": "9.695387", "elevation": "241.10000610351563", "time": "2013-09-20T12:15:54.306Z"}, {"lat": "44.129946", "lng": "9.695495", "elevation": "239.5", "time": "2013-09-20T12:16:00.317Z"}, {"lat": "44.129944", "lng": "9.695514", "elevation": "239.89999389648438", "time": "2013-09-20T12:16:01.319Z"}, {"lat": "44.129932", "lng": "9.695626", "elevation": "241.89999389648438", "time": "2013-09-20T12:16:08.311Z"}, {"lat": "44.129931", "lng": "9.695641", "elevation": "241.1999969482422", "time": "2013-09-20T12:16:09.307Z"}, {"lat": "44.129948", "lng": "9.695759", "elevation": "239.89999389648438", "time": "2013-09-20T12:16:18.411Z"}, {"lat": "44.129943", "lng": "9.69577", "elevation": "239.60000610351563", "time": "2013-09-20T12:16:19.441Z"}, {"lat": "44.129886", "lng": "9.695858", "elevation": "240.60000610351563", "time": "2013-09-20T12:16:27.455Z"}, {"lat": "44.129879", "lng": "9.695862", "elevation": "240.6999969482422", "time": "2013-09-20T12:16:28.430Z"}, {"lat": "44.129859", "lng": "9.69586", "elevation": "241.3000030517578", "time": "2013-09-20T12:16:34.437Z"}, {"lat": "44.129859", "lng": "9.695862", "elevation": "241.10000610351563", "time": "2013-09-20T12:16:35.468Z"}, {"lat": "44.129857", "lng": "9.695866", "elevation": "240.8000030517578", "time": "2013-09-20T12:16:37.404Z"}, {"lat": "44.129856", "lng": "9.695873", "elevation": "241.10000610351563", "time": "2013-09-20T12:16:38.370Z"}, {"lat": "44.12983", "lng": "9.695987", "elevation": "241.10000610351563", "time": "2013-09-20T12:16:47.307Z"}, {"lat": "44.129824", "lng": "9.696002", "elevation": "240.60000610351563", "time": "2013-09-20T12:16:48.301Z"}, {"lat": "44.129766", "lng": "9.696096", "elevation": "240.89999389648438", "time": "2013-09-20T12:16:56.316Z"}, {"lat": "44.129759", "lng": "9.696104", "elevation": "241.3000030517578", "time": "2013-09-20T12:16:57.311Z"}, {"lat": "44.129704", "lng": "9.696183", "elevation": "244.5", "time": "2013-09-20T12:17:06.415Z"}, {"lat": "44.129696", "lng": "9.696194", "elevation": "245.3000030517578", "time": "2013-09-20T12:17:07.464Z"}, {"lat": "44.129652", "lng": "9.6963", "elevation": "244.3000030517578", "time": "2013-09-20T12:17:14.400Z"}, {"lat": "44.129646", "lng": "9.696318", "elevation": "244.10000610351563", "time": "2013-09-20T12:17:15.472Z"}, {"lat": "44.129623", "lng": "9.696427", "elevation": "242.89999389648438", "time": "2013-09-20T12:17:22.314Z"}, {"lat": "44.12962", "lng": "9.696438", "elevation": "242.6999969482422", "time": "2013-09-20T12:17:23.344Z"}, {"lat": "44.129613", "lng": "9.696561", "elevation": "243.0", "time": "2013-09-20T12:17:33.319Z"}, {"lat": "44.129611", "lng": "9.696573", "elevation": "241.6999969482422", "time": "2013-09-20T12:17:34.316Z"}, {"lat": "44.129587", "lng": "9.696684", "elevation": "239.3000030517578", "time": "2013-09-20T12:17:42.359Z"}, {"lat": "44.129582", "lng": "9.696701", "elevation": "241.8000030517578", "time": "2013-09-20T12:17:43.346Z"}, {"lat": "44.129531", "lng": "9.696803", "elevation": "243.0", "time": "2013-09-20T12:17:49.396Z"}, {"lat": "44.129522", "lng": "9.696815", "elevation": "242.8000030517578", "time": "2013-09-20T12:17:50.363Z"}, {"lat": "44.12949", "lng": "9.696912", "elevation": "238.10000610351563", "time": "2013-09-20T12:17:57.345Z"}, {"lat": "44.129493", "lng": "9.696939", "elevation": "238.8000030517578", "time": "2013-09-20T12:17:58.320Z"}, {"lat": "44.129491", "lng": "9.697058", "elevation": "238.60000610351563", "time": "2013-09-20T12:18:03.318Z"}, {"lat": "44.129485", "lng": "9.697074", "elevation": "238.5", "time": "2013-09-20T12:18:04.317Z"}, {"lat": "44.129466", "lng": "9.697191", "elevation": "237.89999389648438", "time": "2013-09-20T12:18:15.317Z"}, {"lat": "44.129465", "lng": "9.697197", "elevation": "237.8000030517578", "time": "2013-09-20T12:18:16.318Z"}, {"lat": "44.129422", "lng": "9.697305", "elevation": "241.5", "time": "2013-09-20T12:18:24.319Z"}, {"lat": "44.129417", "lng": "9.697319", "elevation": "242.0", "time": "2013-09-20T12:18:25.318Z"}, {"lat": "44.129413", "lng": "9.697439", "elevation": "241.39999389648438", "time": "2013-09-20T12:18:34.320Z"}, {"lat": "44.129413", "lng": "9.697456", "elevation": "240.5", "time": "2013-09-20T12:18:35.318Z"}, {"lat": "44.129429", "lng": "9.697569", "elevation": "241.5", "time": "2013-09-20T12:18:43.485Z"}, {"lat": "44.12943", "lng": "9.697582", "elevation": "241.6999969482422", "time": "2013-09-20T12:18:44.328Z"}, {"lat": "44.129449", "lng": "9.697693", "elevation": "246.1999969482422", "time": "2013-09-20T12:18:51.343Z"}, {"lat": "44.129453", "lng": "9.697706", "elevation": "246.5", "time": "2013-09-20T12:18:52.324Z"}, {"lat": "44.129456", "lng": "9.697718", "elevation": "245.39999389648438", "time": "2013-09-20T12:18:56.432Z"}, {"lat": "44.129455", "lng": "9.697716", "elevation": "246.0", "time": "2013-09-20T12:18:57.403Z"}, {"lat": "44.129455", "lng": "9.697715", "elevation": "244.89999389648438", "time": "2013-09-20T12:19:34.330Z"}, {"lat": "44.12946", "lng": "9.697717", "elevation": "245.1999969482422", "time": "2013-09-20T12:19:35.323Z"}, {"lat": "44.129524", "lng": "9.697802", "elevation": "247.0", "time": "2013-09-20T12:19:49.325Z"}, {"lat": "44.129527", "lng": "9.697805", "elevation": "246.8000030517578", "time": "2013-09-20T12:19:50.325Z"}, {"lat": "44.129549", "lng": "9.697924", "elevation": "242.3000030517578", "time": "2013-09-20T12:19:58.338Z"}, {"lat": "44.129552", "lng": "9.697946", "elevation": "242.89999389648438", "time": "2013-09-20T12:19:59.326Z"}, {"lat": "44.129515", "lng": "9.698055", "elevation": "246.89999389648438", "time": "2013-09-20T12:20:06.398Z"}, {"lat": "44.129511", "lng": "9.698068", "elevation": "246.1999969482422", "time": "2013-09-20T12:20:07.425Z"}, {"lat": "44.129494", "lng": "9.698177", "elevation": "246.8000030517578", "time": "2013-09-20T12:20:14.370Z"}, {"lat": "44.12949", "lng": "9.698193", "elevation": "247.10000610351563", "time": "2013-09-20T12:20:15.431Z"}, {"lat": "44.129447", "lng": "9.698291", "elevation": "247.60000610351563", "time": "2013-09-20T12:20:22.367Z"}, {"lat": "44.129441", "lng": "9.698306", "elevation": "247.10000610351563", "time": "2013-09-20T12:20:23.420Z"}, {"lat": "44.12944", "lng": "9.698421", "elevation": "246.39999389648438", "time": "2013-09-20T12:20:32.440Z"}, {"lat": "44.129439", "lng": "9.698433", "elevation": "246.1999969482422", "time": "2013-09-20T12:20:33.453Z"}, {"lat": "44.129409", "lng": "9.698538", "elevation": "245.8000030517578", "time": "2013-09-20T12:20:40.449Z"}, {"lat": "44.129406", "lng": "9.698551", "elevation": "245.5", "time": "2013-09-20T12:20:41.411Z"}, {"lat": "44.129428", "lng": "9.698656", "elevation": "243.8000030517578", "time": "2013-09-20T12:21:03.330Z"}, {"lat": "44.129424", "lng": "9.698658", "elevation": "244.60000610351563", "time": "2013-09-20T12:21:04.335Z"}, {"lat": "44.129419", "lng": "9.698661", "elevation": "244.6999969482422", "time": "2013-09-20T12:21:05.334Z"}, {"lat": "44.129416", "lng": "9.698663", "elevation": "244.60000610351563", "time": "2013-09-20T12:21:06.334Z"}, {"lat": "44.129411", "lng": "9.698665", "elevation": "244.60000610351563", "time": "2013-09-20T12:21:08.368Z"}, {"lat": "44.12941", "lng": "9.698666", "elevation": "244.60000610351563", "time": "2013-09-20T12:21:09.331Z"}, {"lat": "44.129423", "lng": "9.698705", "elevation": "242.5", "time": "2013-09-20T12:21:36.334Z"}, {"lat": "44.129429", "lng": "9.698716", "elevation": "244.60000610351563", "time": "2013-09-20T12:21:37.334Z"}, {"lat": "44.12947", "lng": "9.698803", "elevation": "247.8000030517578", "time": "2013-09-20T12:21:41.350Z"}, {"lat": "44.129479", "lng": "9.698838", "elevation": "250.10000610351563", "time": "2013-09-20T12:21:42.377Z"}, {"lat": "44.129478", "lng": "9.698962", "elevation": "255.1999969482422", "time": "2013-09-20T12:21:47.462Z"}, {"lat": "44.129475", "lng": "9.698981", "elevation": "255.0", "time": "2013-09-20T12:21:48.471Z"}, {"lat": "44.129489", "lng": "9.6991", "elevation": "257.5", "time": "2013-09-20T12:21:55.461Z"}, {"lat": "44.129487", "lng": "9.699113", "elevation": "258.70001220703125", "time": "2013-09-20T12:21:56.350Z"}, {"lat": "44.129481", "lng": "9.699237", "elevation": "261.79998779296875", "time": "2013-09-20T12:22:06.390Z"}, {"lat": "44.129483", "lng": "9.699249", "elevation": "262.1000061035156", "time": "2013-09-20T12:22:07.378Z"}, {"lat": "44.129483", "lng": "9.69937", "elevation": "266.3999938964844", "time": "2013-09-20T12:22:16.346Z"}, {"lat": "44.129483", "lng": "9.699384", "elevation": "266.0", "time": "2013-09-20T12:22:17.341Z"}, {"lat": "44.129476", "lng": "9.699499", "elevation": "265.20001220703125", "time": "2013-09-20T12:22:26.354Z"}, {"lat": "44.129476", "lng": "9.699511", "elevation": "265.20001220703125", "time": "2013-09-20T12:22:27.362Z"}, {"lat": "44.129482", "lng": "9.699628", "elevation": "266.5", "time": "2013-09-20T12:22:35.343Z"}, {"lat": "44.129483", "lng": "9.699644", "elevation": "266.3999938964844", "time": "2013-09-20T12:22:36.344Z"}, {"lat": "44.129467", "lng": "9.69976", "elevation": "267.5", "time": "2013-09-20T12:22:49.347Z"}, {"lat": "44.129468", "lng": "9.699768", "elevation": "267.3999938964844", "time": "2013-09-20T12:22:50.393Z"}, {"lat": "44.129434", "lng": "9.699871", "elevation": "272.70001220703125", "time": "2013-09-20T12:23:01.424Z"}, {"lat": "44.129423", "lng": "9.699888", "elevation": "272.5", "time": "2013-09-20T12:23:02.388Z"}, {"lat": "44.129365", "lng": "9.699975", "elevation": "271.79998779296875", "time": "2013-09-20T12:23:08.350Z"}, {"lat": "44.12936", "lng": "9.699988", "elevation": "271.29998779296875", "time": "2013-09-20T12:23:09.347Z"}, {"lat": "44.12933", "lng": "9.700052", "elevation": "271.79998779296875", "time": "2013-09-20T12:23:20.350Z"}, {"lat": "44.12933", "lng": "9.700053", "elevation": "271.5", "time": "2013-09-20T12:23:21.346Z"}, {"lat": "44.129329", "lng": "9.700055", "elevation": "271.5", "time": "2013-09-20T12:23:22.414Z"}, {"lat": "44.129327", "lng": "9.700057", "elevation": "270.6000061035156", "time": "2013-09-20T12:23:23.346Z"}, {"lat": "44.129278", "lng": "9.700151", "elevation": "268.0", "time": "2013-09-20T12:23:32.453Z"}, {"lat": "44.129272", "lng": "9.70017", "elevation": "268.1000061035156", "time": "2013-09-20T12:23:33.429Z"}, {"lat": "44.129243", "lng": "9.700282", "elevation": "267.20001220703125", "time": "2013-09-20T12:23:39.480Z"}, {"lat": "44.129236", "lng": "9.700293", "elevation": "267.5", "time": "2013-09-20T12:23:40.440Z"}, {"lat": "44.129218", "lng": "9.700301", "elevation": "267.1000061035156", "time": "2013-09-20T12:23:46.423Z"}, {"lat": "44.129219", "lng": "9.700299", "elevation": "267.1000061035156", "time": "2013-09-20T12:23:47.492Z"}, {"lat": "44.129224", "lng": "9.700306", "elevation": "267.0", "time": "2013-09-20T12:23:51.366Z"}, {"lat": "44.129224", "lng": "9.700313", "elevation": "268.1000061035156", "time": "2013-09-20T12:23:52.360Z"}, {"lat": "44.129148", "lng": "9.70038", "elevation": "271.8999938964844", "time": "2013-09-20T12:24:00.359Z"}, {"lat": "44.129135", "lng": "9.700388", "elevation": "271.8999938964844", "time": "2013-09-20T12:24:01.357Z"}, {"lat": "44.129087", "lng": "9.700477", "elevation": "271.1000061035156", "time": "2013-09-20T12:24:08.351Z"}, {"lat": "44.12908", "lng": "9.700491", "elevation": "270.29998779296875", "time": "2013-09-20T12:24:09.370Z"}, {"lat": "44.129045", "lng": "9.700595", "elevation": "265.5", "time": "2013-09-20T12:24:17.351Z"}, {"lat": "44.129041", "lng": "9.70061", "elevation": "265.70001220703125", "time": "2013-09-20T12:24:18.484Z"}, {"lat": "44.129019", "lng": "9.700718", "elevation": "265.3999938964844", "time": "2013-09-20T12:24:25.357Z"}, {"lat": "44.129018", "lng": "9.700733", "elevation": "265.0", "time": "2013-09-20T12:24:26.436Z"}, {"lat": "44.128987", "lng": "9.700839", "elevation": "261.3999938964844", "time": "2013-09-20T12:24:34.489Z"}, {"lat": "44.128987", "lng": "9.700854", "elevation": "259.6000061035156", "time": "2013-09-20T12:24:35.475Z"}, {"lat": "44.128987", "lng": "9.700972", "elevation": "257.20001220703125", "time": "2013-09-20T12:24:43.506Z"}, {"lat": "44.128989", "lng": "9.700981", "elevation": "256.29998779296875", "time": "2013-09-20T12:24:44.354Z"}, {"lat": "44.128958", "lng": "9.701041", "elevation": "256.20001220703125", "time": "2013-09-20T12:25:03.298Z"}, {"lat": "44.128956", "lng": "9.701041", "elevation": "256.5", "time": "2013-09-20T12:25:03.369Z"}, {"lat": "44.128952", "lng": "9.70104", "elevation": "256.1000061035156", "time": "2013-09-20T12:25:04.359Z"}, {"lat": "44.128947", "lng": "9.701038", "elevation": "256.0", "time": "2013-09-20T12:25:05.360Z"}, {"lat": "44.128921", "lng": "9.701043", "elevation": "256.5", "time": "2013-09-20T12:25:11.363Z"}, {"lat": "44.128922", "lng": "9.701045", "elevation": "256.3999938964844", "time": "2013-09-20T12:25:12.357Z"}, {"lat": "44.128919", "lng": "9.701067", "elevation": "257.70001220703125", "time": "2013-09-20T12:25:46.355Z"}, {"lat": "44.128915", "lng": "9.701071", "elevation": "257.3999938964844", "time": "2013-09-20T12:25:47.359Z"}, {"lat": "44.128904", "lng": "9.701189", "elevation": "244.39999389648438", "time": "2013-09-20T12:26:03.357Z"}, {"lat": "44.128906", "lng": "9.701205", "elevation": "245.39999389648438", "time": "2013-09-20T12:26:04.361Z"}, {"lat": "44.128893", "lng": "9.701294", "elevation": "245.1999969482422", "time": "2013-09-20T12:26:13.437Z"}, {"lat": "44.128893", "lng": "9.701293", "elevation": "244.1999969482422", "time": "2013-09-20T12:26:14.473Z"}, {"lat": "44.128885", "lng": "9.701297", "elevation": "245.1999969482422", "time": "2013-09-20T12:26:26.363Z"}, {"lat": "44.128886", "lng": "9.701302", "elevation": "245.10000610351563", "time": "2013-09-20T12:26:27.362Z"}, {"lat": "44.128906", "lng": "9.701423", "elevation": "246.10000610351563", "time": "2013-09-20T12:26:42.371Z"}, {"lat": "44.128906", "lng": "9.701446", "elevation": "246.6999969482422", "time": "2013-09-20T12:26:43.362Z"}, {"lat": "44.128899", "lng": "9.701556", "elevation": "247.10000610351563", "time": "2013-09-20T12:26:48.363Z"}, {"lat": "44.128897", "lng": "9.701573", "elevation": "247.0", "time": "2013-09-20T12:26:49.367Z"}, {"lat": "44.128871", "lng": "9.701631", "elevation": "246.5", "time": "2013-09-20T12:26:59.367Z"}, {"lat": "44.128872", "lng": "9.701631", "elevation": "246.5", "time": "2013-09-20T12:27:00.366Z"}, {"lat": "44.128875", "lng": "9.701643", "elevation": "244.5", "time": "2013-09-20T12:28:08.370Z"}, {"lat": "44.128877", "lng": "9.70165", "elevation": "244.39999389648438", "time": "2013-09-20T12:28:09.380Z"}, {"lat": "44.12887", "lng": "9.701716", "elevation": "246.39999389648438", "time": "2013-09-20T12:28:23.361Z"}, {"lat": "44.12887", "lng": "9.701716", "elevation": "246.39999389648438", "time": "2013-09-20T12:28:23.393Z"}, {"lat": "44.128873", "lng": "9.701713", "elevation": "246.10000610351563", "time": "2013-09-20T12:28:52.380Z"}, {"lat": "44.128876", "lng": "9.70172", "elevation": "245.5", "time": "2013-09-20T12:28:53.441Z"}, {"lat": "44.128935", "lng": "9.701809", "elevation": "245.5", "time": "2013-09-20T12:28:59.379Z"}, {"lat": "44.128945", "lng": "9.701817", "elevation": "245.1999969482422", "time": "2013-09-20T12:29:00.380Z"}, {"lat": "44.129022", "lng": "9.701861", "elevation": "239.5", "time": "2013-09-20T12:29:09.381Z"}, {"lat": "44.129029", "lng": "9.701876", "elevation": "239.6999969482422", "time": "2013-09-20T12:29:10.387Z"}, {"lat": "44.129091", "lng": "9.701959", "elevation": "237.6999969482422", "time": "2013-09-20T12:29:19.455Z"}, {"lat": "44.129097", "lng": "9.701968", "elevation": "238.1999969482422", "time": "2013-09-20T12:29:20.479Z"}, {"lat": "44.129162", "lng": "9.702031", "elevation": "237.6999969482422", "time": "2013-09-20T12:29:29.432Z"}, {"lat": "44.129172", "lng": "9.702037", "elevation": "238.3000030517578", "time": "2013-09-20T12:29:30.416Z"}, {"lat": "44.129235", "lng": "9.702101", "elevation": "239.0", "time": "2013-09-20T12:29:36.433Z"}, {"lat": "44.129245", "lng": "9.702115", "elevation": "239.10000610351563", "time": "2013-09-20T12:29:37.451Z"}, {"lat": "44.129271", "lng": "9.702144", "elevation": "237.0", "time": "2013-09-20T12:29:43.470Z"}, {"lat": "44.129271", "lng": "9.70214", "elevation": "236.6999969482422", "time": "2013-09-20T12:29:44.482Z"}, {"lat": "44.129273", "lng": "9.70215", "elevation": "238.3000030517578", "time": "2013-09-20T12:31:03.379Z"}, {"lat": "44.129277", "lng": "9.702157", "elevation": "238.60000610351563", "time": "2013-09-20T12:31:04.389Z"}, {"lat": "44.129349", "lng": "9.702223", "elevation": "241.5", "time": "2013-09-20T12:31:13.393Z"}, {"lat": "44.129357", "lng": "9.702229", "elevation": "242.0", "time": "2013-09-20T12:31:14.389Z"}, {"lat": "44.129421", "lng": "9.7023", "elevation": "239.39999389648438", "time": "2013-09-20T12:31:21.384Z"}, {"lat": "44.129429", "lng": "9.702318", "elevation": "239.3000030517578", "time": "2013-09-20T12:31:22.388Z"}, {"lat": "44.129476", "lng": "9.702409", "elevation": "239.60000610351563", "time": "2013-09-20T12:31:26.384Z"}, {"lat": "44.129483", "lng": "9.70242", "elevation": "239.60000610351563", "time": "2013-09-20T12:31:27.386Z"}, {"lat": "44.129499", "lng": "9.702465", "elevation": "240.1999969482422", "time": "2013-09-20T12:31:37.386Z"}, {"lat": "44.129499", "lng": "9.702466", "elevation": "240.1999969482422", "time": "2013-09-20T12:31:38.430Z"}, {"lat": "44.129499", "lng": "9.702472", "elevation": "240.10000610351563", "time": "2013-09-20T12:31:44.390Z"}, {"lat": "44.1295", "lng": "9.702479", "elevation": "239.89999389648438", "time": "2013-09-20T12:31:45.392Z"}, {"lat": "44.129526", "lng": "9.702587", "elevation": "241.39999389648438", "time": "2013-09-20T12:31:58.392Z"}, {"lat": "44.129521", "lng": "9.7026", "elevation": "242.39999389648438", "time": "2013-09-20T12:31:59.517Z"}, {"lat": "44.129451", "lng": "9.70267", "elevation": "240.3000030517578", "time": "2013-09-20T12:32:11.391Z"}, {"lat": "44.129454", "lng": "9.702671", "elevation": "240.3000030517578", "time": "2013-09-20T12:32:12.394Z"}, {"lat": "44.129455", "lng": "9.702676", "elevation": "240.1999969482422", "time": "2013-09-20T12:32:16.399Z"}, {"lat": "44.129451", "lng": "9.702682", "elevation": "240.6999969482422", "time": "2013-09-20T12:32:17.395Z"}, {"lat": "44.129404", "lng": "9.702783", "elevation": "236.1999969482422", "time": "2013-09-20T12:32:28.460Z"}, {"lat": "44.1294", "lng": "9.702801", "elevation": "236.0", "time": "2013-09-20T12:32:29.594Z"}, {"lat": "44.129382", "lng": "9.702908", "elevation": "232.8000030517578", "time": "2013-09-20T12:32:40.557Z"}, {"lat": "44.129379", "lng": "9.702926", "elevation": "232.5", "time": "2013-09-20T12:32:41.438Z"}, {"lat": "44.129306", "lng": "9.703", "elevation": "236.0", "time": "2013-09-20T12:32:50.393Z"}, {"lat": "44.129296", "lng": "9.703005", "elevation": "235.89999389648438", "time": "2013-09-20T12:32:51.415Z"}, {"lat": "44.129223", "lng": "9.703072", "elevation": "233.3000030517578", "time": "2013-09-20T12:33:03.393Z"}, {"lat": "44.12922", "lng": "9.703076", "elevation": "233.3000030517578", "time": "2013-09-20T12:33:04.400Z"}, {"lat": "44.129218", "lng": "9.703082", "elevation": "232.8000030517578", "time": "2013-09-20T12:33:06.397Z"}, {"lat": "44.129217", "lng": "9.703084", "elevation": "232.6999969482422", "time": "2013-09-20T12:33:07.402Z"}, {"lat": "44.129212", "lng": "9.703099", "elevation": "232.39999389648438", "time": "2013-09-20T12:33:16.395Z"}, {"lat": "44.129208", "lng": "9.703101", "elevation": "232.1999969482422", "time": "2013-09-20T12:33:17.395Z"}, {"lat": "44.129155", "lng": "9.703195", "elevation": "229.8000030517578", "time": "2013-09-20T12:33:33.559Z"}, {"lat": "44.12915", "lng": "9.703203", "elevation": "229.3000030517578", "time": "2013-09-20T12:33:34.403Z"}, {"lat": "44.129095", "lng": "9.703298", "elevation": "224.39999389648438", "time": "2013-09-20T12:33:51.438Z"}, {"lat": "44.129092", "lng": "9.703302", "elevation": "224.5", "time": "2013-09-20T12:33:52.443Z"}, {"lat": "44.129028", "lng": "9.703389", "elevation": "223.60000610351563", "time": "2013-09-20T12:34:06.408Z"}, {"lat": "44.129018", "lng": "9.703398", "elevation": "223.6999969482422", "time": "2013-09-20T12:34:07.557Z"}, {"lat": "44.128966", "lng": "9.703497", "elevation": "219.0", "time": "2013-09-20T12:34:16.567Z"}, {"lat": "44.128962", "lng": "9.703506", "elevation": "218.39999389648438", "time": "2013-09-20T12:34:17.597Z"}, {"lat": "44.128888", "lng": "9.703562", "elevation": "214.39999389648438", "time": "2013-09-20T12:34:30.522Z"}, {"lat": "44.128883", "lng": "9.703575", "elevation": "214.10000610351563", "time": "2013-09-20T12:34:31.407Z"}, {"lat": "44.12883", "lng": "9.703668", "elevation": "213.10000610351563", "time": "2013-09-20T12:34:45.391Z"}, {"lat": "44.128823", "lng": "9.703683", "elevation": "213.0", "time": "2013-09-20T12:34:46.401Z"}, {"lat": "44.12877", "lng": "9.703782", "elevation": "212.60000610351563", "time": "2013-09-20T12:34:53.404Z"}, {"lat": "44.128767", "lng": "9.703785", "elevation": "212.5", "time": "2013-09-20T12:34:54.406Z"}, {"lat": "44.128728", "lng": "9.703793", "elevation": "212.3000030517578", "time": "2013-09-20T12:35:06.404Z"}, {"lat": "44.128728", "lng": "9.703795", "elevation": "212.3000030517578", "time": "2013-09-20T12:35:07.401Z"}, {"lat": "44.128729", "lng": "9.703799", "elevation": "212.1999969482422", "time": "2013-09-20T12:35:09.405Z"}, {"lat": "44.128728", "lng": "9.703805", "elevation": "211.10000610351563", "time": "2013-09-20T12:35:10.419Z"}, {"lat": "44.128703", "lng": "9.703918", "elevation": "208.3000030517578", "time": "2013-09-20T12:35:16.403Z"}, {"lat": "44.128695", "lng": "9.703941", "elevation": "209.60000610351563", "time": "2013-09-20T12:35:17.401Z"}, {"lat": "44.128657", "lng": "9.704026", "elevation": "209.0", "time": "2013-09-20T12:35:21.408Z"}, {"lat": "44.12865", "lng": "9.704052", "elevation": "208.1999969482422", "time": "2013-09-20T12:35:22.403Z"}, {"lat": "44.128642", "lng": "9.704164", "elevation": "204.89999389648438", "time": "2013-09-20T12:35:26.403Z"}, {"lat": "44.128642", "lng": "9.704191", "elevation": "203.8000030517578", "time": "2013-09-20T12:35:27.403Z"}, {"lat": "44.128601", "lng": "9.704301", "elevation": "204.60000610351563", "time": "2013-09-20T12:35:34.404Z"}, {"lat": "44.128592", "lng": "9.704309", "elevation": "204.60000610351563", "time": "2013-09-20T12:35:35.403Z"}, {"lat": "44.128533", "lng": "9.70439", "elevation": "202.10000610351563", "time": "2013-09-20T12:35:44.407Z"}, {"lat": "44.128522", "lng": "9.704393", "elevation": "202.3000030517578", "time": "2013-09-20T12:35:45.405Z"}, {"lat": "44.128457", "lng": "9.704467", "elevation": "202.1999969482422", "time": "2013-09-20T12:35:53.407Z"}, {"lat": "44.128454", "lng": "9.704479", "elevation": "202.10000610351563", "time": "2013-09-20T12:35:54.411Z"}, {"lat": "44.128382", "lng": "9.704547", "elevation": "199.8000030517578", "time": "2013-09-20T12:36:08.418Z"}, {"lat": "44.128374", "lng": "9.704549", "elevation": "199.0", "time": "2013-09-20T12:36:09.422Z"}, {"lat": "44.128295", "lng": "9.704591", "elevation": "203.3000030517578", "time": "2013-09-20T12:36:21.456Z"}, {"lat": "44.128287", "lng": "9.704589", "elevation": "203.10000610351563", "time": "2013-09-20T12:36:22.404Z"}, {"lat": "44.128277", "lng": "9.704572", "elevation": "204.5", "time": "2013-09-20T12:36:27.458Z"}, {"lat": "44.12828", "lng": "9.704571", "elevation": "204.10000610351563", "time": "2013-09-20T12:36:28.415Z"}, {"lat": "44.128278", "lng": "9.704576", "elevation": "203.8000030517578", "time": "2013-09-20T12:36:48.450Z"}, {"lat": "44.128273", "lng": "9.704577", "elevation": "203.6999969482422", "time": "2013-09-20T12:36:49.413Z"}, {"lat": "44.128198", "lng": "9.704595", "elevation": "201.39999389648438", "time": "2013-09-20T12:36:53.502Z"}, {"lat": "44.128176", "lng": "9.704605", "elevation": "201.0", "time": "2013-09-20T12:36:54.428Z"}, {"lat": "44.128098", "lng": "9.704642", "elevation": "201.10000610351563", "time": "2013-09-20T12:36:58.439Z"}, {"lat": "44.128086", "lng": "9.704649", "elevation": "200.60000610351563", "time": "2013-09-20T12:36:59.433Z"}, {"lat": "44.128024", "lng": "9.704725", "elevation": "201.0", "time": "2013-09-20T12:37:07.421Z"}, {"lat": "44.128015", "lng": "9.704735", "elevation": "200.3000030517578", "time": "2013-09-20T12:37:08.410Z"}, {"lat": "44.127939", "lng": "9.704802", "elevation": "201.5", "time": "2013-09-20T12:37:16.415Z"}, {"lat": "44.127932", "lng": "9.704812", "elevation": "200.39999389648438", "time": "2013-09-20T12:37:17.413Z"}, {"lat": "44.127851", "lng": "9.704862", "elevation": "199.60000610351563", "time": "2013-09-20T12:37:25.411Z"}, {"lat": "44.127842", "lng": "9.704868", "elevation": "198.0", "time": "2013-09-20T12:37:26.412Z"}, {"lat": "44.127764", "lng": "9.704929", "elevation": "196.89999389648438", "time": "2013-09-20T12:37:35.437Z"}, {"lat": "44.127755", "lng": "9.704934", "elevation": "196.60000610351563", "time": "2013-09-20T12:37:36.412Z"}, {"lat": "44.127692", "lng": "9.70502", "elevation": "195.60000610351563", "time": "2013-09-20T12:37:50.413Z"}, {"lat": "44.127682", "lng": "9.705018", "elevation": "196.0", "time": "2013-09-20T12:37:51.418Z"}, {"lat": "44.12761", "lng": "9.705085", "elevation": "197.8000030517578", "time": "2013-09-20T12:38:00.457Z"}, {"lat": "44.127601", "lng": "9.705095", "elevation": "198.10000610351563", "time": "2013-09-20T12:38:01.416Z"}, {"lat": "44.127524", "lng": "9.70515", "elevation": "201.1999969482422", "time": "2013-09-20T12:38:08.421Z"}, {"lat": "44.127507", "lng": "9.705155", "elevation": "201.60000610351563", "time": "2013-09-20T12:38:09.423Z"}, {"lat": "44.127428", "lng": "9.705203", "elevation": "199.8000030517578", "time": "2013-09-20T12:38:16.418Z"}, {"lat": "44.127425", "lng": "9.705221", "elevation": "200.5", "time": "2013-09-20T12:38:17.427Z"}, {"lat": "44.127347", "lng": "9.705267", "elevation": "200.10000610351563", "time": "2013-09-20T12:38:26.413Z"}, {"lat": "44.127337", "lng": "9.705264", "elevation": "199.8000030517578", "time": "2013-09-20T12:38:27.419Z"}, {"lat": "44.127269", "lng": "9.705196", "elevation": "199.0", "time": "2013-09-20T12:38:35.418Z"}, {"lat": "44.12726", "lng": "9.705196", "elevation": "198.8000030517578", "time": "2013-09-20T12:38:36.417Z"}, {"lat": "44.127177", "lng": "9.705226", "elevation": "198.6999969482422", "time": "2013-09-20T12:38:44.433Z"}, {"lat": "44.127162", "lng": "9.70522", "elevation": "199.1999969482422", "time": "2013-09-20T12:38:45.429Z"}, {"lat": "44.127075", "lng": "9.705187", "elevation": "201.60000610351563", "time": "2013-09-20T12:38:54.421Z"}, {"lat": "44.127073", "lng": "9.705186", "elevation": "200.6999969482422", "time": "2013-09-20T12:38:55.425Z"}, {"lat": "44.127074", "lng": "9.705191", "elevation": "202.39999389648438", "time": "2013-09-20T12:38:57.451Z"}, {"lat": "44.127075", "lng": "9.705194", "elevation": "202.6999969482422", "time": "2013-09-20T12:38:58.448Z"}, {"lat": "44.127073", "lng": "9.705195", "elevation": "202.6999969482422", "time": "2013-09-20T12:38:59.424Z"}, {"lat": "44.127069", "lng": "9.705196", "elevation": "202.39999389648438", "time": "2013-09-20T12:39:00.447Z"}, {"lat": "44.126983", "lng": "9.705228", "elevation": "200.39999389648438", "time": "2013-09-20T12:39:07.436Z"}, {"lat": "44.126973", "lng": "9.705236", "elevation": "199.89999389648438", "time": "2013-09-20T12:39:08.452Z"}, {"lat": "44.126891", "lng": "9.705271", "elevation": "200.8000030517578", "time": "2013-09-20T12:39:16.420Z"}, {"lat": "44.12688", "lng": "9.705274", "elevation": "201.39999389648438", "time": "2013-09-20T12:39:17.426Z"}, {"lat": "44.126794", "lng": "9.705289", "elevation": "201.8000030517578", "time": "2013-09-20T12:39:25.422Z"}, {"lat": "44.126784", "lng": "9.705294", "elevation": "203.5", "time": "2013-09-20T12:39:26.435Z"}, {"lat": "44.126701", "lng": "9.705321", "elevation": "204.1999969482422", "time": "2013-09-20T12:39:34.434Z"}, {"lat": "44.126692", "lng": "9.705322", "elevation": "203.3000030517578", "time": "2013-09-20T12:39:35.415Z"}, {"lat": "44.126611", "lng": "9.705346", "elevation": "204.39999389648438", "time": "2013-09-20T12:39:47.423Z"}, {"lat": "44.1266", "lng": "9.705351", "elevation": "203.8000030517578", "time": "2013-09-20T12:39:48.421Z"}, {"lat": "44.12651", "lng": "9.705339", "elevation": "204.5", "time": "2013-09-20T12:39:56.426Z"}, {"lat": "44.126498", "lng": "9.705339", "elevation": "204.89999389648438", "time": "2013-09-20T12:39:57.423Z"}, {"lat": "44.126414", "lng": "9.705331", "elevation": "203.60000610351563", "time": "2013-09-20T12:40:06.428Z"}, {"lat": "44.126406", "lng": "9.705328", "elevation": "204.5", "time": "2013-09-20T12:40:07.434Z"}, {"lat": "44.126321", "lng": "9.705322", "elevation": "205.1999969482422", "time": "2013-09-20T12:40:16.431Z"}, {"lat": "44.126312", "lng": "9.705322", "elevation": "205.39999389648438", "time": "2013-09-20T12:40:17.426Z"}, {"lat": "44.126223", "lng": "9.705316", "elevation": "205.5", "time": "2013-09-20T12:40:28.427Z"}, {"lat": "44.126218", "lng": "9.705313", "elevation": "205.3000030517578", "time": "2013-09-20T12:40:29.427Z"}, {"lat": "44.126131", "lng": "9.705326", "elevation": "205.39999389648438", "time": "2013-09-20T12:40:40.431Z"}, {"lat": "44.126122", "lng": "9.705322", "elevation": "205.1999969482422", "time": "2013-09-20T12:40:41.428Z"}, {"lat": "44.126033", "lng": "9.705315", "elevation": "207.89999389648438", "time": "2013-09-20T12:40:53.425Z"}, {"lat": "44.126028", "lng": "9.705317", "elevation": "209.0", "time": "2013-09-20T12:40:54.425Z"}, {"lat": "44.125964", "lng": "9.705384", "elevation": "205.60000610351563", "time": "2013-09-20T12:41:05.431Z"}, {"lat": "44.125953", "lng": "9.70539", "elevation": "205.39999389648438", "time": "2013-09-20T12:41:06.430Z"}, {"lat": "44.125871", "lng": "9.705406", "elevation": "206.8000030517578", "time": "2013-09-20T12:41:13.431Z"}, {"lat": "44.125863", "lng": "9.705412", "elevation": "207.60000610351563", "time": "2013-09-20T12:41:14.431Z"}, {"lat": "44.12584", "lng": "9.705447", "elevation": "209.60000610351563", "time": "2013-09-20T12:41:22.458Z"}, {"lat": "44.125839", "lng": "9.705442", "elevation": "209.6999969482422", "time": "2013-09-20T12:41:23.479Z"}, {"lat": "44.125834", "lng": "9.705434", "elevation": "209.6999969482422", "time": "2013-09-20T12:41:24.467Z"}, {"lat": "44.125754", "lng": "9.705474", "elevation": "210.0", "time": "2013-09-20T12:41:41.436Z"}, {"lat": "44.125746", "lng": "9.705478", "elevation": "209.60000610351563", "time": "2013-09-20T12:41:42.427Z"}, {"lat": "44.125667", "lng": "9.705535", "elevation": "210.89999389648438", "time": "2013-09-20T12:41:56.435Z"}, {"lat": "44.125661", "lng": "9.70553", "elevation": "211.10000610351563", "time": "2013-09-20T12:41:57.430Z"}, {"lat": "44.125642", "lng": "9.705512", "elevation": "211.1999969482422", "time": "2013-09-20T12:42:03.763Z"}, {"lat": "44.125642", "lng": "9.705512", "elevation": "211.10000610351563", "time": "2013-09-20T12:42:04.433Z"}, {"lat": "44.125641", "lng": "9.705517", "elevation": "210.10000610351563", "time": "2013-09-20T12:42:20.442Z"}, {"lat": "44.125637", "lng": "9.705523", "elevation": "209.3000030517578", "time": "2013-09-20T12:42:21.443Z"}, {"lat": "44.125573", "lng": "9.705609", "elevation": "208.6999969482422", "time": "2013-09-20T12:42:34.481Z"}, {"lat": "44.125564", "lng": "9.705608", "elevation": "208.5", "time": "2013-09-20T12:42:35.461Z"}, {"lat": "44.125502", "lng": "9.70569", "elevation": "204.10000610351563", "time": "2013-09-20T12:42:59.440Z"}, {"lat": "44.125494", "lng": "9.70569", "elevation": "205.3000030517578", "time": "2013-09-20T12:43:00.442Z"}, {"lat": "44.12542", "lng": "9.705738", "elevation": "203.89999389648438", "time": "2013-09-20T12:43:08.576Z"}, {"lat": "44.125415", "lng": "9.705751", "elevation": "204.60000610351563", "time": "2013-09-20T12:43:09.438Z"}, {"lat": "44.125409", "lng": "9.705799", "elevation": "203.1999969482422", "time": "2013-09-20T12:43:17.451Z"}, {"lat": "44.125409", "lng": "9.7058", "elevation": "203.1999969482422", "time": "2013-09-20T12:43:18.450Z"}, {"lat": "44.125401", "lng": "9.705805", "elevation": "202.6999969482422", "time": "2013-09-20T12:43:27.453Z"}, {"lat": "44.125398", "lng": "9.705807", "elevation": "203.0", "time": "2013-09-20T12:43:28.442Z"}, {"lat": "44.125308", "lng": "9.705818", "elevation": "200.39999389648438", "time": "2013-09-20T12:43:41.442Z"}, {"lat": "44.125303", "lng": "9.705818", "elevation": "200.39999389648438", "time": "2013-09-20T12:43:42.451Z"}, {"lat": "44.125296", "lng": "9.705823", "elevation": "201.1999969482422", "time": "2013-09-20T12:43:46.451Z"}, {"lat": "44.125297", "lng": "9.705825", "elevation": "200.89999389648438", "time": "2013-09-20T12:43:47.444Z"}, {"lat": "44.125301", "lng": "9.705845", "elevation": "200.8000030517578", "time": "2013-09-20T12:44:50.504Z"}, {"lat": "44.125303", "lng": "9.705852", "elevation": "200.6999969482422", "time": "2013-09-20T12:44:51.550Z"}, {"lat": "44.125306", "lng": "9.705857", "elevation": "200.1999969482422", "time": "2013-09-20T12:44:53.569Z"}, {"lat": "44.125306", "lng": "9.705857", "elevation": "200.1999969482422", "time": "2013-09-20T12:44:54.512Z"}, {"lat": "44.125297", "lng": "9.705855", "elevation": "200.10000610351563", "time": "2013-09-20T12:45:04.464Z"}, {"lat": "44.125293", "lng": "9.705857", "elevation": "200.60000610351563", "time": "2013-09-20T12:45:05.456Z"}, {"lat": "44.125211", "lng": "9.705871", "elevation": "200.5", "time": "2013-09-20T12:45:16.543Z"}, {"lat": "44.125203", "lng": "9.705875", "elevation": "200.1999969482422", "time": "2013-09-20T12:45:17.520Z"}, {"lat": "44.125137", "lng": "9.705898", "elevation": "198.8000030517578", "time": "2013-09-20T12:45:35.458Z"}, {"lat": "44.125138", "lng": "9.705901", "elevation": "198.89999389648438", "time": "2013-09-20T12:45:36.451Z"}, {"lat": "44.125132", "lng": "9.7059", "elevation": "198.8000030517578", "time": "2013-09-20T12:45:41.522Z"}, {"lat": "44.125126", "lng": "9.705904", "elevation": "198.39999389648438", "time": "2013-09-20T12:45:42.556Z"}, {"lat": "44.125051", "lng": "9.705964", "elevation": "196.3000030517578", "time": "2013-09-20T12:45:52.460Z"}, {"lat": "44.125046", "lng": "9.705967", "elevation": "195.89999389648438", "time": "2013-09-20T12:45:53.472Z"}, {"lat": "44.124957", "lng": "9.705985", "elevation": "193.5", "time": "2013-09-20T12:46:08.499Z"}, {"lat": "44.12495", "lng": "9.70599", "elevation": "193.0", "time": "2013-09-20T12:46:09.460Z"}, {"lat": "44.124887", "lng": "9.706078", "elevation": "191.10000610351563", "time": "2013-09-20T12:46:30.474Z"}, {"lat": "44.124885", "lng": "9.706087", "elevation": "190.8000030517578", "time": "2013-09-20T12:46:31.459Z"}, {"lat": "44.124875", "lng": "9.706202", "elevation": "187.1999969482422", "time": "2013-09-20T12:46:40.467Z"}, {"lat": "44.124873", "lng": "9.706214", "elevation": "186.3000030517578", "time": "2013-09-20T12:46:41.467Z"}, {"lat": "44.124862", "lng": "9.706334", "elevation": "182.1999969482422", "time": "2013-09-20T12:46:55.468Z"}, {"lat": "44.124861", "lng": "9.70634", "elevation": "181.8000030517578", "time": "2013-09-20T12:46:56.457Z"}, {"lat": "44.124781", "lng": "9.706388", "elevation": "180.60000610351563", "time": "2013-09-20T12:47:09.469Z"}, {"lat": "44.124774", "lng": "9.70639", "elevation": "180.5", "time": "2013-09-20T12:47:10.475Z"}, {"lat": "44.124711", "lng": "9.706452", "elevation": "181.0", "time": "2013-09-20T12:47:34.564Z"}, {"lat": "44.12471", "lng": "9.706451", "elevation": "181.39999389648438", "time": "2013-09-20T12:47:35.605Z"}, {"lat": "44.124705", "lng": "9.706454", "elevation": "181.3000030517578", "time": "2013-09-20T12:47:38.571Z"}, {"lat": "44.124702", "lng": "9.706456", "elevation": "181.1999969482422", "time": "2013-09-20T12:47:39.486Z"}, {"lat": "44.124628", "lng": "9.706508", "elevation": "178.3000030517578", "time": "2013-09-20T12:47:51.589Z"}, {"lat": "44.12462", "lng": "9.706511", "elevation": "178.3000030517578", "time": "2013-09-20T12:47:52.581Z"}, {"lat": "44.124535", "lng": "9.706541", "elevation": "178.0", "time": "2013-09-20T12:48:02.461Z"}, {"lat": "44.124525", "lng": "9.706549", "elevation": "178.10000610351563", "time": "2013-09-20T12:48:03.461Z"}, {"lat": "44.124455", "lng": "9.706625", "elevation": "176.6999969482422", "time": "2013-09-20T12:48:18.527Z"}, {"lat": "44.124454", "lng": "9.706628", "elevation": "176.1999969482422", "time": "2013-09-20T12:48:19.495Z"}, {"lat": "44.124452", "lng": "9.706645", "elevation": "174.10000610351563", "time": "2013-09-20T12:48:25.559Z"}, {"lat": "44.124451", "lng": "9.706647", "elevation": "174.0", "time": "2013-09-20T12:48:26.517Z"}, {"lat": "44.124445", "lng": "9.706657", "elevation": "172.89999389648438", "time": "2013-09-20T12:48:31.569Z"}, {"lat": "44.124444", "lng": "9.706659", "elevation": "173.0", "time": "2013-09-20T12:48:32.560Z"}, {"lat": "44.124443", "lng": "9.706661", "elevation": "172.6999969482422", "time": "2013-09-20T12:48:33.561Z"}, {"lat": "44.12444", "lng": "9.706667", "elevation": "171.8000030517578", "time": "2013-09-20T12:48:36.475Z"}, {"lat": "44.124437", "lng": "9.70667", "elevation": "171.60000610351563", "time": "2013-09-20T12:48:37.470Z"}, {"lat": "44.124409", "lng": "9.706687", "elevation": "170.5", "time": "2013-09-20T12:48:46.479Z"}, {"lat": "44.124408", "lng": "9.706689", "elevation": "169.8000030517578", "time": "2013-09-20T12:48:47.472Z"}, {"lat": "44.124407", "lng": "9.706693", "elevation": "169.60000610351563", "time": "2013-09-20T12:48:48.479Z"}, {"lat": "44.124402", "lng": "9.706717", "elevation": "169.6999969482422", "time": "2013-09-20T12:48:54.477Z"}, {"lat": "44.124401", "lng": "9.706718", "elevation": "169.6999969482422", "time": "2013-09-20T12:48:55.476Z"}, {"lat": "44.124399", "lng": "9.706725", "elevation": "169.60000610351563", "time": "2013-09-20T12:49:12.474Z"}, {"lat": "44.124399", "lng": "9.706731", "elevation": "169.60000610351563", "time": "2013-09-20T12:49:13.473Z"}, {"lat": "44.124433", "lng": "9.706832", "elevation": "162.3000030517578", "time": "2013-09-20T12:49:22.492Z"}, {"lat": "44.124436", "lng": "9.706845", "elevation": "161.8000030517578", "time": "2013-09-20T12:49:23.488Z"}, {"lat": "44.124378", "lng": "9.70694", "elevation": "160.6999969482422", "time": "2013-09-20T12:49:30.523Z"}, {"lat": "44.124371", "lng": "9.706949", "elevation": "160.6999969482422", "time": "2013-09-20T12:49:31.483Z"}, {"lat": "44.124356", "lng": "9.706976", "elevation": "160.8000030517578", "time": "2013-09-20T12:49:39.501Z"}, {"lat": "44.124356", "lng": "9.706977", "elevation": "160.89999389648438", "time": "2013-09-20T12:49:40.486Z"}, {"lat": "44.124355", "lng": "9.706983", "elevation": "159.60000610351563", "time": "2013-09-20T12:49:55.493Z"}, {"lat": "44.124357", "lng": "9.70699", "elevation": "159.1999969482422", "time": "2013-09-20T12:49:56.485Z"}, {"lat": "44.124397", "lng": "9.707086", "elevation": "159.1999969482422", "time": "2013-09-20T12:50:04.485Z"}, {"lat": "44.124403", "lng": "9.707097", "elevation": "159.60000610351563", "time": "2013-09-20T12:50:05.512Z"}, {"lat": "44.12445", "lng": "9.707187", "elevation": "157.5", "time": "2013-09-20T12:50:17.483Z"}, {"lat": "44.124449", "lng": "9.707187", "elevation": "157.8000030517578", "time": "2013-09-20T12:50:18.482Z"}, {"lat": "44.124453", "lng": "9.707198", "elevation": "158.10000610351563", "time": "2013-09-20T12:50:40.536Z"}, {"lat": "44.124457", "lng": "9.707203", "elevation": "156.89999389648438", "time": "2013-09-20T12:50:41.491Z"}, {"lat": "44.124518", "lng": "9.707285", "elevation": "158.10000610351563", "time": "2013-09-20T12:50:52.656Z"}, {"lat": "44.12452", "lng": "9.707295", "elevation": "158.60000610351563", "time": "2013-09-20T12:50:53.649Z"}, {"lat": "44.124515", "lng": "9.707414", "elevation": "158.0", "time": "2013-09-20T12:51:04.490Z"}, {"lat": "44.124513", "lng": "9.707434", "elevation": "157.39999389648438", "time": "2013-09-20T12:51:05.683Z"}, {"lat": "44.12446", "lng": "9.707516", "elevation": "159.60000610351563", "time": "2013-09-20T12:51:12.562Z"}, {"lat": "44.124451", "lng": "9.707528", "elevation": "161.10000610351563", "time": "2013-09-20T12:51:13.518Z"}, {"lat": "44.1244", "lng": "9.707616", "elevation": "162.1999969482422", "time": "2013-09-20T12:51:20.684Z"}, {"lat": "44.124394", "lng": "9.70763", "elevation": "162.0", "time": "2013-09-20T12:51:21.661Z"}, {"lat": "44.124326", "lng": "9.707697", "elevation": "159.5", "time": "2013-09-20T12:51:29.516Z"}, {"lat": "44.124322", "lng": "9.707712", "elevation": "158.39999389648438", "time": "2013-09-20T12:51:30.487Z"}, {"lat": "44.124296", "lng": "9.707822", "elevation": "157.5", "time": "2013-09-20T12:51:39.488Z"}, {"lat": "44.124289", "lng": "9.707829", "elevation": "158.10000610351563", "time": "2013-09-20T12:51:40.485Z"}, {"lat": "44.124213", "lng": "9.707878", "elevation": "160.10000610351563", "time": "2013-09-20T12:51:51.489Z"}, {"lat": "44.124205", "lng": "9.707883", "elevation": "159.89999389648438", "time": "2013-09-20T12:51:52.487Z"}, {"lat": "44.124127", "lng": "9.707928", "elevation": "159.8000030517578", "time": "2013-09-20T12:52:01.486Z"}, {"lat": "44.124119", "lng": "9.707933", "elevation": "160.39999389648438", "time": "2013-09-20T12:52:02.496Z"}, {"lat": "44.12404", "lng": "9.707982", "elevation": "160.3000030517578", "time": "2013-09-20T12:52:12.487Z"}, {"lat": "44.12403", "lng": "9.707983", "elevation": "160.60000610351563", "time": "2013-09-20T12:52:13.491Z"}, {"lat": "44.123946", "lng": "9.708006", "elevation": "160.5", "time": "2013-09-20T12:52:22.489Z"}, {"lat": "44.123936", "lng": "9.70801", "elevation": "160.6999969482422", "time": "2013-09-20T12:52:23.489Z"}, {"lat": "44.123856", "lng": "9.70806", "elevation": "159.0", "time": "2013-09-20T12:52:31.678Z"}, {"lat": "44.12385", "lng": "9.708069", "elevation": "158.89999389648438", "time": "2013-09-20T12:52:32.600Z"}, {"lat": "44.123791", "lng": "9.70815", "elevation": "156.0", "time": "2013-09-20T12:52:40.651Z"}, {"lat": "44.123784", "lng": "9.70816", "elevation": "156.8000030517578", "time": "2013-09-20T12:52:41.668Z"}, {"lat": "44.123718", "lng": "9.708225", "elevation": "155.5", "time": "2013-09-20T12:52:49.611Z"}, {"lat": "44.123711", "lng": "9.708235", "elevation": "154.8000030517578", "time": "2013-09-20T12:52:50.673Z"}, {"lat": "44.123644", "lng": "9.708297", "elevation": "154.60000610351563", "time": "2013-09-20T12:52:58.579Z"}, {"lat": "44.123633", "lng": "9.708301", "elevation": "154.5", "time": "2013-09-20T12:52:59.698Z"}, {"lat": "44.123547", "lng": "9.708334", "elevation": "151.1999969482422", "time": "2013-09-20T12:53:08.497Z"}, {"lat": "44.123539", "lng": "9.70834", "elevation": "150.60000610351563", "time": "2013-09-20T12:53:09.504Z"}, {"lat": "44.123486", "lng": "9.708428", "elevation": "147.60000610351563", "time": "2013-09-20T12:53:17.492Z"}, {"lat": "44.123481", "lng": "9.708442", "elevation": "147.39999389648438", "time": "2013-09-20T12:53:18.495Z"}, {"lat": "44.123423", "lng": "9.708533", "elevation": "148.8000030517578", "time": "2013-09-20T12:53:28.646Z"}, {"lat": "44.12342", "lng": "9.708543", "elevation": "148.89999389648438", "time": "2013-09-20T12:53:29.629Z"}, {"lat": "44.123342", "lng": "9.708599", "elevation": "147.1999969482422", "time": "2013-09-20T12:53:39.554Z"}, {"lat": "44.123333", "lng": "9.708604", "elevation": "145.5", "time": "2013-09-20T12:53:40.655Z"}, {"lat": "44.123279", "lng": "9.708686", "elevation": "144.39999389648438", "time": "2013-09-20T12:53:48.492Z"}, {"lat": "44.123273", "lng": "9.708699", "elevation": "143.6999969482422", "time": "2013-09-20T12:53:49.500Z"}, {"lat": "44.123238", "lng": "9.708806", "elevation": "143.1999969482422", "time": "2013-09-20T12:53:57.495Z"}, {"lat": "44.123227", "lng": "9.708813", "elevation": "144.10000610351563", "time": "2013-09-20T12:53:58.668Z"}, {"lat": "44.123139", "lng": "9.708827", "elevation": "143.8000030517578", "time": "2013-09-20T12:54:07.671Z"}, {"lat": "44.123132", "lng": "9.708825", "elevation": "143.89999389648438", "time": "2013-09-20T12:54:08.594Z"}, {"lat": "44.12305", "lng": "9.708873", "elevation": "145.5", "time": "2013-09-20T12:54:19.653Z"}, {"lat": "44.123044", "lng": "9.708883", "elevation": "146.89999389648438", "time": "2013-09-20T12:54:20.530Z"}, {"lat": "44.123033", "lng": "9.709003", "elevation": "142.1999969482422", "time": "2013-09-20T12:54:27.547Z"}, {"lat": "44.123037", "lng": "9.709016", "elevation": "142.0", "time": "2013-09-20T12:54:28.661Z"}, {"lat": "44.123044", "lng": "9.709024", "elevation": "141.6999969482422", "time": "2013-09-20T12:54:33.566Z"}, {"lat": "44.123044", "lng": "9.709024", "elevation": "141.39999389648438", "time": "2013-09-20T12:54:34.573Z"}, {"lat": "44.123045", "lng": "9.709027", "elevation": "140.8000030517578", "time": "2013-09-20T12:54:37.499Z"}, {"lat": "44.123046", "lng": "9.709033", "elevation": "140.0", "time": "2013-09-20T12:54:38.502Z"}, {"lat": "44.123049", "lng": "9.709143", "elevation": "141.89999389648438", "time": "2013-09-20T12:54:45.501Z"}, {"lat": "44.123042", "lng": "9.70916", "elevation": "143.6999969482422", "time": "2013-09-20T12:54:46.499Z"}, {"lat": "44.122993", "lng": "9.709248", "elevation": "144.10000610351563", "time": "2013-09-20T12:54:52.577Z"}, {"lat": "44.122987", "lng": "9.709261", "elevation": "144.39999389648438", "time": "2013-09-20T12:54:53.616Z"}, {"lat": "44.12295", "lng": "9.709362", "elevation": "143.60000610351563", "time": "2013-09-20T12:55:04.674Z"}, {"lat": "44.122939", "lng": "9.70937", "elevation": "144.1999969482422", "time": "2013-09-20T12:55:05.669Z"}, {"lat": "44.122904", "lng": "9.709478", "elevation": "141.1999969482422", "time": "2013-09-20T12:55:11.596Z"}, {"lat": "44.122901", "lng": "9.709496", "elevation": "140.8000030517578", "time": "2013-09-20T12:55:12.702Z"}, {"lat": "44.122878", "lng": "9.709545", "elevation": "136.0", "time": "2013-09-20T12:55:20.525Z"}, {"lat": "44.122881", "lng": "9.709537", "elevation": "135.8000030517578", "time": "2013-09-20T12:55:21.639Z"}, {"lat": "44.122882", "lng": "9.709527", "elevation": "136.3000030517578", "time": "2013-09-20T12:55:22.615Z"}, {"lat": "44.122811", "lng": "9.709459", "elevation": "139.8000030517578", "time": "2013-09-20T12:55:30.609Z"}, {"lat": "44.122801", "lng": "9.709451", "elevation": "139.1999969482422", "time": "2013-09-20T12:55:31.549Z"}, {"lat": "44.122742", "lng": "9.709389", "elevation": "138.60000610351563", "time": "2013-09-20T12:55:47.577Z"}, {"lat": "44.122741", "lng": "9.70939", "elevation": "138.6999969482422", "time": "2013-09-20T12:55:48.739Z"}, {"lat": "44.122741", "lng": "9.70938", "elevation": "138.89999389648438", "time": "2013-09-20T12:55:53.713Z"}, {"lat": "44.122739", "lng": "9.709376", "elevation": "137.6999969482422", "time": "2013-09-20T12:55:54.606Z"}, {"lat": "44.122705", "lng": "9.709331", "elevation": "139.0", "time": "2013-09-20T12:56:03.557Z"}, {"lat": "44.122706", "lng": "9.709335", "elevation": "138.89999389648438", "time": "2013-09-20T12:56:04.738Z"}] diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/uk.lproj/InfoPlist.strings b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/uk.lproj/InfoPlist.strings new file mode 100755 index 0000000..477b28f --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/uk.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/vi.lproj/InfoPlist.strings b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/vi.lproj/InfoPlist.strings new file mode 100755 index 0000000..477b28f --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/vi.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/zh_CN.lproj/InfoPlist.strings b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/zh_CN.lproj/InfoPlist.strings new file mode 100755 index 0000000..477b28f --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/zh_CN.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/zh_TW.lproj/InfoPlist.strings b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/zh_TW.lproj/InfoPlist.strings new file mode 100755 index 0000000..477b28f --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/zh_TW.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/SDKDemoAPIKey.h b/Pods/GoogleMaps/Example/GoogleMapsDemos/SDKDemoAPIKey.h new file mode 100755 index 0000000..23ba5b0 --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/SDKDemoAPIKey.h @@ -0,0 +1,25 @@ +/* + * Copyright 2016 Google LLC. All rights reserved. + * + * + * 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. + */ + +/** + * To use GoogleMapsDemos, please register an API Key for your application and set it here. Your + * API Key should be kept private. + * + * See documentation on getting an API Key for your API Project here: + * https://developers.google.com/maps/documentation/ios/start#get-key + */ + +#error Register for API Key and insert here. Then delete this line. +static NSString *const kAPIKey = @""; diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/AnimatedCurrentLocationViewController.h b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/AnimatedCurrentLocationViewController.h new file mode 100755 index 0000000..6b7bd89 --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/AnimatedCurrentLocationViewController.h @@ -0,0 +1,23 @@ +/* + * Copyright 2016 Google LLC. All rights reserved. + * + * + * 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. + */ + +#import +#import + +#import + +@interface AnimatedCurrentLocationViewController : UIViewController + +@end diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/AnimatedCurrentLocationViewController.m b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/AnimatedCurrentLocationViewController.m new file mode 100755 index 0000000..306a8d1 --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/AnimatedCurrentLocationViewController.m @@ -0,0 +1,105 @@ +/* + * Copyright 2016 Google LLC. All rights reserved. + * + * + * 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. + */ + +#import "GoogleMapsDemos/Samples/AnimatedCurrentLocationViewController.h" + +@implementation AnimatedCurrentLocationViewController { + CLLocationManager *_manager; + GMSMapView *_mapView; + GMSMarker *_locationMarker; + +} + +- (void)viewDidLoad { + [super viewDidLoad]; + + GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:38.8879 + longitude:-77.0200 + zoom:17]; + _mapView = [GMSMapView mapWithFrame:CGRectZero camera:camera]; + _mapView.settings.myLocationButton = NO; + _mapView.settings.indoorPicker = NO; + + self.view = _mapView; + + // Setup location services + if (![CLLocationManager locationServicesEnabled]) { + NSLog(@"Please enable location services"); + return; + } + + if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusDenied) { + NSLog(@"Please authorize location services"); + return; + } + + _manager = [[CLLocationManager alloc] init]; + if ([_manager respondsToSelector:@selector(requestWhenInUseAuthorization)]) { + [_manager requestWhenInUseAuthorization]; + } + _manager.delegate = self; + _manager.desiredAccuracy = kCLLocationAccuracyBest; + _manager.distanceFilter = 5.0f; + [_manager startUpdatingLocation]; + +} + +#pragma mark - CLLocationManagerDelegate + +- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error { + if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusDenied) { + NSLog(@"Please authorize location services"); + return; + } + + NSLog(@"CLLocationManager error: %@", error.localizedFailureReason); + return; +} + +- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations { + CLLocation *location = [locations lastObject]; + + if (_locationMarker == nil) { + _locationMarker = [[GMSMarker alloc] init]; + _locationMarker.position = location.coordinate; + + // Animated walker images derived from an www.angryanimator.com tutorial. + // See: http://www.angryanimator.com/word/2010/11/26/tutorial-2-walk-cycle/ + + NSArray *frames = @[[UIImage imageNamed:@"step1"], + [UIImage imageNamed:@"step2"], + [UIImage imageNamed:@"step3"], + [UIImage imageNamed:@"step4"], + [UIImage imageNamed:@"step5"], + [UIImage imageNamed:@"step6"], + [UIImage imageNamed:@"step7"], + [UIImage imageNamed:@"step8"]]; + + _locationMarker.icon = [UIImage animatedImageWithImages:frames duration:0.8]; + _locationMarker.groundAnchor = CGPointMake(0.5f, 0.97f); // Taking into account walker's shadow + _locationMarker.map = _mapView; + } else { + [CATransaction begin]; + [CATransaction setAnimationDuration:2.0]; + _locationMarker.position = location.coordinate; + [CATransaction commit]; + } + + GMSCameraUpdate *move = [GMSCameraUpdate setTarget:location.coordinate zoom:17]; + [_mapView animateWithCameraUpdate:move]; +} + + +@end diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/AnimatedUIViewMarkerViewController.h b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/AnimatedUIViewMarkerViewController.h new file mode 100755 index 0000000..0dce9e8 --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/AnimatedUIViewMarkerViewController.h @@ -0,0 +1,20 @@ +/* + * Copyright 2016 Google LLC. All rights reserved. + * + * + * 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. + */ + +#import + +@interface AnimatedUIViewMarkerViewController : UIViewController + +@end diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/AnimatedUIViewMarkerViewController.m b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/AnimatedUIViewMarkerViewController.m new file mode 100755 index 0000000..7392b51 --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/AnimatedUIViewMarkerViewController.m @@ -0,0 +1,130 @@ +/* + * Copyright 2016 Google LLC. All rights reserved. + * + * + * 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. + */ + +#import "GoogleMapsDemos/Samples/AnimatedUIViewMarkerViewController.h" + +#import + +// Returns a random value from 0-1.0f. +static CGFloat randf() { return (((float)arc4random() / 0x100000000) * 1.0f); } + +@interface AnimatedUIViewMarkerViewController () +@end + +@implementation AnimatedUIViewMarkerViewController { + GMSMapView *_mapView; + UIView *_infoView; +} + +- (void)viewDidLoad { + [super viewDidLoad]; + GMSCameraPosition *camera = + [GMSCameraPosition cameraWithLatitude:-33.8683 longitude:151.2086 zoom:5]; + _mapView = [GMSMapView mapWithFrame:CGRectZero camera:camera]; + _mapView.delegate = self; + + self.view = _mapView; +} + +- (void)viewWillAppear:(BOOL)animated { + [super viewWillAppear:animated]; + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(applicationWillEnterForeground) + name:UIApplicationWillEnterForegroundNotification + object:nil]; + [_mapView clear]; + [self addDefaultMarker]; +} + +- (void)applicationWillEnterForeground { + [_mapView clear]; + [self addDefaultMarker]; +} + +- (void)viewWillDisappear:(BOOL)animated { + [super viewWillDisappear:animated]; + [[NSNotificationCenter defaultCenter] removeObserver:self]; +} + +- (UIView *)mapView:(GMSMapView *)mapView markerInfoContents:(GMSMarker *)marker { + // Show an info window with dynamic content - a simple background color animation. + _infoView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"arrow"]]; + UIView *infoView = _infoView; + marker.tracksInfoWindowChanges = YES; + UIColor *color = [UIColor colorWithHue:randf() saturation:1.f brightness:1.f alpha:1.0f]; + _infoView.backgroundColor = [UIColor clearColor]; + [UIView animateWithDuration:1.0 + delay:1.0 + options:UIViewAnimationOptionCurveLinear + animations:^{ + infoView.backgroundColor = color; + } + completion:^(BOOL finished) { + [UIView animateWithDuration:1.0 + delay:0.0 + options:UIViewAnimationOptionCurveLinear + animations:^{ + infoView.backgroundColor = [UIColor clearColor]; + } + completion:^(BOOL finished2) { + marker.tracksInfoWindowChanges = NO; + }]; + }]; + + return _infoView; +} + +- (void)mapView:(GMSMapView *)mapView didCloseInfoWindowOfMarker:(GMSMarker *)marker { + _infoView = nil; + marker.tracksInfoWindowChanges = NO; +} + +- (void)addDefaultMarker { + // Add a custom 'glow' marker with a pulsing blue shadow on Sydney. + GMSMarker *sydneyMarker = [[GMSMarker alloc] init]; + sydneyMarker.title = @"Sydney!"; + sydneyMarker.iconView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"glow-marker"]]; + sydneyMarker.position = CLLocationCoordinate2DMake(-33.8683, 151.2086); + sydneyMarker.iconView.contentMode = UIViewContentModeCenter; + CGRect oldBound = sydneyMarker.iconView.bounds; + CGRect bound = oldBound; + bound.size.width *= 2; + bound.size.height *= 2; + sydneyMarker.iconView.bounds = bound; + sydneyMarker.groundAnchor = CGPointMake(0.5, 0.75); + sydneyMarker.infoWindowAnchor = CGPointMake(0.5, 0.25); + UIView *sydneyGlow = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"glow-marker"]]; + sydneyGlow.layer.shadowColor = [UIColor blueColor].CGColor; + sydneyGlow.layer.shadowOffset = CGSizeZero; + sydneyGlow.layer.shadowRadius = 8.0; + sydneyGlow.layer.shadowOpacity = 1.0; + sydneyGlow.layer.opacity = 0.0; + [sydneyMarker.iconView addSubview:sydneyGlow]; + sydneyGlow.center = CGPointMake(oldBound.size.width, oldBound.size.height); + sydneyMarker.map = _mapView; + [UIView animateWithDuration:1.0 + delay:0.0 + options:UIViewAnimationOptionCurveEaseInOut | UIViewKeyframeAnimationOptionAutoreverse | + UIViewKeyframeAnimationOptionRepeat + animations:^{ + sydneyGlow.layer.opacity = 1.0; + } + completion:^(BOOL finished) { + // If the animation is ever terminated, no need to keep tracking the view for changes. + sydneyMarker.tracksViewChanges = NO; + }]; +} + +@end diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/BasicMapViewController.h b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/BasicMapViewController.h new file mode 100755 index 0000000..9edc891 --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/BasicMapViewController.h @@ -0,0 +1,22 @@ +/* + * Copyright 2016 Google LLC. All rights reserved. + * + * + * 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. + */ + +#import + +#import + +@interface BasicMapViewController : UIViewController + +@end diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/BasicMapViewController.m b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/BasicMapViewController.m new file mode 100755 index 0000000..558acce --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/BasicMapViewController.m @@ -0,0 +1,51 @@ +/* + * Copyright 2016 Google LLC. All rights reserved. + * + * + * 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. + */ + +#import "GoogleMapsDemos/Samples/BasicMapViewController.h" + +@implementation BasicMapViewController { + UILabel *_statusLabel; +} + +- (void)viewDidLoad { + [super viewDidLoad]; + GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:-33.868 + longitude:151.2086 + zoom:6]; + GMSMapView *view = [GMSMapView mapWithFrame:CGRectZero camera:camera]; + view.delegate = self; + self.view = view; + + // Add status label, initially hidden. + _statusLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 0, 30)]; + _statusLabel.alpha = 0.0f; + _statusLabel.autoresizingMask = UIViewAutoresizingFlexibleWidth; + _statusLabel.backgroundColor = [UIColor blueColor]; + _statusLabel.textColor = [UIColor whiteColor]; + _statusLabel.textAlignment = NSTextAlignmentCenter; + + [view addSubview:_statusLabel]; +} + +- (void)mapViewDidStartTileRendering:(GMSMapView *)mapView { + _statusLabel.alpha = 0.8f; + _statusLabel.text = @"Rendering"; +} + +- (void)mapViewDidFinishTileRendering:(GMSMapView *)mapView { + _statusLabel.alpha = 0.0f; +} + +@end diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/CameraViewController.h b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/CameraViewController.h new file mode 100755 index 0000000..b8f9b1a --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/CameraViewController.h @@ -0,0 +1,20 @@ +/* + * Copyright 2016 Google LLC. All rights reserved. + * + * + * 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. + */ + +#import + +@interface CameraViewController : UIViewController + +@end diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/CameraViewController.m b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/CameraViewController.m new file mode 100755 index 0000000..a2dc629 --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/CameraViewController.m @@ -0,0 +1,72 @@ +/* + * Copyright 2016 Google LLC. All rights reserved. + * + * + * 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. + */ + +#import "GoogleMapsDemos/Samples/CameraViewController.h" + +#import + +@implementation CameraViewController { + GMSMapView *_mapView; + NSTimer *timer; +} + +- (void)viewDidLoad { + [super viewDidLoad]; + GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:-37.809487 + longitude:144.965699 + zoom:20 + bearing:0 + viewingAngle:0]; + _mapView = [GMSMapView mapWithFrame:CGRectZero camera:camera]; + _mapView.settings.zoomGestures = NO; + _mapView.settings.scrollGestures = NO; + _mapView.settings.rotateGestures = NO; + _mapView.settings.tiltGestures = NO; + + self.view = _mapView; +} + +- (void)moveCamera { + GMSCameraPosition *camera = _mapView.camera; + float zoom = fmaxf(camera.zoom - 0.1f, 17.5f); + + GMSCameraPosition *newCamera = + [[GMSCameraPosition alloc] initWithTarget:camera.target + zoom:zoom + bearing:camera.bearing + 10 + viewingAngle:camera.viewingAngle + 10]; + [_mapView animateToCameraPosition:newCamera]; +} + +- (void)viewDidAppear:(BOOL)animated { + [super viewDidAppear:animated]; + timer = [NSTimer scheduledTimerWithTimeInterval:1.f/30.f + target:self + selector:@selector(moveCamera) + userInfo:nil + repeats:YES]; +} + +- (void)viewDidDisappear:(BOOL)animated { + [super viewDidDisappear:animated]; + [timer invalidate]; +} + +- (void)didReceiveMemoryWarning { + [super didReceiveMemoryWarning]; + [timer invalidate]; +} + +@end diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/CustomIndoorViewController.h b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/CustomIndoorViewController.h new file mode 100755 index 0000000..c546d30 --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/CustomIndoorViewController.h @@ -0,0 +1,19 @@ +/* + * Copyright 2016 Google LLC. All rights reserved. + * + * + * 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. + */ + +#import + +@interface CustomIndoorViewController : UIViewController +@end diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/CustomIndoorViewController.m b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/CustomIndoorViewController.m new file mode 100755 index 0000000..f5b50c2 --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/CustomIndoorViewController.m @@ -0,0 +1,150 @@ +/* + * Copyright 2016 Google LLC. All rights reserved. + * + * + * 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. + */ + +#import "GoogleMapsDemos/Samples/CustomIndoorViewController.h" + +#import + +@interface CustomIndoorViewController () < + GMSIndoorDisplayDelegate, + UIPickerViewDelegate, + UIPickerViewDataSource> + +@end + +@implementation CustomIndoorViewController { + GMSMapView *_mapView; + UIPickerView *_levelPickerView; + NSArray *_levels; +} + +- (void)viewDidLoad { + [super viewDidLoad]; + GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:37.78318 + longitude:-122.403874 + zoom:18]; + + // set backgroundColor, otherwise UIPickerView fades into the background + self.view.backgroundColor = [UIColor grayColor]; + + _mapView = [GMSMapView mapWithFrame:CGRectZero camera:camera]; + _mapView.settings.myLocationButton = NO; + _mapView.settings.indoorPicker = NO; // We are implementing a custom level picker. + + _mapView.indoorEnabled = YES; // Defaults to YES. Set to NO to hide indoor maps. + _mapView.indoorDisplay.delegate = self; + _mapView.translatesAutoresizingMaskIntoConstraints = NO; + [self.view addSubview:_mapView]; + + // This UIPickerView will be populated with the levels of the active building. + _levelPickerView = [[UIPickerView alloc] init]; + _levelPickerView.delegate = self; + _levelPickerView.dataSource = self; + _levelPickerView.showsSelectionIndicator = YES; + _levelPickerView.translatesAutoresizingMaskIntoConstraints = NO; + [self.view addSubview:_levelPickerView]; + + // The height of the UIPickerView, used below in the vertical constraint + NSDictionary *metrics = @{@"height": @180.0}; + NSDictionary *views = NSDictionaryOfVariableBindings(_mapView, _levelPickerView); + + // Constraining the map to the full width of the display. + // The |_levelPickerView| is constrained below with the NSLayoutFormatAlignAll* + // See http://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/AutolayoutPG/Articles/formatLanguage.html + [self.view addConstraints:[NSLayoutConstraint + constraintsWithVisualFormat:@"|[_mapView]|" + options:0 + metrics:metrics + views:views]]; + + // Constraining the _mapView and the _levelPickerView as siblings taking + // the full height of the display, with _levelPickerView at 200 points high + [self.view addConstraints:[NSLayoutConstraint + constraintsWithVisualFormat:@"V:|[_mapView][_levelPickerView(height)]|" + options:NSLayoutFormatAlignAllLeft|NSLayoutFormatAlignAllRight + metrics:metrics + views:views]]; +} + +#pragma mark - GMSIndoorDisplayDelegate + +- (void)didChangeActiveBuilding:(GMSIndoorBuilding *)building { + // Everytime we change active building force the picker to re-display the labels. + + NSMutableArray *levels = [NSMutableArray array]; + if (building.underground) { + // If this building is completely underground, add a fake 'top' floor. This must be the 'boxed' + // nil, [NSNull null], as NSArray/NSMutableArray cannot contain nils. + [levels addObject:[NSNull null]]; + } + [levels addObjectsFromArray:building.levels]; + _levels = [levels copy]; + + [_levelPickerView reloadAllComponents]; + [_levelPickerView selectRow:-1 inComponent:0 animated:NO]; + + // UIPickerView insists on having some data; disable interaction if there's no levels. + _levelPickerView.userInteractionEnabled = (_levels.count > 0); +} + +- (void)didChangeActiveLevel:(GMSIndoorLevel *)level { + // On level change, sync our level picker's selection to the IndoorDisplay. + if (level == nil) { + level = (id)[NSNull null]; // box nil to NSNull for use in NSArray + } + NSUInteger index = [_levels indexOfObject:level]; + if (index != NSNotFound) { + NSInteger currentlySelectedLevel = [_levelPickerView selectedRowInComponent:0]; + if ((NSInteger)index != currentlySelectedLevel) { + [_levelPickerView selectRow:index inComponent:0 animated:NO]; + } + } +} + +#pragma mark - UIPickerViewDelegate + +- (void)pickerView:(UIPickerView *)pickerView + didSelectRow:(NSInteger)row + inComponent:(NSInteger)component { + // On user selection of a level in the picker, set the right level in IndoorDisplay + id level = _levels[row]; + if (level == [NSNull null]) { + level = nil; // unbox NSNull + } + [_mapView.indoorDisplay setActiveLevel:level]; +} + +- (NSString *)pickerView:(UIPickerView *)pickerView + titleForRow:(NSInteger)row + forComponent:(NSInteger)component { + id object = _levels[row]; + if (object == [NSNull null]) { + return @"\u2014"; // use an em dash for 'above ground' + } + GMSIndoorLevel *level = object; + return level.name; +} + +#pragma mark - UIPickerViewDataSource + +- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView { + return 1; +} + +- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component { + return _levels.count; +} + +@end diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/CustomMarkersViewController.h b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/CustomMarkersViewController.h new file mode 100755 index 0000000..c63fd37 --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/CustomMarkersViewController.h @@ -0,0 +1,20 @@ +/* + * Copyright 2016 Google LLC. All rights reserved. + * + * + * 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. + */ + +#import + +@interface CustomMarkersViewController : UIViewController + +@end diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/CustomMarkersViewController.m b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/CustomMarkersViewController.m new file mode 100755 index 0000000..cd0c5f4 --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/CustomMarkersViewController.m @@ -0,0 +1,120 @@ +/* + * Copyright 2016 Google LLC. All rights reserved. + * + * + * 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. + */ + +#import "GoogleMapsDemos/Samples/CustomMarkersViewController.h" + +#import + +static int kMarkerCount = 0; + +// Returns a random value from 0-1.0f. +static CGFloat randf() { + return (((float)arc4random() / 0x100000000) * 1.0f); +} + +@implementation CustomMarkersViewController { + GMSMapView *_mapView; +} + +- (void)viewDidLoad { + [super viewDidLoad]; + GMSCameraPosition *camera = + [GMSCameraPosition cameraWithLatitude:-37.81969 longitude:144.966085 zoom:4]; + _mapView = [GMSMapView mapWithFrame:CGRectZero camera:camera]; + [self addDefaultMarkers]; + + // Add a button which adds random markers to the map. + UIBarButtonItem *addButton = + [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd + target:self + action:@selector(didTapAdd)]; + addButton.accessibilityLabel = @"Add Markers"; + UIBarButtonItem *clearButton = [[UIBarButtonItem alloc] initWithTitle:@"Clear Markers" + style:UIBarButtonItemStylePlain + target:self + action:@selector(didTapClear)]; + self.navigationItem.rightBarButtonItems = @[ addButton, clearButton ]; + + self.view = _mapView; +} + +- (void)addDefaultMarkers { + // Add a custom 'glow' marker around Sydney. + GMSMarker *sydneyMarker = [[GMSMarker alloc] init]; + sydneyMarker.title = @"Sydney!"; + sydneyMarker.icon = [UIImage imageNamed:@"glow-marker"]; + sydneyMarker.position = CLLocationCoordinate2DMake(-33.8683, 151.2086); + sydneyMarker.map = _mapView; + + // Add a custom 'arrow' marker pointing to Melbourne. + GMSMarker *melbourneMarker = [[GMSMarker alloc] init]; + melbourneMarker.title = @"Melbourne!"; + melbourneMarker.icon = [UIImage imageNamed:@"arrow"]; + melbourneMarker.position = CLLocationCoordinate2DMake(-37.81969, 144.966085); + melbourneMarker.map = _mapView; +} + +- (void)didTapAdd { + for (int i = 0; i < 10; ++i) { + // Add a marker every 0.25 seconds for the next ten markers, randomly + // within the bounds of the camera as it is at that point. + double delayInSeconds = (i * 0.25); + dispatch_time_t popTime = + dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC)); + __weak __typeof__(self) weakSelf = self; + dispatch_after(popTime, dispatch_get_main_queue(), ^(void) { + __typeof__(self) strongSelf = weakSelf; + if (strongSelf) { + GMSVisibleRegion region = [strongSelf->_mapView.projection visibleRegion]; + GMSCoordinateBounds *bounds = [[GMSCoordinateBounds alloc] initWithRegion:region]; + [strongSelf addMarkerInBounds:bounds]; + } + }); + } +} + +- (void)addMarkerInBounds:(GMSCoordinateBounds *)bounds { + CLLocationDegrees latitude = + bounds.southWest.latitude + randf() * (bounds.northEast.latitude - bounds.southWest.latitude); + + // If the visible region crosses the antimeridian (the right-most point is + // "smaller" than the left-most point), adjust the longitude accordingly. + BOOL offset = (bounds.northEast.longitude < bounds.southWest.longitude); + CLLocationDegrees longitude = + bounds.southWest.longitude + + randf() * (bounds.northEast.longitude - bounds.southWest.longitude + (offset ? 360 : 0)); + if (longitude > 180.f) { + longitude -= 360.f; + } + + UIColor *color = [UIColor colorWithHue:randf() saturation:1.f brightness:1.f alpha:1.0f]; + + CLLocationCoordinate2D position = CLLocationCoordinate2DMake(latitude, longitude); + GMSMarker *marker = [GMSMarker markerWithPosition:position]; + marker.title = [NSString stringWithFormat:@"Marker #%d", ++kMarkerCount]; + marker.appearAnimation = kGMSMarkerAnimationPop; + marker.icon = [GMSMarker markerImageWithColor:color]; + + marker.rotation = (randf() - 0.5f) * 20; // rotate between -10 and +10 degrees + + marker.map = _mapView; +} + +- (void)didTapClear { + [_mapView clear]; + [self addDefaultMarkers]; +} + +@end diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/DoubleMapViewController.h b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/DoubleMapViewController.h new file mode 100755 index 0000000..d612fbf --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/DoubleMapViewController.h @@ -0,0 +1,20 @@ +/* + * Copyright 2016 Google LLC. All rights reserved. + * + * + * 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. + */ + +#import + +@interface DoubleMapViewController : UIViewController + +@end diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/DoubleMapViewController.m b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/DoubleMapViewController.m new file mode 100755 index 0000000..8fb1f25 --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/DoubleMapViewController.m @@ -0,0 +1,77 @@ +/* + * Copyright 2016 Google LLC. All rights reserved. + * + * + * 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. + */ + +#import "GoogleMapsDemos/Samples/DoubleMapViewController.h" + +#import + +@interface DoubleMapViewController () +@end + +@implementation DoubleMapViewController { + GMSMapView *_mapView; + GMSMapView *_boundMapView; +} + ++ (GMSCameraPosition *)defaultCamera { + return [GMSCameraPosition cameraWithLatitude:37.7847 + longitude:-122.41 + zoom:5]; +} + +- (void)viewDidLoad { + [super viewDidLoad]; + + // Two map views, second one has its camera target controlled by the first. + CGRect frame = self.view.bounds; + frame.size.height = frame.size.height / 2; + _mapView = [GMSMapView mapWithFrame:frame camera:[DoubleMapViewController defaultCamera]]; + _mapView.autoresizingMask = UIViewAutoresizingFlexibleWidth | + UIViewAutoresizingFlexibleHeight | + UIViewAutoresizingFlexibleBottomMargin; + + _mapView.delegate = self; + [self.view addSubview:_mapView]; + + frame = self.view.bounds; + frame.size.height = frame.size.height / 2; + frame.origin.y = frame.size.height; + _boundMapView = + [GMSMapView mapWithFrame:frame camera:[DoubleMapViewController defaultCamera]]; + _boundMapView.autoresizingMask = UIViewAutoresizingFlexibleWidth | + UIViewAutoresizingFlexibleHeight | + UIViewAutoresizingFlexibleTopMargin; + _boundMapView.settings.scrollGestures = NO; + + [self.view addSubview:_boundMapView]; +} + +- (void)viewWillTransitionToSize:(CGSize)size + withTransitionCoordinator:(id)coordinator { + [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator]; + CGRect frame = self.view.bounds; + frame.size.height = frame.size.height / 2; + _mapView.frame = frame; +} + +- (void)mapView:(GMSMapView *)mapView didChangeCameraPosition:(GMSCameraPosition *)position { + GMSCameraPosition *previousCamera = _boundMapView.camera; + _boundMapView.camera = [GMSCameraPosition cameraWithTarget:position.target + zoom:previousCamera.zoom + bearing:previousCamera.bearing + viewingAngle:previousCamera.viewingAngle]; +} + +@end diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/FitBoundsViewController.h b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/FitBoundsViewController.h new file mode 100755 index 0000000..b38b0f5 --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/FitBoundsViewController.h @@ -0,0 +1,20 @@ +/* + * Copyright 2016 Google LLC. All rights reserved. + * + * + * 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. + */ + +#import + +@interface FitBoundsViewController : UIViewController + +@end diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/FitBoundsViewController.m b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/FitBoundsViewController.m new file mode 100755 index 0000000..b0b4f28 --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/FitBoundsViewController.m @@ -0,0 +1,91 @@ +/* + * Copyright 2016 Google LLC. All rights reserved. + * + * + * 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. + */ + +#import "GoogleMapsDemos/Samples/FitBoundsViewController.h" + +#import + +@interface FitBoundsViewController () +@end + +@implementation FitBoundsViewController { + GMSMapView *_mapView; + NSMutableArray *_markers; +} + +- (void)viewDidLoad { + [super viewDidLoad]; + GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:-37.81969 + longitude:144.966085 + zoom:4]; + _mapView = [GMSMapView mapWithFrame:CGRectZero camera:camera]; + _mapView.delegate = self; + self.view = _mapView; + + // Add a default marker around Sydney. + GMSMarker *sydneyMarker = [[GMSMarker alloc] init]; + sydneyMarker.title = @"Sydney!"; + sydneyMarker.icon = [UIImage imageNamed:@"glow-marker"]; + sydneyMarker.position = CLLocationCoordinate2DMake(-33.8683, 151.2086); + sydneyMarker.map = _mapView; + + GMSMarker *anotherSydneyMarker = [[GMSMarker alloc] init]; + anotherSydneyMarker.title = @"Sydney 2!"; + anotherSydneyMarker.icon = [UIImage imageNamed:@"glow-marker"]; + anotherSydneyMarker.position = CLLocationCoordinate2DMake(-33.8683, 149.2086); + anotherSydneyMarker.map = _mapView; + + // Create a list of markers, adding the Sydney marker. + _markers = [NSMutableArray arrayWithObject:sydneyMarker]; + [_markers addObject:anotherSydneyMarker]; + + // Create a button that, when pressed, updates the camera to fit the bounds + // of the specified markers. + UIBarButtonItem *fitBoundsButton = + [[UIBarButtonItem alloc] initWithTitle:@"Fit Bounds" + style:UIBarButtonItemStylePlain + target:self + action:@selector(didTapFitBounds)]; + self.navigationItem.rightBarButtonItem = fitBoundsButton; +} + +- (void)didTapFitBounds { + if (_markers.count == 0) return; + CLLocationCoordinate2D firstPos = ((GMSMarker *)_markers.firstObject).position; + GMSCoordinateBounds *bounds = + [[GMSCoordinateBounds alloc] initWithCoordinate:firstPos coordinate:firstPos]; + for (GMSMarker *marker in _markers) { + bounds = [bounds includingCoordinate:marker.position]; + } + GMSCameraUpdate *update = [GMSCameraUpdate fitBounds:bounds withPadding:50.0f]; + [_mapView moveCamera:update]; +} + +#pragma mark - GMSMapViewDelegate + +- (void)mapView:(GMSMapView *)mapView + didLongPressAtCoordinate:(CLLocationCoordinate2D)coordinate { + GMSMarker *marker = [[GMSMarker alloc] init]; + marker.title = [NSString stringWithFormat:@"Marker at: %.2f,%.2f", + coordinate.latitude, coordinate.longitude]; + marker.position = coordinate; + marker.appearAnimation = kGMSMarkerAnimationPop; + marker.map = _mapView; + + // Add the new marker to the list of markers. + [_markers addObject:marker]; +} + +@end diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/FixedPanoramaViewController.h b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/FixedPanoramaViewController.h new file mode 100755 index 0000000..900b02e --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/FixedPanoramaViewController.h @@ -0,0 +1,20 @@ +/* + * Copyright 2016 Google LLC. All rights reserved. + * + * + * 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. + */ + +#import + +@interface FixedPanoramaViewController : UIViewController + +@end diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/FixedPanoramaViewController.m b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/FixedPanoramaViewController.m new file mode 100755 index 0000000..7074a93 --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/FixedPanoramaViewController.m @@ -0,0 +1,44 @@ +/* + * Copyright 2016 Google LLC. All rights reserved. + * + * + * 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. + */ + +#import "GoogleMapsDemos/Samples/FixedPanoramaViewController.h" + +#import + +static CLLocationCoordinate2D kPanoramaNear = {-33.732022, 150.312114}; + +@interface FixedPanoramaViewController () +@end + +@implementation FixedPanoramaViewController { + GMSPanoramaView *_view; +} + +- (void)viewDidLoad { + [super viewDidLoad]; + + _view = [GMSPanoramaView panoramaWithFrame:CGRectZero + nearCoordinate:kPanoramaNear]; + _view.camera = [GMSPanoramaCamera cameraWithHeading:180 + pitch:-10 + zoom:0]; + _view.delegate = self; + _view.orientationGestures = NO; + _view.navigationGestures = NO; + _view.navigationLinksHidden = YES; + self.view = _view; +} + +@end diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/FrameRateViewController.h b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/FrameRateViewController.h new file mode 100755 index 0000000..940dbb0 --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/FrameRateViewController.h @@ -0,0 +1,20 @@ +/* + * Copyright 2016 Google LLC. All rights reserved. + * + * + * 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. + */ + +#import + +@interface FrameRateViewController : UIViewController + +@end diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/FrameRateViewController.m b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/FrameRateViewController.m new file mode 100755 index 0000000..3367fe8 --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/FrameRateViewController.m @@ -0,0 +1,88 @@ +/* + * Copyright 2016 Google LLC. All rights reserved. + * + * + * 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. + */ + +#import "GoogleMapsDemos/Samples/FrameRateViewController.h" + +#import + +@interface FrameRateViewController () + +@end + +@implementation FrameRateViewController { + GMSMapView *_mapView; + UITextView *_statusTextView; +} + +- (void)viewDidLoad { + [super viewDidLoad]; + GMSCameraPosition *camera = + [GMSCameraPosition cameraWithLatitude:-33.868 longitude:151.2086 zoom:6]; + _mapView = [GMSMapView mapWithFrame:CGRectZero camera:camera]; + self.view = _mapView; + + // Add a display for the current frame rate mode. + _statusTextView = [[UITextView alloc] init]; + _statusTextView.frame = CGRectMake(0, 0, CGRectGetWidth(self.view.frame), 0); + _statusTextView.text = @""; + _statusTextView.textAlignment = NSTextAlignmentCenter; + _statusTextView.backgroundColor = [UIColor colorWithWhite:1.0 alpha:0.8f]; + _statusTextView.autoresizingMask = UIViewAutoresizingFlexibleWidth; + _statusTextView.editable = NO; + [self.view addSubview:_statusTextView]; + [_statusTextView sizeToFit]; + + // Add a button toggling through modes. + self.navigationItem.rightBarButtonItem = + [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemPlay + target:self + action:@selector(didTapNext)]; + [self updateStatus]; +} + +- (void)didTapNext { + _mapView.preferredFrameRate = [self nextFrameRate]; + [self updateStatus]; +} + ++ (NSString *)nameForFrameRate:(GMSFrameRate)frameRate { + switch (frameRate) { + case kGMSFrameRatePowerSave: + return @"PowerSave"; + case kGMSFrameRateConservative: + return @"Conservative"; + case kGMSFrameRateMaximum: + return @"Maximum"; + } +} + +- (GMSFrameRate)nextFrameRate { + switch (_mapView.preferredFrameRate) { + case kGMSFrameRatePowerSave: + return kGMSFrameRateConservative; + case kGMSFrameRateConservative: + return kGMSFrameRateMaximum; + case kGMSFrameRateMaximum: + return kGMSFrameRatePowerSave; + } +} + +- (void)updateStatus { + _statusTextView.text = + [NSString stringWithFormat:@"Preferred frame rate: %@", + [[self class] nameForFrameRate:_mapView.preferredFrameRate]]; +} + +@end diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/GeocoderViewController.h b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/GeocoderViewController.h new file mode 100755 index 0000000..6fec749 --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/GeocoderViewController.h @@ -0,0 +1,22 @@ +/* + * Copyright 2016 Google LLC. All rights reserved. + * + * + * 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. + */ + +#import + +#import + +@interface GeocoderViewController : UIViewController + +@end diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/GeocoderViewController.m b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/GeocoderViewController.m new file mode 100755 index 0000000..62b5930 --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/GeocoderViewController.m @@ -0,0 +1,71 @@ +/* + * Copyright 2016 Google LLC. All rights reserved. + * + * + * 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. + */ + +#import "GoogleMapsDemos/Samples/GeocoderViewController.h" + +#import + +@implementation GeocoderViewController { + GMSMapView *_mapView; + GMSGeocoder *_geocoder; +} + +- (void)viewDidLoad { + [super viewDidLoad]; + GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:-33.868 + longitude:151.2086 + zoom:12]; + + _mapView = [GMSMapView mapWithFrame:CGRectZero camera:camera]; + _mapView.delegate = self; + + _geocoder = [[GMSGeocoder alloc] init]; + + self.view = _mapView; +} + +- (void)mapView:(GMSMapView *)mapView didLongPressAtCoordinate:(CLLocationCoordinate2D)coordinate { + // On a long press, reverse geocode this location. + __weak __typeof__(self) weakSelf = self; + GMSReverseGeocodeCallback handler = ^(GMSReverseGeocodeResponse *response, NSError *error) { + [weakSelf handleResponse:response coordinate:coordinate error:error]; + }; + [_geocoder reverseGeocodeCoordinate:coordinate completionHandler:handler]; +} + +- (void)handleResponse:(nullable GMSReverseGeocodeResponse *)response + coordinate:(CLLocationCoordinate2D)coordinate + error:(nullable NSError *)error { + GMSAddress *address = response.firstResult; + if (address) { + NSLog(@"Geocoder result: %@", address); + + GMSMarker *marker = [GMSMarker markerWithPosition:address.coordinate]; + NSArray *lines = [address lines]; + + marker.title = [lines firstObject]; + if (lines.count > 1) { + marker.snippet = [lines objectAtIndex:1]; + } + + marker.appearAnimation = kGMSMarkerAnimationPop; + marker.map = _mapView; + } else { + NSLog(@"Could not reverse geocode point (%f,%f): %@", coordinate.latitude, coordinate.longitude, + error); + } +} + +@end diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/GestureControlViewController.h b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/GestureControlViewController.h new file mode 100755 index 0000000..f103e5d --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/GestureControlViewController.h @@ -0,0 +1,20 @@ +/* + * Copyright 2016 Google LLC. All rights reserved. + * + * + * 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. + */ + +#import + +@interface GestureControlViewController : UIViewController + +@end diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/GestureControlViewController.m b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/GestureControlViewController.m new file mode 100755 index 0000000..1935c25 --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/GestureControlViewController.m @@ -0,0 +1,70 @@ +/* + * Copyright 2016 Google LLC. All rights reserved. + * + * + * 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. + */ + +#import "GoogleMapsDemos/Samples/GestureControlViewController.h" + +#import + +@implementation GestureControlViewController { + GMSMapView *_mapView; + UISwitch *_zoomSwitch; +} + +- (void)viewDidLoad { + [super viewDidLoad]; + GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:-25.5605 + longitude:133.605097 + zoom:3]; + + _mapView = [GMSMapView mapWithFrame:CGRectZero camera:camera]; + _mapView.autoresizingMask = + UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; + + self.view = [[UIView alloc] initWithFrame:CGRectZero]; + [self.view addSubview:_mapView]; + + UIView *holder = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, 59)]; + holder.autoresizingMask = + UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleBottomMargin; + holder.backgroundColor = [UIColor colorWithRed:1.0 green:1.0 blue:1.0 alpha:0.8f]; + [self.view addSubview:holder]; + + // Zoom label. + UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(16, 16, 200, 29)]; + label.text = @"Zooming?"; + label.font = [UIFont boldSystemFontOfSize:18.0f]; + label.textAlignment = NSTextAlignmentLeft; + label.backgroundColor = [UIColor clearColor]; + label.layer.shadowColor = [[UIColor whiteColor] CGColor]; + label.layer.shadowOffset = CGSizeMake(0.0f, 1.0f); + label.layer.shadowOpacity = 1.0f; + label.layer.shadowRadius = 0.0f; + [holder addSubview:label]; + + // Control zooming. + _zoomSwitch = [[UISwitch alloc] initWithFrame:CGRectMake(-90, 16, 0, 0)]; + _zoomSwitch.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin; + [_zoomSwitch addTarget:self + action:@selector(didChangeZoomSwitch) + forControlEvents:UIControlEventValueChanged]; + _zoomSwitch.on = YES; + [holder addSubview:_zoomSwitch]; +} + +- (void)didChangeZoomSwitch { + _mapView.settings.zoomGestures = _zoomSwitch.isOn; +} + +@end diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/GradientPolylinesViewController.h b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/GradientPolylinesViewController.h new file mode 100755 index 0000000..3142b72 --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/GradientPolylinesViewController.h @@ -0,0 +1,20 @@ +/* + * Copyright 2016 Google LLC. All rights reserved. + * + * + * 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. + */ + +#import + +@interface GradientPolylinesViewController : UIViewController + +@end diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/GradientPolylinesViewController.m b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/GradientPolylinesViewController.m new file mode 100755 index 0000000..60f875e --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/GradientPolylinesViewController.m @@ -0,0 +1,87 @@ +/* + * Copyright 2016 Google LLC. All rights reserved. + * + * + * 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. + */ + +#import "GoogleMapsDemos/Samples/GradientPolylinesViewController.h" + +#import + +@implementation GradientPolylinesViewController { + GMSMapView *_mapView; + GMSPolyline *_polyline; + NSMutableArray *_trackData; +} + +- (void)viewDidLoad { + [super viewDidLoad]; + GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:44.1314 + longitude:9.6921 + zoom:14.059f + bearing:328.f + viewingAngle:40.f]; + _mapView = [GMSMapView mapWithFrame:CGRectZero camera:camera]; + self.view = _mapView; + + [self parseTrackFile]; + [_polyline setSpans:[self gradientSpans]]; +} + +- (NSArray *)gradientSpans { + NSMutableArray *colorSpans = [NSMutableArray array]; + NSUInteger count = _trackData.count; + UIColor *prevColor; + for (NSUInteger i = 0; i < count; i++) { + NSDictionary *dict = [_trackData objectAtIndex:i]; + double elevation = [[dict objectForKey:@"elevation"] doubleValue]; + + UIColor *toColor = [UIColor colorWithHue:(float)elevation/700 + saturation:1.f + brightness:.9f + alpha:1.f]; + + if (prevColor == nil) { + prevColor = toColor; + } + + GMSStrokeStyle *style = [GMSStrokeStyle gradientFromColor:prevColor toColor:toColor]; + [colorSpans addObject:[GMSStyleSpan spanWithStyle:style]]; + + prevColor = toColor; + } + return colorSpans; +} + +- (void)parseTrackFile { + NSString *filePath = [[NSBundle mainBundle] pathForResource:@"track" ofType:@"json"]; + NSData *data = [NSData dataWithContentsOfFile:filePath]; + NSArray *json = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil]; + _trackData = [[NSMutableArray alloc] init]; + GMSMutablePath *path = [GMSMutablePath path]; + + for (NSUInteger i = 0; i < json.count; i++) { + NSDictionary *info = [json objectAtIndex:i]; + NSNumber *elevation = [info objectForKey:@"elevation"]; + CLLocationDegrees lat = [[info objectForKey:@"lat"] doubleValue]; + CLLocationDegrees lng = [[info objectForKey:@"lng"] doubleValue]; + CLLocation *loc = [[CLLocation alloc] initWithLatitude:lat longitude:lng]; + [_trackData addObject:@{@"loc": loc, @"elevation": elevation}]; + [path addLatitude:lat longitude:lng]; + } + + _polyline = [GMSPolyline polylineWithPath:path]; + _polyline.strokeWidth = 6; + _polyline.map = _mapView; +} + +@end diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/GroundOverlayViewController.h b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/GroundOverlayViewController.h new file mode 100755 index 0000000..e220bf4 --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/GroundOverlayViewController.h @@ -0,0 +1,20 @@ +/* + * Copyright 2016 Google LLC. All rights reserved. + * + * + * 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. + */ + +#import + +@interface GroundOverlayViewController : UIViewController + +@end diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/GroundOverlayViewController.m b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/GroundOverlayViewController.m new file mode 100755 index 0000000..1341bf6 --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/GroundOverlayViewController.m @@ -0,0 +1,60 @@ +/* + * Copyright 2016 Google LLC. All rights reserved. + * + * + * 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. + */ + +#import "GoogleMapsDemos/Samples/GroundOverlayViewController.h" + +#import + +@interface GroundOverlayViewController () +@end + +@implementation GroundOverlayViewController + +- (void)viewDidLoad { + [super viewDidLoad]; + + CLLocationCoordinate2D southWest = CLLocationCoordinate2DMake(40.712216, -74.22655); + CLLocationCoordinate2D northEast = CLLocationCoordinate2DMake(40.773941, -74.12544); + + GMSCoordinateBounds *overlayBounds = [[GMSCoordinateBounds alloc] initWithCoordinate:southWest + coordinate:northEast]; + + // Choose the midpoint of the coordinate to focus the camera on. + CLLocationCoordinate2D newark = GMSGeometryInterpolate(southWest, northEast, 0.5); + GMSCameraPosition *camera = [GMSCameraPosition cameraWithTarget:newark + zoom:12 + bearing:0 + viewingAngle:45]; + GMSMapView *mapView = [GMSMapView mapWithFrame:CGRectZero camera:camera]; + mapView.delegate = self; + + // Add the ground overlay, centered in Newark, NJ + GMSGroundOverlay *groundOverlay = [[GMSGroundOverlay alloc] init]; + // Image from http://www.lib.utexas.edu/maps/historical/newark_nj_1922.jpg + groundOverlay.icon = [UIImage imageNamed:@"newark_nj_1922.jpg"]; + groundOverlay.tappable = YES; + groundOverlay.position = newark; + groundOverlay.bounds = overlayBounds; + groundOverlay.map = mapView; + + self.view = mapView; +} + +- (void)mapView:(GMSMapView *)mapView didTapOverlay:(GMSOverlay *)overlay { + float opacity = (((float)arc4random()/0x100000000)*0.5f + 0.5f); + ((GMSGroundOverlay *)overlay).opacity = opacity; +} + +@end diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/IndoorMuseumNavigationViewController.h b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/IndoorMuseumNavigationViewController.h new file mode 100755 index 0000000..722f6ea --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/IndoorMuseumNavigationViewController.h @@ -0,0 +1,24 @@ +/* + * Copyright 2016 Google LLC. All rights reserved. + * + * + * 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. + */ + +#import + +#import + +@interface IndoorMuseumNavigationViewController : UIViewController< + GMSMapViewDelegate, + GMSIndoorDisplayDelegate> + +@end diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/IndoorMuseumNavigationViewController.m b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/IndoorMuseumNavigationViewController.m new file mode 100755 index 0000000..efe13cf --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/IndoorMuseumNavigationViewController.m @@ -0,0 +1,126 @@ +/* + * Copyright 2016 Google LLC. All rights reserved. + * + * + * 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. + */ + +#import "GoogleMapsDemos/Samples/IndoorMuseumNavigationViewController.h" + +@implementation IndoorMuseumNavigationViewController { + GMSMapView *_mapView; + NSArray *_exhibits; // Array of JSON exhibit data. + NSDictionary *_exhibit; // The currently selected exhibit. Will be nil initially. + GMSMarker *_marker; + NSDictionary *_levels; // The levels dictionary is updated when a new building is selected, and + // contains mapping from localized level name to GMSIndoorLevel. +} + +- (void)viewDidLoad { + [super viewDidLoad]; + + GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:38.8879 + longitude:-77.0200 + zoom:17]; + _mapView = [GMSMapView mapWithFrame:CGRectZero camera:camera]; + _mapView.settings.myLocationButton = NO; + _mapView.settings.indoorPicker = NO; + _mapView.delegate = self; + _mapView.indoorDisplay.delegate = self; + + self.view = _mapView; + + // Load the exhibits configuration from JSON + NSString *jsonPath = [[NSBundle mainBundle] pathForResource:@"museum-exhibits" ofType:@"json"]; + NSData *data = [NSData dataWithContentsOfFile:jsonPath]; + _exhibits = [NSJSONSerialization JSONObjectWithData:data + options:kNilOptions + error:nil]; + + + UISegmentedControl *segmentedControl = [[UISegmentedControl alloc] init]; + [segmentedControl setTintColor:[UIColor colorWithRed:0.373f green:0.667f blue:0.882f alpha:1.0f]]; + + segmentedControl.translatesAutoresizingMaskIntoConstraints = NO; + [segmentedControl addTarget:self + action:@selector(exhibitSelected:) + forControlEvents:UIControlEventValueChanged]; + [self.view addSubview:segmentedControl]; + + for (NSDictionary *exhibit in _exhibits) { + [segmentedControl insertSegmentWithImage:[UIImage imageNamed:exhibit[@"key"]] + atIndex:[_exhibits indexOfObject:exhibit] + animated:NO]; + } + + NSDictionary *views = NSDictionaryOfVariableBindings(segmentedControl); + + [self.view addConstraints:[NSLayoutConstraint + constraintsWithVisualFormat:@"[segmentedControl]-|" + options:kNilOptions + metrics:nil + views:views]]; + [self.view addConstraints:[NSLayoutConstraint + constraintsWithVisualFormat:@"V:[segmentedControl]-|" + options:kNilOptions + metrics:nil + views:views]]; + +} + +- (void)moveMarker { + CLLocationCoordinate2D loc = CLLocationCoordinate2DMake([_exhibit[@"lat"] doubleValue], + [_exhibit[@"lng"] doubleValue]); + if (_marker == nil) { + _marker = [GMSMarker markerWithPosition:loc]; + _marker.map = _mapView; + } else { + _marker.position = loc; + } + _marker.title = _exhibit[@"name"]; + [_mapView animateToLocation:loc]; + [_mapView animateToZoom:19]; +} + +- (void)exhibitSelected:(UISegmentedControl *)segmentedControl { + _exhibit = _exhibits[[segmentedControl selectedSegmentIndex]]; + [self moveMarker]; +} + +#pragma mark - GMSMapViewDelegate + +- (void)mapView:(GMSMapView *)mapView idleAtCameraPosition:(GMSCameraPosition *)camera { + if (_exhibit != nil) { + CLLocationCoordinate2D loc = CLLocationCoordinate2DMake([_exhibit[@"lat"] doubleValue], + [_exhibit[@"lng"] doubleValue]); + if ([_mapView.projection containsCoordinate:loc] && _levels != nil) { + [mapView.indoorDisplay setActiveLevel:_levels[_exhibit[@"level"]]]; + } + } +} + +#pragma mark - GMSIndoorDisplayDelegate + +- (void)didChangeActiveBuilding:(GMSIndoorBuilding *)building { + if (building != nil) { + NSMutableDictionary *levels = [NSMutableDictionary dictionary]; + + for (GMSIndoorLevel *level in building.levels) { + [levels setObject:level forKey:level.shortName]; + } + + _levels = [NSDictionary dictionaryWithDictionary:levels]; + } else { + _levels = nil; + } +} + +@end diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/IndoorViewController.h b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/IndoorViewController.h new file mode 100755 index 0000000..d4f5a67 --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/IndoorViewController.h @@ -0,0 +1,20 @@ +/* + * Copyright 2016 Google LLC. All rights reserved. + * + * + * 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. + */ + +#import + +@interface IndoorViewController : UIViewController + +@end diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/IndoorViewController.m b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/IndoorViewController.m new file mode 100755 index 0000000..b97770d --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/IndoorViewController.m @@ -0,0 +1,94 @@ +/* + * Copyright 2016 Google LLC. All rights reserved. + * + * + * 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. + */ + +#import "GoogleMapsDemos/Samples/IndoorViewController.h" + +#import + +static NSString *const kNormalType = @"Normal"; +static NSString *const kRetroType = @"Retro"; +static NSString *const kGrayscaleType = @"Grayscale"; +static NSString *const kNightType = @"Night"; + +@interface IndoorViewController () +@end + +@implementation IndoorViewController { + GMSMapView *_mapView; + UIBarButtonItem *_barButtonItem; + GMSMapStyle *_retroStyle; + GMSMapStyle *_grayscaleStyle; + GMSMapStyle *_nightStyle; +} + +- (void)viewDidLoad { + [super viewDidLoad]; + + NSURL *retroURL = [[NSBundle mainBundle] URLForResource:@"mapstyle-retro" withExtension:@"json"]; + _retroStyle = [GMSMapStyle styleWithContentsOfFileURL:retroURL error:NULL]; + + NSURL *grayscaleURL = [[NSBundle mainBundle] URLForResource:@"mapstyle-silver" + withExtension:@"json"]; + _grayscaleStyle = [GMSMapStyle styleWithContentsOfFileURL:grayscaleURL error:NULL]; + + NSURL *nightURL = [[NSBundle mainBundle] URLForResource:@"mapstyle-night" withExtension:@"json"]; + _nightStyle = [GMSMapStyle styleWithContentsOfFileURL:nightURL error:NULL]; + + GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:37.78318 + longitude:-122.403874 + zoom:18]; + + _mapView = [GMSMapView mapWithFrame:CGRectZero camera:camera]; + _mapView.settings.myLocationButton = YES; + + UIBarButtonItem *styleButton = [[UIBarButtonItem alloc] initWithTitle:@"Style" + style:UIBarButtonItemStylePlain + target:self + action:@selector(changeMapStyle:)]; + self.navigationItem.rightBarButtonItem = styleButton; + + self.view = _mapView; +} + +- (UIAlertAction *_Nonnull)actionWithTitle:(nonnull NSString *)title + style:(nullable GMSMapStyle *)style { + __weak __typeof__(self) weakSelf = self; + return [UIAlertAction actionWithTitle:title + style:UIAlertActionStyleDefault + handler:^(UIAlertAction *_Nonnull action) { + __strong __typeof__(self) strongSelf = weakSelf; + if (strongSelf) { + strongSelf->_mapView.mapStyle = style; + } + }]; +} + +- (void)changeMapStyle:(UIBarButtonItem *)sender { + UIAlertController *alert = + [UIAlertController alertControllerWithTitle:@"Select map style" + message:nil + preferredStyle:UIAlertControllerStyleActionSheet]; + [alert addAction:[self actionWithTitle:kRetroType style:_retroStyle]]; + [alert addAction:[self actionWithTitle:kGrayscaleType style:_grayscaleStyle]]; + [alert addAction:[self actionWithTitle:kNightType style:_nightStyle]]; + [alert addAction:[self actionWithTitle:kNormalType style:nil]]; + [alert addAction:[UIAlertAction actionWithTitle:@"Cancel" + style:UIAlertActionStyleCancel + handler:nil]]; + alert.popoverPresentationController.barButtonItem = sender; + [self presentViewController:alert animated:YES completion:nil]; +} + +@end diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MapLayerViewController.h b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MapLayerViewController.h new file mode 100755 index 0000000..f2f9f6e --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MapLayerViewController.h @@ -0,0 +1,20 @@ +/* + * Copyright 2016 Google LLC. All rights reserved. + * + * + * 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. + */ + +#import + +@interface MapLayerViewController : UIViewController + +@end diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MapLayerViewController.m b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MapLayerViewController.m new file mode 100755 index 0000000..974a41c --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MapLayerViewController.m @@ -0,0 +1,91 @@ +/* + * Copyright 2016 Google LLC. All rights reserved. + * + * + * 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. + */ + +#import "GoogleMapsDemos/Samples/MapLayerViewController.h" + +#import + +@implementation MapLayerViewController { + GMSMapView *_mapView; +} + +- (void)viewDidLoad { + [super viewDidLoad]; + GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:-37.81969 + longitude:144.966085 + zoom:4]; + _mapView = [GMSMapView mapWithFrame:CGRectZero camera:camera]; + self.view = _mapView; + + GMSMapView *mapView = _mapView; + dispatch_async(dispatch_get_main_queue(), ^{ + mapView.myLocationEnabled = YES; + }); + + UIBarButtonItem *myLocationButton = + [[UIBarButtonItem alloc] initWithTitle:@"Fly to My Location" + style:UIBarButtonItemStylePlain + target:self + action:@selector(didTapMyLocation)]; + self.navigationItem.rightBarButtonItem = myLocationButton; + +} + +- (void)didTapMyLocation { + CLLocation *location = _mapView.myLocation; + if (!location || !CLLocationCoordinate2DIsValid(location.coordinate)) { + return; + } + + _mapView.layer.cameraLatitude = location.coordinate.latitude; + _mapView.layer.cameraLongitude = location.coordinate.longitude; + _mapView.layer.cameraBearing = 0.0; + + // Access the GMSMapLayer directly to modify the following properties with a + // specified timing function and duration. + + CAMediaTimingFunction *curve = + [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; + CABasicAnimation *animation; + + animation = [CABasicAnimation animationWithKeyPath:kGMSLayerCameraLatitudeKey]; + animation.duration = 2.0f; + animation.timingFunction = curve; + animation.toValue = @(location.coordinate.latitude); + [_mapView.layer addAnimation:animation forKey:kGMSLayerCameraLatitudeKey]; + + animation = [CABasicAnimation animationWithKeyPath:kGMSLayerCameraLongitudeKey]; + animation.duration = 2.0f; + animation.timingFunction = curve; + animation.toValue = @(location.coordinate.longitude); + [_mapView.layer addAnimation:animation forKey:kGMSLayerCameraLongitudeKey]; + + animation = [CABasicAnimation animationWithKeyPath:kGMSLayerCameraBearingKey]; + animation.duration = 2.0f; + animation.timingFunction = curve; + animation.toValue = @0.0; + [_mapView.layer addAnimation:animation forKey:kGMSLayerCameraBearingKey]; + + // Fly out to the minimum zoom and then zoom back to the current zoom! + CGFloat zoom = _mapView.camera.zoom; + NSArray *keyValues = @[@(zoom), @(kGMSMinZoomLevel), @(zoom)]; + CAKeyframeAnimation *keyFrameAnimation = + [CAKeyframeAnimation animationWithKeyPath:kGMSLayerCameraZoomLevelKey]; + keyFrameAnimation.duration = 2.0f; + keyFrameAnimation.values = keyValues; + [_mapView.layer addAnimation:keyFrameAnimation forKey:kGMSLayerCameraZoomLevelKey]; +} + +@end diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MapTypesViewController.h b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MapTypesViewController.h new file mode 100755 index 0000000..c879adc --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MapTypesViewController.h @@ -0,0 +1,20 @@ +/* + * Copyright 2016 Google LLC. All rights reserved. + * + * + * 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. + */ + +#import + +@interface MapTypesViewController : UIViewController + +@end diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MapTypesViewController.m b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MapTypesViewController.m new file mode 100755 index 0000000..3bbd853 --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MapTypesViewController.m @@ -0,0 +1,71 @@ +/* + * Copyright 2016 Google LLC. All rights reserved. + * + * + * 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. + */ + +#import "GoogleMapsDemos/Samples/MapTypesViewController.h" + +#import + +static NSString const * kNormalType = @"Normal"; +static NSString const * kSatelliteType = @"Satellite"; +static NSString const * kHybridType = @"Hybrid"; +static NSString const * kTerrainType = @"Terrain"; + +@implementation MapTypesViewController { + UISegmentedControl *_switcher; + GMSMapView *_mapView; +} + +- (void)viewDidLoad { + [super viewDidLoad]; + + GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:-33.868 + longitude:151.2086 + zoom:12]; + + _mapView = [GMSMapView mapWithFrame:CGRectZero camera:camera]; + self.view = _mapView; + + // The possible different types to show. + NSArray *types = @[kNormalType, kSatelliteType, kHybridType, kTerrainType]; + + // Create a UISegmentedControl that is the navigationItem's titleView. + _switcher = [[UISegmentedControl alloc] initWithItems:types]; + _switcher.autoresizingMask = UIViewAutoresizingFlexibleBottomMargin | + UIViewAutoresizingFlexibleWidth | + UIViewAutoresizingFlexibleBottomMargin; + _switcher.selectedSegmentIndex = 0; + self.navigationItem.titleView = _switcher; + + // Listen to touch events on the UISegmentedControl. + [_switcher addTarget:self action:@selector(didChangeSwitcher) + forControlEvents:UIControlEventValueChanged]; +} + +- (void)didChangeSwitcher { + // Switch to the type clicked on. + NSString *title = + [_switcher titleForSegmentAtIndex:_switcher.selectedSegmentIndex]; + if ([kNormalType isEqualToString:title]) { + _mapView.mapType = kGMSTypeNormal; + } else if ([kSatelliteType isEqualToString:title]) { + _mapView.mapType = kGMSTypeSatellite; + } else if ([kHybridType isEqualToString:title]) { + _mapView.mapType = kGMSTypeHybrid; + } else if ([kTerrainType isEqualToString:title]) { + _mapView.mapType = kGMSTypeTerrain; + } +} + +@end diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MapZoomViewController.h b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MapZoomViewController.h new file mode 100755 index 0000000..dadb9a1 --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MapZoomViewController.h @@ -0,0 +1,20 @@ +/* + * Copyright 2016 Google LLC. All rights reserved. + * + * + * 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. + */ + +#import + +@interface MapZoomViewController : UIViewController + +@end diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MapZoomViewController.m b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MapZoomViewController.m new file mode 100755 index 0000000..4657d2f --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MapZoomViewController.m @@ -0,0 +1,85 @@ +/* + * Copyright 2016 Google LLC. All rights reserved. + * + * + * 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. + */ + +#import "GoogleMapsDemos/Samples/MapZoomViewController.h" + +#import + +@implementation MapZoomViewController { + GMSMapView *_mapView; + UITextView *_zoomRangeView; + NSUInteger _nextMode; +} + +- (void)viewDidLoad { + [super viewDidLoad]; + GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:-33.868 + longitude:151.2086 + zoom:6]; + _mapView = [GMSMapView mapWithFrame:CGRectZero camera:camera]; + _mapView.settings.scrollGestures = NO; + self.view = _mapView; + + // Add a display for the current zoom range restriction. + _zoomRangeView = [[UITextView alloc] init]; + _zoomRangeView.frame = + CGRectMake(0, 0, CGRectGetWidth(self.view.frame), 0); + _zoomRangeView.text = @""; + _zoomRangeView.textAlignment = NSTextAlignmentCenter; + _zoomRangeView.backgroundColor = [UIColor colorWithWhite:1.0 alpha:0.8f]; + _zoomRangeView.autoresizingMask = UIViewAutoresizingFlexibleWidth; + _zoomRangeView.editable = NO; + [self.view addSubview:_zoomRangeView]; + [_zoomRangeView sizeToFit]; + [self didTapNext]; + + // Add a button toggling through modes. + self.navigationItem.rightBarButtonItem = + [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemPlay + target:self + action:@selector(didTapNext)]; +} + +- (void)didTapNext { + NSString *label = @""; + float minZoom = kGMSMinZoomLevel; + float maxZoom = kGMSMaxZoomLevel; + + switch (_nextMode) { + case 0: + label = @"Default"; + break; + case 1: + minZoom = 18; + label = @"Zoomed in"; + break; + case 2: + maxZoom = 8; + label = @"Zoomed out"; + break; + case 3: + minZoom = 10; + maxZoom = 11.5; + label = @"Small range"; + break; + } + _nextMode = (_nextMode + 1) % 4; + + [_mapView setMinZoom:minZoom maxZoom:maxZoom]; + _zoomRangeView.text = + [NSString stringWithFormat:@"%@ (%.2f - %.2f)", label, _mapView.minZoom, _mapView.maxZoom]; +} + +@end diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MarkerEventsViewController.h b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MarkerEventsViewController.h new file mode 100755 index 0000000..86ed130 --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MarkerEventsViewController.h @@ -0,0 +1,22 @@ +/* + * Copyright 2016 Google LLC. All rights reserved. + * + * + * 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. + */ + +#import + +#import + +@interface MarkerEventsViewController : UIViewController + +@end diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MarkerEventsViewController.m b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MarkerEventsViewController.m new file mode 100755 index 0000000..31a304f --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MarkerEventsViewController.m @@ -0,0 +1,81 @@ +/* + * Copyright 2016 Google LLC. All rights reserved. + * + * + * 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. + */ + +#import "GoogleMapsDemos/Samples/MarkerEventsViewController.h" + +#import + +#import + +@implementation MarkerEventsViewController { + GMSMapView *_mapView; + GMSMarker *_melbourneMarker; +} + +- (void)viewDidLoad { + [super viewDidLoad]; + GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:-37.81969 + longitude:144.966085 + zoom:4]; + _mapView = [GMSMapView mapWithFrame:CGRectZero camera:camera]; + + GMSMarker *sydneyMarker = [[GMSMarker alloc] init]; + sydneyMarker.position = CLLocationCoordinate2DMake(-33.8683, 151.2086); + sydneyMarker.map = _mapView; + + _melbourneMarker = [[GMSMarker alloc] init]; + _melbourneMarker.position = CLLocationCoordinate2DMake(-37.81969, 144.966085); + _melbourneMarker.map = _mapView; + + _mapView.delegate = self; + self.view = _mapView; +} + +#pragma mark - GMSMapViewDelegate + +- (UIView *)mapView:(GMSMapView *)mapView markerInfoWindow:(GMSMarker *)marker { + if (marker == _melbourneMarker) { + return [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Icon"]]; + } + + return nil; +} + +- (BOOL)mapView:(GMSMapView *)mapView didTapMarker:(GMSMarker *)marker { + // Animate to the marker + [CATransaction begin]; + [CATransaction setAnimationDuration:3.f]; // 3 second animation + + GMSCameraPosition *camera = + [[GMSCameraPosition alloc] initWithTarget:marker.position + zoom:8 + bearing:50 + viewingAngle:60]; + [mapView animateToCameraPosition:camera]; + [CATransaction commit]; + + // Melbourne marker has a InfoWindow so return NO to allow markerInfoWindow to + // fire. Also check that the marker isn't already selected so that the + // InfoWindow doesn't close. + if (marker == _melbourneMarker && + mapView.selectedMarker != _melbourneMarker) { + return NO; + } + + // The Tap has been handled so return YES + return YES; +} + +@end diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MarkerInfoWindowViewController.h b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MarkerInfoWindowViewController.h new file mode 100755 index 0000000..299a9a2 --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MarkerInfoWindowViewController.h @@ -0,0 +1,20 @@ +/* + * Copyright 2016 Google LLC. All rights reserved. + * + * + * 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. + */ + +#import + +@interface MarkerInfoWindowViewController : UIViewController + +@end diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MarkerInfoWindowViewController.m b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MarkerInfoWindowViewController.m new file mode 100755 index 0000000..14cc07a --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MarkerInfoWindowViewController.m @@ -0,0 +1,97 @@ +/* + * Copyright 2016 Google LLC. All rights reserved. + * + * + * 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. + */ + +#import "GoogleMapsDemos/Samples/MarkerInfoWindowViewController.h" + +#import "GoogleMapsDemos/UIViewController+GMSToastMessages.h" +#import + +@interface MarkerInfoWindowViewController () +@end + +@implementation MarkerInfoWindowViewController { + GMSMarker *_sydneyMarker; + GMSMarker *_melbourneMarker; + GMSMarker *_brisbaneMarker; + UIView *_contentView; +} + +- (void)viewDidLoad { + [super viewDidLoad]; + GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:-37.81969 + longitude:144.966085 + zoom:4]; + GMSMapView *mapView = [GMSMapView mapWithFrame:CGRectZero camera:camera]; + + + _sydneyMarker = [[GMSMarker alloc] init]; + _sydneyMarker.title = @"Sydney"; + _sydneyMarker.snippet = @"Population: 4,605,992"; + _sydneyMarker.position = CLLocationCoordinate2DMake(-33.8683, 151.2086); + _sydneyMarker.map = mapView; + NSLog(@"sydneyMarker: %@", _sydneyMarker); + + + _melbourneMarker.map = nil; + _melbourneMarker = [[GMSMarker alloc] init]; + _melbourneMarker.title = @"Melbourne"; + _melbourneMarker.snippet = @"Population: 4,169,103"; + _melbourneMarker.position = CLLocationCoordinate2DMake(-37.81969, 144.966085); + _melbourneMarker.map = mapView; + NSLog(@"melbourneMarker: %@", _melbourneMarker); + + _brisbaneMarker.map = nil; + _brisbaneMarker = [[GMSMarker alloc] init]; + _brisbaneMarker.title = @"Brisbane"; + _brisbaneMarker.snippet = @"Population: 2,189,878"; + _brisbaneMarker.position = CLLocationCoordinate2DMake(-27.4710107, 153.0234489); + _brisbaneMarker.map = mapView; + NSLog(@"brisbaneMarker: %@", _brisbaneMarker); + + _contentView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"aeroplane"]]; + + mapView.delegate = self; + self.view = mapView; +} + +#pragma mark GMSMapViewDelegate + +- (UIView *)mapView:(GMSMapView *)mapView markerInfoWindow:(GMSMarker *)marker { + if (marker == _sydneyMarker) { + return _contentView; + } + return nil; +} + +- (UIView *)mapView:(GMSMapView *)mapView markerInfoContents:(GMSMarker *)marker { + if (marker == _brisbaneMarker) { + return _contentView; + } + return nil; +} + +- (void)mapView:(GMSMapView *)mapView didCloseInfoWindowOfMarker:(GMSMarker *)marker { + NSString *message = + [NSString stringWithFormat:@"Info window for marker %@ closed.", marker.title]; + [self gms_showToastWithMessage:message]; +} + +- (void)mapView:(GMSMapView *)mapView didLongPressInfoWindowOfMarker:(GMSMarker *)marker { + NSString *message = + [NSString stringWithFormat:@"Info window for marker %@ long pressed.", marker.title]; + [self gms_showToastWithMessage:message]; +} + +@end diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MarkerLayerViewController.h b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MarkerLayerViewController.h new file mode 100755 index 0000000..25b8088 --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MarkerLayerViewController.h @@ -0,0 +1,22 @@ +/* + * Copyright 2016 Google LLC. All rights reserved. + * + * + * 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. + */ + +#import + +#import + +@interface MarkerLayerViewController : UIViewController + +@end diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MarkerLayerViewController.m b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MarkerLayerViewController.m new file mode 100755 index 0000000..39faf67 --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MarkerLayerViewController.m @@ -0,0 +1,148 @@ +/* + * Copyright 2016 Google LLC. All rights reserved. + * + * + * 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. + */ + +#import "GoogleMapsDemos/Samples/MarkerLayerViewController.h" + +#import + +@interface CoordsList : NSObject +@property(nonatomic, readonly, copy) GMSPath *path; +@property(nonatomic, readonly) NSUInteger target; + +- (id)initWithPath:(GMSPath *)path; + +- (CLLocationCoordinate2D)next; + +@end + +@implementation CoordsList + +- (id)initWithPath:(GMSPath *)path { + if ((self = [super init])) { + _path = [path copy]; + _target = 0; + } + return self; +} + +- (CLLocationCoordinate2D)next { + ++_target; + if (_target == _path.count) { + _target = 0; + } + return [_path coordinateAtIndex:_target]; +} + +@end + +@implementation MarkerLayerViewController { + GMSMapView *_mapView; + GMSMarker *_fadedMarker; +} + +- (void)viewDidLoad { + [super viewDidLoad]; + _mapView = [[GMSMapView alloc] init]; + _mapView.camera = [GMSCameraPosition cameraWithLatitude:50.6042 longitude:3.9599 zoom:5]; + _mapView.delegate = self; + self.view = _mapView; + + GMSMutablePath *coords; + GMSMarker *marker; + + // Create a plane that flies to several airports around western Europe. + coords = [GMSMutablePath path]; + [coords addLatitude:52.310683 longitude:4.765121]; + [coords addLatitude:51.471386 longitude:-0.457148]; + [coords addLatitude:49.01378 longitude:2.5542943]; + [coords addLatitude:50.036194 longitude:8.554519]; + marker = [GMSMarker markerWithPosition:[coords coordinateAtIndex:0]]; + marker.icon = [UIImage imageNamed:@"aeroplane"]; + marker.groundAnchor = CGPointMake(0.5f, 0.5f); + marker.flat = YES; + marker.map = _mapView; + marker.userData = [[CoordsList alloc] initWithPath:coords]; + [self animateToNextCoord:marker]; + + // Create a boat that moves around the Baltic Sea. + coords = [GMSMutablePath path]; + [coords addLatitude:57.598335 longitude:11.290512]; + [coords addLatitude:55.665193 longitude:10.741196]; + [coords addLatitude:55.065787 longitude:11.083488]; + [coords addLatitude:54.699234 longitude:10.863762]; + [coords addLatitude:54.482805 longitude:12.061272]; + [coords addLatitude:55.819802 longitude:16.148186]; // final point + [coords addLatitude:54.927142 longitude:16.455803]; // final point + [coords addLatitude:54.482805 longitude:12.061272]; // and back again + [coords addLatitude:54.699234 longitude:10.863762]; + [coords addLatitude:55.065787 longitude:11.083488]; + [coords addLatitude:55.665193 longitude:10.741196]; + marker = [GMSMarker markerWithPosition:[coords coordinateAtIndex:0]]; + marker.icon = [UIImage imageNamed:@"boat"]; + marker.map = _mapView; + marker.userData = [[CoordsList alloc] initWithPath:coords]; + [self animateToNextCoord:marker]; +} + +- (void)animateToNextCoord:(GMSMarker *)marker { + CoordsList *coords = marker.userData; + CLLocationCoordinate2D coord = [coords next]; + CLLocationCoordinate2D previous = marker.position; + + CLLocationDirection heading = GMSGeometryHeading(previous, coord); + CLLocationDistance distance = GMSGeometryDistance(previous, coord); + + // Use CATransaction to set a custom duration for this animation. By default, changes to the + // position are already animated, but with a very short default duration. When the animation is + // complete, trigger another animation step. + + [CATransaction begin]; + [CATransaction setAnimationDuration:(distance / (50 * 1000))]; // custom duration, 50km/sec + + __weak MarkerLayerViewController *weakSelf = self; + [CATransaction setCompletionBlock:^{ + [weakSelf animateToNextCoord:marker]; + }]; + + marker.position = coord; + + [CATransaction commit]; + + // If this marker is flat, implicitly trigger a change in rotation, which will finish quickly. + if (marker.flat) { + marker.rotation = heading; + } +} + +- (void)fadeMarker:(GMSMarker *)marker { + _fadedMarker.opacity = 1.0f; // reset previous faded marker + + // Fade this new marker. + _fadedMarker = marker; + _fadedMarker.opacity = 0.5f; +} + +#pragma mark - GMSMapViewDelegate + +- (BOOL)mapView:(GMSMapView *)mapView didTapMarker:(GMSMarker *)marker { + [self fadeMarker:marker]; + return YES; +} + +- (void)mapView:(GMSMapView *)mapView didTapAtCoordinate:(CLLocationCoordinate2D)coordinate { + [self fadeMarker:nil]; +} + +@end diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MarkersViewController.h b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MarkersViewController.h new file mode 100755 index 0000000..3cce920 --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MarkersViewController.h @@ -0,0 +1,20 @@ +/* + * Copyright 2016 Google LLC. All rights reserved. + * + * + * 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. + */ + +#import + +@interface MarkersViewController : UIViewController + +@end diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MarkersViewController.m b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MarkersViewController.m new file mode 100755 index 0000000..ef19c48 --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MarkersViewController.m @@ -0,0 +1,74 @@ +/* + * Copyright 2016 Google LLC. All rights reserved. + * + * + * 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. + */ + +#import "GoogleMapsDemos/Samples/MarkersViewController.h" + +#import + +@implementation MarkersViewController { + GMSMarker *_sydneyMarker; + GMSMarker *_melbourneMarker; +} + +- (void)viewDidLoad { + [super viewDidLoad]; + GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:-37.81969 + longitude:144.966085 + zoom:4]; + GMSMapView *mapView = [GMSMapView mapWithFrame:CGRectZero camera:camera]; + + _sydneyMarker = [[GMSMarker alloc] init]; + _sydneyMarker.title = @"Sydney"; + _sydneyMarker.snippet = @"Population: 4,605,992"; + _sydneyMarker.position = CLLocationCoordinate2DMake(-33.8683, 151.2086); + _sydneyMarker.flat = NO; + _sydneyMarker.rotation = 30.0; + NSLog(@"sydneyMarker: %@", _sydneyMarker); + + GMSMarker *australiaMarker = [[GMSMarker alloc] init]; + australiaMarker.title = @"Australia"; + australiaMarker.position = CLLocationCoordinate2DMake(-27.994401,140.07019); + australiaMarker.appearAnimation = kGMSMarkerAnimationPop; + australiaMarker.flat = YES; + australiaMarker.draggable = YES; + australiaMarker.groundAnchor = CGPointMake(0.5, 0.5); + australiaMarker.icon = [UIImage imageNamed:@"australia"]; + australiaMarker.map = mapView; + + // Set the marker in Sydney to be selected + mapView.selectedMarker = _sydneyMarker; + + self.view = mapView; + self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(didTapAdd)]; +} + +- (void)didTapAdd { + if (_sydneyMarker.map == nil) { + _sydneyMarker.map = (GMSMapView *)self.view; +// _sydneyMarker.rotation += 45.0; + } else { + _sydneyMarker.map = nil; + } + + _melbourneMarker.map = nil; + _melbourneMarker = [[GMSMarker alloc] init]; + _melbourneMarker.title = @"Melbourne"; + _melbourneMarker.snippet = @"Population: 4,169,103"; + _melbourneMarker.position = CLLocationCoordinate2DMake(-37.81969, 144.966085); + _melbourneMarker.map = (GMSMapView *)self.view; +} + + +@end diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MyLocationViewController.h b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MyLocationViewController.h new file mode 100755 index 0000000..4a6a2c2 --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MyLocationViewController.h @@ -0,0 +1,22 @@ +/* + * Copyright 2016 Google LLC. All rights reserved. + * + * + * 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. + */ + +#import + +#import + +@interface MyLocationViewController : UIViewController + +@end diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MyLocationViewController.m b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MyLocationViewController.m new file mode 100755 index 0000000..ae45e2d --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MyLocationViewController.m @@ -0,0 +1,88 @@ +/* + * Copyright 2016 Google LLC. All rights reserved. + * + * + * 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. + */ + +#import "GoogleMapsDemos/Samples/MyLocationViewController.h" + +#import + +@implementation MyLocationViewController { + GMSMapView *_mapView; + BOOL _firstLocationUpdate; +} + +- (void)viewDidLoad { + [super viewDidLoad]; + GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:-33.868 + longitude:151.2086 + zoom:12]; + + _mapView = [GMSMapView mapWithFrame:CGRectZero camera:camera]; + _mapView.delegate = self; + _mapView.settings.compassButton = YES; + _mapView.settings.myLocationButton = YES; + + // Listen to the myLocation property of GMSMapView. + [_mapView addObserver:self + forKeyPath:@"myLocation" + options:NSKeyValueObservingOptionNew + context:NULL]; + + self.view = _mapView; + + // Ask for My Location data after the map has already been added to the UI. + GMSMapView *mapView = _mapView; + dispatch_async(dispatch_get_main_queue(), ^{ + mapView.myLocationEnabled = YES; + }); +} + +- (void)mapView:(GMSMapView *)mapView didTapMyLocation:(CLLocationCoordinate2D)location { + NSString *message = [NSString stringWithFormat:@"My Location Dot Tapped at: [lat: %f, lng: %f]", + location.latitude, location.longitude]; + UIAlertController *alertController = + [UIAlertController alertControllerWithTitle:@"Location Tapped" + message:message + preferredStyle:UIAlertControllerStyleAlert]; + UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"OK" + style:UIAlertActionStyleDefault + handler:^(UIAlertAction *action){ + }]; + [alertController addAction:okAction]; + [self presentViewController:alertController animated:YES completion:nil]; +} + +- (void)dealloc { + [_mapView removeObserver:self + forKeyPath:@"myLocation" + context:NULL]; +} + +#pragma mark - KVO updates + +- (void)observeValueForKeyPath:(NSString *)keyPath + ofObject:(id)object + change:(NSDictionary *)change + context:(void *)context { + if (!_firstLocationUpdate) { + // If the first location update has not yet been received, then jump to that + // location. + _firstLocationUpdate = YES; + CLLocation *location = [change objectForKey:NSKeyValueChangeNewKey]; + _mapView.camera = [GMSCameraPosition cameraWithTarget:location.coordinate + zoom:14]; + } +} + +@end diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/PaddingBehaviorViewController.h b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/PaddingBehaviorViewController.h new file mode 100755 index 0000000..0b62aad --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/PaddingBehaviorViewController.h @@ -0,0 +1,20 @@ +/* + * Copyright 2017 Google LLC. All rights reserved. + * + * + * 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. + */ + +#import + +@interface PaddingBehaviorViewController : UIViewController + +@end diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/PaddingBehaviorViewController.m b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/PaddingBehaviorViewController.m new file mode 100755 index 0000000..41f2c0e --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/PaddingBehaviorViewController.m @@ -0,0 +1,142 @@ +/* + * Copyright 2017 Google LLC. All rights reserved. + * + * + * 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. + */ + +#import "GoogleMapsDemos/Samples/PaddingBehaviorViewController.h" + +#import + +static CLLocationCoordinate2D kPanoramaNear = {40.761388, -73.978133}; + +@interface PaddingBehaviorViewController () +@end + +@implementation PaddingBehaviorViewController { + GMSMapView *_mapView; + GMSPanoramaView *_panoramaView; + + UILabel *_statusLabel; + UIButton *_changeBehaviorButton; + UIButton *_toggleFrameButton; + UIBarButtonItem *_toggleViewButton; + + BOOL _hasShrunk; +} + +- (void)viewDidLoad { + [super viewDidLoad]; + GMSCameraPosition *camera = + [GMSCameraPosition cameraWithLatitude:-33.868 longitude:151.2086 zoom:6]; + _mapView = [GMSMapView mapWithFrame:self.view.bounds camera:camera]; + _mapView.padding = UIEdgeInsetsMake(0, 20, 40, 60); + _mapView.delegate = self; + _mapView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; + [self.view addSubview:_mapView]; + + // Add status label. + _statusLabel = [[UILabel alloc] initWithFrame:CGRectMake(30, 0, 0, 30)]; + _statusLabel.textColor = [UIColor brownColor]; + _statusLabel.textAlignment = NSTextAlignmentLeft; + _statusLabel.text = @"Behavior: Always"; + [_statusLabel sizeToFit]; + + // Add behavior modifier button. + _changeBehaviorButton = [UIButton buttonWithType:UIButtonTypeSystem]; + _changeBehaviorButton.frame = CGRectMake(30, 30, 0, 0); + [_changeBehaviorButton setTitle:@"Next Behavior" forState:UIControlStateNormal]; + [_changeBehaviorButton sizeToFit]; + [_changeBehaviorButton addTarget:self + action:@selector(nextBehavior) + forControlEvents:UIControlEventTouchUpInside]; + + // Add frame animation button. + _toggleViewButton = [[UIBarButtonItem alloc] initWithTitle:@"Toggle View" + style:UIBarButtonItemStylePlain + target:self + action:@selector(toggleViewType)]; + self.navigationItem.rightBarButtonItem = _toggleViewButton; + + // Add change view type button. + _toggleFrameButton = [UIButton buttonWithType:UIButtonTypeSystem]; + _toggleFrameButton.frame = CGRectMake(30, 60, 0, 0); + [_toggleFrameButton setTitle:@"Animate Frame" forState:UIControlStateNormal]; + [_toggleFrameButton sizeToFit]; + [_toggleFrameButton addTarget:self + action:@selector(toggleFrame) + forControlEvents:UIControlEventTouchUpInside]; + + [_mapView addSubview:_statusLabel]; + [_mapView addSubview:_changeBehaviorButton]; + [_mapView addSubview:_toggleFrameButton]; + + _hasShrunk = NO; + + // Pre-load PanoramaView + _panoramaView = [GMSPanoramaView panoramaWithFrame:self.view.bounds nearCoordinate:kPanoramaNear]; + _panoramaView.autoresizingMask = + UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; +} + +#pragma mark - Button Click Handlers + +- (void)toggleFrame { + CGSize size = self.view.bounds.size; + CGPoint point = self.view.bounds.origin; + [UIView animateWithDuration:2.0 + animations:^{ + if (self->_hasShrunk) { + self->_mapView.frame = self.view.bounds; + self->_panoramaView.frame = self->_mapView.frame; + } else { + self->_mapView.frame = + CGRectMake(point.x, point.y, size.width / 2, size.height / 2); + self->_panoramaView.frame = self->_mapView.frame; + } + self->_hasShrunk = !self->_hasShrunk; + [self.view setNeedsLayout]; + [self.view layoutIfNeeded]; + }]; +} + +- (void)toggleViewType { + if ([self.view.subviews containsObject:_mapView]) { + [_mapView removeFromSuperview]; + [self.view addSubview:_panoramaView]; + [_panoramaView addSubview:_toggleFrameButton]; + } else { + [_panoramaView removeFromSuperview]; + [self.view addSubview:_mapView]; + [_mapView addSubview:_toggleFrameButton]; + } + +} + +- (void)nextBehavior { + switch (_mapView.paddingAdjustmentBehavior) { + case kGMSMapViewPaddingAdjustmentBehaviorAlways: + _mapView.paddingAdjustmentBehavior = kGMSMapViewPaddingAdjustmentBehaviorAutomatic; + _statusLabel.text = @"Behavior: Automatic"; + break; + case kGMSMapViewPaddingAdjustmentBehaviorAutomatic: + _mapView.paddingAdjustmentBehavior = kGMSMapViewPaddingAdjustmentBehaviorNever; + _statusLabel.text = @"Behavior: Never"; + break; + case kGMSMapViewPaddingAdjustmentBehaviorNever: + _mapView.paddingAdjustmentBehavior = kGMSMapViewPaddingAdjustmentBehaviorAlways; + _statusLabel.text = @"Behavior: Always"; + break; + } +} + +@end diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/PanoramaViewController.h b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/PanoramaViewController.h new file mode 100755 index 0000000..1dfd285 --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/PanoramaViewController.h @@ -0,0 +1,20 @@ +/* + * Copyright 2016 Google LLC. All rights reserved. + * + * + * 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. + */ + +#import + +@interface PanoramaViewController : UIViewController + +@end diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/PanoramaViewController.m b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/PanoramaViewController.m new file mode 100755 index 0000000..eac9a2f --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/PanoramaViewController.m @@ -0,0 +1,84 @@ +/* + * Copyright 2016 Google LLC. All rights reserved. + * + * + * 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. + */ + +#import "GoogleMapsDemos/Samples/PanoramaViewController.h" + +#import + +static CLLocationCoordinate2D kPanoramaNear = {40.761388, -73.978133}; +static CLLocationCoordinate2D kMarkerAt = {40.761455, -73.977814}; + +@interface PanoramaViewController () +@end + +@implementation PanoramaViewController { + GMSPanoramaView *_view; + BOOL _configured; + UILabel *_statusLabel; +} + +- (void)viewDidLoad { + [super viewDidLoad]; + + _view = [GMSPanoramaView panoramaWithFrame:CGRectZero + nearCoordinate:kPanoramaNear]; + _view.backgroundColor = [UIColor grayColor]; + _view.delegate = self; + self.view = _view; + + // Add status label, initially hidden. + _statusLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 0, 30)]; + _statusLabel.alpha = 0.0f; + _statusLabel.autoresizingMask = UIViewAutoresizingFlexibleWidth; + _statusLabel.backgroundColor = [UIColor blueColor]; + _statusLabel.textColor = [UIColor whiteColor]; + _statusLabel.textAlignment = NSTextAlignmentCenter; + + [_view addSubview:_statusLabel]; +} + +#pragma mark - GMSPanoramaDelegate + +- (void)panoramaView:(GMSPanoramaView *)panoramaView + didMoveCamera:(GMSPanoramaCamera *)camera { + NSLog(@"Camera: (%f,%f,%f)", + camera.orientation.heading, camera.orientation.pitch, camera.zoom); +} + +- (void)panoramaView:(GMSPanoramaView *)view + didMoveToPanorama:(GMSPanorama *)panorama { + if (!_configured) { + GMSMarker *marker = [GMSMarker markerWithPosition:kMarkerAt]; + marker.icon = [GMSMarker markerImageWithColor:[UIColor purpleColor]]; + marker.panoramaView = _view; + + CLLocationDegrees heading = GMSGeometryHeading(kPanoramaNear, kMarkerAt); + _view.camera = + [GMSPanoramaCamera cameraWithHeading:heading pitch:0 zoom:1]; + + _configured = YES; + } +} + +- (void)panoramaViewDidStartRendering:(GMSPanoramaView *)panoramaView { + _statusLabel.alpha = 0.8f; + _statusLabel.text = @"Rendering"; +} + +- (void)panoramaViewDidFinishRendering:(GMSPanoramaView *)panoramaView { + _statusLabel.alpha = 0.0f; +} + +@end diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/PolygonsViewController.h b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/PolygonsViewController.h new file mode 100755 index 0000000..efdc2bd --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/PolygonsViewController.h @@ -0,0 +1,22 @@ +/* + * Copyright 2016 Google LLC. All rights reserved. + * + * + * 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. + */ + +#import + +#import + +@interface PolygonsViewController : UIViewController + +@end diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/PolygonsViewController.m b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/PolygonsViewController.m new file mode 100755 index 0000000..e3df3d8 --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/PolygonsViewController.m @@ -0,0 +1,274 @@ +/* + * Copyright 2016 Google LLC. All rights reserved. + * + * + * 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. + */ + +#import "GoogleMapsDemos/Samples/PolygonsViewController.h" + +#import + +@implementation PolygonsViewController + +- (void)viewDidLoad { + [super viewDidLoad]; + GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:39.13006 + longitude:-77.508545 + zoom:4]; + GMSMapView *mapView = [GMSMapView mapWithFrame:CGRectZero camera:camera]; + mapView.delegate = self; // needed for didTapOverlay delegate method + + self.view = mapView; +} + +- (void)viewDidAppear:(BOOL)animated { + [super viewDidAppear:animated]; + + // Create renderer related objects after view appears, so a renderer will be available; + // otherwise, behavior is undefined (may result in null ptr derefs). + GMSMapView *mapView = (GMSMapView *)self.view; + + // Create the first polygon. + GMSPolygon *polygon = [[GMSPolygon alloc] init]; + polygon.path = [self pathOfNewYorkState]; + polygon.holes = @[ [self pathOfNewYorkStateHole] ]; + polygon.title = @"New York"; + polygon.fillColor = [UIColor colorWithRed:0.25 green:0 blue:0 alpha:0.2f]; + polygon.strokeColor = [UIColor blackColor]; + polygon.strokeWidth = 2; + polygon.tappable = YES; + polygon.map = mapView; + + // Copy the existing polygon and its settings and use it as a base for the + // second polygon. + polygon = [polygon copy]; + polygon.title = @"North Carolina"; + polygon.path = [self pathOfNorthCarolina]; + polygon.fillColor = [UIColor colorWithRed:0 green:0.25 blue:0 alpha:0.5]; + polygon.map = mapView; +} + +- (void)mapView:(GMSMapView *)mapView didTapOverlay:(GMSOverlay *)overlay { + // When a polygon is tapped, randomly change its fill color to a new hue. + if ([overlay isKindOfClass:[GMSPolygon class]]) { + GMSPolygon *polygon = (GMSPolygon *)overlay; + CGFloat hue = (((float)arc4random()/0x100000000)*1.0f); + polygon.fillColor = + [UIColor colorWithHue:hue saturation:1 brightness:1 alpha:0.5]; + } +} + +- (GMSPath *)pathOfNewYorkState { + GMSMutablePath *path = [GMSMutablePath path]; + [path addLatitude:42.5142 longitude:-79.7624]; + [path addLatitude:42.7783 longitude:-79.0672]; + [path addLatitude:42.8508 longitude:-78.9313]; + [path addLatitude:42.9061 longitude:-78.9024]; + [path addLatitude:42.9554 longitude:-78.9313]; + [path addLatitude:42.9584 longitude:-78.9656]; + [path addLatitude:42.9886 longitude:-79.0219]; + [path addLatitude:43.0568 longitude:-79.0027]; + [path addLatitude:43.0769 longitude:-79.0727]; + [path addLatitude:43.1220 longitude:-79.0713]; + [path addLatitude:43.1441 longitude:-79.0302]; + [path addLatitude:43.1801 longitude:-79.0576]; + [path addLatitude:43.2482 longitude:-79.0604]; + [path addLatitude:43.2812 longitude:-79.0837]; + [path addLatitude:43.4509 longitude:-79.2004]; + [path addLatitude:43.6311 longitude:-78.6909]; + [path addLatitude:43.6321 longitude:-76.7958]; + [path addLatitude:43.9987 longitude:-76.4978]; + [path addLatitude:44.0965 longitude:-76.4388]; + [path addLatitude:44.1349 longitude:-76.3536]; + [path addLatitude:44.1989 longitude:-76.3124]; + [path addLatitude:44.2049 longitude:-76.2437]; + [path addLatitude:44.2413 longitude:-76.1655]; + [path addLatitude:44.2973 longitude:-76.1353]; + [path addLatitude:44.3327 longitude:-76.0474]; + [path addLatitude:44.3553 longitude:-75.9856]; + [path addLatitude:44.3749 longitude:-75.9196]; + [path addLatitude:44.3994 longitude:-75.8730]; + [path addLatitude:44.4308 longitude:-75.8221]; + [path addLatitude:44.4740 longitude:-75.8098]; + [path addLatitude:44.5425 longitude:-75.7288]; + [path addLatitude:44.6647 longitude:-75.5585]; + [path addLatitude:44.7672 longitude:-75.4088]; + [path addLatitude:44.8101 longitude:-75.3442]; + [path addLatitude:44.8383 longitude:-75.3058]; + [path addLatitude:44.8676 longitude:-75.2399]; + [path addLatitude:44.9211 longitude:-75.1204]; + [path addLatitude:44.9609 longitude:-74.9995]; + [path addLatitude:44.9803 longitude:-74.9899]; + [path addLatitude:44.9852 longitude:-74.9103]; + [path addLatitude:45.0017 longitude:-74.8856]; + [path addLatitude:45.0153 longitude:-74.8306]; + [path addLatitude:45.0046 longitude:-74.7633]; + [path addLatitude:45.0027 longitude:-74.7070]; + [path addLatitude:45.0007 longitude:-74.5642]; + [path addLatitude:44.9920 longitude:-74.1467]; + [path addLatitude:45.0037 longitude:-73.7306]; + [path addLatitude:45.0085 longitude:-73.4203]; + [path addLatitude:45.0109 longitude:-73.3430]; + [path addLatitude:44.9874 longitude:-73.3547]; + [path addLatitude:44.9648 longitude:-73.3379]; + [path addLatitude:44.9160 longitude:-73.3396]; + [path addLatitude:44.8354 longitude:-73.3739]; + [path addLatitude:44.8013 longitude:-73.3324]; + [path addLatitude:44.7419 longitude:-73.3667]; + [path addLatitude:44.6139 longitude:-73.3873]; + [path addLatitude:44.5787 longitude:-73.3736]; + [path addLatitude:44.4916 longitude:-73.3049]; + [path addLatitude:44.4289 longitude:-73.2953]; + [path addLatitude:44.3513 longitude:-73.3365]; + [path addLatitude:44.2757 longitude:-73.3118]; + [path addLatitude:44.1980 longitude:-73.3818]; + [path addLatitude:44.1142 longitude:-73.4079]; + [path addLatitude:44.0511 longitude:-73.4367]; + [path addLatitude:44.0165 longitude:-73.4065]; + [path addLatitude:43.9375 longitude:-73.4079]; + [path addLatitude:43.8771 longitude:-73.3749]; + [path addLatitude:43.8167 longitude:-73.3914]; + [path addLatitude:43.7790 longitude:-73.3557]; + [path addLatitude:43.6460 longitude:-73.4244]; + [path addLatitude:43.5893 longitude:-73.4340]; + [path addLatitude:43.5655 longitude:-73.3969]; + [path addLatitude:43.6112 longitude:-73.3818]; + [path addLatitude:43.6271 longitude:-73.3049]; + [path addLatitude:43.5764 longitude:-73.3063]; + [path addLatitude:43.5675 longitude:-73.2582]; + [path addLatitude:43.5227 longitude:-73.2445]; + [path addLatitude:43.2582 longitude:-73.2582]; + [path addLatitude:42.9715 longitude:-73.2733]; + [path addLatitude:42.8004 longitude:-73.2898]; + [path addLatitude:42.7460 longitude:-73.2664]; + [path addLatitude:42.4630 longitude:-73.3708]; + [path addLatitude:42.0840 longitude:-73.5095]; + [path addLatitude:42.0218 longitude:-73.4903]; + [path addLatitude:41.8808 longitude:-73.4999]; + [path addLatitude:41.2953 longitude:-73.5535]; + [path addLatitude:41.2128 longitude:-73.4834]; + [path addLatitude:41.1011 longitude:-73.7275]; + [path addLatitude:41.0237 longitude:-73.6644]; + [path addLatitude:40.9851 longitude:-73.6578]; + [path addLatitude:40.9509 longitude:-73.6132]; + [path addLatitude:41.1869 longitude:-72.4823]; + [path addLatitude:41.2551 longitude:-72.0950]; + [path addLatitude:41.3005 longitude:-71.9714]; + [path addLatitude:41.3108 longitude:-71.9193]; + [path addLatitude:41.1838 longitude:-71.7915]; + [path addLatitude:41.1249 longitude:-71.7929]; + [path addLatitude:41.0462 longitude:-71.7517]; + [path addLatitude:40.6306 longitude:-72.9465]; + [path addLatitude:40.5368 longitude:-73.4628]; + [path addLatitude:40.4887 longitude:-73.8885]; + [path addLatitude:40.5232 longitude:-73.9490]; + [path addLatitude:40.4772 longitude:-74.2271]; + [path addLatitude:40.4861 longitude:-74.2532]; + [path addLatitude:40.6468 longitude:-74.1866]; + [path addLatitude:40.6556 longitude:-74.0547]; + [path addLatitude:40.7618 longitude:-74.0156]; + [path addLatitude:40.8699 longitude:-73.9421]; + [path addLatitude:40.9980 longitude:-73.8934]; + [path addLatitude:41.0343 longitude:-73.9854]; + [path addLatitude:41.3268 longitude:-74.6274]; + [path addLatitude:41.3583 longitude:-74.7084]; + [path addLatitude:41.3811 longitude:-74.7101]; + [path addLatitude:41.4386 longitude:-74.8265]; + [path addLatitude:41.5075 longitude:-74.9913]; + [path addLatitude:41.6000 longitude:-75.0668]; + [path addLatitude:41.6719 longitude:-75.0366]; + [path addLatitude:41.7672 longitude:-75.0545]; + [path addLatitude:41.8808 longitude:-75.1945]; + [path addLatitude:42.0013 longitude:-75.3552]; + [path addLatitude:42.0003 longitude:-75.4266]; + [path addLatitude:42.0013 longitude:-77.0306]; + [path addLatitude:41.9993 longitude:-79.7250]; + [path addLatitude:42.0003 longitude:-79.7621]; + [path addLatitude:42.1827 longitude:-79.7621]; + [path addLatitude:42.5146 longitude:-79.7621]; + return path; +} + +- (GMSPath *)pathOfNewYorkStateHole { + GMSMutablePath *path = [GMSMutablePath path]; + [path addLatitude:43.5000 longitude:-76.3651]; + [path addLatitude:43.5000 longitude:-74.3651]; + [path addLatitude:42.0000 longitude:-74.3651]; + return path; +} + +- (GMSPath *)pathOfNorthCarolina { + GMSMutablePath *path = [GMSMutablePath path]; + [path addLatitude:33.7963 longitude:-78.4850]; + [path addLatitude:34.8037 longitude:-79.6742]; + [path addLatitude:34.8206 longitude:-80.8003]; + [path addLatitude:34.9377 longitude:-80.7880]; + [path addLatitude:35.1019 longitude:-80.9377]; + [path addLatitude:35.0356 longitude:-81.0379]; + [path addLatitude:35.1457 longitude:-81.0324]; + [path addLatitude:35.1660 longitude:-81.3867]; + [path addLatitude:35.1985 longitude:-82.2739]; + [path addLatitude:35.2041 longitude:-82.3933]; + [path addLatitude:35.0637 longitude:-82.7765]; + [path addLatitude:35.0817 longitude:-82.7861]; + [path addLatitude:34.9996 longitude:-83.1075]; + [path addLatitude:34.9918 longitude:-83.6183]; + [path addLatitude:34.9918 longitude:-84.3201]; + [path addLatitude:35.2131 longitude:-84.2885]; + [path addLatitude:35.2680 longitude:-84.2226]; + [path addLatitude:35.2310 longitude:-84.1113]; + [path addLatitude:35.2815 longitude:-84.0454]; + [path addLatitude:35.4058 longitude:-84.0248]; + [path addLatitude:35.4719 longitude:-83.9424]; + [path addLatitude:35.5166 longitude:-83.8559]; + [path addLatitude:35.5512 longitude:-83.6938]; + [path addLatitude:35.5680 longitude:-83.5181]; + [path addLatitude:35.6327 longitude:-83.3849]; + [path addLatitude:35.7142 longitude:-83.2475]; + [path addLatitude:35.7799 longitude:-82.9962]; + [path addLatitude:35.8445 longitude:-82.9276]; + [path addLatitude:35.9224 longitude:-82.8191]; + [path addLatitude:35.9958 longitude:-82.7710]; + [path addLatitude:36.0613 longitude:-82.6419]; + [path addLatitude:35.9702 longitude:-82.6103]; + [path addLatitude:35.9547 longitude:-82.5677]; + [path addLatitude:36.0236 longitude:-82.4730]; + [path addLatitude:36.0669 longitude:-82.4194]; + [path addLatitude:36.1168 longitude:-82.3535]; + [path addLatitude:36.1345 longitude:-82.2862]; + [path addLatitude:36.1467 longitude:-82.1461]; + [path addLatitude:36.1035 longitude:-82.1228]; + [path addLatitude:36.1268 longitude:-82.0267]; + [path addLatitude:36.2797 longitude:-81.9360]; + [path addLatitude:36.3527 longitude:-81.7987]; + [path addLatitude:36.3361 longitude:-81.7081]; + [path addLatitude:36.5880 longitude:-81.6724]; + [path addLatitude:36.5659 longitude:-80.7234]; + [path addLatitude:36.5438 longitude:-80.2977]; + [path addLatitude:36.5449 longitude:-79.6729]; + [path addLatitude:36.5449 longitude:-77.2559]; + [path addLatitude:36.5505 longitude:-75.7562]; + [path addLatitude:36.3129 longitude:-75.7068]; + [path addLatitude:35.7131 longitude:-75.4129]; + [path addLatitude:35.2041 longitude:-75.4720]; + [path addLatitude:34.9794 longitude:-76.0748]; + [path addLatitude:34.5258 longitude:-76.4951]; + [path addLatitude:34.5880 longitude:-76.8109]; + [path addLatitude:34.5314 longitude:-77.1378]; + [path addLatitude:34.3910 longitude:-77.4481]; + [path addLatitude:34.0481 longitude:-77.7983]; + [path addLatitude:33.7666 longitude:-77.9260]; + [path addLatitude:33.7963 longitude:-78.4863]; + return path; +} + +@end diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/PolylinesViewController.h b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/PolylinesViewController.h new file mode 100755 index 0000000..6cb22f5 --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/PolylinesViewController.h @@ -0,0 +1,20 @@ +/* + * Copyright 2016 Google LLC. All rights reserved. + * + * + * 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. + */ + +#import + +@interface PolylinesViewController : UIViewController + +@end diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/PolylinesViewController.m b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/PolylinesViewController.m new file mode 100755 index 0000000..c75086f --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/PolylinesViewController.m @@ -0,0 +1,115 @@ +/* + * Copyright 2016 Google LLC. All rights reserved. + * + * + * 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. + */ + +#import "GoogleMapsDemos/Samples/PolylinesViewController.h" + +#import + +@interface GMSPolyline (length) + +@property(nonatomic, readonly) double length; + +@end + +@implementation GMSPolyline (length) + +- (double)length { + GMSLengthKind kind = [self geodesic] ? kGMSLengthGeodesic : kGMSLengthRhumb; + return [[self path] lengthOfKind:kind]; +} + +@end + +static CLLocationCoordinate2D kSydneyAustralia = {-33.866901, 151.195988}; +static CLLocationCoordinate2D kHawaiiUSA = {21.291982, -157.821856}; +static CLLocationCoordinate2D kFiji = {-18, 179}; +static CLLocationCoordinate2D kMountainViewUSA = {37.423802, -122.091859}; +static CLLocationCoordinate2D kLimaPeru = {-12, -77}; +static bool kAnimate = true; + +@implementation PolylinesViewController { + NSArray *_styles; + NSArray *_lengths; + NSArray *_polys; + double _pos, _step; + GMSMapView *_mapView; +} + +- (void)tick { + for (GMSPolyline *poly in _polys) { + poly.spans = + GMSStyleSpansOffset(poly.path, _styles, _lengths, kGMSLengthGeodesic, _pos); + } + _pos -= _step; + if (kAnimate) { + __weak id weakSelf = self; + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, NSEC_PER_SEC / 10), + dispatch_get_main_queue(), + ^{ [weakSelf tick]; }); + } +} + +- (void)initLines { + if (!_polys) { + NSMutableArray *polys = [NSMutableArray array]; + GMSMutablePath *path = [GMSMutablePath path]; + [path addCoordinate:kSydneyAustralia]; + [path addCoordinate:kFiji]; + [path addCoordinate:kHawaiiUSA]; + [path addCoordinate:kMountainViewUSA]; + [path addCoordinate:kLimaPeru]; + [path addCoordinate:kSydneyAustralia]; + path = [path pathOffsetByLatitude:-30 longitude:0]; + _lengths = @[@([path lengthOfKind:kGMSLengthGeodesic] / 21)]; + for (int i = 0; i < 30; ++i) { + GMSPolyline *poly = [[GMSPolyline alloc] init]; + poly.path = [path pathOffsetByLatitude:(i * 1.5) longitude:0]; + poly.strokeWidth = 8; + poly.geodesic = YES; + poly.map = _mapView; + [polys addObject:poly]; + } + _polys = polys; + } +} + +- (void)viewDidLoad { + [super viewDidLoad]; + GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:-30 + longitude:-175 + zoom:3]; + GMSMapView *mapView = [GMSMapView mapWithFrame:CGRectZero camera:camera]; + mapView.accessibilityElementsHidden = YES; + self.view = mapView; + _mapView = mapView; + + CGFloat alpha = 1; + UIColor *green = [UIColor colorWithRed:0 green:1 blue: 0 alpha:alpha]; + UIColor *greenTransp = [UIColor colorWithRed:0 green:1 blue: 0 alpha:0]; + UIColor *red = [UIColor colorWithRed:1 green:0 blue: 0 alpha:alpha]; + UIColor *redTransp = [UIColor colorWithRed:1 green:0 blue: 0 alpha:0]; + GMSStrokeStyle *grad1 = [GMSStrokeStyle gradientFromColor:green toColor:greenTransp]; + GMSStrokeStyle *grad2 = [GMSStrokeStyle gradientFromColor:redTransp toColor:red]; + _styles = @[ + grad1, + grad2, + [GMSStrokeStyle solidColor:[UIColor colorWithWhite:0 alpha:0]], + ]; + _step = 50000; + [self initLines]; + [self tick]; +} + +@end diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/Samples.h b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/Samples.h new file mode 100755 index 0000000..5c2d54d --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/Samples.h @@ -0,0 +1,24 @@ +/* + * Copyright 2016 Google LLC. All rights reserved. + * + * + * 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. + */ + +#import + +@interface Samples : NSObject ++ (NSArray *)loadSections; ++ (NSArray *)loadDemos; ++ (NSDictionary *)newDemo:(Class) class + withTitle:(NSString *)title + andDescription:(NSString *)description; +@end diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/Samples.m b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/Samples.m new file mode 100755 index 0000000..cebd46a --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/Samples.m @@ -0,0 +1,183 @@ +/* + * Copyright 2016 Google LLC. All rights reserved. + * + * + * 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. + */ + +#import "GoogleMapsDemos/Samples/Samples.h" + +#import "GoogleMapsDemos/Samples/AnimatedCurrentLocationViewController.h" +#import "GoogleMapsDemos/Samples/AnimatedUIViewMarkerViewController.h" +#import "GoogleMapsDemos/Samples/BasicMapViewController.h" +#import "GoogleMapsDemos/Samples/CameraViewController.h" +#import "GoogleMapsDemos/Samples/CustomIndoorViewController.h" +#import "GoogleMapsDemos/Samples/CustomMarkersViewController.h" +#import "GoogleMapsDemos/Samples/DoubleMapViewController.h" +#import "GoogleMapsDemos/Samples/FitBoundsViewController.h" +#import "GoogleMapsDemos/Samples/FixedPanoramaViewController.h" +#import "GoogleMapsDemos/Samples/FrameRateViewController.h" +#import "GoogleMapsDemos/Samples/GeocoderViewController.h" +#import "GoogleMapsDemos/Samples/GestureControlViewController.h" +#import "GoogleMapsDemos/Samples/GradientPolylinesViewController.h" +#import "GoogleMapsDemos/Samples/GroundOverlayViewController.h" +#import "GoogleMapsDemos/Samples/IndoorMuseumNavigationViewController.h" +#import "GoogleMapsDemos/Samples/IndoorViewController.h" +#import "GoogleMapsDemos/Samples/MapLayerViewController.h" +#import "GoogleMapsDemos/Samples/MapTypesViewController.h" +#import "GoogleMapsDemos/Samples/MapZoomViewController.h" +#import "GoogleMapsDemos/Samples/MarkerEventsViewController.h" +#import "GoogleMapsDemos/Samples/MarkerInfoWindowViewController.h" +#import "GoogleMapsDemos/Samples/MarkerLayerViewController.h" +#import "GoogleMapsDemos/Samples/MarkersViewController.h" +#import "GoogleMapsDemos/Samples/MyLocationViewController.h" +#import "GoogleMapsDemos/Samples/PaddingBehaviorViewController.h" +#import "GoogleMapsDemos/Samples/PanoramaViewController.h" +#import "GoogleMapsDemos/Samples/PolygonsViewController.h" +#import "GoogleMapsDemos/Samples/PolylinesViewController.h" +#import "GoogleMapsDemos/Samples/SnapshotReadyViewController.h" +#import "GoogleMapsDemos/Samples/StructuredGeocoderViewController.h" +#import "GoogleMapsDemos/Samples/StyledMapViewController.h" +#import "GoogleMapsDemos/Samples/TileLayerViewController.h" +#import "GoogleMapsDemos/Samples/TrafficMapViewController.h" +#import "GoogleMapsDemos/Samples/VisibleRegionViewController.h" + +@implementation Samples + ++ (NSArray *)loadSections { + return @[ @"Map", @"Panorama", @"Overlays", @"Camera", @"Services" ]; +} + ++ (NSArray *)loadDemos { + NSArray *mapDemos = + @[[self newDemo:[BasicMapViewController class] + withTitle:@"Basic Map" + andDescription:nil], + [self newDemo:[MapTypesViewController class] + withTitle:@"Map Types" + andDescription:nil], + [self newDemo:[StyledMapViewController class] + withTitle:@"Styled Map" + andDescription:nil], + [self newDemo:[TrafficMapViewController class] + withTitle:@"Traffic Layer" + andDescription:nil], + [self newDemo:[MyLocationViewController class] + withTitle:@"My Location" + andDescription:nil], + [self newDemo:[IndoorViewController class] + withTitle:@"Indoor" + andDescription:nil], + [self newDemo:[CustomIndoorViewController class] + withTitle:@"Indoor with Custom Level Select" + andDescription:nil], + [self newDemo:[IndoorMuseumNavigationViewController class] + withTitle:@"Indoor Museum Navigator" + andDescription:nil], + [self newDemo:[GestureControlViewController class] + withTitle:@"Gesture Control" + andDescription:nil], + [self newDemo:[SnapshotReadyViewController class] + withTitle:@"Snapshot Ready" + andDescription:nil], + [self newDemo:[DoubleMapViewController class] + withTitle:@"Two Maps" + andDescription:nil], + [self newDemo:[VisibleRegionViewController class] + withTitle:@"Visible Regions" + andDescription:nil], + [self newDemo:[MapZoomViewController class] + withTitle:@"Min/Max Zoom" + andDescription:nil], + [self newDemo:[FrameRateViewController class] + withTitle:@"Frame Rate" + andDescription:nil], + [self newDemo:[PaddingBehaviorViewController class] + withTitle:@"Padding Behavior" + andDescription:nil], + ]; + + NSArray *panoramaDemos = + @[[self newDemo:[PanoramaViewController class] + withTitle:@"Street View" + andDescription:nil], + [self newDemo:[FixedPanoramaViewController class] + withTitle:@"Fixed Street View" + andDescription:nil]]; + + NSArray *overlayDemos = + @[[self newDemo:[MarkersViewController class] + withTitle:@"Markers" + andDescription:nil], + [self newDemo:[CustomMarkersViewController class] + withTitle:@"Custom Markers" + andDescription:nil], + [self newDemo:[AnimatedUIViewMarkerViewController class] + withTitle:@"UIView Markers" + andDescription:nil], + [self newDemo:[MarkerEventsViewController class] + withTitle:@"Marker Events" + andDescription:nil], + [self newDemo:[MarkerLayerViewController class] + withTitle:@"Marker Layer" + andDescription:nil], + [self newDemo:[MarkerInfoWindowViewController class] + withTitle:@"Custom Info Windows" + andDescription:nil], + [self newDemo:[PolygonsViewController class] + withTitle:@"Polygons" + andDescription:nil], + [self newDemo:[PolylinesViewController class] + withTitle:@"Polylines" + andDescription:nil], + [self newDemo:[GroundOverlayViewController class] + withTitle:@"Ground Overlays" + andDescription:nil], + [self newDemo:[TileLayerViewController class] + withTitle:@"Tile Layers" + andDescription:nil], + [self newDemo:[AnimatedCurrentLocationViewController class] + withTitle:@"Animated Current Location" + andDescription:nil], + [self newDemo:[GradientPolylinesViewController class] + withTitle:@"Gradient Polylines" + andDescription:nil]]; + + NSArray *cameraDemos = + @[[self newDemo:[FitBoundsViewController class] + withTitle:@"Fit Bounds" + andDescription:nil], + [self newDemo:[CameraViewController class] + withTitle:@"Camera Animation" + andDescription:nil], + [self newDemo:[MapLayerViewController class] + withTitle:@"Map Layer" + andDescription:nil]]; + + NSArray *servicesDemos = + @[[self newDemo:[GeocoderViewController class] + withTitle:@"Geocoder" + andDescription:nil], + [self newDemo:[StructuredGeocoderViewController class] + withTitle:@"Structured Geocoder" + andDescription:nil], + ]; + + return @[mapDemos, panoramaDemos, overlayDemos, cameraDemos, servicesDemos]; +} + ++ (NSDictionary *)newDemo:(Class) class + withTitle:(NSString *)title + andDescription:(NSString *)description { + return [[NSDictionary alloc] initWithObjectsAndKeys:class, @"controller", + title, @"title", description, @"description", nil]; +} +@end diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/SnapshotReadyViewController.h b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/SnapshotReadyViewController.h new file mode 100755 index 0000000..ceaa9c1 --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/SnapshotReadyViewController.h @@ -0,0 +1,20 @@ +/* + * Copyright 2016 Google LLC. All rights reserved. + * + * + * 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. + */ + +#import + +@interface SnapshotReadyViewController : UIViewController + +@end diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/SnapshotReadyViewController.m b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/SnapshotReadyViewController.m new file mode 100755 index 0000000..cb53732 --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/SnapshotReadyViewController.m @@ -0,0 +1,108 @@ +/* + * Copyright 2016 Google LLC. All rights reserved. + * + * + * 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. + */ + +#import "GoogleMapsDemos/Samples/SnapshotReadyViewController.h" + +#import + +@interface SnapshotReadyViewController () +@end + +@implementation SnapshotReadyViewController { + GMSMapView *_mapView; + UILabel *_statusLabel; + UIBarButtonItem *_waitButton; + BOOL _isAwaitingSnapshot; +} + +- (void)viewDidLoad { + [super viewDidLoad]; + GMSCameraPosition *camera = + [GMSCameraPosition cameraWithLatitude:-33.868 longitude:151.2086 zoom:6]; + _mapView = [GMSMapView mapWithFrame:CGRectZero camera:camera]; + _mapView.delegate = self; + self.view = _mapView; + + // Add status label, initially hidden. + _statusLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 0, 30)]; + _statusLabel.alpha = 0.0f; + _statusLabel.autoresizingMask = UIViewAutoresizingFlexibleWidth; + _statusLabel.backgroundColor = [UIColor blueColor]; + _statusLabel.textColor = [UIColor whiteColor]; + _statusLabel.textAlignment = NSTextAlignmentCenter; + + // Add a wait button to signify on the next SnapshotReady event, a screenshot of the map will + // be taken. + _waitButton = [[UIBarButtonItem alloc] initWithTitle:@"Wait for snapshot" + style:UIBarButtonItemStylePlain + target:self + action:@selector(didTapWait)]; + self.navigationItem.rightBarButtonItems = @[ _waitButton ]; + [_mapView addSubview:_statusLabel]; +} + +#pragma mark GMSMapViewDelegate + +- (void)mapViewSnapshotReady:(GMSMapView *)mapView { + if (_isAwaitingSnapshot) { + _isAwaitingSnapshot = NO; + _waitButton.enabled = YES; + _waitButton.title = @"Wait for snapshot"; + [self takeSnapshot]; + } + + _statusLabel.alpha = 0.8f; + _statusLabel.text = @"Snapshot Ready"; + // Remove status label after 1 second. + UILabel *statusLabel = _statusLabel; + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{ + statusLabel.alpha = 0.0f; + }); +} + +#pragma mark Private + +- (void)didTapWait { + _isAwaitingSnapshot = YES; + _waitButton.enabled = NO; + _waitButton.title = @"Waiting"; +} + +- (void)takeSnapshot { + // Take a snapshot of the map. + UIGraphicsBeginImageContextWithOptions(_mapView.bounds.size, YES, 0); + [_mapView drawViewHierarchyInRect:_mapView.bounds afterScreenUpdates:YES]; + UIImage *mapSnapShot = UIGraphicsGetImageFromCurrentImageContext(); + UIGraphicsEndImageContext(); + + // Put snapshot image into an UIImageView and overlay on top of map. + UIImageView *imageView = [[UIImageView alloc] initWithImage:mapSnapShot]; + imageView.layer.borderColor = [UIColor redColor].CGColor; + imageView.layer.borderWidth = 10.0f; + [_mapView addSubview:imageView]; + + // Remove imageView after 1 second. + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{ + [UIView animateWithDuration:1 + animations:^{ + imageView.alpha = 0.0f; + } + completion:^(BOOL finished) { + [imageView removeFromSuperview]; + }]; + }); +} + +@end diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/StructuredGeocoderViewController.h b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/StructuredGeocoderViewController.h new file mode 100755 index 0000000..4e655fc --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/StructuredGeocoderViewController.h @@ -0,0 +1,20 @@ +/* + * Copyright 2016 Google LLC. All rights reserved. + * + * + * 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. + */ + +#import + +@interface StructuredGeocoderViewController : UIViewController + +@end diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/StructuredGeocoderViewController.m b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/StructuredGeocoderViewController.m new file mode 100755 index 0000000..d105a9c --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/StructuredGeocoderViewController.m @@ -0,0 +1,91 @@ +/* + * Copyright 2016 Google LLC. All rights reserved. + * + * + * 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. + */ + +#import "GoogleMapsDemos/Samples/StructuredGeocoderViewController.h" + +#import + +@interface StructuredGeocoderViewController () + +@end + +@implementation StructuredGeocoderViewController { + GMSMapView *_mapView; + GMSGeocoder *_geocoder; +} + +- (void)viewDidLoad { + [super viewDidLoad]; + GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:-33.868 + longitude:151.2086 + zoom:12]; + _mapView = [GMSMapView mapWithFrame:CGRectZero camera:camera]; + _mapView.delegate = self; + _geocoder = [[GMSGeocoder alloc] init]; + + self.view = _mapView; +} + +#pragma mark - GMSMapViewDelegate + +- (void)mapView:(GMSMapView *)mapView didLongPressAtCoordinate:(CLLocationCoordinate2D)coordinate { + // On a long press, reverse geocode this location. + __weak __typeof__(self) weakSelf = self; + GMSReverseGeocodeCallback handler = ^(GMSReverseGeocodeResponse *response, NSError *error) { + [weakSelf handleResponse:response coordinate:coordinate error:error]; + }; + [_geocoder reverseGeocodeCoordinate:coordinate completionHandler:handler]; +} + +#pragma mark - StructuredGeocoderViewController Private Category + +- (void)handleResponse:(nullable GMSReverseGeocodeResponse *)response + coordinate:(CLLocationCoordinate2D)coordinate + error:(nullable NSError *)error { + GMSAddress *address = response.firstResult; + if (address) { + NSLog(@"Geocoder result: %@", address); + + GMSMarker *marker = [GMSMarker markerWithPosition:address.coordinate]; + + marker.title = address.thoroughfare; + + NSMutableString *snippet = [[NSMutableString alloc] init]; + if (address.subLocality != NULL) { + [snippet appendString:[NSString stringWithFormat:@"subLocality: %@\n", address.subLocality]]; + } + if (address.locality != NULL) { + [snippet appendString:[NSString stringWithFormat:@"locality: %@\n", address.locality]]; + } + if (address.administrativeArea != NULL) { + [snippet appendString:[NSString stringWithFormat:@"administrativeArea: %@\n", + address.administrativeArea]]; + } + if (address.country != NULL) { + [snippet appendString:[NSString stringWithFormat:@"country: %@\n", address.country]]; + } + + marker.snippet = snippet; + + marker.appearAnimation = kGMSMarkerAnimationPop; + marker.map = _mapView; + _mapView.selectedMarker = marker; + } else { + NSLog(@"Could not reverse geocode point (%f,%f): %@", coordinate.latitude, coordinate.longitude, + error); + } +} + +@end diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/StyledMapViewController.h b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/StyledMapViewController.h new file mode 100755 index 0000000..c744eb5 --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/StyledMapViewController.h @@ -0,0 +1,20 @@ +/* + * Copyright 2016 Google LLC. All rights reserved. + * + * + * 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. + */ + +#import + +@interface StyledMapViewController : UIViewController + +@end diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/StyledMapViewController.m b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/StyledMapViewController.m new file mode 100755 index 0000000..9930aba --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/StyledMapViewController.m @@ -0,0 +1,123 @@ +/* + * Copyright 2016 Google LLC. All rights reserved. + * + * + * 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. + */ + +#import "GoogleMapsDemos/Samples/StyledMapViewController.h" + +#import + +static NSString *const kNormalType = @"Normal"; +static NSString *const kRetroType = @"Retro"; +static NSString *const kGrayscaleType = @"Grayscale"; +static NSString *const kNightType = @"Night"; +static NSString *const kNoPOIsType = @"No business points of interest, no transit"; + +@implementation StyledMapViewController { + UIBarButtonItem *_barButtonItem; + GMSMapView *_mapView; + GMSMapStyle *_retroStyle; + GMSMapStyle *_grayscaleStyle; + GMSMapStyle *_nightStyle; + GMSMapStyle *_noPOIsStyle; +} + +- (void)viewDidLoad { + [super viewDidLoad]; + + // Error handling is skipped here for brevity, however it is recommended that you look at the + // error returned from |styleWithContentsOfFileURL:error:| if it returns nil. This error will + // provide information on why your style was not able to be loaded. + + NSURL *retroURL = [[NSBundle mainBundle] URLForResource:@"mapstyle-retro" + withExtension:@"json"]; + _retroStyle = [GMSMapStyle styleWithContentsOfFileURL:retroURL error:NULL]; + + NSURL *grayscaleURL = [[NSBundle mainBundle] URLForResource:@"mapstyle-silver" + withExtension:@"json"]; + _grayscaleStyle = [GMSMapStyle styleWithContentsOfFileURL:grayscaleURL error:NULL]; + + NSURL *nightURL = [[NSBundle mainBundle] URLForResource:@"mapstyle-night" + withExtension:@"json"]; + _nightStyle = [GMSMapStyle styleWithContentsOfFileURL:nightURL error:NULL]; + + NSString *noPOIsString = @" [\n" + " {\n" + " \"featureType\": \"poi.business\",\n" + " \"elementType\": \"all\",\n" + " \"stylers\": [\n" + " {\n" + " \"visibility\": \"off\"\n" + " }\n" + " ]\n" + " },\n" + " {\n" + " \"featureType\": \"transit\",\n" + " \"elementType\": \"all\",\n" + " \"stylers\": [\n" + " {\n" + " \"visibility\": \"off\"\n" + " }\n" + " ]\n" + " }\n" + " ]"; + _noPOIsStyle = [GMSMapStyle styleWithJSONString:noPOIsString error:NULL]; + + GMSCameraPosition *camera = + [GMSCameraPosition cameraWithLatitude:-33.868 longitude:151.2086 zoom:12]; + + _mapView = [GMSMapView mapWithFrame:CGRectZero camera:camera]; + self.view = _mapView; + + _mapView.mapStyle = _retroStyle; + + UIBarButtonItem *styleButton = [[UIBarButtonItem alloc] initWithTitle:@"Style" + style:UIBarButtonItemStylePlain + target:self + action:@selector(changeMapStyle:)]; + self.navigationItem.rightBarButtonItem = styleButton; + self.navigationItem.title = kRetroType; +} + +- (UIAlertAction *_Nonnull)actionWithTitle:(nonnull NSString *)title + style:(nullable GMSMapStyle *)style { + __weak __typeof__(self) weakSelf = self; + return [UIAlertAction actionWithTitle:title + style:UIAlertActionStyleDefault + handler:^(UIAlertAction *_Nonnull action) { + __strong __typeof__(self) strongSelf = weakSelf; + if (strongSelf) { + strongSelf->_mapView.mapStyle = style; + strongSelf.navigationItem.title = title; + } + }]; +} + +- (void)changeMapStyle:(UIBarButtonItem *)sender { + UIAlertController *alert = + [UIAlertController alertControllerWithTitle:@"Select map style" + message:nil + preferredStyle:UIAlertControllerStyleActionSheet]; + [alert addAction:[self actionWithTitle:kRetroType style:_retroStyle]]; + [alert addAction:[self actionWithTitle:kGrayscaleType style:_grayscaleStyle]]; + [alert addAction:[self actionWithTitle:kNightType style:_nightStyle]]; + [alert addAction:[self actionWithTitle:kNormalType style:nil]]; + [alert addAction:[self actionWithTitle:kNoPOIsType style:_noPOIsStyle]]; + [alert addAction:[UIAlertAction actionWithTitle:@"Cancel" + style:UIAlertActionStyleCancel + handler:nil]]; + alert.popoverPresentationController.barButtonItem = sender; + [self presentViewController:alert animated:YES completion:nil]; +} + +@end diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/TileLayerViewController.h b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/TileLayerViewController.h new file mode 100755 index 0000000..adc4085 --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/TileLayerViewController.h @@ -0,0 +1,20 @@ +/* + * Copyright 2016 Google LLC. All rights reserved. + * + * + * 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. + */ + +#import + +@interface TileLayerViewController : UIViewController + +@end diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/TileLayerViewController.m b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/TileLayerViewController.m new file mode 100755 index 0000000..617db21 --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/TileLayerViewController.m @@ -0,0 +1,76 @@ +/* + * Copyright 2016 Google LLC. All rights reserved. + * + * + * 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. + */ + +#import "GoogleMapsDemos/Samples/TileLayerViewController.h" + +#import + +@implementation TileLayerViewController { + UISegmentedControl *_switcher; + GMSMapView *_mapView; + GMSTileLayer *_tileLayer; + NSInteger _floor; +} + +- (void)viewDidLoad { + [super viewDidLoad]; + GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:37.78318 + longitude:-122.403874 + zoom:18]; + + _mapView = [GMSMapView mapWithFrame:CGRectZero camera:camera]; + _mapView.buildingsEnabled = NO; + _mapView.indoorEnabled = NO; + self.view = _mapView; + + // The possible floors that might be shown. + NSArray *types = @[ @"1", @"2", @"3" ]; + + // Create a UISegmentedControl that is the navigationItem's titleView. + _switcher = [[UISegmentedControl alloc] initWithItems:types]; + _switcher.selectedSegmentIndex = 0; + _switcher.autoresizingMask = UIViewAutoresizingFlexibleWidth; + _switcher.frame = + CGRectMake(0, 0, 300, _switcher.frame.size.height); + self.navigationItem.titleView = _switcher; + + // Listen to touch events on the UISegmentedControl, force initial update. + [_switcher addTarget:self action:@selector(didChangeSwitcher) + forControlEvents:UIControlEventValueChanged]; + [self didChangeSwitcher]; +} + +- (void)didChangeSwitcher { + NSString *title = + [_switcher titleForSegmentAtIndex:_switcher.selectedSegmentIndex]; + NSInteger floor = [title integerValue]; + if (_floor != floor) { + // Clear existing tileLayer, if any. + _tileLayer.map = nil; + + // Create a new GMSTileLayer with the new floor choice. + GMSTileURLConstructor urls = ^(NSUInteger x, NSUInteger y, NSUInteger zoom) { + NSString *url = [NSString + stringWithFormat:@"https://www.gstatic.com/io2010maps/tiles/9/L%ld_%lu_%lu_%lu.png", + (long)floor, (unsigned long)zoom, (unsigned long)x, (unsigned long)y]; + return [NSURL URLWithString:url]; + }; + _tileLayer = [GMSURLTileLayer tileLayerWithURLConstructor:urls]; + _tileLayer.map = _mapView; + _floor = floor; + } +} + +@end diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/TrafficMapViewController.h b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/TrafficMapViewController.h new file mode 100755 index 0000000..ddbc9c6 --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/TrafficMapViewController.h @@ -0,0 +1,20 @@ +/* + * Copyright 2016 Google LLC. All rights reserved. + * + * + * 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. + */ + +#import + +@interface TrafficMapViewController : UIViewController + +@end diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/TrafficMapViewController.m b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/TrafficMapViewController.m new file mode 100755 index 0000000..9140c41 --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/TrafficMapViewController.m @@ -0,0 +1,33 @@ +/* + * Copyright 2016 Google LLC. All rights reserved. + * + * + * 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. + */ + +#import "GoogleMapsDemos/Samples/TrafficMapViewController.h" + +#import + +@implementation TrafficMapViewController + +- (void)viewDidLoad { + [super viewDidLoad]; + GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:-33.868 + longitude:151.2086 + zoom:12]; + + GMSMapView *mapView = [GMSMapView mapWithFrame:CGRectZero camera:camera]; + mapView.trafficEnabled = YES; + self.view = mapView; +} + +@end diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/VisibleRegionViewController.h b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/VisibleRegionViewController.h new file mode 100755 index 0000000..1f5c6b0 --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/VisibleRegionViewController.h @@ -0,0 +1,20 @@ +/* + * Copyright 2016 Google LLC. All rights reserved. + * + * + * 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. + */ + +#import + +@interface VisibleRegionViewController : UIViewController + +@end diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/VisibleRegionViewController.m b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/VisibleRegionViewController.m new file mode 100755 index 0000000..6bcc21f --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/VisibleRegionViewController.m @@ -0,0 +1,72 @@ +/* + * Copyright 2016 Google LLC. All rights reserved. + * + * + * 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. + */ + +#import "GoogleMapsDemos/Samples/VisibleRegionViewController.h" + +#import + +static const CGFloat kOverlayHeight = 140.0f; + +@implementation VisibleRegionViewController { + GMSMapView *_mapView; + UIView *_overlay; + UIBarButtonItem *_flyInButton; +} + +- (void)viewDidLoad { + [super viewDidLoad]; + GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:-37.81969 + longitude:144.966085 + zoom:4]; + _mapView = [GMSMapView mapWithFrame:CGRectZero camera:camera]; + + // Enable my location button to show more UI components updating. + _mapView.settings.myLocationButton = YES; + _mapView.myLocationEnabled = YES; + _mapView.padding = UIEdgeInsetsMake(0, 0, kOverlayHeight, 0); + self.view = _mapView; + + // Create a button that, when pressed, causes an overlaying view to fly-in/out. + _flyInButton = [[UIBarButtonItem alloc] initWithTitle:@"Toggle Overlay" + style:UIBarButtonItemStylePlain + target:self + action:@selector(didTapFlyIn)]; + self.navigationItem.rightBarButtonItem = _flyInButton; + + CGRect overlayFrame = CGRectMake(0, -kOverlayHeight, 0, kOverlayHeight); + _overlay = [[UIView alloc] initWithFrame:overlayFrame]; + _overlay.autoresizingMask = UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleWidth; + + _overlay.backgroundColor = [UIColor colorWithHue:0.0 saturation:1.0 brightness:1.0 alpha:0.5]; + [self.view addSubview:_overlay]; +} + +- (void)didTapFlyIn { + UIEdgeInsets padding = _mapView.padding; + + [UIView animateWithDuration:2.0 animations:^{ + CGSize size = self.view.bounds.size; + if (padding.bottom == 0.0f) { + self->_overlay.frame = + CGRectMake(0, size.height - kOverlayHeight, size.width, kOverlayHeight); + self->_mapView.padding = UIEdgeInsetsMake(0, 0, kOverlayHeight, 0); + } else { + self->_overlay.frame = CGRectMake(0, self->_mapView.bounds.size.height, size.width, 0); + self->_mapView.padding = UIEdgeInsetsZero; + } + }]; +} + +@end diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/UIViewController+GMSToastMessages.h b/Pods/GoogleMaps/Example/GoogleMapsDemos/UIViewController+GMSToastMessages.h new file mode 100755 index 0000000..93161f4 --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/UIViewController+GMSToastMessages.h @@ -0,0 +1,26 @@ +/* + * Copyright 2016 Google LLC. All rights reserved. + * + * + * 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. + */ + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface UIViewController (GMSToastMessages) + +- (void)gms_showToastWithMessage:(NSString*)message; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/UIViewController+GMSToastMessages.m b/Pods/GoogleMaps/Example/GoogleMapsDemos/UIViewController+GMSToastMessages.m new file mode 100755 index 0000000..8e4072c --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/UIViewController+GMSToastMessages.m @@ -0,0 +1,36 @@ +/* + * Copyright 2016 Google LLC. All rights reserved. + * + * + * 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. + */ + +#import "GoogleMapsDemos/UIViewController+GMSToastMessages.h" + +@implementation UIViewController (GMSToastMessages) + +- (void)gms_showToastWithMessage:(NSString *)message { + UIAlertController *toast = + [UIAlertController alertControllerWithTitle:nil + message:message + preferredStyle:UIAlertControllerStyleAlert]; + [self presentViewController:toast + animated:YES + completion:^{ + const int kDuration = 2; + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, kDuration * NSEC_PER_SEC), + dispatch_get_main_queue(), ^{ + [toast dismissViewControllerAnimated:YES completion:nil]; + }); + }]; +} + +@end diff --git a/Pods/GoogleMaps/Example/GoogleMapsDemos/main.m b/Pods/GoogleMaps/Example/GoogleMapsDemos/main.m new file mode 100755 index 0000000..34d59f6 --- /dev/null +++ b/Pods/GoogleMaps/Example/GoogleMapsDemos/main.m @@ -0,0 +1,24 @@ +/* + * Copyright 2016 Google LLC. All rights reserved. + * + * + * 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. + */ + +#import + +#import "GoogleMapsDemos/DemoAppDelegate.h" + +int main(int argc, char *argv[]) { + @autoreleasepool { + return UIApplicationMain(argc, argv, nil, NSStringFromClass([DemoAppDelegate class])); + } +} diff --git a/Pods/GoogleMaps/Example/Podfile b/Pods/GoogleMaps/Example/Podfile new file mode 100755 index 0000000..d9eb236 --- /dev/null +++ b/Pods/GoogleMaps/Example/Podfile @@ -0,0 +1,6 @@ +source 'https://github.com/CocoaPods/Specs.git' + +target 'GoogleMapsDemos' do + platform :ios, '9.0' + pod 'GoogleMaps', '= 3.8.0' +end diff --git a/Pods/GoogleMaps/Example/README.GoogleMapsDemos b/Pods/GoogleMaps/Example/README.GoogleMapsDemos new file mode 100755 index 0000000..96171d4 --- /dev/null +++ b/Pods/GoogleMaps/Example/README.GoogleMapsDemos @@ -0,0 +1,21 @@ +GoogleMapsDemos contains a demo application showcasing various features of +the Google Maps SDK for iOS. + +Before starting, please note that these demos are directed towards a technical +audience. You'll also need Xcode 9.0 or later, with the iOS SDK 9.3 or later. + +If you're new to the SDK, please read the Introduction section of the Google +Maps SDK for iOS documentation- + https://developers.google.com/maps/documentation/ios + +Once you've read the Introduction page, follow the first couple of steps on the +"Getting Started" page. Specifically; + + * Obtain an API key for the demo application, and specify the bundle ID of + this demo application as an an 'allowed iOS app'. By default, the bundle ID + is "com.example.GoogleMapsDemos". + + * Open the project in Xcode, and update `SDKDemoAPIKey.h` with this key. + +If you'd like to add a new sample, add a new subclass of `ViewController` and +add it to the samples definitions inside the `Samples.m`. diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/GoogleMaps b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/GoogleMaps new file mode 100755 index 0000000..7f9572b Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/GoogleMaps differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSAddress.h b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSAddress.h new file mode 100755 index 0000000..0540507 --- /dev/null +++ b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSAddress.h @@ -0,0 +1,75 @@ +// +// GMSAddress.h +// Google Maps SDK for iOS +// +// Copyright 2014 Google LLC +// +// Usage of this SDK is subject to the Google Maps/Google Earth APIs Terms of +// Service: https://developers.google.com/maps/terms +// + +#import + +#if __has_feature(modules) +@import GoogleMapsBase; +#else +#import +#endif + +NS_ASSUME_NONNULL_BEGIN + +/** + * A result from a reverse geocode request, containing a human-readable address. This class is + * immutable and should be obtained via GMSGeocoder. + * + * Some of the fields may be nil, indicating they are not present. + */ +@interface GMSAddress : NSObject + +/** Location, or kLocationCoordinate2DInvalid if unknown. */ +@property(nonatomic, readonly) CLLocationCoordinate2D coordinate; + +/** Street number and name. */ +@property(nonatomic, copy, readonly, nullable) NSString *thoroughfare; + +/** Locality or city. */ +@property(nonatomic, copy, readonly, nullable) NSString *locality; + +/** Subdivision of locality, district or park. */ +@property(nonatomic, copy, readonly, nullable) NSString *subLocality; + +/** Region/State/Administrative area. */ +@property(nonatomic, copy, readonly, nullable) NSString *administrativeArea; + +/** Postal/Zip code. */ +@property(nonatomic, copy, readonly, nullable) NSString *postalCode; + +/** The country name. */ +@property(nonatomic, copy, readonly, nullable) NSString *country; + +/** An array of NSString containing formatted lines of the address. May be nil. */ +@property(nonatomic, copy, readonly, nullable) NSArray *lines; + +/** + * Returns the first line of the address. + */ +- (nullable NSString *)addressLine1 __GMS_AVAILABLE_BUT_DEPRECATED_MSG( + "This method is obsolete and will be removed in a future release. Use the lines property " + "instead."); + +/** + * Returns the second line of the address. + */ +- (nullable NSString *)addressLine2 __GMS_AVAILABLE_BUT_DEPRECATED_MSG( + "This method is obsolete and will be removed in a future release. Use the lines property " + "instead."); + +@end + +/** + * The former type of geocode results (pre-1.7). This remains here for migration and will be + * removed in future releases. + */ +@compatibility_alias GMSReverseGeocodeResult GMSAddress; + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSCALayer.h b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSCALayer.h new file mode 100755 index 0000000..2ab6da2 --- /dev/null +++ b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSCALayer.h @@ -0,0 +1,20 @@ +// +// GMSCALayer.h +// Google Maps SDK for iOS +// +// Copyright 2013 Google LLC +// +// Usage of this SDK is subject to the Google Maps/Google Earth APIs Terms of +// Service: https://developers.google.com/maps/terms +// + +#import + +/** + * GMSCALayer is a superclass used by layers in the Google Maps SDK for iOS, such as GMSMapLayer and + * GMSPanoramaLayer. + * + * This is an implementation detail and it should not be instantiated directly. + */ +@interface GMSCALayer : CALayer +@end diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSCameraPosition.h b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSCameraPosition.h new file mode 100755 index 0000000..77a1d85 --- /dev/null +++ b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSCameraPosition.h @@ -0,0 +1,166 @@ +// +// GMSCameraPosition.h +// Google Maps SDK for iOS +// +// Copyright 2013 Google LLC +// +// Usage of this SDK is subject to the Google Maps/Google Earth APIs Terms of +// Service: https://developers.google.com/maps/terms +// + +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +/** +* An immutable class that aggregates all camera position parameters. + */ +@interface GMSCameraPosition : NSObject + +/** + * Location on the Earth towards which the camera points. + */ +@property(nonatomic, readonly) CLLocationCoordinate2D target; + +/** + * Zoom level. Zoom uses an exponentional scale, where zoom 0 represents the entire world as a + * 256 x 256 square. Each successive zoom level increases magnification by a factor of 2. So at + * zoom level 1, the world is 512x512, and at zoom level 2, the entire world is 1024x1024. + */ +@property(nonatomic, readonly) float zoom; + +/** + * Bearing of the camera, in degrees clockwise from true north. + */ +@property(nonatomic, readonly) CLLocationDirection bearing; + +/** + * The angle, in degrees, of the camera from the nadir (directly facing the Earth). 0 is + * straight down, 90 is parallel to the ground. Note that the maximum angle allowed is dependent + * on the zoom. You can think of it as a series of line segments as a function of zoom, rather + * than a step function. For zoom 16 and above, the maximum angle is 65 degrees. For zoom 10 and + * below, the maximum angle is 30 degrees. + */ +@property(nonatomic, readonly) double viewingAngle; + +/** + * Designated initializer. Configures this GMSCameraPosition with all available camera properties. + * Building a GMSCameraPosition via this initializer (or by the following convenience constructors) + * will implicitly clamp camera values. + * + * @param target Location on the earth towards which the camera points. + * @param zoom The zoom level near the center of the screen. + * @param bearing Bearing of the camera in degrees clockwise from true north. + * @param viewingAngle The angle, in degrees, of the camera angle from the nadir (directly facing + * the Earth) + */ +- (instancetype)initWithTarget:(CLLocationCoordinate2D)target + zoom:(float)zoom + bearing:(CLLocationDirection)bearing + viewingAngle:(double)viewingAngle; + +/** + * Convenience initializer for GMSCameraPosition for a particular target and zoom level. This will + * set the bearing and viewingAngle properties of this camera to zero defaults (i.e., directly + * facing the Earth's surface, with the top of the screen pointing north). + * + * @param target Location on the earth towards which the camera points. + * @param zoom The zoom level near the center of the screen. + */ +- (instancetype)initWithTarget:(CLLocationCoordinate2D)target zoom:(float)zoom; + +/** + * Convenience initializer for GMSCameraPosition for a particular latitidue, longitude and zoom + * level. This will set the bearing and viewingAngle properties of this camera to zero defaults + * (i.e., directly facing the Earth's surface, with the top of the screen pointing north). + * + * @param latitude The latitude component of the location towards which the camera points. + * @param longitude The latitude component of the location towards which the camera points. + * @param zoom The zoom level near the center of the screen. + */ +- (instancetype)initWithLatitude:(CLLocationDegrees)latitude + longitude:(CLLocationDegrees)longitude + zoom:(float)zoom; + +/** + * Convenience initializer for GMSCameraPosition, with latitude/longitude and all other camera + * properties as per -initWithTarget:zoom:bearing:viewingAngle:. + * + * @param latitude The latitude component of the location towards which the camera points. + * @param longitude The latitude component of the location towards which the camera points. + * @param zoom The zoom level near the center of the screen. + * @param bearing Bearing of the camera in degrees clockwise from true north. + * @param viewingAngle The angle, in degrees, of the camera angle from the nadir (directly facing + * the Earth) + */ +- (instancetype)initWithLatitude:(CLLocationDegrees)latitude + longitude:(CLLocationDegrees)longitude + zoom:(float)zoom + bearing:(CLLocationDirection)bearing + viewingAngle:(double)viewingAngle; + +/** + * Convenience constructor for GMSCameraPosition for a particular target and zoom level. This will + * set the bearing and viewingAngle properties of this camera to zero defaults (i.e., directly + * facing the Earth's surface, with the top of the screen pointing north). + */ ++ (instancetype)cameraWithTarget:(CLLocationCoordinate2D)target zoom:(float)zoom; + +/** + * Convenience constructor for GMSCameraPosition, as per cameraWithTarget:zoom:. + */ ++ (instancetype)cameraWithLatitude:(CLLocationDegrees)latitude + longitude:(CLLocationDegrees)longitude + zoom:(float)zoom; + +/** + * Convenience constructor for GMSCameraPosition, with all camera properties as per + * initWithTarget:zoom:bearing:viewingAngle:. + */ ++ (instancetype)cameraWithTarget:(CLLocationCoordinate2D)target + zoom:(float)zoom + bearing:(CLLocationDirection)bearing + viewingAngle:(double)viewingAngle; + +/** + * Convenience constructor for GMSCameraPosition, with latitude/longitude and all other camera + * properties as per initWithTarget:zoom:bearing:viewingAngle:. + */ ++ (instancetype)cameraWithLatitude:(CLLocationDegrees)latitude + longitude:(CLLocationDegrees)longitude + zoom:(float)zoom + bearing:(CLLocationDirection)bearing + viewingAngle:(double)viewingAngle; + +/** + * Get the zoom level at which |meters| distance, at given |coord| on Earth, correspond to the + * specified number of screen |points|. + * + * For extremely large or small distances the returned zoom level may be smaller or larger than the + * minimum or maximum zoom level allowed on the camera. + * + * This helper method is useful for building camera positions that contain specific physical areas + * on Earth. + */ ++ (float)zoomAtCoordinate:(CLLocationCoordinate2D)coordinate + forMeters:(CLLocationDistance)meters + perPoints:(CGFloat)points; + +@end + +/** Mutable version of GMSCameraPosition. */ +@interface GMSMutableCameraPosition : GMSCameraPosition +@property(nonatomic) CLLocationCoordinate2D target; +@property(nonatomic) float zoom; +@property(nonatomic) CLLocationDirection bearing; +@property(nonatomic) double viewingAngle; +@end + +/** The maximum zoom (closest to the Earth's surface) permitted by the map camera. */ +FOUNDATION_EXTERN const float kGMSMaxZoomLevel; + +/** The minimum zoom (farthest from the Earth's surface) permitted by the map camera. */ +FOUNDATION_EXTERN const float kGMSMinZoomLevel; + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSCameraUpdate.h b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSCameraUpdate.h new file mode 100755 index 0000000..3996d01 --- /dev/null +++ b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSCameraUpdate.h @@ -0,0 +1,109 @@ +// +// GMSCameraUpdate.h +// Google Maps SDK for iOS +// +// Copyright 2013 Google LLC +// +// Usage of this SDK is subject to the Google Maps/Google Earth APIs Terms of +// Service: https://developers.google.com/maps/terms +// + +#import +#import + +@class GMSCameraPosition; +@class GMSCoordinateBounds; + +NS_ASSUME_NONNULL_BEGIN + +/** + * GMSCameraUpdate represents an update that may be applied to a GMSMapView. + * + * It encapsulates some logic for modifying the current camera. + * + * It should only be constructed using the factory helper methods below. + */ +@interface GMSCameraUpdate : NSObject + +/** + * Returns a GMSCameraUpdate that zooms in on the map. + * + * The zoom increment is 1.0. + */ ++ (GMSCameraUpdate *)zoomIn; + +/** + * Returns a GMSCameraUpdate that zooms out on the map. + * + * The zoom increment is -1.0. + */ ++ (GMSCameraUpdate *)zoomOut; + +/** + * Returns a GMSCameraUpdate that changes the zoom by the specified amount. + */ ++ (GMSCameraUpdate *)zoomBy:(float)delta; + +/** + * Returns a GMSCameraUpdate that sets the zoom to the specified amount. + */ ++ (GMSCameraUpdate *)zoomTo:(float)zoom; + +/** + * Returns a GMSCameraUpdate that sets the camera target to the specified coordinate. + */ ++ (GMSCameraUpdate *)setTarget:(CLLocationCoordinate2D)target; + +/** + * Returns a GMSCameraUpdate that sets the camera target and zoom to the specified values. + */ ++ (GMSCameraUpdate *)setTarget:(CLLocationCoordinate2D)target zoom:(float)zoom; + +/** + * Returns a GMSCameraUpdate that sets the camera to the specified GMSCameraPosition. + */ ++ (GMSCameraUpdate *)setCamera:(GMSCameraPosition *)camera; + +/** + * Returns a GMSCameraUpdate that transforms the camera such that the specified bounds are centered + * on screen at the greatest possible zoom level. The bounds will have a default padding of 64 + * points. + * + * The returned camera update will set the camera's bearing and tilt to their default zero values + * (i.e., facing north and looking directly at the Earth). + */ ++ (GMSCameraUpdate *)fitBounds:(GMSCoordinateBounds *)bounds; + +/** + * This is similar to fitBounds: but allows specifying the padding (in points) in order to inset the + * bounding box from the view's edges. + * + * If the requested |padding| is larger than the view size in either the vertical or horizontal + * direction the map will be maximally zoomed out. + */ ++ (GMSCameraUpdate *)fitBounds:(GMSCoordinateBounds *)bounds withPadding:(CGFloat)padding; + +/** + * This is similar to fitBounds: but allows specifying edge insets in order to inset the bounding + * box from the view's edges. + * + * If the requested |edgeInsets| are larger than the view size in either the vertical or horizontal + * direction the map will be maximally zoomed out. + */ ++ (GMSCameraUpdate *)fitBounds:(GMSCoordinateBounds *)bounds + withEdgeInsets:(UIEdgeInsets)edgeInsets; + +/** + * Returns a GMSCameraUpdate that shifts the center of the view by the specified number of points in + * the x and y directions. X grows to the right, Y grows down. + */ ++ (GMSCameraUpdate *)scrollByX:(CGFloat)dX Y:(CGFloat)dY; + +/** + * Returns a GMSCameraUpdate that zooms with a focus point; the focus point stays fixed on screen. + */ ++ (GMSCameraUpdate *)zoomBy:(float)zoom atPoint:(CGPoint)point; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSCircle.h b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSCircle.h new file mode 100755 index 0000000..d1995e1 --- /dev/null +++ b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSCircle.h @@ -0,0 +1,54 @@ +// +// GMSCircle.h +// Google Maps SDK for iOS +// +// Copyright 2013 Google LLC +// +// Usage of this SDK is subject to the Google Maps/Google Earth APIs Terms of +// Service: https://developers.google.com/maps/terms +// + +#import + +#import "GMSOverlay.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + * A circle on the Earth's surface (spherical cap). + */ +@interface GMSCircle : GMSOverlay + +/** Position on Earth of circle center. */ +@property(nonatomic) CLLocationCoordinate2D position; + +/** Radius of the circle in meters; must be positive. */ +@property(nonatomic) CLLocationDistance radius; + +/** + * The width of the circle's outline in screen points. Defaults to 1. As per GMSPolygon, the width + * does not scale when the map is zoomed. + * + * Setting strokeWidth to 0 results in no stroke. + */ +@property(nonatomic) CGFloat strokeWidth; + +/** The color of this circle's outline. The default value is black. */ +@property(nonatomic, nullable) UIColor *strokeColor; + +/** + * The interior of the circle is painted with fillColor. The default value is nil, resulting in no + * fill. + */ +@property(nonatomic, nullable) UIColor *fillColor; + +/** + * Convenience constructor for GMSCircle for a particular position and radius. Other properties will + * have default values. + */ ++ (instancetype)circleWithPosition:(CLLocationCoordinate2D)position + radius:(CLLocationDistance)radius; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSCoordinateBounds+GoogleMaps.h b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSCoordinateBounds+GoogleMaps.h new file mode 100755 index 0000000..18f543f --- /dev/null +++ b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSCoordinateBounds+GoogleMaps.h @@ -0,0 +1,42 @@ +// +// GMSCoordinateBounds+GoogleMaps.h +// Google Maps SDK for iOS +// +// Copyright 2013 Google LLC +// +// Usage of this SDK is subject to the Google Maps/Google Earth APIs Terms of +// Service: https://developers.google.com/maps/terms +// + + +#if __has_feature(modules) +@import GoogleMapsBase; +#else +#import +#endif +#import "GMSProjection.h" + +@class GMSPath; + +NS_ASSUME_NONNULL_BEGIN + +@interface GMSCoordinateBounds (GoogleMaps) + +/** + * Inits with bounds that encompass |region|. + */ +- (id)initWithRegion:(GMSVisibleRegion)region; + +/** + * Inits with bounds that encompass |path|. + */ +- (id)initWithPath:(GMSPath *)path; + +/** + * Returns a GMSCoordinateBounds representing the current bounds extended to include |path|. + */ +- (GMSCoordinateBounds *)includingPath:(GMSPath *)path; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSGeocoder.h b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSGeocoder.h new file mode 100755 index 0000000..c05b312 --- /dev/null +++ b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSGeocoder.h @@ -0,0 +1,74 @@ +// +// GMSGeocoder.h +// Google Maps SDK for iOS +// +// Copyright 2012 Google LLC +// +// Usage of this SDK is subject to the Google Maps/Google Earth APIs Terms of +// Service: https://developers.google.com/maps/terms +// + +#import + +#import "GMSAddress.h" + +@class GMSReverseGeocodeResponse; + +NS_ASSUME_NONNULL_BEGIN + +/** + * \defgroup GeocoderErrorCode GMSGeocoderErrorCode + * @{ + */ + +/** + * GMSGeocoder error codes, embedded in NSError. + */ +typedef NS_ENUM(NSInteger, GMSGeocoderErrorCode) { + kGMSGeocoderErrorInvalidCoordinate = 1, + kGMSGeocoderErrorInternal, +}; + +/**@}*/ + +/** + * Handler that reports a reverse geocoding response, or error. + * + * @related GMSGeocoder + */ +typedef void (^GMSReverseGeocodeCallback)(GMSReverseGeocodeResponse *_Nullable, + NSError *_Nullable); + +/** + * Exposes a service for reverse geocoding. This maps Earth coordinates (latitude and longitude) to + * a collection of addresses near that coordinate. + */ +@interface GMSGeocoder : NSObject + +/* Convenience constructor for GMSGeocoder. */ ++ (GMSGeocoder *)geocoder; + +/** + * Reverse geocodes a coordinate on the Earth's surface. + * + * @param coordinate The coordinate to reverse geocode. + * @param handler The callback to invoke with the reverse geocode results. + * The callback will be invoked asynchronously from the main thread. + */ +- (void)reverseGeocodeCoordinate:(CLLocationCoordinate2D)coordinate + completionHandler:(GMSReverseGeocodeCallback)handler; + +@end + +/** A collection of results from a reverse geocode request. */ +@interface GMSReverseGeocodeResponse : NSObject + +/** Returns the first result, or nil if no results were available. */ +- (nullable GMSAddress *)firstResult; + +/** Returns an array of all the results (contains GMSAddress), including the first result. */ +- (nullable NSArray *)results; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSGeometryUtils.h b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSGeometryUtils.h new file mode 100755 index 0000000..fc335c4 --- /dev/null +++ b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSGeometryUtils.h @@ -0,0 +1,243 @@ +// +// GMSGeometryUtils.h +// Google Maps SDK for iOS +// +// Copyright 2013 Google LLC +// +// Usage of this SDK is subject to the Google Maps/Google Earth APIs Terms of +// Service: https://developers.google.com/maps/terms +// + +/** + * \defgroup GeometryUtils GMSGeometryUtils + * @{ + */ + +#import + +#import "GMSPath.h" + +@class GMSPath; +@class GMSStrokeStyle; +@class GMSStyleSpan; + +NS_ASSUME_NONNULL_BEGIN + +/** Average Earth radius in meters. */ +static const CLLocationDistance kGMSEarthRadius = 6371009.0; + +/** + * A point on the map. May represent a projected coordinate. + * + * x is in [-1, 1]. The axis direction is normal: y grows towards North, x grows towards East. (0, + * 0) is the center of the map. + * + * See GMSProject() and GMSUnproject(). + */ +typedef struct GMSMapPoint { + double x; + double y; +} GMSMapPoint; + +/** Projects |coordinate| to the map. |coordinate| must be valid. */ +FOUNDATION_EXPORT +GMSMapPoint GMSProject(CLLocationCoordinate2D coordinate); + +/** Unprojects |point| from the map. point.x must be in [-1, 1]. */ +FOUNDATION_EXPORT +CLLocationCoordinate2D GMSUnproject(GMSMapPoint point); + +/** + * Returns a linearly interpolated point on the segment [a, b], at the fraction |t| from |a|. |t|==0 + * corresponds to |a|, |t|==1 corresponds to |b|. + * + * The interpolation takes place along the short path between the points potentially crossing the + * date line. E.g. interpolating from San Francisco to Tokyo will pass north of Hawaii and cross the + * date line. + */ +FOUNDATION_EXPORT +GMSMapPoint GMSMapPointInterpolate(GMSMapPoint a, GMSMapPoint b, double t); + +/** + * Returns the length of the segment [a, b] in projected space. + * + * The length is computed along the short path between the points potentially crossing the date + * line. E.g. the distance between the points corresponding to San Francisco and Tokyo measures the + * segment that passes north of Hawaii crossing the date line. + */ +FOUNDATION_EXPORT +double GMSMapPointDistance(GMSMapPoint a, GMSMapPoint b); + +/** + * Returns whether |point| lies inside of path. The path is always considered closed, regardless of + * whether the last point equals the first or not. + * + * Inside is defined as not containing the South Pole -- the South Pole is always outside. + * + * |path| describes great circle segments if |geodesic| is YES, and rhumb (loxodromic) segments + * otherwise. + * + * If |point| is exactly equal to one of the vertices, the result is YES. A point that is not equal + * to a vertex is on one side or the other of any path segment -- it can never be "exactly on the + * border". + * + * See GMSGeometryIsLocationOnPath() for a border test with tolerance. + */ +FOUNDATION_EXPORT +BOOL GMSGeometryContainsLocation(CLLocationCoordinate2D point, GMSPath *path, BOOL geodesic); + +/** + * Returns whether |point| lies on or near |path|, within the specified |tolerance| in meters. + * |path| is composed of great circle segments if |geodesic| is YES, and of rhumb (loxodromic) + * segments if |geodesic| is NO. + * + * See also GMSGeometryIsLocationOnPath(point, path, geodesic). + * + * The tolerance, in meters, is relative to the spherical radius of the Earth. If you need to work + * on a sphere of different radius, you may compute the equivalent tolerance from the desired + * tolerance on the sphere of radius R: tolerance = toleranceR * (RadiusEarth / R), with + * RadiusEarth==6371009. + */ +FOUNDATION_EXPORT +BOOL GMSGeometryIsLocationOnPathTolerance(CLLocationCoordinate2D point, + GMSPath *path, + BOOL geodesic, + CLLocationDistance tolerance); + +/** + * Same as GMSGeometryIsLocationOnPath(point, path, geodesic, tolerance), with a default tolerance + * of 0.1 meters. + */ +FOUNDATION_EXPORT +BOOL GMSGeometryIsLocationOnPath(CLLocationCoordinate2D point, GMSPath *path, BOOL geodesic); + +/** + * Returns the great circle distance between two coordinates, in meters, on Earth. + * + * This is the shortest distance between the two coordinates on the sphere. + * + * Both coordinates must be valid. + */ +FOUNDATION_EXPORT +CLLocationDistance GMSGeometryDistance(CLLocationCoordinate2D from, CLLocationCoordinate2D to); + +/** + * Returns the great circle length of |path|, in meters, on Earth. + * + * This is the sum of GMSGeometryDistance() over the path segments. + * + * All the coordinates of the path must be valid. + */ +FOUNDATION_EXPORT +CLLocationDistance GMSGeometryLength(GMSPath *path); + +/** + * Returns the area of a geodesic polygon defined by |path| on Earth. + * + * The "inside" of the polygon is defined as not containing the South pole. + * + * If |path| is not closed, it is implicitly treated as a closed path nevertheless and the result is + * the same. + * + * All coordinates of the path must be valid. + * + * The polygon must be simple (not self-overlapping) and may be concave. + * + * If any segment of the path is a pair of antipodal points, the result is undefined -- because two + * antipodal points do not form a unique great circle segment on the sphere. + */ +FOUNDATION_EXPORT +double GMSGeometryArea(GMSPath *path); + +/** + * Returns the signed area of a geodesic polygon defined by |path| on Earth. + * + * The result has the same absolute value as GMSGeometryArea(); it is positive if the points of path + * are in counter-clockwise order, and negative otherwise. + * + * The same restrictions as on GMSGeometryArea() apply. + */ +FOUNDATION_EXPORT +double GMSGeometrySignedArea(GMSPath *path); + +/** + * Returns the initial heading (degrees clockwise of North) at |from| of the shortest path to |to|. + * + * The returned value is in the range [0, 360). + * + * Returns 0 if the two coordinates are the same. + * + * Both coordinates must be valid. + * + * To get the final heading at |to| one may use (GMSGeometryHeading(|to|, |from|) + 180) modulo 360. + */ +FOUNDATION_EXPORT +CLLocationDirection GMSGeometryHeading(CLLocationCoordinate2D from, CLLocationCoordinate2D to); + +/** + * Returns the destination coordinate, when starting at |from| with initial |heading|, travelling + * |distance| meters along a great circle arc, on Earth. + * + * The resulting longitude is in the range [-180, 180). + * + * Both coordinates must be valid. + */ +FOUNDATION_EXPORT +CLLocationCoordinate2D GMSGeometryOffset(CLLocationCoordinate2D from, + CLLocationDistance distance, + CLLocationDirection heading); + +/** + * Returns the coordinate that lies the given |fraction| of the way between the |from| and |to| + * coordinates on the shortest path between the two. + * + * The resulting longitude is in the range [-180, 180). + */ +FOUNDATION_EXPORT +CLLocationCoordinate2D GMSGeometryInterpolate(CLLocationCoordinate2D from, + CLLocationCoordinate2D to, + double fraction); + +/** + * Returns an NSArray of GMSStyleSpan constructed by repeated application of style and length + * information from |styles| and |lengths| along |path|. + * + * |path| the path along which the output spans are computed. + * |styles| an NSArray of GMSStrokeStyle. Wraps if consumed. Can't be empty. + * |lengths| an NSArray of NSNumber; each entry gives the length of the corresponding + * style from |styles|. Wraps if consumed. Can't be empty. + * |lengthKind| the interpretation of values from |lengths| (geodesic, rhumb or projected). + * + * Example: a polyline with alternating black and white spans: + * + *
+ * GMSMutablePath *path;
+ * NSArray *styles = @[[GMSStrokeStyle solidColor:[UIColor whiteColor]],
+ *                     [GMSStrokeStyle solidColor:[UIColor blackColor]]];
+ * NSArray *lengths = @[@100000, @50000];
+ * polyline.path = path;
+ * polyline.spans = GMSStyleSpans(path, styles, lengths, kGMSLengthRhumb);
+ * 
+ */ +FOUNDATION_EXPORT +NSArray *GMSStyleSpans(GMSPath *path, + NSArray *styles, + NSArray *lengths, + GMSLengthKind lengthKind); + +/** + * Similar to GMSStyleSpans(path, styles, lengths, lengthKind) but additionally takes an initial + * length offset that will be skipped over relative to the |lengths| array. + * + * |lengthOffset| the length (e.g. in meters) that should be skipped initially from |lengths|. + */ +FOUNDATION_EXPORT +NSArray *GMSStyleSpansOffset(GMSPath *path, + NSArray *styles, + NSArray *lengths, + GMSLengthKind lengthKind, + double lengthOffset); + +/**@}*/ + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSGroundOverlay.h b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSGroundOverlay.h new file mode 100755 index 0000000..a3a8304 --- /dev/null +++ b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSGroundOverlay.h @@ -0,0 +1,85 @@ +// +// GMSGroundOverlay.h +// Google Maps SDK for iOS +// +// Copyright 2013 Google LLC +// +// Usage of this SDK is subject to the Google Maps/Google Earth APIs Terms of +// Service: https://developers.google.com/maps/terms +// + +#import + +#import "GMSOverlay.h" + +@class GMSCoordinateBounds; + +NS_ASSUME_NONNULL_BEGIN + +/** + * GMSGroundOverlay specifies the available options for a ground overlay that exists on the Earth's + * surface. Unlike a marker, the position of a ground overlay is specified explicitly and it does + * not face the camera. + */ +@interface GMSGroundOverlay : GMSOverlay + +/** + * The position of this GMSGroundOverlay, or more specifically, the physical position of its anchor. + * If this is changed, |bounds| will be moved around the new position. + */ +@property(nonatomic) CLLocationCoordinate2D position; + +/** + * The anchor specifies where this GMSGroundOverlay is anchored to the Earth in relation to + * |bounds|. If this is modified, |position| will be set to the corresponding new position within + * |bounds|. + */ +@property(nonatomic) CGPoint anchor; + +/** + * Icon to render within |bounds| on the Earth. If this is nil, the overlay will not be visible + * (unlike GMSMarker which has a default image). + */ +@property(nonatomic, nullable) UIImage *icon; + +/** + * Sets the opacity of the ground overlay, between 0 (completely transparent) and 1 (default) + * inclusive. + */ +@property(nonatomic) float opacity; + +/** + * Bearing of this ground overlay, in degrees. The default value, zero, points this ground overlay + * up/down along the normal Y axis of the earth. + */ +@property(nonatomic) CLLocationDirection bearing; + +/** + * The 2D bounds on the Earth in which |icon| is drawn. Changing this value will adjust |position| + * accordingly. + */ +@property(nonatomic, nullable) GMSCoordinateBounds *bounds; + +/** + * Convenience constructor for GMSGroundOverlay for a particular |bounds| and |icon|. Will set + * |position| accordingly. + */ ++ (instancetype)groundOverlayWithBounds:(nullable GMSCoordinateBounds *)bounds + icon:(nullable UIImage *)icon; + +/** + * Constructs a GMSGroundOverlay that renders the given |icon| at |position|, as if the image's + * actual size matches camera pixels at |zoomLevel|. + */ ++ (instancetype)groundOverlayWithPosition:(CLLocationCoordinate2D)position + icon:(nullable UIImage *)icon + zoomLevel:(CGFloat)zoomLevel; + +@end + +/** + * The default position of the ground anchor of a GMSGroundOverlay: the center point of the icon. + */ +FOUNDATION_EXTERN const CGPoint kGMSGroundOverlayDefaultAnchor; + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSIndoorBuilding.h b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSIndoorBuilding.h new file mode 100755 index 0000000..cfe70c2 --- /dev/null +++ b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSIndoorBuilding.h @@ -0,0 +1,43 @@ +// +// GMSIndoorBuilding.h +// Google Maps SDK for iOS +// +// Copyright 2013 Google Inc. +// +// Usage of this SDK is subject to the Google Maps/Google Earth APIs Terms of +// Service: https://developers.google.com/maps/terms +// + + +#import + +@class GMSIndoorLevel; + +NS_ASSUME_NONNULL_BEGIN + +/** + * Describes a building which contains levels. + */ +@interface GMSIndoorBuilding : NSObject + +/** + * Array of GMSIndoorLevel describing the levels which make up the building. + * The levels are in 'display order' from top to bottom. + */ +@property(nonatomic, strong, readonly) NSArray *levels; + +/** + * Index in the levels array of the default level. + */ +@property(nonatomic, assign, readonly) NSUInteger defaultLevelIndex; + +/** + * If YES, the building is entirely underground and supports being hidden. + */ +@property(nonatomic, assign, readonly, getter=isUnderground) BOOL underground; + +- (instancetype)init NS_UNAVAILABLE; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSIndoorDisplay.h b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSIndoorDisplay.h new file mode 100755 index 0000000..a703838 --- /dev/null +++ b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSIndoorDisplay.h @@ -0,0 +1,66 @@ +// +// GMSIndoorDisplay.h +// Google Maps SDK for iOS +// +// Copyright 2013 Google LLC +// +// Usage of this SDK is subject to the Google Maps/Google Earth APIs Terms of +// Service: https://developers.google.com/maps/terms +// + +#import + +@class GMSIndoorBuilding; +@class GMSIndoorLevel; + +NS_ASSUME_NONNULL_BEGIN + +/** Delegate for events on GMSIndoorDisplay. */ +@protocol GMSIndoorDisplayDelegate +@optional + +/** + * Raised when the activeBuilding has changed. The activeLevel will also have already been updated + * for the new building, but didChangeActiveLevel: will be raised after this method. + */ +- (void)didChangeActiveBuilding:(nullable GMSIndoorBuilding *)building; + +/** + * Raised when the activeLevel has changed. This event is raised for all changes, including + * explicit setting of the property. + */ +- (void)didChangeActiveLevel:(nullable GMSIndoorLevel *)level; + +@end + +/** + * Provides ability to observe or control the display of indoor level data. + * + * Like GMSMapView, GMSIndoorDisplay may only be used from the main thread. + */ +@interface GMSIndoorDisplay : NSObject + +/** GMSIndoorDisplay delegate */ +@property(nonatomic, weak, nullable) id delegate; + +/** + * Provides the currently focused building, will be nil if there is no building with indoor data + * currently under focus. + */ +@property(nonatomic, readonly, nullable) GMSIndoorBuilding *activeBuilding; + +/** + * Provides and controls the active level for activeBuilding. Will be updated whenever + * activeBuilding changes, and may be set to any member of activeBuilding's levels property. May + * also be set to nil if the building is underground, to stop showing the building (the building + * will remain active). + * + * Will always be nil if activeBuilding is nil. + * + * Any attempt to set it to an invalid value will be ignored. + */ +@property(nonatomic, nullable) GMSIndoorLevel *activeLevel; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSIndoorLevel.h b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSIndoorLevel.h new file mode 100755 index 0000000..0604ccb --- /dev/null +++ b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSIndoorLevel.h @@ -0,0 +1,32 @@ +// +// GMSIndoorLevel.h +// Google Maps SDK for iOS +// +// Copyright 2013 Google Inc. +// +// Usage of this SDK is subject to the Google Maps/Google Earth APIs Terms of +// Service: https://developers.google.com/maps/terms +// +#import + +NS_ASSUME_NONNULL_BEGIN + +/** + * Describes a single level in a building. + * + * Multiple buildings can share a level - in this case the level instances will compare as equal, + * even though the level numbers/names may be different. + */ +@interface GMSIndoorLevel : NSObject + +- (instancetype)init NS_UNAVAILABLE; + +/** Localized display name for the level, e.g. "Ground floor". */ +@property(nonatomic, copy, readonly, nullable) NSString *name; + +/** Localized short display name for the level, e.g. "1". */ +@property(nonatomic, copy, readonly, nullable) NSString *shortName; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSMapLayer.h b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSMapLayer.h new file mode 100755 index 0000000..21a0c2f --- /dev/null +++ b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSMapLayer.h @@ -0,0 +1,110 @@ +// +// GMSMapLayer.h +// Google Maps SDK for iOS +// +// Copyright 2013 Google LLC +// +// Usage of this SDK is subject to the Google Maps/Google Earth APIs Terms of +// Service: https://developers.google.com/maps/terms +// + +#import +#import + +#import "GMSCALayer.h" + +NS_ASSUME_NONNULL_BEGIN + +/* + * The following layer properties and constants describe the camera properties that may be animated + * on the custom model layer of a GMSMapView with Core Animation. For simple camera control and + * animation, please see the helper methods in GMSMapView+Animation.h, and the camera object + * definition within GMSCameraPosition.h. + * + * Changing layer properties triggers an implicit animation, e.g.:- + * mapView_.layer.cameraBearing = 20; + * + * An explicit animation, replacing the implicit animation, may be added after changing the + * property, for example: + *
+ *   CAMediaTimingFunction *curve = [CAMediaTimingFunction functionWithName:
+ *                                   kCAMediaTimingFunctionEaseInEaseOut];
+ *   CABasicAnimation *animation =
+ *       [CABasicAnimation animationWithKeyPath:kGMSLayerCameraBearingKey];
+ *   animation.duration = 2.0f;
+ *   animation.timingFunction = curve;
+ *   animation.toValue = @20;
+ *   [mapView_.layer addAnimation:animation forKey:kGMSLayerCameraBearingKey];
+ * 
+ * + * To control several implicit animations, Core Animation's transaction support may be used, for + * example: + *
+ *   [CATransaction begin];
+ *   [CATransaction setAnimationDuration:2.0f];
+ *   mapView_.layer.cameraBearing = 20;
+ *   mapView_.layer.cameraViewingAngle = 30;
+ *   [CATransaction commit];
+ * 
+ * + * Note that these properties are not view-based. Please see "Animating View and Layer Changes + * Together" in the + * View Programming Guide for iOS. + */ + +/** + * kGMSLayerCameraLatitudeKey ranges from [-85, 85], and values outside this range will be clamped. + * + * @related GMSMapLayer + */ +extern NSString *const kGMSLayerCameraLatitudeKey; + +/** + * kGMSLayerCameraLongitudeKey ranges from [-180, 180), and values outside this range will be + * wrapped to within this range. + * + * @related GMSMapLayer + */ +extern NSString *const kGMSLayerCameraLongitudeKey; + +/** + * kGMSLayerCameraBearingKey ranges from [0, 360), and values are wrapped. + * + * @related GMSMapLayer + */ +extern NSString *const kGMSLayerCameraBearingKey; + +/** + * kGMSLayerCameraZoomLevelKey ranges from [kGMSMinZoomLevel, kGMSMaxZoomLevel], and values are + * clamped. + * + * @related GMSMapLayer + */ +extern NSString *const kGMSLayerCameraZoomLevelKey; + +/** + * kGMSLayerCameraViewingAngleKey ranges from zero (i.e., facing straight down) and to between 30 + * and 45 degrees towards the horizon, depending on the model zoom level. + * + * @related GMSMapLayer + */ +extern NSString *const kGMSLayerCameraViewingAngleKey; + +/** + * GMSMapLayer is a custom subclass of CALayer, provided as the layer class on GMSMapView. This + * layer should not be instantiated directly. It provides model access to the camera normally + * defined on GMSMapView. + * + * Modifying or animating these properties will typically interrupt any current gesture on + * GMSMapView, e.g., a user's pan or rotation. Similarly, if a user performs an enabled gesture + * during an animation, the animation will stop 'in-place' (at the current presentation value). + */ +@interface GMSMapLayer : GMSCALayer +@property(nonatomic) CLLocationDegrees cameraLatitude; +@property(nonatomic) CLLocationDegrees cameraLongitude; +@property(nonatomic) CLLocationDirection cameraBearing; +@property(nonatomic) float cameraZoomLevel; +@property(nonatomic) double cameraViewingAngle; +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSMapStyle.h b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSMapStyle.h new file mode 100755 index 0000000..6c1e4b7 --- /dev/null +++ b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSMapStyle.h @@ -0,0 +1,55 @@ +// +// GMSMapStyle.h +// Google Maps SDK for iOS +// +// Copyright 2016 Google LLC +// +// Usage of this SDK is subject to the Google Maps/Google Earth APIs Terms of +// Service: https://developers.google.com/maps/terms +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** + * GMSMapStyle holds details about a style which can be applied to a map. + * + * With style options you can customize the presentation of the standard Google map styles, changing + * the visual display of features like roads, parks, and other points of interest. As well as + * changing the style of these features, you can also hide features entirely. This means that you + * can emphasize particular components of the map or make the map complement the content of your + * app. + * + * For more information see: https://developers.google.com/maps/documentation/ios-sdk/styling + */ +@interface GMSMapStyle : NSObject + +/** + * Creates a style using a string containing JSON. + * + * Returns nil and populates |error| (if provided) if |style| is invalid. + */ ++ (nullable instancetype)styleWithJSONString:(NSString *)style + error:(NSError *__autoreleasing _Nullable *)error; + +/** + * Creates a style using a file containing JSON. + * + * Returns nil and populates |error| (if provided) if |style| is invalid, the file cannot be read, + * or the URL is not a file URL. + */ ++ (nullable instancetype)styleWithContentsOfFileURL:(NSURL *)fileURL + error:(NSError *__autoreleasing _Nullable *)error; + +@end + +/** + * Calculates a hash value for the given string. + * @param string The string to use to calculate the hash value. + * @return The hash value. + * @note The current implementation uses an MD5 hash, which is sufficient for uniquifying styles. + */ +NSUInteger GMSStyleHashForString(NSString *string); + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSMapView+Animation.h b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSMapView+Animation.h new file mode 100755 index 0000000..41e5ff0 --- /dev/null +++ b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSMapView+Animation.h @@ -0,0 +1,61 @@ +// +// GMSMapView+Animation.h +// Google Maps SDK for iOS +// +// Copyright 2013 Google LLC +// +// Usage of this SDK is subject to the Google Maps/Google Earth APIs Terms of +// Service: https://developers.google.com/maps/terms +// + +#import "GMSMapView.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + * GMSMapView (Animation) offers several animation helper methods. + * + * During any animation, retrieving the camera position through the camera property on GMSMapView + * returns an intermediate immutable GMSCameraPosition. This camera position will typically + * represent the most recently drawn frame. + */ +@interface GMSMapView (Animation) + +/** Animates the camera of this map to |cameraPosition|. */ +- (void)animateToCameraPosition:(GMSCameraPosition *)cameraPosition; + +/** + * As animateToCameraPosition:, but changes only the location of the camera (i.e., from the current + * location to |location|). + */ +- (void)animateToLocation:(CLLocationCoordinate2D)location; + +/** + * As animateToCameraPosition:, but changes only the zoom level of the camera. + * + * This value is clamped by [kGMSMinZoomLevel, kGMSMaxZoomLevel]. + */ +- (void)animateToZoom:(float)zoom; + +/** + * As animateToCameraPosition:, but changes only the bearing of the camera (in degrees). Zero + * indicates true north. + */ +- (void)animateToBearing:(CLLocationDirection)bearing; + +/** + * As animateToCameraPosition:, but changes only the viewing angle of the camera (in degrees). This + * value will be clamped to a minimum of zero (i.e., facing straight down) and between 30 and 45 + * degrees towards the horizon, depending on the relative closeness to the earth. + */ +- (void)animateToViewingAngle:(double)viewingAngle; + +/** + * Applies |cameraUpdate| to the current camera, and then uses the result as per + * animateToCameraPosition:. + */ +- (void)animateWithCameraUpdate:(GMSCameraUpdate *)cameraUpdate; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSMapView.h b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSMapView.h new file mode 100755 index 0000000..8e223d5 --- /dev/null +++ b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSMapView.h @@ -0,0 +1,520 @@ +// +// GMSMapView.h +// Google Maps SDK for iOS +// +// Copyright 2012 Google LLC +// +// Usage of this SDK is subject to the Google Maps/Google Earth APIs Terms of +// Service: https://developers.google.com/maps/terms +// + +#import +#import + +#if __has_feature(modules) +@import GoogleMapsBase; +#else +#import +#endif +#if __has_feature(modules) +@import GoogleMapsBase; +#else +#import +#endif +#import "GMSMapLayer.h" +#import "GMSUISettings.h" + +@class GMSCameraPosition; +@class GMSCameraUpdate; +@class GMSCoordinateBounds; +@class GMSIndoorDisplay; +@class GMSMapLayer; +@class GMSMapStyle; +@class GMSMapView; +@class GMSMarker; +@class GMSOverlay; +@class GMSProjection; + +NS_ASSUME_NONNULL_BEGIN + +/** Delegate for events on GMSMapView. */ +@protocol GMSMapViewDelegate + +@optional + +/** + * Called before the camera on the map changes, either due to a gesture, animation (e.g., by a user + * tapping on the "My Location" button) or by being updated explicitly via the camera or a + * zero-length animation on layer. + * + * @param mapView The map view that was tapped. + * @param gesture If YES, this is occurring due to a user gesture. +*/ +- (void)mapView:(GMSMapView *)mapView willMove:(BOOL)gesture; + +/** + * Called repeatedly during any animations or gestures on the map (or once, if the camera is + * explicitly set). This may not be called for all intermediate camera positions. It is always + * called for the final position of an animation or gesture. + */ +- (void)mapView:(GMSMapView *)mapView didChangeCameraPosition:(GMSCameraPosition *)position; + +/** + * Called when the map becomes idle, after any outstanding gestures or animations have completed (or + * after the camera has been explicitly set). + */ +- (void)mapView:(GMSMapView *)mapView idleAtCameraPosition:(GMSCameraPosition *)position; + +/** + * Called after a tap gesture at a particular coordinate, but only if a marker was not tapped. This + * is called before deselecting any currently selected marker (the implicit action for tapping on + * the map). + */ +- (void)mapView:(GMSMapView *)mapView didTapAtCoordinate:(CLLocationCoordinate2D)coordinate; + +/** + * Called after a long-press gesture at a particular coordinate. + * + * @param mapView The map view that was tapped. + * @param coordinate The location that was tapped. + */ +- (void)mapView:(GMSMapView *)mapView didLongPressAtCoordinate:(CLLocationCoordinate2D)coordinate; + +/** + * Called after a marker has been tapped. + * + * @param mapView The map view that was tapped. + * @param marker The marker that was tapped. + * @return YES if this delegate handled the tap event, which prevents the map from performing its + * default selection behavior, and NO if the map should continue with its default selection + * behavior. + */ +- (BOOL)mapView:(GMSMapView *)mapView didTapMarker:(GMSMarker *)marker; + +/** + * Called after a marker's info window has been tapped. + */ +- (void)mapView:(GMSMapView *)mapView didTapInfoWindowOfMarker:(GMSMarker *)marker; + +/** + * Called after a marker's info window has been long pressed. + */ +- (void)mapView:(GMSMapView *)mapView didLongPressInfoWindowOfMarker:(GMSMarker *)marker; + +/** + * Called after an overlay has been tapped. + * + * This method is not called for taps on markers. + * + * @param mapView The map view that was tapped. + * @param overlay The overlay that was tapped. + */ +- (void)mapView:(GMSMapView *)mapView didTapOverlay:(GMSOverlay *)overlay; + +/** + * Called after a POI has been tapped. + * + * @param mapView The map view that was tapped. + * @param placeID The placeID of the POI that was tapped. + * @param name The name of the POI that was tapped. + * @param location The location of the POI that was tapped. + */ +- (void)mapView:(GMSMapView *)mapView + didTapPOIWithPlaceID:(NSString *)placeID + name:(NSString *)name + location:(CLLocationCoordinate2D)location; + +/** + * Called when a marker is about to become selected, and provides an optional custom info window to + * use for that marker if this method returns a UIView. + * + * If you change this view after this method is called, those changes will not necessarily be + * reflected in the rendered version. + * + * The returned UIView must not have bounds greater than 500 points on either dimension. As there + * is only one info window shown at any time, the returned view may be reused between other info + * windows. + * + * Removing the marker from the map or changing the map's selected marker during this call results + * in undefined behavior. + * + * @return The custom info window for the specified marker, or nil for default + */ +- (nullable UIView *)mapView:(GMSMapView *)mapView markerInfoWindow:(GMSMarker *)marker; + +/** + * Called when mapView:markerInfoWindow: returns nil. If this method returns a view, it will be + * placed within the default info window frame. If this method returns nil, then the default + * rendering will be used instead. + * + * @param mapView The map view that was pressed. + * @param marker The marker that was pressed. + * @return The custom view to display as contents in the info window, or nil to use the default + * content rendering instead + */ + +- (nullable UIView *)mapView:(GMSMapView *)mapView markerInfoContents:(GMSMarker *)marker; + +/** + * Called when the marker's info window is closed. + */ +- (void)mapView:(GMSMapView *)mapView didCloseInfoWindowOfMarker:(GMSMarker *)marker; + +/** + * Called when dragging has been initiated on a marker. + */ +- (void)mapView:(GMSMapView *)mapView didBeginDraggingMarker:(GMSMarker *)marker; + +/** + * Called after dragging of a marker ended. + */ +- (void)mapView:(GMSMapView *)mapView didEndDraggingMarker:(GMSMarker *)marker; + +/** + * Called while a marker is dragged. + */ +- (void)mapView:(GMSMapView *)mapView didDragMarker:(GMSMarker *)marker; + +/** + * Called when the My Location button is tapped. + * + * @return YES if the listener has consumed the event (i.e., the default behavior should not occur), + * NO otherwise (i.e., the default behavior should occur). The default behavior is for the + * camera to move such that it is centered on the user location. + */ +- (BOOL)didTapMyLocationButtonForMapView:(GMSMapView *)mapView; + +/** + * Called when the My Location Dot is tapped. + * + * @param mapView The map view that was tapped. + * @param location The location of the user when the location dot was tapped. + */ +- (void)mapView:(GMSMapView *)mapView didTapMyLocation:(CLLocationCoordinate2D)location; + +/** + * Called when tiles have just been requested or labels have just started rendering. + */ +- (void)mapViewDidStartTileRendering:(GMSMapView *)mapView; + +/** + * Called when all tiles have been loaded (or failed permanently) and labels have been rendered. + */ +- (void)mapViewDidFinishTileRendering:(GMSMapView *)mapView; + +/** + * Called when map is stable (tiles loaded, labels rendered, camera idle) and overlay objects have + * been rendered. + */ +- (void)mapViewSnapshotReady:(GMSMapView *)mapView; + +@end + +/** + * \defgroup MapViewType GMSMapViewType + * @{ + */ + +/** + * Display types for GMSMapView. + */ +typedef NS_ENUM(NSUInteger, GMSMapViewType) { + /** Basic maps. The default. */ + kGMSTypeNormal GMS_SWIFT_NAME_2_0_3_0(Normal, normal) = 1, + + /** Satellite maps with no labels. */ + kGMSTypeSatellite GMS_SWIFT_NAME_2_0_3_0(Satellite, satellite), + + /** Terrain maps. */ + kGMSTypeTerrain GMS_SWIFT_NAME_2_0_3_0(Terrain, terrain), + + /** Satellite maps with a transparent label overview. */ + kGMSTypeHybrid GMS_SWIFT_NAME_2_0_3_0(Hybrid, hybrid), + + /** No maps, no labels. Display of traffic data is not supported. */ + kGMSTypeNone GMS_SWIFT_NAME_2_0_3_0(None, none), + +}; + +/**@}*/ + +/** + * \defgroup FrameRate GMSFrameRate + * @{ + */ + +/** + * Rendering frame rates for GMSMapView. + */ +typedef NS_ENUM(NSUInteger, GMSFrameRate) { + /** Use the minimum frame rate to conserve battery usage. */ + kGMSFrameRatePowerSave, + + /** + * Use a median frame rate to provide smoother rendering and conserve processing cycles. + */ + kGMSFrameRateConservative, + + /** + * Use the maximum frame rate for a device. For low end devices this will be 30 FPS, + * for high end devices 60 FPS. + */ + kGMSFrameRateMaximum, +}; + +/**@}*/ + +/** + * \defgroup MapViewPaddingAdjustmentBehavior GMSMapViewPaddingAdjustmentBehavior + * @{ + */ + +/** + * Constants indicating how safe area insets are added to padding. + */ +typedef NS_ENUM(NSUInteger, GMSMapViewPaddingAdjustmentBehavior) { + /** Always include the safe area insets in the padding. */ + kGMSMapViewPaddingAdjustmentBehaviorAlways, + + /** + * When the padding value is smaller than the safe area inset for a particular edge, use the safe + * area value for layout, else use padding. + */ + kGMSMapViewPaddingAdjustmentBehaviorAutomatic, + + /** + * Never include the safe area insets in the padding. This was the behavior prior to version 2.5. + */ + kGMSMapViewPaddingAdjustmentBehaviorNever, +}; + +/**@}*/ + +/** + * This is the main class of the Google Maps SDK for iOS and is the entry point for all methods + * related to the map. + * + * The map should be instantiated via the convenience constructor [GMSMapView mapWithFrame:camera:]. + * It may also be created with the default [[GMSMapView alloc] initWithFrame:] method (wherein its + * camera will be set to a default location). + * + * GMSMapView can only be read and modified from the main thread, similar to all UIKit objects. + * Calling these methods from another thread will result in an exception or undefined behavior. + */ +@interface GMSMapView : UIView + +/** GMSMapView delegate. */ +@property(nonatomic, weak, nullable) IBOutlet id delegate; + +/** + * Controls the camera, which defines how the map is oriented. Modification of this property is + * instantaneous. + */ +@property(nonatomic, copy) GMSCameraPosition *camera; + +/** + * Returns a GMSProjection object that you can use to convert between screen coordinates and + * latitude/longitude coordinates. + * + * This is a snapshot of the current projection, and will not automatically update when the camera + * moves. It represents either the projection of the last drawn GMSMapView frame, or; where the + * camera has been explicitly set or the map just created, the upcoming frame. It will never be nil. + */ +@property(nonatomic, readonly) GMSProjection *projection; + +/** + * Controls whether the My Location dot and accuracy circle is enabled. Defaults to NO. + */ +@property(nonatomic, getter=isMyLocationEnabled) BOOL myLocationEnabled; + +/** + * If My Location is enabled, reveals where the user location dot is being drawn. If it is disabled, + * or it is enabled but no location data is available, this will be nil. This property is + * observable using KVO. + */ +@property(nonatomic, readonly, nullable) CLLocation *myLocation; + +/** + * The marker that is selected. Setting this property selects a particular marker, showing an info + * window on it. If this property is non-nil, setting it to nil deselects the marker, hiding the + * info window. This property is observable using KVO. + */ +@property(nonatomic, nullable) GMSMarker *selectedMarker; + +/** + * Controls whether the map is drawing traffic data, if available. This is subject to the + * availability of traffic data. Defaults to NO. + */ +@property(nonatomic, getter=isTrafficEnabled) BOOL trafficEnabled; + +/** + * Controls the type of map tiles that should be displayed. Defaults to kGMSTypeNormal. + */ +@property(nonatomic) GMSMapViewType mapType; + +/** + * Controls the style of the map. + * + * A non-nil mapStyle will only apply if mapType is Normal. + */ +@property(nonatomic, nullable) GMSMapStyle *mapStyle; + +/** + * Minimum zoom (the farthest the camera may be zoomed out). Defaults to kGMSMinZoomLevel. Modified + * with -setMinZoom:maxZoom:. + */ +@property(nonatomic, readonly) float minZoom; + +/** + * Maximum zoom (the closest the camera may be to the Earth). Defaults to kGMSMaxZoomLevel. Modified + * with -setMinZoom:maxZoom:. + */ +@property(nonatomic, readonly) float maxZoom; + +/** + * If set, 3D buildings will be shown where available. Defaults to YES. + * + * This may be useful when adding a custom tile layer to the map, in order to make it clearer at + * high zoom levels. Changing this value will cause all tiles to be briefly invalidated. + */ +@property(nonatomic, getter=isBuildingsEnabled) BOOL buildingsEnabled; + +/** + * Sets whether indoor maps are shown, where available. Defaults to YES. + * + * If this is set to NO, caches for indoor data may be purged and any floor currently selected by + * the end-user may be reset. + */ +@property(nonatomic, getter=isIndoorEnabled) BOOL indoorEnabled; + +/** + * Gets the GMSIndoorDisplay instance which allows to observe or control aspects of indoor data + * display. + */ +@property(nonatomic, readonly) GMSIndoorDisplay *indoorDisplay; + +/** + * Gets the GMSUISettings object, which controls user interface settings for the map. + */ +@property(nonatomic, readonly) GMSUISettings *settings; + +/** + * Controls the 'visible' region of the view. By applying padding an area around the edge of the + * view can be created which will contain map data but will not contain UI controls. + * + * If the padding is not balanced, the visual center of the view will move as appropriate. Padding + * will also affect the |projection| property so the visible region will not include the padding + * area. GMSCameraUpdate fitToBounds will ensure that both this padding and any padding requested + * will be taken into account. + * + * This property may be animated within a UIView-based animation block. + */ +@property(nonatomic) UIEdgeInsets padding; + +/** + * Controls how safe area insets are added to the padding values. Like padding, safe area insets + * position map controls such as the compass, my location button and floor picker within the device + * safe area. + * + * Defaults to kGMSMapViewPaddingAdjustmentBehaviorAlways. + */ +@property(nonatomic) GMSMapViewPaddingAdjustmentBehavior paddingAdjustmentBehavior; + +/** + * Defaults to YES. If set to NO, GMSMapView will generate accessibility elements for overlay + * objects, such as GMSMarker and GMSPolyline. + * + * This property is as per the informal UIAcessibility protocol, except for the default value of + * YES. + */ +@property(nonatomic) BOOL accessibilityElementsHidden; + +/** + * Accessor for the custom CALayer type used for the layer. + */ +@property(nonatomic, readonly, retain) GMSMapLayer *layer; + +/** + * Controls the rendering frame rate. Default value is kGMSFrameRateMaximum. + */ +@property(nonatomic) GMSFrameRate preferredFrameRate; + +/** + * If not nil, constrains the camera target so that gestures cannot cause it to leave the specified + * bounds. + */ +@property(nonatomic, nullable) GMSCoordinateBounds *cameraTargetBounds; + +/** + * Convenience initializer that builds and returns a GMSMapView, with a frame and camera target. + */ +- (instancetype)initWithFrame:(CGRect)frame camera:(GMSCameraPosition *)camera; + +/** + * Builds and returns a GMSMapView, with a frame and camera target. + */ ++ (instancetype)mapWithFrame:(CGRect)frame camera:(GMSCameraPosition *)camera; + +/** + * Tells this map to power up its renderer. This is optional and idempotent. + */ +- (void)startRendering __GMS_AVAILABLE_BUT_DEPRECATED_MSG( + "This method is obsolete and will be removed in a future release."); + +/** + * Tells this map to power down its renderer. This is optional and idempotent. + */ +- (void)stopRendering __GMS_AVAILABLE_BUT_DEPRECATED_MSG( + "This method is obsolete and will be removed in a future release."); + +/** + * Clears all markup that has been added to the map, including markers, polylines and ground + * overlays. This will not clear the visible location dot or reset the current mapType. + */ +- (void)clear; + +/** + * Sets |minZoom| and |maxZoom|. This method expects the minimum to be less than or equal to the + * maximum, and will throw an exception with name NSRangeException otherwise. + */ +- (void)setMinZoom:(float)minZoom maxZoom:(float)maxZoom; + +/** + * Build a GMSCameraPosition that presents |bounds| with |padding|. The camera will have a zero + * bearing and tilt (i.e., facing north and looking directly at the Earth). This takes the frame and + * padding of this GMSMapView into account. + * + * If the bounds is invalid this method will return a nil camera. + */ +- (nullable GMSCameraPosition *)cameraForBounds:(GMSCoordinateBounds *)bounds + insets:(UIEdgeInsets)insets; + +/** + * Changes the camera according to |update|. The camera change is instantaneous (with no animation). + */ +- (void)moveCamera:(GMSCameraUpdate *)update; + +/** + * Check whether the given camera positions would practically cause the camera to be rendered the + * same, taking into account the level of precision and transformations used internally. + */ +- (BOOL)areEqualForRenderingPosition:(GMSCameraPosition *)position + position:(GMSCameraPosition *)otherPosition; + +@end + +/** + * Accessibility identifier for the compass button. + * + * @related GMSMapView + */ +extern NSString *const kGMSAccessibilityCompass; + +/** + * Accessibility identifier for the "my location" button. + * + * @related GMSMapView + */ +extern NSString *const kGMSAccessibilityMyLocation; + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSMarker.h b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSMarker.h new file mode 100755 index 0000000..e0ba822 --- /dev/null +++ b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSMarker.h @@ -0,0 +1,179 @@ +// +// GMSMarker.h +// Google Maps SDK for iOS +// +// Copyright 2012 Google LLC +// +// Usage of this SDK is subject to the Google Maps/Google Earth APIs Terms of +// Service: https://developers.google.com/maps/terms +// + +#import + +#import "GMSOverlay.h" + +@class GMSMarkerLayer; +@class GMSPanoramaView; +@class UIImage; + +NS_ASSUME_NONNULL_BEGIN + +/** + * \defgroup MarkerAnimation GMSMarkerAnimation + * @{ + */ + +/** + * Animation types for GMSMarker. + */ +typedef NS_ENUM(NSUInteger, GMSMarkerAnimation) { + /** No animation (default). */ + kGMSMarkerAnimationNone = 0, + + /** The marker will pop from its groundAnchor when added. */ + kGMSMarkerAnimationPop, +}; + +/**@}*/ + +/** + * A marker is an icon placed at a particular point on the map's surface. A marker's icon is drawn + * oriented against the device's screen rather than the map's surface; i.e., it will not necessarily + * change orientation due to map rotations, tilting, or zooming. + */ +@interface GMSMarker : GMSOverlay + +/** Marker position. Animated. */ +@property(nonatomic) CLLocationCoordinate2D position; + +/** Snippet text, shown beneath the title in the info window when selected. */ +@property(nonatomic, copy, nullable) NSString *snippet; + +/** + * Marker icon to render. If left nil, uses a default SDK place marker. + * + * Supports animated images, but each frame must be the same size or the behavior is undefined. + * + * Supports the use of alignmentRectInsets to specify a reduced tap area. This also redefines how + * anchors are specified. For an animated image the value for the animation is used, not the + * individual frames. + */ +@property(nonatomic, nullable) UIImage *icon; + +/** + * Marker view to render. If left nil, falls back to the |icon| property instead. + * + * Supports animation of all animatable properties of UIView, except |frame| and |center|. Changing + * these properties or their corresponding CALayer version, including |position|, is not supported. + * + * Note that the view behaves as if |clipsToBounds| is set to YES, regardless of its actual value. + */ +@property(nonatomic, nullable) UIView *iconView; + +/** + * Controls whether the icon for this marker should be redrawn every frame. + * + * Note that when this changes from NO to YES, the icon is guaranteed to be redrawn next frame. + * + * Defaults to YES. + * Has no effect if |iconView| is nil. + */ +@property(nonatomic) BOOL tracksViewChanges; + +/** + * Controls whether the info window for this marker should be redrawn every frame. + * + * Note that when this changes from NO to YES, the info window is guaranteed to be redrawn next + * frame. + * + * Defaults to NO. + */ +@property(nonatomic) BOOL tracksInfoWindowChanges; + +/** + * The ground anchor specifies the point in the icon image that is anchored to the marker's position + * on the Earth's surface. This point is specified within the continuous space [0.0, 1.0] x [0.0, + * 1.0], where (0,0) is the top-left corner of the image, and (1,1) is the bottom-right corner. + * + * If the image has non-zero alignmentRectInsets, the top-left and bottom-right mentioned above + * refer to the inset section of the image. + */ +@property(nonatomic) CGPoint groundAnchor; + +/** + * The info window anchor specifies the point in the icon image at which to anchor the info window, + * which will be displayed directly above this point. This point is specified within the same space + * as groundAnchor. + */ +@property(nonatomic) CGPoint infoWindowAnchor; + +/** + * Controls the animation used when this marker is placed on a GMSMapView (default + * kGMSMarkerAnimationNone, no animation). + */ +@property(nonatomic) GMSMarkerAnimation appearAnimation; + +/** + * Controls whether this marker can be dragged interactively (default NO). + */ +@property(nonatomic, getter=isDraggable) BOOL draggable; + +/** + * Controls whether this marker should be flat against the Earth's surface (YES) or a billboard + * facing the camera (NO, default). + */ +@property(nonatomic, getter=isFlat) BOOL flat; + +/** + * Sets the rotation of the marker in degrees clockwise about the marker's anchor point. The axis of + * rotation is perpendicular to the marker. A rotation of 0 corresponds to the default position of + * the marker. Animated. + * + * When the marker is flat on the map, the default position is north aligned and the rotation is + * such that the marker always remains flat on the map. When the marker is a billboard, the default + * position is pointing up and the rotation is such that the marker is always facing the camera. + */ +@property(nonatomic) CLLocationDegrees rotation; + +/** + * Sets the opacity of the marker, between 0 (completely transparent) and 1 (default) inclusive. + */ +@property(nonatomic) float opacity; + +/** + * Provides the Core Animation layer for this GMSMarker. + */ +@property(nonatomic, readonly) GMSMarkerLayer *layer; + +/** + * The |panoramaView| specifies which panorama view will attempt to show this marker. Note that if + * the marker's |position| is too far away from the |panoramaView|'s current panorama location, it + * will not be displayed as it will be too small. + * + * Can be set to nil to remove the marker from any current panorama view it is attached to. + * + * A marker can be shown on both a panorama and a map at the same time. + */ +@property(nonatomic, weak, nullable) GMSPanoramaView *panoramaView; + +/** Convenience constructor for a default marker. */ ++ (instancetype)markerWithPosition:(CLLocationCoordinate2D)position; + +/** Creates a tinted version of the default marker image for use as an icon. */ ++ (UIImage *)markerImageWithColor:(nullable UIColor *)color; + +@end + +/** + * The default position of the ground anchor of a GMSMarker: the center bottom point of the marker + * icon. + */ +FOUNDATION_EXTERN const CGPoint kGMSMarkerDefaultGroundAnchor; + +/** + * The default position of the info window anchor of a GMSMarker: the center top point of the marker + * icon. + */ +FOUNDATION_EXTERN const CGPoint kGMSMarkerDefaultInfoWindowAnchor; + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSMarkerLayer.h b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSMarkerLayer.h new file mode 100755 index 0000000..0538955 --- /dev/null +++ b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSMarkerLayer.h @@ -0,0 +1,47 @@ +// +// GMSMarkerLayer.h +// Google Maps SDK for iOS +// +// Copyright 2013 Google LLC +// +// Usage of this SDK is subject to the Google Maps/Google Earth APIs Terms of +// Service: https://developers.google.com/maps/terms +// + +#import +#import + +#import "GMSOverlayLayer.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + * GMSMarkerLayer is a subclass of GMSOverlayLayer, available on a per-marker basis, that allows + * animation of several properties of its associated GMSMarker. + * + * Note that this CALayer is never actually rendered directly, as GMSMapView is provided entirely + * via an OpenGL layer. As such, adjustments or animations to 'default' properties of CALayer will + * not have any effect. + */ +@interface GMSMarkerLayer : GMSOverlayLayer + +/** Latitude, part of |position| on GMSMarker. */ +@property(nonatomic) CLLocationDegrees latitude; + +/** Longitude, part of |position| on GMSMarker. */ +@property(nonatomic) CLLocationDegrees longitude; + +/** Rotation, as per GMSMarker. */ +@property(nonatomic) CLLocationDegrees rotation; + +/** Opacity, as per GMSMarker. */ +@property(atomic) float opacity; + +@end + +extern NSString *const kGMSMarkerLayerLatitude; +extern NSString *const kGMSMarkerLayerLongitude; +extern NSString *const kGMSMarkerLayerRotation; +extern NSString *const kGMSMarkerLayerOpacity; + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSMutablePath.h b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSMutablePath.h new file mode 100755 index 0000000..a710b09 --- /dev/null +++ b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSMutablePath.h @@ -0,0 +1,60 @@ +// +// GMSMutablePath.h +// Google Maps SDK for iOS +// +// Copyright 2013 Google LLC +// +// Usage of this SDK is subject to the Google Maps/Google Earth APIs Terms of +// Service: https://developers.google.com/maps/terms +// + +#import +#import + +#import "GMSPath.h" + +/** + * GMSMutablePath is a dynamic (resizable) array of CLLocationCoordinate2D. All coordinates must be + * valid. GMSMutablePath is the mutable counterpart to the immutable GMSPath. + */ +@interface GMSMutablePath : GMSPath + +/** Adds |coord| at the end of the path. */ +- (void)addCoordinate:(CLLocationCoordinate2D)coord; + +/** Adds a new CLLocationCoordinate2D instance with the given lat/lng. */ +- (void)addLatitude:(CLLocationDegrees)latitude longitude:(CLLocationDegrees)longitude; + +/** + * Inserts |coord| at |index|. + * + * If this is smaller than the size of the path, shifts all coordinates forward by one. Otherwise, + * behaves as replaceCoordinateAtIndex:withCoordinate:. + */ +- (void)insertCoordinate:(CLLocationCoordinate2D)coord atIndex:(NSUInteger)index; + +/** + * Replace the coordinate at |index| with |coord|. If |index| is after the end, grows the array with + * an undefined coordinate. + */ +- (void)replaceCoordinateAtIndex:(NSUInteger)index + withCoordinate:(CLLocationCoordinate2D)coord; + +/** + * Remove entry at |index|. + * + * If |index| < count decrements size. If |index| >= count this is a silent no-op. + */ +- (void)removeCoordinateAtIndex:(NSUInteger)index; + +/** + * Removes the last coordinate of the path. + * + * If the array is non-empty decrements size. If the array is empty, this is a silent no-op. + */ +- (void)removeLastCoordinate; + +/** Removes all coordinates in this path. */ +- (void)removeAllCoordinates; + +@end diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSOrientation.h b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSOrientation.h new file mode 100755 index 0000000..5d8822c --- /dev/null +++ b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSOrientation.h @@ -0,0 +1,44 @@ +// +// GMSOrientation.h +// Google Maps SDK for iOS +// +// Copyright 2013 Google LLC +// +// Usage of this SDK is subject to the Google Maps/Google Earth APIs Terms of +// Service: https://developers.google.com/maps/terms +// + +#import + +/** + * GMSOrientation is a tuple of heading and pitch used to control the viewing direction of a + * GMSPanoramaCamera. + */ +typedef struct { + /** The camera heading (horizontal angle) in degrees. */ + const CLLocationDirection heading; + + /** + * The camera pitch (vertical angle), in degrees from the horizon. The |pitch| range is [-90,90], + * although it is possible that not the full range is supported. + */ + const double pitch; +} GMSOrientation; + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * Returns a GMSOrientation with the given |heading| and |pitch|. + * + * @related GMSOrientation + */ +inline static GMSOrientation GMSOrientationMake(CLLocationDirection heading, double pitch) { + GMSOrientation orientation = {heading, pitch}; + return orientation; +} + +#ifdef __cplusplus +} +#endif diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSOverlay.h b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSOverlay.h new file mode 100755 index 0000000..f71f20f --- /dev/null +++ b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSOverlay.h @@ -0,0 +1,66 @@ +// +// GMSOverlay.h +// Google Maps SDK for iOS +// +// Copyright 2013 Google LLC +// +// Usage of this SDK is subject to the Google Maps/Google Earth APIs Terms of +// Service: https://developers.google.com/maps/terms +// + +#import + +@class GMSMapView; + +NS_ASSUME_NONNULL_BEGIN + +/** + * GMSOverlay is an abstract class that represents some overlay that may be attached to a specific + * GMSMapView. It may not be instantiated directly; instead, instances of concrete overlay types + * should be created directly (such as GMSMarker, GMSPolyline, and GMSPolygon). + * + * This supports the NSCopying protocol; [overlay_ copy] will return a copy of the overlay type, but + * with |map| set to nil. + */ +@interface GMSOverlay : NSObject + +/** + * Title, a short description of the overlay. Some overlays, such as markers, will display the title + * on the map. The title is also the default accessibility text. + */ +@property(nonatomic, copy, nullable) NSString *title; + +/** + * The map this overlay is on. Setting this property will add the overlay to the map. Setting it to + * nil removes this overlay from the map. An overlay may be active on at most one map at any given + * time. + */ +@property(nonatomic, weak, nullable) GMSMapView *map; + +/** + * If this overlay should cause tap notifications. Some overlays, such as markers, will default to + * being tappable. + */ +@property(nonatomic, getter=isTappable) BOOL tappable; + +/** + * Higher |zIndex| value overlays will be drawn on top of lower |zIndex| value tile layers and + * overlays. Equal values result in undefined draw ordering. Markers are an exception that + * regardless of |zIndex|, they will always be drawn above tile layers and other non-marker + * overlays; they are effectively considered to be in a separate z-index group compared to other + * overlays. + */ +@property(nonatomic) int zIndex; + +/** + * Overlay data. You can use this property to associate an arbitrary object with this overlay. + * Google Maps SDK for iOS neither reads nor writes this property. + * + * Note that userData should not hold any strong references to any Maps objects, otherwise a retain + * cycle may be created (preventing objects from being released). + */ +@property(nonatomic, nullable) id userData; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSOverlayLayer.h b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSOverlayLayer.h new file mode 100755 index 0000000..b0b8cf2 --- /dev/null +++ b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSOverlayLayer.h @@ -0,0 +1,30 @@ +// +// GMSOverlayLayer.h +// Google Maps SDK for iOS +// +// Copyright 2018 Google LLC +// +// Usage of this SDK is subject to the Google Maps/Google Earth APIs Terms of +// Service: https://developers.google.com/maps/terms +// + +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +/** + * GMSOverlayLayer is a custom subclass of CALayer, and an abstract baseclass for GMSOverlay layers + * that allow custom animations. + * + * Note that this CALayer or any subclass are never actually rendered directly, as GMSMapView is + * provided entirely via an OpenGL layer. As such, adjustments or animations to 'default' properties + * of CALayer will not have any effect. + * + * This is an implementation detail and it should not be instantiated directly. + */ +@interface GMSOverlayLayer : CALayer + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSPanorama.h b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSPanorama.h new file mode 100755 index 0000000..70400f2 --- /dev/null +++ b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSPanorama.h @@ -0,0 +1,34 @@ +// +// GMSPanorama.h +// Google Maps SDK for iOS +// +// Copyright 2013 Google LLC +// +// Usage of this SDK is subject to the Google Maps/Google Earth APIs Terms of +// Service: https://developers.google.com/maps/terms +// + +#import + +@class GMSPanoramaLink; + +NS_ASSUME_NONNULL_BEGIN + +/** + * GMSPanorama represents metadata for a specific panorama on the Earth. This class is not + * instantiable directly and is obtained via GMSPanoramaService or GMSPanoramaView. + */ +@interface GMSPanorama : NSObject + +/** The precise location of this panorama. */ +@property(nonatomic, readonly) CLLocationCoordinate2D coordinate; + +/** The ID of this panorama. Panoramas may change ID over time, so this should not be persisted */ +@property(nonatomic, copy, readonly) NSString *panoramaID; + +/** An array of GMSPanoramaLink describing the neighboring panoramas. */ +@property(nonatomic, copy, readonly) NSArray *links; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSPanoramaCamera.h b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSPanoramaCamera.h new file mode 100755 index 0000000..4b9cc47 --- /dev/null +++ b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSPanoramaCamera.h @@ -0,0 +1,81 @@ +// +// GMSPanoramaCamera.h +// Google Maps SDK for iOS +// +// Copyright 2013 Google LLC +// +// Usage of this SDK is subject to the Google Maps/Google Earth APIs Terms of +// Service: https://developers.google.com/maps/terms +// + +#import + +#import "GMSOrientation.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + * GMSPanoramaCamera is used to control the viewing direction of a GMSPanoramaView. It does not + * contain information about which particular panorama should be displayed. + */ +@interface GMSPanoramaCamera : NSObject + +/** + * Designated initializer. Configures this GMSPanoramaCamera with |orientation|, |zoom| and |FOV|. + * These values will be clamped to acceptable ranges. + */ +- (id)initWithOrientation:(GMSOrientation)orientation zoom:(float)zoom FOV:(double)FOV; + +/** + * Convenience constructor specifying heading and pitch as part of |orientation|, plus |zoom| and + * default field of view (90 degrees). + */ ++ (instancetype)cameraWithOrientation:(GMSOrientation)orientation zoom:(float)zoom; + +/** + * Convenience constructor specifying |heading|, |pitch|, |zoom| with default field of view (90 + * degrees). + */ ++ (instancetype)cameraWithHeading:(CLLocationDirection)heading pitch:(double)pitch zoom:(float)zoom; + +/** + * Convenience constructor for GMSPanoramaCamera, specifying all camera properties with heading and + * pitch as part of |orientation|. + */ ++ (instancetype)cameraWithOrientation:(GMSOrientation)orientation zoom:(float)zoom FOV:(double)FOV; + +/** + * Convenience constructor for GMSPanoramaCamera, specifying all camera properties. + */ ++ (instancetype)cameraWithHeading:(CLLocationDirection)heading + pitch:(double)pitch + zoom:(float)zoom + FOV:(double)FOV; + +/** + * The field of view (FOV) encompassed by the larger dimension (width or height) of the view in + * degrees at zoom 1. This is clamped to the range [1, 160] degrees, and has a default value of 90. + * + * Lower FOV values produce a zooming in effect; larger FOV values produce an fisheye effect. + * + * Note: This is not the displayed FOV if zoom is anything other than 1. User zoom gestures + * control the zoom property, not this property. + */ +@property(nonatomic, readonly) double FOV; + +/** + * Adjusts the visible region of the screen. A zoom of N will show the same area as the central + * width/N height/N area of what is shown at zoom 1. + * + * Zoom is clamped to the implementation defined range [1, 5]. + */ +@property(nonatomic, readonly) float zoom; + +/** + * The camera orientation, which groups together heading and pitch. + */ +@property(nonatomic, readonly) GMSOrientation orientation; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSPanoramaCameraUpdate.h b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSPanoramaCameraUpdate.h new file mode 100755 index 0000000..96dd4c2 --- /dev/null +++ b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSPanoramaCameraUpdate.h @@ -0,0 +1,37 @@ +// +// GMSPanoramaCameraUpdate.h +// Google Maps SDK for iOS +// +// Copyright 2013 Google LLC +// +// Usage of this SDK is subject to the Google Maps/Google Earth APIs Terms of +// Service: https://developers.google.com/maps/terms +// + +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +/** + * GMSPanoramaCameraUpdate represents an update that may be applied to a GMSPanoramaView. + * It encapsulates some logic for modifying the current camera. + * It should only be constructed using the factory helper methods below. + */ +@interface GMSPanoramaCameraUpdate : NSObject + +/** Returns an update that increments the camera heading with |deltaHeading|. */ ++ (GMSPanoramaCameraUpdate *)rotateBy:(CGFloat)deltaHeading; + +/** Returns an update that sets the camera heading to the given value. */ ++ (GMSPanoramaCameraUpdate *)setHeading:(CGFloat)heading; + +/** Returns an update that sets the camera pitch to the given value. */ ++ (GMSPanoramaCameraUpdate *)setPitch:(CGFloat)pitch; + +/** Returns an update that sets the camera zoom to the given value. */ ++ (GMSPanoramaCameraUpdate *)setZoom:(CGFloat)zoom; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSPanoramaLayer.h b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSPanoramaLayer.h new file mode 100755 index 0000000..4b18a87 --- /dev/null +++ b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSPanoramaLayer.h @@ -0,0 +1,57 @@ +// +// GMSPanoramaLayer.h +// Google Maps SDK for iOS +// +// Copyright 2013 Google LLC +// +// Usage of this SDK is subject to the Google Maps/Google Earth APIs Terms of +// Service: https://developers.google.com/maps/terms +// + +#import +#import + +#import "GMSCALayer.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + * kGMSLayerPanoramaHeadingKey ranges from [0, 360). + * + * @related GMSPanoramaLayer + */ +extern NSString *const kGMSLayerPanoramaHeadingKey; + +/** + * kGMSLayerPanoramaPitchKey ranges from [-90, 90]. + * + * @related GMSPanoramaLayer + */ +extern NSString *const kGMSLayerPanoramaPitchKey; + +/** + * kGMSLayerCameraZoomLevelKey ranges from [1, 5], default 1. + * + * @related GMSPanoramaLayer + */ +extern NSString *const kGMSLayerPanoramaZoomKey; + +/** + * kGMSLayerPanoramaFOVKey ranges from [1, 160] (in degrees), default 90. + * + * @related GMSPanoramaLayer + */ +extern NSString *const kGMSLayerPanoramaFOVKey; + +/** + * GMSPanoramaLayer is a custom subclass of CALayer, provided as the layer class on GMSPanoramaView. + * This layer should not be instantiated directly. + */ +@interface GMSPanoramaLayer : GMSCALayer +@property(nonatomic) CLLocationDirection cameraHeading; +@property(nonatomic) double cameraPitch; +@property(nonatomic) float cameraZoom; +@property(nonatomic) double cameraFOV; +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSPanoramaLink.h b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSPanoramaLink.h new file mode 100755 index 0000000..419545f --- /dev/null +++ b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSPanoramaLink.h @@ -0,0 +1,30 @@ +// +// GMSPanoramaLink.h +// Google Maps SDK for iOS +// +// Copyright 2013 Google LLC +// +// Usage of this SDK is subject to the Google Maps/Google Earth APIs Terms of +// Service: https://developers.google.com/maps/terms +// + +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +/** Links from a GMSPanorama to neighboring panoramas. */ +@interface GMSPanoramaLink : NSObject + +/** Angle of the neighboring panorama, clockwise from north in degrees. */ +@property(nonatomic) CGFloat heading; + +/** + * Panorama ID for the neighboring panorama. + * Do not store this persistenly, it changes in time. + */ +@property(nonatomic, copy) NSString *panoramaID; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSPanoramaService.h b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSPanoramaService.h new file mode 100755 index 0000000..01ea837 --- /dev/null +++ b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSPanoramaService.h @@ -0,0 +1,83 @@ +// +// GMSPanoramaService.h +// Google Maps SDK for iOS +// +// Copyright 2013 Google LLC +// +// Usage of this SDK is subject to the Google Maps/Google Earth APIs Terms of +// Service: https://developers.google.com/maps/terms +// + +#import + +#import "GMSPanoramaSource.h" + +@class GMSPanorama; + +NS_ASSUME_NONNULL_BEGIN + +/** + * Callback for when a panorama metadata becomes available. + * If an error occurred, |panorama| is nil and |error| is not nil. + * Otherwise, |panorama| is not nil and |error| is nil. + * + * @related GMSPanoramaService + */ +typedef void (^GMSPanoramaCallback)(GMSPanorama *_Nullable panorama, NSError *_Nullable error); + +/** + * GMSPanoramaService can be used to request panorama metadata even when a GMSPanoramaView is not + * active. + * + * Get an instance like this: [[GMSPanoramaService alloc] init]. + */ +@interface GMSPanoramaService : NSObject + +/** + * Retrieves information about a panorama near the given |coordinate|. + * + * This is an asynchronous request, |callback| will be called with the result. + */ +- (void)requestPanoramaNearCoordinate:(CLLocationCoordinate2D)coordinate + callback:(GMSPanoramaCallback)callback; + +/** + * Similar to requestPanoramaNearCoordinate:callback: but allows specifying a search radius (meters) + * around |coordinate|. + */ +- (void)requestPanoramaNearCoordinate:(CLLocationCoordinate2D)coordinate + radius:(NSUInteger)radius + callback:(GMSPanoramaCallback)callback; + +/** + * Similar to requestPanoramaNearCoordinate:callback: but allows specifying the panorama source type + * near the given |coordinate|. + * + * This API is experimental and may not always filter by source. + */ +- (void)requestPanoramaNearCoordinate:(CLLocationCoordinate2D)coordinate + source:(GMSPanoramaSource)source + callback:(GMSPanoramaCallback)callback; + +/** + * Similar to requestPanoramaNearCoordinate:callback: but allows specifying a search radius (meters) + * and the panorama source type near the given |coordinate|. + * + * This API is experimental and may not always filter by source. + */ +- (void)requestPanoramaNearCoordinate:(CLLocationCoordinate2D)coordinate + radius:(NSUInteger)radius + source:(GMSPanoramaSource)source + callback:(GMSPanoramaCallback)callback; + +/** + * Retrieves information about a panorama with the given |panoramaID|. + * + * |callback| will be called with the result. Only panoramaIDs obtained from the Google Maps SDK for + * iOS are supported. + */ +- (void)requestPanoramaWithID:(NSString *)panoramaID callback:(GMSPanoramaCallback)callback; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSPanoramaSource.h b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSPanoramaSource.h new file mode 100755 index 0000000..f97d176 --- /dev/null +++ b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSPanoramaSource.h @@ -0,0 +1,30 @@ +// +// GMSPanoramaSource.h +// Google Maps SDK for iOS +// +// Copyright 2017 Google LLC +// +// Usage of this SDK is subject to the Google Maps/Google Earth APIs Terms of +// Service: https://developers.google.com/maps/terms +// + +#import + +/** + * \defgroup PanoramaSource GMSPanoramaSource + * @{ + */ + +/** + * Source types for Panoramas. Used to specify the source of a StreetView Panorama. + * + * This API is experimental. Results may not always match expectations. + */ +typedef NS_ENUM(NSUInteger, GMSPanoramaSource) { + /** Panoramas of locations either inside or outside. */ + kGMSPanoramaSourceDefault = 0, + /** Panoramas of locations outside. */ + kGMSPanoramaSourceOutside, +}; + +/**@}*/ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSPanoramaView.h b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSPanoramaView.h new file mode 100755 index 0000000..9898bb1 --- /dev/null +++ b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSPanoramaView.h @@ -0,0 +1,300 @@ +// +// GMSPanoramaView.h +// Google Maps SDK for iOS +// +// Copyright 2013 Google LLC +// +// Usage of this SDK is subject to the Google Maps/Google Earth APIs Terms of +// Service: https://developers.google.com/maps/terms +// + +#import +#import + +#import "GMSOrientation.h" +#import "GMSPanoramaLayer.h" +#import "GMSPanoramaSource.h" + +@class GMSMarker; +@class GMSPanorama; +@class GMSPanoramaCamera; +@class GMSPanoramaCameraUpdate; +@class GMSPanoramaView; + +NS_ASSUME_NONNULL_BEGIN + +/** Delegate for events on GMSPanoramaView. */ +@protocol GMSPanoramaViewDelegate +@optional + +/** + * Called when starting a move to another panorama. + * + * This can be the result of interactive navigation to a neighbouring panorama. + * + * At the moment this method is called, the |view|.panorama is still pointing to the old panorama, + * as the new panorama identified by |panoID| is not yet resolved. panoramaView:didMoveToPanorama: + * will be called when the new panorama is ready. + */ +- (void)panoramaView:(GMSPanoramaView *)view willMoveToPanoramaID:(NSString *)panoramaID; + +/** + * This is invoked every time the |view|.panorama property changes. + */ +- (void)panoramaView:(GMSPanoramaView *)view + didMoveToPanorama:(nullable GMSPanorama *)panorama; + +/** + * Called when the panorama change was caused by invoking moveToPanoramaNearCoordinate:. The + * coordinate passed to that method will also be passed here. + */ +- (void)panoramaView:(GMSPanoramaView *)view + didMoveToPanorama:(GMSPanorama *)panorama + nearCoordinate:(CLLocationCoordinate2D)coordinate; + +/** + * Called when moveNearCoordinate: produces an error. + */ +- (void)panoramaView:(GMSPanoramaView *)view + error:(NSError *)error + onMoveNearCoordinate:(CLLocationCoordinate2D)coordinate; + +/** + * Called when moveToPanoramaID: produces an error. + */ +- (void)panoramaView:(GMSPanoramaView *)view + error:(NSError *)error + onMoveToPanoramaID:(NSString *)panoramaID; + +/** + * Called repeatedly during changes to the camera on GMSPanoramaView. This may not be called for all + * intermediate camera values, but is always called for the final position of the camera after an + * animation or gesture. + */ +- (void)panoramaView:(GMSPanoramaView *)panoramaView didMoveCamera:(GMSPanoramaCamera *)camera; + +/** + * Called when a user has tapped on the GMSPanoramaView, but this tap was not consumed (taps may be + * consumed by e.g., tapping on a navigation arrow). + */ +- (void)panoramaView:(GMSPanoramaView *)panoramaView didTap:(CGPoint)point; + +/** + * Called after a marker has been tapped. May return YES to indicate the event has been fully + * handled and suppress any default behavior. + */ +- (BOOL)panoramaView:(GMSPanoramaView *)panoramaView didTapMarker:(GMSMarker *)marker; + +/** + * Called when the panorama tiles for the current view have just been requested and are beginning to + * load. + */ +- (void)panoramaViewDidStartRendering:(GMSPanoramaView *)panoramaView; + +/** + * Called when the panorama tiles have been loaded (or permanently failed to load) and rendered on + * screen. + */ +- (void)panoramaViewDidFinishRendering:(GMSPanoramaView *)panoramaView; + +@end + +/** + * A panorama is used to display Street View imagery. It should be constructed via [[GMSPanoramaView + * alloc] initWithFrame:], and configured post-initialization. + * + * All properties and methods should be accessed on the main thread, similar to all UIKit objects. + * The GMSPanoramaViewDelegate methods will also be called back only on the main thread. + * + * The backgroundColor of this view is shown while no panorama is visible, such as while it is + * loading or if the panorama is later set to nil. The alpha color of backgroundColor is not + * supported. + */ +@interface GMSPanoramaView : UIView + +/** + * The panorama to display; setting it will transition to a new panorama. This is animated, except + * for the initial panorama. + * + * Can be set to nil to clear the view. + */ +@property(nonatomic, nullable) GMSPanorama *panorama; + +/** GMSPanoramaView delegate. */ +@property(nonatomic, weak, nullable) IBOutlet id delegate; + +/** + * Sets the preference for whether all gestures should be enabled (default) or disabled. + * + * This does not limit programmatic movement of the camera or control of the panorama. + */ +- (void)setAllGesturesEnabled:(BOOL)enabled; + +/** + * Controls whether orientation gestures are enabled (default) or disabled. If enabled, users may + * use gestures to change the orientation of the camera. + * + * This does not limit programmatic movement of the camera. + */ +@property(nonatomic) BOOL orientationGestures; + +/** + * Controls whether zoom gestures are enabled (default) or disabled. If enabled, users may pinch to + * zoom the camera. + * + * This does not limit programmatic movement of the camera. + */ +@property(nonatomic) BOOL zoomGestures; + +/** + * Controls whether navigation gestures are enabled (default) or disabled. If enabled, users may use + * a single tap on navigation links or double tap the view to change panoramas. + * + * This does not limit programmatic control of the panorama. + */ +@property(nonatomic) BOOL navigationGestures; + +/** + * Controls whether the tappable navigation links are hidden or visible (default). Hidden navigation + * links cannot be tapped. + */ +@property(nonatomic) BOOL navigationLinksHidden; + +/** + * Controls whether the street name overlays are hidden or visible (default). + */ +@property(nonatomic) BOOL streetNamesHidden; + +/** + * Controls the panorama's camera. Setting a new camera here jumps to the new camera value, with no + * animation. + */ +@property(nonatomic) GMSPanoramaCamera *camera; + +/** + * Accessor for the custom CALayer type used for the layer. + */ +@property(nonatomic, readonly, retain) GMSPanoramaLayer *layer; + +/** + * Animates the camera of this GMSPanoramaView to |camera|, over |duration| (specified in seconds). + */ +- (void)animateToCamera:(GMSPanoramaCamera *)camera animationDuration:(NSTimeInterval)duration; + +/** + * Modifies the camera according to |cameraUpdate|, over |duration| (specified in seconds). + */ +- (void)updateCamera:(GMSPanoramaCameraUpdate *)cameraUpdate + animationDuration:(NSTimeInterval)duration; + +/** + * Requests a panorama near |coordinate|. + * + * Upon successful completion panoramaView:didMoveToPanorama: and + * panoramaView:didMoveToPanorama:nearCoordinate: will be sent to GMSPanoramaViewDelegate. + * + * On error panoramaView:error:onMoveNearCoordinate: will be sent. + * + * Repeated calls to moveNearCoordinate: result in the previous pending (incomplete) transitions + * being cancelled -- only the most recent of moveNearCoordinate: and moveToPanoramaId: will proceed + * and generate events. + */ +- (void)moveNearCoordinate:(CLLocationCoordinate2D)coordinate; + +/** + * Similar to moveNearCoordinate: but allows specifying a search radius (meters) around + * |coordinate|. + */ +- (void)moveNearCoordinate:(CLLocationCoordinate2D)coordinate radius:(NSUInteger)radius; + +/** + * Similar to moveNearCoordinate: but allows specifying a source near |coordinate|. + * + * This API is experimental and may not always filter by source. + */ +- (void)moveNearCoordinate:(CLLocationCoordinate2D)coordinate source:(GMSPanoramaSource)source; + +/** + * Similar to moveNearCoordinate: but allows specifying a search radius (meters) around + * |coordinate| and a source. + * + * This API is experimental and may not always filter by source. + */ +- (void)moveNearCoordinate:(CLLocationCoordinate2D)coordinate + radius:(NSUInteger)radius + source:(GMSPanoramaSource)source; + +/** + * Requests a panorama with |panoramaID|. + * + * Upon successful completion panoramaView:didMoveToPanorama: will be sent to + * GMSPanoramaViewDelegate. + * + * On error panoramaView:error:onMoveToPanoramaID: will be sent. + * + * Repeated calls to moveToPanoramaID: result in the previous pending (incomplete) transitions being + * cancelled -- only the most recent of moveNearCoordinate: and moveToPanoramaId: will proceed and + * generate events. + * + * Only panoramaIDs obtained from the Google Maps SDK for iOS are supported. + */ +- (void)moveToPanoramaID:(NSString *)panoramaID; + +/** + * For the current view, returns the screen point the |orientation| points through. This value may + * be outside the view for forward facing orientations which are far enough away from straight + * ahead. + * + * The result will contain NaNs for camera orientations which point away from the view, where the + * implied screen point would have had a negative distance from the camera in the direction of + * orientation. + */ +- (CGPoint)pointForOrientation:(GMSOrientation)orientation; + +/** + * Given a point for this view, returns the current camera orientation pointing through that screen + * location. At the center of this view, the returned GMSOrientation will be approximately equal to + * that of the current GMSPanoramaCamera. + */ +- (GMSOrientation)orientationForPoint:(CGPoint)point; + +/** + * Convenience constructor for GMSPanoramaView, which searches for and displays a GMSPanorama near + * |coordinate|. This performs a similar action to that of moveNearCoordinate:, and will call the + * same delegate methods. + */ ++ (instancetype)panoramaWithFrame:(CGRect)frame nearCoordinate:(CLLocationCoordinate2D)coordinate; + +/** + * Similar to panoramaWithFrame:nearCoordinate: but allows specifying a search radius (meters) + * around |coordinate|. + */ ++ (instancetype)panoramaWithFrame:(CGRect)frame + nearCoordinate:(CLLocationCoordinate2D)coordinate + radius:(NSUInteger)radius; + +/** + * Convenience constructor for GMSPanoramaView, which searches for and displays a GMSPanorama near + * |coordinate|. This performs a similar action to that of moveNearCoordinate:source, and will call + * the same delegate methods. + * + * This API is experimental and may not always filter by source. + */ ++ (instancetype)panoramaWithFrame:(CGRect)frame + nearCoordinate:(CLLocationCoordinate2D)coordinate + source:(GMSPanoramaSource)source; +/** + * Convenience constructor for GMSPanoramaView, which searches for and displays a GMSPanorama near + * |coordinate|. This performs a similar action to that of moveNearCoordinate:radius:source, and + * will call the same delegate methods. + * + * This API is experimental and may not always filter by source. + */ ++ (instancetype)panoramaWithFrame:(CGRect)frame + nearCoordinate:(CLLocationCoordinate2D)coordinate + radius:(NSUInteger)radius + source:(GMSPanoramaSource)source; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSPath.h b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSPath.h new file mode 100755 index 0000000..15129b8 --- /dev/null +++ b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSPath.h @@ -0,0 +1,112 @@ +// +// GMSPath.h +// Google Maps SDK for iOS +// +// Copyright 2013 Google LLC +// +// Usage of this SDK is subject to the Google Maps/Google Earth APIs Terms of +// Service: https://developers.google.com/maps/terms +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** + * GMSPath encapsulates an immutable array of CLLocationCooordinate2D. All the coordinates of a + * GMSPath must be valid. The mutable counterpart is GMSMutablePath. + */ +@interface GMSPath : NSObject + +/** Convenience constructor for an empty path. */ ++ (instancetype)path; + +/** Initializes a newly allocated path with the contents of another GMSPath. */ +- (id)initWithPath:(GMSPath *)path; + +/** Get size of path. */ +- (NSUInteger)count; + +/** Returns kCLLocationCoordinate2DInvalid if |index| >= count. */ +- (CLLocationCoordinate2D)coordinateAtIndex:(NSUInteger)index; + +/** + * Initializes a newly allocated path from |encodedPath|. This format is described at: + * https://developers.google.com/maps/documentation/utilities/polylinealgorithm + */ ++ (nullable instancetype)pathFromEncodedPath:(NSString *)encodedPath; + +/** Returns an encoded string of the path in the format described above. */ +- (NSString *)encodedPath; + +/** + * Returns a new path obtained by adding |deltaLatitude| and |deltaLongitude| to each coordinate + * of the current path. Does not modify the current path. + */ +- (instancetype)pathOffsetByLatitude:(CLLocationDegrees)deltaLatitude + longitude:(CLLocationDegrees)deltaLongitude; + +@end + +/** + * kGMSEquatorProjectedMeter may be useful when specifying lengths for segment in "projected" units. + * The value of kGMSEquatorProjectedMeter, 1/(pi * EarthRadius), represents the length of one meter + * at the equator in projected units. For example to specify a projected length that corresponds + * to 100km at the equator use 100000 * kGMSEquatorProjectedMeter. + * See [GMSPath segmentsForLength:kind:], [GMSPath lengthOfKind:] and kGMSLengthProjected. + */ +extern const double kGMSEquatorProjectedMeter; + +/** + * \defgroup LengthKind GMSLengthKind + * @{ + */ + +/** + * GMSLengthKind indicates the type of a length value, which can be geodesic (in meters), rhumb + * length (in meters) and projected length (in GMSMapPoint units). + */ +typedef NS_ENUM(NSUInteger, GMSLengthKind) { + /* + * Geodesic length, in meters, along geodesic segments. May be useful, for example, to specify + * lengths along the the trajectory of airplanes or ships. + */ + kGMSLengthGeodesic, + + /* + * Rhumb length, in meters, along rhumb (straight line) segments. May be useful, for example, to + * draw a scale bar on a map. The visual size of a segment of a given length depens on the + * latitude. + */ + kGMSLengthRhumb, + + /* + * Length in projected space, along rhumb segments. Projected length uses the same units as + * GMSMapPoint - the Earth equator circumference has length 2. It is possible to specify projected + * length in units corresponding to 1 meter at the equator by multiplying with + * kGMSEquatorProjectedMeter, equal to 1/(pi * EarthRadius). + * + * Projected length may be useful, for example, to specify segments with the same visual length + * regardless of latitude. + */ + kGMSLengthProjected +}; + +/**@}*/ + +@interface GMSPath (GMSPathLength) + +/** + * Returns the fractional number of segments along the path that correspond to |length|, + * interpreted according to |kind|. See GMSLengthKind. + */ +- (double)segmentsForLength:(CLLocationDistance)length kind:(GMSLengthKind)kind; + +/** + * Returns the length of the path, according to |kind|. See GMSLengthKind. + */ +- (CLLocationDistance)lengthOfKind:(GMSLengthKind)kind; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSPolygon.h b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSPolygon.h new file mode 100755 index 0000000..ff38e85 --- /dev/null +++ b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSPolygon.h @@ -0,0 +1,56 @@ +// +// GMSPolygon.h +// Google Maps SDK for iOS +// +// Copyright 2013 Google LLC +// +// Usage of this SDK is subject to the Google Maps/Google Earth APIs Terms of +// Service: https://developers.google.com/maps/terms +// + +#import + +#import "GMSOverlay.h" + +@class GMSPath; +@class GMSPolygonLayer; + +NS_ASSUME_NONNULL_BEGIN + +/** + * GMSPolygon defines a polygon that appears on the map. A polygon (like a polyline) defines a + * series of connected coordinates in an ordered sequence; additionally, polygons form a closed loop + * and define a filled region. + */ +@interface GMSPolygon : GMSOverlay + +/** The path that describes this polygon. The coordinates composing the path must be valid. */ +@property(nonatomic, copy, nullable) GMSPath *path; + +/** + * The array of GMSPath instances that describes any holes in this polygon. The coordinates + * composing each path must be valid. + */ +@property(nonatomic, copy, nullable) NSArray *holes; + +/** The width of the polygon outline in screen points. Defaults to 1. */ +@property(nonatomic) CGFloat strokeWidth; + +/** The color of the polygon outline. Defaults to nil. */ +@property(nonatomic, nullable) UIColor *strokeColor; + +/** The fill color. Defaults to blueColor. */ +@property(nonatomic, nullable) UIColor *fillColor; + +/** Whether this polygon should be rendered with geodesic correction. */ +@property(nonatomic) BOOL geodesic; + +/** + * Convenience constructor for GMSPolygon for a particular path. Other properties will have default + * values. + */ ++ (instancetype)polygonWithPath:(nullable GMSPath *)path; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSPolygonLayer.h b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSPolygonLayer.h new file mode 100755 index 0000000..f1860a5 --- /dev/null +++ b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSPolygonLayer.h @@ -0,0 +1,49 @@ +// +// GMSPolygonLayer.h +// Google Maps SDK for iOS +// +// Copyright 2018 Google LLC +// +// Usage of this SDK is subject to the Google Maps/Google Earth APIs Terms of +// Service: https://developers.google.com/maps/terms +// + +#import +#import + +#import "GMSOverlayLayer.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + * GMSPolygonLayer is a subclass of GMSOverlayLayer, available on a per-polygon basis, that allows + * animation of several properties of its associated GMSPolygon. + * + * Note that this CALayer is never actually rendered directly, as GMSMapView is provided entirely + * via an OpenGL layer. As such, adjustments or animations to 'default' properties of CALayer will + * not have any effect. + */ +@interface GMSPolygonLayer : GMSOverlayLayer + +/** The width of the polygon outline in screen points. */ +@property(nonatomic) CGFloat strokeWidth; + +/** + * The color of the polygon outline. This is an assign property, there is an expectation for the + * GMSPolygon to own the reference if necessary. + */ +@property(nonatomic, assign, nullable) CGColorRef strokeColor; + +/** + * The fill color. This is an assign property, there is an expectation for the GMSPolygon to own the + * reference if necessary. + */ +@property(nonatomic, assign, nullable) CGColorRef fillColor; + +@end + +extern NSString *const kGMSPolygonLayerStrokeWidth; +extern NSString *const kGMSPolygonLayerStrokeColor; +extern NSString *const kGMSPolygonLayerFillColor; + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSPolyline.h b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSPolyline.h new file mode 100755 index 0000000..9f67db1 --- /dev/null +++ b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSPolyline.h @@ -0,0 +1,61 @@ +// +// GMSPolyline.h +// Google Maps SDK for iOS +// +// Copyright 2012 Google LLC +// +// Usage of this SDK is subject to the Google Maps/Google Earth APIs Terms of +// Service: https://developers.google.com/maps/terms +// + +#import + +#import "GMSOverlay.h" +#import "GMSStyleSpan.h" + +@class GMSPath; + +NS_ASSUME_NONNULL_BEGIN + +/** + * GMSPolyline specifies the available options for a polyline that exists on the Earth's surface. + * It is drawn as a physical line between the points specified in |path|. + */ +@interface GMSPolyline : GMSOverlay + +/** + * The path that describes this polyline. + */ +@property(nonatomic, copy, nullable) GMSPath *path; + +/** + * The width of the line in screen points. Defaults to 1. + */ +@property(nonatomic) CGFloat strokeWidth; + +/** + * The UIColor used to render the polyline. Defaults to [UIColor blueColor]. + */ +@property(nonatomic) UIColor *strokeColor; + +/** Whether this line should be rendered with geodesic correction. */ +@property(nonatomic) BOOL geodesic; + +/** + * Convenience constructor for GMSPolyline for a particular path. Other properties will have + * default values. + */ ++ (instancetype)polylineWithPath:(nullable GMSPath *)path; + +/** + * An array containing GMSStyleSpan, the spans used to render this polyline. + * + * If this array contains fewer segments than the polyline itself, the final segment will be applied + * over the remaining length. If this array is unset or empty, then |strokeColor| is used for the + * entire line instead. + */ +@property(nonatomic, copy, nullable) NSArray *spans; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSProjection.h b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSProjection.h new file mode 100755 index 0000000..73f5b1d --- /dev/null +++ b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSProjection.h @@ -0,0 +1,76 @@ +// +// GMSProjection.h +// Google Maps SDK for iOS +// +// Copyright 2012 Google LLC +// +// Usage of this SDK is subject to the Google Maps/Google Earth APIs Terms of +// Service: https://developers.google.com/maps/terms +// + +#import +#import + +/** + * GMSVisibleRegion contains the four points defining the polygon that is visible in a map's camera. + * + * This polygon can be a trapezoid instead of a rectangle, because a camera can have tilt. If the + * camera is directly over the center of the camera, the shape is rectangular, but if the camera is + * tilted, the shape will appear to be a trapezoid whose smallest side is closest to the point of + * view. + */ +typedef struct { + + /** Bottom left corner of the camera. */ + CLLocationCoordinate2D nearLeft; + + /** Bottom right corner of the camera. */ + CLLocationCoordinate2D nearRight; + + /** Far left corner of the camera. */ + CLLocationCoordinate2D farLeft; + + /** Far right corner of the camera. */ + CLLocationCoordinate2D farRight; +} GMSVisibleRegion; + +/** + * Defines a mapping between Earth coordinates (CLLocationCoordinate2D) and coordinates in the map's + * view (CGPoint). A projection is constant and immutable, in that the mapping it embodies never + * changes. The mapping is not necessarily linear. + * + * Passing invalid Earth coordinates (i.e., per CLLocationCoordinate2DIsValid) to this object may + * result in undefined behavior. + * + * This class should not be instantiated directly, instead, obtained via projection on GMSMapView. + */ +@interface GMSProjection : NSObject + +/** Maps an Earth coordinate to a point coordinate in the map's view. */ +- (CGPoint)pointForCoordinate:(CLLocationCoordinate2D)coordinate; + +/** Maps a point coordinate in the map's view to an Earth coordinate. */ +- (CLLocationCoordinate2D)coordinateForPoint:(CGPoint)point; + +/** + * Converts a distance in meters to content size. This is only accurate for small Earth distances, + * as it uses CGFloat for screen distances. + */ +- (CGFloat)pointsForMeters:(CLLocationDistance)meters + atCoordinate:(CLLocationCoordinate2D)coordinate; + +/** + * Returns whether a given coordinate (lat/lng) is contained within the projection. + */ +- (BOOL)containsCoordinate:(CLLocationCoordinate2D)coordinate; + +/** + * Returns the region (four location coordinates) that is visible according to the projection. If + * padding was set on GMSMapView, this region takes the padding into account. + * + * The visible region can be non-rectangular. The result is undefined if the projection includes + * points that do not map to anywhere on the map (e.g., camera sees outer space). + */ +- (GMSVisibleRegion)visibleRegion; + +@end diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSServices.h b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSServices.h new file mode 100755 index 0000000..8b360c8 --- /dev/null +++ b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSServices.h @@ -0,0 +1,77 @@ +// +// GMSServices.h +// Google Maps SDK for iOS +// +// Copyright 2012 Google LLC +// +// Usage of this SDK is subject to the Google Maps/Google Earth APIs Terms of +// Service: https://developers.google.com/maps/terms +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** + * Service class for the Google Maps SDK for iOS. + * + * This class is not thread safe. All methods should only be invoked on the main thread. + */ +@interface GMSServices : NSObject + +/** + * Provides the shared instance of GMSServices for the Google Maps SDK for iOS, creating it if + * necessary. Classes such as GMSMapView and GMSPanoramaView will hold this instance to provide + * their connection to Google. + * + * This is an opaque object. If your application often creates and destroys view or service classes + * provided by the Google Maps SDK for iOS, it may be useful to hold onto this object directly, as + * otherwise your connection to Google may be restarted on a regular basis. It also may be useful to + * take this object in advance of the first map creation, to reduce initial map creation performance + * cost. + * + * This method will throw an exception if provideAPIKey: has not been called. + */ ++ (id)sharedServices; + +/** + * Provides your API key to the Google Maps SDK for iOS. This key is generated for your application + * via the Google APIs Console, and is paired with your application's bundle ID to identify it. + * This must be called exactly once by your application before any iOS Maps SDK object is + * initialized. + * + * @return YES if the APIKey was successfully provided. + */ ++ (BOOL)provideAPIKey:(NSString *)APIKey; + +/** + * Provides your API options to the Google Maps SDK for iOS. Pass an array containing an NSString + * for each option. These options apply to all maps. + * + * This may be called exactly once by your application and must be called before any iOS Maps SDK + * object is initialized. + * + * @return YES if all the APIOptions were successfully provided. + */ ++ (BOOL)provideAPIOptions:(NSArray *)APIOptions; + +/** + * Returns the open source software license information for Google Maps SDK for iOS. This + * information must be made available within your application. + */ ++ (NSString *)openSourceLicenseInfo; + +/** + * Returns the version for this release of the Google Maps SDK for iOS. For example, "1.0.0" + */ ++ (NSString *)SDKVersion; + +/** + * Returns the long version for this release of the Google Maps SDK for iOS. For example, "1.0.0 + * (102.1)". + */ ++ (NSString *)SDKLongVersion; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSStrokeStyle.h b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSStrokeStyle.h new file mode 100755 index 0000000..3bf1cf3 --- /dev/null +++ b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSStrokeStyle.h @@ -0,0 +1,26 @@ +// +// GMSStrokeStyle.h +// Google Maps SDK for iOS +// +// Copyright 2019 Google LLC +// +// Usage of this SDK is subject to the Google Maps/Google Earth APIs Terms of +// Service: https://developers.google.com/maps/terms +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** Describes the drawing style for one-dimensional entities such as polylines. */ +@interface GMSStrokeStyle : NSObject + +/** Creates a solid color stroke style. */ ++ (instancetype)solidColor:(UIColor *)color; + +/** Creates a gradient stroke style interpolating from |fromColor| to |toColor|. */ ++ (instancetype)gradientFromColor:(UIColor *)fromColor toColor:(UIColor *)toColor; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSStyleSpan.h b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSStyleSpan.h new file mode 100755 index 0000000..08462bc --- /dev/null +++ b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSStyleSpan.h @@ -0,0 +1,51 @@ +// +// GMSStyleSpan.h +// Google Maps SDK for iOS +// +// Copyright 2019 Google LLC +// +// Usage of this SDK is subject to the Google Maps/Google Earth APIs Terms of +// Service: https://developers.google.com/maps/terms +// + +#import + +#import "GMSStrokeStyle.h" + +NS_ASSUME_NONNULL_BEGIN +/** Describes the style for some region of a polyline. */ +@interface GMSStyleSpan : NSObject + +/** + * Factory returning a solid color span of length one segment. Equivalent to + * [GMSStyleSpan spanWithStyle:[GMSStrokeStyle solidColor:|color|] segments:1]. + */ ++ (instancetype)spanWithColor:(UIColor *)color; + +/** + * Factory returning a solid color span with a given number of segments. Equivalent to + * [GMSStyleSpan spanWithStyle:[GMSStrokeStyle solidColor:|color|] segments:|segments|]. + */ ++ (instancetype)spanWithColor:(UIColor *)color segments:(double)segments; + +/** + * Factory returning a span with the given |style| of length one segment. Equivalent to + * [GMSStyleSpan spanWithStyle:|style| segments:1]. + */ ++ (instancetype)spanWithStyle:(GMSStrokeStyle *)style; + +/** + * Factory returning a span with the given |style| and length in number of segments. + * |segments| must be greater than 0 (i.e. can't be 0). + */ ++ (instancetype)spanWithStyle:(GMSStrokeStyle *)style segments:(double)segments; + +/** The style of this span. */ +@property(nonatomic, readonly) GMSStrokeStyle *style; + +/** The length of this span in number of segments. */ +@property(nonatomic, readonly) double segments; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSSyncTileLayer.h b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSSyncTileLayer.h new file mode 100755 index 0000000..ca3f91b --- /dev/null +++ b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSSyncTileLayer.h @@ -0,0 +1,35 @@ +// +// GMSSyncTileLayer.h +// Google Maps SDK for iOS +// +// Copyright 2013 Google LLC +// +// Usage of this SDK is subject to the Google Maps/Google Earth APIs Terms of +// Service: https://developers.google.com/maps/terms +// + +#import + +#import "GMSTileLayer.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + * GMSSyncTileLayer is an abstract subclass of GMSTileLayer that provides a sync interface to + * generate image tile data. + */ +@interface GMSSyncTileLayer : GMSTileLayer + +/** + * As per requestTileForX:y:zoom:receiver: on GMSTileLayer, but provides a synchronous interface to + * return tiles. This method may block or otherwise perform work, and is not called on the main + * thread. + * + * Calls to this method may also be made from multiple threads so implementations must be + * threadsafe. + */ +- (nullable UIImage *)tileForX:(NSUInteger)x y:(NSUInteger)y zoom:(NSUInteger)zoom; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSTileLayer.h b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSTileLayer.h new file mode 100755 index 0000000..3ddb4e8 --- /dev/null +++ b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSTileLayer.h @@ -0,0 +1,105 @@ +// +// GMSTileLayer.h +// Google Maps SDK for iOS +// +// Copyright 2013 Google LLC +// +// Usage of this SDK is subject to the Google Maps/Google Earth APIs Terms of +// Service: https://developers.google.com/maps/terms +// + +#import + +@class GMSMapView; + +NS_ASSUME_NONNULL_BEGIN + +/** + * Stub tile that is used to indicate that no tile exists for a specific tile coordinate. May be + * returned by tileForX:y:zoom: on GMSTileProvider. + */ +FOUNDATION_EXTERN UIImage *const kGMSTileLayerNoTile; + +/** + * GMSTileReceiver is provided to GMSTileLayer when a tile request is made, allowing the callback to + * be later (or immediately) invoked. + */ +@protocol GMSTileReceiver +- (void)receiveTileWithX:(NSUInteger)x + y:(NSUInteger)y + zoom:(NSUInteger)zoom + image:(nullable UIImage *)image; +@end + +/** + * GMSTileLayer is an abstract class that allows overlaying of custom image tiles on a specified + * GMSMapView. It may not be initialized directly, and subclasses must implement the + * tileForX:y:zoom: method to return tiles. + * + * At zoom level 0 the whole world is a square covered by a single tile, and the coordinates |x| and + * |y| are both 0 for that tile. At zoom level 1, the world is covered by 4 tiles with |x| and |y| + * being 0 or 1, and so on. + */ +@interface GMSTileLayer : NSObject + +/** + * requestTileForX:y:zoom:receiver: generates image tiles for GMSTileOverlay. It must be overridden + * by subclasses. The tile for the given |x|, |y| and |zoom| _must_ be later passed to |receiver|. + * + * Specify kGMSTileLayerNoTile if no tile is available for this location; or nil if a transient + * error occured and a tile may be available later. + * + * Calls to this method will be made on the main thread. See GMSSyncTileLayer for a base class that + * implements a blocking tile layer that does not run on your application's main thread. + */ +- (void)requestTileForX:(NSUInteger)x + y:(NSUInteger)y + zoom:(NSUInteger)zoom + receiver:(id)receiver; + +/** + * Clears the cache so that all tiles will be requested again. + */ +- (void)clearTileCache; + +/** + * The map this GMSTileOverlay is displayed on. Setting this property will add the layer to the map. + * Setting it to nil removes this layer from the map. A layer may be active on at most one map at + * any given time. + */ +@property(nonatomic, weak, nullable) GMSMapView *map; + +/** + * Higher |zIndex| value tile layers will be drawn on top of lower |zIndex| value tile layers and + * overlays. Equal values result in undefined draw ordering. + */ +@property(nonatomic) int zIndex; + +/** + * Specifies the number of pixels (not points) that the returned tile images will prefer to display + * as. For best results, this should be the edge length of your custom tiles. Defaults to 256, which + * is the traditional size of Google Maps tiles. + * + * Values less than the equivalent of 128 points (e.g. 256 pixels on retina devices) may not perform + * well and are not recommended. + * + * As an example, an application developer may wish to provide retina tiles (512 pixel edge length) + * on retina devices, to keep the same number of tiles + * per view as the default value of 256 would give on a non-retina device. + */ +@property(nonatomic) NSInteger tileSize; + +/** + * Specifies the opacity of the tile layer. This provides a multiplier for the alpha channel of tile + * images. + */ +@property(nonatomic) float opacity; + +/** + * Specifies whether the tiles should fade in. Default YES. + */ +@property(nonatomic) BOOL fadeIn; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSUISettings.h b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSUISettings.h new file mode 100755 index 0000000..0b81e5c --- /dev/null +++ b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSUISettings.h @@ -0,0 +1,91 @@ +// +// GMSUISettings.h +// Google Maps SDK for iOS +// +// Copyright 2013 Google LLC +// +// Usage of this SDK is subject to the Google Maps/Google Earth APIs Terms of +// Service: https://developers.google.com/maps/terms +// + +#import + +/** Settings for the user interface of a GMSMapView. */ +@interface GMSUISettings : NSObject + +/** + * Sets the preference for whether all gestures should be enabled (default) or disabled. This + * doesn't restrict users from tapping any on screen buttons to move the camera (e.g., compass or + * zoom controls), nor does it restrict programmatic movements and animation. + */ +- (void)setAllGesturesEnabled:(BOOL)enabled; + +/** + * Controls whether scroll gestures are enabled (default) or disabled. If enabled, users may drag to + * pan the camera. This does not limit programmatic movement of the camera. + */ +@property(nonatomic) BOOL scrollGestures; + +/** + * Controls whether zoom gestures are enabled (default) or disabled. If enabled, users may double + * tap/two-finger tap or pinch to zoom the camera. This does not limit programmatic movement of the + * camera. + */ +@property(nonatomic) BOOL zoomGestures; + +/** + * Controls whether tilt gestures are enabled (default) or disabled. If enabled, users may use a + * two-finger vertical down or up swipe to tilt the camera. This does not limit programmatic control + * of the camera's viewingAngle. + */ +@property(nonatomic) BOOL tiltGestures; + +/** + * Controls whether rotate gestures are enabled (default) or disabled. If enabled, users may use a + * two-finger rotate gesture to rotate the camera. This does not limit programmatic control of the + * camera's bearing. + */ +@property(nonatomic) BOOL rotateGestures; + +/** + * Controls whether gestures by users are completely consumed by the GMSMapView when gestures are + * enabled (default YES). This prevents these gestures from being received by parent views. + * + * When the GMSMapView is contained by a UIScrollView (or other scrollable area), this means that + * gestures on the map will not be additional consumed as scroll gestures. However, disabling this + * (set to NO) may be useful to support complex view hierarchies or requirements. + */ +@property(nonatomic) BOOL consumesGesturesInView; + +/** + * Enables or disables the compass. The compass is an icon on the map that indicates the direction + * of north on the map. + * + * If enabled, it is only shown when the camera is rotated away from its default orientation + * (bearing of 0). When a user taps the compass, the camera orients itself to its default + * orientation and fades away shortly after. If disabled, the compass will never be displayed. + */ +@property(nonatomic) BOOL compassButton; + +/** + * Enables or disables the My Location button. This is a button visible on the map that, when tapped + * by users, will center the map on the current user location. + */ +@property(nonatomic) BOOL myLocationButton; + +/** + * Enables (default) or disables the indoor floor picker. + * + * If enabled, it is only visible when the view is focused on a building with indoor floor data. If + * disabled, the selected floor can still be controlled programmatically via the indoorDisplay + * mapView property. + */ +@property(nonatomic) BOOL indoorPicker; + +/** + * Controls whether rotate and zoom gestures can be performed off-center and scrolled around + * (default YES). + */ +@property(nonatomic) BOOL allowScrollGesturesDuringRotateOrZoom; + +@end diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSURLTileLayer.h b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSURLTileLayer.h new file mode 100755 index 0000000..7167166 --- /dev/null +++ b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSURLTileLayer.h @@ -0,0 +1,56 @@ +// +// GMSURLTileLayer.h +// Google Maps SDK for iOS +// +// Copyright 2013 Google LLC +// +// Usage of this SDK is subject to the Google Maps/Google Earth APIs Terms of +// Service: https://developers.google.com/maps/terms +// + +#import "GMSTileLayer.h" + +@class NSURL; + +NS_ASSUME_NONNULL_BEGIN + +/** + * |GMSTileURLConstructor| is a block taking |x|, |y| and |zoom| and returning an NSURL, or nil to + * indicate no tile for that location. + * + * @related GMSURLTileLayer + */ +typedef NSURL *_Nullable (^GMSTileURLConstructor)(NSUInteger x, NSUInteger y, NSUInteger zoom); + +/** + * GMSURLTileProvider fetches tiles based on the URLs returned from a GMSTileURLConstructor. For + * example: + *
+ *   GMSTileURLConstructor constructor = ^(NSUInteger x, NSUInteger y, NSUInteger zoom) {
+ *     NSString *URLStr =
+ *         [NSString stringWithFormat:@"https://example.com/%d/%d/%d.png", x, y, zoom];
+ *     return [NSURL URLWithString:URLStr];
+ *   };
+ *   GMSTileLayer *layer =
+ *       [GMSURLTileLayer tileLayerWithURLConstructor:constructor];
+ *   layer.userAgent = @"SDK user agent";
+ *   layer.map = map;
+ * 
+ * + * GMSURLTileProvider may not be subclassed and should only be created via its convenience + * constructor. + */ +@interface GMSURLTileLayer : GMSTileLayer + +/** Convenience constructor. |constructor| must be non-nil. */ ++ (instancetype)tileLayerWithURLConstructor:(GMSTileURLConstructor)constructor; + +/** + * Specify the user agent to describe your application. If this is nil (the default), the default + * iOS user agent is used for HTTP requests. + */ +@property(nonatomic, copy, nullable) NSString *userAgent; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GoogleMaps.h b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GoogleMaps.h new file mode 100755 index 0000000..b617468 --- /dev/null +++ b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GoogleMaps.h @@ -0,0 +1,42 @@ +#import "GMSIndoorBuilding.h" +#import "GMSIndoorLevel.h" +#import "GMSAddress.h" +#import "GMSCALayer.h" +#import "GMSCameraPosition.h" +#import "GMSCameraUpdate.h" +#import "GMSCoordinateBounds+GoogleMaps.h" +#import "GMSGeocoder.h" +#import "GMSGeometryUtils.h" +#import "GMSIndoorDisplay.h" +#import "GMSMapLayer.h" +#import "GMSMapStyle.h" +#import "GMSMapView+Animation.h" +#import "GMSMapView.h" +#import "GMSMutablePath.h" +#import "GMSPath.h" +#import "GMSProjection.h" +#import "GMSServices.h" +#import "GMSUISettings.h" +#import "GMSCircle.h" +#import "GMSGroundOverlay.h" +#import "GMSMarker.h" +#import "GMSMarkerLayer.h" +#import "GMSOverlay.h" +#import "GMSOverlayLayer.h" +#import "GMSPolygon.h" +#import "GMSPolygonLayer.h" +#import "GMSPolyline.h" +#import "GMSStrokeStyle.h" +#import "GMSStyleSpan.h" +#import "GMSSyncTileLayer.h" +#import "GMSTileLayer.h" +#import "GMSURLTileLayer.h" +#import "GMSOrientation.h" +#import "GMSPanorama.h" +#import "GMSPanoramaCamera.h" +#import "GMSPanoramaCameraUpdate.h" +#import "GMSPanoramaLayer.h" +#import "GMSPanoramaLink.h" +#import "GMSPanoramaService.h" +#import "GMSPanoramaSource.h" +#import "GMSPanoramaView.h" diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Modules/module.modulemap b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Modules/module.modulemap new file mode 100755 index 0000000..d60ea20 --- /dev/null +++ b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Modules/module.modulemap @@ -0,0 +1,21 @@ +framework module GoogleMaps { + umbrella header "GoogleMaps.h" + export * + module * { export * } + link "z" + link framework "CoreData" + link framework "CoreFoundation" + link framework "CoreGraphics" + link framework "CoreImage" + link framework "CoreLocation" + link framework "CoreTelephony" + link framework "CoreText" + link framework "Foundation" + link framework "GLKit" + link framework "ImageIO" + link framework "OpenGLES" + link framework "QuartzCore" + link framework "Security" + link framework "SystemConfiguration" + link framework "UIKit" +} diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCacheStorage.momd/Storage.mom b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCacheStorage.momd/Storage.mom new file mode 100755 index 0000000..aa0d57a Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCacheStorage.momd/Storage.mom differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCacheStorage.momd/StorageWithTileProto.mom b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCacheStorage.momd/StorageWithTileProto.mom new file mode 100755 index 0000000..30b3d13 Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCacheStorage.momd/StorageWithTileProto.mom differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCacheStorage.momd/StorageWithTileVersionID.mom b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCacheStorage.momd/StorageWithTileVersionID.mom new file mode 100755 index 0000000..fd72ead Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCacheStorage.momd/StorageWithTileVersionID.mom differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCacheStorage.momd/VersionInfo.plist b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCacheStorage.momd/VersionInfo.plist new file mode 100755 index 0000000..be304d9 Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCacheStorage.momd/VersionInfo.plist differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/Assets.car b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/Assets.car new file mode 100755 index 0000000..d4ea703 Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/Assets.car differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/DroidSansMerged-Regular.ttf b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/DroidSansMerged-Regular.ttf new file mode 100755 index 0000000..2aca5f5 Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/DroidSansMerged-Regular.ttf differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/GMSNavNightModeSprites-0-1x.png b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/GMSNavNightModeSprites-0-1x.png new file mode 100755 index 0000000..852182e Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/GMSNavNightModeSprites-0-1x.png differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/GMSNavNightModeSprites-0-2x.png b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/GMSNavNightModeSprites-0-2x.png new file mode 100755 index 0000000..be8282a Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/GMSNavNightModeSprites-0-2x.png differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/GMSNavNightModeSprites-0-3x.png b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/GMSNavNightModeSprites-0-3x.png new file mode 100755 index 0000000..680ef5d Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/GMSNavNightModeSprites-0-3x.png differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/GMSNavSprites-0-1x.png b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/GMSNavSprites-0-1x.png new file mode 100755 index 0000000..af7815c Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/GMSNavSprites-0-1x.png differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/GMSNavSprites-0-2x.png b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/GMSNavSprites-0-2x.png new file mode 100755 index 0000000..d6e9e8f Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/GMSNavSprites-0-2x.png differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/GMSNavSprites-0-3x.png b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/GMSNavSprites-0-3x.png new file mode 100755 index 0000000..668d8fe Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/GMSNavSprites-0-3x.png differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/GMSSprites-0-1x.png b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/GMSSprites-0-1x.png new file mode 100755 index 0000000..97f63ad Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/GMSSprites-0-1x.png differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/GMSSprites-0-2x.png b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/GMSSprites-0-2x.png new file mode 100755 index 0000000..db95433 Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/GMSSprites-0-2x.png differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/GMSSprites-0-3x.png b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/GMSSprites-0-3x.png new file mode 100755 index 0000000..50f9bfe Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/GMSSprites-0-3x.png differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/Info.plist b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/Info.plist new file mode 100755 index 0000000..569780c Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/Info.plist differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/Tharlon-Regular.ttf b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/Tharlon-Regular.ttf new file mode 100755 index 0000000..4717d70 Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/Tharlon-Regular.ttf differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ar.lproj/GMSCore.strings b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ar.lproj/GMSCore.strings new file mode 100755 index 0000000..1d02d65 Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ar.lproj/GMSCore.strings differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/button_background.png b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/button_background.png new file mode 100755 index 0000000..cec89b6 Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/button_background.png differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/button_background@2x.png b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/button_background@2x.png new file mode 100755 index 0000000..7a3d29d Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/button_background@2x.png differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/button_background@3x.png b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/button_background@3x.png new file mode 100755 index 0000000..74eace5 Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/button_background@3x.png differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/button_compass.png b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/button_compass.png new file mode 100755 index 0000000..11fee99 Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/button_compass.png differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/button_compass@2x.png b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/button_compass@2x.png new file mode 100755 index 0000000..a73d1d6 Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/button_compass@2x.png differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/button_compass_night.png b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/button_compass_night.png new file mode 100755 index 0000000..df8c234 Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/button_compass_night.png differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/button_compass_night@2x.png b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/button_compass_night@2x.png new file mode 100755 index 0000000..dccbf03 Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/button_compass_night@2x.png differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/button_my_location.png b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/button_my_location.png new file mode 100755 index 0000000..c09a65f Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/button_my_location.png differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/button_my_location@2x.png b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/button_my_location@2x.png new file mode 100755 index 0000000..379be62 Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/button_my_location@2x.png differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ca.lproj/GMSCore.strings b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ca.lproj/GMSCore.strings new file mode 100755 index 0000000..8b00cef Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ca.lproj/GMSCore.strings differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/cs.lproj/GMSCore.strings b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/cs.lproj/GMSCore.strings new file mode 100755 index 0000000..219385c Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/cs.lproj/GMSCore.strings differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/da.lproj/GMSCore.strings b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/da.lproj/GMSCore.strings new file mode 100755 index 0000000..4d63559 Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/da.lproj/GMSCore.strings differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/dav_one_way_16_256.png b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/dav_one_way_16_256.png new file mode 100755 index 0000000..7f7c2fe Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/dav_one_way_16_256.png differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/de.lproj/GMSCore.strings b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/de.lproj/GMSCore.strings new file mode 100755 index 0000000..b5e9cf0 Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/de.lproj/GMSCore.strings differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/el.lproj/GMSCore.strings b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/el.lproj/GMSCore.strings new file mode 100755 index 0000000..48b01f2 Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/el.lproj/GMSCore.strings differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/en.lproj/GMSCore.strings b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/en.lproj/GMSCore.strings new file mode 100755 index 0000000..8415be5 Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/en.lproj/GMSCore.strings differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/en_AU.lproj/GMSCore.strings b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/en_AU.lproj/GMSCore.strings new file mode 100755 index 0000000..b187d5f Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/en_AU.lproj/GMSCore.strings differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/en_GB.lproj/GMSCore.strings b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/en_GB.lproj/GMSCore.strings new file mode 100755 index 0000000..b187d5f Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/en_GB.lproj/GMSCore.strings differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/en_IN.lproj/GMSCore.strings b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/en_IN.lproj/GMSCore.strings new file mode 100755 index 0000000..b187d5f Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/en_IN.lproj/GMSCore.strings differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/es.lproj/GMSCore.strings b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/es.lproj/GMSCore.strings new file mode 100755 index 0000000..96d13cf Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/es.lproj/GMSCore.strings differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/es_419.lproj/GMSCore.strings b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/es_419.lproj/GMSCore.strings new file mode 100755 index 0000000..ad91daf Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/es_419.lproj/GMSCore.strings differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/es_MX.lproj/GMSCore.strings b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/es_MX.lproj/GMSCore.strings new file mode 100755 index 0000000..ad91daf Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/es_MX.lproj/GMSCore.strings differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/fi.lproj/GMSCore.strings b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/fi.lproj/GMSCore.strings new file mode 100755 index 0000000..529b7f9 Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/fi.lproj/GMSCore.strings differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/fr.lproj/GMSCore.strings b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/fr.lproj/GMSCore.strings new file mode 100755 index 0000000..6e3575c Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/fr.lproj/GMSCore.strings differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/fr_CA.lproj/GMSCore.strings b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/fr_CA.lproj/GMSCore.strings new file mode 100755 index 0000000..d6715c9 Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/fr_CA.lproj/GMSCore.strings differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/he.lproj/GMSCore.strings b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/he.lproj/GMSCore.strings new file mode 100755 index 0000000..7fb5ae4 Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/he.lproj/GMSCore.strings differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/hi.lproj/GMSCore.strings b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/hi.lproj/GMSCore.strings new file mode 100755 index 0000000..219a465 Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/hi.lproj/GMSCore.strings differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/hr.lproj/GMSCore.strings b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/hr.lproj/GMSCore.strings new file mode 100755 index 0000000..92b7be3 Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/hr.lproj/GMSCore.strings differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/hu.lproj/GMSCore.strings b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/hu.lproj/GMSCore.strings new file mode 100755 index 0000000..d07e3a7 Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/hu.lproj/GMSCore.strings differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_compass_needle.png b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_compass_needle.png new file mode 100755 index 0000000..db933c8 Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_compass_needle.png differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_compass_needle@2x.png b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_compass_needle@2x.png new file mode 100755 index 0000000..65fee67 Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_compass_needle@2x.png differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_compass_needle_32pt.png b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_compass_needle_32pt.png new file mode 100755 index 0000000..a765b86 Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_compass_needle_32pt.png differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_compass_needle_32pt@2x.png b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_compass_needle_32pt@2x.png new file mode 100755 index 0000000..01a79a6 Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_compass_needle_32pt@2x.png differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_compass_needle_32pt@3x.png b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_compass_needle_32pt@3x.png new file mode 100755 index 0000000..90542c3 Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_compass_needle_32pt@3x.png differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_compass_needle_large.png b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_compass_needle_large.png new file mode 100755 index 0000000..21d2e70 Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_compass_needle_large.png differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_compass_needle_large@2x.png b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_compass_needle_large@2x.png new file mode 100755 index 0000000..3aaa92b Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_compass_needle_large@2x.png differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_compass_needle_large@3x.png b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_compass_needle_large@3x.png new file mode 100755 index 0000000..9cb93b7 Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_compass_needle_large@3x.png differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_location_off.png b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_location_off.png new file mode 100755 index 0000000..2bf7984 Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_location_off.png differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_location_off@2x.png b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_location_off@2x.png new file mode 100755 index 0000000..565195f Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_location_off@2x.png differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_location_off@3x.png b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_location_off@3x.png new file mode 100755 index 0000000..4be8cb3 Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_location_off@3x.png differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_qu_direction_mylocation.png b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_qu_direction_mylocation.png new file mode 100755 index 0000000..dccdcfd Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_qu_direction_mylocation.png differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_qu_direction_mylocation@2x.png b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_qu_direction_mylocation@2x.png new file mode 100755 index 0000000..ccb840e Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_qu_direction_mylocation@2x.png differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_qu_direction_mylocation@3x.png b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_qu_direction_mylocation@3x.png new file mode 100755 index 0000000..0300f62 Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_qu_direction_mylocation@3x.png differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/id.lproj/GMSCore.strings b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/id.lproj/GMSCore.strings new file mode 100755 index 0000000..d3a5ab4 Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/id.lproj/GMSCore.strings differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/it.lproj/GMSCore.strings b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/it.lproj/GMSCore.strings new file mode 100755 index 0000000..df22d2d Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/it.lproj/GMSCore.strings differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ja.lproj/GMSCore.strings b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ja.lproj/GMSCore.strings new file mode 100755 index 0000000..f85cdeb Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ja.lproj/GMSCore.strings differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ko.lproj/GMSCore.strings b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ko.lproj/GMSCore.strings new file mode 100755 index 0000000..fb76068 Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ko.lproj/GMSCore.strings differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/lt.lproj/GMSCore.strings b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/lt.lproj/GMSCore.strings new file mode 100755 index 0000000..1e2e24b Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/lt.lproj/GMSCore.strings differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/lv.lproj/GMSCore.strings b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/lv.lproj/GMSCore.strings new file mode 100755 index 0000000..643657d Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/lv.lproj/GMSCore.strings differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ms.lproj/GMSCore.strings b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ms.lproj/GMSCore.strings new file mode 100755 index 0000000..a663026 Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ms.lproj/GMSCore.strings differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/nb.lproj/GMSCore.strings b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/nb.lproj/GMSCore.strings new file mode 100755 index 0000000..3556373 Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/nb.lproj/GMSCore.strings differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/nl.lproj/GMSCore.strings b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/nl.lproj/GMSCore.strings new file mode 100755 index 0000000..e9af86b Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/nl.lproj/GMSCore.strings differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/pl.lproj/GMSCore.strings b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/pl.lproj/GMSCore.strings new file mode 100755 index 0000000..b85e6ae Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/pl.lproj/GMSCore.strings differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/polyline_colors_texture.png b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/polyline_colors_texture.png new file mode 100755 index 0000000..23c22ba Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/polyline_colors_texture.png differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/polyline_colors_texture_dim.png b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/polyline_colors_texture_dim.png new file mode 100755 index 0000000..0512020 Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/polyline_colors_texture_dim.png differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/pt.lproj/GMSCore.strings b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/pt.lproj/GMSCore.strings new file mode 100755 index 0000000..febecaf Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/pt.lproj/GMSCore.strings differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/pt_BR.lproj/GMSCore.strings b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/pt_BR.lproj/GMSCore.strings new file mode 100755 index 0000000..febecaf Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/pt_BR.lproj/GMSCore.strings differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/pt_PT.lproj/GMSCore.strings b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/pt_PT.lproj/GMSCore.strings new file mode 100755 index 0000000..899875e Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/pt_PT.lproj/GMSCore.strings differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ro.lproj/GMSCore.strings b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ro.lproj/GMSCore.strings new file mode 100755 index 0000000..e1412e7 Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ro.lproj/GMSCore.strings differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/road_1-1.png b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/road_1-1.png new file mode 100755 index 0000000..b6ba5ec Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/road_1-1.png differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/road_128-32.png b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/road_128-32.png new file mode 100755 index 0000000..08672e6 Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/road_128-32.png differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/road_16-4.png b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/road_16-4.png new file mode 100755 index 0000000..ba0b0a5 Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/road_16-4.png differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/road_2-1.png b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/road_2-1.png new file mode 100755 index 0000000..6317a5c Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/road_2-1.png differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/road_256-64.png b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/road_256-64.png new file mode 100755 index 0000000..45a66a4 Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/road_256-64.png differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/road_32-8.png b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/road_32-8.png new file mode 100755 index 0000000..ed0424b Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/road_32-8.png differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/road_4-1.png b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/road_4-1.png new file mode 100755 index 0000000..b2efb5d Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/road_4-1.png differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/road_64-16.png b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/road_64-16.png new file mode 100755 index 0000000..664e9f6 Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/road_64-16.png differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/road_8-2.png b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/road_8-2.png new file mode 100755 index 0000000..dabc352 Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/road_8-2.png differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ru.lproj/GMSCore.strings b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ru.lproj/GMSCore.strings new file mode 100755 index 0000000..119ec97 Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ru.lproj/GMSCore.strings differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/sk.lproj/GMSCore.strings b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/sk.lproj/GMSCore.strings new file mode 100755 index 0000000..b2a5e97 Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/sk.lproj/GMSCore.strings differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/sv.lproj/GMSCore.strings b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/sv.lproj/GMSCore.strings new file mode 100755 index 0000000..dc52f7d Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/sv.lproj/GMSCore.strings differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/th.lproj/GMSCore.strings b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/th.lproj/GMSCore.strings new file mode 100755 index 0000000..8a6a742 Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/th.lproj/GMSCore.strings differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/tr.lproj/GMSCore.strings b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/tr.lproj/GMSCore.strings new file mode 100755 index 0000000..b737155 Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/tr.lproj/GMSCore.strings differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/uk.lproj/GMSCore.strings b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/uk.lproj/GMSCore.strings new file mode 100755 index 0000000..601b80b Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/uk.lproj/GMSCore.strings differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/vi.lproj/GMSCore.strings b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/vi.lproj/GMSCore.strings new file mode 100755 index 0000000..64dc031 Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/vi.lproj/GMSCore.strings differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/zh_CN.lproj/GMSCore.strings b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/zh_CN.lproj/GMSCore.strings new file mode 100755 index 0000000..6f768d6 Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/zh_CN.lproj/GMSCore.strings differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/zh_HK.lproj/GMSCore.strings b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/zh_HK.lproj/GMSCore.strings new file mode 100755 index 0000000..95153ad Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/zh_HK.lproj/GMSCore.strings differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/zh_TW.lproj/GMSCore.strings b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/zh_TW.lproj/GMSCore.strings new file mode 100755 index 0000000..6fae671 Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/zh_TW.lproj/GMSCore.strings differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/Info.plist b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/Info.plist new file mode 100755 index 0000000..919fa75 Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/Info.plist differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/bubble_left.png b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/bubble_left.png new file mode 100755 index 0000000..c8e4a41 Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/bubble_left.png differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/bubble_left@2x.png b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/bubble_left@2x.png new file mode 100755 index 0000000..3e8fdca Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/bubble_left@2x.png differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/bubble_left@3x.png b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/bubble_left@3x.png new file mode 100755 index 0000000..1d8aee7 Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/bubble_left@3x.png differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/bubble_right.png b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/bubble_right.png new file mode 100755 index 0000000..6189714 Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/bubble_right.png differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/bubble_right@2x.png b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/bubble_right@2x.png new file mode 100755 index 0000000..8abc3f7 Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/bubble_right@2x.png differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/bubble_right@3x.png b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/bubble_right@3x.png new file mode 100755 index 0000000..7c35f06 Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/bubble_right@3x.png differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/default_marker.png b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/default_marker.png new file mode 100755 index 0000000..521414c Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/default_marker.png differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/default_marker@2x.png b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/default_marker@2x.png new file mode 100755 index 0000000..463657c Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/default_marker@2x.png differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/default_marker@3x.png b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/default_marker@3x.png new file mode 100755 index 0000000..d31aea6 Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/default_marker@3x.png differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/ic_error.png b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/ic_error.png new file mode 100755 index 0000000..c74eda9 Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/ic_error.png differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/ic_error@2x.png b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/ic_error@2x.png new file mode 100755 index 0000000..a640b5a Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/ic_error@2x.png differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/ic_error@3x.png b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/ic_error@3x.png new file mode 100755 index 0000000..a4ecc4b Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/ic_error@3x.png differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/oss_licenses_maps.txt.gz b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/oss_licenses_maps.txt.gz new file mode 100755 index 0000000..e302132 Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/oss_licenses_maps.txt.gz differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMapsCore.framework/GoogleMapsCore b/Pods/GoogleMaps/Maps/Frameworks/GoogleMapsCore.framework/GoogleMapsCore new file mode 100755 index 0000000..442a75f Binary files /dev/null and b/Pods/GoogleMaps/Maps/Frameworks/GoogleMapsCore.framework/GoogleMapsCore differ diff --git a/Pods/GoogleMaps/Maps/Frameworks/GoogleMapsCore.framework/Modules/module.modulemap b/Pods/GoogleMaps/Maps/Frameworks/GoogleMapsCore.framework/Modules/module.modulemap new file mode 100755 index 0000000..28f52fc --- /dev/null +++ b/Pods/GoogleMaps/Maps/Frameworks/GoogleMapsCore.framework/Modules/module.modulemap @@ -0,0 +1,20 @@ +framework module GoogleMapsCore { + export * + module * { export * } + link "z" + link framework "CoreData" + link framework "CoreFoundation" + link framework "CoreGraphics" + link framework "CoreImage" + link framework "CoreLocation" + link framework "CoreTelephony" + link framework "CoreText" + link framework "Foundation" + link framework "GLKit" + link framework "ImageIO" + link framework "OpenGLES" + link framework "QuartzCore" + link framework "Security" + link framework "SystemConfiguration" + link framework "UIKit" +} diff --git a/Pods/GoogleMaps/README.md b/Pods/GoogleMaps/README.md new file mode 100755 index 0000000..c0c1128 --- /dev/null +++ b/Pods/GoogleMaps/README.md @@ -0,0 +1,78 @@ +# Google Maps SDK for iOS + +This pod contains the Google Maps SDK for iOS, supporting both Objective C and +Swift. + +Use the [Google Maps SDK for iOS](https://developers.google.com/maps/documentation/ios-sdk/) +to enrich your app with interactive maps and immersive street view panoramas, +and add your own custom elements such as markers, windows and polylines. + +# Getting Started + +* *Guides*: Read our [Getting Started guides](https://developers.google.com/maps/documentation/ios-sdk/intro). +* *Demo Videos*: View [pre-recorded online demos](https://developers.google.com/maps/documentation/ios-sdk/#demos). +* *Code samples*: In order to try out our demo app, use: + + ``` + $ pod try GoogleMaps + ``` + + and follow the instructions on our [developer pages](https://developers.google.com/maps/documentation/ios-sdk/code-samples). + +* *Support*: Find support from various channels and communities. + + * Support pages for [Google Maps SDK for iOS](https://developers.google.com/maps/documentation/ios-sdk/support). + * Stack Overflow, using the [google-maps](https://stackoverflow.com/questions/tagged/google-maps) + tag. + * [Google Maps APIs Premium Plan](https://developers.google.com/maps/premium/support) + customers have access to business-level support through Google's + [Enterprise Support Portal](https://google.secure.force.com/). + +* *Report issues*: Use our issue tracker to [file a bug](https://code.google.com/p/gmaps-api-issues/issues/entry?template=Maps%20SDK%20for%20iOS%20-%20Bug) + or a [feature request](https://code.google.com/p/gmaps-api-issues/issues/entry?template=Maps%20SDK%20for%20iOS%20-%20Feature%20Request). + +# Installation + +To integrate Google Maps SDK for iOS into your Xcode project using CocoaPods, +specify it in your `Podfile`: + +``` +source 'https://github.com/CocoaPods/Specs.git' +platform :ios, '9.0' +target 'YOUR_APPLICATION_TARGET_NAME_HERE' do + pod 'GoogleMaps' +end +``` + +Then, run the following command: + +``` +$ pod install +``` + +Before you can start using the API, you have to activate it in the [Google +Developer Console](https://console.developers.google.com/) and integrate the +respective API key in your project. For detailed installation instructions, +visit Google's Getting Started Guides for the [Google Maps SDK for iOS](https://developers.google.com/maps/documentation/ios-sdk/start). + +# Migration from version 1 + +If you are using the Google Places API for iOS as part of the Google Maps SDK +for iOS version 1 please check the [migration guide](https://developers.google.com/places/migrate-to-v2) +for more information on upgrading your project. + +# License and Terms of Service + +By using the Google Maps SDK for iOS you accept Google's Terms of Service and +Policies. Pay attention particularly to the following aspects: + +* Depending on your app and use case, you may be required to display + attribution. Read more about [attribution requirements](https://developers.google.com/maps/documentation/ios-sdk/intro#attribution_requirements). +* Your API usage is subject to quota limitations. Read more about [usage + limits](https://developers.google.com/maps/pricing-and-plans/). +* The [Terms of Service](https://developers.google.com/maps/terms) are a + comprehensive description of the legal contract that you enter with Google + by using the Google Maps SDK for iOS. You may want to pay special attention + to [section 10](https://developers.google.com/maps/terms#10-license-restrictions), + as it talks in detail about what you can do with the API, and what you + can't. diff --git a/Pods/GooglePlaces/CHANGELOG.md b/Pods/GooglePlaces/CHANGELOG.md new file mode 100755 index 0000000..b4ca345 --- /dev/null +++ b/Pods/GooglePlaces/CHANGELOG.md @@ -0,0 +1,2 @@ +Please go to https://developers.google.com/places/ios-sdk/releases to view the +Places iOS release notes. diff --git a/Pods/GooglePlaces/Example/GooglePlacesDemos.xcodeproj/project.pbxproj b/Pods/GooglePlaces/Example/GooglePlacesDemos.xcodeproj/project.pbxproj new file mode 100755 index 0000000..bcfcd42 --- /dev/null +++ b/Pods/GooglePlaces/Example/GooglePlacesDemos.xcodeproj/project.pbxproj @@ -0,0 +1,451 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 0166AF076A7926C3F6AF3E91 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F65D01DD8887E3B1B9731DAE /* LaunchScreen.storyboard */; }; + 19D03B4688CF7DF76076B137 /* AutocompleteWithTextFieldController.m in Sources */ = {isa = PBXBuildFile; fileRef = ADB9E4A950DB2EA454486E47 /* AutocompleteWithTextFieldController.m */; }; + 1F8E76499BD9AC1A594A09DF /* AutocompleteWithSearchViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 8F7419DDC82CA074FF0A508C /* AutocompleteWithSearchViewController.m */; }; + 2E76D90BDA04FEDA32FBC7EE /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D0589812EE1F702A7BBA34D /* main.m */; }; + 30DB731057D560A0F3017362 /* FindPlaceLikelihoodListViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 18AE29BAB2CC24B015F7754A /* FindPlaceLikelihoodListViewController.m */; }; + 3440EB14B9D0E24AAF030012 /* PlacesDemoAssets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 85EDEFE42680FF093454D1AB /* PlacesDemoAssets.xcassets */; }; + 44E1C3298B123A5107DBC3FA /* DemoAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 9B81B9326DD5B37C08B8CCAA /* DemoAppDelegate.m */; }; + 52C261A89C8177D081F0D666 /* DemoListViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 36C753B6637575A8CD81C699 /* DemoListViewController.m */; }; + 52FA2C79BAE0253BF65AD4DA /* AutocompleteBaseViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D0E6E2A1285D9A0BEBDCD503 /* AutocompleteBaseViewController.m */; }; + 68FD32D0AB7DA54A0617E79C /* DemoData.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F2203BCCE0CFC3DC4F38B30 /* DemoData.m */; }; + 7DF1A5BA0B155A6414638BC6 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 97ADBE3D50D731A88C24F3F0 /* UIKit.framework */; }; + 893AFDBC37BAD181B89DBE05 /* AutocompletePushViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1BAEA89ED8C397E73E2E9730 /* AutocompletePushViewController.m */; }; + 8C59A77A235FCAEEE2D7E6CB /* AutocompleteModalViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E1502E6F1A86B1773138153B /* AutocompleteModalViewController.m */; }; + A3D84E176FACD02AA9FAC18C /* BaseDemoViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = A3D4BD9841268F97FD23E770 /* BaseDemoViewController.m */; }; + BDCD4957C53C15747F136768 /* AutocompleteWithCustomColors.m in Sources */ = {isa = PBXBuildFile; fileRef = FC03FEE150596E9432F612DF /* AutocompleteWithCustomColors.m */; }; + C31E5320A5DBA3B92410CC12 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 1D344C64A66F10D55590797E /* Localizable.strings */; }; + CCE1EEA311AF30C9E7273CA6 /* PagingPhotoView.m in Sources */ = {isa = PBXBuildFile; fileRef = 21153EB819432638638C2C26 /* PagingPhotoView.m */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 0D33295E02D9501C1D45D615 /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/Localizable.strings; sourceTree = ""; }; + 13C513E93D85CC7B765F9CDB /* AutocompleteWithCustomColors.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AutocompleteWithCustomColors.h; sourceTree = ""; }; + 16C539680ABA55CA7AFC3002 /* GooglePlacesDemos.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = GooglePlacesDemos.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 18AE29BAB2CC24B015F7754A /* FindPlaceLikelihoodListViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FindPlaceLikelihoodListViewController.m; sourceTree = ""; }; + 1A982A54052D846FC64B7AB5 /* pt_BR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pt_BR; path = pt_BR.lproj/Localizable.strings; sourceTree = ""; }; + 1BAEA89ED8C397E73E2E9730 /* AutocompletePushViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AutocompletePushViewController.m; sourceTree = ""; }; + 1D0589812EE1F702A7BBA34D /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + 1D767BA5698A891C36ADF830 /* sv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sv; path = sv.lproj/Localizable.strings; sourceTree = ""; }; + 1DB6FA3886B89186F55A12E3 /* ms */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ms; path = ms.lproj/Localizable.strings; sourceTree = ""; }; + 1FE971FB44A73F445279DA7F /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = ""; }; + 21153EB819432638638C2C26 /* PagingPhotoView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PagingPhotoView.m; sourceTree = ""; }; + 216CA36352B45FBC79C98B8F /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/Localizable.strings; sourceTree = ""; }; + 273B1A3F7AA7EED9084B5033 /* el */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = el; path = el.lproj/Localizable.strings; sourceTree = ""; }; + 2D52E39A30BD9D0AFC323F7F /* es_419 */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es_419; path = es_419.lproj/Localizable.strings; sourceTree = ""; }; + 2E4275BAD2E59FA193904FFC /* pt */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pt; path = pt.lproj/Localizable.strings; sourceTree = ""; }; + 31A6A624F6D9631C9BFECF9A /* cs */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = cs; path = cs.lproj/Localizable.strings; sourceTree = ""; }; + 36C753B6637575A8CD81C699 /* DemoListViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DemoListViewController.m; sourceTree = ""; }; + 37CA5C28547C65246AC4EAE6 /* zh_HK */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = zh_HK; path = zh_HK.lproj/Localizable.strings; sourceTree = ""; }; + 3A822A5CF223FF6ADFCA9458 /* th */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = th; path = th.lproj/Localizable.strings; sourceTree = ""; }; + 3CB3E42FBF23DD0411D5EFB5 /* PagingPhotoView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PagingPhotoView.h; sourceTree = ""; }; + 4268AFE07F8787F0CA36AA3B /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/Localizable.strings; sourceTree = ""; }; + 42C8FE938EFBD5D6633C190F /* hi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hi; path = hi.lproj/Localizable.strings; sourceTree = ""; }; + 4F2203BCCE0CFC3DC4F38B30 /* DemoData.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DemoData.m; sourceTree = ""; }; + 50E198C48B1A11E3B03DBE30 /* he */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = he; path = he.lproj/Localizable.strings; sourceTree = ""; }; + 55F92A67B1F0F18431DD759C /* id */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = id; path = id.lproj/Localizable.strings; sourceTree = ""; }; + 611B5E7788AB0459C2AA1A54 /* DemoData.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DemoData.h; sourceTree = ""; }; + 651835542B635C74A3D0F711 /* vi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = vi; path = vi.lproj/Localizable.strings; sourceTree = ""; }; + 67BD5ABA8E74D336AE54C0B0 /* uk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = uk; path = uk.lproj/Localizable.strings; sourceTree = ""; }; + 69D781288A761B789E0F63B6 /* da */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = da; path = da.lproj/Localizable.strings; sourceTree = ""; }; + 77688EB771E8262C6C224CE8 /* en_IN */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en_IN; path = en_IN.lproj/Localizable.strings; sourceTree = ""; }; + 84E89BC0ADE5F983320B9730 /* AutocompletePushViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AutocompletePushViewController.h; sourceTree = ""; }; + 85EDEFE42680FF093454D1AB /* PlacesDemoAssets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = PlacesDemoAssets.xcassets; sourceTree = ""; }; + 88DC6C46CAE8787FB54161AF /* AutocompleteBaseViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AutocompleteBaseViewController.h; sourceTree = ""; }; + 8F7419DDC82CA074FF0A508C /* AutocompleteWithSearchViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AutocompleteWithSearchViewController.m; sourceTree = ""; }; + 91F10567E79D600B5D3A7385 /* DemoListViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DemoListViewController.h; sourceTree = ""; }; + 97ADBE3D50D731A88C24F3F0 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; + 9B81B9326DD5B37C08B8CCAA /* DemoAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DemoAppDelegate.m; sourceTree = ""; }; + A00F12FEC785E9E287E42582 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + A06B8C341933D23425E2C178 /* AutocompleteModalViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AutocompleteModalViewController.h; sourceTree = ""; }; + A3D4BD9841268F97FD23E770 /* BaseDemoViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = BaseDemoViewController.m; sourceTree = ""; }; + A8162D0DA3B592BBB6E3FA35 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Localizable.strings; sourceTree = ""; }; + A8233D7A6FCDAD9F3E3FFEFC /* pt_PT */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pt_PT; path = pt_PT.lproj/Localizable.strings; sourceTree = ""; }; + A997870E831544227236DF00 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/Localizable.strings; sourceTree = ""; }; + AADF2995CB717FE4D341C944 /* nb */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nb; path = nb.lproj/Localizable.strings; sourceTree = ""; }; + ADB9E4A950DB2EA454486E47 /* AutocompleteWithTextFieldController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AutocompleteWithTextFieldController.m; sourceTree = ""; }; + AF5862DFC2F44C360067E8C5 /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/Localizable.strings; sourceTree = ""; }; + B346F058E854F6546CE4A113 /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/Localizable.strings; sourceTree = ""; }; + B36F7F4AFB067A447A95D21C /* fr_CA */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr_CA; path = fr_CA.lproj/Localizable.strings; sourceTree = ""; }; + B4ABFD22EF8C141BB930DA79 /* es_MX */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es_MX; path = es_MX.lproj/Localizable.strings; sourceTree = ""; }; + B89AD97A10365521ED09C03F /* en_AU */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en_AU; path = en_AU.lproj/Localizable.strings; sourceTree = ""; }; + BB25E63BA7525B4F9C996E94 /* zh_CN */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = zh_CN; path = zh_CN.lproj/Localizable.strings; sourceTree = ""; }; + C4230A88E51B60A9F4C0CF9B /* BaseDemoViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = BaseDemoViewController.h; sourceTree = ""; }; + CBCF32F12AADFF34B1745273 /* zh_TW */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = zh_TW; path = zh_TW.lproj/Localizable.strings; sourceTree = ""; }; + CE0FA365A96C1D97CE01B652 /* sk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sk; path = sk.lproj/Localizable.strings; sourceTree = ""; }; + CF1B1E3D7B5C131B7DF1C10C /* AutocompleteWithSearchViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AutocompleteWithSearchViewController.h; sourceTree = ""; }; + D0E6E2A1285D9A0BEBDCD503 /* AutocompleteBaseViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AutocompleteBaseViewController.m; sourceTree = ""; }; + D1C229B5A414955539EBE107 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Localizable.strings; sourceTree = ""; }; + D5401C957612DEF87E02DC2C /* fi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fi; path = fi.lproj/Localizable.strings; sourceTree = ""; }; + D979103A75E016981230D84D /* FindPlaceLikelihoodListViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FindPlaceLikelihoodListViewController.h; sourceTree = ""; }; + DAB6D5F45E10BD22F8FBB4BA /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/Localizable.strings; sourceTree = ""; }; + E008571503BEEFC5C2BF5D66 /* ko */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ko; path = ko.lproj/Localizable.strings; sourceTree = ""; }; + E0C040E0617744F5A55C8922 /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ar; path = ar.lproj/Localizable.strings; sourceTree = ""; }; + E1502E6F1A86B1773138153B /* AutocompleteModalViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AutocompleteModalViewController.m; sourceTree = ""; }; + E766ACF338BF4D9D9B3C86BA /* en_GB */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en_GB; path = en_GB.lproj/Localizable.strings; sourceTree = ""; }; + E8EBD6572BDD22DD2C8C37F0 /* ro */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ro; path = ro.lproj/Localizable.strings; sourceTree = ""; }; + F2689EA2B2A4F7DC9912D5DE /* AutocompleteWithTextFieldController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AutocompleteWithTextFieldController.h; sourceTree = ""; }; + F3A846055E79359BAF267E70 /* SDKDemoAPIKey.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDKDemoAPIKey.h; sourceTree = ""; }; + F7EFEB4946D6A093B9475CDD /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = tr.lproj/Localizable.strings; sourceTree = ""; }; + F8ABF15D04AF351D0A21A5CD /* DemoAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DemoAppDelegate.h; sourceTree = ""; }; + FA2B20801D4CBBF7439CF693 /* ca */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ca; path = ca.lproj/Localizable.strings; sourceTree = ""; }; + FB0BACDCF9A220122AFB87B5 /* hr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hr; path = hr.lproj/Localizable.strings; sourceTree = ""; }; + FC03FEE150596E9432F612DF /* AutocompleteWithCustomColors.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AutocompleteWithCustomColors.m; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + A91F0EDBE05C0121150AEE46 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 7DF1A5BA0B155A6414638BC6 /* UIKit.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 5451EE1805656445BDA54845 /* Resources */ = { + isa = PBXGroup; + children = ( + F65D01DD8887E3B1B9731DAE /* LaunchScreen.storyboard */, + 1D344C64A66F10D55590797E /* Localizable.strings */, + 85EDEFE42680FF093454D1AB /* PlacesDemoAssets.xcassets */, + ); + path = Resources; + sourceTree = ""; + }; + 5EDD6C0FADBB29C5650216AA /* Autocomplete */ = { + isa = PBXGroup; + children = ( + 88DC6C46CAE8787FB54161AF /* AutocompleteBaseViewController.h */, + D0E6E2A1285D9A0BEBDCD503 /* AutocompleteBaseViewController.m */, + A06B8C341933D23425E2C178 /* AutocompleteModalViewController.h */, + E1502E6F1A86B1773138153B /* AutocompleteModalViewController.m */, + 84E89BC0ADE5F983320B9730 /* AutocompletePushViewController.h */, + 1BAEA89ED8C397E73E2E9730 /* AutocompletePushViewController.m */, + 13C513E93D85CC7B765F9CDB /* AutocompleteWithCustomColors.h */, + FC03FEE150596E9432F612DF /* AutocompleteWithCustomColors.m */, + CF1B1E3D7B5C131B7DF1C10C /* AutocompleteWithSearchViewController.h */, + 8F7419DDC82CA074FF0A508C /* AutocompleteWithSearchViewController.m */, + F2689EA2B2A4F7DC9912D5DE /* AutocompleteWithTextFieldController.h */, + ADB9E4A950DB2EA454486E47 /* AutocompleteWithTextFieldController.m */, + ); + path = Autocomplete; + sourceTree = ""; + }; + 6474F6E51B1B62FD7E19E38F /* Source */ = { + isa = PBXGroup; + children = ( + E437630B6C8A8B3D1C7679DE /* GooglePlacesDemos */, + ); + name = Source; + sourceTree = ""; + }; + 7C4A8D45D6D1B907A8C0521E = { + isa = PBXGroup; + children = ( + 6474F6E51B1B62FD7E19E38F /* Source */, + AB0178922FA6ECEABB9EFFE7 /* Frameworks */, + 87ED31F365F5BCA83FBDE8E8 /* Products */, + ); + sourceTree = ""; + }; + 7ECF3926AB3331C3F787BF0A /* Support */ = { + isa = PBXGroup; + children = ( + C4230A88E51B60A9F4C0CF9B /* BaseDemoViewController.h */, + A3D4BD9841268F97FD23E770 /* BaseDemoViewController.m */, + ); + path = Support; + sourceTree = ""; + }; + 87ED31F365F5BCA83FBDE8E8 /* Products */ = { + isa = PBXGroup; + children = ( + 16C539680ABA55CA7AFC3002 /* GooglePlacesDemos.app */, + ); + name = Products; + sourceTree = ""; + }; + AB0178922FA6ECEABB9EFFE7 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 97ADBE3D50D731A88C24F3F0 /* UIKit.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + D21615D02D1F3EB36750BF21 /* Samples */ = { + isa = PBXGroup; + children = ( + 5EDD6C0FADBB29C5650216AA /* Autocomplete */, + D979103A75E016981230D84D /* FindPlaceLikelihoodListViewController.h */, + 18AE29BAB2CC24B015F7754A /* FindPlaceLikelihoodListViewController.m */, + 3CB3E42FBF23DD0411D5EFB5 /* PagingPhotoView.h */, + 21153EB819432638638C2C26 /* PagingPhotoView.m */, + ); + path = Samples; + sourceTree = ""; + }; + E437630B6C8A8B3D1C7679DE /* GooglePlacesDemos */ = { + isa = PBXGroup; + children = ( + 5451EE1805656445BDA54845 /* Resources */, + D21615D02D1F3EB36750BF21 /* Samples */, + 7ECF3926AB3331C3F787BF0A /* Support */, + F8ABF15D04AF351D0A21A5CD /* DemoAppDelegate.h */, + 9B81B9326DD5B37C08B8CCAA /* DemoAppDelegate.m */, + 611B5E7788AB0459C2AA1A54 /* DemoData.h */, + 4F2203BCCE0CFC3DC4F38B30 /* DemoData.m */, + 91F10567E79D600B5D3A7385 /* DemoListViewController.h */, + 36C753B6637575A8CD81C699 /* DemoListViewController.m */, + F3A846055E79359BAF267E70 /* SDKDemoAPIKey.h */, + 1D0589812EE1F702A7BBA34D /* main.m */, + ); + path = GooglePlacesDemos; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 71EABCA8BFCB342F947AF4D2 /* GooglePlacesDemos */ = { + isa = PBXNativeTarget; + buildConfigurationList = E489F9A9DC7E458708AB572E /* Build configuration list for PBXNativeTarget "GooglePlacesDemos" */; + buildPhases = ( + 2A017491F6C5A9DBB4F6E6F6 /* Resources */, + 45EF04B6738E3486BE121AEC /* Sources */, + A91F0EDBE05C0121150AEE46 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = GooglePlacesDemos; + productName = GooglePlacesDemos; + productReference = 16C539680ABA55CA7AFC3002 /* GooglePlacesDemos.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + B0EA45FFFB815F6F5A3E1BDD /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = YES; + }; + buildConfigurationList = 63964CA36C9733EFF27C66CD /* Build configuration list for PBXProject "GooglePlacesDemos" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = en; + hasScannedForEncodings = 1; + knownRegions = ( + en, + Base, + ar, + ca, + cs, + da, + de, + el, + "en-AU", + "en-GB", + "en-IN", + es, + "es-419", + "es-MX", + fi, + fr, + "fr-CA", + he, + hi, + hr, + hu, + id, + it, + ja, + ko, + ms, + nb, + nl, + pl, + pt, + "pt-BR", + "pt-PT", + ro, + ru, + sk, + sv, + th, + tr, + uk, + vi, + "zh-Hans", + "zh-HK", + "zh-Hant", + ); + mainGroup = 7C4A8D45D6D1B907A8C0521E; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 71EABCA8BFCB342F947AF4D2 /* GooglePlacesDemos */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 2A017491F6C5A9DBB4F6E6F6 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 0166AF076A7926C3F6AF3E91 /* LaunchScreen.storyboard in Resources */, + C31E5320A5DBA3B92410CC12 /* Localizable.strings in Resources */, + 3440EB14B9D0E24AAF030012 /* PlacesDemoAssets.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 45EF04B6738E3486BE121AEC /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 44E1C3298B123A5107DBC3FA /* DemoAppDelegate.m in Sources */, + 68FD32D0AB7DA54A0617E79C /* DemoData.m in Sources */, + 52C261A89C8177D081F0D666 /* DemoListViewController.m in Sources */, + 2E76D90BDA04FEDA32FBC7EE /* main.m in Sources */, + 52FA2C79BAE0253BF65AD4DA /* AutocompleteBaseViewController.m in Sources */, + 8C59A77A235FCAEEE2D7E6CB /* AutocompleteModalViewController.m in Sources */, + 893AFDBC37BAD181B89DBE05 /* AutocompletePushViewController.m in Sources */, + BDCD4957C53C15747F136768 /* AutocompleteWithCustomColors.m in Sources */, + 1F8E76499BD9AC1A594A09DF /* AutocompleteWithSearchViewController.m in Sources */, + 19D03B4688CF7DF76076B137 /* AutocompleteWithTextFieldController.m in Sources */, + 30DB731057D560A0F3017362 /* FindPlaceLikelihoodListViewController.m in Sources */, + CCE1EEA311AF30C9E7273CA6 /* PagingPhotoView.m in Sources */, + A3D84E176FACD02AA9FAC18C /* BaseDemoViewController.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 1D344C64A66F10D55590797E /* Localizable.strings */ = { + isa = PBXVariantGroup; + children = ( + E0C040E0617744F5A55C8922 /* ar */, + FA2B20801D4CBBF7439CF693 /* ca */, + 31A6A624F6D9631C9BFECF9A /* cs */, + 69D781288A761B789E0F63B6 /* da */, + A8162D0DA3B592BBB6E3FA35 /* de */, + 273B1A3F7AA7EED9084B5033 /* el */, + 1FE971FB44A73F445279DA7F /* en */, + B89AD97A10365521ED09C03F /* en_AU */, + E766ACF338BF4D9D9B3C86BA /* en_GB */, + 77688EB771E8262C6C224CE8 /* en_IN */, + A997870E831544227236DF00 /* es */, + 2D52E39A30BD9D0AFC323F7F /* es_419 */, + B4ABFD22EF8C141BB930DA79 /* es_MX */, + D5401C957612DEF87E02DC2C /* fi */, + D1C229B5A414955539EBE107 /* fr */, + B36F7F4AFB067A447A95D21C /* fr_CA */, + 50E198C48B1A11E3B03DBE30 /* he */, + 42C8FE938EFBD5D6633C190F /* hi */, + FB0BACDCF9A220122AFB87B5 /* hr */, + DAB6D5F45E10BD22F8FBB4BA /* hu */, + 55F92A67B1F0F18431DD759C /* id */, + B346F058E854F6546CE4A113 /* it */, + 4268AFE07F8787F0CA36AA3B /* ja */, + E008571503BEEFC5C2BF5D66 /* ko */, + 1DB6FA3886B89186F55A12E3 /* ms */, + AADF2995CB717FE4D341C944 /* nb */, + 0D33295E02D9501C1D45D615 /* nl */, + AF5862DFC2F44C360067E8C5 /* pl */, + 2E4275BAD2E59FA193904FFC /* pt */, + 1A982A54052D846FC64B7AB5 /* pt_BR */, + A8233D7A6FCDAD9F3E3FFEFC /* pt_PT */, + E8EBD6572BDD22DD2C8C37F0 /* ro */, + 216CA36352B45FBC79C98B8F /* ru */, + CE0FA365A96C1D97CE01B652 /* sk */, + 1D767BA5698A891C36ADF830 /* sv */, + 3A822A5CF223FF6ADFCA9458 /* th */, + F7EFEB4946D6A093B9475CDD /* tr */, + 67BD5ABA8E74D336AE54C0B0 /* uk */, + 651835542B635C74A3D0F711 /* vi */, + BB25E63BA7525B4F9C996E94 /* zh_CN */, + 37CA5C28547C65246AC4EAE6 /* zh_HK */, + CBCF32F12AADFF34B1745273 /* zh_TW */, + ); + name = Localizable.strings; + sourceTree = ""; + }; + F65D01DD8887E3B1B9731DAE /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + A00F12FEC785E9E287E42582 /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 1BA056F14489621B09D65C69 /* Default */ = { + isa = XCBuildConfiguration; + buildSettings = { + INTERMEDIATE_DIR = "$(PROJECT_DERIVED_FILE_DIR)/$(CONFIGURATION)"; + SDKROOT = iphoneos; + SHARED_INTERMEDIATE_DIR = "$(SYMROOT)/DerivedSources/$(CONFIGURATION)"; + }; + name = Default; + }; + C88A918BB441623AA489A34D /* Default */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_OBJC_ARC = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + INFOPLIST_FILE = ./GooglePlacesDemos/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LIBRARY_SEARCH_PATHS = ( + ., + "$(SDKROOT)/System/Library/Frameworks", + ); + PRODUCT_NAME = GooglePlacesDemos; + TARGETED_DEVICE_FAMILY = "1,2"; + USER_HEADER_SEARCH_PATHS = "$(SRCROOT)"; + USE_HEADERMAP = NO; + WRAPPER_PREFIX = ""; + }; + name = Default; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 63964CA36C9733EFF27C66CD /* Build configuration list for PBXProject "GooglePlacesDemos" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1BA056F14489621B09D65C69 /* Default */, + ); + defaultConfigurationIsVisible = 1; + defaultConfigurationName = Default; + }; + E489F9A9DC7E458708AB572E /* Build configuration list for PBXNativeTarget "GooglePlacesDemos" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + C88A918BB441623AA489A34D /* Default */, + ); + defaultConfigurationIsVisible = 1; + defaultConfigurationName = Default; + }; +/* End XCConfigurationList section */ + }; + rootObject = B0EA45FFFB815F6F5A3E1BDD /* Project object */; +} diff --git a/Pods/GooglePlaces/Example/GooglePlacesDemos/DemoAppDelegate.h b/Pods/GooglePlaces/Example/GooglePlacesDemos/DemoAppDelegate.h new file mode 100755 index 0000000..37b7d28 --- /dev/null +++ b/Pods/GooglePlaces/Example/GooglePlacesDemos/DemoAppDelegate.h @@ -0,0 +1,22 @@ +/* + * Copyright 2016 Google Inc. All rights reserved. + * + * + * 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. + */ + +#import + +@interface DemoAppDelegate : UIResponder + +@property(strong, nonatomic) UIWindow *window; + +@end diff --git a/Pods/GooglePlaces/Example/GooglePlacesDemos/DemoAppDelegate.m b/Pods/GooglePlaces/Example/GooglePlacesDemos/DemoAppDelegate.m new file mode 100755 index 0000000..dea71d7 --- /dev/null +++ b/Pods/GooglePlaces/Example/GooglePlacesDemos/DemoAppDelegate.m @@ -0,0 +1,65 @@ +/* + * Copyright 2016 Google Inc. All rights reserved. + * + * + * 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. + */ + +#import "GooglePlacesDemos/DemoAppDelegate.h" + +#import +#import "GooglePlacesDemos/DemoData.h" +#import "GooglePlacesDemos/DemoListViewController.h" +#import "GooglePlacesDemos/SDKDemoAPIKey.h" + +@implementation DemoAppDelegate + +- (BOOL)application:(UIApplication *)application + didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { + NSLog(@"Build version: %s", __VERSION__); + + // Do a quick check to see if you've provided an API key, in a real app you wouldn't need this but + // for the demo it means we can provide a better error message. + if (!kAPIKey.length) { + // Blow up if APIKeys have not yet been set. + NSString *bundleId = [[NSBundle mainBundle] bundleIdentifier]; + NSString *format = @"Configure APIKeys inside SDKDemoAPIKey.h for your bundle `%@`, see " + @"README.GooglePlacesDemos for more information"; + @throw [NSException exceptionWithName:@"DemoAppDelegate" + reason:[NSString stringWithFormat:format, bundleId] + userInfo:nil]; + } + + // Provide the Places SDK with your API key. + [GMSPlacesClient provideAPIKey:kAPIKey]; + + // Log the required open source licenses! Yes, just NSLog-ing them is not enough but is good for + // a demo. + NSLog(@"Google Places open source licenses:\n%@", [GMSPlacesClient openSourceLicenseInfo]); + + // Manually create a window. If you are using a storyboard in your own app you can ignore the rest + // of this method. + self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; + + // Create our view controller with the list of demos. + DemoData *demoData = [[DemoData alloc] init]; + DemoListViewController *masterViewController = + [[DemoListViewController alloc] initWithDemoData:demoData]; + UINavigationController *masterNavigationController = + [[UINavigationController alloc] initWithRootViewController:masterViewController]; + self.window.rootViewController = masterNavigationController; + + [self.window makeKeyAndVisible]; + + return YES; +} + +@end diff --git a/Pods/GooglePlaces/Example/GooglePlacesDemos/DemoData.h b/Pods/GooglePlaces/Example/GooglePlacesDemos/DemoData.h new file mode 100755 index 0000000..05f56fc --- /dev/null +++ b/Pods/GooglePlaces/Example/GooglePlacesDemos/DemoData.h @@ -0,0 +1,97 @@ +/* + * Copyright 2016 Google Inc. All rights reserved. + * + * + * 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. + */ + +#import + +#import + +/* + * This file contains a set of data objects which represent the list of demos which are provided by + * this sample app. + */ + +/** + * Represents a specific demo sample, stores the title and the name of the view controller which + * contains the demo code. + */ +@interface Demo : NSObject + +/** + * The title of the demo. This is displayed in the list of demos. + */ +@property(nonatomic, readonly) NSString *title; + +/** + * Construct a |Demo| object with the specified view controller which contains the demo code. + * + * @param viewControllerClass The class of the view controller to display when the demo is selected + * from the list. + */ +- (instancetype)initWithViewControllerClass:(Class)viewControllerClass; + +/** + * Construct and return a new UIViewController instance which contains the view to present when the + * demo is selected from the list. + * + * @param autocompleteFilter The |GMSAutocompleteFilter| that filters on types and countries. + * @param placeField The |GMSPlaceField| to request individual fields for the |GMSPlace| result. + */ +- (UIViewController *)createViewControllerWithAutocompleteFilter: + (GMSAutocompleteFilter *)autocompleteFilter + placeFields:(GMSPlaceField)placeField; + +@end + +/** + * A group of demos which comprise a section in the list of demos. + */ +@interface DemoSection : NSObject + +/** + * The title of the section. + */ +@property(nonatomic, readonly) NSString *title; + +/** + * The list of demos which are contained in the section. + */ +@property(nonatomic, readonly) NSArray *demos; + +/** + * Initialise a |DemoSection| with the specified title and list of demos. + * + * @param title The title of the section. + * @param demos The demos contained in the section. + */ +- (instancetype)initWithTitle:(NSString *)title demos:(NSArray *)demos; + +@end + +/** + * A class which encapsulates the data required to create and display demos. + */ +@interface DemoData : NSObject + +/** + * A list of sections to display. + */ +@property(nonatomic, readonly) NSArray *sections; + +/** + * The first demo to display when launched in side-by-side mode. + */ +@property(nonatomic, readonly) Demo *firstDemo; + +@end diff --git a/Pods/GooglePlaces/Example/GooglePlacesDemos/DemoData.m b/Pods/GooglePlaces/Example/GooglePlacesDemos/DemoData.m new file mode 100755 index 0000000..b76b8ef --- /dev/null +++ b/Pods/GooglePlaces/Example/GooglePlacesDemos/DemoData.m @@ -0,0 +1,102 @@ +/* + * Copyright 2016 Google Inc. All rights reserved. + * + * + * 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. + */ + +#import "GooglePlacesDemos/DemoData.h" + +#import "GooglePlacesDemos/Samples/Autocomplete/AutocompleteModalViewController.h" +#import "GooglePlacesDemos/Samples/Autocomplete/AutocompletePushViewController.h" +#import "GooglePlacesDemos/Samples/Autocomplete/AutocompleteWithCustomColors.h" +#import "GooglePlacesDemos/Samples/Autocomplete/AutocompleteWithSearchViewController.h" +#import "GooglePlacesDemos/Samples/Autocomplete/AutocompleteWithTextFieldController.h" +#import "GooglePlacesDemos/Samples/FindPlaceLikelihoodListViewController.h" +#import "GooglePlacesDemos/Support/BaseDemoViewController.h" + +@implementation Demo { + Class _viewControllerClass; +} + +- (instancetype)initWithViewControllerClass:(Class)viewControllerClass { + if ((self = [self init])) { + _title = [viewControllerClass demoTitle]; + _viewControllerClass = viewControllerClass; + } + return self; +} + +- (UIViewController *)createViewControllerWithAutocompleteFilter: + (GMSAutocompleteFilter *)autocompleteFilter + placeFields:(GMSPlaceField)placeFields { + // Construct the demo view controller. + UIViewController *demoViewController = [[_viewControllerClass alloc] init]; + + // Pass the place fields to the view controller for these classes. + if ([demoViewController isKindOfClass:[AutocompleteBaseViewController class]]) { + AutocompleteBaseViewController *controller = + (AutocompleteBaseViewController *)demoViewController; + controller.autocompleteFilter = autocompleteFilter; + controller.placeFields = placeFields; + } + + return demoViewController; +} + +@end + +@implementation DemoSection + +- (instancetype)initWithTitle:(NSString *)title demos:(NSArray *)demos { + if ((self = [self init])) { + _title = [title copy]; + _demos = [demos copy]; + } + return self; +} + +@end + +@implementation DemoData + +- (instancetype)init { + if ((self = [super init])) { + NSArray *autocompleteDemos = @[ + [[Demo alloc] initWithViewControllerClass:[AutocompleteWithCustomColors class]], + [[Demo alloc] initWithViewControllerClass:[AutocompleteModalViewController class]], + [[Demo alloc] initWithViewControllerClass:[AutocompletePushViewController class]], + [[Demo alloc] initWithViewControllerClass:[AutocompleteWithSearchViewController class]], + [[Demo alloc] initWithViewControllerClass:[AutocompleteWithTextFieldController class]], + ]; + + NSArray *findPlaceLikelihoodDemos = @[ [[Demo alloc] + initWithViewControllerClass:[FindPlaceLikelihoodListViewController class]] ]; + + _sections = @[ + [[DemoSection alloc] + initWithTitle:NSLocalizedString(@"Demo.Section.Title.Autocomplete", + @"Title of the autocomplete demo section") + demos:autocompleteDemos], + [[DemoSection alloc] + initWithTitle:NSLocalizedString(@"Demo.Section.Title.FindPlaceLikelihood", + @"Title of the findPlaceLikelihood demo section") + demos:findPlaceLikelihoodDemos] + ]; + } + return self; +} + +- (Demo *)firstDemo { + return _sections[0].demos[0]; +} + +@end diff --git a/Pods/GooglePlaces/Example/GooglePlacesDemos/DemoListViewController.h b/Pods/GooglePlaces/Example/GooglePlacesDemos/DemoListViewController.h new file mode 100755 index 0000000..6c1d776 --- /dev/null +++ b/Pods/GooglePlaces/Example/GooglePlacesDemos/DemoListViewController.h @@ -0,0 +1,32 @@ +/* + * Copyright 2016 Google Inc. All rights reserved. + * + * + * 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. + */ + +#import + +#import "GooglePlacesDemos/DemoData.h" + +/** + * The class which displays the list of demos. + */ +@interface DemoListViewController : UITableViewController + +/** + * Construct a new list controller using the provided demo data. + * + * @param demoData The demo data to display in the list. + */ +- (instancetype)initWithDemoData:(DemoData *)demoData; + +@end diff --git a/Pods/GooglePlaces/Example/GooglePlacesDemos/DemoListViewController.m b/Pods/GooglePlaces/Example/GooglePlacesDemos/DemoListViewController.m new file mode 100755 index 0000000..ea066c0 --- /dev/null +++ b/Pods/GooglePlaces/Example/GooglePlacesDemos/DemoListViewController.m @@ -0,0 +1,417 @@ +/* + * Copyright 2016 Google Inc. All rights reserved. + * + * + * 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. + */ + +#import "GooglePlacesDemos/DemoListViewController.h" + +#import + +// The cell reuse identifier we are going to use. +static NSString *const kCellIdentifier = @"DemoCellIdentifier"; +static const CGFloat kSelectionHeight = 40; +static const CGFloat kSelectionSwitchWidth = 50; +static const CGFloat kEdgeBuffer = 8; + +@implementation DemoListViewController { + UIViewController *_editSelectionsViewController; + NSMutableDictionary *_autocompleteFiltersSelectionMap; + NSMutableDictionary *_placeFieldsSelectionMap; + NSMutableDictionary *_restrictionBoundsMap; + CGFloat _nextSelectionYPos; + DemoData *_demoData; +} + +- (instancetype)initWithDemoData:(DemoData *)demoData { + if ((self = [self init])) { + _demoData = demoData; + _autocompleteFiltersSelectionMap = [NSMutableDictionary dictionary]; + _placeFieldsSelectionMap = [NSMutableDictionary dictionary]; + _restrictionBoundsMap = [NSMutableDictionary dictionary]; + } + return self; +} + +- (void)viewWillAppear:(BOOL)animated { + // Set up the title for view to be displayed. + self.title = [DemoListViewController titleText]; + [super viewWillAppear:animated]; +} + +- (void)viewWillDisappear:(BOOL)animated { + // Clear the title to make room for next view to share the header space in splitsreen view. + self.title = nil; + [super viewWillDisappear:animated]; +} + +- (void)viewDidLoad { + [super viewDidLoad]; + + // Set up the edit selections UI. + [self setUpEditSelectionsUI]; + + // Add button to the header to edit the place field selections. + self.navigationItem.rightBarButtonItem = + [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemEdit + target:self + action:@selector(beginEditSelections)]; + + // Register a plain old UITableViewCell as this will be sufficient for our list. + [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:kCellIdentifier]; + + // [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(orientationChanged:) + name:UIDeviceOrientationDidChangeNotification + object:[UIDevice currentDevice]]; +} + +/** + * Private method which is called when a demo is selected. Constructs the demo view controller and + * displays it. + * + * @param demo The demo to show. + */ +- (void)showDemo:(Demo *)demo { + CLLocationCoordinate2D northEast = kCLLocationCoordinate2DInvalid; + CLLocationCoordinate2D southWest = kCLLocationCoordinate2DInvalid; + GMSAutocompleteFilter *autocompleteFilter = [self autcompleteFilter]; + + // Check for restriction bounds settings. + if (_restrictionBoundsMap[@"Kansas"].on) { + northEast = CLLocationCoordinate2DMake(39.0, -95.0); + southWest = CLLocationCoordinate2DMake(37.5, -100.0); + autocompleteFilter.origin = [[CLLocation alloc] initWithLatitude:northEast.latitude + longitude:northEast.longitude]; + autocompleteFilter.locationRestriction = + GMSPlaceRectangularLocationOption(northEast, southWest); + } else if (_restrictionBoundsMap[@"Canada"].on) { + northEast = CLLocationCoordinate2DMake(70.0, -60.0); + southWest = CLLocationCoordinate2DMake(50.0, -140.0); + autocompleteFilter.origin = [[CLLocation alloc] initWithLatitude:northEast.latitude + longitude:northEast.longitude]; + autocompleteFilter.locationRestriction = + GMSPlaceRectangularLocationOption(northEast, southWest); + } + + // Create view controller with the autocomplete filters, bounds and selected place fields. + UIViewController *viewController = + [demo createViewControllerWithAutocompleteFilter:autocompleteFilter + placeFields:[self selectedPlaceFields]]; + [self.navigationController pushViewController:viewController animated:YES]; +} + +#pragma mark - Edit Autocomplete Filters and Place Fields selections UI + +- (void)setUpEditSelectionsUI { + // Initialize the place fields selection UI. + UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:self.view.frame]; + scrollView.backgroundColor = [UIColor whiteColor]; + + // Add heading for the autocomplete type filters. + _nextSelectionYPos = [UIApplication sharedApplication].statusBarFrame.size.height; + [scrollView addSubview:[self headerLabelForTitle:@"Autcomplete Filters"]]; + + // Set up the individual autocomplete type filters we can limit the results to. + // Add a heading for the place fields that we can request. + _nextSelectionYPos += kSelectionHeight; + for (NSInteger autocompleteFilterType = kGMSPlacesAutocompleteTypeFilterGeocode; + autocompleteFilterType <= kGMSPlacesAutocompleteTypeFilterCity; ++autocompleteFilterType) { + [scrollView + addSubview:[self selectionButtonForAutocompleteFilterType:(GMSPlacesAutocompleteTypeFilter) + autocompleteFilterType]]; + } + + // Add heading for the autocomplete restriction bounds. + [scrollView addSubview:[self headerLabelForTitle:@"Autcomplete Restriction Bounds"]]; + + // Set up the restriction bounds for testing purposes. + _nextSelectionYPos += kSelectionHeight; + [scrollView addSubview:[self selectionButtonForRestrictionBoundsArea:@"Canada"]]; + + _nextSelectionYPos += kSelectionHeight; + [scrollView addSubview:[self selectionButtonForRestrictionBoundsArea:@"Kansas"]]; + + // Add heading for the place fields that we can request. + _nextSelectionYPos += kSelectionHeight; + [scrollView addSubview:[self headerLabelForTitle:@"Place Fields"]]; + + // Set up the individual place fields that we can request. + _nextSelectionYPos += kSelectionHeight; + for (NSUInteger placeField = GMSPlaceFieldName; placeField <= GMSPlaceFieldUTCOffsetMinutes; + placeField <<= 1) { + [scrollView addSubview:[self selectionButtonForPlaceField:(GMSPlaceField)placeField]]; + } + + // Add the close button to dismiss the selection UI. + UIButton *close = + [[UIButton alloc] initWithFrame:CGRectMake(0, _nextSelectionYPos, self.view.frame.size.width, + kSelectionHeight)]; + close.backgroundColor = [UIColor blueColor]; + [close setTitle:@"Close" forState:UIControlStateNormal]; + [close setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; + [close addTarget:self + action:@selector(endEditSelections:) + forControlEvents:UIControlEventTouchUpInside]; + [scrollView addSubview:close]; + + // Set the content size for the scroll view after we determine the height of all the contents. + scrollView.contentSize = CGSizeMake(scrollView.frame.size.width, + close.frame.origin.y + close.frame.size.height + kEdgeBuffer); + + // Initialize the edit selections view controller. + _editSelectionsViewController = [[UIViewController alloc] init]; + _editSelectionsViewController.view = scrollView; +} + +- (void)updateFrameForSelectionViews:(UIView *)view { + CGFloat horizontalInset = [self horizontalInset]; + view.frame = + CGRectMake(horizontalInset, view.frame.origin.y, + self.view.frame.size.width - (2 * horizontalInset), view.frame.size.height); + for (UIView *subView in view.subviews) { + if ([subView isKindOfClass:[UISwitch class]]) { + subView.frame = + CGRectMake(view.frame.size.width - kSelectionSwitchWidth, subView.frame.origin.y, + subView.frame.size.width, subView.frame.size.height); + } + } +} + +- (UILabel *)headerLabelForTitle:(NSString *)title { + UILabel *headerLabel = + [[UILabel alloc] initWithFrame:CGRectMake(0, _nextSelectionYPos, self.view.frame.size.width, + kSelectionHeight)]; + headerLabel.backgroundColor = [UIColor lightGrayColor]; + headerLabel.text = title; + headerLabel.textAlignment = NSTextAlignmentCenter; + headerLabel.textColor = [UIColor whiteColor]; + headerLabel.userInteractionEnabled = NO; + return headerLabel; +} + +- (UIButton *)selectionButtonForTitle:(NSString *)title { + UIButton *selectionButton = + [[UIButton alloc] initWithFrame:CGRectMake(0, _nextSelectionYPos, self.view.frame.size.width, + kSelectionHeight)]; + UISwitch *selectionSwitch = [[UISwitch alloc] + initWithFrame:CGRectMake(selectionButton.frame.size.width - kSelectionSwitchWidth, + kEdgeBuffer / 2, kSelectionSwitchWidth, kSelectionHeight)]; + selectionSwitch.userInteractionEnabled = NO; + [selectionButton addTarget:self + action:@selector(selectionButtonTapped:) + forControlEvents:UIControlEventTouchUpInside]; + [selectionButton setBackgroundColor:[UIColor whiteColor]]; + [selectionButton setTitle:title forState:UIControlStateNormal]; + [selectionButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; + selectionButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft; + [selectionButton addSubview:selectionSwitch]; + return selectionButton; +} + +- (UIButton *)selectionButtonForPlaceField:(GMSPlaceField)placeField { + NSDictionary *fieldsMapping = @{ + @(GMSPlaceFieldName) : @"Name", + @(GMSPlaceFieldPlaceID) : @"Place ID", + @(GMSPlaceFieldPlusCode) : @"Plus Code", + @(GMSPlaceFieldCoordinate) : @"Coordinate", + @(GMSPlaceFieldOpeningHours) : @"Opening Hours", + @(GMSPlaceFieldPhoneNumber) : @"Phone Number", + @(GMSPlaceFieldFormattedAddress) : @"Formatted Address", + @(GMSPlaceFieldRating) : @"Rating", + @(GMSPlaceFieldUserRatingsTotal) : @"User Ratings Total", + @(GMSPlaceFieldPriceLevel) : @"Price Level", + @(GMSPlaceFieldTypes) : @"Types", + @(GMSPlaceFieldWebsite) : @"Website", + @(GMSPlaceFieldViewport) : @"Viewport", + @(GMSPlaceFieldAddressComponents) : @"Address Components", + @(GMSPlaceFieldPhotos) : @"Photos", + @(GMSPlaceFieldUTCOffsetMinutes) : @"UTC Offset Minutes", + }; + UIButton *selectionButton = [self selectionButtonForTitle:fieldsMapping[@(placeField)]]; + UISwitch *selectionSwitch = [self switchFromButton:selectionButton]; + [selectionSwitch setOn:YES]; + _placeFieldsSelectionMap[@(placeField)] = selectionSwitch; + _nextSelectionYPos += selectionButton.frame.size.height; + return selectionButton; +} + +- (UIButton *)selectionButtonForAutocompleteFilterType: + (GMSPlacesAutocompleteTypeFilter)autocompleteFilter { + NSDictionary *fieldsMapping = @{ + @(kGMSPlacesAutocompleteTypeFilterGeocode) : @"Geocode", + @(kGMSPlacesAutocompleteTypeFilterAddress) : @"Address", + @(kGMSPlacesAutocompleteTypeFilterEstablishment) : @"Establishment", + @(kGMSPlacesAutocompleteTypeFilterRegion) : @"Region", + @(kGMSPlacesAutocompleteTypeFilterCity) : @"City", + }; + UIButton *selectionButton = [self selectionButtonForTitle:fieldsMapping[@(autocompleteFilter)]]; + [selectionButton addTarget:self + action:@selector(disableOtherAutocompleteFilterExceptForTapped:) + forControlEvents:UIControlEventTouchUpInside]; + UISwitch *selectionSwitch = [self switchFromButton:selectionButton]; + [selectionSwitch setOn:NO]; + _autocompleteFiltersSelectionMap[@(autocompleteFilter)] = selectionSwitch; + _nextSelectionYPos += selectionButton.frame.size.height; + return selectionButton; +} + +- (UIButton *)selectionButtonForRestrictionBoundsArea:(NSString *)area { + UIButton *selectionButton = [self selectionButtonForTitle:area]; + [selectionButton addTarget:self + action:@selector(disableOtherRestrictionBoundsExceptForTapped:) + forControlEvents:UIControlEventTouchUpInside]; + _restrictionBoundsMap[area] = [self switchFromButton:selectionButton]; + [_restrictionBoundsMap[area] setOn:NO]; + return selectionButton; +} + +- (UISwitch *)switchFromButton:(UIButton *)button { + for (UIView *subView in button.subviews) { + if ([subView isKindOfClass:[UISwitch class]]) { + return (UISwitch *)subView; + } + } + return nil; +} + +- (void)selectionButtonTapped:(UIButton *)sender { + UISwitch *selectionSwitch = [self switchFromButton:sender]; + [selectionSwitch setOn:selectionSwitch.on ? NO : YES animated:YES]; +} + +- (void)disableOtherAutocompleteFilterExceptForTapped:(UIButton *)sender { + UISwitch *tappedSwitch = [self switchFromButton:sender]; + for (NSNumber *number in _autocompleteFiltersSelectionMap) { + UISwitch *selectionSwitch = _autocompleteFiltersSelectionMap[number]; + if (selectionSwitch != tappedSwitch) { + [selectionSwitch setOn:NO animated:YES]; + } + } +} + +- (void)disableOtherRestrictionBoundsExceptForTapped:(UIButton *)sender { + UISwitch *tappedSwitch = [self switchFromButton:sender]; + for (NSString *key in [_restrictionBoundsMap allKeys]) { + UISwitch *selectionSwitch = _restrictionBoundsMap[key]; + if (selectionSwitch != tappedSwitch) { + [selectionSwitch setOn:NO animated:YES]; + } + } +} + +- (void)beginEditSelections { + // Update the selection views to fit the current device frame and orientation. + for (UIView *view in _editSelectionsViewController.view.subviews) { + [self updateFrameForSelectionViews:view]; + } + + // Scroll the contents to the top before presenting the selection UI. + UIScrollView *scrollView = (UIScrollView *)_editSelectionsViewController.view; + [scrollView setContentOffset:CGPointZero animated:NO]; + + // Present the selection UI to edit which place fields to request. + [self.navigationController presentViewController:_editSelectionsViewController + animated:YES + completion:nil]; +} + +- (void)endEditSelections:(UIButton *)sender { + [_editSelectionsViewController dismissViewControllerAnimated:YES completion:nil]; +} + +- (GMSAutocompleteFilter *)autcompleteFilter { + GMSAutocompleteFilter *filter = [[GMSAutocompleteFilter alloc] init]; + for (NSNumber *number in _autocompleteFiltersSelectionMap) { + UISwitch *selectionSwitch = _autocompleteFiltersSelectionMap[number]; + if ([selectionSwitch isOn]) { + filter.type = (GMSPlacesAutocompleteTypeFilter)[number integerValue]; + break; + } + } + return filter; +} + +- (GMSPlaceField)selectedPlaceFields { + GMSPlaceField placeFields = 0; + for (NSNumber *number in _placeFieldsSelectionMap) { + UISwitch *selectionSwitch = _placeFieldsSelectionMap[number]; + if ([selectionSwitch isOn]) { + placeFields |= [number integerValue]; + } + } + return placeFields; +} + +- (CGFloat)horizontalInset { +#if defined(__IPHONE_11_0) && (__IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_11_0) + // Take into account the safe areas of the device screen and do not use that space. + if (@available(iOS 11.0, *)) { + return MAX(self.view.safeAreaInsets.left, self.view.safeAreaInsets.right) + kEdgeBuffer; + } +#endif + return kEdgeBuffer; +} + +#pragma mark - UITableViewDataSource/Delegate + +- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { + return _demoData.sections.count; +} + +- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { + return _demoData.sections[section].demos.count; +} + +- (UITableViewCell *)tableView:(UITableView *)tableView + cellForRowAtIndexPath:(NSIndexPath *)indexPath { + // Dequeue a table view cell to use. + UITableViewCell *cell = + [tableView dequeueReusableCellWithIdentifier:kCellIdentifier forIndexPath:indexPath]; + + // Grab the demo object. + Demo *demo = _demoData.sections[indexPath.section].demos[indexPath.row]; + + // Configure the demo title on the cell. + cell.textLabel.text = demo.title; + + return cell; +} + +- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { + return _demoData.sections[section].title; +} + +- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { + // Get the demo which was selected. + Demo *demo = _demoData.sections[indexPath.section].demos[indexPath.row]; + [self showDemo:demo]; +} + ++ (NSString *)titleText { + NSString *titleFormat = NSLocalizedString( + @"App.NameAndVersion", @"The name of the app to display in a navigation bar along with a " + @"placeholder for the SDK version number"); + return [NSString stringWithFormat:titleFormat, [GMSPlacesClient SDKLongVersion]]; +} + +#pragma mark - Handle Orientation Changes + +- (void)orientationChanged:(NSNotification *)notification { + // Dismiss the selections UI if currently active. + if (_editSelectionsViewController.isViewLoaded && _editSelectionsViewController.view.window) { + [self endEditSelections:nil]; + } +} + +@end diff --git a/Pods/GooglePlaces/Example/GooglePlacesDemos/Info.plist b/Pods/GooglePlaces/Example/GooglePlacesDemos/Info.plist new file mode 100755 index 0000000..b6a4f96 --- /dev/null +++ b/Pods/GooglePlaces/Example/GooglePlacesDemos/Info.plist @@ -0,0 +1,51 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIcons + + CFBundleIcons~ipad + + CFBundleIdentifier + com.example.GooglePlacesDemos + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1.0 + LSApplicationCategoryType + + LSRequiresIPhoneOS + + NSLocationWhenInUseUsageDescription + Show your location on a map + UILaunchStoryboardName + LaunchScreen + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeRight + UIInterfaceOrientationLandscapeLeft + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/Base.lproj/LaunchScreen.storyboard b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/Base.lproj/LaunchScreen.storyboard new file mode 100755 index 0000000..1eb368c --- /dev/null +++ b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/PlacesDemoAssets.xcassets/AppIcon.appiconset/Contents.json b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/PlacesDemoAssets.xcassets/AppIcon.appiconset/Contents.json new file mode 100755 index 0000000..2cadbf3 --- /dev/null +++ b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/PlacesDemoAssets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,98 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "3x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Places-API-Demo-App_120.png", + "scale" : "2x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Places-API-Demo-App_180.png", + "scale" : "3x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "2x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Places-API-Demo-App_76.png", + "scale" : "1x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Places-API-Demo-App_152.png", + "scale" : "2x" + }, + { + "size" : "83.5x83.5", + "idiom" : "ipad", + "filename" : "Places-API-Demo-App_167.png", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/PlacesDemoAssets.xcassets/AppIcon.appiconset/Places-API-Demo-App_120.png b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/PlacesDemoAssets.xcassets/AppIcon.appiconset/Places-API-Demo-App_120.png new file mode 100755 index 0000000..79d7dc9 Binary files /dev/null and b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/PlacesDemoAssets.xcassets/AppIcon.appiconset/Places-API-Demo-App_120.png differ diff --git a/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/PlacesDemoAssets.xcassets/AppIcon.appiconset/Places-API-Demo-App_152.png b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/PlacesDemoAssets.xcassets/AppIcon.appiconset/Places-API-Demo-App_152.png new file mode 100755 index 0000000..0151e0d Binary files /dev/null and b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/PlacesDemoAssets.xcassets/AppIcon.appiconset/Places-API-Demo-App_152.png differ diff --git a/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/PlacesDemoAssets.xcassets/AppIcon.appiconset/Places-API-Demo-App_167.png b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/PlacesDemoAssets.xcassets/AppIcon.appiconset/Places-API-Demo-App_167.png new file mode 100755 index 0000000..cee6f35 Binary files /dev/null and b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/PlacesDemoAssets.xcassets/AppIcon.appiconset/Places-API-Demo-App_167.png differ diff --git a/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/PlacesDemoAssets.xcassets/AppIcon.appiconset/Places-API-Demo-App_180.png b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/PlacesDemoAssets.xcassets/AppIcon.appiconset/Places-API-Demo-App_180.png new file mode 100755 index 0000000..969960e Binary files /dev/null and b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/PlacesDemoAssets.xcassets/AppIcon.appiconset/Places-API-Demo-App_180.png differ diff --git a/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/PlacesDemoAssets.xcassets/AppIcon.appiconset/Places-API-Demo-App_76.png b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/PlacesDemoAssets.xcassets/AppIcon.appiconset/Places-API-Demo-App_76.png new file mode 100755 index 0000000..94600cd Binary files /dev/null and b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/PlacesDemoAssets.xcassets/AppIcon.appiconset/Places-API-Demo-App_76.png differ diff --git a/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/PlacesDemoAssets.xcassets/Contents.json b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/PlacesDemoAssets.xcassets/Contents.json new file mode 100755 index 0000000..da4a164 --- /dev/null +++ b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/PlacesDemoAssets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/ar.lproj/Localizable.strings b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/ar.lproj/Localizable.strings new file mode 100755 index 0000000..f01e41c --- /dev/null +++ b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/ar.lproj/Localizable.strings @@ -0,0 +1,57 @@ +// NOTE: This is the english localization and has been copied to all languages. The reason for doing +// this is it signals to iOS that the app "supports" all of these languages. This is helpful for a +// demo as it allows you to try out the localization features of the Places SDK. In a shipping app +// you should never do this, it is for demonstration purposes only. + + +// The name of the app to display in a navigation bar along with a placeholder for the SDK version number. +"App.NameAndVersion"="Places Demos: %1$@"; + +// Title of the full-screen autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.FullScreen"="Full-Screen Autocomplete"; +// Title of the pushed autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.Push"="Push Autocomplete"; +// Title of the UISearchController autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UISearchController"="UISearchController"; +// Title of the UISearchDisplayController autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UISearchDisplayController"="UISearchDisplayController"; +// Title of the UITextField autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UITextField"="UITextField"; +// Title of the Styling autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.Styling"="Custom Autocomplete Styling"; +// Title of the photos demo for display in a list or nav header +"Demo.Title.Photos"="Photos"; +// Title of the 'select place' button within the photos demo +"Demo.Title.Photos.SelectPlace"="Select Place"; +// Title of the Place Picker demo for displaying the picker in a popover, navigation controller, or modally. +"Demo.Title.PlacePicker.ViewController"="Place Picker View Controller"; +// Title of the autocomplete demo section +"Demo.Section.Title.Autocomplete"="Autocomplete"; +// Title of the 'Programmatic' demo section +"Demo.Section.Title.Programmatic"="Programmatic APIs"; +// Title of the findPlacesLikelihood demo section +"Demo.Section.Title.FindPlaceLikelihood"="Likelihoods"; + +// Button title for 'show autocomplete widget' +"Demo.Content.Autocomplete.ShowWidgetButton"="Show Autocomplete Widget"; +// Prompt to enter text for autocomplete demo +"Demo.Content.Autocomplete.EnterTextPrompt"="Enter Autocomplete Text Here"; +// Format string for 'autocomplete failed with error' message +"Demo.Content.Autocomplete.FailedErrorMessage"="Autocomplete failed with error: %1$@"; +// String for 'autocomplete canceled message' +"Demo.Content.Autocomplete.WasCanceledMessage"="Autocomplete was canceled"; +// Button title for the 'Yellow and Brown' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.YellowAndBrown"="Yellow and Brown"; +// Button title for the 'White on Black' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.WhiteOnBlack"="White on Black"; +// Button title for the 'Blue Colors' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.BlueColors"="Blue Colors"; +// Button title for the 'Hot Dog Stand' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.HotDogStand"="Hot Dog Stand"; +// Button title for the 'Popover' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Popover"="Popover"; +// Button title for the 'Navigation' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Navigation"="Navigation"; +// Button title for the 'Modal' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Modal"="Modal"; + diff --git a/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/ca.lproj/Localizable.strings b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/ca.lproj/Localizable.strings new file mode 100755 index 0000000..f01e41c --- /dev/null +++ b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/ca.lproj/Localizable.strings @@ -0,0 +1,57 @@ +// NOTE: This is the english localization and has been copied to all languages. The reason for doing +// this is it signals to iOS that the app "supports" all of these languages. This is helpful for a +// demo as it allows you to try out the localization features of the Places SDK. In a shipping app +// you should never do this, it is for demonstration purposes only. + + +// The name of the app to display in a navigation bar along with a placeholder for the SDK version number. +"App.NameAndVersion"="Places Demos: %1$@"; + +// Title of the full-screen autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.FullScreen"="Full-Screen Autocomplete"; +// Title of the pushed autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.Push"="Push Autocomplete"; +// Title of the UISearchController autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UISearchController"="UISearchController"; +// Title of the UISearchDisplayController autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UISearchDisplayController"="UISearchDisplayController"; +// Title of the UITextField autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UITextField"="UITextField"; +// Title of the Styling autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.Styling"="Custom Autocomplete Styling"; +// Title of the photos demo for display in a list or nav header +"Demo.Title.Photos"="Photos"; +// Title of the 'select place' button within the photos demo +"Demo.Title.Photos.SelectPlace"="Select Place"; +// Title of the Place Picker demo for displaying the picker in a popover, navigation controller, or modally. +"Demo.Title.PlacePicker.ViewController"="Place Picker View Controller"; +// Title of the autocomplete demo section +"Demo.Section.Title.Autocomplete"="Autocomplete"; +// Title of the 'Programmatic' demo section +"Demo.Section.Title.Programmatic"="Programmatic APIs"; +// Title of the findPlacesLikelihood demo section +"Demo.Section.Title.FindPlaceLikelihood"="Likelihoods"; + +// Button title for 'show autocomplete widget' +"Demo.Content.Autocomplete.ShowWidgetButton"="Show Autocomplete Widget"; +// Prompt to enter text for autocomplete demo +"Demo.Content.Autocomplete.EnterTextPrompt"="Enter Autocomplete Text Here"; +// Format string for 'autocomplete failed with error' message +"Demo.Content.Autocomplete.FailedErrorMessage"="Autocomplete failed with error: %1$@"; +// String for 'autocomplete canceled message' +"Demo.Content.Autocomplete.WasCanceledMessage"="Autocomplete was canceled"; +// Button title for the 'Yellow and Brown' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.YellowAndBrown"="Yellow and Brown"; +// Button title for the 'White on Black' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.WhiteOnBlack"="White on Black"; +// Button title for the 'Blue Colors' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.BlueColors"="Blue Colors"; +// Button title for the 'Hot Dog Stand' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.HotDogStand"="Hot Dog Stand"; +// Button title for the 'Popover' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Popover"="Popover"; +// Button title for the 'Navigation' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Navigation"="Navigation"; +// Button title for the 'Modal' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Modal"="Modal"; + diff --git a/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/cs.lproj/Localizable.strings b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/cs.lproj/Localizable.strings new file mode 100755 index 0000000..f01e41c --- /dev/null +++ b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/cs.lproj/Localizable.strings @@ -0,0 +1,57 @@ +// NOTE: This is the english localization and has been copied to all languages. The reason for doing +// this is it signals to iOS that the app "supports" all of these languages. This is helpful for a +// demo as it allows you to try out the localization features of the Places SDK. In a shipping app +// you should never do this, it is for demonstration purposes only. + + +// The name of the app to display in a navigation bar along with a placeholder for the SDK version number. +"App.NameAndVersion"="Places Demos: %1$@"; + +// Title of the full-screen autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.FullScreen"="Full-Screen Autocomplete"; +// Title of the pushed autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.Push"="Push Autocomplete"; +// Title of the UISearchController autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UISearchController"="UISearchController"; +// Title of the UISearchDisplayController autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UISearchDisplayController"="UISearchDisplayController"; +// Title of the UITextField autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UITextField"="UITextField"; +// Title of the Styling autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.Styling"="Custom Autocomplete Styling"; +// Title of the photos demo for display in a list or nav header +"Demo.Title.Photos"="Photos"; +// Title of the 'select place' button within the photos demo +"Demo.Title.Photos.SelectPlace"="Select Place"; +// Title of the Place Picker demo for displaying the picker in a popover, navigation controller, or modally. +"Demo.Title.PlacePicker.ViewController"="Place Picker View Controller"; +// Title of the autocomplete demo section +"Demo.Section.Title.Autocomplete"="Autocomplete"; +// Title of the 'Programmatic' demo section +"Demo.Section.Title.Programmatic"="Programmatic APIs"; +// Title of the findPlacesLikelihood demo section +"Demo.Section.Title.FindPlaceLikelihood"="Likelihoods"; + +// Button title for 'show autocomplete widget' +"Demo.Content.Autocomplete.ShowWidgetButton"="Show Autocomplete Widget"; +// Prompt to enter text for autocomplete demo +"Demo.Content.Autocomplete.EnterTextPrompt"="Enter Autocomplete Text Here"; +// Format string for 'autocomplete failed with error' message +"Demo.Content.Autocomplete.FailedErrorMessage"="Autocomplete failed with error: %1$@"; +// String for 'autocomplete canceled message' +"Demo.Content.Autocomplete.WasCanceledMessage"="Autocomplete was canceled"; +// Button title for the 'Yellow and Brown' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.YellowAndBrown"="Yellow and Brown"; +// Button title for the 'White on Black' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.WhiteOnBlack"="White on Black"; +// Button title for the 'Blue Colors' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.BlueColors"="Blue Colors"; +// Button title for the 'Hot Dog Stand' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.HotDogStand"="Hot Dog Stand"; +// Button title for the 'Popover' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Popover"="Popover"; +// Button title for the 'Navigation' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Navigation"="Navigation"; +// Button title for the 'Modal' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Modal"="Modal"; + diff --git a/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/da.lproj/Localizable.strings b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/da.lproj/Localizable.strings new file mode 100755 index 0000000..f01e41c --- /dev/null +++ b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/da.lproj/Localizable.strings @@ -0,0 +1,57 @@ +// NOTE: This is the english localization and has been copied to all languages. The reason for doing +// this is it signals to iOS that the app "supports" all of these languages. This is helpful for a +// demo as it allows you to try out the localization features of the Places SDK. In a shipping app +// you should never do this, it is for demonstration purposes only. + + +// The name of the app to display in a navigation bar along with a placeholder for the SDK version number. +"App.NameAndVersion"="Places Demos: %1$@"; + +// Title of the full-screen autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.FullScreen"="Full-Screen Autocomplete"; +// Title of the pushed autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.Push"="Push Autocomplete"; +// Title of the UISearchController autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UISearchController"="UISearchController"; +// Title of the UISearchDisplayController autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UISearchDisplayController"="UISearchDisplayController"; +// Title of the UITextField autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UITextField"="UITextField"; +// Title of the Styling autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.Styling"="Custom Autocomplete Styling"; +// Title of the photos demo for display in a list or nav header +"Demo.Title.Photos"="Photos"; +// Title of the 'select place' button within the photos demo +"Demo.Title.Photos.SelectPlace"="Select Place"; +// Title of the Place Picker demo for displaying the picker in a popover, navigation controller, or modally. +"Demo.Title.PlacePicker.ViewController"="Place Picker View Controller"; +// Title of the autocomplete demo section +"Demo.Section.Title.Autocomplete"="Autocomplete"; +// Title of the 'Programmatic' demo section +"Demo.Section.Title.Programmatic"="Programmatic APIs"; +// Title of the findPlacesLikelihood demo section +"Demo.Section.Title.FindPlaceLikelihood"="Likelihoods"; + +// Button title for 'show autocomplete widget' +"Demo.Content.Autocomplete.ShowWidgetButton"="Show Autocomplete Widget"; +// Prompt to enter text for autocomplete demo +"Demo.Content.Autocomplete.EnterTextPrompt"="Enter Autocomplete Text Here"; +// Format string for 'autocomplete failed with error' message +"Demo.Content.Autocomplete.FailedErrorMessage"="Autocomplete failed with error: %1$@"; +// String for 'autocomplete canceled message' +"Demo.Content.Autocomplete.WasCanceledMessage"="Autocomplete was canceled"; +// Button title for the 'Yellow and Brown' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.YellowAndBrown"="Yellow and Brown"; +// Button title for the 'White on Black' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.WhiteOnBlack"="White on Black"; +// Button title for the 'Blue Colors' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.BlueColors"="Blue Colors"; +// Button title for the 'Hot Dog Stand' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.HotDogStand"="Hot Dog Stand"; +// Button title for the 'Popover' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Popover"="Popover"; +// Button title for the 'Navigation' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Navigation"="Navigation"; +// Button title for the 'Modal' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Modal"="Modal"; + diff --git a/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/de.lproj/Localizable.strings b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/de.lproj/Localizable.strings new file mode 100755 index 0000000..f01e41c --- /dev/null +++ b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/de.lproj/Localizable.strings @@ -0,0 +1,57 @@ +// NOTE: This is the english localization and has been copied to all languages. The reason for doing +// this is it signals to iOS that the app "supports" all of these languages. This is helpful for a +// demo as it allows you to try out the localization features of the Places SDK. In a shipping app +// you should never do this, it is for demonstration purposes only. + + +// The name of the app to display in a navigation bar along with a placeholder for the SDK version number. +"App.NameAndVersion"="Places Demos: %1$@"; + +// Title of the full-screen autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.FullScreen"="Full-Screen Autocomplete"; +// Title of the pushed autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.Push"="Push Autocomplete"; +// Title of the UISearchController autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UISearchController"="UISearchController"; +// Title of the UISearchDisplayController autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UISearchDisplayController"="UISearchDisplayController"; +// Title of the UITextField autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UITextField"="UITextField"; +// Title of the Styling autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.Styling"="Custom Autocomplete Styling"; +// Title of the photos demo for display in a list or nav header +"Demo.Title.Photos"="Photos"; +// Title of the 'select place' button within the photos demo +"Demo.Title.Photos.SelectPlace"="Select Place"; +// Title of the Place Picker demo for displaying the picker in a popover, navigation controller, or modally. +"Demo.Title.PlacePicker.ViewController"="Place Picker View Controller"; +// Title of the autocomplete demo section +"Demo.Section.Title.Autocomplete"="Autocomplete"; +// Title of the 'Programmatic' demo section +"Demo.Section.Title.Programmatic"="Programmatic APIs"; +// Title of the findPlacesLikelihood demo section +"Demo.Section.Title.FindPlaceLikelihood"="Likelihoods"; + +// Button title for 'show autocomplete widget' +"Demo.Content.Autocomplete.ShowWidgetButton"="Show Autocomplete Widget"; +// Prompt to enter text for autocomplete demo +"Demo.Content.Autocomplete.EnterTextPrompt"="Enter Autocomplete Text Here"; +// Format string for 'autocomplete failed with error' message +"Demo.Content.Autocomplete.FailedErrorMessage"="Autocomplete failed with error: %1$@"; +// String for 'autocomplete canceled message' +"Demo.Content.Autocomplete.WasCanceledMessage"="Autocomplete was canceled"; +// Button title for the 'Yellow and Brown' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.YellowAndBrown"="Yellow and Brown"; +// Button title for the 'White on Black' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.WhiteOnBlack"="White on Black"; +// Button title for the 'Blue Colors' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.BlueColors"="Blue Colors"; +// Button title for the 'Hot Dog Stand' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.HotDogStand"="Hot Dog Stand"; +// Button title for the 'Popover' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Popover"="Popover"; +// Button title for the 'Navigation' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Navigation"="Navigation"; +// Button title for the 'Modal' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Modal"="Modal"; + diff --git a/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/el.lproj/Localizable.strings b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/el.lproj/Localizable.strings new file mode 100755 index 0000000..f01e41c --- /dev/null +++ b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/el.lproj/Localizable.strings @@ -0,0 +1,57 @@ +// NOTE: This is the english localization and has been copied to all languages. The reason for doing +// this is it signals to iOS that the app "supports" all of these languages. This is helpful for a +// demo as it allows you to try out the localization features of the Places SDK. In a shipping app +// you should never do this, it is for demonstration purposes only. + + +// The name of the app to display in a navigation bar along with a placeholder for the SDK version number. +"App.NameAndVersion"="Places Demos: %1$@"; + +// Title of the full-screen autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.FullScreen"="Full-Screen Autocomplete"; +// Title of the pushed autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.Push"="Push Autocomplete"; +// Title of the UISearchController autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UISearchController"="UISearchController"; +// Title of the UISearchDisplayController autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UISearchDisplayController"="UISearchDisplayController"; +// Title of the UITextField autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UITextField"="UITextField"; +// Title of the Styling autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.Styling"="Custom Autocomplete Styling"; +// Title of the photos demo for display in a list or nav header +"Demo.Title.Photos"="Photos"; +// Title of the 'select place' button within the photos demo +"Demo.Title.Photos.SelectPlace"="Select Place"; +// Title of the Place Picker demo for displaying the picker in a popover, navigation controller, or modally. +"Demo.Title.PlacePicker.ViewController"="Place Picker View Controller"; +// Title of the autocomplete demo section +"Demo.Section.Title.Autocomplete"="Autocomplete"; +// Title of the 'Programmatic' demo section +"Demo.Section.Title.Programmatic"="Programmatic APIs"; +// Title of the findPlacesLikelihood demo section +"Demo.Section.Title.FindPlaceLikelihood"="Likelihoods"; + +// Button title for 'show autocomplete widget' +"Demo.Content.Autocomplete.ShowWidgetButton"="Show Autocomplete Widget"; +// Prompt to enter text for autocomplete demo +"Demo.Content.Autocomplete.EnterTextPrompt"="Enter Autocomplete Text Here"; +// Format string for 'autocomplete failed with error' message +"Demo.Content.Autocomplete.FailedErrorMessage"="Autocomplete failed with error: %1$@"; +// String for 'autocomplete canceled message' +"Demo.Content.Autocomplete.WasCanceledMessage"="Autocomplete was canceled"; +// Button title for the 'Yellow and Brown' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.YellowAndBrown"="Yellow and Brown"; +// Button title for the 'White on Black' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.WhiteOnBlack"="White on Black"; +// Button title for the 'Blue Colors' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.BlueColors"="Blue Colors"; +// Button title for the 'Hot Dog Stand' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.HotDogStand"="Hot Dog Stand"; +// Button title for the 'Popover' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Popover"="Popover"; +// Button title for the 'Navigation' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Navigation"="Navigation"; +// Button title for the 'Modal' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Modal"="Modal"; + diff --git a/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/en.lproj/Localizable.strings b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/en.lproj/Localizable.strings new file mode 100755 index 0000000..f01e41c --- /dev/null +++ b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/en.lproj/Localizable.strings @@ -0,0 +1,57 @@ +// NOTE: This is the english localization and has been copied to all languages. The reason for doing +// this is it signals to iOS that the app "supports" all of these languages. This is helpful for a +// demo as it allows you to try out the localization features of the Places SDK. In a shipping app +// you should never do this, it is for demonstration purposes only. + + +// The name of the app to display in a navigation bar along with a placeholder for the SDK version number. +"App.NameAndVersion"="Places Demos: %1$@"; + +// Title of the full-screen autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.FullScreen"="Full-Screen Autocomplete"; +// Title of the pushed autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.Push"="Push Autocomplete"; +// Title of the UISearchController autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UISearchController"="UISearchController"; +// Title of the UISearchDisplayController autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UISearchDisplayController"="UISearchDisplayController"; +// Title of the UITextField autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UITextField"="UITextField"; +// Title of the Styling autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.Styling"="Custom Autocomplete Styling"; +// Title of the photos demo for display in a list or nav header +"Demo.Title.Photos"="Photos"; +// Title of the 'select place' button within the photos demo +"Demo.Title.Photos.SelectPlace"="Select Place"; +// Title of the Place Picker demo for displaying the picker in a popover, navigation controller, or modally. +"Demo.Title.PlacePicker.ViewController"="Place Picker View Controller"; +// Title of the autocomplete demo section +"Demo.Section.Title.Autocomplete"="Autocomplete"; +// Title of the 'Programmatic' demo section +"Demo.Section.Title.Programmatic"="Programmatic APIs"; +// Title of the findPlacesLikelihood demo section +"Demo.Section.Title.FindPlaceLikelihood"="Likelihoods"; + +// Button title for 'show autocomplete widget' +"Demo.Content.Autocomplete.ShowWidgetButton"="Show Autocomplete Widget"; +// Prompt to enter text for autocomplete demo +"Demo.Content.Autocomplete.EnterTextPrompt"="Enter Autocomplete Text Here"; +// Format string for 'autocomplete failed with error' message +"Demo.Content.Autocomplete.FailedErrorMessage"="Autocomplete failed with error: %1$@"; +// String for 'autocomplete canceled message' +"Demo.Content.Autocomplete.WasCanceledMessage"="Autocomplete was canceled"; +// Button title for the 'Yellow and Brown' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.YellowAndBrown"="Yellow and Brown"; +// Button title for the 'White on Black' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.WhiteOnBlack"="White on Black"; +// Button title for the 'Blue Colors' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.BlueColors"="Blue Colors"; +// Button title for the 'Hot Dog Stand' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.HotDogStand"="Hot Dog Stand"; +// Button title for the 'Popover' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Popover"="Popover"; +// Button title for the 'Navigation' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Navigation"="Navigation"; +// Button title for the 'Modal' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Modal"="Modal"; + diff --git a/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/en_AU.lproj/Localizable.strings b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/en_AU.lproj/Localizable.strings new file mode 100755 index 0000000..f01e41c --- /dev/null +++ b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/en_AU.lproj/Localizable.strings @@ -0,0 +1,57 @@ +// NOTE: This is the english localization and has been copied to all languages. The reason for doing +// this is it signals to iOS that the app "supports" all of these languages. This is helpful for a +// demo as it allows you to try out the localization features of the Places SDK. In a shipping app +// you should never do this, it is for demonstration purposes only. + + +// The name of the app to display in a navigation bar along with a placeholder for the SDK version number. +"App.NameAndVersion"="Places Demos: %1$@"; + +// Title of the full-screen autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.FullScreen"="Full-Screen Autocomplete"; +// Title of the pushed autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.Push"="Push Autocomplete"; +// Title of the UISearchController autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UISearchController"="UISearchController"; +// Title of the UISearchDisplayController autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UISearchDisplayController"="UISearchDisplayController"; +// Title of the UITextField autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UITextField"="UITextField"; +// Title of the Styling autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.Styling"="Custom Autocomplete Styling"; +// Title of the photos demo for display in a list or nav header +"Demo.Title.Photos"="Photos"; +// Title of the 'select place' button within the photos demo +"Demo.Title.Photos.SelectPlace"="Select Place"; +// Title of the Place Picker demo for displaying the picker in a popover, navigation controller, or modally. +"Demo.Title.PlacePicker.ViewController"="Place Picker View Controller"; +// Title of the autocomplete demo section +"Demo.Section.Title.Autocomplete"="Autocomplete"; +// Title of the 'Programmatic' demo section +"Demo.Section.Title.Programmatic"="Programmatic APIs"; +// Title of the findPlacesLikelihood demo section +"Demo.Section.Title.FindPlaceLikelihood"="Likelihoods"; + +// Button title for 'show autocomplete widget' +"Demo.Content.Autocomplete.ShowWidgetButton"="Show Autocomplete Widget"; +// Prompt to enter text for autocomplete demo +"Demo.Content.Autocomplete.EnterTextPrompt"="Enter Autocomplete Text Here"; +// Format string for 'autocomplete failed with error' message +"Demo.Content.Autocomplete.FailedErrorMessage"="Autocomplete failed with error: %1$@"; +// String for 'autocomplete canceled message' +"Demo.Content.Autocomplete.WasCanceledMessage"="Autocomplete was canceled"; +// Button title for the 'Yellow and Brown' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.YellowAndBrown"="Yellow and Brown"; +// Button title for the 'White on Black' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.WhiteOnBlack"="White on Black"; +// Button title for the 'Blue Colors' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.BlueColors"="Blue Colors"; +// Button title for the 'Hot Dog Stand' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.HotDogStand"="Hot Dog Stand"; +// Button title for the 'Popover' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Popover"="Popover"; +// Button title for the 'Navigation' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Navigation"="Navigation"; +// Button title for the 'Modal' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Modal"="Modal"; + diff --git a/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/en_GB.lproj/Localizable.strings b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/en_GB.lproj/Localizable.strings new file mode 100755 index 0000000..f01e41c --- /dev/null +++ b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/en_GB.lproj/Localizable.strings @@ -0,0 +1,57 @@ +// NOTE: This is the english localization and has been copied to all languages. The reason for doing +// this is it signals to iOS that the app "supports" all of these languages. This is helpful for a +// demo as it allows you to try out the localization features of the Places SDK. In a shipping app +// you should never do this, it is for demonstration purposes only. + + +// The name of the app to display in a navigation bar along with a placeholder for the SDK version number. +"App.NameAndVersion"="Places Demos: %1$@"; + +// Title of the full-screen autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.FullScreen"="Full-Screen Autocomplete"; +// Title of the pushed autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.Push"="Push Autocomplete"; +// Title of the UISearchController autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UISearchController"="UISearchController"; +// Title of the UISearchDisplayController autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UISearchDisplayController"="UISearchDisplayController"; +// Title of the UITextField autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UITextField"="UITextField"; +// Title of the Styling autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.Styling"="Custom Autocomplete Styling"; +// Title of the photos demo for display in a list or nav header +"Demo.Title.Photos"="Photos"; +// Title of the 'select place' button within the photos demo +"Demo.Title.Photos.SelectPlace"="Select Place"; +// Title of the Place Picker demo for displaying the picker in a popover, navigation controller, or modally. +"Demo.Title.PlacePicker.ViewController"="Place Picker View Controller"; +// Title of the autocomplete demo section +"Demo.Section.Title.Autocomplete"="Autocomplete"; +// Title of the 'Programmatic' demo section +"Demo.Section.Title.Programmatic"="Programmatic APIs"; +// Title of the findPlacesLikelihood demo section +"Demo.Section.Title.FindPlaceLikelihood"="Likelihoods"; + +// Button title for 'show autocomplete widget' +"Demo.Content.Autocomplete.ShowWidgetButton"="Show Autocomplete Widget"; +// Prompt to enter text for autocomplete demo +"Demo.Content.Autocomplete.EnterTextPrompt"="Enter Autocomplete Text Here"; +// Format string for 'autocomplete failed with error' message +"Demo.Content.Autocomplete.FailedErrorMessage"="Autocomplete failed with error: %1$@"; +// String for 'autocomplete canceled message' +"Demo.Content.Autocomplete.WasCanceledMessage"="Autocomplete was canceled"; +// Button title for the 'Yellow and Brown' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.YellowAndBrown"="Yellow and Brown"; +// Button title for the 'White on Black' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.WhiteOnBlack"="White on Black"; +// Button title for the 'Blue Colors' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.BlueColors"="Blue Colors"; +// Button title for the 'Hot Dog Stand' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.HotDogStand"="Hot Dog Stand"; +// Button title for the 'Popover' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Popover"="Popover"; +// Button title for the 'Navigation' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Navigation"="Navigation"; +// Button title for the 'Modal' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Modal"="Modal"; + diff --git a/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/en_IN.lproj/Localizable.strings b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/en_IN.lproj/Localizable.strings new file mode 100755 index 0000000..f01e41c --- /dev/null +++ b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/en_IN.lproj/Localizable.strings @@ -0,0 +1,57 @@ +// NOTE: This is the english localization and has been copied to all languages. The reason for doing +// this is it signals to iOS that the app "supports" all of these languages. This is helpful for a +// demo as it allows you to try out the localization features of the Places SDK. In a shipping app +// you should never do this, it is for demonstration purposes only. + + +// The name of the app to display in a navigation bar along with a placeholder for the SDK version number. +"App.NameAndVersion"="Places Demos: %1$@"; + +// Title of the full-screen autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.FullScreen"="Full-Screen Autocomplete"; +// Title of the pushed autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.Push"="Push Autocomplete"; +// Title of the UISearchController autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UISearchController"="UISearchController"; +// Title of the UISearchDisplayController autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UISearchDisplayController"="UISearchDisplayController"; +// Title of the UITextField autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UITextField"="UITextField"; +// Title of the Styling autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.Styling"="Custom Autocomplete Styling"; +// Title of the photos demo for display in a list or nav header +"Demo.Title.Photos"="Photos"; +// Title of the 'select place' button within the photos demo +"Demo.Title.Photos.SelectPlace"="Select Place"; +// Title of the Place Picker demo for displaying the picker in a popover, navigation controller, or modally. +"Demo.Title.PlacePicker.ViewController"="Place Picker View Controller"; +// Title of the autocomplete demo section +"Demo.Section.Title.Autocomplete"="Autocomplete"; +// Title of the 'Programmatic' demo section +"Demo.Section.Title.Programmatic"="Programmatic APIs"; +// Title of the findPlacesLikelihood demo section +"Demo.Section.Title.FindPlaceLikelihood"="Likelihoods"; + +// Button title for 'show autocomplete widget' +"Demo.Content.Autocomplete.ShowWidgetButton"="Show Autocomplete Widget"; +// Prompt to enter text for autocomplete demo +"Demo.Content.Autocomplete.EnterTextPrompt"="Enter Autocomplete Text Here"; +// Format string for 'autocomplete failed with error' message +"Demo.Content.Autocomplete.FailedErrorMessage"="Autocomplete failed with error: %1$@"; +// String for 'autocomplete canceled message' +"Demo.Content.Autocomplete.WasCanceledMessage"="Autocomplete was canceled"; +// Button title for the 'Yellow and Brown' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.YellowAndBrown"="Yellow and Brown"; +// Button title for the 'White on Black' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.WhiteOnBlack"="White on Black"; +// Button title for the 'Blue Colors' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.BlueColors"="Blue Colors"; +// Button title for the 'Hot Dog Stand' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.HotDogStand"="Hot Dog Stand"; +// Button title for the 'Popover' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Popover"="Popover"; +// Button title for the 'Navigation' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Navigation"="Navigation"; +// Button title for the 'Modal' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Modal"="Modal"; + diff --git a/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/es.lproj/Localizable.strings b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/es.lproj/Localizable.strings new file mode 100755 index 0000000..f01e41c --- /dev/null +++ b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/es.lproj/Localizable.strings @@ -0,0 +1,57 @@ +// NOTE: This is the english localization and has been copied to all languages. The reason for doing +// this is it signals to iOS that the app "supports" all of these languages. This is helpful for a +// demo as it allows you to try out the localization features of the Places SDK. In a shipping app +// you should never do this, it is for demonstration purposes only. + + +// The name of the app to display in a navigation bar along with a placeholder for the SDK version number. +"App.NameAndVersion"="Places Demos: %1$@"; + +// Title of the full-screen autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.FullScreen"="Full-Screen Autocomplete"; +// Title of the pushed autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.Push"="Push Autocomplete"; +// Title of the UISearchController autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UISearchController"="UISearchController"; +// Title of the UISearchDisplayController autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UISearchDisplayController"="UISearchDisplayController"; +// Title of the UITextField autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UITextField"="UITextField"; +// Title of the Styling autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.Styling"="Custom Autocomplete Styling"; +// Title of the photos demo for display in a list or nav header +"Demo.Title.Photos"="Photos"; +// Title of the 'select place' button within the photos demo +"Demo.Title.Photos.SelectPlace"="Select Place"; +// Title of the Place Picker demo for displaying the picker in a popover, navigation controller, or modally. +"Demo.Title.PlacePicker.ViewController"="Place Picker View Controller"; +// Title of the autocomplete demo section +"Demo.Section.Title.Autocomplete"="Autocomplete"; +// Title of the 'Programmatic' demo section +"Demo.Section.Title.Programmatic"="Programmatic APIs"; +// Title of the findPlacesLikelihood demo section +"Demo.Section.Title.FindPlaceLikelihood"="Likelihoods"; + +// Button title for 'show autocomplete widget' +"Demo.Content.Autocomplete.ShowWidgetButton"="Show Autocomplete Widget"; +// Prompt to enter text for autocomplete demo +"Demo.Content.Autocomplete.EnterTextPrompt"="Enter Autocomplete Text Here"; +// Format string for 'autocomplete failed with error' message +"Demo.Content.Autocomplete.FailedErrorMessage"="Autocomplete failed with error: %1$@"; +// String for 'autocomplete canceled message' +"Demo.Content.Autocomplete.WasCanceledMessage"="Autocomplete was canceled"; +// Button title for the 'Yellow and Brown' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.YellowAndBrown"="Yellow and Brown"; +// Button title for the 'White on Black' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.WhiteOnBlack"="White on Black"; +// Button title for the 'Blue Colors' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.BlueColors"="Blue Colors"; +// Button title for the 'Hot Dog Stand' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.HotDogStand"="Hot Dog Stand"; +// Button title for the 'Popover' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Popover"="Popover"; +// Button title for the 'Navigation' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Navigation"="Navigation"; +// Button title for the 'Modal' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Modal"="Modal"; + diff --git a/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/es_419.lproj/Localizable.strings b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/es_419.lproj/Localizable.strings new file mode 100755 index 0000000..f01e41c --- /dev/null +++ b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/es_419.lproj/Localizable.strings @@ -0,0 +1,57 @@ +// NOTE: This is the english localization and has been copied to all languages. The reason for doing +// this is it signals to iOS that the app "supports" all of these languages. This is helpful for a +// demo as it allows you to try out the localization features of the Places SDK. In a shipping app +// you should never do this, it is for demonstration purposes only. + + +// The name of the app to display in a navigation bar along with a placeholder for the SDK version number. +"App.NameAndVersion"="Places Demos: %1$@"; + +// Title of the full-screen autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.FullScreen"="Full-Screen Autocomplete"; +// Title of the pushed autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.Push"="Push Autocomplete"; +// Title of the UISearchController autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UISearchController"="UISearchController"; +// Title of the UISearchDisplayController autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UISearchDisplayController"="UISearchDisplayController"; +// Title of the UITextField autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UITextField"="UITextField"; +// Title of the Styling autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.Styling"="Custom Autocomplete Styling"; +// Title of the photos demo for display in a list or nav header +"Demo.Title.Photos"="Photos"; +// Title of the 'select place' button within the photos demo +"Demo.Title.Photos.SelectPlace"="Select Place"; +// Title of the Place Picker demo for displaying the picker in a popover, navigation controller, or modally. +"Demo.Title.PlacePicker.ViewController"="Place Picker View Controller"; +// Title of the autocomplete demo section +"Demo.Section.Title.Autocomplete"="Autocomplete"; +// Title of the 'Programmatic' demo section +"Demo.Section.Title.Programmatic"="Programmatic APIs"; +// Title of the findPlacesLikelihood demo section +"Demo.Section.Title.FindPlaceLikelihood"="Likelihoods"; + +// Button title for 'show autocomplete widget' +"Demo.Content.Autocomplete.ShowWidgetButton"="Show Autocomplete Widget"; +// Prompt to enter text for autocomplete demo +"Demo.Content.Autocomplete.EnterTextPrompt"="Enter Autocomplete Text Here"; +// Format string for 'autocomplete failed with error' message +"Demo.Content.Autocomplete.FailedErrorMessage"="Autocomplete failed with error: %1$@"; +// String for 'autocomplete canceled message' +"Demo.Content.Autocomplete.WasCanceledMessage"="Autocomplete was canceled"; +// Button title for the 'Yellow and Brown' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.YellowAndBrown"="Yellow and Brown"; +// Button title for the 'White on Black' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.WhiteOnBlack"="White on Black"; +// Button title for the 'Blue Colors' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.BlueColors"="Blue Colors"; +// Button title for the 'Hot Dog Stand' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.HotDogStand"="Hot Dog Stand"; +// Button title for the 'Popover' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Popover"="Popover"; +// Button title for the 'Navigation' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Navigation"="Navigation"; +// Button title for the 'Modal' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Modal"="Modal"; + diff --git a/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/es_MX.lproj/Localizable.strings b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/es_MX.lproj/Localizable.strings new file mode 100755 index 0000000..f01e41c --- /dev/null +++ b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/es_MX.lproj/Localizable.strings @@ -0,0 +1,57 @@ +// NOTE: This is the english localization and has been copied to all languages. The reason for doing +// this is it signals to iOS that the app "supports" all of these languages. This is helpful for a +// demo as it allows you to try out the localization features of the Places SDK. In a shipping app +// you should never do this, it is for demonstration purposes only. + + +// The name of the app to display in a navigation bar along with a placeholder for the SDK version number. +"App.NameAndVersion"="Places Demos: %1$@"; + +// Title of the full-screen autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.FullScreen"="Full-Screen Autocomplete"; +// Title of the pushed autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.Push"="Push Autocomplete"; +// Title of the UISearchController autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UISearchController"="UISearchController"; +// Title of the UISearchDisplayController autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UISearchDisplayController"="UISearchDisplayController"; +// Title of the UITextField autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UITextField"="UITextField"; +// Title of the Styling autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.Styling"="Custom Autocomplete Styling"; +// Title of the photos demo for display in a list or nav header +"Demo.Title.Photos"="Photos"; +// Title of the 'select place' button within the photos demo +"Demo.Title.Photos.SelectPlace"="Select Place"; +// Title of the Place Picker demo for displaying the picker in a popover, navigation controller, or modally. +"Demo.Title.PlacePicker.ViewController"="Place Picker View Controller"; +// Title of the autocomplete demo section +"Demo.Section.Title.Autocomplete"="Autocomplete"; +// Title of the 'Programmatic' demo section +"Demo.Section.Title.Programmatic"="Programmatic APIs"; +// Title of the findPlacesLikelihood demo section +"Demo.Section.Title.FindPlaceLikelihood"="Likelihoods"; + +// Button title for 'show autocomplete widget' +"Demo.Content.Autocomplete.ShowWidgetButton"="Show Autocomplete Widget"; +// Prompt to enter text for autocomplete demo +"Demo.Content.Autocomplete.EnterTextPrompt"="Enter Autocomplete Text Here"; +// Format string for 'autocomplete failed with error' message +"Demo.Content.Autocomplete.FailedErrorMessage"="Autocomplete failed with error: %1$@"; +// String for 'autocomplete canceled message' +"Demo.Content.Autocomplete.WasCanceledMessage"="Autocomplete was canceled"; +// Button title for the 'Yellow and Brown' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.YellowAndBrown"="Yellow and Brown"; +// Button title for the 'White on Black' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.WhiteOnBlack"="White on Black"; +// Button title for the 'Blue Colors' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.BlueColors"="Blue Colors"; +// Button title for the 'Hot Dog Stand' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.HotDogStand"="Hot Dog Stand"; +// Button title for the 'Popover' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Popover"="Popover"; +// Button title for the 'Navigation' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Navigation"="Navigation"; +// Button title for the 'Modal' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Modal"="Modal"; + diff --git a/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/fi.lproj/Localizable.strings b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/fi.lproj/Localizable.strings new file mode 100755 index 0000000..f01e41c --- /dev/null +++ b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/fi.lproj/Localizable.strings @@ -0,0 +1,57 @@ +// NOTE: This is the english localization and has been copied to all languages. The reason for doing +// this is it signals to iOS that the app "supports" all of these languages. This is helpful for a +// demo as it allows you to try out the localization features of the Places SDK. In a shipping app +// you should never do this, it is for demonstration purposes only. + + +// The name of the app to display in a navigation bar along with a placeholder for the SDK version number. +"App.NameAndVersion"="Places Demos: %1$@"; + +// Title of the full-screen autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.FullScreen"="Full-Screen Autocomplete"; +// Title of the pushed autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.Push"="Push Autocomplete"; +// Title of the UISearchController autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UISearchController"="UISearchController"; +// Title of the UISearchDisplayController autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UISearchDisplayController"="UISearchDisplayController"; +// Title of the UITextField autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UITextField"="UITextField"; +// Title of the Styling autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.Styling"="Custom Autocomplete Styling"; +// Title of the photos demo for display in a list or nav header +"Demo.Title.Photos"="Photos"; +// Title of the 'select place' button within the photos demo +"Demo.Title.Photos.SelectPlace"="Select Place"; +// Title of the Place Picker demo for displaying the picker in a popover, navigation controller, or modally. +"Demo.Title.PlacePicker.ViewController"="Place Picker View Controller"; +// Title of the autocomplete demo section +"Demo.Section.Title.Autocomplete"="Autocomplete"; +// Title of the 'Programmatic' demo section +"Demo.Section.Title.Programmatic"="Programmatic APIs"; +// Title of the findPlacesLikelihood demo section +"Demo.Section.Title.FindPlaceLikelihood"="Likelihoods"; + +// Button title for 'show autocomplete widget' +"Demo.Content.Autocomplete.ShowWidgetButton"="Show Autocomplete Widget"; +// Prompt to enter text for autocomplete demo +"Demo.Content.Autocomplete.EnterTextPrompt"="Enter Autocomplete Text Here"; +// Format string for 'autocomplete failed with error' message +"Demo.Content.Autocomplete.FailedErrorMessage"="Autocomplete failed with error: %1$@"; +// String for 'autocomplete canceled message' +"Demo.Content.Autocomplete.WasCanceledMessage"="Autocomplete was canceled"; +// Button title for the 'Yellow and Brown' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.YellowAndBrown"="Yellow and Brown"; +// Button title for the 'White on Black' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.WhiteOnBlack"="White on Black"; +// Button title for the 'Blue Colors' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.BlueColors"="Blue Colors"; +// Button title for the 'Hot Dog Stand' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.HotDogStand"="Hot Dog Stand"; +// Button title for the 'Popover' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Popover"="Popover"; +// Button title for the 'Navigation' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Navigation"="Navigation"; +// Button title for the 'Modal' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Modal"="Modal"; + diff --git a/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/fr.lproj/Localizable.strings b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/fr.lproj/Localizable.strings new file mode 100755 index 0000000..f01e41c --- /dev/null +++ b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/fr.lproj/Localizable.strings @@ -0,0 +1,57 @@ +// NOTE: This is the english localization and has been copied to all languages. The reason for doing +// this is it signals to iOS that the app "supports" all of these languages. This is helpful for a +// demo as it allows you to try out the localization features of the Places SDK. In a shipping app +// you should never do this, it is for demonstration purposes only. + + +// The name of the app to display in a navigation bar along with a placeholder for the SDK version number. +"App.NameAndVersion"="Places Demos: %1$@"; + +// Title of the full-screen autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.FullScreen"="Full-Screen Autocomplete"; +// Title of the pushed autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.Push"="Push Autocomplete"; +// Title of the UISearchController autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UISearchController"="UISearchController"; +// Title of the UISearchDisplayController autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UISearchDisplayController"="UISearchDisplayController"; +// Title of the UITextField autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UITextField"="UITextField"; +// Title of the Styling autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.Styling"="Custom Autocomplete Styling"; +// Title of the photos demo for display in a list or nav header +"Demo.Title.Photos"="Photos"; +// Title of the 'select place' button within the photos demo +"Demo.Title.Photos.SelectPlace"="Select Place"; +// Title of the Place Picker demo for displaying the picker in a popover, navigation controller, or modally. +"Demo.Title.PlacePicker.ViewController"="Place Picker View Controller"; +// Title of the autocomplete demo section +"Demo.Section.Title.Autocomplete"="Autocomplete"; +// Title of the 'Programmatic' demo section +"Demo.Section.Title.Programmatic"="Programmatic APIs"; +// Title of the findPlacesLikelihood demo section +"Demo.Section.Title.FindPlaceLikelihood"="Likelihoods"; + +// Button title for 'show autocomplete widget' +"Demo.Content.Autocomplete.ShowWidgetButton"="Show Autocomplete Widget"; +// Prompt to enter text for autocomplete demo +"Demo.Content.Autocomplete.EnterTextPrompt"="Enter Autocomplete Text Here"; +// Format string for 'autocomplete failed with error' message +"Demo.Content.Autocomplete.FailedErrorMessage"="Autocomplete failed with error: %1$@"; +// String for 'autocomplete canceled message' +"Demo.Content.Autocomplete.WasCanceledMessage"="Autocomplete was canceled"; +// Button title for the 'Yellow and Brown' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.YellowAndBrown"="Yellow and Brown"; +// Button title for the 'White on Black' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.WhiteOnBlack"="White on Black"; +// Button title for the 'Blue Colors' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.BlueColors"="Blue Colors"; +// Button title for the 'Hot Dog Stand' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.HotDogStand"="Hot Dog Stand"; +// Button title for the 'Popover' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Popover"="Popover"; +// Button title for the 'Navigation' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Navigation"="Navigation"; +// Button title for the 'Modal' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Modal"="Modal"; + diff --git a/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/fr_CA.lproj/Localizable.strings b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/fr_CA.lproj/Localizable.strings new file mode 100755 index 0000000..f01e41c --- /dev/null +++ b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/fr_CA.lproj/Localizable.strings @@ -0,0 +1,57 @@ +// NOTE: This is the english localization and has been copied to all languages. The reason for doing +// this is it signals to iOS that the app "supports" all of these languages. This is helpful for a +// demo as it allows you to try out the localization features of the Places SDK. In a shipping app +// you should never do this, it is for demonstration purposes only. + + +// The name of the app to display in a navigation bar along with a placeholder for the SDK version number. +"App.NameAndVersion"="Places Demos: %1$@"; + +// Title of the full-screen autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.FullScreen"="Full-Screen Autocomplete"; +// Title of the pushed autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.Push"="Push Autocomplete"; +// Title of the UISearchController autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UISearchController"="UISearchController"; +// Title of the UISearchDisplayController autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UISearchDisplayController"="UISearchDisplayController"; +// Title of the UITextField autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UITextField"="UITextField"; +// Title of the Styling autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.Styling"="Custom Autocomplete Styling"; +// Title of the photos demo for display in a list or nav header +"Demo.Title.Photos"="Photos"; +// Title of the 'select place' button within the photos demo +"Demo.Title.Photos.SelectPlace"="Select Place"; +// Title of the Place Picker demo for displaying the picker in a popover, navigation controller, or modally. +"Demo.Title.PlacePicker.ViewController"="Place Picker View Controller"; +// Title of the autocomplete demo section +"Demo.Section.Title.Autocomplete"="Autocomplete"; +// Title of the 'Programmatic' demo section +"Demo.Section.Title.Programmatic"="Programmatic APIs"; +// Title of the findPlacesLikelihood demo section +"Demo.Section.Title.FindPlaceLikelihood"="Likelihoods"; + +// Button title for 'show autocomplete widget' +"Demo.Content.Autocomplete.ShowWidgetButton"="Show Autocomplete Widget"; +// Prompt to enter text for autocomplete demo +"Demo.Content.Autocomplete.EnterTextPrompt"="Enter Autocomplete Text Here"; +// Format string for 'autocomplete failed with error' message +"Demo.Content.Autocomplete.FailedErrorMessage"="Autocomplete failed with error: %1$@"; +// String for 'autocomplete canceled message' +"Demo.Content.Autocomplete.WasCanceledMessage"="Autocomplete was canceled"; +// Button title for the 'Yellow and Brown' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.YellowAndBrown"="Yellow and Brown"; +// Button title for the 'White on Black' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.WhiteOnBlack"="White on Black"; +// Button title for the 'Blue Colors' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.BlueColors"="Blue Colors"; +// Button title for the 'Hot Dog Stand' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.HotDogStand"="Hot Dog Stand"; +// Button title for the 'Popover' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Popover"="Popover"; +// Button title for the 'Navigation' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Navigation"="Navigation"; +// Button title for the 'Modal' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Modal"="Modal"; + diff --git a/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/he.lproj/Localizable.strings b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/he.lproj/Localizable.strings new file mode 100755 index 0000000..f01e41c --- /dev/null +++ b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/he.lproj/Localizable.strings @@ -0,0 +1,57 @@ +// NOTE: This is the english localization and has been copied to all languages. The reason for doing +// this is it signals to iOS that the app "supports" all of these languages. This is helpful for a +// demo as it allows you to try out the localization features of the Places SDK. In a shipping app +// you should never do this, it is for demonstration purposes only. + + +// The name of the app to display in a navigation bar along with a placeholder for the SDK version number. +"App.NameAndVersion"="Places Demos: %1$@"; + +// Title of the full-screen autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.FullScreen"="Full-Screen Autocomplete"; +// Title of the pushed autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.Push"="Push Autocomplete"; +// Title of the UISearchController autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UISearchController"="UISearchController"; +// Title of the UISearchDisplayController autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UISearchDisplayController"="UISearchDisplayController"; +// Title of the UITextField autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UITextField"="UITextField"; +// Title of the Styling autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.Styling"="Custom Autocomplete Styling"; +// Title of the photos demo for display in a list or nav header +"Demo.Title.Photos"="Photos"; +// Title of the 'select place' button within the photos demo +"Demo.Title.Photos.SelectPlace"="Select Place"; +// Title of the Place Picker demo for displaying the picker in a popover, navigation controller, or modally. +"Demo.Title.PlacePicker.ViewController"="Place Picker View Controller"; +// Title of the autocomplete demo section +"Demo.Section.Title.Autocomplete"="Autocomplete"; +// Title of the 'Programmatic' demo section +"Demo.Section.Title.Programmatic"="Programmatic APIs"; +// Title of the findPlacesLikelihood demo section +"Demo.Section.Title.FindPlaceLikelihood"="Likelihoods"; + +// Button title for 'show autocomplete widget' +"Demo.Content.Autocomplete.ShowWidgetButton"="Show Autocomplete Widget"; +// Prompt to enter text for autocomplete demo +"Demo.Content.Autocomplete.EnterTextPrompt"="Enter Autocomplete Text Here"; +// Format string for 'autocomplete failed with error' message +"Demo.Content.Autocomplete.FailedErrorMessage"="Autocomplete failed with error: %1$@"; +// String for 'autocomplete canceled message' +"Demo.Content.Autocomplete.WasCanceledMessage"="Autocomplete was canceled"; +// Button title for the 'Yellow and Brown' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.YellowAndBrown"="Yellow and Brown"; +// Button title for the 'White on Black' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.WhiteOnBlack"="White on Black"; +// Button title for the 'Blue Colors' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.BlueColors"="Blue Colors"; +// Button title for the 'Hot Dog Stand' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.HotDogStand"="Hot Dog Stand"; +// Button title for the 'Popover' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Popover"="Popover"; +// Button title for the 'Navigation' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Navigation"="Navigation"; +// Button title for the 'Modal' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Modal"="Modal"; + diff --git a/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/hi.lproj/Localizable.strings b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/hi.lproj/Localizable.strings new file mode 100755 index 0000000..f01e41c --- /dev/null +++ b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/hi.lproj/Localizable.strings @@ -0,0 +1,57 @@ +// NOTE: This is the english localization and has been copied to all languages. The reason for doing +// this is it signals to iOS that the app "supports" all of these languages. This is helpful for a +// demo as it allows you to try out the localization features of the Places SDK. In a shipping app +// you should never do this, it is for demonstration purposes only. + + +// The name of the app to display in a navigation bar along with a placeholder for the SDK version number. +"App.NameAndVersion"="Places Demos: %1$@"; + +// Title of the full-screen autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.FullScreen"="Full-Screen Autocomplete"; +// Title of the pushed autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.Push"="Push Autocomplete"; +// Title of the UISearchController autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UISearchController"="UISearchController"; +// Title of the UISearchDisplayController autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UISearchDisplayController"="UISearchDisplayController"; +// Title of the UITextField autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UITextField"="UITextField"; +// Title of the Styling autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.Styling"="Custom Autocomplete Styling"; +// Title of the photos demo for display in a list or nav header +"Demo.Title.Photos"="Photos"; +// Title of the 'select place' button within the photos demo +"Demo.Title.Photos.SelectPlace"="Select Place"; +// Title of the Place Picker demo for displaying the picker in a popover, navigation controller, or modally. +"Demo.Title.PlacePicker.ViewController"="Place Picker View Controller"; +// Title of the autocomplete demo section +"Demo.Section.Title.Autocomplete"="Autocomplete"; +// Title of the 'Programmatic' demo section +"Demo.Section.Title.Programmatic"="Programmatic APIs"; +// Title of the findPlacesLikelihood demo section +"Demo.Section.Title.FindPlaceLikelihood"="Likelihoods"; + +// Button title for 'show autocomplete widget' +"Demo.Content.Autocomplete.ShowWidgetButton"="Show Autocomplete Widget"; +// Prompt to enter text for autocomplete demo +"Demo.Content.Autocomplete.EnterTextPrompt"="Enter Autocomplete Text Here"; +// Format string for 'autocomplete failed with error' message +"Demo.Content.Autocomplete.FailedErrorMessage"="Autocomplete failed with error: %1$@"; +// String for 'autocomplete canceled message' +"Demo.Content.Autocomplete.WasCanceledMessage"="Autocomplete was canceled"; +// Button title for the 'Yellow and Brown' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.YellowAndBrown"="Yellow and Brown"; +// Button title for the 'White on Black' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.WhiteOnBlack"="White on Black"; +// Button title for the 'Blue Colors' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.BlueColors"="Blue Colors"; +// Button title for the 'Hot Dog Stand' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.HotDogStand"="Hot Dog Stand"; +// Button title for the 'Popover' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Popover"="Popover"; +// Button title for the 'Navigation' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Navigation"="Navigation"; +// Button title for the 'Modal' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Modal"="Modal"; + diff --git a/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/hr.lproj/Localizable.strings b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/hr.lproj/Localizable.strings new file mode 100755 index 0000000..f01e41c --- /dev/null +++ b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/hr.lproj/Localizable.strings @@ -0,0 +1,57 @@ +// NOTE: This is the english localization and has been copied to all languages. The reason for doing +// this is it signals to iOS that the app "supports" all of these languages. This is helpful for a +// demo as it allows you to try out the localization features of the Places SDK. In a shipping app +// you should never do this, it is for demonstration purposes only. + + +// The name of the app to display in a navigation bar along with a placeholder for the SDK version number. +"App.NameAndVersion"="Places Demos: %1$@"; + +// Title of the full-screen autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.FullScreen"="Full-Screen Autocomplete"; +// Title of the pushed autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.Push"="Push Autocomplete"; +// Title of the UISearchController autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UISearchController"="UISearchController"; +// Title of the UISearchDisplayController autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UISearchDisplayController"="UISearchDisplayController"; +// Title of the UITextField autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UITextField"="UITextField"; +// Title of the Styling autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.Styling"="Custom Autocomplete Styling"; +// Title of the photos demo for display in a list or nav header +"Demo.Title.Photos"="Photos"; +// Title of the 'select place' button within the photos demo +"Demo.Title.Photos.SelectPlace"="Select Place"; +// Title of the Place Picker demo for displaying the picker in a popover, navigation controller, or modally. +"Demo.Title.PlacePicker.ViewController"="Place Picker View Controller"; +// Title of the autocomplete demo section +"Demo.Section.Title.Autocomplete"="Autocomplete"; +// Title of the 'Programmatic' demo section +"Demo.Section.Title.Programmatic"="Programmatic APIs"; +// Title of the findPlacesLikelihood demo section +"Demo.Section.Title.FindPlaceLikelihood"="Likelihoods"; + +// Button title for 'show autocomplete widget' +"Demo.Content.Autocomplete.ShowWidgetButton"="Show Autocomplete Widget"; +// Prompt to enter text for autocomplete demo +"Demo.Content.Autocomplete.EnterTextPrompt"="Enter Autocomplete Text Here"; +// Format string for 'autocomplete failed with error' message +"Demo.Content.Autocomplete.FailedErrorMessage"="Autocomplete failed with error: %1$@"; +// String for 'autocomplete canceled message' +"Demo.Content.Autocomplete.WasCanceledMessage"="Autocomplete was canceled"; +// Button title for the 'Yellow and Brown' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.YellowAndBrown"="Yellow and Brown"; +// Button title for the 'White on Black' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.WhiteOnBlack"="White on Black"; +// Button title for the 'Blue Colors' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.BlueColors"="Blue Colors"; +// Button title for the 'Hot Dog Stand' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.HotDogStand"="Hot Dog Stand"; +// Button title for the 'Popover' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Popover"="Popover"; +// Button title for the 'Navigation' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Navigation"="Navigation"; +// Button title for the 'Modal' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Modal"="Modal"; + diff --git a/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/hu.lproj/Localizable.strings b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/hu.lproj/Localizable.strings new file mode 100755 index 0000000..f01e41c --- /dev/null +++ b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/hu.lproj/Localizable.strings @@ -0,0 +1,57 @@ +// NOTE: This is the english localization and has been copied to all languages. The reason for doing +// this is it signals to iOS that the app "supports" all of these languages. This is helpful for a +// demo as it allows you to try out the localization features of the Places SDK. In a shipping app +// you should never do this, it is for demonstration purposes only. + + +// The name of the app to display in a navigation bar along with a placeholder for the SDK version number. +"App.NameAndVersion"="Places Demos: %1$@"; + +// Title of the full-screen autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.FullScreen"="Full-Screen Autocomplete"; +// Title of the pushed autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.Push"="Push Autocomplete"; +// Title of the UISearchController autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UISearchController"="UISearchController"; +// Title of the UISearchDisplayController autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UISearchDisplayController"="UISearchDisplayController"; +// Title of the UITextField autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UITextField"="UITextField"; +// Title of the Styling autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.Styling"="Custom Autocomplete Styling"; +// Title of the photos demo for display in a list or nav header +"Demo.Title.Photos"="Photos"; +// Title of the 'select place' button within the photos demo +"Demo.Title.Photos.SelectPlace"="Select Place"; +// Title of the Place Picker demo for displaying the picker in a popover, navigation controller, or modally. +"Demo.Title.PlacePicker.ViewController"="Place Picker View Controller"; +// Title of the autocomplete demo section +"Demo.Section.Title.Autocomplete"="Autocomplete"; +// Title of the 'Programmatic' demo section +"Demo.Section.Title.Programmatic"="Programmatic APIs"; +// Title of the findPlacesLikelihood demo section +"Demo.Section.Title.FindPlaceLikelihood"="Likelihoods"; + +// Button title for 'show autocomplete widget' +"Demo.Content.Autocomplete.ShowWidgetButton"="Show Autocomplete Widget"; +// Prompt to enter text for autocomplete demo +"Demo.Content.Autocomplete.EnterTextPrompt"="Enter Autocomplete Text Here"; +// Format string for 'autocomplete failed with error' message +"Demo.Content.Autocomplete.FailedErrorMessage"="Autocomplete failed with error: %1$@"; +// String for 'autocomplete canceled message' +"Demo.Content.Autocomplete.WasCanceledMessage"="Autocomplete was canceled"; +// Button title for the 'Yellow and Brown' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.YellowAndBrown"="Yellow and Brown"; +// Button title for the 'White on Black' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.WhiteOnBlack"="White on Black"; +// Button title for the 'Blue Colors' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.BlueColors"="Blue Colors"; +// Button title for the 'Hot Dog Stand' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.HotDogStand"="Hot Dog Stand"; +// Button title for the 'Popover' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Popover"="Popover"; +// Button title for the 'Navigation' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Navigation"="Navigation"; +// Button title for the 'Modal' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Modal"="Modal"; + diff --git a/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/id.lproj/Localizable.strings b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/id.lproj/Localizable.strings new file mode 100755 index 0000000..f01e41c --- /dev/null +++ b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/id.lproj/Localizable.strings @@ -0,0 +1,57 @@ +// NOTE: This is the english localization and has been copied to all languages. The reason for doing +// this is it signals to iOS that the app "supports" all of these languages. This is helpful for a +// demo as it allows you to try out the localization features of the Places SDK. In a shipping app +// you should never do this, it is for demonstration purposes only. + + +// The name of the app to display in a navigation bar along with a placeholder for the SDK version number. +"App.NameAndVersion"="Places Demos: %1$@"; + +// Title of the full-screen autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.FullScreen"="Full-Screen Autocomplete"; +// Title of the pushed autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.Push"="Push Autocomplete"; +// Title of the UISearchController autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UISearchController"="UISearchController"; +// Title of the UISearchDisplayController autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UISearchDisplayController"="UISearchDisplayController"; +// Title of the UITextField autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UITextField"="UITextField"; +// Title of the Styling autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.Styling"="Custom Autocomplete Styling"; +// Title of the photos demo for display in a list or nav header +"Demo.Title.Photos"="Photos"; +// Title of the 'select place' button within the photos demo +"Demo.Title.Photos.SelectPlace"="Select Place"; +// Title of the Place Picker demo for displaying the picker in a popover, navigation controller, or modally. +"Demo.Title.PlacePicker.ViewController"="Place Picker View Controller"; +// Title of the autocomplete demo section +"Demo.Section.Title.Autocomplete"="Autocomplete"; +// Title of the 'Programmatic' demo section +"Demo.Section.Title.Programmatic"="Programmatic APIs"; +// Title of the findPlacesLikelihood demo section +"Demo.Section.Title.FindPlaceLikelihood"="Likelihoods"; + +// Button title for 'show autocomplete widget' +"Demo.Content.Autocomplete.ShowWidgetButton"="Show Autocomplete Widget"; +// Prompt to enter text for autocomplete demo +"Demo.Content.Autocomplete.EnterTextPrompt"="Enter Autocomplete Text Here"; +// Format string for 'autocomplete failed with error' message +"Demo.Content.Autocomplete.FailedErrorMessage"="Autocomplete failed with error: %1$@"; +// String for 'autocomplete canceled message' +"Demo.Content.Autocomplete.WasCanceledMessage"="Autocomplete was canceled"; +// Button title for the 'Yellow and Brown' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.YellowAndBrown"="Yellow and Brown"; +// Button title for the 'White on Black' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.WhiteOnBlack"="White on Black"; +// Button title for the 'Blue Colors' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.BlueColors"="Blue Colors"; +// Button title for the 'Hot Dog Stand' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.HotDogStand"="Hot Dog Stand"; +// Button title for the 'Popover' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Popover"="Popover"; +// Button title for the 'Navigation' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Navigation"="Navigation"; +// Button title for the 'Modal' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Modal"="Modal"; + diff --git a/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/it.lproj/Localizable.strings b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/it.lproj/Localizable.strings new file mode 100755 index 0000000..f01e41c --- /dev/null +++ b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/it.lproj/Localizable.strings @@ -0,0 +1,57 @@ +// NOTE: This is the english localization and has been copied to all languages. The reason for doing +// this is it signals to iOS that the app "supports" all of these languages. This is helpful for a +// demo as it allows you to try out the localization features of the Places SDK. In a shipping app +// you should never do this, it is for demonstration purposes only. + + +// The name of the app to display in a navigation bar along with a placeholder for the SDK version number. +"App.NameAndVersion"="Places Demos: %1$@"; + +// Title of the full-screen autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.FullScreen"="Full-Screen Autocomplete"; +// Title of the pushed autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.Push"="Push Autocomplete"; +// Title of the UISearchController autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UISearchController"="UISearchController"; +// Title of the UISearchDisplayController autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UISearchDisplayController"="UISearchDisplayController"; +// Title of the UITextField autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UITextField"="UITextField"; +// Title of the Styling autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.Styling"="Custom Autocomplete Styling"; +// Title of the photos demo for display in a list or nav header +"Demo.Title.Photos"="Photos"; +// Title of the 'select place' button within the photos demo +"Demo.Title.Photos.SelectPlace"="Select Place"; +// Title of the Place Picker demo for displaying the picker in a popover, navigation controller, or modally. +"Demo.Title.PlacePicker.ViewController"="Place Picker View Controller"; +// Title of the autocomplete demo section +"Demo.Section.Title.Autocomplete"="Autocomplete"; +// Title of the 'Programmatic' demo section +"Demo.Section.Title.Programmatic"="Programmatic APIs"; +// Title of the findPlacesLikelihood demo section +"Demo.Section.Title.FindPlaceLikelihood"="Likelihoods"; + +// Button title for 'show autocomplete widget' +"Demo.Content.Autocomplete.ShowWidgetButton"="Show Autocomplete Widget"; +// Prompt to enter text for autocomplete demo +"Demo.Content.Autocomplete.EnterTextPrompt"="Enter Autocomplete Text Here"; +// Format string for 'autocomplete failed with error' message +"Demo.Content.Autocomplete.FailedErrorMessage"="Autocomplete failed with error: %1$@"; +// String for 'autocomplete canceled message' +"Demo.Content.Autocomplete.WasCanceledMessage"="Autocomplete was canceled"; +// Button title for the 'Yellow and Brown' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.YellowAndBrown"="Yellow and Brown"; +// Button title for the 'White on Black' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.WhiteOnBlack"="White on Black"; +// Button title for the 'Blue Colors' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.BlueColors"="Blue Colors"; +// Button title for the 'Hot Dog Stand' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.HotDogStand"="Hot Dog Stand"; +// Button title for the 'Popover' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Popover"="Popover"; +// Button title for the 'Navigation' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Navigation"="Navigation"; +// Button title for the 'Modal' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Modal"="Modal"; + diff --git a/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/ja.lproj/Localizable.strings b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/ja.lproj/Localizable.strings new file mode 100755 index 0000000..f01e41c --- /dev/null +++ b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/ja.lproj/Localizable.strings @@ -0,0 +1,57 @@ +// NOTE: This is the english localization and has been copied to all languages. The reason for doing +// this is it signals to iOS that the app "supports" all of these languages. This is helpful for a +// demo as it allows you to try out the localization features of the Places SDK. In a shipping app +// you should never do this, it is for demonstration purposes only. + + +// The name of the app to display in a navigation bar along with a placeholder for the SDK version number. +"App.NameAndVersion"="Places Demos: %1$@"; + +// Title of the full-screen autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.FullScreen"="Full-Screen Autocomplete"; +// Title of the pushed autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.Push"="Push Autocomplete"; +// Title of the UISearchController autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UISearchController"="UISearchController"; +// Title of the UISearchDisplayController autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UISearchDisplayController"="UISearchDisplayController"; +// Title of the UITextField autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UITextField"="UITextField"; +// Title of the Styling autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.Styling"="Custom Autocomplete Styling"; +// Title of the photos demo for display in a list or nav header +"Demo.Title.Photos"="Photos"; +// Title of the 'select place' button within the photos demo +"Demo.Title.Photos.SelectPlace"="Select Place"; +// Title of the Place Picker demo for displaying the picker in a popover, navigation controller, or modally. +"Demo.Title.PlacePicker.ViewController"="Place Picker View Controller"; +// Title of the autocomplete demo section +"Demo.Section.Title.Autocomplete"="Autocomplete"; +// Title of the 'Programmatic' demo section +"Demo.Section.Title.Programmatic"="Programmatic APIs"; +// Title of the findPlacesLikelihood demo section +"Demo.Section.Title.FindPlaceLikelihood"="Likelihoods"; + +// Button title for 'show autocomplete widget' +"Demo.Content.Autocomplete.ShowWidgetButton"="Show Autocomplete Widget"; +// Prompt to enter text for autocomplete demo +"Demo.Content.Autocomplete.EnterTextPrompt"="Enter Autocomplete Text Here"; +// Format string for 'autocomplete failed with error' message +"Demo.Content.Autocomplete.FailedErrorMessage"="Autocomplete failed with error: %1$@"; +// String for 'autocomplete canceled message' +"Demo.Content.Autocomplete.WasCanceledMessage"="Autocomplete was canceled"; +// Button title for the 'Yellow and Brown' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.YellowAndBrown"="Yellow and Brown"; +// Button title for the 'White on Black' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.WhiteOnBlack"="White on Black"; +// Button title for the 'Blue Colors' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.BlueColors"="Blue Colors"; +// Button title for the 'Hot Dog Stand' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.HotDogStand"="Hot Dog Stand"; +// Button title for the 'Popover' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Popover"="Popover"; +// Button title for the 'Navigation' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Navigation"="Navigation"; +// Button title for the 'Modal' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Modal"="Modal"; + diff --git a/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/ko.lproj/Localizable.strings b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/ko.lproj/Localizable.strings new file mode 100755 index 0000000..f01e41c --- /dev/null +++ b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/ko.lproj/Localizable.strings @@ -0,0 +1,57 @@ +// NOTE: This is the english localization and has been copied to all languages. The reason for doing +// this is it signals to iOS that the app "supports" all of these languages. This is helpful for a +// demo as it allows you to try out the localization features of the Places SDK. In a shipping app +// you should never do this, it is for demonstration purposes only. + + +// The name of the app to display in a navigation bar along with a placeholder for the SDK version number. +"App.NameAndVersion"="Places Demos: %1$@"; + +// Title of the full-screen autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.FullScreen"="Full-Screen Autocomplete"; +// Title of the pushed autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.Push"="Push Autocomplete"; +// Title of the UISearchController autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UISearchController"="UISearchController"; +// Title of the UISearchDisplayController autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UISearchDisplayController"="UISearchDisplayController"; +// Title of the UITextField autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UITextField"="UITextField"; +// Title of the Styling autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.Styling"="Custom Autocomplete Styling"; +// Title of the photos demo for display in a list or nav header +"Demo.Title.Photos"="Photos"; +// Title of the 'select place' button within the photos demo +"Demo.Title.Photos.SelectPlace"="Select Place"; +// Title of the Place Picker demo for displaying the picker in a popover, navigation controller, or modally. +"Demo.Title.PlacePicker.ViewController"="Place Picker View Controller"; +// Title of the autocomplete demo section +"Demo.Section.Title.Autocomplete"="Autocomplete"; +// Title of the 'Programmatic' demo section +"Demo.Section.Title.Programmatic"="Programmatic APIs"; +// Title of the findPlacesLikelihood demo section +"Demo.Section.Title.FindPlaceLikelihood"="Likelihoods"; + +// Button title for 'show autocomplete widget' +"Demo.Content.Autocomplete.ShowWidgetButton"="Show Autocomplete Widget"; +// Prompt to enter text for autocomplete demo +"Demo.Content.Autocomplete.EnterTextPrompt"="Enter Autocomplete Text Here"; +// Format string for 'autocomplete failed with error' message +"Demo.Content.Autocomplete.FailedErrorMessage"="Autocomplete failed with error: %1$@"; +// String for 'autocomplete canceled message' +"Demo.Content.Autocomplete.WasCanceledMessage"="Autocomplete was canceled"; +// Button title for the 'Yellow and Brown' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.YellowAndBrown"="Yellow and Brown"; +// Button title for the 'White on Black' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.WhiteOnBlack"="White on Black"; +// Button title for the 'Blue Colors' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.BlueColors"="Blue Colors"; +// Button title for the 'Hot Dog Stand' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.HotDogStand"="Hot Dog Stand"; +// Button title for the 'Popover' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Popover"="Popover"; +// Button title for the 'Navigation' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Navigation"="Navigation"; +// Button title for the 'Modal' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Modal"="Modal"; + diff --git a/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/ms.lproj/Localizable.strings b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/ms.lproj/Localizable.strings new file mode 100755 index 0000000..f01e41c --- /dev/null +++ b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/ms.lproj/Localizable.strings @@ -0,0 +1,57 @@ +// NOTE: This is the english localization and has been copied to all languages. The reason for doing +// this is it signals to iOS that the app "supports" all of these languages. This is helpful for a +// demo as it allows you to try out the localization features of the Places SDK. In a shipping app +// you should never do this, it is for demonstration purposes only. + + +// The name of the app to display in a navigation bar along with a placeholder for the SDK version number. +"App.NameAndVersion"="Places Demos: %1$@"; + +// Title of the full-screen autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.FullScreen"="Full-Screen Autocomplete"; +// Title of the pushed autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.Push"="Push Autocomplete"; +// Title of the UISearchController autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UISearchController"="UISearchController"; +// Title of the UISearchDisplayController autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UISearchDisplayController"="UISearchDisplayController"; +// Title of the UITextField autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UITextField"="UITextField"; +// Title of the Styling autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.Styling"="Custom Autocomplete Styling"; +// Title of the photos demo for display in a list or nav header +"Demo.Title.Photos"="Photos"; +// Title of the 'select place' button within the photos demo +"Demo.Title.Photos.SelectPlace"="Select Place"; +// Title of the Place Picker demo for displaying the picker in a popover, navigation controller, or modally. +"Demo.Title.PlacePicker.ViewController"="Place Picker View Controller"; +// Title of the autocomplete demo section +"Demo.Section.Title.Autocomplete"="Autocomplete"; +// Title of the 'Programmatic' demo section +"Demo.Section.Title.Programmatic"="Programmatic APIs"; +// Title of the findPlacesLikelihood demo section +"Demo.Section.Title.FindPlaceLikelihood"="Likelihoods"; + +// Button title for 'show autocomplete widget' +"Demo.Content.Autocomplete.ShowWidgetButton"="Show Autocomplete Widget"; +// Prompt to enter text for autocomplete demo +"Demo.Content.Autocomplete.EnterTextPrompt"="Enter Autocomplete Text Here"; +// Format string for 'autocomplete failed with error' message +"Demo.Content.Autocomplete.FailedErrorMessage"="Autocomplete failed with error: %1$@"; +// String for 'autocomplete canceled message' +"Demo.Content.Autocomplete.WasCanceledMessage"="Autocomplete was canceled"; +// Button title for the 'Yellow and Brown' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.YellowAndBrown"="Yellow and Brown"; +// Button title for the 'White on Black' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.WhiteOnBlack"="White on Black"; +// Button title for the 'Blue Colors' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.BlueColors"="Blue Colors"; +// Button title for the 'Hot Dog Stand' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.HotDogStand"="Hot Dog Stand"; +// Button title for the 'Popover' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Popover"="Popover"; +// Button title for the 'Navigation' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Navigation"="Navigation"; +// Button title for the 'Modal' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Modal"="Modal"; + diff --git a/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/nb.lproj/Localizable.strings b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/nb.lproj/Localizable.strings new file mode 100755 index 0000000..f01e41c --- /dev/null +++ b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/nb.lproj/Localizable.strings @@ -0,0 +1,57 @@ +// NOTE: This is the english localization and has been copied to all languages. The reason for doing +// this is it signals to iOS that the app "supports" all of these languages. This is helpful for a +// demo as it allows you to try out the localization features of the Places SDK. In a shipping app +// you should never do this, it is for demonstration purposes only. + + +// The name of the app to display in a navigation bar along with a placeholder for the SDK version number. +"App.NameAndVersion"="Places Demos: %1$@"; + +// Title of the full-screen autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.FullScreen"="Full-Screen Autocomplete"; +// Title of the pushed autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.Push"="Push Autocomplete"; +// Title of the UISearchController autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UISearchController"="UISearchController"; +// Title of the UISearchDisplayController autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UISearchDisplayController"="UISearchDisplayController"; +// Title of the UITextField autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UITextField"="UITextField"; +// Title of the Styling autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.Styling"="Custom Autocomplete Styling"; +// Title of the photos demo for display in a list or nav header +"Demo.Title.Photos"="Photos"; +// Title of the 'select place' button within the photos demo +"Demo.Title.Photos.SelectPlace"="Select Place"; +// Title of the Place Picker demo for displaying the picker in a popover, navigation controller, or modally. +"Demo.Title.PlacePicker.ViewController"="Place Picker View Controller"; +// Title of the autocomplete demo section +"Demo.Section.Title.Autocomplete"="Autocomplete"; +// Title of the 'Programmatic' demo section +"Demo.Section.Title.Programmatic"="Programmatic APIs"; +// Title of the findPlacesLikelihood demo section +"Demo.Section.Title.FindPlaceLikelihood"="Likelihoods"; + +// Button title for 'show autocomplete widget' +"Demo.Content.Autocomplete.ShowWidgetButton"="Show Autocomplete Widget"; +// Prompt to enter text for autocomplete demo +"Demo.Content.Autocomplete.EnterTextPrompt"="Enter Autocomplete Text Here"; +// Format string for 'autocomplete failed with error' message +"Demo.Content.Autocomplete.FailedErrorMessage"="Autocomplete failed with error: %1$@"; +// String for 'autocomplete canceled message' +"Demo.Content.Autocomplete.WasCanceledMessage"="Autocomplete was canceled"; +// Button title for the 'Yellow and Brown' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.YellowAndBrown"="Yellow and Brown"; +// Button title for the 'White on Black' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.WhiteOnBlack"="White on Black"; +// Button title for the 'Blue Colors' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.BlueColors"="Blue Colors"; +// Button title for the 'Hot Dog Stand' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.HotDogStand"="Hot Dog Stand"; +// Button title for the 'Popover' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Popover"="Popover"; +// Button title for the 'Navigation' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Navigation"="Navigation"; +// Button title for the 'Modal' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Modal"="Modal"; + diff --git a/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/nl.lproj/Localizable.strings b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/nl.lproj/Localizable.strings new file mode 100755 index 0000000..f01e41c --- /dev/null +++ b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/nl.lproj/Localizable.strings @@ -0,0 +1,57 @@ +// NOTE: This is the english localization and has been copied to all languages. The reason for doing +// this is it signals to iOS that the app "supports" all of these languages. This is helpful for a +// demo as it allows you to try out the localization features of the Places SDK. In a shipping app +// you should never do this, it is for demonstration purposes only. + + +// The name of the app to display in a navigation bar along with a placeholder for the SDK version number. +"App.NameAndVersion"="Places Demos: %1$@"; + +// Title of the full-screen autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.FullScreen"="Full-Screen Autocomplete"; +// Title of the pushed autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.Push"="Push Autocomplete"; +// Title of the UISearchController autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UISearchController"="UISearchController"; +// Title of the UISearchDisplayController autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UISearchDisplayController"="UISearchDisplayController"; +// Title of the UITextField autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UITextField"="UITextField"; +// Title of the Styling autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.Styling"="Custom Autocomplete Styling"; +// Title of the photos demo for display in a list or nav header +"Demo.Title.Photos"="Photos"; +// Title of the 'select place' button within the photos demo +"Demo.Title.Photos.SelectPlace"="Select Place"; +// Title of the Place Picker demo for displaying the picker in a popover, navigation controller, or modally. +"Demo.Title.PlacePicker.ViewController"="Place Picker View Controller"; +// Title of the autocomplete demo section +"Demo.Section.Title.Autocomplete"="Autocomplete"; +// Title of the 'Programmatic' demo section +"Demo.Section.Title.Programmatic"="Programmatic APIs"; +// Title of the findPlacesLikelihood demo section +"Demo.Section.Title.FindPlaceLikelihood"="Likelihoods"; + +// Button title for 'show autocomplete widget' +"Demo.Content.Autocomplete.ShowWidgetButton"="Show Autocomplete Widget"; +// Prompt to enter text for autocomplete demo +"Demo.Content.Autocomplete.EnterTextPrompt"="Enter Autocomplete Text Here"; +// Format string for 'autocomplete failed with error' message +"Demo.Content.Autocomplete.FailedErrorMessage"="Autocomplete failed with error: %1$@"; +// String for 'autocomplete canceled message' +"Demo.Content.Autocomplete.WasCanceledMessage"="Autocomplete was canceled"; +// Button title for the 'Yellow and Brown' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.YellowAndBrown"="Yellow and Brown"; +// Button title for the 'White on Black' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.WhiteOnBlack"="White on Black"; +// Button title for the 'Blue Colors' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.BlueColors"="Blue Colors"; +// Button title for the 'Hot Dog Stand' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.HotDogStand"="Hot Dog Stand"; +// Button title for the 'Popover' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Popover"="Popover"; +// Button title for the 'Navigation' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Navigation"="Navigation"; +// Button title for the 'Modal' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Modal"="Modal"; + diff --git a/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/pl.lproj/Localizable.strings b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/pl.lproj/Localizable.strings new file mode 100755 index 0000000..f01e41c --- /dev/null +++ b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/pl.lproj/Localizable.strings @@ -0,0 +1,57 @@ +// NOTE: This is the english localization and has been copied to all languages. The reason for doing +// this is it signals to iOS that the app "supports" all of these languages. This is helpful for a +// demo as it allows you to try out the localization features of the Places SDK. In a shipping app +// you should never do this, it is for demonstration purposes only. + + +// The name of the app to display in a navigation bar along with a placeholder for the SDK version number. +"App.NameAndVersion"="Places Demos: %1$@"; + +// Title of the full-screen autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.FullScreen"="Full-Screen Autocomplete"; +// Title of the pushed autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.Push"="Push Autocomplete"; +// Title of the UISearchController autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UISearchController"="UISearchController"; +// Title of the UISearchDisplayController autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UISearchDisplayController"="UISearchDisplayController"; +// Title of the UITextField autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UITextField"="UITextField"; +// Title of the Styling autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.Styling"="Custom Autocomplete Styling"; +// Title of the photos demo for display in a list or nav header +"Demo.Title.Photos"="Photos"; +// Title of the 'select place' button within the photos demo +"Demo.Title.Photos.SelectPlace"="Select Place"; +// Title of the Place Picker demo for displaying the picker in a popover, navigation controller, or modally. +"Demo.Title.PlacePicker.ViewController"="Place Picker View Controller"; +// Title of the autocomplete demo section +"Demo.Section.Title.Autocomplete"="Autocomplete"; +// Title of the 'Programmatic' demo section +"Demo.Section.Title.Programmatic"="Programmatic APIs"; +// Title of the findPlacesLikelihood demo section +"Demo.Section.Title.FindPlaceLikelihood"="Likelihoods"; + +// Button title for 'show autocomplete widget' +"Demo.Content.Autocomplete.ShowWidgetButton"="Show Autocomplete Widget"; +// Prompt to enter text for autocomplete demo +"Demo.Content.Autocomplete.EnterTextPrompt"="Enter Autocomplete Text Here"; +// Format string for 'autocomplete failed with error' message +"Demo.Content.Autocomplete.FailedErrorMessage"="Autocomplete failed with error: %1$@"; +// String for 'autocomplete canceled message' +"Demo.Content.Autocomplete.WasCanceledMessage"="Autocomplete was canceled"; +// Button title for the 'Yellow and Brown' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.YellowAndBrown"="Yellow and Brown"; +// Button title for the 'White on Black' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.WhiteOnBlack"="White on Black"; +// Button title for the 'Blue Colors' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.BlueColors"="Blue Colors"; +// Button title for the 'Hot Dog Stand' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.HotDogStand"="Hot Dog Stand"; +// Button title for the 'Popover' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Popover"="Popover"; +// Button title for the 'Navigation' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Navigation"="Navigation"; +// Button title for the 'Modal' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Modal"="Modal"; + diff --git a/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/pt.lproj/Localizable.strings b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/pt.lproj/Localizable.strings new file mode 100755 index 0000000..f01e41c --- /dev/null +++ b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/pt.lproj/Localizable.strings @@ -0,0 +1,57 @@ +// NOTE: This is the english localization and has been copied to all languages. The reason for doing +// this is it signals to iOS that the app "supports" all of these languages. This is helpful for a +// demo as it allows you to try out the localization features of the Places SDK. In a shipping app +// you should never do this, it is for demonstration purposes only. + + +// The name of the app to display in a navigation bar along with a placeholder for the SDK version number. +"App.NameAndVersion"="Places Demos: %1$@"; + +// Title of the full-screen autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.FullScreen"="Full-Screen Autocomplete"; +// Title of the pushed autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.Push"="Push Autocomplete"; +// Title of the UISearchController autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UISearchController"="UISearchController"; +// Title of the UISearchDisplayController autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UISearchDisplayController"="UISearchDisplayController"; +// Title of the UITextField autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UITextField"="UITextField"; +// Title of the Styling autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.Styling"="Custom Autocomplete Styling"; +// Title of the photos demo for display in a list or nav header +"Demo.Title.Photos"="Photos"; +// Title of the 'select place' button within the photos demo +"Demo.Title.Photos.SelectPlace"="Select Place"; +// Title of the Place Picker demo for displaying the picker in a popover, navigation controller, or modally. +"Demo.Title.PlacePicker.ViewController"="Place Picker View Controller"; +// Title of the autocomplete demo section +"Demo.Section.Title.Autocomplete"="Autocomplete"; +// Title of the 'Programmatic' demo section +"Demo.Section.Title.Programmatic"="Programmatic APIs"; +// Title of the findPlacesLikelihood demo section +"Demo.Section.Title.FindPlaceLikelihood"="Likelihoods"; + +// Button title for 'show autocomplete widget' +"Demo.Content.Autocomplete.ShowWidgetButton"="Show Autocomplete Widget"; +// Prompt to enter text for autocomplete demo +"Demo.Content.Autocomplete.EnterTextPrompt"="Enter Autocomplete Text Here"; +// Format string for 'autocomplete failed with error' message +"Demo.Content.Autocomplete.FailedErrorMessage"="Autocomplete failed with error: %1$@"; +// String for 'autocomplete canceled message' +"Demo.Content.Autocomplete.WasCanceledMessage"="Autocomplete was canceled"; +// Button title for the 'Yellow and Brown' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.YellowAndBrown"="Yellow and Brown"; +// Button title for the 'White on Black' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.WhiteOnBlack"="White on Black"; +// Button title for the 'Blue Colors' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.BlueColors"="Blue Colors"; +// Button title for the 'Hot Dog Stand' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.HotDogStand"="Hot Dog Stand"; +// Button title for the 'Popover' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Popover"="Popover"; +// Button title for the 'Navigation' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Navigation"="Navigation"; +// Button title for the 'Modal' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Modal"="Modal"; + diff --git a/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/pt_BR.lproj/Localizable.strings b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/pt_BR.lproj/Localizable.strings new file mode 100755 index 0000000..f01e41c --- /dev/null +++ b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/pt_BR.lproj/Localizable.strings @@ -0,0 +1,57 @@ +// NOTE: This is the english localization and has been copied to all languages. The reason for doing +// this is it signals to iOS that the app "supports" all of these languages. This is helpful for a +// demo as it allows you to try out the localization features of the Places SDK. In a shipping app +// you should never do this, it is for demonstration purposes only. + + +// The name of the app to display in a navigation bar along with a placeholder for the SDK version number. +"App.NameAndVersion"="Places Demos: %1$@"; + +// Title of the full-screen autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.FullScreen"="Full-Screen Autocomplete"; +// Title of the pushed autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.Push"="Push Autocomplete"; +// Title of the UISearchController autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UISearchController"="UISearchController"; +// Title of the UISearchDisplayController autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UISearchDisplayController"="UISearchDisplayController"; +// Title of the UITextField autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UITextField"="UITextField"; +// Title of the Styling autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.Styling"="Custom Autocomplete Styling"; +// Title of the photos demo for display in a list or nav header +"Demo.Title.Photos"="Photos"; +// Title of the 'select place' button within the photos demo +"Demo.Title.Photos.SelectPlace"="Select Place"; +// Title of the Place Picker demo for displaying the picker in a popover, navigation controller, or modally. +"Demo.Title.PlacePicker.ViewController"="Place Picker View Controller"; +// Title of the autocomplete demo section +"Demo.Section.Title.Autocomplete"="Autocomplete"; +// Title of the 'Programmatic' demo section +"Demo.Section.Title.Programmatic"="Programmatic APIs"; +// Title of the findPlacesLikelihood demo section +"Demo.Section.Title.FindPlaceLikelihood"="Likelihoods"; + +// Button title for 'show autocomplete widget' +"Demo.Content.Autocomplete.ShowWidgetButton"="Show Autocomplete Widget"; +// Prompt to enter text for autocomplete demo +"Demo.Content.Autocomplete.EnterTextPrompt"="Enter Autocomplete Text Here"; +// Format string for 'autocomplete failed with error' message +"Demo.Content.Autocomplete.FailedErrorMessage"="Autocomplete failed with error: %1$@"; +// String for 'autocomplete canceled message' +"Demo.Content.Autocomplete.WasCanceledMessage"="Autocomplete was canceled"; +// Button title for the 'Yellow and Brown' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.YellowAndBrown"="Yellow and Brown"; +// Button title for the 'White on Black' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.WhiteOnBlack"="White on Black"; +// Button title for the 'Blue Colors' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.BlueColors"="Blue Colors"; +// Button title for the 'Hot Dog Stand' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.HotDogStand"="Hot Dog Stand"; +// Button title for the 'Popover' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Popover"="Popover"; +// Button title for the 'Navigation' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Navigation"="Navigation"; +// Button title for the 'Modal' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Modal"="Modal"; + diff --git a/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/pt_PT.lproj/Localizable.strings b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/pt_PT.lproj/Localizable.strings new file mode 100755 index 0000000..f01e41c --- /dev/null +++ b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/pt_PT.lproj/Localizable.strings @@ -0,0 +1,57 @@ +// NOTE: This is the english localization and has been copied to all languages. The reason for doing +// this is it signals to iOS that the app "supports" all of these languages. This is helpful for a +// demo as it allows you to try out the localization features of the Places SDK. In a shipping app +// you should never do this, it is for demonstration purposes only. + + +// The name of the app to display in a navigation bar along with a placeholder for the SDK version number. +"App.NameAndVersion"="Places Demos: %1$@"; + +// Title of the full-screen autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.FullScreen"="Full-Screen Autocomplete"; +// Title of the pushed autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.Push"="Push Autocomplete"; +// Title of the UISearchController autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UISearchController"="UISearchController"; +// Title of the UISearchDisplayController autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UISearchDisplayController"="UISearchDisplayController"; +// Title of the UITextField autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UITextField"="UITextField"; +// Title of the Styling autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.Styling"="Custom Autocomplete Styling"; +// Title of the photos demo for display in a list or nav header +"Demo.Title.Photos"="Photos"; +// Title of the 'select place' button within the photos demo +"Demo.Title.Photos.SelectPlace"="Select Place"; +// Title of the Place Picker demo for displaying the picker in a popover, navigation controller, or modally. +"Demo.Title.PlacePicker.ViewController"="Place Picker View Controller"; +// Title of the autocomplete demo section +"Demo.Section.Title.Autocomplete"="Autocomplete"; +// Title of the 'Programmatic' demo section +"Demo.Section.Title.Programmatic"="Programmatic APIs"; +// Title of the findPlacesLikelihood demo section +"Demo.Section.Title.FindPlaceLikelihood"="Likelihoods"; + +// Button title for 'show autocomplete widget' +"Demo.Content.Autocomplete.ShowWidgetButton"="Show Autocomplete Widget"; +// Prompt to enter text for autocomplete demo +"Demo.Content.Autocomplete.EnterTextPrompt"="Enter Autocomplete Text Here"; +// Format string for 'autocomplete failed with error' message +"Demo.Content.Autocomplete.FailedErrorMessage"="Autocomplete failed with error: %1$@"; +// String for 'autocomplete canceled message' +"Demo.Content.Autocomplete.WasCanceledMessage"="Autocomplete was canceled"; +// Button title for the 'Yellow and Brown' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.YellowAndBrown"="Yellow and Brown"; +// Button title for the 'White on Black' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.WhiteOnBlack"="White on Black"; +// Button title for the 'Blue Colors' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.BlueColors"="Blue Colors"; +// Button title for the 'Hot Dog Stand' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.HotDogStand"="Hot Dog Stand"; +// Button title for the 'Popover' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Popover"="Popover"; +// Button title for the 'Navigation' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Navigation"="Navigation"; +// Button title for the 'Modal' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Modal"="Modal"; + diff --git a/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/ro.lproj/Localizable.strings b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/ro.lproj/Localizable.strings new file mode 100755 index 0000000..f01e41c --- /dev/null +++ b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/ro.lproj/Localizable.strings @@ -0,0 +1,57 @@ +// NOTE: This is the english localization and has been copied to all languages. The reason for doing +// this is it signals to iOS that the app "supports" all of these languages. This is helpful for a +// demo as it allows you to try out the localization features of the Places SDK. In a shipping app +// you should never do this, it is for demonstration purposes only. + + +// The name of the app to display in a navigation bar along with a placeholder for the SDK version number. +"App.NameAndVersion"="Places Demos: %1$@"; + +// Title of the full-screen autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.FullScreen"="Full-Screen Autocomplete"; +// Title of the pushed autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.Push"="Push Autocomplete"; +// Title of the UISearchController autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UISearchController"="UISearchController"; +// Title of the UISearchDisplayController autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UISearchDisplayController"="UISearchDisplayController"; +// Title of the UITextField autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UITextField"="UITextField"; +// Title of the Styling autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.Styling"="Custom Autocomplete Styling"; +// Title of the photos demo for display in a list or nav header +"Demo.Title.Photos"="Photos"; +// Title of the 'select place' button within the photos demo +"Demo.Title.Photos.SelectPlace"="Select Place"; +// Title of the Place Picker demo for displaying the picker in a popover, navigation controller, or modally. +"Demo.Title.PlacePicker.ViewController"="Place Picker View Controller"; +// Title of the autocomplete demo section +"Demo.Section.Title.Autocomplete"="Autocomplete"; +// Title of the 'Programmatic' demo section +"Demo.Section.Title.Programmatic"="Programmatic APIs"; +// Title of the findPlacesLikelihood demo section +"Demo.Section.Title.FindPlaceLikelihood"="Likelihoods"; + +// Button title for 'show autocomplete widget' +"Demo.Content.Autocomplete.ShowWidgetButton"="Show Autocomplete Widget"; +// Prompt to enter text for autocomplete demo +"Demo.Content.Autocomplete.EnterTextPrompt"="Enter Autocomplete Text Here"; +// Format string for 'autocomplete failed with error' message +"Demo.Content.Autocomplete.FailedErrorMessage"="Autocomplete failed with error: %1$@"; +// String for 'autocomplete canceled message' +"Demo.Content.Autocomplete.WasCanceledMessage"="Autocomplete was canceled"; +// Button title for the 'Yellow and Brown' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.YellowAndBrown"="Yellow and Brown"; +// Button title for the 'White on Black' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.WhiteOnBlack"="White on Black"; +// Button title for the 'Blue Colors' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.BlueColors"="Blue Colors"; +// Button title for the 'Hot Dog Stand' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.HotDogStand"="Hot Dog Stand"; +// Button title for the 'Popover' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Popover"="Popover"; +// Button title for the 'Navigation' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Navigation"="Navigation"; +// Button title for the 'Modal' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Modal"="Modal"; + diff --git a/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/ru.lproj/Localizable.strings b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/ru.lproj/Localizable.strings new file mode 100755 index 0000000..f01e41c --- /dev/null +++ b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/ru.lproj/Localizable.strings @@ -0,0 +1,57 @@ +// NOTE: This is the english localization and has been copied to all languages. The reason for doing +// this is it signals to iOS that the app "supports" all of these languages. This is helpful for a +// demo as it allows you to try out the localization features of the Places SDK. In a shipping app +// you should never do this, it is for demonstration purposes only. + + +// The name of the app to display in a navigation bar along with a placeholder for the SDK version number. +"App.NameAndVersion"="Places Demos: %1$@"; + +// Title of the full-screen autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.FullScreen"="Full-Screen Autocomplete"; +// Title of the pushed autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.Push"="Push Autocomplete"; +// Title of the UISearchController autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UISearchController"="UISearchController"; +// Title of the UISearchDisplayController autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UISearchDisplayController"="UISearchDisplayController"; +// Title of the UITextField autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UITextField"="UITextField"; +// Title of the Styling autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.Styling"="Custom Autocomplete Styling"; +// Title of the photos demo for display in a list or nav header +"Demo.Title.Photos"="Photos"; +// Title of the 'select place' button within the photos demo +"Demo.Title.Photos.SelectPlace"="Select Place"; +// Title of the Place Picker demo for displaying the picker in a popover, navigation controller, or modally. +"Demo.Title.PlacePicker.ViewController"="Place Picker View Controller"; +// Title of the autocomplete demo section +"Demo.Section.Title.Autocomplete"="Autocomplete"; +// Title of the 'Programmatic' demo section +"Demo.Section.Title.Programmatic"="Programmatic APIs"; +// Title of the findPlacesLikelihood demo section +"Demo.Section.Title.FindPlaceLikelihood"="Likelihoods"; + +// Button title for 'show autocomplete widget' +"Demo.Content.Autocomplete.ShowWidgetButton"="Show Autocomplete Widget"; +// Prompt to enter text for autocomplete demo +"Demo.Content.Autocomplete.EnterTextPrompt"="Enter Autocomplete Text Here"; +// Format string for 'autocomplete failed with error' message +"Demo.Content.Autocomplete.FailedErrorMessage"="Autocomplete failed with error: %1$@"; +// String for 'autocomplete canceled message' +"Demo.Content.Autocomplete.WasCanceledMessage"="Autocomplete was canceled"; +// Button title for the 'Yellow and Brown' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.YellowAndBrown"="Yellow and Brown"; +// Button title for the 'White on Black' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.WhiteOnBlack"="White on Black"; +// Button title for the 'Blue Colors' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.BlueColors"="Blue Colors"; +// Button title for the 'Hot Dog Stand' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.HotDogStand"="Hot Dog Stand"; +// Button title for the 'Popover' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Popover"="Popover"; +// Button title for the 'Navigation' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Navigation"="Navigation"; +// Button title for the 'Modal' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Modal"="Modal"; + diff --git a/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/sk.lproj/Localizable.strings b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/sk.lproj/Localizable.strings new file mode 100755 index 0000000..f01e41c --- /dev/null +++ b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/sk.lproj/Localizable.strings @@ -0,0 +1,57 @@ +// NOTE: This is the english localization and has been copied to all languages. The reason for doing +// this is it signals to iOS that the app "supports" all of these languages. This is helpful for a +// demo as it allows you to try out the localization features of the Places SDK. In a shipping app +// you should never do this, it is for demonstration purposes only. + + +// The name of the app to display in a navigation bar along with a placeholder for the SDK version number. +"App.NameAndVersion"="Places Demos: %1$@"; + +// Title of the full-screen autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.FullScreen"="Full-Screen Autocomplete"; +// Title of the pushed autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.Push"="Push Autocomplete"; +// Title of the UISearchController autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UISearchController"="UISearchController"; +// Title of the UISearchDisplayController autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UISearchDisplayController"="UISearchDisplayController"; +// Title of the UITextField autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UITextField"="UITextField"; +// Title of the Styling autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.Styling"="Custom Autocomplete Styling"; +// Title of the photos demo for display in a list or nav header +"Demo.Title.Photos"="Photos"; +// Title of the 'select place' button within the photos demo +"Demo.Title.Photos.SelectPlace"="Select Place"; +// Title of the Place Picker demo for displaying the picker in a popover, navigation controller, or modally. +"Demo.Title.PlacePicker.ViewController"="Place Picker View Controller"; +// Title of the autocomplete demo section +"Demo.Section.Title.Autocomplete"="Autocomplete"; +// Title of the 'Programmatic' demo section +"Demo.Section.Title.Programmatic"="Programmatic APIs"; +// Title of the findPlacesLikelihood demo section +"Demo.Section.Title.FindPlaceLikelihood"="Likelihoods"; + +// Button title for 'show autocomplete widget' +"Demo.Content.Autocomplete.ShowWidgetButton"="Show Autocomplete Widget"; +// Prompt to enter text for autocomplete demo +"Demo.Content.Autocomplete.EnterTextPrompt"="Enter Autocomplete Text Here"; +// Format string for 'autocomplete failed with error' message +"Demo.Content.Autocomplete.FailedErrorMessage"="Autocomplete failed with error: %1$@"; +// String for 'autocomplete canceled message' +"Demo.Content.Autocomplete.WasCanceledMessage"="Autocomplete was canceled"; +// Button title for the 'Yellow and Brown' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.YellowAndBrown"="Yellow and Brown"; +// Button title for the 'White on Black' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.WhiteOnBlack"="White on Black"; +// Button title for the 'Blue Colors' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.BlueColors"="Blue Colors"; +// Button title for the 'Hot Dog Stand' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.HotDogStand"="Hot Dog Stand"; +// Button title for the 'Popover' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Popover"="Popover"; +// Button title for the 'Navigation' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Navigation"="Navigation"; +// Button title for the 'Modal' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Modal"="Modal"; + diff --git a/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/sv.lproj/Localizable.strings b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/sv.lproj/Localizable.strings new file mode 100755 index 0000000..f01e41c --- /dev/null +++ b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/sv.lproj/Localizable.strings @@ -0,0 +1,57 @@ +// NOTE: This is the english localization and has been copied to all languages. The reason for doing +// this is it signals to iOS that the app "supports" all of these languages. This is helpful for a +// demo as it allows you to try out the localization features of the Places SDK. In a shipping app +// you should never do this, it is for demonstration purposes only. + + +// The name of the app to display in a navigation bar along with a placeholder for the SDK version number. +"App.NameAndVersion"="Places Demos: %1$@"; + +// Title of the full-screen autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.FullScreen"="Full-Screen Autocomplete"; +// Title of the pushed autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.Push"="Push Autocomplete"; +// Title of the UISearchController autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UISearchController"="UISearchController"; +// Title of the UISearchDisplayController autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UISearchDisplayController"="UISearchDisplayController"; +// Title of the UITextField autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UITextField"="UITextField"; +// Title of the Styling autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.Styling"="Custom Autocomplete Styling"; +// Title of the photos demo for display in a list or nav header +"Demo.Title.Photos"="Photos"; +// Title of the 'select place' button within the photos demo +"Demo.Title.Photos.SelectPlace"="Select Place"; +// Title of the Place Picker demo for displaying the picker in a popover, navigation controller, or modally. +"Demo.Title.PlacePicker.ViewController"="Place Picker View Controller"; +// Title of the autocomplete demo section +"Demo.Section.Title.Autocomplete"="Autocomplete"; +// Title of the 'Programmatic' demo section +"Demo.Section.Title.Programmatic"="Programmatic APIs"; +// Title of the findPlacesLikelihood demo section +"Demo.Section.Title.FindPlaceLikelihood"="Likelihoods"; + +// Button title for 'show autocomplete widget' +"Demo.Content.Autocomplete.ShowWidgetButton"="Show Autocomplete Widget"; +// Prompt to enter text for autocomplete demo +"Demo.Content.Autocomplete.EnterTextPrompt"="Enter Autocomplete Text Here"; +// Format string for 'autocomplete failed with error' message +"Demo.Content.Autocomplete.FailedErrorMessage"="Autocomplete failed with error: %1$@"; +// String for 'autocomplete canceled message' +"Demo.Content.Autocomplete.WasCanceledMessage"="Autocomplete was canceled"; +// Button title for the 'Yellow and Brown' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.YellowAndBrown"="Yellow and Brown"; +// Button title for the 'White on Black' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.WhiteOnBlack"="White on Black"; +// Button title for the 'Blue Colors' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.BlueColors"="Blue Colors"; +// Button title for the 'Hot Dog Stand' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.HotDogStand"="Hot Dog Stand"; +// Button title for the 'Popover' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Popover"="Popover"; +// Button title for the 'Navigation' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Navigation"="Navigation"; +// Button title for the 'Modal' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Modal"="Modal"; + diff --git a/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/th.lproj/Localizable.strings b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/th.lproj/Localizable.strings new file mode 100755 index 0000000..f01e41c --- /dev/null +++ b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/th.lproj/Localizable.strings @@ -0,0 +1,57 @@ +// NOTE: This is the english localization and has been copied to all languages. The reason for doing +// this is it signals to iOS that the app "supports" all of these languages. This is helpful for a +// demo as it allows you to try out the localization features of the Places SDK. In a shipping app +// you should never do this, it is for demonstration purposes only. + + +// The name of the app to display in a navigation bar along with a placeholder for the SDK version number. +"App.NameAndVersion"="Places Demos: %1$@"; + +// Title of the full-screen autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.FullScreen"="Full-Screen Autocomplete"; +// Title of the pushed autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.Push"="Push Autocomplete"; +// Title of the UISearchController autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UISearchController"="UISearchController"; +// Title of the UISearchDisplayController autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UISearchDisplayController"="UISearchDisplayController"; +// Title of the UITextField autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UITextField"="UITextField"; +// Title of the Styling autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.Styling"="Custom Autocomplete Styling"; +// Title of the photos demo for display in a list or nav header +"Demo.Title.Photos"="Photos"; +// Title of the 'select place' button within the photos demo +"Demo.Title.Photos.SelectPlace"="Select Place"; +// Title of the Place Picker demo for displaying the picker in a popover, navigation controller, or modally. +"Demo.Title.PlacePicker.ViewController"="Place Picker View Controller"; +// Title of the autocomplete demo section +"Demo.Section.Title.Autocomplete"="Autocomplete"; +// Title of the 'Programmatic' demo section +"Demo.Section.Title.Programmatic"="Programmatic APIs"; +// Title of the findPlacesLikelihood demo section +"Demo.Section.Title.FindPlaceLikelihood"="Likelihoods"; + +// Button title for 'show autocomplete widget' +"Demo.Content.Autocomplete.ShowWidgetButton"="Show Autocomplete Widget"; +// Prompt to enter text for autocomplete demo +"Demo.Content.Autocomplete.EnterTextPrompt"="Enter Autocomplete Text Here"; +// Format string for 'autocomplete failed with error' message +"Demo.Content.Autocomplete.FailedErrorMessage"="Autocomplete failed with error: %1$@"; +// String for 'autocomplete canceled message' +"Demo.Content.Autocomplete.WasCanceledMessage"="Autocomplete was canceled"; +// Button title for the 'Yellow and Brown' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.YellowAndBrown"="Yellow and Brown"; +// Button title for the 'White on Black' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.WhiteOnBlack"="White on Black"; +// Button title for the 'Blue Colors' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.BlueColors"="Blue Colors"; +// Button title for the 'Hot Dog Stand' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.HotDogStand"="Hot Dog Stand"; +// Button title for the 'Popover' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Popover"="Popover"; +// Button title for the 'Navigation' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Navigation"="Navigation"; +// Button title for the 'Modal' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Modal"="Modal"; + diff --git a/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/tr.lproj/Localizable.strings b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/tr.lproj/Localizable.strings new file mode 100755 index 0000000..f01e41c --- /dev/null +++ b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/tr.lproj/Localizable.strings @@ -0,0 +1,57 @@ +// NOTE: This is the english localization and has been copied to all languages. The reason for doing +// this is it signals to iOS that the app "supports" all of these languages. This is helpful for a +// demo as it allows you to try out the localization features of the Places SDK. In a shipping app +// you should never do this, it is for demonstration purposes only. + + +// The name of the app to display in a navigation bar along with a placeholder for the SDK version number. +"App.NameAndVersion"="Places Demos: %1$@"; + +// Title of the full-screen autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.FullScreen"="Full-Screen Autocomplete"; +// Title of the pushed autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.Push"="Push Autocomplete"; +// Title of the UISearchController autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UISearchController"="UISearchController"; +// Title of the UISearchDisplayController autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UISearchDisplayController"="UISearchDisplayController"; +// Title of the UITextField autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UITextField"="UITextField"; +// Title of the Styling autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.Styling"="Custom Autocomplete Styling"; +// Title of the photos demo for display in a list or nav header +"Demo.Title.Photos"="Photos"; +// Title of the 'select place' button within the photos demo +"Demo.Title.Photos.SelectPlace"="Select Place"; +// Title of the Place Picker demo for displaying the picker in a popover, navigation controller, or modally. +"Demo.Title.PlacePicker.ViewController"="Place Picker View Controller"; +// Title of the autocomplete demo section +"Demo.Section.Title.Autocomplete"="Autocomplete"; +// Title of the 'Programmatic' demo section +"Demo.Section.Title.Programmatic"="Programmatic APIs"; +// Title of the findPlacesLikelihood demo section +"Demo.Section.Title.FindPlaceLikelihood"="Likelihoods"; + +// Button title for 'show autocomplete widget' +"Demo.Content.Autocomplete.ShowWidgetButton"="Show Autocomplete Widget"; +// Prompt to enter text for autocomplete demo +"Demo.Content.Autocomplete.EnterTextPrompt"="Enter Autocomplete Text Here"; +// Format string for 'autocomplete failed with error' message +"Demo.Content.Autocomplete.FailedErrorMessage"="Autocomplete failed with error: %1$@"; +// String for 'autocomplete canceled message' +"Demo.Content.Autocomplete.WasCanceledMessage"="Autocomplete was canceled"; +// Button title for the 'Yellow and Brown' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.YellowAndBrown"="Yellow and Brown"; +// Button title for the 'White on Black' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.WhiteOnBlack"="White on Black"; +// Button title for the 'Blue Colors' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.BlueColors"="Blue Colors"; +// Button title for the 'Hot Dog Stand' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.HotDogStand"="Hot Dog Stand"; +// Button title for the 'Popover' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Popover"="Popover"; +// Button title for the 'Navigation' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Navigation"="Navigation"; +// Button title for the 'Modal' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Modal"="Modal"; + diff --git a/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/uk.lproj/Localizable.strings b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/uk.lproj/Localizable.strings new file mode 100755 index 0000000..f01e41c --- /dev/null +++ b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/uk.lproj/Localizable.strings @@ -0,0 +1,57 @@ +// NOTE: This is the english localization and has been copied to all languages. The reason for doing +// this is it signals to iOS that the app "supports" all of these languages. This is helpful for a +// demo as it allows you to try out the localization features of the Places SDK. In a shipping app +// you should never do this, it is for demonstration purposes only. + + +// The name of the app to display in a navigation bar along with a placeholder for the SDK version number. +"App.NameAndVersion"="Places Demos: %1$@"; + +// Title of the full-screen autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.FullScreen"="Full-Screen Autocomplete"; +// Title of the pushed autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.Push"="Push Autocomplete"; +// Title of the UISearchController autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UISearchController"="UISearchController"; +// Title of the UISearchDisplayController autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UISearchDisplayController"="UISearchDisplayController"; +// Title of the UITextField autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UITextField"="UITextField"; +// Title of the Styling autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.Styling"="Custom Autocomplete Styling"; +// Title of the photos demo for display in a list or nav header +"Demo.Title.Photos"="Photos"; +// Title of the 'select place' button within the photos demo +"Demo.Title.Photos.SelectPlace"="Select Place"; +// Title of the Place Picker demo for displaying the picker in a popover, navigation controller, or modally. +"Demo.Title.PlacePicker.ViewController"="Place Picker View Controller"; +// Title of the autocomplete demo section +"Demo.Section.Title.Autocomplete"="Autocomplete"; +// Title of the 'Programmatic' demo section +"Demo.Section.Title.Programmatic"="Programmatic APIs"; +// Title of the findPlacesLikelihood demo section +"Demo.Section.Title.FindPlaceLikelihood"="Likelihoods"; + +// Button title for 'show autocomplete widget' +"Demo.Content.Autocomplete.ShowWidgetButton"="Show Autocomplete Widget"; +// Prompt to enter text for autocomplete demo +"Demo.Content.Autocomplete.EnterTextPrompt"="Enter Autocomplete Text Here"; +// Format string for 'autocomplete failed with error' message +"Demo.Content.Autocomplete.FailedErrorMessage"="Autocomplete failed with error: %1$@"; +// String for 'autocomplete canceled message' +"Demo.Content.Autocomplete.WasCanceledMessage"="Autocomplete was canceled"; +// Button title for the 'Yellow and Brown' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.YellowAndBrown"="Yellow and Brown"; +// Button title for the 'White on Black' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.WhiteOnBlack"="White on Black"; +// Button title for the 'Blue Colors' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.BlueColors"="Blue Colors"; +// Button title for the 'Hot Dog Stand' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.HotDogStand"="Hot Dog Stand"; +// Button title for the 'Popover' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Popover"="Popover"; +// Button title for the 'Navigation' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Navigation"="Navigation"; +// Button title for the 'Modal' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Modal"="Modal"; + diff --git a/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/vi.lproj/Localizable.strings b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/vi.lproj/Localizable.strings new file mode 100755 index 0000000..f01e41c --- /dev/null +++ b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/vi.lproj/Localizable.strings @@ -0,0 +1,57 @@ +// NOTE: This is the english localization and has been copied to all languages. The reason for doing +// this is it signals to iOS that the app "supports" all of these languages. This is helpful for a +// demo as it allows you to try out the localization features of the Places SDK. In a shipping app +// you should never do this, it is for demonstration purposes only. + + +// The name of the app to display in a navigation bar along with a placeholder for the SDK version number. +"App.NameAndVersion"="Places Demos: %1$@"; + +// Title of the full-screen autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.FullScreen"="Full-Screen Autocomplete"; +// Title of the pushed autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.Push"="Push Autocomplete"; +// Title of the UISearchController autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UISearchController"="UISearchController"; +// Title of the UISearchDisplayController autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UISearchDisplayController"="UISearchDisplayController"; +// Title of the UITextField autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UITextField"="UITextField"; +// Title of the Styling autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.Styling"="Custom Autocomplete Styling"; +// Title of the photos demo for display in a list or nav header +"Demo.Title.Photos"="Photos"; +// Title of the 'select place' button within the photos demo +"Demo.Title.Photos.SelectPlace"="Select Place"; +// Title of the Place Picker demo for displaying the picker in a popover, navigation controller, or modally. +"Demo.Title.PlacePicker.ViewController"="Place Picker View Controller"; +// Title of the autocomplete demo section +"Demo.Section.Title.Autocomplete"="Autocomplete"; +// Title of the 'Programmatic' demo section +"Demo.Section.Title.Programmatic"="Programmatic APIs"; +// Title of the findPlacesLikelihood demo section +"Demo.Section.Title.FindPlaceLikelihood"="Likelihoods"; + +// Button title for 'show autocomplete widget' +"Demo.Content.Autocomplete.ShowWidgetButton"="Show Autocomplete Widget"; +// Prompt to enter text for autocomplete demo +"Demo.Content.Autocomplete.EnterTextPrompt"="Enter Autocomplete Text Here"; +// Format string for 'autocomplete failed with error' message +"Demo.Content.Autocomplete.FailedErrorMessage"="Autocomplete failed with error: %1$@"; +// String for 'autocomplete canceled message' +"Demo.Content.Autocomplete.WasCanceledMessage"="Autocomplete was canceled"; +// Button title for the 'Yellow and Brown' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.YellowAndBrown"="Yellow and Brown"; +// Button title for the 'White on Black' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.WhiteOnBlack"="White on Black"; +// Button title for the 'Blue Colors' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.BlueColors"="Blue Colors"; +// Button title for the 'Hot Dog Stand' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.HotDogStand"="Hot Dog Stand"; +// Button title for the 'Popover' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Popover"="Popover"; +// Button title for the 'Navigation' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Navigation"="Navigation"; +// Button title for the 'Modal' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Modal"="Modal"; + diff --git a/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/zh_CN.lproj/Localizable.strings b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/zh_CN.lproj/Localizable.strings new file mode 100755 index 0000000..f01e41c --- /dev/null +++ b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/zh_CN.lproj/Localizable.strings @@ -0,0 +1,57 @@ +// NOTE: This is the english localization and has been copied to all languages. The reason for doing +// this is it signals to iOS that the app "supports" all of these languages. This is helpful for a +// demo as it allows you to try out the localization features of the Places SDK. In a shipping app +// you should never do this, it is for demonstration purposes only. + + +// The name of the app to display in a navigation bar along with a placeholder for the SDK version number. +"App.NameAndVersion"="Places Demos: %1$@"; + +// Title of the full-screen autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.FullScreen"="Full-Screen Autocomplete"; +// Title of the pushed autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.Push"="Push Autocomplete"; +// Title of the UISearchController autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UISearchController"="UISearchController"; +// Title of the UISearchDisplayController autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UISearchDisplayController"="UISearchDisplayController"; +// Title of the UITextField autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UITextField"="UITextField"; +// Title of the Styling autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.Styling"="Custom Autocomplete Styling"; +// Title of the photos demo for display in a list or nav header +"Demo.Title.Photos"="Photos"; +// Title of the 'select place' button within the photos demo +"Demo.Title.Photos.SelectPlace"="Select Place"; +// Title of the Place Picker demo for displaying the picker in a popover, navigation controller, or modally. +"Demo.Title.PlacePicker.ViewController"="Place Picker View Controller"; +// Title of the autocomplete demo section +"Demo.Section.Title.Autocomplete"="Autocomplete"; +// Title of the 'Programmatic' demo section +"Demo.Section.Title.Programmatic"="Programmatic APIs"; +// Title of the findPlacesLikelihood demo section +"Demo.Section.Title.FindPlaceLikelihood"="Likelihoods"; + +// Button title for 'show autocomplete widget' +"Demo.Content.Autocomplete.ShowWidgetButton"="Show Autocomplete Widget"; +// Prompt to enter text for autocomplete demo +"Demo.Content.Autocomplete.EnterTextPrompt"="Enter Autocomplete Text Here"; +// Format string for 'autocomplete failed with error' message +"Demo.Content.Autocomplete.FailedErrorMessage"="Autocomplete failed with error: %1$@"; +// String for 'autocomplete canceled message' +"Demo.Content.Autocomplete.WasCanceledMessage"="Autocomplete was canceled"; +// Button title for the 'Yellow and Brown' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.YellowAndBrown"="Yellow and Brown"; +// Button title for the 'White on Black' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.WhiteOnBlack"="White on Black"; +// Button title for the 'Blue Colors' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.BlueColors"="Blue Colors"; +// Button title for the 'Hot Dog Stand' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.HotDogStand"="Hot Dog Stand"; +// Button title for the 'Popover' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Popover"="Popover"; +// Button title for the 'Navigation' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Navigation"="Navigation"; +// Button title for the 'Modal' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Modal"="Modal"; + diff --git a/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/zh_HK.lproj/Localizable.strings b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/zh_HK.lproj/Localizable.strings new file mode 100755 index 0000000..f01e41c --- /dev/null +++ b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/zh_HK.lproj/Localizable.strings @@ -0,0 +1,57 @@ +// NOTE: This is the english localization and has been copied to all languages. The reason for doing +// this is it signals to iOS that the app "supports" all of these languages. This is helpful for a +// demo as it allows you to try out the localization features of the Places SDK. In a shipping app +// you should never do this, it is for demonstration purposes only. + + +// The name of the app to display in a navigation bar along with a placeholder for the SDK version number. +"App.NameAndVersion"="Places Demos: %1$@"; + +// Title of the full-screen autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.FullScreen"="Full-Screen Autocomplete"; +// Title of the pushed autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.Push"="Push Autocomplete"; +// Title of the UISearchController autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UISearchController"="UISearchController"; +// Title of the UISearchDisplayController autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UISearchDisplayController"="UISearchDisplayController"; +// Title of the UITextField autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UITextField"="UITextField"; +// Title of the Styling autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.Styling"="Custom Autocomplete Styling"; +// Title of the photos demo for display in a list or nav header +"Demo.Title.Photos"="Photos"; +// Title of the 'select place' button within the photos demo +"Demo.Title.Photos.SelectPlace"="Select Place"; +// Title of the Place Picker demo for displaying the picker in a popover, navigation controller, or modally. +"Demo.Title.PlacePicker.ViewController"="Place Picker View Controller"; +// Title of the autocomplete demo section +"Demo.Section.Title.Autocomplete"="Autocomplete"; +// Title of the 'Programmatic' demo section +"Demo.Section.Title.Programmatic"="Programmatic APIs"; +// Title of the findPlacesLikelihood demo section +"Demo.Section.Title.FindPlaceLikelihood"="Likelihoods"; + +// Button title for 'show autocomplete widget' +"Demo.Content.Autocomplete.ShowWidgetButton"="Show Autocomplete Widget"; +// Prompt to enter text for autocomplete demo +"Demo.Content.Autocomplete.EnterTextPrompt"="Enter Autocomplete Text Here"; +// Format string for 'autocomplete failed with error' message +"Demo.Content.Autocomplete.FailedErrorMessage"="Autocomplete failed with error: %1$@"; +// String for 'autocomplete canceled message' +"Demo.Content.Autocomplete.WasCanceledMessage"="Autocomplete was canceled"; +// Button title for the 'Yellow and Brown' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.YellowAndBrown"="Yellow and Brown"; +// Button title for the 'White on Black' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.WhiteOnBlack"="White on Black"; +// Button title for the 'Blue Colors' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.BlueColors"="Blue Colors"; +// Button title for the 'Hot Dog Stand' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.HotDogStand"="Hot Dog Stand"; +// Button title for the 'Popover' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Popover"="Popover"; +// Button title for the 'Navigation' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Navigation"="Navigation"; +// Button title for the 'Modal' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Modal"="Modal"; + diff --git a/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/zh_TW.lproj/Localizable.strings b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/zh_TW.lproj/Localizable.strings new file mode 100755 index 0000000..f01e41c --- /dev/null +++ b/Pods/GooglePlaces/Example/GooglePlacesDemos/Resources/zh_TW.lproj/Localizable.strings @@ -0,0 +1,57 @@ +// NOTE: This is the english localization and has been copied to all languages. The reason for doing +// this is it signals to iOS that the app "supports" all of these languages. This is helpful for a +// demo as it allows you to try out the localization features of the Places SDK. In a shipping app +// you should never do this, it is for demonstration purposes only. + + +// The name of the app to display in a navigation bar along with a placeholder for the SDK version number. +"App.NameAndVersion"="Places Demos: %1$@"; + +// Title of the full-screen autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.FullScreen"="Full-Screen Autocomplete"; +// Title of the pushed autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.Push"="Push Autocomplete"; +// Title of the UISearchController autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UISearchController"="UISearchController"; +// Title of the UISearchDisplayController autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UISearchDisplayController"="UISearchDisplayController"; +// Title of the UITextField autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.UITextField"="UITextField"; +// Title of the Styling autocomplete demo for display in a list or nav header +"Demo.Title.Autocomplete.Styling"="Custom Autocomplete Styling"; +// Title of the photos demo for display in a list or nav header +"Demo.Title.Photos"="Photos"; +// Title of the 'select place' button within the photos demo +"Demo.Title.Photos.SelectPlace"="Select Place"; +// Title of the Place Picker demo for displaying the picker in a popover, navigation controller, or modally. +"Demo.Title.PlacePicker.ViewController"="Place Picker View Controller"; +// Title of the autocomplete demo section +"Demo.Section.Title.Autocomplete"="Autocomplete"; +// Title of the 'Programmatic' demo section +"Demo.Section.Title.Programmatic"="Programmatic APIs"; +// Title of the findPlacesLikelihood demo section +"Demo.Section.Title.FindPlaceLikelihood"="Likelihoods"; + +// Button title for 'show autocomplete widget' +"Demo.Content.Autocomplete.ShowWidgetButton"="Show Autocomplete Widget"; +// Prompt to enter text for autocomplete demo +"Demo.Content.Autocomplete.EnterTextPrompt"="Enter Autocomplete Text Here"; +// Format string for 'autocomplete failed with error' message +"Demo.Content.Autocomplete.FailedErrorMessage"="Autocomplete failed with error: %1$@"; +// String for 'autocomplete canceled message' +"Demo.Content.Autocomplete.WasCanceledMessage"="Autocomplete was canceled"; +// Button title for the 'Yellow and Brown' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.YellowAndBrown"="Yellow and Brown"; +// Button title for the 'White on Black' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.WhiteOnBlack"="White on Black"; +// Button title for the 'Blue Colors' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.BlueColors"="Blue Colors"; +// Button title for the 'Hot Dog Stand' styled autocomplete widget. +"Demo.Content.Autocomplete.Styling.Colors.HotDogStand"="Hot Dog Stand"; +// Button title for the 'Popover' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Popover"="Popover"; +// Button title for the 'Navigation' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Navigation"="Navigation"; +// Button title for the 'Modal' view of the place picker. +"Demo.Content.PlacePicker.ViewController.Modal"="Modal"; + diff --git a/Pods/GooglePlaces/Example/GooglePlacesDemos/SDKDemoAPIKey.h b/Pods/GooglePlaces/Example/GooglePlacesDemos/SDKDemoAPIKey.h new file mode 100755 index 0000000..35da75b --- /dev/null +++ b/Pods/GooglePlaces/Example/GooglePlacesDemos/SDKDemoAPIKey.h @@ -0,0 +1,25 @@ +/* + * Copyright 2016 Google Inc. All rights reserved. + * + * + * 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. + */ + +/** + * To use GooglePlacesDemos, please register an API Key for your application and set it here. Your + * API Key should be kept private. + * + * See documentation on getting an API Key for your API Project here: + * https://developers.google.com/places/ios-sdk/start#get-key + */ + +#error Register your API key and insert here, then delete this line. +static NSString *const kAPIKey = @""; diff --git a/Pods/GooglePlaces/Example/GooglePlacesDemos/Samples/Autocomplete/AutocompleteBaseViewController.h b/Pods/GooglePlaces/Example/GooglePlacesDemos/Samples/Autocomplete/AutocompleteBaseViewController.h new file mode 100755 index 0000000..0b2172c --- /dev/null +++ b/Pods/GooglePlaces/Example/GooglePlacesDemos/Samples/Autocomplete/AutocompleteBaseViewController.h @@ -0,0 +1,51 @@ +/* + * Copyright 2016 Google Inc. All rights reserved. + * + * + * 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. + */ + +#import +#import "GooglePlacesDemos/Support/BaseDemoViewController.h" + +/** + * All other autocomplete demo classes inherit from this class. This class optionally adds a button + * to present the autocomplete widget, and displays the results when these are selected. + */ +@interface AutocompleteBaseViewController : BaseDemoViewController + +/** Filter to apply to autocomplete suggestions (can be nil). */ +@property(nonatomic, strong) GMSAutocompleteFilter *autocompleteFilter; + +/** + * The |GMSPlaceField| for specifying explicit place details to be requested for the |GMSPlace| + * result. + */ +@property(nonatomic, assign) GMSPlaceField placeFields; + +/** + * Build a UIButton to display the autocomplete widget and add it to the UI. This should be called + * only if the demo requires such a button, e.g. demos for modal presentation of widgets would use + * this, while a UITextField demo would not. + * + * @param selector The selector to send to self when the button is tapped. + * + * @return The UIButton which was added to the UI. + */ +- (UIButton *)createShowAutocompleteButton:(SEL)selector; + +- (void)autocompleteDidSelectPlace:(GMSPlace *)place; +- (void)autocompleteDidFail:(NSError *)error; +- (void)autocompleteDidCancel; +- (void)showCustomMessageInResultPane:(NSString *)message; +- (void)resetViews; + +@end diff --git a/Pods/GooglePlaces/Example/GooglePlacesDemos/Samples/Autocomplete/AutocompleteBaseViewController.m b/Pods/GooglePlaces/Example/GooglePlacesDemos/Samples/Autocomplete/AutocompleteBaseViewController.m new file mode 100755 index 0000000..ded5d78 --- /dev/null +++ b/Pods/GooglePlaces/Example/GooglePlacesDemos/Samples/Autocomplete/AutocompleteBaseViewController.m @@ -0,0 +1,220 @@ +/* + * Copyright 2016 Google Inc. All rights reserved. + * + * + * 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. + */ + +#import "GooglePlacesDemos/Samples/Autocomplete/AutocompleteBaseViewController.h" + +#import "GooglePlacesDemos/Samples/PagingPhotoView.h" + +@implementation AutocompleteBaseViewController { + PagingPhotoView *_photoView; + UIButton *_photoButton; + UITextView *_textView; +} + +- (void)viewDidLoad { + [super viewDidLoad]; + + // Configure a background color. + self.view.backgroundColor = [UIColor whiteColor]; + + // Configure the UI. Tell our superclass we want a button and a result view below that. + _photoButton = + [self createButton:@selector(showPhotosButtonTapped) + title:NSLocalizedString(@"Demo.Title.Photos", @"Button title for 'Photos'")]; + + // Create a text view. + _textView = [[UITextView alloc] init]; + _textView.editable = NO; + _textView.translatesAutoresizingMaskIntoConstraints = NO; + [self addResultTextView]; + + // Configure the photo view where we are going to display the loaded photos. + _photoView = [[PagingPhotoView alloc] initWithFrame:self.view.bounds]; + _photoView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; + [self.view addSubview:_photoView]; + + // Reset the various views to their initial states. + [self resetViews]; +} + +- (UIButton *)createShowAutocompleteButton:(SEL)selector { + return [self createButton:selector + title:NSLocalizedString(@"Demo.Content.Autocomplete.ShowWidgetButton", + @"Button title for 'show autocomplete widget'")]; +} + +- (NSString *)openStatusTextFromPlace:(GMSPlace *)place { + GMSPlaceOpenStatus openStatus = [place isOpen]; + switch (openStatus) { + case GMSPlaceOpenStatusOpen: + return @"Open"; + case GMSPlaceOpenStatusClosed: + return @"Closed"; + case GMSPlaceOpenStatusUnknown: + return @"Unknown"; + } +} + +- (void)autocompleteDidSelectPlace:(GMSPlace *)place { + NSMutableAttributedString *text = + [[NSMutableAttributedString alloc] initWithString:[place description]]; + [text appendAttributedString:[[NSAttributedString alloc] initWithString:@"\nPlace status: "]]; + NSString *openStatusText = [self openStatusTextFromPlace:place]; + [text appendAttributedString:[[NSAttributedString alloc] initWithString:openStatusText]]; + NSAttributedString *attributions = place.attributions; + if (attributions) { + NSAttributedString *doubleReturn = [[NSAttributedString alloc] initWithString:@"\n\n"]; + [text appendAttributedString:doubleReturn]; + [text appendAttributedString:attributions]; + } + _textView.attributedText = text; + [_textView setIsAccessibilityElement:YES]; + [_textView setHidden:NO]; + + // Show the photo button be start disabled until the photos have loaded. + [_photoButton setIsAccessibilityElement:YES]; + [_photoButton setHidden:NO]; + [_photoButton setEnabled:NO]; + if (place.photos.count > 0) { + [self preloadPhotoList:place.photos]; + } +} + +- (void)autocompleteDidFail:(NSError *)error { + NSString *formatString = + NSLocalizedString(@"Demo.Content.Autocomplete.FailedErrorMessage", + @"Format string for 'autocomplete failed with error' message"); + _textView.text = [NSString stringWithFormat:formatString, error]; +} + +- (void)autocompleteDidCancel { + _textView.text = NSLocalizedString(@"Demo.Content.Autocomplete.WasCanceledMessage", + @"String for 'autocomplete canceled message'"); +} + +- (void)showCustomMessageInResultPane:(NSString *)message { + _textView.text = message; +} + +- (void)resetViews { + _photoView.photoList = @[]; + [_textView setText:@""]; + [_textView setIsAccessibilityElement:NO]; + [_textView setHidden:NO]; + [_photoButton setIsAccessibilityElement:NO]; + [_photoButton setHidden:YES]; + [_photoView setHidden:YES]; +} + +#pragma mark - Private + +- (void)addResultTextView { + NSAssert(_textView.superview == nil, @"%s should not be called twice", sel_getName(_cmd)); + [self.view addSubview:_textView]; + + // Check to see if we can use readableContentGuide from iOS 9+ + if ([self.view respondsToSelector:@selector(readableContentGuide)]) { + // Position it horizontally so it fills the readableContentGuide. Use the new anchor-based + // system because we know this code will only run on iOS 9+. + [self.view.readableContentGuide.leadingAnchor constraintEqualToAnchor:_textView.leadingAnchor] + .active = YES; + [self.view.readableContentGuide.trailingAnchor constraintEqualToAnchor:_textView.trailingAnchor] + .active = YES; + // Set the textContainerInset to 0 because the readableContentGuide is already handling the + // inset. + _textView.textContainerInset = UIEdgeInsetsZero; + } else { + // Position it horizontally so it fills the parent. + [self.view + addConstraints:[NSLayoutConstraint + constraintsWithVisualFormat:@"H:|-(0)-[_textView]-(0)-|" + options:0 + metrics:nil + views:NSDictionaryOfVariableBindings(_textView)]]; + } + + // If we have a view place it below that. + [self.view addConstraints:[NSLayoutConstraint + constraintsWithVisualFormat:@"V:[_photoButton]-[_textView]-(0)-|" + options:0 + metrics:nil + views:NSDictionaryOfVariableBindings( + _photoButton, _textView)]]; +} + +- (UIButton *)createButton:(SEL)selector title:(NSString *)title { + // Create a button to show the autocomplete widget. + UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem]; + [button setTitle:title forState:UIControlStateNormal]; + [button addTarget:self action:selector forControlEvents:UIControlEventTouchUpInside]; + button.translatesAutoresizingMaskIntoConstraints = NO; + [self.view addSubview:button]; + // Position the button from the top of the view. + [NSLayoutConstraint constraintWithItem:button + attribute:NSLayoutAttributeTop + relatedBy:NSLayoutRelationEqual + toItem:self.topLayoutGuide + attribute:NSLayoutAttributeBottom + multiplier:1 + constant:8] + .active = YES; + // Centre it horizontally. + [NSLayoutConstraint constraintWithItem:button + attribute:NSLayoutAttributeCenterX + relatedBy:NSLayoutRelationEqual + toItem:self.view + attribute:NSLayoutAttributeCenterX + multiplier:1 + constant:0] + .active = YES; + + return button; +} + +- (void)showPhotosButtonTapped { + [_textView setIsAccessibilityElement:NO]; + [_textView setHidden:YES]; + [_photoButton setIsAccessibilityElement:NO]; + [_photoButton setHidden:YES]; + [_photoView setHidden:NO]; +} + +// Preload the photos to be displayed. +- (void)preloadPhotoList:(NSArray *)photos { + __block NSMutableArray *attributedPhotos = [NSMutableArray array]; + __block NSInteger photoRequestsInFlight = photos.count; + for (GMSPlacePhotoMetadata *photo in photos) { + [[GMSPlacesClient sharedClient] loadPlacePhoto:photo + callback:^(UIImage *photoImage, NSError *error) { + photoRequestsInFlight--; + if (photoImage == nil) { + NSLog(@"Photo request failed with error: %@", error); + } else { + AttributedPhoto *attributedPhoto = + [[AttributedPhoto alloc] init]; + attributedPhoto.image = photoImage; + attributedPhoto.attributions = photo.attributions; + [attributedPhotos addObject:attributedPhoto]; + } + + if (photoRequestsInFlight == 0) { + _photoView.photoList = attributedPhotos; + [_photoButton setEnabled:YES]; + } + }]; + } +} + +@end diff --git a/Pods/GooglePlaces/Example/GooglePlacesDemos/Samples/Autocomplete/AutocompleteModalViewController.h b/Pods/GooglePlaces/Example/GooglePlacesDemos/Samples/Autocomplete/AutocompleteModalViewController.h new file mode 100755 index 0000000..dceb663 --- /dev/null +++ b/Pods/GooglePlaces/Example/GooglePlacesDemos/Samples/Autocomplete/AutocompleteModalViewController.h @@ -0,0 +1,23 @@ +/* + * Copyright 2016 Google Inc. All rights reserved. + * + * + * 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. + */ + +#import "GooglePlacesDemos/Samples/Autocomplete/AutocompleteBaseViewController.h" + +/** + * Demo showing a modally presented Autocomplete view controller. + */ +@interface AutocompleteModalViewController : AutocompleteBaseViewController + +@end diff --git a/Pods/GooglePlaces/Example/GooglePlacesDemos/Samples/Autocomplete/AutocompleteModalViewController.m b/Pods/GooglePlaces/Example/GooglePlacesDemos/Samples/Autocomplete/AutocompleteModalViewController.m new file mode 100755 index 0000000..963f772 --- /dev/null +++ b/Pods/GooglePlaces/Example/GooglePlacesDemos/Samples/Autocomplete/AutocompleteModalViewController.m @@ -0,0 +1,86 @@ +/* + * Copyright 2016 Google Inc. All rights reserved. + * + * + * 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. + */ + +#import "GooglePlacesDemos/Samples/Autocomplete/AutocompleteModalViewController.h" + +#import + +@interface AutocompleteModalViewController () +@end + +@implementation AutocompleteModalViewController { + UIButton *_showAutocompleteWidgetButton; +} + ++ (NSString *)demoTitle { + return NSLocalizedString( + @"Demo.Title.Autocomplete.FullScreen", + @"Title of the full-screen autocomplete demo for display in a list or nav header"); +} + +#pragma mark - View Lifecycle + +- (void)viewDidLoad { + [super viewDidLoad]; + + // Configure the UI. Tell our superclass we want a button and a result view below that. + _showAutocompleteWidgetButton = + [self createShowAutocompleteButton:@selector(showAutocompleteWidgetButtonTapped)]; +} + +#pragma mark - Actions + +- (IBAction)showAutocompleteWidgetButtonTapped { + // When the button is pressed modally present the autocomplete view controller. + GMSAutocompleteViewController *autocompleteViewController = + [[GMSAutocompleteViewController alloc] init]; + autocompleteViewController.delegate = self; + autocompleteViewController.autocompleteFilter = self.autocompleteFilter; + autocompleteViewController.placeFields = self.placeFields; + [self presentViewController:autocompleteViewController animated:YES completion:nil]; + [_showAutocompleteWidgetButton setHidden:YES]; +} + +#pragma mark - GMSAutocompleteViewControllerDelegate + +- (void)viewController:(GMSAutocompleteViewController *)viewController + didAutocompleteWithPlace:(GMSPlace *)place { + // Dismiss the view controller and tell our superclass to populate the result view. + [viewController dismissViewControllerAnimated:YES completion:nil]; + [self autocompleteDidSelectPlace:place]; +} + +- (void)viewController:(GMSAutocompleteViewController *)viewController + didFailAutocompleteWithError:(NSError *)error { + // Dismiss the view controller and notify our superclass of the failure. + [viewController dismissViewControllerAnimated:YES completion:nil]; + [self autocompleteDidFail:error]; +} + +- (void)wasCancelled:(GMSAutocompleteViewController *)viewController { + // Dismiss the controller and show a message that it was canceled. + [viewController dismissViewControllerAnimated:YES completion:nil]; + [self autocompleteDidCancel]; +} + +- (void)didRequestAutocompletePredictions:(GMSAutocompleteViewController *)viewController { + [UIApplication sharedApplication].networkActivityIndicatorVisible = YES; +} + +- (void)didUpdateAutocompletePredictions:(GMSAutocompleteViewController *)viewController { + [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; +} + +@end diff --git a/Pods/GooglePlaces/Example/GooglePlacesDemos/Samples/Autocomplete/AutocompletePushViewController.h b/Pods/GooglePlaces/Example/GooglePlacesDemos/Samples/Autocomplete/AutocompletePushViewController.h new file mode 100755 index 0000000..64d87e1 --- /dev/null +++ b/Pods/GooglePlaces/Example/GooglePlacesDemos/Samples/Autocomplete/AutocompletePushViewController.h @@ -0,0 +1,23 @@ +/* + * Copyright 2016 Google Inc. All rights reserved. + * + * + * 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. + */ + +#import "GooglePlacesDemos/Samples/Autocomplete/AutocompleteBaseViewController.h" + +/** + * Demo showing a Autocomplete view controller pushed on the navigation stack. + */ +@interface AutocompletePushViewController : AutocompleteBaseViewController + +@end diff --git a/Pods/GooglePlaces/Example/GooglePlacesDemos/Samples/Autocomplete/AutocompletePushViewController.m b/Pods/GooglePlaces/Example/GooglePlacesDemos/Samples/Autocomplete/AutocompletePushViewController.m new file mode 100755 index 0000000..2152cfe --- /dev/null +++ b/Pods/GooglePlaces/Example/GooglePlacesDemos/Samples/Autocomplete/AutocompletePushViewController.m @@ -0,0 +1,95 @@ +/* + * Copyright 2016 Google Inc. All rights reserved. + * + * + * 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. + */ + +#import "GooglePlacesDemos/Samples/Autocomplete/AutocompletePushViewController.h" + +#import + +@interface AutocompletePushViewController () +@end + +@implementation AutocompletePushViewController { + UIButton *_showAutocompleteWidgetButton; +} + ++ (NSString *)demoTitle { + return NSLocalizedString( + @"Demo.Title.Autocomplete.Push", + @"Title of the pushed autocomplete demo for display in a list or nav header"); +} + +#pragma mark - View Lifecycle + +- (void)viewDidLoad { + [super viewDidLoad]; + + // Configure the UI. Tell our superclass we want a button and a result view below that. + _showAutocompleteWidgetButton = + [self createShowAutocompleteButton:@selector(showAutocompleteWidgetButtonTapped)]; +} + +#pragma mark - Creation of |GMSAutocompleteViewController| instance. + +- (GMSAutocompleteViewController *)autocompleteViewControllerInstance { + GMSAutocompleteViewController *autocompleteViewController = + [[GMSAutocompleteViewController alloc] init]; + autocompleteViewController.delegate = self; + autocompleteViewController.autocompleteFilter = self.autocompleteFilter; + autocompleteViewController.placeFields = self.placeFields; + + // Returns new GMSAutocompleteViewController instance. + return autocompleteViewController; +} + +#pragma mark - Actions + +- (IBAction)showAutocompleteWidgetButtonTapped { + // When the button is tapped just push a new autocomplete view controller onto the stack. + [self.navigationController pushViewController:[self autocompleteViewControllerInstance] + animated:YES]; + [_showAutocompleteWidgetButton setHidden:YES]; +} + +#pragma mark - GMSAutocompleteViewControllerDelegate + +- (void)viewController:(GMSAutocompleteViewController *)viewController + didAutocompleteWithPlace:(GMSPlace *)place { + // Dismiss the view controller and tell our superclass to populate the result view. + [self.navigationController popToViewController:self animated:YES]; + [self autocompleteDidSelectPlace:place]; +} + +- (void)viewController:(GMSAutocompleteViewController *)viewController + didFailAutocompleteWithError:(NSError *)error { + // Dismiss the view controller and notify our superclass of the failure. + [self.navigationController popToViewController:self animated:YES]; + [self autocompleteDidFail:error]; +} + +- (void)wasCancelled:(GMSAutocompleteViewController *)viewController { + // Dismiss the controller and show a message that it was canceled. + [self.navigationController popToViewController:self animated:YES]; + [self autocompleteDidCancel]; +} + +- (void)didRequestAutocompletePredictions:(GMSAutocompleteViewController *)viewController { + [UIApplication sharedApplication].networkActivityIndicatorVisible = YES; +} + +- (void)didUpdateAutocompletePredictions:(GMSAutocompleteViewController *)viewController { + [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; +} + +@end diff --git a/Pods/GooglePlaces/Example/GooglePlacesDemos/Samples/Autocomplete/AutocompleteWithCustomColors.h b/Pods/GooglePlaces/Example/GooglePlacesDemos/Samples/Autocomplete/AutocompleteWithCustomColors.h new file mode 100755 index 0000000..4f13d5f --- /dev/null +++ b/Pods/GooglePlaces/Example/GooglePlacesDemos/Samples/Autocomplete/AutocompleteWithCustomColors.h @@ -0,0 +1,23 @@ +/* + * Copyright 2016 Google Inc. All rights reserved. + * + * + * 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. + */ + +#import "GooglePlacesDemos/Samples/Autocomplete/AutocompleteBaseViewController.h" + +/* + * SDK Demo showing how to customise colors in the full-screen Autocomplete Widget. + */ +@interface AutocompleteWithCustomColors : AutocompleteBaseViewController + +@end diff --git a/Pods/GooglePlaces/Example/GooglePlacesDemos/Samples/Autocomplete/AutocompleteWithCustomColors.m b/Pods/GooglePlaces/Example/GooglePlacesDemos/Samples/Autocomplete/AutocompleteWithCustomColors.m new file mode 100755 index 0000000..84fcace --- /dev/null +++ b/Pods/GooglePlaces/Example/GooglePlacesDemos/Samples/Autocomplete/AutocompleteWithCustomColors.m @@ -0,0 +1,389 @@ +/* + * Copyright 2016 Google Inc. All rights reserved. + * + * + * 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. + */ + +#import "GooglePlacesDemos/Samples/Autocomplete/AutocompleteWithCustomColors.h" + +#import + +/** + * Simple subclass of GMSAutocompleteViewController solely for the purpose of localising appearance + * proxy changes to this part of the demo app. + */ +@interface GMSStyledAutocompleteViewController : GMSAutocompleteViewController +@end + +@implementation GMSStyledAutocompleteViewController +@end + +@interface AutocompleteWithCustomColors () +@end + +@implementation AutocompleteWithCustomColors { + NSMutableArray *_themeButtons; +} + ++ (NSString *)demoTitle { + return NSLocalizedString( + @"Demo.Title.Autocomplete.Styling", + @"Title of the Styling autocomplete demo for display in a list or nav header"); +} + +- (void)viewDidLoad { + [super viewDidLoad]; + + self.view.backgroundColor = [UIColor whiteColor]; + + NSString *titleYellowAndBrown = + NSLocalizedString(@"Demo.Content.Autocomplete.Styling.Colors.YellowAndBrown", + @"Button title for the 'Yellow and Brown' styled autocomplete widget."); + NSString *titleWhiteOnBlack = + NSLocalizedString(@"Demo.Content.Autocomplete.Styling.Colors.WhiteOnBlack", + @"Button title for the 'WhiteOnBlack' styled autocomplete widget."); + NSString *titleBlueColors = + NSLocalizedString(@"Demo.Content.Autocomplete.Styling.Colors.BlueColors", + @"Button title for the 'BlueColors' styled autocomplete widget."); + NSString *titleHotDogStand = + NSLocalizedString(@"Demo.Content.Autocomplete.Styling.Colors.HotDogStand", + @"Button title for the 'Hot Dog Stand' styled autocomplete widget."); + + UIButton *brownThemeButton = [UIButton buttonWithType:UIButtonTypeSystem]; + [brownThemeButton setTitle:titleYellowAndBrown forState:UIControlStateNormal]; + [brownThemeButton addTarget:self + action:@selector(openBrownTheme:) + forControlEvents:UIControlEventTouchUpInside]; + brownThemeButton.translatesAutoresizingMaskIntoConstraints = NO; + [self.view addSubview:brownThemeButton]; + [NSLayoutConstraint constraintWithItem:brownThemeButton + attribute:NSLayoutAttributeTop + relatedBy:NSLayoutRelationEqual + toItem:self.topLayoutGuide + attribute:NSLayoutAttributeBottom + multiplier:1 + constant:8] + .active = YES; + [NSLayoutConstraint constraintWithItem:brownThemeButton + attribute:NSLayoutAttributeCenterX + relatedBy:NSLayoutRelationEqual + toItem:self.view + attribute:NSLayoutAttributeCenterX + multiplier:1 + constant:0] + .active = YES; + + UIButton *blackThemeButton = [UIButton buttonWithType:UIButtonTypeSystem]; + [blackThemeButton setTitle:titleWhiteOnBlack forState:UIControlStateNormal]; + [blackThemeButton addTarget:self + action:@selector(openBlackTheme:) + forControlEvents:UIControlEventTouchUpInside]; + blackThemeButton.translatesAutoresizingMaskIntoConstraints = NO; + [self.view addSubview:blackThemeButton]; + [NSLayoutConstraint constraintWithItem:blackThemeButton + attribute:NSLayoutAttributeTop + relatedBy:NSLayoutRelationEqual + toItem:brownThemeButton + attribute:NSLayoutAttributeBottom + multiplier:1 + constant:8] + .active = YES; + [NSLayoutConstraint constraintWithItem:blackThemeButton + attribute:NSLayoutAttributeCenterX + relatedBy:NSLayoutRelationEqual + toItem:self.view + attribute:NSLayoutAttributeCenterX + multiplier:1 + constant:0] + .active = YES; + + UIButton *blueThemeButton = [UIButton buttonWithType:UIButtonTypeSystem]; + [blueThemeButton setTitle:titleBlueColors forState:UIControlStateNormal]; + [blueThemeButton addTarget:self + action:@selector(openBlueTheme:) + forControlEvents:UIControlEventTouchUpInside]; + blueThemeButton.translatesAutoresizingMaskIntoConstraints = NO; + [self.view addSubview:blueThemeButton]; + [NSLayoutConstraint constraintWithItem:blueThemeButton + attribute:NSLayoutAttributeTop + relatedBy:NSLayoutRelationEqual + toItem:blackThemeButton + attribute:NSLayoutAttributeBottom + multiplier:1 + constant:8] + .active = YES; + [NSLayoutConstraint constraintWithItem:blueThemeButton + attribute:NSLayoutAttributeCenterX + relatedBy:NSLayoutRelationEqual + toItem:self.view + attribute:NSLayoutAttributeCenterX + multiplier:1 + constant:0] + .active = YES; + + UIButton *hotDogThemeButton = [UIButton buttonWithType:UIButtonTypeSystem]; + [hotDogThemeButton setTitle:titleHotDogStand forState:UIControlStateNormal]; + [hotDogThemeButton addTarget:self + action:@selector(openHotDogTheme:) + forControlEvents:UIControlEventTouchUpInside]; + hotDogThemeButton.translatesAutoresizingMaskIntoConstraints = NO; + [self.view addSubview:hotDogThemeButton]; + [NSLayoutConstraint constraintWithItem:hotDogThemeButton + attribute:NSLayoutAttributeTop + relatedBy:NSLayoutRelationEqual + toItem:blueThemeButton + attribute:NSLayoutAttributeBottom + multiplier:1 + constant:8] + .active = YES; + [NSLayoutConstraint constraintWithItem:hotDogThemeButton + attribute:NSLayoutAttributeCenterX + relatedBy:NSLayoutRelationEqual + toItem:self.view + attribute:NSLayoutAttributeCenterX + multiplier:1 + constant:0] + .active = YES; + + self.definesPresentationContext = YES; + + // Store the theme buttons into array. + _themeButtons = [NSMutableArray array]; + [_themeButtons addObject:brownThemeButton]; + [_themeButtons addObject:blackThemeButton]; + [_themeButtons addObject:blueThemeButton]; + [_themeButtons addObject:hotDogThemeButton]; +} + +- (void)openBrownTheme:(UIButton *)button { + UIColor *backgroundColor = + [UIColor colorWithRed:215.0f / 255.0f green:204.0f / 255.0f blue:200.0f / 255.0f alpha:1.0f]; + UIColor *selectedTableCellBackgroundColor = + [UIColor colorWithRed:236.0f / 255.0f green:225.0f / 255.0f blue:220.0f / 255.0f alpha:1.0f]; + UIColor *darkBackgroundColor = + [UIColor colorWithRed:93.0f / 255.0f green:64.0f / 255.0f blue:55.0f / 255.0f alpha:1.0f]; + UIColor *primaryTextColor = [UIColor colorWithWhite:0.33f alpha:1.0f]; + + UIColor *highlightColor = + [UIColor colorWithRed:255.0f / 255.0f green:235.0f / 255.0f blue:0.0f / 255.0f alpha:1.0f]; + UIColor *secondaryColor = [UIColor colorWithWhite:114.0f / 255.0f alpha:1.0f]; + UIColor *tintColor = + [UIColor colorWithRed:219 / 255.0f green:207 / 255.0f blue:28 / 255.0f alpha:1.0f]; + UIColor *searchBarTintColor = [UIColor yellowColor]; + UIColor *separatorColor = [UIColor colorWithWhite:182.0f / 255.0f alpha:1.0f]; + + [self presentAutocompleteControllerWithBackgroundColor:backgroundColor + selectedTableCellBackgroundColor:selectedTableCellBackgroundColor + darkBackgroundColor:darkBackgroundColor + primaryTextColor:primaryTextColor + highlightColor:highlightColor + secondaryColor:secondaryColor + tintColor:tintColor + searchBarTintColor:searchBarTintColor + separatorColor:separatorColor]; +} + +- (void)openBlueTheme:(UIButton *)button { + UIColor *backgroundColor = + [UIColor colorWithRed:225.0f / 255.0f green:241.0f / 255.0f blue:252.0f / 255.0f alpha:1.0f]; + UIColor *selectedTableCellBackgroundColor = + [UIColor colorWithRed:213.0f / 255.0f green:219.0f / 255.0f blue:230.0f / 255.0f alpha:1.0f]; + UIColor *darkBackgroundColor = + [UIColor colorWithRed:187.0f / 255.0f green:222.0f / 255.0f blue:248.0f / 255.0f alpha:1.0f]; + UIColor *primaryTextColor = [UIColor colorWithWhite:0.5f alpha:1.0f]; + UIColor *highlightColor = + [UIColor colorWithRed:76.0f / 255.0f green:175.0f / 255.0f blue:248.0f / 255.0f alpha:1.0f]; + UIColor *secondaryColor = [UIColor colorWithWhite:0.5f alpha:0.65f]; + UIColor *tintColor = + [UIColor colorWithRed:0 / 255.0f green:142 / 255.0f blue:248.0f / 255.0f alpha:1.0f]; + UIColor *searchBarTintColor = tintColor; + UIColor *separatorColor = [UIColor colorWithWhite:0.5f alpha:0.65f]; + + [self presentAutocompleteControllerWithBackgroundColor:backgroundColor + selectedTableCellBackgroundColor:selectedTableCellBackgroundColor + darkBackgroundColor:darkBackgroundColor + primaryTextColor:primaryTextColor + highlightColor:highlightColor + secondaryColor:secondaryColor + tintColor:tintColor + searchBarTintColor:searchBarTintColor + separatorColor:separatorColor]; +} + +- (void)openBlackTheme:(UIButton *)button { + UIColor *backgroundColor = [UIColor colorWithWhite:0.25f alpha:1.0f]; + UIColor *selectedTableCellBackgroundColor = [UIColor colorWithWhite:0.35f alpha:1.0f]; + UIColor *darkBackgroundColor = [UIColor colorWithWhite:0.2f alpha:1.0f]; + UIColor *primaryTextColor = [UIColor whiteColor]; + UIColor *highlightColor = [UIColor colorWithRed:0.75f green:1.0f blue:0.75f alpha:1.0f]; + UIColor *secondaryColor = [UIColor colorWithWhite:1.0f alpha:0.5f]; + UIColor *tintColor = [UIColor whiteColor]; + UIColor *searchBarTintColor = tintColor; + UIColor *separatorColor = [UIColor colorWithRed:0.5f green:0.75f blue:0.5f alpha:0.30f]; + + [self presentAutocompleteControllerWithBackgroundColor:backgroundColor + selectedTableCellBackgroundColor:selectedTableCellBackgroundColor + darkBackgroundColor:darkBackgroundColor + primaryTextColor:primaryTextColor + highlightColor:highlightColor + secondaryColor:secondaryColor + tintColor:tintColor + searchBarTintColor:searchBarTintColor + separatorColor:separatorColor]; +} + +- (void)openHotDogTheme:(UIButton *)button { + UIColor *backgroundColor = [UIColor yellowColor]; + UIColor *selectedTableCellBackgroundColor = [UIColor whiteColor]; + UIColor *darkBackgroundColor = [UIColor redColor]; + UIColor *primaryTextColor = [UIColor blackColor]; + UIColor *highlightColor = [UIColor redColor]; + UIColor *secondaryColor = [UIColor colorWithWhite:0.0f alpha:0.6f]; + UIColor *tintColor = [UIColor redColor]; + UIColor *searchBarTintColor = [UIColor whiteColor]; + UIColor *separatorColor = [UIColor redColor]; + + [self presentAutocompleteControllerWithBackgroundColor:backgroundColor + selectedTableCellBackgroundColor:selectedTableCellBackgroundColor + darkBackgroundColor:darkBackgroundColor + primaryTextColor:primaryTextColor + highlightColor:highlightColor + secondaryColor:secondaryColor + tintColor:tintColor + searchBarTintColor:searchBarTintColor + separatorColor:separatorColor]; +} + +- (void)presentAutocompleteControllerWithBackgroundColor:(UIColor *)backgroundColor + selectedTableCellBackgroundColor:(UIColor *)selectedTableCellBackgroundColor + darkBackgroundColor:(UIColor *)darkBackgroundColor + primaryTextColor:(UIColor *)primaryTextColor + highlightColor:(UIColor *)highlightColor + secondaryColor:(UIColor *)secondaryColor + tintColor:(UIColor *)tintColor + searchBarTintColor:(UIColor *)searchBarTintColor + separatorColor:(UIColor *)separatorColor { + // Use UIAppearance proxies to change the appearance of UI controls in + // GMSAutocompleteViewController. Here we use appearanceWhenContainedInInstancesOfClasses to + // localise changes to just this part of the Demo app. This will generally not be necessary in a + // real application as you will probably want the same theme to apply to all elements in your app. + UIActivityIndicatorView *appearance = [UIActivityIndicatorView + appearanceWhenContainedInInstancesOfClasses:@ [[GMSStyledAutocompleteViewController class]]]; + [appearance setColor:primaryTextColor]; + + [[UINavigationBar + appearanceWhenContainedInInstancesOfClasses:@ [[GMSStyledAutocompleteViewController class]]] + setBarTintColor:darkBackgroundColor]; + [[UINavigationBar + appearanceWhenContainedInInstancesOfClasses:@ [[GMSStyledAutocompleteViewController class]]] + setTintColor:searchBarTintColor]; + + // Color of typed text in search bar. + NSDictionary *searchBarTextAttributes = @{ + NSForegroundColorAttributeName : searchBarTintColor, + NSFontAttributeName : [UIFont systemFontOfSize:[UIFont systemFontSize]] + }; + [[UITextField + appearanceWhenContainedInInstancesOfClasses:@ [[GMSStyledAutocompleteViewController class]]] + setDefaultTextAttributes:searchBarTextAttributes]; + + // Color of the "Search" placeholder text in search bar. For this example, we'll make it the same + // as the bar tint color but with added transparency. + CGFloat increasedAlpha = CGColorGetAlpha(searchBarTintColor.CGColor) * 0.75f; + UIColor *placeHolderColor = [searchBarTintColor colorWithAlphaComponent:increasedAlpha]; + + NSDictionary *placeholderAttributes = @{ + NSForegroundColorAttributeName : placeHolderColor, + NSFontAttributeName : [UIFont systemFontOfSize:[UIFont systemFontSize]] + }; + NSAttributedString *attributedPlaceholder = + [[NSAttributedString alloc] initWithString:@"Search" attributes:placeholderAttributes]; + + [[UITextField + appearanceWhenContainedInInstancesOfClasses:@ [[GMSStyledAutocompleteViewController class]]] + setAttributedPlaceholder:attributedPlaceholder]; + + // Change the background color of selected table cells. + UIView *selectedBackgroundView = [[UIView alloc] init]; + selectedBackgroundView.backgroundColor = selectedTableCellBackgroundColor; + id tableCellAppearance = [UITableViewCell + appearanceWhenContainedInInstancesOfClasses:@ [[GMSStyledAutocompleteViewController class]]]; + [tableCellAppearance setSelectedBackgroundView:selectedBackgroundView]; + + // Depending on the navigation bar background color, it might also be necessary to customise the + // icons displayed in the search bar to something other than the default. The + // setupSearchBarCustomIcons method contains example code to do this. + + GMSAutocompleteViewController *acController = [[GMSStyledAutocompleteViewController alloc] init]; + acController.delegate = self; + acController.autocompleteFilter = self.autocompleteFilter; + acController.placeFields = self.placeFields; + acController.tableCellBackgroundColor = backgroundColor; + acController.tableCellSeparatorColor = separatorColor; + acController.primaryTextColor = primaryTextColor; + acController.primaryTextHighlightColor = highlightColor; + acController.secondaryTextColor = secondaryColor; + acController.tintColor = tintColor; + + [self presentViewController:acController animated:YES completion:nil]; + // Hide theme buttons. + for (UIButton *button in _themeButtons) { + [button setHidden:YES]; + } +} + +/* + * This method shows how to replace the "search" and "clear text" icons in the search bar with + * custom icons in the case where the default gray icons don't match a custom background. + */ +- (void)setupSearchBarCustomIcons { + id searchBarAppearanceProxy = [UISearchBar + appearanceWhenContainedInInstancesOfClasses:@ [[GMSStyledAutocompleteViewController class]]]; + [searchBarAppearanceProxy setImage:[UIImage imageNamed:@"custom_clear_x_high"] + forSearchBarIcon:UISearchBarIconClear + state:UIControlStateHighlighted]; + [searchBarAppearanceProxy setImage:[UIImage imageNamed:@"custom_clear_x"] + forSearchBarIcon:UISearchBarIconClear + state:UIControlStateNormal]; + [searchBarAppearanceProxy setImage:[UIImage imageNamed:@"custom_search"] + forSearchBarIcon:UISearchBarIconSearch + state:UIControlStateNormal]; +} + +#pragma mark - GMSAutocompleteViewControllerDelegate + +- (void)viewController:(GMSAutocompleteViewController *)viewController + didAutocompleteWithPlace:(GMSPlace *)place { + [self dismissViewControllerAnimated:YES completion:nil]; + [self autocompleteDidSelectPlace:place]; +} + +- (void)viewController:(GMSAutocompleteViewController *)viewController + didFailAutocompleteWithError:(NSError *)error { + [self dismissViewControllerAnimated:YES completion:nil]; + [self autocompleteDidFail:error]; +} + +- (void)wasCancelled:(GMSAutocompleteViewController *)viewController { + [self dismissViewControllerAnimated:YES completion:nil]; + [self autocompleteDidCancel]; +} + +- (void)didRequestAutocompletePredictions:(GMSAutocompleteViewController *)viewController { + [UIApplication sharedApplication].networkActivityIndicatorVisible = YES; +} + +- (void)didUpdateAutocompletePredictions:(GMSAutocompleteViewController *)viewController { + [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; +} + +@end diff --git a/Pods/GooglePlaces/Example/GooglePlacesDemos/Samples/Autocomplete/AutocompleteWithSearchViewController.h b/Pods/GooglePlaces/Example/GooglePlacesDemos/Samples/Autocomplete/AutocompleteWithSearchViewController.h new file mode 100755 index 0000000..5b0a4ca --- /dev/null +++ b/Pods/GooglePlaces/Example/GooglePlacesDemos/Samples/Autocomplete/AutocompleteWithSearchViewController.h @@ -0,0 +1,23 @@ +/* + * Copyright 2016 Google Inc. All rights reserved. + * + * + * 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. + */ + +#import "GooglePlacesDemos/Samples/Autocomplete/AutocompleteBaseViewController.h" + +/** + * Demo showing the use of GMSAutocompleteViewController with a UISearchController. + */ +@interface AutocompleteWithSearchViewController : AutocompleteBaseViewController + +@end diff --git a/Pods/GooglePlaces/Example/GooglePlacesDemos/Samples/Autocomplete/AutocompleteWithSearchViewController.m b/Pods/GooglePlaces/Example/GooglePlacesDemos/Samples/Autocomplete/AutocompleteWithSearchViewController.m new file mode 100755 index 0000000..5ea5783 --- /dev/null +++ b/Pods/GooglePlaces/Example/GooglePlacesDemos/Samples/Autocomplete/AutocompleteWithSearchViewController.m @@ -0,0 +1,114 @@ +/* + * Copyright 2016 Google Inc. All rights reserved. + * + * + * 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. + */ + +#import "GooglePlacesDemos/Samples/Autocomplete/AutocompleteWithSearchViewController.h" + +#import + +NSString *const kSearchBarAccessibilityIdentifier = @"searchBarAccessibilityIdentifier"; + +@interface AutocompleteWithSearchViewController () +@end + +@implementation AutocompleteWithSearchViewController { + UISearchController *_searchController; + GMSAutocompleteResultsViewController *_acViewController; +} + ++ (NSString *)demoTitle { + return NSLocalizedString( + @"Demo.Title.Autocomplete.UISearchController", + @"Title of the UISearchController autocomplete demo for display in a list or nav header"); +} + +#pragma mark - View Lifecycle + +- (void)viewDidLoad { + [super viewDidLoad]; + + _acViewController = [[GMSAutocompleteResultsViewController alloc] init]; + _acViewController.autocompleteFilter = self.autocompleteFilter; + _acViewController.placeFields = self.placeFields; + _acViewController.delegate = self; + + _searchController = + [[UISearchController alloc] initWithSearchResultsController:_acViewController]; + _searchController.hidesNavigationBarDuringPresentation = NO; + _searchController.dimsBackgroundDuringPresentation = YES; + + _searchController.searchBar.autoresizingMask = UIViewAutoresizingFlexibleWidth; + _searchController.searchBar.searchBarStyle = UISearchBarStyleMinimal; + _searchController.searchBar.delegate = self; + _searchController.searchBar.accessibilityIdentifier = kSearchBarAccessibilityIdentifier; + + [_searchController.searchBar sizeToFit]; + self.navigationItem.titleView = _searchController.searchBar; + self.definesPresentationContext = YES; + + // Work around a UISearchController bug that doesn't reposition the table view correctly when + // rotating to landscape. + self.edgesForExtendedLayout = UIRectEdgeAll; + self.extendedLayoutIncludesOpaqueBars = YES; + + _searchController.searchResultsUpdater = _acViewController; + if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { + _searchController.modalPresentationStyle = UIModalPresentationPopover; + } else { + _searchController.modalPresentationStyle = UIModalPresentationFullScreen; + } +} + +#pragma mark - UISearcBarDelegate + +- (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar { + // Inform user that the autocomplete query has been cancelled and dismiss the search bar. + [_searchController setActive:NO]; + [_searchController.searchBar setHidden:YES]; + [self autocompleteDidCancel]; +} + +#pragma mark - GMSAutocompleteResultsViewControllerDelegate + +- (void)resultsController:(GMSAutocompleteResultsViewController *)resultsController + didAutocompleteWithPlace:(GMSPlace *)place { + // Display the results and dismiss the search controller. + [_searchController setActive:NO]; + [self autocompleteDidSelectPlace:place]; +} + +- (void)resultsController:(GMSAutocompleteResultsViewController *)resultsController + didFailAutocompleteWithError:(NSError *)error { + // Display the error and dismiss the search controller. + [_searchController setActive:NO]; + [self autocompleteDidFail:error]; +} + +// Show and hide the network activity indicator when we start/stop loading results. + +- (void)didRequestAutocompletePredictionsForResultsController: + (GMSAutocompleteResultsViewController *)resultsController { + [UIApplication sharedApplication].networkActivityIndicatorVisible = YES; + + // Reset the text and photos view when we are requesting for predictions. + [self resetViews]; +} + +- (void)didUpdateAutocompletePredictionsForResultsController: + (GMSAutocompleteResultsViewController *)resultsController { + [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; +} + +@end diff --git a/Pods/GooglePlaces/Example/GooglePlacesDemos/Samples/Autocomplete/AutocompleteWithTextFieldController.h b/Pods/GooglePlaces/Example/GooglePlacesDemos/Samples/Autocomplete/AutocompleteWithTextFieldController.h new file mode 100755 index 0000000..057fca2 --- /dev/null +++ b/Pods/GooglePlaces/Example/GooglePlacesDemos/Samples/Autocomplete/AutocompleteWithTextFieldController.h @@ -0,0 +1,24 @@ +/* + * Copyright 2016 Google Inc. All rights reserved. + * + * + * 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. + */ + +#import "GooglePlacesDemos/Samples/Autocomplete/AutocompleteBaseViewController.h" + +/* + * This demo shows how to manually present a UITableViewController and supply it with autocomplete + * text from an arbitrary source, in this case a UITextField. + */ +@interface AutocompleteWithTextFieldController : AutocompleteBaseViewController + +@end diff --git a/Pods/GooglePlaces/Example/GooglePlacesDemos/Samples/Autocomplete/AutocompleteWithTextFieldController.m b/Pods/GooglePlaces/Example/GooglePlacesDemos/Samples/Autocomplete/AutocompleteWithTextFieldController.m new file mode 100755 index 0000000..b48ef9d --- /dev/null +++ b/Pods/GooglePlaces/Example/GooglePlacesDemos/Samples/Autocomplete/AutocompleteWithTextFieldController.m @@ -0,0 +1,194 @@ +/* + * Copyright 2016 Google Inc. All rights reserved. + * + * + * 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. + */ + +#import "GooglePlacesDemos/Samples/Autocomplete/AutocompleteWithTextFieldController.h" + +#import + +@interface AutocompleteWithTextFieldController () +@end + +@implementation AutocompleteWithTextFieldController { + UITextField *_searchField; + UITableViewController *_resultsController; + GMSAutocompleteTableDataSource *_tableDataSource; +} + ++ (NSString *)demoTitle { + return NSLocalizedString( + @"Demo.Title.Autocomplete.UITextField", + @"Title of the UITextField autocomplete demo for display in a list or nav header"); +} + +#pragma mark - View Lifecycle + +- (void)viewDidLoad { + [super viewDidLoad]; + self.view.backgroundColor = [UIColor whiteColor]; + + // Configure the text field to our linking. + _searchField = [[UITextField alloc] initWithFrame:CGRectZero]; + _searchField.translatesAutoresizingMaskIntoConstraints = NO; + _searchField.borderStyle = UITextBorderStyleNone; + _searchField.backgroundColor = [UIColor whiteColor]; + _searchField.placeholder = NSLocalizedString(@"Demo.Content.Autocomplete.EnterTextPrompt", + @"Prompt to enter text for autocomplete demo"); + _searchField.autocorrectionType = UITextAutocorrectionTypeNo; + _searchField.keyboardType = UIKeyboardTypeDefault; + _searchField.returnKeyType = UIReturnKeyDone; + _searchField.clearButtonMode = UITextFieldViewModeWhileEditing; + _searchField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter; + + [_searchField addTarget:self + action:@selector(textFieldDidChange:) + forControlEvents:UIControlEventEditingChanged]; + _searchField.delegate = self; + + // Setup the results view controller. + _tableDataSource = [[GMSAutocompleteTableDataSource alloc] init]; + _tableDataSource.delegate = self; + _tableDataSource.autocompleteFilter = self.autocompleteFilter; + _tableDataSource.placeFields = self.placeFields; + _tableDataSource.tableCellBackgroundColor = [UIColor whiteColor]; + _resultsController = [[UITableViewController alloc] initWithStyle:UITableViewStylePlain]; + _resultsController.tableView.delegate = _tableDataSource; + _resultsController.tableView.dataSource = _tableDataSource; + + [self.view addSubview:_searchField]; + // Use auto layout to place the text field, as we need to take the top layout guide into + // consideration. + [self.view + addConstraints:[NSLayoutConstraint + constraintsWithVisualFormat:@"H:|-[_searchField]-|" + options:0 + metrics:nil + views:NSDictionaryOfVariableBindings(_searchField)]]; + [NSLayoutConstraint constraintWithItem:_searchField + attribute:NSLayoutAttributeTop + relatedBy:NSLayoutRelationEqual + toItem:self.topLayoutGuide + attribute:NSLayoutAttributeBottom + multiplier:1 + constant:8] + .active = YES; +} + +#pragma mark - GMSAutocompleteTableDataSourceDelegate + +- (void)tableDataSource:(GMSAutocompleteTableDataSource *)tableDataSource + didAutocompleteWithPlace:(GMSPlace *)place { + [self dismissResultsController]; + [_searchField resignFirstResponder]; + [_searchField setHidden:YES]; + [self autocompleteDidSelectPlace:place]; +} + +- (void)tableDataSource:(GMSAutocompleteTableDataSource *)tableDataSource + didFailAutocompleteWithError:(NSError *)error { + [self dismissResultsController]; + [_searchField resignFirstResponder]; + [self autocompleteDidFail:error]; + _searchField.text = @""; +} + +- (void)didRequestAutocompletePredictionsForTableDataSource: + (GMSAutocompleteTableDataSource *)tableDataSource { + [UIApplication sharedApplication].networkActivityIndicatorVisible = YES; + [_resultsController.tableView reloadData]; +} + +- (void)didUpdateAutocompletePredictionsForTableDataSource: + (GMSAutocompleteTableDataSource *)tableDataSource { + [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; + [_resultsController.tableView reloadData]; +} + +#pragma mark - UITextFieldDelegate + +- (void)textFieldDidBeginEditing:(UITextField *)textField { + [self addChildViewController:_resultsController]; + + // Add the results controller. + _resultsController.view.translatesAutoresizingMaskIntoConstraints = NO; + _resultsController.view.alpha = 0.0f; + [self.view addSubview:_resultsController.view]; + + // Layout it out below the text field using auto layout. + [self.view addConstraints:[NSLayoutConstraint + constraintsWithVisualFormat:@"V:[_searchField]-[resultView]-(0)-|" + options:0 + metrics:nil + views:@{ + @"_searchField" : _searchField, + @"resultView" : _resultsController.view + }]]; + [self.view addConstraints:[NSLayoutConstraint + constraintsWithVisualFormat:@"H:|-(0)-[resultView]-(0)-|" + options:0 + metrics:nil + views:@{ + @"resultView" : _resultsController.view + }]]; + + // Force a layout pass otherwise the table will animate in weirdly. + [self.view layoutIfNeeded]; + + // Reload the data. + [_resultsController.tableView reloadData]; + + // Animate in the results. + [UIView animateWithDuration:0.5 + animations:^{ + _resultsController.view.alpha = 1.0f; + } + completion:^(BOOL finished) { + [_resultsController didMoveToParentViewController:self]; + }]; +} + +- (BOOL)textFieldShouldReturn:(UITextField *)textField { + [textField resignFirstResponder]; + return NO; +} + +- (BOOL)textFieldShouldClear:(UITextField *)textField { + [self dismissResultsController]; + [textField resignFirstResponder]; + textField.text = @""; + [_tableDataSource clearResults]; + return NO; +} + +#pragma mark - Private Methods + +- (void)textFieldDidChange:(UITextField *)textField { + [_tableDataSource sourceTextHasChanged:textField.text]; +} + +- (void)dismissResultsController { + // Dismiss the results. + [_resultsController willMoveToParentViewController:nil]; + [UIView animateWithDuration:0.5 + animations:^{ + _resultsController.view.alpha = 0.0f; + } + completion:^(BOOL finished) { + [_resultsController.view removeFromSuperview]; + [_resultsController removeFromParentViewController]; + }]; +} + +@end diff --git a/Pods/GooglePlaces/Example/GooglePlacesDemos/Samples/FindPlaceLikelihoodListViewController.h b/Pods/GooglePlaces/Example/GooglePlacesDemos/Samples/FindPlaceLikelihoodListViewController.h new file mode 100755 index 0000000..e5e26ba --- /dev/null +++ b/Pods/GooglePlaces/Example/GooglePlacesDemos/Samples/FindPlaceLikelihoodListViewController.h @@ -0,0 +1,25 @@ +/* + * Copyright 2019 Google Inc. All rights reserved. + * + * + * 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. + */ + +#import +#import + +/** + * Demo that exposes the findPlaceLikelihoodsForLocation API. + */ +@interface FindPlaceLikelihoodListViewController + : UIViewController + +@end diff --git a/Pods/GooglePlaces/Example/GooglePlacesDemos/Samples/FindPlaceLikelihoodListViewController.m b/Pods/GooglePlaces/Example/GooglePlacesDemos/Samples/FindPlaceLikelihoodListViewController.m new file mode 100755 index 0000000..e7ea5c7 --- /dev/null +++ b/Pods/GooglePlaces/Example/GooglePlacesDemos/Samples/FindPlaceLikelihoodListViewController.m @@ -0,0 +1,274 @@ +/* + * Copyright 2019 Google Inc. All rights reserved. + * + * + * 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. + */ + +#import "GooglePlacesDemos/Samples/FindPlaceLikelihoodListViewController.h" + +#import + + +static NSString *const kCellIdentifier = @"LikelihoodCellIdentifier"; + +#pragma mark - ButtonCoordinateView + +@interface ButtonCoordinateView : UIView + +// The button used to trigger the fetch likelihoods from coordinate action. +@property(nonatomic, strong) UIButton *button; + +@end + +@implementation ButtonCoordinateView { +} + +- (instancetype)init { + if (self = [super init]) { + [self setupUI]; + } + return self; +} + +- (void)setupUI { + self.layer.cornerRadius = 3; + self.layer.masksToBounds = YES; + self.layer.borderColor = [UIColor clearColor].CGColor; + self.layer.borderWidth = 1; + + UIStackView *stackView = [[UIStackView alloc] init]; + stackView.axis = UILayoutConstraintAxisHorizontal; + stackView.spacing = 15; + stackView.layoutMargins = UIEdgeInsetsMake(5, 0, 5, 0); + stackView.layoutMarginsRelativeArrangement = YES; + [self addSubview:stackView]; + + UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem]; + [button setTitle:@"Retrieve location" forState:UIControlStateNormal]; + [stackView addArrangedSubview:button]; + _button = button; + + UIStackView *labelsStackView = [[UIStackView alloc] init]; + labelsStackView.axis = UILayoutConstraintAxisVertical; + [stackView addArrangedSubview:labelsStackView]; + + [stackView setTranslatesAutoresizingMaskIntoConstraints:NO]; + [NSLayoutConstraint activateConstraints:@[ + [stackView.leadingAnchor constraintEqualToAnchor:self.leadingAnchor], + [stackView.trailingAnchor constraintEqualToAnchor:self.trailingAnchor], + [stackView.topAnchor constraintEqualToAnchor:self.topAnchor], + [stackView.bottomAnchor constraintEqualToAnchor:self.bottomAnchor] + ]]; +} + +// Sets the title and target for the button. +- (void)fillWithButtonTitle:(NSString *)title + target:(id)target + action:(SEL)action + forControlEvents:(UIControlEvents)controlEvents { + [_button setTitle:title forState:UIControlStateNormal]; + [_button addTarget:target action:action forControlEvents:controlEvents]; +} + + +@end + +#pragma mark - FindPlaceLikelihoodListViewController + +@interface FindPlaceLikelihoodListViewController () + +@property(nonatomic, strong) UITableView *tableView; +@property(nonatomic, strong) NSArray *placeLikelihoods; +@property(nonatomic, strong) UILabel *errorLabel; +@property(nonatomic, strong) ButtonCoordinateView *currentButtonCoordinateView; + +@end + +@implementation FindPlaceLikelihoodListViewController { + CLLocationManager *_locationManager; + GMSPlacesClient *_placesClient; +} + ++ (NSString *)demoTitle { + return @"Find Place Likelihoods"; +} + +- (void)viewDidLoad { + [super viewDidLoad]; + + _placesClient = [GMSPlacesClient sharedClient]; + + // Initializes the location manager to be used for current location. + CLLocationManager *locationManager = [[CLLocationManager alloc] init]; + locationManager.delegate = self; + _locationManager = locationManager; + + self.title = [NSString stringWithFormat:@"Find place likelihoods from location"]; + self.view.backgroundColor = [UIColor whiteColor]; + + UIStackView *mainStackView = [[UIStackView alloc] init]; + mainStackView.axis = UILayoutConstraintAxisVertical; + [self.view addSubview:mainStackView]; + + // Adds the location input section. + UIStackView *locationInputStackView = [[UIStackView alloc] initWithFrame:CGRectZero]; + locationInputStackView.axis = UILayoutConstraintAxisVertical; + locationInputStackView.layoutMargins = UIEdgeInsetsMake(20, 15, 0, 15); + locationInputStackView.layoutMarginsRelativeArrangement = YES; + locationInputStackView.distribution = UIStackViewDistributionFill; + locationInputStackView.alignment = UIStackViewAlignmentFill; + locationInputStackView.spacing = 10; + [mainStackView addArrangedSubview:locationInputStackView]; + + ButtonCoordinateView *currentView = [[ButtonCoordinateView alloc] init]; + [currentView fillWithButtonTitle:@"Find from current location" + target:self + action:@selector(onCurrentLocationTap) + forControlEvents:UIControlEventTouchUpInside]; + [locationInputStackView addArrangedSubview:currentView]; + _currentButtonCoordinateView = currentView; + + + UILabel *errorLabel = [[UILabel alloc] init]; + errorLabel.textColor = [UIColor redColor]; + errorLabel.numberOfLines = 0; + [locationInputStackView addArrangedSubview:errorLabel]; + _errorLabel = errorLabel; + + // Adds the likelihood list table. + UITableView *tableView = [[UITableView alloc] init]; + [tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:kCellIdentifier]; + tableView.delegate = self; + tableView.dataSource = self; + [mainStackView addArrangedSubview:tableView]; + _tableView = tableView; + + mainStackView.translatesAutoresizingMaskIntoConstraints = NO; + NSArray *stackViewConstraints = @[ + [mainStackView.leadingAnchor constraintEqualToAnchor:self.view.leadingAnchor], + [mainStackView.trailingAnchor constraintEqualToAnchor:self.view.trailingAnchor], + [mainStackView.topAnchor constraintEqualToAnchor:self.topLayoutGuide.bottomAnchor], + [mainStackView.bottomAnchor constraintEqualToAnchor:self.bottomLayoutGuide.topAnchor] + ]; +#if defined(__IPHONE_11_0) && (__IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_11_0) + if (@available(iOS 11.0, *)) { + stackViewConstraints = @[ + [mainStackView.leadingAnchor + constraintEqualToAnchor:self.view.safeAreaLayoutGuide.leadingAnchor], + [mainStackView.trailingAnchor + constraintEqualToAnchor:self.view.safeAreaLayoutGuide.trailingAnchor], + [mainStackView.topAnchor constraintEqualToAnchor:self.view.safeAreaLayoutGuide.topAnchor], + [mainStackView.bottomAnchor + constraintEqualToAnchor:self.view.safeAreaLayoutGuide.bottomAnchor] + ]; + } +#endif + [NSLayoutConstraint activateConstraints:stackViewConstraints]; + + [self onCurrentLocationTap]; +} + +#pragma mark - Button Handlers + +// Requests location services authorization if needed, and starts updating location. +- (void)onCurrentLocationTap { + if (![FindPlaceLikelihoodListViewController areLocationServicesEnabledAndAuthorized]) { + [_locationManager requestWhenInUseAuthorization]; + + return; + } + + [_locationManager startUpdatingLocation]; + + __block FindPlaceLikelihoodListViewController *weakSelf = self; + GMSPlaceLikelihoodsCallback fetcherCallback = + ^(NSArray *_Nullable likelihoods, NSError *_Nullable error) { + [weakSelf handleFindPlaceLikelihoodsResponse:likelihoods error:error]; + }; + + [_placesClient findPlaceLikelihoodsFromCurrentLocationWithPlaceFields:GMSPlaceFieldAll + callback:fetcherCallback]; +} + + +#pragma mark - CLLocationManagerDelegate + +// Retries retrieving current location if user has granted location services permission. +- (void)locationManager:(CLLocationManager *)manager + didChangeAuthorizationStatus:(CLAuthorizationStatus)status { + if (status == kCLAuthorizationStatusAuthorizedWhenInUse) { + // Retry current location fetch once user enables Location Services. + [self onCurrentLocationTap]; + } else { + _errorLabel.text = @"Please make sure location services are enabled."; + } +} + + +#pragma mark - UITableViewDataSource/Delegate + +- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { + if (_placeLikelihoods == nil) { + return 0; + } + return _placeLikelihoods.count; +} + +- (UITableViewCell *)tableView:(UITableView *)tableView + cellForRowAtIndexPath:(NSIndexPath *)indexPath { + UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:kCellIdentifier + forIndexPath:indexPath]; + cell.textLabel.numberOfLines = 0; + cell.selectionStyle = UITableViewCellSelectionStyleNone; + NSInteger row = indexPath.row; + NSInteger likelihoodCount = _placeLikelihoods.count; + if (likelihoodCount > 0 && row < likelihoodCount) { + GMSPlaceLikelihood *likelihood = _placeLikelihoods[row]; + cell.textLabel.text = likelihood.place.name; + } + + return cell; +} + +#pragma mark - Helpers + +// Checks if user has authorized location services required for retrieving device location. ++ (BOOL)areLocationServicesEnabledAndAuthorized { + if (![CLLocationManager locationServicesEnabled]) { + return NO; + } + + CLAuthorizationStatus status = [CLLocationManager authorizationStatus]; + return status == kCLAuthorizationStatusAuthorizedAlways || + status == kCLAuthorizationStatusAuthorizedWhenInUse; +} + +- (void)handleFindPlaceLikelihoodsResponse:(NSArray *)likelihoods + error:(NSError *)error { + if (error != nil) { + _errorLabel.text = @"There was an error fetching likelihoods."; + return; + } + + // Filters out Places that don't have a valid name. + NSPredicate *predicate = [NSPredicate + predicateWithBlock:^BOOL(GMSPlaceLikelihood *likelihood, NSDictionary *b) { + return likelihood.place.name != nil && [likelihood.place.name length] > 0; + }]; + _placeLikelihoods = [likelihoods filteredArrayUsingPredicate:predicate]; + _errorLabel.text = nil; + [_tableView reloadData]; + [self resignFirstResponder]; +} + + +@end diff --git a/Pods/GooglePlaces/Example/GooglePlacesDemos/Samples/PagingPhotoView.h b/Pods/GooglePlaces/Example/GooglePlacesDemos/Samples/PagingPhotoView.h new file mode 100755 index 0000000..0a52ba7 --- /dev/null +++ b/Pods/GooglePlaces/Example/GooglePlacesDemos/Samples/PagingPhotoView.h @@ -0,0 +1,40 @@ +/* + * Copyright 2016 Google Inc. All rights reserved. + * + * + * 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. + */ + +#import + +/** + * Represents a place photo, along with the attributions which are required to be displayed along + * with it. + */ +@interface AttributedPhoto : NSObject + +@property(nonatomic, strong) UIImage *image; + +@property(nonatomic, strong) NSAttributedString *attributions; + +@end + +/* + * A horizontally-paging scroll view that displays a list of photo images and their attributions. + */ +@interface PagingPhotoView : UIScrollView + +/** + * An array of |AttributedPhoto| objects representing the photos to display. + */ +@property(nonatomic, copy) NSArray *photoList; + +@end diff --git a/Pods/GooglePlaces/Example/GooglePlacesDemos/Samples/PagingPhotoView.m b/Pods/GooglePlaces/Example/GooglePlacesDemos/Samples/PagingPhotoView.m new file mode 100755 index 0000000..b19c3fa --- /dev/null +++ b/Pods/GooglePlaces/Example/GooglePlacesDemos/Samples/PagingPhotoView.m @@ -0,0 +1,180 @@ +/* + * Copyright 2016 Google Inc. All rights reserved. + * + * + * 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. + */ + +#import "GooglePlacesDemos/Samples/PagingPhotoView.h" + +/** + * Class to store the image and text views that display the image and attributions. + */ +@interface ImageViewAndAttribution : NSObject + +@property(nonatomic, strong) UIImageView *imageView; + +@property(nonatomic, strong) UITextView *attributionView; + +@end + +@implementation ImageViewAndAttribution +@end + +@implementation AttributedPhoto +@end + +@interface PagingPhotoView () +@end + +@implementation PagingPhotoView { + // An array of |ImageViewAndAttribution| objects representing the actual views that are + // being displayed. + NSMutableArray *_photoImageViews; + // Whether we should update the image and attribution view frames on the next |layoutSubviews| + // call. This should be set to YES whenever the frame is updated or the photos change. + BOOL _imageLayoutUpdateNeeded; +} + +- (instancetype)initWithFrame:(CGRect)frame { + if ((self = [super initWithFrame:frame])) { + _photoImageViews = [NSMutableArray array]; + self.backgroundColor = [UIColor whiteColor]; + self.pagingEnabled = YES; + } + return self; +} + +- (void)setPhotoList:(NSArray *)photoList { + // First, remove all of the existing image and attribution subviews. + for (ImageViewAndAttribution *photoView in _photoImageViews) { + [photoView.imageView removeFromSuperview]; + [photoView.attributionView removeFromSuperview]; + } + [_photoImageViews removeAllObjects]; + + // Add the new images and attributions as subviews. + _photoList = [photoList copy]; + for (AttributedPhoto *photo in photoList) { + UITextView *textView = [[UITextView alloc] initWithFrame:CGRectZero]; + textView.delegate = self; + textView.editable = NO; + textView.attributedText = photo.attributions; + [self addSubview:textView]; + + UIImageView *imageView = [[UIImageView alloc] initWithImage:photo.image]; + imageView.contentMode = UIViewContentModeScaleAspectFit; + imageView.clipsToBounds = YES; + [self addSubview:imageView]; + + ImageViewAndAttribution *attributedView = [[ImageViewAndAttribution alloc] init]; + attributedView.imageView = imageView; + attributedView.attributionView = textView; + [_photoImageViews addObject:attributedView]; + } + [self updateContentSize]; + _imageLayoutUpdateNeeded = YES; +} + +- (void)setFrame:(CGRect)frame { + _imageLayoutUpdateNeeded = YES; + + // We want to make sure that we are still scrolled to the same photo when the frame changes. + // Measure the current content offset and scroll to the same fraction along the content after the + // frame change. + CGFloat scrollOffsetFraction = 0; + if (self.contentSize.width != 0) { + scrollOffsetFraction = self.contentOffset.x / self.contentSize.width; + } + [super setFrame:frame]; + [UIView performWithoutAnimation:^{ + [self updateContentSize]; + self.contentOffset = + CGPointMake(scrollOffsetFraction * self.contentSize.width, -self.contentInset.top); + }]; +} + +- (void)layoutSubviews { + [super layoutSubviews]; + if (_imageLayoutUpdateNeeded) { + [self layoutImages]; + _imageLayoutUpdateNeeded = NO; + + // Re-adjust the content offset to ensure the photos are aligned properly horizontally. + if (self.contentSize.width != 0) { + CGFloat scrollOffset = + (CGFloat)round((self.contentOffset.x / self.contentSize.width) * 10.0f) / 10.0f; + self.contentOffset = + CGPointMake(scrollOffset * self.contentSize.width, -self.contentInset.top); + } + } +} + +#pragma mark - UITextViewDelegate + +- (BOOL)textView:(UITextView *)textView + shouldInteractWithURL:(NSURL *)url + inRange:(NSRange)characterRange { + // Make links clickable. + return YES; +} + +#pragma mark - Helper methods + +/** + * Update the content size of the scroll view based on the number of photos and the view's width. + * This should be called whenever the frame changes or the number of photos has changed. + */ +- (void)updateContentSize { + CGRect insetBounds = UIEdgeInsetsInsetRect(self.bounds, self.contentInset); + CGFloat usableScrollViewHeight = insetBounds.size.height; + + self.contentSize = + CGSizeMake(_photoImageViews.count * self.frame.size.width, usableScrollViewHeight); +} + +/** + * Updates the frames of the images and attributions. + */ +- (void)layoutImages { + CGFloat contentWidth = 0; + CGFloat scrollViewWidth = self.bounds.size.width; + CGRect insetBounds = UIEdgeInsetsInsetRect(self.bounds, self.contentInset); + CGFloat usableScrollViewHeight = insetBounds.size.height; + + // Lay out the images one after the other horizontally. + for (ImageViewAndAttribution *attributedImageView in _photoImageViews) { + UITextView *attributionView = attributedImageView.attributionView; + UIImageView *imageView = attributedImageView.imageView; + [attributionView sizeToFit]; + CGFloat attributionHeight = attributionView.frame.size.height; + CGFloat imageHeight = usableScrollViewHeight - attributionHeight; + CGFloat safeAreaX = 0.0f; + +#if defined(__IPHONE_11_0) && (__IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_11_0) + // Take into account the safe areas of the device screen and do not use that space for the + // attribution text. + if (@available(iOS 11.0, *)) { + imageHeight -= self.safeAreaInsets.bottom; + safeAreaX = self.safeAreaInsets.left; + } +#endif + + // Put the attribution view aligned to the same left edge as the photo, in the bottom left + // corner of the screen. + attributionView.frame = CGRectMake(contentWidth + safeAreaX, imageHeight, + scrollViewWidth - (2 * safeAreaX), attributionHeight); + imageView.frame = CGRectMake(contentWidth, 0, scrollViewWidth, imageHeight); + contentWidth += imageView.frame.size.width; + } +} + +@end diff --git a/Pods/GooglePlaces/Example/GooglePlacesDemos/Support/BaseDemoViewController.h b/Pods/GooglePlaces/Example/GooglePlacesDemos/Support/BaseDemoViewController.h new file mode 100755 index 0000000..6e8759f --- /dev/null +++ b/Pods/GooglePlaces/Example/GooglePlacesDemos/Support/BaseDemoViewController.h @@ -0,0 +1,31 @@ +/* + * Copyright 2016 Google Inc. All rights reserved. + * + * + * 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. + */ + +#import + +/** + * Base view controller for all demos in the Places Demo app. Provides some basic functionality + * which is common across demos. + */ +@interface BaseDemoViewController : UIViewController + +/** + * The title of the demo. Displayed in lists and navigation bars. + * + * NOTE: This must be overridden by subclasses. + */ ++ (NSString *)demoTitle; + +@end diff --git a/Pods/GooglePlaces/Example/GooglePlacesDemos/Support/BaseDemoViewController.m b/Pods/GooglePlaces/Example/GooglePlacesDemos/Support/BaseDemoViewController.m new file mode 100755 index 0000000..9984cab --- /dev/null +++ b/Pods/GooglePlaces/Example/GooglePlacesDemos/Support/BaseDemoViewController.m @@ -0,0 +1,32 @@ +/* + * Copyright 2016 Google Inc. All rights reserved. + * + * + * 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. + */ + +#import "GooglePlacesDemos/Support/BaseDemoViewController.h" + +@implementation BaseDemoViewController + ++ (NSString *)demoTitle { + // This should be overridden by subclasses, so should not be called. + return nil; +} + +- (instancetype)initWithNibName:(NSString *)name bundle:(NSBundle *)bundle { + if ((self = [super initWithNibName:name bundle:bundle])) { + self.title = [[self class] demoTitle]; + } + return self; +} + +@end diff --git a/Pods/GooglePlaces/Example/GooglePlacesDemos/main.m b/Pods/GooglePlaces/Example/GooglePlacesDemos/main.m new file mode 100755 index 0000000..86bfe27 --- /dev/null +++ b/Pods/GooglePlaces/Example/GooglePlacesDemos/main.m @@ -0,0 +1,24 @@ +/* + * Copyright 2016 Google Inc. All rights reserved. + * + * + * 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. + */ + +#import + +#import "GooglePlacesDemos/DemoAppDelegate.h" + +int main(int argc, char* argv[]) { + @autoreleasepool { + return UIApplicationMain(argc, argv, nil, NSStringFromClass([DemoAppDelegate class])); + } +} diff --git a/Pods/GooglePlaces/Example/Podfile b/Pods/GooglePlaces/Example/Podfile new file mode 100755 index 0000000..dd81691 --- /dev/null +++ b/Pods/GooglePlaces/Example/Podfile @@ -0,0 +1,7 @@ +source 'https://github.com/CocoaPods/Specs.git' + +target 'GooglePlacesDemos' do + platform :ios, '9.0' + pod 'GooglePlaces', '= 3.8.0' + pod 'GoogleMaps', '= 3.8.0' +end diff --git a/Pods/GooglePlaces/Example/README.GooglePlacesDemos b/Pods/GooglePlaces/Example/README.GooglePlacesDemos new file mode 100755 index 0000000..ecf5fdd --- /dev/null +++ b/Pods/GooglePlaces/Example/README.GooglePlacesDemos @@ -0,0 +1,18 @@ +GooglePlacesDemos contains a demo application showcasing various features of +the Google Places API for iOS. + +Before starting, please note that these demos are directed towards a technical +audience. You'll also need Xcode 9.0 or later, with the iOS SDK 9.3 or later. + +If you're new to the API, please read the Introduction section of the Google +Places API for iOS documentation- + https://developers.google.com/places/ios-api/ + +Once you've read the Introduction page, follow the first couple of steps on the +"Getting Started" page. Specifically; + + * Obtain an API key for the demo application, and specify the bundle ID of + this demo application as an an 'allowed iOS app'. By default, the bundle ID + is "com.example.GooglePlacesDemos". + + * Open the project in Xcode, and update `SDKDemoAPIKey.h` with this key. diff --git a/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/GooglePlaces b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/GooglePlaces new file mode 100755 index 0000000..08c55eb Binary files /dev/null and b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/GooglePlaces differ diff --git a/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSAddressComponent.h b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSAddressComponent.h new file mode 100755 index 0000000..21a1387 --- /dev/null +++ b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSAddressComponent.h @@ -0,0 +1,43 @@ +// +// GMSAddressComponent.h +// Google Places SDK for iOS +// +// Copyright 2016 Google Inc. +// +// Usage of this SDK is subject to the Google Maps/Google Earth APIs Terms of +// Service: https://developers.google.com/maps/terms +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** + * Represents a component of an address, e.g., street number, postcode, city, etc. + */ +@interface GMSAddressComponent : NSObject + +/** + * Type of the address component. For a list of supported types, see + * https://developers.google.com/places/ios-sdk/supported_types#table2. This string will be one + * of the constants defined in GMSPlaceTypes.h. + */ +@property(nonatomic, readonly, copy) + NSString *type __deprecated_msg("type property is deprecated in favor of types)"); + +/** + * Types associated with the address component. For a list of supported types, see + * https://developers.google.com/places/ios-sdk/supported_types#table2. This array will contain + * one or more of the constants strings defined in GMSPlaceTypes.h. + */ +@property(nonatomic, readonly, strong) NSArray *types; + +/** Name of the address component, e.g. "Sydney" */ +@property(nonatomic, readonly, copy) NSString *name; + +/** Short name of the address component, e.g. "AU" */ +@property(nonatomic, readonly, copy) NSString *_Nullable shortName; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSAutocompleteBoundsMode.h b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSAutocompleteBoundsMode.h new file mode 100755 index 0000000..99c48c0 --- /dev/null +++ b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSAutocompleteBoundsMode.h @@ -0,0 +1,32 @@ +// +// GMSAutocompleteBoundsMode.h +// Google Places SDK for iOS +// +// Copyright 2017 Google Inc. +// +// Usage of this SDK is subject to the Google Maps/Google Earth APIs Terms of +// Service: https://developers.google.com/maps/terms +// + +/** + * \defgroup AutocompleteBoundsMode GMSAutocompleteBoundsMode + * @{ + */ + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** + * Specifies how autocomplete should interpret the |bounds| parameters. + */ +typedef NS_ENUM(NSUInteger, GMSAutocompleteBoundsMode) { + /** Interpret |bounds| as a bias. */ + kGMSAutocompleteBoundsModeBias, + /** Interpret |bounds| as a restrict. */ + kGMSAutocompleteBoundsModeRestrict +}; + +NS_ASSUME_NONNULL_END + +/**@}*/ diff --git a/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSAutocompleteFetcher.h b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSAutocompleteFetcher.h new file mode 100755 index 0000000..140ef57 --- /dev/null +++ b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSAutocompleteFetcher.h @@ -0,0 +1,103 @@ +// +// GMSAutocompleteFetcher.h +// Google Places SDK for iOS +// +// Copyright 2016 Google Inc. +// +// Usage of this SDK is subject to the Google Maps/Google Earth APIs Terms of +// Service: https://developers.google.com/maps/terms +// + +#import "GMSAutocompleteBoundsMode.h" +#import "GMSAutocompleteFilter.h" + +@class GMSAutocompletePrediction; +@class GMSAutocompleteSessionToken; +@class GMSCoordinateBounds; + +NS_ASSUME_NONNULL_BEGIN + +/** + * Protocol for objects that can receive callbacks from GMSAutocompleteFetcher + */ +@protocol GMSAutocompleteFetcherDelegate + +@required + +/** + * Called when autocomplete predictions are available. + * @param predictions an array of GMSAutocompletePrediction objects. + */ +- (void)didAutocompleteWithPredictions:(NSArray *)predictions; + +/** + * Called when an autocomplete request returns an error. + * @param error the error that was received. + */ +- (void)didFailAutocompleteWithError:(NSError *)error; + +@end + +/** + * GMSAutocompleteFetcher is a wrapper around the lower-level autocomplete APIs that encapsulates + * some of the complexity of requesting autocomplete predictions as the user is typing. Calling + * sourceTextHasChanged will generally result in the provided delegate being called with + * autocomplete predictions for the queried text, with the following provisos: + * + * - The fetcher may not necessarily request predictions on every call of sourceTextHasChanged if + * several requests are made within a short amount of time. + * - The delegate will only be called with prediction results if those predictions are for the + * text supplied in the most recent call to sourceTextHasChanged. + */ +@interface GMSAutocompleteFetcher : NSObject + +/** + * Initialize the fetcher. + * + * @param bounds The bounds used to bias or restrict the results. Whether this biases or restricts + * is determined by the value of the |autocompleteBoundsMode| property. + * This parameter may be nil. + * @param filter The filter to apply to the results. This parameter may be nil. + */ +- (instancetype)initWithBounds:(nullable GMSCoordinateBounds *)bounds + filter:(nullable GMSAutocompleteFilter *)filter NS_DESIGNATED_INITIALIZER; + +/** Delegate to be notified with autocomplete prediction results. */ +@property(nonatomic, weak, nullable) id delegate; + +/** + * Bounds used to bias or restrict the autocomplete results depending on the value of + * |autocompleteBoundsMode| (can be nil). + */ +@property(nonatomic, strong, nullable) GMSCoordinateBounds *autocompleteBounds; + +/** + * How to treat the |autocompleteBounds| property. Defaults to |kGMSAutocompleteBoundsModeBias|. + * + * Has no effect if |autocompleteBounds| is nil. + */ +@property(nonatomic, assign) GMSAutocompleteBoundsMode autocompleteBoundsMode; + +/** Filter to apply to autocomplete suggestions (can be nil). */ +@property(nonatomic, strong, nullable) GMSAutocompleteFilter *autocompleteFilter; + +/** + * Provide a |GMSAutocompleteSessionToken| for tracking the specific autocomplete query flow. + */ +- (void)provideSessionToken:(nullable GMSAutocompleteSessionToken *)sessionToken; + +/** + * Notify the fetcher that the source text to autocomplete has changed. + * + * This method should only be called from the main thread. Calling this method from another thread + * will result in undefined behavior. Calls to |GMSAutocompleteFetcherDelegate| methods will also be + * called on the main thread. + * + * This method is non-blocking. + * @param text The partial text to autocomplete. + */ +- (void)sourceTextHasChanged:(nullable NSString *)text; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSAutocompleteFilter.h b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSAutocompleteFilter.h new file mode 100755 index 0000000..8d69b02 --- /dev/null +++ b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSAutocompleteFilter.h @@ -0,0 +1,112 @@ +// +// GMSAutocompleteFilter.h +// Google Places SDK for iOS +// +// Copyright 2016 Google Inc. +// +// Usage of this SDK is subject to the Google Maps/Google Earth APIs Terms of +// Service: https://developers.google.com/maps/terms +// + +#import +#import + +@protocol GMSPlaceLocationBias; +@protocol GMSPlaceLocationRestriction; + +NS_ASSUME_NONNULL_BEGIN + +/** + * \defgroup PlacesAutocompleteTypeFilter GMSPlacesAutocompleteTypeFilter + * @{ + */ + +/** + * The type filters that may be applied to an autocomplete request to restrict results to different + * types. + */ +typedef NS_ENUM(NSInteger, GMSPlacesAutocompleteTypeFilter) { + /** + * All results. + */ + kGMSPlacesAutocompleteTypeFilterNoFilter, + /** + * Geeocoding results, as opposed to business results. + */ + kGMSPlacesAutocompleteTypeFilterGeocode, + /** + * Geocoding results with a precise address. + */ + kGMSPlacesAutocompleteTypeFilterAddress, + /** + * Business results. + */ + kGMSPlacesAutocompleteTypeFilterEstablishment, + /** + * Results that match the following types: + * "locality", + * "sublocality" + * "postal_code", + * "country", + * "administrative_area_level_1", + * "administrative_area_level_2" + */ + kGMSPlacesAutocompleteTypeFilterRegion, + /** + * Results that match the following types: + * "locality", + * "administrative_area_level_3" + */ + kGMSPlacesAutocompleteTypeFilterCity, +}; + +/**@}*/ + +/** + * This class represents a set of restrictions that may be applied to autocomplete requests. This + * allows customization of autocomplete suggestions to only those places that are of interest. + */ +@interface GMSAutocompleteFilter : NSObject + +/** + * The type filter applied to an autocomplete request to restrict results to different types. + * Default value is kGMSPlacesAutocompleteTypeFilterNoFilter. + */ +@property(nonatomic, assign) GMSPlacesAutocompleteTypeFilter type; + +/** + * The country to restrict results to. This should be a ISO 3166-1 Alpha-2 country code (case + * insensitive). If nil, no country filtering will take place. + * + * NOTE: Ignored if the countries property is set. + */ +@property(nonatomic, copy, nullable) NSString *country; +; + +/** + * The countries to restrict results to. This should be a ISO 3166-1 Alpha-2 country code (case + * insensitive). Supports up to 5 countries to filter. If nil, no country filtering will take place. + * + * NOTE: Overrides the country property if that is set. + */ +@property(nonatomic, copy, nullable) NSArray *countries; + +/** + * The staight line distance origin location for measuring the straight line distance between the + * origin location and autocomplete predictions. + */ +@property(nonatomic, nullable) CLLocation *origin; + +/** + * The optional location bias to perfer place results near the location. + */ +@property(nonatomic, nullable) id locationBias; + +/** + * The optional location restriction to limit the place results to. + */ +@property(nonatomic, nullable) id locationRestriction; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSAutocompleteMatchFragment.h b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSAutocompleteMatchFragment.h new file mode 100755 index 0000000..fb3e5a9 --- /dev/null +++ b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSAutocompleteMatchFragment.h @@ -0,0 +1,40 @@ +// +// GMSAutocompleteMatchFragment.h +// Google Places SDK for iOS +// +// Copyright 2016 Google Inc. +// +// Usage of this SDK is subject to the Google Maps/Google Earth APIs Terms of +// Service: https://developers.google.com/maps/terms +// + + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** + * This class represents a matched fragment of a string. This is a contiguous range of characters + * in a string, suitable for highlighting in an autocompletion UI. + */ +@interface GMSAutocompleteMatchFragment : NSObject + +/** + * The offset of the matched fragment. This is an index into a string. The character at this index + * is the first matched character. + */ +@property(nonatomic, readonly) NSUInteger offset; + +/** + * The length of the matched fragment. + */ +@property(nonatomic, readonly) NSUInteger length; + +/** + * Initializer is not available. + */ +- (instancetype)init NS_UNAVAILABLE; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSAutocompletePrediction.h b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSAutocompletePrediction.h new file mode 100755 index 0000000..2a74641 --- /dev/null +++ b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSAutocompletePrediction.h @@ -0,0 +1,106 @@ +// +// GMSAutocompletePrediction.h +// Google Places SDK for iOS +// +// Copyright 2016 Google Inc. +// +// Usage of this SDK is subject to the Google Maps/Google Earth APIs Terms of +// Service: https://developers.google.com/maps/terms +// + + +#import + +NS_ASSUME_NONNULL_BEGIN + +#if defined(__IPHONE_11_0) && (__IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_11_0) +/** + * Attribute name for match fragments in |GMSAutocompletePrediction| attributedFullText. + * + * @related GMSAutocompletePrediction + */ +extern NSAttributedStringKey const kGMSAutocompleteMatchAttribute; +#else +/** + * Attribute name for match fragments in |GMSAutocompletePrediction| attributedFullText. + * + * @related GMSAutocompletePrediction + */ +extern NSString *const kGMSAutocompleteMatchAttribute; +#endif + +/** + * This class represents a prediction of a full query based on a partially typed string. + */ +@interface GMSAutocompletePrediction : NSObject + +/** + * The full description of the prediction as a NSAttributedString. E.g., "Sydney Opera House, + * Sydney, New South Wales, Australia". + * + * Every text range that matches the user input has a |kGMSAutocompleteMatchAttribute|. For + * example, you can make every match bold using enumerateAttribute: + *
+ *   UIFont *regularFont = [UIFont systemFontOfSize:[UIFont labelFontSize]];
+ *   UIFont *boldFont = [UIFont boldSystemFontOfSize:[UIFont labelFontSize]];
+ *
+ *   NSMutableAttributedString *bolded = [prediction.attributedFullText mutableCopy];
+ *   [bolded enumerateAttribute:kGMSAutocompleteMatchAttribute
+ *                      inRange:NSMakeRange(0, bolded.length)
+ *                      options:0
+ *                   usingBlock:^(id value, NSRange range, BOOL *stop) {
+ *                     UIFont *font = (value == nil) ? regularFont : boldFont;
+ *                     [bolded addAttribute:NSFontAttributeName value:font range:range];
+ *                   }];
+ *
+ *   label.attributedText = bolded;
+ * 
+ */ +@property(nonatomic, copy, readonly) NSAttributedString *attributedFullText; + +/** + * The main text of a prediction as a NSAttributedString, usually the name of the place. + * E.g. "Sydney Opera House". + * + * Text ranges that match user input are have a |kGMSAutocompleteMatchAttribute|, + * like |attributedFullText|. + */ +@property(nonatomic, copy, readonly) NSAttributedString *attributedPrimaryText; + +/** + * The secondary text of a prediction as a NSAttributedString, usually the location of the place. + * E.g. "Sydney, New South Wales, Australia". + * + * Text ranges that match user input are have a |kGMSAutocompleteMatchAttribute|, like + * |attributedFullText|. + * + * May be nil. + */ +@property(nonatomic, copy, readonly, nullable) NSAttributedString *attributedSecondaryText; + +/** + * A property representing the place ID of the prediction, suitable for use in a place details + * request. + */ +@property(nonatomic, copy, readonly) NSString *placeID; + +/** + * The types of this autocomplete result. Types are NSStrings, valid values are any types + * documented at . + */ +@property(nonatomic, copy, readonly) NSArray *types; + +/** + * The straight line distance in meters between the origin and this prediction if a valid origin is + * specified in the |GMSAutocompleteFilter| of the request. + */ +@property(nonatomic, readonly, nullable) NSNumber *distanceMeters; + +/** + * Initializer is not available. + */ +- (instancetype)init NS_UNAVAILABLE; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSAutocompleteResultsViewController.h b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSAutocompleteResultsViewController.h new file mode 100755 index 0000000..38aedd6 --- /dev/null +++ b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSAutocompleteResultsViewController.h @@ -0,0 +1,152 @@ +// +// GMSAutocompleteResultsViewController.h +// Google Places SDK for iOS +// +// Copyright 2016 Google Inc. +// +// Usage of this SDK is subject to the Google Maps/Google Earth APIs Terms of +// Service: https://developers.google.com/maps/terms +// + +#import + +#import "GMSAutocompleteBoundsMode.h" +#import "GMSAutocompleteFilter.h" +#import "GMSAutocompletePrediction.h" +#import "GMSPlace.h" +#import "GMSPlaceFieldMask.h" + +@class GMSAutocompleteResultsViewController; +@class GMSCoordinateBounds; + +NS_ASSUME_NONNULL_BEGIN + +/** + * Protocol used by |GMSAutocompleteResultsViewController|, to communicate the user's interaction + * with the controller to the application. + */ +@protocol GMSAutocompleteResultsViewControllerDelegate + +@required + +/** + * Called when a place has been selected from the available autocomplete predictions. + * @param resultsController The |GMSAutocompleteResultsViewController| that generated the event. + * @param place The |GMSPlace| that was returned. + */ +- (void)resultsController:(GMSAutocompleteResultsViewController *)resultsController + didAutocompleteWithPlace:(GMSPlace *)place; + +/** + * Called when a non-retryable error occurred when retrieving autocomplete predictions or place + * details. A non-retryable error is defined as one that is unlikely to be fixed by immediately + * retrying the operation. + *

+ * Only the following values of |GMSPlacesErrorCode| are retryable: + *

    + *
  • kGMSPlacesNetworkError + *
  • kGMSPlacesServerError + *
  • kGMSPlacesInternalError + *
+ * All other error codes are non-retryable. + * @param resultsController The |GMSAutocompleteResultsViewController| that generated the event. + * @param error The |NSError| that was returned. + */ +- (void)resultsController:(GMSAutocompleteResultsViewController *)resultsController + didFailAutocompleteWithError:(NSError *)error; + +@optional + +/** + * Called when the user selects an autocomplete prediction from the list but before requesting + * place details. Returning NO from this method will suppress the place details fetch and + * didAutocompleteWithPlace will not be called. + * @param resultsController The |GMSAutocompleteResultsViewController| that generated the event. + * @param prediction The |GMSAutocompletePrediction| that was selected. + */ +- (BOOL)resultsController:(GMSAutocompleteResultsViewController *)resultsController + didSelectPrediction:(GMSAutocompletePrediction *)prediction; + +/** + * Called once every time new autocomplete predictions are received. + * @param resultsController The |GMSAutocompleteResultsViewController| that generated the event. + */ +- (void)didUpdateAutocompletePredictionsForResultsController: + (GMSAutocompleteResultsViewController *)resultsController; + +/** + * Called once immediately after a request for autocomplete predictions is made. + * @param resultsController The |GMSAutocompleteResultsViewController| that generated the event. + */ +- (void)didRequestAutocompletePredictionsForResultsController: + (GMSAutocompleteResultsViewController *)resultsController; + +@end + +/** + * GMSAutocompleteResultsViewController provides an interface that displays place autocomplete + * predictions in a table view. The table view will be automatically updated as input text + * changes. + * + * This class is intended to be used as the search results controller of a UISearchController. Pass + * an instance of |GMSAutocompleteResultsViewController| to UISearchController's + * initWithSearchResultsController method, then set the controller as the UISearchController's + * searchResultsUpdater property. + * + * Use the |GMSAutocompleteResultsViewControllerDelegate| delegate protocol to be notified when a + * place is selected from the list. + */ +@interface GMSAutocompleteResultsViewController : UIViewController + +/** Delegate to be notified when a place is selected. */ +@property(nonatomic, weak, nullable) id delegate; + +/** + * Bounds used to bias or restrict the autocomplete results depending on the value of + * |autocompleteBoundsMode| (can be nil). + */ +@property(nonatomic, strong, nullable) GMSCoordinateBounds *autocompleteBounds; + +/** + * How to treat the |autocompleteBounds| property. Defaults to |kGMSAutocompleteBoundsModeBias|. + * + * Has no effect if |autocompleteBounds| is nil. + */ +@property(nonatomic, assign) GMSAutocompleteBoundsMode autocompleteBoundsMode; + +/** Filter to apply to autocomplete suggestions (can be nil). */ +@property(nonatomic, strong, nullable) GMSAutocompleteFilter *autocompleteFilter; + +/** The background color of table cells. */ +@property(nonatomic, strong) IBInspectable UIColor *tableCellBackgroundColor; + +/** The color of the separator line between table cells. */ +@property(nonatomic, strong) IBInspectable UIColor *tableCellSeparatorColor; + +/** The color of result name text in autocomplete results */ +@property(nonatomic, strong) IBInspectable UIColor *primaryTextColor; + +/** The color used to highlight matching text in autocomplete results */ +@property(nonatomic, strong) IBInspectable UIColor *primaryTextHighlightColor; + +/** The color of the second row of text in autocomplete results. */ +@property(nonatomic, strong) IBInspectable UIColor *secondaryTextColor; + +/** The tint color applied to controls in the Autocomplete view. */ +@property(nonatomic, strong, nullable) IBInspectable UIColor *tintColor; + +/** + * Specify individual place details to fetch for object |GMSPlace|. + * Defaults to returning all details if not overridden. + */ +@property(nonatomic, assign) GMSPlaceField placeFields; + +/** + * Sets up the autocomplete bounds using the NE and SW corner locations. + */ +- (void)setAutocompleteBoundsUsingNorthEastCorner:(CLLocationCoordinate2D)NorthEastCorner + SouthWestCorner:(CLLocationCoordinate2D)SouthWestCorner; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSAutocompleteSessionToken.h b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSAutocompleteSessionToken.h new file mode 100755 index 0000000..cff3b7c --- /dev/null +++ b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSAutocompleteSessionToken.h @@ -0,0 +1,23 @@ +// +// GMSAutocompleteSessionToken.h +// Google Places SDK for iOS +// +// Copyright 2018 Google Inc. +// +// Usage of this SDK is subject to the Google Maps/Google Earth APIs Terms of +// Service: https://developers.google.com/maps/terms +// + + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** + * This class represents an session token to uniquely identify an series of queries to the Google + * Places API Services for fetching place predictions for a partial search string. + */ +@interface GMSAutocompleteSessionToken : NSObject +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSAutocompleteTableDataSource.h b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSAutocompleteTableDataSource.h new file mode 100755 index 0000000..66216b7 --- /dev/null +++ b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSAutocompleteTableDataSource.h @@ -0,0 +1,188 @@ +// +// GMSAutocompleteTableDataSource.h +// Google Places SDK for iOS +// +// Copyright 2016 Google Inc. +// +// Usage of this SDK is subject to the Google Maps/Google Earth APIs Terms of +// Service: https://developers.google.com/maps/terms +// + +#import + +#import "GMSAutocompleteBoundsMode.h" +#import "GMSAutocompleteFilter.h" +#import "GMSAutocompletePrediction.h" +#import "GMSPlace.h" +#import "GMSPlaceFieldMask.h" + +@class GMSAutocompleteTableDataSource; +@class GMSCoordinateBounds; + +NS_ASSUME_NONNULL_BEGIN + +/** + * Protocol used by |GMSAutocompleteTableDataSource|, to communicate the user's interaction with the + * data source to the application. + */ +@protocol GMSAutocompleteTableDataSourceDelegate + +@required + +/** + * Called when a place has been selected from the available autocomplete predictions. + * @param tableDataSource The |GMSAutocompleteTableDataSource| that generated the event. + * @param place The |GMSPlace| that was returned. + */ +- (void)tableDataSource:(GMSAutocompleteTableDataSource *)tableDataSource + didAutocompleteWithPlace:(GMSPlace *)place; + +/** + * Called when a non-retryable error occurred when retrieving autocomplete predictions or place + * details. A non-retryable error is defined as one that is unlikely to be fixed by immediately + * retrying the operation. + *

+ * Only the following values of |GMSPlacesErrorCode| are retryable: + *

    + *
  • kGMSPlacesNetworkError + *
  • kGMSPlacesServerError + *
  • kGMSPlacesInternalError + *
+ * All other error codes are non-retryable. + * @param tableDataSource The |GMSAutocompleteTableDataSource| that generated the event. + * @param error The |NSError| that was returned. + */ +- (void)tableDataSource:(GMSAutocompleteTableDataSource *)tableDataSource + didFailAutocompleteWithError:(NSError *)error; + +@optional + +/** + * Called when the user selects an autocomplete prediction from the list but before requesting + * place details. Returning NO from this method will suppress the place details fetch and + * didAutocompleteWithPlace will not be called. + * @param tableDataSource The |GMSAutocompleteTableDataSource| that generated the event. + * @param prediction The |GMSAutocompletePrediction| that was selected. + */ +- (BOOL)tableDataSource:(GMSAutocompleteTableDataSource *)tableDataSource + didSelectPrediction:(GMSAutocompletePrediction *)prediction; + +/** + * Called once every time new autocomplete predictions are received. + * @param tableDataSource The |GMSAutocompleteTableDataSource| that generated the event. + */ +- (void)didUpdateAutocompletePredictionsForTableDataSource: + (GMSAutocompleteTableDataSource *)tableDataSource; + +/** + * Called once immediately after a request for autocomplete predictions is made. + * @param tableDataSource The |GMSAutocompleteTableDataSource| that generated the event. + */ +- (void)didRequestAutocompletePredictionsForTableDataSource: + (GMSAutocompleteTableDataSource *)tableDataSource; + +@end + +/** + * GMSAutocompleteTableDataSource provides an interface for providing place autocomplete + * predictions to populate a UITableView by implementing the UITableViewDataSource and + * UITableViewDelegate protocols. + * + * GMSAutocompleteTableDataSource is designed to be used as the data source for a + * UISearchDisplayController. + * + * NOTE: UISearchDisplayController has been deprecated since iOS 8. It is now recommended to use + * UISearchController with |GMSAutocompleteResultsViewController| to display autocomplete results + * using the iOS search UI. + * + * Set an instance of GMSAutocompleteTableDataSource as the searchResultsDataSource and + * searchResultsDelegate properties of UISearchDisplayController. In your implementation of + * shouldReloadTableForSearchString, call sourceTextHasChanged with the current search string. + * + * Use the |GMSAutocompleteTableDataSourceDelegate| delegate protocol to be notified when a place is + * selected from the list. Because autocomplete predictions load asynchronously, it is necessary + * to implement didUpdateAutocompletePredictions and call reloadData on the + * UISearchDisplayController's table view. + * + */ +@interface GMSAutocompleteTableDataSource : NSObject + +/** Delegate to be notified when a place is selected or picking is cancelled. */ +@property(nonatomic, weak, nullable) IBOutlet id delegate; + +/** + * Bounds used to bias or restrict the autocomplete results depending on the value of + * |autocompleteBoundsMode| (can be nil). + */ +@property(nonatomic, strong, nullable) GMSCoordinateBounds *autocompleteBounds; + +/** + * How to treat the |autocompleteBounds| property. Defaults to |kGMSAutocompleteBoundsModeBias|. + * + * Has no effect if |autocompleteBounds| is nil. + */ +@property(nonatomic, assign) GMSAutocompleteBoundsMode autocompleteBoundsMode; + +/** Filter to apply to autocomplete suggestions (can be nil). */ +@property(nonatomic, strong, nullable) GMSAutocompleteFilter *autocompleteFilter; + +/** The background color of table cells. */ +@property(nonatomic, strong) UIColor *tableCellBackgroundColor; + +/** The color of the separator line between table cells. */ +@property(nonatomic, strong) UIColor *tableCellSeparatorColor; + +/** The color of result name text in autocomplete results */ +@property(nonatomic, strong) UIColor *primaryTextColor; + +/** The color used to highlight matching text in autocomplete results */ +@property(nonatomic, strong) UIColor *primaryTextHighlightColor; + +/** The color of the second row of text in autocomplete results. */ +@property(nonatomic, strong) UIColor *secondaryTextColor; + +/** The tint color applied to controls in the Autocomplete view. */ +@property(nonatomic, strong, nullable) UIColor *tintColor; + +/** + * The |GMSPlaceField| for specifying explicit place details to be requested. Default returns + * all avilable fields. + */ +@property(nonatomic, assign) GMSPlaceField placeFields; + +/** Designated initializer */ +- (instancetype)init NS_DESIGNATED_INITIALIZER; + +/** + * Notify the data source that the source text to autocomplete has changed. + * + * This method should only be called from the main thread. Calling this method from another thread + * will result in undefined behavior. Calls to |GMSAutocompleteTableDataSourceDelegate| methods will + * also be called on the main thread. + * + * This method is non-blocking. + * @param text The partial text to autocomplete. + */ +- (void)sourceTextHasChanged:(nullable NSString *)text; + +/** + * Clear all predictions. + * + * NOTE: This will call the two delegate methods below: + * + * - |didUpdateAutocompletePredictionsForResultsController:| + * - |didRequestAutocompletePredictionsForResultsController:| + * + * The implementation of this method is guaranteed to call these synchronously and in-order. + */ +- (void)clearResults; + +/** + * Sets up the autocomplete bounds using the NE and SW corner locations. + */ +- (void)setAutocompleteBoundsUsingNorthEastCorner:(CLLocationCoordinate2D)NorthEastCorner + SouthWestCorner:(CLLocationCoordinate2D)SouthWestCorner; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSAutocompleteViewController.h b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSAutocompleteViewController.h new file mode 100755 index 0000000..00433fb --- /dev/null +++ b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSAutocompleteViewController.h @@ -0,0 +1,167 @@ +// +// GMSAutocompleteViewController.h +// Google Places SDK for iOS +// +// Copyright 2016 Google Inc. +// +// Usage of this SDK is subject to the Google Maps/Google Earth APIs Terms of +// Service: https://developers.google.com/maps/terms +// + +#import + +#import "GMSAutocompleteBoundsMode.h" +#import "GMSAutocompleteFilter.h" +#import "GMSAutocompletePrediction.h" +#import "GMSPlace.h" +#import "GMSPlaceFieldMask.h" + +@class GMSAutocompleteViewController; +@class GMSCoordinateBounds; + +NS_ASSUME_NONNULL_BEGIN + +/** + * Protocol used by |GMSAutocompleteViewController|, to communicate the user's interaction + * with the controller to the application. + */ +@protocol GMSAutocompleteViewControllerDelegate + +@required + +/** + * Called when a place has been selected from the available autocomplete predictions. + * + * Implementations of this method should dismiss the view controller as the view controller will not + * dismiss itself. + * + * @param viewController The |GMSAutocompleteViewController| that generated the event. + * @param place The |GMSPlace| that was returned. + */ +- (void)viewController:(GMSAutocompleteViewController *)viewController + didAutocompleteWithPlace:(GMSPlace *)place; + +/** + * Called when a non-retryable error occurred when retrieving autocomplete predictions or place + * details. A non-retryable error is defined as one that is unlikely to be fixed by immediately + * retrying the operation. + * + * Only the following values of |GMSPlacesErrorCode| are retryable: + *
    + *
  • kGMSPlacesNetworkError + *
  • kGMSPlacesServerError + *
  • kGMSPlacesInternalError + *
+ * All other error codes are non-retryable. + * + * @param viewController The |GMSAutocompleteViewController| that generated the event. + * @param error The |NSError| that was returned. + */ +- (void)viewController:(GMSAutocompleteViewController *)viewController + didFailAutocompleteWithError:(NSError *)error; + +/** + * Called when the user taps the Cancel button in a |GMSAutocompleteViewController|. + * + * Implementations of this method should dismiss the view controller as the view controller will not + * dismiss itself. + * + * @param viewController The |GMSAutocompleteViewController| that generated the event. + */ +- (void)wasCancelled:(GMSAutocompleteViewController *)viewController; + +@optional + +/** + * Called when the user selects an autocomplete prediction from the list but before requesting + * place details. + * + * Returning NO from this method will suppress the place details fetch and didAutocompleteWithPlace + * will not be called. + * + * @param viewController The |GMSAutocompleteViewController| that generated the event. + * @param prediction The |GMSAutocompletePrediction| that was selected. + */ +- (BOOL)viewController:(GMSAutocompleteViewController *)viewController + didSelectPrediction:(GMSAutocompletePrediction *)prediction; + +/** + * Called once every time new autocomplete predictions are received. + * + * @param viewController The |GMSAutocompleteViewController| that generated the event. + */ +- (void)didUpdateAutocompletePredictions:(GMSAutocompleteViewController *)viewController; + +/** + * Called once immediately after a request for autocomplete predictions is made. + * + * @param viewController The |GMSAutocompleteViewController| that generated the event. + */ +- (void)didRequestAutocompletePredictions:(GMSAutocompleteViewController *)viewController; + +@end + +/** + * GMSAutocompleteViewController provides an interface that displays a table of autocomplete + * predictions that updates as the user enters text. Place selections made by the user are + * returned to the app via the |GMSAutocompleteViewControllerResultsDelegate| protocol. + * + * To use GMSAutocompleteViewController, set its delegate to an object in your app that + * conforms to the |GMSAutocompleteViewControllerDelegate| protocol and present the controller + * (eg using presentViewController). The |GMSAutocompleteViewControllerDelegate| delegate methods + * can be used to determine when the user has selected a place or has cancelled selection. + */ +@interface GMSAutocompleteViewController : UIViewController + +/** Delegate to be notified when a place is selected or picking is cancelled. */ +@property(nonatomic, weak, nullable) IBOutlet id delegate; + +/** + * Bounds used to bias or restrict the autocomplete results depending on the value of + * |autocompleteBoundsMode| (can be nil). + */ +@property(nonatomic, strong, nullable) GMSCoordinateBounds *autocompleteBounds; + +/** + * How to treat the |autocompleteBounds| property. Defaults to |kGMSAutocompleteBoundsModeBias|. + * + * Has no effect if |autocompleteBounds| is nil. + */ +@property(nonatomic, assign) GMSAutocompleteBoundsMode autocompleteBoundsMode; + +/** Filter to apply to autocomplete suggestions (can be nil). */ +@property(nonatomic, strong, nullable) GMSAutocompleteFilter *autocompleteFilter; + +/** The background color of table cells. */ +@property(nonatomic, strong) IBInspectable UIColor *tableCellBackgroundColor; + +/** The color of the separator line between table cells. */ +@property(nonatomic, strong) IBInspectable UIColor *tableCellSeparatorColor; + +/** The color of result name text in autocomplete results */ +@property(nonatomic, strong) IBInspectable UIColor *primaryTextColor; + +/** The color used to highlight matching text in autocomplete results */ +@property(nonatomic, strong) IBInspectable UIColor *primaryTextHighlightColor; + +/** The color of the second row of text in autocomplete results. */ +@property(nonatomic, strong) IBInspectable UIColor *secondaryTextColor; + +/** The tint color applied to controls in the Autocomplete view. */ +@property(nonatomic, strong, nullable) IBInspectable UIColor *tintColor; + +/** + * Specify individual place details to fetch for object |GMSPlace|. + * Defaults to returning all details if not overridden. + */ +@property(nonatomic, assign) GMSPlaceField placeFields; + +/** + * Sets up the autocomplete bounds using the NE and SW corner locations. + */ +- (void)setAutocompleteBoundsUsingNorthEastCorner:(CLLocationCoordinate2D)NorthEastCorner + SouthWestCorner:(CLLocationCoordinate2D)SouthWestCorner; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSOpeningHours.h b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSOpeningHours.h new file mode 100755 index 0000000..5f40f2e --- /dev/null +++ b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSOpeningHours.h @@ -0,0 +1,136 @@ +// +// GMSOpeningHours.h +// Google Places SDK for iOS +// +// Copyright 2018 Google Inc. +// +// Usage of this SDK is subject to the Google Maps/Google Earth APIs Terms of +// Service: https://developers.google.com/maps/terms +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** + * \defgroup OpenNowStatus GMSOpenNowStatus + * @{ + */ + +/** + * Describes the current open status of a place. + */ +typedef NS_ENUM(NSInteger, GMSOpenNowStatus) { + /** The place is open now. */ + GMSOpenNowStatusYes, + /** The place is not open now. */ + GMSOpenNowStatusNo, + /** Whether the place is open now is unknown. */ + GMSOpenNowStatusUnknown, +}; + +/**@}*/ + +/** + * \defgroup DayOfWeek GMSDayOfWeek + * @{ + */ + +/** + * The fields represent individual days of the week. Matches NSDateComponents.weekday index. + * Refer to https://developer.apple.com/documentation/foundation/nsdatecomponents/1410442-weekday + */ +typedef NS_ENUM(NSUInteger, GMSDayOfWeek) { + GMSDayOfWeekSunday = 1, + GMSDayOfWeekMonday = 2, + GMSDayOfWeekTuesday = 3, + GMSDayOfWeekWednesday = 4, + GMSDayOfWeekThursday = 5, + GMSDayOfWeekFriday = 6, + GMSDayOfWeekSaturday = 7, +}; + +/**@}*/ + +/** + * A class representing time in hours and minutes in a 24hr clock. + */ +@interface GMSTime : NSObject + +/** + * The hour representation of time in a day. (Range is between 0-23). + */ +@property(nonatomic, readonly, assign) NSUInteger hour; + +/** + * The minute representation of time in a 1 hr period. (Range is between 0-59). + */ +@property(nonatomic, readonly, assign) NSUInteger minute; + +@end + +/** + * A class representing a open/close event in |GMSPeriod|. + */ +@interface GMSEvent : NSObject + +/** + * Day of week the associated with the event. + */ +@property(nonatomic, readonly, assign) GMSDayOfWeek day; + +/** + * The representation of time of the event in 24hr clock. + */ +@property(nonatomic, readonly, strong) GMSTime *time; + +@end + +/** + * A class representing a period of time where the place is operating for a |GMSPlace|. + * It contains an open |GMSEvent| and an optional close |GMSEvent|. The close event will be nil + * if the period is open 24hrs. + */ +@interface GMSPeriod : NSObject + +/** + * The open event of this period. + * Each |GMSPeriod| is guaranteed to have an open event. + * If the period is representing open 24hrs, it will only have the openEvent with time as "0000". + */ +@property(nonatomic, readonly, strong) GMSEvent *openEvent; + +/** + * The close event of this period. + * Can be nil if period is open 24hrs. + */ +@property(nullable, nonatomic, readonly, strong) GMSEvent *closeEvent; + +@end + +/** + * A class to handle storing and accessing opening hours information for |GMSPlace|. + */ +@interface GMSOpeningHours : NSObject + +/** + * Contains all |GMSPeriod|s of open and close events for the week. + * + * Note: Multiple periods can be associated with a day (eg. Monday 7am - Monday 2pm, + * Monday 5pm - Monday 10pm). + * + * Periods may also span multiple days (eg Friday 7pm - Saturday 2am). + */ +@property(nullable, nonatomic, readonly, strong) NSArray *periods; + +/** + * Contains localized strings of the daily opening hours for the week. + * + * Note: The order of the text depends on the language and may begin on Monday or Sunday. + * Do not use the GMSDayOfWeek enum to index into the array. + */ +@property(nullable, nonatomic, readonly, strong) NSArray *weekdayText; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSPlace.h b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSPlace.h new file mode 100755 index 0000000..9d40ce2 --- /dev/null +++ b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSPlace.h @@ -0,0 +1,227 @@ +// +// GMSPlace.h +// Google Places SDK for iOS +// +// Copyright 2016 Google Inc. +// +// Usage of this SDK is subject to the Google Maps/Google Earth APIs Terms of +// Service: https://developers.google.com/maps/terms +// + +#import + +@class GMSAddressComponent; +@class GMSCoordinateBounds; +@class GMSOpeningHours; +@class GMSPlacePhotoMetadata; +@class GMSPlusCode; + +NS_ASSUME_NONNULL_BEGIN + + +/** + * \defgroup PlacesOpenNowStatus GMSPlacesOpenNowStatus + * @{ + */ + +/** + * Describes the current open status of a place. + * + * (Deprecated: This enum is currently not supported and should not be used. Use GMSPlaceOpenStatus + * instead.) + */ +typedef NS_ENUM(NSInteger, GMSPlacesOpenNowStatus) { + /** The place is open now. */ + kGMSPlacesOpenNowStatusYes, + /** The place is not open now. */ + kGMSPlacesOpenNowStatusNo, + /** We don't know whether the place is open now. */ + kGMSPlacesOpenNowStatusUnknown, +}; + +/**@}*/ + +/** + * \defgroup PlacesPriceLevel GMSPlacesPriceLevel + * @{ + */ + +/** + * Describes the price level of a place. + */ +typedef NS_ENUM(NSInteger, GMSPlacesPriceLevel) { + kGMSPlacesPriceLevelUnknown = -1, + kGMSPlacesPriceLevelFree = 0, + kGMSPlacesPriceLevelCheap = 1, + kGMSPlacesPriceLevelMedium = 2, + kGMSPlacesPriceLevelHigh = 3, + kGMSPlacesPriceLevelExpensive = 4, +}; + +/**@}*/ + +/** + * \defgroup PlaceOpenStatus GMSPlaceOpenStatus + * @{ + */ + +/** + * Describes the open status of a place. + */ +typedef NS_ENUM(NSInteger, GMSPlaceOpenStatus) { + /** The place's open status is unknown. */ + GMSPlaceOpenStatusUnknown, + /** The place is open. */ + GMSPlaceOpenStatusOpen, + /** The place is not open. */ + GMSPlaceOpenStatusClosed, +}; + +/**@}*/ + +/** + * Represents a particular physical place. A GMSPlace encapsulates information about a physical + * location, including its name, location, and any other information we might have about it. This + * class is immutable. + */ +@interface GMSPlace : NSObject + +/** Name of the place. */ +@property(nonatomic, copy, readonly, nullable) NSString *name; + +/** Place ID of this place. */ +@property(nonatomic, copy, readonly, nullable) NSString *placeID; + +/** + * Location of the place. The location is not necessarily the center of the Place, or any + * particular entry or exit point, but some arbitrarily chosen point within the geographic extent of + * the Place. + */ +@property(nonatomic, readonly, assign) CLLocationCoordinate2D coordinate; + +/** + * Represents the open now status of the place at the time that the place was created. + * + * (Deprecated: This property is currently not supported and should not be used) + */ +@property(nonatomic, readonly, assign) GMSPlacesOpenNowStatus openNowStatus __deprecated_msg( + "openNowStatus property is currently not supported and should not be used)"); + +/** + * Phone number of this place, in international format, i.e. including the country code prefixed + * with "+". For example, Google Sydney's phone number is "+61 2 9374 4000". + */ +@property(nonatomic, copy, readonly, nullable) NSString *phoneNumber; + +/** + * Address of the place as a simple string. + */ +@property(nonatomic, copy, readonly, nullable) NSString *formattedAddress; + +/** + * Five-star rating for this place based on user reviews. + * + * Ratings range from 1.0 to 5.0. 0.0 means we have no rating for this place (e.g. because not + * enough users have reviewed this place). + */ +@property(nonatomic, readonly, assign) float rating; + +/** + * Price level for this place, as integers from 0 to 4. + * + * e.g. A value of 4 means this place is "$$$$" (expensive). A value of 0 means free (such as a + * museum with free admission). + */ +@property(nonatomic, readonly, assign) GMSPlacesPriceLevel priceLevel; + +/** + * The types of this place. Types are NSStrings, valid values are any types documented at + * . + */ +@property(nonatomic, copy, readonly, nullable) NSArray *types; + +/** Website for this place. */ +@property(nonatomic, copy, readonly, nullable) NSURL *website; + +/** + * The data provider attribution string for this place. + * + * These are provided as a NSAttributedString, which may contain hyperlinks to the website of each + * provider. + * + * In general, these must be shown to the user if data from this GMSPlace is shown, as described in + * the Places SDK Terms of Service. + */ +@property(nonatomic, copy, readonly, nullable) NSAttributedString *attributions; + +/** + * The recommended viewport for this place. May be nil if the size of the place is not known. + * + * This returns a viewport of a size that is suitable for displaying this place. For example, a + * |GMSPlace| object representing a store may have a relatively small viewport, while a |GMSPlace| + * object representing a country may have a very large viewport. + */ +@property(nonatomic, strong, readonly, nullable) GMSCoordinateBounds *viewport; + +/** + * An array of |GMSAddressComponent| objects representing the components in the place's address. + * These components are provided for the purpose of extracting structured information about the + * place's address: for example, finding the city that a place is in. + * + * These components should not be used for address formatting. If a formatted address is required, + * use the |formattedAddress| property, which provides a localized formatted address. + */ +@property(nonatomic, copy, readonly, nullable) NSArray *addressComponents; + +/** + * The Plus code representation of location for this place. + */ +@property(nonatomic, strong, readonly, nullable) GMSPlusCode *plusCode; + +/** + * The Opening Hours information for this place. + * Includes open status, periods and weekday text when available. + */ +@property(nonatomic, strong, readonly, nullable) GMSOpeningHours *openingHours; + +/** + * Represents how many reviews make up this place's rating. + */ +@property(nonatomic, readonly, assign) NSUInteger userRatingsTotal; + +/** + * An array of |GMSPlacePhotoMetadata| objects representing the photos of the place. + */ +@property(nonatomic, copy, readonly, nullable) NSArray *photos; + +/** + * The timezone UTC offset of the place in minutes. + */ +@property(nonatomic, readonly, nullable) NSNumber *UTCOffsetMinutes; + +/** + * Default init is not available. + */ +- (instancetype)init NS_UNAVAILABLE; + +/** + * Calculates if a place is open based on |openingHours|, |UTCOffsetMinutes|, and |date|. + * + * @param date A reference point in time used to determine if the place is open. + * @return GMSPlaceOpenStatusOpen if the place is open, GMSPlaceOpenStatusClosed if the place is + * closed, and GMSPlaceOpenStatusUnknown if the open status is unknown. + */ +- (GMSPlaceOpenStatus)isOpenAtDate:(NSDate *)date; + +/** + * Calculates if a place is open based on |openingHours|, |UTCOffsetMinutes|, and current date + * and time obtained from |[NSDate date]|. + * + * @return GMSPlaceOpenStatusOpen if the place is open, GMSPlaceOpenStatusClosed if the place is + * closed, and GMSPlaceOpenStatusUnknown if the open status is unknown. + */ +- (GMSPlaceOpenStatus)isOpen; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSPlaceFieldMask.h b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSPlaceFieldMask.h new file mode 100755 index 0000000..f12c1ee --- /dev/null +++ b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSPlaceFieldMask.h @@ -0,0 +1,50 @@ +// +// GMSPlaceFieldMask.h +// Google Places SDK for iOS +// +// Copyright 2018 Google Inc. +// +// Usage of this SDK is subject to the Google Maps/Google Earth APIs Terms of +// Service: https://developers.google.com/maps/terms +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** + * \defgroup PlaceField GMSPlaceField + * @{ + */ + +/** + * The fields represent individual information that can be requested for a |GMSPlace| object. + * If no request fields are set, the |GMSPlace| object will be empty with no useful information. + * + * Note: GMSPlaceFieldPhoneNumber, GMSPlaceFieldWebsite and GMSPlaceFieldAddressComponents are not + * supported for |GMSPlaceLikelihoodList| place objects. Please refer to + * https://developers.google.com/places/ios-sdk/place-data-fields for more details. + */ +typedef NS_ENUM(NSUInteger, GMSPlaceField) { + GMSPlaceFieldName = 1 << 0, + GMSPlaceFieldPlaceID = 1 << 1, + GMSPlaceFieldPlusCode = 1 << 2, + GMSPlaceFieldCoordinate = 1 << 3, + GMSPlaceFieldOpeningHours = 1 << 4, + GMSPlaceFieldPhoneNumber = 1 << 5, + GMSPlaceFieldFormattedAddress = 1 << 6, + GMSPlaceFieldRating = 1 << 7, + GMSPlaceFieldPriceLevel = 1 << 8, + GMSPlaceFieldTypes = 1 << 9, + GMSPlaceFieldWebsite = 1 << 10, + GMSPlaceFieldViewport = 1 << 11, + GMSPlaceFieldAddressComponents = 1 << 12, + GMSPlaceFieldPhotos = 1 << 13, + GMSPlaceFieldUserRatingsTotal = 1 << 14, + GMSPlaceFieldUTCOffsetMinutes = 1 << 15, + GMSPlaceFieldAll = NSUIntegerMax, +}; + +/**@}*/ + +NS_ASSUME_NONNULL_END diff --git a/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSPlaceLikelihood.h b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSPlaceLikelihood.h new file mode 100755 index 0000000..9bba03c --- /dev/null +++ b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSPlaceLikelihood.h @@ -0,0 +1,47 @@ +// +// GMSPlaceLikelihood.h +// Google Places SDK for iOS +// +// Copyright 2016 Google Inc. +// +// Usage of this SDK is subject to the Google Maps/Google Earth APIs Terms of +// Service: https://developers.google.com/maps/terms +// + + +#import + +@class GMSPlace; + +NS_ASSUME_NONNULL_BEGIN + +/** + * Represents a |GMSPlace| and the relative likelihood of the place being the best match within the + * list of returned places for a single request. For more information about place likelihoods, see + * |GMSPlaceLikelihoodList|. + */ +@interface GMSPlaceLikelihood : NSObject + +/** + * The place contained in this place likelihood. + */ +@property(nonatomic, strong, readonly) GMSPlace *place; + +/** + * Returns a value from 0.0 to 1.0 indicating the confidence that the user is at this place. The + * larger the value the more confident we are of the place returned. For example, a likelihood of + * 0.75 means that the user is at least 75% likely to be at this place. + */ +@property(nonatomic, assign, readonly) double likelihood; + +- (instancetype)initWithPlace:(GMSPlace *)place + likelihood:(double)likelihood NS_DESIGNATED_INITIALIZER; + +/** + * Default init is not available. Please use the designated initializer. + */ +- (instancetype)init NS_UNAVAILABLE; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSPlaceLikelihoodList.h b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSPlaceLikelihoodList.h new file mode 100755 index 0000000..5130626 --- /dev/null +++ b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSPlaceLikelihoodList.h @@ -0,0 +1,42 @@ +// +// GMSPlaceLikelihoodList.h +// Google Places SDK for iOS +// +// Copyright 2016 Google Inc. +// +// Usage of this SDK is subject to the Google Maps/Google Earth APIs Terms of +// Service: https://developers.google.com/maps/terms +// + +#import + +@class GMSPlaceLikelihood; + +NS_ASSUME_NONNULL_BEGIN + +/** + * Represents a list of places with an associated likelihood for the place being the correct place. + * For example, the Places service may be uncertain what the true Place is, but think it 55% likely + * to be PlaceA, and 35% likely to be PlaceB. The corresponding likelihood list has two members, one + * with likelihood 0.55 and the other with likelihood 0.35. The likelihoods are not guaranteed to be + * correct, and in a given place likelihood list they may not sum to 1.0. + */ +@interface GMSPlaceLikelihoodList : NSObject + +/** An array of likelihoods, sorted in descending order. */ +@property(nonatomic, copy) NSArray *likelihoods; + +/** + * The data provider attribution strings for the likelihood list. + * + * These are provided as a NSAttributedString, which may contain hyperlinks to the website of each + * provider. + * + * In general, these must be shown to the user if data from this likelihood list is shown, as + * described in the Places SDK Terms of Service. + */ +@property(nonatomic, copy, readonly, nullable) NSAttributedString *attributions; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSPlaceLocationOptions.h b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSPlaceLocationOptions.h new file mode 100755 index 0000000..5d9c9a0 --- /dev/null +++ b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSPlaceLocationOptions.h @@ -0,0 +1,31 @@ +// +// GMSPlaceLocationOptions.h +// Google Places SDK for iOS +// +// Copyright 2019 Google Inc. +// +// Usage of this SDK is subject to the Google Maps/Google Earth APIs Terms of +// Service: https://developers.google.com/maps/terms +// + + +#import + +@protocol GMSPlaceLocationBias; +@protocol GMSPlaceLocationRestriction; + +NS_ASSUME_NONNULL_BEGIN + +/* + * Returns a rectangular location to filter place results inside the boundaries. + * Supports filtering as a restriction where results must be inside the bounds, or as a bias where + * results in the bounds are preferred. + * + * @param northEastBounds The north east corner of the bounds. + * @param southWestBounds The south west corner of the bounds. + */ +FOUNDATION_EXTERN id +GMSPlaceRectangularLocationOption(CLLocationCoordinate2D northEastBounds, + CLLocationCoordinate2D southWestBounds); + +NS_ASSUME_NONNULL_END diff --git a/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSPlacePhotoMetadata.h b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSPlacePhotoMetadata.h new file mode 100755 index 0000000..9c93eaa --- /dev/null +++ b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSPlacePhotoMetadata.h @@ -0,0 +1,43 @@ +// +// GMSPlacePhotoMetadata.h +// Google Places SDK for iOS +// +// Copyright 2016 Google Inc. +// +// Usage of this SDK is subject to the Google Maps/Google Earth APIs Terms of +// Service: https://developers.google.com/maps/terms +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** + * The metadata corresponding to a single photo associated with a place. + */ +@interface GMSPlacePhotoMetadata : NSObject + +/** + * The data provider attribution string for this photo. + * + * These are provided as a NSAttributedString, which may contain hyperlinks to the website of each + * provider. + * + * In general, these must be shown to the user if data from this GMSPlacePhotoMetadata is shown, as + * described in the Places SDK Terms of Service. + */ +@property(nonatomic, readonly, copy, nullable) NSAttributedString *attributions; + +/** + * The maximum pixel size in which this photo is available. + */ +@property(nonatomic, readonly, assign) CGSize maxSize; + +/** + * Initializer is not available. + */ +- (instancetype)init NS_UNAVAILABLE; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSPlacePhotoMetadataList.h b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSPlacePhotoMetadataList.h new file mode 100755 index 0000000..cc58d4d --- /dev/null +++ b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSPlacePhotoMetadataList.h @@ -0,0 +1,29 @@ +// +// GMSPlacePhotoMetadataList.h +// Google Places SDK for iOS +// +// Copyright 2016 Google Inc. +// +// Usage of this SDK is subject to the Google Maps/Google Earth APIs Terms of +// Service: https://developers.google.com/maps/terms +// + +#import + +#import "GMSPlacePhotoMetadata.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + * A list of |GMSPlacePhotoMetadata| objects. + */ +@interface GMSPlacePhotoMetadataList : NSObject + +/** + * The array of |GMSPlacePhotoMetadata| objects. + */ +@property(nonatomic, readonly, copy) NSArray *results; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSPlaceTypes.h b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSPlaceTypes.h new file mode 100755 index 0000000..461e482 --- /dev/null +++ b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSPlaceTypes.h @@ -0,0 +1,164 @@ +// +// GMSPlaceTypes.h +// Google Places SDK for iOS +// +// Copyright 2016 Google Inc. +// +// Usage of this SDK is subject to the Google Maps/Google Earth APIs Terms of +// Service: https://developers.google.com/maps/terms +// + +#import + +/** + * \defgroup PlaceTypes GMSPlaceType + * @{ + */ + +/** + * The constants for the Table 1 place types for the API. Complete list can be found at + * https://developers.google.com/places/documentation/supported_types + */ +extern NSString *const kGMSPlaceTypeAccounting; +extern NSString *const kGMSPlaceTypeAirport; +extern NSString *const kGMSPlaceTypeAmusementPark; +extern NSString *const kGMSPlaceTypeAquarium; +extern NSString *const kGMSPlaceTypeArtGallery; +extern NSString *const kGMSPlaceTypeAtm; +extern NSString *const kGMSPlaceTypeBakery; +extern NSString *const kGMSPlaceTypeBank; +extern NSString *const kGMSPlaceTypeBar; +extern NSString *const kGMSPlaceTypeBeautySalon; +extern NSString *const kGMSPlaceTypeBicycleStore; +extern NSString *const kGMSPlaceTypeBookStore; +extern NSString *const kGMSPlaceTypeBowlingAlley; +extern NSString *const kGMSPlaceTypeBusStation; +extern NSString *const kGMSPlaceTypeCafe; +extern NSString *const kGMSPlaceTypeCampground; +extern NSString *const kGMSPlaceTypeCarDealer; +extern NSString *const kGMSPlaceTypeCarRental; +extern NSString *const kGMSPlaceTypeCarRepair; +extern NSString *const kGMSPlaceTypeCarWash; +extern NSString *const kGMSPlaceTypeCasino; +extern NSString *const kGMSPlaceTypeCemetery; +extern NSString *const kGMSPlaceTypeChurch; +extern NSString *const kGMSPlaceTypeCityHall; +extern NSString *const kGMSPlaceTypeClothingStore; +extern NSString *const kGMSPlaceTypeConvenienceStore; +extern NSString *const kGMSPlaceTypeCourthouse; +extern NSString *const kGMSPlaceTypeDentist; +extern NSString *const kGMSPlaceTypeDepartmentStore; +extern NSString *const kGMSPlaceTypeDoctor; +extern NSString *const kGMSPlaceTypeDrugstore; +extern NSString *const kGMSPlaceTypeElectrician; +extern NSString *const kGMSPlaceTypeElectronicsStore; +extern NSString *const kGMSPlaceTypeEmbassy; +extern NSString *const kGMSPlaceTypeFireStation; +extern NSString *const kGMSPlaceTypeFlorist; +extern NSString *const kGMSPlaceTypeFuneralHome; +extern NSString *const kGMSPlaceTypeFurnitureStore; +extern NSString *const kGMSPlaceTypeGasStation; +extern NSString *const kGMSPlaceTypeGroceryOrSupermarket; +extern NSString *const kGMSPlaceTypeGym; +extern NSString *const kGMSPlaceTypeHairCare; +extern NSString *const kGMSPlaceTypeHardwareStore; +extern NSString *const kGMSPlaceTypeHinduTemple; +extern NSString *const kGMSPlaceTypeHomeGoodsStore; +extern NSString *const kGMSPlaceTypeHospital; +extern NSString *const kGMSPlaceTypeInsuranceAgency; +extern NSString *const kGMSPlaceTypeJewelryStore; +extern NSString *const kGMSPlaceTypeLaundry; +extern NSString *const kGMSPlaceTypeLawyer; +extern NSString *const kGMSPlaceTypeLibrary; +extern NSString *const kGMSPlaceTypeLightRailStation; +extern NSString *const kGMSPlaceTypeLiquorStore; +extern NSString *const kGMSPlaceTypeLocalGovernmentOffice; +extern NSString *const kGMSPlaceTypeLocksmith; +extern NSString *const kGMSPlaceTypeLodging; +extern NSString *const kGMSPlaceTypeMealDelivery; +extern NSString *const kGMSPlaceTypeMealTakeaway; +extern NSString *const kGMSPlaceTypeMosque; +extern NSString *const kGMSPlaceTypeMovieRental; +extern NSString *const kGMSPlaceTypeMovieTheater; +extern NSString *const kGMSPlaceTypeMovingCompany; +extern NSString *const kGMSPlaceTypeMuseum; +extern NSString *const kGMSPlaceTypeNightClub; +extern NSString *const kGMSPlaceTypePainter; +extern NSString *const kGMSPlaceTypePark; +extern NSString *const kGMSPlaceTypeParking; +extern NSString *const kGMSPlaceTypePetStore; +extern NSString *const kGMSPlaceTypePharmacy; +extern NSString *const kGMSPlaceTypePhysiotherapist; +extern NSString *const kGMSPlaceTypePlumber; +extern NSString *const kGMSPlaceTypePrimarySchool; +extern NSString *const kGMSPlaceTypePolice; +extern NSString *const kGMSPlaceTypePostOffice; +extern NSString *const kGMSPlaceTypeRealEstateAgency; +extern NSString *const kGMSPlaceTypeRestaurant; +extern NSString *const kGMSPlaceTypeRoofingContractor; +extern NSString *const kGMSPlaceTypeRvPark; +extern NSString *const kGMSPlaceTypeSchool; +extern NSString *const kGMSPlaceTypeSecondarySchool; +extern NSString *const kGMSPlaceTypeShoeStore; +extern NSString *const kGMSPlaceTypeShoppingMall; +extern NSString *const kGMSPlaceTypeSpa; +extern NSString *const kGMSPlaceTypeStadium; +extern NSString *const kGMSPlaceTypeStorage; +extern NSString *const kGMSPlaceTypeStore; +extern NSString *const kGMSPlaceTypeSubwayStation; +extern NSString *const kGMSPlaceTypeSynagogue; +extern NSString *const kGMSPlaceTypeTaxiStand; +extern NSString *const kGMSPlaceTypeTrainStation; +extern NSString *const kGMSPlaceTypeTravelAgency; +extern NSString *const kGMSPlaceTypeTransitStation; +extern NSString *const kGMSPlaceTypeTouristAttraction; +extern NSString *const kGMSPlaceTypeUniversity; +extern NSString *const kGMSPlaceTypeVeterinaryCare; +extern NSString *const kGMSPlaceTypeZoo; + +/** + * The constants for Table 2 additional types returned by the Places service. Complete list can be + * found at https://developers.google.com/places/documentation/supported_types. + * Note: The types below are not supported in the type filter of a place search. + */ +extern NSString *const kGMSPlaceTypeAdministrativeAreaLevel1; +extern NSString *const kGMSPlaceTypeAdministrativeAreaLevel2; +extern NSString *const kGMSPlaceTypeAdministrativeAreaLevel3; +extern NSString *const kGMSPlaceTypeAdministrativeAreaLevel4; +extern NSString *const kGMSPlaceTypeAdministrativeAreaLevel5; +extern NSString *const kGMSPlaceTypeColloquialArea; +extern NSString *const kGMSPlaceTypeCountry; +extern NSString *const kGMSPlaceTypeEstablishment; +extern NSString *const kGMSPlaceTypeFinance; +extern NSString *const kGMSPlaceTypeFloor; +extern NSString *const kGMSPlaceTypeFood; +extern NSString *const kGMSPlaceTypeGeneralContractor; +extern NSString *const kGMSPlaceTypeGeocode; +extern NSString *const kGMSPlaceTypeHealth; +extern NSString *const kGMSPlaceTypeIntersection; +extern NSString *const kGMSPlaceTypeLocality; +extern NSString *const kGMSPlaceTypeNaturalFeature; +extern NSString *const kGMSPlaceTypeNeighborhood; +extern NSString *const kGMSPlaceTypePlaceOfWorship; +extern NSString *const kGMSPlaceTypePointOfInterest; +extern NSString *const kGMSPlaceTypePolitical; +extern NSString *const kGMSPlaceTypePostBox; +extern NSString *const kGMSPlaceTypePostalCode; +extern NSString *const kGMSPlaceTypePostalCodePrefix; +extern NSString *const kGMSPlaceTypePostalCodeSuffix; +extern NSString *const kGMSPlaceTypePostalTown; +extern NSString *const kGMSPlaceTypePremise; +extern NSString *const kGMSPlaceTypeRoom; +extern NSString *const kGMSPlaceTypeRoute; +extern NSString *const kGMSPlaceTypeStreetAddress; +extern NSString *const kGMSPlaceTypeStreetNumber; +extern NSString *const kGMSPlaceTypeSublocality; +extern NSString *const kGMSPlaceTypeSublocalityLevel1; +extern NSString *const kGMSPlaceTypeSublocalityLevel2; +extern NSString *const kGMSPlaceTypeSublocalityLevel3; +extern NSString *const kGMSPlaceTypeSublocalityLevel4; +extern NSString *const kGMSPlaceTypeSublocalityLevel5; +extern NSString *const kGMSPlaceTypeSubpremise; +extern NSString *const kGMSPlaceTypeTownSquare; + +/**@}*/ diff --git a/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSPlacesClient.h b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSPlacesClient.h new file mode 100755 index 0000000..378c249 --- /dev/null +++ b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSPlacesClient.h @@ -0,0 +1,327 @@ +// +// GMSPlacesClient.h +// Google Places SDK for iOS +// +// Copyright 2016 Google Inc. +// +// Usage of this SDK is subject to the Google Maps/Google Earth APIs Terms of +// Service: https://developers.google.com/maps/terms +// + +#import +#import + +#import "GMSAutocompleteBoundsMode.h" +#import "GMSPlace.h" +#import "GMSPlaceFieldMask.h" +#import "GMSPlacesErrors.h" + +@class GMSAutocompleteFilter; +@class GMSAutocompletePrediction; +@class GMSAutocompleteSessionToken; +@class GMSPlaceLikelihood; +@class GMSPlaceLikelihoodList; +@class GMSPlacePhotoMetadata; +@class GMSPlacePhotoMetadataList; + + +NS_ASSUME_NONNULL_BEGIN + +/** + * Callback type for receiving place details lookups. If an error occurred, + * |result| will be nil and |error| will contain information about the error. + * @param result The |GMSPlace| that was returned. + * @param error The error that occurred, if any. + * + * @related GMSPlacesClient + */ +typedef void (^GMSPlaceResultCallback)(GMSPlace *_Nullable result, NSError *_Nullable error); + +/** + * Callback type for receiving place likelihood lists. If an error occurred, |likelihoodList| will + * be nil and |error| will contain information about the error. + * @param likelihoodList The list of place likelihoods. + * @param error The error that occurred, if any. + * + * @related GMSPlacesClient + */ +typedef void (^GMSPlaceLikelihoodListCallback)(GMSPlaceLikelihoodList *_Nullable likelihoodList, + NSError *_Nullable error); + +/** + * Callback type for receiving array of |GMSPlaceLikelihood|s. If an error occurred, the array will + * be nil and |error| will contain information about the error. + * + * @related GMSPlacesClient + */ +typedef void (^GMSPlaceLikelihoodsCallback)(NSArray *_Nullable likelihoods, + NSError *_Nullable error); + +/** + * Callback type for receiving autocompletion results. |results| is an array of + * GMSAutocompletePredictions representing candidate completions of the query. + * @param results An array of |GMSAutocompletePrediction|s. + * @param error The error that occurred, if any. + * + * @related GMSPlacesClient + */ +typedef void (^GMSAutocompletePredictionsCallback)( + NSArray *_Nullable results, NSError *_Nullable error); + +/** + * Callback type for receiving place photos results. If an error occurred, |photos| will be nil and + * |error| will contain information about the error. + * @param photos The result containing |GMSPlacePhotoMetadata| objects. + * @param error The error that occurred, if any. + * + * @related GMSPlacesClient + */ +typedef void (^GMSPlacePhotoMetadataResultCallback)(GMSPlacePhotoMetadataList *_Nullable photos, + NSError *_Nullable error); + +/** + * Callback type for receiving |UIImage| objects from a |GMSPlacePhotoMetadata| object. If an error + * occurred, |photo| will be nil and |error| will contain information about the error. + * @param photo The |UIImage| which was loaded. + * @param error The error that occurred, if any. + * + * @related GMSPlacesClient + */ +typedef void (^GMSPlacePhotoImageResultCallback)(UIImage *_Nullable photo, + NSError *_Nullable error); + +/** + * Main interface to the Places SDK. Used for searching and getting details about places. This class + * should be accessed through the [GMSPlacesClient sharedClient] method. + * + * GMSPlacesClient methods should only be called from the main thread. Calling these methods from + * another thread will result in an exception or undefined behavior. Unless otherwise specified, all + * callbacks will be invoked on the main thread. + */ +@interface GMSPlacesClient : NSObject + +/** + * Provides the shared instance of GMSPlacesClient for the Google Places SDK for iOS, creating it if + * necessary. + * + * If your application often uses methods of GMSPlacesClient it may want to hold onto this object + * directly, as otherwise your connection to Google may be restarted on a regular basis. + */ ++ (instancetype)sharedClient; + +/** + * Provides your API key to the Google Places SDK for iOS. This key is generated for your + * application via the Google APIs Console, and is paired with your application's bundle ID to + * identify it. This should be called by your application before using GMSPlacesClient. + * (e.g., in application:didFinishLaunchingWithOptions:). + * + * @return YES if the APIKey was successfully provided. + */ ++ (BOOL)provideAPIKey:(NSString *)key; + +/** + * Returns the open source software license information for the Google Places SDK for iOS. This + * information must be made available within your application. + */ ++ (NSString *)openSourceLicenseInfo; + +/** + * Returns the version for this release of the Google Places SDK for iOS.. For example, "1.0.0". + */ ++ (NSString *)SDKVersion; + +/** + * Returns the long version for this release of the Google Places SDK for iOS.. For example, "1.0.0 + * (102.1)". + */ ++ (NSString *)SDKLongVersion; + +/** + * Get details for a place. This method is non-blocking. + * @param placeID The place ID to lookup. + * @param callback The callback to invoke with the lookup result. + */ +- (void)lookUpPlaceID:(NSString *)placeID callback:(GMSPlaceResultCallback)callback; + +/** + * Gets the metadata for up to 10 photos associated with a place. + * + * Photos are sourced from a variety of locations, including business owners and photos contributed + * by Google+ users. In most cases, these photos can be used without attribution, or will have the + * required attribution included as a part of the image. However, you must use the |attributions| + * property in the response to retrieve any additional attributions required, and display those + * attributions in your application wherever you display the image. A maximum of 10 photos are + * returned. + * + * Multiple calls of this method will probably return the same photos each time. However, this is + * not guaranteed because the underlying data may have changed. + * + * This method performs a network lookup. + * + * @param placeID The place ID for which to lookup photos. + * @param callback The callback to invoke with the lookup result. + */ +- (void)lookUpPhotosForPlaceID:(NSString *)placeID + callback:(GMSPlacePhotoMetadataResultCallback)callback; + +/** + * Loads the image for a specific photo at its maximum size. + * + * Image data may be cached by the SDK. If the requested photo does not exist in the cache then a + * network lookup will be performed. + * + * @param photoMetadata The |GMSPlacePhotoMetadata| for which to load a |UIImage|. + * @param callback The callback to invoke with the loaded |UIImage|. + */ +- (void)loadPlacePhoto:(GMSPlacePhotoMetadata *)photoMetadata + callback:(GMSPlacePhotoImageResultCallback)callback; + +/** + * Loads the image for a specific photo, scaled to fit the given maximum dimensions. + * + * The image will be scaled to fit within the given dimensions while maintaining the aspect ratio of + * the original image. This scaling is performed server-side. + * + * If the scale parameter is not 1.0 maxSize will be multiplied by this value and the returned + * |UIImage| will be set to have the specified scale. This parameter should be set to the screen + * scale if you are loading images for display on screen. + * + * Image data may be cached by the SDK. If the requested photo does not exist in the cache then a + * network lookup will be performed. + * + * NOTE: After applying the scale factor the dimensions in maxSize will be rounded up to the nearest + * integer before use. If an image is requested which is larger than the maximum size available a + * smaller image may be returned. + * + * @param photoMetadata The |GMSPlacePhotoMetadata| for which to load a |UIImage|. + * @param maxSize The maximum size of the image. + * @param scale The scale to load the image at. + * @param callback The callback to invoke with the loaded |UIImage|. + */ +- (void)loadPlacePhoto:(GMSPlacePhotoMetadata *)photoMetadata + constrainedToSize:(CGSize)maxSize + scale:(CGFloat)scale + callback:(GMSPlacePhotoImageResultCallback)callback; + +/** + * Returns an estimate of the place where the device is currently known to be located. + * + * Generates a place likelihood list based on the device's last estimated location. The supplied + * callback will be invoked with this likelihood list upon success and an NSError upon an error. + * + * NOTE: This method requires that your app has permission to access the current device location. + * Before calling this make sure to request access to the users location using [CLLocationManager + * requestWhenInUseAuthorization] or [CLLocationManager requestAlwaysAuthorization]. If you do call + * this method and your app does not have the correct authorization status, the callback will be + * called with an error. + * + * @param callback The callback to invoke with the place likelihood list. + */ +- (void)currentPlaceWithCallback:(GMSPlaceLikelihoodListCallback)callback; + +/** + * Autocompletes a given text query. Results may optionally be biased towards a certain location. + * + * The supplied callback will be invoked with an array of autocompletion predictions upon success + * and an NSError upon an error. + * + * @param query The partial text to autocomplete. + * @param bounds The bounds used to bias the results. This is not a hard restrict - places may still + * be returned outside of these bounds. This parameter may be nil. + * @param filter The filter to apply to the results. This parameter may be nil. + * @param callback The callback to invoke with the predictions. + */ +- (void)autocompleteQuery:(NSString *)query + bounds:(nullable GMSCoordinateBounds *)bounds + filter:(nullable GMSAutocompleteFilter *)filter + callback:(GMSAutocompletePredictionsCallback)callback; + +/** + * Autocompletes a given text query. Results may optionally be biased towards a certain location, + * or restricted to an area. + * + * The supplied callback will be invoked with an array of autocompletion predictions upon success + * and an NSError upon an error. + * + * @param query The partial text to autocomplete. + * @param bounds The bounds used to bias or restrict the results. Whether this biases or restricts + * is determined by the value of the |boundsMode| parameter. This parameter may be + * nil. + * @param boundsMode How to treat the |bounds| parameter. Has no effect if |bounds| is nil. + * @param filter The filter to apply to the results. This parameter may be nil. + * @param callback The callback to invoke with the predictions. + */ +- (void)autocompleteQuery:(NSString *)query + bounds:(nullable GMSCoordinateBounds *)bounds + boundsMode:(GMSAutocompleteBoundsMode)boundsMode + filter:(nullable GMSAutocompleteFilter *)filter + callback:(GMSAutocompletePredictionsCallback)callback; + +/** + * Find Autocomplete predictions from text query. Results may optionally be biased towards a + * certain location or restricted to an area. This method is non-blocking. + * + * The supplied callback will be invoked with an array of autocompletion predictions upon success + * and an NSError upon an error. + * + * @param query The partial text to autocomplete. + * @param bounds The bounds used to bias or restrict the results. Whether this biases or restricts + * is determined by the value of the |boundsMode| parameter. This parameter may be + * nil. + * @param boundsMode How to treat the |bounds| parameter. Has no effect if |bounds| is nil. + * @param filter The filter to apply to the results. This parameter may be nil. + * @param sessionToken The |GMSAutocompleteSessionToken| to associate request to a billing session. + * @param callback The callback to invoke with the predictions. + */ +- (void)findAutocompletePredictionsFromQuery:(NSString *)query + bounds:(nullable GMSCoordinateBounds *)bounds + boundsMode:(GMSAutocompleteBoundsMode)boundsMode + filter:(nullable GMSAutocompleteFilter *)filter + sessionToken:(nullable GMSAutocompleteSessionToken *)sessionToken + callback:(GMSAutocompletePredictionsCallback)callback; + +/** + * Find Autocomplete predictions from text query. Results may optionally be biased towards a + * certain location or restricted to an area. This method is non-blocking. + * + * The supplied callback will be invoked with an array of autocompletion predictions upon success + * and an NSError upon an error. + * + * @param query The partial text to autocomplete. + * @param filter The filter to apply to the results. This parameter may be nil. + * @param sessionToken The |GMSAutocompleteSessionToken| to associate request to a billing session. + * @param callback The callback to invoke with the predictions. + */ +- (void)findAutocompletePredictionsFromQuery:(NSString *)query + filter:(nullable GMSAutocompleteFilter *)filter + sessionToken:(nullable GMSAutocompleteSessionToken *)sessionToken + callback:(GMSAutocompletePredictionsCallback)callback; + +/** + * Fetch details for a place. This method is non-blocking. + * @param placeID The place ID to lookup. + * @param placeFields The individual place fields requested for the place objects in the list. + * @param sessionToken The |GMSAutocompleteSessionToken| to associate request to a billing session. + * @param callback The callback to invoke with the lookup result. + */ +- (void)fetchPlaceFromPlaceID:(NSString *)placeID + placeFields:(GMSPlaceField)placeFields + sessionToken:(nullable GMSAutocompleteSessionToken *)sessionToken + callback:(GMSPlaceResultCallback)callback; + +/** + * Find place likelihoods using the user's current location. This method is non-blocking. + * + * The supplied callback will be invoked with an array of places with likelihood scores upon success + * and an NSError upon an error. + * + * @param placeFields The individual place fields requested for the place objects in the list. + * @param callback The callback to invoke with place likelihoods. + */ +- (void)findPlaceLikelihoodsFromCurrentLocationWithPlaceFields:(GMSPlaceField)placeFields + callback: + (GMSPlaceLikelihoodsCallback)callback; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSPlacesErrors.h b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSPlacesErrors.h new file mode 100755 index 0000000..5b0c17c --- /dev/null +++ b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSPlacesErrors.h @@ -0,0 +1,119 @@ +// +// GMSPlacesErrors.h +// Google Places SDK for iOS +// +// Copyright 2016 Google Inc. +// +// Usage of this SDK is subject to the Google Maps/Google Earth APIs Terms of +// Service: https://developers.google.com/maps/terms +// + +/** + * \defgroup PlacesErrors GMSPlacesErrors + * @{ + */ + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** + * Error domain used for Places SDK errors. + */ +extern NSString *const kGMSPlacesErrorDomain; + +/** + * Error codes for |kGMSPlacesErrorDomain|. + */ +typedef NS_ENUM(NSInteger, GMSPlacesErrorCode) { + /** + * Something went wrong with the connection to the Places API server. + */ + kGMSPlacesNetworkError = -1, + /** + * The Places API server returned a response that we couldn't understand. + *

+ * If you believe this error represents a bug, please file a report using the instructions on our + * community and support page. + */ + kGMSPlacesServerError = -2, + /** + * An internal error occurred in the Places SDK library. + *

+ * If you believe this error represents a bug, please file a report using the instructions on our + * community and support page. + */ + kGMSPlacesInternalError = -3, + /** + * Operation failed due to an invalid (malformed or missing) API key. + *

+ * See the developer's guide + * for information on creating and using an API key. + */ + kGMSPlacesKeyInvalid = -4, + /** + * Operation failed due to an expired API key. + *

+ * See the developer's guide + * for information on creating and using an API key. + */ + kGMSPlacesKeyExpired = -5, + /** + * Operation failed due to exceeding the quota usage limit. + *

+ * See the usage limits guide + * for information on usage limits and how to request a higher limit. + */ + kGMSPlacesUsageLimitExceeded = -6, + /** + * Operation failed due to exceeding the usage rate limit for the API key. + *

+ * This status code shouldn't be returned during normal usage of the API. It relates to usage of + * the API that far exceeds normal request levels. See the usage limits guide for more + * information. + */ + kGMSPlacesRateLimitExceeded = -7, + /** + * Operation failed due to exceeding the per-device usage rate limit. + *

+ * This status code shouldn't be returned during normal usage of the API. It relates to usage of + * the API that far exceeds normal request levels. See the usage limits guide for more + * information. + */ + kGMSPlacesDeviceRateLimitExceeded = -8, + /** + * The Places API service for iOS is not enabled. + *

+ * See the developer's guide + * to learn how to set up the Places SDK for iOS or the + * migration guide + * if you are migrating from an earlier version. + */ + kGMSPlacesAccessNotConfigured = -9, + /** + * The application's bundle identifier does not match one of the allowed iOS applications for the + * API key. + *

+ * See the developer's guide + * for how to configure bundle restrictions on API keys. + */ + kGMSPlacesIncorrectBundleIdentifier = -10, + /** + * The Places SDK could not find the user's location. This may be because the user has not allowed + * the application to access location information. + */ + kGMSPlacesLocationError = -11, + /** + * The Places SDK could not process the invalid request. + *

+ * If you believe this error represents a bug, please file a report using the instructions on our + * community and support page. + */ + kGMSPlacesInvalidRequest = -12 +}; + +NS_ASSUME_NONNULL_END + +/**@}*/ diff --git a/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSPlusCode.h b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSPlusCode.h new file mode 100755 index 0000000..76e80fa --- /dev/null +++ b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GMSPlusCode.h @@ -0,0 +1,29 @@ +// +// GMSPlusCode.h +// Google Places SDK for iOS +// +// Copyright 2018 Google Inc. +// +// Usage of this SDK is subject to the Google Maps/Google Earth APIs Terms of +// Service: https://developers.google.com/maps/terms +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** + * A class containing the Plus codes representation for a location. + * See https://plus.codes/ for more details. + */ +@interface GMSPlusCode : NSObject + +/** Geo plus code, e.g. "8FVC9G8F+5W" */ +@property(nonatomic, readonly, copy) NSString *globalCode; + +/** Compound plus code, e.g. "9G8F+5W Zurich, Switzerland" */ +@property(nullable, nonatomic, readonly, copy) NSString *compoundCode; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GooglePlaces.h b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GooglePlaces.h new file mode 100755 index 0000000..c635b44 --- /dev/null +++ b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Headers/GooglePlaces.h @@ -0,0 +1,22 @@ +#import "GMSAutocompleteBoundsMode.h" +#import "GMSAutocompleteFetcher.h" +#import "GMSAutocompleteFilter.h" +#import "GMSAutocompleteMatchFragment.h" +#import "GMSAutocompletePrediction.h" +#import "GMSAutocompleteResultsViewController.h" +#import "GMSAutocompleteSessionToken.h" +#import "GMSAutocompleteTableDataSource.h" +#import "GMSAutocompleteViewController.h" +#import "GMSAddressComponent.h" +#import "GMSOpeningHours.h" +#import "GMSPlace.h" +#import "GMSPlaceFieldMask.h" +#import "GMSPlaceLikelihood.h" +#import "GMSPlaceLikelihoodList.h" +#import "GMSPlaceLocationOptions.h" +#import "GMSPlacePhotoMetadata.h" +#import "GMSPlacePhotoMetadataList.h" +#import "GMSPlaceTypes.h" +#import "GMSPlacesClient.h" +#import "GMSPlacesErrors.h" +#import "GMSPlusCode.h" diff --git a/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Modules/module.modulemap b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Modules/module.modulemap new file mode 100755 index 0000000..2e69b08 --- /dev/null +++ b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Modules/module.modulemap @@ -0,0 +1,17 @@ +framework module GooglePlaces { + umbrella header "GooglePlaces.h" + export * + module * { export * } + link "c++" + link "z" + link framework "CoreData" + link framework "CoreFoundation" + link framework "CoreGraphics" + link framework "CoreLocation" + link framework "CoreText" + link framework "Foundation" + link framework "QuartzCore" + link framework "Security" + link framework "SystemConfiguration" + link framework "UIKit" +} diff --git a/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/Info.plist b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/Info.plist new file mode 100755 index 0000000..775e226 Binary files /dev/null and b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/Info.plist differ diff --git a/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/ar.lproj/GooglePlaces.strings b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/ar.lproj/GooglePlaces.strings new file mode 100755 index 0000000..84e922e Binary files /dev/null and b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/ar.lproj/GooglePlaces.strings differ diff --git a/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/build-with-google-black.png b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/build-with-google-black.png new file mode 100755 index 0000000..0cc45fc Binary files /dev/null and b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/build-with-google-black.png differ diff --git a/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/build-with-google-black@2x.png b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/build-with-google-black@2x.png new file mode 100755 index 0000000..71f1c8e Binary files /dev/null and b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/build-with-google-black@2x.png differ diff --git a/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/build-with-google-black@3x.png b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/build-with-google-black@3x.png new file mode 100755 index 0000000..6b8b9a6 Binary files /dev/null and b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/build-with-google-black@3x.png differ diff --git a/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/build-with-google-white.png b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/build-with-google-white.png new file mode 100755 index 0000000..7e67463 Binary files /dev/null and b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/build-with-google-white.png differ diff --git a/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/build-with-google-white@2x.png b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/build-with-google-white@2x.png new file mode 100755 index 0000000..50c3ace Binary files /dev/null and b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/build-with-google-white@2x.png differ diff --git a/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/build-with-google-white@3x.png b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/build-with-google-white@3x.png new file mode 100755 index 0000000..bcafb09 Binary files /dev/null and b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/build-with-google-white@3x.png differ diff --git a/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/ca.lproj/GooglePlaces.strings b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/ca.lproj/GooglePlaces.strings new file mode 100755 index 0000000..d8eaa9d Binary files /dev/null and b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/ca.lproj/GooglePlaces.strings differ diff --git a/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/cs.lproj/GooglePlaces.strings b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/cs.lproj/GooglePlaces.strings new file mode 100755 index 0000000..3640071 Binary files /dev/null and b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/cs.lproj/GooglePlaces.strings differ diff --git a/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/da.lproj/GooglePlaces.strings b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/da.lproj/GooglePlaces.strings new file mode 100755 index 0000000..9599d8e Binary files /dev/null and b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/da.lproj/GooglePlaces.strings differ diff --git a/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/de.lproj/GooglePlaces.strings b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/de.lproj/GooglePlaces.strings new file mode 100755 index 0000000..d3bfc38 Binary files /dev/null and b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/de.lproj/GooglePlaces.strings differ diff --git a/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/el.lproj/GooglePlaces.strings b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/el.lproj/GooglePlaces.strings new file mode 100755 index 0000000..074c670 Binary files /dev/null and b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/el.lproj/GooglePlaces.strings differ diff --git a/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/en.lproj/GooglePlaces.strings b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/en.lproj/GooglePlaces.strings new file mode 100755 index 0000000..88b3692 Binary files /dev/null and b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/en.lproj/GooglePlaces.strings differ diff --git a/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/en_AU.lproj/GooglePlaces.strings b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/en_AU.lproj/GooglePlaces.strings new file mode 100755 index 0000000..7709a87 Binary files /dev/null and b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/en_AU.lproj/GooglePlaces.strings differ diff --git a/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/en_GB.lproj/GooglePlaces.strings b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/en_GB.lproj/GooglePlaces.strings new file mode 100755 index 0000000..7709a87 Binary files /dev/null and b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/en_GB.lproj/GooglePlaces.strings differ diff --git a/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/en_IN.lproj/GooglePlaces.strings b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/en_IN.lproj/GooglePlaces.strings new file mode 100755 index 0000000..f7555c9 Binary files /dev/null and b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/en_IN.lproj/GooglePlaces.strings differ diff --git a/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/es.lproj/GooglePlaces.strings b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/es.lproj/GooglePlaces.strings new file mode 100755 index 0000000..34cc70c Binary files /dev/null and b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/es.lproj/GooglePlaces.strings differ diff --git a/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/es_419.lproj/GooglePlaces.strings b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/es_419.lproj/GooglePlaces.strings new file mode 100755 index 0000000..57d504e Binary files /dev/null and b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/es_419.lproj/GooglePlaces.strings differ diff --git a/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/es_MX.lproj/GooglePlaces.strings b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/es_MX.lproj/GooglePlaces.strings new file mode 100755 index 0000000..57d504e Binary files /dev/null and b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/es_MX.lproj/GooglePlaces.strings differ diff --git a/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/fi.lproj/GooglePlaces.strings b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/fi.lproj/GooglePlaces.strings new file mode 100755 index 0000000..095564f Binary files /dev/null and b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/fi.lproj/GooglePlaces.strings differ diff --git a/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/fr.lproj/GooglePlaces.strings b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/fr.lproj/GooglePlaces.strings new file mode 100755 index 0000000..af51206 Binary files /dev/null and b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/fr.lproj/GooglePlaces.strings differ diff --git a/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/fr_CA.lproj/GooglePlaces.strings b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/fr_CA.lproj/GooglePlaces.strings new file mode 100755 index 0000000..5c56634 Binary files /dev/null and b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/fr_CA.lproj/GooglePlaces.strings differ diff --git a/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/he.lproj/GooglePlaces.strings b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/he.lproj/GooglePlaces.strings new file mode 100755 index 0000000..c716cc6 Binary files /dev/null and b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/he.lproj/GooglePlaces.strings differ diff --git a/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/hi.lproj/GooglePlaces.strings b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/hi.lproj/GooglePlaces.strings new file mode 100755 index 0000000..47d9d90 Binary files /dev/null and b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/hi.lproj/GooglePlaces.strings differ diff --git a/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/hr.lproj/GooglePlaces.strings b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/hr.lproj/GooglePlaces.strings new file mode 100755 index 0000000..469f18d Binary files /dev/null and b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/hr.lproj/GooglePlaces.strings differ diff --git a/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/hu.lproj/GooglePlaces.strings b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/hu.lproj/GooglePlaces.strings new file mode 100755 index 0000000..2ca04ae Binary files /dev/null and b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/hu.lproj/GooglePlaces.strings differ diff --git a/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/id.lproj/GooglePlaces.strings b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/id.lproj/GooglePlaces.strings new file mode 100755 index 0000000..601429a Binary files /dev/null and b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/id.lproj/GooglePlaces.strings differ diff --git a/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/it.lproj/GooglePlaces.strings b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/it.lproj/GooglePlaces.strings new file mode 100755 index 0000000..fb73275 Binary files /dev/null and b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/it.lproj/GooglePlaces.strings differ diff --git a/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/ja.lproj/GooglePlaces.strings b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/ja.lproj/GooglePlaces.strings new file mode 100755 index 0000000..7271741 Binary files /dev/null and b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/ja.lproj/GooglePlaces.strings differ diff --git a/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/ko.lproj/GooglePlaces.strings b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/ko.lproj/GooglePlaces.strings new file mode 100755 index 0000000..b3b0236 Binary files /dev/null and b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/ko.lproj/GooglePlaces.strings differ diff --git a/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/lt.lproj/GooglePlaces.strings b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/lt.lproj/GooglePlaces.strings new file mode 100755 index 0000000..717f6e4 Binary files /dev/null and b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/lt.lproj/GooglePlaces.strings differ diff --git a/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/lv.lproj/GooglePlaces.strings b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/lv.lproj/GooglePlaces.strings new file mode 100755 index 0000000..7340d36 Binary files /dev/null and b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/lv.lproj/GooglePlaces.strings differ diff --git a/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/ms.lproj/GooglePlaces.strings b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/ms.lproj/GooglePlaces.strings new file mode 100755 index 0000000..b6061bf Binary files /dev/null and b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/ms.lproj/GooglePlaces.strings differ diff --git a/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/nb.lproj/GooglePlaces.strings b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/nb.lproj/GooglePlaces.strings new file mode 100755 index 0000000..e16393e Binary files /dev/null and b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/nb.lproj/GooglePlaces.strings differ diff --git a/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/nl.lproj/GooglePlaces.strings b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/nl.lproj/GooglePlaces.strings new file mode 100755 index 0000000..da8766b Binary files /dev/null and b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/nl.lproj/GooglePlaces.strings differ diff --git a/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/oss_licenses_places.txt.gz b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/oss_licenses_places.txt.gz new file mode 100755 index 0000000..80ed2c3 Binary files /dev/null and b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/oss_licenses_places.txt.gz differ diff --git a/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/pl.lproj/GooglePlaces.strings b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/pl.lproj/GooglePlaces.strings new file mode 100755 index 0000000..2f515a9 Binary files /dev/null and b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/pl.lproj/GooglePlaces.strings differ diff --git a/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/pt.lproj/GooglePlaces.strings b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/pt.lproj/GooglePlaces.strings new file mode 100755 index 0000000..709e17f Binary files /dev/null and b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/pt.lproj/GooglePlaces.strings differ diff --git a/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/pt_BR.lproj/GooglePlaces.strings b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/pt_BR.lproj/GooglePlaces.strings new file mode 100755 index 0000000..709e17f Binary files /dev/null and b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/pt_BR.lproj/GooglePlaces.strings differ diff --git a/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/pt_PT.lproj/GooglePlaces.strings b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/pt_PT.lproj/GooglePlaces.strings new file mode 100755 index 0000000..9f243f1 Binary files /dev/null and b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/pt_PT.lproj/GooglePlaces.strings differ diff --git a/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/ro.lproj/GooglePlaces.strings b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/ro.lproj/GooglePlaces.strings new file mode 100755 index 0000000..9e27d58 Binary files /dev/null and b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/ro.lproj/GooglePlaces.strings differ diff --git a/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/ru.lproj/GooglePlaces.strings b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/ru.lproj/GooglePlaces.strings new file mode 100755 index 0000000..3166e64 Binary files /dev/null and b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/ru.lproj/GooglePlaces.strings differ diff --git a/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/sad_cloud.png b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/sad_cloud.png new file mode 100755 index 0000000..1c30882 Binary files /dev/null and b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/sad_cloud.png differ diff --git a/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/sad_cloud@2x.png b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/sad_cloud@2x.png new file mode 100755 index 0000000..e199181 Binary files /dev/null and b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/sad_cloud@2x.png differ diff --git a/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/sad_cloud@3x.png b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/sad_cloud@3x.png new file mode 100755 index 0000000..ce3e035 Binary files /dev/null and b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/sad_cloud@3x.png differ diff --git a/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/sad_cloud_dark.png b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/sad_cloud_dark.png new file mode 100755 index 0000000..a16f5a2 Binary files /dev/null and b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/sad_cloud_dark.png differ diff --git a/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/sad_cloud_dark@2x.png b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/sad_cloud_dark@2x.png new file mode 100755 index 0000000..e61cabd Binary files /dev/null and b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/sad_cloud_dark@2x.png differ diff --git a/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/sad_cloud_dark@3x.png b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/sad_cloud_dark@3x.png new file mode 100755 index 0000000..90d2380 Binary files /dev/null and b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/sad_cloud_dark@3x.png differ diff --git a/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/sk.lproj/GooglePlaces.strings b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/sk.lproj/GooglePlaces.strings new file mode 100755 index 0000000..3e2ab13 Binary files /dev/null and b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/sk.lproj/GooglePlaces.strings differ diff --git a/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/sv.lproj/GooglePlaces.strings b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/sv.lproj/GooglePlaces.strings new file mode 100755 index 0000000..c1a2393 Binary files /dev/null and b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/sv.lproj/GooglePlaces.strings differ diff --git a/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/th.lproj/GooglePlaces.strings b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/th.lproj/GooglePlaces.strings new file mode 100755 index 0000000..15d9a4f Binary files /dev/null and b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/th.lproj/GooglePlaces.strings differ diff --git a/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/tr.lproj/GooglePlaces.strings b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/tr.lproj/GooglePlaces.strings new file mode 100755 index 0000000..42fc423 Binary files /dev/null and b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/tr.lproj/GooglePlaces.strings differ diff --git a/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/uk.lproj/GooglePlaces.strings b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/uk.lproj/GooglePlaces.strings new file mode 100755 index 0000000..d39f99a Binary files /dev/null and b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/uk.lproj/GooglePlaces.strings differ diff --git a/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/vi.lproj/GooglePlaces.strings b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/vi.lproj/GooglePlaces.strings new file mode 100755 index 0000000..c88d7ab Binary files /dev/null and b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/vi.lproj/GooglePlaces.strings differ diff --git a/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/zh_CN.lproj/GooglePlaces.strings b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/zh_CN.lproj/GooglePlaces.strings new file mode 100755 index 0000000..290001e Binary files /dev/null and b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/zh_CN.lproj/GooglePlaces.strings differ diff --git a/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/zh_HK.lproj/GooglePlaces.strings b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/zh_HK.lproj/GooglePlaces.strings new file mode 100755 index 0000000..d3686c6 Binary files /dev/null and b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/zh_HK.lproj/GooglePlaces.strings differ diff --git a/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/zh_TW.lproj/GooglePlaces.strings b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/zh_TW.lproj/GooglePlaces.strings new file mode 100755 index 0000000..f749ef8 Binary files /dev/null and b/Pods/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle/zh_TW.lproj/GooglePlaces.strings differ diff --git a/Pods/GooglePlaces/README.md b/Pods/GooglePlaces/README.md new file mode 100755 index 0000000..d2dc94a --- /dev/null +++ b/Pods/GooglePlaces/README.md @@ -0,0 +1,92 @@ +# Google Places API for iOS + +**NOTE:** This pod is the official pod for the Google Places API for iOS. +Previously this pod was used by another developer, his content has been moved to +[Swift Google Maps API](https://github.com/honghaoz/Swift-Google-Maps-API) on +GitHub. + +This pod contains the Google Places API for iOS, supporting both Objective C and +Swift. + +Use the [Google Places API for iOS] +(https://developers.google.com/places/ios-sdk/) for exciting features based +on the user's location and Google's Places database. You can enable users to +add a place, autocomplete place names, use a place picker widget, identify +the user's current place or retrieve full details and photos of a place. + +The Google Places API for iOS is distributed as a stand alone Pod. This Pod +contains all the Google Places API for iOS functionality which does not require +a map. + +# Getting Started + +* *Guides*: Read our [Getting Started guides] + (https://developers.google.com/places/ios-sdk/start). +* *Code samples*: In order to try out our demo app, run + + ``` + $ pod try GooglePlaces + ``` + + and follow the instructions on our [developer pages] + (https://developers.google.com/places/ios-api/code-samples). + +* *Support*: Find support from various channels and communities. + + * Support pages for [Google Places API for iOS] + (https://developers.google.com/places/support). + * Stack Overflow, using the [google-places-api] + (https://stackoverflow.com/questions/tagged/google-places-api) tag. + +* *Report issues*: Use our issue tracker to [file a bug] + (https://code.google.com/p/gmaps-api-issues/issues/entry?template=Places%20API%20for%20iOS%20-%20Bug) + or a [feature request] + (https://code.google.com/p/gmaps-api-issues/issues/entry?template=Places%20API%20for%20iOS%20-%20Feature%20Request) + +# Installation + +To integrate Google Places API for iOS into your Xcode project using CocoaPods, +specify it in your `Podfile`: + +``` +source 'https://github.com/CocoaPods/Specs.git' +platform :ios, '9.0' +target 'YOUR_APPLICATION_TARGET_NAME_HERE' do + pod 'GooglePlaces' +end +``` + +Then, run the following command: + +``` +$ pod install +``` + +Before you can start using the API, you have to activate it in the [Google +Developer Console](https://console.developers.google.com/) and integrate the +respective API key in your project. For detailed installation instructions, +visit Google's Getting Started Guides for the [Google Places API for iOS] +(https://developers.google.com/places/ios-api/start). + +# Migration from version 1 + +If you are using the Google Places API for iOS as part of the Google Maps SDK +for iOS version 1 please check the [migration guide](https://developers.google.com/places/migrate-to-v2) +for more information on upgrading your project. + +# License and Terms of Service + +By using the Google Places API for iOS, you accept Google's Terms of +Service and Policies. Pay attention particularly to the following aspects: + +* Depending on your app and use case, you may be required to display + attribution. Read more about [attribution requirements] + (https://developers.google.com/places/ios-api/attributions). +* Your API usage is subject to quota limitations. Read more about [usage + limits](https://developers.google.com/places/ios-api/usage). +* The [Terms of Service](https://developers.google.com/maps/terms) are a + comprehensive description of the legal contract that you enter with Google + by using the Google Places API for iOS. You may want to pay special + attention to [section 10] + (https://developers.google.com/maps/terms#10-license-restrictions), as it + talks in detail about what you can do with the API, and what you can't. diff --git a/Pods/Manifest.lock b/Pods/Manifest.lock new file mode 100644 index 0000000..8c4550a --- /dev/null +++ b/Pods/Manifest.lock @@ -0,0 +1,48 @@ +PODS: + - Alamofire (5.0.2) + - Google-Maps-iOS-Utils (3.1.1): + - Google-Maps-iOS-Utils/Clustering (= 3.1.1) + - Google-Maps-iOS-Utils/Geometry (= 3.1.1) + - Google-Maps-iOS-Utils/Heatmap (= 3.1.1) + - Google-Maps-iOS-Utils/QuadTree (= 3.1.1) + - GoogleMaps + - Google-Maps-iOS-Utils/Clustering (3.1.1): + - Google-Maps-iOS-Utils/QuadTree + - GoogleMaps + - Google-Maps-iOS-Utils/Geometry (3.1.1): + - GoogleMaps + - Google-Maps-iOS-Utils/Heatmap (3.1.1): + - Google-Maps-iOS-Utils/QuadTree + - GoogleMaps + - Google-Maps-iOS-Utils/QuadTree (3.1.1): + - GoogleMaps + - GoogleMaps (3.8.0): + - GoogleMaps/Maps (= 3.8.0) + - GoogleMaps/Base (3.8.0) + - GoogleMaps/Maps (3.8.0): + - GoogleMaps/Base + - GooglePlaces (3.8.0): + - GoogleMaps/Base (= 3.8.0) + +DEPENDENCIES: + - Alamofire (~> 5.0) + - Google-Maps-iOS-Utils + - GoogleMaps + - GooglePlaces + +SPEC REPOS: + trunk: + - Alamofire + - Google-Maps-iOS-Utils + - GoogleMaps + - GooglePlaces + +SPEC CHECKSUMS: + Alamofire: 3ba7a4db18b4f62c4a1c0e1cb39d7f3d52e10ada + Google-Maps-iOS-Utils: f5d6ea55799d2ef47c113e1351b48e21cddd593c + GoogleMaps: 7c8d66d70e4e8c300f43a7219d8fdaad7b325a9a + GooglePlaces: d5f70c3e9e427964fdeca1301a665d276ccd8754 + +PODFILE CHECKSUM: 191e0d5d3ef49627c13ab8be970e982c2afabb4d + +COCOAPODS: 1.9.0 diff --git a/Pods/Pods.xcodeproj/project.pbxproj b/Pods/Pods.xcodeproj/project.pbxproj new file mode 100644 index 0000000..98ad998 --- /dev/null +++ b/Pods/Pods.xcodeproj/project.pbxproj @@ -0,0 +1,1488 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 51; + objects = { + +/* Begin PBXAggregateTarget section */ + 0C1885900810601510E0C632060FAF26 /* GooglePlaces */ = { + isa = PBXAggregateTarget; + buildConfigurationList = 2FC2AC47FDB0310285CE777F18CD1532 /* Build configuration list for PBXAggregateTarget "GooglePlaces" */; + buildPhases = ( + ); + dependencies = ( + D42315111F400C0605ACCD6B5CAF2178 /* PBXTargetDependency */, + ); + name = GooglePlaces; + }; + E5B4BBC6DD552AC8943C7E22772FC1D3 /* GoogleMaps */ = { + isa = PBXAggregateTarget; + buildConfigurationList = 72FDCC61040C0C672F23959415CAEFC6 /* Build configuration list for PBXAggregateTarget "GoogleMaps" */; + buildPhases = ( + ); + dependencies = ( + ); + name = GoogleMaps; + }; +/* End PBXAggregateTarget section */ + +/* Begin PBXBuildFile section */ + 00FA97D56201027AEB1C7692A2C3CF8B /* Alamofire-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 824D9B018A25B4CD36B515A21A2C66BB /* Alamofire-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 0265F00E8DBCD6B925C23CE1DEB9F036 /* GMULineString.h in Headers */ = {isa = PBXBuildFile; fileRef = 22C36638C405F9D2D7B0BD46E3F0967B /* GMULineString.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 0419772A87B16DB7DCF405A9E77D671F /* Protector.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8F5BE0412AD8EF93DC5EA8B7C08818B0 /* Protector.swift */; }; + 0607CCFD3183E86980426E8A34DCFC9A /* GMUStyle.h in Headers */ = {isa = PBXBuildFile; fileRef = E3FAAD7D6792C3619859BD3EF0EB5065 /* GMUStyle.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 06507A26118BA5ACFBBC8C225776920E /* Validation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 826C4BB1BCAA99C2C306EF73D3214A14 /* Validation.swift */; }; + 09A0B7185BD8E31909034EE2C1C1508F /* GMUGeometryRenderer.m in Sources */ = {isa = PBXBuildFile; fileRef = 7910345EFA02EB980119663FC0118C4C /* GMUGeometryRenderer.m */; }; + 0AE06C3AEA6CA45342BA703230ABD2CB /* CachedResponseHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6CDCEAB74DC761D56282BE32749FF46 /* CachedResponseHandler.swift */; }; + 0CC43FF0E31AA320ACFEB0FE6239DF34 /* ServerTrustEvaluation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1836B043CF6004E39E9650A7B06956F5 /* ServerTrustEvaluation.swift */; }; + 0E6ED333181FF923562E02EEB3162308 /* GMUStyle.m in Sources */ = {isa = PBXBuildFile; fileRef = B8C52A0F8BF4BDF06044F78D2B3F1E49 /* GMUStyle.m */; }; + 0FDC1FEDB01554D88784CA2A88E6234F /* GMUStaticCluster.m in Sources */ = {isa = PBXBuildFile; fileRef = AB61C3E8DF4DC93D53DCE30BA373C8C5 /* GMUStaticCluster.m */; }; + 0FE9636CBBBDAF175DC388BB9BEC61A7 /* GMUCluster.h in Headers */ = {isa = PBXBuildFile; fileRef = C05A0AE31AD6283457EF7BE610CE933E /* GMUCluster.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 10B2DE879AEAE070ED8F6E4E88F58899 /* GMUGradient.h in Headers */ = {isa = PBXBuildFile; fileRef = C7D0B5F7FD1FF55198E20C93ADEF0817 /* GMUGradient.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1269CFA194EA8D7E42B863FA6D61C7B3 /* GMUPlacemark.m in Sources */ = {isa = PBXBuildFile; fileRef = 4177CDFC747A668317CB195FB640D892 /* GMUPlacemark.m */; }; + 13457FE4E607509A3B9527B0711033D5 /* ResponseSerialization.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC533C5422195A9B17AB377F7C4042AE /* ResponseSerialization.swift */; }; + 14AB7976E100075ADEA0AB1DB833E72D /* ParameterEncoding.swift in Sources */ = {isa = PBXBuildFile; fileRef = D412EA5D825FA653997D1B5DBCE37B33 /* ParameterEncoding.swift */; }; + 14FE485059B061EF889CD0D02CA93A6A /* GMUClusterManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 31CA5FBE4D19BCD460F60F8326C8C42E /* GMUClusterManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 17953A9CF2E354B3E69B9ABC2F367AD9 /* AFError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0470913171E5F8BD817636C2D90FE14D /* AFError.swift */; }; + 18CE1994C0ECC17289B2224647D0305A /* GMUPolygon.m in Sources */ = {isa = PBXBuildFile; fileRef = C138DBD8D9811B6538120A36C77D948A /* GMUPolygon.m */; }; + 1A093C56EACCA8D49A9F834349941C41 /* GMUWeightedLatLng.h in Headers */ = {isa = PBXBuildFile; fileRef = 53362E976B7BBF98339337AAC5476081 /* GMUWeightedLatLng.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1E054C4442B55910F53D959E27086AA5 /* GMUFeature.h in Headers */ = {isa = PBXBuildFile; fileRef = 56FD8C19D6F3A302E2625038C9FDF360 /* GMUFeature.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 21C693BBEAD272F3A1352D61B238B787 /* GMUGridBasedClusterAlgorithm.m in Sources */ = {isa = PBXBuildFile; fileRef = 931CF34C7A6EF9D2CA2359F7FAD0AE01 /* GMUGridBasedClusterAlgorithm.m */; }; + 236C125617A798ABF6398E3E5E819B88 /* GMUPair.h in Headers */ = {isa = PBXBuildFile; fileRef = 1668E8F00B2D02925EE62383D650BB05 /* GMUPair.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 28BC03E371CECCF48D59293D5EED60C9 /* GMUPolygon.h in Headers */ = {isa = PBXBuildFile; fileRef = 2D462C05421F4C51D12C1C12817DC01B /* GMUPolygon.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 2B83281CBC344D2DA68619D42B7F2DCD /* GMUDefaultClusterIconGenerator.h in Headers */ = {isa = PBXBuildFile; fileRef = 48685635464E4E04DBAD431275750780 /* GMUDefaultClusterIconGenerator.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 2C193D8A5157A1FF32BF061AA5AC0796 /* GMUStaticCluster.h in Headers */ = {isa = PBXBuildFile; fileRef = F073C76708B6A37E2692E32F685A99A9 /* GMUStaticCluster.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 2CA3A1FE2BC7A0724A55D9E3063BA0D7 /* GMUNonHierarchicalDistanceBasedAlgorithm.m in Sources */ = {isa = PBXBuildFile; fileRef = AE2CD1EE8FE2518E089A5C940F47599D /* GMUNonHierarchicalDistanceBasedAlgorithm.m */; }; + 339CA4289E532D19016FB4EF77A6C41C /* GMUGroundOverlay.m in Sources */ = {isa = PBXBuildFile; fileRef = 9C168E9290609458FCB33D00C6EA814E /* GMUGroundOverlay.m */; }; + 33AB7E44938A901376DA8FCE35EA7C20 /* GMUPlacemark.h in Headers */ = {isa = PBXBuildFile; fileRef = 4DF1345302BF7CE049A0F22CB711B71D /* GMUPlacemark.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3BD0A1ABCE3E5856D4073097218C1D93 /* Google-Maps-iOS-Utils-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 0692F53A6EB4E64A8F0FE7E1129B2E61 /* Google-Maps-iOS-Utils-dummy.m */; }; + 4082513A35C682F2193D002C80F72B79 /* Result+Alamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5BB1690EA0051C601CB7D7D7198F9AC /* Result+Alamofire.swift */; }; + 4094F4C3473CD6D05D3B7C091701028F /* GMUHeatmapTileLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 08F5141BBE5C8EF3D060F37257224FB7 /* GMUHeatmapTileLayer.m */; }; + 4246DDBC277DC9C7EF6A4E137E00E2CA /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 222DAEF0D819F359AFCFF3D4F927E8A7 /* Foundation.framework */; }; + 42CDB5C986C78BBC8E5C0185F746CABF /* SessionDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = F80A40E52D364F95EF6A9476D3FB6682 /* SessionDelegate.swift */; }; + 43D614C5D6D6C46426FF4528A67C03F5 /* GMUGeoJSONParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 765AD0E2CB2E5E9CBFB68F7D8D562B31 /* GMUGeoJSONParser.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 44127C4B989C9CC6A90D78B66A929A5E /* AlamofireExtended.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CB95C2770334A77D289104048523E68 /* AlamofireExtended.swift */; }; + 48D97BE7D5CAED273BD2341C239CC934 /* RequestTaskMap.swift in Sources */ = {isa = PBXBuildFile; fileRef = D64239F8542DB542A4627FC4BA91B238 /* RequestTaskMap.swift */; }; + 4C01D6E23408765A7B309D0937B17324 /* GMUWrappingDictionaryKey.h in Headers */ = {isa = PBXBuildFile; fileRef = 6945C8BFFFB511EDDF4B3C058B9E58C8 /* GMUWrappingDictionaryKey.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4C430238D42160E133406F54A8C80CA8 /* GMUGeometryRenderer+Testing.h in Headers */ = {isa = PBXBuildFile; fileRef = 085690281F76F4AC35EB3B37212FD173 /* GMUGeometryRenderer+Testing.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4D24D527232D2DB0DEEDD20FCA70E55B /* GMUGeometry.h in Headers */ = {isa = PBXBuildFile; fileRef = 5BFD333D9C6D2525A8529861D6CDCC93 /* GMUGeometry.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 52CCCA1CA7E24AF8D674AB8C52B38488 /* GMUGradient.m in Sources */ = {isa = PBXBuildFile; fileRef = F577EEA88330AB31532B57FE0698393E /* GMUGradient.m */; }; + 56EC8ED1535DAB987F3D2B71D4C05773 /* HTTPHeaders.swift in Sources */ = {isa = PBXBuildFile; fileRef = C58DFC323A1D00905391AC7CC1C60598 /* HTTPHeaders.swift */; }; + 58B40EDF31BCCA0D2F16E22363AD7C75 /* GMUDefaultClusterRenderer.m in Sources */ = {isa = PBXBuildFile; fileRef = 4808DD5BB696DAD4BA2A22F8ADAC7E39 /* GMUDefaultClusterRenderer.m */; }; + 5AE43A0662DE2ABCAAEE60EBBDBA3ED6 /* GMUStyleMap.m in Sources */ = {isa = PBXBuildFile; fileRef = 6C3A8D937D0D73F8D560DDE8A5D42202 /* GMUStyleMap.m */; }; + 5C4A0685B5A201436AB52EF25829B333 /* MultipartFormData.swift in Sources */ = {isa = PBXBuildFile; fileRef = F229A62EBE3DED272F8E4551ECF58469 /* MultipartFormData.swift */; }; + 5D12235D061AEE7459279AAF8C348DFE /* URLEncodedFormEncoder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 67A7465CF8BBBFBF5C96E86025BDA1EA /* URLEncodedFormEncoder.swift */; }; + 5D61C8ED0DDCC9F8B576B6514B19EE50 /* ParameterEncoder.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2C3F52CF83AD164811FA449AA5793AF /* ParameterEncoder.swift */; }; + 67223AB5F7E489AC8D5C44575511BD6E /* GMUStyleMap.h in Headers */ = {isa = PBXBuildFile; fileRef = 4570018A44C8420628B97C8DEB501A10 /* GMUStyleMap.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 6739BD83FE5790A56AC334EA10D63EF9 /* GMUDefaultClusterIconGenerator+Testing.h in Headers */ = {isa = PBXBuildFile; fileRef = 41E8DFD15F1E56043CC42AC3CEAD039E /* GMUDefaultClusterIconGenerator+Testing.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 69A7BAAF6FBD279510569C8F8AF0A772 /* GMUPoint.h in Headers */ = {isa = PBXBuildFile; fileRef = EEBF6A83C6193F2EBDCA896D5133EE42 /* GMUPoint.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 69ACE4EEE5A8C1C618B22CC1F7B8EF01 /* Session.swift in Sources */ = {isa = PBXBuildFile; fileRef = BAFF5178299081BDC9BAAA067092782E /* Session.swift */; }; + 6A16615AACC6395730C7590AEA5DDFC8 /* GMUKMLParser.m in Sources */ = {isa = PBXBuildFile; fileRef = C72BA217A2202A36B10845576046E34C /* GMUKMLParser.m */; }; + 6A22C46CB1EDE471794D9AB2AC10327F /* Request.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E4FAF897FD47617D04333B1EE232051 /* Request.swift */; }; + 70517C3BAC2D6614347DEAC15299EB84 /* URLConvertible+URLRequestConvertible.swift in Sources */ = {isa = PBXBuildFile; fileRef = AB523041AD37AE051E0E81DA5296D8CD /* URLConvertible+URLRequestConvertible.swift */; }; + 7740276C0ADB017D548E734AB862A001 /* GMUClusterItem.h in Headers */ = {isa = PBXBuildFile; fileRef = AD0212690AAC3E4ACE9A4AE674B30961 /* GMUClusterItem.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 7BB265CF4E1D5F26520C3E8B03FA7727 /* GMUPair.m in Sources */ = {isa = PBXBuildFile; fileRef = 40E0A7525CF243E5C54C64CB47065AF7 /* GMUPair.m */; }; + 7CF8362BA31492053F5CB165637AE117 /* NetworkReachabilityManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 39A6F352EE5C522B21C7190947EAA7EC /* NetworkReachabilityManager.swift */; }; + 841564F61C36BB1FC7022F2AF01D2C98 /* GQTPointQuadTree.h in Headers */ = {isa = PBXBuildFile; fileRef = 890078C2FF31BA357388E66C927421F5 /* GQTPointQuadTree.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 87363FB2633AB0CF7D61D77C278F36B5 /* GMUDefaultClusterRenderer.h in Headers */ = {isa = PBXBuildFile; fileRef = ED41FB255023CEA9D301935A7B7BF02A /* GMUDefaultClusterRenderer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 891446206B0D33D4C61DD328436ECCF7 /* GMUGeometryCollection.h in Headers */ = {isa = PBXBuildFile; fileRef = 9259849B5E110806A283B82FE6A64D26 /* GMUGeometryCollection.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8D47CC0F688062AF0CFC96EADE699720 /* GMUGeoJSONParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 7FFB2CF74C9E444F185C502BF7F038AF /* GMUGeoJSONParser.m */; }; + 907B13DB054C71D2258383B7BEABE0F5 /* GMUNonHierarchicalDistanceBasedAlgorithm.h in Headers */ = {isa = PBXBuildFile; fileRef = A3072F3163953FC4A9326F701684A1F7 /* GMUNonHierarchicalDistanceBasedAlgorithm.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9110B41B4A6381390E48CDC6C305A01F /* GMUHeatmapTileLayer.h in Headers */ = {isa = PBXBuildFile; fileRef = B8A988926B41DB9CCFA3A9E45D67647F /* GMUHeatmapTileLayer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 92811AC5CD9A5004116AE43C4E8FD955 /* OperationQueue+Alamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3FFFE6E4D57E64B966E312B8A19FEC2 /* OperationQueue+Alamofire.swift */; }; + 9282857403CCFC218BA78F92FD6FF4FF /* GMUGridBasedClusterAlgorithm.h in Headers */ = {isa = PBXBuildFile; fileRef = F9C37A351E75E0AED124AFBF47D09F6F /* GMUGridBasedClusterAlgorithm.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 94E033876210CFB80731D45265F4E935 /* GMUWeightedLatLng.m in Sources */ = {isa = PBXBuildFile; fileRef = AB9CF6C7F866F8824E089698965CAC44 /* GMUWeightedLatLng.m */; }; + 96D1E899BC7DD51F454776775AC88A0B /* Google-Maps-iOS-Utils-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 81F771C81527652BBC3CBE3BD2D5BFB7 /* Google-Maps-iOS-Utils-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 97A168DFB6DB61770CE2DBF4FD39AA8D /* CFNetwork.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8B079F294DA5D9A879E6D53A91F51A1E /* CFNetwork.framework */; }; + 9AAA595D0C758D3AC560FC8E774F4810 /* GQTPointQuadTreeChild.h in Headers */ = {isa = PBXBuildFile; fileRef = D6DB9626D8D8D3FFA5701B1D9311D1DC /* GQTPointQuadTreeChild.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9ED1CB83EFF21A9AB9CC71227A2511DD /* GMUSimpleClusterAlgorithm.h in Headers */ = {isa = PBXBuildFile; fileRef = D56E84B2F1E7B8E279A43A6B95358324 /* GMUSimpleClusterAlgorithm.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A0C5BE52F1BFAF7647159E2E9CCFD616 /* Pods-ProductosPY-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 1FB7D44EF0E364F69490B1C7C236F195 /* Pods-ProductosPY-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A25B6D4A6B93D89917B398F6F8D24497 /* GQTPoint.h in Headers */ = {isa = PBXBuildFile; fileRef = 8DB0E560CF2BBC70B65382AFDB82BDC8 /* GQTPoint.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A89051C6EA5100B172785C3188D4B2D0 /* GMUClusterManager.m in Sources */ = {isa = PBXBuildFile; fileRef = B8BC73624F20C0D13D9F96859F6F21A7 /* GMUClusterManager.m */; }; + AD9899986955B2EC1EC20818C860C971 /* RequestInterceptor.swift in Sources */ = {isa = PBXBuildFile; fileRef = F36BF563D6B758A9AACF69600A6381E0 /* RequestInterceptor.swift */; }; + AF92602937CA016548022C600B8CDC16 /* URLSessionConfiguration+Alamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = B415744A81F9A13705C031EB4AFB692F /* URLSessionConfiguration+Alamofire.swift */; }; + B1C58F6CED7B3E45170711D9ADF878AF /* Alamofire-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 6314D81E5E77A19B27E8B26BBA30F9CA /* Alamofire-dummy.m */; }; + B23E9A5CDA31534491226F4C2EE8F8E6 /* HTTPMethod.swift in Sources */ = {isa = PBXBuildFile; fileRef = 16387C33EE2857D75177733548D41EF3 /* HTTPMethod.swift */; }; + B25F2EEA0331ED9565890F3E83B374C4 /* GMUClusterAlgorithm.h in Headers */ = {isa = PBXBuildFile; fileRef = A065556B268C5AFE1B15918CC0A2F4EE /* GMUClusterAlgorithm.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B53B81C6718DF236268217E126292366 /* GMUDefaultClusterIconGenerator.m in Sources */ = {isa = PBXBuildFile; fileRef = 57DFD5F9A718CADCDF977E6AC23C3217 /* GMUDefaultClusterIconGenerator.m */; }; + B788B3354CCEBE56DFDB963CAFD7F6C2 /* Alamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = BC3559AD43498D0318355CBAC4610FAA /* Alamofire.swift */; }; + BA454EB9A13831760BBC99EE20C3FBF4 /* GMUClusterRenderer.h in Headers */ = {isa = PBXBuildFile; fileRef = D7EA8F643A5CD180525ED32998C51AC8 /* GMUClusterRenderer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BAA738D81673FB182E7C780EE7E285E9 /* GMUFeature.m in Sources */ = {isa = PBXBuildFile; fileRef = 8BD5DDC2DD330ABBC1B27AA9F95D3631 /* GMUFeature.m */; }; + BE82AE980F8C7EE28A6448959194F93A /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 222DAEF0D819F359AFCFF3D4F927E8A7 /* Foundation.framework */; }; + C10B079A50364FAC9845BB6D74F5D780 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 222DAEF0D819F359AFCFF3D4F927E8A7 /* Foundation.framework */; }; + C60E2279A53FED46BE69E60A7343B46B /* Pods-ProductosPY-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = EB4DEE4258DD2C23A922E9A12D1CDDD3 /* Pods-ProductosPY-dummy.m */; }; + C64AF152F7928CDB59385528DB65FE19 /* RedirectHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 86E35644E17C50C2B88F0E4CD3FE19DA /* RedirectHandler.swift */; }; + C7369563F6946D8984124E1A546B6425 /* Notifications.swift in Sources */ = {isa = PBXBuildFile; fileRef = CFA94513E74C92CA47A935391EBD4AD1 /* Notifications.swift */; }; + CA244CA3C187A1CE131810767E9220EB /* GMUPoint.m in Sources */ = {isa = PBXBuildFile; fileRef = 4944A0A1EECB6326526BBD8594BBCA27 /* GMUPoint.m */; }; + CACBD166E573774FB5613C34AA6DA7A7 /* EventMonitor.swift in Sources */ = {isa = PBXBuildFile; fileRef = C5EE4AF46FBF1E1BB2C8AF3476AFD1A6 /* EventMonitor.swift */; }; + CC26C46010C0C45610345D613EC800E2 /* GMUGroundOverlay.h in Headers */ = {isa = PBXBuildFile; fileRef = 441E627A9DB0A80780F363C1001F27F2 /* GMUGroundOverlay.h */; settings = {ATTRIBUTES = (Public, ); }; }; + CF8108DD69C3B7E70F59DABFB4D41CE4 /* GQTPointQuadTree.m in Sources */ = {isa = PBXBuildFile; fileRef = 28569415F9DDD24077AD7FD62E5193A2 /* GQTPointQuadTree.m */; }; + D1A8A521BD9F9894656E6C3ACFBF3338 /* GQTPointQuadTreeChild.m in Sources */ = {isa = PBXBuildFile; fileRef = 70518AB2437E2C2B95F5D68F20F3B0C4 /* GQTPointQuadTreeChild.m */; }; + D28AAC7E032FD710FF5886A3D66C31DA /* GMUGeometryCollection.m in Sources */ = {isa = PBXBuildFile; fileRef = A105505B5A7F93B104357983D2FD0103 /* GMUGeometryCollection.m */; }; + D4A0BD6E456FEB5863022168E5AFABFB /* GMUKMLParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 6F96C1FC1A9ACF8AF887EFA89E5175EF /* GMUKMLParser.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D4CB4D76A7EECFEA1688B08BA8A34941 /* GMUWrappingDictionaryKey.m in Sources */ = {isa = PBXBuildFile; fileRef = 73B55A27FD1BCD9FCFB594735D62B37E /* GMUWrappingDictionaryKey.m */; }; + D5B66D6EF8E2061ECF6FA00CBFA88499 /* GMUGeometryRenderer.h in Headers */ = {isa = PBXBuildFile; fileRef = 463D8C0593B8D62BAEA905DA689B427F /* GMUGeometryRenderer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D6B2983389480F48F27A0704EEB5DC81 /* RetryPolicy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 25E422C2CDB394D8AD89288A0770A80A /* RetryPolicy.swift */; }; + D92E08DFD5C09C0BB6899A90D8D6EF3D /* GQTBounds.h in Headers */ = {isa = PBXBuildFile; fileRef = 87841B5E4DDA85CCD038E4F2CFFA66BD /* GQTBounds.h */; settings = {ATTRIBUTES = (Public, ); }; }; + DD5A6A1EECC38AB2BC739FC0FFA29BC0 /* GMUSimpleClusterAlgorithm.m in Sources */ = {isa = PBXBuildFile; fileRef = 7776E5AFC98EF84727508180F36AB9D2 /* GMUSimpleClusterAlgorithm.m */; }; + E07BD425C4EA9ADF15DDFCDB10D0B2FB /* MultipartUpload.swift in Sources */ = {isa = PBXBuildFile; fileRef = 943BF3AE1A85B0C2F45A531F3D987A99 /* MultipartUpload.swift */; }; + E4E12208D5246E64B7E6CCAE987ADB03 /* URLRequest+Alamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = 475C71BA85AD9FDE6E3C4E70D938EBE3 /* URLRequest+Alamofire.swift */; }; + E9A5AC2F471699CCA516952A5FEB990B /* DispatchQueue+Alamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = 67F4701909B0BE8E53954E509A078A9D /* DispatchQueue+Alamofire.swift */; }; + EAC9AD000371B916841F111E2DD1F50F /* GQTPointQuadTreeItem.h in Headers */ = {isa = PBXBuildFile; fileRef = 2EDE850D33EB42514C9469CEE95C0D09 /* GQTPointQuadTreeItem.h */; settings = {ATTRIBUTES = (Public, ); }; }; + EB14D38F43945694C0EA794E208C280B /* GMUGeometryContainer.h in Headers */ = {isa = PBXBuildFile; fileRef = 59679C7B17CFD91B1582844DCE27C8EE /* GMUGeometryContainer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F03547B0792049EEE6829CC76B7B6F03 /* GMULineString.m in Sources */ = {isa = PBXBuildFile; fileRef = 86448828884537069E904956F0B7B09F /* GMULineString.m */; }; + F71789DC91A75033EFB79DB828676451 /* Response.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38CF52CE209C0B69D87352870100787C /* Response.swift */; }; + FA6AC1583F0A10AE9B3B7F3C27750751 /* GMUClusterManager+Testing.h in Headers */ = {isa = PBXBuildFile; fileRef = 136FA40661E66FBD5934354572FDDB2A /* GMUClusterManager+Testing.h */; settings = {ATTRIBUTES = (Public, ); }; }; + FE9A380C20BEE72E22B07249A5EEE810 /* GMUClusterIconGenerator.h in Headers */ = {isa = PBXBuildFile; fileRef = 3BD118ADD1554312D67F37AFDCA28E08 /* GMUClusterIconGenerator.h */; settings = {ATTRIBUTES = (Public, ); }; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 2A41B5D33DF9F61A340800FBC8862CFB /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = E5B4BBC6DD552AC8943C7E22772FC1D3; + remoteInfo = GoogleMaps; + }; + 36DA671AC7B31F672E7329EABE516E38 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = EAAA1AD3A8A1B59AB91319EE40752C6D; + remoteInfo = Alamofire; + }; + 6EB1C2DD30E6564FC3135C9E8002D8F7 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = E5B4BBC6DD552AC8943C7E22772FC1D3; + remoteInfo = GoogleMaps; + }; + 84ED0303E64A8AE0019C8ED4E4100B16 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = A5EEC7C2AA5BC7C67CFA2C7578AB62C7; + remoteInfo = "Google-Maps-iOS-Utils"; + }; + 893E440CC930AD559414CDA37C9DD79C /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 0C1885900810601510E0C632060FAF26; + remoteInfo = GooglePlaces; + }; + BF0C356659B997EAD399AE2462796B0C /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = E5B4BBC6DD552AC8943C7E22772FC1D3; + remoteInfo = GoogleMaps; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 018995424606F2620D54F2A065A8267C /* Pods-ProductosPY-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-ProductosPY-frameworks.sh"; sourceTree = ""; }; + 02EE6CAC1CCC06D19C21A11ACC2DBC1A /* Alamofire-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Alamofire-prefix.pch"; sourceTree = ""; }; + 045FC9D236BB4DB741E66E1626A12B76 /* Pods-ProductosPY-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-ProductosPY-resources.sh"; sourceTree = ""; }; + 0470913171E5F8BD817636C2D90FE14D /* AFError.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AFError.swift; path = Source/AFError.swift; sourceTree = ""; }; + 0692F53A6EB4E64A8F0FE7E1129B2E61 /* Google-Maps-iOS-Utils-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Google-Maps-iOS-Utils-dummy.m"; sourceTree = ""; }; + 06B87E202250E97D53894F5B86E89477 /* Google-Maps-iOS-Utils.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Google-Maps-iOS-Utils.release.xcconfig"; sourceTree = ""; }; + 085690281F76F4AC35EB3B37212FD173 /* GMUGeometryRenderer+Testing.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "GMUGeometryRenderer+Testing.h"; path = "src/Geometry/GMUGeometryRenderer+Testing.h"; sourceTree = ""; }; + 08F5141BBE5C8EF3D060F37257224FB7 /* GMUHeatmapTileLayer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GMUHeatmapTileLayer.m; path = src/Heatmap/GMUHeatmapTileLayer.m; sourceTree = ""; }; + 0EF271CE684AEA0DEC2B555A21F5CBDA /* Pods-ProductosPY.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-ProductosPY.debug.xcconfig"; sourceTree = ""; }; + 136FA40661E66FBD5934354572FDDB2A /* GMUClusterManager+Testing.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "GMUClusterManager+Testing.h"; path = "src/Clustering/GMUClusterManager+Testing.h"; sourceTree = ""; }; + 16387C33EE2857D75177733548D41EF3 /* HTTPMethod.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HTTPMethod.swift; path = Source/HTTPMethod.swift; sourceTree = ""; }; + 1668E8F00B2D02925EE62383D650BB05 /* GMUPair.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GMUPair.h; path = src/Geometry/Model/GMUPair.h; sourceTree = ""; }; + 17D8F8819A3FCCBFB3ACDBD9BAE83B08 /* Alamofire.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = Alamofire.modulemap; sourceTree = ""; }; + 1836B043CF6004E39E9650A7B06956F5 /* ServerTrustEvaluation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ServerTrustEvaluation.swift; path = Source/ServerTrustEvaluation.swift; sourceTree = ""; }; + 18402C611BB72F72F40D6CED99AFCE12 /* Google-Maps-iOS-Utils-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Google-Maps-iOS-Utils-prefix.pch"; sourceTree = ""; }; + 1CB95C2770334A77D289104048523E68 /* AlamofireExtended.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AlamofireExtended.swift; path = Source/AlamofireExtended.swift; sourceTree = ""; }; + 1FB7D44EF0E364F69490B1C7C236F195 /* Pods-ProductosPY-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-ProductosPY-umbrella.h"; sourceTree = ""; }; + 222DAEF0D819F359AFCFF3D4F927E8A7 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.2.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; + 22C36638C405F9D2D7B0BD46E3F0967B /* GMULineString.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GMULineString.h; path = src/Geometry/Model/GMULineString.h; sourceTree = ""; }; + 25E422C2CDB394D8AD89288A0770A80A /* RetryPolicy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RetryPolicy.swift; path = Source/RetryPolicy.swift; sourceTree = ""; }; + 28569415F9DDD24077AD7FD62E5193A2 /* GQTPointQuadTree.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GQTPointQuadTree.m; path = src/QuadTree/GQTPointQuadTree.m; sourceTree = ""; }; + 2A55BB5D61F80B4D72D3CF71F0A8AA31 /* GooglePlaces.bundle */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "wrapper.plug-in"; name = GooglePlaces.bundle; path = Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle; sourceTree = ""; }; + 2CFE72A59086DB4916CED8B8A9E150AE /* Alamofire-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Alamofire-Info.plist"; sourceTree = ""; }; + 2D462C05421F4C51D12C1C12817DC01B /* GMUPolygon.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GMUPolygon.h; path = src/Geometry/Model/GMUPolygon.h; sourceTree = ""; }; + 2EDE850D33EB42514C9469CEE95C0D09 /* GQTPointQuadTreeItem.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GQTPointQuadTreeItem.h; path = src/QuadTree/GQTPointQuadTreeItem.h; sourceTree = ""; }; + 31CA5FBE4D19BCD460F60F8326C8C42E /* GMUClusterManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GMUClusterManager.h; path = src/Clustering/GMUClusterManager.h; sourceTree = ""; }; + 33685DBB53853EBA62D8586A85BFE632 /* GooglePlaces.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = GooglePlaces.debug.xcconfig; sourceTree = ""; }; + 38CF52CE209C0B69D87352870100787C /* Response.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Response.swift; path = Source/Response.swift; sourceTree = ""; }; + 39A6F352EE5C522B21C7190947EAA7EC /* NetworkReachabilityManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NetworkReachabilityManager.swift; path = Source/NetworkReachabilityManager.swift; sourceTree = ""; }; + 3BD118ADD1554312D67F37AFDCA28E08 /* GMUClusterIconGenerator.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GMUClusterIconGenerator.h; path = src/Clustering/View/GMUClusterIconGenerator.h; sourceTree = ""; }; + 3D669A84D4751E18E680ED15B2F9348A /* Pods-ProductosPY-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-ProductosPY-acknowledgements.markdown"; sourceTree = ""; }; + 3F5B0F8731A4E8526EB60BB7F0C4086D /* GoogleMapsCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GoogleMapsCore.framework; path = Maps/Frameworks/GoogleMapsCore.framework; sourceTree = ""; }; + 40E0A7525CF243E5C54C64CB47065AF7 /* GMUPair.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GMUPair.m; path = src/Geometry/Model/GMUPair.m; sourceTree = ""; }; + 4177CDFC747A668317CB195FB640D892 /* GMUPlacemark.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GMUPlacemark.m; path = src/Geometry/Model/GMUPlacemark.m; sourceTree = ""; }; + 41E8DFD15F1E56043CC42AC3CEAD039E /* GMUDefaultClusterIconGenerator+Testing.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "GMUDefaultClusterIconGenerator+Testing.h"; path = "src/Clustering/View/GMUDefaultClusterIconGenerator+Testing.h"; sourceTree = ""; }; + 441E627A9DB0A80780F363C1001F27F2 /* GMUGroundOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GMUGroundOverlay.h; path = src/Geometry/Model/GMUGroundOverlay.h; sourceTree = ""; }; + 446C2364A4B6FF3D0B9273CD0B3F9D36 /* Pods_ProductosPY.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_ProductosPY.framework; path = "Pods-ProductosPY.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; + 4570018A44C8420628B97C8DEB501A10 /* GMUStyleMap.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GMUStyleMap.h; path = src/Geometry/Model/GMUStyleMap.h; sourceTree = ""; }; + 460FEC51F8B83C36A9F66483E068035C /* Google-Maps-iOS-Utils.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Google-Maps-iOS-Utils.debug.xcconfig"; sourceTree = ""; }; + 463D8C0593B8D62BAEA905DA689B427F /* GMUGeometryRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GMUGeometryRenderer.h; path = src/Geometry/GMUGeometryRenderer.h; sourceTree = ""; }; + 475C71BA85AD9FDE6E3C4E70D938EBE3 /* URLRequest+Alamofire.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "URLRequest+Alamofire.swift"; path = "Source/URLRequest+Alamofire.swift"; sourceTree = ""; }; + 4808DD5BB696DAD4BA2A22F8ADAC7E39 /* GMUDefaultClusterRenderer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GMUDefaultClusterRenderer.m; path = src/Clustering/View/GMUDefaultClusterRenderer.m; sourceTree = ""; }; + 48685635464E4E04DBAD431275750780 /* GMUDefaultClusterIconGenerator.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GMUDefaultClusterIconGenerator.h; path = src/Clustering/View/GMUDefaultClusterIconGenerator.h; sourceTree = ""; }; + 4944A0A1EECB6326526BBD8594BBCA27 /* GMUPoint.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GMUPoint.m; path = src/Geometry/Model/GMUPoint.m; sourceTree = ""; }; + 4DF1345302BF7CE049A0F22CB711B71D /* GMUPlacemark.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GMUPlacemark.h; path = src/Geometry/Model/GMUPlacemark.h; sourceTree = ""; }; + 53362E976B7BBF98339337AAC5476081 /* GMUWeightedLatLng.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GMUWeightedLatLng.h; path = src/Heatmap/GMUWeightedLatLng.h; sourceTree = ""; }; + 56FD8C19D6F3A302E2625038C9FDF360 /* GMUFeature.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GMUFeature.h; path = src/Geometry/Model/GMUFeature.h; sourceTree = ""; }; + 57DFD5F9A718CADCDF977E6AC23C3217 /* GMUDefaultClusterIconGenerator.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GMUDefaultClusterIconGenerator.m; path = src/Clustering/View/GMUDefaultClusterIconGenerator.m; sourceTree = ""; }; + 59679C7B17CFD91B1582844DCE27C8EE /* GMUGeometryContainer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GMUGeometryContainer.h; path = src/Geometry/Model/GMUGeometryContainer.h; sourceTree = ""; }; + 5BFD333D9C6D2525A8529861D6CDCC93 /* GMUGeometry.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GMUGeometry.h; path = src/Geometry/Model/GMUGeometry.h; sourceTree = ""; }; + 5CA9E6FE438CE79CD76FA3B34CC95836 /* GoogleMapsUtils.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = GoogleMapsUtils.framework; path = "Google-Maps-iOS-Utils.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; + 5D797E9A5C5782CE845840781FA1CC81 /* Alamofire.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Alamofire.framework; path = Alamofire.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 5E4FAF897FD47617D04333B1EE232051 /* Request.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Request.swift; path = Source/Request.swift; sourceTree = ""; }; + 6314D81E5E77A19B27E8B26BBA30F9CA /* Alamofire-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Alamofire-dummy.m"; sourceTree = ""; }; + 67A7465CF8BBBFBF5C96E86025BDA1EA /* URLEncodedFormEncoder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = URLEncodedFormEncoder.swift; path = Source/URLEncodedFormEncoder.swift; sourceTree = ""; }; + 67F4701909B0BE8E53954E509A078A9D /* DispatchQueue+Alamofire.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "DispatchQueue+Alamofire.swift"; path = "Source/DispatchQueue+Alamofire.swift"; sourceTree = ""; }; + 6945C8BFFFB511EDDF4B3C058B9E58C8 /* GMUWrappingDictionaryKey.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GMUWrappingDictionaryKey.h; path = src/Clustering/Algo/GMUWrappingDictionaryKey.h; sourceTree = ""; }; + 6C3A8D937D0D73F8D560DDE8A5D42202 /* GMUStyleMap.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GMUStyleMap.m; path = src/Geometry/Model/GMUStyleMap.m; sourceTree = ""; }; + 6D1D7968AF420C6F7584D3F202685288 /* Alamofire.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Alamofire.debug.xcconfig; sourceTree = ""; }; + 6F96C1FC1A9ACF8AF887EFA89E5175EF /* GMUKMLParser.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GMUKMLParser.h; path = src/Geometry/GMUKMLParser.h; sourceTree = ""; }; + 70518AB2437E2C2B95F5D68F20F3B0C4 /* GQTPointQuadTreeChild.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GQTPointQuadTreeChild.m; path = src/QuadTree/GQTPointQuadTreeChild.m; sourceTree = ""; }; + 73B55A27FD1BCD9FCFB594735D62B37E /* GMUWrappingDictionaryKey.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GMUWrappingDictionaryKey.m; path = src/Clustering/Algo/GMUWrappingDictionaryKey.m; sourceTree = ""; }; + 75CDE62DB2144DCD54B361A79DC6AA05 /* Pods-ProductosPY.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-ProductosPY.release.xcconfig"; sourceTree = ""; }; + 765AD0E2CB2E5E9CBFB68F7D8D562B31 /* GMUGeoJSONParser.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GMUGeoJSONParser.h; path = src/Geometry/GMUGeoJSONParser.h; sourceTree = ""; }; + 7776E5AFC98EF84727508180F36AB9D2 /* GMUSimpleClusterAlgorithm.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GMUSimpleClusterAlgorithm.m; path = src/Clustering/Algo/GMUSimpleClusterAlgorithm.m; sourceTree = ""; }; + 7910345EFA02EB980119663FC0118C4C /* GMUGeometryRenderer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GMUGeometryRenderer.m; path = src/Geometry/GMUGeometryRenderer.m; sourceTree = ""; }; + 7F15D37A836D795619ACE813F984EE90 /* GooglePlaces.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = GooglePlaces.release.xcconfig; sourceTree = ""; }; + 7FFB2CF74C9E444F185C502BF7F038AF /* GMUGeoJSONParser.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GMUGeoJSONParser.m; path = src/Geometry/GMUGeoJSONParser.m; sourceTree = ""; }; + 81F771C81527652BBC3CBE3BD2D5BFB7 /* Google-Maps-iOS-Utils-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Google-Maps-iOS-Utils-umbrella.h"; sourceTree = ""; }; + 824D9B018A25B4CD36B515A21A2C66BB /* Alamofire-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Alamofire-umbrella.h"; sourceTree = ""; }; + 826C4BB1BCAA99C2C306EF73D3214A14 /* Validation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Validation.swift; path = Source/Validation.swift; sourceTree = ""; }; + 86448828884537069E904956F0B7B09F /* GMULineString.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GMULineString.m; path = src/Geometry/Model/GMULineString.m; sourceTree = ""; }; + 86E35644E17C50C2B88F0E4CD3FE19DA /* RedirectHandler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RedirectHandler.swift; path = Source/RedirectHandler.swift; sourceTree = ""; }; + 87841B5E4DDA85CCD038E4F2CFFA66BD /* GQTBounds.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GQTBounds.h; path = src/QuadTree/GQTBounds.h; sourceTree = ""; }; + 88BB6C294CAE16A3F4D6DDD2F323F528 /* Google-Maps-iOS-Utils.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Google-Maps-iOS-Utils.modulemap"; sourceTree = ""; }; + 890078C2FF31BA357388E66C927421F5 /* GQTPointQuadTree.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GQTPointQuadTree.h; path = src/QuadTree/GQTPointQuadTree.h; sourceTree = ""; }; + 8B079F294DA5D9A879E6D53A91F51A1E /* CFNetwork.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CFNetwork.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.2.sdk/System/Library/Frameworks/CFNetwork.framework; sourceTree = DEVELOPER_DIR; }; + 8BD5DDC2DD330ABBC1B27AA9F95D3631 /* GMUFeature.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GMUFeature.m; path = src/Geometry/Model/GMUFeature.m; sourceTree = ""; }; + 8DB0E560CF2BBC70B65382AFDB82BDC8 /* GQTPoint.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GQTPoint.h; path = src/QuadTree/GQTPoint.h; sourceTree = ""; }; + 8F5BE0412AD8EF93DC5EA8B7C08818B0 /* Protector.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Protector.swift; path = Source/Protector.swift; sourceTree = ""; }; + 90507B1B6D2E4DA381F4476E153BC866 /* Pods-ProductosPY-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-ProductosPY-Info.plist"; sourceTree = ""; }; + 9259849B5E110806A283B82FE6A64D26 /* GMUGeometryCollection.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GMUGeometryCollection.h; path = src/Geometry/Model/GMUGeometryCollection.h; sourceTree = ""; }; + 931CF34C7A6EF9D2CA2359F7FAD0AE01 /* GMUGridBasedClusterAlgorithm.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GMUGridBasedClusterAlgorithm.m; path = src/Clustering/Algo/GMUGridBasedClusterAlgorithm.m; sourceTree = ""; }; + 943BF3AE1A85B0C2F45A531F3D987A99 /* MultipartUpload.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MultipartUpload.swift; path = Source/MultipartUpload.swift; sourceTree = ""; }; + 97425D27470BCB0CF4923830C1F00971 /* Pods-ProductosPY.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-ProductosPY.modulemap"; sourceTree = ""; }; + 9C168E9290609458FCB33D00C6EA814E /* GMUGroundOverlay.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GMUGroundOverlay.m; path = src/Geometry/Model/GMUGroundOverlay.m; sourceTree = ""; }; + 9D07AEFFFF1B7416A5A8C912CD81C756 /* Pods-ProductosPY-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-ProductosPY-acknowledgements.plist"; sourceTree = ""; }; + 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; + A065556B268C5AFE1B15918CC0A2F4EE /* GMUClusterAlgorithm.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GMUClusterAlgorithm.h; path = src/Clustering/Algo/GMUClusterAlgorithm.h; sourceTree = ""; }; + A105505B5A7F93B104357983D2FD0103 /* GMUGeometryCollection.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GMUGeometryCollection.m; path = src/Geometry/Model/GMUGeometryCollection.m; sourceTree = ""; }; + A3072F3163953FC4A9326F701684A1F7 /* GMUNonHierarchicalDistanceBasedAlgorithm.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GMUNonHierarchicalDistanceBasedAlgorithm.h; path = src/Clustering/Algo/GMUNonHierarchicalDistanceBasedAlgorithm.h; sourceTree = ""; }; + AB523041AD37AE051E0E81DA5296D8CD /* URLConvertible+URLRequestConvertible.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "URLConvertible+URLRequestConvertible.swift"; path = "Source/URLConvertible+URLRequestConvertible.swift"; sourceTree = ""; }; + AB61C3E8DF4DC93D53DCE30BA373C8C5 /* GMUStaticCluster.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GMUStaticCluster.m; path = src/Clustering/GMUStaticCluster.m; sourceTree = ""; }; + AB9CF6C7F866F8824E089698965CAC44 /* GMUWeightedLatLng.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GMUWeightedLatLng.m; path = src/Heatmap/GMUWeightedLatLng.m; sourceTree = ""; }; + AD0212690AAC3E4ACE9A4AE674B30961 /* GMUClusterItem.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GMUClusterItem.h; path = src/Clustering/GMUClusterItem.h; sourceTree = ""; }; + AE2CD1EE8FE2518E089A5C940F47599D /* GMUNonHierarchicalDistanceBasedAlgorithm.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GMUNonHierarchicalDistanceBasedAlgorithm.m; path = src/Clustering/Algo/GMUNonHierarchicalDistanceBasedAlgorithm.m; sourceTree = ""; }; + B415744A81F9A13705C031EB4AFB692F /* URLSessionConfiguration+Alamofire.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "URLSessionConfiguration+Alamofire.swift"; path = "Source/URLSessionConfiguration+Alamofire.swift"; sourceTree = ""; }; + B6CDCEAB74DC761D56282BE32749FF46 /* CachedResponseHandler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CachedResponseHandler.swift; path = Source/CachedResponseHandler.swift; sourceTree = ""; }; + B7A9F407054B0D56C55A5D283CCB1A69 /* GoogleMaps.bundle */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "wrapper.plug-in"; name = GoogleMaps.bundle; path = Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle; sourceTree = ""; }; + B7FC57D610EF2C139CAAEB54FB215382 /* GoogleMaps.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = GoogleMaps.debug.xcconfig; sourceTree = ""; }; + B8A988926B41DB9CCFA3A9E45D67647F /* GMUHeatmapTileLayer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GMUHeatmapTileLayer.h; path = src/Heatmap/GMUHeatmapTileLayer.h; sourceTree = ""; }; + B8BC73624F20C0D13D9F96859F6F21A7 /* GMUClusterManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GMUClusterManager.m; path = src/Clustering/GMUClusterManager.m; sourceTree = ""; }; + B8C52A0F8BF4BDF06044F78D2B3F1E49 /* GMUStyle.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GMUStyle.m; path = src/Geometry/Model/GMUStyle.m; sourceTree = ""; }; + BAFF5178299081BDC9BAAA067092782E /* Session.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Session.swift; path = Source/Session.swift; sourceTree = ""; }; + BC3559AD43498D0318355CBAC4610FAA /* Alamofire.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Alamofire.swift; path = Source/Alamofire.swift; sourceTree = ""; }; + C05A0AE31AD6283457EF7BE610CE933E /* GMUCluster.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GMUCluster.h; path = src/Clustering/GMUCluster.h; sourceTree = ""; }; + C138DBD8D9811B6538120A36C77D948A /* GMUPolygon.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GMUPolygon.m; path = src/Geometry/Model/GMUPolygon.m; sourceTree = ""; }; + C2A3A6CC9BD14F3A5E3D54C20B4DB334 /* GoogleMapsBase.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GoogleMapsBase.framework; path = Base/Frameworks/GoogleMapsBase.framework; sourceTree = ""; }; + C58DFC323A1D00905391AC7CC1C60598 /* HTTPHeaders.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HTTPHeaders.swift; path = Source/HTTPHeaders.swift; sourceTree = ""; }; + C5EE4AF46FBF1E1BB2C8AF3476AFD1A6 /* EventMonitor.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = EventMonitor.swift; path = Source/EventMonitor.swift; sourceTree = ""; }; + C72BA217A2202A36B10845576046E34C /* GMUKMLParser.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GMUKMLParser.m; path = src/Geometry/GMUKMLParser.m; sourceTree = ""; }; + C7D0B5F7FD1FF55198E20C93ADEF0817 /* GMUGradient.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GMUGradient.h; path = src/Heatmap/GMUGradient.h; sourceTree = ""; }; + CA986BAAF4F1397563D846A5B0BAB773 /* Alamofire.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Alamofire.release.xcconfig; sourceTree = ""; }; + CC533C5422195A9B17AB377F7C4042AE /* ResponseSerialization.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ResponseSerialization.swift; path = Source/ResponseSerialization.swift; sourceTree = ""; }; + CE9C7DC971E19AD4AA7F3DB8798D0A58 /* GoogleMaps.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = GoogleMaps.release.xcconfig; sourceTree = ""; }; + CFA94513E74C92CA47A935391EBD4AD1 /* Notifications.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Notifications.swift; path = Source/Notifications.swift; sourceTree = ""; }; + D2C3F52CF83AD164811FA449AA5793AF /* ParameterEncoder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ParameterEncoder.swift; path = Source/ParameterEncoder.swift; sourceTree = ""; }; + D326586EF1D59F0F474DB21CA8FE6769 /* GooglePlaces.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GooglePlaces.framework; path = Frameworks/GooglePlaces.framework; sourceTree = ""; }; + D412EA5D825FA653997D1B5DBCE37B33 /* ParameterEncoding.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ParameterEncoding.swift; path = Source/ParameterEncoding.swift; sourceTree = ""; }; + D56E84B2F1E7B8E279A43A6B95358324 /* GMUSimpleClusterAlgorithm.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GMUSimpleClusterAlgorithm.h; path = src/Clustering/Algo/GMUSimpleClusterAlgorithm.h; sourceTree = ""; }; + D5BB1690EA0051C601CB7D7D7198F9AC /* Result+Alamofire.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Result+Alamofire.swift"; path = "Source/Result+Alamofire.swift"; sourceTree = ""; }; + D64239F8542DB542A4627FC4BA91B238 /* RequestTaskMap.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RequestTaskMap.swift; path = Source/RequestTaskMap.swift; sourceTree = ""; }; + D6DB9626D8D8D3FFA5701B1D9311D1DC /* GQTPointQuadTreeChild.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GQTPointQuadTreeChild.h; path = src/QuadTree/GQTPointQuadTreeChild.h; sourceTree = ""; }; + D7EA8F643A5CD180525ED32998C51AC8 /* GMUClusterRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GMUClusterRenderer.h; path = src/Clustering/View/GMUClusterRenderer.h; sourceTree = ""; }; + DDCD994E0F58C0288F0558F2809F1245 /* GoogleMaps.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GoogleMaps.framework; path = Maps/Frameworks/GoogleMaps.framework; sourceTree = ""; }; + E3FAAD7D6792C3619859BD3EF0EB5065 /* GMUStyle.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GMUStyle.h; path = src/Geometry/Model/GMUStyle.h; sourceTree = ""; }; + EB4DEE4258DD2C23A922E9A12D1CDDD3 /* Pods-ProductosPY-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-ProductosPY-dummy.m"; sourceTree = ""; }; + ED41FB255023CEA9D301935A7B7BF02A /* GMUDefaultClusterRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GMUDefaultClusterRenderer.h; path = src/Clustering/View/GMUDefaultClusterRenderer.h; sourceTree = ""; }; + EEBF6A83C6193F2EBDCA896D5133EE42 /* GMUPoint.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GMUPoint.h; path = src/Geometry/Model/GMUPoint.h; sourceTree = ""; }; + F073C76708B6A37E2692E32F685A99A9 /* GMUStaticCluster.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GMUStaticCluster.h; path = src/Clustering/GMUStaticCluster.h; sourceTree = ""; }; + F229A62EBE3DED272F8E4551ECF58469 /* MultipartFormData.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MultipartFormData.swift; path = Source/MultipartFormData.swift; sourceTree = ""; }; + F36BF563D6B758A9AACF69600A6381E0 /* RequestInterceptor.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RequestInterceptor.swift; path = Source/RequestInterceptor.swift; sourceTree = ""; }; + F3FFFE6E4D57E64B966E312B8A19FEC2 /* OperationQueue+Alamofire.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "OperationQueue+Alamofire.swift"; path = "Source/OperationQueue+Alamofire.swift"; sourceTree = ""; }; + F577EEA88330AB31532B57FE0698393E /* GMUGradient.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GMUGradient.m; path = src/Heatmap/GMUGradient.m; sourceTree = ""; }; + F7D60C2923C5FCD7E7F24F09C5B2E5D3 /* Google-Maps-iOS-Utils-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Google-Maps-iOS-Utils-Info.plist"; sourceTree = ""; }; + F80A40E52D364F95EF6A9476D3FB6682 /* SessionDelegate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SessionDelegate.swift; path = Source/SessionDelegate.swift; sourceTree = ""; }; + F9C37A351E75E0AED124AFBF47D09F6F /* GMUGridBasedClusterAlgorithm.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GMUGridBasedClusterAlgorithm.h; path = src/Clustering/Algo/GMUGridBasedClusterAlgorithm.h; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 5E1B497A5D3ECD3AC40C3C17C5FC28D8 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 4246DDBC277DC9C7EF6A4E137E00E2CA /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 8B0D8633F410345F93419B8C3D7B6916 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 97A168DFB6DB61770CE2DBF4FD39AA8D /* CFNetwork.framework in Frameworks */, + BE82AE980F8C7EE28A6448959194F93A /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + F78A9E71E1AEE3DBF17AFB4F92D874C9 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + C10B079A50364FAC9845BB6D74F5D780 /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 0531BBBAA1EC91C766C8B2FA15B53317 /* Resources */ = { + isa = PBXGroup; + children = ( + 2A55BB5D61F80B4D72D3CF71F0A8AA31 /* GooglePlaces.bundle */, + ); + name = Resources; + sourceTree = ""; + }; + 0A5E2551047DB1BFDE7749BF06E3E713 /* Frameworks */ = { + isa = PBXGroup; + children = ( + D326586EF1D59F0F474DB21CA8FE6769 /* GooglePlaces.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 142D489EB06E1A2C26E8235825A9602B /* GoogleMaps */ = { + isa = PBXGroup; + children = ( + D4CD5FE47826C0456B884CB99AB9DB13 /* Base */, + CB77EDF3F4AB94B3D51C2340B87FD9C3 /* Maps */, + FB81623E28D80C45E8C6F16FBFBB4498 /* Support Files */, + ); + name = GoogleMaps; + path = GoogleMaps; + sourceTree = ""; + }; + 1628BF05B4CAFDCC3549A101F5A10A17 /* Frameworks */ = { + isa = PBXGroup; + children = ( + E34DCC8E2CF86B8D72232914781A840D /* iOS */, + ); + name = Frameworks; + sourceTree = ""; + }; + 3651D6C600A3F9910E19926950660CEB /* Alamofire */ = { + isa = PBXGroup; + children = ( + 0470913171E5F8BD817636C2D90FE14D /* AFError.swift */, + BC3559AD43498D0318355CBAC4610FAA /* Alamofire.swift */, + 1CB95C2770334A77D289104048523E68 /* AlamofireExtended.swift */, + B6CDCEAB74DC761D56282BE32749FF46 /* CachedResponseHandler.swift */, + 67F4701909B0BE8E53954E509A078A9D /* DispatchQueue+Alamofire.swift */, + C5EE4AF46FBF1E1BB2C8AF3476AFD1A6 /* EventMonitor.swift */, + C58DFC323A1D00905391AC7CC1C60598 /* HTTPHeaders.swift */, + 16387C33EE2857D75177733548D41EF3 /* HTTPMethod.swift */, + F229A62EBE3DED272F8E4551ECF58469 /* MultipartFormData.swift */, + 943BF3AE1A85B0C2F45A531F3D987A99 /* MultipartUpload.swift */, + 39A6F352EE5C522B21C7190947EAA7EC /* NetworkReachabilityManager.swift */, + CFA94513E74C92CA47A935391EBD4AD1 /* Notifications.swift */, + F3FFFE6E4D57E64B966E312B8A19FEC2 /* OperationQueue+Alamofire.swift */, + D2C3F52CF83AD164811FA449AA5793AF /* ParameterEncoder.swift */, + D412EA5D825FA653997D1B5DBCE37B33 /* ParameterEncoding.swift */, + 8F5BE0412AD8EF93DC5EA8B7C08818B0 /* Protector.swift */, + 86E35644E17C50C2B88F0E4CD3FE19DA /* RedirectHandler.swift */, + 5E4FAF897FD47617D04333B1EE232051 /* Request.swift */, + F36BF563D6B758A9AACF69600A6381E0 /* RequestInterceptor.swift */, + D64239F8542DB542A4627FC4BA91B238 /* RequestTaskMap.swift */, + 38CF52CE209C0B69D87352870100787C /* Response.swift */, + CC533C5422195A9B17AB377F7C4042AE /* ResponseSerialization.swift */, + D5BB1690EA0051C601CB7D7D7198F9AC /* Result+Alamofire.swift */, + 25E422C2CDB394D8AD89288A0770A80A /* RetryPolicy.swift */, + 1836B043CF6004E39E9650A7B06956F5 /* ServerTrustEvaluation.swift */, + BAFF5178299081BDC9BAAA067092782E /* Session.swift */, + F80A40E52D364F95EF6A9476D3FB6682 /* SessionDelegate.swift */, + AB523041AD37AE051E0E81DA5296D8CD /* URLConvertible+URLRequestConvertible.swift */, + 67A7465CF8BBBFBF5C96E86025BDA1EA /* URLEncodedFormEncoder.swift */, + 475C71BA85AD9FDE6E3C4E70D938EBE3 /* URLRequest+Alamofire.swift */, + B415744A81F9A13705C031EB4AFB692F /* URLSessionConfiguration+Alamofire.swift */, + 826C4BB1BCAA99C2C306EF73D3214A14 /* Validation.swift */, + E4B73F3437A713320266B13F2696C2DF /* Support Files */, + ); + name = Alamofire; + path = Alamofire; + sourceTree = ""; + }; + 46C313D9654D620EB04AE1605B389424 /* Heatmap */ = { + isa = PBXGroup; + children = ( + C7D0B5F7FD1FF55198E20C93ADEF0817 /* GMUGradient.h */, + F577EEA88330AB31532B57FE0698393E /* GMUGradient.m */, + B8A988926B41DB9CCFA3A9E45D67647F /* GMUHeatmapTileLayer.h */, + 08F5141BBE5C8EF3D060F37257224FB7 /* GMUHeatmapTileLayer.m */, + 53362E976B7BBF98339337AAC5476081 /* GMUWeightedLatLng.h */, + AB9CF6C7F866F8824E089698965CAC44 /* GMUWeightedLatLng.m */, + ); + name = Heatmap; + sourceTree = ""; + }; + 480538505277DDF636950267222B21D8 /* Resources */ = { + isa = PBXGroup; + children = ( + B7A9F407054B0D56C55A5D283CCB1A69 /* GoogleMaps.bundle */, + ); + name = Resources; + sourceTree = ""; + }; + 5486EECC59E292AE4E6E9CAD0F57EC81 /* Support Files */ = { + isa = PBXGroup; + children = ( + 33685DBB53853EBA62D8586A85BFE632 /* GooglePlaces.debug.xcconfig */, + 7F15D37A836D795619ACE813F984EE90 /* GooglePlaces.release.xcconfig */, + ); + name = "Support Files"; + path = "../Target Support Files/GooglePlaces"; + sourceTree = ""; + }; + 5614861E6B5D1C99009820B19E6C959E /* Frameworks */ = { + isa = PBXGroup; + children = ( + C2A3A6CC9BD14F3A5E3D54C20B4DB334 /* GoogleMapsBase.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 584E7ABA38771773A899CD5DC7868148 /* Frameworks */ = { + isa = PBXGroup; + children = ( + DDCD994E0F58C0288F0558F2809F1245 /* GoogleMaps.framework */, + 3F5B0F8731A4E8526EB60BB7F0C4086D /* GoogleMapsCore.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 6081A573A18F6E0E48497024BFB09222 /* Geometry */ = { + isa = PBXGroup; + children = ( + 56FD8C19D6F3A302E2625038C9FDF360 /* GMUFeature.h */, + 8BD5DDC2DD330ABBC1B27AA9F95D3631 /* GMUFeature.m */, + 765AD0E2CB2E5E9CBFB68F7D8D562B31 /* GMUGeoJSONParser.h */, + 7FFB2CF74C9E444F185C502BF7F038AF /* GMUGeoJSONParser.m */, + 5BFD333D9C6D2525A8529861D6CDCC93 /* GMUGeometry.h */, + 9259849B5E110806A283B82FE6A64D26 /* GMUGeometryCollection.h */, + A105505B5A7F93B104357983D2FD0103 /* GMUGeometryCollection.m */, + 59679C7B17CFD91B1582844DCE27C8EE /* GMUGeometryContainer.h */, + 463D8C0593B8D62BAEA905DA689B427F /* GMUGeometryRenderer.h */, + 7910345EFA02EB980119663FC0118C4C /* GMUGeometryRenderer.m */, + 085690281F76F4AC35EB3B37212FD173 /* GMUGeometryRenderer+Testing.h */, + 441E627A9DB0A80780F363C1001F27F2 /* GMUGroundOverlay.h */, + 9C168E9290609458FCB33D00C6EA814E /* GMUGroundOverlay.m */, + 6F96C1FC1A9ACF8AF887EFA89E5175EF /* GMUKMLParser.h */, + C72BA217A2202A36B10845576046E34C /* GMUKMLParser.m */, + 22C36638C405F9D2D7B0BD46E3F0967B /* GMULineString.h */, + 86448828884537069E904956F0B7B09F /* GMULineString.m */, + 1668E8F00B2D02925EE62383D650BB05 /* GMUPair.h */, + 40E0A7525CF243E5C54C64CB47065AF7 /* GMUPair.m */, + 4DF1345302BF7CE049A0F22CB711B71D /* GMUPlacemark.h */, + 4177CDFC747A668317CB195FB640D892 /* GMUPlacemark.m */, + EEBF6A83C6193F2EBDCA896D5133EE42 /* GMUPoint.h */, + 4944A0A1EECB6326526BBD8594BBCA27 /* GMUPoint.m */, + 2D462C05421F4C51D12C1C12817DC01B /* GMUPolygon.h */, + C138DBD8D9811B6538120A36C77D948A /* GMUPolygon.m */, + E3FAAD7D6792C3619859BD3EF0EB5065 /* GMUStyle.h */, + B8C52A0F8BF4BDF06044F78D2B3F1E49 /* GMUStyle.m */, + 4570018A44C8420628B97C8DEB501A10 /* GMUStyleMap.h */, + 6C3A8D937D0D73F8D560DDE8A5D42202 /* GMUStyleMap.m */, + ); + name = Geometry; + sourceTree = ""; + }; + 70FCA4AD8DBFFC2ED9C999A716257F9A /* Google-Maps-iOS-Utils */ = { + isa = PBXGroup; + children = ( + D117AEA37CC9C4ABEAF4E53E1B513ABB /* Clustering */, + 6081A573A18F6E0E48497024BFB09222 /* Geometry */, + 46C313D9654D620EB04AE1605B389424 /* Heatmap */, + A31D65EA7BA4981D979627CF5F89A0F3 /* QuadTree */, + D8DE3988D19E5980B8B6D91F086EA862 /* Support Files */, + ); + name = "Google-Maps-iOS-Utils"; + path = "Google-Maps-iOS-Utils"; + sourceTree = ""; + }; + A31D65EA7BA4981D979627CF5F89A0F3 /* QuadTree */ = { + isa = PBXGroup; + children = ( + 87841B5E4DDA85CCD038E4F2CFFA66BD /* GQTBounds.h */, + 8DB0E560CF2BBC70B65382AFDB82BDC8 /* GQTPoint.h */, + 890078C2FF31BA357388E66C927421F5 /* GQTPointQuadTree.h */, + 28569415F9DDD24077AD7FD62E5193A2 /* GQTPointQuadTree.m */, + D6DB9626D8D8D3FFA5701B1D9311D1DC /* GQTPointQuadTreeChild.h */, + 70518AB2437E2C2B95F5D68F20F3B0C4 /* GQTPointQuadTreeChild.m */, + 2EDE850D33EB42514C9469CEE95C0D09 /* GQTPointQuadTreeItem.h */, + ); + name = QuadTree; + sourceTree = ""; + }; + BEF42DB34ADC551E6D2A5DEBF0329D30 /* Pods */ = { + isa = PBXGroup; + children = ( + 3651D6C600A3F9910E19926950660CEB /* Alamofire */, + 70FCA4AD8DBFFC2ED9C999A716257F9A /* Google-Maps-iOS-Utils */, + 142D489EB06E1A2C26E8235825A9602B /* GoogleMaps */, + C734CCFF34FCA97032AB5155FA43CE7E /* GooglePlaces */, + ); + name = Pods; + sourceTree = ""; + }; + C28A105A7FBC01CC3E3D3695395AD4E3 /* Targets Support Files */ = { + isa = PBXGroup; + children = ( + EB8A11E549F6589539FA2E30A8A40269 /* Pods-ProductosPY */, + ); + name = "Targets Support Files"; + sourceTree = ""; + }; + C734CCFF34FCA97032AB5155FA43CE7E /* GooglePlaces */ = { + isa = PBXGroup; + children = ( + 0A5E2551047DB1BFDE7749BF06E3E713 /* Frameworks */, + 0531BBBAA1EC91C766C8B2FA15B53317 /* Resources */, + 5486EECC59E292AE4E6E9CAD0F57EC81 /* Support Files */, + ); + name = GooglePlaces; + path = GooglePlaces; + sourceTree = ""; + }; + CB77EDF3F4AB94B3D51C2340B87FD9C3 /* Maps */ = { + isa = PBXGroup; + children = ( + 584E7ABA38771773A899CD5DC7868148 /* Frameworks */, + 480538505277DDF636950267222B21D8 /* Resources */, + ); + name = Maps; + sourceTree = ""; + }; + CF1408CF629C7361332E53B88F7BD30C = { + isa = PBXGroup; + children = ( + 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */, + 1628BF05B4CAFDCC3549A101F5A10A17 /* Frameworks */, + BEF42DB34ADC551E6D2A5DEBF0329D30 /* Pods */, + F3C8D3492307FC91B8269A87ABCF4CEA /* Products */, + C28A105A7FBC01CC3E3D3695395AD4E3 /* Targets Support Files */, + ); + sourceTree = ""; + }; + D117AEA37CC9C4ABEAF4E53E1B513ABB /* Clustering */ = { + isa = PBXGroup; + children = ( + C05A0AE31AD6283457EF7BE610CE933E /* GMUCluster.h */, + A065556B268C5AFE1B15918CC0A2F4EE /* GMUClusterAlgorithm.h */, + 3BD118ADD1554312D67F37AFDCA28E08 /* GMUClusterIconGenerator.h */, + AD0212690AAC3E4ACE9A4AE674B30961 /* GMUClusterItem.h */, + 31CA5FBE4D19BCD460F60F8326C8C42E /* GMUClusterManager.h */, + B8BC73624F20C0D13D9F96859F6F21A7 /* GMUClusterManager.m */, + 136FA40661E66FBD5934354572FDDB2A /* GMUClusterManager+Testing.h */, + D7EA8F643A5CD180525ED32998C51AC8 /* GMUClusterRenderer.h */, + 48685635464E4E04DBAD431275750780 /* GMUDefaultClusterIconGenerator.h */, + 57DFD5F9A718CADCDF977E6AC23C3217 /* GMUDefaultClusterIconGenerator.m */, + 41E8DFD15F1E56043CC42AC3CEAD039E /* GMUDefaultClusterIconGenerator+Testing.h */, + ED41FB255023CEA9D301935A7B7BF02A /* GMUDefaultClusterRenderer.h */, + 4808DD5BB696DAD4BA2A22F8ADAC7E39 /* GMUDefaultClusterRenderer.m */, + F9C37A351E75E0AED124AFBF47D09F6F /* GMUGridBasedClusterAlgorithm.h */, + 931CF34C7A6EF9D2CA2359F7FAD0AE01 /* GMUGridBasedClusterAlgorithm.m */, + A3072F3163953FC4A9326F701684A1F7 /* GMUNonHierarchicalDistanceBasedAlgorithm.h */, + AE2CD1EE8FE2518E089A5C940F47599D /* GMUNonHierarchicalDistanceBasedAlgorithm.m */, + D56E84B2F1E7B8E279A43A6B95358324 /* GMUSimpleClusterAlgorithm.h */, + 7776E5AFC98EF84727508180F36AB9D2 /* GMUSimpleClusterAlgorithm.m */, + F073C76708B6A37E2692E32F685A99A9 /* GMUStaticCluster.h */, + AB61C3E8DF4DC93D53DCE30BA373C8C5 /* GMUStaticCluster.m */, + 6945C8BFFFB511EDDF4B3C058B9E58C8 /* GMUWrappingDictionaryKey.h */, + 73B55A27FD1BCD9FCFB594735D62B37E /* GMUWrappingDictionaryKey.m */, + ); + name = Clustering; + sourceTree = ""; + }; + D4CD5FE47826C0456B884CB99AB9DB13 /* Base */ = { + isa = PBXGroup; + children = ( + 5614861E6B5D1C99009820B19E6C959E /* Frameworks */, + ); + name = Base; + sourceTree = ""; + }; + D8DE3988D19E5980B8B6D91F086EA862 /* Support Files */ = { + isa = PBXGroup; + children = ( + 88BB6C294CAE16A3F4D6DDD2F323F528 /* Google-Maps-iOS-Utils.modulemap */, + 0692F53A6EB4E64A8F0FE7E1129B2E61 /* Google-Maps-iOS-Utils-dummy.m */, + F7D60C2923C5FCD7E7F24F09C5B2E5D3 /* Google-Maps-iOS-Utils-Info.plist */, + 18402C611BB72F72F40D6CED99AFCE12 /* Google-Maps-iOS-Utils-prefix.pch */, + 81F771C81527652BBC3CBE3BD2D5BFB7 /* Google-Maps-iOS-Utils-umbrella.h */, + 460FEC51F8B83C36A9F66483E068035C /* Google-Maps-iOS-Utils.debug.xcconfig */, + 06B87E202250E97D53894F5B86E89477 /* Google-Maps-iOS-Utils.release.xcconfig */, + ); + name = "Support Files"; + path = "../Target Support Files/Google-Maps-iOS-Utils"; + sourceTree = ""; + }; + E34DCC8E2CF86B8D72232914781A840D /* iOS */ = { + isa = PBXGroup; + children = ( + 8B079F294DA5D9A879E6D53A91F51A1E /* CFNetwork.framework */, + 222DAEF0D819F359AFCFF3D4F927E8A7 /* Foundation.framework */, + ); + name = iOS; + sourceTree = ""; + }; + E4B73F3437A713320266B13F2696C2DF /* Support Files */ = { + isa = PBXGroup; + children = ( + 17D8F8819A3FCCBFB3ACDBD9BAE83B08 /* Alamofire.modulemap */, + 6314D81E5E77A19B27E8B26BBA30F9CA /* Alamofire-dummy.m */, + 2CFE72A59086DB4916CED8B8A9E150AE /* Alamofire-Info.plist */, + 02EE6CAC1CCC06D19C21A11ACC2DBC1A /* Alamofire-prefix.pch */, + 824D9B018A25B4CD36B515A21A2C66BB /* Alamofire-umbrella.h */, + 6D1D7968AF420C6F7584D3F202685288 /* Alamofire.debug.xcconfig */, + CA986BAAF4F1397563D846A5B0BAB773 /* Alamofire.release.xcconfig */, + ); + name = "Support Files"; + path = "../Target Support Files/Alamofire"; + sourceTree = ""; + }; + EB8A11E549F6589539FA2E30A8A40269 /* Pods-ProductosPY */ = { + isa = PBXGroup; + children = ( + 97425D27470BCB0CF4923830C1F00971 /* Pods-ProductosPY.modulemap */, + 3D669A84D4751E18E680ED15B2F9348A /* Pods-ProductosPY-acknowledgements.markdown */, + 9D07AEFFFF1B7416A5A8C912CD81C756 /* Pods-ProductosPY-acknowledgements.plist */, + EB4DEE4258DD2C23A922E9A12D1CDDD3 /* Pods-ProductosPY-dummy.m */, + 018995424606F2620D54F2A065A8267C /* Pods-ProductosPY-frameworks.sh */, + 90507B1B6D2E4DA381F4476E153BC866 /* Pods-ProductosPY-Info.plist */, + 045FC9D236BB4DB741E66E1626A12B76 /* Pods-ProductosPY-resources.sh */, + 1FB7D44EF0E364F69490B1C7C236F195 /* Pods-ProductosPY-umbrella.h */, + 0EF271CE684AEA0DEC2B555A21F5CBDA /* Pods-ProductosPY.debug.xcconfig */, + 75CDE62DB2144DCD54B361A79DC6AA05 /* Pods-ProductosPY.release.xcconfig */, + ); + name = "Pods-ProductosPY"; + path = "Target Support Files/Pods-ProductosPY"; + sourceTree = ""; + }; + F3C8D3492307FC91B8269A87ABCF4CEA /* Products */ = { + isa = PBXGroup; + children = ( + 5D797E9A5C5782CE845840781FA1CC81 /* Alamofire.framework */, + 5CA9E6FE438CE79CD76FA3B34CC95836 /* GoogleMapsUtils.framework */, + 446C2364A4B6FF3D0B9273CD0B3F9D36 /* Pods_ProductosPY.framework */, + ); + name = Products; + sourceTree = ""; + }; + FB81623E28D80C45E8C6F16FBFBB4498 /* Support Files */ = { + isa = PBXGroup; + children = ( + B7FC57D610EF2C139CAAEB54FB215382 /* GoogleMaps.debug.xcconfig */, + CE9C7DC971E19AD4AA7F3DB8798D0A58 /* GoogleMaps.release.xcconfig */, + ); + name = "Support Files"; + path = "../Target Support Files/GoogleMaps"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 3F8CD3E13BE276F37EC6543E7C425E89 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 0FE9636CBBBDAF175DC388BB9BEC61A7 /* GMUCluster.h in Headers */, + B25F2EEA0331ED9565890F3E83B374C4 /* GMUClusterAlgorithm.h in Headers */, + FE9A380C20BEE72E22B07249A5EEE810 /* GMUClusterIconGenerator.h in Headers */, + 7740276C0ADB017D548E734AB862A001 /* GMUClusterItem.h in Headers */, + FA6AC1583F0A10AE9B3B7F3C27750751 /* GMUClusterManager+Testing.h in Headers */, + 14FE485059B061EF889CD0D02CA93A6A /* GMUClusterManager.h in Headers */, + BA454EB9A13831760BBC99EE20C3FBF4 /* GMUClusterRenderer.h in Headers */, + 6739BD83FE5790A56AC334EA10D63EF9 /* GMUDefaultClusterIconGenerator+Testing.h in Headers */, + 2B83281CBC344D2DA68619D42B7F2DCD /* GMUDefaultClusterIconGenerator.h in Headers */, + 87363FB2633AB0CF7D61D77C278F36B5 /* GMUDefaultClusterRenderer.h in Headers */, + 1E054C4442B55910F53D959E27086AA5 /* GMUFeature.h in Headers */, + 43D614C5D6D6C46426FF4528A67C03F5 /* GMUGeoJSONParser.h in Headers */, + 4D24D527232D2DB0DEEDD20FCA70E55B /* GMUGeometry.h in Headers */, + 891446206B0D33D4C61DD328436ECCF7 /* GMUGeometryCollection.h in Headers */, + EB14D38F43945694C0EA794E208C280B /* GMUGeometryContainer.h in Headers */, + 4C430238D42160E133406F54A8C80CA8 /* GMUGeometryRenderer+Testing.h in Headers */, + D5B66D6EF8E2061ECF6FA00CBFA88499 /* GMUGeometryRenderer.h in Headers */, + 10B2DE879AEAE070ED8F6E4E88F58899 /* GMUGradient.h in Headers */, + 9282857403CCFC218BA78F92FD6FF4FF /* GMUGridBasedClusterAlgorithm.h in Headers */, + CC26C46010C0C45610345D613EC800E2 /* GMUGroundOverlay.h in Headers */, + 9110B41B4A6381390E48CDC6C305A01F /* GMUHeatmapTileLayer.h in Headers */, + D4A0BD6E456FEB5863022168E5AFABFB /* GMUKMLParser.h in Headers */, + 0265F00E8DBCD6B925C23CE1DEB9F036 /* GMULineString.h in Headers */, + 907B13DB054C71D2258383B7BEABE0F5 /* GMUNonHierarchicalDistanceBasedAlgorithm.h in Headers */, + 236C125617A798ABF6398E3E5E819B88 /* GMUPair.h in Headers */, + 33AB7E44938A901376DA8FCE35EA7C20 /* GMUPlacemark.h in Headers */, + 69A7BAAF6FBD279510569C8F8AF0A772 /* GMUPoint.h in Headers */, + 28BC03E371CECCF48D59293D5EED60C9 /* GMUPolygon.h in Headers */, + 9ED1CB83EFF21A9AB9CC71227A2511DD /* GMUSimpleClusterAlgorithm.h in Headers */, + 2C193D8A5157A1FF32BF061AA5AC0796 /* GMUStaticCluster.h in Headers */, + 0607CCFD3183E86980426E8A34DCFC9A /* GMUStyle.h in Headers */, + 67223AB5F7E489AC8D5C44575511BD6E /* GMUStyleMap.h in Headers */, + 1A093C56EACCA8D49A9F834349941C41 /* GMUWeightedLatLng.h in Headers */, + 4C01D6E23408765A7B309D0937B17324 /* GMUWrappingDictionaryKey.h in Headers */, + 96D1E899BC7DD51F454776775AC88A0B /* Google-Maps-iOS-Utils-umbrella.h in Headers */, + D92E08DFD5C09C0BB6899A90D8D6EF3D /* GQTBounds.h in Headers */, + A25B6D4A6B93D89917B398F6F8D24497 /* GQTPoint.h in Headers */, + 841564F61C36BB1FC7022F2AF01D2C98 /* GQTPointQuadTree.h in Headers */, + 9AAA595D0C758D3AC560FC8E774F4810 /* GQTPointQuadTreeChild.h in Headers */, + EAC9AD000371B916841F111E2DD1F50F /* GQTPointQuadTreeItem.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 47FFC02C606FE417D89E8A71310E3963 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + A0C5BE52F1BFAF7647159E2E9CCFD616 /* Pods-ProductosPY-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + ADDF288DD930A46B5F0F198C225895C9 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 00FA97D56201027AEB1C7692A2C3CF8B /* Alamofire-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 2C463086A561DAB4651A42C6F34E6B3F /* Pods-ProductosPY */ = { + isa = PBXNativeTarget; + buildConfigurationList = 4EA648756AD07BF3B2D11E4C917309C2 /* Build configuration list for PBXNativeTarget "Pods-ProductosPY" */; + buildPhases = ( + 47FFC02C606FE417D89E8A71310E3963 /* Headers */, + 11AD484923BFCA5D5C4E92EDFBCCF9FB /* Sources */, + F78A9E71E1AEE3DBF17AFB4F92D874C9 /* Frameworks */, + 16EFE9104960579C31F713119F8791FD /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 3FB2EAA32FDB190EA551697B331C0A21 /* PBXTargetDependency */, + C30D4900327B979BD1BB68CF80986AD8 /* PBXTargetDependency */, + 239B5593F2B743480649D600E72811FE /* PBXTargetDependency */, + 6723E24E8CF11820DD5B3797FEA12EAB /* PBXTargetDependency */, + ); + name = "Pods-ProductosPY"; + productName = "Pods-ProductosPY"; + productReference = 446C2364A4B6FF3D0B9273CD0B3F9D36 /* Pods_ProductosPY.framework */; + productType = "com.apple.product-type.framework"; + }; + A5EEC7C2AA5BC7C67CFA2C7578AB62C7 /* Google-Maps-iOS-Utils */ = { + isa = PBXNativeTarget; + buildConfigurationList = A46249E8E4E7A30292AF6969CA1290B0 /* Build configuration list for PBXNativeTarget "Google-Maps-iOS-Utils" */; + buildPhases = ( + 3F8CD3E13BE276F37EC6543E7C425E89 /* Headers */, + E07677FF8A0F96DEBCAEAAC360EC248A /* Sources */, + 5E1B497A5D3ECD3AC40C3C17C5FC28D8 /* Frameworks */, + 130FEBA56C600EA01114ED311D514853 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 7452725632C7E06E9BCE9A426D85C069 /* PBXTargetDependency */, + ); + name = "Google-Maps-iOS-Utils"; + productName = "Google-Maps-iOS-Utils"; + productReference = 5CA9E6FE438CE79CD76FA3B34CC95836 /* GoogleMapsUtils.framework */; + productType = "com.apple.product-type.framework"; + }; + EAAA1AD3A8A1B59AB91319EE40752C6D /* Alamofire */ = { + isa = PBXNativeTarget; + buildConfigurationList = 6B2B8EC7E21CDBFF2BDA26B1B4AC4C0D /* Build configuration list for PBXNativeTarget "Alamofire" */; + buildPhases = ( + ADDF288DD930A46B5F0F198C225895C9 /* Headers */, + 7349DB0E9BEBE664696F1DCC25226F26 /* Sources */, + 8B0D8633F410345F93419B8C3D7B6916 /* Frameworks */, + 28FC0024B79C28A420D7C4FEBB9E3AEB /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Alamofire; + productName = Alamofire; + productReference = 5D797E9A5C5782CE845840781FA1CC81 /* Alamofire.framework */; + productType = "com.apple.product-type.framework"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + BFDFE7DC352907FC980B868725387E98 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 1100; + LastUpgradeCheck = 1100; + }; + buildConfigurationList = 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */; + compatibilityVersion = "Xcode 10.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = CF1408CF629C7361332E53B88F7BD30C; + productRefGroup = F3C8D3492307FC91B8269A87ABCF4CEA /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + EAAA1AD3A8A1B59AB91319EE40752C6D /* Alamofire */, + A5EEC7C2AA5BC7C67CFA2C7578AB62C7 /* Google-Maps-iOS-Utils */, + E5B4BBC6DD552AC8943C7E22772FC1D3 /* GoogleMaps */, + 0C1885900810601510E0C632060FAF26 /* GooglePlaces */, + 2C463086A561DAB4651A42C6F34E6B3F /* Pods-ProductosPY */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 130FEBA56C600EA01114ED311D514853 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 16EFE9104960579C31F713119F8791FD /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 28FC0024B79C28A420D7C4FEBB9E3AEB /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 11AD484923BFCA5D5C4E92EDFBCCF9FB /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + C60E2279A53FED46BE69E60A7343B46B /* Pods-ProductosPY-dummy.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 7349DB0E9BEBE664696F1DCC25226F26 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 17953A9CF2E354B3E69B9ABC2F367AD9 /* AFError.swift in Sources */, + B1C58F6CED7B3E45170711D9ADF878AF /* Alamofire-dummy.m in Sources */, + B788B3354CCEBE56DFDB963CAFD7F6C2 /* Alamofire.swift in Sources */, + 44127C4B989C9CC6A90D78B66A929A5E /* AlamofireExtended.swift in Sources */, + 0AE06C3AEA6CA45342BA703230ABD2CB /* CachedResponseHandler.swift in Sources */, + E9A5AC2F471699CCA516952A5FEB990B /* DispatchQueue+Alamofire.swift in Sources */, + CACBD166E573774FB5613C34AA6DA7A7 /* EventMonitor.swift in Sources */, + 56EC8ED1535DAB987F3D2B71D4C05773 /* HTTPHeaders.swift in Sources */, + B23E9A5CDA31534491226F4C2EE8F8E6 /* HTTPMethod.swift in Sources */, + 5C4A0685B5A201436AB52EF25829B333 /* MultipartFormData.swift in Sources */, + E07BD425C4EA9ADF15DDFCDB10D0B2FB /* MultipartUpload.swift in Sources */, + 7CF8362BA31492053F5CB165637AE117 /* NetworkReachabilityManager.swift in Sources */, + C7369563F6946D8984124E1A546B6425 /* Notifications.swift in Sources */, + 92811AC5CD9A5004116AE43C4E8FD955 /* OperationQueue+Alamofire.swift in Sources */, + 5D61C8ED0DDCC9F8B576B6514B19EE50 /* ParameterEncoder.swift in Sources */, + 14AB7976E100075ADEA0AB1DB833E72D /* ParameterEncoding.swift in Sources */, + 0419772A87B16DB7DCF405A9E77D671F /* Protector.swift in Sources */, + C64AF152F7928CDB59385528DB65FE19 /* RedirectHandler.swift in Sources */, + 6A22C46CB1EDE471794D9AB2AC10327F /* Request.swift in Sources */, + AD9899986955B2EC1EC20818C860C971 /* RequestInterceptor.swift in Sources */, + 48D97BE7D5CAED273BD2341C239CC934 /* RequestTaskMap.swift in Sources */, + F71789DC91A75033EFB79DB828676451 /* Response.swift in Sources */, + 13457FE4E607509A3B9527B0711033D5 /* ResponseSerialization.swift in Sources */, + 4082513A35C682F2193D002C80F72B79 /* Result+Alamofire.swift in Sources */, + D6B2983389480F48F27A0704EEB5DC81 /* RetryPolicy.swift in Sources */, + 0CC43FF0E31AA320ACFEB0FE6239DF34 /* ServerTrustEvaluation.swift in Sources */, + 69ACE4EEE5A8C1C618B22CC1F7B8EF01 /* Session.swift in Sources */, + 42CDB5C986C78BBC8E5C0185F746CABF /* SessionDelegate.swift in Sources */, + 70517C3BAC2D6614347DEAC15299EB84 /* URLConvertible+URLRequestConvertible.swift in Sources */, + 5D12235D061AEE7459279AAF8C348DFE /* URLEncodedFormEncoder.swift in Sources */, + E4E12208D5246E64B7E6CCAE987ADB03 /* URLRequest+Alamofire.swift in Sources */, + AF92602937CA016548022C600B8CDC16 /* URLSessionConfiguration+Alamofire.swift in Sources */, + 06507A26118BA5ACFBBC8C225776920E /* Validation.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + E07677FF8A0F96DEBCAEAAC360EC248A /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + A89051C6EA5100B172785C3188D4B2D0 /* GMUClusterManager.m in Sources */, + B53B81C6718DF236268217E126292366 /* GMUDefaultClusterIconGenerator.m in Sources */, + 58B40EDF31BCCA0D2F16E22363AD7C75 /* GMUDefaultClusterRenderer.m in Sources */, + BAA738D81673FB182E7C780EE7E285E9 /* GMUFeature.m in Sources */, + 8D47CC0F688062AF0CFC96EADE699720 /* GMUGeoJSONParser.m in Sources */, + D28AAC7E032FD710FF5886A3D66C31DA /* GMUGeometryCollection.m in Sources */, + 09A0B7185BD8E31909034EE2C1C1508F /* GMUGeometryRenderer.m in Sources */, + 52CCCA1CA7E24AF8D674AB8C52B38488 /* GMUGradient.m in Sources */, + 21C693BBEAD272F3A1352D61B238B787 /* GMUGridBasedClusterAlgorithm.m in Sources */, + 339CA4289E532D19016FB4EF77A6C41C /* GMUGroundOverlay.m in Sources */, + 4094F4C3473CD6D05D3B7C091701028F /* GMUHeatmapTileLayer.m in Sources */, + 6A16615AACC6395730C7590AEA5DDFC8 /* GMUKMLParser.m in Sources */, + F03547B0792049EEE6829CC76B7B6F03 /* GMULineString.m in Sources */, + 2CA3A1FE2BC7A0724A55D9E3063BA0D7 /* GMUNonHierarchicalDistanceBasedAlgorithm.m in Sources */, + 7BB265CF4E1D5F26520C3E8B03FA7727 /* GMUPair.m in Sources */, + 1269CFA194EA8D7E42B863FA6D61C7B3 /* GMUPlacemark.m in Sources */, + CA244CA3C187A1CE131810767E9220EB /* GMUPoint.m in Sources */, + 18CE1994C0ECC17289B2224647D0305A /* GMUPolygon.m in Sources */, + DD5A6A1EECC38AB2BC739FC0FFA29BC0 /* GMUSimpleClusterAlgorithm.m in Sources */, + 0FDC1FEDB01554D88784CA2A88E6234F /* GMUStaticCluster.m in Sources */, + 0E6ED333181FF923562E02EEB3162308 /* GMUStyle.m in Sources */, + 5AE43A0662DE2ABCAAEE60EBBDBA3ED6 /* GMUStyleMap.m in Sources */, + 94E033876210CFB80731D45265F4E935 /* GMUWeightedLatLng.m in Sources */, + D4CB4D76A7EECFEA1688B08BA8A34941 /* GMUWrappingDictionaryKey.m in Sources */, + 3BD0A1ABCE3E5856D4073097218C1D93 /* Google-Maps-iOS-Utils-dummy.m in Sources */, + CF8108DD69C3B7E70F59DABFB4D41CE4 /* GQTPointQuadTree.m in Sources */, + D1A8A521BD9F9894656E6C3ACFBF3338 /* GQTPointQuadTreeChild.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 239B5593F2B743480649D600E72811FE /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = GoogleMaps; + target = E5B4BBC6DD552AC8943C7E22772FC1D3 /* GoogleMaps */; + targetProxy = 2A41B5D33DF9F61A340800FBC8862CFB /* PBXContainerItemProxy */; + }; + 3FB2EAA32FDB190EA551697B331C0A21 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = Alamofire; + target = EAAA1AD3A8A1B59AB91319EE40752C6D /* Alamofire */; + targetProxy = 36DA671AC7B31F672E7329EABE516E38 /* PBXContainerItemProxy */; + }; + 6723E24E8CF11820DD5B3797FEA12EAB /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = GooglePlaces; + target = 0C1885900810601510E0C632060FAF26 /* GooglePlaces */; + targetProxy = 893E440CC930AD559414CDA37C9DD79C /* PBXContainerItemProxy */; + }; + 7452725632C7E06E9BCE9A426D85C069 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = GoogleMaps; + target = E5B4BBC6DD552AC8943C7E22772FC1D3 /* GoogleMaps */; + targetProxy = BF0C356659B997EAD399AE2462796B0C /* PBXContainerItemProxy */; + }; + C30D4900327B979BD1BB68CF80986AD8 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "Google-Maps-iOS-Utils"; + target = A5EEC7C2AA5BC7C67CFA2C7578AB62C7 /* Google-Maps-iOS-Utils */; + targetProxy = 84ED0303E64A8AE0019C8ED4E4100B16 /* PBXContainerItemProxy */; + }; + D42315111F400C0605ACCD6B5CAF2178 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = GoogleMaps; + target = E5B4BBC6DD552AC8943C7E22772FC1D3 /* GoogleMaps */; + targetProxy = 6EB1C2DD30E6564FC3135C9E8002D8F7 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 0291518A29015F53971C0EA982191884 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 75CDE62DB2144DCD54B361A79DC6AA05 /* Pods-ProductosPY.release.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + CLANG_ENABLE_OBJC_WEAK = NO; + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = "Target Support Files/Pods-ProductosPY/Pods-ProductosPY-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 13.1; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-ProductosPY/Pods-ProductosPY.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 088448C7DB72BF0EE7EB2288E87DECEF /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 06B87E202250E97D53894F5B86E89477 /* Google-Maps-iOS-Utils.release.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/Google-Maps-iOS-Utils/Google-Maps-iOS-Utils-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/Google-Maps-iOS-Utils/Google-Maps-iOS-Utils-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Google-Maps-iOS-Utils/Google-Maps-iOS-Utils.modulemap"; + PRODUCT_MODULE_NAME = GoogleMapsUtils; + PRODUCT_NAME = GoogleMapsUtils; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 2B51F82FE490FF29228A173F842AB02D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = CE9C7DC971E19AD4AA7F3DB8798D0A58 /* GoogleMaps.release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_IDENTITY = "iPhone Developer"; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 4AE9FC8A852243DC9A2EFE9BA39BAC7B /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33685DBB53853EBA62D8586A85BFE632 /* GooglePlaces.debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_IDENTITY = "iPhone Developer"; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 510B057D2E9F059C50D52DA5D90F3ACF /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_PREPROCESSOR_DEFINITIONS = ( + "POD_CONFIGURATION_RELEASE=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 13.1; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + PRODUCT_NAME = "$(TARGET_NAME)"; + STRIP_INSTALLED_PRODUCT = NO; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + SWIFT_VERSION = 5.0; + SYMROOT = "${SRCROOT}/../build"; + }; + name = Release; + }; + 573B04AB9E058A1911353A22A780E993 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7F15D37A836D795619ACE813F984EE90 /* GooglePlaces.release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_IDENTITY = "iPhone Developer"; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 78F0A7E7490F24509D56845F81922CF6 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = CA986BAAF4F1397563D846A5B0BAB773 /* Alamofire.release.xcconfig */; + buildSettings = { + CLANG_ENABLE_OBJC_WEAK = NO; + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/Alamofire/Alamofire-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/Alamofire/Alamofire-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 10.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/Alamofire/Alamofire.modulemap"; + PRODUCT_MODULE_NAME = Alamofire; + PRODUCT_NAME = Alamofire; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_VERSION = 5.1; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 804E13245C9FBBE6A340C555CA8B2B4C /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "POD_CONFIGURATION_DEBUG=1", + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 13.1; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_NAME = "$(TARGET_NAME)"; + STRIP_INSTALLED_PRODUCT = NO; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + SYMROOT = "${SRCROOT}/../build"; + }; + name = Debug; + }; + 9A20D9C5346766D8C4243E542E6C0E31 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 6D1D7968AF420C6F7584D3F202685288 /* Alamofire.debug.xcconfig */; + buildSettings = { + CLANG_ENABLE_OBJC_WEAK = NO; + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/Alamofire/Alamofire-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/Alamofire/Alamofire-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 10.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/Alamofire/Alamofire.modulemap"; + PRODUCT_MODULE_NAME = Alamofire; + PRODUCT_NAME = Alamofire; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_VERSION = 5.1; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 9D1BF7F4B0F06AA9119AB22878447971 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = B7FC57D610EF2C139CAAEB54FB215382 /* GoogleMaps.debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_IDENTITY = "iPhone Developer"; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + B85DFC56BE14542C68832C529BC748F9 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 0EF271CE684AEA0DEC2B555A21F5CBDA /* Pods-ProductosPY.debug.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + CLANG_ENABLE_OBJC_WEAK = NO; + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = "Target Support Files/Pods-ProductosPY/Pods-ProductosPY-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 13.1; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-ProductosPY/Pods-ProductosPY.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + DBBDA79EE8382D8FDE88756C5497ED26 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 460FEC51F8B83C36A9F66483E068035C /* Google-Maps-iOS-Utils.debug.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/Google-Maps-iOS-Utils/Google-Maps-iOS-Utils-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/Google-Maps-iOS-Utils/Google-Maps-iOS-Utils-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Google-Maps-iOS-Utils/Google-Maps-iOS-Utils.modulemap"; + PRODUCT_MODULE_NAME = GoogleMapsUtils; + PRODUCT_NAME = GoogleMapsUtils; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 2FC2AC47FDB0310285CE777F18CD1532 /* Build configuration list for PBXAggregateTarget "GooglePlaces" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 4AE9FC8A852243DC9A2EFE9BA39BAC7B /* Debug */, + 573B04AB9E058A1911353A22A780E993 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 804E13245C9FBBE6A340C555CA8B2B4C /* Debug */, + 510B057D2E9F059C50D52DA5D90F3ACF /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 4EA648756AD07BF3B2D11E4C917309C2 /* Build configuration list for PBXNativeTarget "Pods-ProductosPY" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + B85DFC56BE14542C68832C529BC748F9 /* Debug */, + 0291518A29015F53971C0EA982191884 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 6B2B8EC7E21CDBFF2BDA26B1B4AC4C0D /* Build configuration list for PBXNativeTarget "Alamofire" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 9A20D9C5346766D8C4243E542E6C0E31 /* Debug */, + 78F0A7E7490F24509D56845F81922CF6 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 72FDCC61040C0C672F23959415CAEFC6 /* Build configuration list for PBXAggregateTarget "GoogleMaps" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 9D1BF7F4B0F06AA9119AB22878447971 /* Debug */, + 2B51F82FE490FF29228A173F842AB02D /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + A46249E8E4E7A30292AF6969CA1290B0 /* Build configuration list for PBXNativeTarget "Google-Maps-iOS-Utils" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + DBBDA79EE8382D8FDE88756C5497ED26 /* Debug */, + 088448C7DB72BF0EE7EB2288E87DECEF /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = BFDFE7DC352907FC980B868725387E98 /* Project object */; +} diff --git a/Pods/Pods.xcodeproj/xcuserdata/roshka.xcuserdatad/xcschemes/Alamofire.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/roshka.xcuserdatad/xcschemes/Alamofire.xcscheme new file mode 100644 index 0000000..bc06c13 --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/roshka.xcuserdatad/xcschemes/Alamofire.xcscheme @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/roshka.xcuserdatad/xcschemes/Google-Maps-iOS-Utils.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/roshka.xcuserdatad/xcschemes/Google-Maps-iOS-Utils.xcscheme new file mode 100644 index 0000000..f78e22f --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/roshka.xcuserdatad/xcschemes/Google-Maps-iOS-Utils.xcscheme @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/roshka.xcuserdatad/xcschemes/GoogleMaps.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/roshka.xcuserdatad/xcschemes/GoogleMaps.xcscheme new file mode 100644 index 0000000..114deb5 --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/roshka.xcuserdatad/xcschemes/GoogleMaps.xcscheme @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/roshka.xcuserdatad/xcschemes/GooglePlaces.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/roshka.xcuserdatad/xcschemes/GooglePlaces.xcscheme new file mode 100644 index 0000000..785ad22 --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/roshka.xcuserdatad/xcschemes/GooglePlaces.xcscheme @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/roshka.xcuserdatad/xcschemes/Pods-ProductosPY.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/roshka.xcuserdatad/xcschemes/Pods-ProductosPY.xcscheme new file mode 100644 index 0000000..805da44 --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/roshka.xcuserdatad/xcschemes/Pods-ProductosPY.xcscheme @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/roshka.xcuserdatad/xcschemes/xcschememanagement.plist b/Pods/Pods.xcodeproj/xcuserdata/roshka.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..e7e485e --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/roshka.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,46 @@ + + + + + SchemeUserState + + Alamofire.xcscheme + + isShown + + orderHint + 0 + + Google-Maps-iOS-Utils.xcscheme + + isShown + + orderHint + 1 + + GoogleMaps.xcscheme + + isShown + + orderHint + 2 + + GooglePlaces.xcscheme + + isShown + + orderHint + 3 + + Pods-ProductosPY.xcscheme + + isShown + + orderHint + 4 + + + SuppressBuildableAutocreation + + + diff --git a/Pods/Target Support Files/Alamofire/Alamofire-Info.plist b/Pods/Target Support Files/Alamofire/Alamofire-Info.plist new file mode 100644 index 0000000..b8fc464 --- /dev/null +++ b/Pods/Target Support Files/Alamofire/Alamofire-Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 5.0.2 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Pods/Target Support Files/Alamofire/Alamofire-dummy.m b/Pods/Target Support Files/Alamofire/Alamofire-dummy.m new file mode 100644 index 0000000..a6c4594 --- /dev/null +++ b/Pods/Target Support Files/Alamofire/Alamofire-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_Alamofire : NSObject +@end +@implementation PodsDummy_Alamofire +@end diff --git a/Pods/Target Support Files/Alamofire/Alamofire-prefix.pch b/Pods/Target Support Files/Alamofire/Alamofire-prefix.pch new file mode 100644 index 0000000..beb2a24 --- /dev/null +++ b/Pods/Target Support Files/Alamofire/Alamofire-prefix.pch @@ -0,0 +1,12 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + diff --git a/Pods/Target Support Files/Alamofire/Alamofire-umbrella.h b/Pods/Target Support Files/Alamofire/Alamofire-umbrella.h new file mode 100644 index 0000000..00014e3 --- /dev/null +++ b/Pods/Target Support Files/Alamofire/Alamofire-umbrella.h @@ -0,0 +1,16 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + + +FOUNDATION_EXPORT double AlamofireVersionNumber; +FOUNDATION_EXPORT const unsigned char AlamofireVersionString[]; + diff --git a/Pods/Target Support Files/Alamofire/Alamofire.debug.xcconfig b/Pods/Target Support Files/Alamofire/Alamofire.debug.xcconfig new file mode 100644 index 0000000..385cdcf --- /dev/null +++ b/Pods/Target Support Files/Alamofire/Alamofire.debug.xcconfig @@ -0,0 +1,11 @@ +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/Alamofire +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +OTHER_LDFLAGS = $(inherited) -framework "CFNetwork" +OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/Alamofire +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Pods/Target Support Files/Alamofire/Alamofire.modulemap b/Pods/Target Support Files/Alamofire/Alamofire.modulemap new file mode 100644 index 0000000..d1f125f --- /dev/null +++ b/Pods/Target Support Files/Alamofire/Alamofire.modulemap @@ -0,0 +1,6 @@ +framework module Alamofire { + umbrella header "Alamofire-umbrella.h" + + export * + module * { export * } +} diff --git a/Pods/Target Support Files/Alamofire/Alamofire.release.xcconfig b/Pods/Target Support Files/Alamofire/Alamofire.release.xcconfig new file mode 100644 index 0000000..385cdcf --- /dev/null +++ b/Pods/Target Support Files/Alamofire/Alamofire.release.xcconfig @@ -0,0 +1,11 @@ +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/Alamofire +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +OTHER_LDFLAGS = $(inherited) -framework "CFNetwork" +OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/Alamofire +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Pods/Target Support Files/Google-Maps-iOS-Utils/Google-Maps-iOS-Utils-Info.plist b/Pods/Target Support Files/Google-Maps-iOS-Utils/Google-Maps-iOS-Utils-Info.plist new file mode 100644 index 0000000..793d31a --- /dev/null +++ b/Pods/Target Support Files/Google-Maps-iOS-Utils/Google-Maps-iOS-Utils-Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 3.1.1 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Pods/Target Support Files/Google-Maps-iOS-Utils/Google-Maps-iOS-Utils-dummy.m b/Pods/Target Support Files/Google-Maps-iOS-Utils/Google-Maps-iOS-Utils-dummy.m new file mode 100644 index 0000000..b124ae8 --- /dev/null +++ b/Pods/Target Support Files/Google-Maps-iOS-Utils/Google-Maps-iOS-Utils-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_Google_Maps_iOS_Utils : NSObject +@end +@implementation PodsDummy_Google_Maps_iOS_Utils +@end diff --git a/Pods/Target Support Files/Google-Maps-iOS-Utils/Google-Maps-iOS-Utils-prefix.pch b/Pods/Target Support Files/Google-Maps-iOS-Utils/Google-Maps-iOS-Utils-prefix.pch new file mode 100644 index 0000000..beb2a24 --- /dev/null +++ b/Pods/Target Support Files/Google-Maps-iOS-Utils/Google-Maps-iOS-Utils-prefix.pch @@ -0,0 +1,12 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + diff --git a/Pods/Target Support Files/Google-Maps-iOS-Utils/Google-Maps-iOS-Utils-umbrella.h b/Pods/Target Support Files/Google-Maps-iOS-Utils/Google-Maps-iOS-Utils-umbrella.h new file mode 100644 index 0000000..beeae15 --- /dev/null +++ b/Pods/Target Support Files/Google-Maps-iOS-Utils/Google-Maps-iOS-Utils-umbrella.h @@ -0,0 +1,55 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + +#import "GMUClusterAlgorithm.h" +#import "GMUGridBasedClusterAlgorithm.h" +#import "GMUNonHierarchicalDistanceBasedAlgorithm.h" +#import "GMUSimpleClusterAlgorithm.h" +#import "GMUWrappingDictionaryKey.h" +#import "GMUCluster.h" +#import "GMUClusterItem.h" +#import "GMUClusterManager+Testing.h" +#import "GMUClusterManager.h" +#import "GMUStaticCluster.h" +#import "GMUClusterIconGenerator.h" +#import "GMUClusterRenderer.h" +#import "GMUDefaultClusterIconGenerator+Testing.h" +#import "GMUDefaultClusterIconGenerator.h" +#import "GMUDefaultClusterRenderer.h" +#import "GMUGeoJSONParser.h" +#import "GMUGeometryRenderer+Testing.h" +#import "GMUGeometryRenderer.h" +#import "GMUKMLParser.h" +#import "GMUFeature.h" +#import "GMUGeometry.h" +#import "GMUGeometryCollection.h" +#import "GMUGeometryContainer.h" +#import "GMUGroundOverlay.h" +#import "GMULineString.h" +#import "GMUPair.h" +#import "GMUPlacemark.h" +#import "GMUPoint.h" +#import "GMUPolygon.h" +#import "GMUStyle.h" +#import "GMUStyleMap.h" +#import "GMUGradient.h" +#import "GMUHeatmapTileLayer.h" +#import "GMUWeightedLatLng.h" +#import "GQTBounds.h" +#import "GQTPoint.h" +#import "GQTPointQuadTree.h" +#import "GQTPointQuadTreeChild.h" +#import "GQTPointQuadTreeItem.h" + +FOUNDATION_EXPORT double GoogleMapsUtilsVersionNumber; +FOUNDATION_EXPORT const unsigned char GoogleMapsUtilsVersionString[]; + diff --git a/Pods/Target Support Files/Google-Maps-iOS-Utils/Google-Maps-iOS-Utils.debug.xcconfig b/Pods/Target Support Files/Google-Maps-iOS-Utils/Google-Maps-iOS-Utils.debug.xcconfig new file mode 100644 index 0000000..457a3ab --- /dev/null +++ b/Pods/Target Support Files/Google-Maps-iOS-Utils/Google-Maps-iOS-Utils.debug.xcconfig @@ -0,0 +1,10 @@ +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/Google-Maps-iOS-Utils +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/GoogleMaps/Base/Frameworks" "${PODS_ROOT}/GoogleMaps/Maps/Frameworks" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/Google-Maps-iOS-Utils +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Pods/Target Support Files/Google-Maps-iOS-Utils/Google-Maps-iOS-Utils.modulemap b/Pods/Target Support Files/Google-Maps-iOS-Utils/Google-Maps-iOS-Utils.modulemap new file mode 100644 index 0000000..9fdc9be --- /dev/null +++ b/Pods/Target Support Files/Google-Maps-iOS-Utils/Google-Maps-iOS-Utils.modulemap @@ -0,0 +1,6 @@ +framework module GoogleMapsUtils { + umbrella header "Google-Maps-iOS-Utils-umbrella.h" + + export * + module * { export * } +} diff --git a/Pods/Target Support Files/Google-Maps-iOS-Utils/Google-Maps-iOS-Utils.release.xcconfig b/Pods/Target Support Files/Google-Maps-iOS-Utils/Google-Maps-iOS-Utils.release.xcconfig new file mode 100644 index 0000000..457a3ab --- /dev/null +++ b/Pods/Target Support Files/Google-Maps-iOS-Utils/Google-Maps-iOS-Utils.release.xcconfig @@ -0,0 +1,10 @@ +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/Google-Maps-iOS-Utils +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/GoogleMaps/Base/Frameworks" "${PODS_ROOT}/GoogleMaps/Maps/Frameworks" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/Google-Maps-iOS-Utils +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Pods/Target Support Files/GoogleMaps/GoogleMaps.debug.xcconfig b/Pods/Target Support Files/GoogleMaps/GoogleMaps.debug.xcconfig new file mode 100644 index 0000000..4f0a2e6 --- /dev/null +++ b/Pods/Target Support Files/GoogleMaps/GoogleMaps.debug.xcconfig @@ -0,0 +1,11 @@ +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/GoogleMaps +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/GoogleMaps/Base/Frameworks" "${PODS_ROOT}/GoogleMaps/Maps/Frameworks" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +OTHER_LDFLAGS = $(inherited) -l"c++" -l"z" -framework "Accelerate" -framework "CoreData" -framework "CoreGraphics" -framework "CoreImage" -framework "CoreLocation" -framework "CoreTelephony" -framework "CoreText" -framework "GLKit" -framework "ImageIO" -framework "Metal" -framework "OpenGLES" -framework "QuartzCore" -framework "SystemConfiguration" -framework "UIKit" +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/GoogleMaps +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Pods/Target Support Files/GoogleMaps/GoogleMaps.release.xcconfig b/Pods/Target Support Files/GoogleMaps/GoogleMaps.release.xcconfig new file mode 100644 index 0000000..4f0a2e6 --- /dev/null +++ b/Pods/Target Support Files/GoogleMaps/GoogleMaps.release.xcconfig @@ -0,0 +1,11 @@ +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/GoogleMaps +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/GoogleMaps/Base/Frameworks" "${PODS_ROOT}/GoogleMaps/Maps/Frameworks" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +OTHER_LDFLAGS = $(inherited) -l"c++" -l"z" -framework "Accelerate" -framework "CoreData" -framework "CoreGraphics" -framework "CoreImage" -framework "CoreLocation" -framework "CoreTelephony" -framework "CoreText" -framework "GLKit" -framework "ImageIO" -framework "Metal" -framework "OpenGLES" -framework "QuartzCore" -framework "SystemConfiguration" -framework "UIKit" +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/GoogleMaps +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Pods/Target Support Files/GooglePlaces/GooglePlaces.debug.xcconfig b/Pods/Target Support Files/GooglePlaces/GooglePlaces.debug.xcconfig new file mode 100644 index 0000000..04411f9 --- /dev/null +++ b/Pods/Target Support Files/GooglePlaces/GooglePlaces.debug.xcconfig @@ -0,0 +1,11 @@ +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/GooglePlaces +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/GoogleMaps/Base/Frameworks" "${PODS_ROOT}/GoogleMaps/Maps/Frameworks" "${PODS_ROOT}/GooglePlaces/Frameworks" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +OTHER_LDFLAGS = $(inherited) -framework "Accelerate" -framework "CoreData" -framework "CoreGraphics" -framework "CoreImage" -framework "CoreLocation" -framework "CoreTelephony" -framework "CoreText" -framework "GLKit" -framework "ImageIO" -framework "Metal" -framework "OpenGLES" -framework "QuartzCore" -framework "SystemConfiguration" -framework "UIKit" +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/GooglePlaces +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Pods/Target Support Files/GooglePlaces/GooglePlaces.release.xcconfig b/Pods/Target Support Files/GooglePlaces/GooglePlaces.release.xcconfig new file mode 100644 index 0000000..04411f9 --- /dev/null +++ b/Pods/Target Support Files/GooglePlaces/GooglePlaces.release.xcconfig @@ -0,0 +1,11 @@ +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/GooglePlaces +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/GoogleMaps/Base/Frameworks" "${PODS_ROOT}/GoogleMaps/Maps/Frameworks" "${PODS_ROOT}/GooglePlaces/Frameworks" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +OTHER_LDFLAGS = $(inherited) -framework "Accelerate" -framework "CoreData" -framework "CoreGraphics" -framework "CoreImage" -framework "CoreLocation" -framework "CoreTelephony" -framework "CoreText" -framework "GLKit" -framework "ImageIO" -framework "Metal" -framework "OpenGLES" -framework "QuartzCore" -framework "SystemConfiguration" -framework "UIKit" +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/GooglePlaces +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Pods/Target Support Files/Pods-ProductosPY/Pods-ProductosPY-Info.plist b/Pods/Target Support Files/Pods-ProductosPY/Pods-ProductosPY-Info.plist new file mode 100644 index 0000000..2243fe6 --- /dev/null +++ b/Pods/Target Support Files/Pods-ProductosPY/Pods-ProductosPY-Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0.0 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Pods/Target Support Files/Pods-ProductosPY/Pods-ProductosPY-acknowledgements.markdown b/Pods/Target Support Files/Pods-ProductosPY/Pods-ProductosPY-acknowledgements.markdown new file mode 100644 index 0000000..5c22f2d --- /dev/null +++ b/Pods/Target Support Files/Pods-ProductosPY/Pods-ProductosPY-acknowledgements.markdown @@ -0,0 +1,229 @@ +# Acknowledgements +This application makes use of the following third party libraries: + +## Alamofire + +Copyright (c) 2014-2020 Alamofire Software Foundation (http://alamofire.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 +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. + + +## Google-Maps-iOS-Utils + +Apache License +Version 2.0, January 2004 +http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, and +distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the copyright +owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other entities +that control, are controlled by, or are under common control with that entity. +For the purposes of this definition, "control" means (i) the power, direct or +indirect, to cause the direction or management of such entity, whether by +contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the +outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising +permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, including +but not limited to software source code, documentation source, and configuration +files. + +"Object" form shall mean any form resulting from mechanical transformation or +translation of a Source form, including but not limited to compiled object code, +generated documentation, and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, made +available under the License, as indicated by a copyright notice that is included +in or attached to the work (an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that +is based on (or derived from) the Work and for which the editorial revisions, +annotations, elaborations, or other modifications represent, as a whole, an +original work of authorship. For the purposes of this License, Derivative Works +shall not include works that remain separable from, or merely link (or bind by +name) to the interfaces of, the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original version +of the Work and any modifications or additions to that Work or Derivative Works +thereof, that is intentionally submitted to Licensor for inclusion in the Work +by the copyright owner or by an individual or Legal Entity authorized to submit +on behalf of the copyright owner. For the purposes of this definition, +"submitted" means any form of electronic, verbal, or written communication sent +to the Licensor or its representatives, including but not limited to +communication on electronic mailing lists, source code control systems, and +issue tracking systems that are managed by, or on behalf of, the Licensor for +the purpose of discussing and improving the Work, but excluding communication +that is conspicuously marked or otherwise designated in writing by the copyright +owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf +of whom a Contribution has been received by Licensor and subsequently +incorporated within the Work. + +2. Grant of Copyright License. + +Subject to the terms and conditions of this License, each Contributor hereby +grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, +irrevocable copyright license to reproduce, prepare Derivative Works of, +publicly display, publicly perform, sublicense, and distribute the Work and such +Derivative Works in Source or Object form. + +3. Grant of Patent License. + +Subject to the terms and conditions of this License, each Contributor hereby +grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, +irrevocable (except as stated in this section) patent license to make, have +made, use, offer to sell, sell, import, and otherwise transfer the Work, where +such license applies only to those patent claims licensable by such Contributor +that are necessarily infringed by their Contribution(s) alone or by combination +of their Contribution(s) with the Work to which such Contribution(s) was +submitted. If You institute patent litigation against any entity (including a +cross-claim or counterclaim in a lawsuit) alleging that the Work or a +Contribution incorporated within the Work constitutes direct or contributory +patent infringement, then any patent licenses granted to You under this License +for that Work shall terminate as of the date such litigation is filed. + +4. Redistribution. + +You may reproduce and distribute copies of the Work or Derivative Works thereof +in any medium, with or without modifications, and in Source or Object form, +provided that You meet the following conditions: + +You must give any other recipients of the Work or Derivative Works a copy of +this License; and +You must cause any modified files to carry prominent notices stating that You +changed the files; and +You must retain, in the Source form of any Derivative Works that You distribute, +all copyright, patent, trademark, and attribution notices from the Source form +of the Work, excluding those notices that do not pertain to any part of the +Derivative Works; and +If the Work includes a "NOTICE" text file as part of its distribution, then any +Derivative Works that You distribute must include a readable copy of the +attribution notices contained within such NOTICE file, excluding those notices +that do not pertain to any part of the Derivative Works, in at least one of the +following places: within a NOTICE text file distributed as part of the +Derivative Works; within the Source form or documentation, if provided along +with the Derivative Works; or, within a display generated by the Derivative +Works, if and wherever such third-party notices normally appear. The contents of +the NOTICE file are for informational purposes only and do not modify the +License. You may add Your own attribution notices within Derivative Works that +You distribute, alongside or as an addendum to the NOTICE text from the Work, +provided that such additional attribution notices cannot be construed as +modifying the License. +You may add Your own copyright statement to Your modifications and may provide +additional or different license terms and conditions for use, reproduction, or +distribution of Your modifications, or for any such Derivative Works as a whole, +provided Your use, reproduction, and distribution of the Work otherwise complies +with the conditions stated in this License. + +5. Submission of Contributions. + +Unless You explicitly state otherwise, any Contribution intentionally submitted +for inclusion in the Work by You to the Licensor shall be under the terms and +conditions of this License, without any additional terms or conditions. +Notwithstanding the above, nothing herein shall supersede or modify the terms of +any separate license agreement you may have executed with Licensor regarding +such Contributions. + +6. Trademarks. + +This License does not grant permission to use the trade names, trademarks, +service marks, or product names of the Licensor, except as required for +reasonable and customary use in describing the origin of the Work and +reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. + +Unless required by applicable law or agreed to in writing, Licensor provides the +Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, +including, without limitation, any warranties or conditions of TITLE, +NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are +solely responsible for determining the appropriateness of using or +redistributing the Work and assume any risks associated with Your exercise of +permissions under this License. + +8. Limitation of Liability. + +In no event and under no legal theory, whether in tort (including negligence), +contract, or otherwise, unless required by applicable law (such as deliberate +and grossly negligent acts) or agreed to in writing, shall any Contributor be +liable to You for damages, including any direct, indirect, special, incidental, +or consequential damages of any character arising as a result of this License or +out of the use or inability to use the Work (including but not limited to +damages for loss of goodwill, work stoppage, computer failure or malfunction, or +any and all other commercial damages or losses), even if such Contributor has +been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. + +While redistributing the Work or Derivative Works thereof, You may choose to +offer, and charge a fee for, acceptance of support, warranty, indemnity, or +other liability obligations and/or rights consistent with this License. However, +in accepting such obligations, You may act only on Your own behalf and on Your +sole responsibility, not on behalf of any other Contributor, and only if You +agree to indemnify, defend, and hold each Contributor harmless for any liability +incurred by, or claims asserted against, such Contributor by reason of your +accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work + +To apply the Apache License to your work, attach the following boilerplate +notice, with the fields enclosed by brackets "[]" replaced with your own +identifying information. (Don't include the brackets!) The text should be +enclosed in the appropriate comment syntax for the file format. We also +recommend that a file or class name and description of purpose be included on +the same "printed page" as the copyright notice for easier identification within +third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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. + + +## GoogleMaps + +Copyright 2020 Google + +## GooglePlaces + +Copyright 2020 Google +Generated by CocoaPods - https://cocoapods.org diff --git a/Pods/Target Support Files/Pods-ProductosPY/Pods-ProductosPY-acknowledgements.plist b/Pods/Target Support Files/Pods-ProductosPY/Pods-ProductosPY-acknowledgements.plist new file mode 100644 index 0000000..8c6ca72 --- /dev/null +++ b/Pods/Target Support Files/Pods-ProductosPY/Pods-ProductosPY-acknowledgements.plist @@ -0,0 +1,279 @@ + + + + + PreferenceSpecifiers + + + FooterText + This application makes use of the following third party libraries: + Title + Acknowledgements + Type + PSGroupSpecifier + + + FooterText + Copyright (c) 2014-2020 Alamofire Software Foundation (http://alamofire.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 +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. + + License + MIT + Title + Alamofire + Type + PSGroupSpecifier + + + FooterText + Apache License +Version 2.0, January 2004 +http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, and +distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the copyright +owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other entities +that control, are controlled by, or are under common control with that entity. +For the purposes of this definition, "control" means (i) the power, direct or +indirect, to cause the direction or management of such entity, whether by +contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the +outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising +permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, including +but not limited to software source code, documentation source, and configuration +files. + +"Object" form shall mean any form resulting from mechanical transformation or +translation of a Source form, including but not limited to compiled object code, +generated documentation, and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, made +available under the License, as indicated by a copyright notice that is included +in or attached to the work (an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that +is based on (or derived from) the Work and for which the editorial revisions, +annotations, elaborations, or other modifications represent, as a whole, an +original work of authorship. For the purposes of this License, Derivative Works +shall not include works that remain separable from, or merely link (or bind by +name) to the interfaces of, the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original version +of the Work and any modifications or additions to that Work or Derivative Works +thereof, that is intentionally submitted to Licensor for inclusion in the Work +by the copyright owner or by an individual or Legal Entity authorized to submit +on behalf of the copyright owner. For the purposes of this definition, +"submitted" means any form of electronic, verbal, or written communication sent +to the Licensor or its representatives, including but not limited to +communication on electronic mailing lists, source code control systems, and +issue tracking systems that are managed by, or on behalf of, the Licensor for +the purpose of discussing and improving the Work, but excluding communication +that is conspicuously marked or otherwise designated in writing by the copyright +owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf +of whom a Contribution has been received by Licensor and subsequently +incorporated within the Work. + +2. Grant of Copyright License. + +Subject to the terms and conditions of this License, each Contributor hereby +grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, +irrevocable copyright license to reproduce, prepare Derivative Works of, +publicly display, publicly perform, sublicense, and distribute the Work and such +Derivative Works in Source or Object form. + +3. Grant of Patent License. + +Subject to the terms and conditions of this License, each Contributor hereby +grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, +irrevocable (except as stated in this section) patent license to make, have +made, use, offer to sell, sell, import, and otherwise transfer the Work, where +such license applies only to those patent claims licensable by such Contributor +that are necessarily infringed by their Contribution(s) alone or by combination +of their Contribution(s) with the Work to which such Contribution(s) was +submitted. If You institute patent litigation against any entity (including a +cross-claim or counterclaim in a lawsuit) alleging that the Work or a +Contribution incorporated within the Work constitutes direct or contributory +patent infringement, then any patent licenses granted to You under this License +for that Work shall terminate as of the date such litigation is filed. + +4. Redistribution. + +You may reproduce and distribute copies of the Work or Derivative Works thereof +in any medium, with or without modifications, and in Source or Object form, +provided that You meet the following conditions: + +You must give any other recipients of the Work or Derivative Works a copy of +this License; and +You must cause any modified files to carry prominent notices stating that You +changed the files; and +You must retain, in the Source form of any Derivative Works that You distribute, +all copyright, patent, trademark, and attribution notices from the Source form +of the Work, excluding those notices that do not pertain to any part of the +Derivative Works; and +If the Work includes a "NOTICE" text file as part of its distribution, then any +Derivative Works that You distribute must include a readable copy of the +attribution notices contained within such NOTICE file, excluding those notices +that do not pertain to any part of the Derivative Works, in at least one of the +following places: within a NOTICE text file distributed as part of the +Derivative Works; within the Source form or documentation, if provided along +with the Derivative Works; or, within a display generated by the Derivative +Works, if and wherever such third-party notices normally appear. The contents of +the NOTICE file are for informational purposes only and do not modify the +License. You may add Your own attribution notices within Derivative Works that +You distribute, alongside or as an addendum to the NOTICE text from the Work, +provided that such additional attribution notices cannot be construed as +modifying the License. +You may add Your own copyright statement to Your modifications and may provide +additional or different license terms and conditions for use, reproduction, or +distribution of Your modifications, or for any such Derivative Works as a whole, +provided Your use, reproduction, and distribution of the Work otherwise complies +with the conditions stated in this License. + +5. Submission of Contributions. + +Unless You explicitly state otherwise, any Contribution intentionally submitted +for inclusion in the Work by You to the Licensor shall be under the terms and +conditions of this License, without any additional terms or conditions. +Notwithstanding the above, nothing herein shall supersede or modify the terms of +any separate license agreement you may have executed with Licensor regarding +such Contributions. + +6. Trademarks. + +This License does not grant permission to use the trade names, trademarks, +service marks, or product names of the Licensor, except as required for +reasonable and customary use in describing the origin of the Work and +reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. + +Unless required by applicable law or agreed to in writing, Licensor provides the +Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, +including, without limitation, any warranties or conditions of TITLE, +NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are +solely responsible for determining the appropriateness of using or +redistributing the Work and assume any risks associated with Your exercise of +permissions under this License. + +8. Limitation of Liability. + +In no event and under no legal theory, whether in tort (including negligence), +contract, or otherwise, unless required by applicable law (such as deliberate +and grossly negligent acts) or agreed to in writing, shall any Contributor be +liable to You for damages, including any direct, indirect, special, incidental, +or consequential damages of any character arising as a result of this License or +out of the use or inability to use the Work (including but not limited to +damages for loss of goodwill, work stoppage, computer failure or malfunction, or +any and all other commercial damages or losses), even if such Contributor has +been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. + +While redistributing the Work or Derivative Works thereof, You may choose to +offer, and charge a fee for, acceptance of support, warranty, indemnity, or +other liability obligations and/or rights consistent with this License. However, +in accepting such obligations, You may act only on Your own behalf and on Your +sole responsibility, not on behalf of any other Contributor, and only if You +agree to indemnify, defend, and hold each Contributor harmless for any liability +incurred by, or claims asserted against, such Contributor by reason of your +accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work + +To apply the Apache License to your work, attach the following boilerplate +notice, with the fields enclosed by brackets "[]" replaced with your own +identifying information. (Don't include the brackets!) The text should be +enclosed in the appropriate comment syntax for the file format. We also +recommend that a file or class name and description of purpose be included on +the same "printed page" as the copyright notice for easier identification within +third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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. + + License + Apache 2.0 + Title + Google-Maps-iOS-Utils + Type + PSGroupSpecifier + + + FooterText + Copyright 2020 Google + License + Copyright + Title + GoogleMaps + Type + PSGroupSpecifier + + + FooterText + Copyright 2020 Google + License + Copyright + Title + GooglePlaces + Type + PSGroupSpecifier + + + FooterText + Generated by CocoaPods - https://cocoapods.org + Title + + Type + PSGroupSpecifier + + + StringsTable + Acknowledgements + Title + Acknowledgements + + diff --git a/Pods/Target Support Files/Pods-ProductosPY/Pods-ProductosPY-dummy.m b/Pods/Target Support Files/Pods-ProductosPY/Pods-ProductosPY-dummy.m new file mode 100644 index 0000000..5a41d38 --- /dev/null +++ b/Pods/Target Support Files/Pods-ProductosPY/Pods-ProductosPY-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_Pods_ProductosPY : NSObject +@end +@implementation PodsDummy_Pods_ProductosPY +@end diff --git a/Pods/Target Support Files/Pods-ProductosPY/Pods-ProductosPY-frameworks-Debug-input-files.xcfilelist b/Pods/Target Support Files/Pods-ProductosPY/Pods-ProductosPY-frameworks-Debug-input-files.xcfilelist new file mode 100644 index 0000000..9d155be --- /dev/null +++ b/Pods/Target Support Files/Pods-ProductosPY/Pods-ProductosPY-frameworks-Debug-input-files.xcfilelist @@ -0,0 +1,2 @@ +${PODS_ROOT}/Target Support Files/Pods-ProductosPY/Pods-ProductosPY-frameworks.sh +${BUILT_PRODUCTS_DIR}/Alamofire/Alamofire.framework \ No newline at end of file diff --git a/Pods/Target Support Files/Pods-ProductosPY/Pods-ProductosPY-frameworks-Debug-output-files.xcfilelist b/Pods/Target Support Files/Pods-ProductosPY/Pods-ProductosPY-frameworks-Debug-output-files.xcfilelist new file mode 100644 index 0000000..f5cce83 --- /dev/null +++ b/Pods/Target Support Files/Pods-ProductosPY/Pods-ProductosPY-frameworks-Debug-output-files.xcfilelist @@ -0,0 +1 @@ +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Alamofire.framework \ No newline at end of file diff --git a/Pods/Target Support Files/Pods-ProductosPY/Pods-ProductosPY-frameworks-Release-input-files.xcfilelist b/Pods/Target Support Files/Pods-ProductosPY/Pods-ProductosPY-frameworks-Release-input-files.xcfilelist new file mode 100644 index 0000000..9d155be --- /dev/null +++ b/Pods/Target Support Files/Pods-ProductosPY/Pods-ProductosPY-frameworks-Release-input-files.xcfilelist @@ -0,0 +1,2 @@ +${PODS_ROOT}/Target Support Files/Pods-ProductosPY/Pods-ProductosPY-frameworks.sh +${BUILT_PRODUCTS_DIR}/Alamofire/Alamofire.framework \ No newline at end of file diff --git a/Pods/Target Support Files/Pods-ProductosPY/Pods-ProductosPY-frameworks-Release-output-files.xcfilelist b/Pods/Target Support Files/Pods-ProductosPY/Pods-ProductosPY-frameworks-Release-output-files.xcfilelist new file mode 100644 index 0000000..f5cce83 --- /dev/null +++ b/Pods/Target Support Files/Pods-ProductosPY/Pods-ProductosPY-frameworks-Release-output-files.xcfilelist @@ -0,0 +1 @@ +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Alamofire.framework \ No newline at end of file diff --git a/Pods/Target Support Files/Pods-ProductosPY/Pods-ProductosPY-frameworks.sh b/Pods/Target Support Files/Pods-ProductosPY/Pods-ProductosPY-frameworks.sh new file mode 100755 index 0000000..feabf41 --- /dev/null +++ b/Pods/Target Support Files/Pods-ProductosPY/Pods-ProductosPY-frameworks.sh @@ -0,0 +1,207 @@ +#!/bin/sh +set -e +set -u +set -o pipefail + +function on_error { + echo "$(realpath -mq "${0}"):$1: error: Unexpected failure" +} +trap 'on_error $LINENO' ERR + +if [ -z ${FRAMEWORKS_FOLDER_PATH+x} ]; then + # If FRAMEWORKS_FOLDER_PATH is not set, then there's nowhere for us to copy + # frameworks to, so exit 0 (signalling the script phase was successful). + exit 0 +fi + +echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" +mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + +COCOAPODS_PARALLEL_CODE_SIGN="${COCOAPODS_PARALLEL_CODE_SIGN:-false}" +SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" + +# Used as a return value for each invocation of `strip_invalid_archs` function. +STRIP_BINARY_RETVAL=0 + +# This protects against multiple targets copying the same framework dependency at the same time. The solution +# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html +RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") + +# Copies and strips a vendored framework +install_framework() +{ + if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then + local source="${BUILT_PRODUCTS_DIR}/$1" + elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then + local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")" + elif [ -r "$1" ]; then + local source="$1" + fi + + local destination="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + + if [ -L "${source}" ]; then + echo "Symlinked..." + source="$(readlink "${source}")" + fi + + # Use filter instead of exclude so missing patterns don't throw errors. + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" + + local basename + basename="$(basename -s .framework "$1")" + binary="${destination}/${basename}.framework/${basename}" + + if ! [ -r "$binary" ]; then + binary="${destination}/${basename}" + elif [ -L "${binary}" ]; then + echo "Destination binary is symlinked..." + dirname="$(dirname "${binary}")" + binary="${dirname}/$(readlink "${binary}")" + fi + + # Strip invalid architectures so "fat" simulator / device frameworks work on device + if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then + strip_invalid_archs "$binary" + fi + + # Resign the code if required by the build settings to avoid unstable apps + code_sign_if_enabled "${destination}/$(basename "$1")" + + # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7. + if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then + local swift_runtime_libs + swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u) + for lib in $swift_runtime_libs; do + echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" + rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" + code_sign_if_enabled "${destination}/${lib}" + done + fi +} + +# Copies and strips a vendored dSYM +install_dsym() { + local source="$1" + warn_missing_arch=${2:-true} + if [ -r "$source" ]; then + # Copy the dSYM into the targets temp dir. + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${DERIVED_FILES_DIR}\"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${DERIVED_FILES_DIR}" + + local basename + basename="$(basename -s .dSYM "$source")" + binary_name="$(ls "$source/Contents/Resources/DWARF")" + binary="${DERIVED_FILES_DIR}/${basename}.dSYM/Contents/Resources/DWARF/${binary_name}" + + # Strip invalid architectures so "fat" simulator / device frameworks work on device + if [[ "$(file "$binary")" == *"Mach-O "*"dSYM companion"* ]]; then + strip_invalid_archs "$binary" "$warn_missing_arch" + fi + + if [[ $STRIP_BINARY_RETVAL == 1 ]]; then + # Move the stripped file into its final destination. + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${DERIVED_FILES_DIR}/${basename}.framework.dSYM\" \"${DWARF_DSYM_FOLDER_PATH}\"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${DERIVED_FILES_DIR}/${basename}.dSYM" "${DWARF_DSYM_FOLDER_PATH}" + else + # The dSYM was not stripped at all, in this case touch a fake folder so the input/output paths from Xcode do not reexecute this script because the file is missing. + touch "${DWARF_DSYM_FOLDER_PATH}/${basename}.dSYM" + fi + fi +} + +# Copies the bcsymbolmap files of a vendored framework +install_bcsymbolmap() { + local bcsymbolmap_path="$1" + local destination="${BUILT_PRODUCTS_DIR}" + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${bcsymbolmap_path}" "${destination}"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${bcsymbolmap_path}" "${destination}" +} + +# Signs a framework with the provided identity +code_sign_if_enabled() { + if [ -n "${EXPANDED_CODE_SIGN_IDENTITY:-}" -a "${CODE_SIGNING_REQUIRED:-}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then + # Use the current code_sign_identity + echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" + local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS:-} --preserve-metadata=identifier,entitlements '$1'" + + if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then + code_sign_cmd="$code_sign_cmd &" + fi + echo "$code_sign_cmd" + eval "$code_sign_cmd" + fi +} + +# Strip invalid architectures +strip_invalid_archs() { + binary="$1" + warn_missing_arch=${2:-true} + # Get architectures for current target binary + binary_archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | awk '{$1=$1;print}' | rev)" + # Intersect them with the architectures we are building for + intersected_archs="$(echo ${ARCHS[@]} ${binary_archs[@]} | tr ' ' '\n' | sort | uniq -d)" + # If there are no archs supported by this binary then warn the user + if [[ -z "$intersected_archs" ]]; then + if [[ "$warn_missing_arch" == "true" ]]; then + echo "warning: [CP] Vendored binary '$binary' contains architectures ($binary_archs) none of which match the current build architectures ($ARCHS)." + fi + STRIP_BINARY_RETVAL=0 + return + fi + stripped="" + for arch in $binary_archs; do + if ! [[ "${ARCHS}" == *"$arch"* ]]; then + # Strip non-valid architectures in-place + lipo -remove "$arch" -output "$binary" "$binary" + stripped="$stripped $arch" + fi + done + if [[ "$stripped" ]]; then + echo "Stripped $binary of architectures:$stripped" + fi + STRIP_BINARY_RETVAL=1 +} + +install_artifact() { + artifact="$1" + base="$(basename "$artifact")" + case $base in + *.framework) + install_framework "$artifact" + ;; + *.dSYM) + # Suppress arch warnings since XCFrameworks will include many dSYM files + install_dsym "$artifact" "false" + ;; + *.bcsymbolmap) + install_bcsymbolmap "$artifact" + ;; + *) + echo "error: Unrecognized artifact "$artifact"" + ;; + esac +} + +copy_artifacts() { + file_list="$1" + while read artifact; do + install_artifact "$artifact" + done <$file_list +} + +ARTIFACT_LIST_FILE="${BUILT_PRODUCTS_DIR}/cocoapods-artifacts-${CONFIGURATION}.txt" +if [ -r "${ARTIFACT_LIST_FILE}" ]; then + copy_artifacts "${ARTIFACT_LIST_FILE}" +fi + +if [[ "$CONFIGURATION" == "Debug" ]]; then + install_framework "${BUILT_PRODUCTS_DIR}/Alamofire/Alamofire.framework" +fi +if [[ "$CONFIGURATION" == "Release" ]]; then + install_framework "${BUILT_PRODUCTS_DIR}/Alamofire/Alamofire.framework" +fi +if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then + wait +fi diff --git a/Pods/Target Support Files/Pods-ProductosPY/Pods-ProductosPY-resources-Debug-input-files.xcfilelist b/Pods/Target Support Files/Pods-ProductosPY/Pods-ProductosPY-resources-Debug-input-files.xcfilelist new file mode 100644 index 0000000..a74d21b --- /dev/null +++ b/Pods/Target Support Files/Pods-ProductosPY/Pods-ProductosPY-resources-Debug-input-files.xcfilelist @@ -0,0 +1,3 @@ +${PODS_ROOT}/Target Support Files/Pods-ProductosPY/Pods-ProductosPY-resources.sh +${PODS_ROOT}/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle +${PODS_ROOT}/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle \ No newline at end of file diff --git a/Pods/Target Support Files/Pods-ProductosPY/Pods-ProductosPY-resources-Debug-output-files.xcfilelist b/Pods/Target Support Files/Pods-ProductosPY/Pods-ProductosPY-resources-Debug-output-files.xcfilelist new file mode 100644 index 0000000..bd4c263 --- /dev/null +++ b/Pods/Target Support Files/Pods-ProductosPY/Pods-ProductosPY-resources-Debug-output-files.xcfilelist @@ -0,0 +1,2 @@ +${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/GoogleMaps.bundle +${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/GooglePlaces.bundle \ No newline at end of file diff --git a/Pods/Target Support Files/Pods-ProductosPY/Pods-ProductosPY-resources-Release-input-files.xcfilelist b/Pods/Target Support Files/Pods-ProductosPY/Pods-ProductosPY-resources-Release-input-files.xcfilelist new file mode 100644 index 0000000..a74d21b --- /dev/null +++ b/Pods/Target Support Files/Pods-ProductosPY/Pods-ProductosPY-resources-Release-input-files.xcfilelist @@ -0,0 +1,3 @@ +${PODS_ROOT}/Target Support Files/Pods-ProductosPY/Pods-ProductosPY-resources.sh +${PODS_ROOT}/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle +${PODS_ROOT}/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle \ No newline at end of file diff --git a/Pods/Target Support Files/Pods-ProductosPY/Pods-ProductosPY-resources-Release-output-files.xcfilelist b/Pods/Target Support Files/Pods-ProductosPY/Pods-ProductosPY-resources-Release-output-files.xcfilelist new file mode 100644 index 0000000..bd4c263 --- /dev/null +++ b/Pods/Target Support Files/Pods-ProductosPY/Pods-ProductosPY-resources-Release-output-files.xcfilelist @@ -0,0 +1,2 @@ +${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/GoogleMaps.bundle +${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/GooglePlaces.bundle \ No newline at end of file diff --git a/Pods/Target Support Files/Pods-ProductosPY/Pods-ProductosPY-resources.sh b/Pods/Target Support Files/Pods-ProductosPY/Pods-ProductosPY-resources.sh new file mode 100755 index 0000000..fefdf0c --- /dev/null +++ b/Pods/Target Support Files/Pods-ProductosPY/Pods-ProductosPY-resources.sh @@ -0,0 +1,131 @@ +#!/bin/sh +set -e +set -u +set -o pipefail + +function on_error { + echo "$(realpath -mq "${0}"):$1: error: Unexpected failure" +} +trap 'on_error $LINENO' ERR + +if [ -z ${UNLOCALIZED_RESOURCES_FOLDER_PATH+x} ]; then + # If UNLOCALIZED_RESOURCES_FOLDER_PATH is not set, then there's nowhere for us to copy + # resources to, so exit 0 (signalling the script phase was successful). + exit 0 +fi + +mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" + +RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt +> "$RESOURCES_TO_COPY" + +XCASSET_FILES=() + +# This protects against multiple targets copying the same framework dependency at the same time. The solution +# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html +RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") + +case "${TARGETED_DEVICE_FAMILY:-}" in + 1,2) + TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone" + ;; + 1) + TARGET_DEVICE_ARGS="--target-device iphone" + ;; + 2) + TARGET_DEVICE_ARGS="--target-device ipad" + ;; + 3) + TARGET_DEVICE_ARGS="--target-device tv" + ;; + 4) + TARGET_DEVICE_ARGS="--target-device watch" + ;; + *) + TARGET_DEVICE_ARGS="--target-device mac" + ;; +esac + +install_resource() +{ + if [[ "$1" = /* ]] ; then + RESOURCE_PATH="$1" + else + RESOURCE_PATH="${PODS_ROOT}/$1" + fi + if [[ ! -e "$RESOURCE_PATH" ]] ; then + cat << EOM +error: Resource "$RESOURCE_PATH" not found. Run 'pod install' to update the copy resources script. +EOM + exit 1 + fi + case $RESOURCE_PATH in + *.storyboard) + echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" || true + ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} + ;; + *.xib) + echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" || true + ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} + ;; + *.framework) + echo "mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true + mkdir -p "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + ;; + *.xcdatamodel) + echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH"`.mom\"" || true + xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodel`.mom" + ;; + *.xcdatamodeld) + echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd\"" || true + xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd" + ;; + *.xcmappingmodel) + echo "xcrun mapc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm\"" || true + xcrun mapc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm" + ;; + *.xcassets) + ABSOLUTE_XCASSET_FILE="$RESOURCE_PATH" + XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE") + ;; + *) + echo "$RESOURCE_PATH" || true + echo "$RESOURCE_PATH" >> "$RESOURCES_TO_COPY" + ;; + esac +} +if [[ "$CONFIGURATION" == "Debug" ]]; then + install_resource "${PODS_ROOT}/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle" + install_resource "${PODS_ROOT}/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle" +fi +if [[ "$CONFIGURATION" == "Release" ]]; then + install_resource "${PODS_ROOT}/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle" + install_resource "${PODS_ROOT}/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle" +fi + +mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +if [[ "${ACTION}" == "install" ]] && [[ "${SKIP_INSTALL}" == "NO" ]]; then + mkdir -p "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" + rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +fi +rm -f "$RESOURCES_TO_COPY" + +if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "${XCASSET_FILES:-}" ] +then + # Find all other xcassets (this unfortunately includes those of path pods and other targets). + OTHER_XCASSETS=$(find -L "$PWD" -iname "*.xcassets" -type d) + while read line; do + if [[ $line != "${PODS_ROOT}*" ]]; then + XCASSET_FILES+=("$line") + fi + done <<<"$OTHER_XCASSETS" + + if [ -z ${ASSETCATALOG_COMPILER_APPICON_NAME+x} ]; then + printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" + else + printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" --app-icon "${ASSETCATALOG_COMPILER_APPICON_NAME}" --output-partial-info-plist "${TARGET_TEMP_DIR}/assetcatalog_generated_info_cocoapods.plist" + fi +fi diff --git a/Pods/Target Support Files/Pods-ProductosPY/Pods-ProductosPY-umbrella.h b/Pods/Target Support Files/Pods-ProductosPY/Pods-ProductosPY-umbrella.h new file mode 100644 index 0000000..4e35c7c --- /dev/null +++ b/Pods/Target Support Files/Pods-ProductosPY/Pods-ProductosPY-umbrella.h @@ -0,0 +1,16 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + + +FOUNDATION_EXPORT double Pods_ProductosPYVersionNumber; +FOUNDATION_EXPORT const unsigned char Pods_ProductosPYVersionString[]; + diff --git a/Pods/Target Support Files/Pods-ProductosPY/Pods-ProductosPY.debug.xcconfig b/Pods/Target Support Files/Pods-ProductosPY/Pods-ProductosPY.debug.xcconfig new file mode 100644 index 0000000..eaf1dc7 --- /dev/null +++ b/Pods/Target Support Files/Pods-ProductosPY/Pods-ProductosPY.debug.xcconfig @@ -0,0 +1,12 @@ +ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Alamofire" "${PODS_CONFIGURATION_BUILD_DIR}/Google-Maps-iOS-Utils" "${PODS_ROOT}/GoogleMaps/Base/Frameworks" "${PODS_ROOT}/GoogleMaps/Maps/Frameworks" "${PODS_ROOT}/GooglePlaces/Frameworks" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Alamofire/Alamofire.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/Google-Maps-iOS-Utils/GoogleMapsUtils.framework/Headers" +LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' +OTHER_LDFLAGS = $(inherited) -ObjC -l"c++" -l"z" -framework "Accelerate" -framework "Alamofire" -framework "CFNetwork" -framework "CoreData" -framework "CoreGraphics" -framework "CoreImage" -framework "CoreLocation" -framework "CoreTelephony" -framework "CoreText" -framework "GLKit" -framework "GoogleMaps" -framework "GoogleMapsBase" -framework "GoogleMapsCore" -framework "GoogleMapsUtils" -framework "GooglePlaces" -framework "ImageIO" -framework "Metal" -framework "OpenGLES" -framework "QuartzCore" -framework "SystemConfiguration" -framework "UIKit" +OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_PODFILE_DIR_PATH = ${SRCROOT}/. +PODS_ROOT = ${SRCROOT}/Pods +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Pods/Target Support Files/Pods-ProductosPY/Pods-ProductosPY.modulemap b/Pods/Target Support Files/Pods-ProductosPY/Pods-ProductosPY.modulemap new file mode 100644 index 0000000..f2bbad8 --- /dev/null +++ b/Pods/Target Support Files/Pods-ProductosPY/Pods-ProductosPY.modulemap @@ -0,0 +1,6 @@ +framework module Pods_ProductosPY { + umbrella header "Pods-ProductosPY-umbrella.h" + + export * + module * { export * } +} diff --git a/Pods/Target Support Files/Pods-ProductosPY/Pods-ProductosPY.release.xcconfig b/Pods/Target Support Files/Pods-ProductosPY/Pods-ProductosPY.release.xcconfig new file mode 100644 index 0000000..eaf1dc7 --- /dev/null +++ b/Pods/Target Support Files/Pods-ProductosPY/Pods-ProductosPY.release.xcconfig @@ -0,0 +1,12 @@ +ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Alamofire" "${PODS_CONFIGURATION_BUILD_DIR}/Google-Maps-iOS-Utils" "${PODS_ROOT}/GoogleMaps/Base/Frameworks" "${PODS_ROOT}/GoogleMaps/Maps/Frameworks" "${PODS_ROOT}/GooglePlaces/Frameworks" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Alamofire/Alamofire.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/Google-Maps-iOS-Utils/GoogleMapsUtils.framework/Headers" +LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' +OTHER_LDFLAGS = $(inherited) -ObjC -l"c++" -l"z" -framework "Accelerate" -framework "Alamofire" -framework "CFNetwork" -framework "CoreData" -framework "CoreGraphics" -framework "CoreImage" -framework "CoreLocation" -framework "CoreTelephony" -framework "CoreText" -framework "GLKit" -framework "GoogleMaps" -framework "GoogleMapsBase" -framework "GoogleMapsCore" -framework "GoogleMapsUtils" -framework "GooglePlaces" -framework "ImageIO" -framework "Metal" -framework "OpenGLES" -framework "QuartzCore" -framework "SystemConfiguration" -framework "UIKit" +OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_PODFILE_DIR_PATH = ${SRCROOT}/. +PODS_ROOT = ${SRCROOT}/Pods +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/ProductosPY.xcodeproj/project.pbxproj b/ProductosPY.xcodeproj/project.pbxproj new file mode 100644 index 0000000..a9f036f --- /dev/null +++ b/ProductosPY.xcodeproj/project.pbxproj @@ -0,0 +1,501 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 51; + objects = { + +/* Begin PBXBuildFile section */ + 5FF85C0DA68B808CDC399639 /* Pods_ProductosPY.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 33852ED78B1405189468D0C4 /* Pods_ProductosPY.framework */; }; + BB5A71F62463773C00B51D4E /* PageView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BB5A71F52463773C00B51D4E /* PageView.xib */; }; + BB5A71F82465A25000B51D4E /* PageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB5A71F72465A25000B51D4E /* PageView.swift */; }; + BB5A71FB2465A5EC00B51D4E /* Constants.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB5A71FA2465A5EC00B51D4E /* Constants.swift */; }; + BB5A71FE2465C7D800B51D4E /* ScreenTwoViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB5A71FD2465C7D800B51D4E /* ScreenTwoViewController.swift */; }; + BB5A7201246610BE00B51D4E /* HTTPClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB5A7200246610BE00B51D4E /* HTTPClient.swift */; }; + BB5A72032466114400B51D4E /* APIError.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB5A72022466114400B51D4E /* APIError.swift */; }; + BB5A72052466117C00B51D4E /* APISessionManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB5A72042466117C00B51D4E /* APISessionManager.swift */; }; + BB5A7209246A1AFC00B51D4E /* FeatureCollection.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB5A7208246A1AFC00B51D4E /* FeatureCollection.swift */; }; + BBDA25AB2463193100819183 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBDA25AA2463193100819183 /* AppDelegate.swift */; }; + BBDA25AD2463193100819183 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBDA25AC2463193100819183 /* SceneDelegate.swift */; }; + BBDA25AF2463193100819183 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBDA25AE2463193100819183 /* ViewController.swift */; }; + BBDA25B22463193100819183 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = BBDA25B02463193100819183 /* Main.storyboard */; }; + BBDA25B42463194600819183 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = BBDA25B32463194600819183 /* Assets.xcassets */; }; + BBDA25B72463194600819183 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = BBDA25B52463194600819183 /* LaunchScreen.storyboard */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 33852ED78B1405189468D0C4 /* Pods_ProductosPY.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_ProductosPY.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + B203AABE016BF67CB04CC8FF /* Pods-ProductosPY.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ProductosPY.release.xcconfig"; path = "Target Support Files/Pods-ProductosPY/Pods-ProductosPY.release.xcconfig"; sourceTree = ""; }; + BB5A71F52463773C00B51D4E /* PageView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = PageView.xib; sourceTree = ""; }; + BB5A71F72465A25000B51D4E /* PageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PageView.swift; sourceTree = ""; }; + BB5A71FA2465A5EC00B51D4E /* Constants.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Constants.swift; sourceTree = ""; }; + BB5A71FD2465C7D800B51D4E /* ScreenTwoViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScreenTwoViewController.swift; sourceTree = ""; }; + BB5A7200246610BE00B51D4E /* HTTPClient.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HTTPClient.swift; sourceTree = ""; }; + BB5A72022466114400B51D4E /* APIError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = APIError.swift; sourceTree = ""; }; + BB5A72042466117C00B51D4E /* APISessionManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = APISessionManager.swift; sourceTree = ""; }; + BB5A7208246A1AFC00B51D4E /* FeatureCollection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeatureCollection.swift; sourceTree = ""; }; + BBDA25A72463193100819183 /* ProductosPY.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ProductosPY.app; sourceTree = BUILT_PRODUCTS_DIR; }; + BBDA25AA2463193100819183 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + BBDA25AC2463193100819183 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; }; + BBDA25AE2463193100819183 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; + BBDA25B12463193100819183 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + BBDA25B32463194600819183 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + BBDA25B62463194600819183 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + BBDA25B82463194600819183 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + C3CEE7E979F83FF9012FDC54 /* Pods-ProductosPY.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ProductosPY.debug.xcconfig"; path = "Target Support Files/Pods-ProductosPY/Pods-ProductosPY.debug.xcconfig"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + BBDA25A42463193100819183 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 5FF85C0DA68B808CDC399639 /* Pods_ProductosPY.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 2566EFE170E457DE296AD41E /* Frameworks */ = { + isa = PBXGroup; + children = ( + 33852ED78B1405189468D0C4 /* Pods_ProductosPY.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 38803EEDE9CF2864479B26E2 /* Pods */ = { + isa = PBXGroup; + children = ( + C3CEE7E979F83FF9012FDC54 /* Pods-ProductosPY.debug.xcconfig */, + B203AABE016BF67CB04CC8FF /* Pods-ProductosPY.release.xcconfig */, + ); + path = Pods; + sourceTree = ""; + }; + BB5A71F124636A7400B51D4E /* xib */ = { + isa = PBXGroup; + children = ( + BB5A71F52463773C00B51D4E /* PageView.xib */, + ); + path = xib; + sourceTree = ""; + }; + BB5A71F224636A8200B51D4E /* entities */ = { + isa = PBXGroup; + children = ( + BB5A71F72465A25000B51D4E /* PageView.swift */, + ); + path = entities; + sourceTree = ""; + }; + BB5A71F92465A5C400B51D4E /* structs */ = { + isa = PBXGroup; + children = ( + BB5A71FA2465A5EC00B51D4E /* Constants.swift */, + BB5A7208246A1AFC00B51D4E /* FeatureCollection.swift */, + ); + path = structs; + sourceTree = ""; + }; + BB5A71FC2465C7AC00B51D4E /* ViewControllers */ = { + isa = PBXGroup; + children = ( + BBDA25AE2463193100819183 /* ViewController.swift */, + BB5A71FD2465C7D800B51D4E /* ScreenTwoViewController.swift */, + ); + path = ViewControllers; + sourceTree = ""; + }; + BB5A71FF24660D8600B51D4E /* utilities */ = { + isa = PBXGroup; + children = ( + BB5A7200246610BE00B51D4E /* HTTPClient.swift */, + BB5A72022466114400B51D4E /* APIError.swift */, + BB5A72042466117C00B51D4E /* APISessionManager.swift */, + ); + path = utilities; + sourceTree = ""; + }; + BBDA259E2463193100819183 = { + isa = PBXGroup; + children = ( + BBDA25A92463193100819183 /* ProductosPY */, + BBDA25A82463193100819183 /* Products */, + 38803EEDE9CF2864479B26E2 /* Pods */, + 2566EFE170E457DE296AD41E /* Frameworks */, + ); + sourceTree = ""; + }; + BBDA25A82463193100819183 /* Products */ = { + isa = PBXGroup; + children = ( + BBDA25A72463193100819183 /* ProductosPY.app */, + ); + name = Products; + sourceTree = ""; + }; + BBDA25A92463193100819183 /* ProductosPY */ = { + isa = PBXGroup; + children = ( + BB5A71FF24660D8600B51D4E /* utilities */, + BB5A71FC2465C7AC00B51D4E /* ViewControllers */, + BB5A71F92465A5C400B51D4E /* structs */, + BB5A71F224636A8200B51D4E /* entities */, + BB5A71F124636A7400B51D4E /* xib */, + BBDA25AA2463193100819183 /* AppDelegate.swift */, + BBDA25AC2463193100819183 /* SceneDelegate.swift */, + BBDA25B02463193100819183 /* Main.storyboard */, + BBDA25B32463194600819183 /* Assets.xcassets */, + BBDA25B52463194600819183 /* LaunchScreen.storyboard */, + BBDA25B82463194600819183 /* Info.plist */, + ); + path = ProductosPY; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + BBDA25A62463193100819183 /* ProductosPY */ = { + isa = PBXNativeTarget; + buildConfigurationList = BBDA25BB2463194600819183 /* Build configuration list for PBXNativeTarget "ProductosPY" */; + buildPhases = ( + D21C9E930D434AD4B02029C7 /* [CP] Check Pods Manifest.lock */, + BBDA25A32463193100819183 /* Sources */, + BBDA25A42463193100819183 /* Frameworks */, + BBDA25A52463193100819183 /* Resources */, + 167ECD7029CBBDA9F5C6F527 /* [CP] Embed Pods Frameworks */, + 9B30DA49D3B5EBCD237ABCE5 /* [CP] Copy Pods Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = ProductosPY; + productName = ProductosPY; + productReference = BBDA25A72463193100819183 /* ProductosPY.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + BBDA259F2463193100819183 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 1110; + LastUpgradeCheck = 1110; + ORGANIZATIONNAME = "Mobile Roshka"; + TargetAttributes = { + BBDA25A62463193100819183 = { + CreatedOnToolsVersion = 11.1; + }; + }; + }; + buildConfigurationList = BBDA25A22463193100819183 /* Build configuration list for PBXProject "ProductosPY" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = BBDA259E2463193100819183; + productRefGroup = BBDA25A82463193100819183 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + BBDA25A62463193100819183 /* ProductosPY */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + BBDA25A52463193100819183 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + BBDA25B72463194600819183 /* LaunchScreen.storyboard in Resources */, + BB5A71F62463773C00B51D4E /* PageView.xib in Resources */, + BBDA25B42463194600819183 /* Assets.xcassets in Resources */, + BBDA25B22463193100819183 /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 167ECD7029CBBDA9F5C6F527 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-ProductosPY/Pods-ProductosPY-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-ProductosPY/Pods-ProductosPY-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-ProductosPY/Pods-ProductosPY-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + 9B30DA49D3B5EBCD237ABCE5 /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-ProductosPY/Pods-ProductosPY-resources-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Copy Pods Resources"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-ProductosPY/Pods-ProductosPY-resources-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-ProductosPY/Pods-ProductosPY-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; + D21C9E930D434AD4B02029C7 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-ProductosPY-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + BBDA25A32463193100819183 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + BB5A71FB2465A5EC00B51D4E /* Constants.swift in Sources */, + BBDA25AF2463193100819183 /* ViewController.swift in Sources */, + BB5A72052466117C00B51D4E /* APISessionManager.swift in Sources */, + BB5A7209246A1AFC00B51D4E /* FeatureCollection.swift in Sources */, + BB5A71F82465A25000B51D4E /* PageView.swift in Sources */, + BB5A7201246610BE00B51D4E /* HTTPClient.swift in Sources */, + BB5A71FE2465C7D800B51D4E /* ScreenTwoViewController.swift in Sources */, + BB5A72032466114400B51D4E /* APIError.swift in Sources */, + BBDA25AB2463193100819183 /* AppDelegate.swift in Sources */, + BBDA25AD2463193100819183 /* SceneDelegate.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + BBDA25B02463193100819183 /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + BBDA25B12463193100819183 /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + BBDA25B52463194600819183 /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + BBDA25B62463194600819183 /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + BBDA25B92463194600819183 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 13.1; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + BBDA25BA2463194600819183 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 13.1; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + BBDA25BC2463194600819183 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = C3CEE7E979F83FF9012FDC54 /* Pods-ProductosPY.debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + INFOPLIST_FILE = ProductosPY/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.roshka.ProductosPY; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + BBDA25BD2463194600819183 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = B203AABE016BF67CB04CC8FF /* Pods-ProductosPY.release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + INFOPLIST_FILE = ProductosPY/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.roshka.ProductosPY; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + BBDA25A22463193100819183 /* Build configuration list for PBXProject "ProductosPY" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + BBDA25B92463194600819183 /* Debug */, + BBDA25BA2463194600819183 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + BBDA25BB2463194600819183 /* Build configuration list for PBXNativeTarget "ProductosPY" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + BBDA25BC2463194600819183 /* Debug */, + BBDA25BD2463194600819183 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = BBDA259F2463193100819183 /* Project object */; +} diff --git a/ProductosPY.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/ProductosPY.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..d84c679 --- /dev/null +++ b/ProductosPY.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/ProductosPY.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ProductosPY.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/ProductosPY.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/ProductosPY.xcodeproj/xcuserdata/roshka.xcuserdatad/xcschemes/xcschememanagement.plist b/ProductosPY.xcodeproj/xcuserdata/roshka.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..ba29618 --- /dev/null +++ b/ProductosPY.xcodeproj/xcuserdata/roshka.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,14 @@ + + + + + SchemeUserState + + ProductosPY.xcscheme_^#shared#^_ + + orderHint + 5 + + + + diff --git a/ProductosPY.xcworkspace/contents.xcworkspacedata b/ProductosPY.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..cfc9f9c --- /dev/null +++ b/ProductosPY.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/ProductosPY.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ProductosPY.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/ProductosPY.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/ProductosPY/AppDelegate.swift b/ProductosPY/AppDelegate.swift new file mode 100644 index 0000000..a3a6889 --- /dev/null +++ b/ProductosPY/AppDelegate.swift @@ -0,0 +1,40 @@ +// +// AppDelegate.swift +// ProductosPY +// +// Created by Mobile Roshka on 5/6/20. +// Copyright © 2020 Mobile Roshka. All rights reserved. +// + +import UIKit +import GoogleMaps +import GooglePlaces +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + + + + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { + // Override point for customization after application launch. + GMSServices.provideAPIKey("AIzaSyCDCQFseYL7K7okR_YL7lmh2SCRct9YiiM") + GMSPlacesClient.provideAPIKey("AIzaSyCDCQFseYL7K7okR_YL7lmh2SCRct9YiiM") + return true + } + + // MARK: UISceneSession Lifecycle + + func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration { + // Called when a new scene session is being created. + // Use this method to select a configuration to create the new scene with. + return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role) + } + + func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set) { + // Called when the user discards a scene session. + // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions. + // Use this method to release any resources that were specific to the discarded scenes, as they will not return. + } + + +} + diff --git a/ProductosPY/Assets.xcassets/AppIcon.appiconset/Contents.json b/ProductosPY/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..d8db8d6 --- /dev/null +++ b/ProductosPY/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,98 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "3x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "83.5x83.5", + "scale" : "2x" + }, + { + "idiom" : "ios-marketing", + "size" : "1024x1024", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ProductosPY/Assets.xcassets/Contents.json b/ProductosPY/Assets.xcassets/Contents.json new file mode 100644 index 0000000..da4a164 --- /dev/null +++ b/ProductosPY/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ProductosPY/Assets.xcassets/circleOff.imageset/Contents.json b/ProductosPY/Assets.xcassets/circleOff.imageset/Contents.json new file mode 100644 index 0000000..eff6efb --- /dev/null +++ b/ProductosPY/Assets.xcassets/circleOff.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "circleOff@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ProductosPY/Assets.xcassets/circleOff.imageset/circleOff@2x.png b/ProductosPY/Assets.xcassets/circleOff.imageset/circleOff@2x.png new file mode 100644 index 0000000..79ed891 Binary files /dev/null and b/ProductosPY/Assets.xcassets/circleOff.imageset/circleOff@2x.png differ diff --git a/ProductosPY/Assets.xcassets/circleOn.imageset/Contents.json b/ProductosPY/Assets.xcassets/circleOn.imageset/Contents.json new file mode 100644 index 0000000..3c54653 --- /dev/null +++ b/ProductosPY/Assets.xcassets/circleOn.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "circleOn@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ProductosPY/Assets.xcassets/circleOn.imageset/circleOn@2x.png b/ProductosPY/Assets.xcassets/circleOn.imageset/circleOn@2x.png new file mode 100644 index 0000000..86c13ca Binary files /dev/null and b/ProductosPY/Assets.xcassets/circleOn.imageset/circleOn@2x.png differ diff --git a/ProductosPY/Assets.xcassets/closeButton.imageset/Contents.json b/ProductosPY/Assets.xcassets/closeButton.imageset/Contents.json new file mode 100644 index 0000000..57b6251 --- /dev/null +++ b/ProductosPY/Assets.xcassets/closeButton.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "closeButton@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ProductosPY/Assets.xcassets/closeButton.imageset/closeButton@2x.png b/ProductosPY/Assets.xcassets/closeButton.imageset/closeButton@2x.png new file mode 100644 index 0000000..07e0077 Binary files /dev/null and b/ProductosPY/Assets.xcassets/closeButton.imageset/closeButton@2x.png differ diff --git a/ProductosPY/Assets.xcassets/favButton.imageset/Contents.json b/ProductosPY/Assets.xcassets/favButton.imageset/Contents.json new file mode 100644 index 0000000..9ac529b --- /dev/null +++ b/ProductosPY/Assets.xcassets/favButton.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "favButton@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ProductosPY/Assets.xcassets/favButton.imageset/favButton@2x.png b/ProductosPY/Assets.xcassets/favButton.imageset/favButton@2x.png new file mode 100644 index 0000000..78d5cd4 Binary files /dev/null and b/ProductosPY/Assets.xcassets/favButton.imageset/favButton@2x.png differ diff --git a/ProductosPY/Assets.xcassets/favDeselected.imageset/Contents.json b/ProductosPY/Assets.xcassets/favDeselected.imageset/Contents.json new file mode 100644 index 0000000..dfe19a2 --- /dev/null +++ b/ProductosPY/Assets.xcassets/favDeselected.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "favDeselected@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ProductosPY/Assets.xcassets/favDeselected.imageset/favDeselected@2x.png b/ProductosPY/Assets.xcassets/favDeselected.imageset/favDeselected@2x.png new file mode 100644 index 0000000..8df3f2a Binary files /dev/null and b/ProductosPY/Assets.xcassets/favDeselected.imageset/favDeselected@2x.png differ diff --git a/ProductosPY/Assets.xcassets/favSelected.imageset/Contents.json b/ProductosPY/Assets.xcassets/favSelected.imageset/Contents.json new file mode 100644 index 0000000..b278198 --- /dev/null +++ b/ProductosPY/Assets.xcassets/favSelected.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "favSelected@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ProductosPY/Assets.xcassets/favSelected.imageset/favSelected@2x.png b/ProductosPY/Assets.xcassets/favSelected.imageset/favSelected@2x.png new file mode 100644 index 0000000..31598fa Binary files /dev/null and b/ProductosPY/Assets.xcassets/favSelected.imageset/favSelected@2x.png differ diff --git a/ProductosPY/Assets.xcassets/features01.imageset/Contents.json b/ProductosPY/Assets.xcassets/features01.imageset/Contents.json new file mode 100644 index 0000000..49efe5a --- /dev/null +++ b/ProductosPY/Assets.xcassets/features01.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "features01@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ProductosPY/Assets.xcassets/features01.imageset/features01@2x.png b/ProductosPY/Assets.xcassets/features01.imageset/features01@2x.png new file mode 100644 index 0000000..be9e0bb Binary files /dev/null and b/ProductosPY/Assets.xcassets/features01.imageset/features01@2x.png differ diff --git a/ProductosPY/Assets.xcassets/features02.imageset/Contents.json b/ProductosPY/Assets.xcassets/features02.imageset/Contents.json new file mode 100644 index 0000000..d529632 --- /dev/null +++ b/ProductosPY/Assets.xcassets/features02.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "features02@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ProductosPY/Assets.xcassets/features02.imageset/features02@2x.png b/ProductosPY/Assets.xcassets/features02.imageset/features02@2x.png new file mode 100644 index 0000000..e27063e Binary files /dev/null and b/ProductosPY/Assets.xcassets/features02.imageset/features02@2x.png differ diff --git a/ProductosPY/Assets.xcassets/features03.imageset/Contents.json b/ProductosPY/Assets.xcassets/features03.imageset/Contents.json new file mode 100644 index 0000000..c69ac26 --- /dev/null +++ b/ProductosPY/Assets.xcassets/features03.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "features03@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ProductosPY/Assets.xcassets/features03.imageset/features03@2x.png b/ProductosPY/Assets.xcassets/features03.imageset/features03@2x.png new file mode 100644 index 0000000..fd19fec Binary files /dev/null and b/ProductosPY/Assets.xcassets/features03.imageset/features03@2x.png differ diff --git a/ProductosPY/Assets.xcassets/infoButton.imageset/Contents.json b/ProductosPY/Assets.xcassets/infoButton.imageset/Contents.json new file mode 100644 index 0000000..dbcd43d --- /dev/null +++ b/ProductosPY/Assets.xcassets/infoButton.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "infoButton@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ProductosPY/Assets.xcassets/infoButton.imageset/infoButton@2x.png b/ProductosPY/Assets.xcassets/infoButton.imageset/infoButton@2x.png new file mode 100644 index 0000000..9c7fdc8 Binary files /dev/null and b/ProductosPY/Assets.xcassets/infoButton.imageset/infoButton@2x.png differ diff --git a/ProductosPY/Assets.xcassets/logoBig.imageset/Contents.json b/ProductosPY/Assets.xcassets/logoBig.imageset/Contents.json new file mode 100644 index 0000000..1438964 --- /dev/null +++ b/ProductosPY/Assets.xcassets/logoBig.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "logoBig@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ProductosPY/Assets.xcassets/logoBig.imageset/logoBig@2x.png b/ProductosPY/Assets.xcassets/logoBig.imageset/logoBig@2x.png new file mode 100644 index 0000000..806aeae Binary files /dev/null and b/ProductosPY/Assets.xcassets/logoBig.imageset/logoBig@2x.png differ diff --git a/ProductosPY/Assets.xcassets/logoSmall.imageset/Contents.json b/ProductosPY/Assets.xcassets/logoSmall.imageset/Contents.json new file mode 100644 index 0000000..9c69157 --- /dev/null +++ b/ProductosPY/Assets.xcassets/logoSmall.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "logoSmall@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ProductosPY/Assets.xcassets/logoSmall.imageset/logoSmall@2x.png b/ProductosPY/Assets.xcassets/logoSmall.imageset/logoSmall@2x.png new file mode 100644 index 0000000..10be01c Binary files /dev/null and b/ProductosPY/Assets.xcassets/logoSmall.imageset/logoSmall@2x.png differ diff --git a/ProductosPY/Assets.xcassets/markerNormal.imageset/Contents.json b/ProductosPY/Assets.xcassets/markerNormal.imageset/Contents.json new file mode 100644 index 0000000..cd0f1b6 --- /dev/null +++ b/ProductosPY/Assets.xcassets/markerNormal.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "markerNormal@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ProductosPY/Assets.xcassets/markerNormal.imageset/markerNormal@2x.png b/ProductosPY/Assets.xcassets/markerNormal.imageset/markerNormal@2x.png new file mode 100644 index 0000000..6590395 Binary files /dev/null and b/ProductosPY/Assets.xcassets/markerNormal.imageset/markerNormal@2x.png differ diff --git a/ProductosPY/Assets.xcassets/markerSelected.imageset/Contents.json b/ProductosPY/Assets.xcassets/markerSelected.imageset/Contents.json new file mode 100644 index 0000000..3404a6f --- /dev/null +++ b/ProductosPY/Assets.xcassets/markerSelected.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "markerSelected@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ProductosPY/Assets.xcassets/markerSelected.imageset/markerSelected@2x.png b/ProductosPY/Assets.xcassets/markerSelected.imageset/markerSelected@2x.png new file mode 100644 index 0000000..4289dd8 Binary files /dev/null and b/ProductosPY/Assets.xcassets/markerSelected.imageset/markerSelected@2x.png differ diff --git a/ProductosPY/Assets.xcassets/selector.imageset/Contents.json b/ProductosPY/Assets.xcassets/selector.imageset/Contents.json new file mode 100644 index 0000000..54dad1d --- /dev/null +++ b/ProductosPY/Assets.xcassets/selector.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "selector@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ProductosPY/Assets.xcassets/selector.imageset/selector@2x.png b/ProductosPY/Assets.xcassets/selector.imageset/selector@2x.png new file mode 100644 index 0000000..fc57611 Binary files /dev/null and b/ProductosPY/Assets.xcassets/selector.imageset/selector@2x.png differ diff --git a/ProductosPY/Base.lproj/LaunchScreen.storyboard b/ProductosPY/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..865e932 --- /dev/null +++ b/ProductosPY/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ProductosPY/Base.lproj/Main.storyboard b/ProductosPY/Base.lproj/Main.storyboard new file mode 100644 index 0000000..97069d7 --- /dev/null +++ b/ProductosPY/Base.lproj/Main.storyboard @@ -0,0 +1,149 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ProductosPY/Info.plist b/ProductosPY/Info.plist new file mode 100644 index 0000000..844eb63 --- /dev/null +++ b/ProductosPY/Info.plist @@ -0,0 +1,68 @@ + + + + + NSLocationAlwaysAndWhenInUseUsageDescription + Nos permite usar su ubicacion actual? + NSLocationWhenInUseUsageDescription + Nos permite usar su ubicacion actual? + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + $(PRODUCT_BUNDLE_PACKAGE_TYPE) + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UIApplicationSceneManifest + + UIApplicationSupportsMultipleScenes + + UISceneConfigurations + + UIWindowSceneSessionRoleApplication + + + UISceneConfigurationName + Default Configuration + UISceneDelegateClassName + $(PRODUCT_MODULE_NAME).SceneDelegate + UISceneStoryboardFile + Main + + + + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/ProductosPY/SceneDelegate.swift b/ProductosPY/SceneDelegate.swift new file mode 100644 index 0000000..ab512ec --- /dev/null +++ b/ProductosPY/SceneDelegate.swift @@ -0,0 +1,53 @@ +// +// SceneDelegate.swift +// ProductosPY +// +// Created by Mobile Roshka on 5/6/20. +// Copyright © 2020 Mobile Roshka. All rights reserved. +// + +import UIKit + +class SceneDelegate: UIResponder, UIWindowSceneDelegate { + + var window: UIWindow? + + + func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { + // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`. + // If using a storyboard, the `window` property will automatically be initialized and attached to the scene. + // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead). + guard let _ = (scene as? UIWindowScene) else { return } + } + + func sceneDidDisconnect(_ scene: UIScene) { + // Called as the scene is being released by the system. + // This occurs shortly after the scene enters the background, or when its session is discarded. + // Release any resources associated with this scene that can be re-created the next time the scene connects. + // The scene may re-connect later, as its session was not neccessarily discarded (see `application:didDiscardSceneSessions` instead). + } + + func sceneDidBecomeActive(_ scene: UIScene) { + // Called when the scene has moved from an inactive state to an active state. + // Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive. + } + + func sceneWillResignActive(_ scene: UIScene) { + // Called when the scene will move from an active state to an inactive state. + // This may occur due to temporary interruptions (ex. an incoming phone call). + } + + func sceneWillEnterForeground(_ scene: UIScene) { + // Called as the scene transitions from the background to the foreground. + // Use this method to undo the changes made on entering the background. + } + + func sceneDidEnterBackground(_ scene: UIScene) { + // Called as the scene transitions from the foreground to the background. + // Use this method to save data, release shared resources, and store enough scene-specific state information + // to restore the scene back to its current state. + } + + +} + diff --git a/ProductosPY/ViewControllers/ScreenTwoViewController.swift b/ProductosPY/ViewControllers/ScreenTwoViewController.swift new file mode 100644 index 0000000..759c8b9 --- /dev/null +++ b/ProductosPY/ViewControllers/ScreenTwoViewController.swift @@ -0,0 +1,70 @@ +// +// ScreenTwoViewController.swift +// ProductosPY +// +// Created by Mobile Roshka on 5/8/20. +// Copyright © 2020 Mobile Roshka. All rights reserved. +// + +import UIKit +import GoogleMaps +import GooglePlaces +import GoogleMapsUtils + +class ScreenTwoViewController: UIViewController { + + @IBOutlet weak var gMapsView: GMSMapView! + + let locationManager = CLLocationManager() + + var myLat:Double = 0 + var myLong:Double = 0 + override func viewDidLoad() { + super.viewDidLoad() + + getCurrentLocation() + + print(myLat) + print(myLong) + let camera = GMSCameraPosition(latitude: myLat, longitude: myLong, zoom: 20.0) + + + gMapsView.settings.compassButton = true + gMapsView.isMyLocationEnabled = true + gMapsView.settings.myLocationButton = true + gMapsView.camera = camera + + + // LLamma a servicio que saque del ejemplo de Vlads + HTTPClient.request(endpoint: "https://productospy.org/api/vendors", method: .get, encoding: .json, parameters: nil, headers: nil, onSuccess: {(c:FeatureCollection)->Void in + print("Lo que recibo es: \(c)") + }, onFailure: {(e:APIError)->Void in + print("El error es \(e.message!)") + }) + + } + + func getCurrentLocation() { + // Ask for Authorisation from the User. + self.locationManager.requestAlwaysAuthorization() + + // For use in foreground + self.locationManager.requestWhenInUseAuthorization() + + if CLLocationManager.locationServicesEnabled() { + locationManager.delegate = self + locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters + locationManager.startUpdatingLocation() + } + } +} + + +extension ScreenTwoViewController: CLLocationManagerDelegate { + func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { + guard let locValue: CLLocationCoordinate2D = manager.location?.coordinate else { return } + print("locations = \(locValue.latitude) \(locValue.longitude)") + myLat = locValue.latitude + myLong = locValue.longitude + } +} diff --git a/ProductosPY/ViewControllers/ViewController.swift b/ProductosPY/ViewControllers/ViewController.swift new file mode 100644 index 0000000..0f41329 --- /dev/null +++ b/ProductosPY/ViewControllers/ViewController.swift @@ -0,0 +1,136 @@ +// +// ViewController.swift +// ProductosPY +// +// Created by Mobile Roshka on 5/6/20. +// Copyright © 2020 Mobile Roshka. All rights reserved. +// + +import UIKit +//import GoogleMaps +//import GooglePlaces +import MapKit + +class ViewController: UIViewController { + + // Se crean las paginas del scrollView + // cada pagina se contrulle de acuerdo a la imagen, texto y subtexto que va llevar. + var pages : [PageView] { + get { + // Aqui se declaran todo los valores que van a llevar cada pagina + // Atributos de la pagina 1 + let page1: PageView = Bundle.main.loadNibNamed("PageView", owner: self, options: nil)?.first as! PageView + page1.principalImageView.image = UIImage(named: "features01") + // Titulo principal + page1.titleLabel.text = "ENCUENTRA" + page1.titleLabel.textColor = Constants.fontTitileColor + // Subtitulo o subTexto + page1.subtitleLabel.text = "¿Tapabocas, alimentos, elementos de limpieza, alcohol en gel? \nProductosPY facilita conectarte con vendedores de los productos que neceitoas!" + page1.subtitleLabel.font = UIFont.systemFont(ofSize: 14.0) + + // Atributos Pagina 2 + let page2: PageView = Bundle.main.loadNibNamed("PageView", owner: self, options: nil)?.first as! PageView + page2.principalImageView.image = UIImage(named: "features02") + // Titulo principal + page2.titleLabel.text = "OFRECE" + page2.titleLabel.textColor = Constants.fontTitileColor + // Subtitulo o subTexto + page2.subtitleLabel.text = "¿Estás vendiendo algún producto, ofreciendo algún servicio y necesitas darte a canonocer?" + page2.subtitleLabel.font = UIFont.systemFont(ofSize: 14.0) + // Atributos Pagina 3 + let page3: PageView = Bundle.main.loadNibNamed("PageView", owner: self, options: nil)?.first as! PageView + page3.principalImageView.image = UIImage(named: "features03") + // Titulo principal + page3.titleLabel.text = "CONÉCTATE" + page3.titleLabel.textColor = Constants.fontTitileColor + // Subtitulo o subTexto + page3.subtitleLabel.text = "Encuéntranos en FACEBOOK, TWITTER e INSTAGRAM como ProductosPY" + page3.subtitleLabel.font = UIFont.systemFont(ofSize: 14.0) + // Boton de Empezar + //page3.startButton.isHidden = false + //page3.startButton.backgroundColor = Constants.backgroundColorButton + //page3.startButton.setTitle("Empezar", for: .normal) + //page3.startButton.setTitleColor(UIColor.white, for: .normal) + //page3.startButton.layer.cornerRadius = 15 + return [page1, page2, page3] + } + } + + @IBOutlet weak var scrollView: UIScrollView! + @IBOutlet weak var pageController: UIPageControl! + @IBOutlet weak var startButton: UIButton! + let locationManager = CLLocationManager() + + + override func viewDidLoad() { + super.viewDidLoad() + getCurrentLocation() + startButton.backgroundColor = Constants.backgroundColorButton + startButton.setTitle("Empezar", for: .normal) + startButton.setTitleColor(UIColor.white, for: .normal) + startButton.layer.cornerRadius = 15 + view.bringSubviewToFront(pageController) + // Se llama la funcion que configura el Scroll View + configScrollView(pages: pages) + pageController.pageIndicatorTintColor = Constants.pointPageColor + // Numero de pagina + pageController.numberOfPages = pages.count + // Pagina que va iniciar el pageController + pageController.currentPage = 0 + + + } + + + func getCurrentLocation() { + // Ask for Authorisation from the User. + self.locationManager.requestAlwaysAuthorization() + + // For use in foreground + self.locationManager.requestWhenInUseAuthorization() + + if CLLocationManager.locationServicesEnabled() { + locationManager.delegate = self + locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters + locationManager.startUpdatingLocation() + } + } + + // Este prosedimiento configura el scrollView segun las paginas creadas mas arriba + // Recibe como parametro una lista de paginas que luego son agregadas a lo ancho del scrollView para asi poder scrollear de forma horizontal + func configScrollView(pages: [PageView]) { + scrollView.isPagingEnabled = true + scrollView.frame = CGRect(x: 0, y: 0, width: view.frame.width, height: view.frame.height) + scrollView.contentSize = CGSize(width: view.frame.width * CGFloat(pages.count), height: view.frame.height) + for i in 0 ..< pages.count { + pages[i].frame = CGRect(x: view.frame.width * CGFloat(i), y: 0, width: view.frame.width, height: view.frame.height) + scrollView.addSubview(pages[i]) + } + } + + + @IBAction func startActionButton(_ sender: Any) { + performSegue(withIdentifier: "screenTwoSegue", sender: nil) + } + +} + +extension ViewController: UIScrollViewDelegate { + func scrollViewDidScroll(_ scrollView: UIScrollView) { + let pageIndex = round(scrollView.contentOffset.x/view.frame.width) + pageController.currentPage = Int(pageIndex) + if (pageController.currentPage == 2) { + startButton.isHidden = false + } else { + startButton.isHidden = true + } + } +} + +extension ViewController: CLLocationManagerDelegate { + func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { + guard let locValue: CLLocationCoordinate2D = manager.location?.coordinate else { return } + print("locations = \(locValue.latitude) \(locValue.longitude)") + } +} + diff --git a/ProductosPY/entities/PageView.swift b/ProductosPY/entities/PageView.swift new file mode 100644 index 0000000..dde79c0 --- /dev/null +++ b/ProductosPY/entities/PageView.swift @@ -0,0 +1,19 @@ +// +// PageView.swift +// ProductosPY +// +// Created by Mobile Roshka on 5/8/20. +// Copyright © 2020 Mobile Roshka. All rights reserved. +// + +import Foundation +import UIKit + +class PageView: UIView { + + @IBOutlet weak var principalImageView: UIImageView! + @IBOutlet weak var titleLabel: UILabel! + @IBOutlet weak var subtitleLabel: UILabel! + @IBOutlet weak var startButton: UIButton! + +} diff --git a/ProductosPY/structs/Constants.swift b/ProductosPY/structs/Constants.swift new file mode 100644 index 0000000..1d6861b --- /dev/null +++ b/ProductosPY/structs/Constants.swift @@ -0,0 +1,17 @@ +// +// Constants.swift +// ProductosPY +// +// Created by Mobile Roshka on 5/8/20. +// Copyright © 2020 Mobile Roshka. All rights reserved. +// + +import Foundation +import UIKit + +struct Constants { + static let fontTitileColor = UIColor(red: 0.00, green: 0.35, blue: 0.82, alpha: 1.00) + static let backgroundColorButton = UIColor(red: 0.08, green: 0.35, blue: 0.82, alpha: 1.00) + static let pointCurrentPageColor = UIColor(red: 0.20, green: 0.80, blue: 1.00, alpha: 1.00) + static let pointPageColor = UIColor(red: 0.85, green: 0.85, blue: 0.85, alpha: 1.00) +} diff --git a/ProductosPY/structs/Feature.swift b/ProductosPY/structs/Feature.swift new file mode 100644 index 0000000..fe030ed --- /dev/null +++ b/ProductosPY/structs/Feature.swift @@ -0,0 +1,45 @@ +// +// Feature.swift +// ProductosPY +// +// Created by Mobile Roshka on 5/11/20. +// Copyright © 2020 Mobile Roshka. All rights reserved. +// + +import Foundation + + +// MARK: - FeatureCollection +struct FeatureCollection: Codable { + let type: String? + let features: [Feature]? +} + +// MARK: - Feature +struct Feature: Codable { + let type: String? + let geometry: Geometry? + let properties: Properties? +} + +// MARK: - Geometry +struct Geometry: Codable { + let type: String + let coordinates: [Double]? +} + +// MARK: - Properties +struct Properties: Codable { + let nombre, contacto, comentarios: String? + let productos: [Producto]? +} + +// MARK: - Producto +struct Producto: Codable { + let productName, productType: String? + + enum CodingKeys: String, CodingKey { + case productName = "product_name" + case productType = "product_type" + } +} diff --git a/ProductosPY/structs/FeatureCollection.swift b/ProductosPY/structs/FeatureCollection.swift new file mode 100644 index 0000000..48922ba --- /dev/null +++ b/ProductosPY/structs/FeatureCollection.swift @@ -0,0 +1,48 @@ +// +// FeatureCollection.swift +// ProductosPY +// +// Created by Mobile Roshka on 5/11/20. +// Copyright © 2020 Mobile Roshka. All rights reserved. +// + +import Foundation + + +// MARK: - FeatureCollection +struct FeatureCollection: Codable { + let type: String? + let features: [Feature] +} + +// MARK: - Feature +struct Feature: Codable { + let type: String? + let geometry: Geometry + let properties: Properties +} + +// MARK: - Geometry +struct Geometry: Codable { + let coordinates: [Decimal] + + +} + +// MARK: - Properties +struct Properties: Codable { + let nombre, contacto, comentarios: String + let productos: [Producto] +} + +// MARK: - Producto +struct Producto: Codable { + let productName, productType: String +} + +extension Geometry { + public init(from decoder: Decoder) throws { + let container = try decoder.container(keyedBy: CodingKeys.self) + coordinates = [Decimal(try container.decode(Double.self, forKey: .coordinates))] + } +} diff --git a/ProductosPY/utilities/APIError.swift b/ProductosPY/utilities/APIError.swift new file mode 100644 index 0000000..48a4f10 --- /dev/null +++ b/ProductosPY/utilities/APIError.swift @@ -0,0 +1,20 @@ +// +// APIError.swift +// HTTPDemo +// +// Created by Mobile Roshka on 3/9/20. +// Copyright © 2020 Mobile Roshka. All rights reserved. +// + +import Foundation + +class APIError { + var code: String? + var message: String? + + init(message: String) { + self.code = nil + self.message = message + } +} + diff --git a/ProductosPY/utilities/APISessionManager.swift b/ProductosPY/utilities/APISessionManager.swift new file mode 100644 index 0000000..569ec1f --- /dev/null +++ b/ProductosPY/utilities/APISessionManager.swift @@ -0,0 +1,23 @@ +// +// APISessionManager.swift +// HTTPDemo +// +// Created by Mobile Roshka on 3/9/20. +// Copyright © 2020 Mobile Roshka. All rights reserved. +// + +import Foundation +import Alamofire + +class APISessionManager: Session { + // solo exista una instancia en la APP + static var shared: APISessionManager = { + let configuration = URLSessionConfiguration.default + configuration.timeoutIntervalForRequest = 30 + configuration.requestCachePolicy = .reloadIgnoringLocalAndRemoteCacheData + //Sniffer.enable(in: configuration) + let manager = APISessionManager(configuration : configuration) + return manager + }() +} + diff --git a/ProductosPY/utilities/HTTPClient.swift b/ProductosPY/utilities/HTTPClient.swift new file mode 100644 index 0000000..0e4b80f --- /dev/null +++ b/ProductosPY/utilities/HTTPClient.swift @@ -0,0 +1,93 @@ +// +// HTTPClient.swift +// HTTPDemo +// +// Created by Mobile Roshka on 3/9/20. +// Copyright © 2020 Mobile Roshka. All rights reserved. +// + +import Foundation +import Alamofire + + +/* + endpoint = Ej. https://www.sudameris.com/servicios/usuarios/get + method = get, put , post, delete + encoding = .json -- https://www.sudameris.com/servicios/usuarios/get + .url -- https://www.sudameris.com/servicios/usuarios/get?apellido='P%a2rez' + header = [key, value] Ej.: ["Accept" , "application/json"] Dictionary + parameters = [ket, value] Dictionary + + // cosas que hacemos despues + onSucces: --> todo salio bien + onFailure: --> todo salio mal + + */ +typealias APIHeaders = HTTPHeaders +typealias APIParameters = [String: Any] + +enum APIMethod { + case get + case post + case delete + case put + + fileprivate var value: HTTPMethod { + switch self { + case .get: + return HTTPMethod.get + case .post: + return HTTPMethod.post + case .put: + return HTTPMethod.put + case .delete: + return HTTPMethod.delete + } + } +} + +enum APIEncoding { + case json + case url + + fileprivate var value: ParameterEncoding { + switch self { + case .json: + return JSONEncoding.default + default: + return URLEncoding.default + } + } +} + +class HTTPClient { + class func request(endpoint: String, + method: APIMethod = .get, + encoding: APIEncoding = .url, + parameters: APIParameters? = nil, + headers:APIHeaders? = nil, + onSuccess: @escaping(T) -> Void, + onFailure: ((APIError) -> Void)? = nil) { + let request = APISessionManager.shared.request(endpoint, + method: method.value, + parameters: parameters, + encoding: encoding.value, + headers: headers) + request.responseJSON(completionHandler: { response in + guard response.error == nil else { + onFailure?(APIError(message: "Hay un error")) + return + } + guard let data = response.data else { + onFailure?(APIError(message: "No vino ningun dato")) + return + } + guard let object = try? JSONDecoder().decode(T.self,from: data) else { + onFailure?(APIError(message: "No se pudo parsear")) + return + } + onSuccess(object) + }) + + } +} diff --git a/ProductosPY/xib/Page.xib b/ProductosPY/xib/Page.xib new file mode 100644 index 0000000..4d4cada --- /dev/null +++ b/ProductosPY/xib/Page.xib @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ProductosPY/xib/PageView.xib b/ProductosPY/xib/PageView.xib new file mode 100644 index 0000000..8f8f7d6 --- /dev/null +++ b/ProductosPY/xib/PageView.xib @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -- libgit2 0.26.0