S1 Ignition Pack Mobile Applications

Salesforce1 Ignition Mobile App Pack

Welcome and thank you for your interest in the Salesforce1 Ignition Pack! All code is open source and available on GitHub, as well as the AppExchange Package and through the code that we distribute with our AppExchange unmanaged package.  We are excited to share our initial release of the pack and will make a best effort to help with any setup issues you encounter.  For a technical deep dive, please review the Salesforce1 Ignition Pack Technical Architecture Overview. The pack consists of the following applications and instructions on setup and configuration follow.

What’s in the Pack?

Scout

Find nearby opportunities within Accounts. Filter by your skill set, news & tap to view an Account on an interactive map. View skill set match & if news from Gist is negative or positive.

see Scout features in action

Magellan

Interactive map, displaying nearby Opportunities. Switch to a Social view to see Opportunities based on news events. Access the Opportunities view, Contacts view, Gist for that Account & Drive time & directions.

see Magellan features in action

Deal Fuel

Cliff notes, optimized for a mobile device, based on skill gaps determined through Product certifications. Explore cliff notes, quizzes & references.

see Deal Fuel features in action

Gist

Your key account news, sorted, ranked & filtered to surface the most relevant information. Filter based on business conditions, like your meetings for a given day. Get a quick understanding of what matters.

see Gist features in action

Postbox

Share Library files to be shared with Contacts via email or within a Community. If the Contact is not a Community User, Postbox automatically provisions them.

see Postbox features in action

Kokua

Nearby corporate services for a given office (front desk, security, maintenance, etc), city (food, etc) & global services like HR. No filtering, no searching, just the most relevant content.

see Kokua features in action

The following provides an overview of the steps needed to get your Salesforce1 Ignition Pack setup.  The Heroku application that powers Gist, Magellan and Scout social and news capabilities can be installed by using the Heroku deploy button below.  If you are only using the other applications, this is not necessary, as you can choose to only use some of the applications from the suite.  In the following sections videos will walk you through click-by-click through each part of the installation, setup and familiarity with each part of the suite.

Install App Exchange Package

Current Status – please note that the package currently comes with a series of tabs pre-configured.  Due to some Organizations running into tab limits, I am currently working on republishing to remove the tabs and allow them to be added back in as needed.  If you have available tabs, the current package will work without issue.  Thanks!

Sign into your Salesforce account.  If you do not have one, signup for a free developer account. Install the S1 Ignition Pack from the Salesforce App Exchange using the link below. In order for applications within the Pack to connect with outside resources like News and Social data, we need to get some keys to talk to them on your behalf.  Get your API keys, IDs and secrets from the following links. Create Google Map Key Create Twitter API Key Create Faroo API Key

Install Heroku App

Deploy the News and Social Crawling application with Heroku and the keys you created from the above steps. If you do not have a Heroku account, you can signup for one using the following link Signup for Heroku Once you have a Heroku account or are logged in, use the following button to deploy the Salesforce1 Ignition App to your Heroku instance

Deploy

Follow the directions below this quickstart to finalize the Heroku application setup by connecting the application to its database.  For troubleshooting you may want to download the Heroku Toolbelt to get visibility into any issues with your configuration.

Configure Heroku & Salesforce

Configure your Salesforce instance’s Google Map’s API Key, URL to Heroku Services, Layouts, and Objects. Complete directions follow this quickstart section of the guide. Scroll down this page to get the detailed directions for this setup.

Rejoice

Grab a beverage of choice, sit back and enjoy the Salesforce1 Ignition Pack!

Step-by-Step Configuration for Salesforce & Heroku

Foundation – AppExchange Install and Heroku App Configuration

Step through the process of installing the Ignition Pack from the App Exchange and into your Salesforce environment.  Once installed, you will be guided through using the Heroku Deploy button to install the Heroku application required for some of the above applications.  We then cover the following topics

  • Setting up a Connected App with OAuth
  • Configuring Heroku Config Vars to point to your Salesforce instance
  • Configuring Salesforce to connect with your Heroku app
  • Configuring Salesforce with an API key for Google Maps
  • Configuring Heroku Config Vars to connect with Twitter, Google and Faroo with API keys

Play Video 1

Gist, Scout & Magellan – Account Object Layout, Setup and Geolocation

In order for Gist, Magellan and Scout to understand news and social activity for Opportunities, we need to setup a few things related to our Accounts.  In this video the following items are covered

  • Adding Twitter, Location (geolocation) and Mapping Status custom fields to the Account Layout
  • Adding a custom Visualforce Page that will automatically grab and save the geolocation coordinates for the Billing Address in your custom Location field
  • Running through a quick example of using the above Visualforce Page to quickly get geolocation information for your Accounts

Play Video 2

Deal Fuel – Product and Badges Objects Layout and Setup

The following provides the foundation for Deal Fuel, specifically setting up Products and Badges.  To understand what expertise is helpful to sell a given Product, we assign it a Badge that represents a certain type of knowledge or level of achievement in a particular subject area.  Users can then be associated with Badges that make sense given classes, seminars, etc they have received or obtained.  In this video we cover

  • Updating the Product layout to include Badges as a Product Badges related list
  • Creating a Badge
  • Associating the Badge to a Product
  • Assigning a Badge to a User

Play Video 3

Deal Fuel – Class, Badge and Study Materials Setup

Taking the setup from step 3 further, we now will setup Classes to group Study Materials that will be presented to users who are looking at Opportunities and need helpful Study Materials (quizzes, cliff notes, etc) to help covers areas of expertise that are needed for the Product associated with the Opportunity, but they have not obtained.  If you want Study Materials to always be shown to users, regardless of their skill level, do not assign Badges to Users.  In this section we will

  • Create Classes
  • Associate Badges that represent skill areas that a Class is helpful at educating people around
  • Create Class Materials that group Study Materials (quizzes, cliff notes, etc) for a particular Class
  • Add Slides to Study Materials.  A slide is equivalent to a Quiz Question or a Powerpoint Slide

Play Video 4 Additional Notes

  • References – appear at the bottom of the Deal Fuel page for a given Opportunity.  All other Study Material types will show at the top of a Deal Fuel page (below any information about Badges)
  • Slides with Images – to create a Slide with an image, use Attach File under “Notes & Attachments” for a particular Slide.  The Slide will use its Name field, along with the Attachment when the Slide is shown to the end user
  • Slides with Audio – MP3 format is supported for adding audio to a Slide.  To add audio use Attach File under “Notes & Attachments” for a particular slide.  Currently only 1 audio segment per Study Material has been tested.

Postbox – Community, Publisher Action and Library Setup

The Community portion is optional, but required if you wish to use the full Postbox feature set.  We step through

  • Adding a Community Shares Related List to the Contact Layout
  • Enabling Communities and adding a custom Visualforce Page to the navigation to enable sharing of Library Documents with Contacts
  • Creating a Community Share (at least one empty one – even if never used – is required for Postbox to function)
  • Adding the Postbox customer Publisher Action to the Contact Layout
  • Configuring a sample folder and document in the Library to be used for sharing

Play Video 5 Note on Colors for Document Types

  • Documents that you tag in your library with the words statusstripe, datasheet, contract, agreement or warranty will be represented with special colors.  They colors be updated in the code for the Visualforce page s1m_postboy.page.

Kokua – Corporate Offices & Corporate Services Objects and Salesforce1 Navigation Setup

Kokua is a streamlined version of Yelp for Corporate services – with no search options – it shows available services based on your geography.  To setup the services we walk through the following

  • Creating Corporate Offices
  • Creating Corporate Services – both internal and ones provided by third parties
  • Configuring Salesforce1 Navigation for applications from the Ignition Pack

Play Video 6

Testing – First News Scan, Heroku Troubleshooting and App Testing

Congratulations for making it this far!  Now we are able to get onto the fun parts – actually using our new applications.  In this video we cover running our news and social craw for the first time.  Please note that you will need to have added Twitter information to your Accounts in the second step above for the crawl to work.  In the video the following will be covered

  • Manually running the first news & social scan*
  • Quickly showing how to get visibility into the processes running within your Heroku application if it is not working or to ensure that it is pulling in data
  • Live tests of all applications within the suite – Gist, Kokua, Magellan, Scout, Deal Fuel and Postbox

* if you are using a paid instance of Heroku (e.g. one that does not turn off when not in  use and comes back online when requested) the app will automagically run each day to scan the sources without requiring any manual intervention Play Video 7 Final Notes If you wish to add Gist (news and social) or Deal Fuel links within the regular Salesforce1 Account or Opportunity Layouts, simply add a Custom Formula Field as follows (depending on which you would like to add)

HYPERLINK(“/apex/s1m_metro_news?id=” & Id , “News”)
HYPERLINK(“/apex/s1m_deal_fuel?id=” & Id , “Deal Fuel”)

29 Comments
  • fullerc
    Reply
    December 11, 2014

    I followed the link to create a Faroo API key, completed the form, but received no key yet (just short of 24 hours).

    Also, for the last field on the form:
    “Your server IPs (server→API) & website domains (browser→API).
    Your User-Agent header (app→API):
    To protect your rate limit your key is blocked from domains/referers & server IPs not specified.”

    Should I just enter “salesforce.com”, or do I need to provide additional information?

    Thanks!

  • John Brunswick
    Reply
    December 13, 2014

    fullerc sorry for the delay – somehow the comment was auto-marked as spam – not sure why.

    The API for Faroo will be called from the Heroku application, so you can use your Heroku app url (e.g. http://myappname.herokuapp.com)

    Let me know if that helps.  Thanks!

  • fullerc
    Reply
    December 15, 2014

    John Brunswick fullerc Thanks! That worked perfectly, I’m proceeding along with the videos now.

    Feedback – For the Corporate Services objects, there is a Type field. Once of the options is ‘Font Desk’, I believe this should be ‘Front Desk’.

    Great work!

  • John Brunswick
    Reply
    December 15, 2014

    fullerc John Brunswick Thanks!  Will definitely correct in a future release – for now I will just have to say that it is a “fully configurable feature” 😉

  • fullerc
    Reply
    December 15, 2014

    John Brunswick fullerc Everything seems to work great now, except for:
    Magellan – if I click the Opportunity or Contact icon over an account, I get the following:
    “Oops, we’ve run into an unexpected problem. Please try again later.”

    Not sure if it helps, but here’s my Heroku log when I go into Magellan:
    2014-12-15T20:39:53.115618+00:00 heroku[router]: at=info method=OPTIONS path=”/api/mapevents” host=install-demo.herokuapp.com request_id=7c6f1b1d-92d5-411b-8068-5d72b48988e2 fwd=”157.130.80.218″ dyno=web.1 connect=7ms service=36ms status=204 bytes=291
    2014-12-15T20:39:53.257981+00:00 app[web.1]: user – chris@fuller.io
    2014-12-15T20:39:53.428308+00:00 heroku[router]: at=info method=POST path=”/api/mapevents” host=install-demo.herokuapp.com request_id=632796eb-592a-4188-8160-a03fbc59b937 fwd=”157.130.80.218″ dyno=web.1 connect=12ms service=178ms status=200 bytes=261
    2014-12-15T20:39:53.873792+00:00 heroku[router]: at=info method=GET path=”/img/map-pin-here-retina.png” host=install-demo.herokuapp.com request_id=3a7d00b5-b8dc-406d-9cf0-357b9dd679d4 fwd=”157.130.80.218″ dyno=web.1 connect=1ms service=2ms status=304 bytes=270
    2014-12-15T20:39:53.874847+00:00 heroku[router]: at=info method=GET path=”/img/map-pin-opp-sm-na-retina.png” host=install-demo.herokuapp.com request_id=aefb8c51-65fc-4d04-91c0-9ef49898c078 fwd=”157.130.80.218″ dyno=web.1 connect=2ms service=3ms status=304 bytes=270
    2014-12-15T20:39:54.111246+00:00 heroku[router]: at=info method=GET path=”/img/map-pin-opp-sm-na-retina.png” host=install-demo.herokuapp.com request_id=921c2d2a-2c98-4e9e-b88a-94764dc298bb fwd=”157.130.80.218″ dyno=web.1 connect=2ms service=12ms status=304 bytes=270
    2014-12-15T20:40:02.380098+00:00 heroku[router]: at=info method=OPTIONS path=”/api/mapevents” host=install-demo.herokuapp.com request_id=9198d1b1-9f97-4fe2-ac20-28050aacf64f fwd=”157.130.80.218″ dyno=web.1 connect=3ms service=6ms status=204 bytes=291
    2014-12-15T20:40:02.457704+00:00 heroku[router]: at=info method=POST path=”/api/mapevents” host=install-demo.herokuapp.com request_id=03dd2bb2-b862-4f4b-b902-c789fdaaa10c fwd=”157.130.80.218″ dyno=web.1 connect=10ms service=19ms status=200 bytes=261
    2014-12-15T20:40:02.458909+00:00 app[web.1]: user – chris@fuller.io

  • John Brunswick
    Reply
    December 16, 2014

    Had a recent question related to needing or not needing a Token.  The Token is required for any of the apps above that communicate with Heroku (Gist, Scout & Magellan).  Deal Fuel, Postbox and Kokua do not require a Token to function.  Hope that helps!

  • amldnhr
    Reply
    December 22, 2014

    Do all the apps need to be installed?   We may only wish to surface 2 of them.   Also,  any language support issues?  Traditional and simplified Chinese is in play as well as english and French.

  • John Brunswick
    Reply
    December 22, 2014

    amldnhr all will be installed, but you can select which ones to be surfaced.  For the text that is part of the UI (not the actual content, but the text that appears in the UI regardless) it is currently only in English.

  • sksfdc
    Reply
    January 6, 2015

    Hi
    John,
    This is really a very useful
    set of applications.  I am trying to
    enable just the Magellan app.  Able to get the google map with current
    location and opportunities. Now when I try to either click on opportunity or
    contact icon, getting  internal server error Error ID: 78485463-84675
    (253976770).  Looking at the
    code, both the icons (Contact and Opportunity ) when clicked are calling sforce.one.navigateToRelatedList(‘RelatedContactList’,
    ‘XXXXXXXAcctId’) or sforce.one.navigateToRelatedList(‘RelatedOppurtunityList’,
    ‘XXXXXXXAcctID’).

    Do you
    know why would it throw internal error message (something throne inside visual
    force page).  I would really appreciate if you can take a look
    at this issue.
    Thanks,
    SKSFDC

  • John Brunswick
    Reply
    January 7, 2015

    sksfdc Thanks – can you send me more details offline?  That is odd, if you enable the Debug Logs – can you see what the actual error being thrown is? https://help.salesforce.com/HTViewHelpDoc?id=code_debug_log.htm&language=en_US

    It is one of the basic navigation link methods with S1 and should be pretty solid.

    Cheers,
    John

  • sarvos1
    Reply
    January 19, 2015

    Hi John,  

    This looks like a really useful app.  I have been trying to install, but am running into issues.  I have tried many things to resolve, including installing the npm and creating another directory under appdata/roaming, but am not able to resolve this error.  I am stuck.  Any ideas on how to fix so I can install?

    —–> Building dependencies Rebuilding any native modules for this architecture
    npm ERR! Error: spawn ENOENT
    npm ERR! at errnoException (child_process.js:1000:11)
    npm ERR! at Process.ChildProcess._handle.onexit (child_process.js:791:34)
    npm ERR! If you need help, you may report this log at:
    npm ERR! <http://github.com/isaacs/npm/issues&gt;
    npm ERR! or email it to:
    npm ERR! <npm-@googlegroups.com>

    npm ERR! System Linux 3.13.0-40-generic
    npm ERR! command “node” “/tmp/build_9f94496a5464229ba44f589ac861c8e0/JohnBrunswick-Salesforce1-Ignition-50e16e6/.heroku/node/bin/npm” “rebuild”
    npm ERR! cwd /tmp/build_9f94496a5464229ba44f589ac861c8e0/JohnBrunswick-Salesforce1-Ignition-50e16e6
    npm ERR! node -v v0.10.29
    npm ERR! npm -v 1.1.71
    npm ERR! syscall spawn
    npm ERR! code ENOENT
    npm ERR! errno ENOENT
    npm ERR! Error: spawn ENOENT
    npm ERR! at errnoException (child_process.js:1000:11)
    npm ERR! at Process.ChildProcess._handle.onexit (child_process.js:791:34)
    npm ERR! If you need help, you may report this log at:
    npm ERR! <http://github.com/isaacs/npm/issues&gt;
    npm ERR! or email it to:
    npm ERR! <npm-@googlegroups.com>

    npm ERR! System Linux 3.13.0-40-generic
    npm ERR! command “node” “/tmp/build_9f94496a5464229ba44f589ac861c8e0/JohnBrunswick-Salesforce1-Ignition-50e16e6/.heroku/node/bin/npm” “rebuild”
    npm ERR! cwd /tmp/build_9f94496a5464229ba44f589ac861c8e0/JohnBrunswick-Salesforce1-Ignition-50e16e6
    npm ERR! node -v v0.10.29
    npm ERR! npm -v 1.1.71
    npm ERR! syscall spawn
    npm ERR! code ENOENT
    npm ERR! errno ENOENT
    npm ERR!
    npm ERR! Additional logging details can be found in:
    npm ERR! /tmp/build_9f94496a5464229ba44f589ac861c8e0/JohnBrunswick-Salesforce1-Ignition-50e16e6/npm-debug.log
    npm ERR! not ok code 0
    —–> Build failed
    WARNING: Avoid checking node_modules into source control
    https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git-

    WARNING: This version of npm (1.1.71) has several known issues – consider upgrading to the latest release (2.2.0)
    https://devcenter.heroku.com/articles/nodejs-support#specifying-an-npm-version

    We’re sorry this build is failing! If you can’t find the issue in application code,
    please submit a ticket so we can help: https://help.heroku.com/
    You can also try reverting to our legacy Node.js buildpack:
    heroku config:set BUILDPACK_URL=https://github.com/heroku/heroku-buildpack-nodejs#v63

    Love,
    Heroku
    ! Push rejected, failed to compile Node.js app

  • sksfdc
    Reply
    January 20, 2015

    John Brunswick Sorry,  just got tied up with something.  Nothing is thrown in the debug logs.  But with related to those functions mentioned above, I found that its a known issue with salesforce :-

    https://developer.salesforce.com/forums?id=906F0000000Aqj9IAC

    https://success.salesforce.com/issues_view?id=a1p30000000T3pcAAC

    May be I will try installing it in a different instance of SFDC and will let you know soon.

    Thanks,

    SK

  • John Brunswick
    Reply
    January 21, 2015

    sksfdc thanks – keep me posted and let me know if the other instance works.  Cheers

  • sksfdc
    Reply
    January 22, 2015

    John Brunswick  I tried it on the different instance of sfdc  as well.  But getting similar error.  I do not see any thing in the debug logs.  I can share those logs with you, may be you can point me to the right direction.  So email address should be sending those logs to ?

    Thanks,

  • Kevin McDonald
    Reply
    February 27, 2015

    Hi John,

    I have not been able to get a definitive answer on this – can I use the S1 Ignition app in a SF Professional Edition Environment?  The AppExchange listing says it is possible, but I get an error when attempting to install.  I know there are functionality restrictions in PE but this would be a very valuable app for us.

    Thanks,

    Kevin

  • vzmind
    Reply
    March 4, 2015

    Hi John, just discovered your app package today and got really excited about it. I have done all the setup till video #2 (included). Correct me if I am wrong, I should now be able to use the Magellan app. So opening the Magellan from my browser I unfortunately got those 2 errors on the console: 

    Application Cache Error event: Failed to parse manifest https://c.eu5.visual.force.com/apex/CacheManifest
    https://tquila-ignition.herokuapp.com/token?sessionId=00D24000000KmHr!AREAQ…c.eu5.visual.force.com/services/Soap/u/8.0/00D24000000KmHr&_=1425484865948 Failed to load resource: the server responded with a status of 401 (Unauthorized)

    Logs on the Heroku apps dont say much either: 

    2015-03-04T15:38:49.175986+00:00 heroku[router]: at=info method=GET path=”/token?sessionId=00D24000000KmHr!AREAQMmyVtZsqm_Kta.AP_YLTFvSsh8bgMyVKYgUUZDM0ykkgrT0IWkMrRaUJ4aawz6xxxxxxxxxxxx0_7ACHYxfjj_N&serverUrl=https://c.eu5.visual.force.com/services/Soap/u/8.0/00D24000000KmHr&_=1425484865948″ host=tquila-ignition.herokuapp.com request_id=1e70338c-89ec-4e7c-90bc-330adbf5dd31 fwd=”217.33.76.34″ dyno=web.1 connect=6ms service=4ms status=401 bytes=302

    Few notes and tests I did so far:

    – Cors ENV is configured as requested
    – Client ID and SECRET are correctly setup
    – Custom Settings for the Heroku endpoint is using https to avoid security errors. 

    – Location VF is working as demoed and location coordinates updated correctly when the address is updated 

    – Account scan (S1M_Session VF P) fail with the same error: Failed to load resource: the server responded with a status of 401 (Unauthorized)

    Any idea where this all come from ?

  • John Brunswick
    Reply
    March 5, 2015

    Kevin McDonald thanks – appreciate your patience.  It is most likely a limit with your current Tab count.  Because the pack combines a series of services across each area of the pack (news for instance), I have pre-setup the tabs.  Did you receive any specific / error in particular?

    Thanks!

  • Kevin McDonald
    Reply
    March 5, 2015

    John Brunswick Thanks for the reply – I should have included the error message in previous post.  it is:”Missing feature – Installing this package requires the following feature and its associated permissions: Apex Classes”
    Thanks
    Kevin

  • BrentTaylor
    Reply
    March 12, 2015

    Hi John,

    Great apps thanks very much.  I keep running into this error when deploying in Heroku:

    Build App
    There was an issue building your app. This can mean your app.json’s project is not a valid Heroku application. Please ensure your app is deployable to Heroku and try again.

    Any thoughts?

    Thanks again,
    BT

  • John Brunswick
    Reply
    March 12, 2015

    BrentTaylor Thanks – are you using the Deploy button above?  Or are you just using the source?  Will take a look

  • BrentTaylor
    Reply
    March 12, 2015

    John Brunswick BrentTaylor Thanks for the quick response.

    I’m using the deploy button above.

  • John Brunswick
    Reply
    March 29, 2015

    BrentTaylor – should be good to go now – had to update the package.json file for the Heroku button, as there are now newer versions of Node Package Manager and Node.  Please let me know if it works now.  Thanks!!

  • mfede
    Reply
    May 30, 2015

    After stepping through the AppExchange portion and Heroku, all of which were followed to a T and performed against a Dev org in SFDC, I get the following and the app appears ‘corrupt’ or missing some other dependencies: 

    “List has no rows for assignment to SObject An unexpected error has occurred. Your development organization has been notified.”

    Also, after making the modifications to Account Layout and dragging the fields, they don’t show on the Account page unless I Edit the Account, in which I’m able to change the values and save, but the Account view doesn’t show the fields. Any thoughts?

  • Simon Whight
    Reply
    August 28, 2015

    EPeng Same error for me too:

    1.  sObject type
    ‘ContentWorkspace’ is not supported.
    s1m_postboy: sObject type ‘ContentWorkspace’ is not
    supported.
    2.  sObject type
    ‘ContentWorkspace’ is not supported.
    s1m_postboy_test: sObject type ‘ContentWorkspace’ is not
    supported.
    3.  Apex class
    ‘s1m_postboy’ does not exist
    s1m_postboy: Apex class ‘s1m_postboy’ does not exist
    4.  Visualforce
    page does not have valid controller for use with action
    Contact.Postbox: Visualforce page does not have valid
    controller for use with action

    John Brunswick

  • dsekules
    Reply
    September 21, 2015

    EPeng and Simon Whight – Just tried installing this into a Dev sandbox and came across the same error message. Did you guys ever get a response from John Brunswick about this?

  • John Brunswick
    Reply
    September 22, 2015

    dsekules EPeng Simon Whight John Brunswick thanks guys – do you have Content enabled in your Orgs? https://developer.salesforce.com/docs/atlas.en-us.api.meta/api/sforce_api_objects_contentworkspace.htm

  • dsekules
    Reply
    September 22, 2015

    John Brunswick

    Ah. Quite possibly not. I’ll check; if I don’t reply to this then assume that fixed it… 😉

    Good man, thanks!

  • DevSandbox2
    Reply
    March 1, 2016

    Keep running on this error while deploying to heroku via deploy button above

    New App
    The addon “pgstudio” does not exist. Please ensure that the addon is spelled correctly.

  • Matt Pine
    Reply
    May 19, 2016

    DevSandbox2 I’m getting the same error as well. Looks like it’s been a few months since you saw this error.

    John Brunswick are you still maintaining this app? We’ve got some significant interest from a customer to implement this, but we need to get it working for POC.

    Feel free to email me directly: matt#StarrData.com

Leave a comment