diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000..a893289 Binary files /dev/null and b/.DS_Store differ diff --git a/TracMobility iOS Assignment.pdf b/TracMobility iOS Assignment.pdf deleted file mode 100644 index 074f811..0000000 Binary files a/TracMobility iOS Assignment.pdf and /dev/null differ diff --git a/TracMobility/Podfile b/TracMobility/Podfile new file mode 100644 index 0000000..46e43b1 --- /dev/null +++ b/TracMobility/Podfile @@ -0,0 +1,14 @@ +# Uncomment the next line to define a global platform for your project +# platform :ios, '9.0' + +target 'TracMobility' do + # Comment the next line if you don't want to use dynamic frameworks + use_frameworks! + + # Pods for TracMobility + pod 'Auth0', '~> 1.0' + pod 'SideMenu' + pod 'GoogleMaps', '4.0.0' + + +end diff --git a/TracMobility/Podfile.lock b/TracMobility/Podfile.lock new file mode 100644 index 0000000..3684915 --- /dev/null +++ b/TracMobility/Podfile.lock @@ -0,0 +1,36 @@ +PODS: + - Auth0 (1.30.1): + - JWTDecode + - SimpleKeychain + - GoogleMaps (3.8.0): + - GoogleMaps/Maps (= 3.8.0) + - GoogleMaps/Base (3.8.0) + - GoogleMaps/Maps (3.8.0): + - GoogleMaps/Base + - JWTDecode (2.6.0) + - SideMenu (6.5.0) + - SimpleKeychain (0.12.1) + +DEPENDENCIES: + - Auth0 (~> 1.0) + - GoogleMaps + - SideMenu + +SPEC REPOS: + trunk: + - Auth0 + - GoogleMaps + - JWTDecode + - SideMenu + - SimpleKeychain + +SPEC CHECKSUMS: + Auth0: 59bece5b578a93589bd321fafeed8a042429f9db + GoogleMaps: 7c8d66d70e4e8c300f43a7219d8fdaad7b325a9a + JWTDecode: 480ca441ddbd5fbfb2abf17870af62f86436be58 + SideMenu: f583187d21c5b1dd04c72002be544b555a2627a2 + SimpleKeychain: 77443015b0f29005c16f74bf858469a9e9fb05e8 + +PODFILE CHECKSUM: 5cdb4d80683f13bc6aa85c5add3b703dd05254bd + +COCOAPODS: 1.9.3 diff --git a/TracMobility/Pods/Auth0/Auth0/A0SimpleKeychain+RSAPublicKey.swift b/TracMobility/Pods/Auth0/Auth0/A0SimpleKeychain+RSAPublicKey.swift new file mode 100644 index 0000000..1208e39 --- /dev/null +++ b/TracMobility/Pods/Auth0/Auth0/A0SimpleKeychain+RSAPublicKey.swift @@ -0,0 +1,42 @@ +// A0SimpleKeychain+RSAPublicKey.swift +// +// Copyright (c) 2020 Auth0 (http://auth0.com) +// +// 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 WEB_AUTH_PLATFORM +import Foundation +import SimpleKeychain + +extension A0SimpleKeychain { + func setRSAPublicKey(data: Data, forKey tag: String) -> Bool { + let sizeInBits = data.count * MemoryLayout.size + let query: [CFString: Any] = [kSecClass: kSecClassKey, + kSecAttrKeyType: kSecAttrKeyTypeRSA, + kSecAttrKeyClass: kSecAttrKeyClassPublic, + kSecAttrAccessible: kSecAttrAccessibleAlways, + kSecAttrKeySizeInBits: NSNumber(value: sizeInBits), + kSecAttrApplicationTag: tag, + kSecValueData: data] + if hasRSAKey(withTag: tag) { deleteRSAKey(withTag: tag) } + let result = SecItemAdd(query as CFDictionary, nil) + return result == errSecSuccess + } +} +#endif diff --git a/TracMobility/Pods/Auth0/Auth0/Array+Encode.swift b/TracMobility/Pods/Auth0/Auth0/Array+Encode.swift new file mode 100644 index 0000000..91f630a --- /dev/null +++ b/TracMobility/Pods/Auth0/Auth0/Array+Encode.swift @@ -0,0 +1,42 @@ +// Array+Encode.swift +// +// Copyright (c) 2019 Auth0 (http://auth0.com) +// +// 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 WEB_AUTH_PLATFORM +import Foundation + +extension Array where Element == UInt8 { + func a0_derEncode(as dataType: UInt8) -> [UInt8] { + var encodedBytes: [UInt8] = [dataType] + var numberOfBytes = count + if numberOfBytes < 128 { + encodedBytes.append(UInt8(numberOfBytes)) + } else { + let lengthData = Data(bytes: &numberOfBytes, count: MemoryLayout.size(ofValue: numberOfBytes)) + let lengthBytes = [UInt8](lengthData).filter({ $0 != 0 }).reversed() + encodedBytes.append(UInt8(truncatingIfNeeded: lengthBytes.count) | 0b10000000) + encodedBytes.append(contentsOf: lengthBytes) + } + encodedBytes.append(contentsOf: self) + return encodedBytes + } +} +#endif diff --git a/TracMobility/Pods/Auth0/Auth0/Auth0.h b/TracMobility/Pods/Auth0/Auth0/Auth0.h new file mode 100644 index 0000000..f3004ac --- /dev/null +++ b/TracMobility/Pods/Auth0/Auth0/Auth0.h @@ -0,0 +1,37 @@ +// Auth0.h +// +// Copyright (c) 2016 Auth0 (http://auth0.com) +// +// 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 + +//! Project version number for Auth0. +FOUNDATION_EXPORT double Auth0VersionNumber; + +//! Project version string for Auth0. +FOUNDATION_EXPORT const unsigned char Auth0VersionString[]; + +// In this header, you should import all the public headers of your framework using statements like #import + +#if WEB_AUTH_PLATFORM +#import +#import +#import +#endif diff --git a/TracMobility/Pods/Auth0/Auth0/Auth0.swift b/TracMobility/Pods/Auth0/Auth0/Auth0.swift new file mode 100644 index 0000000..485690d --- /dev/null +++ b/TracMobility/Pods/Auth0/Auth0/Auth0.swift @@ -0,0 +1,158 @@ +// Auth0.swift +// +// Copyright (c) 2016 Auth0 (http://auth0.com) +// +// 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 + +/** + Auth0 Authentication API to authenticate your user using a Database, Social, Enterprise or Passwordless connections + + ``` + Auth0.authentication(clientId: clientId, domain: "samples.auth0.com") + ``` + + - parameter clientId: clientId of your Auth0 application + - parameter domain: domain of your Auth0 account. e.g.: 'samples.auth0.com' + - parameter session: instance of NSURLSession used for networking. By default it will use the shared NSURLSession + + - returns: Auth0 Authentication API + */ +public func authentication(clientId: String, domain: String, session: URLSession = .shared) -> Authentication { + return Auth0Authentication(clientId: clientId, url: .a0_url(domain), session: session) +} + +/** + Auth0 Authentication API to authenticate your user using a Database, Social, Enterprise or Passwordless connections. + + ``` + Auth0.authentication() + ``` + + Auth0 clientId & domain are loaded from the file `Auth0.plist` in your main bundle with the following content: + + ``` + + + + + ClientId + {YOUR_CLIENT_ID} + Domain + {YOUR_DOMAIN} + + + ``` + + - parameter session: instance of NSURLSession used for networking. By default it will use the shared NSURLSession + - parameter bundle: bundle used to locate the `Auth0.plist` file. By default is the main bundle + + - returns: Auth0 Authentication API + - important: Calling this method without a valid `Auth0.plist` will crash your application + */ +public func authentication(session: URLSession = .shared, bundle: Bundle = .main) -> Authentication { + let values = plistValues(bundle: bundle)! + return authentication(clientId: values.clientId, domain: values.domain, session: session) +} + +/** + Auth0 Management Users API v2 that allows CRUD operations with the users endpoint. + + ``` + Auth0.users(token: token) + ``` + + Currently you can only perform the following operations: + + * Get an user by id + * Update an user, e.g. by adding `user_metadata` + * Link users + * Unlink users + + Auth0 domain is loaded from the file `Auth0.plist` in your main bundle with the following content: + + ``` + + + + + ClientId + {YOUR_CLIENT_ID} + Domain + {YOUR_DOMAIN} + + + ``` + + - parameter token: token of Management API v2 with the correct allowed scopes to perform the desired action + - parameter session: instance of NSURLSession used for networking. By default it will use the shared NSURLSession + - parameter bundle: bundle used to locate the `Auth0.plist` file. By default is the main bundle + + - returns: Auth0 Management API v2 + - important: Calling this method without a valid `Auth0.plist` will crash your application + */ +public func users(token: String, session: URLSession = .shared, bundle: Bundle = .main) -> Users { + let values = plistValues(bundle: bundle)! + return users(token: token, domain: values.domain, session: session) +} + +/** + Auth0 Management Users API v2 that allows CRUD operations with the users endpoint. + + ``` + Auth0.users(token: token, domain: "samples.auth0.com") + ``` + + Currently you can only perform the following operations: + + * Get an user by id + * Update an user, e.g. by adding `user_metadata` + * Link users + * Unlink users + + - parameter token: token of Management API v2 with the correct allowed scopes to perform the desired action + - parameter domain: domain of your Auth0 account. e.g.: 'samples.auth0.com' + - parameter session: instance of NSURLSession used for networking. By default it will use the shared NSURLSession + + - returns: Auth0 Management API v2 + */ +public func users(token: String, domain: String, session: URLSession = .shared) -> Users { + return Management(token: token, url: .a0_url(domain), session: session) +} + +func plistValues(bundle: Bundle) -> (clientId: String, domain: String)? { + guard + let path = bundle.path(forResource: "Auth0", ofType: "plist"), + let values = NSDictionary(contentsOfFile: path) as? [String: Any] + else { + print("Missing Auth0.plist file with 'ClientId' and 'Domain' entries in main bundle!") + return nil + } + + guard + let clientId = values["ClientId"] as? String, + let domain = values["Domain"] as? String + else { + print("Auth0.plist file at \(path) is missing 'ClientId' and/or 'Domain' entries!") + print("File currently has the following entries: \(values)") + return nil + } + return (clientId: clientId, domain: domain) +} diff --git a/TracMobility/Pods/Auth0/Auth0/Auth0Authentication.swift b/TracMobility/Pods/Auth0/Auth0/Auth0Authentication.swift new file mode 100644 index 0000000..66463c2 --- /dev/null +++ b/TracMobility/Pods/Auth0/Auth0/Auth0Authentication.swift @@ -0,0 +1,434 @@ +// Auth0Authentication.swift +// +// Copyright (c) 2016 Auth0 (http://auth0.com) +// +// 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. + +// swiftlint:disable file_length + +import Foundation + +struct Auth0Authentication: Authentication { + + let clientId: String + let url: URL + var telemetry: Telemetry + var logger: Logger? + + let session: URLSession + + init(clientId: String, url: URL, session: URLSession = URLSession.shared, telemetry: Telemetry = Telemetry()) { + self.clientId = clientId + self.url = url + self.session = session + self.telemetry = telemetry + } + + func login(email username: String, code otp: String, audience: String?, scope: String?, parameters: [String: Any]) -> Request { + return login(username: username, otp: otp, realm: "email", audience: audience, scope: scope, parameters: parameters) + } + + func login(phoneNumber username: String, code otp: String, audience: String?, scope: String?, parameters: [String: Any]) -> Request { + return login(username: username, otp: otp, realm: "sms", audience: audience, scope: scope, parameters: parameters) + } + + // swiftlint:disable:next function_parameter_count + func login(usernameOrEmail username: String, password: String, multifactorCode: String?, connection: String, scope: String, parameters: [String: Any]) -> Request { + let resourceOwner = URL(string: "/oauth/ro", relativeTo: self.url)! + var payload: [String: Any] = [ + "username": username, + "password": password, + "connection": connection, + "grant_type": "password", + "scope": scope, + "client_id": self.clientId + ] + payload["mfa_code"] = multifactorCode + parameters.forEach { key, value in payload[key] = value } + return Request(session: session, + url: resourceOwner, + method: "POST", + handle: authenticationObject, + payload: payload, + logger: self.logger, + telemetry: self.telemetry) + } + + // swiftlint:disable:next function_parameter_count + func login(usernameOrEmail username: String, password: String, realm: String, audience: String?, scope: String?, parameters: [String: Any]?) -> Request { + let resourceOwner = URL(string: "/oauth/token", relativeTo: self.url)! + var payload: [String: Any] = [ + "username": username, + "password": password, + "grant_type": "http://auth0.com/oauth/grant-type/password-realm", + "client_id": self.clientId, + "realm": realm + ] + payload["audience"] = audience + payload["scope"] = scope + if let parameters = parameters { + parameters.forEach { key, value in payload[key] = value } + } + return Request(session: session, + url: resourceOwner, + method: "POST", + handle: authenticationObject, + payload: payload, + logger: self.logger, + telemetry: self.telemetry) + } + + func loginDefaultDirectory(withUsername username: String, password: String, audience: String? = nil, scope: String? = nil, parameters: [String: Any]? = nil) -> Request { + let resourceOwner = URL(string: "/oauth/token", relativeTo: self.url)! + var payload: [String: Any] = [ + "username": username, + "password": password, + "grant_type": "password", + "client_id": self.clientId + ] + payload["audience"] = audience + payload["scope"] = scope + if let parameters = parameters { + parameters.forEach { key, value in payload[key] = value } + } + return Request(session: session, + url: resourceOwner, + method: "POST", + handle: authenticationObject, + payload: payload, + logger: self.logger, + telemetry: self.telemetry) + } + + func login(withOTP otp: String, mfaToken: String) -> Request { + let url = URL(string: "/oauth/token", relativeTo: self.url)! + let payload: [String: Any] = [ + "otp": otp, + "mfa_token": mfaToken, + "grant_type": "http://auth0.com/oauth/grant-type/mfa-otp", + "client_id": self.clientId + ] + return Request(session: session, + url: url, + method: "POST", + handle: authenticationObject, + payload: payload, + logger: self.logger, + telemetry: self.telemetry) + } + + func login(appleAuthorizationCode authorizationCode: String, fullName: PersonNameComponents?, profile: [String: Any]?, scope: String?, audience: String?) -> Request { + var parameters: [String: Any] = [:] + var profile: [String: Any] = profile ?? [:] + + if let fullName = fullName { + let name = ["firstName": fullName.givenName, "lastName": fullName.familyName].compactMapValues { $0 } + if !name.isEmpty { + profile["name"] = name + } + } + + if !profile.isEmpty, let jsonData = try? JSONSerialization.data(withJSONObject: profile, options: []), + let json = String(data: jsonData, encoding: .utf8) { + parameters["user_profile"] = json + } + + return self.tokenExchange(subjectToken: authorizationCode, + subjectTokenType: "http://auth0.com/oauth/token-type/apple-authz-code", + scope: scope, + audience: audience, + parameters: parameters) + } + + func login(facebookSessionAccessToken sessionAccessToken: String, profile: [String: Any], scope: String?, audience: String?) -> Request { + var parameters: [String: String] = [:] + if let jsonData = try? JSONSerialization.data(withJSONObject: profile, options: []), + let json = String(data: jsonData, encoding: .utf8) { + parameters["user_profile"] = json + } + return self.tokenExchange(subjectToken: sessionAccessToken, + subjectTokenType: "http://auth0.com/oauth/token-type/facebook-info-session-access-token", + scope: scope, + audience: audience, + parameters: parameters) + } + + func createUser(email: String, username: String? = nil, password: String, connection: String, userMetadata: [String: Any]? = nil, rootAttributes: [String: Any]? = nil) -> Request { + var payload: [String: Any] = [ + "email": email, + "password": password, + "connection": connection, + "client_id": self.clientId + ] + payload["username"] = username + payload["user_metadata"] = userMetadata + if let rootAttributes = rootAttributes { + rootAttributes.forEach { (key, value) in + if payload[key] == nil { payload[key] = value } + } + } + + let createUser = URL(string: "/dbconnections/signup", relativeTo: self.url)! + return Request(session: session, + url: createUser, + method: "POST", + handle: databaseUser, + payload: payload, + logger: self.logger, + telemetry: self.telemetry) + } + + func resetPassword(email: String, connection: String) -> Request { + let payload = [ + "email": email, + "connection": connection, + "client_id": self.clientId + ] + let resetPassword = URL(string: "/dbconnections/change_password", relativeTo: self.url)! + return Request(session: session, + url: resetPassword, + method: "POST", + handle: noBody, + payload: payload, + logger: self.logger, + telemetry: self.telemetry) + } + + // swiftlint:disable:next function_parameter_count + func signUp(email: String, username: String? = nil, password: String, connection: String, userMetadata: [String: Any]?, scope: String, parameters: [String: Any]) -> ConcatRequest { + let first = createUser(email: email, username: username, password: password, connection: connection, userMetadata: userMetadata) + let second = login(usernameOrEmail: email, password: password, connection: connection, scope: scope, parameters: parameters) + return ConcatRequest(first: first, second: second) + } + + func startPasswordless(email: String, type: PasswordlessType, connection: String, parameters: [String: Any]) -> Request { + var payload: [String: Any] = [ + "email": email, + "connection": connection, + "send": type.rawValue, + "client_id": self.clientId + ] + if case .WebLink = type, !parameters.isEmpty { + payload["authParams"] = parameters + } + + let start = URL(string: "/passwordless/start", relativeTo: self.url)! + return Request(session: session, + url: start, + method: "POST", + handle: noBody, + payload: payload, + logger: self.logger, + telemetry: self.telemetry) + } + + func startPasswordless(phoneNumber: String, type: PasswordlessType, connection: String) -> Request { + let payload: [String: Any] = [ + "phone_number": phoneNumber, + "connection": connection, + "send": type.rawValue, + "client_id": self.clientId + ] + let start = URL(string: "/passwordless/start", relativeTo: self.url)! + return Request(session: session, + url: start, + method: "POST", + handle: noBody, + payload: payload, + logger: self.logger, + telemetry: self.telemetry) + } + + func tokenInfo(token: String) -> Request { + let payload: [String: Any] = ["id_token": token] + let tokenInfo = URL(string: "/tokeninfo", relativeTo: self.url)! + return Request(session: session, + url: tokenInfo, + method: "POST", + handle: authenticationObject, + payload: payload, + logger: self.logger, + telemetry: self.telemetry) + } + + func userInfo(token: String) -> Request { + let userInfo = URL(string: "/userinfo", relativeTo: self.url)! + return Request(session: session, + url: userInfo, + method: "GET", + handle: authenticationObject, + headers: ["Authorization": "Bearer \(token)"], + logger: self.logger, + telemetry: self.telemetry) + } + + func userInfo(withAccessToken accessToken: String) -> Request { + let userInfo = URL(string: "/userinfo", relativeTo: self.url)! + return Request(session: session, + url: userInfo, + method: "GET", + handle: authenticationObject, + headers: ["Authorization": "Bearer \(accessToken)"], + logger: self.logger, + telemetry: self.telemetry) + } + + func loginSocial(token: String, connection: String, scope: String, parameters: [String: Any]) -> Request { + var payload: [String: Any] = [ + "access_token": token, + "connection": connection, + "scope": scope, + "client_id": self.clientId + ] + parameters.forEach { key, value in payload[key] = value } + let accessToken = URL(string: "/oauth/access_token", relativeTo: self.url)! + return Request(session: session, + url: accessToken, + method: "POST", + handle: authenticationObject, + payload: payload, + logger: self.logger, + telemetry: self.telemetry) + } + + func tokenExchange(withParameters parameters: [String: Any]) -> Request { + var payload: [String: Any] = [ + "client_id": self.clientId + ] + parameters.forEach { payload[$0] = $1 } + let token = URL(string: "/oauth/token", relativeTo: self.url)! + return Request(session: session, + url: token, + method: "POST", + handle: authenticationObject, + payload: payload, + logger: self.logger, + telemetry: self.telemetry) + } + + func tokenExchange(withCode code: String, codeVerifier: String, redirectURI: String) -> Request { + return self.tokenExchange(withParameters: [ + "code": code, + "code_verifier": codeVerifier, + "redirect_uri": redirectURI, + "grant_type": "authorization_code" + ]) + } + + func tokenExchange(withAppleAuthorizationCode authCode: String, scope: String?, audience: String?, fullName: PersonNameComponents?) -> Request { + return self.login(appleAuthorizationCode: authCode, fullName: fullName, scope: scope, audience: audience) + } + + func renew(withRefreshToken refreshToken: String, scope: String? = nil) -> Request { + var payload: [String: Any] = [ + "refresh_token": refreshToken, + "grant_type": "refresh_token", + "client_id": self.clientId + ] + payload["scope"] = scope + let oauthToken = URL(string: "/oauth/token", relativeTo: self.url)! + return Request(session: session, + url: oauthToken, + method: "POST", + handle: authenticationObject, + payload: payload, + logger: self.logger, + telemetry: self.telemetry) + } + + func revoke(refreshToken: String) -> Request { + let payload: [String: Any] = [ + "token": refreshToken, + "client_id": self.clientId + ] + let oauthToken = URL(string: "/oauth/revoke", relativeTo: self.url)! + return Request(session: session, + url: oauthToken, + method: "POST", + handle: noBody, + payload: payload, + logger: self.logger, + telemetry: self.telemetry) + } + + func delegation(withParameters parameters: [String: Any]) -> Request<[String: Any], AuthenticationError> { + var payload: [String: Any] = [ + "client_id": self.clientId, + "grant_type": "urn:ietf:params:oauth:grant-type:jwt-bearer" + ] + parameters.forEach { payload[$0] = $1 } + let delegation = URL(string: "/delegation", relativeTo: self.url)! + return Request(session: session, + url: delegation, + method: "POST", + handle: plainJson, + payload: payload, + logger: self.logger, + telemetry: self.telemetry) + } + + func jwks() -> Request { + let jwks = URL(string: "/.well-known/jwks.json", relativeTo: self.url)! + return Request(session: session, + url: jwks, + method: "GET", + handle: codable, + logger: self.logger, + telemetry: self.telemetry) + } + +} + +// MARK: - Private Methods + +private extension Auth0Authentication { + // swiftlint:disable:next function_parameter_count + func login(username: String, otp: String, realm: String, audience: String?, scope: String?, parameters: [String: Any]) -> Request { + let url = URL(string: "/oauth/token", relativeTo: self.url)! + var payload: [String: Any] = [ + "username": username, + "otp": otp, + "realm": realm, + "grant_type": "http://auth0.com/oauth/grant-type/passwordless/otp", + "client_id": self.clientId + ] + if let audience = audience { + payload["audience"] = audience + } + if let scope = scope { + payload["scope"] = scope + } + parameters.forEach { key, value in payload[key] = value } + return Request(session: session, url: url, method: "POST", handle: authenticationObject, payload: payload, logger: self.logger, telemetry: self.telemetry) + } + + func tokenExchange(subjectToken: String, subjectTokenType: String, scope: String?, audience: String?, parameters: [String: Any]?) -> Request { + var parameters: [String: Any] = parameters ?? [:] + parameters["grant_type"] = "urn:ietf:params:oauth:grant-type:token-exchange" + parameters["subject_token"] = subjectToken + parameters["subject_token_type"] = subjectTokenType + if let scope = scope { + parameters["scope"] = scope + } + if let audience = audience { + parameters["audience"] = audience + } + return self.tokenExchange(withParameters: parameters) + } +} diff --git a/TracMobility/Pods/Auth0/Auth0/Auth0Error.swift b/TracMobility/Pods/Auth0/Auth0/Auth0Error.swift new file mode 100644 index 0000000..b640d98 --- /dev/null +++ b/TracMobility/Pods/Auth0/Auth0/Auth0Error.swift @@ -0,0 +1,40 @@ +// Auth0Error.swift +// +// Copyright (c) 2016 Auth0 (http://auth0.com) +// +// 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 + +let unknownError = "a0.sdk.internal_error.unknown" +let nonJSONError = "a0.sdk.internal_error.plain" +let emptyBodyError = "a0.sdk.internal_error.empty" + +/** + Generic representation of Auth0 API errors + - note: It's recommended to use either `AuthenticationError` or `ManagementError` for better error handling + */ +public protocol Auth0Error: Error { + + init(string: String?, statusCode: Int) + init(info: [String: Any], statusCode: Int) + + /// The code of the error as a String + var code: String { get } +} diff --git a/TracMobility/Pods/Auth0/Auth0/AuthCancelable.swift b/TracMobility/Pods/Auth0/Auth0/AuthCancelable.swift new file mode 100644 index 0000000..0e9f3be --- /dev/null +++ b/TracMobility/Pods/Auth0/Auth0/AuthCancelable.swift @@ -0,0 +1,35 @@ +// AuthCancelable.swift +// +// Copyright (c) 2020 Auth0 (http://auth0.com) +// +// 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 WEB_AUTH_PLATFORM +/** +Represents a cancelable Auth operation with an Identity Provider (Auth0 or a third party). +*/ +public protocol AuthCancelable { + + /** + Terminates the operation and reports back that it was cancelled. + */ + func cancel() + +} +#endif diff --git a/TracMobility/Pods/Auth0/Auth0/AuthProvider.swift b/TracMobility/Pods/Auth0/Auth0/AuthProvider.swift new file mode 100644 index 0000000..980c2b8 --- /dev/null +++ b/TracMobility/Pods/Auth0/Auth0/AuthProvider.swift @@ -0,0 +1,57 @@ +// AuthProvider.swift +// +// Copyright (c) 2017 Auth0 (http://auth0.com) +// +// 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 WEB_AUTH_PLATFORM +/** + The AuthProvider protocol is adopted by objects that are to be used as Native Authentication + handlers. An object implementing this protocol is intended to supersede the default authentication + model for a given connection name with its own native implementation. + + ``` + struct Facebook: AuthProvider { + + func login(withConnection connection: String, scope: String, parameters: [String : Any]) -> NativeAuthTransaction { + let transaction = FacebookNativeAuthTransaction() + ... + return transaction + } + + static func isAvailable() -> Bool { + return true + } + + ``` + */ +public protocol AuthProvider { + func login(withConnection connection: String, scope: String, parameters: [String: Any]) -> NativeAuthTransaction + + /** + Determine if the Auth method used by the Provider is available on the device. + e.g. If using a Twitter Auth provider it should check the presence of a Twitter account on the device. + + If a Auth is performed on a provider that returns `false` the transaction will fail with an error. + + - returns: Bool if the AuthProvider is available on the device + */ + static func isAvailable() -> Bool +} +#endif diff --git a/TracMobility/Pods/Auth0/Auth0/AuthSession.swift b/TracMobility/Pods/Auth0/Auth0/AuthSession.swift new file mode 100644 index 0000000..4640b27 --- /dev/null +++ b/TracMobility/Pods/Auth0/Auth0/AuthSession.swift @@ -0,0 +1,30 @@ +// AuthSession.swift +// +// Copyright (c) 2020 Auth0 (http://auth0.com) +// +// 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 WEB_AUTH_PLATFORM +protocol AuthSession { + + func start() -> Bool + func cancel() + +} +#endif diff --git a/TracMobility/Pods/Auth0/Auth0/AuthTransaction.swift b/TracMobility/Pods/Auth0/Auth0/AuthTransaction.swift new file mode 100644 index 0000000..1a833de --- /dev/null +++ b/TracMobility/Pods/Auth0/Auth0/AuthTransaction.swift @@ -0,0 +1,39 @@ +// AuthTransaction.swift +// +// Copyright (c) 2016 Auth0 (http://auth0.com) +// +// 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 WEB_AUTH_PLATFORM +/** +Represents an ongoing Auth transaction with an Identity Provider (Auth0 or a third party). + +The Auth will be done outside of application control, Safari or third party application. +The only way to communicate the results back is using a url with a registered custom scheme in your application so the OS can open it on success/failure. +When that happens the OS will call a method in your `AppDelegate` and that is where you need to handle the result. + +- important: Only one AuthTransaction can be active at a given time for Auth0.swift, if you start a new one before finishing the current one it will be cancelled. +*/ +public protocol AuthTransaction: AuthResumable, AuthCancelable { + + /// value of the OAuth 2.0 state parameter. It must be a cryptographically secure randon string used to protect the app with request forgery. + var state: String? { get } + +} +#endif diff --git a/TracMobility/Pods/Auth0/Auth0/Authentication.swift b/TracMobility/Pods/Auth0/Auth0/Authentication.swift new file mode 100644 index 0000000..a5f2f00 --- /dev/null +++ b/TracMobility/Pods/Auth0/Auth0/Authentication.swift @@ -0,0 +1,1287 @@ +// Authentication.swift +// +// Copyright (c) 2016 Auth0 (http://auth0.com) +// +// 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. + +// swiftlint:disable file_length + +import Foundation + +public typealias DatabaseUser = (email: String, username: String?, verified: Bool) + +/** + Auth endpoints of Auth0 + - seeAlso: [Auth0 Auth API docs](https://auth0.com/docs/api/authentication) + */ +public protocol Authentication: Trackable, Loggable { + var clientId: String { get } + var url: URL { get } + + /** + Logs in a user using an email and an OTP code received via email (last part of the passwordless login flow) + + ``` + Auth0 + .authentication(clientId: clientId, domain: "samples.auth0.com") + .login(email: "support@auth0.com", code: "123456") + .start { result in + switch result { + case .success(let credentials): + print(credentials) + case .failure(let error): + print(error) + } + } + ``` + + You can also specify audience, scope, and additional parameters + + ``` + Auth0 + .authentication(clientId: clientId, domain: "samples.auth0.com") + .login(email: "support@auth0.com", + code: "123456", + audience: "https://myapi.com/api", + scope: "openid email", + parameters: ["state": "a random state"]) + .start { print($0) } + ``` + + When result is `.success`, its associated value will be a`Credentials` object containing at least an `access_token` (depending on the scopes used to authenticate) + + - parameter email: email the user used to start the passwordless login flow + - parameter code: one time password (OTP) code the user received via email + - parameter audience: API Identifier that the client is requesting access to. Default is `nil` + - parameter scope: scope value requested when authenticating the user. Default is `openid` + - parameter parameters: additional parameters that are optionally sent with the authentication request + + - returns: authentication request that will yield Auth0 User Credentials + - seeAlso: Credentials + - requires: Passwordless OTP Grant `http://auth0.com/oauth/grant-type/passwordless/otp`. Check [our documentation](https://auth0.com/docs/clients/client-grant-types) for more info and how to enable it. + */ + func login(email username: String, code otp: String, audience: String?, scope: String?, parameters: [String: Any]) -> Request + + /** + Logs in a user using a phone number and an OTP code received via sms (last part of the passwordless login flow) + + ``` + Auth0 + .authentication(clientId: clientId, domain: "samples.auth0.com") + .login(phoneNumber: "+4599134762367", code: "123456") + .start { result in + switch result { + case .success(let credentials): + print(credentials) + case .failure(let error): + print(error) + } + } + ``` + + You can also specify audience, scope, and additional parameters + + ``` + Auth0 + .authentication(clientId: clientId, domain: "samples.auth0.com") + .login(phoneNumber: "+4599134762367", + code: "123456", + audience: "https://myapi.com/api", + scope: "openid email", + parameters: ["state": "a random state"]) + .start { print($0) } + ``` + + When result is `.success`, its associated value will be a`Credentials` object containing at least an `access_token` (depending on the scopes used to authenticate) + + - parameter phoneNumber: phone number the user used to start the passwordless login flow + - parameter code: one time password (OTP) code the user received via sms + - parameter audience: API Identifier that the client is requesting access to. Default is `nil` + - parameter scope: scope value requested when authenticating the user. Default is `openid` + - parameter parameters: additional parameters that are optionally sent with the authentication request + + - returns: authentication request that will yield Auth0 User Credentials + - seeAlso: Credentials + - requires: Passwordless OTP Grant `http://auth0.com/oauth/grant-type/passwordless/otp`. Check [our documentation](https://auth0.com/docs/clients/client-grant-types) for more info and how to enable it. + */ + func login(phoneNumber username: String, code otp: String, audience: String?, scope: String?, parameters: [String: Any]) -> Request + + /** + Logs in an user using email|username and password using a Database and Passwordless connection + + ``` + Auth0 + .authentication(clientId: clientId, domain: "samples.auth0.com") + .login(usernameOrEmail: "support@auth0.com", password: "a secret password", connection: "Username-Password-Authentication") + .start { result in + switch result { + case .Success(let credentials): + print(credentials) + case .Failure(let error): + print(error) + } + } + ``` + + you can also specify scope and additional parameters + + ``` + Auth0 + .authentication(clientId: clientId, domain: "samples.auth0.com") + .login(usernameOrEmail: "support@auth0.com", password: "a secret password", connection: "Username-Password-Authentication", scope: "openid email", parameters: ["state": "a random state"]) + .start { print($0) } + ``` + + for passwordless connections + + ``` + Auth0 + .authentication(clientId: clientId, domain: "samples.auth0.com") + .login(usernameOrEmail: "+4599134762367", password: "123456", connection: "sms", scope: "openid email", parameters: ["state": "a random state"]) + .start { print($0) } + ``` + + Also some enterprise connections, like Active Directory (AD), allows authentication using username/password without using the web flow. + + When result is `.success`, its associated value will be a`Credentials` object containing at least an `access_token` (depending on the scopes used to authenticate) + + - parameter usernameOrEmail: username or email used of the user to authenticate, e.g. in email in Database connections or phone number for SMS connections. + - parameter password: password of the user or one time password (OTP) for passwordless connection users + - parameter multifactorCode: multifactor code if the user has enrolled one. e.g. Guardian. By default is `nil` and no code is sent. + - parameter connection: name of any of your configured database or passwordless connections + - parameter scope: scope value requested when authenticating the user. Default is 'openid' + - parameter parameters: additional parameters that are optionally sent with the authentication request + + - returns: authentication request that will yield Auth0 User Credentials + - seeAlso: Credentials + - warning: this method is deprecated in favor of `login(usernameOrEmail username:, password:, realm:, audience:, scope:)` for Database connections. For Passwordless connections use `login(email:, code:, audience:, scope:, parameters:)` or `login(phoneNumber:, code:, audience:, scope:, parameters:)` instead. + - requires: Legacy Grant `http://auth0.com/oauth/legacy/grant-type/ro`. Check [our documentation](https://auth0.com/docs/clients/client-grant-types) for more info and how to enable it. + */ + @available(*, deprecated, message: "see login(usernameOrEmail username:, password:, realm:, audience:, scope:)") + // swiftlint:disable:next function_parameter_count + func login(usernameOrEmail username: String, password: String, multifactorCode: String?, connection: String, scope: String, parameters: [String: Any]) -> Request + + /** + Login using username and password in a realm. + + ``` + Auth0 + .authentication(clientId: clientId, domain: "samples.auth0.com") + .login( + usernameOrEmail: "support@auth0.com", + password: "a secret password", + realm: "mydatabase") + ``` + + You can also specify audience and scope + + ``` + Auth0 + .authentication(clientId: clientId, domain: "samples.auth0.com") + .login( + usernameOrEmail: "support@auth0.com", + password: "a secret password", + realm: "mydatabase", + audience: "https://myapi.com/api", + scope: "openid profile") + ``` + + - parameter username: username or email used of the user to authenticate + - parameter password: password of the user + - parameter realm: domain of the realm or connection name + - parameter audience: API Identifier that the client is requesting access to. + - parameter scope: scope value requested when authenticating the user. + - parameter parameters: additional parameters that are optionally sent with the authentication request + + - important: This only works if you have the OAuth 2.0 API Authorization flag on + - returns: authentication request that will yield Auth0 User Credentials + - requires: Grant `http://auth0.com/oauth/grant-type/password-realm`. Check [our documentation](https://auth0.com/docs/clients/client-grant-types) for more info and how to enable it. + */ + // swiftlint:disable:next function_parameter_count + func login(usernameOrEmail username: String, password: String, realm: String, audience: String?, scope: String?, parameters: [String: Any]?) -> Request + + /** + Login using One Time Password and MFA token. + + ``` + Auth0 + .authentication(clientId: clientId, domain: "samples.auth0.com") + .login(withOTP: "123456", mfaToken: "mfa token value") + } + ``` + + - parameter otp: One time password supplied by MFA Authenticator + - parameter mfaToken: Token returned when authentication fails due to MFA requirement + + - requires: Grant `http://auth0.com/oauth/grant-type/mfa-otp`. Check [our documentation](https://auth0.com/docs/clients/client-grant-types) for more info and how to enable it. + */ + func login(withOTP otp: String, mfaToken: String) -> Request + + /** + Authenticate a user with their Sign In With Apple authorization code. + + ``` + Auth0 + .authentication(clientId: clientId, domain: "samples.auth0.com") + .login(appleAuthorizationCode: authCode) + .start { print($0) } + ``` + + and if you need to specify a scope or add additional parameters + + ``` + Auth0 + .authentication(clientId: clientId, domain: "samples.auth0.com") + .login(appleAuthorizationCode: authCode, + fullName: credentials.fullName, + scope: "openid profile email", + audience: "https://myapi.com/api") + .start { print($0) } + ``` + + - parameter authCode: Authorization Code retrieved from Apple Authorization + - parameter fullName: The full name property returned with the Apple ID Credentials + - parameter profile: Additional user profile data returned with the Apple ID Credentials + - parameter scope: Requested scope value when authenticating the user. By default is `openid profile offline_access` + - parameter audience: API Identifier that the client is requesting access to + + - returns: a request that will yield Auth0 user's credentials + */ + func login(appleAuthorizationCode authorizationCode: String, fullName: PersonNameComponents?, profile: [String: Any]?, scope: String?, audience: String?) -> Request + + /** + Authenticate a user with their Facebook session info access token and profile data. + + ``` + Auth0 + .authentication(clientId: clientId, domain: "samples.auth0.com") + .login(facebookSessionAccessToken: sessionAccessToken, profile: profile) + .start { print($0) } + ``` + + and if you need to specify a scope or audience + + ``` + Auth0 + .authentication(clientId: clientId, domain: "samples.auth0.com") + .login(facebookSessionAccessToken: sessionAccessToken, + scope: "openid profile email", + audience: "https://myapi.com/api") + .start { print($0) } + ``` + + - parameter sessionAccessToken: Session info access token retrieved from Facebook + - parameter profile: The user profile returned by Facebook + - parameter scope: Requested scope value when authenticating the user. By default is `openid profile offline_access` + - parameter audience: API Identifier that the client is requesting access to + + - returns: a request that will yield Auth0 user's credentials + */ + func login(facebookSessionAccessToken sessionAccessToken: String, profile: [String: Any], scope: String?, audience: String?) -> Request + + /** + Login using username and password in the default directory + + ``` + Auth0 + .authentication(clientId: clientId, domain: "samples.auth0.com") + .loginDefaultDirectory( + withUsername: "support@auth0.com", + password: "a secret password") + ``` + + You can also specify audience and scope + + ``` + Auth0 + .authentication(clientId: clientId, domain: "samples.auth0.com") + .loginDefaultDirectory( + withUsername: "support@auth0.com", + password: "a secret password", + audience: "https://myapi.com/api", + scope: "openid profile") + ``` + + - parameter username: username or email used of the user to authenticate + - parameter password: password of the user + - parameter audience: API Identifier that the client is requesting access to. + - parameter scope: scope value requested when authenticating the user. + - parameter parameters: additional parameters that are optionally sent with the authentication request + + - important: This only works if you have the OAuth 2.0 API Authorization flag on + - returns: authentication request that will yield Auth0 User Credentials + */ + func loginDefaultDirectory(withUsername username: String, password: String, audience: String?, scope: String?, parameters: [String: Any]?) -> Request + + /** + Creates a user in a Database connection + + ``` + Auth0 + .authentication(clientId: clientId, domain: "samples.auth0.com") + .createUser(email: "support@auth0.com", password: "a secret password", connection: "Username-Password-Authentication") + .start { print($0) } + ``` + + you can also add additional metadata when creating the user + + ``` + Auth0 + .authentication(clientId: clientId, domain: "samples.auth0.com") + .createUser(email: "support@auth0.com", password: "a secret password", connection: "Username-Password-Authentication", userMetadata: ["first_name": "support"]) + .start { print($0) } + ``` + + and if the database connection requires a username + + ``` + Auth0 + .authentication(clientId, domain: "samples.auth0.com") + .createUser(email: "support@auth0.com", username: "support", password: "a secret password", connection: "Username-Password-Authentication") + .start { print($0) } + ``` + + - parameter email: email of the user to create + - parameter username: username of the user if the connection requires username. By default is 'nil' + - parameter password: password for the new user + - parameter connection: name where the user will be created (Database connection) + - parameter userMetadata: additional userMetadata parameters that will be added to the newly created user. + - parameter rootAttributes: root attributes that will be added to the newly created user. See https://auth0.com/docs/api/authentication#signup for supported attributes. Will not overwrite existing parameters. + + - returns: request that will yield a created database user (just email, username and email verified flag) + */ + // swiftlint:disable:next function_parameter_count + func createUser(email: String, username: String?, password: String, connection: String, userMetadata: [String: Any]?, rootAttributes: [String: Any]?) -> Request + + /** + Resets a Database user password + + ``` + Auth0 + .authentication(clientId: clientId, domain: "samples.auth0.com") + .resetPassword(email: "support@auth0.com", connection: "Username-Password-Authentication") + .start { print($0) } + ``` + + - parameter email: email of the database user + - parameter connection: name of the Database connection + + - returns: request to reset password + */ + func resetPassword(email: String, connection: String) -> Request + + /** + Creates a database user and then authenticates the user against Auth0. + + ``` + Auth0 + .authentication(clientId: clientId, domain: "samples.auth0.com") + .signUp(email: "support@auth0.com", password: "a secret password", connection: "Username-Password-Authentication") + .start { print($0) } + ``` + + you can also add additional attributes when creating the user + + ``` + Auth0 + .authentication(clientId: clientId, domain: "samples.auth0.com") + .signUp(email: "support@auth0.com", password: "a secret password", connection: "Username-Password-Authentication", userMetadata: ["first_name": "support"]) + .start { print($0) } + ``` + + and if the database connection requires a username + + ``` + Auth0 + .authentication(clientId: clientId, domain: "samples.auth0.com") + .signUp(email: "support@auth0.com", username: "support", password: "a secret password", connection: "Username-Password-Authentication") + .start { print($0) } + ``` + + or specifying the scope and parameters used for authentication + + ``` + Auth0 + .authentication(clientId: clientId, domain: "samples.auth0.com") + .signUp(email: "support@auth0.com", password: "a secret password", connection: "Username-Password-Authentication", scope: "openid email", parameters: ["state": "a random state"]) + .start { print($0) } + ``` + + - parameter email: email of the new user + - parameter username: username of the user if connections requires username. By default is 'nil' + - parameter password: password for the new user + - parameter connection: name of the Database connection where the user will be created + - parameter userMetadata: additional userMetadata values added when creating the user + - parameter scope: requested scope value when authenticating the user. By default is 'openid' + - parameter parameters: additional parameters sent during authentication + + - returns: an authentication request that will yield Auth0 user credentials after creating the user. + - requires: Legacy Grant `http://auth0.com/oauth/legacy/grant-type/ro`. Check [our documentation](https://auth0.com/docs/clients/client-grant-types) for more info and how to enable it. + */ + @available(*, deprecated, message: "use createUser(email:, username:, password:, connection:, userMetadata:) and then login(usernameOrEmail username:, password:, realm:, audience:, scope:)") + // swiftlint:disable:next function_parameter_count + func signUp(email: String, username: String?, password: String, connection: String, userMetadata: [String: Any]?, scope: String, parameters: [String: Any]) -> ConcatRequest + + /** + Starts passwordless authentication by sending an email with a OTP code + + ``` + Auth0 + .authentication(clientId: clientId, domain: "samples.auth0.com") + .startPasswordless(email: "support@auth0.com") + .start { print($0) } + ``` + + or if you have configured iOS Universal Links + + ``` + Auth0 + .authentication(clientId: clientId, domain: "samples.auth0.com") + .startPasswordless(email: "support@auth0.com", type: .iOSLink) + .start { print($0) } + ``` + + - parameter email: email where to send the code or link + - parameter type: type of passwordless authentication/ By default is code + - parameter connection: name of the passwordless connection. By default is 'email' + - parameter parameters: additional authentication parameters added for Web link. Ignored in other types + + - returns: a request + - requires: Legacy Grant `http://auth0.com/oauth/legacy/grant-type/ro`. Check [our documentation](https://auth0.com/docs/clients/client-grant-types) for more info and how to enable it. + */ + func startPasswordless(email: String, type: PasswordlessType, connection: String, parameters: [String: Any]) -> Request + + /** + Starts passwordless authentication by sending an sms with an OTP code + + ``` + Auth0 + .authentication(clientId: clientId, domain: "samples.auth0.com") + .startPasswordless(phoneNumber: "support@auth0.com") + .start { print($0) } + ``` + + or if you have configured iOS Universal Links + + ``` + Auth0 + .authentication(clientId: clientId, domain: "samples.auth0.com") + .startPasswordless(phoneNumber: "support@auth0.com", type: .iOSLink) + .start { print($0) } + ``` + + - parameter phoneNumber: phone number where to send the sms with code or link + - parameter type: type of passwordless authentication. By default is code + - parameter connection: name of the passwordless connection. By default is 'sms' + + - returns: a request + - requires: Legacy Grant `http://auth0.com/oauth/legacy/grant-type/ro`. Check [our documentation](https://auth0.com/docs/clients/client-grant-types) for more info and how to enable it. + */ + func startPasswordless(phoneNumber: String, type: PasswordlessType, connection: String) -> Request + + /** + Returns token information by performing a request to the `/tokeninfo` endpoint. + + ``` + Auth0 + .authentication(clientId: clientId, domain: "samples.auth0.com") + .tokenInfo(token: token) + .start { print($0) } + ``` + + - parameter token: token obtained by authenticating the user + - warning: this method is deprecated in favor of `userInfo(withAccessToken accessToken:)` + - returns: a request that will yield token information + */ + @available(*, deprecated, message: "see userInfo(withAccessToken accessToken:)") + func tokenInfo(token: String) -> Request + + /** + Returns user information by performing a request to the `/userinfo` endpoint. + + ``` + Auth0 + .authentication(clientId, domain: "samples.auth0.com") + .userInfo(token: token) + .start { print($0) } + ``` + + - parameter token: token obtained by authenticating the user + + - returns: a request that will yield user information + - warning: for OIDC-conformant clients please use `userInfo(withAccessToken accessToken:)` + */ + func userInfo(token: String) -> Request + + /** + Returns OIDC standard claims information by performing a request + to the `/userinfo` endpoint. + + ``` + Auth0 + .authentication(clientId, domain: "samples.auth0.com") + .userInfo(withAccessToken: accessToken) + .start { print($0) } + ``` + + - parameter accessToken: accessToken obtained by authenticating the user + + - returns: a request that will yield user information + - important: This method should be used for OIDC Conformant clients. + */ + func userInfo(withAccessToken accessToken: String) -> Request + + /** + Logs in a user using a social Identity Provider token. e.g. Facebook + + ``` + Auth0 + .authentication(clientId: clientId, domain: "samples.auth0.com") + .loginSocial(token: fbToken, connection: "facebook") + .start { print($0) } + ``` + + and if you need to specify a scope or add additional parameters + + ``` + Auth0 + .authentication(clientId: clientId, domain: "samples.auth0.com") + .loginSocial(token: fbToken, connection: "facebook", scope: "openid email", parameters: ["state": "a random state"]) + .start { print($0) } + ``` + + - parameter token: token obtained from a social IdP + - parameter connection: name of the social connection. Only works with 'google-oauth2', 'facebook' and 'twitter' + - parameter scope: requested scope value when authenticating the user. By default is 'openid' + - parameter parameters: additional parameters sent during authentication + + - returns: a request that will yield Auth0 user's credentials + - warning: disabled for OIDC-conformant clients, an alternative will be added in a future release + - requires: Legacy Grant `http://auth0.com/oauth/legacy/grant-type/access_token`. Check [our documentation](https://auth0.com/docs/clients/client-grant-types) for more info and how to enable it. + */ + func loginSocial(token: String, connection: String, scope: String, parameters: [String: Any]) -> Request + + /** + Perform a OAuth2 token request against Auth0. + + ``` + Auth0 + .authentication(clientId: clientId, domain: "samples.auth0.com") + .tokenExchange(withParameters: ["key": "value"]) + .start { print($0) } + ``` + + - parameter parameters: request parameters + + - returns: a request that will yield Auth0 user's credentials + - seeAlso: exchangeCode(codeVerifier:, redirectURI:) for PKCE + */ + func tokenExchange(withParameters parameters: [String: Any]) -> Request + + /** + Performs the last step of Proof Key for Code Exchange [RFC 7636](https://tools.ietf.org/html/rfc7636). + + This will request User's token using the code and it's verifier after a request to `/oauth/authorize` + + ``` + Auth0 + .authentication(clientId: clientId, domain: "samples.auth0.com") + .tokenExchange(withCode: "a code", codeVerifier: "code verifier", redirectURI: "https://samples.auth0.com/callback") + .start { print($0) } + ``` + + - parameter code: code returned after an `/oauth/authorize` request + - parameter codeVerifier: verifier used to generate the challenge sent in `/oauth/authorize` request + - parameter redirectURI: redirect uri sent in `/oauth/authorize` request + + - returns: a request that will yield Auth0 user's credentials + - seeAlso: https://tools.ietf.org/html/rfc7636 + */ + func tokenExchange(withCode code: String, codeVerifier: String, redirectURI: String) -> Request + + /** + Authenticate a user with their Sign In With Apple authorization code. + + ``` + Auth0 + .authentication(clientId: clientId, domain: "samples.auth0.com") + .tokenExchange(withAppleAuthorizationCode: authCode) + .start { print($0) } + ``` + + and if you need to specify a scope or add additional parameters + + ``` + Auth0 + .authentication(clientId: clientId, domain: "samples.auth0.com") + .tokenExchange(withAppleAuthorizationCode: authCode, + scope: "openid profile email", + audience: "https://myapi.com/api", + fullName: credentials.fullName) + .start { print($0) } + ``` + + - parameter authCode: Authorization Code retrieved from Apple Authorization + - parameter scope: Requested scope value when authenticating the user. By default is `openid profile offline_access` + - parameter audience: API Identifier that the client is requesting access to + - parameter fullName: The full name property returned with the Apple ID Credentials + + - returns: a request that will yield Auth0 user's credentials + - warning: this method is deprecated in favor of `login(appleAuthorizationCode authorizationCode:, fullName:, scope:, audience:)` + */ + @available(*, deprecated, message: "see login(appleAuthorizationCode authorizationCode:, fullName:, scope:, audience:)") + func tokenExchange(withAppleAuthorizationCode authCode: String, scope: String?, audience: String?, fullName: PersonNameComponents?) -> Request + + /** + Renew user's credentials with a refresh_token grant for `/oauth/token` + If you are not using OAuth 2.0 API Authorization please use `delegation(parameters:)` + - parameter refreshToken: the client's refresh token + - parameter scope: scopes to request for the new tokens. By default is nil which will ask for the same ones requested during Auth. + - important: This method only works for a refresh token obtained after auth with OAuth 2.0 API Authorization. + - returns: a request that will yield Auth0 user's credentials + */ + func renew(withRefreshToken refreshToken: String, scope: String?) -> Request + + /** + Revoke a user's refresh_token with a call to `/oauth/revoke` + + ``` + Auth0 + .authentication(clientId: clientId, domain: "samples.auth0.com") + .revoke(refreshToken: refreshToken) + .start { print($0) } + ``` + + - parameter refreshToken: the client's refresh token + - returns: a request + */ + func revoke(refreshToken: String) -> Request + + /** + Calls delegation endpoint with the given parameters. + The only parameters it adds by default are `grant_type` and `client_id`. + - parameter parametes: dictionary with delegation parameters to send in the request. + - returns: a request that will yield the result of delegation + */ + func delegation(withParameters parameters: [String: Any]) -> Request<[String: Any], AuthenticationError> + + /** + Returns JSON Web Key Set (JWKS) information by performing a request to the `/.well-known/jwks.json` endpoint. + + ``` + Auth0 + .authentication(clientId: clientId, domain: "samples.auth0.com") + .jwks() + .start { print($0) } + ``` + + - returns: a request that will yield JWKS information + */ + func jwks() -> Request + +#if WEB_AUTH_PLATFORM + /** + Creates a new WebAuth request to authenticate using Safari browser and OAuth authorize flow. + + With the connection name Auth0 will redirect to the associated IdP login page to authenticate + + ``` + Auth0 + .authentication(clientId: clientId, domain: "samples.auth0.com") + .webAuth(withConnection: "facebook") + .start { print($0) } + ``` + + If you need to show your Auth0 account login page just create the WebAuth object directly + + ``` + Auth0 + .webAuth(clientId: clientId, domain: "samples.auth0.com") + .start { print($0) } + ``` + + - parameter connection: name of the connection to use + - returns: a newly created WebAuth object. + */ + func webAuth(withConnection connection: String) -> WebAuth +#endif +} + +/** + Types of passwordless authentication + + - Code: Simple OTP code sent by email or sms + - WebLink: Regular Web HTTP link (Web only, uses redirect) + - iOSLink: iOS 9 Universal Link + - AndroidLink: Android App Link + */ +public enum PasswordlessType: String { + case Code = "code" + case WebLink = "link" + case iOSLink = "link_ios" + case AndroidLink = "link_android" +} + +public extension Authentication { + + /** + Logs in a user using an email and an OTP code received via email (last part of the passwordless login flow) + + ``` + Auth0 + .authentication(clientId: clientId, domain: "samples.auth0.com") + .login(email: "support@auth0.com", code: "123456") + .start { result in + switch result { + case .success(let credentials): + print(credentials) + case .failure(let error): + print(error) + } + } + ``` + + You can also specify audience, scope, and additional parameters + + ``` + Auth0 + .authentication(clientId: clientId, domain: "samples.auth0.com") + .login(email: "support@auth0.com", + code: "123456", + audience: "https://myapi.com/api", + scope: "openid email", + parameters: ["state": "a random state"]) + .start { print($0) } + ``` + + When result is `.success`, its associated value will be a`Credentials` object containing at least an `access_token` (depending on the scopes used to authenticate) + + - parameter email: email the user used to start the passwordless login flow + - parameter code: one time password (OTP) code the user received via email + - parameter audience: API Identifier that the client is requesting access to. Default is `nil` + - parameter scope: scope value requested when authenticating the user. Default is `openid` + - parameter parameters: additional parameters that are optionally sent with the authentication request + + - returns: authentication request that will yield Auth0 User Credentials + - seeAlso: Credentials + - requires: Passwordless OTP Grant `http://auth0.com/oauth/grant-type/passwordless/otp`. Check [our documentation](https://auth0.com/docs/clients/client-grant-types) for more info and how to enable it. + */ + func login(email username: String, code otp: String, audience: String? = nil, scope: String? = "openid", parameters: [String: Any] = [:]) -> Request { + return self.login(email: username, code: otp, audience: audience, scope: scope, parameters: parameters) + } + + /** + Logs in a user using a phone number and an OTP code received via sms (last part of the passwordless login flow) + + ``` + Auth0 + .authentication(clientId: clientId, domain: "samples.auth0.com") + .login(phoneNumber: "+4599134762367", code: "123456") + .start { result in + switch result { + case .success(let credentials): + print(credentials) + case .failure(let error): + print(error) + } + } + ``` + + You can also specify audience, scope, and additional parameters + + ``` + Auth0 + .authentication(clientId: clientId, domain: "samples.auth0.com") + .login(phoneNumber: "+4599134762367", + code: "123456", + audience: "https://myapi.com/api", + scope: "openid email", + parameters: ["state": "a random state"]) + .start { print($0) } + ``` + + When result is `.success`, its associated value will be a`Credentials` object containing at least an `access_token` (depending on the scopes used to authenticate) + + - parameter phoneNumber: phone number the user used to start the passwordless login flow + - parameter code: one time password (OTP) code the user received via sms + - parameter audience: API Identifier that the client is requesting access to. Default is `nil` + - parameter scope: scope value requested when authenticating the user. Default is `openid` + - parameter parameters: additional parameters that are optionally sent with the authentication request + + - returns: authentication request that will yield Auth0 User Credentials + - seeAlso: Credentials + - requires: Passwordless OTP Grant `http://auth0.com/oauth/grant-type/passwordless/otp`. Check [our documentation](https://auth0.com/docs/clients/client-grant-types) for more info and how to enable it. + */ + func login(phoneNumber username: String, code otp: String, audience: String? = nil, scope: String? = "openid", parameters: [String: Any] = [:]) -> Request { + return self.login(phoneNumber: username, code: otp, audience: audience, scope: scope, parameters: parameters) + } + + /** + Logs in an user using email|username and password using a Database and Passwordless connection + + ``` + Auth0 + .authentication(clientId: clientId, domain: "samples.auth0.com") + .login(usernameOrEmail: "support@auth0.com", password: "a secret password", connection: "Username-Password-Authentication") + .start { result in + switch result { + case .Success(let credentials): + print(credentials) + case .Failure(let error): + print(error) + } + } + ``` + + you can also specify scope and additional parameters + + ``` + Auth0 + .authentication(clientId: clientId, domain: "samples.auth0.com") + .login(usernameOrEmail: "support@auth0.com", password: "a secret password", connection: "Username-Password-Authentication", scope: "openid email", parameters: ["state": "a random state"]) + .start { print($0) } + ``` + + for passwordless connections + + ``` + Auth0 + .authentication(clientId: clientId, domain: "samples.auth0.com") + .login(usernameOrEmail: "+4599134762367", password: "123456", connection: "sms", scope: "openid email", parameters: ["state": "a random state"]) + .start { print($0) } + ``` + + Also some enterprise connections, like Active Directory (AD), allows authentication using username/password without using the web flow. + + When result is `.success`, its associated value will be a`Credentials` object containing at least an `access_token` (depending on the scopes used to authenticate) + + - parameter usernameOrEmail: username or email used of the user to authenticate, e.g. in email in Database connections or phone number for SMS connections. + - parameter password: password of the user or one time password (OTP) for passwordless connection users + - parameter multifactorCode: multifactor code if the user has enrolled one. e.g. Guardian. By default is `nil` and no code is sent. + - parameter connection: name of any of your configured database or passwordless connections + - parameter scope: scope value requested when authenticating the user. Default is 'openid' + - parameter parameters: additional parameters that are optionally sent with the authentication request + + - returns: authentication request that will yield Auth0 User Credentials + - seeAlso: Credentials + - requires: Legacy Grant `http://auth0.com/oauth/legacy/grant-type/ro`. Check [our documentation](https://auth0.com/docs/clients/client-grant-types) for more info and how to enable it. + */ + func login(usernameOrEmail username: String, password: String, multifactorCode: String? = nil, connection: String, scope: String = "openid", parameters: [String: Any] = [:]) -> Request { + return self.login(usernameOrEmail: username, password: password, multifactorCode: multifactorCode, connection: connection, scope: scope, parameters: parameters) + } + + /** + Login using username and password in a realm. + + ``` + Auth0 + .authentication(clientId: clientId, domain: "samples.auth0.com") + .login( + usernameOrEmail: "support@auth0.com", + password: "a secret password", + realm: "mydatabase") + ``` + + You can also specify audience and scope + + ``` + Auth0 + .authentication(clientId: clientId, domain: "samples.auth0.com") + .login( + usernameOrEmail: "support@auth0.com", + password: "a secret password", + realm: "mydatabase", + audience: "https://myapi.com/api", + scope: "openid profile") + ``` + + - parameter username: username or email used of the user to authenticate + - parameter password: password of the user + - parameter realm: domain realm or connection name + - parameter audience: API Identifier that the client is requesting access to. + - parameter scope: scope value requested when authenticating the user. + - parameter parameters: additional parameters that are optionally sent with the authentication request + - Returns: authentication request that will yield Auth0 User Credentials + - requires: Grant `http://auth0.com/oauth/grant-type/password-realm`. Check [our documentation](https://auth0.com/docs/clients/client-grant-types) for more info and how to enable it. + */ + func login(usernameOrEmail username: String, password: String, realm: String, audience: String? = nil, scope: String? = nil, parameters: [String: Any]? = nil) -> Request { + return self.login(usernameOrEmail: username, password: password, realm: realm, audience: audience, scope: scope, parameters: parameters) + } + + /** + Authenticate a user with their Sign In With Apple authorization code. + + ``` + Auth0 + .authentication(clientId: clientId, domain: "samples.auth0.com") + .login(appleAuthorizationCode: authCode) + .start { print($0) } + ``` + + and if you need to specify a scope or add additional parameters + + ``` + Auth0 + .authentication(clientId: clientId, domain: "samples.auth0.com") + .login(appleAuthorizationCode: authCode, + fullName: credentials.fullName, + scope: "openid profile email", + audience: "https://myapi.com/api") + .start { print($0) } + ``` + + - parameter authCode: Authorization Code retrieved from Apple Authorization + - parameter fullName: The full name property returned with the Apple ID Credentials + - parameter profile: Additional user profile data returned with the Apple ID Credentials + - parameter scope: Requested scope value when authenticating the user. By default is `openid profile offline_access` + - parameter audience: API Identifier that the client is requesting access to + + - returns: a request that will yield Auth0 user's credentials + */ + func login(appleAuthorizationCode authorizationCode: String, fullName: PersonNameComponents? = nil, profile: [String: Any]? = nil, scope: String? = "openid profile offline_access", audience: String? = nil) -> Request { + return self.login(appleAuthorizationCode: authorizationCode, fullName: fullName, profile: profile, scope: scope, audience: audience) + } + + /** + Authenticate a user with their Facebook session info access token and profile data. + + ``` + Auth0 + .authentication(clientId: clientId, domain: "samples.auth0.com") + .login(facebookSessionAccessToken: sessionAccessToken, profile: profile) + .start { print($0) } + ``` + + and if you need to specify a scope or audience + + ``` + Auth0 + .authentication(clientId: clientId, domain: "samples.auth0.com") + .login(facebookSessionAccessToken: sessionAccessToken, + scope: "openid profile email", + audience: "https://myapi.com/api") + .start { print($0) } + ``` + + - parameter sessionAccessToken: Session info access token retrieved from Facebook + - parameter profile: The user profile returned by Facebook + - parameter scope: Requested scope value when authenticating the user. By default is `openid profile offline_access` + - parameter audience: API Identifier that the client is requesting access to + + - returns: a request that will yield Auth0 user's credentials + */ + func login(facebookSessionAccessToken sessionAccessToken: String, profile: [String: Any], scope: String? = "openid profile offline_access", audience: String? = nil) -> Request { + return self.login(facebookSessionAccessToken: sessionAccessToken, profile: profile, scope: scope, audience: audience) + } + + /** + Login using username and password in the default directory + + ``` + Auth0 + .authentication(clientId: clientId, domain: "samples.auth0.com") + .loginDefaultDirectory( + withUsername: "support@auth0.com", + password: "a secret password") + ``` + + You can also specify audience and scope + + ``` + Auth0 + .authentication(clientId: clientId, domain: "samples.auth0.com") + .loginDefaultDirectory( + withUsername: "support@auth0.com", + password: "a secret password", + audience: "https://myapi.com/api", + scope: "openid profile") + ``` + + - parameter username: username or email used of the user to authenticate + - parameter password: password of the user + - parameter audience: API Identifier that the client is requesting access to. + - parameter scope: scope value requested when authenticating the user. + - parameter parameters: additional parameters that are optionally sent with the authentication request + + - important: This only works if you have the OAuth 2.0 API Authorization flag on + - returns: authentication request that will yield Auth0 User Credentials + */ + func loginDefaultDirectory(withUsername username: String, password: String, audience: String? = nil, scope: String? = nil, parameters: [String: Any]? = nil) -> Request { + return self.loginDefaultDirectory(withUsername: username, password: password, audience: audience, scope: scope, parameters: parameters) + } + + /** + Creates a user in a Database connection + + ``` + Auth0 + .authentication(clientId: clientId, domain: "samples.auth0.com") + .createUser(email: "support@auth0.com", password: "a secret password", connection: "Username-Password-Authentication") + .start { print($0) } + ``` + + you can also add additional attributes when creating the user + + ``` + Auth0 + .authentication(clientId: clientId, domain: "samples.auth0.com") + .createUser(email: "support@auth0.com", password: "a secret password", connection: "Username-Password-Authentication", userMetadata: ["first_name": "support"]) + .start { print($0) } + ``` + + and if the database connection requires a username + + ``` + Auth0 + .authentication(clientId, domain: "samples.auth0.com") + .createUser(email: "support@auth0.com", username: "support", password: "a secret password", connection: "Username-Password-Authentication") + .start { print($0) } + ``` + + - parameter email: email of the user to create + - parameter username: username of the user if the connection requires username. By default is 'nil' + - parameter password: password for the new user + - parameter connection: name where the user will be created (Database connection) + - parameter userMetadata: additional userMetadata parameters that will be added to the newly created user. + - parameter rootAttributes: root attributes that will be added to the newly created user. See https://auth0.com/docs/api/authentication#signup for supported attributes. Will not overwrite existing parameters. + + - returns: request that will yield a created database user (just email, username and email verified flag) + */ + func createUser(email: String, username: String? = nil, password: String, connection: String, userMetadata: [String: Any]? = nil, rootAttributes: [String: Any]? = nil) -> Request { + return self.createUser(email: email, username: username, password: password, connection: connection, userMetadata: userMetadata, rootAttributes: rootAttributes) + } + + /** + Creates a user in a Database connection + + - parameter email: email of the user to create + - parameter username: username of the user if the connection requires username. By default is 'nil' + - parameter password: password for the new user + - parameter connection: name where the user will be created (Database connection) + - parameter userMetadata: additional userMetadata parameters that will be added to the newly created user. + + - returns: request that will yield a created database user (just email, username and email verified flag) + */ + func createUser(email: String, username: String? = nil, password: String, connection: String, userMetadata: [String: Any]? = nil) -> Request { + return self.createUser(email: email, username: username, password: password, connection: connection, userMetadata: userMetadata, rootAttributes: nil) + } + + /** + Creates a database user and then authenticates the user against Auth0. + + ``` + Auth0 + .authentication(clientId: clientId, domain: "samples.auth0.com") + .signUp(email: "support@auth0.com", password: "a secret password", connection: "Username-Password-Authentication") + .start { print($0) } + ``` + + you can also add additional attributes when creating the user + + ``` + Auth0 + .authentication(clientId: clientId, domain: "samples.auth0.com") + .signUp(email: "support@auth0.com", password: "a secret password", connection: "Username-Password-Authentication", userMetadata: ["first_name": "support"]) + .start { print($0) } + ``` + + and if the database connection requires a username + + ``` + Auth0 + .authentication(clientId: clientId, domain: "samples.auth0.com") + .signUp(email: "support@auth0.com", username: "support", password: "a secret password", connection: "Username-Password-Authentication") + .start { print($0) } + ``` + + or specifying the scope and parameters used for authentication + + ``` + Auth0 + .authentication(clientId: clientId, domain: "samples.auth0.com") + .signUp(email: "support@auth0.com", password: "a secret password", connection: "Username-Password-Authentication", scope: "openid email", parameters: ["state": "a random state"]) + .start { print($0) } + ``` + + - parameter email: email of the new user + - parameter username: username of the user if connections requires username. By default is 'nil' + - parameter password: password for the new user + - parameter connection: name of the Database connection where the user will be created + - parameter userMetadata: additional userMetadata values added when creating the user + - parameter scope: requested scope value when authenticating the user. By default is 'openid' + - parameter parameters: additional parameters sent during authentication + + - returns: an authentication request that will yield Auth0 user credentials after creating the user. + - requires: Legacy Grant `http://auth0.com/oauth/legacy/grant-type/ro`. Check [our documentation](https://auth0.com/docs/clients/client-grant-types) for more info and how to enable it. + */ + func signUp(email: String, username: String? = nil, password: String, connection: String, userMetadata: [String: Any]? = nil, scope: String = "openid", parameters: [String: Any] = [:]) -> ConcatRequest { + return self.signUp(email: email, username: username, password: password, connection: connection, userMetadata: userMetadata, scope: scope, parameters: parameters) + } + + /** + Starts passwordless authentication by sending an email with a OTP code + + ``` + Auth0 + .authentication(clientId: clientId, domain: "samples.auth0.com") + .startPasswordless(email: "support@auth0.com") + .start { print($0) } + ``` + + or if you have configured iOS Universal Links + + ``` + Auth0 + .authentication(clientId: clientId, domain: "samples.auth0.com") + .startPasswordless(email: "support@auth0.com", type: .iOSLink) + .start { print($0) } + ``` + + - parameter email: email where to send the code or link + - parameter type: type of passwordless authentication/ By default is code + - parameter connection: name of the passwordless connection. By default is 'email' + - parameter parameters: additional authentication parameters added for Web link. Ignored in other types + + - returns: a request + */ + func startPasswordless(email: String, type: PasswordlessType = .Code, connection: String = "email", parameters: [String: Any] = [:]) -> Request { + return self.startPasswordless(email: email, type: type, connection: connection, parameters: parameters) + } + + /** + Starts passwordless authentication by sending an sms with an OTP code + + ``` + Auth0 + .authentication(clientId: clientId, domain: "samples.auth0.com") + .startPasswordless(phoneNumber: "support@auth0.com") + .start { print($0) } + ``` + + or if you have configured iOS Universal Links + + ``` + Auth0 + .authentication(clientId: clientId, domain: "samples.auth0.com") + .startPasswordless(phoneNumber: "support@auth0.com", type: .iOSLink) + .start { print($0) } + ``` + - parameter phoneNumber: phone number where to send the sms with code or link + - parameter type: type of passwordless authentication. By default is code + - parameter connection: name of the passwordless connection. By default is 'sms' + + - returns: a request + */ + func startPasswordless(phoneNumber: String, type: PasswordlessType = .Code, connection: String = "sms") -> Request { + return self.startPasswordless(phoneNumber: phoneNumber, type: type, connection: connection) + } + + /** + Logs in a user using a social Identity Provider token. e.g. Facebook + + ``` + Auth0 + .authentication(clientId: clientId, domain: "samples.auth0.com") + .loginSocial(token: fbToken, connection: "facebook") + .start { print($0) } + ``` + + and if you need to specify a scope or add additional parameters + + ``` + Auth0 + .authentication(clientId: clientId, domain: "samples.auth0.com") + .loginSocial(token: fbToken, connection: "facebook", scope: "openid email", parameters: ["state": "a random state"]) + .start { print($0) } + ``` + + - parameter token: token obtained from a social IdP + - parameter connection: name of the social connection. Only works with 'google-oauth2', 'facebook' and 'twitter' + - parameter scope: requested scope value when authenticating the user. By default is 'openid' + - parameter parameters: additional parameters sent during authentication + + - returns: a request that will yield Auth0 user's credentials + - requires: Legacy Grant `http://auth0.com/oauth/legacy/grant-type/access_token`. Check [our documentation](https://auth0.com/docs/clients/client-grant-types) for more info and how to enable it. + */ + func loginSocial(token: String, connection: String, scope: String = "openid", parameters: [String: Any] = [:]) -> Request { + return self.loginSocial(token: token, connection: connection, scope: scope, parameters: parameters) + } + + /** + Renew user's credentials with a refresh_token grant for `/oauth/token` + + ``` + Auth0 + .renew(withRefreshToken: refreshToken, scope: "openid email read:users") + .start { print($0) } + ``` + + or asking the same scopes requested when the refresh token was issued + + ``` + Auth0 + .renew(withRefreshToken: refreshToken) + .start { print($0) } + ``` + + - precondition: if you are not using OAuth 2.0 API Authorization please use `delegation(parameters:)` + + - parameter refreshToken: the client's refresh token + - parameter scope: scopes to request for the new tokens. By default is nil which will ask for the same ones requested during Auth. + - important: This method only works for a refresh token obtained after auth with OAuth 2.0 API Authorization. + - returns: a request that will yield Auth0 user's credentials + */ + func renew(withRefreshToken refreshToken: String, scope: String? = nil) -> Request { + return self.renew(withRefreshToken: refreshToken, scope: scope) + } + + /** + Authenticate a user with their Sign In With Apple authorization code. + + ``` + Auth0 + .authentication(clientId: clientId, domain: "samples.auth0.com") + .tokenExchange(withAppleAuthorizationCode: authCode) + .start { print($0) } + ``` + + and if you need to specify a scope or add additional parameters + + ``` + Auth0 + .authentication(clientId: clientId, domain: "samples.auth0.com") + .tokenExchange(withAppleAuthorizationCode: authCode, + scope: "openid profile email", + audience: "https://myapi.com/api", + fullName: credentials.fullName) + .start { print($0) } + ``` + + - parameter authCode: Authorization Code retrieved from Apple Authorization + - parameter scope: Requested scope value when authenticating the user. By default is `openid profile offline_access` + - parameter audience: API Identifier that the client is requesting access to + - parameter fullName: The full name property returned with the Apple ID Credentials + + - returns: a request that will yield Auth0 user's credentials + */ + func tokenExchange(withAppleAuthorizationCode authCode: String, scope: String? = "openid profile offline_access", audience: String? = nil, fullName: PersonNameComponents? = nil) -> Request { + return self.tokenExchange(withAppleAuthorizationCode: authCode, scope: scope, audience: audience, fullName: fullName) + } + +} diff --git a/TracMobility/Pods/Auth0/Auth0/AuthenticationError.swift b/TracMobility/Pods/Auth0/Auth0/AuthenticationError.swift new file mode 100644 index 0000000..92f437b --- /dev/null +++ b/TracMobility/Pods/Auth0/Auth0/AuthenticationError.swift @@ -0,0 +1,171 @@ +// AuthenticationError.swift +// +// Copyright (c) 2016 Auth0 (http://auth0.com) +// +// 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 + +/** + * Represents an error during a request to Auth0 Authentication API + */ +public class AuthenticationError: Auth0Error, CustomStringConvertible { + + /** + Additional information about the error + - seeAlso: `code` & `description` properties + */ + public let info: [String: Any] + + /// Http Status Code of the response + public let statusCode: Int + + /** + Creates a Auth0 Auth API error when the request's response is not JSON + + - parameter string: string representation of the response (or nil) + - parameter statusCode: response status code + + - returns: a newly created AuthenticationError + */ + public required init(string: String? = nil, statusCode: Int = 0) { + self.info = [ + "code": string != nil ? nonJSONError : emptyBodyError, + "description": string ?? "Empty response body", + "statusCode": statusCode + ] + self.statusCode = statusCode + } + + /** + Creates a Auth0 Auth API error from a JSON response + + - parameter info: JSON response from Auth0 + - parameter statusCode: Http Status Code of the Response + + - returns: a newly created AuthenticationError + */ + public required init(info: [String: Any], statusCode: Int) { + self.statusCode = statusCode + self.info = info + } + + /** + Auth0 error code if the server returned one or an internal library code (e.g.: when the server could not be reached) + */ + public var code: String { + let code = self.info["error"] ?? self.info["code"] + return code as? String ?? unknownError + } + + /** + Description of the error + - important: You should avoid displaying description to the user, it's meant for debugging only. + */ + public var description: String { + let description = self.info["description"] ?? self.info["error_description"] + if let string = description as? String { + return string + } + + guard self.code == unknownError else { return "Received error with code \(self.code)" } + + return "Failed with unknown error \(self.info)" + } + + /// When MFA code is required to authenticate + public var isMultifactorRequired: Bool { + return self.code == "a0.mfa_required" || self.code == "mfa_required" + } + + /// When MFA is required and the user is not enrolled + public var isMultifactorEnrollRequired: Bool { + return self.code == "a0.mfa_registration_required" || self.code == "unsupported_challenge_type" + } + + /// When MFA code sent is invalid or expired + public var isMultifactorCodeInvalid: Bool { + return self.code == "a0.mfa_invalid_code" || self.code == "invalid_grant" && self.description == "Invalid otp_code." + } + + /// When MFA code sent is invalid or expired + public var isMultifactorTokenInvalid: Bool { + return self.code == "expired_token" && self.description == "mfa_token is expired" || self.code == "invalid_grant" && self.description == "Malformed mfa_token" + } + + /// When password used for SignUp does not match connection's strength requirements. More info will be available in `info` + public var isPasswordNotStrongEnough: Bool { + return self.code == "invalid_password" && self.value("name") == "PasswordStrengthError" + } + + /// When password used for SignUp was already used before (Reported when password history feature is enabled). More info will be available in `info` + public var isPasswordAlreadyUsed: Bool { + return self.code == "invalid_password" && self.value("name") == "PasswordHistoryError" + } + + /// When Auth0 rule returns an error. The message returned by the rull will be in `description` + public var isRuleError: Bool { + return self.code == "unauthorized" + } + + /// When username and/or password used for authentication are invalid + public var isInvalidCredentials: Bool { + return self.code == "invalid_user_password" + || self.code == "invalid_grant" && self.description == "Wrong email or password." + || self.code == "invalid_grant" && self.description == "Wrong email or verification code." + || self.code == "invalid_grant" && self.description == "Wrong phone number or verification code." + } + + /// When authenticating with web-based authentication and the resource server denied access per OAuth2 spec + public var isAccessDenied: Bool { + return self.code == "access_denied" + } + + /// When you reached the maximum amount of request for the API + public var isTooManyAttempts: Bool { + return self.code == "too_many_attempts" + } + + /// When an additional verification step is required + public var isVerificationRequired: Bool { + return self.code == "requires_verification" + } + + /** + Returns a value from error `info` dictionary + + - parameter key: key of the value to return + + - returns: the value of key or nil if cannot be found or is of the wrong type. + */ + public func value(_ key: String) -> T? { return self.info[key] as? T } +} + +extension AuthenticationError: CustomNSError { + + public static let infoKey = "com.auth0.authentication.error.info" + public static var errorDomain: String { return "com.auth0.authentication" } + public var errorCode: Int { return 1 } + public var errorUserInfo: [String: Any] { + return [ + NSLocalizedDescriptionKey: self.description, + AuthenticationError.infoKey: self + ] + } +} diff --git a/TracMobility/Pods/Auth0/Auth0/AuthenticationServicesSession.swift b/TracMobility/Pods/Auth0/Auth0/AuthenticationServicesSession.swift new file mode 100644 index 0000000..53cb6ba --- /dev/null +++ b/TracMobility/Pods/Auth0/Auth0/AuthenticationServicesSession.swift @@ -0,0 +1,71 @@ +// AuthenticationServicesSession.swift +// +// Copyright (c) 2020 Auth0 (http://auth0.com) +// +// 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 WEB_AUTH_PLATFORM && canImport(AuthenticationServices) +import AuthenticationServices + +@available(iOS 12.0, macOS 10.15, *) +final class AuthenticationServicesSession: SessionTransaction { + + init(authorizeURL: URL, + redirectURL: URL, + state: String? = nil, + handler: OAuth2Grant, + logger: Logger?, + ephemeralSession: Bool, + callback: @escaping FinishTransaction) { + super.init(redirectURL: redirectURL, + state: state, + handler: handler, + logger: logger, + callback: callback) + + let authSession = ASWebAuthenticationSession(url: authorizeURL, + callbackURLScheme: self.redirectURL.scheme) { [weak self] in + guard $1 == nil, let callbackURL = $0 else { + let authError = $1 ?? WebAuthError.unknownError + if case ASWebAuthenticationSessionError.canceledLogin = authError { + self?.callback(.failure(error: WebAuthError.userCancelled)) + } else { + self?.callback(.failure(error: authError)) + } + return TransactionStore.shared.clear() + } + _ = TransactionStore.shared.resume(callbackURL) + } + + #if swift(>=5.1) + if #available(iOS 13.0, *) { + authSession.presentationContextProvider = self + authSession.prefersEphemeralWebBrowserSession = ephemeralSession + } + #endif + + self.authSession = authSession + authSession.start() + } + +} + +@available(iOS 12.0, macOS 10.15, *) +extension ASWebAuthenticationSession: AuthSession {} +#endif diff --git a/TracMobility/Pods/Auth0/Auth0/AuthenticationServicesSessionCallback.swift b/TracMobility/Pods/Auth0/Auth0/AuthenticationServicesSessionCallback.swift new file mode 100644 index 0000000..da92e3c --- /dev/null +++ b/TracMobility/Pods/Auth0/Auth0/AuthenticationServicesSessionCallback.swift @@ -0,0 +1,49 @@ +// AuthenticationServicesSessionCallback.swift +// +// Copyright (c) 2020 Auth0 (http://auth0.com) +// +// 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 WEB_AUTH_PLATFORM && canImport(AuthenticationServices) +import AuthenticationServices + +@available(iOS 12.0, macOS 10.15, *) +final class AuthenticationServicesSessionCallback: SessionCallbackTransaction { + + init(url: URL, schemeURL: URL, callback: @escaping (Bool) -> Void) { + super.init(callback: callback) + + let authSession = ASWebAuthenticationSession(url: url, + callbackURLScheme: schemeURL.scheme) { [weak self] url, _ in + self?.callback(url != nil) + TransactionStore.shared.clear() + } + + #if swift(>=5.1) + if #available(iOS 13.0, *) { + authSession.presentationContextProvider = self + } + #endif + + self.authSession = authSession + authSession.start() + } + +} +#endif diff --git a/TracMobility/Pods/Auth0/Auth0/BaseAuthTransaction.swift b/TracMobility/Pods/Auth0/Auth0/BaseAuthTransaction.swift new file mode 100644 index 0000000..a69334b --- /dev/null +++ b/TracMobility/Pods/Auth0/Auth0/BaseAuthTransaction.swift @@ -0,0 +1,75 @@ +// BaseAuthTransaction.swift +// +// Copyright (c) 2020 Auth0 (http://auth0.com) +// +// 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 WEB_AUTH_PLATFORM +import Foundation + +class BaseAuthTransaction: NSObject, AuthTransaction { + + typealias FinishTransaction = (Result) -> Void + + let redirectURL: URL + let state: String? + let handler: OAuth2Grant + let logger: Logger? + let callback: FinishTransaction + + init(redirectURL: URL, + state: String? = nil, + handler: OAuth2Grant, + logger: Logger?, + callback: @escaping FinishTransaction) { + self.redirectURL = redirectURL + self.state = state + self.handler = handler + self.logger = logger + self.callback = callback + super.init() + } + + func cancel() { + self.callback(Result.failure(error: WebAuthError.userCancelled)) + } + + func handleUrl(_ url: URL) -> Bool { + self.logger?.trace(url: url, source: "iOS Safari") + guard url.absoluteString.lowercased().hasPrefix(self.redirectURL.absoluteString.lowercased()) else { return false } + guard let components = URLComponents(url: url, resolvingAgainstBaseURL: true) else { + self.callback(.failure(error: AuthenticationError(string: url.absoluteString, statusCode: 200))) + return false + } + let items = self.handler.values(fromComponents: components) + guard has(state: self.state, inItems: items) else { return false } + if items["error"] != nil { + self.callback(.failure(error: AuthenticationError(info: items, statusCode: 0))) + } else { + self.handler.credentials(from: items, callback: self.callback) + } + return true + } + + private func has(state: String?, inItems items: [String: String]) -> Bool { + return state == nil || items["state"] == state + } + +} +#endif diff --git a/TracMobility/Pods/Auth0/Auth0/BaseWebAuth.swift b/TracMobility/Pods/Auth0/Auth0/BaseWebAuth.swift new file mode 100644 index 0000000..2b733c6 --- /dev/null +++ b/TracMobility/Pods/Auth0/Auth0/BaseWebAuth.swift @@ -0,0 +1,294 @@ +// BaseWebAuth.swift +// +// Copyright (c) 2016 Auth0 (http://auth0.com) +// +// 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 WEB_AUTH_PLATFORM +#if canImport(AuthenticationServices) +import AuthenticationServices +#endif + +class BaseWebAuth: WebAuthenticatable { + + let clientId: String + let url: URL + let storage: TransactionStore + var telemetry: Telemetry + var logger: Logger? + var universalLink = false + var ephemeralSession = false + + private let platform: String + private(set) var parameters: [String: String] = [:] + private(set) var issuer: String + private(set) var leeway: Int = 60 * 1000 // Default leeway is 60 seconds + private var responseType: [ResponseType] = [.code] + private var nonce: String? + private var maxAge: Int? + + lazy var redirectURL: URL? = { + guard let bundleIdentifier = Bundle.main.bundleIdentifier else { return nil } + var components = URLComponents(url: self.url, resolvingAgainstBaseURL: true) + components?.scheme = self.universalLink ? "https" : bundleIdentifier + return components?.url? + .appendingPathComponent(self.platform) + .appendingPathComponent(bundleIdentifier) + .appendingPathComponent("callback") + }() + + init(platform: String, clientId: String, url: URL, storage: TransactionStore, telemetry: Telemetry) { + self.platform = platform + self.clientId = clientId + self.url = url + self.storage = storage + self.telemetry = telemetry + self.issuer = "\(url.absoluteString)/" + } + + func useUniversalLink() -> Self { + self.universalLink = true + return self + } + + func connection(_ connection: String) -> Self { + self.parameters["connection"] = connection + return self + } + + func scope(_ scope: String) -> Self { + self.parameters["scope"] = scope + return self + } + + func connectionScope(_ connectionScope: String) -> Self { + self.parameters["connection_scope"] = connectionScope + return self + } + + func state(_ state: String) -> Self { + self.parameters["state"] = state + return self + } + + func parameters(_ parameters: [String: String]) -> Self { + parameters.forEach { self.parameters[$0] = $1 } + return self + } + + func responseType(_ responseType: [ResponseType]) -> Self { + self.responseType = responseType + return self + } + + func redirectURL(_ redirectURL: URL) -> Self { + self.redirectURL = redirectURL + return self + } + + func nonce(_ nonce: String) -> Self { + self.nonce = nonce + return self + } + + func usingImplicitGrant() -> Self { + return self.responseType([.token]) + } + + func audience(_ audience: String) -> Self { + self.parameters["audience"] = audience + return self + } + + func issuer(_ issuer: String) -> Self { + self.issuer = issuer + return self + } + + func leeway(_ leeway: Int) -> Self { + self.leeway = leeway + return self + } + + func maxAge(_ maxAge: Int) -> Self { + self.maxAge = maxAge + return self + } + + #if swift(>=5.1) + func useEphemeralSession() -> Self { + self.ephemeralSession = true + return self + } + #endif + + func start(_ callback: @escaping (Result) -> Void) { + guard let redirectURL = self.redirectURL else { + return callback(Result.failure(error: WebAuthError.noBundleIdentifierFound)) + } + if self.responseType.contains(.idToken) { + guard self.nonce != nil else { return callback(Result.failure(error: WebAuthError.noNonceProvided)) } + } + let handler = self.handler(redirectURL) + let state = self.parameters["state"] ?? generateDefaultState() + let authorizeURL = self.buildAuthorizeURL(withRedirectURL: redirectURL, + defaults: handler.defaults, + state: state) + + // performLogin must handle the callback + if let session = performLogin(authorizeURL: authorizeURL, + redirectURL: redirectURL, + state: state, + handler: handler, + callback: callback) { + logger?.trace(url: authorizeURL, source: String(describing: session.self)) + self.storage.store(session) + } + } + + func performLogin(authorizeURL: URL, + redirectURL: URL, + state: String?, + handler: OAuth2Grant, + callback: @escaping (Result) -> Void) -> AuthTransaction? { + #if canImport(AuthenticationServices) + if #available(iOS 12.0, macOS 10.15, *) { + return AuthenticationServicesSession(authorizeURL: authorizeURL, + redirectURL: redirectURL, + state: state, + handler: handler, + logger: self.logger, + ephemeralSession: self.ephemeralSession, + callback: callback) + } + #endif + // TODO: On the next major add a new case to WebAuthError + callback(.failure(error: WebAuthError.unknownError)) + return nil + } + + func clearSession(federated: Bool, callback: @escaping (Bool) -> Void) { + let endpoint = federated ? + URL(string: "/v2/logout?federated", relativeTo: self.url)! : + URL(string: "/v2/logout", relativeTo: self.url)! + + let returnTo = URLQueryItem(name: "returnTo", value: self.redirectURL?.absoluteString) + let clientId = URLQueryItem(name: "client_id", value: self.clientId) + var components = URLComponents(url: endpoint, resolvingAgainstBaseURL: true) + let queryItems = components?.queryItems ?? [] + components?.queryItems = queryItems + [returnTo, clientId] + + guard let logoutURL = components?.url, let redirectURL = self.redirectURL else { + return callback(false) + } + + // performLogout must handle the callback + if let session = performLogout(logoutURL: logoutURL, + redirectURL: redirectURL, + federated: federated, + callback: callback) { + self.storage.store(session) + } + } + + func performLogout(logoutURL: URL, + redirectURL: URL, + federated: Bool, + callback: @escaping (Bool) -> Void) -> AuthTransaction? { + #if canImport(AuthenticationServices) + if #available(iOS 12.0, macOS 10.15, *) { + return AuthenticationServicesSessionCallback(url: logoutURL, + schemeURL: redirectURL, + callback: callback) + } + #endif + callback(false) + return nil + } + + func buildAuthorizeURL(withRedirectURL redirectURL: URL, defaults: [String: String], state: String?) -> URL { + let authorize = URL(string: "/authorize", relativeTo: self.url)! + var components = URLComponents(url: authorize, resolvingAgainstBaseURL: true)! + var items: [URLQueryItem] = [] + var entries = defaults + entries["client_id"] = self.clientId + entries["redirect_uri"] = redirectURL.absoluteString + entries["scope"] = "openid" + entries["state"] = state + entries["response_type"] = self.responseType.map { $0.label! }.joined(separator: " ") + if self.responseType.contains(.idToken) { + entries["nonce"] = self.nonce + if let maxAge = self.maxAge { + entries["max_age"] = String(maxAge) + } + } + + self.parameters.forEach { entries[$0] = $1 } + + entries.forEach { items.append(URLQueryItem(name: $0, value: $1)) } + components.queryItems = self.telemetry.queryItemsWithTelemetry(queryItems: items) + components.percentEncodedQuery = components.percentEncodedQuery?.replacingOccurrences(of: "+", with: "%2B") + return components.url! + } + + private func handler(_ redirectURL: URL) -> OAuth2Grant { + var authentication = Auth0Authentication(clientId: self.clientId, url: self.url, telemetry: self.telemetry) + if self.responseType.contains([.code]) { // both Hybrid and Code flow + authentication.logger = self.logger + return PKCE(authentication: authentication, + redirectURL: redirectURL, + responseType: self.responseType, + issuer: self.issuer, + leeway: self.leeway, + maxAge: self.maxAge, + nonce: self.nonce) + } + return ImplicitGrant(authentication: authentication, + responseType: self.responseType, + issuer: self.issuer, + leeway: self.leeway, + maxAge: self.maxAge, + nonce: self.nonce) + } + + func generateDefaultState() -> String? { + let data = Data(count: 32) + var tempData = data + + let result = tempData.withUnsafeMutableBytes { + SecRandomCopyBytes(kSecRandomDefault, data.count, $0.baseAddress!) + } + + guard result == 0 else { return nil } + return tempData.a0_encodeBase64URLSafe() + } + +} + +extension Auth0Authentication { + + func webAuth(withConnection connection: String) -> WebAuth { + let webAuth = Auth0WebAuth(clientId: self.clientId, url: self.url, telemetry: self.telemetry) + return webAuth + .logging(enabled: self.logger != nil) + .connection(connection) + } + +} +#endif diff --git a/TracMobility/Pods/Auth0/Auth0/BioAuthentication.swift b/TracMobility/Pods/Auth0/Auth0/BioAuthentication.swift new file mode 100644 index 0000000..9769ea7 --- /dev/null +++ b/TracMobility/Pods/Auth0/Auth0/BioAuthentication.swift @@ -0,0 +1,64 @@ +// BioAuthentication.swift +// +// Copyright (c) 2017 Auth0 (http://auth0.com) +// +// 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 WEB_AUTH_PLATFORM +import Foundation +import LocalAuthentication + +struct BioAuthentication { + + private let authContext: LAContext + + let title: String + var fallbackTitle: String? { + get { return self.authContext.localizedFallbackTitle } + set { self.authContext.localizedFallbackTitle = newValue } + } + + @available(iOS 10.0, macOS 10.15, *) + var cancelTitle: String? { + get { return self.authContext.localizedCancelTitle } + set { self.authContext.localizedCancelTitle = newValue } + } + + @available(iOS 9.0, macOS 10.15, *) + var available: Bool { + return self.authContext.canEvaluatePolicy(LAPolicy.deviceOwnerAuthenticationWithBiometrics, error: nil) + } + + init(authContext: LAContext, title: String, cancelTitle: String? = nil, fallbackTitle: String? = nil) { + self.authContext = authContext + self.title = title + if #available(iOS 10.0, macOS 10.15, *) { self.cancelTitle = cancelTitle } + self.fallbackTitle = fallbackTitle + } + + @available(iOS 9.0, macOS 10.15, *) + func validateBiometric(callback: @escaping (Error?) -> Void) { + self.authContext.evaluatePolicy(LAPolicy.deviceOwnerAuthenticationWithBiometrics, localizedReason: self.title) { + guard $1 == nil else { return callback($1) } + callback($0 ? nil : LAError(LAError.authenticationFailed)) + } + } + +} +#endif diff --git a/TracMobility/Pods/Auth0/Auth0/ClaimValidators.swift b/TracMobility/Pods/Auth0/Auth0/ClaimValidators.swift new file mode 100644 index 0000000..509c7e5 --- /dev/null +++ b/TracMobility/Pods/Auth0/Auth0/ClaimValidators.swift @@ -0,0 +1,272 @@ +// ClaimValidators.swift +// +// Copyright (c) 2020 Auth0 (http://auth0.com) +// +// 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 WEB_AUTH_PLATFORM +import Foundation +import JWTDecode + +protocol IDTokenClaimsValidatorContext { + var issuer: String { get } + var audience: String { get } + var leeway: Int { get } + var nonce: String? { get } + var maxAge: Int? { get } +} + +struct IDTokenClaimsValidator: JWTValidator { + private let validators: [JWTValidator] + + init(validators: [JWTValidator]) { + self.validators = validators + } + + func validate(_ jwt: JWT) -> LocalizedError? { + return validators.first { $0.validate(jwt) != nil }?.validate(jwt) + } +} + +struct IDTokenIssValidator: JWTValidator { + enum ValidationError: LocalizedError { + case missingIss + case mismatchedIss(actual: String, expected: String) + + var errorDescription: String? { + switch self { + case .missingIss: return "Issuer (iss) claim must be a string present in the ID token" + case .mismatchedIss(let actual, let expected): + return "Issuer (iss) claim mismatch in the ID token, expected (\(expected)), found (\(actual))" + } + } + } + + private let expectedIss: String + + init(issuer: String) { + self.expectedIss = issuer + } + + func validate(_ jwt: JWT) -> LocalizedError? { + guard let actualIss = jwt.issuer else { return ValidationError.missingIss } + guard actualIss == expectedIss else { + return ValidationError.mismatchedIss(actual: actualIss, expected: expectedIss) + } + return nil + } +} + +struct IDTokenSubValidator: JWTValidator { + enum ValidationError: LocalizedError { + case missingSub + + var errorDescription: String? { + switch self { + case .missingSub: return "Subject (sub) claim must be a string present in the ID token" + } + } + } + + func validate(_ jwt: JWT) -> LocalizedError? { + guard let sub = jwt.subject, !sub.isEmpty else { return ValidationError.missingSub } + return nil + } +} + +struct IDTokenAudValidator: JWTValidator { + enum ValidationError: LocalizedError { + case missingAud + case mismatchedAudString(actual: String, expected: String) + case mismatchedAudArray(actual: [String], expected: String) + + var errorDescription: String? { + switch self { + case .missingAud: + return "Audience (aud) claim must be a string or array of strings present in the ID token" + case .mismatchedAudString(let actual, let expected): + return "Audience (aud) claim mismatch in the ID token; expected (\(expected)) but found (\(actual))" + case .mismatchedAudArray(let actual, let expected): + return "Audience (aud) claim mismatch in the ID token; expected (\(expected)) but was not one of (\(actual.joined(separator: ", ")))" + } + } + } + + private let expectedAud: String + + init(audience: String) { + self.expectedAud = audience + } + + func validate(_ jwt: JWT) -> LocalizedError? { + guard let actualAud = jwt.audience, !actualAud.isEmpty else { return ValidationError.missingAud } + guard actualAud.contains(expectedAud) else { + return actualAud.count == 1 ? + ValidationError.mismatchedAudString(actual: actualAud[0], expected: expectedAud) : + ValidationError.mismatchedAudArray(actual: actualAud, expected: expectedAud) + } + return nil + } +} + +struct IDTokenExpValidator: JWTValidator { + enum ValidationError: LocalizedError { + case missingExp + case pastExp(baseTime: Double, expirationTime: Double) + + var errorDescription: String? { + switch self { + case .missingExp: return "Expiration time (exp) claim must be a number present in the ID token" + case .pastExp(let baseTime, let expirationTime): + return "Expiration time (exp) claim error in the ID token; current time (\(baseTime)) is after expiration time (\(expirationTime))" + } + } + } + + private let baseTime: Date + private let leeway: Int + + init(baseTime: Date = Date(), leeway: Int) { + self.baseTime = baseTime + self.leeway = leeway + } + + func validate(_ jwt: JWT) -> LocalizedError? { + guard let exp = jwt.expiresAt else { return ValidationError.missingExp } + let baseTimeEpoch = baseTime.timeIntervalSince1970 + let expEpoch = exp.timeIntervalSince1970 + Double(leeway) + guard expEpoch > baseTimeEpoch else { + return ValidationError.pastExp(baseTime: baseTimeEpoch, expirationTime: expEpoch) + } + return nil + } +} + +struct IDTokenIatValidator: JWTValidator { + enum ValidationError: LocalizedError { + case missingIat + + var errorDescription: String? { + switch self { + case .missingIat: return "Issued At (iat) claim must be a number present in the ID token" + } + } + } + + func validate(_ jwt: JWT) -> LocalizedError? { + guard jwt.issuedAt != nil else { return ValidationError.missingIat } + return nil + } +} + +struct IDTokenNonceValidator: JWTValidator { + enum ValidationError: LocalizedError { + case missingNonce + case mismatchedNonce(actual: String, expected: String) + + var errorDescription: String? { + switch self { + case .missingNonce: return "Nonce (nonce) claim must be a string present in the ID token" + case .mismatchedNonce(let actual, let expected): + return "Nonce (nonce) claim value mismatch in the ID token; expected (\(expected)), found (\(actual))" + } + } + } + + private let expectedNonce: String + + init(nonce: String) { + self.expectedNonce = nonce + } + + func validate(_ jwt: JWT) -> LocalizedError? { + guard let actualNonce = jwt.claim(name: "nonce").string else { return ValidationError.missingNonce } + guard actualNonce == expectedNonce else { + return ValidationError.mismatchedNonce(actual: actualNonce, expected: expectedNonce) + } + return nil + } +} + +struct IDTokenAzpValidator: JWTValidator { + enum ValidationError: LocalizedError { + case missingAzp + case mismatchedAzp(actual: String, expected: String) + + var errorDescription: String? { + switch self { + case .missingAzp: + return "Authorized Party (azp) claim must be a string present in the ID token when Audience (aud) claim has multiple values" + case .mismatchedAzp(let actual, let expected): + return "Authorized Party (azp) claim mismatch in the ID token; expected (\(expected)), found (\(actual))" + } + } + } + + let expectedAzp: String + + init(authorizedParty: String) { + self.expectedAzp = authorizedParty + } + + func validate(_ jwt: JWT) -> LocalizedError? { + guard let actualAzp = jwt.claim(name: "azp").string else { return ValidationError.missingAzp } + guard actualAzp == expectedAzp else { + return ValidationError.mismatchedAzp(actual: actualAzp, expected: expectedAzp) + } + return nil + } +} + +struct IDTokenAuthTimeValidator: JWTValidator { + enum ValidationError: LocalizedError { + case missingAuthTime + case pastLastAuth(baseTime: Double, lastAuthTime: Double) + + var errorDescription: String? { + switch self { + case .missingAuthTime: + return "Authentication Time (auth_time) claim must be a number present in the ID token when Max Age (max_age) is specified" + case .pastLastAuth(let baseTime, let lastAuthTime): + return "Authentication Time (auth_time) claim in the ID token indicates that too much time has passed since the last end-user authentication. Current time (\(baseTime)) is after last auth time (\(lastAuthTime))" + } + } + } + + private let baseTime: Date + private let leeway: Int + private let maxAge: Int + + init(baseTime: Date = Date(), leeway: Int, maxAge: Int) { + self.baseTime = baseTime + self.leeway = leeway + self.maxAge = maxAge + } + + func validate(_ jwt: JWT) -> LocalizedError? { + guard let authTime = jwt.claim(name: "auth_time").date else { return ValidationError.missingAuthTime } + let currentTimeEpoch = baseTime.timeIntervalSince1970 + let authTimeEpoch = authTime.timeIntervalSince1970 + Double(maxAge) + Double(leeway) + guard authTimeEpoch < currentTimeEpoch else { + return ValidationError.pastLastAuth(baseTime: currentTimeEpoch, lastAuthTime: authTimeEpoch) + } + return nil + } +} +#endif diff --git a/TracMobility/Pods/Auth0/Auth0/ControllerModalPresenter.swift b/TracMobility/Pods/Auth0/Auth0/ControllerModalPresenter.swift new file mode 100644 index 0000000..21988c8 --- /dev/null +++ b/TracMobility/Pods/Auth0/Auth0/ControllerModalPresenter.swift @@ -0,0 +1,59 @@ +// ControllerModalPresenter.swift +// +// Copyright (c) 2016 Auth0 (http://auth0.com) +// +// 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(iOS) +import UIKit + +struct ControllerModalPresenter { + + var rootViewController: UIViewController? { + return UIApplication.shared()?.keyWindow?.rootViewController + } + + func present(controller: UIViewController) { + topViewController?.present(controller, animated: true, completion: nil) + } + + var topViewController: UIViewController? { + guard let root = self.rootViewController else { return nil } + return findTopViewController(from: root) + } + + private func findTopViewController(from root: UIViewController) -> UIViewController? { + if let presented = root.presentedViewController { return findTopViewController(from: presented) } + switch root { + case let split as UISplitViewController: + guard let last = split.viewControllers.last else { return split } + return findTopViewController(from: last) + case let navigation as UINavigationController: + guard let top = navigation.topViewController else { return navigation } + return findTopViewController(from: top) + case let tab as UITabBarController: + guard let selected = tab.selectedViewController else { return tab } + return findTopViewController(from: selected) + default: + return root + } + } + +} +#endif diff --git a/TracMobility/Pods/Auth0/Auth0/Credentials.swift b/TracMobility/Pods/Auth0/Auth0/Credentials.swift new file mode 100644 index 0000000..f4d9bd4 --- /dev/null +++ b/TracMobility/Pods/Auth0/Auth0/Credentials.swift @@ -0,0 +1,94 @@ +// Credentials.swift +// +// Copyright (c) 2016 Auth0 (http://auth0.com) +// +// 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 + +/** + User's credentials obtained from Auth0. + What values are available depends on what type of Auth request you perfomed, + so if you used WebAuth (`/authorize` call) the `response_type` and `scope` will determine what tokens you get + */ +@objc(A0Credentials) +public class Credentials: NSObject, JSONObjectPayload, NSSecureCoding { + + /// Token used that allows calling to the requested APIs (audience sent on Auth) + @objc public let accessToken: String? + /// Type of the access token + @objc public let tokenType: String? + /// When the access_token expires + @objc public let expiresIn: Date? + /// If the API allows you to request new access tokens and the scope `offline_access` was included on Auth + @objc public let refreshToken: String? + // Token that details the user identity after authentication + @objc public let idToken: String? + // Granted scopes, only populated when a requested scope or scopes was not granted and Auth is OIDC Conformant + @objc public let scope: String? + + @objc public init(accessToken: String? = nil, tokenType: String? = nil, idToken: String? = nil, refreshToken: String? = nil, expiresIn: Date? = nil, scope: String? = nil) { + self.accessToken = accessToken + self.tokenType = tokenType + self.idToken = idToken + self.refreshToken = refreshToken + self.expiresIn = expiresIn + self.scope = scope + } + + convenience required public init(json: [String: Any]) { + var expiresIn: Date? + switch json["expires_in"] { + case let string as String: + guard let double = Double(string) else { break } + expiresIn = Date(timeIntervalSinceNow: double) + case let int as Int: + expiresIn = Date(timeIntervalSinceNow: Double(int)) + case let double as Double: + expiresIn = Date(timeIntervalSinceNow: double) + default: + expiresIn = nil + } + self.init(accessToken: json["access_token"] as? String, tokenType: json["token_type"] as? String, idToken: json["id_token"] as? String, refreshToken: json["refresh_token"] as? String, expiresIn: expiresIn, scope: json["scope"] as? String) + } + + // MARK: - NSSecureCoding + + convenience required public init?(coder aDecoder: NSCoder) { + let accessToken = aDecoder.decodeObject(forKey: "accessToken") + let tokenType = aDecoder.decodeObject(forKey: "tokenType") + let idToken = aDecoder.decodeObject(forKey: "idToken") + let refreshToken = aDecoder.decodeObject(forKey: "refreshToken") + let expiresIn = aDecoder.decodeObject(forKey: "expiresIn") + let scope = aDecoder.decodeObject(forKey: "scope") + + self.init(accessToken: accessToken as? String, tokenType: tokenType as? String, idToken: idToken as? String, refreshToken: refreshToken as? String, expiresIn: expiresIn as? Date, scope: scope as? String) + } + + public func encode(with aCoder: NSCoder) { + aCoder.encode(self.accessToken, forKey: "accessToken") + aCoder.encode(self.tokenType, forKey: "tokenType") + aCoder.encode(self.idToken, forKey: "idToken") + aCoder.encode(self.refreshToken, forKey: "refreshToken") + aCoder.encode(self.expiresIn, forKey: "expiresIn") + aCoder.encode(self.scope, forKey: "scope") + } + + public static var supportsSecureCoding: Bool = true +} diff --git a/TracMobility/Pods/Auth0/Auth0/CredentialsManager.swift b/TracMobility/Pods/Auth0/Auth0/CredentialsManager.swift new file mode 100644 index 0000000..e607980 --- /dev/null +++ b/TracMobility/Pods/Auth0/Auth0/CredentialsManager.swift @@ -0,0 +1,236 @@ +// CredentialsManager.swift +// +// Copyright (c) 2017 Auth0 (http://auth0.com) +// +// 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 +import SimpleKeychain +import JWTDecode +#if WEB_AUTH_PLATFORM +import LocalAuthentication +#endif + +/// Credentials management utility +public struct CredentialsManager { + + private let storage: A0SimpleKeychain + private let storeKey: String + private let authentication: Authentication + #if WEB_AUTH_PLATFORM + private var bioAuth: BioAuthentication? + #endif + + /// Creates a new CredentialsManager instance + /// + /// - Parameters: + /// - authentication: Auth0 authentication instance + /// - storeKey: Key used to store user credentials in the keychain, defaults to "credentials" + /// - storage: The A0SimpleKeychain instance used to manage credentials storage. Defaults to a standard A0SimpleKeychain instance + public init(authentication: Authentication, storeKey: String = "credentials", storage: A0SimpleKeychain = A0SimpleKeychain()) { + self.storeKey = storeKey + self.authentication = authentication + self.storage = storage + } + + /// Enable Touch ID Authentication for additional security during credentials retrieval. + /// + /// - Parameters: + /// - title: main message to display in TouchID prompt + /// - cancelTitle: cancel message to display in TouchID prompt (iOS 10+) + /// - fallbackTitle: fallback message to display in TouchID prompt after a failed match + #if WEB_AUTH_PLATFORM + @available(*, deprecated, message: "see enableBiometrics(withTitle title:, cancelTitle:, fallbackTitle:)") + public mutating func enableTouchAuth(withTitle title: String, cancelTitle: String? = nil, fallbackTitle: String? = nil) { + self.enableBiometrics(withTitle: title, cancelTitle: cancelTitle, fallbackTitle: fallbackTitle) + } + #endif + + /// Enable Biometric Authentication for additional security during credentials retrieval. + /// + /// - Parameters: + /// - title: main message to display when Touch ID is used + /// - cancelTitle: cancel message to display when Touch ID is used (iOS 10+) + /// - fallbackTitle: fallback message to display when Touch ID is used after a failed match + #if WEB_AUTH_PLATFORM + public mutating func enableBiometrics(withTitle title: String, cancelTitle: String? = nil, fallbackTitle: String? = nil) { + self.bioAuth = BioAuthentication(authContext: LAContext(), title: title, cancelTitle: cancelTitle, fallbackTitle: fallbackTitle) + } + #endif + + /// Store credentials instance in keychain + /// + /// - Parameter credentials: credentials instance to store + /// - Returns: if credentials were stored + public func store(credentials: Credentials) -> Bool { + return self.storage.setData(NSKeyedArchiver.archivedData(withRootObject: credentials), forKey: storeKey) + } + + /// Clear credentials stored in keychain + /// + /// - Returns: if credentials were removed + public func clear() -> Bool { + return self.storage.deleteEntry(forKey: storeKey) + } + + /// Calls the revoke token endpoint to revoke the refresh token and, if successful, the credentials are cleared. Otherwise, + /// the credentials are not cleared and an error is raised through the callback. + /// + /// If no refresh token is available the endpoint is not called, the credentials are cleared, and the callback is invoked without an error. + /// + /// - Parameter callback: callback with an error if the refresh token could not be revoked + public func revoke(_ callback: @escaping (CredentialsManagerError?) -> Void) { + guard + let data = self.storage.data(forKey: self.storeKey), + let credentials = NSKeyedUnarchiver.unarchiveObject(with: data) as? Credentials, + let refreshToken = credentials.refreshToken else { + _ = self.clear() + return callback(nil) + } + + self.authentication + .revoke(refreshToken: refreshToken) + .start { result in + switch result { + case .failure(let error): + callback(CredentialsManagerError.revokeFailed(error)) + case .success: + _ = self.clear() + callback(nil) + } + } + } + + /// Checks if a non-expired set of credentials are stored + /// + /// - Parameter minTTL: minimum lifetime in seconds the access token must have left. + /// - Returns: if there are valid and non-expired credentials stored. + public func hasValid(minTTL: Int = 0) -> Bool { + guard let data = self.storage.data(forKey: self.storeKey), + let credentials = NSKeyedUnarchiver.unarchiveObject(with: data) as? Credentials, + credentials.accessToken != nil else { return false } + return (!self.hasExpired(credentials) && !self.willExpire(credentials, within: minTTL)) || credentials.refreshToken != nil + } + + /// Retrieve credentials from keychain and yield new credentials using `refreshToken` if `accessToken` has expired + /// otherwise the retrieved credentails will be returned as they have not expired. Renewed credentials will be + /// stored in the keychain. + /// + /// ``` + /// credentialsManager.credentials { + /// guard $0 == nil else { return } + /// print($1) + /// } + /// ``` + /// + /// - Parameters: + /// - scope: scopes to request for the new tokens. By default is nil which will ask for the same ones requested during original Auth. + /// - minTTL: minimum time in seconds the access token must remain valid to avoid being renewed. + /// - callback: callback with the user's credentials or the cause of the error. + /// - Important: This method only works for a refresh token obtained after auth with OAuth 2.0 API Authorization. + /// - Note: [Auth0 Refresh Tokens Docs](https://auth0.com/docs/tokens/concepts/refresh-tokens) + #if WEB_AUTH_PLATFORM + public func credentials(withScope scope: String? = nil, minTTL: Int = 0, callback: @escaping (CredentialsManagerError?, Credentials?) -> Void) { + guard self.hasValid(minTTL: minTTL) else { return callback(.noCredentials, nil) } + if #available(iOS 9.0, macOS 10.15, *), let bioAuth = self.bioAuth { + guard bioAuth.available else { return callback(.touchFailed(LAError(LAError.touchIDNotAvailable)), nil) } + bioAuth.validateBiometric { + guard $0 == nil else { + return callback(.touchFailed($0!), nil) + } + self.retrieveCredentials(withScope: scope, minTTL: minTTL, callback: callback) + } + } else { + self.retrieveCredentials(withScope: scope, minTTL: minTTL, callback: callback) + } + } + #else + public func credentials(withScope scope: String? = nil, minTTL: Int = 0, callback: @escaping (CredentialsManagerError?, Credentials?) -> Void) { + guard self.hasValid(minTTL: minTTL) else { return callback(.noCredentials, nil) } + self.retrieveCredentials(withScope: scope, minTTL: minTTL, callback: callback) + } + #endif + + private func retrieveCredentials(withScope scope: String?, minTTL: Int, callback: @escaping (CredentialsManagerError?, Credentials?) -> Void) { + guard let data = self.storage.data(forKey: self.storeKey), + let credentials = NSKeyedUnarchiver.unarchiveObject(with: data) as? Credentials else { return callback(.noCredentials, nil) } + guard let expiresIn = credentials.expiresIn else { return callback(.noCredentials, nil) } + guard self.hasExpired(credentials) || + self.willExpire(credentials, within: minTTL) || + self.hasScopeChanged(credentials, from: scope) else { return callback(nil, credentials) } + guard let refreshToken = credentials.refreshToken else { return callback(.noRefreshToken, nil) } + + self.authentication.renew(withRefreshToken: refreshToken, scope: scope).start { + switch $0 { + case .success(let credentials): + let newCredentials = Credentials(accessToken: credentials.accessToken, + tokenType: credentials.tokenType, + idToken: credentials.idToken, + refreshToken: credentials.refreshToken ?? refreshToken, + expiresIn: credentials.expiresIn, + scope: credentials.scope) + if self.willExpire(newCredentials, within: minTTL) { + let accessTokenLifetime = Int(expiresIn.timeIntervalSinceNow) + // TODO: On the next major add a new case to CredentialsManagerError + let error = NSError(domain: "The lifetime of the renewed Access Token (\(accessTokenLifetime)s) is less than minTTL requested (\(minTTL)s). Increase the 'Token Expiration' setting of your Auth0 API in the dashboard or request a lower minTTL", + code: -99999, + userInfo: nil) + callback(.failedRefresh(error), nil) + } else { + _ = self.store(credentials: newCredentials) + callback(nil, newCredentials) + } + case .failure(let error): + callback(.failedRefresh(error), nil) + } + } + } + + func willExpire(_ credentials: Credentials, within ttl: Int) -> Bool { + if let expiresIn = credentials.expiresIn { + return expiresIn < Date(timeIntervalSinceNow: TimeInterval(ttl)) + } + + return false + } + + func hasExpired(_ credentials: Credentials) -> Bool { + if let expiresIn = credentials.expiresIn { + if expiresIn < Date() { return true } + } + + if let token = credentials.idToken, let jwt = try? decode(jwt: token) { + return jwt.expired + } + + return false + } + + func hasScopeChanged(_ credentials: Credentials, from scope: String?) -> Bool { + if let newScope = scope, let lastScope = credentials.scope { + let newScopeList = newScope.lowercased().split(separator: " ").sorted() + let lastScopeList = lastScope.lowercased().split(separator: " ").sorted() + + return newScopeList != lastScopeList + } + + return false + } + +} diff --git a/TracMobility/Pods/Auth0/Auth0/CredentialsManagerError.swift b/TracMobility/Pods/Auth0/Auth0/CredentialsManagerError.swift new file mode 100644 index 0000000..8a78fc3 --- /dev/null +++ b/TracMobility/Pods/Auth0/Auth0/CredentialsManagerError.swift @@ -0,0 +1,31 @@ +// CredentialsManagerError.swift +// +// Copyright (c) 2017 Auth0 (http://auth0.com) +// +// 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 enum CredentialsManagerError: Error { + case noCredentials + case noRefreshToken + case failedRefresh(Error) + case touchFailed(Error) + case revokeFailed(Error) +} diff --git a/TracMobility/Pods/Auth0/Auth0/Date.swift b/TracMobility/Pods/Auth0/Auth0/Date.swift new file mode 100644 index 0000000..c0c7fcd --- /dev/null +++ b/TracMobility/Pods/Auth0/Auth0/Date.swift @@ -0,0 +1,34 @@ +// Date.swift +// +// Copyright (c) 2017 Auth0 (http://auth0.com) +// +// 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 + +func date(from string: String) -> Date? { + guard let interval = Double(string) else { + let formatter = DateFormatter() + formatter.locale = Locale(identifier: "en_US_POSIX") + formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'" + formatter.timeZone = TimeZone(identifier: "UTC") + return formatter.date(from: string) + } + return Date(timeIntervalSince1970: interval) +} diff --git a/TracMobility/Pods/Auth0/Auth0/Handlers.swift b/TracMobility/Pods/Auth0/Auth0/Handlers.swift new file mode 100644 index 0000000..8833a87 --- /dev/null +++ b/TracMobility/Pods/Auth0/Auth0/Handlers.swift @@ -0,0 +1,91 @@ +// Handlers.swift +// +// Copyright (c) 2016 Auth0 (http://auth0.com) +// +// 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 + +func plainJson(from response: Response, callback: Request<[String: Any], AuthenticationError>.Callback) { + do { + if let dictionary = try response.result() as? [String: Any] { + callback(.success(result: dictionary)) + } else { + callback(.failure(error: AuthenticationError(string: string(response.data)))) + } + + } catch let error { + callback(.failure(error: error)) + } +} + +func codable(from response: Response, callback: Request.Callback) { + do { + if let dictionary = try response.result() as? [String: Any] { + let data = try JSONSerialization.data(withJSONObject: dictionary) + let decoder = JSONDecoder() + let decodedObject = try decoder.decode(T.self, from: data) + callback(.success(result: decodedObject)) + } else { + callback(.failure(error: AuthenticationError(string: string(response.data)))) + } + + } catch let error { + callback(.failure(error: error)) + } +} + +func authenticationObject(from response: Response, callback: Request.Callback) { + do { + if let dictionary = try response.result() as? [String: Any], let object = T(json: dictionary) { + callback(.success(result: object)) + } else { + callback(.failure(error: AuthenticationError(string: string(response.data)))) + } + + } catch let error { + callback(.failure(error: error)) + } +} + +func databaseUser(from response: Response, callback: Request.Callback) { + do { + if let dictionary = try response.result() as? [String: Any], let email = dictionary["email"] as? String { + let username = dictionary["username"] as? String + let verified = dictionary["email_verified"] as? Bool ?? false + callback(.success(result: (email: email, username: username, verified: verified))) + } else { + callback(.failure(error: AuthenticationError(string: string(response.data)))) + } + + } catch let error { + callback(.failure(error: error)) + } +} + +func noBody(from response: Response, callback: Request.Callback) { + do { + _ = try response.result() + callback(.success(result: ())) + } catch let error as Auth0Error where error.code == emptyBodyError { + callback(.success(result: ())) + } catch let error { + callback(.failure(error: error)) + } +} diff --git a/TracMobility/Pods/Auth0/Auth0/IDTokenSignatureValidator.swift b/TracMobility/Pods/Auth0/Auth0/IDTokenSignatureValidator.swift new file mode 100644 index 0000000..f02531b --- /dev/null +++ b/TracMobility/Pods/Auth0/Auth0/IDTokenSignatureValidator.swift @@ -0,0 +1,89 @@ +// IDTokenSignatureValidator.swift +// +// Copyright (c) 2020 Auth0 (http://auth0.com) +// +// 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 WEB_AUTH_PLATFORM +import Foundation +import JWTDecode + +protocol IDTokenSignatureValidatorContext { + var issuer: String { get } + var audience: String { get } + var jwksRequest: Request { get } +} + +struct IDTokenSignatureValidator: JWTAsyncValidator { + enum ValidationError: LocalizedError { + case invalidAlgorithm(actual: String, expected: String) + case missingPublicKey(kid: String) + case invalidSignature + + var errorDescription: String? { + switch self { + case .invalidAlgorithm(let actual, let expected): + return "Signature algorithm of \"\(actual)\" is not supported. Expected the ID token to be signed with \"\(expected)\"" + case .missingPublicKey(let kid): return "Could not find a public key for Key ID (kid) \"\(kid)\"" + case .invalidSignature: return "Invalid ID token signature" + } + } + } + + private let context: IDTokenSignatureValidatorContext + + init(context: IDTokenSignatureValidatorContext) { + self.context = context + } + + func validate(_ jwt: JWT, callback: @escaping (LocalizedError?) -> Void) { + if let error = validateAlg(jwt) { return callback(error) } + if let error = validateKid(jwt) { return callback(error) } + let algorithm = jwt.algorithm! + let kid = jwt.kid! + context + .jwksRequest + .start { result in + switch result { + case .success(let jwks): + guard let jwk = jwks.key(id: kid) else { + return callback(ValidationError.missingPublicKey(kid: kid)) + } + algorithm.verify(jwt, using: jwk) ? callback(nil) : callback(ValidationError.invalidSignature) + case .failure: callback(ValidationError.missingPublicKey(kid: kid)) + } + } + } + + private func validateAlg(_ jwt: JWT) -> LocalizedError? { + let defaultAlgorithm = JWTAlgorithm.rs256.rawValue + guard jwt.algorithm != nil else { + let actualAlgorithm = jwt.header["alg"] as? String + return ValidationError.invalidAlgorithm(actual: actualAlgorithm.debugDescription, expected: defaultAlgorithm) + } + return nil + } + + private func validateKid(_ jwt: JWT) -> LocalizedError? { + let kid = jwt.kid + guard kid != nil else { return ValidationError.missingPublicKey(kid: kid.debugDescription) } + return nil + } +} +#endif diff --git a/TracMobility/Pods/Auth0/Auth0/IDTokenValidator.swift b/TracMobility/Pods/Auth0/Auth0/IDTokenValidator.swift new file mode 100644 index 0000000..15cfe58 --- /dev/null +++ b/TracMobility/Pods/Auth0/Auth0/IDTokenValidator.swift @@ -0,0 +1,99 @@ +// IDTokenValidator.swift +// +// Copyright (c) 2019 Auth0 (http://auth0.com) +// +// 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 WEB_AUTH_PLATFORM +import Foundation +import JWTDecode + +protocol JWTValidator { + func validate(_ jwt: JWT) -> LocalizedError? +} + +protocol JWTAsyncValidator { + func validate(_ jwt: JWT, callback: @escaping (LocalizedError?) -> Void) +} + +struct IDTokenValidator: JWTAsyncValidator { + private let signatureValidator: JWTAsyncValidator + private let claimsValidator: JWTValidator + private let context: IDTokenValidatorContext + + init(signatureValidator: JWTAsyncValidator, + claimsValidator: JWTValidator, + context: IDTokenValidatorContext) { + self.signatureValidator = signatureValidator + self.claimsValidator = claimsValidator + self.context = context + } + + func validate(_ jwt: JWT, callback: @escaping (LocalizedError?) -> Void) { + DispatchQueue.global(qos: .userInitiated).async { + self.signatureValidator.validate(jwt) { error in + if let error = error { return callback(error) } + let result = self.claimsValidator.validate(jwt) + DispatchQueue.main.async { + callback(result) + } + } + } + } +} + +enum IDTokenDecodingError: LocalizedError { + case missingToken + case cannotDecode + + var errorDescription: String? { + switch self { + case .missingToken: return "ID token is required but missing" + case .cannotDecode: return "ID token could not be decoded" + } + } +} + +func validate(idToken: String?, + with context: IDTokenValidatorContext, + signatureValidator: JWTAsyncValidator? = nil, // for testing + claimsValidator: JWTValidator? = nil, + callback: @escaping (LocalizedError?) -> Void) { + guard let idToken = idToken else { return callback(IDTokenDecodingError.missingToken) } + guard let jwt = try? decode(jwt: idToken) else { return callback(IDTokenDecodingError.cannotDecode) } + var claimValidators: [JWTValidator] = [IDTokenIssValidator(issuer: context.issuer), + IDTokenSubValidator(), + IDTokenAudValidator(audience: context.audience), + IDTokenExpValidator(leeway: context.leeway), + IDTokenIatValidator()] + if let nonce = context.nonce { + claimValidators.append(IDTokenNonceValidator(nonce: nonce)) + } + if let aud = jwt.audience, aud.count > 1 { + claimValidators.append(IDTokenAzpValidator(authorizedParty: context.audience)) + } + if let maxAge = context.maxAge { + claimValidators.append(IDTokenAuthTimeValidator(leeway: context.leeway, maxAge: maxAge)) + } + let validator = IDTokenValidator(signatureValidator: signatureValidator ?? IDTokenSignatureValidator(context: context), + claimsValidator: claimsValidator ?? IDTokenClaimsValidator(validators: claimValidators), + context: context) + validator.validate(jwt, callback: callback) +} +#endif diff --git a/TracMobility/Pods/Auth0/Auth0/IDTokenValidatorContext.swift b/TracMobility/Pods/Auth0/Auth0/IDTokenValidatorContext.swift new file mode 100644 index 0000000..05a62fe --- /dev/null +++ b/TracMobility/Pods/Auth0/Auth0/IDTokenValidatorContext.swift @@ -0,0 +1,57 @@ +// IDTokenValidatorContext.swift +// +// Copyright (c) 2020 Auth0 (http://auth0.com) +// +// 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 WEB_AUTH_PLATFORM +import Foundation + +struct IDTokenValidatorContext: IDTokenSignatureValidatorContext, IDTokenClaimsValidatorContext { + let issuer: String + let audience: String + let jwksRequest: Request + let nonce: String? + let leeway: Int + let maxAge: Int? + + init(issuer: String, + audience: String, + jwksRequest: Request, + leeway: Int, + maxAge: Int?, + nonce: String?) { + self.issuer = issuer + self.audience = audience + self.jwksRequest = jwksRequest + self.leeway = leeway + self.maxAge = maxAge + self.nonce = nonce + } + + init(authentication: Authentication, issuer: String, leeway: Int, maxAge: Int?, nonce: String?) { + self.init(issuer: issuer, + audience: authentication.clientId, + jwksRequest: authentication.jwks(), + leeway: leeway, + maxAge: maxAge, + nonce: nonce) + } +} +#endif diff --git a/TracMobility/Pods/Auth0/Auth0/Identity.swift b/TracMobility/Pods/Auth0/Auth0/Identity.swift new file mode 100644 index 0000000..3eec7c3 --- /dev/null +++ b/TracMobility/Pods/Auth0/Auth0/Identity.swift @@ -0,0 +1,78 @@ +// Identity.swift +// +// Copyright (c) 2016 Auth0 (http://auth0.com) +// +// 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 + +/** + Auth0 user identity + */ +@objc(A0Identity) +public class Identity: NSObject, JSONObjectPayload { + + @objc public let identifier: String + @objc public let provider: String + @objc public let connection: String + + @objc public let social: Bool + @objc public let profileData: [String: Any] + + @objc public let accessToken: String? + @objc public let expiresIn: Date? + @objc public let accessTokenSecret: String? + + @objc override public var debugDescription: String { + return "" + } + + @objc public required init(identifier: String, provider: String, connection: String, social: Bool, profileData: [String: Any], accessToken: String?, expiresIn: Date?, accessTokenSecret: String?) { + self.identifier = identifier + self.provider = provider + self.connection = connection + self.social = social + self.profileData = profileData + self.accessToken = accessToken + self.expiresIn = expiresIn + self.accessTokenSecret = accessTokenSecret + } + + @objc convenience public required init?(json: [String: Any]) { + + guard + let identifier = json["user_id"] as? String, + let provider = json["provider"] as? String, + let connection = json["connection"] as? String + else { return nil } + + let social = json["isSocial"] as? Bool ?? false + let profileData = json["profileData"] as? [String: Any] ?? [:] + + let accessToken = json["access_token"] as? String + let accessTokenSecret = json["access_token_secret"] as? String + let expiresIn: Date? + if let expiresInSeconds = json["expires_in"] as? TimeInterval { + expiresIn = Date(timeIntervalSince1970: expiresInSeconds) + } else { + expiresIn = nil + } + self.init(identifier: identifier, provider: provider, connection: connection, social: social, profileData: profileData, accessToken: accessToken, expiresIn: expiresIn, accessTokenSecret: accessTokenSecret) + } +} diff --git a/TracMobility/Pods/Auth0/Auth0/JSONObjectPayload.swift b/TracMobility/Pods/Auth0/Auth0/JSONObjectPayload.swift new file mode 100644 index 0000000..a9058e5 --- /dev/null +++ b/TracMobility/Pods/Auth0/Auth0/JSONObjectPayload.swift @@ -0,0 +1,29 @@ +// JSONObjectPayload.swift +// +// Copyright (c) 2016 Auth0 (http://auth0.com) +// +// 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 JSONObjectPayload { + + init?(json: [String: Any]) + +} diff --git a/TracMobility/Pods/Auth0/Auth0/JWK+RSA.swift b/TracMobility/Pods/Auth0/Auth0/JWK+RSA.swift new file mode 100644 index 0000000..57d9989 --- /dev/null +++ b/TracMobility/Pods/Auth0/Auth0/JWK+RSA.swift @@ -0,0 +1,63 @@ +// JWK+RSA.swift +// +// Copyright (c) 2020 Auth0 (http://auth0.com) +// +// 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 WEB_AUTH_PLATFORM +import Foundation +import SimpleKeychain + +extension JWK { + var rsaPublicKey: SecKey? { + if let usage = usage, usage != "sig" { return nil } + guard keyType == "RSA", + algorithm == JWTAlgorithm.rs256.rawValue, + let modulus = rsaModulus?.a0_decodeBase64URLSafe(), + let exponent = rsaExponent?.a0_decodeBase64URLSafe() else { return nil } + let encodedKey = encodeRSAPublicKey(modulus: [UInt8](modulus), exponent: [UInt8](exponent)) + if #available(iOS 10.0, macOS 10.12, *) { + return generateRSAPublicKey(from: encodedKey) + } + let tag = "com.auth0.tmp.RSAPublicKey" + let keychain = A0SimpleKeychain() + guard keychain.setRSAPublicKey(data: encodedKey, forKey: tag) else { return nil } + return keychain.keyRefOfRSAKey(withTag: tag)?.takeRetainedValue() + } + + private func encodeRSAPublicKey(modulus: [UInt8], exponent: [UInt8]) -> Data { + var prefixedModulus: [UInt8] = [0x00] // To indicate that the number is not negative + prefixedModulus.append(contentsOf: modulus) + let encodedModulus = prefixedModulus.a0_derEncode(as: 2) // Integer + let encodedExponent = exponent.a0_derEncode(as: 2) // Integer + let encodedSequence = (encodedModulus + encodedExponent).a0_derEncode(as: 48) // Sequence + return Data(encodedSequence) + } + + @available(iOS 10.0, macOS 10.12, *) + private func generateRSAPublicKey(from derEncodedData: Data) -> SecKey? { + let sizeInBits = derEncodedData.count * MemoryLayout.size + let attributes: [CFString: Any] = [kSecAttrKeyType: kSecAttrKeyTypeRSA, + kSecAttrKeyClass: kSecAttrKeyClassPublic, + kSecAttrKeySizeInBits: NSNumber(value: sizeInBits), + kSecAttrIsPermanent: false] + return SecKeyCreateWithData(derEncodedData as CFData, attributes as CFDictionary, nil) + } +} +#endif diff --git a/TracMobility/Pods/Auth0/Auth0/JWKS.swift b/TracMobility/Pods/Auth0/Auth0/JWKS.swift new file mode 100644 index 0000000..370319e --- /dev/null +++ b/TracMobility/Pods/Auth0/Auth0/JWKS.swift @@ -0,0 +1,57 @@ +// JWKS.swift +// +// Copyright (c) 2019 Auth0 (http://auth0.com) +// +// 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 struct JWKS: Codable { + let keys: [JWK] +} + +public extension JWKS { + func key(id kid: String) -> JWK? { + return keys.first { $0.keyId == kid } + } +} + +public struct JWK: Codable { + let keyType: String + let keyId: String? + let usage: String? + let algorithm: String? + let certUrl: String? + let certThumbprint: String? + let certChain: [String]? + let rsaModulus: String? + let rsaExponent: String? + + enum CodingKeys: String, CodingKey { + case keyType = "kty" + case keyId = "kid" + case usage = "use" + case algorithm = "alg" + case certUrl = "x5u" + case certThumbprint = "x5t" + case certChain = "x5c" + case rsaModulus = "n" + case rsaExponent = "e" + } +} diff --git a/TracMobility/Pods/Auth0/Auth0/JWT+Header.swift b/TracMobility/Pods/Auth0/Auth0/JWT+Header.swift new file mode 100644 index 0000000..2f21b73 --- /dev/null +++ b/TracMobility/Pods/Auth0/Auth0/JWT+Header.swift @@ -0,0 +1,37 @@ +// JWT+Header.swift +// +// Copyright (c) 2020 Auth0 (http://auth0.com) +// +// 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 WEB_AUTH_PLATFORM +import Foundation +import JWTDecode + +extension JWT { + var algorithm: JWTAlgorithm? { + guard let alg = header["alg"] as? String, let algorithm = JWTAlgorithm(rawValue: alg) else { return nil } + return algorithm + } + + var kid: String? { + return header["kid"] as? String + } +} +#endif diff --git a/TracMobility/Pods/Auth0/Auth0/JWTAlgorithm.swift b/TracMobility/Pods/Auth0/Auth0/JWTAlgorithm.swift new file mode 100644 index 0000000..98d2bc0 --- /dev/null +++ b/TracMobility/Pods/Auth0/Auth0/JWTAlgorithm.swift @@ -0,0 +1,49 @@ +// JWTAlgorithm.swift +// +// Copyright (c) 2020 Auth0 (http://auth0.com) +// +// 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 WEB_AUTH_PLATFORM +import Foundation +import JWTDecode +#if SWIFT_PACKAGE +import Auth0ObjectiveC +#endif + +enum JWTAlgorithm: String { + case rs256 = "RS256" + case hs256 = "HS256" + + func verify(_ jwt: JWT, using jwk: JWK) -> Bool { + let separator = "." + let parts = jwt.string.components(separatedBy: separator).dropLast().joined(separator: separator) + guard let data = parts.data(using: .utf8), + let signature = jwt.signature?.a0_decodeBase64URLSafe(), + !signature.isEmpty else { return false } + switch self { + case .rs256: + guard let publicKey = jwk.rsaPublicKey, let rsa = A0RSA(key: publicKey) else { return false } + let sha256 = A0SHA() + return rsa.verify(sha256.hash(data), signature: signature) + case .hs256: return true + } + } +} +#endif diff --git a/TracMobility/Pods/Auth0/Auth0/Loggable.swift b/TracMobility/Pods/Auth0/Auth0/Loggable.swift new file mode 100644 index 0000000..3a620d5 --- /dev/null +++ b/TracMobility/Pods/Auth0/Auth0/Loggable.swift @@ -0,0 +1,62 @@ +// Loggable.swift +// +// Copyright (c) 2016 Auth0 (http://auth0.com) +// +// 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 protocol Loggable { + + var logger: Logger? { get set } + +} + +public extension Loggable { + + /** + Turn on Auth0.swift debug logging of HTTP requests and OAuth2 flow (iOS only) with a custom logger. + + - parameter logger: logger used to print log statements + - note: By default all logging is **disabled** + - important: Logging should be turned on/off **before** making request to Auth0 for the flag to take effect. + */ + func using(logger: Logger) -> Self { + var loggable = self + loggable.logger = logger + return loggable + } + + /** + Turn on/off Auth0.swift debug logging of HTTP requests and OAuth2 flow (iOS only). + + - parameter enabled: optional flag to turn on/off logging + - note: By default all logging is **disabled** + - important: Logging should be turned on/off **before** making request to Auth0 for the flag to take effect. + */ + func logging(enabled: Bool) -> Self { + var loggable = self + if enabled { + loggable.logger = DefaultLogger() + } else { + loggable.logger = nil + } + return loggable + } +} diff --git a/TracMobility/Pods/Auth0/Auth0/Logger.swift b/TracMobility/Pods/Auth0/Auth0/Logger.swift new file mode 100644 index 0000000..310725b --- /dev/null +++ b/TracMobility/Pods/Auth0/Auth0/Logger.swift @@ -0,0 +1,79 @@ +// Logger.swift +// +// Copyright (c) 2016 Auth0 (http://auth0.com) +// +// 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 protocol Logger { + func trace(request: URLRequest, session: URLSession) + func trace(response: URLResponse, data: Data?) + func trace(url: URL, source: String?) +} + +protocol LoggerOutput { + func log(message: String) + func newLine() +} + +struct DefaultOutput: LoggerOutput { + func log(message: String) { print(message) } + func newLine() { print() } +} + +struct DefaultLogger: Logger { + + let output: LoggerOutput + + init(output: LoggerOutput = DefaultOutput()) { + self.output = output + } + + func trace(request: URLRequest, session: URLSession) { + guard + let method = request.httpMethod, + let url = request.url?.absoluteString + else { return } + output.log(message: "\(method) \(url) HTTP/1.1") + session.configuration.httpAdditionalHeaders?.forEach { key, value in output.log(message: "\(key): \(value)") } + request.allHTTPHeaderFields?.forEach { key, value in output.log(message: "\(key): \(value)") } + if let data = request.httpBody, let string = String(data: data, encoding: .utf8) { + output.newLine() + output.log(message: string) + } + output.newLine() + } + + func trace(response: URLResponse, data: Data?) { + if let http = response as? HTTPURLResponse { + output.log(message: "HTTP/1.1 \(http.statusCode)") + http.allHeaderFields.forEach { key, value in output.log(message: "\(key): \(value)") } + if let data = data, let string = String(data: data, encoding: .utf8) { + output.newLine() + output.log(message: string) + } + output.newLine() + } + } + + func trace(url: URL, source: String?) { + output.log(message: "\(source ?? "URL"): \(url.absoluteString)") + } +} diff --git a/TracMobility/Pods/Auth0/Auth0/Management.swift b/TracMobility/Pods/Auth0/Auth0/Management.swift new file mode 100644 index 0000000..839bfad --- /dev/null +++ b/TracMobility/Pods/Auth0/Auth0/Management.swift @@ -0,0 +1,74 @@ +// Management.swift +// +// Copyright (c) 2016 Auth0 (http://auth0.com) +// +// 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 typealias ManagementObject = [String: Any] + +/** + * Auth0 Management API + */ +struct Management: Trackable, Loggable { + let token: String + let url: URL + var telemetry: Telemetry + var logger: Logger? + + let session: URLSession + + init(token: String, url: URL, session: URLSession = .shared, telemetry: Telemetry = Telemetry()) { + self.token = token + self.url = url + self.session = session + self.telemetry = telemetry + } + + func managementObject(response: Response, callback: Request.Callback) { + do { + if let dictionary = try response.result() as? ManagementObject { + callback(.success(result: dictionary)) + } else { + callback(.failure(error: ManagementError(string: string(response.data)))) + } + } catch let error { + callback(.failure(error: error)) + } + } + + func managementObjects(response: Response, callback: Request<[ManagementObject], ManagementError>.Callback) { + do { + if let list = try response.result() as? [ManagementObject] { + callback(.success(result: list)) + } else { + callback(.failure(error: ManagementError(string: string(response.data)))) + } + } catch let error { + callback(.failure(error: error)) + } + } + + var defaultHeaders: [String: String] { + return [ + "Authorization": "Bearer \(token)" + ] + } +} diff --git a/TracMobility/Pods/Auth0/Auth0/ManagementError.swift b/TracMobility/Pods/Auth0/Auth0/ManagementError.swift new file mode 100644 index 0000000..ae54f08 --- /dev/null +++ b/TracMobility/Pods/Auth0/Auth0/ManagementError.swift @@ -0,0 +1,95 @@ +// ManagementError.swift +// +// Copyright (c) 2016 Auth0 (http://auth0.com) +// +// 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 + +/** + * Represents an error during a request to Auth0 Management API + */ +public class ManagementError: Auth0Error, CustomStringConvertible { + + /** + Additional information about the error + - seeAlso: `code` & `description` properties + */ + public let info: [String: Any] + + /** + Creates a Auth0 Management API error when the request's response is not JSON + + - parameter string: string representation of the response (or nil) + - parameter statusCode: response status code + + - returns: a newly created ManagementError + */ + public required init(string: String? = nil, statusCode: Int = 0) { + self.info = [ + "code": string != nil ? nonJSONError : emptyBodyError, + "description": string ?? "Empty response body", + "statusCode": statusCode + ] + } + + /** + Creates a Auth0 Management API error from a JSON response + + - parameter info: JSON response from Auth0 + - parameter statusCode: Http Status Code of the Response + + - returns: a newly created ManagementError + */ + public required init(info: [String: Any], statusCode: Int) { + var values = info + values["statusCode"] = statusCode + self.info = values + } + + /** + Auth0 error code if the server returned one or an internal library code (e.g.: when the server could not be reached) + */ + public var code: String { return self.info["code"] as? String ?? unknownError } + + /** + Description of the error + - important: You should avoid displaying description to the user, it's meant for debugging only. + */ + public var description: String { + if let string = self.info["description"] as? String { + return string + } + return "Failed with unknown error \(self.info)" + } + +} + +extension ManagementError: CustomNSError { + + public static let infoKey = "com.auth0.management.error.info" + public static var errorDomain: String { return "com.auth0.management" } + public var errorCode: Int { return 1 } + public var errorUserInfo: [String: Any] { + return [ + NSLocalizedDescriptionKey: self.description, + ManagementError.infoKey: self + ] + } +} diff --git a/TracMobility/Pods/Auth0/Auth0/MobileWebAuth.swift b/TracMobility/Pods/Auth0/Auth0/MobileWebAuth.swift new file mode 100644 index 0000000..b4e3def --- /dev/null +++ b/TracMobility/Pods/Auth0/Auth0/MobileWebAuth.swift @@ -0,0 +1,343 @@ +// MobileWebAuth.swift +// +// Copyright (c) 2020 Auth0 (http://auth0.com) +// +// 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(iOS) +import UIKit +import SafariServices +#if canImport(AuthenticationServices) +import AuthenticationServices +#endif + +typealias Auth0WebAuth = MobileWebAuth +#if swift(>=4.2) +public typealias A0URLOptionsKey = UIApplication.OpenURLOptionsKey +#else +public typealias A0URLOptionsKey = UIApplicationOpenURLOptionsKey +#endif + +/** + Resumes the current Auth session (if any). + + - parameter url: url received by the iOS application in AppDelegate + - parameter options: dictionary with launch options received by the iOS application in AppDelegate + + - returns: if the url was handled by an on going session or not. + */ +public func resumeAuth(_ url: URL, options: [A0URLOptionsKey: Any] = [:]) -> Bool { + return TransactionStore.shared.resume(url) +} + +public protocol WebAuth: WebAuthenticatable { + + /** + Use `SFSafariViewController` instead of `SFAuthenticationSession` for WebAuth + in iOS 11.0+. + + - Parameter style: modal presentation style + - returns: the same WebAuth instance to allow method chaining + */ + @available(iOS 11, *) + func useLegacyAuthentication(withStyle style: UIModalPresentationStyle) -> Self + +} + +public extension WebAuth { + + /** + Use `SFSafariViewController` instead of `SFAuthenticationSession` for WebAuth + in iOS 11.0+. + Defaults to .fullScreen modal presentation style. + + - returns: the same WebAuth instance to allow method chaining + */ + @available(iOS 11, *) + func useLegacyAuthentication() -> Self { + return useLegacyAuthentication(withStyle: .fullScreen) + } + +} + +final class MobileWebAuth: BaseWebAuth, WebAuth { + + let presenter: ControllerModalPresenter + + private var safariPresentationStyle = UIModalPresentationStyle.fullScreen + private var authenticationSession = true + + init(clientId: String, + url: URL, + presenter: ControllerModalPresenter = ControllerModalPresenter(), + storage: TransactionStore = TransactionStore.shared, + telemetry: Telemetry = Telemetry()) { + self.presenter = presenter + super.init(platform: "ios", + clientId: clientId, + url: url, + storage: storage, + telemetry: telemetry) + } + + func useLegacyAuthentication(withStyle style: UIModalPresentationStyle = .fullScreen) -> Self { + self.authenticationSession = false + self.safariPresentationStyle = style + return self + } + + override func performLogin(authorizeURL: URL, + redirectURL: URL, + state: String?, + handler: OAuth2Grant, + callback: @escaping (Result) -> Void) -> AuthTransaction? { + if #available(iOS 11.0, *), self.authenticationSession { + if #available(iOS 12.0, *) { + return super.performLogin(authorizeURL: authorizeURL, + redirectURL: redirectURL, + state: state, + handler: handler, + callback: callback) + } + #if !targetEnvironment(macCatalyst) + return SafariServicesSession(authorizeURL: authorizeURL, + redirectURL: redirectURL, + state: state, + handler: handler, + logger: self.logger, + callback: callback) + #else + return nil // Will never get executed because Catalyst will use AuthenticationServices + #endif + } + let (controller, finish) = newSafari(authorizeURL, callback: callback) + let session = SafariSession(controller: controller, + redirectURL: redirectURL, + state: state, + handler: handler, + logger: self.logger, + callback: finish) + controller.delegate = session + self.presenter.present(controller: controller) + return session + } + + override func performLogout(logoutURL: URL, + redirectURL: URL, + federated: Bool, + callback: @escaping (Bool) -> Void) -> AuthTransaction? { + if #available(iOS 11.0, *), self.authenticationSession { + if #available(iOS 12.0, *) { + return super.performLogout(logoutURL: logoutURL, + redirectURL: redirectURL, + federated: federated, + callback: callback) + } + #if !targetEnvironment(macCatalyst) + return SafariServicesSessionCallback(url: logoutURL, + schemeURL: redirectURL, + callback: callback) + #else + return nil // Will never get executed because Catalyst will use AuthenticationServices + #endif + } + var urlComponents = URLComponents(url: logoutURL, resolvingAgainstBaseURL: true)! + if federated, let firstQueryItem = urlComponents.queryItems?.first { + urlComponents.queryItems = [firstQueryItem] + } else { + urlComponents.query = nil + } + let url = urlComponents.url! + let controller = SilentSafariViewController(url: url) { callback($0) } + self.presenter.present(controller: controller) + self.logger?.trace(url: url, source: String(describing: "Safari")) + return nil + } + + func newSafari(_ authorizeURL: URL, + callback: @escaping (Result) -> Void) -> (SFSafariViewController, (Result) -> Void) { + let controller = SFSafariViewController(url: authorizeURL) + controller.modalPresentationStyle = safariPresentationStyle + + if #available(iOS 11.0, *) { + controller.dismissButtonStyle = .cancel + } + + let finish: (Result) -> Void = { [weak controller] (result: Result) -> Void in + if case .failure(let cause as WebAuthError) = result, case .userCancelled = cause { + DispatchQueue.main.async { + callback(result) + } + } else { + DispatchQueue.main.async { + guard let presenting = controller?.presentingViewController else { + return callback(Result.failure(error: WebAuthError.cannotDismissWebAuthController)) + } + presenting.dismiss(animated: true) { + callback(result) + } + } + } + } + return (controller, finish) + } + +} + +public extension _ObjectiveOAuth2 { + + /** + Resumes the current Auth session (if any). + + - parameter url: url received by iOS application in AppDelegate + - parameter options: dictionary with launch options received by iOS application in AppDelegate + + - returns: if the url was handled by an on going session or not. + */ + @objc(resumeAuthWithURL:options:) + static func resume(_ url: URL, options: [A0URLOptionsKey: Any]) -> Bool { + return resumeAuth(url, options: options) + } + +} + +public protocol AuthResumable { + + /** + Resumes the transaction when the third party application notifies the application using an url with a custom scheme. + This method should be called from the Application's `AppDelegate` or using `public func resumeAuth(_ url: URL, options: [UIApplicationOpenURLOptionsKey: Any]) -> Bool` method. + + - parameter url: the url send by the third party application that contains the result of the Auth + - parameter options: options recieved in the openUrl method of the `AppDelegate` + + - returns: if the url was expected and properly formatted otherwise it will return `false`. + */ + func resume(_ url: URL, options: [A0URLOptionsKey: Any]) -> Bool + +} + +public extension AuthResumable { + + /** + Tries to resume (and complete) the OAuth2 session from the received URL + + - parameter url: url received in application's AppDelegate + - parameter options: a dictionary of launch options received from application's AppDelegate + + - returns: `true` if the url completed (successfuly or not) this session, `false` otherwise + */ + func resume(_ url: URL, options: [A0URLOptionsKey: Any] = [:]) -> Bool { + return self.resume(url, options: options) + } + +} + +extension AuthTransaction where Self: BaseAuthTransaction { + + func resume(_ url: URL, options: [A0URLOptionsKey: Any]) -> Bool { + return self.handleUrl(url) + } + +} + +extension AuthTransaction where Self: SessionCallbackTransaction { + + func resume(_ url: URL, options: [A0URLOptionsKey: Any]) -> Bool { + return self.handleUrl(url) + } + +} + +#if !targetEnvironment(macCatalyst) +@available(iOS 11.0, *) +final class SafariServicesSession: SessionTransaction { + + init(authorizeURL: URL, + redirectURL: URL, + state: String? = nil, + handler: OAuth2Grant, + logger: Logger?, + callback: @escaping FinishTransaction) { + super.init(redirectURL: redirectURL, + state: state, + handler: handler, + logger: logger, + callback: callback) + + authSession = SFAuthenticationSession(url: authorizeURL, + callbackURLScheme: self.redirectURL.absoluteString) { [unowned self] in + guard $1 == nil, let callbackURL = $0 else { + let authError = $1 ?? WebAuthError.unknownError + if case SFAuthenticationError.canceledLogin = authError { + self.callback(.failure(error: WebAuthError.userCancelled)) + } else { + self.callback(.failure(error: authError)) + } + return TransactionStore.shared.clear() + } + _ = TransactionStore.shared.resume(callbackURL) + } + + _ = authSession?.start() + } + +} + +@available(iOS 11.0, *) +final class SafariServicesSessionCallback: SessionCallbackTransaction { + + init(url: URL, schemeURL: URL, callback: @escaping (Bool) -> Void) { + super.init(callback: callback) + + let authSession = SFAuthenticationSession(url: url, + callbackURLScheme: schemeURL.absoluteString) { [unowned self] url, _ in + self.callback(url != nil) + TransactionStore.shared.clear() + } + + self.authSession = authSession + authSession.start() + } + +} + +@available(iOS 11.0, *) +extension SFAuthenticationSession: AuthSession {} +#endif + +#if canImport(AuthenticationServices) && swift(>=5.1) +@available(iOS 13.0, *) +extension AuthenticationServicesSession: ASWebAuthenticationPresentationContextProviding { + + func presentationAnchor(for session: ASWebAuthenticationSession) -> ASPresentationAnchor { + return UIApplication.shared()?.windows.filter({ $0.isKeyWindow }).last ?? ASPresentationAnchor() + } + +} + +@available(iOS 13.0, *) +extension AuthenticationServicesSessionCallback: ASWebAuthenticationPresentationContextProviding { + + func presentationAnchor(for session: ASWebAuthenticationSession) -> ASPresentationAnchor { + return UIApplication.shared()?.windows.filter({ $0.isKeyWindow }).last ?? ASPresentationAnchor() + } + +} +#endif +#endif diff --git a/TracMobility/Pods/Auth0/Auth0/NSData+URLSafe.swift b/TracMobility/Pods/Auth0/Auth0/NSData+URLSafe.swift new file mode 100644 index 0000000..1cdbfd8 --- /dev/null +++ b/TracMobility/Pods/Auth0/Auth0/NSData+URLSafe.swift @@ -0,0 +1,33 @@ +// NSData+URLSafe.swift +// +// Copyright (c) 2016 Auth0 (http://auth0.com) +// +// 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 Data { + func a0_encodeBase64URLSafe() -> String? { + return self + .base64EncodedString(options: []) + .replacingOccurrences(of: "+", with: "-") + .replacingOccurrences(of: "/", with: "_") + .trimmingCharacters(in: CharacterSet(charactersIn: "=")) + } +} diff --git a/TracMobility/Pods/Auth0/Auth0/NSError+Helper.swift b/TracMobility/Pods/Auth0/Auth0/NSError+Helper.swift new file mode 100644 index 0000000..f31ed03 --- /dev/null +++ b/TracMobility/Pods/Auth0/Auth0/NSError+Helper.swift @@ -0,0 +1,28 @@ +// NSError+Helper.swift +// +// Copyright (c) 2016 Auth0 (http://auth0.com) +// +// 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 NSError { + @objc var a0_isManagementError: Bool { return self.domain == ManagementError.errorDomain } + @objc var a0_isAuthenticationError: Bool { return self.domain == AuthenticationError.errorDomain } +} diff --git a/TracMobility/Pods/Auth0/Auth0/NSURL+Auth0.swift b/TracMobility/Pods/Auth0/Auth0/NSURL+Auth0.swift new file mode 100644 index 0000000..f547f84 --- /dev/null +++ b/TracMobility/Pods/Auth0/Auth0/NSURL+Auth0.swift @@ -0,0 +1,42 @@ +// NSURL+Auth0.swift +// +// Copyright (c) 2016 Auth0 (http://auth0.com) +// +// 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 URL { + /** + Returns an Auth0 domain URL given a domain + + - parameter domain: name of your Auth0 account + + - returns: URL of your Auth0 account + */ + static func a0_url(_ domain: String) -> URL { + let urlString: String + if !domain.hasPrefix("https") { + urlString = "https://\(domain)" + } else { + urlString = domain + } + return URL(string: urlString)! + } +} diff --git a/TracMobility/Pods/Auth0/Auth0/NSURLComponents+OAuth2.swift b/TracMobility/Pods/Auth0/Auth0/NSURLComponents+OAuth2.swift new file mode 100644 index 0000000..417652f --- /dev/null +++ b/TracMobility/Pods/Auth0/Auth0/NSURLComponents+OAuth2.swift @@ -0,0 +1,48 @@ +// NSURLComponents+OAuth2.swift +// +// Copyright (c) 2016 Auth0 (http://auth0.com) +// +// 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 WEB_AUTH_PLATFORM +import Foundation + +extension URLComponents { + var a0_fragmentValues: [String: String] { + var dict: [String: String] = [:] + let items = fragment?.components(separatedBy: "&") + items?.forEach { item in + let parts = item.components(separatedBy: "=") + guard + parts.count == 2, + let key = parts.first, + let value = parts.last + else { return } + dict[key] = value + } + return dict + } + + var a0_queryValues: [String: String] { + var dict: [String: String] = [:] + self.queryItems?.forEach { dict[$0.name] = $0.value } + return dict + } +} +#endif diff --git a/TracMobility/Pods/Auth0/Auth0/NativeAuth.swift b/TracMobility/Pods/Auth0/Auth0/NativeAuth.swift new file mode 100644 index 0000000..c261f09 --- /dev/null +++ b/TracMobility/Pods/Auth0/Auth0/NativeAuth.swift @@ -0,0 +1,129 @@ +// NativeAuth.swift +// +// Copyright (c) 2017 Auth0 (http://auth0.com) +// +// 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 WEB_AUTH_PLATFORM +/** + The NativeAuthCredentials struct defines the data requirements necessary to be returned + from a successul authentication with an IdP SDK as part of the NativeAuthTransaction process. + */ +public struct NativeAuthCredentials { + /// Access token returned by the IdP SDK + let token: String + /// Any extra attributes of the IdP that may be necessary during Auth with Auth0. + let extras: [String: Any] + + /** + Creates a new instance of `NativeAuthCredentials` + + - parameter token: IdP access token that will be used to authenticate with Auth0 + - parameter extras: Any extra attributes returned by the IdP. + */ + public init(token: String, extras: [String: Any] = [:]) { + self.token = token + self.extras = extras + } +} + +/** + Represent a Auth transaction where the user first authenticates with a third party Identity Provider (IdP) and then tries to perform Auth with Auth0. + This is usually used when a Social connection has a native SDK, e.g. Facebook, and for usability or need to call the IdP API the SDK should be used to login. + + When implemeting this protocol you only need to take care of the IdP authentication and yield it's results so the Auth0 part of the flow will be taken care of for you + + To accomplish this the results of the IdP authentication should be send using the callback received when the method `func auth(callback: @escaping Callback) -> ()` is called. + + - important: Auth0 only support this for Facebook, Google and Twitter connections. + */ +public protocol NativeAuthTransaction: AuthTransaction { + + /// Scope sent to auth0 to login after the native auth, e.g.: openid + var scope: String { get } + /// Connection name registered in Auth0 used to authenticate with the native auth access_token + var connection: String { get } + /// Additional authentication parameters sent to Auth0 to perform the final auth + var parameters: [String: Any] { get } + /// Authenticaton object to perform the Auth0 social auth + var authentication: Authentication { get } + + /// Callback where the result of the native authentication is sent + typealias Callback = (Result) -> Void + + /** + Starts the native Auth flow using the IdP SDK and once completed it will notify the result using the callback. + + On sucesss the IdP access token, and any parameter needed by Auth0 to authenticate, should be used to create a `NativeAuthCredentials`. + + ``` + let credetials = NativeAuthCredentials(token: "{IdP Token}", extras: [:]) + let result = Auth0.Result.success(result: credentials) + ``` + - parameter callback: callback with the IdP credentials on success or the cause of the error. + */ + func auth(callback: @escaping Callback) + + /** + Starts the Auth transaction by trying to authenticate the user with the IdP SDK first, + then on success it will try to auth with Auth0 using /oauth/access_token sending at least the IdP access_token. + + If Auth0 needs more parameters in order to authenticate a given IdP, they must be added in the `extra` attribute of `NativeAuthCredentials` + + - parameter callback: closure that will notify with the result of the Auth transaction. On success it will yield the Auth0 credentilas of the user otherwise it will yield the cause of the failure. + - important: Only one `AuthTransaction` can be active at a given time, if there is a pending one (OAuth or Native) it will be cancelled and replaced by the new one. + */ + func start(callback: @escaping (Result) -> Void) +} + +/** + Extension to handle Auth with Auth0 via /oauth/access_token endpoint + */ +public extension NativeAuthTransaction { + + /// For native authentication, this attribute does not matter at all. It's only used for OAuth 2.0 flows using /authorize + var state: String? { + return self.connection + } + + /** + Starts the Auth transaction by trying to authenticate the user with the IdP SDK first, + then on success it will try to auth with Auth0 using /oauth/access_token sending at least the IdP access_token. + + If Auth0 needs more parameters in order to authenticate a given IdP, they must be added in the `extra` attribute of `NativeAuthCredentials` + + - parameter callback: closure that will notify with the result of the Auth transaction. On success it will yield the Auth0 credentilas of the user otherwise it will yield the cause of the failure. + - important: Only one `AuthTransaction` can be active at a given time, if there is a pending one (OAuth or Native) it will be cancelled and replaced by the new one. + */ + func start(callback: @escaping (Result) -> Void) { + TransactionStore.shared.store(self) + self.auth { result in + switch result { + case .success(let credentials): + var parameters: [String: Any] = self.parameters + credentials.extras.forEach { parameters[$0] = $1 } + self.authentication.loginSocial(token: credentials.token, connection: self.connection, scope: self.scope, parameters: parameters) + .start(callback) + case .failure(let error): + callback(.failure(error: error)) + } + } + } +} +#endif diff --git a/TracMobility/Pods/Auth0/Auth0/OAuth2Grant.swift b/TracMobility/Pods/Auth0/Auth0/OAuth2Grant.swift new file mode 100644 index 0000000..07b7a18 --- /dev/null +++ b/TracMobility/Pods/Auth0/Auth0/OAuth2Grant.swift @@ -0,0 +1,214 @@ +// OAuth2Grant.swift +// +// Copyright (c) 2016 Auth0 (http://auth0.com) +// +// 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 WEB_AUTH_PLATFORM +import Foundation +import JWTDecode +#if SWIFT_PACKAGE +import Auth0ObjectiveC +#endif + +protocol OAuth2Grant { + var defaults: [String: String] { get } + func credentials(from values: [String: String], callback: @escaping (Result) -> Void) + func values(fromComponents components: URLComponents) -> [String: String] +} + +struct ImplicitGrant: OAuth2Grant { + + let authentication: Authentication + let defaults: [String: String] + let responseType: [ResponseType] + let issuer: String + let leeway: Int + let maxAge: Int? + + init(authentication: Authentication, + responseType: [ResponseType] = [.token], + issuer: String, + leeway: Int, + maxAge: Int? = nil, + nonce: String? = nil) { + self.authentication = authentication + self.responseType = responseType + self.issuer = issuer + self.leeway = leeway + self.maxAge = maxAge + if let nonce = nonce { + self.defaults = ["nonce": nonce] + } else { + self.defaults = [:] + } + } + + func credentials(from values: [String: String], callback: @escaping (Result) -> Void) { + let responseType = self.responseType + let validatorContext = IDTokenValidatorContext(authentication: authentication, + issuer: issuer, + leeway: leeway, + maxAge: maxAge, + nonce: self.defaults["nonce"]) + validateFrontChannelIDToken(idToken: values["id_token"], for: responseType, with: validatorContext) { error in + if let error = error { return callback(.failure(error: error)) } + guard !responseType.contains(.token) || values["access_token"] != nil else { + return callback(.failure(error: WebAuthError.missingAccessToken)) + } + callback(.success(result: Credentials(json: values as [String: Any]))) + } + } + + func values(fromComponents components: URLComponents) -> [String: String] { + return components.a0_fragmentValues + } + +} + +struct PKCE: OAuth2Grant { + + let authentication: Authentication + let redirectURL: URL + let defaults: [String: String] + let verifier: String + let responseType: [ResponseType] + let issuer: String + let leeway: Int + let maxAge: Int? + + init(authentication: Authentication, + redirectURL: URL, + generator: A0SHA256ChallengeGenerator = A0SHA256ChallengeGenerator(), + responseType: [ResponseType] = [.code], + issuer: String, + leeway: Int, + maxAge: Int? = nil, + nonce: String? = nil) { + self.init(authentication: authentication, + redirectURL: redirectURL, + verifier: generator.verifier, + challenge: generator.challenge, + method: generator.method, + responseType: responseType, + issuer: issuer, + leeway: leeway, + maxAge: maxAge, + nonce: nonce) + } + + init(authentication: Authentication, + redirectURL: URL, + verifier: String, + challenge: String, + method: String, + responseType: [ResponseType], + issuer: String, + leeway: Int, + maxAge: Int? = nil, + nonce: String? = nil) { + self.authentication = authentication + self.redirectURL = redirectURL + self.verifier = verifier + self.responseType = responseType + self.issuer = issuer + self.leeway = leeway + self.maxAge = maxAge + var newDefaults: [String: String] = [ + "code_challenge": challenge, + "code_challenge_method": method + ] + if let nonce = nonce { + newDefaults["nonce"] = nonce + } + self.defaults = newDefaults + } + + // swiftlint:disable function_body_length + func credentials(from values: [String: String], callback: @escaping (Result) -> Void) { + guard let code = values["code"] else { + let string = "No code found in parameters \(values)" + return callback(.failure(error: AuthenticationError(string: string))) + } + let idToken = values["id_token"] + let responseType = self.responseType + let authentication = self.authentication + let issuer = self.issuer + let leeway = self.leeway + let nonce = self.defaults["nonce"] + let maxAge = self.maxAge + let verifier = self.verifier + let redirectUrlString = self.redirectURL.absoluteString + let clientId = authentication.clientId + let isFrontChannelIdTokenExpected = responseType.contains(.idToken) + let validatorContext = IDTokenValidatorContext(authentication: authentication, + issuer: issuer, + leeway: leeway, + maxAge: maxAge, + nonce: nonce) + validateFrontChannelIDToken(idToken: idToken, for: responseType, with: validatorContext) { error in + if let error = error { return callback(.failure(error: error)) } + authentication + .tokenExchange(withCode: code, codeVerifier: verifier, redirectURI: redirectUrlString) + .start { result in + switch result { + case .failure(let error as AuthenticationError) where error.description == "Unauthorized": + // Special case for PKCE when the correct method for token endpoint authentication is not set (it should be None) + let webAuthError = WebAuthError.pkceNotAllowed("Unable to complete authentication with PKCE. PKCE support can be enabled by setting Application Type to 'Native' and Token Endpoint Authentication Method to 'None' for this app at 'https://manage.auth0.com/#/applications/\(clientId)/settings'.") + return callback(.failure(error: webAuthError)) + case .failure(let error): return callback(.failure(error: error)) + case .success(let credentials): + guard isFrontChannelIdTokenExpected else { + return validate(idToken: credentials.idToken, with: validatorContext) { error in + if let error = error { return callback(.failure(error: error)) } + callback(result) + } + } + let newCredentials = Credentials(accessToken: credentials.accessToken, + tokenType: credentials.tokenType, + idToken: idToken, + refreshToken: credentials.refreshToken, + expiresIn: credentials.expiresIn, + scope: credentials.scope) + return callback(.success(result: newCredentials)) + } + } + } + } + + func values(fromComponents components: URLComponents) -> [String: String] { + var items = components.a0_fragmentValues + components.a0_queryValues.forEach { items[$0] = $1 } + return items + } + +} + +// This method will skip the validation if the response type does not contain "id_token" +private func validateFrontChannelIDToken(idToken: String?, + for responseType: [ResponseType], + with context: IDTokenValidatorContext, + callback: @escaping (LocalizedError?) -> Void) { + guard responseType.contains(.idToken) else { return callback(nil) } + validate(idToken: idToken, with: context) { error in + if let error = error { return callback(error) } + callback(nil) + } +} +#endif diff --git a/TracMobility/Pods/Auth0/Auth0/ObjectiveC/A0ChallengeGenerator.h b/TracMobility/Pods/Auth0/Auth0/ObjectiveC/A0ChallengeGenerator.h new file mode 100644 index 0000000..853bf81 --- /dev/null +++ b/TracMobility/Pods/Auth0/Auth0/ObjectiveC/A0ChallengeGenerator.h @@ -0,0 +1,37 @@ +// A0ChallengeGenerator.h +// +// Copyright (c) 2016 Auth0 (http://auth0.com) +// +// 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 WEB_AUTH_PLATFORM +#import + +NS_ASSUME_NONNULL_BEGIN +@interface A0SHA256ChallengeGenerator : NSObject +@property (readonly, strong, nonatomic) NSString *verifier; +@property (readonly, strong, nonatomic) NSString *challenge; +@property (readonly, strong, nonatomic) NSString *method; + +- (instancetype)init; +- (instancetype)initWithVerifier:(NSData *)verifier; + +@end +NS_ASSUME_NONNULL_END +#endif diff --git a/TracMobility/Pods/Auth0/Auth0/ObjectiveC/A0ChallengeGenerator.m b/TracMobility/Pods/Auth0/Auth0/ObjectiveC/A0ChallengeGenerator.m new file mode 100644 index 0000000..c9b872a --- /dev/null +++ b/TracMobility/Pods/Auth0/Auth0/ObjectiveC/A0ChallengeGenerator.m @@ -0,0 +1,73 @@ +// A0ChallengeGenerator.m +// +// Copyright (c) 2016 Auth0 (http://auth0.com) +// +// 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 WEB_AUTH_PLATFORM +#import "A0ChallengeGenerator.h" +#import + +const NSUInteger kVerifierSize = 32; + +@implementation A0SHA256ChallengeGenerator + +- (instancetype)init { + NSMutableData *data = [NSMutableData dataWithLength:kVerifierSize]; + int result __attribute__((unused)) = SecRandomCopyBytes(kSecRandomDefault, kVerifierSize, data.mutableBytes); + return [self initWithVerifier:data]; +} + +- (instancetype)initWithVerifier:(NSData *)verifier { + self = [super init]; + if (self) { + _verifier = [[[[verifier base64EncodedStringWithOptions:0] + stringByReplacingOccurrencesOfString:@"+" withString:@"-"] + stringByReplacingOccurrencesOfString:@"/" withString:@"_"] + stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"="]]; + _method = @"S256"; + } + return self; +} + +- (NSString *)challenge { + CC_SHA256_CTX ctx; + + uint8_t * hashBytes = malloc(CC_SHA256_DIGEST_LENGTH * sizeof(uint8_t)); + memset(hashBytes, 0x0, CC_SHA256_DIGEST_LENGTH); + + NSData *valueData = [self.verifier dataUsingEncoding:NSUTF8StringEncoding]; + + CC_SHA256_Init(&ctx); + CC_SHA256_Update(&ctx, [valueData bytes], (CC_LONG)[valueData length]); + CC_SHA256_Final(hashBytes, &ctx); + + NSData *hash = [NSData dataWithBytes:hashBytes length:CC_SHA256_DIGEST_LENGTH]; + + if (hashBytes) { + free(hashBytes); + } + + return [[[[hash base64EncodedStringWithOptions:0] + stringByReplacingOccurrencesOfString:@"+" withString:@"-"] + stringByReplacingOccurrencesOfString:@"/" withString:@"_"] + stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"="]]; +} +@end +#endif diff --git a/TracMobility/Pods/Auth0/Auth0/ObjectiveC/A0RSA.h b/TracMobility/Pods/Auth0/Auth0/ObjectiveC/A0RSA.h new file mode 100644 index 0000000..55f7081 --- /dev/null +++ b/TracMobility/Pods/Auth0/Auth0/ObjectiveC/A0RSA.h @@ -0,0 +1,37 @@ +// A0RSA.h +// +// Copyright (c) 2016 Auth0 (http://auth0.com) +// +// 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 WEB_AUTH_PLATFORM +#import + +NS_ASSUME_NONNULL_BEGIN +@interface A0RSA: NSObject + +- (nullable instancetype)initWithKey: (SecKeyRef)key; + +- (NSData *)sign: (NSData *)data; + +- (Boolean)verify: (NSData *)data signature: (NSData *)signature; + +@end +NS_ASSUME_NONNULL_END +#endif diff --git a/TracMobility/Pods/Auth0/Auth0/ObjectiveC/A0RSA.m b/TracMobility/Pods/Auth0/Auth0/ObjectiveC/A0RSA.m new file mode 100644 index 0000000..1e8d026 --- /dev/null +++ b/TracMobility/Pods/Auth0/Auth0/ObjectiveC/A0RSA.m @@ -0,0 +1,97 @@ +// A0RSA.m +// +// Copyright (c) 2016 Auth0 (http://auth0.com) +// +// 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 WEB_AUTH_PLATFORM +#import "A0RSA.h" +#import + +@interface A0RSA () +@property (readonly, nonatomic) SecKeyRef key; +@end + +@implementation A0RSA + +- (nullable instancetype)initWithKey: (SecKeyRef)key { + self = [super init]; + if (self) { + _key = key; + } + return self; +} + +- (NSData *)sign:(NSData *)plainData { + #if TARGET_OS_OSX && __MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_2 + NSData * signature; + CFErrorRef error = NULL; + + signature = CFBridgingRelease(SecKeyCreateSignature(self.key, + kSecKeyAlgorithmRSASignatureDigestPKCS1v15SHA256, + (__bridge CFDataRef) plainData, + &error)); + + return signature; + #else + size_t signedHashBytesSize = SecKeyGetBlockSize(self.key); + uint8_t signedHashBytes[signedHashBytesSize]; + memset(signedHashBytes, 0x0, signedHashBytesSize); + + OSStatus result = SecKeyRawSign(self.key, + kSecPaddingPKCS1SHA256, + plainData.bytes, + plainData.length, + signedHashBytes, + &signedHashBytesSize); + + NSData* signedHash = nil; + if (result == errSecSuccess) { + signedHash = [NSData dataWithBytes:signedHashBytes + length:(NSUInteger)signedHashBytesSize]; + } + + return signedHash; + #endif +} + +- (Boolean)verify:(NSData *)plainData signature:(NSData *)signature { + #if TARGET_OS_OSX && __MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_2 + BOOL result = NO; + CFErrorRef error = NULL; + + result = SecKeyVerifySignature(self.key, + kSecKeyAlgorithmRSASignatureDigestPKCS1v15SHA256, + (__bridge CFDataRef) plainData, + (__bridge CFDataRef) signature, + &error); + return result; + #else + OSStatus result = SecKeyRawVerify(self.key, + kSecPaddingPKCS1SHA256, + plainData.bytes, + plainData.length, + signature.bytes, + signature.length); + return result == errSecSuccess; + #endif +} + +@end +#endif diff --git a/TracMobility/Pods/Auth0/Auth0/ObjectiveC/A0SHA.h b/TracMobility/Pods/Auth0/Auth0/ObjectiveC/A0SHA.h new file mode 100644 index 0000000..c2f7360 --- /dev/null +++ b/TracMobility/Pods/Auth0/Auth0/ObjectiveC/A0SHA.h @@ -0,0 +1,35 @@ +// A0SHA.h +// +// Copyright (c) 2016 Auth0 (http://auth0.com) +// +// 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 WEB_AUTH_PLATFORM +#import + +NS_ASSUME_NONNULL_BEGIN +@interface A0SHA: NSObject + +- (nullable instancetype)initWithAlgorithm: (NSString *)algorithm; + +- (NSData *)hash: (NSData *)data; + +@end +NS_ASSUME_NONNULL_END +#endif diff --git a/TracMobility/Pods/Auth0/Auth0/ObjectiveC/A0SHA.m b/TracMobility/Pods/Auth0/Auth0/ObjectiveC/A0SHA.m new file mode 100644 index 0000000..e6039db --- /dev/null +++ b/TracMobility/Pods/Auth0/Auth0/ObjectiveC/A0SHA.m @@ -0,0 +1,63 @@ +// A0SHA.m +// +// Copyright (c) 2016 Auth0 (http://auth0.com) +// +// 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 WEB_AUTH_PLATFORM +#import "A0SHA.h" +#import + +static NSString * const kDefaultSHAAlgorithm = @"sha256"; + +@interface A0SHA () +@property (readonly, nonatomic) NSInteger digestLength; +@end + +@implementation A0SHA + +- (instancetype)initWithAlgorithm:(NSString *)algorithm { + self = [super init]; + if (self) { + const NSString * alg = algorithm.lowercaseString; + if ([kDefaultSHAAlgorithm isEqual: alg]) { + _digestLength = CC_SHA256_DIGEST_LENGTH; + } else { + return nil; + } + } + return self; +} + +- (instancetype)init { + return [self initWithAlgorithm: kDefaultSHAAlgorithm]; +} + +- (NSData *)hash:(NSData *)data { + uint8_t hashBytes[self.digestLength]; + memset(hashBytes, 0x0, self.digestLength); + + CC_SHA256(data.bytes, (CC_LONG)data.length, hashBytes); + + NSData *hash = [NSData dataWithBytes:hashBytes length:self.digestLength]; + return hash; +} + +@end +#endif diff --git a/TracMobility/Pods/Auth0/Auth0/Optional+DebugDescription.swift b/TracMobility/Pods/Auth0/Auth0/Optional+DebugDescription.swift new file mode 100644 index 0000000..6581fae --- /dev/null +++ b/TracMobility/Pods/Auth0/Auth0/Optional+DebugDescription.swift @@ -0,0 +1,32 @@ +// Optional+DebugDescription.swift +// +// Copyright (c) 2019 Auth0 (http://auth0.com) +// +// 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 Optional { + var debugDescription: String { + switch self { + case .none: return "nil" + case .some(let value): return String(describing: value) + } + } +} diff --git a/TracMobility/Pods/Auth0/Auth0/Profile.swift b/TracMobility/Pods/Auth0/Auth0/Profile.swift new file mode 100644 index 0000000..e7fad53 --- /dev/null +++ b/TracMobility/Pods/Auth0/Auth0/Profile.swift @@ -0,0 +1,107 @@ +// Profile.swift +// +// Copyright (c) 2016 Auth0 (http://auth0.com) +// +// 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 + +/** + Auth0 normalized user profile returned by Auth0 + + - seeAlso: [Normalized User Profile](https://auth0.com/docs/user-profile/normalized) + */ +@objc(A0Profile) +@objcMembers public class Profile: NSObject, JSONObjectPayload { + + public let id: String + public let name: String + public let nickname: String + public let pictureURL: URL + public let createdAt: Date + + public let email: String? + public let emailVerified: Bool + public let givenName: String? + public let familyName: String? + + public let additionalAttributes: [String: Any] + public let identities: [Identity] + + public subscript(key: String) -> Any? { + return self.additionalAttributes[key] + } + + public func value(_ key: String) -> Type? { + return self[key] as? Type + } + + public var userMetadata: [String: Any] { + return self["user_metadata"] as? [String: Any] ?? [:] + } + + public var appMetadata: [String: Any] { + return self["app_metadata"] as? [String: Any] ?? [:] + } + + required public init(id: String, name: String, nickname: String, pictureURL: URL, createdAt: Date, email: String?, emailVerified: Bool, givenName: String?, familyName: String?, attributes: [String: Any], identities: [Identity]) { + self.id = id + self.name = name + self.nickname = nickname + self.pictureURL = pictureURL + self.createdAt = createdAt + + self.email = email + self.emailVerified = emailVerified + self.givenName = givenName + self.familyName = familyName + + self.additionalAttributes = attributes + self.identities = identities + } + + convenience required public init?(json: [String: Any]) { + guard + let id = json["user_id"] as? String ?? json["sub"] as? String, + let name = json["name"] as? String, + let nickname = json["nickname"] as? String, + let picture = json["picture"] as? String, let pictureURL = URL(string: picture), + let dateString = json["created_at"] as? String ?? json["updated_at"] as? String, let createdAt = date(from: dateString) + else { return nil } + let email = json["email"] as? String + let emailVerified = json["email_verified"] as? Bool ?? false + let givenName = json["given_name"] as? String + let familyName = json["family_name"] as? String + let identityValues = json["identities"] as? [[String: Any]] ?? [] + #if swift(>=4.1) + let identities = identityValues.compactMap { Identity(json: $0) } + #else + let identities = identityValues.flatMap { Identity(json: $0) } + #endif + let keys = Set(["user_id", "name", "nickname", "picture", "created_at", "email", "email_verified", "given_name", "family_name", "identities"]) + var values: [String: Any] = [:] + json.forEach { key, value in + guard !keys.contains(key) else { return } + values[key] = value + } + let attributes = values + self.init(id: id, name: name, nickname: nickname, pictureURL: pictureURL, createdAt: createdAt, email: email, emailVerified: emailVerified, givenName: givenName, familyName: familyName, attributes: attributes, identities: identities) + } + +} diff --git a/TracMobility/Pods/Auth0/Auth0/Request.swift b/TracMobility/Pods/Auth0/Auth0/Request.swift new file mode 100644 index 0000000..cdffa21 --- /dev/null +++ b/TracMobility/Pods/Auth0/Auth0/Request.swift @@ -0,0 +1,125 @@ +// Request.swift +// +// Copyright (c) 2016 Auth0 (http://auth0.com) +// +// 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 DEBUG + let parameterPropertyKey = "com.auth0.parameter" +#endif + +/** + Auth0 API request + + ``` + let request: Request = // + request.start { result in + //handle result + } + ``` + */ +public struct Request: Requestable { + public typealias Callback = (Result) -> Void + + let session: URLSession + let url: URL + let method: String + let handle: (Response, Callback) -> Void + let payload: [String: Any] + let headers: [String: String] + let logger: Logger? + let telemetry: Telemetry + + init(session: URLSession, url: URL, method: String, handle: @escaping (Response, Callback) -> Void, payload: [String: Any] = [:], headers: [String: String] = [:], logger: Logger?, telemetry: Telemetry) { + self.session = session + self.url = url + self.method = method + self.handle = handle + self.payload = payload + self.headers = headers + self.logger = logger + self.telemetry = telemetry + } + + var request: URLRequest { + let request = NSMutableURLRequest(url: url) + request.httpMethod = method + if !payload.isEmpty, let httpBody = try? JSONSerialization.data(withJSONObject: payload, options: []) { + request.httpBody = httpBody + #if DEBUG + URLProtocol.setProperty(payload, forKey: parameterPropertyKey, in: request) + #endif + } + request.setValue("application/json", forHTTPHeaderField: "Content-Type") + headers.forEach { name, value in request.setValue(value, forHTTPHeaderField: name) } + telemetry.addTelemetryHeader(request: request) + return request as URLRequest + } + + /** + Starts the request to the server + + - parameter callback: called when the request finishes and yield it's result + */ + public func start(_ callback: @escaping Callback) { + let handler = self.handle + let request = self.request + let logger = self.logger + + logger?.trace(request: request, session: self.session) + + let task = session.dataTask(with: request, completionHandler: { data, response, error in + if error == nil, let response = response { + logger?.trace(response: response, data: data) + } + handler(Response(data: data, response: response, error: error), callback) + }) + task.resume() + } + +} + +/** + * A concatenated request, if the first one fails it will yield it's error, otherwise it will return the last request outcome + */ +public struct ConcatRequest: Requestable { + let first: Request + let second: Request + + public typealias ResultType = S + + /** + Starts the request to the server + + - parameter callback: called when the request finishes and yield it's result + */ + public func start(_ callback: @escaping (Result) -> Void) { + let second = self.second + first.start { result in + switch result { + case .failure(let cause): + callback(.failure(error: cause)) + case .success: + second.start(callback) + } + } + } +} diff --git a/TracMobility/Pods/Auth0/Auth0/Requestable.swift b/TracMobility/Pods/Auth0/Auth0/Requestable.swift new file mode 100644 index 0000000..ccfcebb --- /dev/null +++ b/TracMobility/Pods/Auth0/Auth0/Requestable.swift @@ -0,0 +1,29 @@ +// Requestable.swift +// +// Copyright (c) 2016 Auth0 (http://auth0.com) +// +// 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 Requestable { + associatedtype ResultType + + func start(_ callback: @escaping (Result) -> Void) +} diff --git a/TracMobility/Pods/Auth0/Auth0/Response.swift b/TracMobility/Pods/Auth0/Auth0/Response.swift new file mode 100644 index 0000000..64263a3 --- /dev/null +++ b/TracMobility/Pods/Auth0/Auth0/Response.swift @@ -0,0 +1,65 @@ +// Response.swift +// +// Copyright (c) 2016 Auth0 (http://auth0.com) +// +// 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 + +func json(_ data: Data?) -> Any? { + guard let data = data else { return nil } + return try? JSONSerialization.jsonObject(with: data, options: []) +} + +func string(_ data: Data?) -> String? { + guard let data = data else { return nil } + return String(data: data, encoding: .utf8) +} + +struct Response { + let data: Data? + let response: URLResponse? + let error: Error? + + func result() throws -> Any? { + guard error == nil else { throw error! } + guard let response = self.response as? HTTPURLResponse else { throw E(string: nil, statusCode: 0) } + guard (200...300).contains(response.statusCode) else { + if let json = json(data) as? [String: Any] { + throw E(info: json, statusCode: response.statusCode) + } + throw E(string: string(data), statusCode: response.statusCode) + } + guard let data = self.data, !data.isEmpty else { + if response.statusCode == 204 { + return nil + } + throw E(string: nil, statusCode: response.statusCode) + } + if let json = json(data) { + return json + } + // This piece of code is dedicated to our friends the backend devs :) + if response.url?.lastPathComponent == "change_password" { + return nil + } else { + throw E(string: string(data), statusCode: response.statusCode) + } + } +} diff --git a/TracMobility/Pods/Auth0/Auth0/ResponseType.swift b/TracMobility/Pods/Auth0/Auth0/ResponseType.swift new file mode 100644 index 0000000..d421efb --- /dev/null +++ b/TracMobility/Pods/Auth0/Auth0/ResponseType.swift @@ -0,0 +1,63 @@ +// ResponseType.swift +// +// Copyright (c) 2016 Auth0 (http://auth0.com) +// +// 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 WEB_AUTH_PLATFORM +import Foundation + +/// +/// List of supported response_types +/// ImplicitGrant +/// [.token] +/// [.idToken] +/// [.token, .idToken] +/// +/// PKCE +/// [.code] +/// [.code, token] +/// [.code, idToken] +/// [.code, token, .idToken] +/// +public struct ResponseType: OptionSet { + public let rawValue: Int + + public init(rawValue: Int) { + self.rawValue = rawValue + } + + public static let token = ResponseType(rawValue: 1 << 0) + public static let idToken = ResponseType(rawValue: 1 << 1) + public static let code = ResponseType(rawValue: 1 << 2) + + var label: String? { + switch self.rawValue { + case ResponseType.token.rawValue: + return "token" + case ResponseType.idToken.rawValue: + return "id_token" + case ResponseType.code.rawValue: + return "code" + default: + return nil + } + } +} +#endif diff --git a/TracMobility/Pods/Auth0/Auth0/Result.swift b/TracMobility/Pods/Auth0/Auth0/Result.swift new file mode 100644 index 0000000..5d9d166 --- /dev/null +++ b/TracMobility/Pods/Auth0/Auth0/Result.swift @@ -0,0 +1,34 @@ +// Result.swift +// +// Copyright (c) 2016 Auth0 (http://auth0.com) +// +// 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 + +/** + Result object for Auth0 APIs requests + + - Success: request completed successfuly with it's response body + - Failure: request failed with a specific error + */ +public enum Result { + case success(result: T) + case failure(error: Error) +} diff --git a/TracMobility/Pods/Auth0/Auth0/SafariSession.swift b/TracMobility/Pods/Auth0/Auth0/SafariSession.swift new file mode 100644 index 0000000..179e794 --- /dev/null +++ b/TracMobility/Pods/Auth0/Auth0/SafariSession.swift @@ -0,0 +1,56 @@ +// SafariSession.swift +// +// Copyright (c) 2016 Auth0 (http://auth0.com) +// +// 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(iOS) +import SafariServices + +final class SafariSession: BaseAuthTransaction { + + typealias FinishSession = (Result) -> Void + + weak var controller: UIViewController? + + init(controller: SFSafariViewController, + redirectURL: URL, + state: String? = nil, + handler: OAuth2Grant, + logger: Logger?, + callback: @escaping FinishSession) { + self.controller = controller + super.init(redirectURL: redirectURL, + state: state, + handler: handler, + logger: logger, + callback: callback) + controller.delegate = self + } + +} + +extension SafariSession: SFSafariViewControllerDelegate { + + func safariViewControllerDidFinish(_ controller: SFSafariViewController) { + TransactionStore.shared.cancel(self) + } + +} +#endif diff --git a/TracMobility/Pods/Auth0/Auth0/SessionCallbackTransaction.swift b/TracMobility/Pods/Auth0/Auth0/SessionCallbackTransaction.swift new file mode 100644 index 0000000..a0f4905 --- /dev/null +++ b/TracMobility/Pods/Auth0/Auth0/SessionCallbackTransaction.swift @@ -0,0 +1,46 @@ +// SessionCallbackTransaction.swift +// +// Copyright (c) 2020 Auth0 (http://auth0.com) +// +// 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 WEB_AUTH_PLATFORM +import Foundation + +class SessionCallbackTransaction: NSObject, AuthTransaction { + + var state: String? + var authSession: AuthSession? + let callback: (Bool) -> Void + + init(callback: @escaping (Bool) -> Void) { + self.callback = callback + } + + func cancel() { + self.callback(false) + } + + func handleUrl(_ url: URL) -> Bool { + self.callback(true) + return true + } + +} +#endif diff --git a/TracMobility/Pods/Auth0/Auth0/SessionTransaction.swift b/TracMobility/Pods/Auth0/Auth0/SessionTransaction.swift new file mode 100644 index 0000000..e642a07 --- /dev/null +++ b/TracMobility/Pods/Auth0/Auth0/SessionTransaction.swift @@ -0,0 +1,46 @@ +// SessionTransaction.swift +// +// Copyright (c) 2020 Auth0 (http://auth0.com) +// +// 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 WEB_AUTH_PLATFORM +import Foundation + +class SessionTransaction: BaseAuthTransaction { + + var authSession: AuthSession? + + override func cancel() { + super.cancel() + authSession?.cancel() + authSession = nil + } + + override func handleUrl(_ url: URL) -> Bool { + if super.handleUrl(url) { + authSession?.cancel() + authSession = nil + return true + } + return false + } + +} +#endif diff --git a/TracMobility/Pods/Auth0/Auth0/SilentSafariViewController.swift b/TracMobility/Pods/Auth0/Auth0/SilentSafariViewController.swift new file mode 100644 index 0000000..da60904 --- /dev/null +++ b/TracMobility/Pods/Auth0/Auth0/SilentSafariViewController.swift @@ -0,0 +1,49 @@ +// SilentSafariViewController.swift +// +// Copyright (c) 2017 Auth0 (http://auth0.com) +// +// 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(iOS) +import SafariServices + +class SilentSafariViewController: SFSafariViewController, SFSafariViewControllerDelegate { + + private let onResult: (Bool) -> Void + + required init(url URL: URL, callback: @escaping (Bool) -> Void) { + self.onResult = callback + + if #available(iOS 11.0, *) { + super.init(url: URL, configuration: SFSafariViewController.Configuration()) + } else { + super.init(url: URL, entersReaderIfAvailable: false) + } + + self.delegate = self + self.view.alpha = 0.05 // Apple does not allow invisible SafariViews, this is the threshold. + self.modalPresentationStyle = .overCurrentContext + } + + func safariViewController(_ controller: SFSafariViewController, didCompleteInitialLoad didLoadSuccessfully: Bool) { + controller.dismiss(animated: false) { self.onResult(didLoadSuccessfully) } + } + +} +#endif diff --git a/TracMobility/Pods/Auth0/Auth0/String+URLSafe.swift b/TracMobility/Pods/Auth0/Auth0/String+URLSafe.swift new file mode 100644 index 0000000..4619ad4 --- /dev/null +++ b/TracMobility/Pods/Auth0/Auth0/String+URLSafe.swift @@ -0,0 +1,36 @@ +// String+URLSafe.swift +// +// Copyright (c) 2019 Auth0 (http://auth0.com) +// +// 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 String { + func a0_decodeBase64URLSafe() -> Data? { + let lengthMultiple = 4 + let paddingLength = lengthMultiple - count % lengthMultiple + let padding = (paddingLength < lengthMultiple) ? String(repeating: "=", count: paddingLength) : "" + let base64EncodedString = self + .replacingOccurrences(of: "-", with: "+") + .replacingOccurrences(of: "_", with: "/") + + padding + return Data(base64Encoded: base64EncodedString) + } +} diff --git a/TracMobility/Pods/Auth0/Auth0/Telemetry.swift b/TracMobility/Pods/Auth0/Auth0/Telemetry.swift new file mode 100644 index 0000000..5ad04cc --- /dev/null +++ b/TracMobility/Pods/Auth0/Auth0/Telemetry.swift @@ -0,0 +1,157 @@ +// Telemetry.swift +// +// Copyright (c) 2016 Auth0 (http://auth0.com) +// +// 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 struct Telemetry { + + static let NameKey = "name" + static let VersionKey = "version" + static let WrappedVersion = "core" + static let EnvironmentKey = "env" + + static let NoVersion = "0.0.0" + static let LibraryName = "Auth0.swift" + + var enabled: Bool = true + + var info: String? + + var value: String? { + return self.enabled ? self.info : nil + } + + public init() { + self.info = Telemetry.generateValue() + } + + mutating func wrapped(inLibrary name: String, version: String) { + let info = Telemetry.versionInformation() + var env = Telemetry.generateEnviroment() + if let libVersion = info[Telemetry.VersionKey] as? String { + env[Telemetry.WrappedVersion] = libVersion + } else { + env[Telemetry.WrappedVersion] = Telemetry.NoVersion + } + let wrapped: [String: Any] = [ + Telemetry.NameKey: name, + Telemetry.VersionKey: version, + Telemetry.EnvironmentKey: env + ] + self.info = Telemetry.generateValue(fromInfo: wrapped) + } + + func addTelemetryHeader(request: NSMutableURLRequest) { + if let value = self.value { + request.setValue(value, forHTTPHeaderField: "Auth0-Client") + } else { + request.setValue(nil, forHTTPHeaderField: "Auth0-Client") + } + } + + func queryItemsWithTelemetry(queryItems: [URLQueryItem]) -> [URLQueryItem] { + var items = queryItems + if let value = self.value { + items.append(URLQueryItem(name: "auth0Client", value: value)) + } + return items + } + + static func versionInformation(bundle: Bundle = Bundle(for: Credentials.classForCoder())) -> [String: Any] { + let version = bundle.infoDictionary?["CFBundleShortVersionString"] as? String ?? Telemetry.NoVersion + let dict: [String: Any] = [ + Telemetry.NameKey: Telemetry.LibraryName, + Telemetry.VersionKey: version, + Telemetry.EnvironmentKey: Telemetry.generateEnviroment() + ] + return dict + } + + static func generateEnviroment() -> [String: String] { + let platform = Telemetry.osInfo() + let env = [ "swift": Telemetry.swiftVersion(), + platform.0: platform.1 + ] + return env + } + + static func generateValue(fromInfo info: [String: Any] = Telemetry.versionInformation()) -> String? { + let data = try? JSONSerialization.data(withJSONObject: info, options: []) + return data?.a0_encodeBase64URLSafe() + } + + static func swiftVersion() -> String { + #if swift(>=5.0) + return "5.x" + #elseif swift(>=4.0) + return "4.x" + #elseif swift(>=3.0) + return "3.x" + #endif + } + + static func osPlatform() -> String { + #if os(iOS) + return "iOS" + #elseif os(OSX) + return "macOS" + #elseif os(tvOS) + return "tvOS" + #elseif os(watchOS) + return "watchOS" + #else + return "unknown" + #endif + } + + static func osInfo() -> (String, String) { + return (self.osPlatform(), "\(ProcessInfo().operatingSystemVersion.majorVersion).\(ProcessInfo().operatingSystemVersion.minorVersion)") + } +} + +public protocol Trackable { + + var telemetry: Telemetry { get set } + +} + +extension Trackable { + /** + Avoid Auth0.swift sending its version on every request to Auth0 API. + By default we collect our libraries and SDKs versions to help us during support and evaluate usage. + + - parameter enabled: if Auth0.swift should send it's version on every request. + */ + public mutating func tracking(enabled: Bool) { + self.telemetry.enabled = enabled + } + + /** + Send the library/framework, that has Auth0.swift as dependency, when sending telemetry information + + - parameter name: name of library or framework that uses Auth0.swift + - parameter version: version of library or framework + */ + public mutating func using(inLibrary name: String, version: String) { + self.telemetry.wrapped(inLibrary: name, version: version) + } +} diff --git a/TracMobility/Pods/Auth0/Auth0/TransactionStore.swift b/TracMobility/Pods/Auth0/Auth0/TransactionStore.swift new file mode 100644 index 0000000..f71e494 --- /dev/null +++ b/TracMobility/Pods/Auth0/Auth0/TransactionStore.swift @@ -0,0 +1,58 @@ +// TransactionStore.swift +// +// Copyright (c) 2016 Auth0 (http://auth0.com) +// +// 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 WEB_AUTH_PLATFORM +import Foundation + +/// Keeps track of current Auth Transaction +class TransactionStore { + + static let shared = TransactionStore() + + private(set) var current: AuthTransaction? + + func resume(_ url: URL) -> Bool { + let resumed = self.current?.resume(url) ?? false + if resumed { + self.current = nil + } + return resumed + } + + func store(_ transaction: AuthTransaction) { + self.current?.cancel() + self.current = transaction + } + + func cancel(_ transaction: AuthTransaction) { + transaction.cancel() + if self.current?.state == transaction.state { + self.current = nil + } + } + + func clear() { + self.current = nil + } + +} +#endif diff --git a/TracMobility/Pods/Auth0/Auth0/UIApplication+Shared.swift b/TracMobility/Pods/Auth0/Auth0/UIApplication+Shared.swift new file mode 100644 index 0000000..f642215 --- /dev/null +++ b/TracMobility/Pods/Auth0/Auth0/UIApplication+Shared.swift @@ -0,0 +1,33 @@ +// UIApplication+Shared.swift +// +// Copyright (c) 2020 Auth0 (http://auth0.com) +// +// 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(iOS) +import UIKit + +extension UIApplication { + + static func shared() -> UIApplication? { + return UIApplication.perform(NSSelectorFromString("sharedApplication"))?.takeUnretainedValue() as? UIApplication + } + +} +#endif diff --git a/TracMobility/Pods/Auth0/Auth0/UserInfo.swift b/TracMobility/Pods/Auth0/Auth0/UserInfo.swift new file mode 100644 index 0000000..7990c05 --- /dev/null +++ b/TracMobility/Pods/Auth0/Auth0/UserInfo.swift @@ -0,0 +1,139 @@ +// UserInfo.swift +// +// Copyright (c) 2017 Auth0 (http://auth0.com) +// +// 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 + +/// OIDC Standard Claims user information +/// - note: [Claims](https://auth0.com/docs/protocols/oidc#claims) +@objc(A0UserInfo) +@objcMembers public class UserInfo: NSObject, JSONObjectPayload { + + public static let publicClaims = ["sub", "name", "given_name", "family_name", "middle_name", "nickname", "preferred_username", "profile", "picture", "website", "email", "email_verified", "gender", "birthdate", "zoneinfo", "locale", "phone_number", "phone_number_verified", "address", "updated_at"] + + public let sub: String + + public let name: String? + public let givenName: String? + public let familyName: String? + public let middleName: String? + public let nickname: String? + public let preferredUsername: String? + + public let profile: URL? + public let picture: URL? + public let website: URL? + + public let email: String? + public let emailVerified: Bool? + + public let gender: String? + public let birthdate: String? + + public let zoneinfo: TimeZone? + public let locale: Locale? + + public let phoneNumber: String? + public let phoneNumberVerified: Bool? + + public let address: [String: String]? + public let updatedAt: Date? + + public let customClaims: [String: Any]? + + required public init(sub: String, name: String?, givenName: String?, familyName: String?, middleName: String?, nickname: String?, preferredUsername: String?, profile: URL?, picture: URL?, website: URL?, email: String?, emailVerified: Bool?, gender: String?, birthdate: String?, zoneinfo: TimeZone?, locale: Locale?, phoneNumber: String?, phoneNumberVerified: Bool?, address: [String: String]?, updatedAt: Date?, customClaims: [String: Any]?) { + self.sub = sub + + self.name = name + self.givenName = givenName + self.familyName = familyName + self.middleName = middleName + self.nickname = nickname + self.preferredUsername = preferredUsername + + self.profile = profile + self.picture = picture + self.website = website + + self.email = email + self.emailVerified = emailVerified + + self.gender = gender + self.birthdate = birthdate + + self.zoneinfo = zoneinfo + self.locale = locale + + self.phoneNumber = phoneNumber + self.phoneNumberVerified = phoneNumberVerified + self.address = address + + self.updatedAt = updatedAt + + self.customClaims = customClaims + } + + convenience required public init?(json: [String: Any]) { + guard let sub = json["sub"] as? String else { return nil } + + let name = json["name"] as? String + let givenName = json["given_name"] as? String + let familyName = json["family_name"] as? String + let middleName = json["middle_name"] as? String + let nickname = json["nickname"] as? String + let preferredUsername = json["preferred_username"] as? String + + var profile: URL? + if let profileURL = json["profile"] as? String { profile = URL(string: profileURL) } + + var picture: URL? + if let pictureURL = json["picture"] as? String { picture = URL(string: pictureURL) } + + var website: URL? + if let websiteURL = json["website"] as? String { website = URL(string: websiteURL) } + + let email = json["email"] as? String + let emailVerified = json["email_verified"] as? Bool + + let gender = json["gender"] as? String + let birthdate = json["birthdate"] as? String + + var zoneinfo: TimeZone? + if let timeZone = json["zoneinfo"] as? String { zoneinfo = TimeZone(identifier: timeZone) } + + var locale: Locale? + if let localeInfo = json["locale"] as? String { locale = Locale(identifier: localeInfo) } + + let phoneNumber = json["phone_number"] as? String + let phoneNumberVerified = json["phone_number_verified"] as? Bool + let address = json["address"] as? [String: String] + + var updatedAt: Date? + if let dateString = json["updated_at"] as? String { + updatedAt = date(from: dateString) + } + + var customClaims = json + UserInfo.publicClaims.forEach { customClaims.removeValue(forKey: $0) } + + self.init(sub: sub, name: name, givenName: givenName, familyName: familyName, middleName: middleName, nickname: nickname, preferredUsername: preferredUsername, profile: profile, picture: picture, website: website, email: email, emailVerified: emailVerified, gender: gender, birthdate: birthdate, zoneinfo: zoneinfo, locale: locale, phoneNumber: phoneNumber, phoneNumberVerified: phoneNumberVerified, address: address, updatedAt: updatedAt, customClaims: customClaims) + } +} diff --git a/TracMobility/Pods/Auth0/Auth0/UserPatchAttributes.swift b/TracMobility/Pods/Auth0/Auth0/UserPatchAttributes.swift new file mode 100644 index 0000000..b0d6619 --- /dev/null +++ b/TracMobility/Pods/Auth0/Auth0/UserPatchAttributes.swift @@ -0,0 +1,174 @@ +// UserPatchAttributes.swift +// +// Copyright (c) 2016 Auth0 (http://auth0.com) +// +// 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 + +/// Atributes of the user allowed to update using `patch()` method of `Users` +public class UserPatchAttributes { + + private(set) var dictionary: [String: Any] + + /** + Creates a new attributes + + - parameter dictionary: default attribute values + + - returns: new attributes + */ + public init(dictionary: [String: Any] = [:]) { + self.dictionary = dictionary + } + + /** + Mark/Unmark a user as blocked + + - parameter blocked: if the user is blocked + + - returns: itself + */ + public func blocked(_ blocked: Bool) -> UserPatchAttributes { + dictionary["blocked"] = blocked + return self + } + + /** + Changes the email of the user + + - parameter email: new email for the user + - parameter verified: if the email is verified + - parameter verify: if the user should verify the email + - parameter connection: name of the connection + - parameter clientId: Auth0 clientId + + - returns: itself + */ + public func email(_ email: String, verified: Bool? = nil, verify: Bool? = nil, connection: String, clientId: String) -> UserPatchAttributes { + dictionary["email"] = email + dictionary["verify_email"] = verify + dictionary["email_verified"] = verified + dictionary["connection"] = connection + dictionary["client_id"] = clientId + return self + } + + /** + Sets the verified status of the email + + - parameter verified: if the email is verified or not + - parameter connection: connection name + + - returns: itself + */ + public func emailVerified(_ verified: Bool, connection: String) -> UserPatchAttributes { + dictionary["email_verified"] = verified + dictionary["connection"] = connection + return self + } + + /** + Changes the phone number of the user (SMS connection only) + + - parameter phoneNumber: new phone number for the user + - parameter verified: if the phone number is verified + - parameter verify: if the user should verify the phone number + - parameter connection: name of the connection + - parameter clientId: Auth0 clientId + + - returns: itself + */ + public func phoneNumber(_ phoneNumber: String, verified: Bool? = nil, verify: Bool? = nil, connection: String, clientId: String) -> UserPatchAttributes { + dictionary["phone_number"] = phoneNumber + dictionary["verify_phone_number"] = verify + dictionary["phone_verified"] = verified + dictionary["connection"] = connection + dictionary["client_id"] = clientId + return self + } + + /** + Sets the verified status of the phone number + + - parameter verified: if the phone number is verified or not + - parameter connection: connection name + + - returns: itself + */ + public func phoneVerified(_ verified: Bool, connection: String) -> UserPatchAttributes { + dictionary["phone_verified"] = verified + dictionary["connection"] = connection + return self + } + + /** + Changes the user's password + + - parameter password: new password for the user + - parameter verify: if the password should be verified by the user + - parameter connection: name of the connection + + - returns: itself + */ + public func password(_ password: String, verify: Bool? = nil, connection: String) -> UserPatchAttributes { + dictionary["password"] = password + dictionary["connection"] = connection + dictionary["verify_password"] = verify + return self + } + + /** + Changes the username + + - parameter username: new username + - parameter connection: name of the connection + + - returns: itself + */ + public func username(_ username: String, connection: String) -> UserPatchAttributes { + dictionary["username"] = username + dictionary["connection"] = connection + return self + } + + /** + Updates user metadata + + - parameter metadata: new user metadata values + + - returns: itself + */ + public func userMetadata(_ metadata: [String: Any]) -> UserPatchAttributes { + dictionary["user_metadata"] = metadata + return self + } + + /** + Updates app metadata + + - parameter metadata: new app metadata values + + - returns: itself + */ + public func appMetadata(_ metadata: [String: Any]) -> UserPatchAttributes { + dictionary["app_metadata"] = metadata + return self + } +} diff --git a/TracMobility/Pods/Auth0/Auth0/Users.swift b/TracMobility/Pods/Auth0/Auth0/Users.swift new file mode 100644 index 0000000..9cdcc8b --- /dev/null +++ b/TracMobility/Pods/Auth0/Auth0/Users.swift @@ -0,0 +1,331 @@ +// Users.swift +// +// Copyright (c) 2016 Auth0 (http://auth0.com) +// +// 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 + +/** + Users endpoints of Auth0 Management API v2 + - seeAlso: [Auth0 Management API docs](https://auth0.com/docs/api/management/v2#!/Users) + */ +public protocol Users: Trackable, Loggable { + + var token: String { get } + var url: URL { get } + + /** + Fetch a user using the it's identifier. + + By default it gets all user's attributes: + + ``` + Auth0 + .users(token: token, domain: "samples.auth0.com") + .get(userId) + .start { print($0) } + ``` + + but you can select which attributes you want: + + ``` + Auth0 + .users(token: token, domain: "samples.auth0.com") + .get(userId, fields: ["email", "user_id"]) + .start { print($0) } + ``` + + or even exclude some attributes: + + ``` + Auth0 + .users(token token, domain: "samples.auth0.com") + .get(userId, fields: ["identities", "app_metadata"], include: false) + .start { print($0) } + ``` + + - parameter identifier: id of the user + - parameter fields: list of user's field names that will be included/excluded in the response. By default all will be retrieved + - parameter include: flag that indicates that only the names in 'fields' should be included or excluded in the response. By default it will include them + + - returns: a request that will yield a user + - note: [Auth0 Management API docs](https://auth0.com/docs/api/management/v2#!/Users/get_users_by_id) + - important: The token must have the scope `read:users` scope + */ + func get(_ identifier: String, fields: [String], include: Bool) -> Request + + /** + Updates a user's root values (those who are allowed to be updated). + + For example if you need to change `email`: + + ``` + let attributes = UserPatchAttributes() + .email("newmail@auth0.com", connection: "Username-Password-Authentication", clientId: "MyClientId") + ``` + + or `user_metadata`: + + ``` + let attributes = UserPatchAttributes() + .userMetadata(["first_name": "John", "last_name": "Appleseed"]) + + ``` + + and you can even chain several changes together: + + ``` + let attributes = UserPatchAttributes() + .email("support@auth0.com", verify: true, connection: "Username-Password-Authentication", clientId: "MyClientId") + .userMetadata(["first_name": "Juan", "last_name": "AuthZero"]) + .appMetadata(["role": "admin"]) + ``` + + then just pass the `UserPatchAttributes` to the patch method like: + + ``` + Auth0 + .users(token: token, domain: "samples.auth0.com") + .patch(userId, attributes: attributes) + .start { print($0) } + ``` + + - parameter identifier: id of the user to update + - parameter attributes: root attributes to be updated + + - returns: a request + - seeAlso: UserPatchAttributes + - note: [Auth0 Management API docs](https://auth0.com/docs/api/management/v2#!/Users/patch_users_by_id) + - important: The token must have one of the following scopes: `update:users`, `update:users_app_metadata` + */ + func patch(_ identifier: String, attributes: UserPatchAttributes) -> Request + + /** + Updates only the user's userMetadata field + + + ``` + Auth0 + .users(token: token, domain: "samples.auth0.com") + .patch(userId, userMetadata: ["first_name": "Juan", "last_name": "AuthZero"]) + .start { print($0) } + ``` + + - parameter identifier: id of the user + - parameter userMetadata: metadata to update + + - returns: a request to patch user_metadata + - note: [Auth0 Management API docs](https://auth0.com/docs/api/management/v2#!/Users/patch_users_by_id) + - important: The token must have one of the following scopes: `update:users`, `update:users_app_metadata` + */ + func patch(_ identifier: String, userMetadata: [String: Any]) -> Request + + /** + Links a user given it's identifier with a secondary user identifier it's token. + After this request the primary user will hold another identity in it's 'identities' attribute which will represent the secondary user. + + ``` + Auth0 + .users(token: token, domain: "samples.auth0.com") + .link(userId, withOtherUserToken: anotherToken) + .start { print($0) } + ``` + + - parameter identifier: id of the primary user who will be linked against a secondary one + - parameter token: token of the secondary user to link to + + - returns: a request to link two users + - note: [Auth0 Management API docs](https://auth0.com/docs/api/management/v2#!/Users/post_identities) + - seeAlso: [Link Accounts Guide](https://auth0.com/docs/link-accounts) + - important: The token must have the following scope `update:current_user_identities` + */ + func link(_ identifier: String, withOtherUserToken token: String) -> Request<[ManagementObject], ManagementError> + + /** + Links a user given it's identifier with a secondary user identified by it's id, provider and connection identifier. + + ``` + Auth0 + .users(token: token, domain: "samples.auth0.com") + .link(userId, userId: anotherUserId, provider: "auth0", connectionId: "AConnectionID") + .start { print($0) } + ``` + + - parameter identifier: id of the primary user who will be linked against a secondary one + - parameter userId: id of the secondary user who will be linked + - parameter provider: name of the provider of the secondary user. e.g. 'auth0' for Database connections + - parameter connectionId: id of the connection of the secondary user. + + - returns: a request to link two users + - note: [Auth0 Management API docs](https://auth0.com/docs/api/management/v2#!/Users/post_identities) + - seeAlso: [Link Accounts Guide](https://auth0.com/docs/link-accounts) + - important: The token must have the following scope `update:users` + */ + func link(_ identifier: String, withUser userId: String, provider: String, connectionId: String?) -> Request<[ManagementObject], ManagementError> + + /** + Removes one identity from a user. + + ``` + Auth0 + .users(token: token, domain: "samples.auth0.com") + .unlink(identityId: "an_idenitity_id", provider: "facebook", fromUserId: "a_user_identifier") + .start { print($0) } + ``` + + - parameter identityId: identifier of the identity to remove + - parameter provider: name of the provider of the identity + - parameter identifier: id of the user who owns the identity + + - returns: a request to remove an identity + - note: [Auth0 Management API docs](https://auth0.com/docs/api/management/v2#!/Users/delete_provider_by_user_id) + - seeAlso: [Link Accounts Guide](https://auth0.com/docs/link-accounts) + - important: The token must have the following scope `update:users` + */ + func unlink(identityId: String, provider: String, fromUserId identifier: String) -> Request<[ManagementObject], ManagementError> +} + +extension Users { + + /** + Fetch a user using the it's identifier. + + By default it gets all user's attributes: + + ``` + Auth0 + .users(token: token, domain: "samples.auth0.com") + .get(userId) + .start { print($0) } + ``` + + but you can select which attributes you want: + + ``` + Auth0 + .users(token: token, domain: "samples.auth0.com") + .get(userId, fields: ["email", "user_id"]) + .start { print($0) } + ``` + + or even exclude some attributes: + + ``` + Auth0 + .users(token: token, domain: "samples.auth0.com") + .get(userId, fields: ["identities", "app_metadata"], include: false) + .start { print($0) } + ``` + + - parameter identifier: id of the user + - parameter fields: list of user's field names that will be included/excluded in the response. By default all will be retrieved + - parameter include: flag that indicates that only the names in 'fields' should be included or excluded in the response. By default it will include them + + - returns: a request that will yield a user + - note: [Auth0 Management API docs](https://auth0.com/docs/api/management/v2#!/Users/get_users_by_id) + - important: The token must have the scope `read:users` scope + */ + public func get(_ identifier: String, fields: [String] = [], include: Bool = true) -> Request { + return self.get(identifier, fields: fields, include: include) + } + + /** + Links a user given it's identifier with a secondary user identified by it's id, provider and connection identifier. + + ``` + Auth0 + .users(token: token, domain: "samples.auth0.com") + .link(userId, userId: anotherUserId, provider: "auth0", connectionId: "AConnectionID") + .start { print($0) } + ``` + + - parameter identifier: id of the primary user who will be linked against a secondary one + - parameter userId: id of the secondary user who will be linked + - parameter provider: name of the provider of the secondary user. e.g. 'auth0' for Database connections + - parameter connectionId: id of the connection of the secondary user. + + - returns: a request to link two users + - note: [Auth0 Management API docs](https://auth0.com/docs/api/management/v2#!/Users/post_identities) + - seeAlso: [Link Accounts Guide](https://auth0.com/docs/link-accounts) + - important: The token must have the following scope `update:users` + */ + public func link(_ identifier: String, withUser userId: String, provider: String, connectionId: String? = nil) -> Request<[ManagementObject], ManagementError> { + return self.link(identifier, withUser: userId, provider: provider, connectionId: connectionId) + } +} + +extension Management: Users { + + func get(_ identifier: String, fields: [String], include: Bool) -> Request { + let userPath = "/api/v2/users/\(identifier)" + var component = components(baseURL: self.url as URL, path: userPath) + let value = fields.joined(separator: ",") + if !value.isEmpty { + component.queryItems = [ + URLQueryItem(name: "fields", value: value), + URLQueryItem(name: "include_fields", value: String(include)) + ] + } + + return Request(session: self.session, url: component.url!, method: "GET", handle: self.managementObject, headers: self.defaultHeaders, logger: self.logger, telemetry: self.telemetry) + } + + func patch(_ identifier: String, attributes: UserPatchAttributes) -> Request { + let userPath = "/api/v2/users/\(identifier)" + let component = components(baseURL: self.url as URL, path: userPath) + + return Request(session: self.session, url: component.url!, method: "PATCH", handle: self.managementObject, payload: attributes.dictionary, headers: self.defaultHeaders, logger: self.logger, telemetry: self.telemetry) + } + + func patch(_ identifier: String, userMetadata: [String: Any]) -> Request { + let attributes = UserPatchAttributes().userMetadata(userMetadata) + return patch(identifier, attributes: attributes) + } + + func link(_ identifier: String, withOtherUserToken token: String) -> Request<[ManagementObject], ManagementError> { + return link(identifier, payload: ["link_with": token]) + } + + func link(_ identifier: String, withUser userId: String, provider: String, connectionId: String? = nil) -> Request<[ManagementObject], ManagementError> { + var payload = [ + "user_id": userId, + "provider": provider + ] + payload["connection_id"] = connectionId + return link(identifier, payload: payload) + } + + private func link(_ identifier: String, payload: [String: Any]) -> Request<[ManagementObject], ManagementError> { + let identitiesPath = "/api/v2/users/\(identifier)/identities" + let url = components(baseURL: self.url as URL, path: identitiesPath).url! + return Request(session: self.session, url: url, method: "POST", handle: self.managementObjects, payload: payload, headers: self.defaultHeaders, logger: self.logger, telemetry: self.telemetry) + } + + func unlink(identityId: String, provider: String, fromUserId identifier: String) -> Request<[ManagementObject], ManagementError> { + let identityPath = "/api/v2/users/\(identifier)/identities/\(provider)/\(identityId)" + let url = components(baseURL: self.url as URL, path: identityPath).url! + return Request(session: self.session, url: url, method: "DELETE", handle: self.managementObjects, headers: self.defaultHeaders, logger: self.logger, telemetry: self.telemetry) + } +} + +private func components(baseURL: URL, path: String) -> URLComponents { + let url = baseURL.appendingPathComponent(path) + return URLComponents(url: url, resolvingAgainstBaseURL: true)! +} diff --git a/TracMobility/Pods/Auth0/Auth0/WebAuthError.swift b/TracMobility/Pods/Auth0/Auth0/WebAuthError.swift new file mode 100644 index 0000000..5ad9916 --- /dev/null +++ b/TracMobility/Pods/Auth0/Auth0/WebAuthError.swift @@ -0,0 +1,98 @@ +// WebAuthError.swift +// +// Copyright (c) 2016 Auth0 (http://auth0.com) +// +// 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 WEB_AUTH_PLATFORM +import Foundation + +/** + List of possible web-based authentication errors + + - NoBundleIdentifierFound: Cannot get the App's Bundle Identifier to use for redirect_uri. + - CannotDismissWebAuthController: When trying to dismiss WebAuth controller, no presenter controller could be found. + - UserCancelled: User cancelled the web-based authentication, e.g. tapped the "Done" button in SFSafariViewController + - PKCENotAllowed: PKCE for the supplied Auth0 ClientId was not allowed. You need to set the `Token Endpoint Authentication Method` to `None` in your Auth0 Dashboard + - noNonceProvided: A nonce value must be provided to use the response option of id_token + - invalidIdTokenNonce: Failed to match token nonce with request nonce + - missingAccessToken: access_token missing in response + */ +public enum WebAuthError: CustomNSError { + case noBundleIdentifierFound + case cannotDismissWebAuthController + case userCancelled + case pkceNotAllowed(String) + case noNonceProvided + case missingResponseParam(String) + case invalidIdTokenNonce // TODO: Remove on the next major + case missingAccessToken + case unknownError + + static let genericFoundationCode = 1 + static let cancelledFoundationCode = 0 + + public static let infoKey = "com.auth0.webauth.error.info" + public static let errorDomain: String = "com.auth0.webauth" + + public var errorCode: Int { + switch self { + case .userCancelled: + return WebAuthError.cancelledFoundationCode + default: + return WebAuthError.genericFoundationCode + } + } + + public var errorUserInfo: [String: Any] { + switch self { + case .userCancelled: + return [ + NSLocalizedDescriptionKey: "User Cancelled Web Authentication", + WebAuthError.infoKey: self + ] + case .pkceNotAllowed(let message): + return [ + NSLocalizedDescriptionKey: message, + WebAuthError.infoKey: self + ] + case .noNonceProvided: + return [ + NSLocalizedDescriptionKey: "A nonce value must be supplied when response_type includes id_token in order to prevent replay attacks", + WebAuthError.infoKey: self + ] + case .invalidIdTokenNonce: + return [ + NSLocalizedDescriptionKey: "Could not validate the id_token", + WebAuthError.infoKey: self + ] + case .missingAccessToken: + return [ + NSLocalizedDescriptionKey: "Could not validate the token", + WebAuthError.infoKey: self + ] + default: + return [ + NSLocalizedDescriptionKey: "Failed to perform webAuth", + WebAuthError.infoKey: self + ] + } + } +} +#endif diff --git a/TracMobility/Pods/Auth0/Auth0/WebAuthenticatable.swift b/TracMobility/Pods/Auth0/Auth0/WebAuthenticatable.swift new file mode 100644 index 0000000..2955748 --- /dev/null +++ b/TracMobility/Pods/Auth0/Auth0/WebAuthenticatable.swift @@ -0,0 +1,256 @@ +// WebAuthenticatable.swift +// +// Copyright (c) 2016 Auth0 (http://auth0.com) +// +// 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 WEB_AUTH_PLATFORM +import Foundation + +/** + Auth0 component for authenticating with web-based flow + + ``` + Auth0.webAuth() + ``` + + Auth0 domain is loaded from the file `Auth0.plist` in your main bundle with the following content: + + ``` + + + + + ClientId + {YOUR_CLIENT_ID} + Domain + {YOUR_DOMAIN} + + + ``` + + - parameter bundle: bundle used to locate the `Auth0.plist` file. By default is the main bundle + + - returns: Auth0 WebAuth component + - important: Calling this method without a valid `Auth0.plist` will crash your application + */ +public func webAuth(bundle: Bundle = Bundle.main) -> WebAuth { + let values = plistValues(bundle: bundle)! + return webAuth(clientId: values.clientId, domain: values.domain) +} + +/** + Auth0 component for authenticating with web-based flow + + ``` + Auth0.webAuth(clientId: clientId, domain: "samples.auth0.com") + ``` + + - parameter clientId: id of your Auth0 client + - parameter domain: name of your Auth0 domain + + - returns: Auth0 WebAuth component + */ +public func webAuth(clientId: String, domain: String) -> WebAuth { + return Auth0WebAuth(clientId: clientId, url: .a0_url(domain)) +} + +/// WebAuth Authentication using Auth0 +public protocol WebAuthenticatable: Trackable, Loggable { + var clientId: String { get } + var url: URL { get } + var telemetry: Telemetry { get set } + + /** + For redirect url instead of a custom scheme it will use `https` and Universal Links. + + Before enabling this flag you'll need to configure Universal Links + + - returns: the same WebAuth instance to allow method chaining + */ + func useUniversalLink() -> Self + + /** + Specify a connection name to be used to authenticate. + + By default no connection is specified, so the hosted login page will be displayed + + - parameter connection: name of the connection to use + + - returns: the same WebAuth instance to allow method chaining + */ + func connection(_ connection: String) -> Self + + /** + Scopes that will be requested during auth + + - parameter scope: a scope value like: `openid email` + + - returns: the same WebAuth instance to allow method chaining + */ + func scope(_ scope: String) -> Self + + /** + Provider scopes for oauth2/social connections. e.g. Facebook, Google etc + + - parameter connectionScope: oauth2/social comma separated scope list: `user_friends,email` + + - returns: the same WebAuth instance to allow method chaining + */ + func connectionScope(_ connectionScope: String) -> Self + + /** + State value that will be echoed after authentication + in order to check that the response is from your request and not other. + + By default a random value is used. + + - parameter state: a state value to send with the auth request + + - returns: the same WebAuth instance to allow method chaining + */ + func state(_ state: String) -> Self + + /** + Send additional parameters for authentication. + + - parameter parameters: additional auth parameters + + - returns: the same WebAuth instance to allow method chaining + */ + func parameters(_ parameters: [String: String]) -> Self + + /// Setup the response types to be used for authentcation + /// + /// - Parameter response: Array of ResponseOptions + /// - Returns: the same WebAuth instance to allow method chaining + func responseType(_ response: [ResponseType]) -> Self + + /// Specify a redirect url to be used instead of a custom scheme + /// + /// - Parameter redirectURL: custom redirect url + /// - Returns: the same WebAuth instance to allow method chaining + func redirectURL(_ redirectURL: URL) -> Self + + /// Add `nonce` parameter for authentication, this is a requirement + /// when response type `.idToken` is specified. + /// + /// - Parameter nonce: nonce string + /// - Returns: the same WebAuth instance to allow method chaining + func nonce(_ nonce: String) -> Self + + /// Audience name of the API that your application will call using the `access_token` returned after Auth. + /// This value must match the one defined in Auth0 Dashboard [APIs Section](https://manage.auth0.com/#/apis) + /// + /// - Parameter audience: an audience value like: `https://someapi.com/api` + /// - Returns: the same WebAuth instance to allow method chaining + func audience(_ audience: String) -> Self + + /// Specify a custom issuer for ID Token validation. + /// This value will be used instead of the Auth0 domain. + /// + /// - Parameter issuer: custom issuer value like: `https://example.com/` + /// - Returns: the same WebAuth instance to allow method chaining + func issuer(_ issuer: String) -> Self + + /// Add a leeway amount for ID Token validation. + /// This value represents the clock skew for the validation of date claims e.g. `exp`. + /// + /// - Parameter leeway: number of milliseconds. Defaults to `60000` (1 minute). + /// - Returns: the same WebAuth instance to allow method chaining + func leeway(_ leeway: Int) -> Self + + /// Add `max_age` parameter for authentication, only when response type `.idToken` is specified. + /// Sending this parameter will require the presence of the `auth_time` claim in the ID Token. + /// + /// - Parameter maxAge: number of milliseconds + /// - Returns: the same WebAuth instance to allow method chaining + func maxAge(_ maxAge: Int) -> Self + + #if swift(>=5.1) + /** + Disable Single Sign On (SSO) on iOS 13+ and macOS. + Has no effect on older versions of iOS. + + - returns: the same WebAuth instance to allow method chaining + */ + func useEphemeralSession() -> Self + #endif + + /** + Change the default grant used for auth from `code` (w/PKCE) to `token` (implicit grant) + + - returns: the same WebAuth instance to allow method chaining + */ + @available(*, deprecated, message: "use response([.token])") + func usingImplicitGrant() -> Self + + /** + Starts the WebAuth flow by modally presenting a ViewController in the top-most controller. + + ``` + Auth0 + .webAuth(clientId: clientId, domain: "samples.auth0.com") + .start { result in + print(result) + } + ``` + + Then from `AppDelegate` we just need to resume the WebAuth Auth like this + + ``` + func application(app: UIApplication, openURL url: NSURL, options: [String : Any]) -> Bool { + return Auth0.resumeAuth(url, options: options) + } + ``` + + Any on going WebAuth Auth session will be automatically cancelled when starting a new one, + and it's corresponding callback with be called with a failure result of `Authentication.Error.Cancelled` + + - parameter callback: callback called with the result of the WebAuth flow + */ + func start(_ callback: @escaping (Result) -> Void) + + /** + Removes Auth0 session and optionally remove the Identity Provider session. + - seeAlso: [Auth0 Logout docs](https://auth0.com/docs/logout) + + For iOS 11+ you will need to ensure that the **Callback URL** has been added + to the **Allowed Logout URLs** section of your application in the [Auth0 Dashboard](https://manage.auth0.com/#/applications/). + + ``` + Auth0 + .webAuth() + .clearSession { print($0) } + ``` + + Remove Auth0 session and remove the IdP session. + + ``` + Auth0 + .webAuth() + .clearSession(federated: true) { print($0) } + ``` + + - parameter federated: Bool to remove the IdP session + - parameter callback: callback called with bool outcome of the call + */ + func clearSession(federated: Bool, callback: @escaping (Bool) -> Void) +} +#endif diff --git a/TracMobility/Pods/Auth0/Auth0/_ObjectiveAuthenticationAPI.swift b/TracMobility/Pods/Auth0/Auth0/_ObjectiveAuthenticationAPI.swift new file mode 100644 index 0000000..54a5b3a --- /dev/null +++ b/TracMobility/Pods/Auth0/Auth0/_ObjectiveAuthenticationAPI.swift @@ -0,0 +1,187 @@ +// _ObjectiveAuthenticationAPI.swift +// +// Copyright (c) 2016 Auth0 (http://auth0.com) +// +// 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 + +@objc(A0AuthenticationAPI) +// swiftlint:disable:next type_name +public class _ObjectiveAuthenticationAPI: NSObject { + + private var authentication: Authentication + + @objc public override init () { + self.authentication = Auth0.authentication() + } + + @objc public convenience init(clientId: String, url: URL) { + self.init(clientId: clientId, url: url, session: .shared) + } + + @objc public init(clientId: String, url: URL, session: URLSession) { + self.authentication = Auth0Authentication(clientId: clientId, url: url, session: session) + } + + @objc(loginWithUsernameOrEmail:password:connection:scope:parameters:callback:) + // swiftlint:disable:next function_parameter_count + public func login(withUsernameOrEmail username: String, password: String, connection: String, scope: String, parameters: [String: Any]?, callback: @escaping (NSError?, Credentials?) -> Void) { + self.authentication + .login(usernameOrEmail: username, password: password, connection: connection, scope: scope, parameters: parameters ?? [:]) + .start(handleResult(callback: callback)) + } + + @objc(loginWithUsernameOrEmail:password:realm:audience:scope:parameters:callback:) + // swiftlint:disable:next function_parameter_count + public func login(withUsernameOrEmail username: String, password: String, realm: String, audience: String, scope: String, parameters: [String: Any]?, callback: @escaping (NSError?, Credentials?) -> Void) { + self.authentication + .login(usernameOrEmail: username, password: password, realm: realm, audience: audience, scope: scope, parameters: parameters ?? [:]) + .start(handleResult(callback: callback)) + } + + @objc(createUserWithEmail:username:password:connection:userMetadata:callback:) + // swiftlint:disable:next function_parameter_count + public func createUser(withEmail email: String, username: String?, password: String, connection: String, userMetadata: [String: Any]?, callback: @escaping (NSError?, [String: Any]?) -> Void) { + self.authentication + .createUser(email: email, username: username, password: password, connection: connection, userMetadata: userMetadata) + .start { result in + switch result { + case .success(let user): + var info: [String: Any] = [ + "email": user.email, + "verified": user.verified + ] + if let username = user.username { + info["username"] = username + } + callback(nil, info) + case .failure(let cause): + callback(cause as NSError, nil) + } + } + } + +#if os(iOS) // TODO: Remove on next major (this method shouldn't be here) + @objc(resumeAuthWithURL:options:) + public static func resume(_ url: URL, options: [A0URLOptionsKey: Any]) -> Bool { + return resumeAuth(url, options: options) + } +#endif + + @objc(renewWithRefreshToken:scope:callback:) + public func renew(WithRefreshToken refreshToken: String, scope: String, callback: @escaping (NSError?, Credentials?) -> Void) { + self.authentication + .renew(withRefreshToken: refreshToken, scope: scope) + .start(handleResult(callback: callback)) + } + + @objc(resetPasswordWithEmail:connection:callback:) + public func resetPassword(withEmail email: String, connection: String, callback: @escaping (NSError?) -> Void) { + self.authentication + .resetPassword(email: email, connection: connection) + .start(handleResult(callback: callback)) + } + + @objc(signUpWithEmail:username:password:connection:userMetadata:scope:parameters:callback:) + // swiftlint:disable:next function_parameter_count + public func signUp(withEmail email: String, username: String?, password: String, connection: String, userMetadata: [String: Any]?, scope: String, parameters: [String: Any]?, callback: @escaping (NSError?, Credentials?) -> Void) { + self.authentication + .signUp(email: email, username: username, password: password, connection: connection, userMetadata: userMetadata, scope: scope, parameters: parameters ?? [:]) + .start(handleResult(callback: callback)) + } + + @objc(startPasswordlessWithCodeToEmail:connection:callback:) + public func startPasswordlessCode(email: String, connection: String, callback: @escaping (NSError?) -> Void) { + self.authentication + .startPasswordless(email: email, type: .Code, connection: connection) + .start(handleResult(callback: callback)) + } + + @objc(startPasswordlessWithLinkToEmail:connection:callback:) + public func startPasswordlessLink(email: String, connection: String, callback: @escaping (NSError?) -> Void) { + self.authentication + .startPasswordless(email: email, type: .iOSLink, connection: connection) + .start(handleResult(callback: callback)) + } + + @objc(startPasswordlessWithCodeToPhoneNumber:connection:callback:) + public func startPasswordlessCode(phoneNumber: String, connection: String, callback: @escaping (NSError?) -> Void) { + self.authentication + .startPasswordless(phoneNumber: phoneNumber, type: .Code, connection: connection) + .start(handleResult(callback: callback)) + } + + @objc(startPasswordlessWithLinkToPhoneNumber:connection:callback:) + public func startPasswordlessLink(phoneNumber: String, connection: String, callback: @escaping (NSError?) -> Void) { + self.authentication + .startPasswordless(phoneNumber: phoneNumber, type: .iOSLink, connection: connection) + .start(handleResult(callback: callback)) + } + + @objc(tokenInfoFromToken:callback:) + @available(*, deprecated, message: "see userInfoWithToken:callback:") + public func tokenInfo(fromToken token: String, callback: @escaping (NSError?, Profile?) -> Void) { + self.authentication.tokenInfo(token: token).start(handleResult(callback: callback)) + } + + @objc(userInfoWithToken:callback:) + public func userInfo(withToken token: String, callback: @escaping (NSError?, Profile?) -> Void) { + self.authentication.userInfo(token: token).start(handleResult(callback: callback)) + } + + @objc(loginSocialWithToken:connection:scope:parameters:callback:) + public func loginSocial(withToken token: String, connection: String, scope: String, parameters: [String: Any]?, callback: @escaping (NSError?, Credentials?) -> Void) { + + self.authentication + .loginSocial(token: token, connection: connection, scope: scope, parameters: parameters ?? [:]) + .start(handleResult(callback: callback)) + } + + /** + Avoid Auth0.swift sending its version on every request to Auth0 API. + By default we collect our libraries and SDKs versions to help us during support and evaluate usage. + + - parameter enabled: if Auth0.swift should send it's version on every request. + */ + public func setTelemetryEnabled(enabled: Bool) { + self.authentication.tracking(enabled: enabled) + } +} + +private func handleResult(callback: @escaping (NSError?, T?) -> Void) -> (Result) -> Void { + return { result in + switch result { + case .success(let payload): + callback(nil, payload) + case .failure(let cause): + callback(cause as NSError, nil) + } + } +} + +private func handleResult(callback: @escaping (NSError?) -> Void) -> (Result) -> Void { + return { result in + if case .failure(let cause) = result { + callback(cause as NSError) + return + } + callback(nil) + } +} diff --git a/TracMobility/Pods/Auth0/Auth0/_ObjectiveManagementAPI.swift b/TracMobility/Pods/Auth0/Auth0/_ObjectiveManagementAPI.swift new file mode 100644 index 0000000..2eb09e0 --- /dev/null +++ b/TracMobility/Pods/Auth0/Auth0/_ObjectiveManagementAPI.swift @@ -0,0 +1,94 @@ +// _ObjectiveManagementAPI.swift +// +// Copyright (c) 2016 Auth0 (http://auth0.com) +// +// 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 + +@objc(A0ManagementAPI) +// swiftlint:disable:next type_name +public class _ObjectiveManagementAPI: NSObject { + + private var users: Users + + @objc public init(token: String) { + self.users = Auth0.users(token: token) + } + + @objc public convenience init(token: String, url: URL) { + self.init(token: token, url: url, session: URLSession.shared) + } + + @objc public init(token: String, url: URL, session: URLSession) { + self.users = Management(token: token, url: url, session: session) + } + + @objc(patchUserWithIdentifier:userMetadata:callback:) + public func patchUser(identifier: String, userMetadata: [String: Any], callback: @escaping (NSError?, [String: Any]?) -> Void) { + self.users + .patch(identifier, attributes: UserPatchAttributes().userMetadata(userMetadata)) + .start { result in + switch result { + case .success(let payload): + callback(nil, payload) + case .failure(let cause): + callback(cause as NSError, nil) + } + } + } + + @objc(linkUserWithIdentifier:withUserUsingToken:callback:) + public func linkUser(identifier: String, withUserUsingToken token: String, callback: @escaping (NSError?, [[String: Any]]?) -> Void) { + self.users + .link(identifier, withOtherUserToken: token) + .start { result in + switch result { + case .success(let payload): + callback(nil, payload) + case .failure(let cause): + callback(cause as NSError, nil) + } + } + } + + @objc(unlinkUserWithIdentifier:provider:fromUserId:callback:) + public func unlink(identifier: String, provider: String, fromUserId userId: String, callback: @escaping (NSError?, [[String: Any]]?) -> Void) { + self.users + .unlink(identityId: identifier, provider: provider, fromUserId: userId) + .start { result in + switch result { + case .success(let payload): + callback(nil, payload) + case .failure(let cause): + callback(cause as NSError, nil) + } + } + } + + /** + Avoid Auth0.swift sending its version on every request to Auth0 API. + By default we collect our libraries and SDKs versions to help us during support and evaluate usage. + + - parameter enabled: if Auth0.swift should send it's version on every request. + */ + @objc public func setTelemetry(enabled: Bool) { + self.users.tracking(enabled: enabled) + } +} diff --git a/TracMobility/Pods/Auth0/Auth0/_ObjectiveWebAuth.swift b/TracMobility/Pods/Auth0/Auth0/_ObjectiveWebAuth.swift new file mode 100644 index 0000000..dcf6616 --- /dev/null +++ b/TracMobility/Pods/Auth0/Auth0/_ObjectiveWebAuth.swift @@ -0,0 +1,178 @@ +// _ObjectiveWebAuth.swift +// +// Copyright (c) 2016 Auth0 (http://auth0.com) +// +// 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 WEB_AUTH_PLATFORM +import Foundation + +@objc(A0WebAuth) +/// Web-based Auth with Auth0 +// swiftlint:disable:next type_name +public class _ObjectiveOAuth2: NSObject { + + private(set) var webAuth: Auth0WebAuth + + @objc public override init() { + let values = plistValues(bundle: Bundle.main)! + self.webAuth = Auth0WebAuth(clientId: values.clientId, url: .a0_url(values.domain)) + } + + @objc public init(clientId: String, url: URL) { + self.webAuth = Auth0WebAuth(clientId: clientId, url: url) + } + + @objc public func addParameters(_ parameters: [String: String]) { + _ = self.webAuth.parameters(parameters) + } + + /** + For redirect url instead of a custom scheme it will use `https` and iOS 9 Universal Links. + + Before enabling this flag you'll need to configure Universal Links + */ + @objc public var universalLink: Bool { + get { + return self.webAuth.universalLink + } + set { + self.webAuth.universalLink = newValue + } + } + + /** + Disable Single Sign On (SSO) on iOS 13+ and macOS. + + Has no effect on older versions of iOS. + */ + @objc public var ephemeralSession: Bool { + get { + return self.webAuth.ephemeralSession + } + set { + self.webAuth.ephemeralSession = newValue + } + } + + /** + Specify a connection name to be used to authenticate. + + By default no connection is specified, so the hosted login page will be displayed + */ + @objc public var connection: String? { + get { + return self.webAuth.parameters["connection"] + } + set { + if let value = newValue { + _ = self.webAuth.connection(value) + } + } + } + + /** + Scopes that will be requested during auth + */ + @objc public var scope: String? { + get { + return self.webAuth.parameters["scope"] + } + set { + if let value = newValue { + _ = self.webAuth.scope(value) + } + } + } + + /** + Starts the web-based auth flow by modally presenting a ViewController in the top-most controller. + + ``` + A0WebAuth *auth = [[A0WebAuth alloc] initWithClientId:clientId url: url]; + [auth start:^(NSError * _Nullable error, A0Credentials * _Nullable credentials { + NSLog(@"error: %@, credentials: %@", error, credentials); + }]; + ``` + + Then from `AppDelegate` we just need to resume the OAuth2 Auth like this + + ``` + - (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary)*options { + return [A0OAuth2 resumeAuthWithURL:url options:options]; + } + ``` + + - parameter callback: callback called with the result of the OAuth2 flow + + - returns: an object representing the current OAuth2 session. + */ + @objc public func start(_ callback: @escaping (NSError?, Credentials?) -> Void) { + self.webAuth.start { result in + switch result { + case .success(let credentials): + callback(nil, credentials) + case .failure(let cause): + callback(cause as NSError, nil) + } + } + } + + /** + Removes Auth0 session and optionally remove the Identity Provider session. + - seeAlso: [Auth0 Logout docs](https://auth0.com/docs/logout) + + For iOS 11+ you will need to ensure that the **Callback URL** has been added + to the **Allowed Logout URLs** section of your application in the [Auth0 Dashboard](https://manage.auth0.com/#/applications/). + + ``` + A0WebAuth *auth = [[A0WebAuth alloc] initWithClientId:clientId url: url]; + [auth clearSessionWithFederated:NO:^(BOOL result) { + // ... + }]; + ``` + + Remove Auth0 session and remove the IdP session. + + ``` + [auth clearSessionWithFederated:YES:^(BOOL result) { + // ... + }]; + ``` + + - parameter federated: Bool to remove the IdP session + - parameter callback: callback called with bool outcome of the call + */ + @objc public func clearSession(federated: Bool, _ callback: @escaping (Bool) -> Void) { + self.webAuth.clearSession(federated: federated) { result in + callback(result) + } + } + + /** + Avoid Auth0.swift sending its version on every request to Auth0 API. + By default we collect our libraries and SDKs versions to help us during support and evaluate usage. + + - parameter enabled: if Auth0.swift should send it's version on every request. + */ + @objc public func setTelemetryEnabled(_ enabled: Bool) { + self.webAuth.tracking(enabled: enabled) + } +} +#endif diff --git a/TracMobility/Pods/Auth0/LICENSE b/TracMobility/Pods/Auth0/LICENSE new file mode 100644 index 0000000..5836564 --- /dev/null +++ b/TracMobility/Pods/Auth0/LICENSE @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright (c) 2016 Auth0, Inc. (http://auth0.com) + +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/TracMobility/Pods/Auth0/README.md b/TracMobility/Pods/Auth0/README.md new file mode 100644 index 0000000..ff166c2 --- /dev/null +++ b/TracMobility/Pods/Auth0/README.md @@ -0,0 +1,540 @@ +# Auth0.swift + +[![CircleCI](https://img.shields.io/circleci/project/github/auth0/Auth0.swift.svg?style=flat-square)](https://circleci.com/gh/auth0/Auth0.swift/tree/master) +[![Coverage Status](https://img.shields.io/codecov/c/github/auth0/Auth0.swift/master.svg?style=flat-square)](https://codecov.io/github/auth0/Auth0.swift) +[![Version](https://img.shields.io/cocoapods/v/Auth0.svg?style=flat-square)](https://cocoadocs.org/docsets/Auth0) +[![License](https://img.shields.io/cocoapods/l/Auth0.svg?style=flat-square)](https://cocoadocs.org/docsets/Auth0) +[![Platform](https://img.shields.io/cocoapods/p/Auth0.svg?style=flat-square)](https://cocoadocs.org/docsets/Auth0) +![Swift 5.3](https://img.shields.io/badge/Swift-5.3-orange.svg?style=flat-square) + +Swift toolkit that lets you communicate efficiently with many of the [Auth0 API](https://auth0.com/docs/api/info) functions and enables you to seamlessly integrate the Auth0 login. + +## Important Notices +[Behaviour changes in iOS 13](https://github.com/auth0/Auth0.swift/pull/297) related to Web Authentication require that developers using Xcode 11 with this library **must** compile using Swift 5.x. This *should* be the default setting applied when updating, unless it has been manually set. However, we recommend checking that this value is set correctly. + +## Table of Contents + +- [Requirements](#requirements) +- [Installation](#installation) +- [Getting Started](#getting-started) +- [Next Steps](#next-steps) +- [What is Auth0?](#what-is-auth0) +- [Create a Free Auth0 Account](#create-a-free-auth0-account) +- [Issue Reporting](#issue-reporting) +- [Author](#author) +- [License](#license) + +## Requirements + +- iOS 9+ / macOS 10.11+ / tvOS 9.0+ / watchOS 2.0+ +- Xcode 11.4+ / 12.x +- Swift 4.x / 5.x + +## Installation + +#### Cocoapods + +If you are using [Cocoapods](https://cocoapods.org), add this line to your `Podfile`: + +```ruby +pod 'Auth0', '~> 1.30' +``` + +Then run `pod install`. + +> For more information on Cocoapods, check [their official documentation](https://guides.cocoapods.org/using/getting-started.html). + +#### Carthage + +If you are using [Carthage](https://github.com/Carthage/Carthage), add the following line to your `Cartfile`: + +```ruby +github "auth0/Auth0.swift" ~> 1.30 +``` + +Then run `carthage bootstrap`. + +> For more information about Carthage usage, check [their official documentation](https://github.com/Carthage/Carthage#if-youre-building-for-ios-tvos-or-watchos). + +#### SPM + +If you are using the Swift Package Manager, open the following menu item in Xcode: + +**File > Swift Packages > Add Package Dependency...** + +In the **Choose Package Repository** prompt add this url: + +``` +https://github.com/auth0/Auth0.swift.git +``` + +Then press **Next** and complete the remaining steps. + +> For further reference on SPM, check [its official documentation](https://developer.apple.com/documentation/xcode/adding_package_dependencies_to_your_app). + +## Getting Started + +### Authentication with Universal Login (iOS / macOS 10.15+) + +1. Import **Auth0** into your project. +```swift +import Auth0 +``` + +2. Present the Universal Login page. +```swift +Auth0 + .webAuth() + .audience("https://{YOUR_AUTH0_DOMAIN}/userinfo") + .start { result in + switch result { + case .success(let credentials): + print("Obtained credentials: \(credentials)") + case .failure(let error): + print("Failed with \(error)") + } + } +``` + +> This snippet sets the `audience` to ensure OIDC compliant responses, this can also be achieved by enabling the **OIDC Conformant** switch in your Auth0 dashboard under `Application / Settings / Advanced / OAuth`. + +3. Allow Auth0 to handle authentication callbacks. In your `AppDelegate.swift`, add the following: + +#### iOS + +```swift +func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey: Any]) -> Bool { + return Auth0.resumeAuth(url) +} +``` + +#### macOS + +```swift +func application(_ application: NSApplication, open urls: [URL]) { + Auth0.resumeAuth(urls) +} +``` + +### Configuration + +In order to use Auth0 you need to provide your Auth0 **ClientId** and **Domain**. + +> Auth0 ClientId & Domain can be found in your [Auth0 Dashboard](https://manage.auth0.com/#/applications/). + +#### Adding Auth0 Credentials + +In your application bundle add a `plist` file named `Auth0.plist` with the following information: + +```xml + + + + + ClientId + YOUR_AUTH0_CLIENT_ID + Domain + YOUR_AUTH0_DOMAIN + + +``` + +As an alternative, you can pass the ClientId & Domain programmatically. + +```swift +// When using Universal Login +Auth0.webAuth(clientId: "{YOUR_AUTH0_CLIENT_ID}", domain: "{YOUR_AUTH0_DOMAIN}") + +// When using the Authentication API +Auth0.authentication(clientId: "{YOUR_AUTH0_CLIENT_ID}", domain: "{YOUR_AUTH0_DOMAIN}") +``` + +#### Configure Callback URLs (iOS / macOS) + +Callback URLs are the URLs that Auth0 invokes after the authentication process. Auth0 routes your application back to this URL and appends additional parameters to it, including a token. Since callback URLs can be manipulated, you will need to add your callback URL to the **Allowed Callback URLs** field in the [Auth0 Dashboard](https://manage.auth0.com/#/applications/). This will enable Auth0 to recognize these URLs as valid. If omitted, authentication will not be successful. + +In your application's `Info.plist` file, register your iOS / macOS Bundle Identifer as a custom scheme. + +```xml + + +CFBundleURLTypes + + + CFBundleTypeRole + None + CFBundleURLName + auth0 + CFBundleURLSchemes + + YOUR_BUNDLE_IDENTIFIER + + + +``` + +> If your `Info.plist` is not shown in this format, you can **Right Click** on `Info.plist` in Xcode and then select **Open As / Source Code**. + +Finally, go to your [Auth0 Dashboard](https://manage.auth0.com/#/applications/) and make sure that your application's **Allowed Callback URLs** field contains the following entry: + +```text +YOUR_BUNDLE_IDENTIFIER://YOUR_AUTH0_DOMAIN/ios/YOUR_BUNDLE_IDENTIFIER/callback +``` + +e.g. If your bundle identifier was `com.company.myapp` and your Auth0 domain was `company.auth0.com`, then this value would be: + +```text +com.company.myapp://company.auth0.com/ios/com.company.myapp/callback +``` + +## Next Steps + +### Learning Resources + +Check out the [iOS Swift QuickStart Guide](https://auth0.com/docs/quickstart/native/ios-swift) to find out more about the Auth0.swift toolkit and explore our tutorials and sample projects. + +### Common Tasks + +#### Retrieve user information + +```swift +Auth0 + .authentication() + .userInfo(withAccessToken: accessToken) + .start { result in + switch result { + case .success(let profile): + print("User Profile: \(profile)") + case .failure(let error): + print("Failed with \(error)") + } + } +``` + +#### Renew user credentials + +Use a [Refresh Token](https://auth0.com/docs/tokens/refresh-tokens) to renew user credentials. It's recommended that you read and understand the refresh token process before implementing. + +```swift +Auth0 + .authentication() + .renew(withRefreshToken: refreshToken) + .start { result in + switch result { + case .success(let credentials): + print("Obtained new credentials: \(credentials)") + case .failure(let error): + print("Failed with \(error)") + } + } +``` + +#### Disable Single Sign On (iOS 13+ / macOS) + +Add the `useEphemeralSession()` method to the chain to disable SSO on iOS 13+ and macOS. This way the system will not display the consent popup that otherwise shows up when SSO is enabled. It has no effect on older versions of iOS. + +```swift +Auth0 + .webAuth() + .audience("https://{YOUR_AUTH0_DOMAIN}/userinfo") + .useEphemeralSession() + .start { result in + switch result { + case .success(let credentials): + print("Obtained credentials: \(credentials)") + case .failure(let error): + print("Failed with \(error)") + } + } +``` + +### Credentials Management Utility + +The credentials manager utility provides a convenience to securely store and retrieve the user's credentials from the Keychain. + +```swift +let credentialsManager = CredentialsManager(authentication: Auth0.authentication()) +``` + +#### Store Credentials + +Store user credentials securely in the Keychain. + +```swift +credentialsManager.store(credentials: credentials) +``` + +#### Retrieve stored credentials + +Credentials will automatically be renewed (if expired) using the refresh token. The scope `offline_access` is required to ensure the refresh token is returned. + +> This method is not thread-safe, so if you're using Refresh Token Rotation you should avoid calling this method concurrently (might result in more than one renew request being fired, and only the first one will succeed). + +```swift +credentialsManager.credentials { error, credentials in + guard error == nil, let credentials = credentials else { + return print("Failed with \(error)") + } + print("Obtained credentials: \(credentials)") +} +``` + +#### Clearing credentials and revoking refresh tokens + +Credentials can be cleared by using the `clear` function, which clears credentials from the Keychain. + +```swift +let didClear = credentialsManager.clear() +``` + +In addition, credentials can be cleared and the refresh token revoked using a single call to `revoke`. This function will attempt to revoke the current refresh token stored by the credential manager and then clear credentials from the Keychain. If revoking the token results in an error, then the credentials are not cleared: + +```swift +credentialsManager.revoke { error in + guard error == nil else { + return print("Failed to revoke refresh token: \(error)") + } + + print("Success") +} +``` + +#### Biometric authentication + +You can enable an additional level of user authentication before retrieving credentials using the biometric authentication supported by your device e.g. Face ID or Touch ID. + +```swift +credentialsManager.enableBiometrics(withTitle: "Touch to Login") +``` + +### Native Social Login + +#### Sign in With Apple + +If you've added [the Sign In with Apple flow](https://developer.apple.com/documentation/authenticationservices/implementing_user_authentication_with_sign_in_with_apple) to your app, you can use the string value from the `authorizationCode` property obtained after a successful Apple authentication to perform a token exchange for Auth0 tokens. + +```swift +Auth0 + .authentication() + .login(appleAuthorizationCode: authCode) + .start { result in + switch result { + case .success(let credentials): + print("Obtained credentials: \(credentials)") + case .failure(let error): + print("Failed with \(error)") + } +} +``` + +Find out more about [Setting up Sign in with Apple](https://auth0.com/docs/connections/apple-siwa/set-up-apple) with Auth0. + +#### Facebook Login + +If you've added [the Facebook Login flow](https://developers.facebook.com/docs/facebook-login/ios) to your app, after a successful Faceboook authentication you can request a Session Access Token and the Facebook user profile, and use them to perform a token exchange for Auth0 tokens. + +```swift +Auth0 + .authentication() + .login(facebookSessionAccessToken: sessionAccessToken, profile: profile) + .start { result in + switch result { + case .success(let credentials): + print("Obtained credentials: \(credentials)") + case .failure(let error): + print("Failed with \(error)") + } +} +``` + +Find out more about [Setting up Facebook Login](https://auth0.com/docs/connections/nativesocial/facebook) with Auth0. + +### Authentication API (iOS / macOS / tvOS) + +The Authentication API exposes AuthN/AuthZ functionality of Auth0, as well as the supported identity protocols like OpenID Connect, OAuth 2.0, and SAML. +We recommend using [Universal Login](https://auth0.com/docs/universal-login) but if you wish to build your own UI, you can use our API endpoints to do so. However, some Auth flows (grant types) are disabled by default so you must enable them via your Auth0 Dashboard as explained in [Update Grant Types](https://auth0.com/docs/applications/update-grant-types). + +These are the required Grant Types that needs to be enabled in your application: + +* **Password**: For login with username/password using a realm (or connection name). If you set the grants via API you should activate both `http://auth0.com/oauth/grant-type/password-realm` and `password`, otherwise Auth0 Dashboard will take care of activating both when `Password` is enabled. + +#### Login with database connection (via Realm) + +```swift +Auth0 + .authentication() + .login(usernameOrEmail: "support@auth0.com", + password: "secret-password", + realm: "Username-Password-Authentication", + scope: "openid profile") + .start { result in + switch result { + case .success(let credentials): + print("Obtained credentials: \(credentials)") + case .failure(let error): + print("Failed with \(error)") + } + } +``` + +> This requires `Password` Grant or `http://auth0.com/oauth/grant-type/password-realm`. + +#### Sign up with database connection + +```swift +Auth0 + .authentication() + .createUser(email: "support@auth0.com", + password: "secret-password", + connection: "Username-Password-Authentication", + userMetadata: ["first_name": "First", "last_name": "Last"]) + .start { result in + switch result { + case .success(let user): + print("User Signed up: \(user)") + case .failure(let error): + print("Failed with \(error)") + } + } +``` + +### Management API (Users) + +You can request more information about a user's profile and manage the user's metadata by accessing the Auth0 [Management API](https://auth0.com/docs/api/management/v2). For security reasons native mobile applications are restricted to a subset of User based functionality. + +You can find a detailed guide in this [iOS Swift QuickStart](https://auth0.com/docs/quickstart/native/ios-swift/03-user-sessions#managing-metadata). + +#### Link an account + +```swift +Auth0 + .users(token: idToken) + .link("user identifier", withOtherUserToken: "another user token") + .start { result in + switch result { + case .success(let userInfo): + print("User: \(userInfo)") + case .failure(let error): + print("Failed with \(error)") + } + } +``` + +### Custom Domains + +If you are using [Custom Domains](https://auth0.com/docs/custom-domains) and need to call an Auth0 endpoint +such as `/userinfo`, please use the Auth0 domain specified for your Application in the [Auth0 Dashboard](https://manage.auth0.com/#/applications/). + +Example: `.audience("https://{YOUR_AUTH0_DOMAIN}/userinfo")` + +Users of Auth0 Private Cloud with Custom Domains still on the [legacy behavior](https://auth0.com/docs/private-cloud/private-cloud-migrations/migrate-private-cloud-custom-domains) need to specify a custom issuer to match the Auth0 domain before starting the authentication. Otherwise, the ID Token validation will fail. + +Example: `.issuer("https://{YOUR_AUTH0_DOMAIN}/")` + +### Bot Detection + +If you are using the [Bot Detection](https://auth0.com/docs/anomaly-detection/bot-detection) feature and performing database login/signup via the Authentication API, you need to handle the `isVerificationRequired` error. It indicates that the request was flagged as suspicious and an additional verification step is necessary to log the user in. That verification step is web-based, so you need to use Universal Login to complete it. + +```swift +let email = "support@auth0.com" +let realm = "Username-Password-Authentication" +let scope = "openid profile" + +Auth0 + .authentication() + .login(usernameOrEmail: email, + password: "secret-password", + realm: realm, + scope: scope) + .start { result in + switch result { + case .success(let credentials): + print("Obtained credentials: \(credentials)") + case .failure(let error as AuthenticationError) where error.isVerificationRequired: + DispatchQueue.main.async { + Auth0 + .webAuth() + .connection(realm) + .scope(scope) + .parameters(["login_hint": email]) + // ☝🏼 So the user doesn't have to type it again + .start { result in + // Handle result + } + } + case .failure(let error): + print("Failed with \(error)") + } + } +``` + +In the case of signup, you can add [an additional parameter](https://auth0.com/docs/universal-login/new-experience#signup) to make the user land directly on the signup page. + +```swift +.parameters(["login_hint": email, "screen_hint": "signup"]) +``` + +Check out how to set up Universal Login in the [Getting Started](#getting-started) section. + +> You don't need to handle this error if you're using the deprecated login methods. + +### Logging + +To enable Auth0.swift to log HTTP request and OAuth2 flow for debugging you can call the following method in either `WebAuth`, `Authentication` or `Users` object: + +```swift +var auth0 = Auth0.authentication() +auth0.logging(enabled: true) +``` + +Then for a OAuth2 authentication you'll see something similar to the following: + +``` +Safari: https://samples.auth0.com/authorize?..... +URL: com.auth0.myapp://samples.auth0.com/ios/com.auth0.MyApp/callback?... +POST https://samples.auth0.com/oauth/token HTTP/1.1 +Content-Type: application/json + +{"code":"...","client_id":"...","grant_type":"authorization_code","redirect_uri":"com.auth0.MyApp:\/\/samples.auth0.com\/ios\/com.auth0.MyApp\/callback","code_verifier":"..."} + +HTTP/1.1 200 +Pragma: no-cache +Content-Type: application/json +Strict-Transport-Security: max-age=3600 +Date: Thu, 09 Jun 2016 19:04:39 GMT +Content-Length: 57 +Cache-Control: no-cache +Connection: keep-alive + +{"access_token":"...","token_type":"Bearer"} +``` + +> Set this flag only when **DEBUGGING** to avoid leaking user's credentials in the device log. + +## What is Auth0? + +Auth0 helps you to: + +* Add authentication with [multiple sources](https://auth0.com/docs/identityproviders), either social identity providers such as **Google, Facebook, Microsoft Account, LinkedIn, GitHub, Twitter, Box, Salesforce** (amongst others), or enterprise identity systems like **Windows Azure AD, Google Apps, Active Directory, ADFS, or any SAML Identity Provider**. +* Add authentication through more traditional **[username/password databases](https://auth0.com/docs/connections/database/custom-db)**. +* Add support for **[linking different user accounts](https://auth0.com/docs/users/user-account-linking)** with the same user. +* Support for generating signed [JSON Web Tokens](https://auth0.com/docs/tokens/json-web-tokens) to call your APIs and **flow the user identity** securely. +* Analytics of how, when, and where users are logging in. +* Pull data from other sources and add it to the user profile through [JavaScript rules](https://auth0.com/docs/rules). + +## Create a Free Auth0 Account + +1. Go to [Auth0](https://auth0.com) and click **Sign Up**. +2. Use Google, GitHub, or Microsoft Account to login. + +## Issue Reporting + +If you have found a bug or to request a feature, please [raise an issue](https://github.com/auth0/Auth0.swift/issues). Please do not report security vulnerabilities on the public GitHub issue tracker. The [Responsible Disclosure Program](https://auth0.com/responsible-disclosure-policy) details the procedure for disclosing security issues. + +## Author + +[Auth0](https://auth0.com) + +## License + +This project is licensed under the MIT license. See the [LICENSE](LICENSE) file for more info. diff --git a/TracMobility/Pods/GoogleMaps/Base/Frameworks/GoogleMapsBase.framework/GoogleMapsBase b/TracMobility/Pods/GoogleMaps/Base/Frameworks/GoogleMapsBase.framework/GoogleMapsBase new file mode 100755 index 0000000..a34d76a Binary files /dev/null and b/TracMobility/Pods/GoogleMaps/Base/Frameworks/GoogleMapsBase.framework/GoogleMapsBase differ diff --git a/TracMobility/Pods/GoogleMaps/Base/Frameworks/GoogleMapsBase.framework/Headers/GMSCompatabilityMacros.h b/TracMobility/Pods/GoogleMaps/Base/Frameworks/GoogleMapsBase.framework/Headers/GMSCompatabilityMacros.h new file mode 100755 index 0000000..ea51991 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Base/Frameworks/GoogleMapsBase.framework/Headers/GMSCoordinateBounds.h b/TracMobility/Pods/GoogleMaps/Base/Frameworks/GoogleMapsBase.framework/Headers/GMSCoordinateBounds.h new file mode 100755 index 0000000..0f6c2cd --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Base/Frameworks/GoogleMapsBase.framework/Headers/GMSDeprecationMacros.h b/TracMobility/Pods/GoogleMaps/Base/Frameworks/GoogleMapsBase.framework/Headers/GMSDeprecationMacros.h new file mode 100755 index 0000000..07da74e --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Base/Frameworks/GoogleMapsBase.framework/Headers/GoogleMapsBase.h b/TracMobility/Pods/GoogleMaps/Base/Frameworks/GoogleMapsBase.framework/Headers/GoogleMapsBase.h new file mode 100755 index 0000000..95ec44c --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Base/Frameworks/GoogleMapsBase.framework/Modules/module.modulemap b/TracMobility/Pods/GoogleMaps/Base/Frameworks/GoogleMapsBase.framework/Modules/module.modulemap new file mode 100755 index 0000000..ab89f82 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/CHANGELOG.md b/TracMobility/Pods/GoogleMaps/CHANGELOG.md new file mode 100755 index 0000000..45a3b9f --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos.xcodeproj/project.pbxproj b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos.xcodeproj/project.pbxproj new file mode 100755 index 0000000..7867b54 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/DemoAppDelegate.h b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/DemoAppDelegate.h new file mode 100755 index 0000000..4a51db5 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/DemoAppDelegate.m b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/DemoAppDelegate.m new file mode 100755 index 0000000..0366000 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Info.plist b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Info.plist new file mode 100755 index 0000000..d5172fe --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/MapsDemoAssets.xcassets/AppIcon.appiconset/Contents.json b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/MapsDemoAssets.xcassets/AppIcon.appiconset/Contents.json new file mode 100755 index 0000000..5fce6cf --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/MapsDemoAssets.xcassets/AppIcon.appiconset/Maps-SDK-Demo-App_120.png b/TracMobility/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/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/MapsDemoAssets.xcassets/AppIcon.appiconset/Maps-SDK-Demo-App_120.png differ diff --git a/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/MapsDemoAssets.xcassets/AppIcon.appiconset/Maps-SDK-Demo-App_152.png b/TracMobility/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/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/MapsDemoAssets.xcassets/AppIcon.appiconset/Maps-SDK-Demo-App_152.png differ diff --git a/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/MapsDemoAssets.xcassets/AppIcon.appiconset/Maps-SDK-Demo-App_167.png b/TracMobility/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/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/MapsDemoAssets.xcassets/AppIcon.appiconset/Maps-SDK-Demo-App_167.png differ diff --git a/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/MapsDemoAssets.xcassets/AppIcon.appiconset/Maps-SDK-Demo-App_180.png b/TracMobility/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/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/MapsDemoAssets.xcassets/AppIcon.appiconset/Maps-SDK-Demo-App_180.png differ diff --git a/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/MapsDemoAssets.xcassets/AppIcon.appiconset/Maps-SDK-Demo-App_76.png b/TracMobility/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/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/MapsDemoAssets.xcassets/AppIcon.appiconset/Maps-SDK-Demo-App_76.png differ diff --git a/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/MapsDemoAssets.xcassets/Contents.json b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/MapsDemoAssets.xcassets/Contents.json new file mode 100755 index 0000000..da4a164 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/MasterViewController.h b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/MasterViewController.h new file mode 100755 index 0000000..68a8fbe --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/MasterViewController.m b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/MasterViewController.m new file mode 100755 index 0000000..02fe812 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/LaunchScreen.storyboard b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/LaunchScreen.storyboard new file mode 100755 index 0000000..8c740c7 --- /dev/null +++ b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/LaunchScreen.storyboard @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/Museum-Icons/h1.png b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/Museum-Icons/h1.png new file mode 100755 index 0000000..fff8197 Binary files /dev/null and b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/Museum-Icons/h1.png differ diff --git a/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/Museum-Icons/h1@2x.png b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/Museum-Icons/h1@2x.png new file mode 100755 index 0000000..ce36c63 Binary files /dev/null and b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/Museum-Icons/h1@2x.png differ diff --git a/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/Museum-Icons/spitfire.png b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/Museum-Icons/spitfire.png new file mode 100755 index 0000000..5c76dc9 Binary files /dev/null and b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/Museum-Icons/spitfire.png differ diff --git a/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/Museum-Icons/spitfire@2x.png b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/Museum-Icons/spitfire@2x.png new file mode 100755 index 0000000..a09b75c Binary files /dev/null and b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/Museum-Icons/spitfire@2x.png differ diff --git a/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/Museum-Icons/voyager.png b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/Museum-Icons/voyager.png new file mode 100755 index 0000000..d657f22 Binary files /dev/null and b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/Museum-Icons/voyager.png differ diff --git a/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/Museum-Icons/voyager@2x.png b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/Museum-Icons/voyager@2x.png new file mode 100755 index 0000000..b2a668e Binary files /dev/null and b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/Museum-Icons/voyager@2x.png differ diff --git a/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/Museum-Icons/x29.png b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/Museum-Icons/x29.png new file mode 100755 index 0000000..0edd3f1 Binary files /dev/null and b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/Museum-Icons/x29.png differ diff --git a/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/Museum-Icons/x29@2x.png b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/Museum-Icons/x29@2x.png new file mode 100755 index 0000000..eda3d15 Binary files /dev/null and b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/Museum-Icons/x29@2x.png differ diff --git a/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/aeroplane.png b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/aeroplane.png new file mode 100755 index 0000000..5114ee4 Binary files /dev/null and b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/aeroplane.png differ diff --git a/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/aeroplane@2x.png b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/aeroplane@2x.png new file mode 100755 index 0000000..5c5012c Binary files /dev/null and b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/aeroplane@2x.png differ diff --git a/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/ar.lproj/InfoPlist.strings b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/ar.lproj/InfoPlist.strings new file mode 100755 index 0000000..477b28f --- /dev/null +++ b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/ar.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/argentina-large.png b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/argentina-large.png new file mode 100755 index 0000000..b75247c Binary files /dev/null and b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/argentina-large.png differ diff --git a/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/argentina.png b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/argentina.png new file mode 100755 index 0000000..9095376 Binary files /dev/null and b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/argentina.png differ diff --git a/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/arrow.png b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/arrow.png new file mode 100755 index 0000000..8d8c3f7 Binary files /dev/null and b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/arrow.png differ diff --git a/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/arrow@2x.png b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/arrow@2x.png new file mode 100755 index 0000000..4b0ff7c Binary files /dev/null and b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/arrow@2x.png differ diff --git a/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/australia-large.png b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/australia-large.png new file mode 100755 index 0000000..787aed5 Binary files /dev/null and b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/australia-large.png differ diff --git a/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/australia-large@2x.png b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/australia-large@2x.png new file mode 100755 index 0000000..15d4d2a Binary files /dev/null and b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/australia-large@2x.png differ diff --git a/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/australia.png b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/australia.png new file mode 100755 index 0000000..12afbb9 Binary files /dev/null and b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/australia.png differ diff --git a/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/boat.png b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/boat.png new file mode 100755 index 0000000..67221da Binary files /dev/null and b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/boat.png differ diff --git a/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/boat@2x.png b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/boat@2x.png new file mode 100755 index 0000000..3f316d3 Binary files /dev/null and b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/boat@2x.png differ diff --git a/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/botswana-large.png b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/botswana-large.png new file mode 100755 index 0000000..c150491 Binary files /dev/null and b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/botswana-large.png differ diff --git a/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/botswana.png b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/botswana.png new file mode 100755 index 0000000..a006d99 Binary files /dev/null and b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/botswana.png differ diff --git a/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/bulgaria-large.png b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/bulgaria-large.png new file mode 100755 index 0000000..0107da0 Binary files /dev/null and b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/bulgaria-large.png differ diff --git a/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/bulgaria.png b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/bulgaria.png new file mode 100755 index 0000000..04cdb29 Binary files /dev/null and b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/bulgaria.png differ diff --git a/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/ca.lproj/InfoPlist.strings b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/ca.lproj/InfoPlist.strings new file mode 100755 index 0000000..477b28f --- /dev/null +++ b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/ca.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/cs.lproj/InfoPlist.strings b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/cs.lproj/InfoPlist.strings new file mode 100755 index 0000000..477b28f --- /dev/null +++ b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/cs.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/da.lproj/InfoPlist.strings b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/da.lproj/InfoPlist.strings new file mode 100755 index 0000000..477b28f --- /dev/null +++ b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/da.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/de.lproj/InfoPlist.strings b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/de.lproj/InfoPlist.strings new file mode 100755 index 0000000..477b28f --- /dev/null +++ b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/de.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/el.lproj/InfoPlist.strings b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/el.lproj/InfoPlist.strings new file mode 100755 index 0000000..477b28f --- /dev/null +++ b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/el.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/en.lproj/InfoPlist.strings b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/en.lproj/InfoPlist.strings new file mode 100755 index 0000000..477b28f --- /dev/null +++ b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/en.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/en_GB.lproj/InfoPlist.strings b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/en_GB.lproj/InfoPlist.strings new file mode 100755 index 0000000..477b28f --- /dev/null +++ b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/en_GB.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/es.lproj/InfoPlist.strings b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/es.lproj/InfoPlist.strings new file mode 100755 index 0000000..477b28f --- /dev/null +++ b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/es.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/fi.lproj/InfoPlist.strings b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/fi.lproj/InfoPlist.strings new file mode 100755 index 0000000..477b28f --- /dev/null +++ b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/fi.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/fr.lproj/InfoPlist.strings b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/fr.lproj/InfoPlist.strings new file mode 100755 index 0000000..477b28f --- /dev/null +++ b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/fr.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/glow-marker.png b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/glow-marker.png new file mode 100755 index 0000000..eb0f596 Binary files /dev/null and b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/glow-marker.png differ diff --git a/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/glow-marker@2x.png b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/glow-marker@2x.png new file mode 100755 index 0000000..e415c3f Binary files /dev/null and b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/glow-marker@2x.png differ diff --git a/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/he.lproj/InfoPlist.strings b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/he.lproj/InfoPlist.strings new file mode 100755 index 0000000..477b28f --- /dev/null +++ b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/he.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/hr.lproj/InfoPlist.strings b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/hr.lproj/InfoPlist.strings new file mode 100755 index 0000000..477b28f --- /dev/null +++ b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/hr.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/hu.lproj/InfoPlist.strings b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/hu.lproj/InfoPlist.strings new file mode 100755 index 0000000..477b28f --- /dev/null +++ b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/hu.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/id.lproj/InfoPlist.strings b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/id.lproj/InfoPlist.strings new file mode 100755 index 0000000..477b28f --- /dev/null +++ b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/id.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/it.lproj/InfoPlist.strings b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/it.lproj/InfoPlist.strings new file mode 100755 index 0000000..477b28f --- /dev/null +++ b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/it.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/ja.lproj/InfoPlist.strings b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/ja.lproj/InfoPlist.strings new file mode 100755 index 0000000..477b28f --- /dev/null +++ b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/ja.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/ko.lproj/InfoPlist.strings b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/ko.lproj/InfoPlist.strings new file mode 100755 index 0000000..477b28f --- /dev/null +++ b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/ko.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/mapstyle-night.json b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/mapstyle-night.json new file mode 100755 index 0000000..1cbd616 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/mapstyle-retro.json b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/mapstyle-retro.json new file mode 100755 index 0000000..f6a16e8 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/mapstyle-silver.json b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/mapstyle-silver.json new file mode 100755 index 0000000..340e5d6 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/ms.lproj/InfoPlist.strings b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/ms.lproj/InfoPlist.strings new file mode 100755 index 0000000..477b28f --- /dev/null +++ b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/ms.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/museum-exhibits.json b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/museum-exhibits.json new file mode 100755 index 0000000..25b0a5d --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/nb.lproj/InfoPlist.strings b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/nb.lproj/InfoPlist.strings new file mode 100755 index 0000000..477b28f --- /dev/null +++ b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/nb.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/newark_nj_1922.jpg b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/newark_nj_1922.jpg new file mode 100755 index 0000000..1f4ae59 Binary files /dev/null and b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/newark_nj_1922.jpg differ diff --git a/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/nl.lproj/InfoPlist.strings b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/nl.lproj/InfoPlist.strings new file mode 100755 index 0000000..477b28f --- /dev/null +++ b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/nl.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/pl.lproj/InfoPlist.strings b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/pl.lproj/InfoPlist.strings new file mode 100755 index 0000000..477b28f --- /dev/null +++ b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/pl.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/popup_santa.png b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/popup_santa.png new file mode 100755 index 0000000..f2968ef Binary files /dev/null and b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/popup_santa.png differ diff --git a/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/popup_santa@2x.png b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/popup_santa@2x.png new file mode 100755 index 0000000..3f90828 Binary files /dev/null and b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/popup_santa@2x.png differ diff --git a/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/pt.lproj/InfoPlist.strings b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/pt.lproj/InfoPlist.strings new file mode 100755 index 0000000..477b28f --- /dev/null +++ b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/pt.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/pt_PT.lproj/InfoPlist.strings b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/pt_PT.lproj/InfoPlist.strings new file mode 100755 index 0000000..477b28f --- /dev/null +++ b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/pt_PT.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/ro.lproj/InfoPlist.strings b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/ro.lproj/InfoPlist.strings new file mode 100755 index 0000000..477b28f --- /dev/null +++ b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/ro.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/ru.lproj/InfoPlist.strings b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/ru.lproj/InfoPlist.strings new file mode 100755 index 0000000..477b28f --- /dev/null +++ b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/ru.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/sk.lproj/InfoPlist.strings b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/sk.lproj/InfoPlist.strings new file mode 100755 index 0000000..477b28f --- /dev/null +++ b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/sk.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step1.png b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step1.png new file mode 100755 index 0000000..1cac697 Binary files /dev/null and b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step1.png differ diff --git a/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step1@2x.png b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step1@2x.png new file mode 100755 index 0000000..8d99108 Binary files /dev/null and b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step1@2x.png differ diff --git a/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step2.png b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step2.png new file mode 100755 index 0000000..18ee7f2 Binary files /dev/null and b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step2.png differ diff --git a/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step2@2x.png b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step2@2x.png new file mode 100755 index 0000000..5c37b1d Binary files /dev/null and b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step2@2x.png differ diff --git a/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step3.png b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step3.png new file mode 100755 index 0000000..795b90f Binary files /dev/null and b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step3.png differ diff --git a/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step3@2x.png b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step3@2x.png new file mode 100755 index 0000000..950d754 Binary files /dev/null and b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step3@2x.png differ diff --git a/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step4.png b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step4.png new file mode 100755 index 0000000..3d7416b Binary files /dev/null and b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step4.png differ diff --git a/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step4@2x.png b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step4@2x.png new file mode 100755 index 0000000..7ae50e5 Binary files /dev/null and b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step4@2x.png differ diff --git a/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step5.png b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step5.png new file mode 100755 index 0000000..3a8bd1e Binary files /dev/null and b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step5.png differ diff --git a/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step5@2x.png b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step5@2x.png new file mode 100755 index 0000000..236f3a0 Binary files /dev/null and b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step5@2x.png differ diff --git a/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step6.png b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step6.png new file mode 100755 index 0000000..c6580e6 Binary files /dev/null and b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step6.png differ diff --git a/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step6@2x.png b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step6@2x.png new file mode 100755 index 0000000..2bed812 Binary files /dev/null and b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step6@2x.png differ diff --git a/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step7.png b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step7.png new file mode 100755 index 0000000..4e17178 Binary files /dev/null and b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step7.png differ diff --git a/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step7@2x.png b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step7@2x.png new file mode 100755 index 0000000..88932e6 Binary files /dev/null and b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step7@2x.png differ diff --git a/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step8.png b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step8.png new file mode 100755 index 0000000..7eefde7 Binary files /dev/null and b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step8.png differ diff --git a/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step8@2x.png b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step8@2x.png new file mode 100755 index 0000000..6f49e3d Binary files /dev/null and b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/step8@2x.png differ diff --git a/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/sv.lproj/InfoPlist.strings b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/sv.lproj/InfoPlist.strings new file mode 100755 index 0000000..477b28f --- /dev/null +++ b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/sv.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/th.lproj/InfoPlist.strings b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/th.lproj/InfoPlist.strings new file mode 100755 index 0000000..477b28f --- /dev/null +++ b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/th.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/tr.lproj/InfoPlist.strings b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/tr.lproj/InfoPlist.strings new file mode 100755 index 0000000..477b28f --- /dev/null +++ b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/tr.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/track.json b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/track.json new file mode 100755 index 0000000..6a0ed63 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/uk.lproj/InfoPlist.strings b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/uk.lproj/InfoPlist.strings new file mode 100755 index 0000000..477b28f --- /dev/null +++ b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/uk.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/vi.lproj/InfoPlist.strings b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/vi.lproj/InfoPlist.strings new file mode 100755 index 0000000..477b28f --- /dev/null +++ b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/vi.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/zh_CN.lproj/InfoPlist.strings b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/zh_CN.lproj/InfoPlist.strings new file mode 100755 index 0000000..477b28f --- /dev/null +++ b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/zh_CN.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/zh_TW.lproj/InfoPlist.strings b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/zh_TW.lproj/InfoPlist.strings new file mode 100755 index 0000000..477b28f --- /dev/null +++ b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Resources/zh_TW.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/SDKDemoAPIKey.h b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/SDKDemoAPIKey.h new file mode 100755 index 0000000..23ba5b0 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/AnimatedCurrentLocationViewController.h b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/AnimatedCurrentLocationViewController.h new file mode 100755 index 0000000..6b7bd89 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/AnimatedCurrentLocationViewController.m b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/AnimatedCurrentLocationViewController.m new file mode 100755 index 0000000..306a8d1 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/AnimatedUIViewMarkerViewController.h b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/AnimatedUIViewMarkerViewController.h new file mode 100755 index 0000000..0dce9e8 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/AnimatedUIViewMarkerViewController.m b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/AnimatedUIViewMarkerViewController.m new file mode 100755 index 0000000..7392b51 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/BasicMapViewController.h b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/BasicMapViewController.h new file mode 100755 index 0000000..9edc891 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/BasicMapViewController.m b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/BasicMapViewController.m new file mode 100755 index 0000000..558acce --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/CameraViewController.h b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/CameraViewController.h new file mode 100755 index 0000000..b8f9b1a --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/CameraViewController.m b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/CameraViewController.m new file mode 100755 index 0000000..a2dc629 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/CustomIndoorViewController.h b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/CustomIndoorViewController.h new file mode 100755 index 0000000..c546d30 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/CustomIndoorViewController.m b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/CustomIndoorViewController.m new file mode 100755 index 0000000..f5b50c2 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/CustomMarkersViewController.h b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/CustomMarkersViewController.h new file mode 100755 index 0000000..c63fd37 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/CustomMarkersViewController.m b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/CustomMarkersViewController.m new file mode 100755 index 0000000..cd0c5f4 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/DoubleMapViewController.h b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/DoubleMapViewController.h new file mode 100755 index 0000000..d612fbf --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/DoubleMapViewController.m b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/DoubleMapViewController.m new file mode 100755 index 0000000..8fb1f25 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/FitBoundsViewController.h b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/FitBoundsViewController.h new file mode 100755 index 0000000..b38b0f5 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/FitBoundsViewController.m b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/FitBoundsViewController.m new file mode 100755 index 0000000..b0b4f28 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/FixedPanoramaViewController.h b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/FixedPanoramaViewController.h new file mode 100755 index 0000000..900b02e --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/FixedPanoramaViewController.m b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/FixedPanoramaViewController.m new file mode 100755 index 0000000..7074a93 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/FrameRateViewController.h b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/FrameRateViewController.h new file mode 100755 index 0000000..940dbb0 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/FrameRateViewController.m b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/FrameRateViewController.m new file mode 100755 index 0000000..3367fe8 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/GeocoderViewController.h b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/GeocoderViewController.h new file mode 100755 index 0000000..6fec749 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/GeocoderViewController.m b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/GeocoderViewController.m new file mode 100755 index 0000000..62b5930 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/GestureControlViewController.h b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/GestureControlViewController.h new file mode 100755 index 0000000..f103e5d --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/GestureControlViewController.m b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/GestureControlViewController.m new file mode 100755 index 0000000..1935c25 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/GradientPolylinesViewController.h b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/GradientPolylinesViewController.h new file mode 100755 index 0000000..3142b72 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/GradientPolylinesViewController.m b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/GradientPolylinesViewController.m new file mode 100755 index 0000000..60f875e --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/GroundOverlayViewController.h b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/GroundOverlayViewController.h new file mode 100755 index 0000000..e220bf4 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/GroundOverlayViewController.m b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/GroundOverlayViewController.m new file mode 100755 index 0000000..1341bf6 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/IndoorMuseumNavigationViewController.h b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/IndoorMuseumNavigationViewController.h new file mode 100755 index 0000000..722f6ea --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/IndoorMuseumNavigationViewController.m b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/IndoorMuseumNavigationViewController.m new file mode 100755 index 0000000..efe13cf --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/IndoorViewController.h b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/IndoorViewController.h new file mode 100755 index 0000000..d4f5a67 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/IndoorViewController.m b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/IndoorViewController.m new file mode 100755 index 0000000..b97770d --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MapLayerViewController.h b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MapLayerViewController.h new file mode 100755 index 0000000..f2f9f6e --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MapLayerViewController.m b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MapLayerViewController.m new file mode 100755 index 0000000..974a41c --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MapTypesViewController.h b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MapTypesViewController.h new file mode 100755 index 0000000..c879adc --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MapTypesViewController.m b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MapTypesViewController.m new file mode 100755 index 0000000..3bbd853 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MapZoomViewController.h b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MapZoomViewController.h new file mode 100755 index 0000000..dadb9a1 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MapZoomViewController.m b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MapZoomViewController.m new file mode 100755 index 0000000..4657d2f --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MarkerEventsViewController.h b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MarkerEventsViewController.h new file mode 100755 index 0000000..86ed130 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MarkerEventsViewController.m b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MarkerEventsViewController.m new file mode 100755 index 0000000..31a304f --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MarkerInfoWindowViewController.h b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MarkerInfoWindowViewController.h new file mode 100755 index 0000000..299a9a2 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MarkerInfoWindowViewController.m b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MarkerInfoWindowViewController.m new file mode 100755 index 0000000..14cc07a --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MarkerLayerViewController.h b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MarkerLayerViewController.h new file mode 100755 index 0000000..25b8088 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MarkerLayerViewController.m b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MarkerLayerViewController.m new file mode 100755 index 0000000..39faf67 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MarkersViewController.h b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MarkersViewController.h new file mode 100755 index 0000000..3cce920 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MarkersViewController.m b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MarkersViewController.m new file mode 100755 index 0000000..ef19c48 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MyLocationViewController.h b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MyLocationViewController.h new file mode 100755 index 0000000..4a6a2c2 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MyLocationViewController.m b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/MyLocationViewController.m new file mode 100755 index 0000000..ae45e2d --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/PaddingBehaviorViewController.h b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/PaddingBehaviorViewController.h new file mode 100755 index 0000000..0b62aad --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/PaddingBehaviorViewController.m b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/PaddingBehaviorViewController.m new file mode 100755 index 0000000..41f2c0e --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/PanoramaViewController.h b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/PanoramaViewController.h new file mode 100755 index 0000000..1dfd285 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/PanoramaViewController.m b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/PanoramaViewController.m new file mode 100755 index 0000000..eac9a2f --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/PolygonsViewController.h b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/PolygonsViewController.h new file mode 100755 index 0000000..efdc2bd --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/PolygonsViewController.m b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/PolygonsViewController.m new file mode 100755 index 0000000..e3df3d8 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/PolylinesViewController.h b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/PolylinesViewController.h new file mode 100755 index 0000000..6cb22f5 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/PolylinesViewController.m b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/PolylinesViewController.m new file mode 100755 index 0000000..c75086f --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/Samples.h b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/Samples.h new file mode 100755 index 0000000..5c2d54d --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/Samples.m b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/Samples.m new file mode 100755 index 0000000..cebd46a --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/SnapshotReadyViewController.h b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/SnapshotReadyViewController.h new file mode 100755 index 0000000..ceaa9c1 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/SnapshotReadyViewController.m b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/SnapshotReadyViewController.m new file mode 100755 index 0000000..cb53732 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/StructuredGeocoderViewController.h b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/StructuredGeocoderViewController.h new file mode 100755 index 0000000..4e655fc --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/StructuredGeocoderViewController.m b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/StructuredGeocoderViewController.m new file mode 100755 index 0000000..d105a9c --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/StyledMapViewController.h b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/StyledMapViewController.h new file mode 100755 index 0000000..c744eb5 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/StyledMapViewController.m b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/StyledMapViewController.m new file mode 100755 index 0000000..9930aba --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/TileLayerViewController.h b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/TileLayerViewController.h new file mode 100755 index 0000000..adc4085 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/TileLayerViewController.m b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/TileLayerViewController.m new file mode 100755 index 0000000..617db21 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/TrafficMapViewController.h b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/TrafficMapViewController.h new file mode 100755 index 0000000..ddbc9c6 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/TrafficMapViewController.m b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/TrafficMapViewController.m new file mode 100755 index 0000000..9140c41 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/VisibleRegionViewController.h b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/VisibleRegionViewController.h new file mode 100755 index 0000000..1f5c6b0 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/VisibleRegionViewController.m b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/Samples/VisibleRegionViewController.m new file mode 100755 index 0000000..6bcc21f --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/UIViewController+GMSToastMessages.h b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/UIViewController+GMSToastMessages.h new file mode 100755 index 0000000..93161f4 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/UIViewController+GMSToastMessages.m b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/UIViewController+GMSToastMessages.m new file mode 100755 index 0000000..8e4072c --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/main.m b/TracMobility/Pods/GoogleMaps/Example/GoogleMapsDemos/main.m new file mode 100755 index 0000000..34d59f6 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Example/Podfile b/TracMobility/Pods/GoogleMaps/Example/Podfile new file mode 100755 index 0000000..d9eb236 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Example/README.GoogleMapsDemos b/TracMobility/Pods/GoogleMaps/Example/README.GoogleMapsDemos new file mode 100755 index 0000000..96171d4 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/GoogleMaps b/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/GoogleMaps new file mode 100755 index 0000000..7f9572b Binary files /dev/null and b/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/GoogleMaps differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSAddress.h b/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSAddress.h new file mode 100755 index 0000000..0540507 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSCALayer.h b/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSCALayer.h new file mode 100755 index 0000000..2ab6da2 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSCameraPosition.h b/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSCameraPosition.h new file mode 100755 index 0000000..77a1d85 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSCameraUpdate.h b/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSCameraUpdate.h new file mode 100755 index 0000000..3996d01 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSCircle.h b/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSCircle.h new file mode 100755 index 0000000..d1995e1 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSCoordinateBounds+GoogleMaps.h b/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSCoordinateBounds+GoogleMaps.h new file mode 100755 index 0000000..18f543f --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSGeocoder.h b/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSGeocoder.h new file mode 100755 index 0000000..c05b312 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSGeometryUtils.h b/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSGeometryUtils.h new file mode 100755 index 0000000..fc335c4 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSGroundOverlay.h b/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSGroundOverlay.h new file mode 100755 index 0000000..a3a8304 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSIndoorBuilding.h b/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSIndoorBuilding.h new file mode 100755 index 0000000..cfe70c2 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSIndoorDisplay.h b/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSIndoorDisplay.h new file mode 100755 index 0000000..a703838 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSIndoorLevel.h b/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSIndoorLevel.h new file mode 100755 index 0000000..0604ccb --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSMapLayer.h b/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSMapLayer.h new file mode 100755 index 0000000..21a0c2f --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSMapStyle.h b/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSMapStyle.h new file mode 100755 index 0000000..6c1e4b7 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSMapView+Animation.h b/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSMapView+Animation.h new file mode 100755 index 0000000..41e5ff0 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSMapView.h b/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSMapView.h new file mode 100755 index 0000000..8e223d5 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSMarker.h b/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSMarker.h new file mode 100755 index 0000000..e0ba822 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSMarkerLayer.h b/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSMarkerLayer.h new file mode 100755 index 0000000..0538955 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSMutablePath.h b/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSMutablePath.h new file mode 100755 index 0000000..a710b09 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSOrientation.h b/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSOrientation.h new file mode 100755 index 0000000..5d8822c --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSOverlay.h b/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSOverlay.h new file mode 100755 index 0000000..f71f20f --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSOverlayLayer.h b/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSOverlayLayer.h new file mode 100755 index 0000000..b0b8cf2 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSPanorama.h b/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSPanorama.h new file mode 100755 index 0000000..70400f2 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSPanoramaCamera.h b/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSPanoramaCamera.h new file mode 100755 index 0000000..4b9cc47 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSPanoramaCameraUpdate.h b/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSPanoramaCameraUpdate.h new file mode 100755 index 0000000..96dd4c2 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSPanoramaLayer.h b/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSPanoramaLayer.h new file mode 100755 index 0000000..4b18a87 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSPanoramaLink.h b/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSPanoramaLink.h new file mode 100755 index 0000000..419545f --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSPanoramaService.h b/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSPanoramaService.h new file mode 100755 index 0000000..01ea837 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSPanoramaSource.h b/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSPanoramaSource.h new file mode 100755 index 0000000..f97d176 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSPanoramaView.h b/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSPanoramaView.h new file mode 100755 index 0000000..9898bb1 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSPath.h b/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSPath.h new file mode 100755 index 0000000..15129b8 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSPolygon.h b/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSPolygon.h new file mode 100755 index 0000000..ff38e85 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSPolygonLayer.h b/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSPolygonLayer.h new file mode 100755 index 0000000..f1860a5 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSPolyline.h b/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSPolyline.h new file mode 100755 index 0000000..9f67db1 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSProjection.h b/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSProjection.h new file mode 100755 index 0000000..73f5b1d --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSServices.h b/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSServices.h new file mode 100755 index 0000000..8b360c8 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSStrokeStyle.h b/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSStrokeStyle.h new file mode 100755 index 0000000..3bf1cf3 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSStyleSpan.h b/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSStyleSpan.h new file mode 100755 index 0000000..08462bc --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSSyncTileLayer.h b/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSSyncTileLayer.h new file mode 100755 index 0000000..ca3f91b --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSTileLayer.h b/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSTileLayer.h new file mode 100755 index 0000000..3ddb4e8 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSUISettings.h b/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSUISettings.h new file mode 100755 index 0000000..0b81e5c --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSURLTileLayer.h b/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GMSURLTileLayer.h new file mode 100755 index 0000000..7167166 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GoogleMaps.h b/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Headers/GoogleMaps.h new file mode 100755 index 0000000..b617468 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Modules/module.modulemap b/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Modules/module.modulemap new file mode 100755 index 0000000..d60ea20 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCacheStorage.momd/Storage.mom b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCacheStorage.momd/Storage.mom differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCacheStorage.momd/StorageWithTileProto.mom b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCacheStorage.momd/StorageWithTileProto.mom differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCacheStorage.momd/StorageWithTileVersionID.mom b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCacheStorage.momd/StorageWithTileVersionID.mom differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCacheStorage.momd/VersionInfo.plist b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCacheStorage.momd/VersionInfo.plist differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/Assets.car b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/Assets.car differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/DroidSansMerged-Regular.ttf b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/DroidSansMerged-Regular.ttf differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/GMSNavNightModeSprites-0-1x.png b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/GMSNavNightModeSprites-0-1x.png differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/GMSNavNightModeSprites-0-2x.png b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/GMSNavNightModeSprites-0-2x.png differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/GMSNavNightModeSprites-0-3x.png b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/GMSNavNightModeSprites-0-3x.png differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/GMSNavSprites-0-1x.png b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/GMSNavSprites-0-1x.png differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/GMSNavSprites-0-2x.png b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/GMSNavSprites-0-2x.png differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/GMSNavSprites-0-3x.png b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/GMSNavSprites-0-3x.png differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/GMSSprites-0-1x.png b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/GMSSprites-0-1x.png differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/GMSSprites-0-2x.png b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/GMSSprites-0-2x.png differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/GMSSprites-0-3x.png b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/GMSSprites-0-3x.png differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/Info.plist b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/Info.plist differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/Tharlon-Regular.ttf b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/Tharlon-Regular.ttf differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ar.lproj/GMSCore.strings b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ar.lproj/GMSCore.strings differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/button_background.png b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/button_background.png differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/button_background@2x.png b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/button_background@2x.png differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/button_background@3x.png b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/button_background@3x.png differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/button_compass.png b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/button_compass.png differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/button_compass@2x.png b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/button_compass@2x.png differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/button_compass_night.png b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/button_compass_night.png differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/button_compass_night@2x.png b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/button_compass_night@2x.png differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/button_my_location.png b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/button_my_location.png differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/button_my_location@2x.png b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/button_my_location@2x.png differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ca.lproj/GMSCore.strings b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ca.lproj/GMSCore.strings differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/cs.lproj/GMSCore.strings b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/cs.lproj/GMSCore.strings differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/da.lproj/GMSCore.strings b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/da.lproj/GMSCore.strings differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/dav_one_way_16_256.png b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/dav_one_way_16_256.png differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/de.lproj/GMSCore.strings b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/de.lproj/GMSCore.strings differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/el.lproj/GMSCore.strings b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/el.lproj/GMSCore.strings differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/en.lproj/GMSCore.strings b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/en.lproj/GMSCore.strings differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/en_AU.lproj/GMSCore.strings b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/en_AU.lproj/GMSCore.strings differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/en_GB.lproj/GMSCore.strings b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/en_GB.lproj/GMSCore.strings differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/en_IN.lproj/GMSCore.strings b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/en_IN.lproj/GMSCore.strings differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/es.lproj/GMSCore.strings b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/es.lproj/GMSCore.strings differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/es_419.lproj/GMSCore.strings b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/es_419.lproj/GMSCore.strings differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/es_MX.lproj/GMSCore.strings b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/es_MX.lproj/GMSCore.strings differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/fi.lproj/GMSCore.strings b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/fi.lproj/GMSCore.strings differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/fr.lproj/GMSCore.strings b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/fr.lproj/GMSCore.strings differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/fr_CA.lproj/GMSCore.strings b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/fr_CA.lproj/GMSCore.strings differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/he.lproj/GMSCore.strings b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/he.lproj/GMSCore.strings differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/hi.lproj/GMSCore.strings b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/hi.lproj/GMSCore.strings differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/hr.lproj/GMSCore.strings b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/hr.lproj/GMSCore.strings differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/hu.lproj/GMSCore.strings b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/hu.lproj/GMSCore.strings differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_compass_needle.png b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_compass_needle.png differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_compass_needle@2x.png b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_compass_needle@2x.png differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_compass_needle_32pt.png b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_compass_needle_32pt.png differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_compass_needle_32pt@2x.png b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_compass_needle_32pt@2x.png differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_compass_needle_32pt@3x.png b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_compass_needle_32pt@3x.png differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_compass_needle_large.png b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_compass_needle_large.png differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_compass_needle_large@2x.png b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_compass_needle_large@2x.png differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_compass_needle_large@3x.png b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_compass_needle_large@3x.png differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_location_off.png b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_location_off.png differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_location_off@2x.png b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_location_off@2x.png differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_location_off@3x.png b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_location_off@3x.png differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_qu_direction_mylocation.png b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_qu_direction_mylocation.png differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_qu_direction_mylocation@2x.png b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_qu_direction_mylocation@2x.png differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_qu_direction_mylocation@3x.png b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ic_qu_direction_mylocation@3x.png differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/id.lproj/GMSCore.strings b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/id.lproj/GMSCore.strings differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/it.lproj/GMSCore.strings b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/it.lproj/GMSCore.strings differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ja.lproj/GMSCore.strings b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ja.lproj/GMSCore.strings differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ko.lproj/GMSCore.strings b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ko.lproj/GMSCore.strings differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/lt.lproj/GMSCore.strings b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/lt.lproj/GMSCore.strings differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/lv.lproj/GMSCore.strings b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/lv.lproj/GMSCore.strings differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ms.lproj/GMSCore.strings b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ms.lproj/GMSCore.strings differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/nb.lproj/GMSCore.strings b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/nb.lproj/GMSCore.strings differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/nl.lproj/GMSCore.strings b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/nl.lproj/GMSCore.strings differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/pl.lproj/GMSCore.strings b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/pl.lproj/GMSCore.strings differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/polyline_colors_texture.png b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/polyline_colors_texture.png differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/polyline_colors_texture_dim.png b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/polyline_colors_texture_dim.png differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/pt.lproj/GMSCore.strings b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/pt.lproj/GMSCore.strings differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/pt_BR.lproj/GMSCore.strings b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/pt_BR.lproj/GMSCore.strings differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/pt_PT.lproj/GMSCore.strings b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/pt_PT.lproj/GMSCore.strings differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ro.lproj/GMSCore.strings b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ro.lproj/GMSCore.strings differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/road_1-1.png b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/road_1-1.png differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/road_128-32.png b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/road_128-32.png differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/road_16-4.png b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/road_16-4.png differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/road_2-1.png b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/road_2-1.png differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/road_256-64.png b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/road_256-64.png differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/road_32-8.png b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/road_32-8.png differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/road_4-1.png b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/road_4-1.png differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/road_64-16.png b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/road_64-16.png differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/road_8-2.png b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/road_8-2.png differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ru.lproj/GMSCore.strings b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/ru.lproj/GMSCore.strings differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/sk.lproj/GMSCore.strings b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/sk.lproj/GMSCore.strings differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/sv.lproj/GMSCore.strings b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/sv.lproj/GMSCore.strings differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/th.lproj/GMSCore.strings b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/th.lproj/GMSCore.strings differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/tr.lproj/GMSCore.strings b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/tr.lproj/GMSCore.strings differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/uk.lproj/GMSCore.strings b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/uk.lproj/GMSCore.strings differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/vi.lproj/GMSCore.strings b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/vi.lproj/GMSCore.strings differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/zh_CN.lproj/GMSCore.strings b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/zh_CN.lproj/GMSCore.strings differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/zh_HK.lproj/GMSCore.strings b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/zh_HK.lproj/GMSCore.strings differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/zh_TW.lproj/GMSCore.strings b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/GMSCoreResources.bundle/zh_TW.lproj/GMSCore.strings differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/Info.plist b/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/Info.plist new file mode 100755 index 0000000..919fa75 Binary files /dev/null and b/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/Info.plist differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/bubble_left.png b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/bubble_left.png differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/bubble_left@2x.png b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/bubble_left@2x.png differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/bubble_left@3x.png b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/bubble_left@3x.png differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/bubble_right.png b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/bubble_right.png differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/bubble_right@2x.png b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/bubble_right@2x.png differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/bubble_right@3x.png b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/bubble_right@3x.png differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/default_marker.png b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/default_marker.png differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/default_marker@2x.png b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/default_marker@2x.png differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/default_marker@3x.png b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/default_marker@3x.png differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/ic_error.png b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/ic_error.png differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/ic_error@2x.png b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/ic_error@2x.png differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/ic_error@3x.png b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/ic_error@3x.png differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/oss_licenses_maps.txt.gz b/TracMobility/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/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle/oss_licenses_maps.txt.gz differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMapsCore.framework/GoogleMapsCore b/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMapsCore.framework/GoogleMapsCore new file mode 100755 index 0000000..442a75f Binary files /dev/null and b/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMapsCore.framework/GoogleMapsCore differ diff --git a/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMapsCore.framework/Modules/module.modulemap b/TracMobility/Pods/GoogleMaps/Maps/Frameworks/GoogleMapsCore.framework/Modules/module.modulemap new file mode 100755 index 0000000..28f52fc --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/GoogleMaps/README.md b/TracMobility/Pods/GoogleMaps/README.md new file mode 100755 index 0000000..c0c1128 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/JWTDecode/JWTDecode/A0JWT.swift b/TracMobility/Pods/JWTDecode/JWTDecode/A0JWT.swift new file mode 100644 index 0000000..2c7a7c5 --- /dev/null +++ b/TracMobility/Pods/JWTDecode/JWTDecode/A0JWT.swift @@ -0,0 +1,71 @@ +// A0JWT.swift +// +// Copyright (c) 2015 Auth0 (http://auth0.com) +// +// 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 + +/// Decodes a JWT +@objc(A0JWT) +public class _JWT: NSObject { + + var jwt: JWT + + init(jwt: JWT) { + self.jwt = jwt + } + + /// token header part + @objc public var header: [String: Any] { + return self.jwt.header + } + + /// token body part or claims + @objc public var body: [String: Any] { + return self.jwt.body + } + + /// token signature part + @objc public var signature: String? { + return self.jwt.signature + } + + /// value of the `exp` claim + @objc public var expiresAt: Date? { + return self.jwt.expiresAt as Date? + } + + /// value of the `expired` field + @objc public var expired: Bool { + return self.jwt.expired + } + + /** + Creates a new instance of `A0JWT` and decodes the given jwt token. + + :param: jwtValue of the token to decode + + :returns: a new instance of `A0JWT` that holds the decode token + */ + @objc public class func decode(jwt jwtValue: String) throws -> _JWT { + let jwt = try DecodedJWT(jwt: jwtValue) + return _JWT(jwt: jwt) + } +} diff --git a/TracMobility/Pods/JWTDecode/JWTDecode/Errors.swift b/TracMobility/Pods/JWTDecode/JWTDecode/Errors.swift new file mode 100644 index 0000000..b54554b --- /dev/null +++ b/TracMobility/Pods/JWTDecode/JWTDecode/Errors.swift @@ -0,0 +1,47 @@ +// Errors.swift +// +// Copyright (c) 2015 Auth0 (http://auth0.com) +// +// 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 + +/** +JWT decode error codes + +- InvalidBase64UrlValue: when either the header or body parts cannot be base64 decoded +- InvalidJSONValue: when either the header or body decoded values is not a valid JSON object +- InvalidPartCount: when the token doesnt have the required amount of parts (header, body and signature) +*/ +public enum DecodeError: LocalizedError { + case invalidBase64Url(String) + case invalidJSON(String) + case invalidPartCount(String, Int) + + public var localizedDescription: String { + switch self { + case .invalidJSON(let value): + return NSLocalizedString("Malformed jwt token, failed to parse JSON value from base64Url \(value)", comment: "Invalid JSON value inside base64Url") + case .invalidPartCount(let jwt, let parts): + return NSLocalizedString("Malformed jwt token \(jwt) has \(parts) parts when it should have 3 parts", comment: "Invalid amount of jwt parts") + case .invalidBase64Url(let value): + return NSLocalizedString("Malformed jwt token, failed to decode base64Url value \(value)", comment: "Invalid JWT token base64Url value") + } + } +} diff --git a/TracMobility/Pods/JWTDecode/JWTDecode/JWT.swift b/TracMobility/Pods/JWTDecode/JWTDecode/JWT.swift new file mode 100644 index 0000000..ee559f3 --- /dev/null +++ b/TracMobility/Pods/JWTDecode/JWTDecode/JWT.swift @@ -0,0 +1,70 @@ +// JWT.swift +// +// Copyright (c) 2015 Auth0 (http://auth0.com) +// +// 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 that defines what a decoded JWT token should be. +*/ +public protocol JWT { + /// token header part contents + var header: [String: Any] { get } + /// token body part values or token claims + var body: [String: Any] { get } + /// token signature part + var signature: String? { get } + /// jwt string value + var string: String { get } + + /// value of `exp` claim if available + var expiresAt: Date? { get } + /// value of `iss` claim if available + var issuer: String? { get } + /// value of `sub` claim if available + var subject: String? { get } + /// value of `aud` claim if available + var audience: [String]? { get } + /// value of `iat` claim if available + var issuedAt: Date? { get } + /// value of `nbf` claim if available + var notBefore: Date? { get } + /// value of `jti` claim if available + var identifier: String? { get } + + /// Checks if the token is currently expired using the `exp` claim. If there is no claim present it will deem the token not expired + var expired: Bool { get } +} + +public extension JWT { + + /** + Return a claim by it's name + + - parameter name: name of the claim in the JWT + + - returns: a claim of the JWT + */ + func claim(name: String) -> Claim { + let value = self.body[name] + return Claim(value: value) + } +} diff --git a/TracMobility/Pods/JWTDecode/JWTDecode/JWTDecode.swift b/TracMobility/Pods/JWTDecode/JWTDecode/JWTDecode.swift new file mode 100644 index 0000000..3b1b926 --- /dev/null +++ b/TracMobility/Pods/JWTDecode/JWTDecode/JWTDecode.swift @@ -0,0 +1,163 @@ +// JWTDecode.swift +// +// Copyright (c) 2015 Auth0 (http://auth0.com) +// +// 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 + +/** + Decodes a JWT token into an object that holds the decoded body (along with token header and signature parts). + If the token cannot be decoded a `NSError` will be thrown. + + - parameter jwt: jwt string value to decode + + - throws: an error if the JWT cannot be decoded + + - returns: a decoded token as an instance of JWT + */ +public func decode(jwt: String) throws -> JWT { + return try DecodedJWT(jwt: jwt) +} + +struct DecodedJWT: JWT { + + let header: [String: Any] + let body: [String: Any] + let signature: String? + let string: String + + init(jwt: String) throws { + let parts = jwt.components(separatedBy: ".") + guard parts.count == 3 else { + throw DecodeError.invalidPartCount(jwt, parts.count) + } + + self.header = try decodeJWTPart(parts[0]) + self.body = try decodeJWTPart(parts[1]) + self.signature = parts[2] + self.string = jwt + } + + var expiresAt: Date? { return claim(name: "exp").date } + var issuer: String? { return claim(name: "iss").string } + var subject: String? { return claim(name: "sub").string } + var audience: [String]? { return claim(name: "aud").array } + var issuedAt: Date? { return claim(name: "iat").date } + var notBefore: Date? { return claim(name: "nbf").date } + var identifier: String? { return claim(name: "jti").string } + + var expired: Bool { + guard let date = self.expiresAt else { + return false + } + return date.compare(Date()) != ComparisonResult.orderedDescending + } +} + +/** + * JWT Claim + */ +public struct Claim { + + /// raw value of the claim + let value: Any? + + /// original claim value + public var rawValue: Any? { + return self.value + } + + /// value of the claim as `String` + public var string: String? { + return self.value as? String + } + + /// value of the claim as `Bool` + public var boolean: Bool? { + return self.value as? Bool + } + + /// value of the claim as `Double` + public var double: Double? { + var double: Double? + if let string = self.string { + double = Double(string) + } else if self.boolean == nil { + double = self.value as? Double + } + return double + } + + /// value of the claim as `Int` + public var integer: Int? { + var integer: Int? + if let string = self.string { + integer = Int(string) + } else if let double = self.double { + integer = Int(double) + } else if self.boolean == nil { + integer = self.value as? Int + } + return integer + } + + /// value of the claim as `NSDate` + public var date: Date? { + guard let timestamp: TimeInterval = self.double else { return nil } + return Date(timeIntervalSince1970: timestamp) + } + + /// value of the claim as `[String]` + public var array: [String]? { + if let array = self.value as? [String] { + return array + } + if let value = self.string { + return [value] + } + return nil + } +} + +private func base64UrlDecode(_ value: String) -> Data? { + var base64 = value + .replacingOccurrences(of: "-", with: "+") + .replacingOccurrences(of: "_", with: "/") + let length = Double(base64.lengthOfBytes(using: String.Encoding.utf8)) + let requiredLength = 4 * ceil(length / 4.0) + let paddingLength = requiredLength - length + if paddingLength > 0 { + let padding = "".padding(toLength: Int(paddingLength), withPad: "=", startingAt: 0) + base64 += padding + } + return Data(base64Encoded: base64, options: .ignoreUnknownCharacters) +} + +private func decodeJWTPart(_ value: String) throws -> [String: Any] { + guard let bodyData = base64UrlDecode(value) else { + throw DecodeError.invalidBase64Url(value) + } + + guard let json = try? JSONSerialization.jsonObject(with: bodyData, options: []), let payload = json as? [String: Any] else { + throw DecodeError.invalidJSON(value) + } + + return payload +} diff --git a/TracMobility/Pods/JWTDecode/JWTDecode/TokenValidators.swift b/TracMobility/Pods/JWTDecode/JWTDecode/TokenValidators.swift new file mode 100644 index 0000000..1cc160c --- /dev/null +++ b/TracMobility/Pods/JWTDecode/JWTDecode/TokenValidators.swift @@ -0,0 +1,62 @@ +// +// TokenValidators.swift +// JWTDecode +// +// Copyright © 2018 Auth0. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +import Foundation + +/// IDTokenValidation will validate claims +public struct IDTokenValidation: ValidatorJWT { + + /// `iss` claim value + public let issuer: String + + /// `aud` claim value + public let audience: String + + /// Initialiser + /// + /// - Parameters: + /// - issuer: Expected `iss` claim value + /// - audience: Expected `aud` claim value + public init(issuer: String, audience: String) { + self.issuer = issuer + self.audience = audience + } + + /// Validate a JWT + /// + /// - Parameters: + /// - jwt: The JWT to validate + /// - nonce: (Optional) nonce value + /// - Returns: Outcome + public func validate(_ jwt: JWT, nonce: String? = nil) -> ValidationError? { + guard let jwtAudience = jwt.audience else { return .invalidClaim("aud") } + if !jwtAudience.contains(audience) { return .invalidClaim("aud") } + if issuer != jwt.issuer { return .invalidClaim("iss") } + if jwt.expired { return .expired } + if let jwtNonce = jwt.claim(name: "nonce").string { + guard let nonce = nonce, nonce == jwtNonce else { return .nonce } + } + return nil + } +} diff --git a/TracMobility/Pods/JWTDecode/JWTDecode/ValidationError.swift b/TracMobility/Pods/JWTDecode/JWTDecode/ValidationError.swift new file mode 100644 index 0000000..d308bc9 --- /dev/null +++ b/TracMobility/Pods/JWTDecode/JWTDecode/ValidationError.swift @@ -0,0 +1,15 @@ +// +// ValidationError.swift +// JWTDecode +// +// Created by Martin Walsh on 10/12/2018. +// Copyright © 2018 Auth0. All rights reserved. +// + +import Foundation + +public enum ValidationError: Error { + case invalidClaim(String) + case expired + case nonce +} diff --git a/TracMobility/Pods/JWTDecode/JWTDecode/ValidatorJWT.swift b/TracMobility/Pods/JWTDecode/JWTDecode/ValidatorJWT.swift new file mode 100644 index 0000000..8398e6f --- /dev/null +++ b/TracMobility/Pods/JWTDecode/JWTDecode/ValidatorJWT.swift @@ -0,0 +1,32 @@ +// +// ValidatorJWT.swift +// JWTDecode +// +// Copyright © 2018 Auth0. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +import Foundation + +protocol ValidatorJWT { + var issuer: String { get } + var audience: String { get } + + func validate(_ jwt: JWT, nonce: String?) -> ValidationError? +} diff --git a/TracMobility/Pods/JWTDecode/LICENSE.txt b/TracMobility/Pods/JWTDecode/LICENSE.txt new file mode 100644 index 0000000..fa9bc72 --- /dev/null +++ b/TracMobility/Pods/JWTDecode/LICENSE.txt @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014 Auth0, Inc. (http://auth0.com) + +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/TracMobility/Pods/JWTDecode/README.md b/TracMobility/Pods/JWTDecode/README.md new file mode 100644 index 0000000..c8fb4f7 --- /dev/null +++ b/TracMobility/Pods/JWTDecode/README.md @@ -0,0 +1,206 @@ +# JWTDecode.swift + +[![CircleCI](https://img.shields.io/circleci/build/github/auth0/JWTDecode.swift?style=flat-square)](https://circleci.com/gh/auth0/JWTDecode.swift) +[![Coverage Status](https://img.shields.io/codecov/c/github/auth0/JWTDecode.swift/master.svg?style=flat-square)](https://codecov.io/github/auth0/JWTDecode.swift) +[![Version](https://img.shields.io/cocoapods/v/JWTDecode.svg?style=flat-square)](https://cocoadocs.org/docsets/JWTDecode) +[![License](https://img.shields.io/cocoapods/l/JWTDecode.svg?style=flat-square)](https://cocoadocs.org/docsets/JWTDecode) +[![Platform](https://img.shields.io/cocoapods/p/JWTDecode.svg?style=flat-square)](https://cocoadocs.org/docsets/JWTDecode) +![Swift 5.3](https://img.shields.io/badge/Swift-5.3-orange.svg?style=flat-square) + +This library will help you check [JWT](https://jwt.io/) payload + +> This library doesn't validate the token, any well formed JWT can be decoded from Base64Url. + +## Table of Contents + +- [Requirements](#requirements) +- [Installation](#installation) +- [Usage](#usage) +- [What is Auth0?](#what-is-auth0) +- [Create a Free Auth0 Account](#create-a-free-auth0-account) +- [Issue Reporting](#issue-reporting) +- [Author](#author) +- [License](#license) + +## Requirements + +- iOS 9+ / macOS 10.11+ / tvOS 9.0+ / watchOS 2.0+ +- Xcode 11.4+ / 12.x +- Swift 4.x / 5.x + +## Installation + +#### Cocoapods + +If you are using [Cocoapods](https://cocoapods.org), add this line to your `Podfile`: + +```ruby +pod 'JWTDecode', '~> 2.6' +``` + +Then run `pod install`. + +> For more information on Cocoapods, check [their official documentation](https://guides.cocoapods.org/using/getting-started.html). + +#### Carthage + +If you are using [Carthage](https://github.com/Carthage/Carthage), add the following line to your `Cartfile`: + +```ruby +github "auth0/JWTDecode.swift" ~> 2.6 +``` + +Then run `carthage bootstrap`. + +> For more information about Carthage usage, check [their official documentation](https://github.com/Carthage/Carthage#if-youre-building-for-ios-tvos-or-watchos). + +#### SPM + +If you are using the Swift Package Manager, open the following menu item in Xcode: + +**File > Swift Packages > Add Package Dependency...** + +In the **Choose Package Repository** prompt add this url: + +``` +https://github.com/auth0/JWTDecode.swift.git +``` + +Then press **Next** and complete the remaining steps. + +> For further reference on SPM, check [its official documentation](https://developer.apple.com/documentation/xcode/adding_package_dependencies_to_your_app). + +## Usage + +Import the framework + +```swift +import JWTDecode +``` + +Decode the token + +```swift +let jwt = try decode(jwt: token) +``` + +### JWT Parts + +#### Header dictionary + +```swift +jwt.header +``` + +#### Claims in token body + +```swift +jwt.body +``` + +#### Token signature + +```swift +jwt.signature +``` + +### Registered Claims + +* "aud" (Audience) +```swift +jwt.audience +``` +* "sub" (Subject) +```swift +jwt.subject +``` +* "jti" (JWT ID) +```swift +jwt.identifier +``` +* "iss" (Issuer) +```swift +jwt.issuer +``` +* "nbf" (Not Before) +```swift +jwt.notBefore +``` +* "iat" (Issued At) +```swift +jwt.issuedAt +``` +* "exp" (Expiration Time) +```swift +jwt.expiresAt +``` + +### Custom Claims + +If we also have our custom claims we can retrive them calling `claim(name: String) -> Claim` then you can try converting the value like: + +```swift +let claim = jwt.claim(name: "email") +if let email = claim.string { + print("Email in jwt was \(email)") +} +``` + +The supported conversions are: + +```swift +var string: String? +var boolean: Bool? +var integer: Int? +var double: Double? +var date: NSDate? +var array: [String]? +``` + +You can easily add a convenience accessor for a custom claim by adding an extension: + +```swift +extension JWT { + var myClaim: String? { + return claim(name: "my_claim").string + } +} +``` + +### Error Handling + +If the token is invalid an `NSError` will be thrown from the `decode(token)` function: + +```swift +catch let error as NSError { + error.localizedDescription +} +``` + +## What is Auth0? + +Auth0 helps you to: + +* Add authentication with [multiple sources](https://auth0.com/docs/identityproviders), either social identity providers such as **Google, Facebook, Microsoft Account, LinkedIn, GitHub, Twitter, Box, Salesforce** (amongst others), or enterprise identity systems like **Windows Azure AD, Google Apps, Active Directory, ADFS, or any SAML Identity Provider**. +* Add authentication through more traditional **[username/password databases](https://auth0.com/docs/connections/database/custom-db)**. +* Add support for **[linking different user accounts](https://auth0.com/docs/users/user-account-linking)** with the same user. +* Support for generating signed [JSON Web Tokens](https://auth0.com/docs/tokens/json-web-tokens) to call your APIs and **flow the user identity** securely. +* Analytics of how, when, and where users are logging in. +* Pull data from other sources and add it to the user profile through [JavaScript rules](https://auth0.com/docs/rules). + +## Create a Free Auth0 Account + +1. Go to [Auth0](https://auth0.com) and click **Sign Up**. +2. Use Google, GitHub, or Microsoft Account to login. + +## Issue Reporting + +If you have found a bug or to request a feature, please [raise an issue](https://github.com/auth0/JWTDecode.swift/issues). Please do not report security vulnerabilities on the public GitHub issue tracker. The [Responsible Disclosure Program](https://auth0.com/responsible-disclosure-policy) details the procedure for disclosing security issues. + +## Author + +[Auth0](https://auth0.com) + +## License + +This project is licensed under the MIT license. See the [LICENSE](LICENSE.txt) file for more info. diff --git a/TracMobility/Pods/Manifest.lock b/TracMobility/Pods/Manifest.lock new file mode 100644 index 0000000..3684915 --- /dev/null +++ b/TracMobility/Pods/Manifest.lock @@ -0,0 +1,36 @@ +PODS: + - Auth0 (1.30.1): + - JWTDecode + - SimpleKeychain + - GoogleMaps (3.8.0): + - GoogleMaps/Maps (= 3.8.0) + - GoogleMaps/Base (3.8.0) + - GoogleMaps/Maps (3.8.0): + - GoogleMaps/Base + - JWTDecode (2.6.0) + - SideMenu (6.5.0) + - SimpleKeychain (0.12.1) + +DEPENDENCIES: + - Auth0 (~> 1.0) + - GoogleMaps + - SideMenu + +SPEC REPOS: + trunk: + - Auth0 + - GoogleMaps + - JWTDecode + - SideMenu + - SimpleKeychain + +SPEC CHECKSUMS: + Auth0: 59bece5b578a93589bd321fafeed8a042429f9db + GoogleMaps: 7c8d66d70e4e8c300f43a7219d8fdaad7b325a9a + JWTDecode: 480ca441ddbd5fbfb2abf17870af62f86436be58 + SideMenu: f583187d21c5b1dd04c72002be544b555a2627a2 + SimpleKeychain: 77443015b0f29005c16f74bf858469a9e9fb05e8 + +PODFILE CHECKSUM: 5cdb4d80683f13bc6aa85c5add3b703dd05254bd + +COCOAPODS: 1.9.3 diff --git a/TracMobility/Pods/Pods.xcodeproj/project.pbxproj b/TracMobility/Pods/Pods.xcodeproj/project.pbxproj new file mode 100644 index 0000000..d98a4b9 --- /dev/null +++ b/TracMobility/Pods/Pods.xcodeproj/project.pbxproj @@ -0,0 +1,1730 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 51; + objects = { + +/* Begin PBXAggregateTarget section */ + E5B4BBC6DD552AC8943C7E22772FC1D3 /* GoogleMaps */ = { + isa = PBXAggregateTarget; + buildConfigurationList = 46921981F609C5BA3CB72EC4EA41299D /* Build configuration list for PBXAggregateTarget "GoogleMaps" */; + buildPhases = ( + ); + dependencies = ( + ); + name = GoogleMaps; + }; +/* End PBXAggregateTarget section */ + +/* Begin PBXBuildFile section */ + 0268532C49DBAAF7C54D780BD1AAC501 /* Optional+DebugDescription.swift in Sources */ = {isa = PBXBuildFile; fileRef = EB38B52B33F3D388011F418C092F9891 /* Optional+DebugDescription.swift */; }; + 031AA2DB67A55EE7AE432981DFDC59B8 /* AuthTransaction.swift in Sources */ = {isa = PBXBuildFile; fileRef = FF4C3FE49CE6A4FA6CB658413F512E82 /* AuthTransaction.swift */; }; + 05F3DCAC68787DC15026B845F13C594E /* Auth0-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = D28755E8281FD4BA791065D42A44AD67 /* Auth0-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 075EB555ADF78E375C09892C0DF767B8 /* BaseWebAuth.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CFF4C3D038B7DECE2673B512408C035 /* BaseWebAuth.swift */; }; + 08B5B89F28224381711F45A680C292D9 /* SideMenu-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 431DE50331EAF872CF8BE347BE74B8CD /* SideMenu-dummy.m */; }; + 0980A9BE78CDFF3939DAE1E34EF60989 /* SessionTransaction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2390A38AFFB1085C878915F84CD55319 /* SessionTransaction.swift */; }; + 09A0A5D3733F69E93F553ABBCF02FB77 /* SideMenuTransitionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C045B7B17F7973CB76F71B4F325E30C6 /* SideMenuTransitionController.swift */; }; + 0AEE4116D2A72294B7BF5DFD818601BB /* Authentication.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1288A681B1EB36E0912E82775F8F84E8 /* Authentication.swift */; }; + 108A8FDEFCBC5565CFE4DDD633CA3786 /* NativeAuth.swift in Sources */ = {isa = PBXBuildFile; fileRef = B53BDAABF7474387636EE70164D2B049 /* NativeAuth.swift */; }; + 13F2400A3D1CC07C79DE79475E35B222 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C4728485F928E461B2B4C8476CFF8ED3 /* Foundation.framework */; }; + 144781611443EFAEB8FD220585FA7131 /* AuthenticationError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 25E7692069F18F06E521B505CC558610 /* AuthenticationError.swift */; }; + 158E4A12218EAAF6FC2B70AABCF6EC5A /* A0SHA.m in Sources */ = {isa = PBXBuildFile; fileRef = 7087FEF4612227C9C9B503D6959929C1 /* A0SHA.m */; }; + 1A766F05FEF8113BE3ADCD85F0D172DC /* JWTDecode-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = FF0D51A7ACFBEB473611F4D8C0296EC9 /* JWTDecode-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1A8F7F847C21F79B444FF4FEB50C6557 /* JWTAlgorithm.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2ABDF5C6D0653872ED0D7302B4915FD9 /* JWTAlgorithm.swift */; }; + 1C9E35BACF130380DE342F8BCED81656 /* UserPatchAttributes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 063DB918521A2D3D829FC67C6849CB1D /* UserPatchAttributes.swift */; }; + 26CAAE4FBB59E5C0906E4DD293E626C9 /* MobileWebAuth.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34854CF6A054FDCB8370EDEC4F208499 /* MobileWebAuth.swift */; }; + 27D830F1CAC60B99CC0A135F583BFFF2 /* SideMenuPresentationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18C46E374FA37EE164F60207FAFDB162 /* SideMenuPresentationController.swift */; }; + 28FCC2639F983C267560757EE8016B71 /* JWK+RSA.swift in Sources */ = {isa = PBXBuildFile; fileRef = F6280D208E4D395E579C2A49CF8A7DE6 /* JWK+RSA.swift */; }; + 2AFCDFE6A273702D6F5FBA2CB9CEEA89 /* JSONObjectPayload.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5F73EEFDF7F9CBE27F5268A2C5C40445 /* JSONObjectPayload.swift */; }; + 2E4C1D73F9B4BE6AB4651AAF2A33C080 /* Identity.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6833196048BBD3099FA1E841191042A /* Identity.swift */; }; + 2E91482C596C57275E8C3E92D9459965 /* _ObjectiveManagementAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0C06DCF74DEFC979615128EF18D1FCCC /* _ObjectiveManagementAPI.swift */; }; + 2ED518A3FA8DCBE08E621AC5C32844A9 /* SideMenuPushCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = D4221A6AB1B01170C3D9277D48E3F41F /* SideMenuPushCoordinator.swift */; }; + 34FC7C594EE887C6670A84323316F0BC /* IDTokenValidatorContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4D8580BC0D4CBC4480E0D279DEA58DD6 /* IDTokenValidatorContext.swift */; }; + 37BFAC529368699DED04412DB116BD90 /* Errors.swift in Sources */ = {isa = PBXBuildFile; fileRef = B2FD09CF034CE86FC89CEAF15D215ACA /* Errors.swift */; }; + 3833083FC6BFBA503C9FC9C68376203C /* NSError+Helper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7FCBC915F5D36EE86AD61F94A5AC9FCB /* NSError+Helper.swift */; }; + 3846AFE38D1B63A9F0D9073C4ABC6DAA /* SideMenuNavigationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A0FAB9595E4CF6C2701F9BFCB3F75837 /* SideMenuNavigationController.swift */; }; + 3E18B004D34ED5441A193684EEB25BD3 /* SideMenuPresentationStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 242514B5A974F83D7DB8BE059F60B575 /* SideMenuPresentationStyle.swift */; }; + 3EE70F74E18571874287B97D7641BA7F /* JWKS.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83155C227451FEC6D4A952972F0594D9 /* JWKS.swift */; }; + 4859275B55A35267EC1D394764F6128D /* Response.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02A8C407A3EC6FAFD3570D94C6656D7D /* Response.swift */; }; + 49533E706980EAA66039DB3F38F2A28A /* SimpleKeychain.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2E92114C344AE8A4D40C3E49ECCBD169 /* SimpleKeychain.framework */; }; + 4CB0FAC615F7C6324BD74DC2CEF70F51 /* Auth0-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 391299F51852DF5E78863903032BD175 /* Auth0-dummy.m */; }; + 4DC6B7D91C30204B8F6DF6C81F219DC0 /* SimpleKeychain-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = EC6AF10DE4E93F6D71CA2F8F96B09DEE /* SimpleKeychain-dummy.m */; }; + 4E88B70410F6837FBD463EA4B6C33155 /* Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9B84C70B33EAC62431B9DD67D1024A16 /* Extensions.swift */; }; + 53D61E1A80DB1962DF9146EC301D151F /* OAuth2Grant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32BED9294088A211804A7335AEC43F19 /* OAuth2Grant.swift */; }; + 562590480CD89E5C6A191D6D0DBB240F /* A0SimpleKeychain+KeyPair.m in Sources */ = {isa = PBXBuildFile; fileRef = E864240BF4548C5826BB0CBA8CFF4AA9 /* A0SimpleKeychain+KeyPair.m */; }; + 564747C8631A7C4CF2E6F0C8120A4A4C /* WebAuthenticatable.swift in Sources */ = {isa = PBXBuildFile; fileRef = EFD46261617F3B8229CB4EEECA428233 /* WebAuthenticatable.swift */; }; + 56BC5638EB64537C7AE45AADA512AB26 /* Handlers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 89D272D716B77B0723553447F165B5DD /* Handlers.swift */; }; + 5939998F45BC3D41273E018CB7A9A399 /* BaseAuthTransaction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00374C12A71CEF4018A62825B6F580C8 /* BaseAuthTransaction.swift */; }; + 5A497CB1B9901F80CEE853D333A3721D /* Auth0Error.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E670C734174B5AD81C6CCE6E378D797 /* Auth0Error.swift */; }; + 5B64910E5E7AEB168FB1463894C2E176 /* Users.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65D6620311D0EDDD6F0CB788A32A8E19 /* Users.swift */; }; + 5F237E7E41E9759AC99453AC1E011137 /* SessionCallbackTransaction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 79359272382C210A835B5E9506DE9EE0 /* SessionCallbackTransaction.swift */; }; + 644BEE229C53B59F1C68AD61D92B70FD /* SimpleKeychain.h in Headers */ = {isa = PBXBuildFile; fileRef = 68DE8317BA4663E2789D88E2C274DF2B /* SimpleKeychain.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 647885596AAC09B0413F07E2DC733074 /* Profile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42F24A0C3D178162DC3E4F17100ACC13 /* Profile.swift */; }; + 667F36F4A03E02349286319BD83B8CBB /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 48EB2316FEBBDA7321B103B88734234D /* UIKit.framework */; }; + 66EC7587AF5B4A1E73F334764A7BE210 /* A0ChallengeGenerator.m in Sources */ = {isa = PBXBuildFile; fileRef = 93CF93EB7DB3C198998762FB9315D147 /* A0ChallengeGenerator.m */; }; + 674877CBD8A08565CFEB59419ADC4032 /* CredentialsManagerError.swift in Sources */ = {isa = PBXBuildFile; fileRef = E7F685F703FDCAC2FF4E8BE3D71D768E /* CredentialsManagerError.swift */; }; + 6E940C89414F12244419074797274CC8 /* A0JWT.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B69DBED39CAB2CE9E273A437FE528B6 /* A0JWT.swift */; }; + 6FC7B6F2CA574085656A1067C0E87E79 /* ManagementError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6B111F2BD9E5F08B5FD596D3E3DE1198 /* ManagementError.swift */; }; + 71B11342537D6949773E7BEDA74CAB65 /* NSURL+Auth0.swift in Sources */ = {isa = PBXBuildFile; fileRef = 402175C8526A22EF561308A268C06A8B /* NSURL+Auth0.swift */; }; + 726E2ABD01E7918A6461B83734162CE3 /* A0SHA.h in Headers */ = {isa = PBXBuildFile; fileRef = 9262692EDF916CD6D17E2D0C939B2155 /* A0SHA.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 72DA7F412D36835CB1ACBA58FE4C706F /* _ObjectiveWebAuth.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0055104C11DE955DA53DED6BDC58E39A /* _ObjectiveWebAuth.swift */; }; + 730874225865FFEE25F60831C481E6F5 /* Pods-TracMobility-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 53F512DAC0E037B3061DFB0A35CB8F24 /* Pods-TracMobility-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 74D8072A379878000E0F6605D6D874D9 /* A0SimpleKeychain+KeyPair.h in Headers */ = {isa = PBXBuildFile; fileRef = 6B867D5ABFD5006560EC06A30C34BA9B /* A0SimpleKeychain+KeyPair.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 761EC698F1E152E7BCCFF6C5B2DCBDC4 /* Auth0Authentication.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7353C301AF4C4A7CC91BF0A48CA47AF7 /* Auth0Authentication.swift */; }; + 77AF2098DDCCAAE0CE4A20725C466905 /* SideMenuManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE00364594B82AA072B8A1C030D12FCD /* SideMenuManager.swift */; }; + 789B84C5A99A1963B2D7C3B5DD31170E /* Requestable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8C360C7F5F88DC7F954EA72A577313BE /* Requestable.swift */; }; + 790C5E4D3F13225E9D007286C1F1A614 /* JWTDecode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D59E903C2405C56401423F7E585859C /* JWTDecode.swift */; }; + 791AD9EE18B8E8E058174E01621A32AB /* A0RSA.m in Sources */ = {isa = PBXBuildFile; fileRef = 5774AA65F77CD3B34C36D22F1665B080 /* A0RSA.m */; }; + 7EE79957319B9F8EEC9D6A0F27654588 /* ValidationError.swift in Sources */ = {isa = PBXBuildFile; fileRef = C697548595E2565FEC0097CF8F52800F /* ValidationError.swift */; }; + 83D40C6AA7F61D7CF108B40BF06A0EBF /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C4728485F928E461B2B4C8476CFF8ED3 /* Foundation.framework */; }; + 85B9916E3483553FDB1AAF9A0CB76D98 /* JWTDecode-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 1002B0CD36F9A9EB8E8C20D0FDB131C9 /* JWTDecode-dummy.m */; }; + 86AD5E522BECB5A83EB0D5B8EA60C4BB /* JWT.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E0A4210E8259FACCE1352FC2C286D05 /* JWT.swift */; }; + 86D824B274DCD84D572293FC555F8D96 /* A0ChallengeGenerator.h in Headers */ = {isa = PBXBuildFile; fileRef = CE40588F12D897BDEE209397B5E2621F /* A0ChallengeGenerator.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 87CE447B47AF3FB3A26B915FD614FCE1 /* IDTokenValidator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4649A74980B8D96F29E2C645137CAABC /* IDTokenValidator.swift */; }; + 890FF25D0CCFF9BADECBA64DCCEFF4FF /* SideMenuAnimationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CF2F69DCD55D662A3B26D6648673218E /* SideMenuAnimationController.swift */; }; + 895391C7E3CBD618FFC14059B98CBA68 /* Loggable.swift in Sources */ = {isa = PBXBuildFile; fileRef = D688D8C290FE0E95E43BD772D0A6919E /* Loggable.swift */; }; + 8C06632AA14D12278B1277AC0CC6A0B2 /* SideMenuInteractionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 357F265A899CD9D968BE80BBFE9DA639 /* SideMenuInteractionController.swift */; }; + 8D04B5B29201EEDF19BA31DDC7FDFB75 /* LocalAuthentication.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0E4C8B3E39284FFB24268F6C7AFD4814 /* LocalAuthentication.framework */; }; + 8D99D40053441637EA7A13B95CE74DA3 /* Logger.swift in Sources */ = {isa = PBXBuildFile; fileRef = 560016A99B5A49EA6ACF17E6EE0FAF8E /* Logger.swift */; }; + 8FE9B6FC65010C719EB926427BA24CB1 /* SilentSafariViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1EA82772C9067B92A9C001DD8C08072B /* SilentSafariViewController.swift */; }; + 905A503F069C27E841BAD9F4EFD4F1AF /* Protected.swift in Sources */ = {isa = PBXBuildFile; fileRef = E44C6D9024A6CF8995180C407D670E9F /* Protected.swift */; }; + 944FFA9A6589D6ABAD28570B51BB09BC /* AuthProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2428F7A210A7C718B07CE1BBFBBB243A /* AuthProvider.swift */; }; + 95A1E76D4EFC60DF87FB82F19DB4FFCA /* Auth0.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5726F32450D266C969360FEA4BF44D32 /* Auth0.swift */; }; + A002C5FCC8D5FAF15FBBC5B676262343 /* CredentialsManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B4E6B9239ED248F070286EAFA363222 /* CredentialsManager.swift */; }; + A033CF039695CED2225FBEB7E25B6535 /* String+URLSafe.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EB5A9AA2256DD6F0DF0D0C3389CC481 /* String+URLSafe.swift */; }; + A124236E79CF4C7BF5988D079C86F802 /* Management.swift in Sources */ = {isa = PBXBuildFile; fileRef = 091116728EE59F0F391ED8A40D3DC624 /* Management.swift */; }; + A366F995AB1B0785EFA26EDD51708746 /* JWTDecode.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C0100BD14383526B260EF2B369C633E0 /* JWTDecode.framework */; }; + A3E13EDBC094E479447B7FC66399B861 /* SafariSession.swift in Sources */ = {isa = PBXBuildFile; fileRef = A64BE73279256D30C222F7252286791B /* SafariSession.swift */; }; + A4666BC7F6E0D8BBDD22A1294637FA91 /* _ObjectiveAuthenticationAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = FEAF3484EDEDE06A82FC61646209E294 /* _ObjectiveAuthenticationAPI.swift */; }; + A6A2EBCBD7B8B1244DB8E449297029BD /* AuthSession.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F76DA7AA7503207E157ED051CF7EC41 /* AuthSession.swift */; }; + AABE741EC2F6202444A5D9ABF91CFFF2 /* Date.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8EED4E4EF3428D71AF470038D9E8CF60 /* Date.swift */; }; + AE13A87CBB9DD3F17D4909A02B77023F /* IDTokenSignatureValidator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0082DDDF03EFA9C749F48D7F894ECB69 /* IDTokenSignatureValidator.swift */; }; + B01BE472A19FB04C4A7000865908B8EC /* A0SimpleKeychain.h in Headers */ = {isa = PBXBuildFile; fileRef = 8636629400958D764063AA4E90267847 /* A0SimpleKeychain.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B0FBBA93EF9C81F71331550B5AEAB8EF /* TransactionStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = E275E9D53D3C60448ACAAF9376CB3A9A /* TransactionStore.swift */; }; + B27B12C5D2EF1BE7B3CBBBC8FA98110E /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C4728485F928E461B2B4C8476CFF8ED3 /* Foundation.framework */; }; + B7883CABA5509F981F534EA15BAC8E24 /* A0SimpleKeychain+RSAPublicKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17CA24E2D269F9C873CB058D9EF05060 /* A0SimpleKeychain+RSAPublicKey.swift */; }; + BB988F9C5AC7353874C50AEEE3781FFD /* Array+Encode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 035D7238895EF20CED1370C461817101 /* Array+Encode.swift */; }; + C347880249E2215DDDDD63675A31327E /* Pods-TracMobility-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = A64460896588B62BE966AA86DAE95352 /* Pods-TracMobility-dummy.m */; }; + C798DA148F7F666F393F2009DDF73E35 /* Initializable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62F259F951BDF0F66C31DD8A50C9174F /* Initializable.swift */; }; + C96A55C2A869A97AC4CA628A7F2A2A21 /* UITableViewVibrantCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC62200EADE95E0212BEC76C5DB83E5A /* UITableViewVibrantCell.swift */; }; + CC63DE6971E96DA610E35607FED070C6 /* A0SimpleKeychain.m in Sources */ = {isa = PBXBuildFile; fileRef = 0249686A98E64D77975167A31E169294 /* A0SimpleKeychain.m */; }; + CE40437A4DEE50CC4F0D51772948CB7C /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C4728485F928E461B2B4C8476CFF8ED3 /* Foundation.framework */; }; + CF7B55E45FC55A4CD9D6919864B439AE /* AuthenticationServicesSessionCallback.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3449BAFD8297CEB27DC5D5A384D5D003 /* AuthenticationServicesSessionCallback.swift */; }; + D1BD7393C7934049B3E51D9C5A5CD8A0 /* Print.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3431E20E145C09DBF1540614531E12A7 /* Print.swift */; }; + D3BDBB904E42E860F35E9DB5AE6AA671 /* JWT+Header.swift in Sources */ = {isa = PBXBuildFile; fileRef = 67B1A7DFD1AD8465760162B511BD7C61 /* JWT+Header.swift */; }; + D3D22BB8C279DC03EA91BFE3F5412477 /* Deprecations.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17120734236A857987BA4DB14DD61748 /* Deprecations.swift */; }; + D5C1CFD7679B4685D29D9A246D30244A /* UIApplication+Shared.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9B16DE6710B47FA3A7FA79FDE4D504D /* UIApplication+Shared.swift */; }; + D5E5A76FB19A2C3061B5140941706602 /* ClaimValidators.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7051A174CC9CD38C0A6BA2E2D17A457 /* ClaimValidators.swift */; }; + D777716F0B6C0754B7B0230531743BC4 /* SideMenu-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 8470FB73C6E67F56D5B698E0DB601AD8 /* SideMenu-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + DBC04073F4C05395B9812D9FDCD9EF40 /* AuthCancelable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 68D0C1D22A080EEBCD6217F60A5C9AC2 /* AuthCancelable.swift */; }; + DDB08BBF9EF0F39387D03717F2F4E721 /* Telemetry.swift in Sources */ = {isa = PBXBuildFile; fileRef = 638D81542330CB631166C78850F44BF1 /* Telemetry.swift */; }; + DDB550E330B217E68009822E05CE54D2 /* Result.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E8B57D22903AB094E49B3B148E6CEB7 /* Result.swift */; }; + DE587924F87AED357ECEA158F89D1945 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C4728485F928E461B2B4C8476CFF8ED3 /* Foundation.framework */; }; + DF025A09B7E7081E4025AF5358B16F00 /* SafariServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79B105173E71F2F06E1E7EBD3BCD0B73 /* SafariServices.framework */; }; + E0804A914CA5395D625CADDA8E0BE07F /* Auth0.h in Headers */ = {isa = PBXBuildFile; fileRef = 747BFB7C3474FEA94480ECA208BCC703 /* Auth0.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E2CD16ECB8EA2A85B692D9746CED8C0A /* NSData+URLSafe.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74D8DFA74626C8F835AA79DEC994C3D9 /* NSData+URLSafe.swift */; }; + E96C1FB4A3F4601180C37592CAEAE2F6 /* TokenValidators.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A17BE6886C5D673AC3FDA604AE89924 /* TokenValidators.swift */; }; + EED6433531BA543E29624577B9B1F18D /* ControllerModalPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18C2ACEF248572D0CDEFCF5369E47886 /* ControllerModalPresenter.swift */; }; + EF30331943C7F2BDF7056B5275ABC66F /* UserInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 70A06BD110B2EF1848F19448B41B074F /* UserInfo.swift */; }; + F1F72D383098F92022F9AE78DDF46C3F /* A0RSA.h in Headers */ = {isa = PBXBuildFile; fileRef = 436E91280CE01884812853DABC92586C /* A0RSA.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F3F723C94CD304E58CAAB80FA890F74E /* BioAuthentication.swift in Sources */ = {isa = PBXBuildFile; fileRef = 401E7D3DF93FAF7E6B19F6F10DD23BEE /* BioAuthentication.swift */; }; + F41ED9EC71B5D34272F2FED4B95E8AE6 /* WebAuthError.swift in Sources */ = {isa = PBXBuildFile; fileRef = B935224B1C524A1D95BF7AA5B8076E71 /* WebAuthError.swift */; }; + F42DBAE39B8DBEA80DD187805BF516B0 /* SimpleKeychain-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 62BEF1CC0F23CE523ED5CFD0BBBEC179 /* SimpleKeychain-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F8A471E5C254B27D3A645793725E20B1 /* NSURLComponents+OAuth2.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9F2FD44861A5681ECB04A3A585AD714 /* NSURLComponents+OAuth2.swift */; }; + FA2A3765B1B3A3E31B7001D4FFE6688C /* AuthenticationServicesSession.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43A1618E831BD90CE21308C44097A4E3 /* AuthenticationServicesSession.swift */; }; + FC4588DF99BA17E61DB3747BA5F14B78 /* ResponseType.swift in Sources */ = {isa = PBXBuildFile; fileRef = D579D092F8818EB9F58798B5A6C5D76F /* ResponseType.swift */; }; + FC7D6434302C46978BAEC4C05301B52C /* Request.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD91706A1ECD476DEC9276B13ACBE97C /* Request.swift */; }; + FDA43146F0125B5726A907898DBB5D9B /* ValidatorJWT.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3AAAF5082D9BE2E66857DA2D2E9A3C8 /* ValidatorJWT.swift */; }; + FEA733E84769114AD1FE267A10EA7204 /* Credentials.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CBC23EBF722C472BFF4B3D62E7566CC /* Credentials.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 36C4BCC91769063BC36BB8F526C38A8B /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 22E1F0E7CBECE226FC294E79C21B0033; + remoteInfo = JWTDecode; + }; + 5C0E35EFF3440A09BC2D9EB4DF70ACE2 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 22E1F0E7CBECE226FC294E79C21B0033; + remoteInfo = JWTDecode; + }; + 7ABBBF31D7335F453A9A78D864E3C3AD /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = D6A440A37D50015E369921294617C612; + remoteInfo = Auth0; + }; + 89B069898770E469F5C119C04FD77B76 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 192AEFA366AAFE1F45B918C022FE489C; + remoteInfo = SimpleKeychain; + }; + 98520E69C0D267FA1ED32DC8329D6C4F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 192AEFA366AAFE1F45B918C022FE489C; + remoteInfo = SimpleKeychain; + }; + 9ACB5D6E538F568CA9E252A10A4F167A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = E5B4BBC6DD552AC8943C7E22772FC1D3; + remoteInfo = GoogleMaps; + }; + CFA3B1F95238AF83136E929E67252630 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = C4A0A7D8591B67FB75E2E8D215E3735B; + remoteInfo = SideMenu; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 00374C12A71CEF4018A62825B6F580C8 /* BaseAuthTransaction.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BaseAuthTransaction.swift; path = Auth0/BaseAuthTransaction.swift; sourceTree = ""; }; + 0055104C11DE955DA53DED6BDC58E39A /* _ObjectiveWebAuth.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = _ObjectiveWebAuth.swift; path = Auth0/_ObjectiveWebAuth.swift; sourceTree = ""; }; + 0082DDDF03EFA9C749F48D7F894ECB69 /* IDTokenSignatureValidator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IDTokenSignatureValidator.swift; path = Auth0/IDTokenSignatureValidator.swift; sourceTree = ""; }; + 0249686A98E64D77975167A31E169294 /* A0SimpleKeychain.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = A0SimpleKeychain.m; path = SimpleKeychain/A0SimpleKeychain.m; sourceTree = ""; }; + 02A8C407A3EC6FAFD3570D94C6656D7D /* Response.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Response.swift; path = Auth0/Response.swift; sourceTree = ""; }; + 035D7238895EF20CED1370C461817101 /* Array+Encode.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Array+Encode.swift"; path = "Auth0/Array+Encode.swift"; sourceTree = ""; }; + 03FAAE053DE4C0E0D40C5529AE3E6CE5 /* SimpleKeychain.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SimpleKeychain.debug.xcconfig; sourceTree = ""; }; + 063DB918521A2D3D829FC67C6849CB1D /* UserPatchAttributes.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = UserPatchAttributes.swift; path = Auth0/UserPatchAttributes.swift; sourceTree = ""; }; + 091116728EE59F0F391ED8A40D3DC624 /* Management.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Management.swift; path = Auth0/Management.swift; sourceTree = ""; }; + 0933D40E7753404C1DFFFFED71177A23 /* SimpleKeychain-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "SimpleKeychain-Info.plist"; sourceTree = ""; }; + 0A6D2B90CC925D15B30C4161C6C00C96 /* SimpleKeychain.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SimpleKeychain.release.xcconfig; sourceTree = ""; }; + 0C06DCF74DEFC979615128EF18D1FCCC /* _ObjectiveManagementAPI.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = _ObjectiveManagementAPI.swift; path = Auth0/_ObjectiveManagementAPI.swift; sourceTree = ""; }; + 0C452B18D0E7AB8597058D8A628C72BE /* SideMenu.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = SideMenu.modulemap; sourceTree = ""; }; + 0E4C8B3E39284FFB24268F6C7AFD4814 /* LocalAuthentication.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = LocalAuthentication.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.2.sdk/System/Library/Frameworks/LocalAuthentication.framework; sourceTree = DEVELOPER_DIR; }; + 0E670C734174B5AD81C6CCE6E378D797 /* Auth0Error.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Auth0Error.swift; path = Auth0/Auth0Error.swift; sourceTree = ""; }; + 1002B0CD36F9A9EB8E8C20D0FDB131C9 /* JWTDecode-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "JWTDecode-dummy.m"; sourceTree = ""; }; + 10DA8620B5389CFE39475EDA3F8053A0 /* GoogleMaps.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = GoogleMaps.release.xcconfig; sourceTree = ""; }; + 1288A681B1EB36E0912E82775F8F84E8 /* Authentication.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Authentication.swift; path = Auth0/Authentication.swift; sourceTree = ""; }; + 17120734236A857987BA4DB14DD61748 /* Deprecations.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Deprecations.swift; path = Pod/Classes/Deprecations.swift; sourceTree = ""; }; + 17CA24E2D269F9C873CB058D9EF05060 /* A0SimpleKeychain+RSAPublicKey.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "A0SimpleKeychain+RSAPublicKey.swift"; path = "Auth0/A0SimpleKeychain+RSAPublicKey.swift"; sourceTree = ""; }; + 18C2ACEF248572D0CDEFCF5369E47886 /* ControllerModalPresenter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ControllerModalPresenter.swift; path = Auth0/ControllerModalPresenter.swift; sourceTree = ""; }; + 18C46E374FA37EE164F60207FAFDB162 /* SideMenuPresentationController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SideMenuPresentationController.swift; path = Pod/Classes/SideMenuPresentationController.swift; sourceTree = ""; }; + 1D59E903C2405C56401423F7E585859C /* JWTDecode.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = JWTDecode.swift; path = JWTDecode/JWTDecode.swift; sourceTree = ""; }; + 1DC85C3FA5A41794D28DB83C9AD6614B /* GoogleMapsCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GoogleMapsCore.framework; path = Maps/Frameworks/GoogleMapsCore.framework; sourceTree = ""; }; + 1EA82772C9067B92A9C001DD8C08072B /* SilentSafariViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SilentSafariViewController.swift; path = Auth0/SilentSafariViewController.swift; sourceTree = ""; }; + 1F76DA7AA7503207E157ED051CF7EC41 /* AuthSession.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AuthSession.swift; path = Auth0/AuthSession.swift; sourceTree = ""; }; + 2390A38AFFB1085C878915F84CD55319 /* SessionTransaction.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SessionTransaction.swift; path = Auth0/SessionTransaction.swift; sourceTree = ""; }; + 242514B5A974F83D7DB8BE059F60B575 /* SideMenuPresentationStyle.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SideMenuPresentationStyle.swift; path = Pod/Classes/SideMenuPresentationStyle.swift; sourceTree = ""; }; + 2428F7A210A7C718B07CE1BBFBBB243A /* AuthProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AuthProvider.swift; path = Auth0/AuthProvider.swift; sourceTree = ""; }; + 25E7692069F18F06E521B505CC558610 /* AuthenticationError.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AuthenticationError.swift; path = Auth0/AuthenticationError.swift; sourceTree = ""; }; + 2758357EBF8AD556F2EE38C26C6807F3 /* Auth0.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Auth0.debug.xcconfig; sourceTree = ""; }; + 2ABDF5C6D0653872ED0D7302B4915FD9 /* JWTAlgorithm.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = JWTAlgorithm.swift; path = Auth0/JWTAlgorithm.swift; sourceTree = ""; }; + 2AD007E7D08D3D7B97132F532EE11E15 /* JWTDecode-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "JWTDecode-Info.plist"; sourceTree = ""; }; + 2DFB432F405021763C396F83E17C413A /* Pods-TracMobility-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-TracMobility-acknowledgements.markdown"; sourceTree = ""; }; + 2E0A4210E8259FACCE1352FC2C286D05 /* JWT.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = JWT.swift; path = JWTDecode/JWT.swift; sourceTree = ""; }; + 2E92114C344AE8A4D40C3E49ECCBD169 /* SimpleKeychain.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SimpleKeychain.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 319D06AA0D1D0BA345459C039040A1ED /* SideMenu.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = SideMenu.framework; path = SideMenu.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 32BED9294088A211804A7335AEC43F19 /* OAuth2Grant.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = OAuth2Grant.swift; path = Auth0/OAuth2Grant.swift; sourceTree = ""; }; + 3431E20E145C09DBF1540614531E12A7 /* Print.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Print.swift; path = Pod/Classes/Print.swift; sourceTree = ""; }; + 3449BAFD8297CEB27DC5D5A384D5D003 /* AuthenticationServicesSessionCallback.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AuthenticationServicesSessionCallback.swift; path = Auth0/AuthenticationServicesSessionCallback.swift; sourceTree = ""; }; + 34854CF6A054FDCB8370EDEC4F208499 /* MobileWebAuth.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MobileWebAuth.swift; path = Auth0/MobileWebAuth.swift; sourceTree = ""; }; + 357F265A899CD9D968BE80BBFE9DA639 /* SideMenuInteractionController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SideMenuInteractionController.swift; path = Pod/Classes/SideMenuInteractionController.swift; sourceTree = ""; }; + 391299F51852DF5E78863903032BD175 /* Auth0-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Auth0-dummy.m"; sourceTree = ""; }; + 3E8B57D22903AB094E49B3B148E6CEB7 /* Result.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Result.swift; path = Auth0/Result.swift; sourceTree = ""; }; + 3EB5A9AA2256DD6F0DF0D0C3389CC481 /* String+URLSafe.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "String+URLSafe.swift"; path = "Auth0/String+URLSafe.swift"; sourceTree = ""; }; + 401E7D3DF93FAF7E6B19F6F10DD23BEE /* BioAuthentication.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BioAuthentication.swift; path = Auth0/BioAuthentication.swift; sourceTree = ""; }; + 402175C8526A22EF561308A268C06A8B /* NSURL+Auth0.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSURL+Auth0.swift"; path = "Auth0/NSURL+Auth0.swift"; sourceTree = ""; }; + 42F24A0C3D178162DC3E4F17100ACC13 /* Profile.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Profile.swift; path = Auth0/Profile.swift; sourceTree = ""; }; + 431DE50331EAF872CF8BE347BE74B8CD /* SideMenu-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SideMenu-dummy.m"; sourceTree = ""; }; + 435F2595A13E46C5F8C183CFACA7184D /* SideMenu.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SideMenu.release.xcconfig; sourceTree = ""; }; + 436E91280CE01884812853DABC92586C /* A0RSA.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = A0RSA.h; path = Auth0/ObjectiveC/A0RSA.h; sourceTree = ""; }; + 43A1618E831BD90CE21308C44097A4E3 /* AuthenticationServicesSession.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AuthenticationServicesSession.swift; path = Auth0/AuthenticationServicesSession.swift; sourceTree = ""; }; + 4649A74980B8D96F29E2C645137CAABC /* IDTokenValidator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IDTokenValidator.swift; path = Auth0/IDTokenValidator.swift; sourceTree = ""; }; + 48EB2316FEBBDA7321B103B88734234D /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.2.sdk/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; }; + 4B4E6B9239ED248F070286EAFA363222 /* CredentialsManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CredentialsManager.swift; path = Auth0/CredentialsManager.swift; sourceTree = ""; }; + 4CBC23EBF722C472BFF4B3D62E7566CC /* Credentials.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Credentials.swift; path = Auth0/Credentials.swift; sourceTree = ""; }; + 4D8580BC0D4CBC4480E0D279DEA58DD6 /* IDTokenValidatorContext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IDTokenValidatorContext.swift; path = Auth0/IDTokenValidatorContext.swift; sourceTree = ""; }; + 53F512DAC0E037B3061DFB0A35CB8F24 /* Pods-TracMobility-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-TracMobility-umbrella.h"; sourceTree = ""; }; + 54B6C30AA71A351816EF85FDA9CA8496 /* SideMenu-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "SideMenu-Info.plist"; sourceTree = ""; }; + 55460C6CAF36007DEFB9BFB7C66FF60E /* Pods-TracMobility-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-TracMobility-resources.sh"; sourceTree = ""; }; + 560016A99B5A49EA6ACF17E6EE0FAF8E /* Logger.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Logger.swift; path = Auth0/Logger.swift; sourceTree = ""; }; + 5726F32450D266C969360FEA4BF44D32 /* Auth0.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Auth0.swift; path = Auth0/Auth0.swift; sourceTree = ""; }; + 5774AA65F77CD3B34C36D22F1665B080 /* A0RSA.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = A0RSA.m; path = Auth0/ObjectiveC/A0RSA.m; sourceTree = ""; }; + 5B69DBED39CAB2CE9E273A437FE528B6 /* A0JWT.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = A0JWT.swift; path = JWTDecode/A0JWT.swift; sourceTree = ""; }; + 5EDA0A870640D3032BFE4224F64C7CA1 /* Pods-TracMobility-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-TracMobility-Info.plist"; sourceTree = ""; }; + 5F73EEFDF7F9CBE27F5268A2C5C40445 /* JSONObjectPayload.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = JSONObjectPayload.swift; path = Auth0/JSONObjectPayload.swift; sourceTree = ""; }; + 62BEF1CC0F23CE523ED5CFD0BBBEC179 /* SimpleKeychain-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SimpleKeychain-umbrella.h"; sourceTree = ""; }; + 62F259F951BDF0F66C31DD8A50C9174F /* Initializable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Initializable.swift; path = Pod/Classes/Initializable.swift; sourceTree = ""; }; + 638D81542330CB631166C78850F44BF1 /* Telemetry.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Telemetry.swift; path = Auth0/Telemetry.swift; sourceTree = ""; }; + 65D6620311D0EDDD6F0CB788A32A8E19 /* Users.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Users.swift; path = Auth0/Users.swift; sourceTree = ""; }; + 67B1A7DFD1AD8465760162B511BD7C61 /* JWT+Header.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "JWT+Header.swift"; path = "Auth0/JWT+Header.swift"; sourceTree = ""; }; + 68D0C1D22A080EEBCD6217F60A5C9AC2 /* AuthCancelable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AuthCancelable.swift; path = Auth0/AuthCancelable.swift; sourceTree = ""; }; + 68DE8317BA4663E2789D88E2C274DF2B /* SimpleKeychain.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SimpleKeychain.h; path = SimpleKeychain/SimpleKeychain.h; sourceTree = ""; }; + 6A17BE6886C5D673AC3FDA604AE89924 /* TokenValidators.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TokenValidators.swift; path = JWTDecode/TokenValidators.swift; sourceTree = ""; }; + 6B111F2BD9E5F08B5FD596D3E3DE1198 /* ManagementError.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ManagementError.swift; path = Auth0/ManagementError.swift; sourceTree = ""; }; + 6B6F6ABFC8D5167FFAEEBFE03C792FA5 /* JWTDecode.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = JWTDecode.modulemap; sourceTree = ""; }; + 6B867D5ABFD5006560EC06A30C34BA9B /* A0SimpleKeychain+KeyPair.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "A0SimpleKeychain+KeyPair.h"; path = "SimpleKeychain/A0SimpleKeychain+KeyPair.h"; sourceTree = ""; }; + 6D5ACD50C975FC79731B2CAFE8C404A9 /* Auth0.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Auth0.release.xcconfig; sourceTree = ""; }; + 7087FEF4612227C9C9B503D6959929C1 /* A0SHA.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = A0SHA.m; path = Auth0/ObjectiveC/A0SHA.m; sourceTree = ""; }; + 70A06BD110B2EF1848F19448B41B074F /* UserInfo.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = UserInfo.swift; path = Auth0/UserInfo.swift; sourceTree = ""; }; + 7115139913BF96A0839BC5861B28E9FF /* SideMenu.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SideMenu.debug.xcconfig; sourceTree = ""; }; + 7353C301AF4C4A7CC91BF0A48CA47AF7 /* Auth0Authentication.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Auth0Authentication.swift; path = Auth0/Auth0Authentication.swift; sourceTree = ""; }; + 743135213B9FE92BA7DBC05E6733C144 /* Pods-TracMobility.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-TracMobility.debug.xcconfig"; sourceTree = ""; }; + 747BFB7C3474FEA94480ECA208BCC703 /* Auth0.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = Auth0.h; path = Auth0/Auth0.h; sourceTree = ""; }; + 74D8DFA74626C8F835AA79DEC994C3D9 /* NSData+URLSafe.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSData+URLSafe.swift"; path = "Auth0/NSData+URLSafe.swift"; sourceTree = ""; }; + 79359272382C210A835B5E9506DE9EE0 /* SessionCallbackTransaction.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SessionCallbackTransaction.swift; path = Auth0/SessionCallbackTransaction.swift; sourceTree = ""; }; + 79B105173E71F2F06E1E7EBD3BCD0B73 /* SafariServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SafariServices.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.2.sdk/System/Library/Frameworks/SafariServices.framework; sourceTree = DEVELOPER_DIR; }; + 7A8D4AC02B51FD03224739D06AEE207B /* JWTDecode.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = JWTDecode.framework; path = JWTDecode.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 7CFF4C3D038B7DECE2673B512408C035 /* BaseWebAuth.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BaseWebAuth.swift; path = Auth0/BaseWebAuth.swift; sourceTree = ""; }; + 7EE10129D524DEBEAA8225F67C1975B1 /* SimpleKeychain.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = SimpleKeychain.modulemap; sourceTree = ""; }; + 7FCBC915F5D36EE86AD61F94A5AC9FCB /* NSError+Helper.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSError+Helper.swift"; path = "Auth0/NSError+Helper.swift"; sourceTree = ""; }; + 80975361169EB0F5F96F131003D58BBF /* Pods-TracMobility.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-TracMobility.modulemap"; sourceTree = ""; }; + 83155C227451FEC6D4A952972F0594D9 /* JWKS.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = JWKS.swift; path = Auth0/JWKS.swift; sourceTree = ""; }; + 8470FB73C6E67F56D5B698E0DB601AD8 /* SideMenu-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SideMenu-umbrella.h"; sourceTree = ""; }; + 8636629400958D764063AA4E90267847 /* A0SimpleKeychain.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = A0SimpleKeychain.h; path = SimpleKeychain/A0SimpleKeychain.h; sourceTree = ""; }; + 87E03DC03F084E4F1979FF26634838A0 /* Auth0.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = Auth0.modulemap; sourceTree = ""; }; + 89D272D716B77B0723553447F165B5DD /* Handlers.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Handlers.swift; path = Auth0/Handlers.swift; sourceTree = ""; }; + 8C360C7F5F88DC7F954EA72A577313BE /* Requestable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Requestable.swift; path = Auth0/Requestable.swift; sourceTree = ""; }; + 8EED4E4EF3428D71AF470038D9E8CF60 /* Date.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Date.swift; path = Auth0/Date.swift; sourceTree = ""; }; + 9262692EDF916CD6D17E2D0C939B2155 /* A0SHA.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = A0SHA.h; path = Auth0/ObjectiveC/A0SHA.h; sourceTree = ""; }; + 93CF93EB7DB3C198998762FB9315D147 /* A0ChallengeGenerator.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = A0ChallengeGenerator.m; path = Auth0/ObjectiveC/A0ChallengeGenerator.m; sourceTree = ""; }; + 999459C45731F18EC49428C10057EA51 /* Auth0.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Auth0.framework; path = Auth0.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 9B84C70B33EAC62431B9DD67D1024A16 /* Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Extensions.swift; path = Pod/Classes/Extensions.swift; sourceTree = ""; }; + 9D793AC7EFAD00F0CDB922CDBEE100F3 /* GoogleMaps.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GoogleMaps.framework; path = Maps/Frameworks/GoogleMaps.framework; 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; }; + A0AFBE8A4F78F72C52DCBEB7FE614A82 /* JWTDecode-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "JWTDecode-prefix.pch"; sourceTree = ""; }; + A0FAB9595E4CF6C2701F9BFCB3F75837 /* SideMenuNavigationController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SideMenuNavigationController.swift; path = Pod/Classes/SideMenuNavigationController.swift; sourceTree = ""; }; + A24B746DA9B126FADFAE9C7C3CE9CF53 /* Pods-TracMobility-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-TracMobility-acknowledgements.plist"; sourceTree = ""; }; + A317C1B3F9D007F51FAC256626448D2D /* GoogleMaps.bundle */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "wrapper.plug-in"; name = GoogleMaps.bundle; path = Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle; sourceTree = ""; }; + A64460896588B62BE966AA86DAE95352 /* Pods-TracMobility-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-TracMobility-dummy.m"; sourceTree = ""; }; + A64BE73279256D30C222F7252286791B /* SafariSession.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SafariSession.swift; path = Auth0/SafariSession.swift; sourceTree = ""; }; + B1DA16224839C9C01339CE6B5D17C6A2 /* Auth0-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Auth0-Info.plist"; sourceTree = ""; }; + B29B8B49583093E1482E2277E9E94655 /* Pods-TracMobility.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-TracMobility.release.xcconfig"; sourceTree = ""; }; + B2FD09CF034CE86FC89CEAF15D215ACA /* Errors.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Errors.swift; path = JWTDecode/Errors.swift; sourceTree = ""; }; + B53BDAABF7474387636EE70164D2B049 /* NativeAuth.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NativeAuth.swift; path = Auth0/NativeAuth.swift; sourceTree = ""; }; + B60AE4CA74153FD8CB7B2C1B17CE8CB6 /* JWTDecode.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = JWTDecode.debug.xcconfig; sourceTree = ""; }; + B67631E3B8DF342F699B6993185F6FC2 /* Pods-TracMobility-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-TracMobility-frameworks.sh"; sourceTree = ""; }; + B6833196048BBD3099FA1E841191042A /* Identity.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Identity.swift; path = Auth0/Identity.swift; sourceTree = ""; }; + B8F32D18A2063838B83FA8D43D77AF12 /* SideMenu-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SideMenu-prefix.pch"; sourceTree = ""; }; + B935224B1C524A1D95BF7AA5B8076E71 /* WebAuthError.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = WebAuthError.swift; path = Auth0/WebAuthError.swift; sourceTree = ""; }; + B9B16DE6710B47FA3A7FA79FDE4D504D /* UIApplication+Shared.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIApplication+Shared.swift"; path = "Auth0/UIApplication+Shared.swift"; sourceTree = ""; }; + B9F2FD44861A5681ECB04A3A585AD714 /* NSURLComponents+OAuth2.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSURLComponents+OAuth2.swift"; path = "Auth0/NSURLComponents+OAuth2.swift"; sourceTree = ""; }; + BEB2D133AE8B296037F281765EDBD61B /* GoogleMapsBase.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GoogleMapsBase.framework; path = Base/Frameworks/GoogleMapsBase.framework; sourceTree = ""; }; + BF1A0D25C765B20D6EDE7273B141B566 /* Pods_TracMobility.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_TracMobility.framework; path = "Pods-TracMobility.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; + C0100BD14383526B260EF2B369C633E0 /* JWTDecode.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = JWTDecode.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + C045B7B17F7973CB76F71B4F325E30C6 /* SideMenuTransitionController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SideMenuTransitionController.swift; path = Pod/Classes/SideMenuTransitionController.swift; sourceTree = ""; }; + C4728485F928E461B2B4C8476CFF8ED3 /* 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; }; + C697548595E2565FEC0097CF8F52800F /* ValidationError.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ValidationError.swift; path = JWTDecode/ValidationError.swift; sourceTree = ""; }; + CD3B027EC578E22891ED55C05705F3CD /* SimpleKeychain.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = SimpleKeychain.framework; path = SimpleKeychain.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + CE40588F12D897BDEE209397B5E2621F /* A0ChallengeGenerator.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = A0ChallengeGenerator.h; path = Auth0/ObjectiveC/A0ChallengeGenerator.h; sourceTree = ""; }; + CF2F69DCD55D662A3B26D6648673218E /* SideMenuAnimationController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SideMenuAnimationController.swift; path = Pod/Classes/SideMenuAnimationController.swift; sourceTree = ""; }; + D28755E8281FD4BA791065D42A44AD67 /* Auth0-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Auth0-umbrella.h"; sourceTree = ""; }; + D4221A6AB1B01170C3D9277D48E3F41F /* SideMenuPushCoordinator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SideMenuPushCoordinator.swift; path = Pod/Classes/SideMenuPushCoordinator.swift; sourceTree = ""; }; + D46F8AFBEEF048AB403459A749B47917 /* SimpleKeychain-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SimpleKeychain-prefix.pch"; sourceTree = ""; }; + D579D092F8818EB9F58798B5A6C5D76F /* ResponseType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ResponseType.swift; path = Auth0/ResponseType.swift; sourceTree = ""; }; + D688D8C290FE0E95E43BD772D0A6919E /* Loggable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Loggable.swift; path = Auth0/Loggable.swift; sourceTree = ""; }; + D7051A174CC9CD38C0A6BA2E2D17A457 /* ClaimValidators.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ClaimValidators.swift; path = Auth0/ClaimValidators.swift; sourceTree = ""; }; + DC62200EADE95E0212BEC76C5DB83E5A /* UITableViewVibrantCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = UITableViewVibrantCell.swift; path = Pod/Classes/UITableViewVibrantCell.swift; sourceTree = ""; }; + E204EEDFBC0C2C166541A1E658345C77 /* JWTDecode.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = JWTDecode.release.xcconfig; sourceTree = ""; }; + E275E9D53D3C60448ACAAF9376CB3A9A /* TransactionStore.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TransactionStore.swift; path = Auth0/TransactionStore.swift; sourceTree = ""; }; + E3462718529CDE56B33B20E74EFB2D4F /* Auth0-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Auth0-prefix.pch"; sourceTree = ""; }; + E3AAAF5082D9BE2E66857DA2D2E9A3C8 /* ValidatorJWT.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ValidatorJWT.swift; path = JWTDecode/ValidatorJWT.swift; sourceTree = ""; }; + E44C6D9024A6CF8995180C407D670E9F /* Protected.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Protected.swift; path = Pod/Classes/Protected.swift; sourceTree = ""; }; + E7F685F703FDCAC2FF4E8BE3D71D768E /* CredentialsManagerError.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CredentialsManagerError.swift; path = Auth0/CredentialsManagerError.swift; sourceTree = ""; }; + E81C0DB1FD01EB085E15CCEF8FBD73E5 /* GoogleMaps.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = GoogleMaps.debug.xcconfig; sourceTree = ""; }; + E864240BF4548C5826BB0CBA8CFF4AA9 /* A0SimpleKeychain+KeyPair.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "A0SimpleKeychain+KeyPair.m"; path = "SimpleKeychain/A0SimpleKeychain+KeyPair.m"; sourceTree = ""; }; + EB38B52B33F3D388011F418C092F9891 /* Optional+DebugDescription.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Optional+DebugDescription.swift"; path = "Auth0/Optional+DebugDescription.swift"; sourceTree = ""; }; + EC6AF10DE4E93F6D71CA2F8F96B09DEE /* SimpleKeychain-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SimpleKeychain-dummy.m"; sourceTree = ""; }; + EFD46261617F3B8229CB4EEECA428233 /* WebAuthenticatable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = WebAuthenticatable.swift; path = Auth0/WebAuthenticatable.swift; sourceTree = ""; }; + F6280D208E4D395E579C2A49CF8A7DE6 /* JWK+RSA.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "JWK+RSA.swift"; path = "Auth0/JWK+RSA.swift"; sourceTree = ""; }; + FD91706A1ECD476DEC9276B13ACBE97C /* Request.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Request.swift; path = Auth0/Request.swift; sourceTree = ""; }; + FE00364594B82AA072B8A1C030D12FCD /* SideMenuManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SideMenuManager.swift; path = Pod/Classes/SideMenuManager.swift; sourceTree = ""; }; + FEAF3484EDEDE06A82FC61646209E294 /* _ObjectiveAuthenticationAPI.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = _ObjectiveAuthenticationAPI.swift; path = Auth0/_ObjectiveAuthenticationAPI.swift; sourceTree = ""; }; + FF0D51A7ACFBEB473611F4D8C0296EC9 /* JWTDecode-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "JWTDecode-umbrella.h"; sourceTree = ""; }; + FF4C3FE49CE6A4FA6CB658413F512E82 /* AuthTransaction.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AuthTransaction.swift; path = Auth0/AuthTransaction.swift; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 2B85D115573CE30350B7BF62827F6ED7 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + DE587924F87AED357ECEA158F89D1945 /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 65D21D3F66794ED154AE6287773BAC7C /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 83D40C6AA7F61D7CF108B40BF06A0EBF /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 7FA9283343A3B51DF6E29FC09347EDF7 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + CE40437A4DEE50CC4F0D51772948CB7C /* Foundation.framework in Frameworks */, + A366F995AB1B0785EFA26EDD51708746 /* JWTDecode.framework in Frameworks */, + 8D04B5B29201EEDF19BA31DDC7FDFB75 /* LocalAuthentication.framework in Frameworks */, + DF025A09B7E7081E4025AF5358B16F00 /* SafariServices.framework in Frameworks */, + 49533E706980EAA66039DB3F38F2A28A /* SimpleKeychain.framework in Frameworks */, + 667F36F4A03E02349286319BD83B8CBB /* UIKit.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + B91F7848AEF33FB159735908CFF08D48 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 13F2400A3D1CC07C79DE79475E35B222 /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + D9D87C2BC8D3C4B8382407D4C6B16014 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + B27B12C5D2EF1BE7B3CBBBC8FA98110E /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 0321344B3953BA90EBB5A36F13AC3AB1 /* Frameworks */ = { + isa = PBXGroup; + children = ( + C0100BD14383526B260EF2B369C633E0 /* JWTDecode.framework */, + 2E92114C344AE8A4D40C3E49ECCBD169 /* SimpleKeychain.framework */, + 73482AA62DC666CBB779B2F7B1CC1723 /* iOS */, + ); + name = Frameworks; + sourceTree = ""; + }; + 1179A4CE8C7068420D9A37A927B26183 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 9D793AC7EFAD00F0CDB922CDBEE100F3 /* GoogleMaps.framework */, + 1DC85C3FA5A41794D28DB83C9AD6614B /* GoogleMapsCore.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 152504BD4E198307F8722D64ED3AF4E5 /* Resources */ = { + isa = PBXGroup; + children = ( + A317C1B3F9D007F51FAC256626448D2D /* GoogleMaps.bundle */, + ); + name = Resources; + sourceTree = ""; + }; + 267FFAA4A7ADD0B48B48050B8E35A1D8 /* Support Files */ = { + isa = PBXGroup; + children = ( + E81C0DB1FD01EB085E15CCEF8FBD73E5 /* GoogleMaps.debug.xcconfig */, + 10DA8620B5389CFE39475EDA3F8053A0 /* GoogleMaps.release.xcconfig */, + ); + name = "Support Files"; + path = "../Target Support Files/GoogleMaps"; + sourceTree = ""; + }; + 3F968C186B6E1C5F24AA109872FF4003 /* Auth0 */ = { + isa = PBXGroup; + children = ( + FEAF3484EDEDE06A82FC61646209E294 /* _ObjectiveAuthenticationAPI.swift */, + 0C06DCF74DEFC979615128EF18D1FCCC /* _ObjectiveManagementAPI.swift */, + 0055104C11DE955DA53DED6BDC58E39A /* _ObjectiveWebAuth.swift */, + CE40588F12D897BDEE209397B5E2621F /* A0ChallengeGenerator.h */, + 93CF93EB7DB3C198998762FB9315D147 /* A0ChallengeGenerator.m */, + 436E91280CE01884812853DABC92586C /* A0RSA.h */, + 5774AA65F77CD3B34C36D22F1665B080 /* A0RSA.m */, + 9262692EDF916CD6D17E2D0C939B2155 /* A0SHA.h */, + 7087FEF4612227C9C9B503D6959929C1 /* A0SHA.m */, + 17CA24E2D269F9C873CB058D9EF05060 /* A0SimpleKeychain+RSAPublicKey.swift */, + 035D7238895EF20CED1370C461817101 /* Array+Encode.swift */, + 747BFB7C3474FEA94480ECA208BCC703 /* Auth0.h */, + 5726F32450D266C969360FEA4BF44D32 /* Auth0.swift */, + 7353C301AF4C4A7CC91BF0A48CA47AF7 /* Auth0Authentication.swift */, + 0E670C734174B5AD81C6CCE6E378D797 /* Auth0Error.swift */, + 68D0C1D22A080EEBCD6217F60A5C9AC2 /* AuthCancelable.swift */, + 1288A681B1EB36E0912E82775F8F84E8 /* Authentication.swift */, + 25E7692069F18F06E521B505CC558610 /* AuthenticationError.swift */, + 43A1618E831BD90CE21308C44097A4E3 /* AuthenticationServicesSession.swift */, + 3449BAFD8297CEB27DC5D5A384D5D003 /* AuthenticationServicesSessionCallback.swift */, + 2428F7A210A7C718B07CE1BBFBBB243A /* AuthProvider.swift */, + 1F76DA7AA7503207E157ED051CF7EC41 /* AuthSession.swift */, + FF4C3FE49CE6A4FA6CB658413F512E82 /* AuthTransaction.swift */, + 00374C12A71CEF4018A62825B6F580C8 /* BaseAuthTransaction.swift */, + 7CFF4C3D038B7DECE2673B512408C035 /* BaseWebAuth.swift */, + 401E7D3DF93FAF7E6B19F6F10DD23BEE /* BioAuthentication.swift */, + D7051A174CC9CD38C0A6BA2E2D17A457 /* ClaimValidators.swift */, + 18C2ACEF248572D0CDEFCF5369E47886 /* ControllerModalPresenter.swift */, + 4CBC23EBF722C472BFF4B3D62E7566CC /* Credentials.swift */, + 4B4E6B9239ED248F070286EAFA363222 /* CredentialsManager.swift */, + E7F685F703FDCAC2FF4E8BE3D71D768E /* CredentialsManagerError.swift */, + 8EED4E4EF3428D71AF470038D9E8CF60 /* Date.swift */, + 89D272D716B77B0723553447F165B5DD /* Handlers.swift */, + B6833196048BBD3099FA1E841191042A /* Identity.swift */, + 0082DDDF03EFA9C749F48D7F894ECB69 /* IDTokenSignatureValidator.swift */, + 4649A74980B8D96F29E2C645137CAABC /* IDTokenValidator.swift */, + 4D8580BC0D4CBC4480E0D279DEA58DD6 /* IDTokenValidatorContext.swift */, + 5F73EEFDF7F9CBE27F5268A2C5C40445 /* JSONObjectPayload.swift */, + F6280D208E4D395E579C2A49CF8A7DE6 /* JWK+RSA.swift */, + 83155C227451FEC6D4A952972F0594D9 /* JWKS.swift */, + 67B1A7DFD1AD8465760162B511BD7C61 /* JWT+Header.swift */, + 2ABDF5C6D0653872ED0D7302B4915FD9 /* JWTAlgorithm.swift */, + D688D8C290FE0E95E43BD772D0A6919E /* Loggable.swift */, + 560016A99B5A49EA6ACF17E6EE0FAF8E /* Logger.swift */, + 091116728EE59F0F391ED8A40D3DC624 /* Management.swift */, + 6B111F2BD9E5F08B5FD596D3E3DE1198 /* ManagementError.swift */, + 34854CF6A054FDCB8370EDEC4F208499 /* MobileWebAuth.swift */, + B53BDAABF7474387636EE70164D2B049 /* NativeAuth.swift */, + 74D8DFA74626C8F835AA79DEC994C3D9 /* NSData+URLSafe.swift */, + 7FCBC915F5D36EE86AD61F94A5AC9FCB /* NSError+Helper.swift */, + 402175C8526A22EF561308A268C06A8B /* NSURL+Auth0.swift */, + B9F2FD44861A5681ECB04A3A585AD714 /* NSURLComponents+OAuth2.swift */, + 32BED9294088A211804A7335AEC43F19 /* OAuth2Grant.swift */, + EB38B52B33F3D388011F418C092F9891 /* Optional+DebugDescription.swift */, + 42F24A0C3D178162DC3E4F17100ACC13 /* Profile.swift */, + FD91706A1ECD476DEC9276B13ACBE97C /* Request.swift */, + 8C360C7F5F88DC7F954EA72A577313BE /* Requestable.swift */, + 02A8C407A3EC6FAFD3570D94C6656D7D /* Response.swift */, + D579D092F8818EB9F58798B5A6C5D76F /* ResponseType.swift */, + 3E8B57D22903AB094E49B3B148E6CEB7 /* Result.swift */, + A64BE73279256D30C222F7252286791B /* SafariSession.swift */, + 79359272382C210A835B5E9506DE9EE0 /* SessionCallbackTransaction.swift */, + 2390A38AFFB1085C878915F84CD55319 /* SessionTransaction.swift */, + 1EA82772C9067B92A9C001DD8C08072B /* SilentSafariViewController.swift */, + 3EB5A9AA2256DD6F0DF0D0C3389CC481 /* String+URLSafe.swift */, + 638D81542330CB631166C78850F44BF1 /* Telemetry.swift */, + E275E9D53D3C60448ACAAF9376CB3A9A /* TransactionStore.swift */, + B9B16DE6710B47FA3A7FA79FDE4D504D /* UIApplication+Shared.swift */, + 70A06BD110B2EF1848F19448B41B074F /* UserInfo.swift */, + 063DB918521A2D3D829FC67C6849CB1D /* UserPatchAttributes.swift */, + 65D6620311D0EDDD6F0CB788A32A8E19 /* Users.swift */, + EFD46261617F3B8229CB4EEECA428233 /* WebAuthenticatable.swift */, + B935224B1C524A1D95BF7AA5B8076E71 /* WebAuthError.swift */, + FC6ACD748B53695410E3A94203B50200 /* Support Files */, + ); + name = Auth0; + path = Auth0; + sourceTree = ""; + }; + 54AB5F13437845D9811D4F5917C07261 /* JWTDecode */ = { + isa = PBXGroup; + children = ( + 5B69DBED39CAB2CE9E273A437FE528B6 /* A0JWT.swift */, + B2FD09CF034CE86FC89CEAF15D215ACA /* Errors.swift */, + 2E0A4210E8259FACCE1352FC2C286D05 /* JWT.swift */, + 1D59E903C2405C56401423F7E585859C /* JWTDecode.swift */, + 6A17BE6886C5D673AC3FDA604AE89924 /* TokenValidators.swift */, + C697548595E2565FEC0097CF8F52800F /* ValidationError.swift */, + E3AAAF5082D9BE2E66857DA2D2E9A3C8 /* ValidatorJWT.swift */, + C9C36304F940809A92306D7C8D70AB44 /* Support Files */, + ); + name = JWTDecode; + path = JWTDecode; + sourceTree = ""; + }; + 73254DF8CEE9D05A07C285D5D1F42866 /* Support Files */ = { + isa = PBXGroup; + children = ( + 0C452B18D0E7AB8597058D8A628C72BE /* SideMenu.modulemap */, + 431DE50331EAF872CF8BE347BE74B8CD /* SideMenu-dummy.m */, + 54B6C30AA71A351816EF85FDA9CA8496 /* SideMenu-Info.plist */, + B8F32D18A2063838B83FA8D43D77AF12 /* SideMenu-prefix.pch */, + 8470FB73C6E67F56D5B698E0DB601AD8 /* SideMenu-umbrella.h */, + 7115139913BF96A0839BC5861B28E9FF /* SideMenu.debug.xcconfig */, + 435F2595A13E46C5F8C183CFACA7184D /* SideMenu.release.xcconfig */, + ); + name = "Support Files"; + path = "../Target Support Files/SideMenu"; + sourceTree = ""; + }; + 73482AA62DC666CBB779B2F7B1CC1723 /* iOS */ = { + isa = PBXGroup; + children = ( + C4728485F928E461B2B4C8476CFF8ED3 /* Foundation.framework */, + 0E4C8B3E39284FFB24268F6C7AFD4814 /* LocalAuthentication.framework */, + 79B105173E71F2F06E1E7EBD3BCD0B73 /* SafariServices.framework */, + 48EB2316FEBBDA7321B103B88734234D /* UIKit.framework */, + ); + name = iOS; + sourceTree = ""; + }; + 774F957E2E6265819526C264D0EE1F5F /* Frameworks */ = { + isa = PBXGroup; + children = ( + BEB2D133AE8B296037F281765EDBD61B /* GoogleMapsBase.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 7C8B86B8992BC40A359237DEC1ECF595 /* Pods-TracMobility */ = { + isa = PBXGroup; + children = ( + 80975361169EB0F5F96F131003D58BBF /* Pods-TracMobility.modulemap */, + 2DFB432F405021763C396F83E17C413A /* Pods-TracMobility-acknowledgements.markdown */, + A24B746DA9B126FADFAE9C7C3CE9CF53 /* Pods-TracMobility-acknowledgements.plist */, + A64460896588B62BE966AA86DAE95352 /* Pods-TracMobility-dummy.m */, + B67631E3B8DF342F699B6993185F6FC2 /* Pods-TracMobility-frameworks.sh */, + 5EDA0A870640D3032BFE4224F64C7CA1 /* Pods-TracMobility-Info.plist */, + 55460C6CAF36007DEFB9BFB7C66FF60E /* Pods-TracMobility-resources.sh */, + 53F512DAC0E037B3061DFB0A35CB8F24 /* Pods-TracMobility-umbrella.h */, + 743135213B9FE92BA7DBC05E6733C144 /* Pods-TracMobility.debug.xcconfig */, + B29B8B49583093E1482E2277E9E94655 /* Pods-TracMobility.release.xcconfig */, + ); + name = "Pods-TracMobility"; + path = "Target Support Files/Pods-TracMobility"; + sourceTree = ""; + }; + 7F774AA919CF5A696B58D881B0E281E2 /* Products */ = { + isa = PBXGroup; + children = ( + 999459C45731F18EC49428C10057EA51 /* Auth0.framework */, + 7A8D4AC02B51FD03224739D06AEE207B /* JWTDecode.framework */, + BF1A0D25C765B20D6EDE7273B141B566 /* Pods_TracMobility.framework */, + 319D06AA0D1D0BA345459C039040A1ED /* SideMenu.framework */, + CD3B027EC578E22891ED55C05705F3CD /* SimpleKeychain.framework */, + ); + name = Products; + sourceTree = ""; + }; + 99EF7E14A93D95BD3A9D2DB01DA9C193 /* Pods */ = { + isa = PBXGroup; + children = ( + 3F968C186B6E1C5F24AA109872FF4003 /* Auth0 */, + D0DE462257E1950DC63655BA81BDA1E5 /* GoogleMaps */, + 54AB5F13437845D9811D4F5917C07261 /* JWTDecode */, + CE008FB4E5C007002BF01BC0D33343D0 /* SideMenu */, + FC258B6D37A8D7E42BBC5E39F5088DCB /* SimpleKeychain */, + ); + name = Pods; + sourceTree = ""; + }; + AB416D86FE2114A8DFE80EC611E2D6BB /* Support Files */ = { + isa = PBXGroup; + children = ( + 7EE10129D524DEBEAA8225F67C1975B1 /* SimpleKeychain.modulemap */, + EC6AF10DE4E93F6D71CA2F8F96B09DEE /* SimpleKeychain-dummy.m */, + 0933D40E7753404C1DFFFFED71177A23 /* SimpleKeychain-Info.plist */, + D46F8AFBEEF048AB403459A749B47917 /* SimpleKeychain-prefix.pch */, + 62BEF1CC0F23CE523ED5CFD0BBBEC179 /* SimpleKeychain-umbrella.h */, + 03FAAE053DE4C0E0D40C5529AE3E6CE5 /* SimpleKeychain.debug.xcconfig */, + 0A6D2B90CC925D15B30C4161C6C00C96 /* SimpleKeychain.release.xcconfig */, + ); + name = "Support Files"; + path = "../Target Support Files/SimpleKeychain"; + sourceTree = ""; + }; + C9C36304F940809A92306D7C8D70AB44 /* Support Files */ = { + isa = PBXGroup; + children = ( + 6B6F6ABFC8D5167FFAEEBFE03C792FA5 /* JWTDecode.modulemap */, + 1002B0CD36F9A9EB8E8C20D0FDB131C9 /* JWTDecode-dummy.m */, + 2AD007E7D08D3D7B97132F532EE11E15 /* JWTDecode-Info.plist */, + A0AFBE8A4F78F72C52DCBEB7FE614A82 /* JWTDecode-prefix.pch */, + FF0D51A7ACFBEB473611F4D8C0296EC9 /* JWTDecode-umbrella.h */, + B60AE4CA74153FD8CB7B2C1B17CE8CB6 /* JWTDecode.debug.xcconfig */, + E204EEDFBC0C2C166541A1E658345C77 /* JWTDecode.release.xcconfig */, + ); + name = "Support Files"; + path = "../Target Support Files/JWTDecode"; + sourceTree = ""; + }; + CAF1B90AF762610FA2BF8548273345F4 /* Base */ = { + isa = PBXGroup; + children = ( + 774F957E2E6265819526C264D0EE1F5F /* Frameworks */, + ); + name = Base; + sourceTree = ""; + }; + CE008FB4E5C007002BF01BC0D33343D0 /* SideMenu */ = { + isa = PBXGroup; + children = ( + 17120734236A857987BA4DB14DD61748 /* Deprecations.swift */, + 9B84C70B33EAC62431B9DD67D1024A16 /* Extensions.swift */, + 62F259F951BDF0F66C31DD8A50C9174F /* Initializable.swift */, + 3431E20E145C09DBF1540614531E12A7 /* Print.swift */, + E44C6D9024A6CF8995180C407D670E9F /* Protected.swift */, + CF2F69DCD55D662A3B26D6648673218E /* SideMenuAnimationController.swift */, + 357F265A899CD9D968BE80BBFE9DA639 /* SideMenuInteractionController.swift */, + FE00364594B82AA072B8A1C030D12FCD /* SideMenuManager.swift */, + A0FAB9595E4CF6C2701F9BFCB3F75837 /* SideMenuNavigationController.swift */, + 18C46E374FA37EE164F60207FAFDB162 /* SideMenuPresentationController.swift */, + 242514B5A974F83D7DB8BE059F60B575 /* SideMenuPresentationStyle.swift */, + D4221A6AB1B01170C3D9277D48E3F41F /* SideMenuPushCoordinator.swift */, + C045B7B17F7973CB76F71B4F325E30C6 /* SideMenuTransitionController.swift */, + DC62200EADE95E0212BEC76C5DB83E5A /* UITableViewVibrantCell.swift */, + 73254DF8CEE9D05A07C285D5D1F42866 /* Support Files */, + ); + name = SideMenu; + path = SideMenu; + sourceTree = ""; + }; + CF1408CF629C7361332E53B88F7BD30C = { + isa = PBXGroup; + children = ( + 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */, + 0321344B3953BA90EBB5A36F13AC3AB1 /* Frameworks */, + 99EF7E14A93D95BD3A9D2DB01DA9C193 /* Pods */, + 7F774AA919CF5A696B58D881B0E281E2 /* Products */, + FC8F064593E76371C906F21B689B2219 /* Targets Support Files */, + ); + sourceTree = ""; + }; + D0DE462257E1950DC63655BA81BDA1E5 /* GoogleMaps */ = { + isa = PBXGroup; + children = ( + CAF1B90AF762610FA2BF8548273345F4 /* Base */, + E1D5AFEA8E94AB065B6F52D8BFB960CB /* Maps */, + 267FFAA4A7ADD0B48B48050B8E35A1D8 /* Support Files */, + ); + name = GoogleMaps; + path = GoogleMaps; + sourceTree = ""; + }; + E1D5AFEA8E94AB065B6F52D8BFB960CB /* Maps */ = { + isa = PBXGroup; + children = ( + 1179A4CE8C7068420D9A37A927B26183 /* Frameworks */, + 152504BD4E198307F8722D64ED3AF4E5 /* Resources */, + ); + name = Maps; + sourceTree = ""; + }; + FC258B6D37A8D7E42BBC5E39F5088DCB /* SimpleKeychain */ = { + isa = PBXGroup; + children = ( + 8636629400958D764063AA4E90267847 /* A0SimpleKeychain.h */, + 0249686A98E64D77975167A31E169294 /* A0SimpleKeychain.m */, + 6B867D5ABFD5006560EC06A30C34BA9B /* A0SimpleKeychain+KeyPair.h */, + E864240BF4548C5826BB0CBA8CFF4AA9 /* A0SimpleKeychain+KeyPair.m */, + 68DE8317BA4663E2789D88E2C274DF2B /* SimpleKeychain.h */, + AB416D86FE2114A8DFE80EC611E2D6BB /* Support Files */, + ); + name = SimpleKeychain; + path = SimpleKeychain; + sourceTree = ""; + }; + FC6ACD748B53695410E3A94203B50200 /* Support Files */ = { + isa = PBXGroup; + children = ( + 87E03DC03F084E4F1979FF26634838A0 /* Auth0.modulemap */, + 391299F51852DF5E78863903032BD175 /* Auth0-dummy.m */, + B1DA16224839C9C01339CE6B5D17C6A2 /* Auth0-Info.plist */, + E3462718529CDE56B33B20E74EFB2D4F /* Auth0-prefix.pch */, + D28755E8281FD4BA791065D42A44AD67 /* Auth0-umbrella.h */, + 2758357EBF8AD556F2EE38C26C6807F3 /* Auth0.debug.xcconfig */, + 6D5ACD50C975FC79731B2CAFE8C404A9 /* Auth0.release.xcconfig */, + ); + name = "Support Files"; + path = "../Target Support Files/Auth0"; + sourceTree = ""; + }; + FC8F064593E76371C906F21B689B2219 /* Targets Support Files */ = { + isa = PBXGroup; + children = ( + 7C8B86B8992BC40A359237DEC1ECF595 /* Pods-TracMobility */, + ); + name = "Targets Support Files"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 1ABC8E70FD68D0FA0489479E39957DBE /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 74D8072A379878000E0F6605D6D874D9 /* A0SimpleKeychain+KeyPair.h in Headers */, + B01BE472A19FB04C4A7000865908B8EC /* A0SimpleKeychain.h in Headers */, + F42DBAE39B8DBEA80DD187805BF516B0 /* SimpleKeychain-umbrella.h in Headers */, + 644BEE229C53B59F1C68AD61D92B70FD /* SimpleKeychain.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 249F461EE77607C817019D8248F119BF /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 1A766F05FEF8113BE3ADCD85F0D172DC /* JWTDecode-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 28761BD3C505CCB36997450A19676357 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + D777716F0B6C0754B7B0230531743BC4 /* SideMenu-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + BB08088505C63B70F527C139D9CA5A11 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 730874225865FFEE25F60831C481E6F5 /* Pods-TracMobility-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + BF2BBC6C0F6D1B514478018DB78F6BA9 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 86D824B274DCD84D572293FC555F8D96 /* A0ChallengeGenerator.h in Headers */, + F1F72D383098F92022F9AE78DDF46C3F /* A0RSA.h in Headers */, + 726E2ABD01E7918A6461B83734162CE3 /* A0SHA.h in Headers */, + 05F3DCAC68787DC15026B845F13C594E /* Auth0-umbrella.h in Headers */, + E0804A914CA5395D625CADDA8E0BE07F /* Auth0.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 192AEFA366AAFE1F45B918C022FE489C /* SimpleKeychain */ = { + isa = PBXNativeTarget; + buildConfigurationList = 2631F831E6A2C3C09BD657153953F830 /* Build configuration list for PBXNativeTarget "SimpleKeychain" */; + buildPhases = ( + 1ABC8E70FD68D0FA0489479E39957DBE /* Headers */, + 7323BE213D7FFBC6A9806EFCF3CFF198 /* Sources */, + B91F7848AEF33FB159735908CFF08D48 /* Frameworks */, + 0EE6B6F9607466937A78EDBA88169343 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = SimpleKeychain; + productName = SimpleKeychain; + productReference = CD3B027EC578E22891ED55C05705F3CD /* SimpleKeychain.framework */; + productType = "com.apple.product-type.framework"; + }; + 22E1F0E7CBECE226FC294E79C21B0033 /* JWTDecode */ = { + isa = PBXNativeTarget; + buildConfigurationList = 20F1EC58CBDD7EB3592DC87E2CDAB2BD /* Build configuration list for PBXNativeTarget "JWTDecode" */; + buildPhases = ( + 249F461EE77607C817019D8248F119BF /* Headers */, + E1F8DC847827698A9E3076E8F41E9324 /* Sources */, + 65D21D3F66794ED154AE6287773BAC7C /* Frameworks */, + AC737FBF0251AD611E4AC0F1B12FDCF1 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = JWTDecode; + productName = JWTDecode; + productReference = 7A8D4AC02B51FD03224739D06AEE207B /* JWTDecode.framework */; + productType = "com.apple.product-type.framework"; + }; + 827E6A41981DD5F92C16C1DA5C0F5AFA /* Pods-TracMobility */ = { + isa = PBXNativeTarget; + buildConfigurationList = A921F5B196CB374EA957458DF6DAD05F /* Build configuration list for PBXNativeTarget "Pods-TracMobility" */; + buildPhases = ( + BB08088505C63B70F527C139D9CA5A11 /* Headers */, + 7C83411554A513C0F5C6EAA8867E07CF /* Sources */, + 2B85D115573CE30350B7BF62827F6ED7 /* Frameworks */, + 7357D3AD1F5BC77989D76339B499510A /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 601763AEB6D00DF9AB93DF288DDD7504 /* PBXTargetDependency */, + 580DD402B887DCC46F8AAC0E7A33EA34 /* PBXTargetDependency */, + EF8209D905726CC67A285C9C35E44819 /* PBXTargetDependency */, + 3695A9D1918322C3223897E79106CF9E /* PBXTargetDependency */, + CCB4251B4A49B02DF6B518370227D968 /* PBXTargetDependency */, + ); + name = "Pods-TracMobility"; + productName = "Pods-TracMobility"; + productReference = BF1A0D25C765B20D6EDE7273B141B566 /* Pods_TracMobility.framework */; + productType = "com.apple.product-type.framework"; + }; + C4A0A7D8591B67FB75E2E8D215E3735B /* SideMenu */ = { + isa = PBXNativeTarget; + buildConfigurationList = 92707F899E1CD6FD63DCC66A3882B68C /* Build configuration list for PBXNativeTarget "SideMenu" */; + buildPhases = ( + 28761BD3C505CCB36997450A19676357 /* Headers */, + 8B7A6B51F5DD73DE3F3F294B1BF713BE /* Sources */, + D9D87C2BC8D3C4B8382407D4C6B16014 /* Frameworks */, + E880A6A8817A45BC1BDE085DEC3399E0 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = SideMenu; + productName = SideMenu; + productReference = 319D06AA0D1D0BA345459C039040A1ED /* SideMenu.framework */; + productType = "com.apple.product-type.framework"; + }; + D6A440A37D50015E369921294617C612 /* Auth0 */ = { + isa = PBXNativeTarget; + buildConfigurationList = FFBEECF91AAA3CA7279CC1499F4AEDE1 /* Build configuration list for PBXNativeTarget "Auth0" */; + buildPhases = ( + BF2BBC6C0F6D1B514478018DB78F6BA9 /* Headers */, + 69A580172FE271C0A0A487888503CB0E /* Sources */, + 7FA9283343A3B51DF6E29FC09347EDF7 /* Frameworks */, + BE569CCE1E3D6950DEB6D04687769458 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 1CE14676D018EDA7D08441E96346565B /* PBXTargetDependency */, + B7E1F1B540237A8CABD29148CC626378 /* PBXTargetDependency */, + ); + name = Auth0; + productName = Auth0; + productReference = 999459C45731F18EC49428C10057EA51 /* Auth0.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 = 7F774AA919CF5A696B58D881B0E281E2 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + D6A440A37D50015E369921294617C612 /* Auth0 */, + E5B4BBC6DD552AC8943C7E22772FC1D3 /* GoogleMaps */, + 22E1F0E7CBECE226FC294E79C21B0033 /* JWTDecode */, + 827E6A41981DD5F92C16C1DA5C0F5AFA /* Pods-TracMobility */, + C4A0A7D8591B67FB75E2E8D215E3735B /* SideMenu */, + 192AEFA366AAFE1F45B918C022FE489C /* SimpleKeychain */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 0EE6B6F9607466937A78EDBA88169343 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 7357D3AD1F5BC77989D76339B499510A /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + AC737FBF0251AD611E4AC0F1B12FDCF1 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + BE569CCE1E3D6950DEB6D04687769458 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + E880A6A8817A45BC1BDE085DEC3399E0 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 69A580172FE271C0A0A487888503CB0E /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + A4666BC7F6E0D8BBDD22A1294637FA91 /* _ObjectiveAuthenticationAPI.swift in Sources */, + 2E91482C596C57275E8C3E92D9459965 /* _ObjectiveManagementAPI.swift in Sources */, + 72DA7F412D36835CB1ACBA58FE4C706F /* _ObjectiveWebAuth.swift in Sources */, + 66EC7587AF5B4A1E73F334764A7BE210 /* A0ChallengeGenerator.m in Sources */, + 791AD9EE18B8E8E058174E01621A32AB /* A0RSA.m in Sources */, + 158E4A12218EAAF6FC2B70AABCF6EC5A /* A0SHA.m in Sources */, + B7883CABA5509F981F534EA15BAC8E24 /* A0SimpleKeychain+RSAPublicKey.swift in Sources */, + BB988F9C5AC7353874C50AEEE3781FFD /* Array+Encode.swift in Sources */, + 4CB0FAC615F7C6324BD74DC2CEF70F51 /* Auth0-dummy.m in Sources */, + 95A1E76D4EFC60DF87FB82F19DB4FFCA /* Auth0.swift in Sources */, + 761EC698F1E152E7BCCFF6C5B2DCBDC4 /* Auth0Authentication.swift in Sources */, + 5A497CB1B9901F80CEE853D333A3721D /* Auth0Error.swift in Sources */, + DBC04073F4C05395B9812D9FDCD9EF40 /* AuthCancelable.swift in Sources */, + 0AEE4116D2A72294B7BF5DFD818601BB /* Authentication.swift in Sources */, + 144781611443EFAEB8FD220585FA7131 /* AuthenticationError.swift in Sources */, + FA2A3765B1B3A3E31B7001D4FFE6688C /* AuthenticationServicesSession.swift in Sources */, + CF7B55E45FC55A4CD9D6919864B439AE /* AuthenticationServicesSessionCallback.swift in Sources */, + 944FFA9A6589D6ABAD28570B51BB09BC /* AuthProvider.swift in Sources */, + A6A2EBCBD7B8B1244DB8E449297029BD /* AuthSession.swift in Sources */, + 031AA2DB67A55EE7AE432981DFDC59B8 /* AuthTransaction.swift in Sources */, + 5939998F45BC3D41273E018CB7A9A399 /* BaseAuthTransaction.swift in Sources */, + 075EB555ADF78E375C09892C0DF767B8 /* BaseWebAuth.swift in Sources */, + F3F723C94CD304E58CAAB80FA890F74E /* BioAuthentication.swift in Sources */, + D5E5A76FB19A2C3061B5140941706602 /* ClaimValidators.swift in Sources */, + EED6433531BA543E29624577B9B1F18D /* ControllerModalPresenter.swift in Sources */, + FEA733E84769114AD1FE267A10EA7204 /* Credentials.swift in Sources */, + A002C5FCC8D5FAF15FBBC5B676262343 /* CredentialsManager.swift in Sources */, + 674877CBD8A08565CFEB59419ADC4032 /* CredentialsManagerError.swift in Sources */, + AABE741EC2F6202444A5D9ABF91CFFF2 /* Date.swift in Sources */, + 56BC5638EB64537C7AE45AADA512AB26 /* Handlers.swift in Sources */, + 2E4C1D73F9B4BE6AB4651AAF2A33C080 /* Identity.swift in Sources */, + AE13A87CBB9DD3F17D4909A02B77023F /* IDTokenSignatureValidator.swift in Sources */, + 87CE447B47AF3FB3A26B915FD614FCE1 /* IDTokenValidator.swift in Sources */, + 34FC7C594EE887C6670A84323316F0BC /* IDTokenValidatorContext.swift in Sources */, + 2AFCDFE6A273702D6F5FBA2CB9CEEA89 /* JSONObjectPayload.swift in Sources */, + 28FCC2639F983C267560757EE8016B71 /* JWK+RSA.swift in Sources */, + 3EE70F74E18571874287B97D7641BA7F /* JWKS.swift in Sources */, + D3BDBB904E42E860F35E9DB5AE6AA671 /* JWT+Header.swift in Sources */, + 1A8F7F847C21F79B444FF4FEB50C6557 /* JWTAlgorithm.swift in Sources */, + 895391C7E3CBD618FFC14059B98CBA68 /* Loggable.swift in Sources */, + 8D99D40053441637EA7A13B95CE74DA3 /* Logger.swift in Sources */, + A124236E79CF4C7BF5988D079C86F802 /* Management.swift in Sources */, + 6FC7B6F2CA574085656A1067C0E87E79 /* ManagementError.swift in Sources */, + 26CAAE4FBB59E5C0906E4DD293E626C9 /* MobileWebAuth.swift in Sources */, + 108A8FDEFCBC5565CFE4DDD633CA3786 /* NativeAuth.swift in Sources */, + E2CD16ECB8EA2A85B692D9746CED8C0A /* NSData+URLSafe.swift in Sources */, + 3833083FC6BFBA503C9FC9C68376203C /* NSError+Helper.swift in Sources */, + 71B11342537D6949773E7BEDA74CAB65 /* NSURL+Auth0.swift in Sources */, + F8A471E5C254B27D3A645793725E20B1 /* NSURLComponents+OAuth2.swift in Sources */, + 53D61E1A80DB1962DF9146EC301D151F /* OAuth2Grant.swift in Sources */, + 0268532C49DBAAF7C54D780BD1AAC501 /* Optional+DebugDescription.swift in Sources */, + 647885596AAC09B0413F07E2DC733074 /* Profile.swift in Sources */, + FC7D6434302C46978BAEC4C05301B52C /* Request.swift in Sources */, + 789B84C5A99A1963B2D7C3B5DD31170E /* Requestable.swift in Sources */, + 4859275B55A35267EC1D394764F6128D /* Response.swift in Sources */, + FC4588DF99BA17E61DB3747BA5F14B78 /* ResponseType.swift in Sources */, + DDB550E330B217E68009822E05CE54D2 /* Result.swift in Sources */, + A3E13EDBC094E479447B7FC66399B861 /* SafariSession.swift in Sources */, + 5F237E7E41E9759AC99453AC1E011137 /* SessionCallbackTransaction.swift in Sources */, + 0980A9BE78CDFF3939DAE1E34EF60989 /* SessionTransaction.swift in Sources */, + 8FE9B6FC65010C719EB926427BA24CB1 /* SilentSafariViewController.swift in Sources */, + A033CF039695CED2225FBEB7E25B6535 /* String+URLSafe.swift in Sources */, + DDB08BBF9EF0F39387D03717F2F4E721 /* Telemetry.swift in Sources */, + B0FBBA93EF9C81F71331550B5AEAB8EF /* TransactionStore.swift in Sources */, + D5C1CFD7679B4685D29D9A246D30244A /* UIApplication+Shared.swift in Sources */, + EF30331943C7F2BDF7056B5275ABC66F /* UserInfo.swift in Sources */, + 1C9E35BACF130380DE342F8BCED81656 /* UserPatchAttributes.swift in Sources */, + 5B64910E5E7AEB168FB1463894C2E176 /* Users.swift in Sources */, + 564747C8631A7C4CF2E6F0C8120A4A4C /* WebAuthenticatable.swift in Sources */, + F41ED9EC71B5D34272F2FED4B95E8AE6 /* WebAuthError.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 7323BE213D7FFBC6A9806EFCF3CFF198 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 562590480CD89E5C6A191D6D0DBB240F /* A0SimpleKeychain+KeyPair.m in Sources */, + CC63DE6971E96DA610E35607FED070C6 /* A0SimpleKeychain.m in Sources */, + 4DC6B7D91C30204B8F6DF6C81F219DC0 /* SimpleKeychain-dummy.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 7C83411554A513C0F5C6EAA8867E07CF /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + C347880249E2215DDDDD63675A31327E /* Pods-TracMobility-dummy.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 8B7A6B51F5DD73DE3F3F294B1BF713BE /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + D3D22BB8C279DC03EA91BFE3F5412477 /* Deprecations.swift in Sources */, + 4E88B70410F6837FBD463EA4B6C33155 /* Extensions.swift in Sources */, + C798DA148F7F666F393F2009DDF73E35 /* Initializable.swift in Sources */, + D1BD7393C7934049B3E51D9C5A5CD8A0 /* Print.swift in Sources */, + 905A503F069C27E841BAD9F4EFD4F1AF /* Protected.swift in Sources */, + 08B5B89F28224381711F45A680C292D9 /* SideMenu-dummy.m in Sources */, + 890FF25D0CCFF9BADECBA64DCCEFF4FF /* SideMenuAnimationController.swift in Sources */, + 8C06632AA14D12278B1277AC0CC6A0B2 /* SideMenuInteractionController.swift in Sources */, + 77AF2098DDCCAAE0CE4A20725C466905 /* SideMenuManager.swift in Sources */, + 3846AFE38D1B63A9F0D9073C4ABC6DAA /* SideMenuNavigationController.swift in Sources */, + 27D830F1CAC60B99CC0A135F583BFFF2 /* SideMenuPresentationController.swift in Sources */, + 3E18B004D34ED5441A193684EEB25BD3 /* SideMenuPresentationStyle.swift in Sources */, + 2ED518A3FA8DCBE08E621AC5C32844A9 /* SideMenuPushCoordinator.swift in Sources */, + 09A0A5D3733F69E93F553ABBCF02FB77 /* SideMenuTransitionController.swift in Sources */, + C96A55C2A869A97AC4CA628A7F2A2A21 /* UITableViewVibrantCell.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + E1F8DC847827698A9E3076E8F41E9324 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 6E940C89414F12244419074797274CC8 /* A0JWT.swift in Sources */, + 37BFAC529368699DED04412DB116BD90 /* Errors.swift in Sources */, + 86AD5E522BECB5A83EB0D5B8EA60C4BB /* JWT.swift in Sources */, + 85B9916E3483553FDB1AAF9A0CB76D98 /* JWTDecode-dummy.m in Sources */, + 790C5E4D3F13225E9D007286C1F1A614 /* JWTDecode.swift in Sources */, + E96C1FB4A3F4601180C37592CAEAE2F6 /* TokenValidators.swift in Sources */, + 7EE79957319B9F8EEC9D6A0F27654588 /* ValidationError.swift in Sources */, + FDA43146F0125B5726A907898DBB5D9B /* ValidatorJWT.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 1CE14676D018EDA7D08441E96346565B /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = JWTDecode; + target = 22E1F0E7CBECE226FC294E79C21B0033 /* JWTDecode */; + targetProxy = 36C4BCC91769063BC36BB8F526C38A8B /* PBXContainerItemProxy */; + }; + 3695A9D1918322C3223897E79106CF9E /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = SideMenu; + target = C4A0A7D8591B67FB75E2E8D215E3735B /* SideMenu */; + targetProxy = CFA3B1F95238AF83136E929E67252630 /* PBXContainerItemProxy */; + }; + 580DD402B887DCC46F8AAC0E7A33EA34 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = GoogleMaps; + target = E5B4BBC6DD552AC8943C7E22772FC1D3 /* GoogleMaps */; + targetProxy = 9ACB5D6E538F568CA9E252A10A4F167A /* PBXContainerItemProxy */; + }; + 601763AEB6D00DF9AB93DF288DDD7504 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = Auth0; + target = D6A440A37D50015E369921294617C612 /* Auth0 */; + targetProxy = 7ABBBF31D7335F453A9A78D864E3C3AD /* PBXContainerItemProxy */; + }; + B7E1F1B540237A8CABD29148CC626378 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = SimpleKeychain; + target = 192AEFA366AAFE1F45B918C022FE489C /* SimpleKeychain */; + targetProxy = 98520E69C0D267FA1ED32DC8329D6C4F /* PBXContainerItemProxy */; + }; + CCB4251B4A49B02DF6B518370227D968 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = SimpleKeychain; + target = 192AEFA366AAFE1F45B918C022FE489C /* SimpleKeychain */; + targetProxy = 89B069898770E469F5C119C04FD77B76 /* PBXContainerItemProxy */; + }; + EF8209D905726CC67A285C9C35E44819 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = JWTDecode; + target = 22E1F0E7CBECE226FC294E79C21B0033 /* JWTDecode */; + targetProxy = 5C0E35EFF3440A09BC2D9EB4DF70ACE2 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 0BE6D0CED117103FE119745756EBD59F /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = B60AE4CA74153FD8CB7B2C1B17CE8CB6 /* JWTDecode.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/JWTDecode/JWTDecode-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/JWTDecode/JWTDecode-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/JWTDecode/JWTDecode.modulemap"; + PRODUCT_MODULE_NAME = JWTDecode; + PRODUCT_NAME = JWTDecode; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_VERSION = 5.3; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 1C8A687A8AC1620ECDFCDED2FAC17C9E /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 435F2595A13E46C5F8C183CFACA7184D /* SideMenu.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/SideMenu/SideMenu-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/SideMenu/SideMenu-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/SideMenu/SideMenu.modulemap"; + PRODUCT_MODULE_NAME = SideMenu; + PRODUCT_NAME = SideMenu; + 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; + }; + 2C72A94599DC61F715EFAA96A5458984 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 6D5ACD50C975FC79731B2CAFE8C404A9 /* Auth0.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/Auth0/Auth0-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/Auth0/Auth0-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/Auth0/Auth0.modulemap"; + PRODUCT_MODULE_NAME = Auth0; + PRODUCT_NAME = Auth0; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_VERSION = 5.3; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 45B6D36435972CBBC59A481A20E44C4A /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7115139913BF96A0839BC5861B28E9FF /* SideMenu.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/SideMenu/SideMenu-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/SideMenu/SideMenu-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/SideMenu/SideMenu.modulemap"; + PRODUCT_MODULE_NAME = SideMenu; + PRODUCT_NAME = SideMenu; + 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; + }; + 5607CD50656C24B1A4C1B8F2F6DACC4B /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = B29B8B49583093E1482E2277E9E94655 /* Pods-TracMobility.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-TracMobility/Pods-TracMobility-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 14.2; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-TracMobility/Pods-TracMobility.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; + }; + 5F105DE130E7C58EB2BB2D3D56345DEF /* 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 = 14.2; + 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; + }; + 6BF14DAB2BAFC307467D68C0C74D5357 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 0A6D2B90CC925D15B30C4161C6C00C96 /* SimpleKeychain.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/SimpleKeychain/SimpleKeychain-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/SimpleKeychain/SimpleKeychain-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/SimpleKeychain/SimpleKeychain.modulemap"; + PRODUCT_MODULE_NAME = SimpleKeychain; + PRODUCT_NAME = SimpleKeychain; + 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; + }; + 790F8A239E8E595BAF97D458AF9300EC /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 743135213B9FE92BA7DBC05E6733C144 /* Pods-TracMobility.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-TracMobility/Pods-TracMobility-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 14.2; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-TracMobility/Pods-TracMobility.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; + }; + 85B0741E453F3A68A0D39844DFFC8A7D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = E204EEDFBC0C2C166541A1E658345C77 /* JWTDecode.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/JWTDecode/JWTDecode-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/JWTDecode/JWTDecode-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/JWTDecode/JWTDecode.modulemap"; + PRODUCT_MODULE_NAME = JWTDecode; + PRODUCT_NAME = JWTDecode; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_VERSION = 5.3; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 8CE5BA3EF4F6FABF028CE30772ECDA11 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 10DA8620B5389CFE39475EDA3F8053A0 /* 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; + }; + 92E0205E7B86154674E2B4E6C4BE136A /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 03FAAE053DE4C0E0D40C5529AE3E6CE5 /* SimpleKeychain.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/SimpleKeychain/SimpleKeychain-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/SimpleKeychain/SimpleKeychain-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/SimpleKeychain/SimpleKeychain.modulemap"; + PRODUCT_MODULE_NAME = SimpleKeychain; + PRODUCT_NAME = SimpleKeychain; + 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; + }; + AB9B38139C5627437C662CCBEFC5D805 /* 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 = 14.2; + 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; + }; + D7CEA483812F614092313DEF53B5DACD /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 2758357EBF8AD556F2EE38C26C6807F3 /* Auth0.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/Auth0/Auth0-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/Auth0/Auth0-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/Auth0/Auth0.modulemap"; + PRODUCT_MODULE_NAME = Auth0; + PRODUCT_NAME = Auth0; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_VERSION = 5.3; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + E1E452060D51DF935547186CE54B26CC /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = E81C0DB1FD01EB085E15CCEF8FBD73E5 /* 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; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 20F1EC58CBDD7EB3592DC87E2CDAB2BD /* Build configuration list for PBXNativeTarget "JWTDecode" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 0BE6D0CED117103FE119745756EBD59F /* Debug */, + 85B0741E453F3A68A0D39844DFFC8A7D /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 2631F831E6A2C3C09BD657153953F830 /* Build configuration list for PBXNativeTarget "SimpleKeychain" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 92E0205E7B86154674E2B4E6C4BE136A /* Debug */, + 6BF14DAB2BAFC307467D68C0C74D5357 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 46921981F609C5BA3CB72EC4EA41299D /* Build configuration list for PBXAggregateTarget "GoogleMaps" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + E1E452060D51DF935547186CE54B26CC /* Debug */, + 8CE5BA3EF4F6FABF028CE30772ECDA11 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 5F105DE130E7C58EB2BB2D3D56345DEF /* Debug */, + AB9B38139C5627437C662CCBEFC5D805 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 92707F899E1CD6FD63DCC66A3882B68C /* Build configuration list for PBXNativeTarget "SideMenu" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 45B6D36435972CBBC59A481A20E44C4A /* Debug */, + 1C8A687A8AC1620ECDFCDED2FAC17C9E /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + A921F5B196CB374EA957458DF6DAD05F /* Build configuration list for PBXNativeTarget "Pods-TracMobility" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 790F8A239E8E595BAF97D458AF9300EC /* Debug */, + 5607CD50656C24B1A4C1B8F2F6DACC4B /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + FFBEECF91AAA3CA7279CC1499F4AEDE1 /* Build configuration list for PBXNativeTarget "Auth0" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + D7CEA483812F614092313DEF53B5DACD /* Debug */, + 2C72A94599DC61F715EFAA96A5458984 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = BFDFE7DC352907FC980B868725387E98 /* Project object */; +} diff --git a/TracMobility/Pods/Pods.xcodeproj/xcuserdata/sabazshereef.xcuserdatad/xcschemes/Auth0.xcscheme b/TracMobility/Pods/Pods.xcodeproj/xcuserdata/sabazshereef.xcuserdatad/xcschemes/Auth0.xcscheme new file mode 100644 index 0000000..c5a589d --- /dev/null +++ b/TracMobility/Pods/Pods.xcodeproj/xcuserdata/sabazshereef.xcuserdatad/xcschemes/Auth0.xcscheme @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/TracMobility/Pods/Pods.xcodeproj/xcuserdata/sabazshereef.xcuserdatad/xcschemes/GoogleMaps.xcscheme b/TracMobility/Pods/Pods.xcodeproj/xcuserdata/sabazshereef.xcuserdatad/xcschemes/GoogleMaps.xcscheme new file mode 100644 index 0000000..114deb5 --- /dev/null +++ b/TracMobility/Pods/Pods.xcodeproj/xcuserdata/sabazshereef.xcuserdatad/xcschemes/GoogleMaps.xcscheme @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/TracMobility/Pods/Pods.xcodeproj/xcuserdata/sabazshereef.xcuserdatad/xcschemes/JWTDecode.xcscheme b/TracMobility/Pods/Pods.xcodeproj/xcuserdata/sabazshereef.xcuserdatad/xcschemes/JWTDecode.xcscheme new file mode 100644 index 0000000..64ac42a --- /dev/null +++ b/TracMobility/Pods/Pods.xcodeproj/xcuserdata/sabazshereef.xcuserdatad/xcschemes/JWTDecode.xcscheme @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/TracMobility/Pods/Pods.xcodeproj/xcuserdata/sabazshereef.xcuserdatad/xcschemes/Pods-TracMobility.xcscheme b/TracMobility/Pods/Pods.xcodeproj/xcuserdata/sabazshereef.xcuserdatad/xcschemes/Pods-TracMobility.xcscheme new file mode 100644 index 0000000..0b3417a --- /dev/null +++ b/TracMobility/Pods/Pods.xcodeproj/xcuserdata/sabazshereef.xcuserdatad/xcschemes/Pods-TracMobility.xcscheme @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/TracMobility/Pods/Pods.xcodeproj/xcuserdata/sabazshereef.xcuserdatad/xcschemes/SideMenu.xcscheme b/TracMobility/Pods/Pods.xcodeproj/xcuserdata/sabazshereef.xcuserdatad/xcschemes/SideMenu.xcscheme new file mode 100644 index 0000000..f30ab4d --- /dev/null +++ b/TracMobility/Pods/Pods.xcodeproj/xcuserdata/sabazshereef.xcuserdatad/xcschemes/SideMenu.xcscheme @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/TracMobility/Pods/Pods.xcodeproj/xcuserdata/sabazshereef.xcuserdatad/xcschemes/SimpleKeychain.xcscheme b/TracMobility/Pods/Pods.xcodeproj/xcuserdata/sabazshereef.xcuserdatad/xcschemes/SimpleKeychain.xcscheme new file mode 100644 index 0000000..cc2455b --- /dev/null +++ b/TracMobility/Pods/Pods.xcodeproj/xcuserdata/sabazshereef.xcuserdatad/xcschemes/SimpleKeychain.xcscheme @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/TracMobility/Pods/Pods.xcodeproj/xcuserdata/sabazshereef.xcuserdatad/xcschemes/xcschememanagement.plist b/TracMobility/Pods/Pods.xcodeproj/xcuserdata/sabazshereef.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..7cb1eb6 --- /dev/null +++ b/TracMobility/Pods/Pods.xcodeproj/xcuserdata/sabazshereef.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,53 @@ + + + + + SchemeUserState + + Auth0.xcscheme + + isShown + + orderHint + 0 + + GoogleMaps.xcscheme + + isShown + + orderHint + 1 + + JWTDecode.xcscheme + + isShown + + orderHint + 2 + + Pods-TracMobility.xcscheme + + isShown + + orderHint + 3 + + SideMenu.xcscheme + + isShown + + orderHint + 4 + + SimpleKeychain.xcscheme + + isShown + + orderHint + 5 + + + SuppressBuildableAutocreation + + + diff --git a/TracMobility/Pods/SideMenu/LICENSE b/TracMobility/Pods/SideMenu/LICENSE new file mode 100644 index 0000000..eccb52c --- /dev/null +++ b/TracMobility/Pods/SideMenu/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2015 Jonathan Kent + +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/TracMobility/Pods/SideMenu/Pod/Classes/Deprecations.swift b/TracMobility/Pods/SideMenu/Pod/Classes/Deprecations.swift new file mode 100644 index 0000000..6bfb1a6 --- /dev/null +++ b/TracMobility/Pods/SideMenu/Pod/Classes/Deprecations.swift @@ -0,0 +1,216 @@ +// +// Deprecations.swift +// SideMenu +// +// Created by Jon Kent on 7/3/19. +// + +import UIKit + +// Deprecations; to be removed at a future date. +extension SideMenuManager { + + @available(*, deprecated, renamed: "leftMenuNavigationController") + open var menuLeftNavigationController: SideMenuNavigationController? { + get { return nil } + set {} + } + + @available(*, deprecated, renamed: "rightMenuNavigationController") + open var menuRightNavigationController: SideMenuNavigationController? { + get { return nil } + set {} + } + + @available(*, deprecated, message: "This property has been moved to the SideMenuNavigationController class.") + public var menuPresentMode: SideMenuPresentationStyle { + get { return .viewSlideOut } + set {} + } + + @available(*, deprecated, message: "This property has been moved to the SideMenuNavigationController class.") + public var menuPushStyle: SideMenuPushStyle { + get { return .default } + set {} + } + + @available(*, deprecated, message: "This property has been moved to the SideMenuNavigationController class.") + public var menuAllowPushOfSameClassTwice: Bool { + get { return true } + set {} + } + + @available(*, deprecated, message: "This property has been moved to the SideMenuNavigationController class.") + public var menuWidth: CGFloat { + get { return 0 } + set {} + } + + @available(*, deprecated, message: "This property has been moved to the SideMenuNavigationController class.") + public var menuAnimationPresentDuration: Double { + get { return 0.35 } + set {} + } + + @available(*, deprecated, message: "This property has been moved to the SideMenuNavigationController class.") + public var menuAnimationDismissDuration: Double { + get { return 0.35 } + set {} + } + + @available(*, deprecated, message: "This property has been moved to the SideMenuNavigationController class.") + public var menuAnimationCompleteGestureDuration: Double { + get { return 0.35 } + set {} + } + + @available(*, deprecated, message: "This property has been moved to the SideMenuPresentationStyle class.") + public var menuAnimationFadeStrength: CGFloat { + get { return 0 } + set {} + } + + @available(*, deprecated, message: "This property has been moved to the SideMenuPresentationStyle class.") + public var menuAnimationTransformScaleFactor: CGFloat { + get { return 1 } + set {} + } + + @available(*, deprecated, message: "This property has been moved to the SideMenuPresentationStyle class.") + public var menuAnimationBackgroundColor: UIColor? { + get { return nil } + set {} + } + + @available(*, deprecated, message: "This property has been moved to the SideMenuPresentationStyle class.") + public var menuShadowOpacity: Float { + get { return 0.5 } + set {} + } + + @available(*, deprecated, message: "This property has been moved to the SideMenuPresentationStyle class.") + public var menuShadowColor: UIColor { + get { return .black } + set {} + } + + @available(*, deprecated, message: "This property has been moved to the SideMenuPresentationStyle class.") + public var menuShadowRadius: CGFloat { + get { return 5 } + set {} + } + + @available(*, deprecated, message: "This property has been moved to the SideMenuNavigationController class.") + public var menuPresentingViewControllerUserInteractionEnabled: Bool { + get { return false } + set {} + } + + @available(*, deprecated, message: "This property has been moved to the SideMenuPresentationStyle class.") + public var menuParallaxStrength: Int { + get { return 0 } + set {} + } + + @available(*, deprecated, message: "This property has been moved to the SideMenuNavigationController class.") + public var menuFadeStatusBar: Bool { + get { return true } + set {} + } + + @available(*, deprecated, message: "This property has been moved to the SideMenuNavigationController class.") + public var menuAnimationOptions: UIView.AnimationOptions { + get { return .curveEaseInOut } + set {} + } + + @available(*, deprecated, message: "This property has been moved to the SideMenuNavigationController class.") + public var menuAnimationCompletionCurve: UIView.AnimationCurve { + get { return .easeIn } + set {} + } + + @available(*, deprecated, message: "This property has been moved to the SideMenuNavigationController class.") + public var menuAnimationUsingSpringWithDamping: CGFloat { + get { return 1 } + set {} + } + + @available(*, deprecated, message: "This property has been moved to the SideMenuNavigationController class.") + public var menuAnimationInitialSpringVelocity: CGFloat { + get { return 1 } + set {} + } + + @available(*, deprecated, message: "This property has been moved to the SideMenuNavigationController class.") + public var menuDismissOnPush: Bool { + get { return true } + set {} + } + + @available(*, deprecated, message: "This property has been moved to the SideMenuNavigationController class.") + public var menuAlwaysAnimate: Bool { + get { return false } + set {} + } + + @available(*, deprecated, message: "This property has been moved to the SideMenuNavigationController class.") + public var menuDismissWhenBackgrounded: Bool { + get { return true } + set {} + } + + @available(*, deprecated, message: "This property has been moved to the SideMenuNavigationController class.") + public var menuBlurEffectStyle: UIBlurEffect.Style? { + get { return nil } + set {} + } + + @available(*, deprecated, message: "This property has been moved to the SideMenuNavigationController class.") + public weak var menuLeftSwipeToDismissGesture: UIPanGestureRecognizer? { + get { return nil } + set {} + } + + @available(*, deprecated, message: "This property has been moved to the SideMenuNavigationController class.") + public weak var menuRightSwipeToDismissGesture: UIPanGestureRecognizer? { + get { return nil } + set {} + } + + @available(*, deprecated, message: "This property has been moved to the SideMenuNavigationController class.") + public var menuEnableSwipeGestures: Bool { + get { return true } + set {} + } + + @available(*, deprecated, renamed: "enableSwipeToDismissGesture") + public var enableSwipeGestures: Bool { + get { return true } + set {} + } + + @available(*, deprecated, renamed: "SideMenuPresentationStyle") + public typealias MenuPresentMode = SideMenuPresentationStyle + + @available(*, deprecated, renamed: "addScreenEdgePanGesturesToPresent") + @discardableResult public func menuAddScreenEdgePanGesturesToPresent(toView view: UIView, forMenu sides: [PresentDirection] = [.left, .right]) -> [UIScreenEdgePanGestureRecognizer] { + return [] + } + + @available(*, deprecated, renamed: "addPanGestureToPresent") + @discardableResult public func menuAddPanGestureToPresent(toView view: UIView) -> UIPanGestureRecognizer { + return UIPanGestureRecognizer() + } +} + +extension SideMenuPresentationStyle { + @available(*, deprecated, renamed: "viewSlideOutMenuIn") + public static var viewSlideInOut: SideMenuPresentationStyle { return viewSlideOutMenuIn } +} + +@available(*, deprecated, renamed: "SideMenuNavigationController") +public typealias UISideMenuNavigationController = SideMenuNavigationController + +@available(*, deprecated, renamed: "SideMenuNavigationControllerDelegate") +public typealias UISideMenuNavigationControllerDelegate = SideMenuNavigationControllerDelegate diff --git a/TracMobility/Pods/SideMenu/Pod/Classes/Extensions.swift b/TracMobility/Pods/SideMenu/Pod/Classes/Extensions.swift new file mode 100644 index 0000000..2e85ea9 --- /dev/null +++ b/TracMobility/Pods/SideMenu/Pod/Classes/Extensions.swift @@ -0,0 +1,116 @@ +// +// Extensions.swift +// Pods-Example +// +// Created by Jon Kent on 7/1/19. +// + +import UIKit + +extension NSObject: InitializableClass {} + +internal extension UIView { + + @discardableResult func untransformed(_ block: () -> CGFloat) -> CGFloat { + let t = transform + transform = .identity + let value = block() + transform = t + return value + } + + func bringToFront() { + superview?.bringSubviewToFront(self) + } + + func untransform(_ block: () -> Void) { + untransformed { () -> CGFloat in + block() + return 0 + } + } + + static func animationsEnabled(_ enabled: Bool = true, _ block: () -> Void) { + let a = areAnimationsEnabled + setAnimationsEnabled(enabled) + block() + setAnimationsEnabled(a) + } +} + +internal extension UIViewController { + + // View controller actively displayed in that layer. It may not be visible if it's presenting another view controller. + var activeViewController: UIViewController { + switch self { + case let navigationController as UINavigationController: + return navigationController.topViewController?.activeViewController ?? self + case let tabBarController as UITabBarController: + return tabBarController.selectedViewController?.activeViewController ?? self + case let splitViewController as UISplitViewController: + return splitViewController.viewControllers.last?.activeViewController ?? self + default: + return self + } + } + + // View controller being displayed on screen to the user. + var topMostViewController: UIViewController { + let activeViewController = self.activeViewController + return activeViewController.presentedViewController?.topMostViewController ?? activeViewController + } + + var containerViewController: UIViewController { + return navigationController?.containerViewController ?? + tabBarController?.containerViewController ?? + splitViewController?.containerViewController ?? + self + } + + @objc var isHidden: Bool { + return presentingViewController == nil + } +} + +internal extension UIGestureRecognizer { + + convenience init(addTo view: UIView, target: Any, action: Selector) { + self.init(target: target, action: action) + view.addGestureRecognizer(self) + } + + convenience init?(addTo view: UIView?, target: Any, action: Selector) { + guard let view = view else { return nil } + self.init(addTo: view, target: target, action: action) + } + + func remove() { + view?.removeGestureRecognizer(self) + } +} + +internal extension UIPanGestureRecognizer { + + var canSwitch: Bool { + return !(self is UIScreenEdgePanGestureRecognizer) + } + + var xTranslation: CGFloat { + return view?.untransformed { + return self.translation(in: view).x + } ?? 0 + } + + var xVelocity: CGFloat { + return view?.untransformed { + return self.velocity(in: view).x + } ?? 0 + } +} + +internal extension UIApplication { + + var keyWindow: UIWindow? { + return UIApplication.shared.windows.filter { $0.isKeyWindow }.first + } +} diff --git a/TracMobility/Pods/SideMenu/Pod/Classes/Initializable.swift b/TracMobility/Pods/SideMenu/Pod/Classes/Initializable.swift new file mode 100644 index 0000000..5673e33 --- /dev/null +++ b/TracMobility/Pods/SideMenu/Pod/Classes/Initializable.swift @@ -0,0 +1,40 @@ +// +// Initializable.swift +// SideMenu +// +// Created by Jon Kent on 7/2/19. +// + +import Foundation + +internal protocol InitializableClass: class { + init() +} + +extension InitializableClass { + init(_ block: (Self) -> Void) { + self.init() + block(self) + } + + @discardableResult func with(_ block: (Self) -> Void) -> Self { + block(self) + return self + } +} + +public protocol InitializableStruct { + init() +} + +public extension InitializableStruct { + init(_ block: (inout Self) -> Void) { + self.init() + block(&self) + } + + @discardableResult mutating func with(_ block: (inout Self) -> Void) -> Self { + block(&self) + return self + } +} diff --git a/TracMobility/Pods/SideMenu/Pod/Classes/Print.swift b/TracMobility/Pods/SideMenu/Pod/Classes/Print.swift new file mode 100644 index 0000000..91aa3b0 --- /dev/null +++ b/TracMobility/Pods/SideMenu/Pod/Classes/Print.swift @@ -0,0 +1,51 @@ +// +// Print.swift +// SideMenu +// +// Created by Jon Kent on 12/5/18. +// + +import Foundation + +internal enum Print: String { case + cannotPush = "Attempt to push a View Controller from %@ where its navigationController == nil. It must be embedded in a UINavigationController for this to work.", + emptyMenu = "The menu doesn't have a view controller to show! SideMenuNavigationController needs a view controller to display just like a UINavigationController.", + menuAlreadyAssigned = "%@ was already assigned to the %@ of %@. When using multiple SideMenuManagers you may want to use new instances of SideMenuNavigationController instead of existing instances to avoid crashes if the menu is presented more than once.", + menuInUse = "%@ cannot be modified while it's presented.", + panGestureAdded = "%@ was called before %@ or %@ was set. Gestures will not work without a menu.", + property = "A menu's %@ property can only be changed when it is hidden.", + screenGestureAdded = "%@ was called before %@ was set. The gesture will not work without a menu. Use %@ to add gestures for only one menu.", + transitioningDelegate = "SideMenu requires use of the transitioningDelegate. It cannot be modified." + + enum PropertyName: String { case + leftSide + } + + static func warning(_ print: Print, arguments: CVarArg..., required: Bool = false) { + warning(String(format: print.rawValue, arguments: arguments), required: required) + } + + static func warning(_ print: Print, arguments: PropertyName..., required: Bool = false) { + warning(String(format: print.rawValue, arguments: arguments.map { $0.rawValue }), required: required) + } + + static func warning(_ print: Print, required: Bool = false) { + warning(print.rawValue, required: required) + } +} + +private extension Print { + + static func warning(_ message: String, required: Bool = false) { + let message = "SideMenu Warning: \(message)" + + if required { + print(message) + return + } + #if !STFU_SIDEMENU + print(message) + #endif + } + +} diff --git a/TracMobility/Pods/SideMenu/Pod/Classes/Protected.swift b/TracMobility/Pods/SideMenu/Pod/Classes/Protected.swift new file mode 100644 index 0000000..2e914df --- /dev/null +++ b/TracMobility/Pods/SideMenu/Pod/Classes/Protected.swift @@ -0,0 +1,26 @@ +// +// Protected.swift +// SideMenu +// +// Created by Jon Kent on 2/9/19. +// + +import Foundation + +internal final class Protected { + + typealias ConditionBlock = (_ oldValue: T, T) -> T + + private var _value: T + private var condition: ConditionBlock + + public var value: T { + get { return _value } + set { _value = condition(_value, newValue) } + } + + init(_ value: T, when condition: @escaping ConditionBlock) { + self._value = value + self.condition = condition + } +} diff --git a/TracMobility/Pods/SideMenu/Pod/Classes/SideMenuAnimationController.swift b/TracMobility/Pods/SideMenu/Pod/Classes/SideMenuAnimationController.swift new file mode 100644 index 0000000..aa6ff8d --- /dev/null +++ b/TracMobility/Pods/SideMenu/Pod/Classes/SideMenuAnimationController.swift @@ -0,0 +1,232 @@ +// +// SideMenuAnimationController.swift +// SideMenu +// +// Created by Jon Kent on 10/24/18. +// + +import UIKit + +internal protocol AnimationModel { + /// The animation options when a menu is displayed. Ignored when displayed with a gesture. + var animationOptions: UIView.AnimationOptions { get } + /// Duration of the remaining animation when the menu is partially dismissed with gestures. Default is 0.35 seconds. + var completeGestureDuration: Double { get } + /// Duration of the animation when the menu is dismissed without gestures. Default is 0.35 seconds. + var dismissDuration: Double { get } + /// The animation initial spring velocity when a menu is displayed. Ignored when displayed with a gesture. + var initialSpringVelocity: CGFloat { get } + /// Duration of the animation when the menu is presented without gestures. Default is 0.35 seconds. + var presentDuration: Double { get } + /// The animation spring damping when a menu is displayed. Ignored when displayed with a gesture. + var usingSpringWithDamping: CGFloat { get } +} + +internal protocol SideMenuAnimationControllerDelegate: class { + func sideMenuAnimationController(_ animationController: SideMenuAnimationController, didDismiss viewController: UIViewController) + func sideMenuAnimationController(_ animationController: SideMenuAnimationController, didPresent viewController: UIViewController) +} + +internal final class SideMenuAnimationController: NSObject, UIViewControllerAnimatedTransitioning { + + typealias Model = AnimationModel & PresentationModel + + private var config: Model + private weak var containerView: UIView? + private let leftSide: Bool + private weak var originalSuperview: UIView? + private var presentationController: SideMenuPresentationController? + private unowned var presentedViewController: UIViewController? + private unowned var presentingViewController: UIViewController? + weak var delegate: SideMenuAnimationControllerDelegate? + + init(config: Model, leftSide: Bool, delegate: SideMenuAnimationControllerDelegate? = nil) { + self.config = config + self.leftSide = leftSide + self.delegate = delegate + } + + func animateTransition(using transitionContext: UIViewControllerContextTransitioning) { + guard + let presentedViewController = transitionContext.presentedViewController, + let presentingViewController = transitionContext.presentingViewController + else { return } + + if transitionContext.isPresenting { + self.containerView = transitionContext.containerView + self.presentedViewController = presentedViewController + self.presentingViewController = presentingViewController + self.presentationController = SideMenuPresentationController( + config: config, + leftSide: leftSide, + presentedViewController: presentedViewController, + presentingViewController: presentingViewController, + containerView: transitionContext.containerView + ) + } + + transition(using: transitionContext) + } + + func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval { + guard let transitionContext = transitionContext else { return 0 } + return duration(presenting: transitionContext.isPresenting, interactive: transitionContext.isInteractive) + } + + func animationEnded(_ transitionCompleted: Bool) { + guard let presentedViewController = presentedViewController else { return } + if presentedViewController.isHidden { + delegate?.sideMenuAnimationController(self, didDismiss: presentedViewController) + } else { + delegate?.sideMenuAnimationController(self, didPresent: presentedViewController) + } + } + + func transition(presenting: Bool, animated: Bool = true, interactive: Bool = false, alongsideTransition: (() -> Void)? = nil, complete: Bool = true, completion: ((Bool) -> Void)? = nil) { + prepare(presenting: presenting) + transitionWillBegin(presenting: presenting) + transition( + presenting: presenting, + animated: animated, + interactive: interactive, + animations: { [weak self] in + guard let self = self else { return } + self.transition(presenting: presenting) + alongsideTransition?() + }, completion: { [weak self] _ in + guard let self = self else { return } + if complete { + self.transitionDidEnd(presenting: presenting, completed: true) + self.finish(presenting: presenting, completed: true) + } + completion?(true) + }) + } + + func layout() { + presentationController?.containerViewWillLayoutSubviews() + } +} + +private extension SideMenuAnimationController { + + func duration(presenting: Bool, interactive: Bool) -> Double { + if interactive { return config.completeGestureDuration } + return presenting ? config.presentDuration : config.dismissDuration + } + + func prepare(presenting: Bool) { + guard + presenting, + let presentingViewController = presentingViewController, + let presentedViewController = presentedViewController + else { return } + + originalSuperview = presentingViewController.view.superview + containerView?.addSubview(presentingViewController.view) + containerView?.addSubview(presentedViewController.view) + } + + func transitionWillBegin(presenting: Bool) { + // prevent any other menu gestures from firing + containerView?.isUserInteractionEnabled = false + if presenting { + presentationController?.presentationTransitionWillBegin() + } else { + presentationController?.dismissalTransitionWillBegin() + } + } + + func transition(presenting: Bool) { + if presenting { + presentationController?.presentationTransition() + } else { + presentationController?.dismissalTransition() + } + } + + func transitionDidEnd(presenting: Bool, completed: Bool) { + if presenting { + presentationController?.presentationTransitionDidEnd(completed) + } else { + presentationController?.dismissalTransitionDidEnd(completed) + } + containerView?.isUserInteractionEnabled = true + } + + func finish(presenting: Bool, completed: Bool) { + guard + presenting != completed, + let presentingViewController = self.presentingViewController + else { return } + presentedViewController?.view.removeFromSuperview() + originalSuperview?.addSubview(presentingViewController.view) + } + + func transition(using transitionContext: UIViewControllerContextTransitioning) { + prepare(presenting: transitionContext.isPresenting) + transitionWillBegin(presenting: transitionContext.isPresenting) + transition( + presenting: transitionContext.isPresenting, + animated: transitionContext.isAnimated, + interactive: transitionContext.isInteractive, + animations: { [weak self] in + guard let self = self else { return } + self.transition(presenting: transitionContext.isPresenting) + }, completion: { [weak self] _ in + guard let self = self else { return } + let completed = !transitionContext.transitionWasCancelled + self.transitionDidEnd(presenting: transitionContext.isPresenting, completed: completed) + self.finish(presenting: transitionContext.isPresenting, completed: completed) + + // Called last. This causes the transition container to be removed and animationEnded() to be called. + transitionContext.completeTransition(completed) + }) + } + + func transition(presenting: Bool, animated: Bool = true, interactive: Bool = false, animations: @escaping (() -> Void) = {}, completion: @escaping ((Bool) -> Void) = { _ in }) { + if !animated { + animations() + completion(true) + return + } + + let duration = self.duration(presenting: presenting, interactive: interactive) + if interactive { + // IMPORTANT: The non-interactive animation block will not complete if adapted for interactive. The below animation block must be used! + UIView.animate( + withDuration: duration, + delay: duration, // HACK: If zero, the animation briefly flashes in iOS 11. + options: .curveLinear, + animations: animations, + completion: completion + ) + return + } + + UIView.animate( + withDuration: duration, + delay: 0, + usingSpringWithDamping: config.usingSpringWithDamping, + initialSpringVelocity: config.initialSpringVelocity, + options: config.animationOptions, + animations: animations, + completion: completion + ) + } +} + +private extension UIViewControllerContextTransitioning { + + var isPresenting: Bool { + return viewController(forKey: .from)?.presentedViewController === viewController(forKey: .to) + } + + var presentingViewController: UIViewController? { + return viewController(forKey: isPresenting ? .from : .to) + } + + var presentedViewController: UIViewController? { + return viewController(forKey: isPresenting ? .to : .from) + } +} diff --git a/TracMobility/Pods/SideMenu/Pod/Classes/SideMenuInteractionController.swift b/TracMobility/Pods/SideMenu/Pod/Classes/SideMenuInteractionController.swift new file mode 100644 index 0000000..0ec4605 --- /dev/null +++ b/TracMobility/Pods/SideMenu/Pod/Classes/SideMenuInteractionController.swift @@ -0,0 +1,65 @@ +// +// SideMenuInteractiveTransitionController.swift +// SideMenu +// +// Created by Jon Kent on 12/28/18. +// + +import UIKit + +internal final class SideMenuInteractionController: UIPercentDrivenInteractiveTransition { + + enum State { case + update(progress: CGFloat), + finish, + cancel + } + + private(set) var isCancelled: Bool = false + private(set) var isFinished: Bool = false + + init(cancelWhenBackgrounded: Bool = true, completionCurve: UIView.AnimationCurve = .easeIn) { + super.init() + self.completionCurve = completionCurve + + guard cancelWhenBackgrounded else { return } + NotificationCenter.default.addObserver(self, selector: #selector(handleNotification), name: UIApplication.didEnterBackgroundNotification, object: nil) + } + + override func cancel() { + isCancelled = true + super.cancel() + } + + override func finish() { + isFinished = true + super.finish() + } + + override func update(_ percentComplete: CGFloat) { + guard !isCancelled && !isFinished else { return } + super.update(percentComplete) + } + + func handle(state: State) { + switch state { + case .update(let progress): + update(progress) + case .finish: + finish() + case .cancel: + cancel() + } + } +} + +private extension SideMenuInteractionController { + + @objc func handleNotification(notification: NSNotification) { + switch notification.name { + case UIApplication.didEnterBackgroundNotification: + cancel() + default: break + } + } +} diff --git a/TracMobility/Pods/SideMenu/Pod/Classes/SideMenuManager.swift b/TracMobility/Pods/SideMenu/Pod/Classes/SideMenuManager.swift new file mode 100644 index 0000000..d4abe09 --- /dev/null +++ b/TracMobility/Pods/SideMenu/Pod/Classes/SideMenuManager.swift @@ -0,0 +1,229 @@ +// +// SideMenuManager.swift +// +// Created by Jon Kent on 12/6/15. +// Copyright © 2015 Jon Kent. All rights reserved. +// + +import UIKit + +@objcMembers +public class SideMenuManager: NSObject { + + final private class SideMenuPanGestureRecognizer: UIPanGestureRecognizer {} + final private class SideMenuScreenEdgeGestureRecognizer: UIScreenEdgePanGestureRecognizer {} + + @objc public enum PresentDirection: Int { case + left = 1, + right = 0 + + init(leftSide: Bool) { + self.init(rawValue: leftSide ? 1 : 0)! + } + + var edge: UIRectEdge { + switch self { + case .left: return .left + case .right: return .right + } + } + + var name: String { + switch self { + case .left: return "leftMenuNavigationController" + case .right: return "rightMenuNavigationController" + } + } + } + + private var _leftMenu: Protected = Protected(nil) { SideMenuManager.setMenu(fromMenu: $0, toMenu: $1) } + private var _rightMenu: Protected = Protected(nil) { SideMenuManager.setMenu(fromMenu: $0, toMenu: $1) } + + private var switching: Bool = false + + /// Default instance of SideMenuManager. + public static let `default` = SideMenuManager() + + /// Default instance of SideMenuManager (objective-C). + public class var defaultManager: SideMenuManager { + return SideMenuManager.default + } + + /// The left menu. + open var leftMenuNavigationController: SideMenuNavigationController? { + get { + if _leftMenu.value?.isHidden == true { + _leftMenu.value?.leftSide = true + } + return _leftMenu.value + } + set(menu) { _leftMenu.value = menu } + } + + /// The right menu. + open var rightMenuNavigationController: SideMenuNavigationController? { + get { + if _rightMenu.value?.isHidden == true { + _rightMenu.value?.leftSide = false + } + return _rightMenu.value + } + set(menu) { _rightMenu.value = menu } + } + + /** + Adds screen edge gestures for both left and right sides to a view to present a menu. + + - Parameter toView: The view to add gestures to. + + - Returns: The array of screen edge gestures added to `toView`. + */ + @discardableResult public func addScreenEdgePanGesturesToPresent(toView view: UIView) -> [UIScreenEdgePanGestureRecognizer] { + return [ + addScreenEdgePanGesturesToPresent(toView: view, forMenu: .left), + addScreenEdgePanGesturesToPresent(toView: view, forMenu: .right) + ] + } + + /** + Adds screen edge gestures to a view to present a menu. + + - Parameter toView: The view to add gestures to. + - Parameter forMenu: The menu (left or right) you want to add a gesture for. + + - Returns: The screen edge gestures added to `toView`. + */ + @discardableResult public func addScreenEdgePanGesturesToPresent(toView view: UIView, forMenu side: PresentDirection) -> UIScreenEdgePanGestureRecognizer { + if menu(forSide: side) == nil { + let methodName = #function // "addScreenEdgePanGesturesToPresent" + let suggestedMethodName = "addScreenEdgePanGesturesToPresent(toView:forMenu:))" + Print.warning(.screenGestureAdded, arguments: methodName, side.name, suggestedMethodName) + } + return self.addScreenEdgeGesture(to: view, edge: side.edge) + } + + /** + Adds a pan edge gesture to a view to present menus. + + - Parameter toView: The view to add a pan gesture to. + + - Returns: The pan gesture added to `toView`. + */ + @discardableResult public func addPanGestureToPresent(toView view: UIView) -> UIPanGestureRecognizer { + if leftMenuNavigationController ?? rightMenuNavigationController == nil { + Print.warning(.panGestureAdded, arguments: #function, PresentDirection.left.name, PresentDirection.right.name, required: true) + } + + return addPresentPanGesture(to: view) + } +} + +internal extension SideMenuManager { + + func setMenu(_ menu: Menu?, forLeftSide leftSide: Bool) { + switch leftSide { + case true: leftMenuNavigationController = menu + case false: rightMenuNavigationController = menu + } + } + + private class func setMenu(fromMenu: Menu?, toMenu: Menu?) -> Menu? { + if fromMenu?.isHidden == false { + Print.warning(.menuInUse, arguments: PresentDirection.left.name, required: true) + return fromMenu + } + return toMenu + } +} + +private extension SideMenuManager { + + @objc func handlePresentMenuScreenEdge(_ gesture: UIScreenEdgePanGestureRecognizer) { + handleMenuPan(gesture) + } + + @objc func handlePresentMenuPan(_ gesture: UIPanGestureRecognizer) { + handleMenuPan(gesture) + } + + func handleMenuPan(_ gesture: UIPanGestureRecognizer) { + if let activeMenu = activeMenu { + let width = activeMenu.menuWidth + let distance = gesture.xTranslation / width + switch (gesture.state) { + case .changed: + if gesture.canSwitch { + switching = (distance > 0 && !activeMenu.leftSide) || (distance < 0 && activeMenu.leftSide) + if switching { + activeMenu.cancelMenuPan(gesture) + return + } + } + default: + switching = false + } + + } else { + let leftSide: Bool + if let gesture = gesture as? UIScreenEdgePanGestureRecognizer { + leftSide = gesture.edges.contains(.left) + } else { + // not sure which way the user is swiping yet, so do nothing + if gesture.xTranslation == 0 { return } + leftSide = gesture.xTranslation > 0 + } + + guard let menu = menu(forLeftSide: leftSide) else { return } + menu.present(from: topMostViewController, interactively: true) + } + + activeMenu?.handleMenuPan(gesture, true) + } + + var activeMenu: Menu? { + if leftMenuNavigationController?.isHidden == false { return leftMenuNavigationController } + if rightMenuNavigationController?.isHidden == false { return rightMenuNavigationController } + return nil + } + + func menu(forSide: PresentDirection) -> Menu? { + switch forSide { + case .left: return leftMenuNavigationController + case .right: return rightMenuNavigationController + } + } + + func menu(forLeftSide leftSide: Bool) -> Menu? { + return menu(forSide: leftSide ? .left : .right) + } + + func addScreenEdgeGesture(to view: UIView, edge: UIRectEdge) -> UIScreenEdgePanGestureRecognizer { + if let screenEdgeGestureRecognizer = view.gestureRecognizers?.first(where: { $0 is SideMenuScreenEdgeGestureRecognizer }) as? SideMenuScreenEdgeGestureRecognizer, + screenEdgeGestureRecognizer.edges == edge { + screenEdgeGestureRecognizer.remove() + } + return SideMenuScreenEdgeGestureRecognizer(addTo: view, target: self, action: #selector(handlePresentMenuScreenEdge(_:))).with { + $0.edges = edge + } + } + + @discardableResult func addPresentPanGesture(to view: UIView) -> UIPanGestureRecognizer { + if let panGestureRecognizer = view.gestureRecognizers?.first(where: { $0 is SideMenuPanGestureRecognizer }) as? SideMenuPanGestureRecognizer { + return panGestureRecognizer + } + return SideMenuPanGestureRecognizer(addTo: view, target: self, action: #selector(handlePresentMenuPan(_:))) + } + + var topMostViewController: UIViewController? { + return UIApplication.shared.keyWindow?.rootViewController?.topMostViewController + } +} + +extension SideMenuManager: SideMenuNavigationControllerTransitionDelegate { + + internal func sideMenuTransitionDidDismiss(menu: Menu) { + defer { switching = false } + guard switching, let switchToMenu = self.menu(forLeftSide: !menu.leftSide) else { return } + switchToMenu.present(from: topMostViewController, interactively: true) + } +} diff --git a/TracMobility/Pods/SideMenu/Pod/Classes/SideMenuNavigationController.swift b/TracMobility/Pods/SideMenu/Pod/Classes/SideMenuNavigationController.swift new file mode 100644 index 0000000..d88bb8b --- /dev/null +++ b/TracMobility/Pods/SideMenu/Pod/Classes/SideMenuNavigationController.swift @@ -0,0 +1,656 @@ +// +// SideMenuNavigationController.swift +// +// Created by Jon Kent on 1/14/16. +// Copyright © 2016 Jon Kent. All rights reserved. +// + +import UIKit + +@objc public enum SideMenuPushStyle: Int { case + `default`, + popWhenPossible, + preserve, + preserveAndHideBackButton, + replace, + subMenu + + internal var hidesBackButton: Bool { + switch self { + case .preserveAndHideBackButton, .replace: return true + case .default, .popWhenPossible, .preserve, .subMenu: return false + } + } +} + +internal protocol MenuModel { + /// Prevents the same view controller (or a view controller of the same class) from being pushed more than once. Defaults to true. + var allowPushOfSameClassTwice: Bool { get } + /// Forces menus to always animate when appearing or disappearing, regardless of a pushed view controller's animation. + var alwaysAnimate: Bool { get } + /** + The blur effect style of the menu if the menu's root view controller is a UITableViewController or UICollectionViewController. + + - Note: If you want cells in a UITableViewController menu to show vibrancy, make them a subclass of UITableViewVibrantCell. + */ + var blurEffectStyle: UIBlurEffect.Style? { get } + /// Animation curve of the remaining animation when the menu is partially dismissed with gestures. Default is .easeIn. + var completionCurve: UIView.AnimationCurve { get } + /// Automatically dismisses the menu when another view is presented from it. + var dismissOnPresent: Bool { get } + /// Automatically dismisses the menu when another view controller is pushed from it. + var dismissOnPush: Bool { get } + /// Automatically dismisses the menu when the screen is rotated. + var dismissOnRotation: Bool { get } + /// Automatically dismisses the menu when app goes to the background. + var dismissWhenBackgrounded: Bool { get } + /// Enable or disable a swipe gesture that dismisses the menu. Will not be triggered when `presentingViewControllerUserInteractionEnabled` is set to true. Default is true. + var enableSwipeToDismissGesture: Bool { get } + /// Enable or disable a tap gesture that dismisses the menu. Will not be triggered when `presentingViewControllerUserInteractionEnabled` is set to true. Default is true. + var enableTapToDismissGesture: Bool { get } + /** + The push style of the menu. + + There are six modes in MenuPushStyle: + - defaultBehavior: The view controller is pushed onto the stack. + - popWhenPossible: If a view controller already in the stack is of the same class as the pushed view controller, the stack is instead popped back to the existing view controller. This behavior can help users from getting lost in a deep navigation stack. + - preserve: If a view controller already in the stack is of the same class as the pushed view controller, the existing view controller is pushed to the end of the stack. This behavior is similar to a UITabBarController. + - preserveAndHideBackButton: Same as .preserve and back buttons are automatically hidden. + - replace: Any existing view controllers are released from the stack and replaced with the pushed view controller. Back buttons are automatically hidden. This behavior is ideal if view controllers require a lot of memory or their state doesn't need to be preserved.. + - subMenu: Unlike all other behaviors that push using the menu's presentingViewController, this behavior pushes view controllers within the menu. Use this behavior if you want to display a sub menu. + */ + var pushStyle: SideMenuPushStyle { get } +} + +@objc public protocol SideMenuNavigationControllerDelegate { + @objc optional func sideMenuWillAppear(menu: SideMenuNavigationController, animated: Bool) + @objc optional func sideMenuDidAppear(menu: SideMenuNavigationController, animated: Bool) + @objc optional func sideMenuWillDisappear(menu: SideMenuNavigationController, animated: Bool) + @objc optional func sideMenuDidDisappear(menu: SideMenuNavigationController, animated: Bool) +} + +internal protocol SideMenuNavigationControllerTransitionDelegate: class { + func sideMenuTransitionDidDismiss(menu: Menu) +} + +public struct SideMenuSettings: Model, InitializableStruct { + public var allowPushOfSameClassTwice: Bool = true + public var alwaysAnimate: Bool = true + public var animationOptions: UIView.AnimationOptions = .curveEaseInOut + public var blurEffectStyle: UIBlurEffect.Style? = nil + public var completeGestureDuration: Double = 0.35 + public var completionCurve: UIView.AnimationCurve = .easeIn + public var dismissDuration: Double = 0.35 + public var dismissOnPresent: Bool = true + public var dismissOnPush: Bool = true + public var dismissOnRotation: Bool = true + public var dismissWhenBackgrounded: Bool = true + public var enableSwipeToDismissGesture: Bool = true + public var enableTapToDismissGesture: Bool = true + public var initialSpringVelocity: CGFloat = 1 + public var menuWidth: CGFloat = { + let appScreenRect = UIApplication.shared.keyWindow?.bounds ?? UIWindow().bounds + let minimumSize = min(appScreenRect.width, appScreenRect.height) + return min(round(minimumSize * 0.75), 240) + }() + public var presentingViewControllerUserInteractionEnabled: Bool = false + public var presentingViewControllerUseSnapshot: Bool = false + public var presentDuration: Double = 0.35 + public var presentationStyle: SideMenuPresentationStyle = .viewSlideOut + public var pushStyle: SideMenuPushStyle = .default + public var statusBarEndAlpha: CGFloat = 0 + public var usingSpringWithDamping: CGFloat = 1 + + public init() {} +} + +internal typealias Menu = SideMenuNavigationController +typealias Model = MenuModel & PresentationModel & AnimationModel + +@objcMembers +open class SideMenuNavigationController: UINavigationController { + + private lazy var _leftSide = Protected(false) { [weak self] oldValue, newValue in + guard self?.isHidden != false else { + Print.warning(.property, arguments: .leftSide, required: true) + return oldValue + } + return newValue + } + + private weak var _sideMenuManager: SideMenuManager? + private weak var foundViewController: UIViewController? + private var originalBackgroundColor: UIColor? + private var rotating: Bool = false + private var transitionController: SideMenuTransitionController? + private var transitionInteractive: Bool = false + + /// Delegate for receiving appear and disappear related events. If `nil` the visible view controller that displays a `SideMenuNavigationController` automatically receives these events. + public weak var sideMenuDelegate: SideMenuNavigationControllerDelegate? + + /// The swipe to dismiss gesture. + open private(set) weak var swipeToDismissGesture: UIPanGestureRecognizer? = nil + /// The tap to dismiss gesture. + open private(set) weak var tapToDismissGesture: UITapGestureRecognizer? = nil + + open var sideMenuManager: SideMenuManager { + get { return _sideMenuManager ?? SideMenuManager.default } + set { + newValue.setMenu(self, forLeftSide: leftSide) + + if let sideMenuManager = _sideMenuManager, sideMenuManager !== newValue { + let side = SideMenuManager.PresentDirection(leftSide: leftSide) + Print.warning(.menuAlreadyAssigned, arguments: String(describing: self.self), side.name, String(describing: newValue)) + } + _sideMenuManager = newValue + } + } + + /// The menu settings. + open var settings = SideMenuSettings() { + didSet { + setupBlur() + if !enableSwipeToDismissGesture { + swipeToDismissGesture?.remove() + } + if !enableTapToDismissGesture { + tapToDismissGesture?.remove() + } + } + } + + public override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) { + super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil) + setup() + } + + public init(rootViewController: UIViewController, settings: SideMenuSettings = SideMenuSettings()) { + self.settings = settings + super.init(rootViewController: rootViewController) + setup() + } + + required public init?(coder aDecoder: NSCoder) { + super.init(coder: aDecoder) + setup() + } + + override open func awakeFromNib() { + super.awakeFromNib() + sideMenuManager.setMenu(self, forLeftSide: leftSide) + } + + override open func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + + if topViewController == nil { + Print.warning(.emptyMenu) + } + + // Dismiss keyboard to prevent weird keyboard animations from occurring during transition + presentingViewController?.view.endEditing(true) + + foundViewController = nil + activeDelegate?.sideMenuWillAppear?(menu: self, animated: animated) + } + + override open func viewDidAppear(_ animated: Bool) { + super.viewDidAppear(animated) + + // We had presented a view before, so lets dismiss ourselves as already acted upon + if view.isHidden { + dismiss(animated: false, completion: { [weak self] in + self?.view.isHidden = false + }) + } else { + activeDelegate?.sideMenuDidAppear?(menu: self, animated: animated) + } + } + + override open func viewWillDisappear(_ animated: Bool) { + super.viewWillDisappear(animated) + + defer { activeDelegate?.sideMenuWillDisappear?(menu: self, animated: animated) } + + guard !isBeingDismissed else { return } + + // When presenting a view controller from the menu, the menu view gets moved into another transition view above our transition container + // which can break the visual layout we had before. So, we move the menu view back to its original transition view to preserve it. + if let presentingView = presentingViewController?.view, let containerView = presentingView.superview { + containerView.addSubview(view) + } + + if dismissOnPresent { + // We're presenting a view controller from the menu, so we need to hide the menu so it isn't showing when the presented view is dismissed. + transitionController?.transition(presenting: false, animated: animated, alongsideTransition: { [weak self] in + guard let self = self else { return } + self.activeDelegate?.sideMenuWillDisappear?(menu: self, animated: animated) + }, complete: false, completion: { [weak self] _ in + guard let self = self else { return } + self.activeDelegate?.sideMenuDidDisappear?(menu: self, animated: animated) + self.view.isHidden = true + }) + } + } + + override open func viewDidDisappear(_ animated: Bool) { + super.viewDidDisappear(animated) + + // Work-around: if the menu is dismissed without animation the transition logic is never called to restore the + // the view hierarchy leaving the screen black/empty. This is because the transition moves views within a container + // view, but dismissing without animation removes the container view before the original hierarchy is restored. + // This check corrects that. + if isBeingDismissed { + transitionController?.transition(presenting: false, animated: false) + } + + // Clear selection on UITableViewControllers when reappearing using custom transitions + if let tableViewController = topViewController as? UITableViewController, + let tableView = tableViewController.tableView, + let indexPaths = tableView.indexPathsForSelectedRows, + tableViewController.clearsSelectionOnViewWillAppear { + indexPaths.forEach { tableView.deselectRow(at: $0, animated: false) } + } + + activeDelegate?.sideMenuDidDisappear?(menu: self, animated: animated) + + if isBeingDismissed { + transitionController = nil + } else if dismissOnPresent { + view.isHidden = true + } + } + + override open func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) { + super.viewWillTransition(to: size, with: coordinator) + + // Don't bother resizing if the view isn't visible + guard let transitionController = transitionController, !view.isHidden else { return } + + rotating = true + + let dismiss = self.presentingViewControllerUseSnapshot || self.dismissOnRotation + coordinator.animate(alongsideTransition: { _ in + if dismiss { + transitionController.transition(presenting: false, animated: false, complete: false) + } else { + transitionController.layout() + } + }) { [weak self] _ in + guard let self = self else { return } + if dismiss { + self.dismissMenu(animated: false) + } + self.rotating = false + } + } + + open override func viewWillLayoutSubviews() { + super.viewWillLayoutSubviews() + transitionController?.layout() + } + + override open func pushViewController(_ viewController: UIViewController, animated: Bool) { + guard viewControllers.count > 0 else { + // NOTE: pushViewController is called by init(rootViewController: UIViewController) + // so we must perform the normal super method in this case + return super.pushViewController(viewController, animated: animated) + } + + var alongsideTransition: (() -> Void)? = nil + if dismissOnPush { + alongsideTransition = { [weak self] in + guard let self = self else { return } + self.dismissAnimation(animated: animated || self.alwaysAnimate) + } + } + + let pushed = SideMenuPushCoordinator(config: + .init( + allowPushOfSameClassTwice: allowPushOfSameClassTwice, + alongsideTransition: alongsideTransition, + animated: animated, + fromViewController: self, + pushStyle: pushStyle, + toViewController: viewController + ) + ).start() + + if !pushed { + super.pushViewController(viewController, animated: animated) + } + } + + override open var transitioningDelegate: UIViewControllerTransitioningDelegate? { + get { + guard transitionController == nil else { return transitionController } + transitionController = SideMenuTransitionController(leftSide: leftSide, config: settings) + transitionController?.delegate = self + transitionController?.interactive = transitionInteractive + transitionInteractive = false + return transitionController + } + set { Print.warning(.transitioningDelegate, required: true) } + } +} + +// Interface +extension SideMenuNavigationController: Model { + + @IBInspectable open var allowPushOfSameClassTwice: Bool { + get { return settings.allowPushOfSameClassTwice } + set { settings.allowPushOfSameClassTwice = newValue } + } + + @IBInspectable open var alwaysAnimate: Bool { + get { return settings.alwaysAnimate } + set { settings.alwaysAnimate = newValue } + } + + @IBInspectable open var animationOptions: UIView.AnimationOptions { + get { return settings.animationOptions } + set { settings.animationOptions = newValue } + } + + open var blurEffectStyle: UIBlurEffect.Style? { + get { return settings.blurEffectStyle } + set { settings.blurEffectStyle = newValue } + } + + @IBInspectable open var completeGestureDuration: Double { + get { return settings.completeGestureDuration } + set { settings.completeGestureDuration = newValue } + } + + @IBInspectable open var completionCurve: UIView.AnimationCurve { + get { return settings.completionCurve } + set { settings.completionCurve = newValue } + } + + @IBInspectable open var dismissDuration: Double { + get { return settings.dismissDuration } + set { settings.dismissDuration = newValue } + } + + @IBInspectable open var dismissOnPresent: Bool { + get { return settings.dismissOnPresent } + set { settings.dismissOnPresent = newValue } + } + + @IBInspectable open var dismissOnPush: Bool { + get { return settings.dismissOnPush } + set { settings.dismissOnPush = newValue } + } + + @IBInspectable open var dismissOnRotation: Bool { + get { return settings.dismissOnRotation } + set { settings.dismissOnRotation = newValue } + } + + @IBInspectable open var dismissWhenBackgrounded: Bool { + get { return settings.dismissWhenBackgrounded } + set { settings.dismissWhenBackgrounded = newValue } + } + + @IBInspectable open var enableSwipeToDismissGesture: Bool { + get { return settings.enableSwipeToDismissGesture } + set { settings.enableSwipeToDismissGesture = newValue } + } + + @IBInspectable open var enableTapToDismissGesture: Bool { + get { return settings.enableTapToDismissGesture } + set { settings.enableTapToDismissGesture = newValue } + } + + @IBInspectable open var initialSpringVelocity: CGFloat { + get { return settings.initialSpringVelocity } + set { settings.initialSpringVelocity = newValue } + } + + /// Whether the menu appears on the right or left side of the screen. Right is the default. This property cannot be changed after the menu has loaded. + @IBInspectable open var leftSide: Bool { + get { return _leftSide.value } + set { _leftSide.value = newValue } + } + + /// Indicates if the menu is anywhere in the view hierarchy, even if covered by another view controller. + open override var isHidden: Bool { + return super.isHidden + } + + @IBInspectable open var menuWidth: CGFloat { + get { return settings.menuWidth } + set { settings.menuWidth = newValue } + } + + @IBInspectable open var presentingViewControllerUserInteractionEnabled: Bool { + get { return settings.presentingViewControllerUserInteractionEnabled } + set { settings.presentingViewControllerUserInteractionEnabled = newValue } + } + + @IBInspectable open var presentingViewControllerUseSnapshot: Bool { + get { return settings.presentingViewControllerUseSnapshot } + set { settings.presentingViewControllerUseSnapshot = newValue } + } + + @IBInspectable open var presentDuration: Double { + get { return settings.presentDuration } + set { settings.presentDuration = newValue } + } + + open var presentationStyle: SideMenuPresentationStyle { + get { return settings.presentationStyle } + set { settings.presentationStyle = newValue } + } + + @IBInspectable open var pushStyle: SideMenuPushStyle { + get { return settings.pushStyle } + set { settings.pushStyle = newValue } + } + + @IBInspectable open var statusBarEndAlpha: CGFloat { + get { return settings.statusBarEndAlpha } + set { settings.statusBarEndAlpha = newValue } + } + + @IBInspectable open var usingSpringWithDamping: CGFloat { + get { return settings.usingSpringWithDamping } + set { settings.usingSpringWithDamping = newValue } + } +} + +extension SideMenuNavigationController: SideMenuTransitionControllerDelegate { + + func sideMenuTransitionController(_ transitionController: SideMenuTransitionController, didDismiss viewController: UIViewController) { + sideMenuManager.sideMenuTransitionDidDismiss(menu: self) + } + + func sideMenuTransitionController(_ transitionController: SideMenuTransitionController, didPresent viewController: UIViewController) { + swipeToDismissGesture?.remove() + swipeToDismissGesture = addSwipeToDismissGesture(to: view.superview) + tapToDismissGesture = addTapToDismissGesture(to: view.superview) + } +} + +internal extension SideMenuNavigationController { + + func handleMenuPan(_ gesture: UIPanGestureRecognizer, _ presenting: Bool) { + let width = menuWidth + let distance = gesture.xTranslation / width + let progress = max(min(distance * factor(presenting), 1), 0) + switch (gesture.state) { + case .began: + if !presenting { + dismissMenu(interactively: true) + } + fallthrough + case .changed: + transitionController?.handle(state: .update(progress: progress)) + case .ended: + let velocity = gesture.xVelocity * factor(presenting) + let finished = velocity >= 100 || velocity >= -50 && abs(progress) >= 0.5 + transitionController?.handle(state: finished ? .finish : .cancel) + default: + transitionController?.handle(state: .cancel) + } + } + + func cancelMenuPan(_ gesture: UIPanGestureRecognizer) { + transitionController?.handle(state: .cancel) + } + + func dismissMenu(animated flag: Bool = true, interactively: Bool = false, completion: (() -> Void)? = nil) { + guard !isHidden else { return } + transitionController?.interactive = interactively + dismiss(animated: flag, completion: completion) + } + + // Note: although this method is syntactically reversed it allows the interactive property to scoped privately + func present(from viewController: UIViewController?, interactively: Bool, completion: (() -> Void)? = nil) { + guard let viewController = viewController else { return } + transitionInteractive = interactively + viewController.present(self, animated: true, completion: completion) + } +} + +private extension SideMenuNavigationController { + + weak var activeDelegate: SideMenuNavigationControllerDelegate? { + guard !view.isHidden else { return nil } + if let sideMenuDelegate = sideMenuDelegate { return sideMenuDelegate } + return findViewController as? SideMenuNavigationControllerDelegate + } + + var findViewController: UIViewController? { + foundViewController = foundViewController ?? presentingViewController?.activeViewController + return foundViewController + } + + func dismissAnimation(animated: Bool) { + transitionController?.transition(presenting: false, animated: animated, alongsideTransition: { [weak self] in + guard let self = self else { return } + self.activeDelegate?.sideMenuWillDisappear?(menu: self, animated: animated) + }, completion: { [weak self] _ in + guard let self = self else { return } + self.activeDelegate?.sideMenuDidDisappear?(menu: self, animated: animated) + self.dismiss(animated: false, completion: nil) + self.foundViewController = nil + }) + } + + func setup() { + modalPresentationStyle = .overFullScreen + + setupBlur() + if #available(iOS 13.0, *) {} else { + registerForNotifications() + } + } + + func setupBlur() { + removeBlur() + + guard let blurEffectStyle = blurEffectStyle, + let view = topViewController?.view, + !UIAccessibility.isReduceTransparencyEnabled else { + return + } + + originalBackgroundColor = originalBackgroundColor ?? view.backgroundColor + + let blurEffect = UIBlurEffect(style: blurEffectStyle) + let blurView = UIVisualEffectView(effect: blurEffect) + view.backgroundColor = UIColor.clear + if let tableViewController = topViewController as? UITableViewController { + tableViewController.tableView.backgroundView = blurView + tableViewController.tableView.separatorEffect = UIVibrancyEffect(blurEffect: blurEffect) + tableViewController.tableView.reloadData() + } else { + blurView.autoresizingMask = [.flexibleHeight, .flexibleWidth] + blurView.frame = view.bounds + view.insertSubview(blurView, at: 0) + } + } + + func removeBlur() { + guard let originalBackgroundColor = originalBackgroundColor, + let view = topViewController?.view else { + return + } + + self.originalBackgroundColor = nil + view.backgroundColor = originalBackgroundColor + + if let tableViewController = topViewController as? UITableViewController { + tableViewController.tableView.backgroundView = nil + tableViewController.tableView.separatorEffect = nil + tableViewController.tableView.reloadData() + } else if let blurView = view.subviews.first as? UIVisualEffectView { + blurView.removeFromSuperview() + } + } + + @available(iOS, deprecated: 13.0) + func registerForNotifications() { + NotificationCenter.default.removeObserver(self) + + [UIApplication.willChangeStatusBarFrameNotification, + UIApplication.didEnterBackgroundNotification].forEach { + NotificationCenter.default.addObserver(self, selector: #selector(handleNotification), name: $0, object: nil) + } + } + + @available(iOS, deprecated: 13.0) + @objc func handleNotification(notification: NSNotification) { + guard isHidden else { return } + + switch notification.name { + case UIApplication.willChangeStatusBarFrameNotification: + // Dismiss for in-call status bar changes but not rotation + if !rotating { + dismissMenu() + } + case UIApplication.didEnterBackgroundNotification: + if dismissWhenBackgrounded { + dismissMenu() + } + default: break + } + } + + @discardableResult func addSwipeToDismissGesture(to view: UIView?) -> UIPanGestureRecognizer? { + guard enableSwipeToDismissGesture else { return nil } + return UIPanGestureRecognizer(addTo: view, target: self, action: #selector(handleDismissMenuPan(_:)))?.with { + $0.cancelsTouchesInView = false + } + } + + @discardableResult func addTapToDismissGesture(to view: UIView?) -> UITapGestureRecognizer? { + guard enableTapToDismissGesture else { return nil } + return UITapGestureRecognizer(addTo: view, target: self, action: #selector(handleDismissMenuTap(_:)))?.with { + $0.cancelsTouchesInView = false + } + } + + @objc func handleDismissMenuTap(_ tap: UITapGestureRecognizer) { + let hitTest = view.window?.hitTest(tap.location(in: view.superview), with: nil) + guard hitTest == view.superview else { return } + dismissMenu() + } + + @objc func handleDismissMenuPan(_ gesture: UIPanGestureRecognizer) { + handleMenuPan(gesture, false) + } + + func factor(_ presenting: Bool) -> CGFloat { + return presenting ? presentFactor : hideFactor + } + + var presentFactor: CGFloat { + return leftSide ? 1 : -1 + } + + var hideFactor: CGFloat { + return -presentFactor + } +} diff --git a/TracMobility/Pods/SideMenu/Pod/Classes/SideMenuPresentationController.swift b/TracMobility/Pods/SideMenu/Pod/Classes/SideMenuPresentationController.swift new file mode 100644 index 0000000..5fc8a87 --- /dev/null +++ b/TracMobility/Pods/SideMenu/Pod/Classes/SideMenuPresentationController.swift @@ -0,0 +1,316 @@ +// +// BasePresentationController.swift +// SideMenu +// +// Created by Jon Kent on 10/20/18. +// + +import UIKit + +internal protocol PresentationModel { + /// Draws `presentStyle.backgroundColor` behind the status bar. Default is 1. + var statusBarEndAlpha: CGFloat { get } + /// Enable or disable interaction with the presenting view controller while the menu is displayed. Enabling may make it difficult to dismiss the menu or cause exceptions if the user tries to present and already presented menu. `presentingViewControllerUseSnapshot` must also set to false. Default is false. + var presentingViewControllerUserInteractionEnabled: Bool { get } + /// Use a snapshot for the presenting vierw controller while the menu is displayed. Useful when layout changes occur during transitions. Not recommended for apps that support rotation. Default is false. + var presentingViewControllerUseSnapshot: Bool { get } + /// The presentation style of the menu. + var presentationStyle: SideMenuPresentationStyle { get } + /// Width of the menu when presented on screen, showing the existing view controller in the remaining space. Default is zero. + var menuWidth: CGFloat { get } +} + +internal protocol SideMenuPresentationControllerDelegate: class { + func sideMenuPresentationControllerDidTap(_ presentationController: SideMenuPresentationController) + func sideMenuPresentationController(_ presentationController: SideMenuPresentationController, didPanWith gesture: UIPanGestureRecognizer) +} + +internal final class SideMenuPresentationController { + + private let config: PresentationModel + private weak var containerView: UIView? + private var interactivePopGestureRecognizerEnabled: Bool? + private var clipsToBounds: Bool? + private let leftSide: Bool + private weak var presentedViewController: UIViewController? + private weak var presentingViewController: UIViewController? + + private lazy var snapshotView: UIView? = { + guard config.presentingViewControllerUseSnapshot, + let view = presentingViewController?.view.snapshotView(afterScreenUpdates: true) else { + return nil + } + + view.autoresizingMask = [.flexibleHeight, .flexibleWidth] + return view + }() + + private lazy var statusBarView: UIView? = { + guard config.statusBarEndAlpha > .leastNonzeroMagnitude else { return nil } + + return UIView { + $0.backgroundColor = config.presentationStyle.backgroundColor + $0.autoresizingMask = [.flexibleHeight, .flexibleWidth] + $0.isUserInteractionEnabled = false + } + }() + + required init(config: PresentationModel, leftSide: Bool, presentedViewController: UIViewController, presentingViewController: UIViewController, containerView: UIView) { + self.config = config + self.containerView = containerView + self.leftSide = leftSide + self.presentedViewController = presentedViewController + self.presentingViewController = presentingViewController + } + + deinit { + guard presentedViewController?.isHidden == false else { return } + + // Presentations must be reversed to preserve user experience + dismissalTransitionWillBegin() + dismissalTransition() + dismissalTransitionDidEnd(true) + } + + func containerViewWillLayoutSubviews() { + guard let containerView = containerView, + let presentedViewController = presentedViewController, + let presentingViewController = presentingViewController + else { return } + + presentedViewController.view.untransform { + presentedViewController.view.frame = frameOfPresentedViewInContainerView + } + presentingViewController.view.untransform { + presentingViewController.view.frame = frameOfPresentingViewInContainerView + snapshotView?.frame = presentingViewController.view.bounds + } + + guard let statusBarView = statusBarView else { return } + + var statusBarFrame: CGRect = self.statusBarFrame + statusBarFrame.size.height -= containerView.frame.minY + statusBarView.frame = statusBarFrame + } + + func presentationTransitionWillBegin() { + guard let containerView = containerView, + let presentedViewController = presentedViewController, + let presentingViewController = presentingViewController + else { return } + + if let snapshotView = snapshotView { + presentingViewController.view.addSubview(snapshotView) + } + + presentingViewController.view.isUserInteractionEnabled = config.presentingViewControllerUserInteractionEnabled + containerView.backgroundColor = config.presentationStyle.backgroundColor + + layerViews() + + if let statusBarView = statusBarView { + containerView.addSubview(statusBarView) + } + + dismissalTransition() + config.presentationStyle.presentationTransitionWillBegin(to: presentedViewController, from: presentingViewController) + } + + func presentationTransition() { + guard let presentedViewController = presentedViewController, + let presentingViewController = presentingViewController + else { return } + + transition( + to: presentedViewController, + from: presentingViewController, + alpha: config.presentationStyle.presentingEndAlpha, + statusBarAlpha: config.statusBarEndAlpha, + scale: config.presentationStyle.presentingScaleFactor, + translate: config.presentationStyle.presentingTranslateFactor + ) + + config.presentationStyle.presentationTransition(to: presentedViewController, from: presentingViewController) + } + + func presentationTransitionDidEnd(_ completed: Bool) { + guard completed else { + snapshotView?.removeFromSuperview() + dismissalTransitionDidEnd(!completed) + return + } + + guard let presentedViewController = presentedViewController, + let presentingViewController = presentingViewController + else { return } + + addParallax(to: presentingViewController.view) + + if let topNavigationController = presentingViewController as? UINavigationController { + interactivePopGestureRecognizerEnabled = interactivePopGestureRecognizerEnabled ?? topNavigationController.interactivePopGestureRecognizer?.isEnabled + topNavigationController.interactivePopGestureRecognizer?.isEnabled = false + } + + containerViewWillLayoutSubviews() + config.presentationStyle.presentationTransitionDidEnd(to: presentedViewController, from: presentingViewController, completed) + } + + func dismissalTransitionWillBegin() { + snapshotView?.removeFromSuperview() + presentationTransition() + + guard let presentedViewController = presentedViewController, + let presentingViewController = presentingViewController + else { return } + + config.presentationStyle.dismissalTransitionWillBegin(to: presentedViewController, from: presentingViewController) + } + + func dismissalTransition() { + guard let presentedViewController = presentedViewController, + let presentingViewController = presentingViewController + else { return } + + transition( + to: presentingViewController, + from: presentedViewController, + alpha: config.presentationStyle.menuStartAlpha, + statusBarAlpha: 0, + scale: config.presentationStyle.menuScaleFactor, + translate: config.presentationStyle.menuTranslateFactor + ) + + config.presentationStyle.dismissalTransition(to: presentedViewController, from: presentingViewController) + } + + func dismissalTransitionDidEnd(_ completed: Bool) { + guard completed else { + if let snapshotView = snapshotView, let presentingViewController = presentingViewController { + presentingViewController.view.addSubview(snapshotView) + } + presentationTransitionDidEnd(!completed) + return + } + + guard let presentedViewController = presentedViewController, + let presentingViewController = presentingViewController + else { return } + + statusBarView?.removeFromSuperview() + removeStyles(from: presentingViewController.containerViewController.view) + + if let interactivePopGestureRecognizerEnabled = interactivePopGestureRecognizerEnabled, + let topNavigationController = presentingViewController as? UINavigationController { + topNavigationController.interactivePopGestureRecognizer?.isEnabled = interactivePopGestureRecognizerEnabled + } + + presentingViewController.view.isUserInteractionEnabled = true + config.presentationStyle.dismissalTransitionDidEnd(to: presentedViewController, from: presentingViewController, completed) + } +} + +private extension SideMenuPresentationController { + + var statusBarFrame: CGRect { + if #available(iOS 13.0, *) { + return containerView?.window?.windowScene?.statusBarManager?.statusBarFrame ?? .zero + } else { + return UIApplication.shared.statusBarFrame + } + } + + var frameOfPresentedViewInContainerView: CGRect { + guard let containerView = containerView else { return .zero } + var rect = containerView.bounds + rect.origin.x = leftSide ? 0 : rect.width - config.menuWidth + rect.size.width = config.menuWidth + return rect + } + + var frameOfPresentingViewInContainerView: CGRect { + guard let containerView = containerView else { return .zero } + var rect = containerView.frame + if containerView.superview != nil, containerView.frame.minY > .ulpOfOne { + let statusBarOffset = statusBarFrame.height - rect.minY + rect.origin.y = statusBarOffset + rect.size.height -= statusBarOffset + } + return rect + } + + func transition(to: UIViewController, from: UIViewController, alpha: CGFloat, statusBarAlpha: CGFloat, scale: CGFloat, translate: CGFloat) { + containerViewWillLayoutSubviews() + + to.view.transform = .identity + to.view.alpha = 1 + + let x = (leftSide ? 1 : -1) * config.menuWidth * translate + from.view.alpha = alpha + from.view.transform = CGAffineTransform + .identity + .translatedBy(x: x, y: 0) + .scaledBy(x: scale, y: scale) + + statusBarView?.alpha = statusBarAlpha + } + + func layerViews() { + guard let presentedViewController = presentedViewController, + let presentingViewController = presentingViewController + else { return } + + statusBarView?.layer.zPosition = 2 + + if config.presentationStyle.menuOnTop { + addShadow(to: presentedViewController.view) + presentedViewController.view.layer.zPosition = 1 + } else { + addShadow(to: presentingViewController.view) + presentedViewController.view.layer.zPosition = -1 + } + } + + func addShadow(to view: UIView) { + view.layer.shadowColor = config.presentationStyle.onTopShadowColor.cgColor + view.layer.shadowRadius = config.presentationStyle.onTopShadowRadius + view.layer.shadowOpacity = config.presentationStyle.onTopShadowOpacity + view.layer.shadowOffset = config.presentationStyle.onTopShadowOffset + clipsToBounds = clipsToBounds ?? view.clipsToBounds + view.clipsToBounds = false + } + + func addParallax(to view: UIView) { + var effects: [UIInterpolatingMotionEffect] = [] + + let x = config.presentationStyle.presentingParallaxStrength.width + if x > 0 { + let horizontal = UIInterpolatingMotionEffect(keyPath: "center.x", type: .tiltAlongHorizontalAxis) + horizontal.minimumRelativeValue = -x + horizontal.maximumRelativeValue = x + effects.append(horizontal) + } + + let y = config.presentationStyle.presentingParallaxStrength.height + if y > 0 { + let vertical = UIInterpolatingMotionEffect(keyPath: "center.y", type: .tiltAlongVerticalAxis) + vertical.minimumRelativeValue = -y + vertical.maximumRelativeValue = y + effects.append(vertical) + } + + if effects.count > 0 { + let group = UIMotionEffectGroup() + group.motionEffects = effects + view.motionEffects.removeAll() + view.addMotionEffect(group) + } + } + + func removeStyles(from view: UIView) { + view.motionEffects.removeAll() + view.layer.shadowOpacity = 0 + view.layer.shadowOpacity = 0 + view.clipsToBounds = clipsToBounds ?? true + clipsToBounds = false + } +} diff --git a/TracMobility/Pods/SideMenu/Pod/Classes/SideMenuPresentationStyle.swift b/TracMobility/Pods/SideMenu/Pod/Classes/SideMenuPresentationStyle.swift new file mode 100644 index 0000000..7accf60 --- /dev/null +++ b/TracMobility/Pods/SideMenu/Pod/Classes/SideMenuPresentationStyle.swift @@ -0,0 +1,112 @@ +// +// SideMenuPresentStyle.swift +// SideMenu +// +// Created by Jon Kent on 7/2/19. +// + +import UIKit + +@objcMembers +open class SideMenuPresentationStyle: InitializableClass { + /// Background color behind the views and status bar color + open var backgroundColor: UIColor = .black + /// The starting alpha value of the menu before it appears + open var menuStartAlpha: CGFloat = 1 + /// Whether or not the menu is on top. If false, the presenting view is on top. Shadows are applied to the view on top. + open var menuOnTop: Bool = false + /// The amount the menu is translated along the x-axis. Zero is stationary, negative values are off-screen, positive values are on screen. + open var menuTranslateFactor: CGFloat = 0 + /// The amount the menu is scaled. Less than one shrinks the view, larger than one grows the view. + open var menuScaleFactor: CGFloat = 1 + /// The color of the shadow applied to the top most view. + open var onTopShadowColor: UIColor = .black + /// The radius of the shadow applied to the top most view. + open var onTopShadowRadius: CGFloat = 5 + /// The opacity of the shadow applied to the top most view. + open var onTopShadowOpacity: Float = 0 + /// The offset of the shadow applied to the top most view. + open var onTopShadowOffset: CGSize = .zero + /// The ending alpha of the presenting view when the menu is fully displayed. + open var presentingEndAlpha: CGFloat = 1 + /// The amount the presenting view is translated along the x-axis. Zero is stationary, negative values are off-screen, positive values are on screen. + open var presentingTranslateFactor: CGFloat = 0 + /// The amount the presenting view is scaled. Less than one shrinks the view, larger than one grows the view. + open var presentingScaleFactor: CGFloat = 1 + /// The strength of the parallax effect on the presenting view once the menu is displayed. + open var presentingParallaxStrength: CGSize = .zero + + required public init() {} + + /// This method is called just before the presentation transition begins. Use this to setup any animations. The super method does not need to be called. + open func presentationTransitionWillBegin(to presentedViewController: UIViewController, from presentingViewController: UIViewController) {} + /// This method is called during the presentation animation. Use this to animate anything alongside the menu animation. The super method does not need to be called. + open func presentationTransition(to presentedViewController: UIViewController, from presentingViewController: UIViewController) {} + /// This method is called when the presentation transition ends. Use this to finish any animations. The super method does not need to be called. + open func presentationTransitionDidEnd(to presentedViewController: UIViewController, from presentingViewController: UIViewController, _ completed: Bool) {} + /// This method is called just before the dismissal transition begins. Use this to setup any animations. The super method does not need to be called. + open func dismissalTransitionWillBegin(to presentedViewController: UIViewController, from presentingViewController: UIViewController) {} + /// This method is called during the dismissal animation. Use this to animate anything alongside the menu animation. The super method does not need to be called. + open func dismissalTransition(to presentedViewController: UIViewController, from presentingViewController: UIViewController) {} + /// This method is called when the dismissal transition ends. Use this to finish any animations. The super method does not need to be called. + open func dismissalTransitionDidEnd(to presentedViewController: UIViewController, from presentingViewController: UIViewController, _ completed: Bool) {} +} + +public extension SideMenuPresentationStyle { + /// Menu slides in over the existing view. + static var menuSlideIn: SideMenuPresentationStyle { + return SideMenuPresentationStyle { + $0.menuOnTop = true + $0.menuTranslateFactor = -1 + } + } + /// The existing view slides out to reveal the menu underneath. + static var viewSlideOut: SideMenuPresentationStyle { + return SideMenuPresentationStyle { + $0.presentingTranslateFactor = 1 + } + } + /// The existing view slides out while the menu slides in. + static var viewSlideOutMenuIn: SideMenuPresentationStyle { + return SideMenuPresentationStyle { + $0.menuTranslateFactor = -1 + $0.presentingTranslateFactor = 1 + } + } + /// The menu dissolves in over the existing view. + static var menuDissolveIn: SideMenuPresentationStyle { + return SideMenuPresentationStyle { + $0.menuStartAlpha = 0 + $0.menuOnTop = true + } + } + /// The existing view slides out while the menu partially slides in. + static var viewSlideOutMenuPartialIn: SideMenuPresentationStyle { + return SideMenuPresentationStyle { + $0.menuTranslateFactor = -0.5 + $0.presentingTranslateFactor = 1 + } + } + /// The existing view slides out while the menu slides out from under it. + static var viewSlideOutMenuOut: SideMenuPresentationStyle { + return SideMenuPresentationStyle { + $0.menuTranslateFactor = 1 + $0.presentingTranslateFactor = 1 + } + } + /// The existing view slides out while the menu partially slides out from under it. + static var viewSlideOutMenuPartialOut: SideMenuPresentationStyle { + return SideMenuPresentationStyle { + $0.menuTranslateFactor = 0.5 + $0.presentingTranslateFactor = 1 + } + } + /// The existing view slides out and shrinks to reveal the menu underneath. + static var viewSlideOutMenuZoom: SideMenuPresentationStyle { + return SideMenuPresentationStyle { + $0.presentingTranslateFactor = 1 + $0.menuScaleFactor = 0.95 + $0.menuOnTop = true + } + } +} diff --git a/TracMobility/Pods/SideMenu/Pod/Classes/SideMenuPushCoordinator.swift b/TracMobility/Pods/SideMenu/Pod/Classes/SideMenuPushCoordinator.swift new file mode 100644 index 0000000..33e8681 --- /dev/null +++ b/TracMobility/Pods/SideMenu/Pod/Classes/SideMenuPushCoordinator.swift @@ -0,0 +1,107 @@ +// +// PushCoordinator.swift +// SideMenu +// +// Created by Jon Kent on 9/4/19. +// + +import UIKit + +protocol CoordinatorModel { + var animated: Bool { get } + var fromViewController: UIViewController { get } + var toViewController: UIViewController { get } +} + +protocol Coordinator { + associatedtype Model: CoordinatorModel + + init(config: Model) + @discardableResult func start() -> Bool +} + +internal final class SideMenuPushCoordinator: Coordinator { + + struct Model: CoordinatorModel { + var allowPushOfSameClassTwice: Bool + var alongsideTransition: (() -> Void)? + var animated: Bool + var fromViewController: UIViewController + var pushStyle: SideMenuPushStyle + var toViewController: UIViewController + } + + private let config: Model + + init(config: Model) { + self.config = config + } + + @discardableResult func start() -> Bool { + guard config.pushStyle != .subMenu, + let fromNavigationController = config.fromViewController as? UINavigationController else { + return false + } + let toViewController = config.toViewController + let presentingViewController = fromNavigationController.presentingViewController + let splitViewController = presentingViewController as? UISplitViewController + let tabBarController = presentingViewController as? UITabBarController + let potentialNavigationController = (splitViewController?.viewControllers.first ?? tabBarController?.selectedViewController) ?? presentingViewController + guard let navigationController = potentialNavigationController as? UINavigationController else { + Print.warning(.cannotPush, arguments: String(describing: potentialNavigationController.self), required: true) + return false + } + + // To avoid overlapping dismiss & pop/push calls, create a transaction block where the menu + // is dismissed after showing the appropriate screen + CATransaction.begin() + defer { CATransaction.commit() } + UIView.animationsEnabled { [weak self] in + self?.config.alongsideTransition?() + } + + if let lastViewController = navigationController.viewControllers.last, + !config.allowPushOfSameClassTwice && type(of: lastViewController) == type(of: toViewController) { + return false + } + + toViewController.navigationItem.hidesBackButton = config.pushStyle.hidesBackButton + + switch config.pushStyle { + + case .default: + navigationController.pushViewController(toViewController, animated: config.animated) + return true + + // subMenu handled earlier + case .subMenu: + return false + + case .popWhenPossible: + for subViewController in navigationController.viewControllers.reversed() { + if type(of: subViewController) == type(of: toViewController) { + navigationController.popToViewController(subViewController, animated: config.animated) + return true + } + } + navigationController.pushViewController(toViewController, animated: config.animated) + return true + + case .preserve, .preserveAndHideBackButton: + var viewControllers = navigationController.viewControllers + let filtered = viewControllers.filter { preservedViewController in type(of: preservedViewController) == type(of: toViewController) } + guard let preservedViewController = filtered.last else { + navigationController.pushViewController(toViewController, animated: config.animated) + return true + } + viewControllers = viewControllers.filter { subViewController in subViewController !== preservedViewController } + viewControllers.append(preservedViewController) + navigationController.setViewControllers(viewControllers, animated: config.animated) + return true + + case .replace: + navigationController.setViewControllers([toViewController], animated: config.animated) + return true + } + } +} diff --git a/TracMobility/Pods/SideMenu/Pod/Classes/SideMenuTransitionController.swift b/TracMobility/Pods/SideMenu/Pod/Classes/SideMenuTransitionController.swift new file mode 100644 index 0000000..e8cc8e2 --- /dev/null +++ b/TracMobility/Pods/SideMenu/Pod/Classes/SideMenuTransitionController.swift @@ -0,0 +1,93 @@ +// +// SideMenuTransitioningDelegate.swift +// SideMenu +// +// Created by Jon Kent on 8/29/19. +// Copyright © 2019 jonkykong. All rights reserved. +// + +import UIKit + +internal protocol SideMenuTransitionControllerDelegate: class { + func sideMenuTransitionController(_ transitionController: SideMenuTransitionController, didDismiss viewController: UIViewController) + func sideMenuTransitionController(_ transitionController: SideMenuTransitionController, didPresent viewController: UIViewController) +} + +internal final class SideMenuTransitionController: NSObject, UIViewControllerTransitioningDelegate { + + typealias Model = MenuModel & AnimationModel & PresentationModel + + private let leftSide: Bool + private let config: Model + private var animationController: SideMenuAnimationController? + private weak var interactionController: SideMenuInteractionController? + + var interactive: Bool = false + weak var delegate: SideMenuTransitionControllerDelegate? + + init(leftSide: Bool, config: Model) { + self.leftSide = leftSide + self.config = config + super.init() + } + + func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning? { + animationController = SideMenuAnimationController( + config: config, + leftSide: leftSide, + delegate: self) + return animationController + } + + func animationController(forDismissed dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? { + return animationController + } + + func interactionControllerForPresentation(using animator: UIViewControllerAnimatedTransitioning) -> UIViewControllerInteractiveTransitioning? { + return interactionController(using: animator) + } + + func interactionControllerForDismissal(using animator: UIViewControllerAnimatedTransitioning) -> UIViewControllerInteractiveTransitioning? { + return interactionController(using: animator) + } + + internal func handle(state: SideMenuInteractionController.State) { + interactionController?.handle(state: state) + } + + func layout() { + animationController?.layout() + } + + func transition(presenting: Bool, animated: Bool = true, interactive: Bool = false, alongsideTransition: (() -> Void)? = nil, complete: Bool = true, completion: ((Bool) -> Void)? = nil) { + animationController?.transition( + presenting: presenting, + animated: animated, + interactive: interactive, + alongsideTransition: alongsideTransition, + complete: complete, completion: completion + ) + } +} + +extension SideMenuTransitionController: SideMenuAnimationControllerDelegate { + + internal func sideMenuAnimationController(_ animationController: SideMenuAnimationController, didDismiss viewController: UIViewController) { + delegate?.sideMenuTransitionController(self, didDismiss: viewController) + } + + internal func sideMenuAnimationController(_ animationController: SideMenuAnimationController, didPresent viewController: UIViewController) { + delegate?.sideMenuTransitionController(self, didPresent: viewController) + } +} + +private extension SideMenuTransitionController { + + func interactionController(using animator: UIViewControllerAnimatedTransitioning) -> UIViewControllerInteractiveTransitioning? { + guard interactive else { return nil } + interactive = false + let interactionController = SideMenuInteractionController(cancelWhenBackgrounded: config.dismissWhenBackgrounded, completionCurve: config.completionCurve) + self.interactionController = interactionController + return interactionController + } +} diff --git a/TracMobility/Pods/SideMenu/Pod/Classes/UITableViewVibrantCell.swift b/TracMobility/Pods/SideMenu/Pod/Classes/UITableViewVibrantCell.swift new file mode 100644 index 0000000..3a4e6eb --- /dev/null +++ b/TracMobility/Pods/SideMenu/Pod/Classes/UITableViewVibrantCell.swift @@ -0,0 +1,61 @@ +// +// UITableViewVibrantCell.swift +// Pods +// +// Created by Jon Kent on 1/14/16. +// +// + +import UIKit + +open class UITableViewVibrantCell: UITableViewCell { + + private var vibrancyView: UIVisualEffectView = UIVisualEffectView() + private var vibrancySelectedBackgroundView: UIVisualEffectView = UIVisualEffectView() + private var defaultSelectedBackgroundView: UIView? + open var blurEffectStyle: UIBlurEffect.Style? { + didSet { + updateBlur() + } + } + + // For registering with UITableView without subclassing otherwise dequeuing instance of the cell causes an exception + public override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { + super.init(style: style, reuseIdentifier: reuseIdentifier) + } + + required public init?(coder aDecoder: NSCoder) { + super.init(coder: aDecoder) + + vibrancyView.frame = bounds + vibrancyView.autoresizingMask = [.flexibleHeight, .flexibleWidth] + for view in subviews { + vibrancyView.contentView.addSubview(view) + } + addSubview(vibrancyView) + + let blurSelectionEffect = UIBlurEffect(style: .light) + vibrancySelectedBackgroundView.effect = blurSelectionEffect + defaultSelectedBackgroundView = selectedBackgroundView + + updateBlur() + } + + internal func updateBlur() { + // shouldn't be needed but backgroundColor is set to white on iPad: + backgroundColor = UIColor.clear + + if let blurEffectStyle = blurEffectStyle, !UIAccessibility.isReduceTransparencyEnabled { + let blurEffect = UIBlurEffect(style: blurEffectStyle) + vibrancyView.effect = UIVibrancyEffect(blurEffect: blurEffect) + + if selectedBackgroundView != nil && selectedBackgroundView != vibrancySelectedBackgroundView { + vibrancySelectedBackgroundView.contentView.addSubview(selectedBackgroundView!) + selectedBackgroundView = vibrancySelectedBackgroundView + } + } else { + vibrancyView.effect = nil + selectedBackgroundView = defaultSelectedBackgroundView + } + } +} diff --git a/TracMobility/Pods/SideMenu/README.md b/TracMobility/Pods/SideMenu/README.md new file mode 100644 index 0000000..d0a4332 --- /dev/null +++ b/TracMobility/Pods/SideMenu/README.md @@ -0,0 +1,407 @@ +# ▤ SideMenu +[![CircleCI](https://circleci.com/gh/jonkykong/SideMenu.svg?style=svg)](https://circleci.com/gh/jonkykong/SideMenu) +[![Version](https://img.shields.io/cocoapods/v/SideMenu.svg?style=flat-square)](http://cocoapods.org/pods/SideMenu) +[![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat-square)](https://github.com/Carthage/Carthage) +[![License](https://img.shields.io/cocoapods/l/SideMenu.svg?style=flat-square)](http://cocoapods.org/pods/SideMenu) +[![Platform](https://img.shields.io/cocoapods/p/SideMenu.svg?style=flat-square)](http://cocoapods.org/pods/SideMenu) + +### If you like SideMenu, give it a ★ at the top right of this page. +#### SideMenu needs your help! If you're a skilled iOS developer and want to help maintain this repository and answer issues asked by the community, please [send me an email](mailto:yo@massappeal.co?subject=I%20Want%20To%20Help!). + +> Hi, I'm Jon Kent and I am an iOS designer, developer, and mobile strategist. I love coffee and play the drums. +> * [**Hire me**](mailto:yo@massappeal.co?subject=Let's%20build%20something%20amazing) to help you make cool stuff. *Note: If you're having a problem with SideMenu, please open an [issue](https://github.com/jonkykong/SideMenu/issues/new) and do not email me.* +> * Check out my [website](http://massappeal.co) to see some of my other projects. +> * Building and maintaining this **free** library takes a lot of my time and **saves you time**. Please consider paying it forward by supporting me with a small amount to my [PayPal](https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=contact%40jonkent%2eme&lc=US¤cy_code=USD&bn=PP%2dDonationsBF%3abtn_donateCC_LG%2egif%3aNonHosted). (only **13** people have donated since 12/23/15 but **thank you** to those who have!) + +* **[Overview](#overview)** + * [Preview Samples](#preview-samples) +* **[Requirements](#requirements)** +* **[Installation](#installation)** + * [CocoaPods](#cocoapods) + * [Carthage](#carthage) + * [Swift Package Manager](#swift-package-manager) +* **[Usage](#usage)** + * [Code-less Storyboard Implementation](#code-less-storyboard-implementation) + * [Code Implementation](#code-implementation) +* **[Customization](#customization)** + * [SideMenuManager](#sidemenumanager) + * [SideMenuNavigationController](#sidemenunavigationcontroller) + * [SideMenuNavigationControllerDelegate](#sidemenunavigationcontrollerdelegate) + * [Advanced](#advanced) +* [Known Issues](#known-issues) +* [Thank You](#thank-you) +* [License](#license) + +## Overview + +SideMenu is a simple and versatile side menu control written in Swift. +- [x] **It can be implemented in storyboard without a single line of [code](#code-less-storyboard-implementation).** +- [x] Eight standard animation styles to choose from (there's even a parallax effect if you want to get weird). +- [x] Highly customizable without needing to write tons of custom code. +- [x] Supports continuous swiping between side menus on boths sides in a single gesture. +- [x] Global menu configuration. Set-up once and be done for all screens. +- [x] Menus can be presented and dismissed the same as any other view controller since this control uses [custom transitions](https://developer.apple.com/library/content/featuredarticles/ViewControllerPGforiPhoneOS/CustomizingtheTransitionAnimations.html). +- [x] Animations use your view controllers, not snapshots. +- [x] Properly handles screen rotation and in-call status bar height changes. + +Check out the example project to see it in action! +### Preview Samples +| Slide Out | Slide In | Dissolve | Slide In + Out | +| --- | --- | --- | --- | +| ![](https://raw.githubusercontent.com/jonkykong/SideMenu/master/etc/SlideOut.gif) | ![](https://raw.githubusercontent.com/jonkykong/SideMenu/master/etc/SlideIn.gif) | ![](https://raw.githubusercontent.com/jonkykong/SideMenu/master/etc/Dissolve.gif) | ![](https://raw.githubusercontent.com/jonkykong/SideMenu/master/etc/InOut.gif) | + +## Requirements +- [x] Xcode 11. +- [x] Swift 5. +- [x] iOS 10 or higher. + +## Installation +### CocoaPods + +[CocoaPods](http://cocoapods.org) is a dependency manager for Cocoa projects. You can install it with the following command: + +```bash +$ gem install cocoapods +``` + +To integrate SideMenu into your Xcode project using CocoaPods, specify it in your `Podfile`: + +```ruby +source 'https://github.com/CocoaPods/Specs.git' +platform :ios, '10.0' +use_frameworks! + +pod 'SideMenu' + +# For Swift 5 use: +# pod 'SideMenu', '~> 6.0' + +# For Swift 4.2 (no longer maintained) use: +# pod 'SideMenu', '~> 5.0' +``` + +Then, run the following command: + +```bash +$ pod install +``` + +### Carthage + +[Carthage](https://github.com/Carthage/Carthage) is a decentralized dependency manager that builds your dependencies and provides you with binary frameworks. + +You can install Carthage with [Homebrew](http://brew.sh/) using the following command: + +```bash +$ brew update +$ brew install carthage +``` + +To integrate SideMenu into your Xcode project using Carthage, specify it in your `Cartfile`: + +```ogdl +github "jonkykong/SideMenu" "master" +``` + +### 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 SideMenu does support its use on supported platforms. + +Once you have your Swift package set up, adding SideMenu as a dependency is as easy as adding it to the `dependencies` value of your `Package.swift`. + +```swift +dependencies: [ + .package(url: "https://github.com/jonkykong/SideMenu.git", from: "6.0.0") +] +``` + +## Usage +### Code-less Storyboard Implementation +1. Create a Navigation Controller for a side menu. Set the `Custom Class` of the Navigation Controller to be `SideMenuNavigationController` in the **Identity Inspector**. Set the `Module` to `SideMenu` (ignore this step if you've manually added SideMenu to your project). Create a Root View Controller for the Navigation Controller (shown as a UITableViewController below). Set up any Triggered Segues you want in that view controller. +![](https://raw.githubusercontent.com/jonkykong/SideMenu/master/etc/Screenshot1.png) + +2. Set the `Left Side` property of the `SideMenuNavigationController` to On if you want it to appear from the left side of the screen, or Off/Default if you want it to appear from the right side. +![](https://raw.githubusercontent.com/jonkykong/SideMenu/master/etc/Screenshot2.png) + +3. Add a UIButton or UIBarButton to a view controller that you want to display the menu from. Set that button's Triggered Segues action to modally present the Navigation Controller from step 1. +![](https://raw.githubusercontent.com/jonkykong/SideMenu/master/etc/Screenshot3.png) + +That's it. *Note: you can only enable gestures in code.* +### Code Implementation +First: +```swift +import SideMenu +``` + +From a button, do something like this: +``` swift +// Define the menu +let menu = SideMenuNavigationController(rootViewController: YourViewController) +// SideMenuNavigationController is a subclass of UINavigationController, so do any additional configuration +// of it here like setting its viewControllers. If you're using storyboards, you'll want to do something like: +// let menu = storyboard!.instantiateViewController(withIdentifier: "RightMenu") as! SideMenuNavigationController +present(menu, animated: true, completion: nil) +``` + +To dismiss a menu programmatically, do something like this: +``` swift +dismiss(animated: true, completion: nil) +``` + +To use gestures you have to use the `SideMenuManager`. In your `AppDelegate` do something like this: +``` swift +// Define the menus +let leftMenuNavigationController = SideMenuNavigationController(rootViewController: YourViewController) +SideMenuManager.default.leftMenuNavigationController = leftMenuNavigationController + +let rightMenuNavigationController = SideMenuNavigationController(rootViewController: YourViewController) +SideMenuManager.default.rightMenuNavigationController = rightMenuNavigationController + +// Setup gestures: the left and/or right menus must be set up (above) for these to work. +// Note that these continue to work on the Navigation Controller independent of the view controller it displays! +SideMenuManager.default.addPanGestureToPresent(toView: self.navigationController!.navigationBar) +SideMenuManager.default.addScreenEdgePanGesturesToPresent(toView: self.navigationController!.view) + +// (Optional) Prevent status bar area from turning black when menu appears: +leftMenuNavigationController.statusBarEndAlpha = 0 +// Copy all settings to the other menu +rightMenuNavigationController.settings = leftMenuNavigationController.settings +``` +That's it. +### Customization +#### SideMenuManager +`SideMenuManager` supports the following: +``` swift +/// The left menu. +open var leftMenuNavigationController: SideMenuNavigationController? +/// The right menu. +public var rightMenuNavigationController: SideMenuNavigationController? +/** + Adds screen edge gestures for both left and right sides to a view to present a menu. + + - Parameter toView: The view to add gestures to. + + - Returns: The array of screen edge gestures added to `toView`. + */ +@discardableResult public func addScreenEdgePanGesturesToPresent(toView view: UIView) -> [UIScreenEdgePanGestureRecognizer] +/** + Adds screen edge gestures to a view to present a menu. + + - Parameter toView: The view to add gestures to. + - Parameter forMenu: The menu (left or right) you want to add a gesture for. + + - Returns: The screen edge gestures added to `toView`. + */ +@discardableResult public func addScreenEdgePanGesturesToPresent(toView view: UIView, forMenu side: PresentDirection) -> UIScreenEdgePanGestureRecognizer +/** + Adds a pan edge gesture to a view to present menus. + + - Parameter toView: The view to add a pan gesture to. + + - Returns: The pan gesture added to `toView`. + */ +@discardableResult public func addPanGestureToPresent(toView view: UIView) -> UIPanGestureRecognizer +``` +#### SideMenuNavigationController +`SideMenuNavigationController` supports the following: +``` swift +/// Prevents the same view controller (or a view controller of the same class) from being pushed more than once. Defaults to true. +var allowPushOfSameClassTwice: Bool = true +/// Forces menus to always animate when appearing or disappearing, regardless of a pushed view controller's animation. +var alwaysAnimate: Bool = true +/// The animation options when a menu is displayed. Ignored when displayed with a gesture. +var animationOptions: UIView.AnimationOptions = .curveEaseInOut +/** + The blur effect style of the menu if the menu's root view controller is a UITableViewController or UICollectionViewController. + + - Note: If you want cells in a UITableViewController menu to show vibrancy, make them a subclass of UITableViewVibrantCell. + */ +var blurEffectStyle: UIBlurEffect.Style? = nil +/// Duration of the remaining animation when the menu is partially dismissed with gestures. Default is 0.35 seconds. +var completeGestureDuration: Double = 0.35 +/// Animation curve of the remaining animation when the menu is partially dismissed with gestures. Default is .easeIn. +var completionCurve: UIView.AnimationCurve = .curveEaseInOut +/// Duration of the animation when the menu is dismissed without gestures. Default is 0.35 seconds. +var dismissDuration: Double = 0.35 +/// Automatically dismisses the menu when another view is presented from it. +var dismissOnPresent: Bool = true +/// Automatically dismisses the menu when another view controller is pushed from it. +var dismissOnPush: Bool = true +/// Automatically dismisses the menu when the screen is rotated. +var dismissOnRotation: Bool = true +/// Automatically dismisses the menu when app goes to the background. +var dismissWhenBackgrounded: Bool = true +/// Enable or disable a swipe gesture that dismisses the menu. Will not be triggered when `presentingViewControllerUserInteractionEnabled` is set to true. Default is true. +var enableSwipeToDismissGesture: Bool = true +/// Enable or disable a tap gesture that dismisses the menu. Will not be triggered when `presentingViewControllerUserInteractionEnabled` is set to true. Default is true. +var enableTapToDismissGesture: Bool = true +/// The animation initial spring velocity when a menu is displayed. Ignored when displayed with a gesture. +var initialSpringVelocity: CGFloat = 1 +/// Whether the menu appears on the right or left side of the screen. Right is the default. This property cannot be changed after the menu has loaded. +var leftSide: Bool = false +/// Width of the menu when presented on screen, showing the existing view controller in the remaining space. Default is zero. +var menuWidth: CGFloat = 240 +/// Duration of the animation when the menu is presented without gestures. Default is 0.35 seconds. +var presentDuration: Double = 0.35 +/// Enable or disable interaction with the presenting view controller while the menu is displayed. Enabling may make it difficult to dismiss the menu or cause exceptions if the user tries to present and already presented menu. `presentingViewControllerUseSnapshot` must also set to false. Default is false. +var presentingViewControllerUserInteractionEnabled: Bool = false +/// Use a snapshot for the presenting vierw controller while the menu is displayed. Useful when layout changes occur during transitions. Not recommended for apps that support rotation. Default is false. +var presentingViewControllerUseSnapshot: Bool = false +/// The presentation style of the menu. +var presentationStyle: SideMenuPresentStyle = .viewSlideOut +/** + The push style of the menu. + + There are six modes in MenuPushStyle: + - defaultBehavior: The view controller is pushed onto the stack. + - popWhenPossible: If a view controller already in the stack is of the same class as the pushed view controller, the stack is instead popped back to the existing view controller. This behavior can help users from getting lost in a deep navigation stack. + - preserve: If a view controller already in the stack is of the same class as the pushed view controller, the existing view controller is pushed to the end of the stack. This behavior is similar to a UITabBarController. + - preserveAndHideBackButton: Same as .preserve and back buttons are automatically hidden. + - replace: Any existing view controllers are released from the stack and replaced with the pushed view controller. Back buttons are automatically hidden. This behavior is ideal if view controllers require a lot of memory or their state doesn't need to be preserved.. + - subMenu: Unlike all other behaviors that push using the menu's presentingViewController, this behavior pushes view controllers within the menu. Use this behavior if you want to display a sub menu. + */ +var pushStyle: MenuPushStyle = .default +/// Draws `presentationStyle.backgroundColor` behind the status bar. Default is 0. +var statusBarEndAlpha: CGFloat = 0 +/// The animation spring damping when a menu is displayed. Ignored when displayed with a gesture. +var usingSpringWithDamping: CGFloat = 1 +/// Indicates if the menu is anywhere in the view hierarchy, even if covered by another view controller. +var isHidden: Bool +``` +#### SideMenuPresentStyle +There are 8 pre-defined `SideMenuPresentStyle` options: +``` swift +/// Menu slides in over the existing view. +static let menuSlideIn: SideMenuPresentStyle +/// The existing view slides out to reveal the menu underneath. +static let viewSlideOut: SideMenuPresentStyle +/// The existing view slides out while the menu slides in. +static let viewSlideOutMenuIn: SideMenuPresentStyle +/// The menu dissolves in over the existing view. +static let menuDissolveIn: SideMenuPresentStyle +/// The existing view slides out while the menu partially slides in. +static let viewSlideOutMenuPartialIn: SideMenuPresentStyle +/// The existing view slides out while the menu slides out from under it. +static let viewSlideOutMenuOut: SideMenuPresentStyle +/// The existing view slides out while the menu partially slides out from under it. +static let viewSlideOutMenuPartialOut: SideMenuPresentStyle +/// The existing view slides out and shrinks to reveal the menu underneath. +static let viewSlideOutMenuZoom: SideMenuPresentStyle +``` +#### SideMenuNavigationControllerDelegate +To receive notifications when a menu is displayed from a view controller, have it adhere to the `SideMenuNavigationControllerDelegate` protocol: +``` swift +extension MyViewController: SideMenuNavigationControllerDelegate { + + func sideMenuWillAppear(menu: SideMenuNavigationController, animated: Bool) { + print("SideMenu Appearing! (animated: \(animated))") + } + + func sideMenuDidAppear(menu: SideMenuNavigationController, animated: Bool) { + print("SideMenu Appeared! (animated: \(animated))") + } + + func sideMenuWillDisappear(menu: SideMenuNavigationController, animated: Bool) { + print("SideMenu Disappearing! (animated: \(animated))") + } + + func sideMenuDidDisappear(menu: SideMenuNavigationController, animated: Bool) { + print("SideMenu Disappeared! (animated: \(animated))") + } +} +``` +*Note: setting the `sideMenuDelegate` property on `SideMenuNavigationController` is optional. If your view controller adheres to the protocol then the methods will be called automatically.* +### Advanced +
+Click for Details + +#### Multiple SideMenuManagers +For simplicity, `SideMenuManager.default` serves as the primary instance as most projects will only need one menu across all screens. If you need to show a different SideMenu using gestures, such as from a modal view controller presented from a previous SideMenu, do the following: +1. Declare a variable containing your custom `SideMenuManager` instance. You may want it to define it globally and configure it in your app delegate if menus will be used on multiple screens. +``` swift +let customSideMenuManager = SideMenuManager() +``` +2. Setup and display menus with your custom instance the same as you would with the `SideMenuManager.default` instance. +3. If using Storyboards, subclass your instance of `SideMenuNavigationController` and set its `sideMenuManager` property to your custom instance. This must be done before `viewDidLoad` is called: +``` swift +class MySideMenuNavigationController: SideMenuNavigationController { + + let customSideMenuManager = SideMenuManager() + + override func awakeFromNib() { + super.awakeFromNib() + + sideMenuManager = customSideMenuManager + } +} +``` +Alternatively, you can set `sideMenuManager` from the view controller that segues to your SideMenuNavigationController: +``` swift +override func prepare(for segue: UIStoryboardSegue, sender: Any?) { + if let sideMenuNavigationController = segue.destination as? SideMenuNavigationController { + sideMenuNavigationController.sideMenuManager = customSideMenuManager + } +} +``` +*Important: displaying SideMenu instances directly over each other is not supported. Use `menuPushStyle = .subMenu` to display multi-level menus instead.* + +### SideMenuPresentationStyle +If you want to create your own custom presentation style, create a subclass of `SideMenuPresentationStyle` and set your menu's `presentationStyle` to it: +```swift +class MyPresentStyle: SideMenuPresentationStyle { + + override init() { + super.init() + /// Background color behind the views and status bar color + backgroundColor = .black + /// The starting alpha value of the menu before it appears + menuStartAlpha = 1 + /// Whether or not the menu is on top. If false, the presenting view is on top. Shadows are applied to the view on top. + menuOnTop = false + /// The amount the menu is translated along the x-axis. Zero is stationary, negative values are off-screen, positive values are on screen. + menuTranslateFactor = 0 + /// The amount the menu is scaled. Less than one shrinks the view, larger than one grows the view. + menuScaleFactor = 1 + /// The color of the shadow applied to the top most view. + onTopShadowColor = .black + /// The radius of the shadow applied to the top most view. + onTopShadowRadius = 5 + /// The opacity of the shadow applied to the top most view. + onTopShadowOpacity = 0 + /// The offset of the shadow applied to the top most view. + onTopShadowOffset = .zero + /// The ending alpha of the presenting view when the menu is fully displayed. + presentingEndAlpha = 1 + /// The amount the presenting view is translated along the x-axis. Zero is stationary, negative values are off-screen, positive values are on screen. + presentingTranslateFactor = 0 + /// The amount the presenting view is scaled. Less than one shrinks the view, larger than one grows the view. + presentingScaleFactor = 1 + /// The strength of the parallax effect on the presenting view once the menu is displayed. + presentingParallaxStrength = .zero + } + + /// This method is called just before the presentation transition begins. Use this to setup any animations. The super method does not need to be called. + override func presentationTransitionWillBegin(to presentedViewController: UIViewController, from presentingViewController: UIViewController) {} + /// This method is called during the presentation animation. Use this to animate anything alongside the menu animation. The super method does not need to be called. + override func presentationTransition(to presentedViewController: UIViewController, from presentingViewController: UIViewController) {} + /// This method is called when the presentation transition ends. Use this to finish any animations. The super method does not need to be called. + override func presentationTransitionDidEnd(to presentedViewController: UIViewController, from presentingViewController: UIViewController, _ completed: Bool) {} + /// This method is called just before the dismissal transition begins. Use this to setup any animations. The super method does not need to be called. + override func dismissalTransitionWillBegin(to presentedViewController: UIViewController, from presentingViewController: UIViewController) {} + /// This method is called during the dismissal animation. Use this to animate anything alongside the menu animation. The super method does not need to be called. + override func dismissalTransition(to presentedViewController: UIViewController, from presentingViewController: UIViewController) {} + /// This method is called when the dismissal transition ends. Use this to finish any animations. The super method does not need to be called. + override func dismissalTransitionDidEnd(to presentedViewController: UIViewController, from presentingViewController: UIViewController, _ completed: Bool) {} +} +``` +
+ +## Known Issues +* Issue [#258](https://github.com/jonkykong/SideMenu/issues/258). Using `presentingViewControllerUseSnapshot` can help preserve the experience. + +## Thank You +A special thank you to everyone that has [contributed](https://github.com/jonkykong/SideMenu/graphs/contributors) to this library to make it better. Your support is appreciated! + +## License + +SideMenu is available under the MIT license. See the LICENSE file for more info. diff --git a/TracMobility/Pods/SimpleKeychain/LICENSE b/TracMobility/Pods/SimpleKeychain/LICENSE new file mode 100644 index 0000000..b511cd4 --- /dev/null +++ b/TracMobility/Pods/SimpleKeychain/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014 Auth0 LLC + +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. \ No newline at end of file diff --git a/TracMobility/Pods/SimpleKeychain/README.md b/TracMobility/Pods/SimpleKeychain/README.md new file mode 100644 index 0000000..789e61e --- /dev/null +++ b/TracMobility/Pods/SimpleKeychain/README.md @@ -0,0 +1,164 @@ +# SimpleKeychain + +[![CircleCI](https://img.shields.io/circleci/project/github/auth0/SimpleKeychain.svg?style=flat-square)](https://circleci.com/gh/auth0/SimpleKeychain/tree/master) +[![Coverage Status](https://img.shields.io/codecov/c/github/auth0/SimpleKeychain/master.svg?style=flat-square)](https://codecov.io/github/auth0/SimpleKeychain) +[![Version](https://img.shields.io/cocoapods/v/SimpleKeychain.svg?style=flat-square)](https://cocoapods.org/pods/SimpleKeychain) +[![License](https://img.shields.io/cocoapods/l/SimpleKeychain.svg?style=flat-square)](https://cocoapods.org/pods/SimpleKeychain) +[![Platform](https://img.shields.io/cocoapods/p/SimpleKeychain.svg?style=flat-square)](https://cocoapods.org/pods/SimpleKeychain) +[![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat-square)](https://github.com/Carthage/Carthage) +[![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Fauth0%2FSimpleKeychain.svg?type=shield)](https://app.fossa.com/projects/git%2Bgithub.com%2Fauth0%2FSimpleKeychain?ref=badge_shield) + +A wrapper to make it really easy to deal with iOS Keychain and store your user's credentials securely. + +## Key Features + +- **Simple interface** to store user's credentials (e.g. JWT) in the Keychain. +- Store credentials under an **Access Group to enable Keychain Sharing**. +- **TouchID/FaceID integration** with a reusable `LAContext` instance. + +## Table of Contents + +- [Requirements](#requirements) +- [Installation](#installation) +- [Usage](#usage) +- [Contributing](#contributing) +- [What is Auth0?](#what-is-auth0) +- [Create a Free Auth0 Account](#create-a-free-auth0-account) +- [Issue Reporting](#issue-reporting) +- [Author](#author) +- [License](#license) + +## Requirements + +- iOS 9.0+ / macOS 10.11+ / tvOS 9.0+ / watchOS 2.0+ +- Xcode 11.4+ / Xcode 12.x +- Swift 4.x/5.x + +## Installation + +### CocoaPods + +If you are using [Cocoapods](https://cocoapods.org), add this line to your `Podfile`: + +```ruby +pod "SimpleKeychain" +``` + +Then run `pod install`. + +> For more information on Cocoapods, check [their official documentation](https://guides.cocoapods.org/using/getting-started.html). + +### Carthage + +If you are using [Carthage](https://github.com/Carthage/Carthage), add the following line to your `Cartfile`: + +```ruby +github "auth0/SimpleKeychain" +``` + +Then run `carthage bootstrap`. + +> For more information about Carthage usage, check [their official documentation](https://github.com/Carthage/Carthage#if-youre-building-for-ios-tvos-or-watchos). + +#### SPM (Xcode 11.2+) + +If you are using the Swift Package Manager, open the following menu item in Xcode: + +**File > Swift Packages > Add Package Dependency...** + +In the **Choose Package Repository** prompt add this url: + +``` +https://github.com/auth0/SimpleKeychain.git +``` + +Then, press **Next** and complete the remaining steps. + +> For more information on SPM, check [its official documentation](https://developer.apple.com/documentation/xcode/adding_package_dependencies_to_your_app). + +## Usage + +### Save a JWT token or password + +```swift +let jwt = // user's JWT token obtained after login +A0SimpleKeychain().setString(jwt, forKey: "auth0-user-jwt") +``` + +### Obtain a JWT token or password + +```swift +let jwt = A0SimpleKeychain().string(forKey: "auth0-user-jwt") +``` + +### Share a JWT Token with other apps using iOS Access Group + +```swift +let jwt = // user's JWT token obtained after login +let keychain = A0SimpleKeychain(service: "Auth0", accessGroup: "ABCDEFGH.com.mydomain.myaccessgroup") +keychain.setString(jwt, forKey: "auth0-user-jwt") +``` + +### Store and retrieve a JWT token using TouchID/FaceID + +Let's save the JWT first: + +```swift +let jwt = // user's JWT token obtained after login +let keychain = A0SimpleKeychain() +keychain.useAccessControl = true +keychain.defaultAccessiblity = .whenPasscodeSetThisDeviceOnly +keychain.setTouchIDAuthenticationAllowableReuseDuration(5.0) +keychain.setString(jwt, forKey: "auth0-user-jwt") +``` + +> If there is an existent value under the key `auth0-user-jwt` saved with AccessControl and `A0SimpleKeychainItemAccessibleWhenPasscodeSetThisDeviceOnly`, iOS will prompt the user to enter their passcode or fingerprint before updating the value. + +Then let's obtain the value: + +```swift +let message = NSLocalizedString("Please enter your passcode/fingerprint to login with awesome App!.", comment: "Prompt TouchID message") +let keychain = A0SimpleKeychain() +let jwt = keychain.string(forKey: "auth0-user-jwt", promptMessage: message) +``` + +### Remove a JWT token or password + +```swift +A0SimpleKeychain().deleteEntry(forKey: "auth0-user-jwt") +``` + +## Contributing + +Just clone the repo, run `carthage bootstrap` and you're ready to contribute! + +## What is Auth0? + +Auth0 helps you to: + +* Add authentication with [multiple sources](https://auth0.com/docs/identityproviders), either social identity providers such as **Google, Facebook, Microsoft Account, LinkedIn, GitHub, Twitter, Box, Salesforce** (amongst others), or enterprise identity systems like **Windows Azure AD, Google Apps, Active Directory, ADFS, or any SAML Identity Provider**. +* Add authentication through more traditional **[username/password databases](https://auth0.com/docs/connections/database/custom-db)**. +* Add support for **[linking different user accounts](https://auth0.com/docs/link-accounts)** with the same user. +* Support for generating signed [JSON Web Tokens](https://auth0.com/docs/tokens/concepts/jwts) to call your APIs and **flow the user identity** securely. +* Analytics of how, when, and where users are logging in. +* Pull data from other sources and add it to the user profile through [JavaScript rules](https://auth0.com/docs/rules). + +## Create a Free Auth0 Account + +1. Go to [Auth0](https://auth0.com) and click **Sign Up**. +2. Use Google, GitHub, or Microsoft Account to login. + +## Issue Reporting + +If you have found a bug or to request a feature, please [raise an issue](https://github.com/auth0/simplekeychain/issues). Please do not report security vulnerabilities on the public GitHub issue tracker. The [Responsible Disclosure Program](https://auth0.com/responsible-disclosure-policy) details the procedure for disclosing security issues. + +## Author + +[Auth0](https://auth0.com) + +## License + +This project is licensed under the MIT license. See the [LICENSE](https://github.com/auth0/SimpleKeychain/blob/master/LICENSE) file for more info. + + +[![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Fauth0%2FSimpleKeychain.svg?type=large)](https://app.fossa.com/projects/git%2Bgithub.com%2Fauth0%2FSimpleKeychain?ref=badge_large) diff --git a/TracMobility/Pods/SimpleKeychain/SimpleKeychain/A0SimpleKeychain+KeyPair.h b/TracMobility/Pods/SimpleKeychain/SimpleKeychain/A0SimpleKeychain+KeyPair.h new file mode 100644 index 0000000..57c4791 --- /dev/null +++ b/TracMobility/Pods/SimpleKeychain/SimpleKeychain/A0SimpleKeychain+KeyPair.h @@ -0,0 +1,105 @@ +// A0SimpleKeychain+KeyPair.h +// +// Copyright (c) 2014 Auth0 (http://auth0.com) +// +// 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 "A0SimpleKeychain.h" + +typedef NS_ENUM(NSUInteger, A0SimpleKeychainRSAKeySize) { + A0SimpleKeychainRSAKeySize512Bits = 512, + A0SimpleKeychainRSAKeySize1024Bits = 1024, + A0SimpleKeychainRSAKeySize2048Bits = 2048 +}; + +NS_ASSUME_NONNULL_BEGIN + +/** + * Category of `A0SimpleKeychain` to handle RSA pairs keys in the Keychain + */ +@interface A0SimpleKeychain (KeyPair) + +/** + * Generates a RSA key pair with a specific length and tags. + * Each key is marked as permanent in the Keychain + * + * @param keyLength number of bits of the keys. + * @param publicKeyTag tag of the public key + * @param privateKeyTag tag of the private key + * + * @return if the key par is created it will return YES, otherwise NO. + */ +- (BOOL)generateRSAKeyPairWithLength:(A0SimpleKeychainRSAKeySize)keyLength + publicKeyTag:(NSString *)publicKeyTag + privateKeyTag:(NSString *)privateKeyTag; + +/** + * Returns a RSA key as NSData. + * + * @param keyTag tag of the key + * + * @return the key as NSData or nil if not found + */ +- (nullable NSData *)dataForRSAKeyWithTag:(NSString *)keyTag; + +/** + * Removes a key using its tag. + * + * @param keyTag tag of the key to remove + * + * @return if the key was removed successfuly. + */ +- (BOOL)deleteRSAKeyWithTag:(NSString *)keyTag; + +/** + * Returns a RSA key as `SecKeyRef`. You must release it when you're done with it + * + * @param keyTag tag of the RSA Key + * + * @return SecKeyRef of RSA Key + */ +- (nullable SecKeyRef)keyRefOfRSAKeyWithTag:(NSString *)keyTag; + +/** + * Checks if a RSA key exists with a given tag. + * + * @param keyTag tag of RSA Key + * + * @return if the key exists or not. + */ +- (BOOL)hasRSAKeyWithTag:(NSString *)keyTag; + +@end + +@interface A0SimpleKeychain (Deprecated) + +/** + * Returns the public key as NSData. + * + * @param keyTag tag of the public key + * + * @return the public key as NSData or nil if not found + * + * @deprecated 0.2.0 + */ +- (nullable NSData *)publicRSAKeyDataForTag:(NSString *)keyTag __attribute__((deprecated)); + +@end + +NS_ASSUME_NONNULL_END diff --git a/TracMobility/Pods/SimpleKeychain/SimpleKeychain/A0SimpleKeychain+KeyPair.m b/TracMobility/Pods/SimpleKeychain/SimpleKeychain/A0SimpleKeychain+KeyPair.m new file mode 100644 index 0000000..714f382 --- /dev/null +++ b/TracMobility/Pods/SimpleKeychain/SimpleKeychain/A0SimpleKeychain+KeyPair.m @@ -0,0 +1,133 @@ +// A0SimpleKeychain+KeyPair.m +// +// Copyright (c) 2014 Auth0 (http://auth0.com) +// +// 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 "A0SimpleKeychain+KeyPair.h" + +@implementation A0SimpleKeychain (KeyPair) + +- (BOOL)generateRSAKeyPairWithLength:(A0SimpleKeychainRSAKeySize)keyLength + publicKeyTag:(NSString *)publicKeyTag + privateKeyTag:(NSString *)privateKeyTag { + NSAssert(publicKeyTag.length > 0 && privateKeyTag.length > 0, @"Both key tags should be non-empty!"); + + NSMutableDictionary *pairAttr = [@{ + (__bridge id)kSecAttrKeyType: (__bridge id)kSecAttrKeyTypeRSA, + (__bridge id)kSecAttrKeySizeInBits: @(keyLength), + } mutableCopy]; + NSDictionary *privateAttr = @{ + (__bridge id)kSecAttrIsPermanent: @YES, + (__bridge id)kSecAttrApplicationTag: [privateKeyTag dataUsingEncoding:NSUTF8StringEncoding], + }; + NSDictionary *publicAttr = @{ + (__bridge id)kSecAttrIsPermanent: @YES, + (__bridge id)kSecAttrApplicationTag: [publicKeyTag dataUsingEncoding:NSUTF8StringEncoding], + }; + pairAttr[(__bridge id)kSecPrivateKeyAttrs] = privateAttr; + pairAttr[(__bridge id)kSecPublicKeyAttrs] = publicAttr; + + SecKeyRef publicKeyRef; + SecKeyRef privateKeyRef; + + OSStatus status = SecKeyGeneratePair((__bridge CFDictionaryRef)pairAttr, &publicKeyRef, &privateKeyRef); + + CFRelease(publicKeyRef); + CFRelease(privateKeyRef); + + return status == errSecSuccess; +} + +- (NSData *)dataForRSAKeyWithTag:(NSString *)keyTag { + NSAssert(keyTag.length > 0, @"key tag should be non-empty!"); + + NSDictionary *publicKeyQuery = @{ + (__bridge id)kSecClass: (__bridge id)kSecClassKey, + (__bridge id)kSecAttrApplicationTag: [keyTag dataUsingEncoding:NSUTF8StringEncoding], + (__bridge id)kSecAttrType: (__bridge id)kSecAttrKeyTypeRSA, + (__bridge id)kSecReturnData: @YES, + }; + + CFTypeRef dataRef; + OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)publicKeyQuery, &dataRef); + + if (status != errSecSuccess) { + return nil; + } + + NSData *data = [NSData dataWithData:(__bridge NSData *)dataRef]; + if (dataRef) { + CFRelease(dataRef); + } + return data; +} + +- (BOOL)hasRSAKeyWithTag:(NSString *)keyTag { + NSAssert(keyTag.length > 0, @"key tag should be non-empty!"); + + NSDictionary *publicKeyQuery = @{ + (__bridge id)kSecClass: (__bridge id)kSecClassKey, + (__bridge id)kSecAttrApplicationTag: [keyTag dataUsingEncoding:NSUTF8StringEncoding], + (__bridge id)kSecAttrType: (__bridge id)kSecAttrKeyTypeRSA, + (__bridge id)kSecReturnData: @NO, + }; + + OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)publicKeyQuery, NULL); + return status == errSecSuccess; +} + + +- (BOOL)deleteRSAKeyWithTag:(NSString *)keyTag { + NSAssert(keyTag.length > 0, @"key tag should be non-empty!"); + NSDictionary *deleteKeyQuery = @{ + (__bridge id)kSecClass: (__bridge id)kSecClassKey, + (__bridge id)kSecAttrApplicationTag: [keyTag dataUsingEncoding:NSUTF8StringEncoding], + (__bridge id)kSecAttrType: (__bridge id)kSecAttrKeyTypeRSA, + }; + + OSStatus status = SecItemDelete((__bridge CFDictionaryRef)deleteKeyQuery); + return status == errSecSuccess; +} + +- (SecKeyRef)keyRefOfRSAKeyWithTag:(NSString *)keyTag { + NSAssert(keyTag.length > 0, @"key tag should be non-empty!"); + NSDictionary *query = @{ + (__bridge id)kSecClass: (__bridge id)kSecClassKey, + (__bridge id)kSecAttrKeyType: (__bridge id)kSecAttrKeyTypeRSA, + (__bridge id)kSecReturnRef: @YES, + (__bridge id)kSecAttrApplicationTag: keyTag, + }; + SecKeyRef privateKeyRef = NULL; + OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)query, (CFTypeRef *)&privateKeyRef); + if (status != errSecSuccess) { + return NULL; + } + return privateKeyRef; +} + +@end + +@implementation A0SimpleKeychain (Deprecated) + +- (NSData *)publicRSAKeyDataForTag:(NSString *)keyTag { + return [self dataForRSAKeyWithTag:keyTag]; +} + +@end diff --git a/TracMobility/Pods/SimpleKeychain/SimpleKeychain/A0SimpleKeychain.h b/TracMobility/Pods/SimpleKeychain/SimpleKeychain/A0SimpleKeychain.h new file mode 100755 index 0000000..a5622e6 --- /dev/null +++ b/TracMobility/Pods/SimpleKeychain/SimpleKeychain/A0SimpleKeychain.h @@ -0,0 +1,358 @@ +// A0SimpleKeychain.h +// +// Copyright (c) 2014 Auth0 (http://auth0.com) +// +// 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 + +#if __has_include("LocalAuthentication/LocalAuthentication.h") + +#import + +#endif + +///--------------------------------------------------- +/// @name Keychain Items Accessibility Values +///--------------------------------------------------- + +/** + * Enum with Kechain items accessibility types. It's a mirror of `kSecAttrAccessible` values. + */ +typedef NS_ENUM(NSInteger, A0SimpleKeychainItemAccessible) { + /** + * @see kSecAttrAccessibleWhenUnlocked + */ + A0SimpleKeychainItemAccessibleWhenUnlocked = 0, + /** + * @see kSecAttrAccessibleAfterFirstUnlock + */ + A0SimpleKeychainItemAccessibleAfterFirstUnlock, + /** + * @see kSecAttrAccessibleAlways + */ + A0SimpleKeychainItemAccessibleAlways, + /** + * @see kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly + */ + A0SimpleKeychainItemAccessibleWhenPasscodeSetThisDeviceOnly, + /** + * @see kSecAttrAccessibleWhenUnlockedThisDeviceOnly + */ + A0SimpleKeychainItemAccessibleWhenUnlockedThisDeviceOnly, + /** + * kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly + */ + A0SimpleKeychainItemAccessibleAfterFirstUnlockThisDeviceOnly, + /** + * @see kSecAttrAccessibleAlwaysThisDeviceOnly + */ + A0SimpleKeychainItemAccessibleAlwaysThisDeviceOnly +}; + +#define A0ErrorDomain @"com.auth0.simplekeychain" + +#define A0LocalAuthenticationCapable (TARGET_OS_IOS && __IPHONE_OS_VERSION_MIN_REQUIRED >= 80000) || (TARGET_OS_OSX && __MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_2) + + +/** + * Enum with keychain error codes. It's a mirror of the keychain error codes. + */ +typedef NS_ENUM(NSInteger, A0SimpleKeychainError) { + /** + * @see errSecSuccess + */ + A0SimpleKeychainErrorNoError = 0, + /** + * @see errSecUnimplemented + */ + A0SimpleKeychainErrorUnimplemented = -4, + /** + * @see errSecParam + */ + A0SimpleKeychainErrorWrongParameter = -50, + /** + * @see errSecAllocate + */ + A0SimpleKeychainErrorAllocation = -108, + /** + * @see errSecNotAvailable + */ + A0SimpleKeychainErrorNotAvailable = -25291, + /** + * @see errSecAuthFailed + */ + A0SimpleKeychainErrorAuthFailed = -25293, + /** + * @see errSecDuplicateItem + */ + A0SimpleKeychainErrorDuplicateItem = -25299, + /** + * @see errSecItemNotFound + */ + A0SimpleKeychainErrorItemNotFound = -25300, + /** + * @see errSecInteractionNotAllowed + */ + A0SimpleKeychainErrorInteractionNotAllowed = -25308, + /** + * @see errSecDecode + */ + A0SimpleKeychainErrorDecode = -26275 +}; + +NS_ASSUME_NONNULL_BEGIN + +/** + * A simple helper class to deal with storing and retrieving values from iOS Keychain. + * It has support for sharing keychain items using Access Group and also for iOS 8 fine grained accesibility over a specific Kyechain Item (Using Access Control). + * The support is only available for iOS 8+, otherwise it will default using the coarse grained accesibility field. + * When a `NSString` or `NSData` is stored using Access Control and the accesibility flag `A0SimpleKeychainItemAccessibleWhenPasscodeSetThisDeviceOnly`, iOS will prompt the user for it's passcode or pass a TouchID challenge (if available). + */ +@interface A0SimpleKeychain : NSObject + +/** + * Service name under all items are saved. Default value is Bundle Identifier. + */ +@property (readonly, nonatomic) NSString *service; + +/** + * Access Group for Keychain item sharing. If it's nil no keychain sharing is possible. Default value is nil. + */ +@property (readonly, nullable, nonatomic) NSString *accessGroup; + +/** + * What type of accessibility the items stored will have. All values are translated to `kSecAttrAccessible` constants. + * Default value is A0SimpleKeychainItemAccessibleAfterFirstUnlock. + * @see kSecAttrAccessible + */ +@property (assign, nonatomic) A0SimpleKeychainItemAccessible defaultAccessiblity; + +/** + * Tells A0SimpleKeychain to use `kSecAttrAccessControl` instead of `kSecAttrAccessible`. It will work only in iOS 8+, defaulting to `kSecAttrAccessible` on lower version. + * Default value is NO. + */ +@property (assign, nonatomic) BOOL useAccessControl; + + +/** +* LocalAuthenticationContext used to access items. Default value is a new LAContext object +*/ +#if A0LocalAuthenticationCapable +@property (readonly, nullable, nonatomic) LAContext *localAuthenticationContext; +#endif + +///--------------------------------------------------- +/// @name Initialization +///--------------------------------------------------- + +/** + * Initialise a `A0SimpleKeychain` with default values. + * + * @return an initialised instance + */ +- (instancetype)init; + +/** + * Initialise a `A0SimpleKeychain` with a given service. + * + * @param service name of the service to use to save items. + * + * @return an initialised instance. + */ +- (instancetype)initWithService:(NSString *)service; + +/** + * Initialise a `A0SimpleKeychain` with a given service and access group. + * + * @param service name of the service to use to save items. + * @param accessGroup name of the access group to share items. + * + * @return an initialised instance. + */ +- (instancetype)initWithService:(NSString *)service accessGroup:(nullable NSString *)accessGroup; + +/** + * The duration for which Touch ID authentication reuse is allowable. + * Maximun value is LATouchIDAuthenticationMaximumAllowableReuseDuration + */ +#if A0LocalAuthenticationCapable +- (void)setTouchIDAuthenticationAllowableReuseDuration:(NSTimeInterval) duration API_AVAILABLE(ios(8), macosx(10.12)) API_UNAVAILABLE(watchos, tvos); +#endif + +///--------------------------------------------------- +/// @name Store values +///--------------------------------------------------- + +/** + * Saves the NSString with the type `kSecClassGenericPassword` in the keychain. + * + * @param string value to save in the keychain + * @param key key for the keychain entry. + * + * @return if the value was saved it will return YES. Otherwise it'll return NO. + */ +- (BOOL)setString:(NSString *)string forKey:(NSString *)key; + +/** + * Saves the NSData with the type `kSecClassGenericPassword` in the keychain. + * + * @param data value to save in the keychain + * @param key key for the keychain entry. + * + * @return if the value was saved it will return YES. Otherwise it'll return NO. + */ +- (BOOL)setData:(NSData *)data forKey:(NSString *)key; + +/** + * Saves the NSString with the type `kSecClassGenericPassword` in the keychain. + * + * @param string value to save in the keychain + * @param key key for the keychain entry. + * @param message prompt message to display for TouchID/passcode prompt if neccesary + * + * @return if the value was saved it will return YES. Otherwise it'll return NO. + */ +- (BOOL)setString:(NSString *)string forKey:(NSString *)key promptMessage:(nullable NSString *)message; + +/** + * Saves the NSData with the type `kSecClassGenericPassword` in the keychain. + * + * @param data value to save in the keychain + * @param key key for the keychain entry. + * @param message prompt message to display for TouchID/passcode prompt if neccesary + * + * @return if the value was saved it will return YES. Otherwise it'll return NO. + */ +- (BOOL)setData:(NSData *)data forKey:(NSString *)key promptMessage:(nullable NSString *)message; + +///--------------------------------------------------- +/// @name Remove values +///--------------------------------------------------- + +/** + * Removes an entry from the Keychain using its key + * + * @param key the key of the entry to delete. + * + * @return If the entry was removed it will return YES. Otherwise it will return NO. + */ +- (BOOL)deleteEntryForKey:(NSString *)key; + +/** + * Remove all entries from the kechain with the service and access group values. + */ +- (void)clearAll; + +///--------------------------------------------------- +/// @name Obtain values +///--------------------------------------------------- + +/** + * Fetches a NSString from the keychain + * + * @param key the key of the value to fetch + * + * @return the value or nil if an error occurs. + */ +- (nullable NSString *)stringForKey:(NSString *)key; + +/** + * Fetches a NSData from the keychain + * + * @param key the key of the value to fetch + * + * @return the value or nil if an error occurs. + */ +- (nullable NSData *)dataForKey:(NSString *)key; + +/** + * Fetches a NSString from the keychain + * + * @param key the key of the value to fetch + * @param message prompt message to display for TouchID/passcode prompt if neccesary + * + * @return the value or nil if an error occurs. + */ +- (nullable NSString *)stringForKey:(NSString *)key promptMessage:(nullable NSString *)message; + +/** + * Fetches a NSData from the keychain + * + * @param key the key of the value to fetch + * @param message prompt message to display for TouchID/passcode prompt if neccesary + * + * @return the value or nil if an error occurs. + */ +- (nullable NSData *)dataForKey:(NSString *)key promptMessage:(nullable NSString *)message; + +/** + * Fetches a NSData from the keychain + * + * @param key the key of the value to fetch + * @param message prompt message to display for TouchID/passcode prompt if neccesary + * @param err Returns an error, if the item cannot be retrieved. F.e. item not found + * or user authentication failed in TouchId case. + * + * @return the value or nil if an error occurs. + */ +- (nullable NSData *)dataForKey:(NSString *)key promptMessage:(nullable NSString *)message error:(NSError **)err; + +/** + * Checks if a key has a value in the Keychain + * + * @param key the key to check if it has a value + * + * @return if the key has an associated value in the Keychain or not. + */ +- (BOOL)hasValueForKey:(NSString *)key; + +///--------------------------------------------------- +/// @name Create helper methods +///--------------------------------------------------- + +/** + * Creates a new instance of `A0SimpleKeychain` + * + * @return a new instance + */ ++ (A0SimpleKeychain *)keychain; + +/** + * Creates a new instance of `A0SimpleKeychain` with a service name. + * + * @param service name of the service under all items will be stored. + * + * @return a new instance + */ ++ (A0SimpleKeychain *)keychainWithService:(NSString *)service; + +/** + * Creates a new instance of `A0SimpleKeychain` with a service name and access group + * + * @param service name of the service under all items will be stored. + * @param accessGroup name of the access group to share keychain items. + * + * @return a new instance + */ ++ (A0SimpleKeychain *)keychainWithService:(NSString *)service accessGroup:(NSString *)accessGroup; + +@end + +NS_ASSUME_NONNULL_END diff --git a/TracMobility/Pods/SimpleKeychain/SimpleKeychain/A0SimpleKeychain.m b/TracMobility/Pods/SimpleKeychain/SimpleKeychain/A0SimpleKeychain.m new file mode 100755 index 0000000..d4f423c --- /dev/null +++ b/TracMobility/Pods/SimpleKeychain/SimpleKeychain/A0SimpleKeychain.m @@ -0,0 +1,400 @@ +// A0SimpleKeychain.h +// +// Copyright (c) 2014 Auth0 (http://auth0.com) +// +// 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 "A0SimpleKeychain.h" + +@interface A0SimpleKeychain () + +@end + +@implementation A0SimpleKeychain + +- (instancetype)init { + NSString *service = [[NSBundle mainBundle] bundleIdentifier]; + return [self initWithService:service accessGroup:nil]; +} + +- (instancetype)initWithService:(NSString *)service { + return [self initWithService:service accessGroup:nil]; +} + +- (instancetype)initWithService:(NSString *)service accessGroup:(NSString *)accessGroup { + self = [super init]; + if (self) { + _service = service; + _accessGroup = accessGroup; + _defaultAccessiblity = A0SimpleKeychainItemAccessibleAfterFirstUnlock; + _useAccessControl = NO; + +// This does not apply to watchOS & tvOS +#if A0LocalAuthenticationCapable + _localAuthenticationContext = [LAContext new]; + _localAuthenticationContext.touchIDAuthenticationAllowableReuseDuration = 0; +#endif + } + return self; +} + +- (void)setTouchIDAuthenticationAllowableReuseDuration:(NSTimeInterval) duration { +// This does not apply to watchOS & tvOS +#if A0LocalAuthenticationCapable + if (duration <= 0) { + _localAuthenticationContext.touchIDAuthenticationAllowableReuseDuration = 0; + } else if (duration >= LATouchIDAuthenticationMaximumAllowableReuseDuration) { + _localAuthenticationContext.touchIDAuthenticationAllowableReuseDuration = LATouchIDAuthenticationMaximumAllowableReuseDuration; + } else { + _localAuthenticationContext.touchIDAuthenticationAllowableReuseDuration = duration; + } +#endif +} + +- (NSString *)stringForKey:(NSString *)key { + return [self stringForKey:key promptMessage:nil]; +} + +- (NSData *)dataForKey:(NSString *)key { + return [self dataForKey:key promptMessage:nil]; +} + +- (NSString *)stringForKey:(NSString *)key promptMessage:(NSString *)message { + NSData *data = [self dataForKey:key promptMessage:message]; + NSString *string = nil; + if (data) { + string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; + } + return string; +} + +- (NSData *)dataForKey:(NSString *)key promptMessage:(NSString *)message { + return [self dataForKey:key promptMessage:message error:nil]; +} + +- (NSData *)dataForKey:(NSString *)key promptMessage:(NSString *)message error:(NSError**)err { + if (!key) { + return nil; + } + + NSDictionary *query = [self queryFetchOneByKey:key message:message]; + CFTypeRef data = nil; + OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)query, &data); + if (status != errSecSuccess) { + if(err != nil) { + *err = [NSError errorWithDomain:A0ErrorDomain code:status userInfo:@{NSLocalizedDescriptionKey : [self stringForSecStatus:status]}]; + } + return nil; + } + + NSData *dataFound = [NSData dataWithData:(__bridge NSData *)data]; + if (data) { + CFRelease(data); + } + + return dataFound; +} + +- (BOOL)hasValueForKey:(NSString *)key { + if (!key) { + return NO; + } + NSDictionary *query = [self queryFindByKey:key message:nil]; + OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)query, NULL); + return status == errSecSuccess; +} + +- (BOOL)setString:(NSString *)string forKey:(NSString *)key { + return [self setString:string forKey:key promptMessage:nil]; +} + +- (BOOL)setData:(NSData *)data forKey:(NSString *)key { + return [self setData:data forKey:key promptMessage:nil]; +} + +- (BOOL)setString:(NSString *)string forKey:(NSString *)key promptMessage:(NSString *)message { + NSData *data = key ? [string dataUsingEncoding:NSUTF8StringEncoding] : nil; + return [self setData:data forKey:key promptMessage:message]; +} + + +- (BOOL)setData:(NSData *)data forKey:(NSString *)key promptMessage:(NSString *)message { + if (!key) { + return NO; + } + + NSDictionary *query = [self queryFindByKey:key message:message]; + + // Touch ID case + if (self.useAccessControl && self.defaultAccessiblity == A0SimpleKeychainItemAccessibleWhenPasscodeSetThisDeviceOnly) { + // TouchId case. Doesn't support updating keychain items + // see Known Issues: https://developer.apple.com/library/ios/releasenotes/General/RN-iOSSDK-8.0/ + // We need to delete old and add a new item. This can fail + OSStatus status = SecItemDelete((__bridge CFDictionaryRef)query); + if (status == errSecSuccess || status == errSecItemNotFound) { + NSDictionary *newQuery = [self queryNewKey:key value:data]; + OSStatus status = SecItemAdd((__bridge CFDictionaryRef)newQuery, NULL); + return status == errSecSuccess; + } + } + + // Normal case + OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)query, NULL); + if (status == errSecSuccess) { + if (data) { + NSDictionary *updateQuery = [self queryUpdateValue:data message:message]; + status = SecItemUpdate((__bridge CFDictionaryRef)query, (__bridge CFDictionaryRef)updateQuery); + return status == errSecSuccess; + } else { + OSStatus status = SecItemDelete((__bridge CFDictionaryRef)query); + return status == errSecSuccess; + } + } else { + NSDictionary *newQuery = [self queryNewKey:key value:data]; + OSStatus status = SecItemAdd((__bridge CFDictionaryRef)newQuery, NULL); + return status == errSecSuccess; + } +} + +- (BOOL)deleteEntryForKey:(NSString *)key { + if (!key) { + return NO; + } + NSDictionary *deleteQuery = [self queryFindByKey:key message:nil]; + OSStatus status = SecItemDelete((__bridge CFDictionaryRef)deleteQuery); + return status == errSecSuccess; +} + +- (void)clearAll { +#if TARGET_OS_IPHONE + NSDictionary *query = [self queryFindAll]; + CFArrayRef result = nil; + OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)query, (CFTypeRef *)&result); + if (status == errSecSuccess || status == errSecItemNotFound) { + NSArray *items = [NSArray arrayWithArray:(__bridge NSArray *)result]; + CFBridgingRelease(result); + for (NSDictionary *item in items) { + NSMutableDictionary *queryDelete = [[NSMutableDictionary alloc] initWithDictionary:item]; + queryDelete[(__bridge id)kSecClass] = (__bridge id)kSecClassGenericPassword; + + OSStatus status = SecItemDelete((__bridge CFDictionaryRef)queryDelete); + if (status != errSecSuccess) { + break; + } + } + } +#else + NSMutableDictionary *queryDelete = [self baseQuery]; + queryDelete[(__bridge id)kSecClass] = (__bridge id)kSecClassGenericPassword; + queryDelete[(__bridge id)kSecMatchLimit] = (__bridge id)kSecMatchLimitAll; + OSStatus status = SecItemDelete((__bridge CFDictionaryRef)queryDelete); + if (status != errSecSuccess) { + return; + } +#endif +} + ++ (A0SimpleKeychain *)keychain { + return [[A0SimpleKeychain alloc] init]; +} + ++ (A0SimpleKeychain *)keychainWithService:(NSString *)service { + return [[A0SimpleKeychain alloc] initWithService:service]; +} + ++ (A0SimpleKeychain *)keychainWithService:(NSString *)service accessGroup:(NSString *)accessGroup { + return [[A0SimpleKeychain alloc] initWithService:service accessGroup:accessGroup]; +} + +#pragma mark - Utility methods + +- (CFTypeRef)accessibility { + CFTypeRef accessibility; + switch (self.defaultAccessiblity) { + case A0SimpleKeychainItemAccessibleAfterFirstUnlock: + accessibility = kSecAttrAccessibleAfterFirstUnlock; + break; + case A0SimpleKeychainItemAccessibleAlways: + accessibility = kSecAttrAccessibleAlways; + break; + case A0SimpleKeychainItemAccessibleAfterFirstUnlockThisDeviceOnly: + accessibility = kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly; + break; + case A0SimpleKeychainItemAccessibleAlwaysThisDeviceOnly: + accessibility = kSecAttrAccessibleAlwaysThisDeviceOnly; + break; +#if TARGET_OS_IPHONE + case A0SimpleKeychainItemAccessibleWhenPasscodeSetThisDeviceOnly: +#ifdef __IPHONE_8_0 + if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_7_1) { //iOS 8 + accessibility = kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly; + } else { //iOS <= 7.1 + accessibility = kSecAttrAccessibleWhenUnlockedThisDeviceOnly; + } +#else + accessibility = kSecAttrAccessibleWhenUnlockedThisDeviceOnly; +#endif +#endif + break; + case A0SimpleKeychainItemAccessibleWhenUnlocked: + accessibility = kSecAttrAccessibleWhenUnlocked; + break; + case A0SimpleKeychainItemAccessibleWhenUnlockedThisDeviceOnly: + accessibility = kSecAttrAccessibleWhenUnlockedThisDeviceOnly; + break; + default: + accessibility = kSecAttrAccessibleWhenUnlockedThisDeviceOnly; + } + return accessibility; +} + +- (NSString*)stringForSecStatus:(OSStatus)status { + + switch(status) { + case errSecSuccess: + return NSLocalizedStringFromTable(@"errSecSuccess: No error", @"SimpleKeychain", @"Possible error from keychain. "); + case errSecUnimplemented: + return NSLocalizedStringFromTable(@"errSecUnimplemented: Function or operation not implemented", @"SimpleKeychain", @"Possible error from keychain. "); + case errSecParam: + return NSLocalizedStringFromTable(@"errSecParam: One or more parameters passed to the function were not valid", @"SimpleKeychain", @"Possible error from keychain. "); + case errSecAllocate: + return NSLocalizedStringFromTable(@"errSecAllocate: Failed to allocate memory", @"SimpleKeychain", @"Possible error from keychain. "); + case errSecNotAvailable: + return NSLocalizedStringFromTable(@"errSecNotAvailable: No trust results are available", @"SimpleKeychain", @"Possible error from keychain. "); + case errSecAuthFailed: + return NSLocalizedStringFromTable(@"errSecAuthFailed: Authorization/Authentication failed", @"SimpleKeychain", @"Possible error from keychain. "); + case errSecDuplicateItem: + return NSLocalizedStringFromTable(@"errSecDuplicateItem: The item already exists", @"SimpleKeychain", @"Possible error from keychain. "); + case errSecItemNotFound: + return NSLocalizedStringFromTable(@"errSecItemNotFound: The item cannot be found", @"SimpleKeychain", @"Possible error from keychain. "); + case errSecInteractionNotAllowed: + return NSLocalizedStringFromTable(@"errSecInteractionNotAllowed: Interaction with the Security Server is not allowed", @"SimpleKeychain", @"Possible error from keychain. "); + case errSecDecode: + return NSLocalizedStringFromTable(@"errSecDecode: Unable to decode the provided data", @"SimpleKeychain", @"Possible error from keychain. "); + default: + return [NSString stringWithFormat:NSLocalizedStringFromTable(@"Unknown error code %d", @"SimpleKeychain", @"Possible error from keychain. "), status]; + } +} + +#pragma mark - Query Dictionary Builder methods + +- (NSMutableDictionary *)baseQuery { + NSMutableDictionary *attributes = [@{ + (__bridge id)kSecClass: (__bridge id)kSecClassGenericPassword, + (__bridge id)kSecAttrService: self.service, + (__bridge id)kSecUseAuthenticationUI: (__bridge id)kSecUseAuthenticationUIAllow, + } mutableCopy]; + +#if !TARGET_IPHONE_SIMULATOR + if (self.accessGroup) { + attributes[(__bridge id)kSecAttrAccessGroup] = self.accessGroup; + } + +#if A0LocalAuthenticationCapable + attributes[(__bridge id)kSecUseAuthenticationContext] = self.localAuthenticationContext; +#endif +#endif + + return attributes; +} + +- (NSDictionary *)queryFindAll { + NSMutableDictionary *query = [self baseQuery]; + [query addEntriesFromDictionary:@{ + (__bridge id)kSecReturnAttributes: @YES, + (__bridge id)kSecMatchLimit: (__bridge id)kSecMatchLimitAll, + }]; + return query; +} + +- (NSDictionary *)queryFindByKey:(NSString *)key message:(NSString *)message { + NSAssert(key != nil, @"Must have a valid non-nil key"); + NSMutableDictionary *query = [self baseQuery]; + query[(__bridge id)kSecAttrAccount] = key; +#if TARGET_OS_IPHONE + if (message) { + query[(__bridge id)kSecUseOperationPrompt] = message; + } +#endif + return query; +} + +- (NSDictionary *)queryUpdateValue:(NSData *)data message:(NSString *)message { + if (message) { + return @{ +#if TARGET_OS_IPHONE + (__bridge id)kSecUseOperationPrompt: message, +#endif + (__bridge id)kSecValueData: data, + }; + } else { + return @{ + (__bridge id)kSecValueData: data, + }; + } +} + +- (NSDictionary *)queryNewKey:(NSString *)key value:(NSData *)value { + NSMutableDictionary *query = [self baseQuery]; + query[(__bridge id)kSecAttrAccount] = key; + query[(__bridge id)kSecValueData] = value; +#if TARGET_OS_IPHONE +#ifdef __IPHONE_8_0 + if (self.useAccessControl && floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_7_1) { + CFErrorRef error = NULL; + SecAccessControlRef accessControl = SecAccessControlCreateWithFlags(kCFAllocatorDefault, [self accessibility], kSecAccessControlUserPresence, &error); + if (error == NULL || accessControl != NULL) { + query[(__bridge id)kSecAttrAccessControl] = (__bridge_transfer id)accessControl; +#if defined __MAC_10_12 || defined __IPHONE_11_0 + // This also applies to watchOS & tvOS + if (@available(iOS 9, *)) { + query[(__bridge id)kSecUseAuthenticationUI] = (__bridge_transfer id)kSecUseAuthenticationUIFail; + } +#else + query[(__bridge id)kSecUseNoAuthenticationUI] = @YES; +#endif + } + } else { + query[(__bridge id)kSecAttrAccessible] = (__bridge id)[self accessibility]; + } +#else + query[(__bridge id)kSecAttrAccessible] = (__bridge id)[self accessibility]; +#endif +#endif + return query; +} + +- (NSDictionary *)queryFetchOneByKey:(NSString *)key message:(NSString *)message { + NSMutableDictionary *query = [self baseQuery]; + [query addEntriesFromDictionary:@{ + (__bridge id)kSecReturnData: @YES, + (__bridge id)kSecMatchLimit: (__bridge id)kSecMatchLimitOne, + (__bridge id)kSecAttrAccount: key, + }]; +#if TARGET_OS_IPHONE + if (self.useAccessControl) { + if (message && floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_7_1) { + query[(__bridge id)kSecUseOperationPrompt] = message; + } + } +#endif + + return query; +} +@end diff --git a/TracMobility/Pods/SimpleKeychain/SimpleKeychain/SimpleKeychain.h b/TracMobility/Pods/SimpleKeychain/SimpleKeychain/SimpleKeychain.h new file mode 100644 index 0000000..fa87222 --- /dev/null +++ b/TracMobility/Pods/SimpleKeychain/SimpleKeychain/SimpleKeychain.h @@ -0,0 +1,34 @@ +// SimpleKeychain.h +// +// Copyright (c) 2014 Auth0 (http://auth0.com) +// +// 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 + +//! Project version number for SimpleKeychain. +FOUNDATION_EXPORT double SimpleKeychainVersionNumber; + +//! Project version string for SimpleKeychain. +FOUNDATION_EXPORT const unsigned char SimpleKeychainVersionString[]; + +// In this header, you should import all the public headers of your framework using statements like #import + +#import +#import diff --git a/TracMobility/Pods/Target Support Files/Auth0/Auth0-Info.plist b/TracMobility/Pods/Target Support Files/Auth0/Auth0-Info.plist new file mode 100644 index 0000000..9966439 --- /dev/null +++ b/TracMobility/Pods/Target Support Files/Auth0/Auth0-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.30.1 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/TracMobility/Pods/Target Support Files/Auth0/Auth0-dummy.m b/TracMobility/Pods/Target Support Files/Auth0/Auth0-dummy.m new file mode 100644 index 0000000..53e4a3c --- /dev/null +++ b/TracMobility/Pods/Target Support Files/Auth0/Auth0-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_Auth0 : NSObject +@end +@implementation PodsDummy_Auth0 +@end diff --git a/TracMobility/Pods/Target Support Files/Auth0/Auth0-prefix.pch b/TracMobility/Pods/Target Support Files/Auth0/Auth0-prefix.pch new file mode 100644 index 0000000..beb2a24 --- /dev/null +++ b/TracMobility/Pods/Target Support Files/Auth0/Auth0-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/TracMobility/Pods/Target Support Files/Auth0/Auth0-umbrella.h b/TracMobility/Pods/Target Support Files/Auth0/Auth0-umbrella.h new file mode 100644 index 0000000..322d937 --- /dev/null +++ b/TracMobility/Pods/Target Support Files/Auth0/Auth0-umbrella.h @@ -0,0 +1,20 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + +#import "Auth0.h" +#import "A0ChallengeGenerator.h" +#import "A0RSA.h" +#import "A0SHA.h" + +FOUNDATION_EXPORT double Auth0VersionNumber; +FOUNDATION_EXPORT const unsigned char Auth0VersionString[]; + diff --git a/TracMobility/Pods/Target Support Files/Auth0/Auth0.debug.xcconfig b/TracMobility/Pods/Target Support Files/Auth0/Auth0.debug.xcconfig new file mode 100644 index 0000000..966b662 --- /dev/null +++ b/TracMobility/Pods/Target Support Files/Auth0/Auth0.debug.xcconfig @@ -0,0 +1,13 @@ +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/Auth0 +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/JWTDecode" "${PODS_CONFIGURATION_BUILD_DIR}/SimpleKeychain" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 $(inherited) WEB_AUTH_PLATFORM=1 +OTHER_LDFLAGS = $(inherited) -framework "LocalAuthentication" -framework "SafariServices" -framework "UIKit" -weak_framework "AuthenticationServices" +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}/Auth0 +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +SWIFT_ACTIVE_COMPILATION_CONDITIONS = WEB_AUTH_PLATFORM +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/TracMobility/Pods/Target Support Files/Auth0/Auth0.modulemap b/TracMobility/Pods/Target Support Files/Auth0/Auth0.modulemap new file mode 100644 index 0000000..eff6b15 --- /dev/null +++ b/TracMobility/Pods/Target Support Files/Auth0/Auth0.modulemap @@ -0,0 +1,6 @@ +framework module Auth0 { + umbrella header "Auth0-umbrella.h" + + export * + module * { export * } +} diff --git a/TracMobility/Pods/Target Support Files/Auth0/Auth0.release.xcconfig b/TracMobility/Pods/Target Support Files/Auth0/Auth0.release.xcconfig new file mode 100644 index 0000000..966b662 --- /dev/null +++ b/TracMobility/Pods/Target Support Files/Auth0/Auth0.release.xcconfig @@ -0,0 +1,13 @@ +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/Auth0 +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/JWTDecode" "${PODS_CONFIGURATION_BUILD_DIR}/SimpleKeychain" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 $(inherited) WEB_AUTH_PLATFORM=1 +OTHER_LDFLAGS = $(inherited) -framework "LocalAuthentication" -framework "SafariServices" -framework "UIKit" -weak_framework "AuthenticationServices" +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}/Auth0 +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +SWIFT_ACTIVE_COMPILATION_CONDITIONS = WEB_AUTH_PLATFORM +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/TracMobility/Pods/Target Support Files/GoogleMaps/GoogleMaps.debug.xcconfig b/TracMobility/Pods/Target Support Files/GoogleMaps/GoogleMaps.debug.xcconfig new file mode 100644 index 0000000..4f0a2e6 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/Target Support Files/GoogleMaps/GoogleMaps.release.xcconfig b/TracMobility/Pods/Target Support Files/GoogleMaps/GoogleMaps.release.xcconfig new file mode 100644 index 0000000..4f0a2e6 --- /dev/null +++ b/TracMobility/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/TracMobility/Pods/Target Support Files/JWTDecode/JWTDecode-Info.plist b/TracMobility/Pods/Target Support Files/JWTDecode/JWTDecode-Info.plist new file mode 100644 index 0000000..d4fb73c --- /dev/null +++ b/TracMobility/Pods/Target Support Files/JWTDecode/JWTDecode-Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 2.6.0 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/TracMobility/Pods/Target Support Files/JWTDecode/JWTDecode-dummy.m b/TracMobility/Pods/Target Support Files/JWTDecode/JWTDecode-dummy.m new file mode 100644 index 0000000..8c89c03 --- /dev/null +++ b/TracMobility/Pods/Target Support Files/JWTDecode/JWTDecode-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_JWTDecode : NSObject +@end +@implementation PodsDummy_JWTDecode +@end diff --git a/TracMobility/Pods/Target Support Files/JWTDecode/JWTDecode-prefix.pch b/TracMobility/Pods/Target Support Files/JWTDecode/JWTDecode-prefix.pch new file mode 100644 index 0000000..beb2a24 --- /dev/null +++ b/TracMobility/Pods/Target Support Files/JWTDecode/JWTDecode-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/TracMobility/Pods/Target Support Files/JWTDecode/JWTDecode-umbrella.h b/TracMobility/Pods/Target Support Files/JWTDecode/JWTDecode-umbrella.h new file mode 100644 index 0000000..9fffff3 --- /dev/null +++ b/TracMobility/Pods/Target Support Files/JWTDecode/JWTDecode-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 JWTDecodeVersionNumber; +FOUNDATION_EXPORT const unsigned char JWTDecodeVersionString[]; + diff --git a/TracMobility/Pods/Target Support Files/JWTDecode/JWTDecode.debug.xcconfig b/TracMobility/Pods/Target Support Files/JWTDecode/JWTDecode.debug.xcconfig new file mode 100644 index 0000000..635a27b --- /dev/null +++ b/TracMobility/Pods/Target Support Files/JWTDecode/JWTDecode.debug.xcconfig @@ -0,0 +1,10 @@ +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/JWTDecode +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +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}/JWTDecode +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/TracMobility/Pods/Target Support Files/JWTDecode/JWTDecode.modulemap b/TracMobility/Pods/Target Support Files/JWTDecode/JWTDecode.modulemap new file mode 100644 index 0000000..dfb00d7 --- /dev/null +++ b/TracMobility/Pods/Target Support Files/JWTDecode/JWTDecode.modulemap @@ -0,0 +1,6 @@ +framework module JWTDecode { + umbrella header "JWTDecode-umbrella.h" + + export * + module * { export * } +} diff --git a/TracMobility/Pods/Target Support Files/JWTDecode/JWTDecode.release.xcconfig b/TracMobility/Pods/Target Support Files/JWTDecode/JWTDecode.release.xcconfig new file mode 100644 index 0000000..635a27b --- /dev/null +++ b/TracMobility/Pods/Target Support Files/JWTDecode/JWTDecode.release.xcconfig @@ -0,0 +1,10 @@ +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/JWTDecode +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +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}/JWTDecode +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/TracMobility/Pods/Target Support Files/Pods-TracMobility/Pods-TracMobility-Info.plist b/TracMobility/Pods/Target Support Files/Pods-TracMobility/Pods-TracMobility-Info.plist new file mode 100644 index 0000000..2243fe6 --- /dev/null +++ b/TracMobility/Pods/Target Support Files/Pods-TracMobility/Pods-TracMobility-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/TracMobility/Pods/Target Support Files/Pods-TracMobility/Pods-TracMobility-acknowledgements.markdown b/TracMobility/Pods/Target Support Files/Pods-TracMobility/Pods-TracMobility-acknowledgements.markdown new file mode 100644 index 0000000..d8fe3e6 --- /dev/null +++ b/TracMobility/Pods/Target Support Files/Pods-TracMobility/Pods-TracMobility-acknowledgements.markdown @@ -0,0 +1,105 @@ +# Acknowledgements +This application makes use of the following third party libraries: + +## Auth0 + +The MIT License (MIT) + +Copyright (c) 2016 Auth0, Inc. (http://auth0.com) + +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. + + + +## GoogleMaps + +Copyright 2020 Google + +## JWTDecode + +The MIT License (MIT) + +Copyright (c) 2014 Auth0, Inc. (http://auth0.com) + +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. + + +## SideMenu + +Copyright (c) 2015 Jonathan Kent + +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. + + +## SimpleKeychain + +The MIT License (MIT) + +Copyright (c) 2014 Auth0 LLC + +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. +Generated by CocoaPods - https://cocoapods.org diff --git a/TracMobility/Pods/Target Support Files/Pods-TracMobility/Pods-TracMobility-acknowledgements.plist b/TracMobility/Pods/Target Support Files/Pods-TracMobility/Pods-TracMobility-acknowledgements.plist new file mode 100644 index 0000000..c501300 --- /dev/null +++ b/TracMobility/Pods/Target Support Files/Pods-TracMobility/Pods-TracMobility-acknowledgements.plist @@ -0,0 +1,161 @@ + + + + + PreferenceSpecifiers + + + FooterText + This application makes use of the following third party libraries: + Title + Acknowledgements + Type + PSGroupSpecifier + + + FooterText + The MIT License (MIT) + +Copyright (c) 2016 Auth0, Inc. <support@auth0.com> (http://auth0.com) + +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 + Auth0 + Type + PSGroupSpecifier + + + FooterText + Copyright 2020 Google + License + Copyright + Title + GoogleMaps + Type + PSGroupSpecifier + + + FooterText + The MIT License (MIT) + +Copyright (c) 2014 Auth0, Inc. <support@auth0.com> (http://auth0.com) + +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 + JWTDecode + Type + PSGroupSpecifier + + + FooterText + Copyright (c) 2015 Jonathan Kent <contact@jonkent.me> + +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 + SideMenu + Type + PSGroupSpecifier + + + FooterText + The MIT License (MIT) + +Copyright (c) 2014 Auth0 LLC + +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 + SimpleKeychain + Type + PSGroupSpecifier + + + FooterText + Generated by CocoaPods - https://cocoapods.org + Title + + Type + PSGroupSpecifier + + + StringsTable + Acknowledgements + Title + Acknowledgements + + diff --git a/TracMobility/Pods/Target Support Files/Pods-TracMobility/Pods-TracMobility-dummy.m b/TracMobility/Pods/Target Support Files/Pods-TracMobility/Pods-TracMobility-dummy.m new file mode 100644 index 0000000..8c52a0f --- /dev/null +++ b/TracMobility/Pods/Target Support Files/Pods-TracMobility/Pods-TracMobility-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_Pods_TracMobility : NSObject +@end +@implementation PodsDummy_Pods_TracMobility +@end diff --git a/TracMobility/Pods/Target Support Files/Pods-TracMobility/Pods-TracMobility-frameworks-Debug-input-files.xcfilelist b/TracMobility/Pods/Target Support Files/Pods-TracMobility/Pods-TracMobility-frameworks-Debug-input-files.xcfilelist new file mode 100644 index 0000000..42d33fc --- /dev/null +++ b/TracMobility/Pods/Target Support Files/Pods-TracMobility/Pods-TracMobility-frameworks-Debug-input-files.xcfilelist @@ -0,0 +1,5 @@ +${PODS_ROOT}/Target Support Files/Pods-TracMobility/Pods-TracMobility-frameworks.sh +${BUILT_PRODUCTS_DIR}/Auth0/Auth0.framework +${BUILT_PRODUCTS_DIR}/JWTDecode/JWTDecode.framework +${BUILT_PRODUCTS_DIR}/SideMenu/SideMenu.framework +${BUILT_PRODUCTS_DIR}/SimpleKeychain/SimpleKeychain.framework \ No newline at end of file diff --git a/TracMobility/Pods/Target Support Files/Pods-TracMobility/Pods-TracMobility-frameworks-Debug-output-files.xcfilelist b/TracMobility/Pods/Target Support Files/Pods-TracMobility/Pods-TracMobility-frameworks-Debug-output-files.xcfilelist new file mode 100644 index 0000000..8db3f56 --- /dev/null +++ b/TracMobility/Pods/Target Support Files/Pods-TracMobility/Pods-TracMobility-frameworks-Debug-output-files.xcfilelist @@ -0,0 +1,4 @@ +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Auth0.framework +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/JWTDecode.framework +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SideMenu.framework +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SimpleKeychain.framework \ No newline at end of file diff --git a/TracMobility/Pods/Target Support Files/Pods-TracMobility/Pods-TracMobility-frameworks-Release-input-files.xcfilelist b/TracMobility/Pods/Target Support Files/Pods-TracMobility/Pods-TracMobility-frameworks-Release-input-files.xcfilelist new file mode 100644 index 0000000..42d33fc --- /dev/null +++ b/TracMobility/Pods/Target Support Files/Pods-TracMobility/Pods-TracMobility-frameworks-Release-input-files.xcfilelist @@ -0,0 +1,5 @@ +${PODS_ROOT}/Target Support Files/Pods-TracMobility/Pods-TracMobility-frameworks.sh +${BUILT_PRODUCTS_DIR}/Auth0/Auth0.framework +${BUILT_PRODUCTS_DIR}/JWTDecode/JWTDecode.framework +${BUILT_PRODUCTS_DIR}/SideMenu/SideMenu.framework +${BUILT_PRODUCTS_DIR}/SimpleKeychain/SimpleKeychain.framework \ No newline at end of file diff --git a/TracMobility/Pods/Target Support Files/Pods-TracMobility/Pods-TracMobility-frameworks-Release-output-files.xcfilelist b/TracMobility/Pods/Target Support Files/Pods-TracMobility/Pods-TracMobility-frameworks-Release-output-files.xcfilelist new file mode 100644 index 0000000..8db3f56 --- /dev/null +++ b/TracMobility/Pods/Target Support Files/Pods-TracMobility/Pods-TracMobility-frameworks-Release-output-files.xcfilelist @@ -0,0 +1,4 @@ +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Auth0.framework +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/JWTDecode.framework +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SideMenu.framework +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SimpleKeychain.framework \ No newline at end of file diff --git a/TracMobility/Pods/Target Support Files/Pods-TracMobility/Pods-TracMobility-frameworks.sh b/TracMobility/Pods/Target Support Files/Pods-TracMobility/Pods-TracMobility-frameworks.sh new file mode 100755 index 0000000..5ee4148 --- /dev/null +++ b/TracMobility/Pods/Target Support Files/Pods-TracMobility/Pods-TracMobility-frameworks.sh @@ -0,0 +1,213 @@ +#!/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}/Auth0/Auth0.framework" + install_framework "${BUILT_PRODUCTS_DIR}/JWTDecode/JWTDecode.framework" + install_framework "${BUILT_PRODUCTS_DIR}/SideMenu/SideMenu.framework" + install_framework "${BUILT_PRODUCTS_DIR}/SimpleKeychain/SimpleKeychain.framework" +fi +if [[ "$CONFIGURATION" == "Release" ]]; then + install_framework "${BUILT_PRODUCTS_DIR}/Auth0/Auth0.framework" + install_framework "${BUILT_PRODUCTS_DIR}/JWTDecode/JWTDecode.framework" + install_framework "${BUILT_PRODUCTS_DIR}/SideMenu/SideMenu.framework" + install_framework "${BUILT_PRODUCTS_DIR}/SimpleKeychain/SimpleKeychain.framework" +fi +if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then + wait +fi diff --git a/TracMobility/Pods/Target Support Files/Pods-TracMobility/Pods-TracMobility-resources-Debug-input-files.xcfilelist b/TracMobility/Pods/Target Support Files/Pods-TracMobility/Pods-TracMobility-resources-Debug-input-files.xcfilelist new file mode 100644 index 0000000..6032e27 --- /dev/null +++ b/TracMobility/Pods/Target Support Files/Pods-TracMobility/Pods-TracMobility-resources-Debug-input-files.xcfilelist @@ -0,0 +1,2 @@ +${PODS_ROOT}/Target Support Files/Pods-TracMobility/Pods-TracMobility-resources.sh +${PODS_ROOT}/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle \ No newline at end of file diff --git a/TracMobility/Pods/Target Support Files/Pods-TracMobility/Pods-TracMobility-resources-Debug-output-files.xcfilelist b/TracMobility/Pods/Target Support Files/Pods-TracMobility/Pods-TracMobility-resources-Debug-output-files.xcfilelist new file mode 100644 index 0000000..03a514f --- /dev/null +++ b/TracMobility/Pods/Target Support Files/Pods-TracMobility/Pods-TracMobility-resources-Debug-output-files.xcfilelist @@ -0,0 +1 @@ +${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/GoogleMaps.bundle \ No newline at end of file diff --git a/TracMobility/Pods/Target Support Files/Pods-TracMobility/Pods-TracMobility-resources-Release-input-files.xcfilelist b/TracMobility/Pods/Target Support Files/Pods-TracMobility/Pods-TracMobility-resources-Release-input-files.xcfilelist new file mode 100644 index 0000000..6032e27 --- /dev/null +++ b/TracMobility/Pods/Target Support Files/Pods-TracMobility/Pods-TracMobility-resources-Release-input-files.xcfilelist @@ -0,0 +1,2 @@ +${PODS_ROOT}/Target Support Files/Pods-TracMobility/Pods-TracMobility-resources.sh +${PODS_ROOT}/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle \ No newline at end of file diff --git a/TracMobility/Pods/Target Support Files/Pods-TracMobility/Pods-TracMobility-resources-Release-output-files.xcfilelist b/TracMobility/Pods/Target Support Files/Pods-TracMobility/Pods-TracMobility-resources-Release-output-files.xcfilelist new file mode 100644 index 0000000..03a514f --- /dev/null +++ b/TracMobility/Pods/Target Support Files/Pods-TracMobility/Pods-TracMobility-resources-Release-output-files.xcfilelist @@ -0,0 +1 @@ +${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/GoogleMaps.bundle \ No newline at end of file diff --git a/TracMobility/Pods/Target Support Files/Pods-TracMobility/Pods-TracMobility-resources.sh b/TracMobility/Pods/Target Support Files/Pods-TracMobility/Pods-TracMobility-resources.sh new file mode 100755 index 0000000..4836ce8 --- /dev/null +++ b/TracMobility/Pods/Target Support Files/Pods-TracMobility/Pods-TracMobility-resources.sh @@ -0,0 +1,129 @@ +#!/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" +fi +if [[ "$CONFIGURATION" == "Release" ]]; then + install_resource "${PODS_ROOT}/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.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/TracMobility/Pods/Target Support Files/Pods-TracMobility/Pods-TracMobility-umbrella.h b/TracMobility/Pods/Target Support Files/Pods-TracMobility/Pods-TracMobility-umbrella.h new file mode 100644 index 0000000..924845d --- /dev/null +++ b/TracMobility/Pods/Target Support Files/Pods-TracMobility/Pods-TracMobility-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_TracMobilityVersionNumber; +FOUNDATION_EXPORT const unsigned char Pods_TracMobilityVersionString[]; + diff --git a/TracMobility/Pods/Target Support Files/Pods-TracMobility/Pods-TracMobility.debug.xcconfig b/TracMobility/Pods/Target Support Files/Pods-TracMobility/Pods-TracMobility.debug.xcconfig new file mode 100644 index 0000000..ab77524 --- /dev/null +++ b/TracMobility/Pods/Target Support Files/Pods-TracMobility/Pods-TracMobility.debug.xcconfig @@ -0,0 +1,12 @@ +ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Auth0" "${PODS_CONFIGURATION_BUILD_DIR}/JWTDecode" "${PODS_CONFIGURATION_BUILD_DIR}/SideMenu" "${PODS_CONFIGURATION_BUILD_DIR}/SimpleKeychain" "${PODS_ROOT}/GoogleMaps/Base/Frameworks" "${PODS_ROOT}/GoogleMaps/Maps/Frameworks" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Auth0/Auth0.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/JWTDecode/JWTDecode.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SideMenu/SideMenu.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SimpleKeychain/SimpleKeychain.framework/Headers" +LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' +OTHER_LDFLAGS = $(inherited) -ObjC -l"c++" -l"z" -framework "Accelerate" -framework "Auth0" -framework "CoreData" -framework "CoreGraphics" -framework "CoreImage" -framework "CoreLocation" -framework "CoreTelephony" -framework "CoreText" -framework "GLKit" -framework "GoogleMaps" -framework "GoogleMapsBase" -framework "GoogleMapsCore" -framework "ImageIO" -framework "JWTDecode" -framework "LocalAuthentication" -framework "Metal" -framework "OpenGLES" -framework "QuartzCore" -framework "SafariServices" -framework "SideMenu" -framework "SimpleKeychain" -framework "SystemConfiguration" -framework "UIKit" -weak_framework "AuthenticationServices" +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/TracMobility/Pods/Target Support Files/Pods-TracMobility/Pods-TracMobility.modulemap b/TracMobility/Pods/Target Support Files/Pods-TracMobility/Pods-TracMobility.modulemap new file mode 100644 index 0000000..b3bd3d0 --- /dev/null +++ b/TracMobility/Pods/Target Support Files/Pods-TracMobility/Pods-TracMobility.modulemap @@ -0,0 +1,6 @@ +framework module Pods_TracMobility { + umbrella header "Pods-TracMobility-umbrella.h" + + export * + module * { export * } +} diff --git a/TracMobility/Pods/Target Support Files/Pods-TracMobility/Pods-TracMobility.release.xcconfig b/TracMobility/Pods/Target Support Files/Pods-TracMobility/Pods-TracMobility.release.xcconfig new file mode 100644 index 0000000..ab77524 --- /dev/null +++ b/TracMobility/Pods/Target Support Files/Pods-TracMobility/Pods-TracMobility.release.xcconfig @@ -0,0 +1,12 @@ +ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Auth0" "${PODS_CONFIGURATION_BUILD_DIR}/JWTDecode" "${PODS_CONFIGURATION_BUILD_DIR}/SideMenu" "${PODS_CONFIGURATION_BUILD_DIR}/SimpleKeychain" "${PODS_ROOT}/GoogleMaps/Base/Frameworks" "${PODS_ROOT}/GoogleMaps/Maps/Frameworks" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Auth0/Auth0.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/JWTDecode/JWTDecode.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SideMenu/SideMenu.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SimpleKeychain/SimpleKeychain.framework/Headers" +LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' +OTHER_LDFLAGS = $(inherited) -ObjC -l"c++" -l"z" -framework "Accelerate" -framework "Auth0" -framework "CoreData" -framework "CoreGraphics" -framework "CoreImage" -framework "CoreLocation" -framework "CoreTelephony" -framework "CoreText" -framework "GLKit" -framework "GoogleMaps" -framework "GoogleMapsBase" -framework "GoogleMapsCore" -framework "ImageIO" -framework "JWTDecode" -framework "LocalAuthentication" -framework "Metal" -framework "OpenGLES" -framework "QuartzCore" -framework "SafariServices" -framework "SideMenu" -framework "SimpleKeychain" -framework "SystemConfiguration" -framework "UIKit" -weak_framework "AuthenticationServices" +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/TracMobility/Pods/Target Support Files/SideMenu/SideMenu-Info.plist b/TracMobility/Pods/Target Support Files/SideMenu/SideMenu-Info.plist new file mode 100644 index 0000000..891b375 --- /dev/null +++ b/TracMobility/Pods/Target Support Files/SideMenu/SideMenu-Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 6.5.0 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/TracMobility/Pods/Target Support Files/SideMenu/SideMenu-dummy.m b/TracMobility/Pods/Target Support Files/SideMenu/SideMenu-dummy.m new file mode 100644 index 0000000..bd363f7 --- /dev/null +++ b/TracMobility/Pods/Target Support Files/SideMenu/SideMenu-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_SideMenu : NSObject +@end +@implementation PodsDummy_SideMenu +@end diff --git a/TracMobility/Pods/Target Support Files/SideMenu/SideMenu-prefix.pch b/TracMobility/Pods/Target Support Files/SideMenu/SideMenu-prefix.pch new file mode 100644 index 0000000..beb2a24 --- /dev/null +++ b/TracMobility/Pods/Target Support Files/SideMenu/SideMenu-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/TracMobility/Pods/Target Support Files/SideMenu/SideMenu-umbrella.h b/TracMobility/Pods/Target Support Files/SideMenu/SideMenu-umbrella.h new file mode 100644 index 0000000..e005106 --- /dev/null +++ b/TracMobility/Pods/Target Support Files/SideMenu/SideMenu-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 SideMenuVersionNumber; +FOUNDATION_EXPORT const unsigned char SideMenuVersionString[]; + diff --git a/TracMobility/Pods/Target Support Files/SideMenu/SideMenu.debug.xcconfig b/TracMobility/Pods/Target Support Files/SideMenu/SideMenu.debug.xcconfig new file mode 100644 index 0000000..84d9084 --- /dev/null +++ b/TracMobility/Pods/Target Support Files/SideMenu/SideMenu.debug.xcconfig @@ -0,0 +1,10 @@ +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/SideMenu +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +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}/SideMenu +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/TracMobility/Pods/Target Support Files/SideMenu/SideMenu.modulemap b/TracMobility/Pods/Target Support Files/SideMenu/SideMenu.modulemap new file mode 100644 index 0000000..796e914 --- /dev/null +++ b/TracMobility/Pods/Target Support Files/SideMenu/SideMenu.modulemap @@ -0,0 +1,6 @@ +framework module SideMenu { + umbrella header "SideMenu-umbrella.h" + + export * + module * { export * } +} diff --git a/TracMobility/Pods/Target Support Files/SideMenu/SideMenu.release.xcconfig b/TracMobility/Pods/Target Support Files/SideMenu/SideMenu.release.xcconfig new file mode 100644 index 0000000..84d9084 --- /dev/null +++ b/TracMobility/Pods/Target Support Files/SideMenu/SideMenu.release.xcconfig @@ -0,0 +1,10 @@ +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/SideMenu +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +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}/SideMenu +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/TracMobility/Pods/Target Support Files/SimpleKeychain/SimpleKeychain-Info.plist b/TracMobility/Pods/Target Support Files/SimpleKeychain/SimpleKeychain-Info.plist new file mode 100644 index 0000000..4a543b7 --- /dev/null +++ b/TracMobility/Pods/Target Support Files/SimpleKeychain/SimpleKeychain-Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 0.12.1 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/TracMobility/Pods/Target Support Files/SimpleKeychain/SimpleKeychain-dummy.m b/TracMobility/Pods/Target Support Files/SimpleKeychain/SimpleKeychain-dummy.m new file mode 100644 index 0000000..5ddd321 --- /dev/null +++ b/TracMobility/Pods/Target Support Files/SimpleKeychain/SimpleKeychain-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_SimpleKeychain : NSObject +@end +@implementation PodsDummy_SimpleKeychain +@end diff --git a/TracMobility/Pods/Target Support Files/SimpleKeychain/SimpleKeychain-prefix.pch b/TracMobility/Pods/Target Support Files/SimpleKeychain/SimpleKeychain-prefix.pch new file mode 100644 index 0000000..beb2a24 --- /dev/null +++ b/TracMobility/Pods/Target Support Files/SimpleKeychain/SimpleKeychain-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/TracMobility/Pods/Target Support Files/SimpleKeychain/SimpleKeychain-umbrella.h b/TracMobility/Pods/Target Support Files/SimpleKeychain/SimpleKeychain-umbrella.h new file mode 100644 index 0000000..d71813e --- /dev/null +++ b/TracMobility/Pods/Target Support Files/SimpleKeychain/SimpleKeychain-umbrella.h @@ -0,0 +1,19 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + +#import "A0SimpleKeychain+KeyPair.h" +#import "A0SimpleKeychain.h" +#import "SimpleKeychain.h" + +FOUNDATION_EXPORT double SimpleKeychainVersionNumber; +FOUNDATION_EXPORT const unsigned char SimpleKeychainVersionString[]; + diff --git a/TracMobility/Pods/Target Support Files/SimpleKeychain/SimpleKeychain.debug.xcconfig b/TracMobility/Pods/Target Support Files/SimpleKeychain/SimpleKeychain.debug.xcconfig new file mode 100644 index 0000000..512f3e0 --- /dev/null +++ b/TracMobility/Pods/Target Support Files/SimpleKeychain/SimpleKeychain.debug.xcconfig @@ -0,0 +1,9 @@ +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/SimpleKeychain +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}/SimpleKeychain +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/TracMobility/Pods/Target Support Files/SimpleKeychain/SimpleKeychain.modulemap b/TracMobility/Pods/Target Support Files/SimpleKeychain/SimpleKeychain.modulemap new file mode 100644 index 0000000..66944c6 --- /dev/null +++ b/TracMobility/Pods/Target Support Files/SimpleKeychain/SimpleKeychain.modulemap @@ -0,0 +1,6 @@ +framework module SimpleKeychain { + umbrella header "SimpleKeychain-umbrella.h" + + export * + module * { export * } +} diff --git a/TracMobility/Pods/Target Support Files/SimpleKeychain/SimpleKeychain.release.xcconfig b/TracMobility/Pods/Target Support Files/SimpleKeychain/SimpleKeychain.release.xcconfig new file mode 100644 index 0000000..512f3e0 --- /dev/null +++ b/TracMobility/Pods/Target Support Files/SimpleKeychain/SimpleKeychain.release.xcconfig @@ -0,0 +1,9 @@ +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/SimpleKeychain +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}/SimpleKeychain +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/TracMobility/TracMobility.xcodeproj/project.pbxproj b/TracMobility/TracMobility.xcodeproj/project.pbxproj new file mode 100644 index 0000000..bf1d53d --- /dev/null +++ b/TracMobility/TracMobility.xcodeproj/project.pbxproj @@ -0,0 +1,457 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 51; + objects = { + +/* Begin PBXBuildFile section */ + 4135FF3525CE4DC000D51479 /* SideMenuTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4135FF3425CE4DC000D51479 /* SideMenuTableViewCell.swift */; }; + 4161581F25CCF449000F03E9 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4161581E25CCF449000F03E9 /* AppDelegate.swift */; }; + 4161582125CCF449000F03E9 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4161582025CCF449000F03E9 /* SceneDelegate.swift */; }; + 4161582325CCF449000F03E9 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4161582225CCF449000F03E9 /* ViewController.swift */; }; + 4161582625CCF449000F03E9 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 4161582425CCF449000F03E9 /* Main.storyboard */; }; + 4161582825CCF44B000F03E9 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 4161582725CCF44B000F03E9 /* Assets.xcassets */; }; + 4161582B25CCF44B000F03E9 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 4161582925CCF44B000F03E9 /* LaunchScreen.storyboard */; }; + 4161583425CCFD69000F03E9 /* AuthenticationViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4161583325CCFD69000F03E9 /* AuthenticationViewController.swift */; }; + 416DA93825CD18D6005FCEF9 /* Auth0.plist in Resources */ = {isa = PBXBuildFile; fileRef = 416DA93725CD18D6005FCEF9 /* Auth0.plist */; }; + 4177E8CF25CD77400063E75F /* HomeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4177E8CE25CD77400063E75F /* HomeViewController.swift */; }; + 4177E8EB25CDBD560063E75F /* TableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4177E8EA25CDBD560063E75F /* TableViewController.swift */; }; + CD69F7BB56C38BD0CDAAB04D /* Pods_TracMobility.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8536BC4EC2A3FB6E3A305704 /* Pods_TracMobility.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 3EE2A30C582AA9EF026E056F /* Pods-TracMobility.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-TracMobility.debug.xcconfig"; path = "Target Support Files/Pods-TracMobility/Pods-TracMobility.debug.xcconfig"; sourceTree = ""; }; + 4135FF3425CE4DC000D51479 /* SideMenuTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SideMenuTableViewCell.swift; sourceTree = ""; }; + 4161581B25CCF449000F03E9 /* TracMobility.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = TracMobility.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 4161581E25CCF449000F03E9 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 4161582025CCF449000F03E9 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; }; + 4161582225CCF449000F03E9 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; + 4161582525CCF449000F03E9 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 4161582725CCF44B000F03E9 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 4161582A25CCF44B000F03E9 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 4161582C25CCF44B000F03E9 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 4161583325CCFD69000F03E9 /* AuthenticationViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthenticationViewController.swift; sourceTree = ""; }; + 416DA93725CD18D6005FCEF9 /* Auth0.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Auth0.plist; sourceTree = ""; }; + 4177E8CE25CD77400063E75F /* HomeViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeViewController.swift; sourceTree = ""; }; + 4177E8EA25CDBD560063E75F /* TableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TableViewController.swift; sourceTree = ""; }; + 8536BC4EC2A3FB6E3A305704 /* Pods_TracMobility.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_TracMobility.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 8EFED190967D2C64D7524C9A /* Pods-TracMobility.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-TracMobility.release.xcconfig"; path = "Target Support Files/Pods-TracMobility/Pods-TracMobility.release.xcconfig"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 4161581825CCF449000F03E9 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + CD69F7BB56C38BD0CDAAB04D /* Pods_TracMobility.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 4161581225CCF449000F03E9 = { + isa = PBXGroup; + children = ( + 4161581D25CCF449000F03E9 /* TracMobility */, + 4161581C25CCF449000F03E9 /* Products */, + EADC3584C5FF1F1B90028A11 /* Pods */, + 9CCB12DFB929F56F1C69BF44 /* Frameworks */, + ); + sourceTree = ""; + }; + 4161581C25CCF449000F03E9 /* Products */ = { + isa = PBXGroup; + children = ( + 4161581B25CCF449000F03E9 /* TracMobility.app */, + ); + name = Products; + sourceTree = ""; + }; + 4161581D25CCF449000F03E9 /* TracMobility */ = { + isa = PBXGroup; + children = ( + 4161581E25CCF449000F03E9 /* AppDelegate.swift */, + 4161582025CCF449000F03E9 /* SceneDelegate.swift */, + 4161582225CCF449000F03E9 /* ViewController.swift */, + 4161583325CCFD69000F03E9 /* AuthenticationViewController.swift */, + 4177E8CE25CD77400063E75F /* HomeViewController.swift */, + 4177E8EA25CDBD560063E75F /* TableViewController.swift */, + 4135FF3425CE4DC000D51479 /* SideMenuTableViewCell.swift */, + 4161582425CCF449000F03E9 /* Main.storyboard */, + 4161582725CCF44B000F03E9 /* Assets.xcassets */, + 4161582925CCF44B000F03E9 /* LaunchScreen.storyboard */, + 416DA93725CD18D6005FCEF9 /* Auth0.plist */, + 4161582C25CCF44B000F03E9 /* Info.plist */, + ); + path = TracMobility; + sourceTree = ""; + }; + 9CCB12DFB929F56F1C69BF44 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 8536BC4EC2A3FB6E3A305704 /* Pods_TracMobility.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + EADC3584C5FF1F1B90028A11 /* Pods */ = { + isa = PBXGroup; + children = ( + 3EE2A30C582AA9EF026E056F /* Pods-TracMobility.debug.xcconfig */, + 8EFED190967D2C64D7524C9A /* Pods-TracMobility.release.xcconfig */, + ); + path = Pods; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 4161581A25CCF449000F03E9 /* TracMobility */ = { + isa = PBXNativeTarget; + buildConfigurationList = 4161582F25CCF44B000F03E9 /* Build configuration list for PBXNativeTarget "TracMobility" */; + buildPhases = ( + 5C09D6FFCDEF6F70B44F3A0F /* [CP] Check Pods Manifest.lock */, + 4161581725CCF449000F03E9 /* Sources */, + 4161581825CCF449000F03E9 /* Frameworks */, + 4161581925CCF449000F03E9 /* Resources */, + A41ACF0B59C9621E5A6791E2 /* [CP] Embed Pods Frameworks */, + 794984643645D9099141E633 /* [CP] Copy Pods Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = TracMobility; + productName = TracMobility; + productReference = 4161581B25CCF449000F03E9 /* TracMobility.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 4161581325CCF449000F03E9 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 1220; + LastUpgradeCheck = 1220; + TargetAttributes = { + 4161581A25CCF449000F03E9 = { + CreatedOnToolsVersion = 12.2; + }; + }; + }; + buildConfigurationList = 4161581625CCF449000F03E9 /* Build configuration list for PBXProject "TracMobility" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 4161581225CCF449000F03E9; + productRefGroup = 4161581C25CCF449000F03E9 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 4161581A25CCF449000F03E9 /* TracMobility */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 4161581925CCF449000F03E9 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 4161582B25CCF44B000F03E9 /* LaunchScreen.storyboard in Resources */, + 4161582825CCF44B000F03E9 /* Assets.xcassets in Resources */, + 4161582625CCF449000F03E9 /* Main.storyboard in Resources */, + 416DA93825CD18D6005FCEF9 /* Auth0.plist in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 5C09D6FFCDEF6F70B44F3A0F /* [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-TracMobility-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; + }; + 794984643645D9099141E633 /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-TracMobility/Pods-TracMobility-resources-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Copy Pods Resources"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-TracMobility/Pods-TracMobility-resources-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-TracMobility/Pods-TracMobility-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; + A41ACF0B59C9621E5A6791E2 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-TracMobility/Pods-TracMobility-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-TracMobility/Pods-TracMobility-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-TracMobility/Pods-TracMobility-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 4161581725CCF449000F03E9 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 4177E8CF25CD77400063E75F /* HomeViewController.swift in Sources */, + 4177E8EB25CDBD560063E75F /* TableViewController.swift in Sources */, + 4161583425CCFD69000F03E9 /* AuthenticationViewController.swift in Sources */, + 4161582325CCF449000F03E9 /* ViewController.swift in Sources */, + 4135FF3525CE4DC000D51479 /* SideMenuTableViewCell.swift in Sources */, + 4161581F25CCF449000F03E9 /* AppDelegate.swift in Sources */, + 4161582125CCF449000F03E9 /* SceneDelegate.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 4161582425CCF449000F03E9 /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 4161582525CCF449000F03E9 /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 4161582925CCF44B000F03E9 /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 4161582A25CCF44B000F03E9 /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 4161582D25CCF44B000F03E9 /* 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_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + 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 = 14.2; + 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; + }; + 4161582E25CCF44B000F03E9 /* 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_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + 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 = 14.2; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 4161583025CCF44B000F03E9 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 3EE2A30C582AA9EF026E056F /* Pods-TracMobility.debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = RYF43CDV33; + EXCLUDED_ARCHS = ""; + "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = arm64; + INFOPLIST_FILE = TracMobility/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "Sabaz-shereef.TracMobility"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 4161583125CCF44B000F03E9 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 8EFED190967D2C64D7524C9A /* Pods-TracMobility.release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = RYF43CDV33; + "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = arm64; + INFOPLIST_FILE = TracMobility/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "Sabaz-shereef.TracMobility"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 4161581625CCF449000F03E9 /* Build configuration list for PBXProject "TracMobility" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 4161582D25CCF44B000F03E9 /* Debug */, + 4161582E25CCF44B000F03E9 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 4161582F25CCF44B000F03E9 /* Build configuration list for PBXNativeTarget "TracMobility" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 4161583025CCF44B000F03E9 /* Debug */, + 4161583125CCF44B000F03E9 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 4161581325CCF449000F03E9 /* Project object */; +} diff --git a/TracMobility/TracMobility.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/TracMobility/TracMobility.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/TracMobility/TracMobility.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/TracMobility/TracMobility.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/TracMobility/TracMobility.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/TracMobility/TracMobility.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/TracMobility/TracMobility.xcodeproj/project.xcworkspace/xcuserdata/sabazshereef.xcuserdatad/UserInterfaceState.xcuserstate b/TracMobility/TracMobility.xcodeproj/project.xcworkspace/xcuserdata/sabazshereef.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000..3370327 Binary files /dev/null and b/TracMobility/TracMobility.xcodeproj/project.xcworkspace/xcuserdata/sabazshereef.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/TracMobility/TracMobility.xcodeproj/xcshareddata/xcschemes/TracMobility.xcscheme b/TracMobility/TracMobility.xcodeproj/xcshareddata/xcschemes/TracMobility.xcscheme new file mode 100644 index 0000000..e0bdfd0 --- /dev/null +++ b/TracMobility/TracMobility.xcodeproj/xcshareddata/xcschemes/TracMobility.xcscheme @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/TracMobility/TracMobility.xcodeproj/xcuserdata/sabazshereef.xcuserdatad/xcschemes/xcschememanagement.plist b/TracMobility/TracMobility.xcodeproj/xcuserdata/sabazshereef.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..28c5b99 --- /dev/null +++ b/TracMobility/TracMobility.xcodeproj/xcuserdata/sabazshereef.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,22 @@ + + + + + SchemeUserState + + TracMobility.xcscheme_^#shared#^_ + + orderHint + 6 + + + SuppressBuildableAutocreation + + 4161581A25CCF449000F03E9 + + primary + + + + + diff --git a/TracMobility/TracMobility.xcworkspace/contents.xcworkspacedata b/TracMobility/TracMobility.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..007dbb8 --- /dev/null +++ b/TracMobility/TracMobility.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/TracMobility/TracMobility.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/TracMobility/TracMobility.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/TracMobility/TracMobility.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/TracMobility/TracMobility.xcworkspace/xcuserdata/sabazshereef.xcuserdatad/UserInterfaceState.xcuserstate b/TracMobility/TracMobility.xcworkspace/xcuserdata/sabazshereef.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000..6969dc1 Binary files /dev/null and b/TracMobility/TracMobility.xcworkspace/xcuserdata/sabazshereef.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/TracMobility/TracMobility.xcworkspace/xcuserdata/sabazshereef.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/TracMobility/TracMobility.xcworkspace/xcuserdata/sabazshereef.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist new file mode 100644 index 0000000..de95e10 --- /dev/null +++ b/TracMobility/TracMobility.xcworkspace/xcuserdata/sabazshereef.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -0,0 +1,6 @@ + + + diff --git a/TracMobility/TracMobility/AppDelegate.swift b/TracMobility/TracMobility/AppDelegate.swift new file mode 100644 index 0000000..f797c64 --- /dev/null +++ b/TracMobility/TracMobility/AppDelegate.swift @@ -0,0 +1,42 @@ +// +// AppDelegate.swift +// TracMobility +// +// Created by sabaz shereef on 05/02/21. +// + +import UIKit +import Auth0 +import GoogleMaps + +@main +class AppDelegate: UIResponder, UIApplicationDelegate { + + + + func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any]) -> Bool { + return Auth0.resumeAuth(url, options: options) + } + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { + // Override point for customization after application launch. + GMSServices.provideAPIKey("AIzaSyDIXw_prWhPeH8B5kQT3JODO6IikcvJeOs") + 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/TracMobility/TracMobility/Assets.xcassets/AccentColor.colorset/Contents.json b/TracMobility/TracMobility/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 0000000..eb87897 --- /dev/null +++ b/TracMobility/TracMobility/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/TracMobility/TracMobility/Assets.xcassets/Address.imageset/Contents.json b/TracMobility/TracMobility/Assets.xcassets/Address.imageset/Contents.json new file mode 100644 index 0000000..2eb3ab1 --- /dev/null +++ b/TracMobility/TracMobility/Assets.xcassets/Address.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "download.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/TracMobility/TracMobility/Assets.xcassets/Address.imageset/download.png b/TracMobility/TracMobility/Assets.xcassets/Address.imageset/download.png new file mode 100644 index 0000000..404b707 Binary files /dev/null and b/TracMobility/TracMobility/Assets.xcassets/Address.imageset/download.png differ diff --git a/TracMobility/TracMobility/Assets.xcassets/App Logo.imageset/Contents.json b/TracMobility/TracMobility/Assets.xcassets/App Logo.imageset/Contents.json new file mode 100644 index 0000000..dbd6ed6 --- /dev/null +++ b/TracMobility/TracMobility/Assets.xcassets/App Logo.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "Picture 1.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/TracMobility/TracMobility/Assets.xcassets/App Logo.imageset/Picture 1.png b/TracMobility/TracMobility/Assets.xcassets/App Logo.imageset/Picture 1.png new file mode 100644 index 0000000..9707814 Binary files /dev/null and b/TracMobility/TracMobility/Assets.xcassets/App Logo.imageset/Picture 1.png differ diff --git a/TracMobility/TracMobility/Assets.xcassets/AppIcon.appiconset/Contents.json b/TracMobility/TracMobility/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..9221b9b --- /dev/null +++ b/TracMobility/TracMobility/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,98 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "20x20" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "20x20" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "29x29" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "29x29" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "40x40" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "40x40" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "60x60" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "60x60" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "20x20" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "20x20" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "29x29" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "29x29" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "40x40" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "40x40" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "76x76" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "76x76" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "83.5x83.5" + }, + { + "idiom" : "ios-marketing", + "scale" : "1x", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/TracMobility/TracMobility/Assets.xcassets/Contents.json b/TracMobility/TracMobility/Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/TracMobility/TracMobility/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/TracMobility/TracMobility/Assets.xcassets/Email.imageset/Contents.json b/TracMobility/TracMobility/Assets.xcassets/Email.imageset/Contents.json new file mode 100644 index 0000000..9e275c0 --- /dev/null +++ b/TracMobility/TracMobility/Assets.xcassets/Email.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "download (1).png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/TracMobility/TracMobility/Assets.xcassets/Email.imageset/download (1).png b/TracMobility/TracMobility/Assets.xcassets/Email.imageset/download (1).png new file mode 100644 index 0000000..e9c76df Binary files /dev/null and b/TracMobility/TracMobility/Assets.xcassets/Email.imageset/download (1).png differ diff --git a/TracMobility/TracMobility/Assets.xcassets/Logout.imageset/Contents.json b/TracMobility/TracMobility/Assets.xcassets/Logout.imageset/Contents.json new file mode 100644 index 0000000..24cfeaf --- /dev/null +++ b/TracMobility/TracMobility/Assets.xcassets/Logout.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "download (1).jpeg", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/TracMobility/TracMobility/Assets.xcassets/Logout.imageset/download (1).jpeg b/TracMobility/TracMobility/Assets.xcassets/Logout.imageset/download (1).jpeg new file mode 100644 index 0000000..cf1c6c2 Binary files /dev/null and b/TracMobility/TracMobility/Assets.xcassets/Logout.imageset/download (1).jpeg differ diff --git a/TracMobility/TracMobility/Assets.xcassets/Profile.imageset/Contents.json b/TracMobility/TracMobility/Assets.xcassets/Profile.imageset/Contents.json new file mode 100644 index 0000000..61288bc --- /dev/null +++ b/TracMobility/TracMobility/Assets.xcassets/Profile.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "download.jpeg", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/TracMobility/TracMobility/Assets.xcassets/Profile.imageset/download.jpeg b/TracMobility/TracMobility/Assets.xcassets/Profile.imageset/download.jpeg new file mode 100644 index 0000000..c52e436 Binary files /dev/null and b/TracMobility/TracMobility/Assets.xcassets/Profile.imageset/download.jpeg differ diff --git a/TracMobility/TracMobility/Assets.xcassets/Settings.imageset/Contents.json b/TracMobility/TracMobility/Assets.xcassets/Settings.imageset/Contents.json new file mode 100644 index 0000000..d3a4dc8 --- /dev/null +++ b/TracMobility/TracMobility/Assets.xcassets/Settings.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "download (2).png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/TracMobility/TracMobility/Assets.xcassets/Settings.imageset/download (2).png b/TracMobility/TracMobility/Assets.xcassets/Settings.imageset/download (2).png new file mode 100644 index 0000000..419bbd0 Binary files /dev/null and b/TracMobility/TracMobility/Assets.xcassets/Settings.imageset/download (2).png differ diff --git a/TracMobility/TracMobility/Auth0.plist b/TracMobility/TracMobility/Auth0.plist new file mode 100644 index 0000000..c5ec44e --- /dev/null +++ b/TracMobility/TracMobility/Auth0.plist @@ -0,0 +1,12 @@ + + + + + + + ClientId + azqlvifbjqu1Qlfyi6g9nyaZva4NVYGi + Domain + dev-wwnonby5.eu.auth0.com + + diff --git a/TracMobility/TracMobility/AuthenticationViewController.swift b/TracMobility/TracMobility/AuthenticationViewController.swift new file mode 100644 index 0000000..5baf590 --- /dev/null +++ b/TracMobility/TracMobility/AuthenticationViewController.swift @@ -0,0 +1,52 @@ +// +// AuthenticationViewController.swift +// TracMobility +// +// Created by sabaz shereef on 05/02/21. +// + +import UIKit +import Auth0 + +class AuthenticationViewController: UIViewController { + + override func viewDidLoad() { + super.viewDidLoad() + + self.navigationItem.setHidesBackButton(true, animated: true) + + } + + @IBAction func authButton(_ sender: Any) { + + Authenticate() + + } + + func Authenticate() { + + Auth0 + .webAuth() + .scope("openid profile") + .useEphemeralSession() + .audience("https://dev-wwnonby5.eu.auth0.com/userinfo") + .start { result in + switch result { + case .failure(let error): + + print("Error: \(error)") + case .success(let credentials): + + print("Credentials: \(credentials)") + + let credentialsManager = CredentialsManager(authentication: Auth0.authentication()) + credentialsManager.store(credentials: credentials) + + let authViewController = self.storyboard?.instantiateViewController(withIdentifier: "Home") as! HomeViewController + + self.navigationController?.pushViewController(authViewController, animated: true) + + } + } + } +} diff --git a/TracMobility/TracMobility/Base.lproj/LaunchScreen.storyboard b/TracMobility/TracMobility/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..b3e6e8d --- /dev/null +++ b/TracMobility/TracMobility/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/TracMobility/TracMobility/Base.lproj/Main.storyboard b/TracMobility/TracMobility/Base.lproj/Main.storyboard new file mode 100644 index 0000000..c1c5697 --- /dev/null +++ b/TracMobility/TracMobility/Base.lproj/Main.storyboard @@ -0,0 +1,218 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/TracMobility/TracMobility/HomeViewController.swift b/TracMobility/TracMobility/HomeViewController.swift new file mode 100644 index 0000000..40a02b0 --- /dev/null +++ b/TracMobility/TracMobility/HomeViewController.swift @@ -0,0 +1,105 @@ +// +// HomeViewController.swift +// TracMobility +// +// Created by sabaz shereef on 05/02/21. +// + +import UIKit +import SideMenu +import GoogleMaps +import CoreLocation +class HomeViewController: UIViewController, CLLocationManagerDelegate { + + let locationManger = CLLocationManager() + var mapView = GMSMapView() + var menu: SideMenuNavigationController? + + override func viewDidLoad() { + super.viewDidLoad() + let leftVc = self.storyboard?.instantiateViewController(identifier: "TableViewController") as! TableViewController + + menu = SideMenuNavigationController(rootViewController: leftVc) + menu?.leftSide = true + + SideMenuManager.default.leftMenuNavigationController = menu + SideMenuManager.default.addPanGestureToPresent(toView: self.view) + + configureMap() + setupButton() + } + + + @IBAction func didTapMenu() { + present(menu!, animated: true) + } + + func configureMap() { + + locationManger.requestWhenInUseAuthorization() + locationManger.startUpdatingLocation() + locationManger.delegate = self + + } + + override func viewDidLayoutSubviews() { + + let imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 50, height: 20)) + imageView.contentMode = .scaleAspectFit + let image = UIImage(named: "App Logo") + imageView.image = image + navigationItem.titleView = imageView + + } + + func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { + guard let location = locations.first else { + return + } + let cordinate = location.coordinate + let camera = GMSCameraPosition.camera(withLatitude: cordinate.latitude, longitude: cordinate.longitude, zoom: 6.0) + mapView = GMSMapView.map(withFrame: self.view.frame, camera: camera) + view.insertSubview(mapView, at: 0) + let marker = GMSMarker() + marker.position = CLLocationCoordinate2D(latitude: cordinate.latitude, longitude: cordinate.longitude) + + marker.map = mapView + + + } + + @IBAction func inboxButton(_ sender: Any) { + alert() + + } + + @IBAction func Logout(_ sender: Any) { + navigationController!.popViewController(animated: true) + } + + @objc func alert() { + + let alertController = UIAlertController(title: "Alert!", message: "Service Under Maintenance", preferredStyle: UIAlertController.Style.alert) + + alertController.addAction(UIAlertAction(title: "Dismiss", style: UIAlertAction.Style.default,handler: nil)) + + self.present(alertController, animated: true, completion: nil) + + } + func setupButton() { + + let button = UIButton(type: .system) + button.setTitle("Scan To Unlock", for: .normal) + button.backgroundColor = .black + button.titleLabel?.font = .boldSystemFont(ofSize: 20) + button.setTitleColor(.white, for: .normal) + + button.translatesAutoresizingMaskIntoConstraints = false + view.insertSubview(button, at: 1) + button.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true + button.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true + + button.addTarget(self, action: #selector(alert), for: .touchUpInside) + } + +} diff --git a/TracMobility/TracMobility/Info.plist b/TracMobility/TracMobility/Info.plist new file mode 100644 index 0000000..36c460c --- /dev/null +++ b/TracMobility/TracMobility/Info.plist @@ -0,0 +1,85 @@ + + + + + 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 + + + + + UIApplicationSupportsIndirectInputEvents + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + ClientId + azqlvifbjqu1Qlfyi6g9nyaZva4NVYGi + Domain + dev-wwnonby5.eu.auth0.com + CFBundleURLTypes + + + CFBundleTypeRole + None + CFBundleURLName + auth0 + CFBundleURLSchemes + + $Sabaz-shereef.TracMobility + + + + NSLocationWhenInUseUsageDescription + Please Allow to access your current location + + diff --git a/TracMobility/TracMobility/SceneDelegate.swift b/TracMobility/TracMobility/SceneDelegate.swift new file mode 100644 index 0000000..f7f2a62 --- /dev/null +++ b/TracMobility/TracMobility/SceneDelegate.swift @@ -0,0 +1,52 @@ +// +// SceneDelegate.swift +// TracMobility +// +// Created by sabaz shereef on 05/02/21. +// + +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 necessarily 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/TracMobility/TracMobility/SideMenuTableViewCell.swift b/TracMobility/TracMobility/SideMenuTableViewCell.swift new file mode 100644 index 0000000..1fc9717 --- /dev/null +++ b/TracMobility/TracMobility/SideMenuTableViewCell.swift @@ -0,0 +1,25 @@ +// +// SideMenuTableViewCell.swift +// TracMobility +// +// Created by sabaz shereef on 06/02/21. +// + +import UIKit + +class SideMenuTableViewCell: UITableViewCell { + + @IBOutlet weak var infoLabel: UILabel! + @IBOutlet weak var logoImage: UIImageView! + override func awakeFromNib() { + super.awakeFromNib() + // Initialization code + } + + override func setSelected(_ selected: Bool, animated: Bool) { + super.setSelected(selected, animated: animated) + + // Configure the view for the selected state + } + +} diff --git a/TracMobility/TracMobility/TableViewController.swift b/TracMobility/TracMobility/TableViewController.swift new file mode 100644 index 0000000..dfd666e --- /dev/null +++ b/TracMobility/TracMobility/TableViewController.swift @@ -0,0 +1,81 @@ +// +// TableViewController.swift +// TracMobility +// +// Created by sabaz shereef on 05/02/21. +// + +import UIKit +import Auth0 +class TableViewController: UIViewController, UITableViewDataSource, UITableViewDelegate{ + + @IBOutlet weak var myTableList: UITableView! + let home = HomeViewController() + var profileInfo = [String]() + var imageArray = [String]() + + override func viewDidLoad() { + super.viewDidLoad() + + retrievedata() + + } + + + + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + imageArray.count + } + + + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + let cell = myTableList.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! SideMenuTableViewCell + cell.infoLabel.text = profileInfo[indexPath.row] + + cell.logoImage.image = UIImage(named: imageArray[indexPath.row]) + + return cell + + } + + func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + + if profileInfo[indexPath.row] == "Settings" { + home.alert() + } + + } + + func retrievedata() { + let credentialsManager = CredentialsManager(authentication: Auth0.authentication()) + + credentialsManager.credentials { error, credentials in + guard error == nil, let credentials = credentials else { + return print("Failed with \(String(describing: error))") + } + + + Auth0 + .authentication() + .userInfo(withAccessToken: credentials.accessToken ?? "") + .start { [self] result in + switch result { + case .success(let profile): + + self.profileInfo.append(profile.nickname ?? "Not Found") + self.profileInfo.append(profile.name ?? "Not Found") + profileInfo.append("Settings") + + imageArray = ["Profile","Email", "Settings"] + + DispatchQueue.main.sync { + myTableList.reloadData() + } + + case .failure(let error): + print("Failed with \(error)") + } + } + } + } +} diff --git a/TracMobility/TracMobility/ViewController.swift b/TracMobility/TracMobility/ViewController.swift new file mode 100644 index 0000000..18d1bd6 --- /dev/null +++ b/TracMobility/TracMobility/ViewController.swift @@ -0,0 +1,63 @@ +// +// ViewController.swift +// TracMobility +// +// Created by sabaz shereef on 05/02/21. +// + +import UIKit + +class ViewController: UIViewController { + + private let imageView: UIImageView = { + let appLogo = UIImageView(frame: CGRect(x: 0, y: 0, width: 250, height: 150)) + + appLogo.image = UIImage(named: "App Logo") + appLogo.contentMode = .scaleAspectFit + return appLogo + }() + + override func viewDidLoad() { + super.viewDidLoad() + view.addSubview(imageView) + + } + + override func viewDidLayoutSubviews() { + super.viewDidLayoutSubviews() + imageView.center = view.center + self.animation() + + } + + private func animation(){ + + UIView.animate(withDuration: 1.5) { + let imageSize = self.view.frame.size.width * 3 + let xPosition = imageSize - self.view.frame.size.width + let yPosition = self.view.frame.size.height - imageSize + self.imageView.frame = CGRect( + x: -(xPosition/2), + y: yPosition/2, + width: imageSize, + height: imageSize + ) + + } + UIView.animate(withDuration: 1.5, animations: { + self.imageView.alpha = 0 + }) { (finished) in + if finished{ + DispatchQueue.main.asyncAfter(deadline: .now()+1) { + let authViewController = self.storyboard?.instantiateViewController(withIdentifier: "Authentication") as! AuthenticationViewController + self.navigationController?.pushViewController(authViewController, animated: true) + } + + } + } + + } + +} + +