Latest 2.2.3
Homepage https://github.com/artikcloud/artikcloud-objc
License Proprietary
Platforms ios 7.0, requires ARC
Dependencies AFNetworking, JSONModel, ISO8601
Frameworks SystemConfiguration
Authors

ARTIK Cloud Objective-C SDK

Pod version

This SDK helps you connect your iOS or OS X applications to ARTIK Cloud. It exposes a number of methods to easily execute REST API calls to ARTIK Cloud.

Requirements

The SDK requires ARC (Automatic Reference Counting) to be enabled in the Xcode project.

Installation & Usage

Install from Github using CocoaPods

Add the following to the Podfile:

pod 'ArtikCloud', :git => 'https://github.com/artikcloud/artikcloud-objc.git'

To specify a particular branch, append , :branch => 'branch-name-here'

To specify a particular commit, append , :commit => '11aa22'

Install from local path using CocoaPods

Put the SDK under your project folder (e.g. /path/to/objc_project/Vendor/ArtikCloud) and then add the following to the Podfile:

pod 'ArtikCloud', :path => 'Vendor/ArtikCloud'

Usage

Import the following:

#import <ArtikCloud/ACApiClient.h>
#import <ArtikCloud/ACDefaultConfiguration.h>
// load models
#import <ArtikCloud/ACAckEnvelope.h>
#import <ArtikCloud/ACAcknowledgement.h>
#import <ArtikCloud/ACAction.h>
#import <ArtikCloud/ACActionArray.h>
#import <ArtikCloud/ACActionDetails.h>
#import <ArtikCloud/ACActionDetailsArray.h>
#import <ArtikCloud/ACActionIn.h>
#import <ArtikCloud/ACActionOut.h>
#import <ArtikCloud/ACActions.h>
#import <ArtikCloud/ACAggregateData.h>
#import <ArtikCloud/ACAggregatesHistogramData.h>
#import <ArtikCloud/ACAggregatesHistogramResponse.h>
#import <ArtikCloud/ACAggregatesResponse.h>
#import <ArtikCloud/ACAppProperties.h>
#import <ArtikCloud/ACCertificateData.h>
#import <ArtikCloud/ACCertificateEnvelope.h>
#import <ArtikCloud/ACCertificateFields.h>
#import <ArtikCloud/ACCertificateId.h>
#import <ArtikCloud/ACCheckTokenMessage.h>
#import <ArtikCloud/ACCheckTokenResponse.h>
#import <ArtikCloud/ACContactInfo.h>
#import <ArtikCloud/ACDevice.h>
#import <ArtikCloud/ACDeviceArray.h>
#import <ArtikCloud/ACDeviceEnvelope.h>
#import <ArtikCloud/ACDevicePricingTier.h>
#import <ArtikCloud/ACDevicePricingTierEnvelope.h>
#import <ArtikCloud/ACDevicePricingTierRequest.h>
#import <ArtikCloud/ACDevicePricingTiers.h>
#import <ArtikCloud/ACDevicePricingTiersEnvelope.h>
#import <ArtikCloud/ACDeviceRegCompleteRequest.h>
#import <ArtikCloud/ACDeviceRegConfirmUserRequest.h>
#import <ArtikCloud/ACDeviceRegConfirmUserResponse.h>
#import <ArtikCloud/ACDeviceRegConfirmUserResponseEnvelope.h>
#import <ArtikCloud/ACDeviceRegStatusResponse.h>
#import <ArtikCloud/ACDeviceRegStatusResponseEnvelope.h>
#import <ArtikCloud/ACDeviceShareInfo.h>
#import <ArtikCloud/ACDeviceSharing.h>
#import <ArtikCloud/ACDeviceSharingArray.h>
#import <ArtikCloud/ACDeviceSharingEnvelope.h>
#import <ArtikCloud/ACDeviceSharingId.h>
#import <ArtikCloud/ACDeviceStatus.h>
#import <ArtikCloud/ACDeviceStatusBatch.h>
#import <ArtikCloud/ACDeviceStatusData.h>
#import <ArtikCloud/ACDeviceStatusPut.h>
#import <ArtikCloud/ACDeviceStatusPutData.h>
#import <ArtikCloud/ACDeviceTask.h>
#import <ArtikCloud/ACDeviceTaskUpdateRequest.h>
#import <ArtikCloud/ACDeviceTaskUpdateResponse.h>
#import <ArtikCloud/ACDeviceToken.h>
#import <ArtikCloud/ACDeviceTokenEnvelope.h>
#import <ArtikCloud/ACDeviceType.h>
#import <ArtikCloud/ACDeviceTypeArray.h>
#import <ArtikCloud/ACDeviceTypeEnvelope.h>
#import <ArtikCloud/ACDeviceTypeInfo.h>
#import <ArtikCloud/ACDeviceTypeInfoEnvelope.h>
#import <ArtikCloud/ACDeviceTypePricingList.h>
#import <ArtikCloud/ACDeviceTypePricingTier.h>
#import <ArtikCloud/ACDeviceTypePricingTiersEnvelope.h>
#import <ArtikCloud/ACDeviceTypeUpdateInput.h>
#import <ArtikCloud/ACDeviceTypesEnvelope.h>
#import <ArtikCloud/ACDeviceTypesInfo.h>
#import <ArtikCloud/ACDeviceTypesInfoEnvelope.h>
#import <ArtikCloud/ACDevicesEnvelope.h>
#import <ArtikCloud/ACErrorEnvelope.h>
#import <ArtikCloud/ACEventFeedData.h>
#import <ArtikCloud/ACExportData.h>
#import <ArtikCloud/ACExportDataArray.h>
#import <ArtikCloud/ACExportHistoryResponse.h>
#import <ArtikCloud/ACExportNormalizedMessagesResponse.h>
#import <ArtikCloud/ACExportRequest.h>
#import <ArtikCloud/ACExportRequestData.h>
#import <ArtikCloud/ACExportRequestInfo.h>
#import <ArtikCloud/ACExportRequestResponse.h>
#import <ArtikCloud/ACExportResponse.h>
#import <ArtikCloud/ACExportStatusResponse.h>
#import <ArtikCloud/ACFieldPath.h>
#import <ArtikCloud/ACFieldPresence.h>
#import <ArtikCloud/ACFieldPresenceEnvelope.h>
#import <ArtikCloud/ACFieldsActions.h>
#import <ArtikCloud/ACManifestProperties.h>
#import <ArtikCloud/ACManifestPropertiesEnvelope.h>
#import <ArtikCloud/ACManifestVersions.h>
#import <ArtikCloud/ACManifestVersionsEnvelope.h>
#import <ArtikCloud/ACMessage.h>
#import <ArtikCloud/ACMessageAction.h>
#import <ArtikCloud/ACMessageID.h>
#import <ArtikCloud/ACMessageIDEnvelope.h>
#import <ArtikCloud/ACMessageIn.h>
#import <ArtikCloud/ACMessageOut.h>
#import <ArtikCloud/ACMetadataEnvelope.h>
#import <ArtikCloud/ACMetadataPropertiesEnvelope.h>
#import <ArtikCloud/ACMetadataQueryEnvelope.h>
#import <ArtikCloud/ACNonEmptyString.h>
#import <ArtikCloud/ACNormalizedAction.h>
#import <ArtikCloud/ACNormalizedActionsEnvelope.h>
#import <ArtikCloud/ACNormalizedMessage.h>
#import <ArtikCloud/ACNormalizedMessagesEnvelope.h>
#import <ArtikCloud/ACNotifMessage.h>
#import <ArtikCloud/ACNotifMessageArray.h>
#import <ArtikCloud/ACNotifMessagesResponse.h>
#import <ArtikCloud/ACOutputRule.h>
#import <ArtikCloud/ACPresenceEnvelope.h>
#import <ArtikCloud/ACPresenceModel.h>
#import <ArtikCloud/ACPropertiesEnvelope.h>
#import <ArtikCloud/ACRefreshTokenResponse.h>
#import <ArtikCloud/ACRegisterMessage.h>
#import <ArtikCloud/ACRejectedCSVRow.h>
#import <ArtikCloud/ACRejectedCSVRowsEnvelope.h>
#import <ArtikCloud/ACRuleArray.h>
#import <ArtikCloud/ACRuleCreationInfo.h>
#import <ArtikCloud/ACRuleEnvelope.h>
#import <ArtikCloud/ACRuleError.h>
#import <ArtikCloud/ACRuleUpdateInfo.h>
#import <ArtikCloud/ACRuleWarningOutput.h>
#import <ArtikCloud/ACRulesEnvelope.h>
#import <ArtikCloud/ACSnapshotResponse.h>
#import <ArtikCloud/ACSnapshotResponses.h>
#import <ArtikCloud/ACSnapshotsResponseEnvelope.h>
#import <ArtikCloud/ACSubscription.h>
#import <ArtikCloud/ACSubscriptionArray.h>
#import <ArtikCloud/ACSubscriptionEnvelope.h>
#import <ArtikCloud/ACSubscriptionInfo.h>
#import <ArtikCloud/ACSubscriptionsEnvelope.h>
#import <ArtikCloud/ACTag.h>
#import <ArtikCloud/ACTagArray.h>
#import <ArtikCloud/ACTagsEnvelope.h>
#import <ArtikCloud/ACTask.h>
#import <ArtikCloud/ACTaskByDid.h>
#import <ArtikCloud/ACTaskByDidList.h>
#import <ArtikCloud/ACTaskByDidListEnvelope.h>
#import <ArtikCloud/ACTaskEnvelope.h>
#import <ArtikCloud/ACTaskHistory.h>
#import <ArtikCloud/ACTaskHistoryList.h>
#import <ArtikCloud/ACTaskList.h>
#import <ArtikCloud/ACTaskListEnvelope.h>
#import <ArtikCloud/ACTaskParameters.h>
#import <ArtikCloud/ACTaskRequest.h>
#import <ArtikCloud/ACTaskStatus.h>
#import <ArtikCloud/ACTaskStatusCounts.h>
#import <ArtikCloud/ACTaskStatuses.h>
#import <ArtikCloud/ACTaskStatusesEnvelope.h>
#import <ArtikCloud/ACTaskStatusesHistoryEnvelope.h>
#import <ArtikCloud/ACTaskUpdateRequest.h>
#import <ArtikCloud/ACTaskUpdateResponse.h>
#import <ArtikCloud/ACTasksStatusCounts.h>
#import <ArtikCloud/ACTier.h>
#import <ArtikCloud/ACToken.h>
#import <ArtikCloud/ACTokenInfo.h>
#import <ArtikCloud/ACTokenInfoSuccessResponse.h>
#import <ArtikCloud/ACTokenRequest.h>
#import <ArtikCloud/ACTokenResponse.h>
#import <ArtikCloud/ACUnregisterDeviceResponse.h>
#import <ArtikCloud/ACUnregisterDeviceResponseEnvelope.h>
#import <ArtikCloud/ACUpdateParameters.h>
#import <ArtikCloud/ACUpgradePath.h>
#import <ArtikCloud/ACUpgradePathEnvelope.h>
#import <ArtikCloud/ACUpgradePathUserToken.h>
#import <ArtikCloud/ACUpgradePathUserTokenEnvelope.h>
#import <ArtikCloud/ACUploadIdEnvelope.h>
#import <ArtikCloud/ACUploadStatusEnvelope.h>
#import <ArtikCloud/ACUser.h>
#import <ArtikCloud/ACUserEnvelope.h>
#import <ArtikCloud/ACValidationCallbackInfo.h>
#import <ArtikCloud/ACValidityPeriod.h>
#import <ArtikCloud/ACWebSocketError.h>
#import <ArtikCloud/ACWhitelist.h>
#import <ArtikCloud/ACWhitelistEnvelope.h>
#import <ArtikCloud/ACWhitelistResultEnvelope.h>
// load API classes for accessing endpoints
#import <ArtikCloud/ACDeviceTypesApi.h>
#import <ArtikCloud/ACDevicesApi.h>
#import <ArtikCloud/ACDevicesManagementApi.h>
#import <ArtikCloud/ACDevicesSharesApi.h>
#import <ArtikCloud/ACDevicesStatusApi.h>
#import <ArtikCloud/ACExportApi.h>
#import <ArtikCloud/ACMessagesApi.h>
#import <ArtikCloud/ACMonetizationApi.h>
#import <ArtikCloud/ACRegistrationsApi.h>
#import <ArtikCloud/ACRulesApi.h>
#import <ArtikCloud/ACSubscriptionsApi.h>
#import <ArtikCloud/ACTagsApi.h>
#import <ArtikCloud/ACTokensApi.h>
#import <ArtikCloud/ACUsersApi.h>
#import <ArtikCloud/ACWhitelistingApi.h>

Recommendation

It’s recommended to create an instance of ApiClient per thread in a multi-threaded environment to avoid any potential issues.

Getting Started

Please follow the installation procedure and then run the following:


ACDefaultConfiguration *apiConfig = [ACDefaultConfiguration sharedConfig];

// Configure OAuth2 access token for authorization: (authentication scheme: artikcloud_oauth)
[apiConfig setAccessToken:@"YOUR_ACCESS_TOKEN"];

NSString* *deviceTypeId = @"deviceTypeId_example"; // deviceTypeId

ACDeviceTypesApi *apiInstance = [[ACDeviceTypesApi alloc] init];

// Get Available Manifest Versions
[apiInstance getAvailableManifestVersionsWithDeviceTypeId:deviceTypeId
              completionHandler: ^(ACManifestVersionsEnvelope* output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];

Documentation for API Endpoints

All URIs are relative to https://api.artik.cloud/v1.1

Class Method HTTP request Description
ACDeviceTypesApi getAvailableManifestVersions GET /devicetypes/{deviceTypeId}/availablemanifestversions Get Available Manifest Versions
ACDeviceTypesApi getDeviceType GET /devicetypes/{deviceTypeId} Get Device Type
ACDeviceTypesApi getDeviceTypes GET /devicetypes Get Device Types
ACDeviceTypesApi getDeviceTypesByApplication GET /applications/{appId}/devicetypes Get Device Types by Application
ACDeviceTypesApi getLatestManifestProperties GET /devicetypes/{deviceTypeId}/manifests/latest/properties Get Latest Manifest Properties
ACDeviceTypesApi getManifestProperties GET /devicetypes/{deviceTypeId}/manifests/{version}/properties Get manifest properties
ACDevicesApi addDevice POST /devices Add Device
ACDevicesApi deleteDevice DELETE /devices/{deviceId} Delete Device
ACDevicesApi deleteDeviceToken DELETE /devices/{deviceId}/tokens Delete Device Token
ACDevicesApi getDevice GET /devices/{deviceId} Get Device
ACDevicesApi getDevicePresence GET /devices/{deviceId}/presence Get device presence information
ACDevicesApi getDeviceToken GET /devices/{deviceId}/tokens Get Device Token
ACDevicesApi updateDevice PUT /devices/{deviceId} Update Device
ACDevicesApi updateDeviceToken PUT /devices/{deviceId}/tokens Update Device Token
ACDevicesManagementApi createTasks POST /devicemgmt/tasks Create a new task for one or more devices
ACDevicesManagementApi deleteServerProperties DELETE /devicemgmt/devices/{did}/serverproperties Deletes a device's properties.
ACDevicesManagementApi getAllByDid GET /devicemgmt/devices/{did}/tasks Returns the list of tasks for a particular device id with optional status filter.
ACDevicesManagementApi getDeviceTypesInfo GET /devicemgmt/devicetypes/{dtid} Read a device type device management information.
ACDevicesManagementApi getManifestProperties GET /devicemgmt/devicetypes/{dtid}/manifest/properties Get a device type's device management manifest properties
ACDevicesManagementApi getProperties GET /devicemgmt/devices/{did}/properties Read a device's properties.
ACDevicesManagementApi getStatuses GET /devicemgmt/tasks/{tid}/statuses Returns the details and status of a task id and the individual statuses of each device id in the list.
ACDevicesManagementApi getStatusesHistory GET /devicemgmt/tasks/{tid}/statuses/history Returns the history of the status changes for a specific task id, or for a specific device id in that task.
ACDevicesManagementApi getTaskByID GET /devicemgmt/tasks/{tid} Returns the details and global status of a specific task id.
ACDevicesManagementApi getTasks GET /devicemgmt/tasks Returns the all the tasks for a device type.
ACDevicesManagementApi queryProperties GET /devicemgmt/devices/properties Query device properties across devices.
ACDevicesManagementApi updateDeviceTypesInfo PUT /devicemgmt/devicetypes/{dtid} Updates a device type information
ACDevicesManagementApi updateServerProperties POST /devicemgmt/devices/{did}/serverproperties Updates a device's server properties.
ACDevicesManagementApi updateTask PUT /devicemgmt/tasks/{tid} Updates a task for all devices – For now just allows changing the state to cancelled.
ACDevicesManagementApi updateTaskForDevice PUT /devicemgmt/tasks/{tid}/devices/{did} Updates a task for a specific device – For now just allows changing the state to cancelled.
ACDevicesSharesApi createShareForDevice POST /devices/{deviceId}/shares Share a device
ACDevicesSharesApi deleteSharingForDevice DELETE /devices/{deviceId}/shares/{shareId} Delete specific share of the given device id
ACDevicesSharesApi getAllSharesForDevice GET /devices/{deviceId}/shares List all shares for the given device id
ACDevicesSharesApi getSharingForDevice GET /devices/{deviceId}/shares/{shareId} Get specific share of the given device id
ACDevicesStatusApi getDeviceStatus GET /devices/{deviceId}/status Get Device Status
ACDevicesStatusApi getDevicesStatus GET /devices/status Get Devices Status
ACDevicesStatusApi putDeviceStatus PUT /devices/{deviceId}/status Update Device Status
ACExportApi exportRequest POST /messages/export Create Export Request
ACExportApi getExportHistory GET /messages/export/history Get Export History
ACExportApi getExportResult GET /messages/export/{exportId}/result Get Export Result
ACExportApi getExportStatus GET /messages/export/{exportId}/status Check Export Status
ACMessagesApi getAggregatesHistogram GET /messages/analytics/histogram Get Normalized Message Histogram
ACMessagesApi getFieldPresence GET /messages/presence Get normalized message presence
ACMessagesApi getLastNormalizedMessages GET /messages/last Get Last Normalized Message
ACMessagesApi getMessageAggregates GET /messages/analytics/aggregates Get Normalized Message Aggregates
ACMessagesApi getMessageSnapshots GET /messages/snapshots Get Message Snapshots
ACMessagesApi getNormalizedActions GET /actions Get Normalized Actions
ACMessagesApi getNormalizedMessages GET /messages Get Normalized Messages
ACMessagesApi sendActions POST /actions Send Actions
ACMessagesApi sendMessage POST /messages Send Message
ACMonetizationApi createPricingTiers POST /pricing/devicetypes/{dtid}/pricingtiers Define devicetype's pricing tiers.
ACMonetizationApi getPricingTiers GET /pricing/devices/{did}/pricingtiers Get a device's pricing tiers
ACMonetizationApi getThePricingTiers GET /pricing/devicetypes/{dtid}/pricingtiers Get devicetype's pricing tiers.
ACMonetizationApi getUpgradePath GET /pricing/devices/{did}/revenueshare/upgradepath Get upgrade path
ACMonetizationApi setPricingTier PUT /pricing/devices/{did}/pricingtiers Set a device's pricing tier
ACRegistrationsApi confirmUser PUT /devices/registrations/pin Confirm User
ACRegistrationsApi getRequestStatusForUser GET /devices/registrations/{requestId}/status Get Request Status For User
ACRegistrationsApi unregisterDevice DELETE /devices/{deviceId}/registrations Unregister Device
ACRulesApi createRule POST /rules Create Rule
ACRulesApi deleteRule DELETE /rules/{ruleId} Delete Rule
ACRulesApi getRule GET /rules/{ruleId} Get Rule
ACRulesApi updateRule PUT /rules/{ruleId} Update Rule
ACSubscriptionsApi createSubscription POST /subscriptions Create Subscription
ACSubscriptionsApi deleteSubscription DELETE /subscriptions/{subId} Delete Subscription
ACSubscriptionsApi getAllSubscriptions GET /subscriptions Get All Subscriptions
ACSubscriptionsApi getMessages GET /notifications/{notifId}/messages Get Messages
ACSubscriptionsApi getSubscription GET /subscriptions/{subId} Get Subscription
ACSubscriptionsApi validateSubscription POST /subscriptions/{subId}/validate Validate Subscription
ACTagsApi getTagCategories GET /tags/categories Get all categories
ACTagsApi getTagSuggestions GET /tags/suggestions Get tag suggestions
ACTagsApi getTagsByCategories GET /tags Get all tags of categories
ACTokensApi checkToken POST /accounts/checkToken Check Token
ACTokensApi refreshToken POST /accounts/token Refresh Token
ACTokensApi tokenInfo GET /accounts/tokenInfo Token Info
ACUsersApi createUserProperties POST /users/{userId}/properties Create User Application Properties
ACUsersApi deleteUserProperties DELETE /users/{userId}/properties Delete User Application Properties
ACUsersApi getSelf GET /users/self Get Current User Profile
ACUsersApi getUserDeviceTypes GET /users/{userId}/devicetypes Get User Device Types
ACUsersApi getUserDevices GET /users/{userId}/devices Get User Devices
ACUsersApi getUserProperties GET /users/{userId}/properties Get User application properties
ACUsersApi getUserRules GET /users/{userId}/rules Get User Rules
ACUsersApi listAllSharesForUser GET /users/{userId}/shares Get User shares
ACUsersApi updateUserProperties PUT /users/{userId}/properties Update User Application Properties
ACWhitelistingApi deleteVdid DELETE /devicetypes/{dtid}/whitelist/{vdid} Delete a vdid from the devicetype whitelist.
ACWhitelistingApi deleteWhitelistCertificate DELETE /devicetypes/{dtid}/whitelist/certificates/{cid} Delete a whitelist certificate associated with a devicetype.
ACWhitelistingApi enableWhitelist PUT /devicetypes/:dtid/whitelist/enable Enable or disble whitelist feature of a device type
ACWhitelistingApi getRejectedRowList GET /devicetypes/{dtid}/whitelist/{uploadId}/rejectedRows Get the list of rejected rows for an uploaded CSV file.
ACWhitelistingApi getUploadStatus GET /devicetypes/{dtid}/whitelist/{uploadId}/status Get the status of a uploaded CSV file.
ACWhitelistingApi getWhitelist GET /devicetypes/{dtid}/whitelist Get whitelisted vdids of a device type.
ACWhitelistingApi getWhitelistCertificate GET /devicetypes/{dtid}/whitelist/certificates Get whitelist certificate of device type.
ACWhitelistingApi getWhitelistStatus GET /devicetypes/{dtid}/whitelist/status Get the status of whitelist feature (enabled/disabled) of a device type.
ACWhitelistingApi uploadCSV POST /devicetypes/{dtid}/whitelist Upload a CSV file related to the Device Type.

Documentation For Models

Documentation For Authorization

artikcloud_oauth

Usage

Peek into tests for examples about how to use the SDK.

In addition, you can look at our tutorial and sample applications. These will give you a good overview of what you can do and how to do it.

More about ARTIK Cloud

If you are not familiar with ARTIK Cloud, we have extensive documentation at https://developer.artik.cloud/documentation

The full ARTIK Cloud API specification can be found at https://developer.artik.cloud/documentation/api-reference/

Check out advanced sample applications at https://developer.artik.cloud/documentation/samples/

To create and manage your services and devices on ARTIK Cloud, create an account at https://developer.artik.cloud

Also see the ARTIK Cloud blog for tutorials, updates, and more: http://artik.io/blog/cloud

Licence and Copyright

Licensed under the Apache License. See LICENSE.

Copyright (c) 2017 Samsung Electronics Co., Ltd.

Latest podspec

{
    "name": "ArtikCloud",
    "version": "2.2.3",
    "summary": "ARTIK Cloud API",
    "description": "No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)",
    "platforms": {
        "ios": "7.0"
    },
    "requires_arc": true,
    "frameworks": "SystemConfiguration",
    "homepage": "https://github.com/artikcloud/artikcloud-objc",
    "license": "Proprietary",
    "source": {
        "git": "https://github.com/artikcloud/artikcloud-objc.git",
        "tag": "2.2.3"
    },
    "authors": {
        "Samsung Artik Cloud": "[email protected]"
    },
    "source_files": "ArtikCloud/**/*.{m,h}",
    "public_header_files": "ArtikCloud/**/*.h",
    "dependencies": {
        "AFNetworking": [
            "~> 3"
        ],
        "JSONModel": [
            "~> 1.2"
        ],
        "ISO8601": [
            "~> 0.6"
        ]
    }
}

Pin It on Pinterest

Share This