diff --git a/docs/giphy_api.md b/docs/giphy_api.md
deleted file mode 100755
index e69de29..0000000
diff --git a/docs/harbour-sailfinder.zip b/docs/harbour-sailfinder.zip
deleted file mode 100644
index 3661570..0000000
Binary files a/docs/harbour-sailfinder.zip and /dev/null differ
diff --git a/docs/harbour-sailfinder/docs/classes.md b/docs/harbour-sailfinder/docs/classes.md
deleted file mode 100644
index 9dedce9..0000000
--- a/docs/harbour-sailfinder/docs/classes.md
+++ /dev/null
@@ -1,17 +0,0 @@
-# Classes
-
-Sailfinder V3.0 will move to object oriented programming so I want a good idea on how I am going to split the API parts.
-
-### Tinder
-
-**Profile**
-Will contain all the information about the user his profile such as:
-- Pictures
-- Current location
-- Bio
-- Schools
-- Job
-- Gender
-- Interested in
-- Max search radius
-- ...
diff --git a/docs/harbour-sailfinder/docs/facebook_api.md b/docs/harbour-sailfinder/docs/facebook_api.md
deleted file mode 100644
index 3024e26..0000000
--- a/docs/harbour-sailfinder/docs/facebook_api.md
+++ /dev/null
@@ -1,44 +0,0 @@
-# Facebook Graph API
- _with Python Requests_
-
-**Only for reference since the API clearly documented on the Facebook Developer pages.**
-
-### Get all albums of users
-```
-fb_albums = session.get("https://graph.facebook.com/v2.6/" + fb_user_id + "/albums?access_token=" + fb_token)
-```
-
-Parameter info:
-
-
-
-
- fb_user_id
- **string**: The user id from Facebook for this app.
-
-
- fb_token
- **string**: A valid FB token for this app and this user.
-
-
-
-
-### Get all photos of users
-```
-fb_photos = session.get("https://graph.facebook.com/v2.6/" + fb_album_id + "/photos?access_token=" + fb_token)
-```
-
-Parameter info:
-
-
-
-
- fb_album_id
- **string**: The album id from Facebook which can be get by quering all the albums from Facebook.
-
-
- fb_token
- **string**: A valid FB token for this app and this user.
-
-
-
diff --git a/docs/harbour-sailfinder/docs/facebook_api.md.html b/docs/harbour-sailfinder/docs/facebook_api.md.html
deleted file mode 100644
index 33c5a06..0000000
--- a/docs/harbour-sailfinder/docs/facebook_api.md.html
+++ /dev/null
@@ -1,541 +0,0 @@
-
-
-
-
- facebook_api
-
-
- Facebook Graph API
- with Python Requests
-Only for reference since the API clearly documented on the Facebook Developer pages.
-Get all albums of users
-fb_albums = session.get(" https://graph.facebook.com/v2.6/ " + fb_user_id + "/albums?access_token=" + fb_token)
Parameter info:
-
-
-
- fb_user_id
- string : The user id from Facebook for this app.
-
-
- fb_token
- string : A valid FB token for this app and this user.
-
-
-
-
-Get all photos of users
-fb_photos = session.get(" https://graph.facebook.com/v2.6/ " + fb_album_id + "/photos?access_token=" + fb_token)
Parameter info:
-
-
-
- fb_album_id
- string : The album id from Facebook which can be get by quering all the albums from Facebook.
-
-
- fb_token
- string : A valid FB token for this app and this user.
-
-
-
-
diff --git a/docs/harbour-sailfinder/docs/giphy_api.md b/docs/harbour-sailfinder/docs/giphy_api.md
deleted file mode 100644
index 52fb444..0000000
--- a/docs/harbour-sailfinder/docs/giphy_api.md
+++ /dev/null
@@ -1,24 +0,0 @@
-# GIPHY API
- _with Python Requests_
-
-**Sniffed by myself**
-
-```
-search_word = search_word.replace(" ", "+") #Confirm with the Giphy API
-gifs = session.get("http://api.giphy.com/v1/gifs/search?q=" + search_word + "&api_key=fBEDuhnVCiP16"
-```
-
-Parameter info:
-
-
-
-
- search_word
- **string**: The word on which you want to find GIFs.
-
-
-
-
-Note: You need to replace every space in the search word by '+' for the GIPHY API.
-
-*The GIPHY API key for the app Tinder is: `fBEDuhnVCiP16`*
diff --git a/docs/harbour-sailfinder/docs/giphy_api.md.html b/docs/harbour-sailfinder/docs/giphy_api.md.html
deleted file mode 100644
index 4f9c8d8..0000000
--- a/docs/harbour-sailfinder/docs/giphy_api.md.html
+++ /dev/null
@@ -1,524 +0,0 @@
-
-
-
-
- giphy_api
-
-
- GIPHY API
- with Python Requests
-Sniffed by myself
-search_word = search_word.replace(" ", "+") #Confirm with the Giphy API
gifs = session.get(" http://api.giphy.com/v1/gifs/search?q= " + search_word + "&api_key=fBEDuhnVCiP16"
Parameter info:
-
-
-
- search_word
- string : The word on which you want to find GIFs.
-
-
-
-
-Note: You need to replace every space in the search word by '+' for the GIPHY API.
-The GIPHY API key for the app Tinder is: fBEDuhnVCiP16
-
diff --git a/docs/harbour-sailfinder/docs/tinder_api.md b/docs/harbour-sailfinder/docs/tinder_api.md
deleted file mode 100644
index 9f1690c..0000000
--- a/docs/harbour-sailfinder/docs/tinder_api.md
+++ /dev/null
@@ -1,1323 +0,0 @@
-# Tinder API
- _with Python Requests_
-
-**Inspired by this Github Gist and the rest is sniffed by myself.**
-
-
-### API Details
-
-
-
-
- Host
- api.gotinder.com
-
-
- Protocol
- SSL only
-
-
-
-
-*'api.gotinder.com' will be referred in this document as TINDER_HOST*
-
-Request headers
-
-
-
-
- Header name
- Description
-
-
-
-
- X-Auth-Token
- A UUID4 format authentication token obtained via the /auth api endpoint
-
-
- Content-type
- application/json
-
-
- app_version
- 371
-
-
- platform
- ios
-
-
- User-agent
- User-Agent: Tinder/4.6.1 (iPhone; iOS 9.0.1; Scale/2.00)
-
-
- os_version
- 900001
-
-
-
-
-All Python Requests examples need these headers!
-You can add these by running this command, after you established your session:
-
-```
-session.headers.update(HEADERS)
-```
-
-### Authenticating
-
-__Obtain a valid Facebook token before authenticating with the Tinder API!__
-
-```
-login = session.post(TINDER_HOST + '/auth', data=json.dumps({"facebook_token": facebook_token}))
-session.headers.update({"X-Auth-Token": login['token']})
-```
-
-Parameter info:
-
-
-
-
- facebook_token
- **string**: Facebook token from the OAuth dialog, valid for 60 days
-
-
-
-
-Since Augustus 2016, the login url of Tinder changed, the new url can be found here , check in the developer console of your browser for the token, or use Robobrowser to create an automated version of the login.
-
-Note: You can view best this link with the following browser agent:
-
-```
-Mozilla/5.0 (Linux; U; en-gb; KFTHWI Build/JDQ39) AppleWebKit/535.19 (KHTML, like Gecko) Silk/3.16 Safari/535.19
-```
-
-Response:
-```json
-{
- "token": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
- "globals": {
- "moments_interval": 30000,
- "boost_down": 8,
- "boost_up": 7,
- "updates_interval": 2000,
- "sparks": false,
- "share_default_text": "Get a Boost Invite friends to show up even higher in recommendations.
",
- "recs_size": 40,
- "fetch_connections": true,
- "invite_type": "client",
- "matchmaker_default_message": "I want you to meet someone. I introduced you on Tinder www.gotinder.com/app",
- "sparks_enabled": false,
- "mqtt": false,
- "kontagent_enabled": false,
- "boost_decay": 180,
- "recs_interval": 20000,
- "plus": true,
- "friends": true,
- "kontagent": false,
- "tinder_sparks": true
- },
- "user": {
- "active_time": "2017-01-07T14:39:01.234Z",
- "create_date": "2016-05-30T13:49:45.435Z",
- "purchases": [],
- "age_filter_min": 18,
- "discoverable": false,
- "full_name": "Your full name",
- "api_token": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
- "is_new_user": false,
- "connection_count": 1,
- "squads_discoverable": true,
- "interests": [],
- "bio": "",
- "jobs": [
- {
- "company": {
- "displayed": true,
- "id": "FB_ID of company",
- "name": "Self-Employed"
- },
- "title": {
- "displayed": true,
- "id": "FB_ID of title",
- "name": "Chief Executive Officer"
- }
- }
- ],
- "distance_filter": 99,
- "can_create_squad": true,
- "gender_filter": 0,
- "photos": [
- {
- "extension": "jpg",
- "url": "http://images.gotinder.com/user_id/picture_id.jpg",
- "fbId": "directupload",
- "fileName": "picture_id.jpg",
- "id": "picture_id",
- "processedFiles": [
- {
- "url": "http://images.gotinder.com/user_id/640x640_picture_id.jpg",
- "width": 640,
- "height": 640
- },
- {
- "url": "http://images.gotinder.com/user_id/320x320_picture_id.jpg",
- "width": 320,
- "height": 320
- },
- {
- "url": "http://images.gotinder.com/user_id/172x172_picture_id.jpg",
- "width": 172,
- "height": 172
- },
- {
- "url": "http://images.gotinder.com/user_id/84x84_picture_id.jpg",
- "width": 84,
- "height": 84
- }
- ]
- }
- ],
- "ping_time": "2017-01-07T12:16:51.460Z",
- "groups": [
- "plus_subscription_999"
- ],
- "schools": [],
- "name": "first_name",
- "squads_only": false,
- "gender": 1,
- "photos_processing": false,
- "age_filter_max": 1000,
- "birth_date": "full_birthday",
- "_id": "user_id"
- },
- "versions": {
- "age_filter": "2.1.0",
- "trending_active_text": "10.0.0",
- "active_text": "0.0.0",
- "trending": "10.0.0",
- "matchmaker": "2.1.0"
- }
-}
-```
-
-### Updating your profile
-```
-profile = session.post(TINDER_HOST + '/profile', data=json.dumps({"discoverable" : discoverable, "age_filter_min" : age_min, "age_filter_max" : age_max, "gender": gender, "gender_filter" : gender_filter, "distance_filter" : distance, "bio": bio}))
-```
-
-Parameter info:
-
-
-
-
- discoverable
- **true**: Other users can swipe on you **false**: nobody can see you except for your matches
-
-
- gender
- **0**: I'm a male
- **1**: I'm a female
-
-
- gender_filter
-
- **-1**: show everyone
- **0**: show males
- **1**: show females
-
-
-
- age_filter_min
- **integer**: minimum age recommendations
-
-
- age_filter_max
- **integer**: maximum age recommendations
-
-
- distance_filter
- **integer**: search distance in miles (0 - 160 km)
-
-
-
-
-**Note**: No data returns in a response without changing the account settings.
-
-Response:
-
-```json
-{
- "_id":"user_id",
- "age_filter_max":1000,
- "age_filter_min":18,
- "badges":[],
- "bio":"",
- "birth_date":"1996-01-01T00:00:00.000Z",
- "blend":"optimal",
- "can_create_squad":true,
- "connection_count":0,
- "create_date":"2016-05-30T13:49:45.435Z",
- "discoverable":false,
- "distance_filter":99,
- "facebook_id":"135932223489915",
- "gender":1,
- "gender_filter":0,
- "interested_in":[
- 0
- ],
- "interests":[],
- "jobs":[
- {
- "company":{
- "displayed":true,
- "id":"594445203920155",
- "name":"Self-Employed"
- },
- "title":{
- "displayed":true,
- "id":"103113219728224",
- "name":"Chief Executive Officer"
- }
- }
- ],
- "location":null,
- "name":"John",
- "photo_optimizer_has_result":false,
- "photos":[
- {
- "extension":"jpg",
- "fbId":"directupload",
- "fileName":"picture_id.jpg",
- "id":"picture_id",
- "processedFiles":[
- {
- "height":640,
- "url":"http://images.gotinder.com/user_id/640x640_picture_id.jpg",
- "width":640
- },
- {
- "height":320,
- "url":"http://images.gotinder.com/user_id/320x320_picture_id.jpg",
- "width":320
- },
- {
- "height":172,
- "url":"http://images.gotinder.com/user_id/172x172_picture_id.jpg",
- "width":172
- },
- {
- "height":84,
- "url":"http://images.gotinder.com/user_id/84x84_picture_id.jpg",
- "width":84
- }
- ],
- "url":"http://images.gotinder.com/user_id/picture_id.jpg"
- }
- ],
- "ping_time":"2017-01-09T19:22:42.194Z",
- "pos":{
- "at":1483989762488,
- "lat":48.8567,
- "lon":2.3508
- },
- "pos_info":{
- "city":{
- "bounds":{
- "ne":{
- "lat":48.90164950000002,
- "lng":2.416341999999929
- },
- "sw":{
- "lat":48.815856999999994,
- "lng":2.2237277313554387
- }
- },
- "name":"Paris"
- },
- "country":{
- "bounds":{
- "ne":{
- "lat":51.089517,
- "lng":10.125
- },
- "sw":{
- "lat":41.310257,
- "lng":-9
- }
- },
- "cc":"FR",
- "name":"France"
- }
- },
- "schools":[],
- "squad_ads_shown":true,
- "squads_discoverable":true,
- "squads_only":false
-}
-```
-
-Note: the location used here is not a real one but set by the /user/ping endpoint to Paris, France.
-
-### Updating your school or work places
-```
-profile_school = session.put(TINDER_HOST + '/profile/school', data=json.dumps({"schools": [{"id": fb_school1_id}, {"id": fb_school2_id}], {...}}))
-
-profile_jobs = session.put(TINDER_HOST + '/profile/job', data=json.dumps({"jobs": {"company": [{"id": fb_job1_id}]}}))
-```
-
-Parameter info:
-
-
-
-
- schools
- **list**: List all your schools by using the fb_school_id, which need to be obtained from the Facebook Graph API.
-
-
- fb_school_id
- **string**: A FB id which represents the school
-
-
-
-
-
-
-
- jobs
- **string**: Your current jobs by using the fb_job_id, which need to be obtained from the Facebook Graph API.
-
-
- fb_job_id
- **list**: A FB id which represents the job and several other things about this job. TODO
-
-
-
-
-Note: The response is the same as with the endpoint /profile.
-
-
-### Spotify
-Pick your favourite song and add it to your profile.
-TO DO
-```
-```
-
-### Instagram
-Connect your Instragram account and add it to your profile.
-TO DO
-```
-```
-
-### Removing your school or work places
-```
-profile_school = session.delete(TINDER_HOST + '/profile/school')
-
-profile_jobs = session.delete(TINDER_HOST + '/profile/job')
-```
-
-Note: The response is the same as with the endpoint /profile.
-
-
-### Create, update and remove an username
-**DEPRECATED!**
-
-Create a username so you will show up on the Tinder webprofiles and share your profile on social media.
-
-```
-create_username = session.post(TINDER_HOST + '/profile/username', data=json.dumps({"username": username}))
-```
-
-```
-update_username = session.put(TINDER_HOST + '/profile/username', data=json.dumps({"username": username}))
-```
-
-```
-remove_username = session.delete(TINDER_HOST + '/profile/username')
-```
-
-Parameter info:
-
-
-
-
- username
- **string**: Username of your choice
-
-
-
-
-In case that the username is already taken, the user already registered one, ... then an error is returned:
-```json
-{
- "error":"User has already registered a username"
-}
-
-{
- "error":"User has no username to update"
-}
-
-{
- "error":"User has no username to remove"
-}
-```
-
-Note: The response is the same as with the endpoint /profile.
-
-
-### Create share link for social media
-**DEPRACTED!**
-
-```
-share_link = session.post(TINDER_HOST + '/user/{user_id}/share')
-```
-
-Parameter info:
-
-
-
-
- user_id
- **string**: Tinder user ID
-
-
-
-
-
-### Meta data
-HTTP POST on this endpoint returns a 404 HTTP ERROR in HTML. HTTP GET IS OK
-
-```
-meta_data = session.get(TINDER_HOST + '/meta')
-```
-
-
-### Reporting users
-```
-report = session.post(TINDER_HOST + '/report/{user_id}', data=json.dumps({"cause": cause}))
-```
-
-Parameter info:
-
-
-
-
- match_id
- **string**: Tinder match ID
-
-
- cause
-
- **0**: other
- **1**: SPAM
- **2**: inappropriate messages
- **4**: inappropriate pictures
- **5**: bad offline behavior
-
-
-
- text
- **string**: When cause=0, an explanation can be added to the report.
-
-
-
-
-### Upload local pictures to the Tinder image server
-Upload a picture to the Tinder image server.
-
-```
-local_upload = session.post('https://imageupload.gotinder.com/image?client_photo_id=ProfilePhoto' + str(int(time.time())*1000), json={'userId': userID}, files={'file': open('test.jpeg', 'rb')})
-```
-
-### Upload facebook pictures to the Tinder image server
-Select a Facebook photo and upload it to the Tinder image server.
-
-```
-upload_fb = session.post(TINDER_HOST + '/media', data=json.dumps({"transmit": "fb", "assets": [{"ydistance_percent": ydistance_percent,"id": fb_picture_id,"xoffset_percent": xoffset_percent,"yoffset_percent": yoffset_percent,"xdistance_percent": xdistance_percent}]}))
-```
-
-Parameter info:
-
-
-
-
- xdistance_percent
- **int**: zoom percentage in X, 0 = full zoom, 1 = no zoom
-
-
- ydistance_percent
- **int**: zoom percentage in Y, 0 = full zoom, 1 = no zoom
-
-
- xoffset_percent
- **int**: offset from the left corner in percentage (0...1)
-
-
- yoffset_percent
- **int**: offset from the top corner in percentage (0...1)
-
-
- id
- **string**: Facebook id of the picture
-
-
-
-
-### Remove picture
-Remove the picture from the Tinder image server, in case that the picture uploaded was from Facebook, then it will still exist on Facebook after this request.
-```
-remove_picture = session.delete(TINDER_HOST + '/media', data=json.dumps({"assets": [tinder_picture_id]}))
-```
-
-Parameter info:
-
-
-
-
- assets
- **list**: list of the pictures you want to delete with their Tinder picture id as strings.
-
-
-
-
-Response:
-
-```json
-{
- "A list of all the pictures after the operation."
-}
-```
-
-### Get info about a user
-
-GET request! POST request will result a 404 HTTP received as HTML instead of JSON!
-
-```
-send_message = session.get(TINDER_HOST + '/user/{user_id}')
-```
-
-Parameter info:
-
-
-
-
- user_id
- **string**: Tinder user ID
-
-
-
-
-Response:
-
-```json
-{
- "results":{
- "_id":"user_id",
- "badges":[],
- "bio":"",
- "birth_date":"1986-01-11T20:35:47.650Z",
- "birth_date_info":"fuzzy birthdate active, not displaying real birth_date",
- "common_connections":[],
- "common_friends":[],
- "common_interests":[],
- "common_likes":[],
- "connection_count":0,
- "distance_mi":12,
- "gender":0,
- "jobs":[],
- "name":"full_name",
- "photos":[
- {
- "extension":"jpg",
- "fileName":"picture_id.jpg",
- "id":"picture_id",
- "processedFiles":[
- {
- "height":640,
- "url":"http://images.gotinder.com/user_id/640x640_picture_id.jpg",
- "width":640
- },
- {
- "height":320,
- "url":"http://images.gotinder.com/user_id/320x320_picture_id.jpg",
- "width":320
- },
- {
- "height":172,
- "url":"http://images.gotinder.com/user_id/172x172_picture_id.jpg",
- "width":172
- },
- {
- "height":84,
- "url":"http://images.gotinder.com/user_id/84x84_picture_id.jpg",
- "width":84
- }
- ],
- "url":"http://images.gotinder.com/user_id/picture_id.jpg",
- "xdistance_percent":1,
- "xoffset_percent":0,
- "ydistance_percent":0.6666666865348816,
- "yoffset_percent":0.05138888955116272
- },
- {
- "extension":"jpg",
- "fileName":"picture_id.jpg",
- "id":"picture_id",
- "processedFiles":[
- {
- "height":640,
- "url":"http://images.gotinder.com/user_id/640x640_picture_id.jpg",
- "width":640
- },
- {
- "height":320,
- "url":"http://images.gotinder.com/user_id/320x320_picture_id.jpg",
- "width":320
- },
- {
- "height":172,
- "url":"http://images.gotinder.com/user_id/172x172_picture_id.jpg",
- "width":172
- },
- {
- "height":84,
- "url":"http://images.gotinder.com/user_id/84x84_picture_id.jpg",
- "width":84
- }
- ],
- "url":"http://images.gotinder.com/user_id/picture_id.jpg",
- "xdistance_percent":1,
- "xoffset_percent":0,
- "ydistance_percent":0.75,
- "yoffset_percent":0.12222222238779068
- },
- {
- "extension":"jpg",
- "fileName":"picture_id.jpg",
- "id":"picture_id",
- "processedFiles":[
- {
- "height":640,
- "url":"http://images.gotinder.com/user_id/640x640_picture_id.jpg",
- "width":640
- },
- {
- "height":320,
- "url":"http://images.gotinder.com/user_id/320x320_picture_id.jpg",
- "width":320
- },
- {
- "height":172,
- "url":"http://images.gotinder.com/user_id/172x172_picture_id.jpg",
- "width":172
- },
- {
- "height":84,
- "url":"http://images.gotinder.com/user_id/84x84_picture_id.jpg",
- "width":84
- }
- ],
- "url":"http://images.gotinder.com/user_id/picture_id.jpg"
- },
- {
- "extension":"jpg",
- "fileName":"picture_id.jpg",
- "id":"picture_id",
- "processedFiles":[
- {
- "height":640,
- "url":"http://images.gotinder.com/user_id/640x640_picture_id.jpg",
- "width":640
- },
- {
- "height":320,
- "url":"http://images.gotinder.com/user_id/320x320_picture_id.jpg",
- "width":320
- },
- {
- "height":172,
- "url":"http://images.gotinder.com/user_id/172x172_picture_id.jpg",
- "width":172
- },
- {
- "height":84,
- "url":"http://images.gotinder.com/user_id/84x84_picture_id.jpg",
- "width":84
- }
- ],
- "url":"http://images.gotinder.com/user_id/picture_id.jpg"
- },
- {
- "extension":"jpg",
- "fileName":"picture_id.jpg",
- "id":"picture_id",
- "processedFiles":[
- {
- "height":640,
- "url":"http://images.gotinder.com/user_id/640x640_picture_id.jpg",
- "width":640
- },
- {
- "height":320,
- "url":"http://images.gotinder.com/user_id/320x320_picture_id.jpg",
- "width":320
- },
- {
- "height":172,
- "url":"http://images.gotinder.com/user_id/172x172_picture_id.jpg",
- "width":172
- },
- {
- "height":84,
- "url":"http://images.gotinder.com/user_id/84x84_picture_id.jpg",
- "width":84
- }
- ],
- "url":"http://images.gotinder.com/user_id/picture_id.jpg"
- },
- {
- "extension":"jpg",
- "fileName":"picture_id.jpg",
- "id":"picture_id",
- "processedFiles":[
- {
- "height":640,
- "url":"http://images.gotinder.com/user_id/640x640_picture_id.jpg",
- "width":640
- },
- {
- "height":320,
- "url":"http://images.gotinder.com/user_id/320x320_picture_id.jpg",
- "width":320
- },
- {
- "height":172,
- "url":"http://images.gotinder.com/user_id/172x172_picture_id.jpg",
- "width":172
- },
- {
- "height":84,
- "url":"http://images.gotinder.com/user_id/84x84_picture_id.jpg",
- "width":84
- }
- ],
- "url":"http://images.gotinder.com/user_id/picture_id.jpg"
- }
- ],
- "ping_time":"2017-01-08T18:02:01.953Z",
- "schools":[],
- "teasers":[],
- "uncommon_interests":[]
- },
- "status":200
-}
-```
-
-### Sending messages/gifs
-
-Send a message to a match. Note yo'll get a HTTP 500 back if you try to send a message to someone who isn't a match!
-
-```
-send_message = session.post(TINDER_HOST + '/user/matches/{match_id}', data=json.dumps({"message": message}))
-```
-
-Parameter info:
-
-
-
-
- match_id
- **string**: Tinder match ID
-
-
- message
- **string**: Message to send
-
-
-
-
-Response:
-
-```json
-{
- "_id":"message_id",
- "from":"user_id_1",
- "to":"user_id_2",
- "match_id":"match_id",
- "sent_date":"2014-04-10T10:28:05.764Z",
- "message":"hi!",
- "created_date":"2014-04-10T10:28:05.764Z"
-}
-```
-
-```
-send_gif = session.post(TINDER_HOST + '/user/matches/{match_id}', data=json.dumps({"type": "GIF", "message": message, "gif_id": gif_id}))
-```
-
-Parameter info:
-
-
-
-
- match_id
- **string**: Tinder match ID
-
-
- message
- **string**: The GIPHY URL of the GIF
-
-
- gif_id
- **string**: The GIPHY ID of the GIF
-
-
-
-
-Response:
-
-```json
-{
- "_id":"53467235483cb56c475cc1d6",
- "from":"53430689ab3c04c13e006ffb",
- "to":"533a59ea52046fc077002815",
- "match_id":"53464b0728ac73976d0a3fbf",
- "sent_date":"2014-04-10T10:28:05.764Z",
- "message":"hi!",
- "created_date":"2014-04-10T10:28:05.764Z"
-}
-```
-
-### Liking messages
-
-Liking a message is like a superlike for messages.
-
-```
-like_message = session.post(TINDER_HOST + '/message/{message_id}/like')
-unlike_message = session.delete(TINDER_HOST + '/message/{message_id}/like')
-```
-
-Parameter info:
-
-
-
-
- message_id
- **string**: Tinder ID of the message you want to like.
-
-
-
-
-### Unmatch a match
-
-Unmatch a match by sending an HTTP DELETE
-
-```
-unmatch = session.delete(TINDER_HOST + '/user/matches/{match_id}')
-```
-
-Parameter info:
-
-
-
-
- user_id
- **string**: Tinder match ID
-
-
-
-
-Response:
-
-```json
-{
- "_id":"53467235483cb56c475cc1d6",
- "from":"53430689ab3c04c13e006ffb",
- "to":"533a59ea52046fc077002815",
- "match_id":"53464b0728ac73976d0a3fbf",
- "sent_date":"2014-04-10T10:28:05.764Z",
- "message":"hi!",
- "created_date":"2014-04-10T10:28:05.764Z"
-}
-```
-
-### Updating your location
-
-```
-location = session.post(TINDER_HOST + '/user/ping', data=json.dumps({"lat": latitude, "lon": longitude))
-```
-
-Parameter info:
-
-
-
-
- lat
- **int**: Latitude of your location in degrees
-
-
- long
- **int**: Longitude of your location in degrees
-
-
-
-
-```json
-{
- "status": 200,
- "error": "position change not significant"
-}
-```
-
-If the change in location is too small, you get the above error.
-
-### Tinder history & updates
-
-Get a complete list of your matches, messages, ... from your account.
-The official Tinder client does this once when it's started for the first time, after that it relies on the incremental updates which you can requests by using the 'last_activity_date' parameter.
-
-```
-updates = session.post(TINDER_HOST + '/updates', data=json.dumps({"last_activity_date:" : date_in_JS_notation})
-```
-
-Response:
-```json
-{
- "matches": [{
- "_id": "53464b0728ac73976d0a3fbf",
- "messages": [{
- "_id": "534651198ce6da797248c1a3",
- "match_id": "53464b0728ac73976d0a3fbf",
- "to": "53430689ab3c04c13e006ffb",
- "from": "533a59ea52046fc077002815",
- "message": "hi .... how is it going?",
- "sent_date": "2014-04-10T08:06:49.800Z",
- "created_date": "2014-04-10T08:06:49.800Z",
- "timestamp": 1397117209800
- }, {
- "_id": "53466fd298b7278b72156523",
- "match_id": "53464b0728ac73976d0a3fbf",
- "to": "533a59ea52046fc077002815",
- "from": "53430689ab3c04c13e006ffb",
- "message": "Good thanks you? :)",
- "sent_date": "2014-04-10T10:17:54.379Z",
- "created_date": "2014-04-10T10:17:54.379Z",
- "timestamp": 1397125074379
- }],
- "last_activity_date": "2014-04-10T10:17:54.379Z"
- }],
- "blocks": [],
- "lists": [],
- "deleted_lists": [],
- "last_activity_date": "2014-04-10T10:17:54.379Z"
-}
-```
-
-### Liking, disliking & superliking
-```
-like = session.post(TINDER_HOST + '/like/{user_id}')
-dislike = session.post(TINDER_HOST + '/pass/{user_id}')
-superlike = session.post(TINDER_HOST + '/like/{user_id}/superlike')
-```
-
-Parameter info:
-
-
-
-
- user_id
- **string**: Tinder user ID
-
-
-
-Response for like:
-
-```json
-{
- "likes_remaining":100,
- "match":false
-}
-```
-
-```json
-{
- "likes_remaining":100,
- "match":{
- "_id":"match_id",
- "closed":false,
- "common_friend_count":0,
- "common_like_count":0,
- "created_date":"2017-01-09T18:05:27.053Z",
- "dead":false,
- "following":true,
- "following_moments":true,
- "is_boost_match":false,
- "is_super_like":false,
- "last_activity_date":"2017-01-09T18:05:27.053Z",
- "message_count":0,
- "messages":[],
- "participants":[
- "my_user_id",
- "other_person_user_id"
- ],
- "pending":false
- }
-}
-```
-
-Response for superlike:
-
-```json
-{
- "match": "true or false",
- "superlikes": {
- "remaining": "superlikes_remaining",
- "resets_at": "reset_date_time"
- }
-}
-```
-
-If they also liked you then 'match' will be `true`.
-This is not returned if you disliked an user.
-
-
-### Recommendations
-
-Get your recommendations in this area, default limit is 10 users/request.
-```
-like = session.post(TINDER_HOST + '/recs', data=json.dumps({"limit:" : 10})
-```
-
-Parameter info:
-
-
-
-
- limit
- **int**: Number of Tinder users to like/dislike/superlike in this area. Default is 10, when done you need to run this request again.
-
-
-
-```json
-{
- "status": 200,
- "results": [{
- "is_traveling": false,
- "common_likes": [],
- "common_connections": [],
- "teasers": [
- {
- "type": "school",
- "string": "school_name"
- }
- ],
- "common_friends": [],
- "content_hash": "wnqHrqtZwC2nT3wuR3SMJH22UYLtdXt5DC1sl4SddcwRux0",
- "connection_count": 0,
- "badges": [],
- "distance_mi": 6,
- "hide_age": false,
- "bio": "The user his/her bio",
- "jobs": [],
- "birth_date_info": "fuzzy birthdate active, not displaying real birth_date",
- "photos": [
- {
- "url": "http://images.gotinder.com/564f90f0df583cc63b873e60/picture_id.jpg",
- "id": "picture_id",
- "processedFiles": [
- {
- "url": "http://images.gotinder.com/564f90f0df583cc63b873e60/640x640_picture_id.jpg",
- "width": 640,
- "height": 640
- },
- {
- "url": "http://images.gotinder.com/564f90f0df583cc63b873e60/320x320_picture_id.jpg",
- "width": 320,
- "height": 320
- },
- {
- "url": "http://images.gotinder.com/564f90f0df583cc63b873e60/172x172_picture_id.jpg",
- "width": 172,
- "height": 172
- },
- {
- "url": "http://images.gotinder.com/564f90f0df583cc63b873e60/84x84_picture_id.jpg",
- "width": 84,
- "height": 84
- }
- ]
- },
- {
- "url": "http://images.gotinder.com/564f90f0df583cc63b873e60/picture_id.jpg",
- "id": "picture_id",
- "processedFiles": [
- {
- "url": "http://images.gotinder.com/564f90f0df583cc63b873e60/640x640_picture_id.jpg",
- "width": 640,
- "height": 640
- },
- {
- "url": "http://images.gotinder.com/564f90f0df583cc63b873e60/320x320_picture_id.jpg",
- "width": 320,
- "height": 320
- },
- {
- "url": "http://images.gotinder.com/564f90f0df583cc63b873e60/172x172_picture_id.jpg",
- "width": 172,
- "height": 172
- },
- {
- "url": "http://images.gotinder.com/564f90f0df583cc63b873e60/84x84_picture_id.jpg",
- "width": 84,
- "height": 84
- }
- ]
- },
- {
- "url": "http://images.gotinder.com/564f90f0df583cc63b873e60/picture_id.jpg",
- "id": "picture_id",
- "processedFiles": [
- {
- "url": "http://images.gotinder.com/564f90f0df583cc63b873e60/640x640_picture_id.jpg",
- "width": 640,
- "height": 640
- },
- {
- "url": "http://images.gotinder.com/564f90f0df583cc63b873e60/320x320_picture_id.jpg",
- "width": 320,
- "height": 320
- },
- {
- "url": "http://images.gotinder.com/564f90f0df583cc63b873e60/172x172_picture_id.jpg",
- "width": 172,
- "height": 172
- },
- {
- "url": "http://images.gotinder.com/564f90f0df583cc63b873e60/84x84_picture_id.jpg",
- "width": 84,
- "height": 84
- }
- ]
- },
- {
- "url": "http://images.gotinder.com/564f90f0df583cc63b873e60/picture_id.jpg",
- "id": "picture_id",
- "processedFiles": [
- {
- "url": "http://images.gotinder.com/564f90f0df583cc63b873e60/640x640_picture_id.jpg",
- "width": 640,
- "height": 640
- },
- {
- "url": "http://images.gotinder.com/564f90f0df583cc63b873e60/320x320_picture_id.jpg",
- "width": 320,
- "height": 320
- },
- {
- "url": "http://images.gotinder.com/564f90f0df583cc63b873e60/172x172_picture_id.jpg",
- "width": 172,
- "height": 172
- },
- {
- "url": "http://images.gotinder.com/564f90f0df583cc63b873e60/84x84_picture_id.jpg",
- "width": 84,
- "height": 84
- }
- ]
- },
- {
- "url": "http://images.gotinder.com/564f90f0df583cc63b873e60/picture_id.jpg",
- "id": "picture_id",
- "processedFiles": [
- {
- "url": "http://images.gotinder.com/564f90f0df583cc63b873e60/640x640_picture_id.jpg",
- "width": 640,
- "height": 640
- },
- {
- "url": "http://images.gotinder.com/564f90f0df583cc63b873e60/320x320_picture_id.jpg",
- "width": 320,
- "height": 320
- },
- {
- "url": "http://images.gotinder.com/564f90f0df583cc63b873e60/172x172_picture_id.jpg",
- "width": 172,
- "height": 172
- },
- {
- "url": "http://images.gotinder.com/564f90f0df583cc63b873e60/84x84_picture_id.jpg",
- "width": 84,
- "height": 84
- }
- ]
- },
- {
- "url": "http://images.gotinder.com/564f90f0df583cc63b873e60/picture_id.jpg",
- "id": "picture_id",
- "processedFiles": [
- {
- "url": "http://images.gotinder.com/564f90f0df583cc63b873e60/640x640_picture_id.jpg",
- "width": 640,
- "height": 640
- },
- {
- "url": "http://images.gotinder.com/564f90f0df583cc63b873e60/320x320_picture_id.jpg",
- "width": 320,
- "height": 320
- },
- {
- "url": "http://images.gotinder.com/564f90f0df583cc63b873e60/172x172_picture_id.jpg",
- "width": 172,
- "height": 172
- },
- {
- "url": "http://images.gotinder.com/564f90f0df583cc63b873e60/84x84_picture_id.jpg",
- "width": 84,
- "height": 84
- }
- ]
- }
- ],
- "teaser": {
- "type": "school",
- "string": "school_name"
- },
- "ping_time": "2017-01-08T17:45:26.526Z",
- "schools": [
- {
- "name": "school_name",
- "id": "fb_school_id"
- }
- ],
- "name": "first_name",
- "uncommon_interests": [],
- "gender": 0,
- "common_interests": [],
- "s_number": 95951381,
- "hide_distance": false,
- "birth_date": "1975-01-11T19:25:00.007Z",
- "_id": "user_id"
- }, "JSON DATA OF NEXT USER" ]
-}
-```
-
-HTTP code:
-
-
-
-
- 200
- **OK**
-
-
- 401
- **UNAUTHORIZED** will be received when X-Auth-Token is not set
-
-
-
-### Delete account
-Delete your account, this can not be undone!
-
-```
-delete_account = session.delete(TINDER_HOST + '/profile')
-```
diff --git a/docs/harbour-sailfinder/docs/tinder_api.md.html b/docs/harbour-sailfinder/docs/tinder_api.md.html
deleted file mode 100644
index 150e5bc..0000000
--- a/docs/harbour-sailfinder/docs/tinder_api.md.html
+++ /dev/null
@@ -1,869 +0,0 @@
-
-
-
-
- tinder_api
-
-
- Tinder API
- with Python Requests
-Inspired by this Github Gist and the rest is sniffed by myself.
-API Details
-
-
-
- Host
- api.gotinder.com
-
-
- Protocol
- SSL only
-
-
-
-
-'api.gotinder.com' will be refered in this document as TINDER_HOST
-Request headers
-
-
-
- Header name
- Description
-
-
-
-
- X-Auth-Token
- A UUID4 format authentication token obtained via the /auth api endpoint
-
-
- Content-type
- application/json
-
-
- app_version
- 371
-
-
- platform
- ios
-
-
- User-agent
- User-Agent: Tinder/4.6.1 (iPhone; iOS 9.0.1; Scale/2.00)
-
-
- os_version
- 900001
-
-
-
-
-All Python Requests examples need these headers!
-You can add these by running this command, after you established your session:
-session.headers.update(HEADERS)
Authenticating
-Obtain a valid Facebook token before authenticating with the Tinder API!
-login = session.post(TINDER_HOST + '/auth', data=json.dumps({"facebook_token": facebook_token}))
session.headers.update({"X-Auth-Token": login['token']})
Parameter info:
-
-
-
- facebook_token
- string : Facebook token from the OAuth dialog
-
-
-
-
-The easiest way to get this is to go here , log in and then pick the auth token out of the URL you are redirected to.
-Response:
-{
" token " : " e471321f-9ba4-4054-a842-114ca4043ed6 " ,
" globals " : {
" moments_interval " : 30000 ,
" boost_down " : 8 ,
" boost_up " : 7 ,
" updates_interval " : 2000 ,
" sparks " : false ,
" share_default_text " : " <style>body{color:#fff;text-align:center;font-family:HelveticaNeue;text-shadow:0 1px 1px rgba(0,0,0,0.63);}h1{font-size:24px;line-height:24px;margin:0;}p{font-size:16px;margin:8px;}</style><h1>Get a Boost</h1><p><strong>Invite friends</strong> to show up <br/><strong>even higher</strong> in recommendations.</p> " ,
" recs_size " : 40 ,
" fetch_connections " : true ,
" invite_type " : " client " ,
" matchmaker_default_message " : " I want you to meet someone. I introduced you on Tinder www.gotinder.com/app " ,
" sparks_enabled " : false ,
" mqtt " : false ,
" kontagent_enabled " : false ,
" boost_decay " : 180 ,
" recs_interval " : 20000 ,
" plus " : true ,
" friends " : true ,
" kontagent " : false ,
" tinder_sparks " : true
} ,
" user " : {
" active_time " : " 2017-01-07T14:39:01.234Z " ,
" create_date " : " 2016-05-30T13:49:45.435Z " ,
" purchases " : [ ] ,
" age_filter_min " : 18 ,
" discoverable " : false ,
" full_name " : " John Jansens " ,
" api_token " : " e471321f-9ba4-4054-a842-114ca4043ed6 " ,
" is_new_user " : false ,
" connection_count " : 1 ,
" squads_discoverable " : true ,
" interests " : [ ] ,
" bio " : " " ,
" jobs " : [
{
" company " : {
" displayed " : true ,
" id " : " 594445203920155 " ,
" name " : " Self-Employed "
} ,
" title " : {
" displayed " : true ,
" id " : " 103113219728224 " ,
" name " : " Chief Executive Officer "
}
}
] ,
" distance_filter " : 99 ,
" can_create_squad " : true ,
" gender_filter " : 0 ,
" photos " : [
{
" extension " : " jpg " ,
" url " : " http://images.gotinder.com/574c44f9288ba68d25a29412/bd9be42a-4f39-403c-84cd-577e9f8c2099.jpg " ,
" fbId " : " directupload " ,
" fileName " : " bd9be42a-4f39-403c-84cd-577e9f8c2099.jpg " ,
" id " : " bd9be42a-4f39-403c-84cd-577e9f8c2099 " ,
" processedFiles " : [
{
" url " : " http://images.gotinder.com/574c44f9288ba68d25a29412/640x640_bd9be42a-4f39-403c-84cd-577e9f8c2099.jpg " ,
" width " : 640 ,
" height " : 640
} ,
{
" url " : " http://images.gotinder.com/574c44f9288ba68d25a29412/320x320_bd9be42a-4f39-403c-84cd-577e9f8c2099.jpg " ,
" width " : 320 ,
" height " : 320
} ,
{
" url " : " http://images.gotinder.com/574c44f9288ba68d25a29412/172x172_bd9be42a-4f39-403c-84cd-577e9f8c2099.jpg " ,
" width " : 172 ,
" height " : 172
} ,
{
" url " : " http://images.gotinder.com/574c44f9288ba68d25a29412/84x84_bd9be42a-4f39-403c-84cd-577e9f8c2099.jpg " ,
" width " : 84 ,
" height " : 84
}
]
}
] ,
" ping_time " : " 2017-01-07T12:16:51.460Z " ,
" groups " : [
" plus_subscription_999 "
] ,
" schools " : [ ] ,
" name " : " John " ,
" squads_only " : false ,
" gender " : 1 ,
" photos_processing " : false ,
" age_filter_max " : 1000 ,
" birth_date " : " 1996-01-01T00:00:00.000Z " ,
" _id " : " 574c44f9288ba68d25a29412 "
} ,
" versions " : {
" age_filter " : " 2.1.0 " ,
" trending_active_text " : " 10.0.0 " ,
" active_text " : " 0.0.0 " ,
" trending " : " 10.0.0 " ,
" matchmaker " : " 2.1.0 "
}
}
-Updating your profile
-profile = session.post(TINDER_HOST + '/profile', data=json.dumps({"discoverable" : discoverable, "age_filter_min" : age_min, "age_filter_max" : age_max, "gender": gender, "gender_filter" : gender_filter, "distance_filter" : distance, "bio": bio}))
Parameter info:
-
-
-
- discoverable
- true :Other users can swipe on youfalse : nobody can see you except for your matches
-
-
- gender
- 0 : I'm a male
- 1 : I'm a female
-
-
- age_filter_min
- integer : minimum age recommendations
-
-
- age_filter_max
- integer : maximum age recommendations
-
-
- distance_filter
- integer : search distance in miles (0 - 160 km)
-
-
-
-
-Response:
-{
T O D O
" token " : " XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXXX " ,
" user " : { . . . } ,
" globals " : { . . . } ,
" versions " : { . . . }
}
-Updating your school or work places
-profile_school = session.put(TINDER_HOST + '/profile/school', data=json.dumps({"schools": [{"id": fb_school1_id}, {"id": fb_school2_id}], {...}}))
profile_jobs = session.put(TINDER_HOST + '/profile/job', data=json.dumps({"jobs": {"company": [{"id": fb_job1_id}]}}))
Parameter info:
-
-
-
- schools
- list : List all your schools by using the fb_school_id, which need to be obtained from the Facebook Graph API.
-
-
- fb_school_id
- string : A FB id which represents the school
-
-
-
-
-
-
-
- jobs
- string : Your current jobs by using the fb_job_id, which need to be obtained from the Facebook Graph API.
-
-
- fb_job_id
- list : A FB id which represents the job and several other things about this job. TODO
-
-
-
-
-Removing your school or work places
-profile_school = session.delete(TINDER_HOST + '/profile/school')
profile_jobs = session.delete(TINDER_HOST + '/profile/job')
Create, update and remove an username
-Create a username so you will show up on the Tinder webprofiles and share your profile on social media.
-create_username = session.post(TINDER_HOST + '/profile/username', data=json.dumps({"username": username}))
update_username = session.put(TINDER_HOST + '/profile/username', data=json.dumps({"username": username}))
remove_username = session.delete(TINDER_HOST + '/profile/username')
Parameter info:
-
-
-
- username
- string : Username of your choice
-
-
-
-
-In case that the username is already taken, the user already registered one, ... then an error is returned:
-{
" error " : " User has already registered a username "
}
{
" error " : " User has no username to update "
}
{
" error " : " User has no username to remove "
}
-
-share_link = session.post(TINDER_HOST + '/user/{user_id}/share')
Parameter info:
-
-
-
- user_id
- string : Tinder user ID
-
-
-
-
-
-When polling this endpoint I received a 404 HTTP ERROR but the official client still this use this.
-meta_data = session.get(TINDER_HOST + '/meta')
Reporting users
-report = session.post(TINDER_HOST + '/report/{user_id}', data=json.dumps({"cause": cause}))
Parameter info:
-
-
-
- match_id
- string : Tinder match ID
-
-
- cause
- 1 : Reason is SPAM
- 2 : Reason is inappropriate/offensive
-
-
-
-
-Upload local pictures to the Tinder image server
-Also broken, a HTTP ERROR 500 is received but the offcial client works this way:
-local_upload = session.post(' https://imageupload.gotinder.com/image?client_photo_id=ProfilePhoto ' + str(int(time.time())*1000), json={'userId': userID}, files={'file': open('test.jpeg', 'rb')})
Upload facebook pictures to the Tinder image server
-Select a Facebook photo to set it as a profile picture.
-upload_fb = session.post(TINDER_HOST + '/media', data=json.dumps({"transmit": "fb", "assets": [{"ydistance_percent": ydistance_percent,"id": fb_picture_id,"xoffset_percent": xoffset_percent,"yoffset_percent": yoffset_percent,"xdistance_percent": xdistance_percent}]}))
Parameter info:
-
-
-
- ydistance_percent
- int : ???, 0 seems to work
-
-
- xdistance_percent
- int : ???, 0 seems to work
-
-
- yoffset_percent
- int : ???, 0 seems to work
-
-
- xoffset_percent
- int : ???, 0 seems to work
-
-
- id
- string : Facebook id of the picture
-
-
-
-
-Remove picture
-remove_picture = session.delete(TINDER_HOST + '/media', data=json.dumps({"assets": [tinder_picture_id]}))
Parameter info:
-
-
-
- assets
- list : list of the pictures you want to delete with their Tinder picture id as strings.
-
-
-
-
-Response:
-{
" A list of all the pictures after the operation. "
}
-Get info about a user
-GET request! POST request will result a 404 HTTP received as HTML instead of JSON!
-send_message = session.get(TINDER_HOST + '/user/{user_id}')
Parameter info:
-
-
-
- user_id
- string : Tinder user ID
-
-
-
-
-Response:
-{
" results " : {
" _id " : " 56ae88c29a68849033d9eca7 " ,
" badges " : [ ] ,
" bio " : " " ,
" birth_date " : " 1986-01-11T20:35:47.650Z " ,
" birth_date_info " : " fuzzy birthdate active, not displaying real birth_date " ,
" common_connections " : [ ] ,
" common_friends " : [ ] ,
" common_interests " : [ ] ,
" common_likes " : [ ] ,
" connection_count " : 0 ,
" distance_mi " : 12 ,
" gender " : 0 ,
" jobs " : [ ] ,
" name " : " Chosen " ,
" photos " : [
{
" extension " : " jpg " ,
" fileName " : " 291fbf47-b179-4546-8be3-9a3a0af5a869.jpg " ,
" id " : " 291fbf47-b179-4546-8be3-9a3a0af5a869 " ,
" processedFiles " : [
{
" height " : 640 ,
" url " : " http://images.gotinder.com/56ae88c29a68849033d9eca7/640x640_291fbf47-b179-4546-8be3-9a3a0af5a869.jpg " ,
" width " : 640
} ,
{
" height " : 320 ,
" url " : " http://images.gotinder.com/56ae88c29a68849033d9eca7/320x320_291fbf47-b179-4546-8be3-9a3a0af5a869.jpg " ,
" width " : 320
} ,
{
" height " : 172 ,
" url " : " http://images.gotinder.com/56ae88c29a68849033d9eca7/172x172_291fbf47-b179-4546-8be3-9a3a0af5a869.jpg " ,
" width " : 172
} ,
{
" height " : 84 ,
" url " : " http://images.gotinder.com/56ae88c29a68849033d9eca7/84x84_291fbf47-b179-4546-8be3-9a3a0af5a869.jpg " ,
" width " : 84
}
] ,
" url " : " http://images.gotinder.com/56ae88c29a68849033d9eca7/291fbf47-b179-4546-8be3-9a3a0af5a869.jpg " ,
" xdistance_percent " : 1 ,
" xoffset_percent " : 0 ,
" ydistance_percent " : 0.6666666865348816 ,
" yoffset_percent " : 0.05138888955116272
} ,
{
" extension " : " jpg " ,
" fileName " : " 36fb9398-f673-4438-86a1-82a729d74f32.jpg " ,
" id " : " 36fb9398-f673-4438-86a1-82a729d74f32 " ,
" processedFiles " : [
{
" height " : 640 ,
" url " : " http://images.gotinder.com/56ae88c29a68849033d9eca7/640x640_36fb9398-f673-4438-86a1-82a729d74f32.jpg " ,
" width " : 640
} ,
{
" height " : 320 ,
" url " : " http://images.gotinder.com/56ae88c29a68849033d9eca7/320x320_36fb9398-f673-4438-86a1-82a729d74f32.jpg " ,
" width " : 320
} ,
{
" height " : 172 ,
" url " : " http://images.gotinder.com/56ae88c29a68849033d9eca7/172x172_36fb9398-f673-4438-86a1-82a729d74f32.jpg " ,
" width " : 172
} ,
{
" height " : 84 ,
" url " : " http://images.gotinder.com/56ae88c29a68849033d9eca7/84x84_36fb9398-f673-4438-86a1-82a729d74f32.jpg " ,
" width " : 84
}
] ,
" url " : " http://images.gotinder.com/56ae88c29a68849033d9eca7/36fb9398-f673-4438-86a1-82a729d74f32.jpg " ,
" xdistance_percent " : 1 ,
" xoffset_percent " : 0 ,
" ydistance_percent " : 0.75 ,
" yoffset_percent " : 0.12222222238779068
} ,
{
" extension " : " jpg " ,
" fileName " : " 49eb42f9-d9e6-406b-8434-eb8f676d36b7.jpg " ,
" id " : " 49eb42f9-d9e6-406b-8434-eb8f676d36b7 " ,
" processedFiles " : [
{
" height " : 640 ,
" url " : " http://images.gotinder.com/56ae88c29a68849033d9eca7/640x640_49eb42f9-d9e6-406b-8434-eb8f676d36b7.jpg " ,
" width " : 640
} ,
{
" height " : 320 ,
" url " : " http://images.gotinder.com/56ae88c29a68849033d9eca7/320x320_49eb42f9-d9e6-406b-8434-eb8f676d36b7.jpg " ,
" width " : 320
} ,
{
" height " : 172 ,
" url " : " http://images.gotinder.com/56ae88c29a68849033d9eca7/172x172_49eb42f9-d9e6-406b-8434-eb8f676d36b7.jpg " ,
" width " : 172
} ,
{
" height " : 84 ,
" url " : " http://images.gotinder.com/56ae88c29a68849033d9eca7/84x84_49eb42f9-d9e6-406b-8434-eb8f676d36b7.jpg " ,
" width " : 84
}
] ,
" url " : " http://images.gotinder.com/56ae88c29a68849033d9eca7/49eb42f9-d9e6-406b-8434-eb8f676d36b7.jpg "
} ,
{
" extension " : " jpg " ,
" fileName " : " 4c059401-4a99-4c98-a07c-089e6ecab4ad.jpg " ,
" id " : " 4c059401-4a99-4c98-a07c-089e6ecab4ad " ,
" processedFiles " : [
{
" height " : 640 ,
" url " : " http://images.gotinder.com/56ae88c29a68849033d9eca7/640x640_4c059401-4a99-4c98-a07c-089e6ecab4ad.jpg " ,
" width " : 640
} ,
{
" height " : 320 ,
" url " : " http://images.gotinder.com/56ae88c29a68849033d9eca7/320x320_4c059401-4a99-4c98-a07c-089e6ecab4ad.jpg " ,
" width " : 320
} ,
{
" height " : 172 ,
" url " : " http://images.gotinder.com/56ae88c29a68849033d9eca7/172x172_4c059401-4a99-4c98-a07c-089e6ecab4ad.jpg " ,
" width " : 172
} ,
{
" height " : 84 ,
" url " : " http://images.gotinder.com/56ae88c29a68849033d9eca7/84x84_4c059401-4a99-4c98-a07c-089e6ecab4ad.jpg " ,
" width " : 84
}
] ,
" url " : " http://images.gotinder.com/56ae88c29a68849033d9eca7/4c059401-4a99-4c98-a07c-089e6ecab4ad.jpg "
} ,
{
" extension " : " jpg " ,
" fileName " : " 9dca0b7e-f162-417d-90e2-15657b51c0a3.jpg " ,
" id " : " 9dca0b7e-f162-417d-90e2-15657b51c0a3 " ,
" processedFiles " : [
{
" height " : 640 ,
" url " : " http://images.gotinder.com/56ae88c29a68849033d9eca7/640x640_9dca0b7e-f162-417d-90e2-15657b51c0a3.jpg " ,
" width " : 640
} ,
{
" height " : 320 ,
" url " : " http://images.gotinder.com/56ae88c29a68849033d9eca7/320x320_9dca0b7e-f162-417d-90e2-15657b51c0a3.jpg " ,
" width " : 320
} ,
{
" height " : 172 ,
" url " : " http://images.gotinder.com/56ae88c29a68849033d9eca7/172x172_9dca0b7e-f162-417d-90e2-15657b51c0a3.jpg " ,
" width " : 172
} ,
{
" height " : 84 ,
" url " : " http://images.gotinder.com/56ae88c29a68849033d9eca7/84x84_9dca0b7e-f162-417d-90e2-15657b51c0a3.jpg " ,
" width " : 84
}
] ,
" url " : " http://images.gotinder.com/56ae88c29a68849033d9eca7/9dca0b7e-f162-417d-90e2-15657b51c0a3.jpg "
} ,
{
" extension " : " jpg " ,
" fileName " : " f05533ed-0bed-4b59-b11d-294a04fbe420.jpg " ,
" id " : " f05533ed-0bed-4b59-b11d-294a04fbe420 " ,
" processedFiles " : [
{
" height " : 640 ,
" url " : " http://images.gotinder.com/56ae88c29a68849033d9eca7/640x640_f05533ed-0bed-4b59-b11d-294a04fbe420.jpg " ,
" width " : 640
} ,
{
" height " : 320 ,
" url " : " http://images.gotinder.com/56ae88c29a68849033d9eca7/320x320_f05533ed-0bed-4b59-b11d-294a04fbe420.jpg " ,
" width " : 320
} ,
{
" height " : 172 ,
" url " : " http://images.gotinder.com/56ae88c29a68849033d9eca7/172x172_f05533ed-0bed-4b59-b11d-294a04fbe420.jpg " ,
" width " : 172
} ,
{
" height " : 84 ,
" url " : " http://images.gotinder.com/56ae88c29a68849033d9eca7/84x84_f05533ed-0bed-4b59-b11d-294a04fbe420.jpg " ,
" width " : 84
}
] ,
" url " : " http://images.gotinder.com/56ae88c29a68849033d9eca7/f05533ed-0bed-4b59-b11d-294a04fbe420.jpg "
}
] ,
" ping_time " : " 2017-01-08T18:02:01.953Z " ,
" schools " : [ ] ,
" teasers " : [ ] ,
" uncommon_interests " : [ ]
} ,
" status " : 200
}
-Sending messages/gifs
-Send a message to a match. Note yo'll get a HTTP 500 back if you try to send a message to someone who isn't a match!
-send_message = session.post(TINDER_HOST + '/user/matches/{match_id}', data=json.dumps({"message": message}))
Parameter info:
-
-
-
- match_id
- string : Tinder match ID
-
-
- message
- string : Message to send
-
-
-
-
-Response:
-{
" _id " : " 53467235483cb56c475cc1d6 " ,
" from " : " 53430689ab3c04c13e006ffb " ,
" to " : " 533a59ea52046fc077002815 " ,
" match_id " : " 53464b0728ac73976d0a3fbf " ,
" sent_date " : " 2014-04-10T10:28:05.764Z " ,
" message " : " hi! " ,
" created_date " : " 2014-04-10T10:28:05.764Z "
}
-send_gif = session.post(TINDER_HOST + '/user/matches/{match_id}', data=json.dumps({"type": "GIF", "message": message, "gif_id": gif_id}))
Parameter info:
-
-
-
- match_id
- string : Tinder match ID
-
-
- message
- string : The GIPHY URL of the GIF
-
-
- gif_id
- string : The GIPHY ID of the GIF
-
-
-
-
-Response:
-{
" _id " : " 53467235483cb56c475cc1d6 " ,
" from " : " 53430689ab3c04c13e006ffb " ,
" to " : " 533a59ea52046fc077002815 " ,
" match_id " : " 53464b0728ac73976d0a3fbf " ,
" sent_date " : " 2014-04-10T10:28:05.764Z " ,
" message " : " hi! " ,
" created_date " : " 2014-04-10T10:28:05.764Z "
}
-Liking messages
-Liking a message is like a superlike for messages.
-like_message = session.post(TINDER_HOST + '/message/{message_id}/like')
unlike_message = session.delete(TINDER_HOST + '/message/{message_id}/like')
Parameter info:
-
-
-
- message_id
- string : Tinder ID of the message you want to like.
-
-
-
-
-Unmatch a match
-Unmatch a match by sending an HTTP DELETE
-unmatch = session.delete(TINDER_HOST + '/user/matches/{match_id}')
Parameter info:
-
-
-
- user_id
- string : Tinder match ID
-
-
-
-
-Response:
-{
" _id " : " 53467235483cb56c475cc1d6 " ,
" from " : " 53430689ab3c04c13e006ffb " ,
" to " : " 533a59ea52046fc077002815 " ,
" match_id " : " 53464b0728ac73976d0a3fbf " ,
" sent_date " : " 2014-04-10T10:28:05.764Z " ,
" message " : " hi! " ,
" created_date " : " 2014-04-10T10:28:05.764Z "
}
-Updating your location
-location = session.post(TINDER_HOST + '/user/ping', data=json.dumps({"lat": latitude, "lon": longitude))
Parameter info:
-
-
-
- lat
- int : Latitude of your location in degrees
-
-
- long
- int : Longitude of your location in degrees
-
-
-
-
-{
" status " : 200 ,
" error " : " position change not significant "
}
-If the change in location is too small, you get the above error.
-Tinder history & updates
-Get a complete list of your matches, messages, ... from your account.
-The official Tinder client does this once when it's started for the first time, after that it relies on the incremental updates which you can requests by using the 'last_activity_date' parameter.
-updates = session.post(TINDER_HOST + '/updates', data=json.dumps({"last_activity_date:" : date_in_JS_notation})
Response:
-{
" matches " : [ {
" _id " : " 53464b0728ac73976d0a3fbf " ,
" messages " : [ {
" _id " : " 534651198ce6da797248c1a3 " ,
" match_id " : " 53464b0728ac73976d0a3fbf " ,
" to " : " 53430689ab3c04c13e006ffb " ,
" from " : " 533a59ea52046fc077002815 " ,
" message " : " hi .... how is it going? " ,
" sent_date " : " 2014-04-10T08:06:49.800Z " ,
" created_date " : " 2014-04-10T08:06:49.800Z " ,
" timestamp " : 1397117209800
} , {
" _id " : " 53466fd298b7278b72156523 " ,
" match_id " : " 53464b0728ac73976d0a3fbf " ,
" to " : " 533a59ea52046fc077002815 " ,
" from " : " 53430689ab3c04c13e006ffb " ,
" message " : " Good thanks you? :) " ,
" sent_date " : " 2014-04-10T10:17:54.379Z " ,
" created_date " : " 2014-04-10T10:17:54.379Z " ,
" timestamp " : 1397125074379
} ] ,
" last_activity_date " : " 2014-04-10T10:17:54.379Z "
} ] ,
" blocks " : [ ] ,
" lists " : [ ] ,
" deleted_lists " : [ ] ,
" last_activity_date " : " 2014-04-10T10:17:54.379Z "
}
-Liking, disliking & superliking
-like = session.post(TINDER_HOST + '/like/{user_id}')
dislike = session.post(TINDER_HOST + '/pass/{user_id}')
superlike = session.post(TINDER_HOST + '/like/{user_id}/superlike')
Parameter info:
-
-
-
- user_id
- string : Tinder user ID
-
-
-
-Response for like:
-{
" match " : " true or false "
}
-Response for superlike:
-{
" match " : " true or false " ,
" superlikes " : {
" remaining " : " superlikes_remaining " ,
" resets_at " : " reset_date_time "
}
}
-If they also liked you then 'match' will be true
.
-This is not returned if you disliked an user.
-Recommendations
-Get your recommendations in this area, default limit is 10 users/request.
-like = session.post(TINDER_HOST + '/recs', data=json.dumps({"limit:" : 10})
Parameter info:
-
-
-
- limit
- int : Number of Tinder users to like/dislike/superlike in this area. Default is 10, when done you need to run this request again.
-
-
-
-{
" status " : 200 ,
" results " : [ {
" is_traveling " : false ,
" common_likes " : [ ] ,
" common_connections " : [ ] ,
" teasers " : [
{
" type " : " school " ,
" string " : " Universidade Lus \u00ed ada Lisboa "
}
] ,
" common_friends " : [ ] ,
" content_hash " : " wnqHrqtZwC2nT3wuR3SMJH22UYLtdXt5DC1sl4SddcwRux0 " ,
" connection_count " : 0 ,
" badges " : [ ] ,
" distance_mi " : 6 ,
" hide_age " : false ,
" bio " : " I am portuguese, 170 \n Speak portuguese, spanish and english. \n Moved to Brussels on july 2016. \n Work as software engineer. " ,
" jobs " : [ ] ,
" birth_date_info " : " fuzzy birthdate active, not displaying real birth_date " ,
" photos " : [
{
" url " : " http://images.gotinder.com/564f90f0df583cc63b873e60/329cca8d-784b-4eb4-8a96-dd102fb450c7.jpg " ,
" id " : " 329cca8d-784b-4eb4-8a96-dd102fb450c7 " ,
" processedFiles " : [
{
" url " : " http://images.gotinder.com/564f90f0df583cc63b873e60/640x640_329cca8d-784b-4eb4-8a96-dd102fb450c7.jpg " ,
" width " : 640 ,
" height " : 640
} ,
{
" url " : " http://images.gotinder.com/564f90f0df583cc63b873e60/320x320_329cca8d-784b-4eb4-8a96-dd102fb450c7.jpg " ,
" width " : 320 ,
" height " : 320
} ,
{
" url " : " http://images.gotinder.com/564f90f0df583cc63b873e60/172x172_329cca8d-784b-4eb4-8a96-dd102fb450c7.jpg " ,
" width " : 172 ,
" height " : 172
} ,
{
" url " : " http://images.gotinder.com/564f90f0df583cc63b873e60/84x84_329cca8d-784b-4eb4-8a96-dd102fb450c7.jpg " ,
" width " : 84 ,
" height " : 84
}
]
} ,
{
" url " : " http://images.gotinder.com/564f90f0df583cc63b873e60/0b5b32cb-4844-473b-869d-803af8dde39a.jpg " ,
" id " : " 0b5b32cb-4844-473b-869d-803af8dde39a " ,
" processedFiles " : [
{
" url " : " http://images.gotinder.com/564f90f0df583cc63b873e60/640x640_0b5b32cb-4844-473b-869d-803af8dde39a.jpg " ,
" width " : 640 ,
" height " : 640
} ,
{
" url " : " http://images.gotinder.com/564f90f0df583cc63b873e60/320x320_0b5b32cb-4844-473b-869d-803af8dde39a.jpg " ,
" width " : 320 ,
" height " : 320
} ,
{
" url " : " http://images.gotinder.com/564f90f0df583cc63b873e60/172x172_0b5b32cb-4844-473b-869d-803af8dde39a.jpg " ,
" width " : 172 ,
" height " : 172
} ,
{
" url " : " http://images.gotinder.com/564f90f0df583cc63b873e60/84x84_0b5b32cb-4844-473b-869d-803af8dde39a.jpg " ,
" width " : 84 ,
" height " : 84
}
]
} ,
{
" url " : " http://images.gotinder.com/564f90f0df583cc63b873e60/8699d0f4-2d23-4711-a301-f5cc8210b6e4.jpg " ,
" id " : " 8699d0f4-2d23-4711-a301-f5cc8210b6e4 " ,
" processedFiles " : [
{
" url " : " http://images.gotinder.com/564f90f0df583cc63b873e60/640x640_8699d0f4-2d23-4711-a301-f5cc8210b6e4.jpg " ,
" width " : 640 ,
" height " : 640
} ,
{
" url " : " http://images.gotinder.com/564f90f0df583cc63b873e60/320x320_8699d0f4-2d23-4711-a301-f5cc8210b6e4.jpg " ,
" width " : 320 ,
" height " : 320
} ,
{
" url " : " http://images.gotinder.com/564f90f0df583cc63b873e60/172x172_8699d0f4-2d23-4711-a301-f5cc8210b6e4.jpg " ,
" width " : 172 ,
" height " : 172
} ,
{
" url " : " http://images.gotinder.com/564f90f0df583cc63b873e60/84x84_8699d0f4-2d23-4711-a301-f5cc8210b6e4.jpg " ,
" width " : 84 ,
" height " : 84
}
]
} ,
{
" url " : " http://images.gotinder.com/564f90f0df583cc63b873e60/645835ef-d271-4dce-880b-9a327fdb861a.jpg " ,
" id " : " 645835ef-d271-4dce-880b-9a327fdb861a " ,
" processedFiles " : [
{
" url " : " http://images.gotinder.com/564f90f0df583cc63b873e60/640x640_645835ef-d271-4dce-880b-9a327fdb861a.jpg " ,
" width " : 640 ,
" height " : 640
} ,
{
" url " : " http://images.gotinder.com/564f90f0df583cc63b873e60/320x320_645835ef-d271-4dce-880b-9a327fdb861a.jpg " ,
" width " : 320 ,
" height " : 320
} ,
{
" url " : " http://images.gotinder.com/564f90f0df583cc63b873e60/172x172_645835ef-d271-4dce-880b-9a327fdb861a.jpg " ,
" width " : 172 ,
" height " : 172
} ,
{
" url " : " http://images.gotinder.com/564f90f0df583cc63b873e60/84x84_645835ef-d271-4dce-880b-9a327fdb861a.jpg " ,
" width " : 84 ,
" height " : 84
}
]
} ,
{
" url " : " http://images.gotinder.com/564f90f0df583cc63b873e60/460fe392-40df-4a2c-a34c-c9f0b404eff1.jpg " ,
" id " : " 460fe392-40df-4a2c-a34c-c9f0b404eff1 " ,
" processedFiles " : [
{
" url " : " http://images.gotinder.com/564f90f0df583cc63b873e60/640x640_460fe392-40df-4a2c-a34c-c9f0b404eff1.jpg " ,
" width " : 640 ,
" height " : 640
} ,
{
" url " : " http://images.gotinder.com/564f90f0df583cc63b873e60/320x320_460fe392-40df-4a2c-a34c-c9f0b404eff1.jpg " ,
" width " : 320 ,
" height " : 320
} ,
{
" url " : " http://images.gotinder.com/564f90f0df583cc63b873e60/172x172_460fe392-40df-4a2c-a34c-c9f0b404eff1.jpg " ,
" width " : 172 ,
" height " : 172
} ,
{
" url " : " http://images.gotinder.com/564f90f0df583cc63b873e60/84x84_460fe392-40df-4a2c-a34c-c9f0b404eff1.jpg " ,
" width " : 84 ,
" height " : 84
}
]
} ,
{
" url " : " http://images.gotinder.com/564f90f0df583cc63b873e60/f001f3cd-25c1-4214-8758-50027d1b209e.jpg " ,
" id " : " f001f3cd-25c1-4214-8758-50027d1b209e " ,
" processedFiles " : [
{
" url " : " http://images.gotinder.com/564f90f0df583cc63b873e60/640x640_f001f3cd-25c1-4214-8758-50027d1b209e.jpg " ,
" width " : 640 ,
" height " : 640
} ,
{
" url " : " http://images.gotinder.com/564f90f0df583cc63b873e60/320x320_f001f3cd-25c1-4214-8758-50027d1b209e.jpg " ,
" width " : 320 ,
" height " : 320
} ,
{
" url " : " http://images.gotinder.com/564f90f0df583cc63b873e60/172x172_f001f3cd-25c1-4214-8758-50027d1b209e.jpg " ,
" width " : 172 ,
" height " : 172
} ,
{
" url " : " http://images.gotinder.com/564f90f0df583cc63b873e60/84x84_f001f3cd-25c1-4214-8758-50027d1b209e.jpg " ,
" width " : 84 ,
" height " : 84
}
]
}
] ,
" teaser " : {
" type " : " school " ,
" string " : " Universidade Lus \u00ed ada Lisboa "
} ,
" ping_time " : " 2017-01-08T17:45:26.526Z " ,
" schools " : [
{
" name " : " Universidade Lus \u00ed ada Lisboa " ,
" id " : " 110728158949179 "
}
] ,
" name " : " Ricardo " ,
" uncommon_interests " : [ ] ,
" gender " : 0 ,
" common_interests " : [ ] ,
" s_number " : 95951381 ,
" hide_distance " : false ,
" birth_date " : " 1975-01-11T19:25:00.007Z " ,
" _id " : " 564f90f0df583cc63b873e60 "
} , " JSON DATA OF NEXT USER " ]
}
-HTTP code:
-
-
-
- 200
- OK
-
-
- 401
- UNAUTHORIZED will be received when X-Auth-Token is not set
-
-
-
-Delete account
-Delete your account, this can not be undone!
-delete_account = session.delete(TINDER_HOST + '/profile')
-
diff --git a/docs/harbour-sailfinder/harbour-sailfinder.desktop b/docs/harbour-sailfinder/harbour-sailfinder.desktop
deleted file mode 100644
index c202b7b..0000000
--- a/docs/harbour-sailfinder/harbour-sailfinder.desktop
+++ /dev/null
@@ -1,12 +0,0 @@
-[Desktop Entry]
-Type=Application
-X-Nemo-Application-Type=silica-qt5
-Icon=harbour-sailfinder
-Exec=harbour-sailfinder
-Name=harbour-sailfinder
-# translation example:
-# your app name in German locale (de)
-#
-# Remember to comment out the following line, if you do not want to use
-# a different app name in German locale (de).
-Name[de]=harbour-sailfinder
diff --git a/docs/harbour-sailfinder/harbour-sailfinder.pro b/docs/harbour-sailfinder/harbour-sailfinder.pro
deleted file mode 100644
index b655a78..0000000
--- a/docs/harbour-sailfinder/harbour-sailfinder.pro
+++ /dev/null
@@ -1,112 +0,0 @@
-# NOTICE:
-#
-# Application name defined in TARGET has a corresponding QML filename.
-# If name defined in TARGET is changed, the following needs to be done
-# to match new name:
-# - corresponding QML filename must be changed
-# - desktop icon filename must be changed
-# - desktop filename must be changed
-# - icon definition filename in desktop file must be changed
-# - translation filenames have to be changed
-
-# The name of your application
-TARGET = harbour-sailfinder
-
-CONFIG += sailfishapp
-
-SOURCES += src/harbour-sailfinder.cpp
-
-OTHER_FILES += qml/harbour-sailfinder.qml \
- qml/cover/CoverPage.qml \
- qml/pages/FirstPage.qml \
- rpm/harbour-sailfinder.changes.in \
- rpm/harbour-sailfinder.spec \
- rpm/harbour-sailfinder.yaml \
- translations/*.ts \
- harbour-sailfinder.desktop
-
-SAILFISHAPP_ICONS = 86x86 108x108 128x128 256x256
-
-# to disable building translations every time, comment out the
-# following CONFIG line
-CONFIG += sailfishapp_i18n
-
-# German translation is enabled as an example. If you aren't
-# planning to localize your app, remember to comment out the
-# following TRANSLATIONS line. And also do not forget to
-# modify the localized app name in the the .desktop file.
-TRANSLATIONS += translations/harbour-sailfinder-de.ts
-
-DISTFILES += \
- qml/pages/api.pyc \
- qml/pages/api.pyo \
- qml/pages/api.py \
- qml/pages/AboutPage.qml \
- qml/pages/ErrorPage.qml \
- qml/pages/GalleryPage.qml \
- qml/pages/MainPage.qml \
- qml/pages/MessagingPage.qml \
- qml/pages/NetworkStatus.qml \
- qml/pages/PeoplePage.qml \
- qml/pages/ProfilePage.qml \
- qml/pages/SailfinderPage.qml \
- qml/pages/SettingsPage.qml \
- qml/pages/UpdateProfilePage.qml \
- qml/pages/images/no_gif.gif \
- qml/pages/images/0.png \
- qml/pages/images/1.png \
- qml/pages/images/bio_large.png \
- qml/pages/images/bio_small.png \
- qml/pages/images/dislike_large.png \
- qml/pages/images/dislike_small.png \
- qml/pages/images/edit_small.png \
- qml/pages/images/harbour-sailfinder.png \
- qml/pages/images/instagram_large.png \
- qml/pages/images/instagram_small.png \
- qml/pages/images/job_large.png \
- qml/pages/images/job_small.png \
- qml/pages/images/lastOnline.png \
- qml/pages/images/like_large.png \
- qml/pages/images/like_small.png \
- qml/pages/images/matches_large.png \
- qml/pages/images/matches_small.png \
- qml/pages/images/message_dislike.png \
- qml/pages/images/message_like.png \
- qml/pages/images/noImage.png \
- qml/pages/images/sailfinder-notification.png \
- qml/pages/images/school_large.png \
- qml/pages/images/school_small.png \
- qml/pages/images/settings.png \
- qml/pages/images/superLike_large.png \
- qml/pages/images/superLike_small.png \
- qml/pages/images/imageSources.txt \
- qml/pages/lib/helper.js \
- qml/images/no_gif.gif \
- qml/images/0.png \
- qml/images/1.png \
- qml/images/bio_large.png \
- qml/images/bio_small.png \
- qml/images/dislike_large.png \
- qml/images/dislike_small.png \
- qml/images/edit_small.png \
- qml/images/harbour-sailfinder.png \
- qml/images/instagram_large.png \
- qml/images/instagram_small.png \
- qml/images/job_large.png \
- qml/images/job_small.png \
- qml/images/lastOnline.png \
- qml/images/like_large.png \
- qml/images/like_small.png \
- qml/images/matches_large.png \
- qml/images/matches_small.png \
- qml/images/message_dislike.png \
- qml/images/message_like.png \
- qml/images/noImage.png \
- qml/images/sailfinder-notification.png \
- qml/images/school_large.png \
- qml/images/school_small.png \
- qml/images/settings.png \
- qml/images/superLike_large.png \
- qml/images/superLike_small.png \
- qml/images/imageSources.txt \
- qml/pages/js/helper.js
diff --git a/docs/harbour-sailfinder/harbour-sailfinder.pro.user b/docs/harbour-sailfinder/harbour-sailfinder.pro.user
deleted file mode 100644
index 762623b..0000000
--- a/docs/harbour-sailfinder/harbour-sailfinder.pro.user
+++ /dev/null
@@ -1,791 +0,0 @@
-
-
-
-
-
- EnvironmentId
- {7ef07d02-8c50-4668-a9a7-f5acf3e730c9}
-
-
- ProjectExplorer.Project.ActiveTarget
- 1
-
-
- ProjectExplorer.Project.EditorSettings
-
- true
- false
- true
-
- Cpp
-
- CppGlobal
-
-
-
- QmlJS
-
- QmlJSGlobal
-
-
- 2
- UTF-8
- false
- 4
- false
- 80
- true
- true
- 1
- true
- false
- 0
- true
- true
- 0
- 8
- true
- 1
- true
- true
- true
- false
-
-
-
- ProjectExplorer.Project.PluginSettings
-
-
-
- ProjectExplorer.Project.Target.0
-
- MerSDK-SailfishOS-i486
- MerSDK-SailfishOS-i486
- {d2adeae6-3625-4cd2-9bd5-b9599d8bc775}
- 0
- 0
- 0
-
- /home/dylan/Programmes/SFOSApps/build-harbour-sailfinder-MerSDK_SailfishOS_i486-Debug
-
-
- true
- Start SDK
-
- Mer.MerSdkStartStep
-
-
- true
- qmake
-
- QtProjectManager.QMakeBuildStep
- true
-
- false
- false
- false
-
-
- true
- Make
-
- Qt4ProjectManager.MakeStep
-
- -w
- -r
-
- false
-
-
-
- 3
- Build
-
- ProjectExplorer.BuildSteps.Build
-
-
-
- true
- Start SDK
-
- Mer.MerSdkStartStep
-
-
- true
- Make
-
- Qt4ProjectManager.MakeStep
-
- -w
- -r
-
- true
- clean
-
-
- 2
- Clean
-
- ProjectExplorer.BuildSteps.Clean
-
- 2
- false
-
- Debug
-
- Qt4ProjectManager.Qt4BuildConfiguration
- 2
- true
-
-
- /home/dylan/Programmes/SFOSApps/build-harbour-sailfinder-MerSDK_SailfishOS_i486-Release
-
-
- true
- Start SDK
-
- Mer.MerSdkStartStep
-
-
- true
- qmake
-
- QtProjectManager.QMakeBuildStep
- false
-
- false
- false
- false
-
-
- true
- Make
-
- Qt4ProjectManager.MakeStep
-
- -w
- -r
-
- false
-
-
-
- 3
- Build
-
- ProjectExplorer.BuildSteps.Build
-
-
-
- true
- Start SDK
-
- Mer.MerSdkStartStep
-
-
- true
- Make
-
- Qt4ProjectManager.MakeStep
-
- -w
- -r
-
- true
- clean
-
-
- 2
- Clean
-
- ProjectExplorer.BuildSteps.Clean
-
- 2
- false
-
- Release
-
- Qt4ProjectManager.Qt4BuildConfiguration
- 0
- true
-
-
- /home/dylan/Programmes/SFOSApps/build-harbour-sailfinder-MerSDK_SailfishOS_i486-Profile
-
-
- true
- Start SDK
-
- Mer.MerSdkStartStep
-
-
- true
- qmake
-
- QtProjectManager.QMakeBuildStep
- true
-
- false
- true
- false
-
-
- true
- Make
-
- Qt4ProjectManager.MakeStep
-
- -w
- -r
-
- false
-
-
-
- 3
- Build
-
- ProjectExplorer.BuildSteps.Build
-
-
-
- true
- Start SDK
-
- Mer.MerSdkStartStep
-
-
- true
- Make
-
- Qt4ProjectManager.MakeStep
-
- -w
- -r
-
- true
- clean
-
-
- 2
- Clean
-
- ProjectExplorer.BuildSteps.Clean
-
- 2
- false
-
- Profile
-
- Qt4ProjectManager.Qt4BuildConfiguration
- 0
- true
-
- 3
-
-
-
- true
- RPM
-
- QmakeProjectManager.MerRpmBuildStep
-
-
- true
- RPM Validation
-
- QmakeProjectManager.MerRpmValidationStep
-
- 2
- Deploy
-
- ProjectExplorer.BuildSteps.Deploy
-
- 1
- Deploy By Building An RPM Package
-
- QmakeProjectManager.MerMb2RpmBuildConfiguration
-
-
-
-
- true
- Prepare Target
-
- QmakeProjectManager.MerPrepareTargetStep
-
-
- true
- Rsync
-
- QmakeProjectManager.MerRsyncDeployStep
-
- 2
- Deploy
-
- ProjectExplorer.BuildSteps.Deploy
-
- 1
- Deploy By Copying Binaries
-
- QmakeProjectManager.MerRSyncDeployConfiguration
-
-
-
-
- true
- Prepare Target
-
- QmakeProjectManager.MerPrepareTargetStep
-
-
- true
- RPM
-
- QmakeProjectManager.MerRpmDeployStep
-
- 2
- Deploy
-
- ProjectExplorer.BuildSteps.Deploy
-
- 1
- Deploy As RPM Package
-
- QmakeProjectManager.MerRpmDeployConfiguration
-
- 3
-
-
- false
- false
- 1000
-
- true
-
- false
- false
- false
- false
- true
- 0.01
- 10
- true
- 1
- 25
-
- 1
- true
- false
- true
- valgrind
-
- 0
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
-
- 1
-
- harbour-sailfinder (on Remote Device)
-
- QmakeProjectManager.MerRunConfiguration:harbour-sailfinder
-
- harbour-sailfinder
-
- false
-
- 3768
- false
- true
- false
- false
- true
-
- 1
-
-
-
- ProjectExplorer.Project.Target.1
-
- MerSDK-SailfishOS-armv7hl
- MerSDK-SailfishOS-armv7hl
- {8437b00a-b0e4-47c4-928c-9fe8904886c7}
- 0
- 2
- 0
-
- /home/dylan/Programmes/SFOSApps/build-harbour-sailfinder-MerSDK_SailfishOS_armv7hl-Debug
-
-
- true
- Start SDK
-
- Mer.MerSdkStartStep
-
-
- true
- qmake
-
- QtProjectManager.QMakeBuildStep
- true
-
- false
- false
- false
-
-
- true
- Make
-
- Qt4ProjectManager.MakeStep
-
- -w
- -r
-
- false
-
-
-
- 3
- Build
-
- ProjectExplorer.BuildSteps.Build
-
-
-
- true
- Start SDK
-
- Mer.MerSdkStartStep
-
-
- true
- Make
-
- Qt4ProjectManager.MakeStep
-
- -w
- -r
-
- true
- clean
-
-
- 2
- Clean
-
- ProjectExplorer.BuildSteps.Clean
-
- 2
- false
-
- Debug
-
- Qt4ProjectManager.Qt4BuildConfiguration
- 2
- true
-
-
- /home/dylan/Programmes/SFOSApps/build-harbour-sailfinder-MerSDK_SailfishOS_armv7hl-Release
-
-
- true
- Start SDK
-
- Mer.MerSdkStartStep
-
-
- true
- qmake
-
- QtProjectManager.QMakeBuildStep
- false
-
- false
- false
- false
-
-
- true
- Make
-
- Qt4ProjectManager.MakeStep
-
- -w
- -r
-
- false
-
-
-
- 3
- Build
-
- ProjectExplorer.BuildSteps.Build
-
-
-
- true
- Start SDK
-
- Mer.MerSdkStartStep
-
-
- true
- Make
-
- Qt4ProjectManager.MakeStep
-
- -w
- -r
-
- true
- clean
-
-
- 2
- Clean
-
- ProjectExplorer.BuildSteps.Clean
-
- 2
- false
-
- Release
-
- Qt4ProjectManager.Qt4BuildConfiguration
- 0
- true
-
-
- /home/dylan/Programmes/SFOSApps/build-harbour-sailfinder-MerSDK_SailfishOS_armv7hl-Profile
-
-
- true
- Start SDK
-
- Mer.MerSdkStartStep
-
-
- true
- qmake
-
- QtProjectManager.QMakeBuildStep
- true
-
- false
- true
- false
-
-
- true
- Make
-
- Qt4ProjectManager.MakeStep
-
- -w
- -r
-
- false
-
-
-
- 3
- Build
-
- ProjectExplorer.BuildSteps.Build
-
-
-
- true
- Start SDK
-
- Mer.MerSdkStartStep
-
-
- true
- Make
-
- Qt4ProjectManager.MakeStep
-
- -w
- -r
-
- true
- clean
-
-
- 2
- Clean
-
- ProjectExplorer.BuildSteps.Clean
-
- 2
- false
-
- Profile
-
- Qt4ProjectManager.Qt4BuildConfiguration
- 0
- true
-
- 3
-
-
-
- true
- RPM
-
- QmakeProjectManager.MerRpmBuildStep
-
-
- true
- RPM Validation
-
- QmakeProjectManager.MerRpmValidationStep
-
- 2
- Deploy
-
- ProjectExplorer.BuildSteps.Deploy
-
- 1
- Deploy By Building An RPM Package
-
- QmakeProjectManager.MerMb2RpmBuildConfiguration
-
-
-
-
- true
- Prepare Target
-
- QmakeProjectManager.MerPrepareTargetStep
-
-
- true
- Rsync
-
- QmakeProjectManager.MerRsyncDeployStep
-
- 2
- Deploy
-
- ProjectExplorer.BuildSteps.Deploy
-
- 1
- Deploy By Copying Binaries
-
- QmakeProjectManager.MerRSyncDeployConfiguration
-
-
-
-
- true
- Prepare Target
-
- QmakeProjectManager.MerPrepareTargetStep
-
-
- true
- RPM
-
- QmakeProjectManager.MerRpmDeployStep
-
- 2
- Deploy
-
- ProjectExplorer.BuildSteps.Deploy
-
- 1
- Deploy As RPM Package
-
- QmakeProjectManager.MerRpmDeployConfiguration
-
- 3
-
-
- false
- false
- 1000
-
- true
-
- false
- false
- false
- false
- true
- 0.01
- 10
- true
- 1
- 25
-
- 1
- true
- false
- true
- valgrind
-
- 0
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
-
- 1
-
- harbour-sailfinder (on Remote Device)
-
- QmakeProjectManager.MerRunConfiguration:harbour-sailfinder
-
- harbour-sailfinder
-
- false
-
- 3768
- false
- true
- false
- false
- true
-
- 1
-
-
-
- ProjectExplorer.Project.TargetCount
- 2
-
-
- ProjectExplorer.Project.Updater.FileVersion
- 18
-
-
- Version
- 18
-
-
diff --git a/docs/harbour-sailfinder/icons/108x108/harbour-sailfinder.png b/docs/harbour-sailfinder/icons/108x108/harbour-sailfinder.png
deleted file mode 100644
index eafb0ab..0000000
Binary files a/docs/harbour-sailfinder/icons/108x108/harbour-sailfinder.png and /dev/null differ
diff --git a/docs/harbour-sailfinder/icons/128x128/harbour-sailfinder.png b/docs/harbour-sailfinder/icons/128x128/harbour-sailfinder.png
deleted file mode 100644
index e8ade97..0000000
Binary files a/docs/harbour-sailfinder/icons/128x128/harbour-sailfinder.png and /dev/null differ
diff --git a/docs/harbour-sailfinder/icons/256x256/harbour-sailfinder.png b/docs/harbour-sailfinder/icons/256x256/harbour-sailfinder.png
deleted file mode 100644
index 2206d36..0000000
Binary files a/docs/harbour-sailfinder/icons/256x256/harbour-sailfinder.png and /dev/null differ
diff --git a/docs/harbour-sailfinder/icons/86x86/harbour-sailfinder.png b/docs/harbour-sailfinder/icons/86x86/harbour-sailfinder.png
deleted file mode 100644
index 4bb96ea..0000000
Binary files a/docs/harbour-sailfinder/icons/86x86/harbour-sailfinder.png and /dev/null differ
diff --git a/docs/harbour-sailfinder/icons/docs/facebook_api.md b/docs/harbour-sailfinder/icons/docs/facebook_api.md
deleted file mode 100644
index 3024e26..0000000
--- a/docs/harbour-sailfinder/icons/docs/facebook_api.md
+++ /dev/null
@@ -1,44 +0,0 @@
-# Facebook Graph API
- _with Python Requests_
-
-**Only for reference since the API clearly documented on the Facebook Developer pages.**
-
-### Get all albums of users
-```
-fb_albums = session.get("https://graph.facebook.com/v2.6/" + fb_user_id + "/albums?access_token=" + fb_token)
-```
-
-Parameter info:
-
-
-
-
- fb_user_id
- **string**: The user id from Facebook for this app.
-
-
- fb_token
- **string**: A valid FB token for this app and this user.
-
-
-
-
-### Get all photos of users
-```
-fb_photos = session.get("https://graph.facebook.com/v2.6/" + fb_album_id + "/photos?access_token=" + fb_token)
-```
-
-Parameter info:
-
-
-
-
- fb_album_id
- **string**: The album id from Facebook which can be get by quering all the albums from Facebook.
-
-
- fb_token
- **string**: A valid FB token for this app and this user.
-
-
-
diff --git a/docs/harbour-sailfinder/icons/docs/facebook_api.md.html b/docs/harbour-sailfinder/icons/docs/facebook_api.md.html
deleted file mode 100644
index 33c5a06..0000000
--- a/docs/harbour-sailfinder/icons/docs/facebook_api.md.html
+++ /dev/null
@@ -1,541 +0,0 @@
-
-
-
-
- facebook_api
-
-
- Facebook Graph API
- with Python Requests
-Only for reference since the API clearly documented on the Facebook Developer pages.
-Get all albums of users
-fb_albums = session.get(" https://graph.facebook.com/v2.6/ " + fb_user_id + "/albums?access_token=" + fb_token)
Parameter info:
-
-
-
- fb_user_id
- string : The user id from Facebook for this app.
-
-
- fb_token
- string : A valid FB token for this app and this user.
-
-
-
-
-Get all photos of users
-fb_photos = session.get(" https://graph.facebook.com/v2.6/ " + fb_album_id + "/photos?access_token=" + fb_token)
Parameter info:
-
-
-
- fb_album_id
- string : The album id from Facebook which can be get by quering all the albums from Facebook.
-
-
- fb_token
- string : A valid FB token for this app and this user.
-
-
-
-
diff --git a/docs/harbour-sailfinder/icons/docs/giphy_api.md b/docs/harbour-sailfinder/icons/docs/giphy_api.md
deleted file mode 100644
index 52fb444..0000000
--- a/docs/harbour-sailfinder/icons/docs/giphy_api.md
+++ /dev/null
@@ -1,24 +0,0 @@
-# GIPHY API
- _with Python Requests_
-
-**Sniffed by myself**
-
-```
-search_word = search_word.replace(" ", "+") #Confirm with the Giphy API
-gifs = session.get("http://api.giphy.com/v1/gifs/search?q=" + search_word + "&api_key=fBEDuhnVCiP16"
-```
-
-Parameter info:
-
-
-
-
- search_word
- **string**: The word on which you want to find GIFs.
-
-
-
-
-Note: You need to replace every space in the search word by '+' for the GIPHY API.
-
-*The GIPHY API key for the app Tinder is: `fBEDuhnVCiP16`*
diff --git a/docs/harbour-sailfinder/icons/docs/giphy_api.md.html b/docs/harbour-sailfinder/icons/docs/giphy_api.md.html
deleted file mode 100644
index 4f9c8d8..0000000
--- a/docs/harbour-sailfinder/icons/docs/giphy_api.md.html
+++ /dev/null
@@ -1,524 +0,0 @@
-
-
-
-
- giphy_api
-
-
- GIPHY API
- with Python Requests
-Sniffed by myself
-search_word = search_word.replace(" ", "+") #Confirm with the Giphy API
gifs = session.get(" http://api.giphy.com/v1/gifs/search?q= " + search_word + "&api_key=fBEDuhnVCiP16"
Parameter info:
-
-
-
- search_word
- string : The word on which you want to find GIFs.
-
-
-
-
-Note: You need to replace every space in the search word by '+' for the GIPHY API.
-The GIPHY API key for the app Tinder is: fBEDuhnVCiP16
-
diff --git a/docs/harbour-sailfinder/icons/docs/tinder_api.md b/docs/harbour-sailfinder/icons/docs/tinder_api.md
deleted file mode 100644
index 0f65a32..0000000
--- a/docs/harbour-sailfinder/icons/docs/tinder_api.md
+++ /dev/null
@@ -1,838 +0,0 @@
-# Tinder API
- _with Python Requests_
-
-**Inspired by this Github Gist and the rest is sniffed by myself.**
-
-
-### API Details
-
-
-
-
- Host
- api.gotinder.com
-
-
- Protocol
- SSL only
-
-
-
-
-*'api.gotinder.com' will be refered in this document as TINDER_HOST*
-
-Request headers
-
-
-
-
- Header name
- Description
-
-
-
-
- X-Auth-Token
- A UUID4 format authentication token obtained via the /auth api endpoint
-
-
- Content-type
- application/json
-
-
- app_version
- 371
-
-
- platform
- ios
-
-
- User-agent
- User-Agent: Tinder/4.6.1 (iPhone; iOS 9.0.1; Scale/2.00)
-
-
- os_version
- 900001
-
-
-
-
-All Python Requests examples need these headers!
-You can add these by running this command, after you established your session:
-
-```
-session.headers.update(HEADERS)
-```
-
-### Authenticating
-
-__Obtain a valid Facebook token before authenticating with the Tinder API!__
-
-```
-login = session.post(TINDER_HOST + '/auth', data=json.dumps({"facebook_token": facebook_token}))
-session.headers.update({"X-Auth-Token": login['token']})
-```
-
-Parameter info:
-
-
-
-
- facebook_token
- **string**: Facebook token from the OAuth dialog
-
-
-
-
-The easiest way to get this is to go here , log in and then pick the auth token out of the URL you are redirected to.
-
-Response:
-```json
-{
- "token": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXXX",
- "user": { ... },
- "globals": { ... },
- "versions": { ... }
-}
-```
-
-### Updating your profile
-```
-profile = session.post(TINDER_HOST + '/profile', data=json.dumps({"discoverable" : discoverable, "age_filter_min" : age_min, "age_filter_max" : age_max, "gender": gender, "gender_filter" : gender_filter, "distance_filter" : distance, "bio": bio}))
-```
-
-Parameter info:
-
-
-
-
- discoverable
- **true**:Other users can swipe on you **false**: nobody can see you except for your matches
-
-
- gender
- **0**: I'm a male
- **1**: I'm a female
-
-
- age_filter_min
- **integer**: minimum age recommendations
-
-
- age_filter_max
- **integer**: maximum age recommendations
-
-
- distance_filter
- **integer**: search distance in miles (0 - 160 km)
-
-
-
-
-Response:
-
-```json
-{
- TODO
- "token": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXXX",
- "user": { ... },
- "globals": { ... },
- "versions": { ... }
-}
-```
-
-### Updating your school or work places
-```
-profile_school = session.put(TINDER_HOST + '/profile/school', data=json.dumps({"schools": [{"id": fb_school1_id}, {"id": fb_school2_id}], {...}}))
-
-profile_jobs = session.put(TINDER_HOST + '/profile/job', data=json.dumps({"jobs": [{"company": [{"id": fb_job1_id}]}, {"company": [{"id": fb_job2_id}]}], {...}}))
-```
-
-Parameter info:
-
-
-
-
- schools
- **list**: List all your schools by using the fb_school_id, which need to be obtained from the Facebook Graph API.
-
-
- fb_school_id
- **string**: A FB id which represents the school
-
-
-
-
-
-
-
- jobs
- **list**: List all your jobs by using the fb_job_id, which need to be obtained from the Facebook Graph API.
-
-
- fb_job_id
- **string**: A FB id which represents the job
-
-
-
-
-### Removing your school or work places
-```
-profile_school = session.delete(TINDER_HOST + '/profile/school')
-
-profile_jobs = session.delete(TINDER_HOST + '/profile/job')
-```
-
-### Create, update and remove an username
-
-Create a username so you will show up on the Tinder webprofiles and share your profile on social media.
-
-```
-create_username = session.post(TINDER_HOST + '/profile/username', data=json.dumps({"username": username}))
-```
-
-```
-update_username = session.put(TINDER_HOST + '/profile/username', data=json.dumps({"username": username}))
-```
-
-```
-remove_username = session.delete(TINDER_HOST + '/profile/username')
-```
-
-Parameter info:
-
-
-
-
- username
- **string**: Username of your choice
-
-
-
-
-In case that the username is already taken, the user already registered one, ... then an error is returned:
-```json
-{
- "error":"User has already registered a username"
-}
-
-{
- "error":"User has no username to update"
-}
-
-{
- "error":"User has no username to remove"
-}
-```
-
-### Create share link for social media
-```
-share_link = session.post(TINDER_HOST + '/user/{user_id}/share')
-```
-
-Parameter info:
-
-
-
-
- user_id
- **string**: Tinder user ID
-
-
-
-
-### Meta data
-When polling this endpoint I received a 404 HTTP ERROR but the official client still this use this.
-
-```
-meta_data = session.get(TINDER_HOST + '/meta')
-```
-
-
-### Reporting users
-```
-report = session.post(TINDER_HOST + '/report/{user_id}', data=json.dumps({"cause": cause}))
-```
-
-Parameter info:
-
-
-
-
- match_id
- **string**: Tinder match ID
-
-
- cause
- **1**: Reason is SPAM
- **2**: Reason is inappropriate/offensive
-
-
-
-
-### Upload local pictures to the Tinder image server
-Also broken, a HTTP ERROR 500 is received but the offcial client works this way:
-
-```
-local_upload = session.post('https://imageupload.gotinder.com/image?client_photo_id=ProfilePhoto' + str(int(time.time())*1000), json={'userId': userID}, files={'file': open('test.jpeg', 'rb')})
-```
-
-### Upload facebook pictures to the Tinder image server
-Select a Facebook photo to set it as a profile picture.
-
-```
-upload_fb = session.post(TINDER_HOST + '/media', data=json.dumps({"transmit": "fb", "assets": [{"ydistance_percent": ydistance_percent,"id": fb_picture_id,"xoffset_percent": xoffset_percent,"yoffset_percent": yoffset_percent,"xdistance_percent": xdistance_percent}]}))
-```
-
-Parameter info:
-
-
-
-
- ydistance_percent
- **int**: ???, 0 seems to work
-
-
- xdistance_percent
- **int**: ???, 0 seems to work
-
-
- yoffset_percent
- **int**: ???, 0 seems to work
-
-
- xoffset_percent
- **int**: ???, 0 seems to work
-
-
- id
- **string**: Facebook id of the picture
-
-
-
-
-### Remove picture
-```
-remove_picture = session.delete(TINDER_HOST + '/media', data=json.dumps({"assets": [tinder_picture_id]}))
-```
-
-Parameter info:
-
-
-
-
- assets
- **list**: list of the pictures you want to delete with their Tinder picture id as strings.
-
-
-
-
-Response:
-
-```json
-{
- "A list of all the pictures after the operation."
-}
-```
-
-### Sending messages/gifs
-
-Send a message to a match. Note you'll get a HTTP 500 back if you try to send a message to someone who isn't a match!
-
-```
-send_message = session.post(TINDER_HOST + '/user/matches/{match_id}', data=json.dumps({"message": message}))
-```
-
-Parameter info:
-
-
-
-
- match_id
- **string**: Tinder match ID
-
-
- message
- **string**: Message to send
-
-
-
-
-Response:
-
-```json
-{
- "_id":"53467235483cb56c475cc1d6",
- "from":"53430689ab3c04c13e006ffb",
- "to":"533a59ea52046fc077002815",
- "match_id":"53464b0728ac73976d0a3fbf",
- "sent_date":"2014-04-10T10:28:05.764Z",
- "message":"hi!",
- "created_date":"2014-04-10T10:28:05.764Z"
-}
-```
-
-```
-send_gif = session.post(TINDER_HOST + '/user/matches/{match_id}', data=json.dumps({"type": "GIF", "message": message, "gif_id": gif_id}))
-```
-
-Parameter info:
-
-
-
-
- match_id
- **string**: Tinder match ID
-
-
- message
- **string**: The GIPHY URL of the GIF
-
-
- gif_id
- **string**: The GIPHY ID of the GIF
-
-
-
-
-Response:
-
-```json
-{
- "_id":"53467235483cb56c475cc1d6",
- "from":"53430689ab3c04c13e006ffb",
- "to":"533a59ea52046fc077002815",
- "match_id":"53464b0728ac73976d0a3fbf",
- "sent_date":"2014-04-10T10:28:05.764Z",
- "message":"hi!",
- "created_date":"2014-04-10T10:28:05.764Z"
-}
-```
-
-### Liking messages
-
-Liking a message is like a superlike for messages.
-
-```
-like_message = session.post(TINDER_HOST + '/message/{message_id}/like')
-unlike_message = session.delete(TINDER_HOST + '/message/{message_id}/like')
-```
-
-Parameter info:
-
-
-
-
- message_id
- **string**: Tinder ID of the message you want to like.
-
-
-
-
-### Unmatch a match
-
-Unmatch a match by sending an HTTP DELETE
-
-```
-unmatch = session.delete(TINDER_HOST + '/user/matches/{match_id}')
-```
-
-Parameter info:
-
-
-
-
- user_id
- **string**: Tinder match ID
-
-
-
-
-Response:
-
-```json
-{
- "_id":"53467235483cb56c475cc1d6",
- "from":"53430689ab3c04c13e006ffb",
- "to":"533a59ea52046fc077002815",
- "match_id":"53464b0728ac73976d0a3fbf",
- "sent_date":"2014-04-10T10:28:05.764Z",
- "message":"hi!",
- "created_date":"2014-04-10T10:28:05.764Z"
-}
-```
-
-### Updating your location
-
-```
-location = session.post(TINDER_HOST + '/user/ping', data=json.dumps({"lat": latitude, "lon": longitude))
-```
-
-Parameter info:
-
-
-
-
- lat
- **int**: Latitude of your location in degrees
-
-
- long
- **int**: Longitude of your location in degrees
-
-
-
-
-```json
-{
- "status": 200,
- "error": "position change not significant"
-}
-```
-
-If the change in location is too small, you get the above error.
-
-### Tinder history & updates
-
-Get a complete list of your matches, messages, ... from your account.
-The official Tinder client does this once when it's started for the first time, after that it relies on the incremental updates which you can requests by using the 'last_activity_date' parameter.
-
-```
-updates = session.post(TINDER_HOST + '/updates', data=json.dumps({"last_activity_date:" : date_in_JS_notation})
-```
-
-Response:
-```json
-{
- "matches": [{
- "_id": "53464b0728ac73976d0a3fbf",
- "messages": [{
- "_id": "534651198ce6da797248c1a3",
- "match_id": "53464b0728ac73976d0a3fbf",
- "to": "53430689ab3c04c13e006ffb",
- "from": "533a59ea52046fc077002815",
- "message": "hi .... how is it going?",
- "sent_date": "2014-04-10T08:06:49.800Z",
- "created_date": "2014-04-10T08:06:49.800Z",
- "timestamp": 1397117209800
- }, {
- "_id": "53466fd298b7278b72156523",
- "match_id": "53464b0728ac73976d0a3fbf",
- "to": "533a59ea52046fc077002815",
- "from": "53430689ab3c04c13e006ffb",
- "message": "Good thanks you? :)",
- "sent_date": "2014-04-10T10:17:54.379Z",
- "created_date": "2014-04-10T10:17:54.379Z",
- "timestamp": 1397125074379
- }],
- "last_activity_date": "2014-04-10T10:17:54.379Z"
- }],
- "blocks": [],
- "lists": [],
- "deleted_lists": [],
- "last_activity_date": "2014-04-10T10:17:54.379Z"
-}
-```
-
-### Liking, disliking & superliking
-```
-like = session.post(TINDER_HOST + '/like/{user_id}')
-dislike = session.post(TINDER_HOST + '/pass/{user_id}')
-superlike = session.post(TINDER_HOST + '/like/{user_id}/superlike')
-```
-
-Parameter info:
-
-
-
-
- user_id
- **string**: Tinder user ID
-
-
-
-Response for like:
-
-```json
-{
- "match": "true or false"
-}
-```
-
-Response for superlike:
-
-```json
-{
- "match": "true or false",
- "superlikes": {
- "remaining": "superlikes_remaining",
- "resets_at": "reset_date_time"
- }
-}
-```
-
-If they also liked you then 'match' will be `true`.
-This is not returned if you disliked an user.
-
-
-### Recommendations
-
-Get your recommendations in this area, default limit is 10 users/request.
-```
-like = session.post(TINDER_HOST + '/recs', data=json.dumps({"limit:" : 10})
-```
-
-Parameter info:
-
-
-
-
- limit
- **int**: Number of Tinder users to like/dislike/superlike in this area. Default is 10, when done you need to run this request again.
-
-
-
-```json
-{
- "status": 200,
- "results": [{
- "distance_mi": 2,
- "common_like_count": 0,
- "common_friend_count": 0,
- "common_likes": [],
- "common_friends": [],
- "_id": "518d666a2a00df0e490000b9",
- "bio": "",
- "birth_date": "1986-05-17T00:00:00.000Z",
- "gender": 1,
- "name": "Elen",
- "ping_time": "2014-04-08T11:59:18.494Z",
- "photos": [{
- "id": "fea4f480-7ce0-4143-a310-a03c2b2cdbc6",
- "main": true,
- "crop": "source",
- "fileName": "fea4f480-7ce0-4143-a310-a03c2b2cdbc6.jpg",
- "extension": "jpg",
- "processedFiles": [{
- "width": 640,
- "height": 640,
- "url": "http://images.gotinder.com/518d666a2a00df0e490000b9/640x640_fea4f480-7ce0-4143-a310-a03c2b2cdbc6.jpg"
- }, {
- "width": 320,
- "height": 320,
- "url": "http://images.gotinder.com/518d666a2a00df0e490000b9/320x320_fea4f480-7ce0-4143-a310-a03c2b2cdbc6.jpg"
- }, {
- "width": 172,
- "height": 172,
- "url": "http://images.gotinder.com/518d666a2a00df0e490000b9/172x172_fea4f480-7ce0-4143-a310-a03c2b2cdbc6.jpg"
- }, {
- "width": 84,
- "height": 84,
- "url": "http://images.gotinder.com/518d666a2a00df0e490000b9/84x84_fea4f480-7ce0-4143-a310-a03c2b2cdbc6.jpg"
- }],
- "url": "http://images.gotinder.com/518d666a2a00df0e490000b9/fea4f480-7ce0-4143-a310-a03c2b2cdbc6.jpg"
- }, {
- "url": "http://images.gotinder.com/518d666a2a00df0e490000b9/5c1d3231-5a75-4a07-91ff-5c012716583f.jpg",
- "processedFiles": [{
- "url": "http://images.gotinder.com/518d666a2a00df0e490000b9/640x640_pct_0_29.5312464_540_540_5c1d3231-5a75-4a07-91ff-5c012716583f.jpg",
- "height": 640,
- "width": 640
- }, {
- "url": "http://images.gotinder.com/518d666a2a00df0e490000b9/320x320_pct_0_29.5312464_540_540_5c1d3231-5a75-4a07-91ff-5c012716583f.jpg",
- "height": 320,
- "width": 320
- }, {
- "url": "http://images.gotinder.com/518d666a2a00df0e490000b9/172x172_pct_0_29.5312464_540_540_5c1d3231-5a75-4a07-91ff-5c012716583f.jpg",
- "height": 172,
- "width": 172
- }, {
- "url": "http://images.gotinder.com/518d666a2a00df0e490000b9/84x84_pct_0_29.5312464_540_540_5c1d3231-5a75-4a07-91ff-5c012716583f.jpg",
- "height": 84,
- "width": 84
- }],
- "extension": "jpg",
- "fileName": "5c1d3231-5a75-4a07-91ff-5c012716583f.jpg",
- "main": false,
- "ydistance_percent": 0.75,
- "yoffset_percent": 0.04101562,
- "xoffset_percent": 0,
- "id": "5c1d3231-5a75-4a07-91ff-5c012716583f",
- "xdistance_percent": 1
- }, {
- "url": "http://images.gotinder.com/518d666a2a00df0e490000b9/5abd87e5-a181-4946-a8b9-880926a78943.jpg",
- "processedFiles": [{
- "url": "http://images.gotinder.com/518d666a2a00df0e490000b9/640x640_pct_0_118.125_540_540_5abd87e5-a181-4946-a8b9-880926a78943.jpg",
- "height": 640,
- "width": 640
- }, {
- "url": "http://images.gotinder.com/518d666a2a00df0e490000b9/320x320_pct_0_118.125_540_540_5abd87e5-a181-4946-a8b9-880926a78943.jpg",
- "height": 320,
- "width": 320
- }, {
- "url": "http://images.gotinder.com/518d666a2a00df0e490000b9/172x172_pct_0_118.125_540_540_5abd87e5-a181-4946-a8b9-880926a78943.jpg",
- "height": 172,
- "width": 172
- }, {
- "url": "http://images.gotinder.com/518d666a2a00df0e490000b9/84x84_pct_0_118.125_540_540_5abd87e5-a181-4946-a8b9-880926a78943.jpg",
- "height": 84,
- "width": 84
- }],
- "extension": "jpg",
- "fileName": "5abd87e5-a181-4946-a8b9-880926a78943.jpg",
- "main": false,
- "ydistance_percent": 0.75,
- "yoffset_percent": 0.1640625,
- "xoffset_percent": 0,
- "id": "5abd87e5-a181-4946-a8b9-880926a78943",
- "xdistance_percent": 1
- }, {
- "url": "http://images.gotinder.com/518d666a2a00df0e490000b9/5e168698-a034-40c0-b7fb-7c05743f2310.jpg",
- "processedFiles": [{
- "url": "http://images.gotinder.com/518d666a2a00df0e490000b9/640x640_pct_157.570344_0_405_405_5e168698-a034-40c0-b7fb-7c05743f2310.jpg",
- "height": 640,
- "width": 640
- }, {
- "url": "http://images.gotinder.com/518d666a2a00df0e490000b9/320x320_pct_157.570344_0_405_405_5e168698-a034-40c0-b7fb-7c05743f2310.jpg",
- "height": 320,
- "width": 320
- }, {
- "url": "http://images.gotinder.com/518d666a2a00df0e490000b9/172x172_pct_157.570344_0_405_405_5e168698-a034-40c0-b7fb-7c05743f2310.jpg",
- "height": 172,
- "width": 172
- }, {
- "url": "http://images.gotinder.com/518d666a2a00df0e490000b9/84x84_pct_157.570344_0_405_405_5e168698-a034-40c0-b7fb-7c05743f2310.jpg",
- "height": 84,
- "width": 84
- }],
- "extension": "jpg",
- "fileName": "5e168698-a034-40c0-b7fb-7c05743f2310.jpg",
- "main": false,
- "ydistance_percent": 1,
- "yoffset_percent": 0,
- "xoffset_percent": 0.2188477,
- "id": "5e168698-a034-40c0-b7fb-7c05743f2310",
- "xdistance_percent": 0.5625
- }],
- "birth_date_info": "fuzzy birthdate active, not displaying real birth_date"
- }, {
- "distance_mi": 4,
- "common_like_count": 0,
- "common_friend_count": 0,
- "common_likes": [],
- "common_friends": [],
- "_id": "52cfc097f43cd91a67003639",
- "bio": "",
- "birth_date": "1987-11-02T00:00:00.000Z",
- "gender": 1,
- "name": "Cristina",
- "ping_time": "2014-04-06T16:52:51.605Z",
- "photos": [{
- "id": "4ab7173f-7884-4fe3-872f-32c01d77de2a",
- "main": "main",
- "shape": "center_square",
- "fileName": "4ab7173f-7884-4fe3-872f-32c01d77de2a.jpg",
- "extension": "jpg",
- "processedFiles": [{
- "width": 640,
- "height": 640,
- "url": "http://images.gotinder.com/52cfc097f43cd91a67003639/640x640_4ab7173f-7884-4fe3-872f-32c01d77de2a.jpg"
- }, {
- "width": 320,
- "height": 320,
- "url": "http://images.gotinder.com/52cfc097f43cd91a67003639/320x320_4ab7173f-7884-4fe3-872f-32c01d77de2a.jpg"
- }, {
- "width": 172,
- "height": 172,
- "url": "http://images.gotinder.com/52cfc097f43cd91a67003639/172x172_4ab7173f-7884-4fe3-872f-32c01d77de2a.jpg"
- }, {
- "width": 84,
- "height": 84,
- "url": "http://images.gotinder.com/52cfc097f43cd91a67003639/84x84_4ab7173f-7884-4fe3-872f-32c01d77de2a.jpg"
- }],
- "url": "http://images.gotinder.com/52cfc097f43cd91a67003639/4ab7173f-7884-4fe3-872f-32c01d77de2a.jpg"
- }, {
- "id": "bb8ac90b-f48a-4a1c-8cba-0c05d26f1b47",
- "shape": "center_square",
- "fileName": "bb8ac90b-f48a-4a1c-8cba-0c05d26f1b47.jpg",
- "extension": "jpg",
- "processedFiles": [{
- "width": 640,
- "height": 640,
- "url": "http://images.gotinder.com/52cfc097f43cd91a67003639/640x640_bb8ac90b-f48a-4a1c-8cba-0c05d26f1b47.jpg"
- }, {
- "width": 320,
- "height": 320,
- "url": "http://images.gotinder.com/52cfc097f43cd91a67003639/320x320_bb8ac90b-f48a-4a1c-8cba-0c05d26f1b47.jpg"
- }, {
- "width": 172,
- "height": 172,
- "url": "http://images.gotinder.com/52cfc097f43cd91a67003639/172x172_bb8ac90b-f48a-4a1c-8cba-0c05d26f1b47.jpg"
- }, {
- "width": 84,
- "height": 84,
- "url": "http://images.gotinder.com/52cfc097f43cd91a67003639/84x84_bb8ac90b-f48a-4a1c-8cba-0c05d26f1b47.jpg"
- }],
- "url": "http://images.gotinder.com/52cfc097f43cd91a67003639/bb8ac90b-f48a-4a1c-8cba-0c05d26f1b47.jpg"
- }, {
- "id": "dabe1c27-f186-48f2-807f-8a68e3831fe9",
- "shape": "center_square",
- "fileName": "dabe1c27-f186-48f2-807f-8a68e3831fe9.jpg",
- "extension": "jpg",
- "processedFiles": [{
- "width": 640,
- "height": 640,
- "url": "http://images.gotinder.com/52cfc097f43cd91a67003639/640x640_dabe1c27-f186-48f2-807f-8a68e3831fe9.jpg"
- }, {
- "width": 320,
- "height": 320,
- "url": "http://images.gotinder.com/52cfc097f43cd91a67003639/320x320_dabe1c27-f186-48f2-807f-8a68e3831fe9.jpg"
- }, {
- "width": 172,
- "height": 172,
- "url": "http://images.gotinder.com/52cfc097f43cd91a67003639/172x172_dabe1c27-f186-48f2-807f-8a68e3831fe9.jpg"
- }, {
- "width": 84,
- "height": 84,
- "url": "http://images.gotinder.com/52cfc097f43cd91a67003639/84x84_dabe1c27-f186-48f2-807f-8a68e3831fe9.jpg"
- }],
- "url": "http://images.gotinder.com/52cfc097f43cd91a67003639/dabe1c27-f186-48f2-807f-8a68e3831fe9.jpg"
- }, {
- "url": "http://images.gotinder.com/52cfc097f43cd91a67003639/59263e9d-6d76-4f42-8c8e-b4cf635b03c7.jpg",
- "processedFiles": [{
- "url": "http://images.gotinder.com/52cfc097f43cd91a67003639/640x640_59263e9d-6d76-4f42-8c8e-b4cf635b03c7.jpg",
- "height": 640,
- "width": 640
- }, {
- "url": "http://images.gotinder.com/52cfc097f43cd91a67003639/320x320_59263e9d-6d76-4f42-8c8e-b4cf635b03c7.jpg",
- "height": 320,
- "width": 320
- }, {
- "url": "http://images.gotinder.com/52cfc097f43cd91a67003639/172x172_59263e9d-6d76-4f42-8c8e-b4cf635b03c7.jpg",
- "height": 172,
- "width": 172
- }, {
- "url": "http://images.gotinder.com/52cfc097f43cd91a67003639/84x84_59263e9d-6d76-4f42-8c8e-b4cf635b03c7.jpg",
- "height": 84,
- "width": 84
- }],
- "extension": "jpg",
- "fileName": "59263e9d-6d76-4f42-8c8e-b4cf635b03c7.jpg",
- "main": false,
- "ydistance_percent": 0.75,
- "yoffset_percent": 0.08554687,
- "xoffset_percent": 0,
- "id": "59263e9d-6d76-4f42-8c8e-b4cf635b03c7",
- "xdistance_percent": 1
- }],
- "birth_date_info": "fuzzy birthdate active, not displaying real birth_date"
- }, "JSON DATA OF NEXT USER" ]
-}
-```
-
-### Delete account
-Delete your account, this can not be undone!
-
-```
-delete_account = session.delete(TINDER_HOST + '/profile')
-```
diff --git a/docs/harbour-sailfinder/icons/docs/tinder_api.md.html b/docs/harbour-sailfinder/icons/docs/tinder_api.md.html
deleted file mode 100644
index c0a9d88..0000000
--- a/docs/harbour-sailfinder/icons/docs/tinder_api.md.html
+++ /dev/null
@@ -1,842 +0,0 @@
-
-
-
-
- tinder_api
-
-
- Tinder API
- with Python Requests
-Inspired by this Github Gist and the rest is sniffed by myself.
-API Details
-
-
-
- Host
- api.gotinder.com
-
-
- Protocol
- SSL only
-
-
-
-
-'api.gotinder.com' will be refered in this document as TINDER_HOST
-Request headers
-
-
-
- Header name
- Description
-
-
-
-
- X-Auth-Token
- A UUID4 format authentication token obtained via the /auth api endpoint
-
-
- Content-type
- application/json
-
-
- app_version
- 371
-
-
- platform
- ios
-
-
- User-agent
- User-Agent: Tinder/4.6.1 (iPhone; iOS 9.0.1; Scale/2.00)
-
-
- os_version
- 900001
-
-
-
-
-All Python Requests examples need these headers!
-You can add these by running this command, after you established your session:
-session.headers.update(HEADERS)
Authenticating
-Obtain a valid Facebook token before authenticating with the Tinder API!
-login = session.post(TINDER_HOST + '/auth', data=json.dumps({"facebook_token": facebook_token}))
session.headers.update({"X-Auth-Token": login['token']})
Parameter info:
-
-
-
- facebook_token
- string : Facebook token from the OAuth dialog
-
-
-
-
-The easiest way to get this is to go here , log in and then pick the auth token out of the URL you are redirected to.
-Response:
-{
" token " : " XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXXX " ,
" user " : { . . . } ,
" globals " : { . . . } ,
" versions " : { . . . }
}
-Updating your profile
-profile = session.post(TINDER_HOST + '/profile', data=json.dumps({"discoverable" : discoverable, "age_filter_min" : age_min, "age_filter_max" : age_max, "gender": gender, "gender_filter" : gender_filter, "distance_filter" : distance, "bio": bio}))
Parameter info:
-
-
-
- discoverable
- true :Other users can swipe on youfalse : nobody can see you except for your matches
-
-
- gender
- 0 : I'm a male
- 1 : I'm a female
-
-
- age_filter_min
- integer : minimum age recommendations
-
-
- age_filter_max
- integer : maximum age recommendations
-
-
- distance_filter
- integer : search distance in miles (0 - 160 km)
-
-
-
-
-Response:
-{
T O D O
" token " : " XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXXX " ,
" user " : { . . . } ,
" globals " : { . . . } ,
" versions " : { . . . }
}
-Updating your school or work places
-profile_school = session.put(TINDER_HOST + '/profile/school', data=json.dumps({"schools": [{"id": fb_school1_id}, {"id": fb_school2_id}], {...}}))
profile_jobs = session.put(TINDER_HOST + '/profile/job', data=json.dumps({"jobs": [{"company": [{"id": fb_job1_id}]}, {"company": [{"id": fb_job2_id}]}], {...}}))
Parameter info:
-
-
-
- schools
- list : List all your schools by using the fb_school_id, which need to be obtained from the Facebook Graph API.
-
-
- fb_school_id
- string : A FB id which represents the school
-
-
-
-
-
-
-
- jobs
- list : List all your jobs by using the fb_job_id, which need to be obtained from the Facebook Graph API.
-
-
- fb_job_id
- string : A FB id which represents the job
-
-
-
-
-Removing your school or work places
-profile_school = session.delete(TINDER_HOST + '/profile/school')
profile_jobs = session.delete(TINDER_HOST + '/profile/job')
Create, update and remove an username
-Create a username so you will show up on the Tinder webprofiles and share your profile on social media.
-create_username = session.post(TINDER_HOST + '/profile/username', data=json.dumps({"username": username}))
update_username = session.put(TINDER_HOST + '/profile/username', data=json.dumps({"username": username}))
remove_username = session.delete(TINDER_HOST + '/profile/username')
Parameter info:
-
-
-
- username
- string : Username of your choice
-
-
-
-
-In case that the username is already taken, the user already registered one, ... then an error is returned:
-{
" error " : " User has already registered a username "
}
{
" error " : " User has no username to update "
}
{
" error " : " User has no username to remove "
}
-
-share_link = session.post(TINDER_HOST + '/user/{user_id}/share')
Parameter info:
-
-
-
- user_id
- string : Tinder user ID
-
-
-
-
-
-When polling this endpoint I received a 404 HTTP ERROR but the official client still this use this.
-meta_data = session.get(TINDER_HOST + '/meta')
Reporting users
-report = session.post(TINDER_HOST + '/report/{user_id}', data=json.dumps({"cause": cause}))
Parameter info:
-
-
-
- match_id
- string : Tinder match ID
-
-
- cause
- 1 : Reason is SPAM
- 2 : Reason is inappropriate/offensive
-
-
-
-
-Upload local pictures to the Tinder image server
-Also broken, a HTTP ERROR 500 is received but the offcial client works this way:
-local_upload = session.post(' https://imageupload.gotinder.com/image?client_photo_id=ProfilePhoto ' + str(int(time.time())*1000), json={'userId': userID}, files={'file': open('test.jpeg', 'rb')})
Upload facebook pictures to the Tinder image server
-Select a Facebook photo to set it as a profile picture.
-upload_fb = session.post(TINDER_HOST + '/media', data=json.dumps({"transmit": "fb", "assets": [{"ydistance_percent": ydistance_percent,"id": fb_picture_id,"xoffset_percent": xoffset_percent,"yoffset_percent": yoffset_percent,"xdistance_percent": xdistance_percent}]}))
Parameter info:
-
-
-
- ydistance_percent
- int : ???, 0 seems to work
-
-
- xdistance_percent
- int : ???, 0 seems to work
-
-
- yoffset_percent
- int : ???, 0 seems to work
-
-
- xoffset_percent
- int : ???, 0 seems to work
-
-
- id
- string : Facebook id of the picture
-
-
-
-
-Remove picture
-remove_picture = session.delete(TINDER_HOST + '/media', data=json.dumps({"assets": [tinder_picture_id]}))
Parameter info:
-
-
-
- assets
- list : list of the pictures you want to delete with their Tinder picture id as strings.
-
-
-
-
-Response:
-{
" A list of all the pictures after the operation. "
}
-Sending messages/gifs
-Send a message to a match. Note you'll get a HTTP 500 back if you try to send a message to someone who isn't a match!
-send_message = session.post(TINDER_HOST + '/user/matches/{match_id}', data=json.dumps({"message": message}))
Parameter info:
-
-
-
- match_id
- string : Tinder match ID
-
-
- message
- string : Message to send
-
-
-
-
-Response:
-{
" _id " : " 53467235483cb56c475cc1d6 " ,
" from " : " 53430689ab3c04c13e006ffb " ,
" to " : " 533a59ea52046fc077002815 " ,
" match_id " : " 53464b0728ac73976d0a3fbf " ,
" sent_date " : " 2014-04-10T10:28:05.764Z " ,
" message " : " hi! " ,
" created_date " : " 2014-04-10T10:28:05.764Z "
}
-send_gif = session.post(TINDER_HOST + '/user/matches/{match_id}', data=json.dumps({"type": "GIF", "message": message, "gif_id": gif_id}))
Parameter info:
-
-
-
- match_id
- string : Tinder match ID
-
-
- message
- string : The GIPHY URL of the GIF
-
-
- gif_id
- string : The GIPHY ID of the GIF
-
-
-
-
-Response:
-{
" _id " : " 53467235483cb56c475cc1d6 " ,
" from " : " 53430689ab3c04c13e006ffb " ,
" to " : " 533a59ea52046fc077002815 " ,
" match_id " : " 53464b0728ac73976d0a3fbf " ,
" sent_date " : " 2014-04-10T10:28:05.764Z " ,
" message " : " hi! " ,
" created_date " : " 2014-04-10T10:28:05.764Z "
}
-Liking messages
-Liking a message is like a superlike for messages.
-like_message = session.post(TINDER_HOST + '/message/{message_id}/like')
unlike_message = session.delete(TINDER_HOST + '/message/{message_id}/like')
Parameter info:
-
-
-
- message_id
- string : Tinder ID of the message you want to like.
-
-
-
-
-Unmatch a match
-Unmatch a match by sending an HTTP DELETE
-unmatch = session.delete(TINDER_HOST + '/user/matches/{match_id}')
Parameter info:
-
-
-
- user_id
- string : Tinder match ID
-
-
-
-
-Response:
-{
" _id " : " 53467235483cb56c475cc1d6 " ,
" from " : " 53430689ab3c04c13e006ffb " ,
" to " : " 533a59ea52046fc077002815 " ,
" match_id " : " 53464b0728ac73976d0a3fbf " ,
" sent_date " : " 2014-04-10T10:28:05.764Z " ,
" message " : " hi! " ,
" created_date " : " 2014-04-10T10:28:05.764Z "
}
-Updating your location
-location = session.post(TINDER_HOST + '/user/ping', data=json.dumps({"lat": latitude, "lon": longitude))
Parameter info:
-
-
-
- lat
- int : Latitude of your location in degrees
-
-
- long
- int : Longitude of your location in degrees
-
-
-
-
-{
" status " : 200 ,
" error " : " position change not significant "
}
-If the change in location is too small, you get the above error.
-Tinder history & updates
-Get a complete list of your matches, messages, ... from your account.
-The official Tinder client does this once when it's started for the first time, after that it relies on the incremental updates which you can requests by using the 'last_activity_date' parameter.
-updates = session.post(TINDER_HOST + '/updates', data=json.dumps({"last_activity_date:" : date_in_JS_notation})
Response:
-{
" matches " : [ {
" _id " : " 53464b0728ac73976d0a3fbf " ,
" messages " : [ {
" _id " : " 534651198ce6da797248c1a3 " ,
" match_id " : " 53464b0728ac73976d0a3fbf " ,
" to " : " 53430689ab3c04c13e006ffb " ,
" from " : " 533a59ea52046fc077002815 " ,
" message " : " hi .... how is it going? " ,
" sent_date " : " 2014-04-10T08:06:49.800Z " ,
" created_date " : " 2014-04-10T08:06:49.800Z " ,
" timestamp " : 1397117209800
} , {
" _id " : " 53466fd298b7278b72156523 " ,
" match_id " : " 53464b0728ac73976d0a3fbf " ,
" to " : " 533a59ea52046fc077002815 " ,
" from " : " 53430689ab3c04c13e006ffb " ,
" message " : " Good thanks you? :) " ,
" sent_date " : " 2014-04-10T10:17:54.379Z " ,
" created_date " : " 2014-04-10T10:17:54.379Z " ,
" timestamp " : 1397125074379
} ] ,
" last_activity_date " : " 2014-04-10T10:17:54.379Z "
} ] ,
" blocks " : [ ] ,
" lists " : [ ] ,
" deleted_lists " : [ ] ,
" last_activity_date " : " 2014-04-10T10:17:54.379Z "
}
-Liking, disliking & superliking
-like = session.post(TINDER_HOST + '/like/{user_id}')
dislike = session.post(TINDER_HOST + '/pass/{user_id}')
superlike = session.post(TINDER_HOST + '/like/{user_id}/superlike')
Parameter info:
-
-
-
- user_id
- string : Tinder user ID
-
-
-
-Response for like:
-{
" match " : " true or false "
}
-Response for superlike:
-{
" match " : " true or false " ,
" superlikes " : {
" remaining " : " superlikes_remaining " ,
" resets_at " : " reset_date_time "
}
}
-If they also liked you then 'match' will be true
.
-This is not returned if you disliked an user.
-Recommendations
-Get your recommendations in this area, default limit is 10 users/request.
-like = session.post(TINDER_HOST + '/recs', data=json.dumps({"limit:" : 10})
Parameter info:
-
-
-
- limit
- int : Number of Tinder users to like/dislike/superlike in this area. Default is 10, when done you need to run this request again.
-
-
-
-{
" status " : 200 ,
" results " : [ {
" distance_mi " : 2 ,
" common_like_count " : 0 ,
" common_friend_count " : 0 ,
" common_likes " : [ ] ,
" common_friends " : [ ] ,
" _id " : " 518d666a2a00df0e490000b9 " ,
" bio " : " " ,
" birth_date " : " 1986-05-17T00:00:00.000Z " ,
" gender " : 1 ,
" name " : " Elen " ,
" ping_time " : " 2014-04-08T11:59:18.494Z " ,
" photos " : [ {
" id " : " fea4f480-7ce0-4143-a310-a03c2b2cdbc6 " ,
" main " : true ,
" crop " : " source " ,
" fileName " : " fea4f480-7ce0-4143-a310-a03c2b2cdbc6.jpg " ,
" extension " : " jpg " ,
" processedFiles " : [ {
" width " : 640 ,
" height " : 640 ,
" url " : " http://images.gotinder.com/518d666a2a00df0e490000b9/640x640_fea4f480-7ce0-4143-a310-a03c2b2cdbc6.jpg "
} , {
" width " : 320 ,
" height " : 320 ,
" url " : " http://images.gotinder.com/518d666a2a00df0e490000b9/320x320_fea4f480-7ce0-4143-a310-a03c2b2cdbc6.jpg "
} , {
" width " : 172 ,
" height " : 172 ,
" url " : " http://images.gotinder.com/518d666a2a00df0e490000b9/172x172_fea4f480-7ce0-4143-a310-a03c2b2cdbc6.jpg "
} , {
" width " : 84 ,
" height " : 84 ,
" url " : " http://images.gotinder.com/518d666a2a00df0e490000b9/84x84_fea4f480-7ce0-4143-a310-a03c2b2cdbc6.jpg "
} ] ,
" url " : " http://images.gotinder.com/518d666a2a00df0e490000b9/fea4f480-7ce0-4143-a310-a03c2b2cdbc6.jpg "
} , {
" url " : " http://images.gotinder.com/518d666a2a00df0e490000b9/5c1d3231-5a75-4a07-91ff-5c012716583f.jpg " ,
" processedFiles " : [ {
" url " : " http://images.gotinder.com/518d666a2a00df0e490000b9/640x640_pct_0_29.5312464_540_540_5c1d3231-5a75-4a07-91ff-5c012716583f.jpg " ,
" height " : 640 ,
" width " : 640
} , {
" url " : " http://images.gotinder.com/518d666a2a00df0e490000b9/320x320_pct_0_29.5312464_540_540_5c1d3231-5a75-4a07-91ff-5c012716583f.jpg " ,
" height " : 320 ,
" width " : 320
} , {
" url " : " http://images.gotinder.com/518d666a2a00df0e490000b9/172x172_pct_0_29.5312464_540_540_5c1d3231-5a75-4a07-91ff-5c012716583f.jpg " ,
" height " : 172 ,
" width " : 172
} , {
" url " : " http://images.gotinder.com/518d666a2a00df0e490000b9/84x84_pct_0_29.5312464_540_540_5c1d3231-5a75-4a07-91ff-5c012716583f.jpg " ,
" height " : 84 ,
" width " : 84
} ] ,
" extension " : " jpg " ,
" fileName " : " 5c1d3231-5a75-4a07-91ff-5c012716583f.jpg " ,
" main " : false ,
" ydistance_percent " : 0.75 ,
" yoffset_percent " : 0.04101562 ,
" xoffset_percent " : 0 ,
" id " : " 5c1d3231-5a75-4a07-91ff-5c012716583f " ,
" xdistance_percent " : 1
} , {
" url " : " http://images.gotinder.com/518d666a2a00df0e490000b9/5abd87e5-a181-4946-a8b9-880926a78943.jpg " ,
" processedFiles " : [ {
" url " : " http://images.gotinder.com/518d666a2a00df0e490000b9/640x640_pct_0_118.125_540_540_5abd87e5-a181-4946-a8b9-880926a78943.jpg " ,
" height " : 640 ,
" width " : 640
} , {
" url " : " http://images.gotinder.com/518d666a2a00df0e490000b9/320x320_pct_0_118.125_540_540_5abd87e5-a181-4946-a8b9-880926a78943.jpg " ,
" height " : 320 ,
" width " : 320
} , {
" url " : " http://images.gotinder.com/518d666a2a00df0e490000b9/172x172_pct_0_118.125_540_540_5abd87e5-a181-4946-a8b9-880926a78943.jpg " ,
" height " : 172 ,
" width " : 172
} , {
" url " : " http://images.gotinder.com/518d666a2a00df0e490000b9/84x84_pct_0_118.125_540_540_5abd87e5-a181-4946-a8b9-880926a78943.jpg " ,
" height " : 84 ,
" width " : 84
} ] ,
" extension " : " jpg " ,
" fileName " : " 5abd87e5-a181-4946-a8b9-880926a78943.jpg " ,
" main " : false ,
" ydistance_percent " : 0.75 ,
" yoffset_percent " : 0.1640625 ,
" xoffset_percent " : 0 ,
" id " : " 5abd87e5-a181-4946-a8b9-880926a78943 " ,
" xdistance_percent " : 1
} , {
" url " : " http://images.gotinder.com/518d666a2a00df0e490000b9/5e168698-a034-40c0-b7fb-7c05743f2310.jpg " ,
" processedFiles " : [ {
" url " : " http://images.gotinder.com/518d666a2a00df0e490000b9/640x640_pct_157.570344_0_405_405_5e168698-a034-40c0-b7fb-7c05743f2310.jpg " ,
" height " : 640 ,
" width " : 640
} , {
" url " : " http://images.gotinder.com/518d666a2a00df0e490000b9/320x320_pct_157.570344_0_405_405_5e168698-a034-40c0-b7fb-7c05743f2310.jpg " ,
" height " : 320 ,
" width " : 320
} , {
" url " : " http://images.gotinder.com/518d666a2a00df0e490000b9/172x172_pct_157.570344_0_405_405_5e168698-a034-40c0-b7fb-7c05743f2310.jpg " ,
" height " : 172 ,
" width " : 172
} , {
" url " : " http://images.gotinder.com/518d666a2a00df0e490000b9/84x84_pct_157.570344_0_405_405_5e168698-a034-40c0-b7fb-7c05743f2310.jpg " ,
" height " : 84 ,
" width " : 84
} ] ,
" extension " : " jpg " ,
" fileName " : " 5e168698-a034-40c0-b7fb-7c05743f2310.jpg " ,
" main " : false ,
" ydistance_percent " : 1 ,
" yoffset_percent " : 0 ,
" xoffset_percent " : 0.2188477 ,
" id " : " 5e168698-a034-40c0-b7fb-7c05743f2310 " ,
" xdistance_percent " : 0.5625
} ] ,
" birth_date_info " : " fuzzy birthdate active, not displaying real birth_date "
} , {
" distance_mi " : 4 ,
" common_like_count " : 0 ,
" common_friend_count " : 0 ,
" common_likes " : [ ] ,
" common_friends " : [ ] ,
" _id " : " 52cfc097f43cd91a67003639 " ,
" bio " : " " ,
" birth_date " : " 1987-11-02T00:00:00.000Z " ,
" gender " : 1 ,
" name " : " Cristina " ,
" ping_time " : " 2014-04-06T16:52:51.605Z " ,
" photos " : [ {
" id " : " 4ab7173f-7884-4fe3-872f-32c01d77de2a " ,
" main " : " main " ,
" shape " : " center_square " ,
" fileName " : " 4ab7173f-7884-4fe3-872f-32c01d77de2a.jpg " ,
" extension " : " jpg " ,
" processedFiles " : [ {
" width " : 640 ,
" height " : 640 ,
" url " : " http://images.gotinder.com/52cfc097f43cd91a67003639/640x640_4ab7173f-7884-4fe3-872f-32c01d77de2a.jpg "
} , {
" width " : 320 ,
" height " : 320 ,
" url " : " http://images.gotinder.com/52cfc097f43cd91a67003639/320x320_4ab7173f-7884-4fe3-872f-32c01d77de2a.jpg "
} , {
" width " : 172 ,
" height " : 172 ,
" url " : " http://images.gotinder.com/52cfc097f43cd91a67003639/172x172_4ab7173f-7884-4fe3-872f-32c01d77de2a.jpg "
} , {
" width " : 84 ,
" height " : 84 ,
" url " : " http://images.gotinder.com/52cfc097f43cd91a67003639/84x84_4ab7173f-7884-4fe3-872f-32c01d77de2a.jpg "
} ] ,
" url " : " http://images.gotinder.com/52cfc097f43cd91a67003639/4ab7173f-7884-4fe3-872f-32c01d77de2a.jpg "
} , {
" id " : " bb8ac90b-f48a-4a1c-8cba-0c05d26f1b47 " ,
" shape " : " center_square " ,
" fileName " : " bb8ac90b-f48a-4a1c-8cba-0c05d26f1b47.jpg " ,
" extension " : " jpg " ,
" processedFiles " : [ {
" width " : 640 ,
" height " : 640 ,
" url " : " http://images.gotinder.com/52cfc097f43cd91a67003639/640x640_bb8ac90b-f48a-4a1c-8cba-0c05d26f1b47.jpg "
} , {
" width " : 320 ,
" height " : 320 ,
" url " : " http://images.gotinder.com/52cfc097f43cd91a67003639/320x320_bb8ac90b-f48a-4a1c-8cba-0c05d26f1b47.jpg "
} , {
" width " : 172 ,
" height " : 172 ,
" url " : " http://images.gotinder.com/52cfc097f43cd91a67003639/172x172_bb8ac90b-f48a-4a1c-8cba-0c05d26f1b47.jpg "
} , {
" width " : 84 ,
" height " : 84 ,
" url " : " http://images.gotinder.com/52cfc097f43cd91a67003639/84x84_bb8ac90b-f48a-4a1c-8cba-0c05d26f1b47.jpg "
} ] ,
" url " : " http://images.gotinder.com/52cfc097f43cd91a67003639/bb8ac90b-f48a-4a1c-8cba-0c05d26f1b47.jpg "
} , {
" id " : " dabe1c27-f186-48f2-807f-8a68e3831fe9 " ,
" shape " : " center_square " ,
" fileName " : " dabe1c27-f186-48f2-807f-8a68e3831fe9.jpg " ,
" extension " : " jpg " ,
" processedFiles " : [ {
" width " : 640 ,
" height " : 640 ,
" url " : " http://images.gotinder.com/52cfc097f43cd91a67003639/640x640_dabe1c27-f186-48f2-807f-8a68e3831fe9.jpg "
} , {
" width " : 320 ,
" height " : 320 ,
" url " : " http://images.gotinder.com/52cfc097f43cd91a67003639/320x320_dabe1c27-f186-48f2-807f-8a68e3831fe9.jpg "
} , {
" width " : 172 ,
" height " : 172 ,
" url " : " http://images.gotinder.com/52cfc097f43cd91a67003639/172x172_dabe1c27-f186-48f2-807f-8a68e3831fe9.jpg "
} , {
" width " : 84 ,
" height " : 84 ,
" url " : " http://images.gotinder.com/52cfc097f43cd91a67003639/84x84_dabe1c27-f186-48f2-807f-8a68e3831fe9.jpg "
} ] ,
" url " : " http://images.gotinder.com/52cfc097f43cd91a67003639/dabe1c27-f186-48f2-807f-8a68e3831fe9.jpg "
} , {
" url " : " http://images.gotinder.com/52cfc097f43cd91a67003639/59263e9d-6d76-4f42-8c8e-b4cf635b03c7.jpg " ,
" processedFiles " : [ {
" url " : " http://images.gotinder.com/52cfc097f43cd91a67003639/640x640_59263e9d-6d76-4f42-8c8e-b4cf635b03c7.jpg " ,
" height " : 640 ,
" width " : 640
} , {
" url " : " http://images.gotinder.com/52cfc097f43cd91a67003639/320x320_59263e9d-6d76-4f42-8c8e-b4cf635b03c7.jpg " ,
" height " : 320 ,
" width " : 320
} , {
" url " : " http://images.gotinder.com/52cfc097f43cd91a67003639/172x172_59263e9d-6d76-4f42-8c8e-b4cf635b03c7.jpg " ,
" height " : 172 ,
" width " : 172
} , {
" url " : " http://images.gotinder.com/52cfc097f43cd91a67003639/84x84_59263e9d-6d76-4f42-8c8e-b4cf635b03c7.jpg " ,
" height " : 84 ,
" width " : 84
} ] ,
" extension " : " jpg " ,
" fileName " : " 59263e9d-6d76-4f42-8c8e-b4cf635b03c7.jpg " ,
" main " : false ,
" ydistance_percent " : 0.75 ,
" yoffset_percent " : 0.08554687 ,
" xoffset_percent " : 0 ,
" id " : " 59263e9d-6d76-4f42-8c8e-b4cf635b03c7 " ,
" xdistance_percent " : 1
} ] ,
" birth_date_info " : " fuzzy birthdate active, not displaying real birth_date "
} , " JSON DATA OF NEXT USER " ]
}
-Delete account
-Delete your account, this can not be undone!
-delete_account = session.delete(TINDER_HOST + '/profile')
-
diff --git a/docs/harbour-sailfinder/icons/hicolor/108x108/apps/harbour-sailfinder.png b/docs/harbour-sailfinder/icons/hicolor/108x108/apps/harbour-sailfinder.png
deleted file mode 100644
index eafb0ab..0000000
Binary files a/docs/harbour-sailfinder/icons/hicolor/108x108/apps/harbour-sailfinder.png and /dev/null differ
diff --git a/docs/harbour-sailfinder/icons/hicolor/128x128/apps/harbour-sailfinder.png b/docs/harbour-sailfinder/icons/hicolor/128x128/apps/harbour-sailfinder.png
deleted file mode 100644
index e8ade97..0000000
Binary files a/docs/harbour-sailfinder/icons/hicolor/128x128/apps/harbour-sailfinder.png and /dev/null differ
diff --git a/docs/harbour-sailfinder/icons/hicolor/256x256/apps/harbour-sailfinder.png b/docs/harbour-sailfinder/icons/hicolor/256x256/apps/harbour-sailfinder.png
deleted file mode 100644
index 2206d36..0000000
Binary files a/docs/harbour-sailfinder/icons/hicolor/256x256/apps/harbour-sailfinder.png and /dev/null differ
diff --git a/docs/harbour-sailfinder/icons/hicolor/86x86/apps/harbour-sailfinder.png b/docs/harbour-sailfinder/icons/hicolor/86x86/apps/harbour-sailfinder.png
deleted file mode 100644
index 4bb96ea..0000000
Binary files a/docs/harbour-sailfinder/icons/hicolor/86x86/apps/harbour-sailfinder.png and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/cover/CoverPage.qml b/docs/harbour-sailfinder/qml/cover/CoverPage.qml
deleted file mode 100644
index 5066828..0000000
--- a/docs/harbour-sailfinder/qml/cover/CoverPage.qml
+++ /dev/null
@@ -1,89 +0,0 @@
-import QtQuick 2.0
-import Sailfish.Silica 1.0
-
-CoverBackground {
- Item {
- width: parent.width
- height: icon.height + label.height
- visible: cover_data.image_enabled
- anchors.centerIn: parent
-
- Label {
- id: label
- anchors.bottom: icon.top
- anchors.bottomMargin: Theme.paddingMedium
- anchors.horizontalCenter: parent.horizontalCenter
- wrapMode: Text.WordWrap
- visible: cover_data.text_enabled
- text: cover_data.text
- }
-
- Image {
- id: icon
- width: parent.width - Theme.horizontalPageMargin
- height: width
- anchors.centerIn: parent
- asynchronous: true
- smooth: true
- visible: cover_data.image_enabled
- source: !app.network_error? cover_data.image: '../images/noImage.png'
- onStatusChanged:
- {
- if (status == Image.Loading)
- {
- progressIndicator.running = true
- }
- else if (status == Image.Error)
- {
- progressIndicator.running = false
- }
- else
- {
- progressIndicator.running = false
- }
- }
-
- BusyIndicator {
- id: progressIndicator
- anchors.centerIn: parent
- size: BusyIndicatorSize.Medium
- running: true
- }
- }
- }
-
- CoverPlaceholder {
- id: placeholder
- visible: !cover_data.image_enabled && cover_data.text_enabled
- text: cover_data.text
- }
-
- CoverActionList {
- id: actions
- enabled: cover_data.actions_enabled
-
- CoverAction {
- iconSource: "../images/dislike_small.png"
- onTriggered:
- {
- if(!app.network_error) // Disable buttons when network error
- {
- cover_action('dislike')
- }
- }
- }
-
- CoverAction {
- iconSource: "../images/like_small.png"
- onTriggered:
- {
- if(!app.network_error)
- {
- cover_action('like')
- }
- }
- }
- }
-}
-
-
diff --git a/docs/harbour-sailfinder/qml/harbour-sailfinder.qml b/docs/harbour-sailfinder/qml/harbour-sailfinder.qml
deleted file mode 100644
index 74bff4b..0000000
--- a/docs/harbour-sailfinder/qml/harbour-sailfinder.qml
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- Copyright (C) 2013 Jolla Ltd.
- Contact: Thomas Perl
- All rights reserved.
-
- You may use this file under the terms of BSD license as follows:
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
- * Neither the name of the Jolla Ltd nor the
- names of its contributors may be used to endorse or promote products
- derived from this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-import QtQuick 2.0
-import Sailfish.Silica 1.0
-import "pages"
-import io.thp.pyotherside 1.3
-
-ApplicationWindow
-{
- id: app
- initialPage: Component { FirstPage { } }
- cover: Qt.resolvedUrl("cover/CoverPage.qml")
- allowedOrientations: Orientation.All
- _defaultPageOrientations: Orientation.All
-
- property string version: 'V2.4'
- property string name: 'Sailfinder'
- property string personIDParent: ''
- property int widthScreenLimit: 800
- property bool search_preferences_updated: false
- property bool network_error: false
-
- Item {
- id: cover_data
- property string text
- property string image: '../images/harbour-sailfinder.png'
- property bool text_enabled
- property bool image_enabled
- property bool actions_enabled
- }
-
- function cover_action(action)
- {
- switch(action)
- {
- case 'like':
- python.call('api.like',[personIDParent], function(personID) {});
- break;
-
- case 'dislike':
- python.call('api.dislike',[personIDParent], function(personID) {});
- break;
- }
- }
-
- Python {
- id: python
- Component.onCompleted:
- {
- // Add the Python path to PyOtherSide and import our modules 'api' & 'network'.
- addImportPath(Qt.resolvedUrl('../qml/pages/'));
- importModule('api', function() {});
-
- setHandler('network_status', function(status_code)
- {
- console.log("[ERROR] Network connection ERROR: " + status_code)
- network_error = true;
- });
-
- setHandler('network', function(connection_status, connection_type, connection_name, signal_strength)
- {
- if(connection_status[0] == "connected")
- {
- network_error = false;
- }
- });
- }
- }
-}
-
-
diff --git a/docs/harbour-sailfinder/qml/images/0.png b/docs/harbour-sailfinder/qml/images/0.png
deleted file mode 100644
index 53cd519..0000000
Binary files a/docs/harbour-sailfinder/qml/images/0.png and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/images/1.png b/docs/harbour-sailfinder/qml/images/1.png
deleted file mode 100644
index 9b86813..0000000
Binary files a/docs/harbour-sailfinder/qml/images/1.png and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/images/bio_large.png b/docs/harbour-sailfinder/qml/images/bio_large.png
deleted file mode 100644
index 83c5119..0000000
Binary files a/docs/harbour-sailfinder/qml/images/bio_large.png and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/images/bio_small.png b/docs/harbour-sailfinder/qml/images/bio_small.png
deleted file mode 100644
index 7dd3130..0000000
Binary files a/docs/harbour-sailfinder/qml/images/bio_small.png and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/images/dislike_large.png b/docs/harbour-sailfinder/qml/images/dislike_large.png
deleted file mode 100644
index 3e8fd41..0000000
Binary files a/docs/harbour-sailfinder/qml/images/dislike_large.png and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/images/dislike_small.png b/docs/harbour-sailfinder/qml/images/dislike_small.png
deleted file mode 100644
index c7ddd6a..0000000
Binary files a/docs/harbour-sailfinder/qml/images/dislike_small.png and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/images/edit_small.png b/docs/harbour-sailfinder/qml/images/edit_small.png
deleted file mode 100644
index d9f17fe..0000000
Binary files a/docs/harbour-sailfinder/qml/images/edit_small.png and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/images/harbour-sailfinder.png b/docs/harbour-sailfinder/qml/images/harbour-sailfinder.png
deleted file mode 100644
index 2206d36..0000000
Binary files a/docs/harbour-sailfinder/qml/images/harbour-sailfinder.png and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/images/imageSources.txt b/docs/harbour-sailfinder/qml/images/imageSources.txt
deleted file mode 100644
index a863946..0000000
--- a/docs/harbour-sailfinder/qml/images/imageSources.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-https://github.com/paomedia/small-n-flat
-https://www.iconfinder.com/iconsets/small-n-flat
\ No newline at end of file
diff --git a/docs/harbour-sailfinder/qml/images/instagram_large.png b/docs/harbour-sailfinder/qml/images/instagram_large.png
deleted file mode 100644
index c70be43..0000000
Binary files a/docs/harbour-sailfinder/qml/images/instagram_large.png and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/images/instagram_small.png b/docs/harbour-sailfinder/qml/images/instagram_small.png
deleted file mode 100644
index 7f2f009..0000000
Binary files a/docs/harbour-sailfinder/qml/images/instagram_small.png and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/images/job_large.png b/docs/harbour-sailfinder/qml/images/job_large.png
deleted file mode 100644
index 37a829a..0000000
Binary files a/docs/harbour-sailfinder/qml/images/job_large.png and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/images/job_small.png b/docs/harbour-sailfinder/qml/images/job_small.png
deleted file mode 100644
index 83f821a..0000000
Binary files a/docs/harbour-sailfinder/qml/images/job_small.png and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/images/lastOnline.png b/docs/harbour-sailfinder/qml/images/lastOnline.png
deleted file mode 100644
index bdca8e5..0000000
Binary files a/docs/harbour-sailfinder/qml/images/lastOnline.png and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/images/like_large.png b/docs/harbour-sailfinder/qml/images/like_large.png
deleted file mode 100644
index f6a2b6d..0000000
Binary files a/docs/harbour-sailfinder/qml/images/like_large.png and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/images/like_small.png b/docs/harbour-sailfinder/qml/images/like_small.png
deleted file mode 100644
index d1da158..0000000
Binary files a/docs/harbour-sailfinder/qml/images/like_small.png and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/images/matches_large.png b/docs/harbour-sailfinder/qml/images/matches_large.png
deleted file mode 100644
index 667d969..0000000
Binary files a/docs/harbour-sailfinder/qml/images/matches_large.png and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/images/matches_small.png b/docs/harbour-sailfinder/qml/images/matches_small.png
deleted file mode 100644
index 667d969..0000000
Binary files a/docs/harbour-sailfinder/qml/images/matches_small.png and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/images/message_dislike.png b/docs/harbour-sailfinder/qml/images/message_dislike.png
deleted file mode 100644
index 9575b2f..0000000
Binary files a/docs/harbour-sailfinder/qml/images/message_dislike.png and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/images/message_like.png b/docs/harbour-sailfinder/qml/images/message_like.png
deleted file mode 100644
index 6d603f4..0000000
Binary files a/docs/harbour-sailfinder/qml/images/message_like.png and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/images/noImage.png b/docs/harbour-sailfinder/qml/images/noImage.png
deleted file mode 100644
index 218f46f..0000000
Binary files a/docs/harbour-sailfinder/qml/images/noImage.png and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/images/no_gif.gif b/docs/harbour-sailfinder/qml/images/no_gif.gif
deleted file mode 100644
index 3be2119..0000000
Binary files a/docs/harbour-sailfinder/qml/images/no_gif.gif and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/images/sailfinder-notification.png b/docs/harbour-sailfinder/qml/images/sailfinder-notification.png
deleted file mode 100644
index 016b6b2..0000000
Binary files a/docs/harbour-sailfinder/qml/images/sailfinder-notification.png and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/images/school_large.png b/docs/harbour-sailfinder/qml/images/school_large.png
deleted file mode 100644
index 013e19c..0000000
Binary files a/docs/harbour-sailfinder/qml/images/school_large.png and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/images/school_small.png b/docs/harbour-sailfinder/qml/images/school_small.png
deleted file mode 100644
index e414179..0000000
Binary files a/docs/harbour-sailfinder/qml/images/school_small.png and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/images/settings.png b/docs/harbour-sailfinder/qml/images/settings.png
deleted file mode 100644
index 2de8bbe..0000000
Binary files a/docs/harbour-sailfinder/qml/images/settings.png and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/images/superLike_large.png b/docs/harbour-sailfinder/qml/images/superLike_large.png
deleted file mode 100644
index 4bf00d8..0000000
Binary files a/docs/harbour-sailfinder/qml/images/superLike_large.png and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/images/superLike_small.png b/docs/harbour-sailfinder/qml/images/superLike_small.png
deleted file mode 100644
index 435478d..0000000
Binary files a/docs/harbour-sailfinder/qml/images/superLike_small.png and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/AboutPage.qml b/docs/harbour-sailfinder/qml/pages/AboutPage.qml
deleted file mode 100644
index 666c698..0000000
--- a/docs/harbour-sailfinder/qml/pages/AboutPage.qml
+++ /dev/null
@@ -1,144 +0,0 @@
-import QtQuick 2.2
-import Sailfish.Silica 1.0
-import io.thp.pyotherside 1.3
-
-Page {
- id: page
-
- property var photo_url
-
- // Sailfinder API
- property var personID
- property var gender
- property var name
- property var distance_mi
- property var distance_km
- property var bio
- property var photos
- property var age
-
- Component.onCompleted:
- {
- load_user()
- }
-
- function load_user()
- {
- if(gender)
- {
- //header.title = name + ' (' + age + ') ♀ - ' + distance_km + ' km' // Need API user
- header.title = name + ' (' + age + ') ♀'
- }
- else
- {
- //header.title = name + ' (' + age + ') ♂ - ' + distance_km + ' km' // Need API user
- header.title = name + ' (' + age + ') ♂'
- }
- }
-
- NetworkStatus {}
-
- SilicaFlickable {
- anchors.fill: parent
- contentHeight: column.height
-
- Column {
- id: column
- width: page.width
- spacing: Theme.paddingLarge
-
- PageHeader {
- id: header
- title: qsTr("N/A")
- }
-
- Item {
- width: parent.width
- height: (width*2)/3
-
- SilicaGridView {
- id: gallery
- width: parent.width
- height: (width*2)/3
- cellWidth: parent.width/3
- cellHeight: cellWidth
- anchors.fill: parent
- model: photos
- opacity: 1.0
- delegate: Item {
- width: gallery.cellWidth
- height: gallery.cellHeight
-
- Image {
- id: image
- width: gallery.cellWidth/1.05
- height: gallery.cellHeight/1.05
- anchors.centerIn: parent
- source: model.url
- fillMode: Image.PreserveAspectCrop
- asynchronous: true
- smooth: true
- antialiasing: true
- onStatusChanged:
- {
- if (status == Image.Loading)
- {
- progressIndicator.running = true
- }
- else
- {
- progressIndicator.running = false
- }
- }
-
- BusyIndicator {
- id: progressIndicator
- anchors.centerIn: parent
- size: BusyIndicatorSize.Small
- running: true
- }
- }
- }
- }
- }
-
- Label {
- id: bioPerson
- anchors {
- left: parent.left
- right: parent.right
- leftMargin: Theme.horizontalPageMargin
- rightMargin: Theme.horizontalPageMargin
- }
- font.pixelSize: Theme.fontSizeSmall
- wrapMode: Text.WordWrap
- text: bio
- }
- }
- }
-
- Python {
- id: python
- Component.onCompleted:
- {
- setHandler('user', function(user_data)
- {
- //load_user(user_data)
- });
- }
-
- onError:
- {
- console.log('Python ERROR: ' + traceback);
- Clipboard.text = traceback
- pageStack.completeAnimation();
- pageStack.replace(Qt.resolvedUrl('ErrorPage.qml'));
- }
-
- //DEBUG
- /*onReceived:
- {
- console.log('Python MESSAGE: ' + data);
- }*/
- }
-}
diff --git a/docs/harbour-sailfinder/qml/pages/ErrorPage.qml b/docs/harbour-sailfinder/qml/pages/ErrorPage.qml
deleted file mode 100644
index 47fc827..0000000
--- a/docs/harbour-sailfinder/qml/pages/ErrorPage.qml
+++ /dev/null
@@ -1,74 +0,0 @@
-import QtQuick 2.2
-import Sailfish.Silica 1.0
-import io.thp.pyotherside 1.3
-
-Page {
- id: page
-
- SilicaFlickable {
- anchors.fill: parent
- contentHeight: column.height
-
- Column {
- id: column
- width: page.width
- spacing: Theme.paddingLarge
-
- PageHeader {
- title: qsTr("ERROR!")
- }
-
- SectionHeader { text: qsTr("Report this error") }
-
- Label {
- anchors {
- left: column.left
- right: column.right
- leftMargin: Theme.horizontalPageMargin
- rightMargin: Theme.horizontalPageMargin
- }
- wrapMode: Text.WordWrap
- text: qsTr("The error has been copied to your clipboard, please report it on Github or on Openrepos.net (Github is preferred).")
- }
-
- Label {
- id: errorText
- anchors
- {
- left: column.left
- right: column.right
- leftMargin: Theme.horizontalPageMargin
- rightMargin: Theme.horizontalPageMargin
- }
- font.pixelSize: Theme.fontSizeSmall
- wrapMode: Text.WordWrap
- text: Clipboard.text
- }
-
- Button {
- anchors.horizontalCenter: parent.horizontalCenter
- text: qsTr("Sailfinder bug tracker")
- onClicked:
- {
- Qt.openUrlExternally("https://github.com/modulebaan/Sailfinder/issues")
- }
- }
-
- Button {
- anchors.horizontalCenter: parent.horizontalCenter
- text: qsTr("Sailfinder on Openrepos.net")
- onClicked:
- {
- Qt.openUrlExternally("https://openrepos.net/content/minitreintje/sailfinder")
- }
- }
-
- // Spacer
- Rectangle {
- width: parent.width
- height: 30
- color: "transparent"
- }
- }
- }
-}
diff --git a/docs/harbour-sailfinder/qml/pages/FirstPage.qml b/docs/harbour-sailfinder/qml/pages/FirstPage.qml
deleted file mode 100644
index 107f231..0000000
--- a/docs/harbour-sailfinder/qml/pages/FirstPage.qml
+++ /dev/null
@@ -1,355 +0,0 @@
-//import QtQuick 2.2
-//import QtWebKit 3.0
-//import Sailfish.Silica 1.0
-//import io.thp.pyotherside 1.3
-//import QtPositioning 5.2
-
-//Page {
-
-// property string fb_token: ''
-// property string fb_id: ''
-
-// PageHeader {
-// id: header
-// anchors.top: parent.top
-// title: qsTr("Logging in...")
-// visible: !webView.visible && !app.network_error
-// }
-
-// NetworkStatus {}
-
-// Button {
-// id: retry
-// anchors.top: message.bottom
-// anchors.topMargin: Theme.paddingLarge
-// anchors.horizontalCenter: parent.horizontalCenter
-// visible: false
-// text: qsTr("Retry")
-// onClicked: python.call('api.loginTinder',[fb_id, fb_token], function(fb_token) {})
-// }
-
-// /*Item {
-// id: facebook_login
-// anchors.fill: parent
-// visible: false
-// onVisibleChanged:
-// {
-// if(visible)
-// {
-// header.title = app.name + ' ' + app.version
-// }
-// }
-
-// Image {
-// id: icon
-// width: Theme.iconSizeExtraLarge
-// height: width
-// anchors.centerIn: parent
-// source: '../images/harbour-sailfinder.png'
-// asynchronous: true
-// smooth: true
-// antialiasing: true
-// opacity: app.network_error? 0.2: 1.0
-// onStatusChanged:
-// {
-// if (status == Image.Loading)
-// {
-// progressIndicator.running = true
-// }
-// else if (status == Image.Error)
-// {
-// source = '../images/noImage.png'
-// progressIndicator.running = false
-// }
-// else
-// {
-// progressIndicator.running = false
-// }
-// }
-
-// BusyIndicator {
-// id: progressIndicator
-// anchors.centerIn: parent
-// size: BusyIndicatorSize.Medium
-// running: true
-// }
-// }
-
-// Button {
-// id: login_button
-// anchors.top: icon.bottom
-// anchors.topMargin: Theme.paddingLarge
-// anchors.horizontalCenter: parent.horizontalCenter
-// text: qsTr("Login with Facebook")
-// opacity: app.network_error? 0.2: 1.0
-// onClicked: {
-// webView.visible = true;
-// message.enabled = false;
-// header.visible = false;
-// }
-// }
-// }*/
-
-// /*SilicaWebView {
-// id: webView
-// width: parent.width
-// height: parent.height
-// anchors
-// {
-// top: parent.top
-// left: parent.left
-// right: parent.right
-// bottom: parent.bottom
-// }
-// focus: true
-// visible : false
-// url: "https://www.facebook.com/dialog/oauth?client_id=464891386855067&redirect_uri=fbconnect://success&scope=basic_info%2Cemail%2Cpublic_profile%2Cuser_about_me%2Cuser_activities%2Cuser_birthday%2Cuser_education_history%2Cuser_friends%2Cuser_interests%2Cuser_likes%2Cuser_location%2Cuser_photos%2Cuser_relationship_details&response_type=token&__mref=message"
-// onNavigationRequested:
-// {
-// if(visible)
-// {
-// // When the URL has been changed, send it to Python to check if it contains an ACCESS TOKEN.
-// console.log('Request URL from FACEBOOK: ' + request.url)
-// python.call('api.loginFacebook',[request.url.toString()], function(url) {});
-// }
-// }
-// }*/
-
-// SilicaFlickable {
-
-// Column { /*Replaces the old webview*/
-// id: webView
-// anchors.fill: parent
-
-// Label {
-// text: qsTr("Facebook credentials")
-// anchors.horizontalCenter: parent.horizontalCenter
-// font.pixelSize: Theme.fontSizeLarge
-// }
-
-// TextField {
-// id: usernameFB2
-// focus: true
-// placeholderText: qsTr("Facebook email")
-// EnterKey.onClicked: passwordFB.focus = true
-// }
-
-// TextField {
-// id: emailFB
-// placeholderText: qsTr("Facebook e-mail")
-// }
-
-// PasswordField {
-// id: passwordFB
-// placeholderText: qsTr("Facebook password")
-// }
-
-// Button {
-// id: loginbutton
-// text: qsTr("Login")
-// onClicked: python.call('api.get_access_token',[emailFB.text, passwordFB.text], function(email, pass) {});
-// }
-// }
-// }
-
-
-// ViewPlaceholder {
-// id: message
-// anchors.centerIn: parent
-// enabled: !webView.visible
-// text: qsTr('Logging into Tinder')
-// hintText: qsTr("Validating credentials...")
-// }
-
-// Python {
-// id: python
-// Component.onCompleted:
-// {
-// addImportPath(Qt.resolvedUrl('../pages/'));
-// importModule('api', function() {});
-
-// addImportPath(Qt.resolvedUrl('../pages/lib/'));
-// importModule('network', function() {});
-
-// console.log('[INFO] App: ' + app.name + ' ' + app.version)
-// cover_data.text = qsTr("Logging in...")
-// cover_data.text_enabled = true
-// cover_data.image_enabled = false
-
-// python.call('network.connection',[], function() {});
-
-// // When Python is ready prepare our configuration files.
-// python.call('api.init_files',[], function() {});
-
-// // Check if we have already authenticated with Tinder then we can reuse the Tinder token.
-// python.call('api.read_tinder_token',[], function() {});
-
-// // When Python has succesfully extracted the login data we can login into Tinder.
-// setHandler('loginFacebook', function(id, token)
-// {
-// if(token)
-// {
-// fb_token = token;
-// fb_id = id;
-// //console.log("Facebook ID: " + JSON.stringify(fb_id))
-// console.log('[LOGIN] Facebook login OK, Facebook UserID: ' + id + ' & Facebook Graph token: ' + token)
-// webView.visible = false;
-// facebook_login.visible = false;
-// message.text = qsTr('Logging into Tinder')
-// message.hintText = qsTr("Validating credentials...")
-// message.enabled = true;
-// header.visible = true;
-// python.call('api.loginTinder',[fb_id, fb_token], function(fb_id, fb_token) {});
-// // call python login tinder
-// }
-// else
-// {
-// // When Python couldn't receive the USER-ID from the Facebook Graph API then we should try to login in again.
-// console.log('[LOGIN] Facebook login FAILED')
-// }
-// });
-
-// setHandler('loginTinder', function(token)
-// {
-// if(token)
-// {
-// console.log('[LOGIN] Tinder login OK, X-Auth-token: ' + token)
-// pageStack.completeAnimation()
-// pageStack.replace(Qt.resolvedUrl('MainPage.qml'));
-// }
-// else
-// {
-// // When Python couldn't login into Tinder, show the user a message and a button to try again.
-// console.log('[LOGIN] Tinder login FAILED')
-// message.text = qsTr('Failed to login :-(')
-// message.hintText = qsTr("Tinder login token expired!")
-// webView.visible = true
-// }
-// });
-// }
-
-// onError:
-// {
-// console.log('Python ERROR: ' + traceback);
-// Clipboard.text = traceback
-// pageStack.completeAnimation();
-// pageStack.replace(Qt.resolvedUrl('ErrorPage.qml'));
-// }
-
-// //DEBUG
-// onReceived:
-// {
-// console.log('Python MESSAGE: ' + JSON.stringify(data));
-// }
-// }
-//}
-
-import QtQuick 2.0
-import Sailfish.Silica 1.0
-import io.thp.pyotherside 1.3
-
-Page {
-
- SilicaFlickable {
- anchors.fill: parent
- contentHeight: column.height + Theme.paddingLarge
-
- VerticalScrollDecorator {}
-
- Column {
- id: column
- anchors { left: parent.left; right: parent.right }
- spacing: Theme.paddingLarge
-
- PageHeader {
- title: qsTr("Login")
- }
-
- TextField {
- id: email
- anchors { left: parent.left; right: parent.right }
- focus: true; label: "Email address"; placeholderText: label
- EnterKey.enabled: text || inputMethodComposing
- EnterKey.iconSource: "image://theme/icon-m-enter-next"
- EnterKey.onClicked: password.focus = true
- }
-
- PasswordField {
- id: password
- anchors { left: parent.left; right: parent.right }
- echoMode: TextInput.Password
- label: "Password"; placeholderText: label
- EnterKey.enabled: text || inputMethodComposing
- EnterKey.iconSource: "image://theme/icon-m-enter-close"
- EnterKey.onClicked: focus = false
- }
-
- Label {
- id: message
- text: "Enter your credentials for your Facebook account you use for Tinder."
- width: parent.width
- wrapMode: Text.WordWrap
- x: Theme.horizontalPageMargin
- }
-
- Button {
- text: "LOGIN"
- anchors.horizontalCenter: parent.horizontalCenter
- onClicked: python.call('api.get_access_token',[email.text, password.text], function(email, pass) {});
- }
- }
- }
-
- Python {
- id: python
- Component.onCompleted:
- {
- addImportPath(Qt.resolvedUrl('.'));
- importModule('api', function() {});
-
- console.log('[INFO] App: ' + app.name + ' ' + app.version)
- cover_data.text = qsTr("Logging in...")
- cover_data.text_enabled = true
- cover_data.image_enabled = false
-
- // When Python is ready prepare our configuration files.
- python.call('api.init_files',[], function() {});
-
- // Check if we have already authenticated with Tinder then we can reuse the Tinder token.
- python.call('api.read_tinder_token',[], function() {});
-
- setHandler('login', function(token_tinder, token_fb)
- {
- console.log('[LOGIN] Tinder login, X-Auth-token: ' + token_tinder)
- console.log('[LOGIN] Facebook login, token: ' + token_fb)
- if(token_tinder && token_fb)
- {
- console.log('[LOGIN] Valid tokens :-)')
- pageStack.completeAnimation()
- pageStack.replace(Qt.resolvedUrl('MainPage.qml'));
- }
- else
- {
- // When Python couldn't login into Tinder, show the user a message and a button to try again.
- console.log('[LOGIN] Login FAILED!')
- message.text = qsTr("Login failed :-(, check your e-mail & password.")
- }
- });
- }
-
- onError:
- {
- console.log('Python ERROR: ' + traceback);
- Clipboard.text = traceback
- pageStack.completeAnimation();
- pageStack.replace(Qt.resolvedUrl('ErrorPage.qml'));
- }
-
- //DEBUG
- onReceived:
- {
- console.log('Python MESSAGE: ' + JSON.stringify(data));
- }
- }
-}
-
diff --git a/docs/harbour-sailfinder/qml/pages/GalleryPage.qml b/docs/harbour-sailfinder/qml/pages/GalleryPage.qml
deleted file mode 100644
index ac7a492..0000000
--- a/docs/harbour-sailfinder/qml/pages/GalleryPage.qml
+++ /dev/null
@@ -1,315 +0,0 @@
-import QtQuick 2.2
-import Sailfish.Silica 1.0
-import io.thp.pyotherside 1.3
-
-Dialog {
- id: page
- canAccept: selected
-
- property var type
- property var name
- property var id
- property var url
- property var name_album
- property var photo_id_selected
- property bool selected: false
-
- function load_fb_albums(albums)
- {
- header.title = qsTr("Facebook albums")
- galleryAlbums.clear()
- galleryPhotos.clear()
- try {
- try {
- console.log("[ERROR] Facebook access token expired! " + albums['error']['message'])
- message.text = qsTr("Facebook login expired :-(")
- message.hintText = qsTr("Relogin into Facebook")
- message.enabled = true
- relogin.visible = true
- }
- catch(err)
- {
- for (var i = 0; i < Object.keys(albums['data']).length; i++)
- {
- name = albums['data'][i]['name']
- id = albums['data'][i]['id']
- galleryAlbums.append({album: name, id: id})
- }
- message.enabled = false
- relogin.visible = false
- }
- }
- catch(err)
- {
- console.log("[ERROR] Facebook albums download failed: " + err)
- message.text = qsTr("Can't download albums :-(")
- message.hintText = qsTr("Check your Facebook permissions")
- message.enabled = true
- }
- }
-
- function load_fb_photos(photo)
- {
- header.title = ""
- try {
- id = photo['id']
- url = photo['source']
- galleryPhotos.append({id: id, url: url})
- }
- catch(err)
- {
- console.log("[ERROR] Facebook pictures download failed: " + err)
- }
- }
-
- NetworkStatus {}
-
- SilicaFlickable {
- anchors.fill: parent
- contentHeight: pageColumn.height
-
- Column {
- id: pageColumn
- width: parent.width
- spacing: Theme.paddingLarge
-
- DialogHeader {
- id: header
- title: qsTr("Gallery")
- acceptText: qsTr("Upload")
- }
-
- SilicaListView {
- id: album_list
- width: parent.width
- height: galleryAlbums.count*Theme.iconSizeExtraLarge*1.2
- anchors.left: parent.left
- anchors.right: parent.right
- model: galleryAlbums
- quickScroll: true
- clip: true
- visible: !photos_grid.visible
- delegate: ListItem {
- contentHeight: Theme.iconSizeExtraLarge*1.2
-
- Image {
- id: image
- width: Theme.iconSizeExtraLarge
- height: Theme.iconSizeExtraLarge
- anchors.left: parent.left
- anchors.leftMargin: Theme.horizontalPageMargin
- anchors.verticalCenter: parent.verticalCenter
- source: '../images/noImage.png'
- asynchronous: true
- smooth: true
- antialiasing: true
- onStatusChanged:
- {
- if (status == Image.Loading)
- {
- progressIndicator1.running = true
- }
- else
- {
- progressIndicator1.running = false
- }
-
- if (status == Image.Error)
- {
- source = '../images/noImage.png'
- progressIndicator1.running = false
- }
- }
-
- BusyIndicator {
- id: progressIndicator1
- anchors.centerIn: parent
- size: BusyIndicatorSize.Medium
- running: true
- }
- }
-
- Label {
- id: name
- anchors.left: image.right;
- anchors.leftMargin: Theme.horizontalPageMargin;
- anchors.verticalCenter: parent.verticalCenter
- wrapMode: Text.WordWrap
- maximumLineCount: 1
- font.pixelSize: Theme.fontSizeExtraLarge
- text: model.album
- }
-
- onClicked:
- {
- python.call('api.get_fb_pictures',[model.id], function(fb_album_id) {});
- photos_grid.visible = true
- name_album = model.album
- galleryPhotos.append({id: 'back', url: "image://theme/icon-m-back"})
- }
- }
- VerticalScrollDecorator {}
- }
-
-
- SilicaGridView {
- id: photos_grid
- width: parent.width
- height: Screen.height
- cellWidth: parent.width/3
- cellHeight: cellWidth
- model: galleryPhotos
- visible: false
- delegate: BackgroundItem {
- width: photos_grid.cellWidth
- height: photos_grid.cellHeight
- onClicked:
- {
- if(model.id.length > 10)
- {
- if(photo_id_selected == model.id || !selected)
- {
- selectedPhoto.visible = !selectedPhoto.visible;
- if(selectedPhoto.visible)
- {
- photo_id_selected = model.id;
- selected = true;
- }
- else
- {
- photo_id_selected = '';
- selected = false;
- }
- }
- }
- else
- {
- photos_grid.visible = false
- galleryPhotos.clear()
- }
- }
-
- Rectangle {
- id: selectedPhoto
- anchors.fill: parent
- color: Theme.secondaryHighlightColor
- opacity: 0.7
- visible: false
- }
-
- Image {
- width: photos_grid.cellWidth/1.1
- height: width
- anchors.centerIn: parent
- source: model.url
- asynchronous: true
- onStatusChanged:
- {
- if (status == Image.Loading)
- {
- progressIndicator2.running = true
- }
- else if (status == Image.Error)
- {
- source = '../images/noImage.png'
- progressIndicator2.running = false
- }
- else
- {
- progressIndicator2.running = false
- }
- }
-
- BusyIndicator {
- id: progressIndicator2
- anchors.centerIn: parent
- size: BusyIndicatorSize.Small
- running: true
- }
- }
- }
- }
- }
-
- Button {
- id: relogin
- anchors.top: message.bottom
- anchors.topMargin: Theme.paddingLarge
- anchors.horizontalCenter: parent.horizontalCenter
- text: qsTr("Relogin with Facebook")
- onClicked:
- {
- python.call('api.remove_tinder_token',[], function() {});
- message.text= qsTr("Restart Sailfinder now")
- message.hintText= qsTr("Shutdown in 5 seconds")
- relogin.visible = false
- quit.start()
- }
- }
-
- ListModel {
- id: galleryAlbums
- }
-
- ListModel {
- id: galleryPhotos
- }
-
- ViewPlaceholder
- {
- id: message
- enabled: false
- }
-
- Timer {
- id: quit
- running: false
- repeat: false
- interval: 5000
- onTriggered: Qt.quit()
- }
-
- Python {
- id: python
- Component.onCompleted:
- {
- // When Python is ready, load our profile...
- if(type == 'fb')
- {
- python.call('api.get_fb_albums',[], function() {});
- }
-
- setHandler('fb_albums', function(fb_albums)
- {
- console.log(JSON.stringify(fb_albums))
- load_fb_albums(fb_albums);
- });
-
- setHandler('fb_photos', function(fb_photos)
- {
- console.log(JSON.stringify(fb_photos))
- load_fb_photos(fb_photos);
- });
- }
- onError:
- {
- console.log('Python ERROR: ' + traceback);
- Clipboard.text = traceback
- pageStack.completeAnimation();
- pageStack.replace(Qt.resolvedUrl('ErrorPage.qml'));
- pageStack.completeAnimation();
- }
-
- //DEBUG
- /*onReceived:
- {
- console.log('Python MESSAGE: ' + data);
- }*/
- }
- }
-
- onAccepted:
- {
- python.call('api.upload_fb_picture',[photo_id_selected], function(photo_id_selected) {});
- }
-}
diff --git a/docs/harbour-sailfinder/qml/pages/MainPage.qml b/docs/harbour-sailfinder/qml/pages/MainPage.qml
deleted file mode 100644
index 7c0ddf6..0000000
--- a/docs/harbour-sailfinder/qml/pages/MainPage.qml
+++ /dev/null
@@ -1,1006 +0,0 @@
-import QtQuick 2.2
-import Sailfish.Silica 1.0
-import io.thp.pyotherside 1.3
-import QtPositioning 5.2
-import "../pages/js/helper.js" as Helper
-
-Page {
-
- id: mainPage
-
- onStatusChanged:
- {
- if(status == PageStatus.Active)
- {
- if(!banned)
- {
- if(name != 'Tinder Team')
- {
- try {
- cover_data.text = name + ' (' + age + ')'
- cover_data.image = photos[0]['url']
- cover_data.actions_enabled = true
- }
- catch(err)
- {
- console.log("[ERROR] Can't load cover for recommendations: " + err)
- cover_data.text = qsTr("No data")
- cover_data.image = '../images/harbour-sailfinder.png'
- cover_data.actions_enabled = false
- }
-
- cover_data.text_enabled = true
- cover_data.image_enabled = true
- }
- else
- {
- cover_data.text = qsTr("Out of likes!")
- cover_data.image = '../images/harbour-sailfinder.png'
- cover_data.text_enabled = true
- cover_data.image_enabled = true
- cover_data.actions_enabled = false
- }
-
- if(app.search_preferences_updated)
- {
- search_preferences_updated = false;
- message.text = qsTr("Searching for people")
- message.hintText = qsTr("A moment please...")
- message.enabled = true
- cover_data.text = qsTr("Searching...")
- cover_data.image = '../images/harbour-sailfinder.png'
- cover_data.text_enabled = true
- cover_data.image_enabled = false
- cover_data.actions_enabled = false
- header.title = qsTr("Loading new people...")
- python.call('api.recommendations',[], function() {});
- person = 0;
- }
- }
- }
- }
-
- Component.onDestruction:
- {
- var date = new Date();
- python.call('api.last_activity',[date.toISOString()], function(last_activity_ISO_format) {});
- }
-
- property bool buttonsEnabled: true
- property int person
- property string rateLimitID: 'tinder_rate_limited'
- property string school
- property string job
- property string instagram_username
- property bool bio_enabled
- property bool school_enabled
- property bool job_enabled
- property bool instagram_enabled
- property int photosInstagramCount
- property bool banned
-
- // Sailfinder API data
- property var people
- property var type
- property var content_hash
- property string personID
- property string photoID
- property string name
- property var photos
- property int gender
- property string birth_date
- property string birth_date_info
- property int age
- property int distance_mi
- property int distance_km
- property var schools
- property string bio
- property var jobs
- property string ping_time
- property string connection_count
- property var common_friends
- property var common_friends_count
- property var common_likes
- property var common_like_count
- property string teaser
- property string badges
- property var superLikeLimit
- property string superLikeResetsIn
- property bool matched
- property string matched_name
- property string matched_photo
- property var instagram_data
-
- function nextPerson()
- {
- person++;
-
- python.call('api.superlike_available',[], function() {}); // Check if superlikes are now available...
- python.call('api.get_settings',[], function() {}); // Settings changed?
- //console.log("[DEBUG] Number of recommendations: " + Object.keys(people).length)
-
- if(person >= Object.keys(people).length) // Our recommendation limit is 10 people, so after the 10th person we need to reload our recommendations.
- {
- message.text = qsTr("Searching for people")
- message.hintText = qsTr("A moment please...")
- message.enabled = true
- cover_data.text = qsTr("Searching...")
- cover_data.image = '../images/harbour-sailfinder.png'
- cover_data.text_enabled = true
- cover_data.image_enabled = false
- cover_data.actions_enabled = false
- header.title = qsTr("Loading new people...")
- python.call('api.recommendations',[], function() {});
- person = 0;
- }
- else
- {
- loadPerson();
- }
- }
-
- function loadPerson()
- {
- try {
- personID = people[person]['_id']
- app.personIDParent = personID
- //console.log(JSON.stringify(people[person]))
-
- if(personID.indexOf(rateLimitID) < 0) // Check if we have likes remaining or not?
- {
- try
- {
- content_hash = people[person]['content_hash'] // Some weird token from Tinder which is passed to Tinder back when running an action on the user in the V2 API
- console.log('[INFO] Content hash: ' + content_hash)
- }
- catch(err)
- {
- console.log('[ERROR] Unable to fetch from user: ' + err)
- }
-
- name = people[person]['name']
- photos = people[person]['photos']
- gender = people[person]['gender']
- birth_date = people[person]['birth_date']
- birth_date_info = people[person]['birth_date_info']
- distance_mi = people[person]['distance_mi']
- distance_km = distance_mi * 1.609344
- schools = people[person]['schools']
- bio = people[person]['bio']
- jobs = people[person]['jobs']
- ping_time = people[person]['ping_time']
- instagram_data = people[person]['instagram']
- //connection_count = people[person]['connection_count']
- //common_friends = people['common_friends']
- //common_friends_count = people['common_friends_count']
- //common_likes = people['common_likes'] //Error: Cannot assign QVariantMap to QString
- //common_like_count = people['common_like_count']
-
- age = Helper.calculate_age(birth_date);
-
- load_photos();
- set_header(false)
- school = ''
- job = ''
- instagram_username = ''
-
- try {
- for (var i = 0; i < Object.keys(schools).length; i++)
- {
- if(i > 0)
- {
- school += ', ' + schools[i]['name']
- }
- else
- {
- school = schools[i]['name']
- }
- }
- }
- catch(err)
- {
- console.log("[INFO] No schools for: " + name)
- }
-
- for (var i = 0; i < Object.keys(jobs).length; i++)
- {
- try {
- if(i > 0)
- {
- job += ', ' + jobs[i]['company']['name'] + ': ' + jobs[i]['title']['name']
- }
- else
- {
- job = jobs[i]['company']['name'] + ': ' + jobs[i]['title']['name']
- }
- }
- catch(err)
- {
- try {
- if(i > 0)
- {
- job += ', ' + jobs[i]['company']['name']
- }
- else
- {
- job = jobs[i]['company']['name']
- }
- }
- catch(err)
- {
- try {
- if(i > 0)
- {
- job += ', ' + jobs[i]['title']['name']
- }
- else
- {
- job = jobs[i]['title']['name']
- }
- }
- catch(err)
- {
- console.log("[INFO] No jobs for: " + name)
- }
- }
- }
- }
-
- photosInstagram.clear(); // Clear the photos for the next person
- photosInstagramCount = 0;
-
- try {
- instagram_username = instagram_data['username']
- for (var i = 0; i < Object.keys(instagram_data['photos']).length; i++)
- {
- photosInstagram.append({thumbnail: instagram_data['photos'][i]['thumbnail'], url: instagram_data['photos'][i]['image']});
- }
- }
- catch(err)
- {
- console.log("[INFO] No instagram for user: " + name)
- }
-
- // Update cover
- cover_data.text = name + ' (' + age + ')'
- cover_data.image = photos[0]['url']
- cover_data.text_enabled = true
- cover_data.image_enabled = true
- cover_data.actions_enabled = true
-
- // Everything loaded, activate the buttons
- buttonsEnabled = true;
- }
- else // Out Of Likes
- {
- buttonsEnabled = false;
- bio = people[person]['bio']
- photos = people[person]['photos']
- name = people[person]['name']
- school = ''
- job = ''
- instagram_username = ''
- photosInstagram.clear()
- load_photos(photos)
- set_header(true)
-
- // Update cover
- cover_data.text = qsTr("Out of likes!")
- cover_data.image = '../images/harbour-sailfinder.png'
- cover_data.text_enabled = true
- cover_data.image_enabled = true
- cover_data.actions_enabled = false
- }
- }
- catch(err)
- {
- console.log("[DEBUG] API dump=" + JSON.stringify(people[person]))
- console.log("[ERROR] Failed to get person: " + err)
- message.text = qsTr("API ERROR")
- message.hintText = qsTr("Reloading in 5 seconds")
- message.enabled = true
- api_reload.start()
- }
- }
-
- function load_photos()
- {
- photosPeople.clear(); // Clear the photos for the next person
- for (var i = 0; i < Object.keys(photos).length; i++)
- {
- photosPeople.append({url: photos[i]['url'], ID: photos[i]['id']});
- }
- }
-
- function set_header(tinder_team)
- {
- if(tinder_team)
- {
- header.title = name
- }
- else
- {
- if(gender)
- {
- header.title = name + ' (' + age + ') ♀ - ' + distance_km + ' km'
- }
- else
- {
- header.title = name + ' (' + age + ') ♂ - ' + distance_km + ' km'
- }
- }
- }
-
- NetworkStatus {}
-
- SilicaFlickable {
- anchors.fill: parent
- contentHeight: pageColumn.height
-
- Column {
- id: pageColumn
- width: parent.width
- spacing: Theme.paddingLarge
-
- PageHeader {
- id: header
- title: app.name + ' ' + app.version
- visible: !matched_message.open && !app.network_error
- }
-
- PullDownMenu {
- id: pullDownMenu
-
- MenuItem {
- text: qsTr("Settings")
- onClicked:
- {
- // Open the Settings page and load the settings data.
- pageStack.push(Qt.resolvedUrl('SettingsPage.qml'));
- }
- enabled: !app.network_error
- }
-
- MenuItem {
- text: qsTr("Profile")
- onClicked:
- {
- // Open the Profile page and load the profile data.
- pageStack.push(Qt.resolvedUrl('ProfilePage.qml'));
- }
- enabled: !banned && !app.network_error
- }
-
- MenuItem {
- text: qsTr("People")
- onClicked:
- {
- // Open the People page and load the matches data + saved data.
- pageStack.push(Qt.resolvedUrl('PeoplePage.qml'));
- }
- enabled: !banned && !app.network_error
- }
- }
-
-
- SlideshowView {
- id: gallery
- width: parent.width
- height: width
- itemWidth: width
- model: photosPeople
- visible: !pageStack.busy && !matched_message.open && !message.enabled && !banned
- enabled: !app.network_error
- opacity: !app.network_error? 1.0: 0.2 // Don't overshadow our network error message
-
- Behavior on opacity {
- FadeAnimation {}
- }
-
- delegate: Image {
- width: parent.width / 1.05
- height: width
- source: model.url
- asynchronous: true
- smooth: true
- antialiasing: true
- onStatusChanged:
- {
- if (status == Image.Loading)
- {
- progressIndicator1.running = true
- photoID = model.ID // Asign new photo ID
- }
- else if (status == Image.Error)
- {
- source = '../images/noImage.png'
- progressIndicator1.running = false
- }
- else
- {
- progressIndicator1.running = false
- }
- }
-
- BusyIndicator {
- id: progressIndicator1
- anchors.centerIn: parent
- size: BusyIndicatorSize.Medium
- running: true
- }
- }
- }
-
- Item {
- width: parent.width
- height: buttonRow.height * 2
- visible: !matched_message.open && !message.enabled && !banned
-
- Row {
- id: buttonRow
- anchors.centerIn: parent
- spacing: Theme.paddingLarge*3
-
- IconButton {
- icon.source: {
- if (Screen.width < app.widthScreenLimit)
- {
- "../images/dislike_small.png"
- }
- else
- {
- "../images/dislike_large.png"
- }
- }
- enabled: buttonsEnabled && !app.network_error
- onClicked:
- {
- buttonsEnabled = false;
- python.call('api.dislike',[personID], function(personID) {});
- }
- }
-
- IconButton {
- icon.source: {
- if (Screen.width < app.widthScreenLimit)
- {
- "../images/superLike_small.png"
- }
- else
- {
- "../images/superLike_large.png"
- }
- }
- enabled: buttonsEnabled && !superLikeLimit && !app.network_error
- onClicked:
- {
- buttonsEnabled = false;
- python.call('api.superlike',[personID], function(personID) {});
- }
- }
-
- IconButton {
- icon.source: {
- if (Screen.width < app.widthScreenLimit)
- {
- "../images/like_small.png"
- }
- else
- {
- "../images/like_large.png"
- }
- }
- enabled: buttonsEnabled && !app.network_error
- onClicked:
- {
- buttonsEnabled = false;
- python.call('api.like',[personID], function(personID) {});
- }
- }
- }
- }
-
- Label {
- id: bio_person
- anchors {
- left: parent.left
- right: parent.right
- leftMargin: Theme.horizontalPageMargin
- rightMargin: Theme.horizontalPageMargin
- }
- font.pixelSize: Theme.fontSizeSmall
- visible: !matched_message.open && !message.enabled && bio.length && bio_enabled && !banned
- wrapMode: Text.WordWrap
- text: bio
- }
-
- Item {
- id: school_person
- width: parent.width
- height: Theme.itemSizeLarge
- anchors {
- left: parent.left
- right: parent.right
- leftMargin: Theme.horizontalPageMargin
- rightMargin: Theme.horizontalPageMargin
- }
- visible: !matched_message.open && !message.enabled && school.length && school_enabled && !banned
-
- Image {
- id: school_icon
- width: Theme.iconSizeSmall
- height: width
- anchors.right: parent.right
- anchors.top: parent.top
- source: "../images/school_large.png"
- }
-
- Label {
- id: school_label
- anchors.right: school_icon.left
- anchors.rightMargin: Theme.paddingMedium
- anchors.top: parent.top
- font.pixelSize: Theme.fontSizeSmall
- text: qsTr("School")
- }
-
- Label {
- anchors.left: parent.left
- anchors.right: parent.right
- anchors.top: school_label.bottom
- anchors.topMargin: Theme.paddingMedium
- wrapMode: Text.WordWrap
- font.pixelSize: Theme.fontSizeSmall
- text: school
- }
- }
-
- Item {
- id: job_person
- width: parent.width
- height: Theme.itemSizeLarge
- anchors {
- left: parent.left
- right: parent.right
- leftMargin: Theme.horizontalPageMargin
- rightMargin: Theme.horizontalPageMargin
- }
- visible: !matched_message.open && !message.enabled && job.length && job_enabled && !banned
-
- Image {
- id: job_icon
- width: Theme.iconSizeSmall
- height: width
- anchors.right: parent.right
- anchors.top: parent.top
- source: "../images/job_large.png"
- }
-
- Label {
- id: job_label
- anchors.right: job_icon.left
- anchors.rightMargin: Theme.paddingMedium
- anchors.top: parent.top
- font.pixelSize: Theme.fontSizeSmall
- text: qsTr("Job")
- }
-
- Label {
- anchors.left: parent.left
- anchors.right: parent.right
- anchors.top: job_label.bottom
- anchors.topMargin: Theme.paddingMedium
- wrapMode: Text.WordWrap
- font.pixelSize: Theme.fontSizeSmall
- text: job
- }
- }
-
- Item {
- id: instagram_person
- width: parent.width
- height: Theme.itemSizeLarge + photos_grid.height
- anchors {
- left: parent.left
- right: parent.right
- leftMargin: Theme.horizontalPageMargin
- rightMargin: Theme.horizontalPageMargin
- }
- visible: !matched_message.open && !message.enabled && instagram_username.length && instagram_enabled && !banned
-
- BackgroundItem {
- id: instagram_button
- width: parent.width
- height: Theme.itemSizeLarge
- anchors.left: parent.left
- anchors.right: parent.right
- anchors.top: parent.top
- onClicked:
- {
- Qt.openUrlExternally("https://www.instagram.com/" + instagram_username);
- }
-
- Image {
- id: instagram_icon
- width: Theme.iconSizeSmall
- height: width
- anchors.right: parent.right
- anchors.top: parent.top
- source: "../images/instagram_large.png"
- }
-
- Label {
- id: instagram_icon_label
- anchors.right: instagram_icon.left
- anchors.rightMargin: Theme.paddingMedium
- anchors.top: parent.top
- font.pixelSize: Theme.fontSizeSmall
- text: qsTr("Instagram")
- }
-
- Label {
- id: instagram_username_label
- anchors.left: parent.left
- anchors.right: parent.right
- anchors.top: instagram_icon_label.bottom
- anchors.topMargin: Theme.paddingMedium
- wrapMode: Text.WordWrap
- font.pixelSize: Theme.fontSizeSmall
- text: instagram_username
- }
- }
-
- SilicaGridView {
- id: photos_grid
- width: parent.width
- height: Math.ceil(photosInstagramCount/3) * cellHeight
- cellWidth: parent.width/3
- cellHeight: cellWidth
- anchors.top: instagram_button.bottom
- anchors.left: parent.left
- anchors.right: parent.right
- anchors.topMargin: Theme.paddingMedium
- model: photosInstagram
- delegate: Item {
- width: photos_grid.cellWidth
- height: photos_grid.cellHeight
-
- Image {
- width: photos_grid.cellWidth/1.1
- height: width
- anchors.centerIn: parent
- source: model.thumbnail
- asynchronous: true
- onStatusChanged:
- {
- if (status == Image.Loading)
- {
- progressIndicator2.running = true
- photosInstagramCount++;
- }
- else if (status == Image.Error)
- {
- source = '../images/noImage.png'
- progressIndicator2.running = false
- photosInstagram.remove(photos_grid.currentIndex)
- }
- else
- {
- progressIndicator2.running = false
- }
- }
-
- BusyIndicator {
- id: progressIndicator2
- anchors.centerIn: parent
- size: BusyIndicatorSize.Small
- running: true
- }
- }
- }
- }
- }
-
- // Spacer
- Item {
- height: Theme.paddingLarge
- width: parent.width
- }
- }
-
- DockedPanel {
- id: matched_message
- open: matched && !banned
- visible: matched && !banned
- width: (parent.width*2)/3
- height: Math.max(pageColumn.height, Screen.height);
- dock: Dock.Right
-
- Column {
- id: panelColum
- spacing: Theme.paddingLarge
- anchors.centerIn: parent
-
- Label {
- anchors.horizontalCenter: parent.horizontalCenter
- wrapMode: Text.WordWrap
- text: qsTr("Matched with:")
- }
-
- Label {
- anchors.horizontalCenter: parent.horizontalCenter
- wrapMode: Text.WordWrap
- text: matched_name
- }
-
- Image {
- width: Theme.itemSizeLarge
- height: width
- anchors.horizontalCenter: parent.horizontalCenter
- source: matched_photo
- asynchronous: true
- smooth: true
- onStatusChanged:
- {
- if (status == Image.Loading)
- {
- load_matched_photo.running = true
- }
- else if (status == Image.Error)
- {
- source = '../images/noImage.png'
- load_matched_photo.running = false
- }
- else
- {
- load_matched_photo.running = false
- }
- }
-
- BusyIndicator {
- id: load_matched_photo
- anchors.centerIn: parent
- size: BusyIndicatorSize.Medium
- running: true
- }
- }
-
- Button {
- anchors.horizontalCenter: parent.horizontalCenter
- text: qsTr("Open People")
- onClicked:
- {
- pageStack.push(Qt.resolvedUrl('PeoplePage.qml'));
- matched = false
- }
- }
-
- Button {
- anchors.horizontalCenter: parent.horizontalCenter
- text: qsTr("Swipe further")
- onClicked: matched = false
- }
- }
- }
-
- ListModel {
- id: photosPeople
- }
-
- ListModel {
- id: photosInstagram
- }
-
- ViewPlaceholder {
- id: message
- enabled: true
- text: qsTr("Searching for people")
- hintText: qsTr("A moment please...")
- }
-
- Timer {
- id: api_reload
- running: false
- repeat: false
- interval: 5000
- onTriggered:
- {
- message.text = qsTr("Searching for people")
- message.hintText = qsTr("A moment please...")
- message.enabled = true
- cover_data.text = qsTr("Searching...")
- cover_data.image = '../images/harbour-sailfinder.png'
- cover_data.text_enabled = true
- cover_data.image_enabled = false
- cover_data.actions_enabled = false
- header.title = qsTr("Loading new people...")
- python.call('api.recommendations',[], function() {});
- person = 0;
- }
- }
-
- Timer {
- id: relogin
- running: false
- repeat: false
- interval: 1500
- onTriggered:
- {
- pageStack.replace(Qt.resolvedUrl('FirstPage.qml'));
- }
- }
-
- Timer {
- id: update_gps_tinder
- interval: 15000
- running: false
- repeat: true
- onTriggered:
- {
- python.call('api.update_location',[location.position.coordinate.latitude, location.position.coordinate.longitude], function(lat, lon) {})
- }
- }
-
- Item {
- id: gps_data
- property alias positionSource: location
- PositionSource {
- id: location
- updateInterval: 5000
- active: true
- onPositionChanged:
- {
- console.log("[INFO] Position changed")
- update_gps_tinder.start()
- }
- }
- }
-
- Python {
- id: python
- Component.onCompleted:
- {
- python.call('api.recommendations',[], function() {});
- python.call('api.superlike_available',[], function() {});
- python.call('api.get_settings',[], function() {});
-
- // When Python has succesfully extracted the login data we can login into Tinder.
- setHandler('recommendations', function(recommendations)
- {
-
- //console.log(JSON.stringify(recommendations))
- if(recommendations) // If false, token expired
- {
- if(recommendations == "recs exhausted" || recommendations == "recs timeout")
- {
- python.call('api.profile',[], function() {});
- message.text = qsTr("No new users in the area :-(")
- message.hintText = qsTr("Extend your search criteria...")
- message.enabled = true
- }
- else
- {
- people = recommendations
- header.title = qsTr("Loading new people...")
- loadPerson()
- message.enabled = false
- }
- }
- else
- {
- python.call('api.remove_tinder_token',[], function() {});
- message.text = qsTr("Tinder login expired")
- message.hintText = qsTr("Relogin please")
- message.enabled = true
- relogin.start()
- }
- });
-
- setHandler('profile', function(profile_data) // Disable Sailfinder when the account has been banned by Tinder.
- {
- //console.log(JSON.stringify(profile_data))
- console.log(profile_data['banned'])
- try {
- banned = profile_data['banned']
- if(banned)
- {
- message.text = qsTr("Account banned :-(")
- message.hintText = qsTr("You can't use Sailfinder without a valid account")
- message.enabled = true
- cover_data.text = qsTr("Banned!")
- cover_data.image = '../images/harbour-sailfinder.png'
- cover_data.text_enabled = true
- cover_data.image_enabled = true
- cover_data.actions_enabled = false
- }
- }
- catch(err)
- {
- console.log("[DEBUG] Banned:" + err)
- console.log("[INFO] Banned = undefined means not banned!")
- }
- });
-
- setHandler('settings', function(settings)
- {
- //console.log(JSON.stringify(settings))
- bio_enabled = parseInt(settings['bio']);
- school_enabled = parseInt(settings['school']);
- job_enabled = parseInt(settings['job']);
- instagram_enabled = parseInt(settings['instagram']);
- });
-
- setHandler('dislike', function(result)
- {
- try {
- nextPerson()
- }
- catch(err)
- {
- console.log("[ERROR] Dislike:" + err)
- }
- });
-
- setHandler('superlike', function(result)
- {
- nextPerson()
- console.log(JSON.stringify(result))
- try {
- matched = result['match']
- matched_name = name
- matched_photo = photos[0]['url']
- if(matched)
- {
- console.log("[INFO] You and " + name + " supermatched!")
- app.activate()
- }
- }
- catch(err)
- {
- console.log("[ERROR] Superlike:" + err)
- }
- });
-
- setHandler('superlike_available', function(superlike_reset_time)
- {
- superLikeLimit = Helper.superlike_reseted(superlike_reset_time)
- });
-
- setHandler('like', function(result)
- {
- nextPerson()
- try {
- matched = result['match']
- matched_name = name
- matched_photo = photos[0]['url']
- if(matched)
- {
- console.log("[INFO] You and " + name + " matched!")
- app.activate()
- }
-
- }
- catch(err)
- {
- console.log("[ERROR] Like:" + err)
- }
- });
- }
-
- onError:
- {
- console.log('Python ERROR: ' + traceback);
- Clipboard.text = traceback
- pageStack.completeAnimation();
- pageStack.replace(Qt.resolvedUrl('ErrorPage.qml'));
- }
-
- //DEBUG
- onReceived:
- {
- console.log('Python MESSAGE: ' + JSON.stringify(data));
- }
- }
- }
-}
-
diff --git a/docs/harbour-sailfinder/qml/pages/MessagingPage.qml b/docs/harbour-sailfinder/qml/pages/MessagingPage.qml
deleted file mode 100644
index 7142aca..0000000
--- a/docs/harbour-sailfinder/qml/pages/MessagingPage.qml
+++ /dev/null
@@ -1,531 +0,0 @@
-import QtQuick 2.2
-import QtQuick.Window 2.0;
-import Sailfish.Silica 1.0
-import io.thp.pyotherside 1.3
-import "../pages/js/helper.js" as Helper
-
-Page {
- id: page
-
- property int counter_reset_timer
-
- // Sailfinder API
- property string personID
- property string matchID
- property var messages
- property var image
- property var last_active
- property string name
- property var age
- property int gender
- property var photos
- property string bio
- property var gifs
-
- function loadGIFs(gifs)
- {
- for (var i = 0; i < Object.keys(gifs['data']).length; i++)
- {
- //gifsModel.append({url: gifs['data'][i]['embed_url'], id: gifs['data'][i]['id']})
- gifsModel.append({url: gifs['data'][i]['images']['original']['url'], id: gifs['data'][i]['id']})
- }
- }
-
- Component.onCompleted:
- {
- last_active = Helper.calculate_last_seen(last_active)
- lastSeen.text = qsTr("Last seen: ") + last_active
- nameLabel.text = name
- }
-
- NetworkStatus {}
-
- Item {
- id: header
- height: Theme.itemSizeExtraLarge
- anchors
- {
- top: parent.top
- left: parent.left
- right: parent.right
- }
-
- Rectangle {
- anchors.fill: parent
- z: -1
- color: "black"
- opacity: 0.15
- }
-
- Image {
- id: avatar
- width: Theme.iconSizeLarge
- height: width
- anchors
- {
- right: parent.right
- margins: Theme.paddingLarge
- verticalCenter: parent.verticalCenter
- }
- asynchronous: true
- smooth: true
- antialiasing: true
- source: image
- fillMode: Image.PreserveAspectCrop
-
- onStatusChanged:
- {
- if (status == Image.Loading)
- {
- progressIndicator.running = true
- }
- else if (status == Image.Error)
- {
- source = '../images/noImage.png'
- progressIndicator.running = false
- }
- else
- {
- progressIndicator.running = false
- }
- }
-
- BusyIndicator {
- id: progressIndicator
- anchors.centerIn: parent
- size: BusyIndicatorSize.Medium
- running: true
- }
-
- Rectangle {
- anchors.fill: parent
- z: -1
- color: "black"
- opacity: 0.35
- }
-
- MouseArea {
- anchors.fill: parent
- onClicked:
- {
- pageStack.push(Qt.resolvedUrl('AboutPage.qml'), {personID: personID, bio: bio, photos: photos, last_active: last_active, name: name, gender: gender, age: age});
- }
- }
- }
-
- Column {
- anchors {
- right: avatar.left
- margins: Theme.paddingLarge
- verticalCenter: parent.verticalCenter
- }
-
- Label {
- id: nameLabel
- anchors.right: parent.right
- color: Theme.highlightColor
- font {
- family: Theme.fontFamilyHeading
- pixelSize: Theme.fontSizeLarge
- }
- text: qsTr("N/A")
- }
-
- Label {
- id: lastSeen
- anchors.right: parent.right
- color: Theme.secondaryColor
- font {
- family: Theme.fontFamilyHeading
- pixelSize: Theme.fontSizeTiny
- }
- text: qsTr("last seen: N/A")
- }
- }
- }
-
- SilicaListView {
- id: view
- anchors
- {
- top: header.bottom
- left: parent.left
- right: parent.right
- bottom: message_bar.top
- }
- Component.onCompleted: positionViewAtEnd()
- clip: true
- model: messages
- header: Item {
- height: view.spacing
- anchors
- {
- left: parent.left
- right: parent.right
- }
- }
- footer: Item {
- height: view.spacing
- anchors
- {
- left: parent.left
- right: parent.right
- }
- }
- spacing: Theme.paddingMedium
- delegate: Item {
- id: item
- height: shadow.height
- anchors
- {
- left: parent.left
- right: parent.right
- margins: view.spacing
- }
-
- readonly property bool alignRight:
- {
- if(model.from == personID) // Same aliging as in the Jolla Messaging app
- {
- false
- }
- else
- {
- true
- }
- }
- readonly property int maxContentWidth : (page.width * 0.85);
-
- Rectangle {
- id: shadow
- anchors
- {
- fill: layout
- margins: -Theme.paddingSmall
- }
- color: "white"
- radius: 3
- opacity: (item.alignRight ? 0.05 : 0.15)
- antialiasing: true
- }
-
- //readonly property string iconlocation: like_message.icon.source
-
- /*IconButton { // NEEDS API FIXING
- id: like_message
- anchors.left: layout.right
- anchors.leftMargin: Theme.paddingMedium
- anchors.verticalCenter: layout.verticalCenter
- icon.source: "../images/message_dislike.png"
- visible: item.alignRight
- opacity: 0.5
- onClicked:
- {
- if(iconlocation.match("dislike.png"))
- {
- icon.source = "../images/message_like.png"
- opacity = 1.0
- python.call('api.like_message',[true, model._id], function(like, message_id) {});
- console.log("[INFO] Message " + model._id + " liked")
- }
- else if(iconlocation.match("like.png"))
- {
- icon.source = "../images/message_dislike.png"
- opacity = 0.5
- python.call('api.like_message',[false, model._id], function(like, message_id) {});
- console.log("[INFO] Message: " + model._id + " disliked")
- }
- }
- Behavior on opacity {
- FadeAnimation {}
- }
- }*/
-
- Column {
- id: layout
- anchors
- {
- left: (item.alignRight ? parent.left : undefined)
- right: (!item.alignRight ? parent.right : undefined)
- margins: -shadow.anchors.margins
- verticalCenter: parent.verticalCenter
- }
- spacing: Theme.paddingSmall
-
- Text {
- id: message_text
- width: Math.min(page.width*0.8, contentWidth)
- anchors
- {
- left: (item.alignRight ? parent.left : undefined)
- right: (!item.alignRight ? parent.right : undefined)
- }
- color: Theme.primaryColor
- wrapMode: Text.WrapAtWordBoundaryOrAnywhere
- font
- {
- family: Theme.fontFamilyHeading
- pixelSize: Theme.fontSizeMedium
- }
- text: model.message
- visible: !text.match('.giphy.com/media/')
- }
-
- AnimatedImage {
- id: gif
- width: Theme.itemSizeExtraLarge*3
- height: width
- visible: !message_text.visible
- fillMode: visible? Image.PreserveAspectFit: Image.Pad
- source: if(visible)
- {
- model.message
- }
- else
- {
- '../images/no_gif.gif'
- }
- onStatusChanged:
- {
- if (status == AnimatedImage.Loading)
- {
- progressIndicator.running = true
- }
- else if (status == AnimatedImage.Error)
- {
- source = '../images/noImage.png'
- progressIndicator.running = false
- }
- else
- {
- progressIndicator.running = false
- }
- }
-
- BusyIndicator {
- id: progressIndicator
- anchors.centerIn: parent
- size: BusyIndicatorSize.Medium
- running: true
- }
- }
-
- Label {
- id: timestamp
- anchors.right: parent.right
- font.pixelSize: Theme.fontSizeTiny
- text: Helper.calculate_last_seen(model.sent_date)
- }
- }
- }
- }
-
- Item {
- id: gif_gallery
- width: parent.width
- height: Theme.itemSizeHuge*1.5
- anchors.bottom: message_bar.top
- opacity: 0
-
- Behavior on opacity {
- FadeAnimation {}
- }
-
- Rectangle {
- anchors.fill: parent
- width: parent.width
- height: parent.height
- color: Theme.secondaryHighlightColor
- }
-
- SlideshowView {
- width: parent.width
- height: parent.height
- anchors.fill: parent
- itemWidth: width
- model: gifsModel
-
- delegate: AnimatedImage {
- width: parent.width/1.2
- height: parent.height
- source: model.url
- asynchronous: true
- smooth: true
- antialiasing: true
- onStatusChanged:
- {
- if (status == Image.Loading)
- {
- progressIndicator1.running = true
- }
- else if (status == Image.Error)
- {
- source = '../images/noImage.png'
- progressIndicator1.running = false
- }
- else
- {
- progressIndicator1.running = false
- }
- }
-
- BusyIndicator {
- id: progressIndicator1
- anchors.centerIn: parent
- size: BusyIndicatorSize.Medium
- running: true
- }
-
- MouseArea {
- anchors.fill: parent
- onClicked:
- {
- // Send GIF
- python.call('api.send_message',[model.url, matchID, true, model.id], function(message, matchID, gif, gif_id) {});
- messages.append({from: 'myself', message: model.url});
-
- // Clear
- gif_gallery.opacity = 0;
- messages_box.placeholderText = qsTr("Hi ") + name + qsTr("!");
- send_message.icon.source = "image://theme/icon-m-message";
- view.positionViewAtEnd()
- }
- }
- }
- }
- }
-
- Row {
- id: message_bar
- anchors
- {
- left: parent.left
- right: parent.right
- bottom: parent.bottom
- }
-
- BackgroundItem {
- id: show_gifs
- width: Theme.iconSizeLarge
- height: Theme.iconSizeLarge
- onClicked:
- {
- gif_gallery.opacity = !gif_gallery.opacity
- messages_box.text = ""; // Clear the message otherwise the message will be used as search term in GIPHY
- if(gif_gallery.opacity == 0)
- {
- python.call('api.get_gifs',[], function(search_word) {});
- messages_box.placeholderText = qsTr("Search for GIFs")
- send_message.icon.source = "image://theme/icon-m-search"
- }
- else
- {
- messages_box.placeholderText = qsTr("Hi ") + name + qsTr("!")
- send_message.icon.source = "image://theme/icon-m-message"
- }
- }
-
- Label {
- anchors.centerIn: parent
- text: qsTr("GIF")
- }
- }
-
- TextArea {
- id: messages_box
- width: parent.width - send_message.width - show_gifs.width
- placeholderText: qsTr("Hi ") + name + qsTr("!")
- }
-
- IconButton {
- id: send_message
- icon.source: "image://theme/icon-m-message"
- onClicked: {
- if(icon.source == "image://theme/icon-m-message")
- {
- messages.append({from: 'myself', message: messages_box.text});
- messages_box.label = qsTr("Message send!");
- view.positionViewAtEnd()
- python.call('api.send_message',[messages_box.text, matchID, false, ''], function(message, matchID, gif, gif_id) {});
- reset_input.start();
- }
- else
- {
- view.positionViewAtEnd()
- gifsModel.clear(); // Make place for new GIFS
- python.call('api.get_gifs',[messages_box.text], function(search_word) {});
- }
- }
- }
- }
-
- SilicaFlickable {
- ViewPlaceholder {
- id: screen_message
- enabled: !Qt.inputMethod.visible && !messages.count
- text: qsTr("No messages :(")
- hintText: qsTr("Say hi to ") + name + qsTr("!")
- }
- }
-
- Connections {
- target: Qt.inputMethod
- }
-
- Timer {
- id: reset_input
- interval: 100
- running: false
- repeat: true
- onTriggered:
- {
- counter_reset_timer++
- if(counter_reset_timer < 2)
- {
- messages_box.text = "";
- messages_box.focus = false;
- }
-
- if(counter_reset_timer > 10)
- {
- messages_box.placeholderText = qsTr("Hi ") + name + qsTr("!")
- counter_reset_timer = 0
- reset_input.stop()
- }
- }
- }
-
- ListModel {
- id: gifsModel
- }
-
- Python {
- id: python
-
- Component.onCompleted:
- {
- setHandler('gifs', function(gifs_data) // Reduces the calls of last_active to one (previously every match)
- {
- //console.log(JSON.stringify(gifs_data))
- loadGIFs(gifs_data[1]);
- });
- }
-
- onError:
- {
- console.log('Python ERROR: ' + traceback);
- Clipboard.text = traceback
- pageStack.completeAnimation();
- pageStack.replace(Qt.resolvedUrl('ErrorPage.qml'));
- pageStack.completeAnimation();
- }
-
- //DEBUG
- onReceived:
- {
- console.log('Python MESSAGE: ' + data);
- }
- }
-}
-
-
diff --git a/docs/harbour-sailfinder/qml/pages/NetworkStatus.qml b/docs/harbour-sailfinder/qml/pages/NetworkStatus.qml
deleted file mode 100644
index ee869f3..0000000
--- a/docs/harbour-sailfinder/qml/pages/NetworkStatus.qml
+++ /dev/null
@@ -1,90 +0,0 @@
-import QtQuick 2.2
-import Sailfish.Silica 1.0
-import io.thp.pyotherside 1.3
-import "../pages/js/helper.js" as Helper
-
-Item {
- anchors.fill: parent
- width: parent.width
- height: parent.height
- z: 10 // overlay
-
- Rectangle {
- id: network_error_message
- width: parent.width
- height: Theme.itemSizeLarge
- z: 1 // on top
- anchors.top: parent.top
- anchors.left: parent.left
- anchors.right: parent.right
- color: Theme.secondaryHighlightColor
- opacity: app.network_error? 1.0: 0.0
-
- Behavior on opacity {
- FadeAnimation {}
- }
-
- Label {
- anchors.centerIn: parent
- text: qsTr("Network connection error :-(")
- font.pixelSize: Theme.fontSizeLarge
- font.bold: true
- }
- }
-
- Rectangle {
- anchors.centerIn: parent
- width: Theme.itemSizeHuge*2.5
- height: width
- radius: width/2
- color: Theme.secondaryHighlightColor
- visible: app.network_error
-
- BusyIndicator {
- id: progressIndicatorNetwork
- anchors.centerIn: parent
- size: BusyIndicatorSize.Large
- running: app.network_error
- }
-
- Label {
- anchors.top: progressIndicatorNetwork.bottom
- anchors.topMargin: Theme.paddingLarge
- anchors.horizontalCenter: parent.horizontalCenter
- wrapMode: Text.WordWrap
- visible: app.network_error
- text: qsTr("Checking connection")
- font.bold: true
- }
-
- }
-
- Rectangle {
- id: network_error_overlay
- anchors.fill: parent
- width: parent.width
- height: Screen.height
- color: "white"
- opacity: app.network_error? 0.3: 0.0
-
- Behavior on opacity {
- FadeAnimation {}
- }
- }
-
- TouchBlocker {
- anchors.fill: network_error_overlay
- enabled: app.network_error
- }
-
- Timer {
- id: recheck_connection_timer
- running: app.network_error
- repeat: true
- interval: 2000
- onTriggered:
- {
- python.call('network.connection',[], function() {});
- }
- }
-}
diff --git a/docs/harbour-sailfinder/qml/pages/PeoplePage.qml b/docs/harbour-sailfinder/qml/pages/PeoplePage.qml
deleted file mode 100644
index 5f0b260..0000000
--- a/docs/harbour-sailfinder/qml/pages/PeoplePage.qml
+++ /dev/null
@@ -1,365 +0,0 @@
-import QtQuick 2.2
-import Sailfish.Silica 1.0
-import io.thp.pyotherside 1.3
-import "../pages/js/helper.js" as Helper
-
-Page {
-
- onStatusChanged:
- {
- if(status == PageStatus.Active)
- {
- if(matchesModel.count > 1)
- {
- cover_data.text = matchesModel.count + qsTr(" matches")
- }
- else if(matchesModel.count == 1)
- {
- cover_data.text = matchesModel.count + qsTr(" match")
- }
- else
- {
- cover_data.text = qsTr("No matches")
-
- }
- cover_data.image = '../images/matches.png'
- cover_data.text_enabled = true
- cover_data.image_enabled = true
- cover_data.actions_enabled = false
- }
- }
-
- Component.onDestruction:
- {
- var date = new Date();
- python.call('api.last_activity',[date.toISOString()], function(last_activity_ISO_format) {});
- }
-
- property bool new_messages
- property var number_of_messages
- property var last_active
- property int last_message_counter
-
- // Sailfinder API data
- property var personID
- property var matchID
- property var name
- property var bio
- property var age
- property var birth_date
- property var gender
- property var photos
- property var common_friends_count
- property var common_like_count
- property var super_like
- property var dead
- property var last_message_date
- property var last_activity_date
- property var messages
-
- function loadMatches(matches)
- {
- for (var i = 0; i < Object.keys(matches).length; i++)
- {
- try {
- personID = matches[i]['person']['_id']
- name = matches[i]['person']['name']
- bio = matches[i]['person']['bio']
- gender = matches[i]['person']['gender']
- birth_date = matches[i]['person']['birth_date']
- photos = matches[i]['person']['photos']
- super_like = matches[i]['is_super_like']
- dead = matches[i]['dead']
- common_friends_count = matches[i]['common_friend_count']
- common_like_count = matches[i]['common_like_count']
- messages = matches[i]['messages']
- number_of_messages = matches[i]['messages'].length // Get last message data
- last_activity_date = matches[i]['last_activity_date']
-
- try
- {
- matchID = matches[i]['id']
- last_message_counter = Object.keys(messages).length-1 // New person!
-
- while(messages[last_message_counter]['from'] == personID) // Own messages are not counted as new messages!
- {
- last_message_date = messages[last_message_counter]['created_date']
- last_message_counter--
- }
- console.log("[DEBUG] Last message date:" + last_message_date + ' from:' + name)
- new_messages = Helper.time_difference(last_message_date, last_active)
- }
- catch(err)
- {
- console.log("[INFO] No messages for this match: " + name)
- new_messages = false
- }
-
- age = Helper.calculate_age(birth_date);
-
- matchesModel.append({url: photos[0]['url'], name: name, super_like: super_like, new_messages: new_messages, messages: messages, last_active: last_activity_date, ID: personID, matchID: matchID, photos: photos, gender: gender, bio: bio, age: age}) // Everything ready, add it to the list
- }
- catch(err)
- {
- console.log("[ERROR] Loading match: " + i + "failed: " + err)
- }
- }
-
- // Update cover
- if(matchesModel.count > 1)
- {
- cover_data.text = matchesModel.count + qsTr(" matches")
- }
- else if(matchesModel.count == 1)
- {
- cover_data.text = matchesModel.count + qsTr(" match")
- }
- else
- {
- cover_data.text = qsTr("No matches")
- }
-
- cover_data.image = '../images/matches_large.png'
- cover_data.text_enabled = true
- cover_data.image_enabled = true
- cover_data.actions_enabled = false
- }
-
- NetworkStatus {}
-
- SilicaFlickable {
- anchors.fill: parent
- contentHeight: pageColumn.height
-
- Column {
- id: pageColumn
- anchors.fill: parent
-
- RemorsePopup {
- id: remorse
- }
-
- PageHeader {
- id: header
- title: qsTr("People")
- }
-
- PullDownMenu {
- id: pullDownMenu
-
- MenuItem {
- text: qsTr("Refresh")
- onClicked:
- {
- // Refresh the people list:
- matchesModel.clear()
- message.text = qsTr("Refreshing...")
- message.hintText = qsTr("A moment please")
- message.enabled = true
- python.call('api.last_activity',[''], function(empty) {});
- }
- }
- }
-
- // Get all the matches and put them in a list.
- SilicaListView {
- width: parent.width
- height: Screen.height - header.height
- anchors.left: parent.left
- anchors.right: parent.right
- model: matchesModel
- quickScroll: true
- clip: true
-
- delegate: ListItem {
- highlighted: model.new_messages
- contentHeight: Theme.iconSizeExtraLarge*1.2
-
- Image {
- id: image
- width: Theme.iconSizeExtraLarge
- height: Theme.iconSizeExtraLarge
- anchors.left: parent.left
- anchors.leftMargin: Theme.horizontalPageMargin
- anchors.verticalCenter: parent.verticalCenter
- source: model.url
- asynchronous: true
- smooth: true
- antialiasing: true
- onStatusChanged:
- {
- if (status == Image.Loading)
- {
- progressIndicator.running = true
- }
- else
- {
- progressIndicator.running = false
- }
-
- if (status == Image.Error)
- {
- source = '../images/noImage.png'
- progressIndicator.running = false
- }
- }
-
- BusyIndicator {
- id: progressIndicator
- anchors.centerIn: parent
- size: BusyIndicatorSize.Medium
- running: true
- }
- }
-
- Label {
- id: name
- anchors.left: image.right;
- anchors.leftMargin: Theme.horizontalPageMargin;
- anchors.verticalCenter: parent.verticalCenter
- wrapMode: Text.WordWrap
- maximumLineCount: 1
- font.pixelSize: Theme.fontSizeExtraLarge
- text: model.name
- }
-
- Image {
- anchors.left: name.right
- anchors.leftMargin: Theme.horizontalPageMargin
- anchors.verticalCenter: parent.verticalCenter
- source: "image://theme/icon-m-favorite-selected"
- visible: model.super_like
- }
-
- onClicked:
- {
- matchesModel.setProperty(index, "new_messages", false) // Unhighlight this person since we read the message
- pageStack.push(Qt.resolvedUrl('MessagingPage.qml'), {personID: model.ID, bio: model.bio, photos: model.photos, gender: model.gender, age: model.age, messages: model.messages, image: model.url, last_active: model.last_active, name: model.name, matchID: matchID});
- }
-
- menu: ContextMenu {
-
- MenuItem {
- text: "About"
- onClicked:
- {
- pageStack.push(Qt.resolvedUrl('AboutPage.qml'), {personID: model.ID, bio: model.bio, photos: model.photos, last_active: model.last_active, name: model.name, gender: model.gender, age: model.age});
- }
- }
-
- MenuItem {
- text: "Report for SPAM"
- onClicked:
- {
- remorse.execute("Reporting", function()
- {
- python.call('api.report',[model.ID, 1], function(personID, causeID) {});
- })
- }
- }
-
- MenuItem {
- text: "Report for inappropriate"
- onClicked:
- {
- remorse.execute("Reporting", function()
- {
- python.call('api.report',[model.ID, 2], function(personID, causeID) {});
- })
- }
- }
-
- MenuItem {
- text: "Unmatch"
- onClicked:
- {
- remorse.execute("Unmatching", function()
- {
- python.call('api.unmatch',[model.matchID], function(matchID) {});
- message.text = qsTr("Refreshing...")
- message.hintText = qsTr("A moment please")
- message.enabled = true
- matchesModel.clear()
- python.call('api.last_activity',[''], function(empty) {});
- })
- }
- }
- }
- }
- }
- VerticalScrollDecorator {}
- }
-
- // Create a list of all matches. We will fill this list later with Python.
- ListModel {
- id: matchesModel
- }
-
- ViewPlaceholder {
- id: message
- enabled: true
- text: qsTr("Loading matches...")
- hintText: qsTr("A moment please")
- }
-
- Timer {
- id: refresh
- interval: 15*60*1000
- running: false
- repeat: true
- onTriggered:
- {
- matchesModel.clear()
- python.call('api.people',[], function() {});
- }
- }
-
- Python {
- id: python
- Component.onCompleted:
- {
- // Ask when we were last online as soon as Python is ready for it
- python.call('api.last_activity',[''], function(empty) {});
-
- setHandler('last_active', function(date) // Reduces the calls of last_active to one (previously every match)
- {
- last_active = date
-
- // Ask for our people now
- python.call('api.people',[], function() {});
- });
-
- setHandler('matches', function(matchData)
- {
- //console.log(JSON.stringify(matchData))
- if(Object.keys(matchData).length > 0)
- {
- loadMatches(matchData)
- message.enabled = false
- refresh.restart()
- }
- else
- {
- message.text = qsTr("No matches :-(")
- message.hintText = qsTr("Go swipe on some people!")
- message.enabled = true
- }
- });
- }
-
- onError:
- {
- console.log('Python ERROR: ' + traceback);
- Clipboard.text = traceback
- pageStack.completeAnimation();
- pageStack.replace(Qt.resolvedUrl('ErrorPage.qml'));
- }
-
- //DEBUG
- /*onReceived:
- {
- console.log('Python MESSAGE: ' + data);
- }*/
- }
- }
-}
diff --git a/docs/harbour-sailfinder/qml/pages/ProfilePage.qml b/docs/harbour-sailfinder/qml/pages/ProfilePage.qml
deleted file mode 100644
index 7f565cc..0000000
--- a/docs/harbour-sailfinder/qml/pages/ProfilePage.qml
+++ /dev/null
@@ -1,385 +0,0 @@
-import QtQuick 2.2
-import Sailfish.Silica 1.0
-import io.thp.pyotherside 1.3
-import "../pages/js/helper.js" as Helper
-
-Page {
-
- // Sailfinder API data
- property var profile: ''
- property var name: ''
- property var full_name: ''
- property var username: ''
- property int gender_filter: 0
- property var interested_in: 0
- property var interests: ''
- property var photos: ''
- property int photos_count: 0
- property int gender: 0
- property string birth_date: ''
- property int age: 18
- property int distance_mi: 0
- property int distance_km: 0
- property var friends_tinder_social: ''
- property var current_position: ''
- property var standard_position: ''
- property int age_filter_max: 0
- property int age_filter_min: 0
- property int distance_filter_max: 0
- property int distance_filter_min: 0
- property bool discoverable: false
- property string last_active: ''
- property var groups: ''
- property string latest_update_date: ''
- property var schools: ''
- property string school_text: ''
- property string bio: ''
- property var jobs: ''
- property string job_text: ''
- property string ping_time: ''
- property string connection_count: ''
- property var common_friends: ''
- property var common_friends_count: ''
- property var common_likes: ''
- property var common_like_count: ''
- property string teaser: ''
- property var badges: ''
- property bool superLikeLimit: false
- property string superLikeResetsIn: ''
- property bool matched: false
-
- function load_profile()
- {
- name = profile['name']
- full_name = profile['full_name']
- bio = profile['bio']
- photos = profile['photos']
- gender = profile['gender']
- gender_filter = profile['gender_filter']
- interested_in = profile['interested_in']
- interests = profile['interests']
- friends_tinder_social = profile['friends']
- birth_date = profile['birth_date']
- username = profile['username']
- ping_time = profile['ping_time']
- current_position = profile['pos']
- standard_position = profile['pos_major']
- schools = profile['schools']
- jobs = profile['jobs']
- badges = profile['badges']
- age_filter_max = profile['age_filter_max']
- age_filter_min = profile['age_filter_min']
- discoverable = profile['discoverable']
- distance_filter_max = profile['distance_filter']
- distance_filter_min = profile['distance_filter_min']
- last_active = profile['active_time']
- groups = profile['groups']
- latest_update_date = profile['latest_update_date']
-
- age = Helper.calculate_age(birth_date);
- set_header()
- load_photos()
-
- try {
- for (var i = 0; i < Object.keys(schools).length; i++)
- {
- if(i > 0)
- {
- school_text += ', ' + schools[i]['name']
- }
- else
- {
- school_text = schools[i]['name']
- }
- }
- }
- catch(err)
- {
- console.log("[INFO] No schools")
- }
-
- for (var i = 0; i < Object.keys(jobs).length; i++)
- {
- try {
- if(i > 0)
- {
- job_text += ', ' + jobs[i]['company']['name'] + ': ' + jobs[i]['title']['name']
- }
- else
- {
- job_text = jobs[i]['company']['name'] + ': ' + jobs[i]['title']['name']
- }
- }
- catch(err)
- {
- try {
- if(i > 0)
- {
- job_text += ', ' + jobs[i]['company']['name']
- }
- else
- {
- job_text = jobs[i]['company']['name']
- }
- }
- catch(err)
- {
- try {
- if(i > 0)
- {
- job_text += ', ' + jobs[i]['title']['name']
- }
- else
- {
- job_text = jobs[i]['title']['name']
- }
- }
- catch(err)
- {
- console.log("[INFO] No jobs")
- }
- }
- }
- }
-
- // Update cover
- cover_data.text = name + qsTr("'s profile")
- cover_data.image = photos[0]['url']
- cover_data.text_enabled = true
- cover_data.image_enabled = true
- cover_data.actions_enabled = false
- }
-
- function load_photos()
- {
- photosProfile.clear(); // Clear the photos when we update
- for (var i = 0; i < Object.keys(photos).length; i++)
- {
- try
- {
- photosProfile.append({url: photos[i]['url']});
- }
- catch(err)
- {
- console.log('[INFO] No pictures available for this account: ' + err)
- }
- }
- }
-
- function set_header()
- {
- if(gender)
- {
- header.title = name + ' (' + age + ') ♀ - ' + qsTr("Profile")
- }
- else
- {
- header.title = name + ' (' + age + ') ♂ - ' + qsTr("Profile")
- }
- }
-
- NetworkStatus {}
-
- SilicaFlickable {
- anchors.fill: parent
- contentHeight: pageColumn.height
-
- Column {
- id: pageColumn
- width: parent.width
- spacing: Theme.paddingLarge
-
- PageHeader {
- id: header
- title: qsTr("Profile")
- }
-
- PullDownMenu {
- MenuItem {
- text: qsTr("Update profile")
- onClicked:
- {
- // Open the UpdateProfile page.
- pageStack.replace(Qt.resolvedUrl('UpdateProfilePage.qml'));
- }
- }
- }
-
- SlideshowView {
- width: parent.width
- height: width
- itemWidth: width
- model: photosProfile
- visible: !pageStack.busy
-
- delegate: Image {
- width: parent.width / 1.05
- height: width
- source: model.url
- asynchronous: true
- smooth: true
- antialiasing: true
- onStatusChanged:
- {
- if (status == Image.Loading)
- {
- progressIndicator.running = true
- }
- else if (status == Image.Error)
- {
- source = '../images/noImage.png'
- progressIndicator.running = false
- }
- else
- {
- progressIndicator.running = false
- }
- }
-
- BusyIndicator {
- id: progressIndicator
- anchors.centerIn: parent
- size: BusyIndicatorSize.Medium
- running: true
- }
- }
- }
-
- Label {
- text: bio
- font.pixelSize: Theme.fontSizeSmall
- wrapMode: Text.WordWrap
- anchors {
- left: parent.left
- right: parent.right
- leftMargin: Theme.horizontalPageMargin
- rightMargin: Theme.horizontalPageMargin
- }
- }
-
- Item {
- id: school_user
- width: parent.width
- height: Theme.itemSizeLarge
- anchors {
- left: parent.left
- right: parent.right
- leftMargin: Theme.horizontalPageMargin
- rightMargin: Theme.horizontalPageMargin
- }
- visible: school_text.length > 0
-
- Image {
- id: school_icon
- width: Theme.iconSizeSmall
- height: width
- anchors.right: parent.right
- anchors.top: parent.top
- source: "../images/school_large.png"
- }
-
- Label {
- id: school_label
- anchors.right: school_icon.left
- anchors.rightMargin: Theme.paddingMedium
- anchors.top: parent.top
- font.pixelSize: Theme.fontSizeSmall
- text: qsTr("School")
- }
-
- Label {
- anchors.left: parent.left
- anchors.right: parent.right
- anchors.top: school_label.bottom
- anchors.topMargin: Theme.paddingMedium
- wrapMode: Text.WordWrap
- font.pixelSize: Theme.fontSizeSmall
- text: school_text
- }
- }
-
- Item {
- id: job_user
- width: parent.width
- height: Theme.itemSizeLarge
- anchors {
- left: parent.left
- right: parent.right
- leftMargin: Theme.horizontalPageMargin
- rightMargin: Theme.horizontalPageMargin
- }
- visible: job_text.length > 0
-
- Image {
- id: job_icon
- width: Theme.iconSizeSmall
- height: width
- anchors.right: parent.right
- anchors.top: parent.top
- source: "../images/job_large.png"
- }
-
- Label {
- id: job_label
- anchors.right: job_icon.left
- anchors.rightMargin: Theme.paddingMedium
- anchors.top: parent.top
- font.pixelSize: Theme.fontSizeSmall
- text: qsTr("Job")
- }
-
- Label {
- anchors.left: parent.left
- anchors.right: parent.right
- anchors.top: job_label.bottom
- anchors.topMargin: Theme.paddingMedium
- wrapMode: Text.WordWrap
- font.pixelSize: Theme.fontSizeSmall
- text: job_text
- }
- }
-
- // Spacer
- Item {
- height: Theme.paddingLarge
- width: parent.width
- }
- }
- }
-
- ListModel {
- id: photosProfile
- }
-
- Python {
- id: python
- Component.onCompleted:
- {
- // When Python is ready, load our Tinder profile...
- python.call('api.profile',[], function() {});
-
- // Get the profile data.
- setHandler('profile', function(profile_data)
- {
- //console.log(JSON.stringify(profile_data))
- profile = profile_data
- load_profile()
- });
- }
-
- onError:
- {
- console.log('Python ERROR: ' + traceback);
- Clipboard.text = traceback
- pageStack.completeAnimation();
- pageStack.replace(Qt.resolvedUrl('ErrorPage.qml'));
- pageStack.completeAnimation();
- }
-
- //DEBUG
- /*onReceived:
- {
- console.log('Python MESSAGE: ' + data);
- }*/
- }
-}
diff --git a/docs/harbour-sailfinder/qml/pages/SailfinderPage.qml b/docs/harbour-sailfinder/qml/pages/SailfinderPage.qml
deleted file mode 100644
index f4a1f92..0000000
--- a/docs/harbour-sailfinder/qml/pages/SailfinderPage.qml
+++ /dev/null
@@ -1,150 +0,0 @@
-import QtQuick 2.2
-import Sailfish.Silica 1.0
-
-Page {
- id: page
-
- SilicaFlickable {
- anchors.fill: parent
- contentHeight: columnPage.height
-
- Column {
- id: columnPage
- width: page.width
- spacing: Theme.paddingLarge
-
- PageHeader {
- title: app.name + ' ' + app.version
- }
-
- SectionHeader { text: qsTr("What's Sailfinder?") }
-
- Label {
- anchors {
- left: parent.left
- right: parent.right
- leftMargin: Theme.horizontalPageMargin
- rightMargin: Theme.horizontalPageMargin
- }
- font.pixelSize: Theme.fontSizeSmall
- wrapMode: Text.WordWrap
- text: qsTr("Sailfinder is an unofficial Tinder client for Sailfish OS. The application is opensource GPLv3 software and based on PyOtherSide.")
- }
-
- Button {
- anchors.horizontalCenter: parent.horizontalCenter
- text: qsTr("Source code")
- onClicked:
- {
- Qt.openUrlExternally("https://github.com/modulebaan/harbour-sailfinder")
- }
- }
-
- SectionHeader { text: qsTr("Privacy policy") }
-
- Label {
- anchors {
- left: parent.left
- right: parent.right
- leftMargin: Theme.horizontalPageMargin
- rightMargin: Theme.horizontalPageMargin
- }
- font.pixelSize: Theme.fontSizeSmall
- wrapMode: Text.WordWrap
- text: qsTr("• Sailfinder will NEVER collect any personal information about the user, but I can't guarantee that the third-party companies used in Sailfinder (Tinder, Facebook, MapQuest, ...) won't collect any information.\n \n• Sailfinder NEVER connects to the analytics API of Tinder, which collects data about the usage of the app in the background on Android.")
- }
-
- SectionHeader { text: qsTr("Support Sailfinder!") }
-
- Button {
- anchors.horizontalCenter: parent.horizontalCenter
- text: qsTr("Donate with Paypal")
- onClicked: {
- Qt.openUrlExternally("https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=XTDV5P8JQTHT4")
- }
- }
-
- Label {
- anchors {
- left: parent.left
- right: parent.right
- leftMargin: Theme.horizontalPageMargin
- }
- font.pixelSize: Theme.fontSizeSmall
- wrapMode: Text.WordWrap
- text: qsTr("I put in a lot of time to develop Sailfinder so please buy me a coffee :)")
- }
-
- SectionHeader { text: qsTr("Other") }
-
- Label {
- anchors {
- left: parent.left
- right: parent.right
- leftMargin: Theme.horizontalPageMargin
- }
- font.pixelSize: Theme.fontSizeSmall
- wrapMode: Text.WordWrap
- text: qsTr("• Developped by Dylan Van Assche (modulebaan)")
- }
-
- Button {
- anchors.horizontalCenter: parent.horizontalCenter
- text: qsTr("Modulebaan.tk")
- onClicked:
- {
- Qt.openUrlExternally("http://modulebaan.tk/sailfish-os/my-apps/")
- }
- }
-
- Label {
- anchors
- {
- left: parent.left
- right: parent.right
- leftMargin: Theme.horizontalPageMargin
- }
- font.pixelSize: Theme.fontSizeSmall
- wrapMode: Text.WordWrap
- text: qsTr("• Icons by Paomedia")
- }
-
- Button {
- anchors.horizontalCenter: parent.horizontalCenter
- text: qsTr("Paomedia icons on Github")
- onClicked:
- {
- Qt.openUrlExternally("https://github.com/paomedia/small-n-flat/")
- }
- }
-
- Label {
- anchors
- {
- left: parent.left
- right: parent.right
- leftMargin: Theme.horizontalPageMargin
- }
- font.pixelSize: Theme.fontSizeSmall
- wrapMode: Text.WordWrap
- text: qsTr("• Messaging based on 'mitakuuluu-ui-ng' from Thomas Boutroue")
- }
-
- Button {
- anchors.horizontalCenter: parent.horizontalCenter
- text: qsTr("Mitakuuluu-ui-ng on Gitlab")
- onClicked:
- {
- Qt.openUrlExternally("http://gitlab.unique-conception.org/thebootroo/mitakuuluu-ui-ng")
- }
- }
-
- // Spacer
- Item {
- height: 20
- width: parent.width
- }
- }
- }
-}
-
diff --git a/docs/harbour-sailfinder/qml/pages/SettingsPage.qml b/docs/harbour-sailfinder/qml/pages/SettingsPage.qml
deleted file mode 100644
index 8df1ec7..0000000
--- a/docs/harbour-sailfinder/qml/pages/SettingsPage.qml
+++ /dev/null
@@ -1,344 +0,0 @@
-import QtQuick 2.2
-import Sailfish.Silica 1.0
-import io.thp.pyotherside 1.3
-import QtPositioning 5.2
-
-Dialog {
- id: page
-
- onStatusChanged:
- {
- if(status == PageStatus.Active)
- {
- cover_data.text = qsTr("Settings")
- cover_data.image = '../images/settings.png'
- cover_data.text_enabled = true
- cover_data.image_enabled = true
- cover_data.actions_enabled = false
- }
- }
-
- property string mapquest_key: '7jwW2xkWwiapD8K4rLkiKlSxOPqSKiLG'
- property var latitude: ''
- property var longitude: ''
-
- NetworkStatus {}
-
- SilicaFlickable {
- anchors.fill: parent
- contentHeight: column.height
-
- Column {
- id: column
- width: page.width
- spacing: Theme.paddingLarge
-
- DialogHeader {
- title: qsTr("Settings")
- }
-
- RemorsePopup {
- id: remorse
- }
-
- SectionHeader { text: "Recommendations" }
-
- IconTextSwitch {
- id: bio
- icon.source: {
- if (Screen.width < app.widthScreenLimit)
- {
- "../images/bio_small.png"
- }
- else
- {
- "../images/bio_large.png"
- }
- }
- text: qsTr("Show bio")
- checked: false
- }
-
- IconTextSwitch {
- id: school
- icon.source: {
- if (Screen.width < app.widthScreenLimit)
- {
- "../images/school_small.png"
- }
- else
- {
- "../images/school_large.png"
- }
- }
- text: qsTr("Show school")
- checked: false
- }
-
- IconTextSwitch {
- id: job
- icon.source: {
- if (Screen.width < app.widthScreenLimit)
- {
- "../images/job_small.png"
- }
- else
- {
- "../images/job_large.png"
- }
- }
- text: qsTr("Show job")
- checked: false
- }
-
- IconTextSwitch {
- id: instagram
- icon.source: {
- if (Screen.width < app.widthScreenLimit)
- {
- "../images/instagram_small.png"
- }
- else
- {
- "../images/instagram_large.png"
- }
- }
- text: qsTr("Show Instagram account")
- checked: false
- }
-
- SectionHeader { text: qsTr("Location") }
-
- Label {
- id: gps_lat
- anchors.left: parent.left
- anchors.leftMargin: Theme.horizontalPageMargin
- text: qsTr("Latitude: ") + latitude + '°'
- visible: location.position.latitudeValid && location.position.longitudeValid
- }
-
- Label {
- id: gps_lon
- anchors.left: parent.left
- anchors.leftMargin: Theme.horizontalPageMargin
- text: qsTr("Longitude: ") + longitude + '°'
- visible: location.position.latitudeValid && location.position.longitudeValid
- }
-
- Label {
- anchors.horizontalCenter: parent.horizontalCenter
- wrapMode: Text.WordWrap
- font.pixelSize: Theme.fontSizeLarge
- text: qsTr("Waiting for GPS signal...")
- visible: !location.position.latitudeValid || !location.position.longitudeValid
- }
-
- Image {
- id: map
- width: parent.width
- height: width
- anchors
- {
- left: parent.left
- right: parent.right
- }
- asynchronous: true
- smooth: true
- antialiasing: true
- visible: location.position.latitudeValid && location.position.longitudeValid
- enabled: visible
- source: "https://open.mapquestapi.com/staticmap/v4/getmap?key=" + mapquest_key + "¢er=" + location.position.coordinate.latitude + "," + location.position.coordinate.longitude + "&zoom=" + zoom_map.value +"&size=" + parent.width + "," + parent.width + "&type=map&imagetype=jpeg&pois=red_1-GPS," + location.position.coordinate.latitude + "," + location.position.coordinate.longitude
- onStatusChanged:
- {
- if (status == Image.Loading)
- {
- progressIndicator.running = true
- }
- else if (status == Image.Error)
- {
- source = '../images/noImage.png'
- progressIndicator.running = false
- }
- else
- {
- progressIndicator.running = false
- }
- }
-
- BusyIndicator {
- id: progressIndicator
- anchors.centerIn: parent
- size: BusyIndicatorSize.Medium
- running: true
- }
-
- Rectangle {
- z: 1
- width: parent.width
- height: parent.height
- anchors.fill: parent
- color: "transparent"
- border.color: Theme.secondaryHighlightColor
- border.width: Theme.paddingLarge
- }
- }
-
- Slider {
- id: zoom_map
- width: parent.width
- value: 14
- minimumValue: 1
- maximumValue: 18
- stepSize: 1
- valueText: ((value/18)*100).toFixed(0) + " %"
- visible: location.position.latitudeValid && location.position.longitudeValid
- label: qsTr("🔎 Zoom map")
- }
-
- SectionHeader { text: "Network status" }
-
- Label {
- id: network_state
- anchors.left: parent.left
- anchors.right: parent.right
- anchors.leftMargin: Theme.horizontalPageMargin
- anchors.rightMargin: Theme.horizontalPageMargin
- text: qsTr("Offline")
- color: text==qsTr("Offline")? "red": Theme.primaryColor
- font.bold: true
- }
-
- DetailItem {
- id: network_name
- label: qsTr("Name")
- value: qsTr("N/A")
- visible: network_state.text==qsTr("Offline")? false: true
- }
-
- DetailItem {
- id: network_type
- label: qsTr("Type")
- value: qsTr("N/A")
- visible: network_state.text==qsTr("Offline")? false: true
- }
-
- DetailItem {
- id: network_signal_strength
- label: qsTr("Signal strength")
- value: qsTr("N/A")
- visible: network_state.text==qsTr("Offline")? false: true
- }
-
- SectionHeader { text: qsTr("Logout") }
-
- Button {
- anchors.horizontalCenter: parent.horizontalCenter
- text: qsTr("Logout Tinder")
- color: 'red'
- onClicked:
- {
- remorse.execute("Logging out", function()
- {
- python.call('api.remove_tinder_token',[], function() {});
- Qt.quit()
- })
- }
- }
-
- SectionHeader { text: qsTr("About this app") }
-
- Button {
- anchors.horizontalCenter: parent.horizontalCenter
- text: qsTr("About")
- onClicked: pageStack.push(Qt.resolvedUrl('SailfinderPage.qml'));
- }
-
- // Spacer
- Item {
- height: Theme.paddingLarge
- width: parent.width
- }
- }
- }
-
- Timer {
- running: location.position.latitudeValid && location.position.longitudeValid
- repeat: true
- interval: 30*1000
- triggeredOnStart: true
- onTriggered:
- {
- latitude = location.position.coordinate.latitude
- longitude = location.position.coordinate.longitude
- }
- }
-
- Item {
- id: gps_data
- property alias positionSource: location
- PositionSource {
- id: location
- updateInterval: 5000
- active: true
- onPositionChanged:
- {
- console.log("[INFO] Position changed")
- }
- }
- }
-
- Python {
- id: python
- Component.onCompleted:
- {
- // When Python is ready, ask for our settings
- python.call('api.get_settings',[], function() {});
- python.call('network.connection',[], function() {});
-
- setHandler('settings', function(settings)
- {
- //console.log(JSON.stringify(settings))
- bio.checked = parseInt(settings['bio']);
- school.checked = parseInt(settings['school']);
- job.checked = parseInt(settings['job']);
- instagram.checked = parseInt(settings['instagram']);
- });
-
- setHandler('network', function(status, type, name, signal_strength)
- {
- console.log(JSON.stringify(type));
- console.log(JSON.stringify(name));
- console.log(JSON.stringify(signal_strength));
- if(status[0] == "connected")
- {
- network_state.text = qsTr("Online")
- network_type.value = type[0]
- network_name.value = name[0]
- network_signal_strength.value = signal_strength[0] + '%'
- }
-
- });
- }
-
- onError:
- {
- console.log('Python ERROR: ' + traceback);
- Clipboard.text = traceback
- pageStack.completeAnimation();
- pageStack.replace(Qt.resolvedUrl('ErrorPage.qml'));
- pageStack.completeAnimation();
- }
-
- //DEBUG
- onReceived:
- {
- console.log('Python MESSAGE: ' + JSON.stringify(data));
- }
- }
-
- onAccepted:
- {
- python.call('api.save_settings',[(bio.checked * bio.checked), (school.checked * school.checked), (job.checked * job.checked), (instagram.checked * instagram.checked)], function(bio, school, job, instagram) {});
- }
-}
-
diff --git a/docs/harbour-sailfinder/qml/pages/UpdateProfilePage.qml b/docs/harbour-sailfinder/qml/pages/UpdateProfilePage.qml
deleted file mode 100644
index 5fef013..0000000
--- a/docs/harbour-sailfinder/qml/pages/UpdateProfilePage.qml
+++ /dev/null
@@ -1,775 +0,0 @@
-import QtQuick 2.2
-import Sailfish.Silica 1.0
-import io.thp.pyotherside 1.3
-
-Dialog {
- id: dialog
-
- property bool delete_username
- property bool share_link_available
- property bool selected
- property var photo_id_selected
- property int index_selected
- property int photosCounter
-
- // Sailfinder API
- property var profile
- property var my_tinder_id
- property var photos
- property var bio_text
- property var gender_value
- property var interested_in_value
- property string username_text
- property var age_max_value
- property var age_min_value
- property bool discoverable_bool
- property var search_distance_value
- property var share_url: qsTr("N/A")
- property var share_text: qsTr("N/A")
-
- function load_profile()
- {
- try {
- my_tinder_id = profile['_id']
- bio_text = profile['bio']
- photos = profile['photos']
- gender_value = profile['gender']
- //username_text = profile['username']
- interested_in_value = profile['gender_filter']
- age_max_value = profile['age_filter_max']
- age_min_value = profile['age_filter_min']
- discoverable_bool = profile['discoverable']
- search_distance_value = profile['distance_filter'] * 1.609344
- //current_position = profile['pos']
- //standard_position = profile['pos_major']
-
- bio.text = bio_text
- gender.currentIndex = gender_value
- interested_in.currentIndex = interested_in_value+1
- age_filter_max.value = age_max_value
- age_filter_min.value = age_min_value
- discoverable.checked = discoverable_bool
- search_distance.value = search_distance_value
- }
- catch(err)
- {
- console.log("[ERROR] Can't load profile settings: " + err)
- }
-
- try {
- username_text = profile['username'] // Fixes Github issues #43 & #44
- username.text = username_text
-
- if(username_text.length > 0)
- {
- loading_share_url.running = true;
- python.call('api.share_link',[my_tinder_id], function(my_tinder_id) {});
- }
- }
- catch(err)
- {
- console.log("[INFO] No username chosen yet")
- }
-
- load_photos()
- }
-
- function check_username()
- {
- if(username.text != username_text)
- {
- if(username_text.length > 0)
- {
- python.call('api.update_username',[username.text], function() {});
- }
- else
- {
- python.call('api.create_username',[username.text], function() {});
- }
-
- app.search_preferences_updated = true;
- }
-
- if(delete_username)
- {
- python.call('api.delete_username',[], function() {});
- app.search_preferences_updated = true;
- }
- }
-
- function load_photos()
- {
- photosProfile.clear(); // Clear the photos when we update
- photosCounter = 0;
-
- for (var i = 0; i < 6; i++)
- {
- photosProfile.append({url: "../images/noImage.png", text: '', tinder_photo_id: 'no_image_available'});
- }
-
- for (var i = 0; i < Object.keys(photos).length; i++)
- {
- try
- {
- photosProfile.set(i, {url: photos[i]['url'], text: '', tinder_photo_id: photos[i]['id']});
- photosCounter++;
- }
- catch(err)
- {
- console.log("[ERROR] Can't load pictures of this account: " + err)
- }
- }
-
- // Buttons
- photosProfile.set(6, {url: "image://theme/icon-m-cloud-upload", text: qsTr("Facebook"), tinder_photo_id: 'fb'});
- photosProfile.set(7, {url: "image://theme/icon-m-device-upload", text: qsTr("Local"), tinder_photo_id: 'local'});
- photosProfile.set(8, {url: "image://theme/icon-m-delete", text: qsTr("Delete"), tinder_photo_id: 'delete'});
- }
-
- NetworkStatus {}
-
- SilicaFlickable {
- anchors.fill: parent
- contentHeight: pageColumn.height
-
- Column {
- id: pageColumn
- width: parent.width
- spacing: Theme.paddingLarge
-
- RemorsePopup {
- id: remorse
- }
-
- DialogHeader {
- acceptText: qsTr("Save")
- title: qsTr("Update profile")
- }
-
- SectionHeader { text: qsTr("Photos") }
-
- Label {
- anchors.left: parent.left
- anchors.right: parent.right
- anchors.leftMargin: Theme.horizontalPageMargin
- anchors.rightMargin: Theme.horizontalPageMargin
- font.pixelSize: Theme.fontSizeSmall
- wrapMode: Text.WordWrap
- text: if(selected)
- {
- if(photo_id_selected == 'no_image_available')
- {
- qsTr("Upload a new picture")
- }
- else
- {
- qsTr("Delete this picture")
- }
- }
- else
- {
- qsTr("Select a picture")
- }
- }
-
- SilicaGridView {
- id: gallery
- width: parent.width
- height: width
- cellWidth: parent.width/3
- cellHeight: cellWidth
- model: photosProfile
-
- delegate: BackgroundItem {
- width: gallery.cellWidth
- height: gallery.cellHeight
- enabled:
- {
- if(model.tinder_photo_id != 'local')
- {
- true
-
- if(selected)
- {
- if(photo_id_selected == 'no_image_available')
- {
- if(model.tinder_photo_id == 'fb')
- {
- true
- }
-
- if(model.tinder_photo_id == 'delete')
- {
- false
- }
- }
- else
- {
- if(model.tinder_photo_id == 'fb')
- {
- false
- }
-
- if(model.tinder_photo_id == 'delete')
- {
- true
- }
- }
- }
- else
- {
- if(model.tinder_photo_id == 'fb')
- {
- false
- }
-
- if(model.tinder_photo_id == 'delete')
- {
- false
- }
- }
- }
- else
- {
- false
- }
- }
-
- onClicked:
- {
- if(model.tinder_photo_id.length > 10 || model.tinder_photo_id == 'unknown') // filter out our own IDs
- {
- if((photo_id_selected == model.tinder_photo_id && index_selected == index) || !selected)
- {
- selectedPhoto.visible = !selectedPhoto.visible;
- if(selectedPhoto.visible)
- {
- photo_id_selected = model.tinder_photo_id;
- selected = true;
- index_selected = index;
- }
- else
- {
- photo_id_selected = '';
- selected = false;
- index_selected = -1;
- }
- }
- }
- else
- {
- switch(model.tinder_photo_id)
- {
- case 'fb':
- if(selected)
- {
- pageStack.replace(Qt.resolvedUrl('GalleryPage.qml'), {type: 'fb'});
- }
- break;
-
- case 'local':
- console.log("UPLOAD WITH LOCAL")
- //python.call('api.upload_picture',[], function() {});
- break;
-
- case 'delete':
- if(selected && photosCounter > 1)
- {
- remorse.execute("Deleting picture", function()
- {
- python.call('api.delete_picture',[photo_id_selected], function(tinder_photo_id) {}); // Delete image
- python.call('api.profile', [], function() {}); // Reload profile data with new images
- selected = false
- photo_id_selected = ""
- photosCounter--;
- })
- }
- break;
- }
- }
- }
-
- Rectangle {
- id: selectedPhoto
- anchors.fill: parent
- color: Theme.secondaryHighlightColor
- opacity: 0.7
- visible: false
- }
-
- Image {
- id: image
- width:
- {
- if(model.text.length)
- {
- Theme.iconSizeMedium
- }
- else
- {
- gallery.cellWidth/1.1
- }
- }
- height: width
- anchors.centerIn: parent
- source: model.url
- fillMode: Image.PreserveAspectCrop
- asynchronous: true
- smooth: true
- antialiasing: true
- opacity:
- {
- if(model.tinder_photo_id != 'local')
- {
- if(selected)
- {
- if(photo_id_selected == 'no_image_available')
- {
- if(model.tinder_photo_id == 'delete')
- {
- 0.2
- }
- else
- {
- 1.0
- }
- }
- else
- {
- if(model.tinder_photo_id == 'fb')
- {
- 0.2
- }
- else
- {
- 1.0
- }
- }
- }
- else
- {
- if(model.tinder_photo_id == 'fb' || model.tinder_photo_id == 'delete')
- {
- 0.2
- }
- else
- {
- 1.0
- }
- }
- }
- else
- {
- 0.2
- }
- }
-
- onStatusChanged:
- {
- if (status == Image.Loading)
- {
- progressIndicator.running = true
- }
- else
- {
- progressIndicator.running = false
- }
- }
-
- BusyIndicator {
- id: progressIndicator
- anchors.centerIn: parent
- size: BusyIndicatorSize.Small
- running: true
- }
- }
-
- Label {
- anchors.top: image.bottom
- anchors.topMargin: Theme.paddingMedium
- anchors.horizontalCenter: parent.horizontalCenter
- visible: model.text.length
- text: model.text
- opacity:
- {
- if(model.tinder_photo_id != 'local')
- {
- if(selected)
- {
- if(photo_id_selected == 'no_image_available')
- {
- if(model.tinder_photo_id == 'delete')
- {
- 0.2
- }
- else
- {
- 1.0
- }
- }
- else
- {
- if(model.tinder_photo_id == 'fb')
- {
- 0.2
- }
- else
- {
- 1.0
- }
- }
- }
- else
- {
- if(model.tinder_photo_id == 'fb' || model.tinder_photo_id == 'delete')
- {
- 0.2
- }
- else
- {
- 1.0
- }
- }
- }
- else
- {
- 0.2
- }
- }
- }
- }
- }
-
- SectionHeader { text: qsTr("Bio") }
-
- TextArea {
- id: bio
- width: parent.width
- height: Math.max(parent.width/3, implicitHeight)
- placeholderText: qsTr("Type your bio here.")
- label: qsTr("Your bio (max 500 characters)")
- onTextChanged:
- {
- if(text.length > 500)
- {
- dialog.canAccept = false
- bio.color = "red"
- }
- else
- {
- dialog.canAccept = true
- bio.color = Theme.primaryColor
- }
- }
- }
-
- SectionHeader { text: qsTr("Gender") }
-
- ComboBox {
- id: gender
- width: parent.width
- label: "Gender: "
- currentIndex: -1
- menu: ContextMenu {
- MenuItem { text: qsTr("Male") }
- MenuItem { text: qsTr("Female") }
- }
- }
-
- SectionHeader { text: qsTr("Username") }
-
- Column {
- width: parent.width
- spacing: Theme.paddingLarge
- visible: discoverable.checked
-
- TextField {
- id: username
- width: parent.width
- font.capitalization: Font.AllLowercase // All the usernames are set with lowercase characters
- placeholderText: qsTr("Tinder username")
- label: qsTr("Share your profile now!")
- }
-
- Item {
- width: parent.width
- height: get_share_link_button.height
-
- Button {
- id: get_share_link_button
- anchors.horizontalCenter: parent.horizontalCenter
- enabled: username.text.length
- text: qsTr("Get share URL")
- onClicked:
- {
- loading_share_url.running = true;
- check_username();
- username_text = username.text
- python.call('api.share_link',[my_tinder_id], function(my_tinder_id) {});
- }
- }
-
- BusyIndicator {
- id: loading_share_url
- size: BusyIndicatorSize.Small
- anchors.right: get_share_link_button.left
- anchors.rightMargin: Theme.paddingMedium
- anchors.verticalCenter: parent.verticalCenter
- running: false
- }
- }
-
- Row {
- width: parent.width
- anchors {
- left: parent.left
- right: parent.right
- leftMargin: Theme.horizontalPageMargin
- rightMargin: Theme.horizontalPageMargin
- }
- spacing: Theme.paddingSmall
- visible: share_link_available && !delete_username
-
- IconButton {
- icon.source: "image://theme/icon-m-clipboard?" + (pressed? Theme.highlightColor: Theme.primaryColor)
- onClicked: Clipboard.text = share_url
- }
- TextArea {
- width: parent.width - Theme.iconSizeMedium
- readOnly: true
- font.pixelSize: Theme.fontSizeSmall
- label: qsTr("My share URL")
- text: share_url
- }
- }
-
- TextArea {
- width: parent.width
- readOnly: true
- font.pixelSize: Theme.fontSizeSmall
- label: qsTr("Share text")
- visible: share_link_available && !delete_username
- text: share_text
- }
-
- Button {
- anchors.horizontalCenter: parent.horizontalCenter
- text: qsTr("Delete username")
- color: "red"
- enabled: username_text || share_link_available
- onClicked:
- {
- remorse.execute("Deleting username", function()
- {
- delete_username = true;
- check_username();
- username_text = '';
- username.visible = true
- get_share_link_button.visible = true
- })
- }
- }
- }
-
- Label {
- id: username_deleted
- anchors.horizontalCenter: parent.horizontalCenter
- wrapMode: Text.WordWrap
- visible: false
- text: qsTr("Username succesfully deleted!")
- }
-
- Label {
- anchors.horizontalCenter: parent.horizontalCenter
- wrapMode: Text.WordWrap
- visible: !discoverable.checked
- text: qsTr("Enable discovery to edit your username.")
- }
-
- SectionHeader { text: qsTr("Discoverable") }
-
- IconTextSwitch {
- id: discoverable
- icon.source: "image://theme/icon-m-share"
- text: qsTr("Discovery")
- description: qsTr("Choose if other people can see your Tinder profile or not. This has no effect on your matches you already have. When disabled, you can't change your search criteria.")
- checked: false
- }
-
- SectionHeader { text: qsTr("Search criteria") }
-
- ComboBox {
- id: interested_in
- width: parent.width
- label: qsTr("Interested in: ")
- currentIndex: -1
- visible: discoverable.checked
- menu: ContextMenu {
- MenuItem { text: qsTr("Everyone") }
- MenuItem { text: qsTr("Male") }
- MenuItem { text: qsTr("Female") }
- }
- }
-
- Slider {
- id: age_filter_min
- width: parent.width
- value: 18
- minimumValue: 18
- maximumValue: 100
- stepSize: 2
- valueText: value.toFixed(0)
- label: qsTr("Minimum age")
- visible: discoverable.checked
- onReleased:
- {
- if(value > age_filter_max.value)
- {
- value = age_filter_max.value
- }
- }
- }
-
- Slider {
- id: age_filter_max
- width: parent.width
- value: 100
- minimumValue: 18
- maximumValue: 100
- stepSize: 2
- valueText: value.toFixed(0)
- label: qsTr("Maximum age")
- visible: discoverable.checked
- onReleased:
- {
- if(value < age_filter_min.value)
- {
- value = age_filter_min.value
- }
- }
- }
-
- Slider {
- id: search_distance
- width: parent.width
- value: 160
- minimumValue:2
- maximumValue:160
- stepSize: 2
- valueText: value.toFixed(0) + " km"
- label: qsTr("Search distance")
- visible: discoverable.checked
- }
-
- Label {
- visible: !discoverable.checked
- wrapMode: Text.WordWrap
- font.pixelSize: Theme.fontSizeLarge
- anchors {
- left: parent.left
- right: parent.right
- leftMargin: Theme.horizontalPageMargin
- rightMargin: Theme.horizontalPageMargin
- }
- text: qsTr("Enable discovery to change the search criteria.")
- }
-
- // Spacer
- Item {
- height: Theme.paddingLarge
- width: parent.width
- }
-
- VerticalScrollDecorator {}
- }
-
- ListModel {
- id: photosProfile
- }
- }
-
- Python {
- id: python
- Component.onCompleted:
- {
- // When Python is ready, load our profile...
- python.call('api.profile',[], function() {});
-
- setHandler('profile', function(profile_data)
- {
- //console.log(JSON.stringify(profile_data))
- profile = profile_data;
- load_profile();
- });
-
- setHandler('username', function(result)
- {
- switch(result)
- {
- case false: // ERROR
- username.color = "red"
- username.label = qsTr("Username already in use!")
- share_link_available = false
- break;
- case 1: // CREATED
- username_deleted.visible = false;
- username.color = Theme.primaryColor
- username.label = qsTr("Username created!")
- break;
- case 2: // UPDATED
- username_deleted.visible = false;
- username.color = Theme.primaryColor
- username.label = qsTr("Username changed!")
- break;
- case 3: // DELETED
- username_deleted.visible = true;
- username.color = Theme.primaryColor
- username.label = qsTr("Username deleted!")
- break;
- }
- });
-
- setHandler('sharelink', function(url)
- {
- if(url)
- {
- share_link_available = true
- share_url = url['link']
- share_text = url['share_text']
- loading_share_url.running = false
- }
- });
- }
- onError:
- {
- console.log('Python ERROR: ' + traceback);
- Clipboard.text = traceback
- pageStack.completeAnimation();
- pageStack.replace(Qt.resolvedUrl('ErrorPage.qml'));
- pageStack.completeAnimation();
- }
-
- //DEBUG
- /*onReceived:
- {
- console.log('Python MESSAGE: ' + JSON.stringify(data));
- }*/
- }
-
- onDone:
- {
- if (result == DialogResult.Accepted)
- {
- // Only update if the user changed something
- if(bio.text != bio_text || gender.currentIndex != gender_value || discoverable.checked != discoverable_bool || interested_in.currentIndex-1 != interested_in_value ||age_filter_min.value != age_min_value || age_filter_max.value != age_max_value || search_distance.value != search_distance_value)
- {
- python.call('api.update_profile',[discoverable.checked, age_filter_min.value, age_filter_max.value, gender.currentIndex, interested_in.currentIndex-1, search_distance.value/1.609344, bio.text], function(discoverable, age_min, age_max, gender, gender_filter, distance, bio) {});
- app.search_preferences_updated = true;
- }
-
- check_username()
- }
- }
-}
-
-
diff --git a/docs/harbour-sailfinder/qml/pages/api.py b/docs/harbour-sailfinder/qml/pages/api.py
deleted file mode 100644
index 5c4c492..0000000
--- a/docs/harbour-sailfinder/qml/pages/api.py
+++ /dev/null
@@ -1,544 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-@title: Sailfinder API
-@description: API for Sailfinder to connect with the Tinder servers
-
-@author: Dylan Van Assche
-"""
-
-import json
-import time
-import pyotherside
-import os
-import re
-import robobrowser
-from lib import constants, requests, network, giphy
-
-session = requests.Session() #Tinder session
-fb_token = ''
-fb_user_id = ''
-last_active = ''
-file_version = 'Sailfinder V2.0'
-
-def uploadTinder(imageFile, userID): #BROKEN
- #print 'UPLOAD'
- image = {'media': open('test.jpeg', 'rb')}
- return session.post('https://imageupload.gotinder.com/image?client_photo_id=ProfilePhoto' + str(int(time.time())*1000), json={'userId': userID}, files={'file': open('test.jpeg', 'rb')})
- #return session.post(constants.TINDER_IMAGE_HOST + '/image?client_photo_id=ProfilePhoto' + str(int(time.time())*1000), data={'userId': '56d422d94f10e5db60fe7823'}, files={'file': open('test.jpeg', 'rb')})
-
-def postTinder(url, data): #OK
- #print 'POST'
- if(network.connection(True)):
- result = session.post(constants.TINDER_HOST + url, data=data)
-
- if(result.status_code == 200 or result.status_code == 204 or result.status_code == 201):
- try:
- return result.status_code, result.json()
- except:
- return result.status_code, True
- else:
- return result.status_code, False
- else:
- return constants.HTTP_NOT_RESPONDING, False
-
-def getTinder(url, data): #OK
- #print 'GET'
- if(network.connection(True)):
- result = session.post(constants.TINDER_HOST + url, data=data)
-
- if(result.status_code == 200 or result.status_code == 204 or result.status_code == 201):
- try:
- return result.status_code, result.json()
- except:
- return result.status_code, True
- else:
- return result.status_code, False
- else:
- return constants.HTTP_NOT_RESPONDING, False
-
-def deleteTinder(url, data): #OK
- if(network.connection(True)):
- result = session.delete(constants.TINDER_HOST + url, data=data)
-
- if(result.status_code == 200 or result.status_code == 204 or result.status_code == 201):
- try:
- result.status_code, result.json()
- except:
- return result.status_code, True
- else:
- return result.status_code, False
- else:
- return False
-
-def putTinder(url, data): #OK
- if(network.connection(True)):
- result = session.put(constants.TINDER_HOST + url, data=data)
-
- if(result.status_code == 200 or result.status_code == 204 or result.status_code == 201):
- try:
- result.status_code, result.json()
- except:
- return result.status_code, True
- else:
- return result.status_code, False
- else:
- return constants.HTTP_NOT_RESPONDING, False
-
-def get_access_token(email, password):
- pyotherside.send("DEBUG", "Getting access token...")
- s = robobrowser.RoboBrowser(user_agent=constants.MOBILE_USER_AGENT, parser="lxml")
- s.open(constants.FB_AUTH)
- #submit login form
- f = s.get_form()
- f["pass"] = password
- f["email"] = email
- s.submit_form(f)
- #click the 'ok' button on the dialog informing you that you have already authenticated with the Tinder app
- f = s.get_form()
- if not 'skip_api_login' in s.url: #Detect of we entered the right credentials, if Facebook doesn't redirect us we did something wrong!
- s.submit_form(f, submit=f.submit_fields[''])
- s.submit_form(f, submit=f.submit_fields['__SUBMIT__'])
- #get access token from the html response
- try:
- access_token = re.search(r"access_token=([\w\d]+)", s.response.content.decode()).groups()[0]
- loginFacebook(access_token)
- writeFile('tinder.token', str(access_token), False, True)
- pyotherside.send("DEBUG", "OK, get FB ID, fb_access_token= " + access_token)
- except:
- access_token = ""
- pyotherside.send("login", "Tinder added as trusted, relogin now")
- else:
- pyotherside.send("login", "Email/Password is wrong, try again.")
-
-def loginFacebook(access_token): #OK
- global fb_token
- global fb_user_id
-
- fb_token = access_token
- fb_id_API_url = "https://graph.facebook.com/me?fields=id&access_token=" + fb_token
- try:
- fb_user_id = requests.get(fb_id_API_url).json()
- except requests.exceptions.ConnectionError as error:
- pyotherside.send('loginFacebook', fb_user_id.status_code)
- pyotherside.send('[DEBUG]', 'LOGIN FACEBOOK failed due Python Requests ERROR' + error)
- fb_user_id = fb_user_id['id']
- pyotherside.send("DEBUG", "OK, get Tinder ACCESS token, FB ID: " + fb_user_id)
- loginTinder(fb_user_id, fb_token)
-
-def loginTinder(fb_id, fb_token): #OK
- session.headers.update(constants.HEADERS)
- data = json.dumps({"facebook_id": str(fb_id),"facebook_token": fb_token})
- status_code, login = postTinder('/auth', data)
- evaluate_network(status_code)
- if 'token' not in login:
- pyotherside.send('loginTinder', False)
- #print 'FAIL'
- else:
- tinder_token = login['token']
- session.headers.update({"X-Auth-Token": str(tinder_token)})
- pyotherside.send('login', tinder_token, fb_token)
-
-def read_tinder_token():
- tinder_token = readFile('tinder.token')
- tinder_token = str(tinder_token[0])
- if len(tinder_token) > 5:
- session.headers.update(constants.HEADERS)
- session.headers.update({"X-Auth-Token": tinder_token})
- pyotherside.send('login', "FB long token:", tinder_token)
-
-def remove_tinder_token():
- deleteFile('tinder.token')
-
-def recommendations(): #OK
- data = json.dumps({"limit": 10})
- status_code, recommendations = postTinder('/user/recs', data)
- evaluate_network(status_code)
- format_recommendations(recommendations)
-
-def format_recommendations(recommendations):
- try:
- pyotherside.send('recommendations',recommendations['results'])
- except:
- try:
- pyotherside.send('recommendations',recommendations['message'])
- except:
- pyotherside.send('recommendations',recommendations)
-
-def like(personID): #OK
- data = json.dumps({})
- status_code, result = getTinder('/like/' + personID, data)
- evaluate_network(status_code)
- pyotherside.send('like', result)
-
-def dislike(personID): #OK
- data = json.dumps({})
- status_code, result = getTinder('/pass/' + personID, data)
- evaluate_network(status_code)
- pyotherside.send('dislike', result)
-
-def superlike(personID): #OK
- data = json.dumps({})
- status_code, result = getTinder('/like/' + personID +'/super', data)
- evaluate_network(status_code)
- try:
- if(result['super_likes']['remaining'] == 0):
- resets_in = result['super_likes']['resets_at']
- writeFile('superlike.txt', str(resets_in) + "\n", False, True)
- except:
- pass
- pyotherside.send('superlike', result)
-
-def matches(since): #OK
- if(since):
- matches = updates(since)['matches']
- else:
- matches = updates(False)['matches']
- return matches
-
-def report(userID, causeID): #OK
- data = json.dumps({"cause": causeID})
- status_code, result = postTinder('/report/' + userID, data)
- evaluate_network(status_code)
- pyotherside.send("REPORT_DEBUG", result)
-
-def unmatch(matchID): #OK
- data = json.dumps({})
- status_code, result = deleteTinder('/user/matches/' + matchID, data)
- evaluate_network(status_code)
- pyotherside.send('UNMATCH_DEBUG', result)
-
-def profile(): #OK
- data = json.dumps({}) # Get Tinder profile information
- status_code, profile = getTinder('/profile', data)
- evaluate_network(status_code)
- pyotherside.send('profile', profile)
-
- with open('profile/schools.json') as schools_data:
- schools = json.load(schools_data)
- pyotherside.send('schools', schools)
-
- with open('profile/jobs.json') as jobs_data:
- jobs = json.load(jobs_data)
- pyotherside.send('jobs', jobs)
-
-def update_profile(discoverable, age_min, age_max, gender, gender_filter, distance, bio): #OK
- data = json.dumps({"discoverable" : discoverable, "age_filter_min" : age_min, "age_filter_max" : age_max, "gender": gender, "gender_filter" : gender_filter, "distance_filter" : distance, "bio": bio})
- status_code, updated_profile = postTinder('/profile', data)
- evaluate_network(status_code)
- pyotherside.send('updated_profile', updated_profile)
-
-def delete_account():
- data = json.dumps({})
- status_code, result = deleteTinder('/profile', data)
- evaluate_network(status_code)
- pyotherside('delete_account', result)
-
-def update_schools(fb_school_id):
- data = json.dumps({"schools": [{"id": 115060918505077}]})
- status_code, schools = putTinder('/profile/school', data)
- evaluate_network(status_code)
- pyotherside.send('DEBUG', schools)
-
-def delete_schools():
- data = json.dumps({})
- status_code, schools = deleteTinder('/profile/school', data)
- evaluate_network(status_code)
- pyotherside.send('DEBUG', schools)
-
-def update_jobs(fb_job_id):
- data = json.dumps({"company": [{"id": fb_job_id}]})
- status_code, jobs = putTinder('/profile/job', data)
- evaluate_network(status_code)
- pyotherside.send('DEBUG', jobs)
-
-def delete_jobs():
- data = json.dumps({})
- status_code, jobs = deleteTinder('/profile/job', data)
- evaluate_network(status_code)
- pyotherside.send('DEBUG', jobs)
-
-def create_username(username): #OK
- data = json.dumps({"username": username})
- status_code, result = postTinder('/profile/username', data)
- evaluate_network(status_code)
- if(result):
- pyotherside.send('username', 1)
- else:
- pyotherside.send('username', False)
-
-def update_username(username): #OK
- data = json.dumps({"username": username})
- status_code, result = putTinder('/profile/username', data)
- evaluate_network(status_code)
- #{u'error': u'User has already registered a username'}
- #{u'error': u'User has no username to update'}
- if(result):
- pyotherside.send('username', 2)
- else:
- pyotherside.send('username', False)
-
-def delete_username(): #OK
- status_code, result = deleteTinder('/profile/username', None)
- evaluate_network(status_code)
- # {u'error': u'User has no username to remove'}
- if(result):
- pyotherside.send('username', 3)
- else:
- pyotherside.send('username', False)
-
-def share_link(tinder_user_id): #OK
- status_code, url = postTinder('/user/' + tinder_user_id + '/share', None)
- evaluate_network(status_code)
- #pyotherside.send('SHARE LINK HTTP CODE', status_code)
- pyotherside.send('sharelink', url)
-
-def updates(since): #OK
- if since:
- data = json.dumps({"last_activity_date:" : str(since)})
- status_code, updates = postTinder('/updates', data)
- evaluate_network(status_code)
- else:
- data = json.dumps({"last_activity_date:" : str(since)})
- status_code, updates = postTinder('/updates', data)
- evaluate_network(status_code)
- return updates
-
-def meta(): #NOT FOUND HTTP 404, LIKES REMAININGS SEE RESPONDS WHEN LIKE/DISLIKE/SUPERLIKE
-# data = json.dumps({})
-# meta = getTinder('/meta', data)
-# return meta
- return 'API deprecated'
-
-def update_location(lat, lon): #OK
- data = json.dumps({"lat": lat, "lon" : lon})
- status_code, location = postTinder('/user/ping', data)
- evaluate_network(status_code)
- pyotherside.send('location', True)
-
-def upload_picture(imageFile): #BROKEN HTTP 500
- pictures = uploadTinder(imageFile)
- return pictures
-
-def upload_fb_picture(fb_picture_id, ydistance_percent = 0, xdistance_percent = 0, yoffset_percent = 0, xoffset_percent = 0): #OK
- data = json.dumps({"transmit": "fb", "assets": [{"ydistance_percent": ydistance_percent,"id": fb_picture_id,"xoffset_percent": xoffset_percent,"yoffset_percent": yoffset_percent,"xdistance_percent": xdistance_percent}]})
- status_code, pictures = postTinder('/media', data)
- evaluate_network(status_code)
- return pictures
-
-def get_fb_albums():
- fb_albums_API_url = "https://graph.facebook.com/v2.6/" + fb_user_id + "/albums?access_token=" + fb_token #EAAGm0PX4ZCpsBAAWDgyqlZAUJiFoHeeOknxuxf5LLz7M97R66tnkE3ZASHubh76HoS1KQxOuFXM1UjqPpYA2bMhIdqBqlW9kxp14tPoSgY9ZABoZA2ZB48USTijQDqhEVYZCZBtkvO5dkYjyQme5SFGTDSDSZCptZAxN4ztqrTPva7WAZDZD "#"https://graph.facebook.com/v2.6/"+ str(548385795271621) + "/albums?access_token=" + fb_token
- fb_albums = requests.get(fb_albums_API_url)
- pyotherside.send('fb_albums', fb_albums.json())
-
-
-def get_fb_pictures(fb_album_id):
- #Get all pictures from our album & parse the JSON code
- fb_photos_API_url = "https://graph.facebook.com/v2.6/" + fb_album_id + "/photos?access_token=" + fb_token #EAAGm0PX4ZCpsBAAWDgyqlZAUJiFoHeeOknxuxf5LLz7M97R66tnkE3ZASHubh76HoS1KQxOuFXM1UjqPpYA2bMhIdqBqlW9kxp14tPoSgY9ZABoZA2ZB48USTijQDqhEVYZCZBtkvO5dkYjyQme5SFGTDSDSZCptZAxN4ztqrTPva7WAZDZD "#"https://graph.facebook.com/v2.6/"+ str(548385795271621) + "/albums?access_token=" + fb_token
- fb_photos = requests.get(fb_photos_API_url).json()
-
- #Parse JSON and get all the urls of those pictures & send them to QML
- for i in range(0, len(fb_photos['data'])):
- fb_photo_id = fb_photos['data'][i]['id']
- fb_photo_API_url = "https://graph.facebook.com/v2.6/" + fb_photo_id + "?fields=source&access_token=" + fb_token
- fb_photo = requests.get(fb_photo_API_url)
- pyotherside.send('fb_photos', fb_photo.json())
-
-def delete_picture(tinder_picture_id): #OK
- data = json.dumps({"assets": [tinder_picture_id]})
- status_code, pictures = deleteTinder('/media', data)
- evaluate_network(status_code)
- return pictures
-
-def send_message(message, match_id, gif=False, gif_id=""):
- if(gif):
- data = json.dumps({"type": "GIF", "message": message, "gif_id": gif_id})
- else:
- data = json.dumps({"message": message})
- status_code, result = postTinder('/user/matches/' + match_id, data)
- evaluate_network(status_code)
- pyotherside.send('gif', result, gif)
-
-def like_message(like, message_id):
- data = json.dumps({})
- tinder_token = readFile('tinder.token')
- tinder_token = str(tinder_token[0])
- if(like): #Uses a different type of request then the rest of the Tinder API
- result = requests.post(constants.TINDER_HOST + '/message/' + message_id + '/like', headers={"User-Agent": constants.USER_AGENT, "os_version": "90000000001", "app-version": "371", "platform": "android", "Content-type":"text/plain", "X-Auth-Token": str(tinder_token)}, data=data) #postTinder('/message/' + message_id + '/like', data) #Like
- else:
- result = requests.delete(constants.TINDER_HOST + '/message/' + message_id + '/like', headers={"User-Agent": constants.USER_AGENT, "os_version": "90000000001", "app-version": "371", "platform": "android", "X-Auth-Token": str(tinder_token)}) #postTinder('/message/' + message_id + '/like', data) #Dislike
- pyotherside.send('message_like', result.status_code)
-
-def get_gifs(search_word='Supergirl'):
- gifs = giphy.search(search_word)
- pyotherside.send('gifs', gifs)
-
-"""
-@title: Sailfinder FB functions
-@description: Interact with the Facebook API to download several items for photo upload, ...
-
-@author: Dylan Van Assche
-"""
-
-def get_fb_schools():
- fb_schools_API_url = "https://graph.facebook.com/v2.6/me?fields=education&access_token=" + fb_token
- fb_schools = requests.get(fb_schools_API_url).json()
- fb_schools = json.dumps(fb_schools)
- writeFile('profile/schools.json', fb_schools, False, True)
-
-def get_fb_jobs():
- fb_jobs_API_url = "https://graph.facebook.com/v2.6/me?fields=work&access_token=" + fb_token
- fb_jobs = requests.get(fb_jobs_API_url).json()
- fb_jobs = json.dumps(fb_jobs)
- writeFile('profile/jobs.json', fb_jobs, False, True)
-
-"""
-@title: Sailfinder helper functions
-@description: Sailfinder functions to interact with the Sailfinder API & QML
-
-@author: Dylan Van Assche
-"""
-
-def init_files():
- homeDir = os.path.expanduser("~")
- os.chdir(homeDir + "/.config/")
- if not os.path.exists("harbour-sailfinder/settings/"):
- os.makedirs("harbour-sailfinder/settings/")
-
- if not os.path.exists("harbour-sailfinder/profile/"):
- os.makedirs("harbour-sailfinder/profile/")
-
- # Search for settings.cfg -> depends on Sailfinder version
- if not os.path.isfile("harbour-sailfinder/settings/settings.json"):
- File = open("harbour-sailfinder/settings/settings.json", "w")
- data = {
- 'version': file_version,
- 'bio': '1',
- 'school': '1',
- 'job': '1',
- 'instagram': '1'
- }
- data = json.dumps(data)
- File.write(data)
- File.close()
- else:
- with open('harbour-sailfinder/settings/settings.json') as settings_data:
- settings = json.load(settings_data)
- version = settings['version']
-
- if not version == file_version:
- File = open("harbour-sailfinder/settings/settings.json", "w")
- data = {
- 'version': file_version,
- 'bio': '1',
- 'school': '1',
- 'job': '1',
- 'instagram': '1'
- }
- data = json.dumps(data)
- File.write(data)
- File.close()
-
- # Search for tinder.token
- if not os.path.isfile("harbour-sailfinder/tinder.token"):
- File = open("harbour-sailfinder/tinder.token", "w")
- File.write("N/A\n")
- File.close()
-
- # Search for superlikes.txt
- if not os.path.isfile("harbour-sailfinder/superlike.txt"):
- File = open("harbour-sailfinder/superlike.txt", "w")
- File.write("1970-01-01T00:00:00.000Z\n")
- File.close()
-
- # Search for schools.json
- if not os.path.isfile("harbour-sailfinder/profile/schools.json"):
- File = open("harbour-sailfinder/profile/schools.json", "w")
- File.write("N/A\n")
- File.close()
-
- # Search for jobs.json
- if not os.path.isfile("harbour-sailfinder/profile/jobs.json"):
- File = open("harbour-sailfinder/profile/jobs.json", "w")
- File.write("N/A\n")
- File.close()
-
-def writeFile(path, data, version, close): #filepath, data to write, keep version number or not, close file?
- try:
- homeDir = os.path.expanduser("~")
- os.chdir(homeDir + "/.config/harbour-sailfinder")
- File = open(path, 'w')
- if version:
- File.write(file_version +"\n")
- File.write(data)
- if close:
- File.close()
- except:
- return False
-
-def readFile(path):
- homeDir = os.path.expanduser("~")
- os.chdir(homeDir + "/.config/harbour-sailfinder")
- File = open(path, 'r')
- data = File.readlines()
- File.close()
- return data
-
-def deleteFile(path):
- homeDir = os.path.expanduser("~")
- os.chdir(homeDir + "/.config/harbour-sailfinder")
- os.remove(path)
-
-def get_settings():
- homeDir = os.path.expanduser("~")
- os.chdir(homeDir + "/.config/harbour-sailfinder")
- with open('settings/settings.json') as settings_data:
- settings = json.load(settings_data)
- pyotherside.send('settings', settings)
-
-def save_settings(bio, school, job, instagram):
- homeDir = os.path.expanduser("~")
- os.chdir(homeDir + "/.config/harbour-sailfinder")
- File = open("settings/settings.json", "w")
- data = {
- 'version': file_version,
- 'bio': bio,
- 'school': school,
- 'job': job,
- 'instagram': instagram
- }
- data = json.dumps(data)
- File.write(data)
- File.close()
-
-def people():
- try:
- homeDir = os.path.expanduser("~")
- os.chdir(homeDir + "/.config/harbour-sailfinder")
- cacheFile = open("cache/matches.cache", 'r')
- data = cacheFile.readlines()
- cacheFile.close()
- except:
- matchesData = matches(last_active)
- pyotherside.send('matches', matchesData)
-
-def last_activity(last_activity_ISO_format):
- global last_active
- if(len(last_activity_ISO_format)):
- last_active = last_activity_ISO_format
- writeFile('last_active.txt', last_active, False, True)
- else:
- try:
- data = readFile('last_active.txt')
- pyotherside.send('last_active', data)
- except:
- pyotherside.send('last_active', '')
-
-def superlike_available():
- superlike_reset_time = readFile('superlike.txt')
- superlike_reset_time = str(superlike_reset_time[0])
- pyotherside.send('superlike_available', superlike_reset_time)
-
-def evaluate_network(status_code):
- status_code = int(status_code)
- if(status_code == constants.HTTP_NOT_RESPONDING or status_code == constants.HTTP_DENIED or status_code == constants.HTTP_NOT_FULLFILL):
- pyotherside.send('network_status', status_code)
diff --git a/docs/harbour-sailfinder/qml/pages/js/helper.js b/docs/harbour-sailfinder/qml/pages/js/helper.js
deleted file mode 100644
index 8a744e2..0000000
--- a/docs/harbour-sailfinder/qml/pages/js/helper.js
+++ /dev/null
@@ -1,118 +0,0 @@
-function calculate_age(birth_date)
-{
- var birth_date_array = birth_date.split('-')
- var birth_year = parseInt(birth_date_array[0]) // year
- var birth_month = parseInt(birth_date_array[1]) // month
- birth_date_array = birth_date_array[2].split('T')
- var birth_day = parseInt(birth_date_array[0]) // day
- var today_date = new Date();
- var today_year = today_date.getFullYear();
- var today_month = today_date.getMonth();
- var today_day = today_date.getDate();
- var difference_years = today_year - birth_year;
-
- if ( today_month < (birth_month - 1))
- {
- difference_years--;
- }
- if (((birth_month - 1) == today_month) && (today_day < birth_day))
- {
- difference_years--;
- }
- return difference_years;
-}
-
-function time_difference(last_message_date, last_activity_date)
-{
- var msg_date = new Date(last_message_date)
- var activity_date = new Date(last_activity_date)
-
- if(msg_date.getTime() > activity_date.getTime())
- {
- return true
- }
- else
- {
- return false
- }
-}
-
-function calculate_last_seen(last_activity_date)
-{
- var now_date = new Date()
- var last_active_date = new Date(last_activity_date)
- now_date = now_date.getTime()
- last_active_date = last_active_date.getTime()
- var difference = now_date - last_active_date
-
- if(difference > (24*60*60*1000)) // More then 24 hours
- {
- var days = difference/(24*60*60*1000)
- days = parseInt(days)
-
- if(days > 7) // More then 7 days? return the date
- {
- var date = new Date(last_activity_date)
- return date.getDate() + '-' + date.getMonth() + '-' + date.getFullYear()
- }
- else
- {
- if(days != 1)
- {
- return days + qsTr(" days ago")
- }
- else
- {
- return days + qsTr(" day ago")
- }
- }
- }
- else if(difference >= (60*60*1000))
- {
- var hours = difference/(60*60*1000)
- hours = parseInt(hours)
- if(hours != 1)
- {
- return hours + qsTr(" hours ago")
- }
- else
- {
- return hours + qsTr(" hour ago")
- }
- }
- else if(difference >= (60*1000))
- {
- var minutes = difference/(60*1000)
- minutes = parseInt(minutes)
- if(minutes != 1)
- {
- return minutes + qsTr(" minutes ago")
- }
- else
- {
- return minutes + qsTr(" minute ago")
- }
- }
- else
- {
- return qsTr("just now")
- }
-}
-
-function superlike_reseted(superlike_reset_time)
-{
- var now_date = new Date()
- var superlike_reset_date = new Date(superlike_reset_time)
- now_date = now_date.getTime()
- superlike_reset_date = superlike_reset_date.getTime()
- var difference = now_date - superlike_reset_date
-
- if(difference > 0)
- {
- return false
- }
- else
- {
- return true
- }
-}
diff --git a/docs/harbour-sailfinder/qml/pages/lib/__init__.py b/docs/harbour-sailfinder/qml/pages/lib/__init__.py
deleted file mode 100644
index 8bdc3b8..0000000
--- a/docs/harbour-sailfinder/qml/pages/lib/__init__.py
+++ /dev/null
@@ -1,8 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-Created on Sat Aug 6 10:52:34 2016
-
-@author: Dylan Van Assche
-@title: Init lib module for Sailfinder
-@description: The lib module holds all the Python modules used by Sailfinder. They are already precompiled on Python3.4 (Sailfish OS) since 'pip install' is not allowed by the Jolla Harbour specifications.
-"""
diff --git a/docs/harbour-sailfinder/qml/pages/lib/bs4/1631353.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/bs4/1631353.cpython-34.pyc
deleted file mode 100644
index 3fbeb33..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/bs4/1631353.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/bs4/__init__.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/bs4/__init__.cpython-34.pyc
deleted file mode 100644
index a8a67ff..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/bs4/__init__.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/bs4/builder/__init__.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/bs4/builder/__init__.cpython-34.pyc
deleted file mode 100644
index e213c24..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/bs4/builder/__init__.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/bs4/builder/_html5lib.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/bs4/builder/_html5lib.cpython-34.pyc
deleted file mode 100644
index e68c518..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/bs4/builder/_html5lib.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/bs4/builder/_htmlparser.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/bs4/builder/_htmlparser.cpython-34.pyc
deleted file mode 100644
index 92f4fc3..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/bs4/builder/_htmlparser.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/bs4/builder/_lxml.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/bs4/builder/_lxml.cpython-34.pyc
deleted file mode 100644
index 8b937cf..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/bs4/builder/_lxml.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/bs4/dammit.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/bs4/dammit.cpython-34.pyc
deleted file mode 100644
index 71d1b02..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/bs4/dammit.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/bs4/diagnose.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/bs4/diagnose.cpython-34.pyc
deleted file mode 100644
index 7d3b61e..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/bs4/diagnose.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/bs4/element.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/bs4/element.cpython-34.pyc
deleted file mode 100644
index b3fe182..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/bs4/element.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/bs4/testing.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/bs4/testing.cpython-34.pyc
deleted file mode 100644
index c0cd9af..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/bs4/testing.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/bs4/tests/__init__.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/bs4/tests/__init__.cpython-34.pyc
deleted file mode 100644
index 2ce16e7..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/bs4/tests/__init__.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/bs4/tests/test_builder_registry.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/bs4/tests/test_builder_registry.cpython-34.pyc
deleted file mode 100644
index aad12a7..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/bs4/tests/test_builder_registry.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/bs4/tests/test_docs.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/bs4/tests/test_docs.cpython-34.pyc
deleted file mode 100644
index 0821b8e..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/bs4/tests/test_docs.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/bs4/tests/test_html5lib.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/bs4/tests/test_html5lib.cpython-34.pyc
deleted file mode 100644
index f663a1b..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/bs4/tests/test_html5lib.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/bs4/tests/test_htmlparser.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/bs4/tests/test_htmlparser.cpython-34.pyc
deleted file mode 100644
index 3b77ba2..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/bs4/tests/test_htmlparser.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/bs4/tests/test_lxml.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/bs4/tests/test_lxml.cpython-34.pyc
deleted file mode 100644
index adcecfa..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/bs4/tests/test_lxml.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/bs4/tests/test_soup.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/bs4/tests/test_soup.cpython-34.pyc
deleted file mode 100644
index 3595135..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/bs4/tests/test_soup.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/bs4/tests/test_tree.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/bs4/tests/test_tree.cpython-34.pyc
deleted file mode 100644
index af001f1..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/bs4/tests/test_tree.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/constants.py b/docs/harbour-sailfinder/qml/pages/lib/constants.py
deleted file mode 100644
index c272e3d..0000000
--- a/docs/harbour-sailfinder/qml/pages/lib/constants.py
+++ /dev/null
@@ -1,33 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-@title: Sailfinder API constants
-@description: Helper file for the API of Sailfinder to connect with the Tinder servers
-
-@author: Dylan Van Assche
-"""
-
-TINDER_HOST = "https://api.gotinder.com"
-TINDER_IMAGE_HOST = "https://imageupload.gotinder.com"
-
-USER_AGENT = 'Tinder/4.6.1 (iPhone; iOS 9.0.1; Scale/2.00)'
-
-HEADERS = {
- "User-Agent": USER_AGENT,
- "os_version": "90000000001",
- "app-version": "371",
- "platform": "android", # XXX with ios we run in an error
- "Content-type": "application/json; charset=utf-8"
-}
-
-GIPHY_SEARCH_HOST = "http://api.giphy.com/v1/gifs/search?q="
-GIPHY_KEY = "&api_key=fBEDuhnVCiP16" # Tinder Giphy API key
-
-HTTP_NOT_RESPONDING = 444
-HTTP_OK = 200
-HTTP_DENIED = 500
-HTTP_NOT_FOUND = 404
-HTTP_NOT_FULLFILL = 403
-
-MOBILE_USER_AGENT = "Mozilla/5.0 (Linux; U; en-gb; KFTHWI Build/JDQ39) AppleWebKit/535.19 (KHTML, like Gecko) Silk/3.16 Safari/535.19"
-FB_AUTH = "https://www.facebook.com/v2.6/dialog/oauth?redirect_uri=fb464891386855067%3A%2F%2Fauthorize%2F&display=touch&state=%7B%22challenge%22%3A%22IUUkEUqIGud332lfu%252BMJhxL4Wlc%253D%22%2C%220_auth_logger_id%22%3A%2230F06532-A1B9-4B10-BB28-B29956C71AB1%22%2C%22com.facebook.sdk_client_state%22%3Atrue%2C%223_method%22%3A%22sfvc_auth%22%7D&scope=user_birthday%2Cuser_photos%2Cuser_education_history%2Cemail%2Cuser_relationship_details%2Cuser_friends%2Cuser_work_history%2Cuser_likes&response_type=token%2Csigned_request&default_audience=friends&return_scopes=true&auth_type=rerequest&client_id=464891386855067&ret=login&sdk=ios&logger_id=30F06532-A1B9-4B10-BB28-B29956C71AB1&ext=1470840777&hash=AeZqkIcf-NEW6vBd"
-
diff --git a/docs/harbour-sailfinder/qml/pages/lib/giphy.py b/docs/harbour-sailfinder/qml/pages/lib/giphy.py
deleted file mode 100644
index 3fed6cd..0000000
--- a/docs/harbour-sailfinder/qml/pages/lib/giphy.py
+++ /dev/null
@@ -1,18 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-@title: Giphy API
-@description: API for Giphy to fetch GIFs for Sailfinder
-
-@author: Dylan Van Assche
-"""
-
-import requests
-import constants
-
-def search(search_word):
- try:
- search_word = search_word.replace(" ", "+") #Confirm with the Giphy API
- gifs = requests.get(constants.GIPHY_SEARCH_HOST + search_word + constants.GIPHY_KEY).json()
- return constants.HTTP_OK, gifs
- except:
- return constants.GIPHY_SEARCH_HOST + search_word + constants.GIPHY_KEY, False
diff --git a/docs/harbour-sailfinder/qml/pages/lib/network.py b/docs/harbour-sailfinder/qml/pages/lib/network.py
deleted file mode 100644
index a64a222..0000000
--- a/docs/harbour-sailfinder/qml/pages/lib/network.py
+++ /dev/null
@@ -1,44 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-@title: Sailfinder network manager
-@description: Monitors the network status on your Sailfish OS device
-
-@author: Dylan Van Assche
-"""
-
-import pyotherside
-import os
-
-def connection(python=False):
- os.chdir("/run/state/providers/connman/Internet/") #Connman state DIR
-
- File = open("NetworkState", 'r') # Read network state
- connection_status = File.readlines()
- File.close()
-
- File = open("NetworkType", 'r') # Read network type
- connection_type = File.readlines()
- File.close()
-
- File = open("SignalStrength", 'r') # Read network signal strength
- signal_strength = File.readlines()
- File.close()
-
- File = open("NetworkName", 'r') # Read network name
- connection_name = File.readlines()
- File.close()
-
- homeDir = os.path.expanduser("~")
- os.chdir(homeDir + "/.config/harbour-sailfinder")
-
- # When we call this function from within Python code we only need to return the status of our connection as a boolean
- if(python):
- if(connection_status[0] == "connected"):
- return True
- else:
- return False
- else:
- pyotherside.send('network', connection_status, connection_type, connection_name, signal_strength)
-
-def launch_SFOS_connection_dialog():
- os.system("dbus-send --print-reply --type=method_call --dest=com.jolla.lipstick.ConnectionSelector / com.jolla.lipstick.ConnectionSelectorIf.openConnection string:")
diff --git a/docs/harbour-sailfinder/qml/pages/lib/requests/__init__.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/requests/__init__.cpython-34.pyc
deleted file mode 100644
index 4b4e235..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/requests/__init__.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/requests/_internal_utils.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/requests/_internal_utils.cpython-34.pyc
deleted file mode 100644
index 4640f35..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/requests/_internal_utils.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/requests/adapters.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/requests/adapters.cpython-34.pyc
deleted file mode 100644
index 030b1d2..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/requests/adapters.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/requests/api.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/requests/api.cpython-34.pyc
deleted file mode 100644
index 467267d..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/requests/api.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/requests/auth.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/requests/auth.cpython-34.pyc
deleted file mode 100644
index 82149d3..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/requests/auth.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/requests/certs.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/requests/certs.cpython-34.pyc
deleted file mode 100644
index 8a16dc0..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/requests/certs.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/requests/compat.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/requests/compat.cpython-34.pyc
deleted file mode 100644
index 789f7b3..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/requests/compat.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/requests/cookies.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/requests/cookies.cpython-34.pyc
deleted file mode 100644
index ddb3345..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/requests/cookies.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/requests/exceptions.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/requests/exceptions.cpython-34.pyc
deleted file mode 100644
index 3b11a7a..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/requests/exceptions.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/requests/hooks.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/requests/hooks.cpython-34.pyc
deleted file mode 100644
index 565051c..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/requests/hooks.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/requests/models.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/requests/models.cpython-34.pyc
deleted file mode 100644
index b958cc6..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/requests/models.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/__init__.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/requests/packages/__init__.cpython-34.pyc
deleted file mode 100644
index 70a09cb..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/__init__.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/__init__.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/__init__.cpython-34.pyc
deleted file mode 100644
index 6e75ea1..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/__init__.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/big5freq.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/big5freq.cpython-34.pyc
deleted file mode 100644
index 05cf00e..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/big5freq.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/big5prober.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/big5prober.cpython-34.pyc
deleted file mode 100644
index 891b608..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/big5prober.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/chardetect.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/chardetect.cpython-34.pyc
deleted file mode 100644
index e9408ce..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/chardetect.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/chardistribution.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/chardistribution.cpython-34.pyc
deleted file mode 100644
index 451642e..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/chardistribution.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/charsetgroupprober.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/charsetgroupprober.cpython-34.pyc
deleted file mode 100644
index f7bbafb..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/charsetgroupprober.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/charsetprober.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/charsetprober.cpython-34.pyc
deleted file mode 100644
index 26cdaed..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/charsetprober.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/codingstatemachine.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/codingstatemachine.cpython-34.pyc
deleted file mode 100644
index 5e8c42d..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/codingstatemachine.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/compat.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/compat.cpython-34.pyc
deleted file mode 100644
index 900e638..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/compat.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/constants.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/constants.cpython-34.pyc
deleted file mode 100644
index 047eaab..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/constants.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/cp949prober.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/cp949prober.cpython-34.pyc
deleted file mode 100644
index 3ffe08e..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/cp949prober.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/escprober.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/escprober.cpython-34.pyc
deleted file mode 100644
index 0f30709..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/escprober.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/escsm.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/escsm.cpython-34.pyc
deleted file mode 100644
index f940026..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/escsm.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/eucjpprober.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/eucjpprober.cpython-34.pyc
deleted file mode 100644
index c6b9d13..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/eucjpprober.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/euckrfreq.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/euckrfreq.cpython-34.pyc
deleted file mode 100644
index 7836fa7..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/euckrfreq.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/euckrprober.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/euckrprober.cpython-34.pyc
deleted file mode 100644
index b0654e7..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/euckrprober.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/euctwfreq.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/euctwfreq.cpython-34.pyc
deleted file mode 100644
index 7c6a4bb..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/euctwfreq.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/euctwprober.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/euctwprober.cpython-34.pyc
deleted file mode 100644
index a26c5b4..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/euctwprober.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/gb2312freq.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/gb2312freq.cpython-34.pyc
deleted file mode 100644
index 570c6a3..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/gb2312freq.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/gb2312prober.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/gb2312prober.cpython-34.pyc
deleted file mode 100644
index 5addce6..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/gb2312prober.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/hebrewprober.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/hebrewprober.cpython-34.pyc
deleted file mode 100644
index d7b3a55..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/hebrewprober.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/jisfreq.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/jisfreq.cpython-34.pyc
deleted file mode 100644
index cbf15a0..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/jisfreq.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/jpcntx.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/jpcntx.cpython-34.pyc
deleted file mode 100644
index 53f326d..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/jpcntx.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/langbulgarianmodel.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/langbulgarianmodel.cpython-34.pyc
deleted file mode 100644
index 7df072d..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/langbulgarianmodel.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/langcyrillicmodel.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/langcyrillicmodel.cpython-34.pyc
deleted file mode 100644
index fc329c6..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/langcyrillicmodel.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/langgreekmodel.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/langgreekmodel.cpython-34.pyc
deleted file mode 100644
index fcd5ea0..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/langgreekmodel.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/langhebrewmodel.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/langhebrewmodel.cpython-34.pyc
deleted file mode 100644
index a4ec179..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/langhebrewmodel.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/langhungarianmodel.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/langhungarianmodel.cpython-34.pyc
deleted file mode 100644
index 6973c21..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/langhungarianmodel.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/langthaimodel.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/langthaimodel.cpython-34.pyc
deleted file mode 100644
index 564c63d..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/langthaimodel.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/latin1prober.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/latin1prober.cpython-34.pyc
deleted file mode 100644
index 9efd03f..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/latin1prober.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/mbcharsetprober.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/mbcharsetprober.cpython-34.pyc
deleted file mode 100644
index 656aff0..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/mbcharsetprober.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/mbcsgroupprober.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/mbcsgroupprober.cpython-34.pyc
deleted file mode 100644
index f2cce0c..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/mbcsgroupprober.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/mbcssm.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/mbcssm.cpython-34.pyc
deleted file mode 100644
index 896f312..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/mbcssm.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/sbcharsetprober.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/sbcharsetprober.cpython-34.pyc
deleted file mode 100644
index 675defc..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/sbcharsetprober.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/sbcsgroupprober.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/sbcsgroupprober.cpython-34.pyc
deleted file mode 100644
index 8c0f30f..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/sbcsgroupprober.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/sjisprober.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/sjisprober.cpython-34.pyc
deleted file mode 100644
index 8fb311b..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/sjisprober.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/universaldetector.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/universaldetector.cpython-34.pyc
deleted file mode 100644
index a13aa49..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/universaldetector.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/utf8prober.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/utf8prober.cpython-34.pyc
deleted file mode 100644
index 98c0359..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/chardet/utf8prober.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/idna/__init__.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/requests/packages/idna/__init__.cpython-34.pyc
deleted file mode 100644
index e06dec0..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/idna/__init__.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/idna/codec.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/requests/packages/idna/codec.cpython-34.pyc
deleted file mode 100644
index 856c108..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/idna/codec.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/idna/compat.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/requests/packages/idna/compat.cpython-34.pyc
deleted file mode 100644
index 60c1fa9..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/idna/compat.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/idna/core.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/requests/packages/idna/core.cpython-34.pyc
deleted file mode 100644
index 74ea6a2..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/idna/core.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/idna/idnadata.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/requests/packages/idna/idnadata.cpython-34.pyc
deleted file mode 100644
index 22081e8..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/idna/idnadata.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/idna/intranges.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/requests/packages/idna/intranges.cpython-34.pyc
deleted file mode 100644
index 56361a3..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/idna/intranges.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/idna/uts46data.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/requests/packages/idna/uts46data.cpython-34.pyc
deleted file mode 100644
index 24d8694..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/idna/uts46data.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/urllib3/__init__.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/requests/packages/urllib3/__init__.cpython-34.pyc
deleted file mode 100644
index a5134d0..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/urllib3/__init__.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/urllib3/_collections.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/requests/packages/urllib3/_collections.cpython-34.pyc
deleted file mode 100644
index 215a373..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/urllib3/_collections.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/urllib3/connection.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/requests/packages/urllib3/connection.cpython-34.pyc
deleted file mode 100644
index 7f281b5..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/urllib3/connection.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/urllib3/connectionpool.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/requests/packages/urllib3/connectionpool.cpython-34.pyc
deleted file mode 100644
index 4fa3a7a..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/urllib3/connectionpool.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/urllib3/contrib/__init__.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/requests/packages/urllib3/contrib/__init__.cpython-34.pyc
deleted file mode 100644
index 1ddbdd8..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/urllib3/contrib/__init__.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/urllib3/contrib/appengine.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/requests/packages/urllib3/contrib/appengine.cpython-34.pyc
deleted file mode 100644
index 6288e05..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/urllib3/contrib/appengine.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/urllib3/contrib/ntlmpool.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/requests/packages/urllib3/contrib/ntlmpool.cpython-34.pyc
deleted file mode 100644
index a692655..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/urllib3/contrib/ntlmpool.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/urllib3/contrib/pyopenssl.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/requests/packages/urllib3/contrib/pyopenssl.cpython-34.pyc
deleted file mode 100644
index 5ec6858..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/urllib3/contrib/pyopenssl.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/urllib3/contrib/socks.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/requests/packages/urllib3/contrib/socks.cpython-34.pyc
deleted file mode 100644
index 558666f..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/urllib3/contrib/socks.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/urllib3/exceptions.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/requests/packages/urllib3/exceptions.cpython-34.pyc
deleted file mode 100644
index 0b5174c..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/urllib3/exceptions.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/urllib3/fields.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/requests/packages/urllib3/fields.cpython-34.pyc
deleted file mode 100644
index f7b344e..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/urllib3/fields.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/urllib3/filepost.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/requests/packages/urllib3/filepost.cpython-34.pyc
deleted file mode 100644
index e55e0a5..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/urllib3/filepost.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/urllib3/packages/__init__.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/requests/packages/urllib3/packages/__init__.cpython-34.pyc
deleted file mode 100644
index 62ccfbe..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/urllib3/packages/__init__.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/urllib3/packages/backports/__init__.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/requests/packages/urllib3/packages/backports/__init__.cpython-34.pyc
deleted file mode 100644
index eb01224..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/urllib3/packages/backports/__init__.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/urllib3/packages/backports/makefile.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/requests/packages/urllib3/packages/backports/makefile.cpython-34.pyc
deleted file mode 100644
index 2217828..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/urllib3/packages/backports/makefile.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/urllib3/packages/ordered_dict.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/requests/packages/urllib3/packages/ordered_dict.cpython-34.pyc
deleted file mode 100644
index b8ecc19..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/urllib3/packages/ordered_dict.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/urllib3/packages/six.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/requests/packages/urllib3/packages/six.cpython-34.pyc
deleted file mode 100644
index d3c82a5..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/urllib3/packages/six.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/urllib3/packages/ssl_match_hostname/__init__.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/requests/packages/urllib3/packages/ssl_match_hostname/__init__.cpython-34.pyc
deleted file mode 100644
index b310cc5..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/urllib3/packages/ssl_match_hostname/__init__.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/urllib3/packages/ssl_match_hostname/_implementation.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/requests/packages/urllib3/packages/ssl_match_hostname/_implementation.cpython-34.pyc
deleted file mode 100644
index 21c75f2..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/urllib3/packages/ssl_match_hostname/_implementation.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/urllib3/poolmanager.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/requests/packages/urllib3/poolmanager.cpython-34.pyc
deleted file mode 100644
index 30f55cf..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/urllib3/poolmanager.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/urllib3/request.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/requests/packages/urllib3/request.cpython-34.pyc
deleted file mode 100644
index f1f619b..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/urllib3/request.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/urllib3/response.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/requests/packages/urllib3/response.cpython-34.pyc
deleted file mode 100644
index c3b3580..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/urllib3/response.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/urllib3/util/__init__.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/requests/packages/urllib3/util/__init__.cpython-34.pyc
deleted file mode 100644
index d4327a4..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/urllib3/util/__init__.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/urllib3/util/connection.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/requests/packages/urllib3/util/connection.cpython-34.pyc
deleted file mode 100644
index 851ad2f..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/urllib3/util/connection.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/urllib3/util/request.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/requests/packages/urllib3/util/request.cpython-34.pyc
deleted file mode 100644
index 6850985..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/urllib3/util/request.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/urllib3/util/response.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/requests/packages/urllib3/util/response.cpython-34.pyc
deleted file mode 100644
index 1e8417c..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/urllib3/util/response.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/urllib3/util/retry.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/requests/packages/urllib3/util/retry.cpython-34.pyc
deleted file mode 100644
index 55765ba..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/urllib3/util/retry.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/urllib3/util/ssl_.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/requests/packages/urllib3/util/ssl_.cpython-34.pyc
deleted file mode 100644
index 4a9794a..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/urllib3/util/ssl_.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/urllib3/util/timeout.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/requests/packages/urllib3/util/timeout.cpython-34.pyc
deleted file mode 100644
index 256587e..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/urllib3/util/timeout.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/urllib3/util/url.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/requests/packages/urllib3/util/url.cpython-34.pyc
deleted file mode 100644
index ca28173..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/requests/packages/urllib3/util/url.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/requests/sessions.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/requests/sessions.cpython-34.pyc
deleted file mode 100644
index 33bd6e2..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/requests/sessions.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/requests/status_codes.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/requests/status_codes.cpython-34.pyc
deleted file mode 100644
index 82d664d..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/requests/status_codes.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/requests/structures.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/requests/structures.cpython-34.pyc
deleted file mode 100644
index e2d400a..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/requests/structures.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/requests/utils.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/requests/utils.cpython-34.pyc
deleted file mode 100644
index a06404d..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/requests/utils.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/__init__.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/werkzeug/__init__.cpython-34.pyc
deleted file mode 100644
index cfbeebf..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/__init__.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/_compat.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/werkzeug/_compat.cpython-34.pyc
deleted file mode 100644
index 5984f86..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/_compat.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/_internal.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/werkzeug/_internal.cpython-34.pyc
deleted file mode 100644
index 8646169..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/_internal.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/_reloader.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/werkzeug/_reloader.cpython-34.pyc
deleted file mode 100644
index b5ee2ac..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/_reloader.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/contrib/__init__.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/werkzeug/contrib/__init__.cpython-34.pyc
deleted file mode 100644
index 9fd0458..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/contrib/__init__.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/contrib/atom.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/werkzeug/contrib/atom.cpython-34.pyc
deleted file mode 100644
index e0d59a7..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/contrib/atom.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/contrib/cache.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/werkzeug/contrib/cache.cpython-34.pyc
deleted file mode 100644
index 3755545..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/contrib/cache.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/contrib/fixers.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/werkzeug/contrib/fixers.cpython-34.pyc
deleted file mode 100644
index 30d38d6..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/contrib/fixers.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/contrib/iterio.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/werkzeug/contrib/iterio.cpython-34.pyc
deleted file mode 100644
index 07e1ad4..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/contrib/iterio.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/contrib/jsrouting.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/werkzeug/contrib/jsrouting.cpython-34.pyc
deleted file mode 100644
index fc11372..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/contrib/jsrouting.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/contrib/limiter.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/werkzeug/contrib/limiter.cpython-34.pyc
deleted file mode 100644
index dfd0f1f..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/contrib/limiter.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/contrib/lint.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/werkzeug/contrib/lint.cpython-34.pyc
deleted file mode 100644
index 4be8e47..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/contrib/lint.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/contrib/profiler.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/werkzeug/contrib/profiler.cpython-34.pyc
deleted file mode 100644
index 2bae411..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/contrib/profiler.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/contrib/securecookie.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/werkzeug/contrib/securecookie.cpython-34.pyc
deleted file mode 100644
index 49c7acb..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/contrib/securecookie.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/contrib/sessions.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/werkzeug/contrib/sessions.cpython-34.pyc
deleted file mode 100644
index 1c2217c..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/contrib/sessions.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/contrib/testtools.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/werkzeug/contrib/testtools.cpython-34.pyc
deleted file mode 100644
index 81ab046..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/contrib/testtools.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/contrib/wrappers.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/werkzeug/contrib/wrappers.cpython-34.pyc
deleted file mode 100644
index a8ac424..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/contrib/wrappers.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/datastructures.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/werkzeug/datastructures.cpython-34.pyc
deleted file mode 100644
index 89488fe..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/datastructures.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/debug/__init__.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/werkzeug/debug/__init__.cpython-34.pyc
deleted file mode 100644
index f7de050..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/debug/__init__.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/debug/console.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/werkzeug/debug/console.cpython-34.pyc
deleted file mode 100644
index 67313bd..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/debug/console.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/debug/repr.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/werkzeug/debug/repr.cpython-34.pyc
deleted file mode 100644
index a5fb57d..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/debug/repr.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/debug/shared/FONT_LICENSE b/docs/harbour-sailfinder/qml/pages/lib/werkzeug/debug/shared/FONT_LICENSE
deleted file mode 100644
index ae78a8f..0000000
--- a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/debug/shared/FONT_LICENSE
+++ /dev/null
@@ -1,96 +0,0 @@
--------------------------------
-UBUNTU FONT LICENCE Version 1.0
--------------------------------
-
-PREAMBLE
-This licence allows the licensed fonts to be used, studied, modified and
-redistributed freely. The fonts, including any derivative works, can be
-bundled, embedded, and redistributed provided the terms of this licence
-are met. The fonts and derivatives, however, cannot be released under
-any other licence. The requirement for fonts to remain under this
-licence does not require any document created using the fonts or their
-derivatives to be published under this licence, as long as the primary
-purpose of the document is not to be a vehicle for the distribution of
-the fonts.
-
-DEFINITIONS
-"Font Software" refers to the set of files released by the Copyright
-Holder(s) under this licence and clearly marked as such. This may
-include source files, build scripts and documentation.
-
-"Original Version" refers to the collection of Font Software components
-as received under this licence.
-
-"Modified Version" refers to any derivative made by adding to, deleting,
-or substituting -- in part or in whole -- any of the components of the
-Original Version, by changing formats or by porting the Font Software to
-a new environment.
-
-"Copyright Holder(s)" refers to all individuals and companies who have a
-copyright ownership of the Font Software.
-
-"Substantially Changed" refers to Modified Versions which can be easily
-identified as dissimilar to the Font Software by users of the Font
-Software comparing the Original Version with the Modified Version.
-
-To "Propagate" a work means to do anything with it that, without
-permission, would make you directly or secondarily liable for
-infringement under applicable copyright law, except executing it on a
-computer or modifying a private copy. Propagation includes copying,
-distribution (with or without modification and with or without charging
-a redistribution fee), making available to the public, and in some
-countries other activities as well.
-
-PERMISSION & CONDITIONS
-This licence does not grant any rights under trademark law and all such
-rights are reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a
-copy of the Font Software, to propagate the Font Software, subject to
-the below conditions:
-
-1) Each copy of the Font Software must contain the above copyright
-notice and this licence. These can be included either as stand-alone
-text files, human-readable headers or in the appropriate machine-
-readable metadata fields within text or binary files as long as those
-fields can be easily viewed by the user.
-
-2) The font name complies with the following:
-(a) The Original Version must retain its name, unmodified.
-(b) Modified Versions which are Substantially Changed must be renamed to
-avoid use of the name of the Original Version or similar names entirely.
-(c) Modified Versions which are not Substantially Changed must be
-renamed to both (i) retain the name of the Original Version and (ii) add
-additional naming elements to distinguish the Modified Version from the
-Original Version. The name of such Modified Versions must be the name of
-the Original Version, with "derivative X" where X represents the name of
-the new work, appended to that name.
-
-3) The name(s) of the Copyright Holder(s) and any contributor to the
-Font Software shall not be used to promote, endorse or advertise any
-Modified Version, except (i) as required by this licence, (ii) to
-acknowledge the contribution(s) of the Copyright Holder(s) or (iii) with
-their explicit written permission.
-
-4) The Font Software, modified or unmodified, in part or in whole, must
-be distributed entirely under this licence, and must not be distributed
-under any other licence. The requirement for fonts to remain under this
-licence does not affect any document created using the Font Software,
-except any version of the Font Software extracted from a document
-created using the Font Software may only be distributed under this
-licence.
-
-TERMINATION
-This licence becomes null and void if any of the above conditions are
-not met.
-
-DISCLAIMER
-THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF
-COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
-COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
-DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER
-DEALINGS IN THE FONT SOFTWARE.
diff --git a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/debug/shared/console.png b/docs/harbour-sailfinder/qml/pages/lib/werkzeug/debug/shared/console.png
deleted file mode 100644
index c28dd63..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/debug/shared/console.png and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/debug/shared/debugger.js b/docs/harbour-sailfinder/qml/pages/lib/werkzeug/debug/shared/debugger.js
deleted file mode 100644
index 8913129..0000000
--- a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/debug/shared/debugger.js
+++ /dev/null
@@ -1,205 +0,0 @@
-$(function() {
- if (!EVALEX_TRUSTED) {
- initPinBox();
- }
-
- /**
- * if we are in console mode, show the console.
- */
- if (CONSOLE_MODE && EVALEX) {
- openShell(null, $('div.console div.inner').empty(), 0);
- }
-
- $('div.traceback div.frame').each(function() {
- var
- target = $('pre', this),
- consoleNode = null,
- frameID = this.id.substring(6);
-
- target.click(function() {
- $(this).parent().toggleClass('expanded');
- });
-
- /**
- * Add an interactive console to the frames
- */
- if (EVALEX && target.is('.current')) {
- $(' ')
- .attr('title', 'Open an interactive python shell in this frame')
- .click(function() {
- consoleNode = openShell(consoleNode, target, frameID);
- return false;
- })
- .prependTo(target);
- }
- });
-
- /**
- * toggle traceback types on click.
- */
- $('h2.traceback').click(function() {
- $(this).next().slideToggle('fast');
- $('div.plain').slideToggle('fast');
- }).css('cursor', 'pointer');
- $('div.plain').hide();
-
- /**
- * Add extra info (this is here so that only users with JavaScript
- * enabled see it.)
- */
- $('span.nojavascript')
- .removeClass('nojavascript')
- .html('To switch between the interactive traceback and the plaintext ' +
- 'one, you can click on the "Traceback" headline. From the text ' +
- 'traceback you can also create a paste of it. ' + (!EVALEX ? '' :
- 'For code execution mouse-over the frame you want to debug and ' +
- 'click on the console icon on the right side.' +
- '
You can execute arbitrary Python code in the stack frames and ' +
- 'there are some extra helpers available for introspection:' +
- '
dump()
shows all variables in the frame' +
- 'dump(obj)
dumps all that\'s known about the object '));
-
- /**
- * Add the pastebin feature
- */
- $('div.plain form')
- .submit(function() {
- var label = $('input[type="submit"]', this);
- var old_val = label.val();
- label.val('submitting...');
- $.ajax({
- dataType: 'json',
- url: document.location.pathname,
- data: {__debugger__: 'yes', tb: TRACEBACK, cmd: 'paste',
- s: SECRET},
- success: function(data) {
- $('div.plain span.pastemessage')
- .removeClass('pastemessage')
- .text('Paste created: ')
- .append($('#' + data.id + ' ').attr('href', data.url));
- },
- error: function() {
- alert('Error: Could not submit paste. No network connection?');
- label.val(old_val);
- }
- });
- return false;
- });
-
- // if we have javascript we submit by ajax anyways, so no need for the
- // not scaling textarea.
- var plainTraceback = $('div.plain textarea');
- plainTraceback.replaceWith($('').text(plainTraceback.text()));
-});
-
-function initPinBox() {
- $('.pin-prompt form').submit(function(evt) {
- evt.preventDefault();
- var pin = this.pin.value;
- var btn = this.btn;
- btn.disabled = true;
- $.ajax({
- dataType: 'json',
- url: document.location.pathname,
- data: {__debugger__: 'yes', cmd: 'pinauth', pin: pin,
- s: SECRET},
- success: function(data) {
- btn.disabled = false;
- if (data.auth) {
- EVALEX_TRUSTED = true;
- $('.pin-prompt').fadeOut();
- } else {
- if (data.exhausted) {
- alert('Error: too many attempts. Restart server to retry.');
- } else {
- alert('Error: incorrect pin');
- }
- }
- console.log(data);
- },
- error: function() {
- btn.disabled = false;
- alert('Error: Could not verify PIN. Network error?');
- }
- });
- });
-}
-
-function promptForPin() {
- if (!EVALEX_TRUSTED) {
- $.ajax({
- url: document.location.pathname,
- data: {__debugger__: 'yes', cmd: 'printpin', s: SECRET}
- });
- $('.pin-prompt').fadeIn(function() {
- $('.pin-prompt input[name="pin"]').focus();
- });
- }
-}
-
-
-/**
- * Helper function for shell initialization
- */
-function openShell(consoleNode, target, frameID) {
- promptForPin();
- if (consoleNode)
- return consoleNode.slideToggle('fast');
- consoleNode = $('')
- .appendTo(target.parent())
- .hide()
- var historyPos = 0, history = [''];
- var output = $('[console ready]
')
- .appendTo(consoleNode);
- var form = $(' ')
- .submit(function() {
- var cmd = command.val();
- $.get('', {
- __debugger__: 'yes', cmd: cmd, frm: frameID, s: SECRET}, function(data) {
- var tmp = $('').html(data);
- $('span.extended', tmp).each(function() {
- var hidden = $(this).wrap('
').hide();
- hidden
- .parent()
- .append($(' ')
- .click(function() {
- hidden.toggle();
- $(this).toggleClass('open')
- return false;
- }));
- });
- output.append(tmp);
- command.focus();
- consoleNode.scrollTop(consoleNode.get(0).scrollHeight);
- var old = history.pop();
- history.push(cmd);
- if (typeof old != 'undefined')
- history.push(old);
- historyPos = history.length - 1;
- });
- command.val('');
- return false;
- }).
- appendTo(consoleNode);
-
- var command = $(' ')
- .appendTo(form)
- .keydown(function(e) {
- if (e.charCode == 100 && e.ctrlKey) {
- output.text('--- screen cleared ---');
- return false;
- }
- else if (e.charCode == 0 && (e.keyCode == 38 || e.keyCode == 40)) {
- if (e.keyCode == 38 && historyPos > 0)
- historyPos--;
- else if (e.keyCode == 40 && historyPos < history.length)
- historyPos++;
- command.val(history[historyPos]);
- return false;
- }
- });
-
- return consoleNode.slideDown('fast', function() {
- command.focus();
- });
-}
diff --git a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/debug/shared/jquery.js b/docs/harbour-sailfinder/qml/pages/lib/werkzeug/debug/shared/jquery.js
deleted file mode 100644
index 0f60b7b..0000000
--- a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/debug/shared/jquery.js
+++ /dev/null
@@ -1,5 +0,0 @@
-/*! jQuery v1.11.3 | (c) 2005, 2015 jQuery Foundation, Inc. | jquery.org/license */
-!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l="1.11.3",m=function(a,b){return new m.fn.init(a,b)},n=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,o=/^-ms-/,p=/-([\da-z])/gi,q=function(a,b){return b.toUpperCase()};m.fn=m.prototype={jquery:l,constructor:m,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=m.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return m.each(this,a,b)},map:function(a){return this.pushStack(m.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},m.extend=m.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||m.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(m.isPlainObject(c)||(b=m.isArray(c)))?(b?(b=!1,f=a&&m.isArray(a)?a:[]):f=a&&m.isPlainObject(a)?a:{},g[d]=m.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},m.extend({expando:"jQuery"+(l+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===m.type(a)},isArray:Array.isArray||function(a){return"array"===m.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return!m.isArray(a)&&a-parseFloat(a)+1>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==m.type(a)||a.nodeType||m.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(k.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&m.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(o,"ms-").replace(p,q)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=r(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(n,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(r(Object(a))?m.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=r(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(f=a[b],b=a,a=f),m.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(arguments)))},e.guid=a.guid=a.guid||m.guid++,e):void 0},now:function(){return+new Date},support:k}),m.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function r(a){var b="length"in a&&a.length,c=m.type(a);return"function"===c||m.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var s=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N=M.replace("w","w#"),O="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+N+"))|)"+L+"*\\]",P=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+O+")*)|.*)\\)|)",Q=new RegExp(L+"+","g"),R=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),S=new RegExp("^"+L+"*,"+L+"*"),T=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),U=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),V=new RegExp(P),W=new RegExp("^"+N+"$"),X={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M.replace("w","w*")+")"),ATTR:new RegExp("^"+O),PSEUDO:new RegExp("^"+P),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,aa=/[+~]/,ba=/'|\\/g,ca=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),da=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ea=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(fa){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],k=b.nodeType,"string"!=typeof a||!a||1!==k&&9!==k&&11!==k)return d;if(!e&&p){if(11!==k&&(f=_.exec(a)))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return H.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName)return H.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=1!==k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(ba,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+ra(o[l]);w=aa.test(a)&&pa(b.parentNode)||b,x=o.join(",")}if(x)try{return H.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function pa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=g.documentElement,e=g.defaultView,e&&e!==e.top&&(e.addEventListener?e.addEventListener("unload",ea,!1):e.attachEvent&&e.attachEvent("onunload",ea)),p=!f(g),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(g.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(g.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!g.getElementsByName||!g.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(g.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML=" ",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){var b=g.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",P)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===g||a.ownerDocument===v&&t(v,a)?-1:b===g||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,h=[a],i=[b];if(!e||!f)return a===g?-1:b===g?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?la(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},g):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ca,da),a[3]=(a[3]||a[4]||a[5]||"").replace(ca,da),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ca,da).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(Q," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(ca,da),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return W.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(ca,da).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:oa(function(){return[0]}),last:oa(function(a,b){return[b-1]}),eq:oa(function(a,b,c){return[0>c?c+b:c]}),even:oa(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:oa(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:oa(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:oa(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function sa(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function ta(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ua(a,b,c){for(var d=0,e=b.length;e>d;d++)ga(a,b[d],c);return c}function va(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function wa(a,b,c,d,e,f){return d&&!d[u]&&(d=wa(d)),e&&!e[u]&&(e=wa(e,f)),ia(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ua(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:va(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=va(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=va(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function xa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=sa(function(a){return a===b},h,!0),l=sa(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[sa(ta(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return wa(i>1&&ta(m),i>1&&ra(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&xa(a.slice(i,e)),f>e&&xa(a=a.slice(e)),f>e&&ra(a))}m.push(c)}return ta(m)}function ya(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=F.call(i));s=va(s)}H.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&ga.uniqueSort(i)}return k&&(w=v,j=t),r};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=xa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,ya(e,d)),f.selector=a}return f},i=ga.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ca,da),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ca,da),aa.test(j[0].type)&&pa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&ra(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,aa.test(a)&&pa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ja(function(a){return a.innerHTML=" ","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML=" ",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);m.find=s,m.expr=s.selectors,m.expr[":"]=m.expr.pseudos,m.unique=s.uniqueSort,m.text=s.getText,m.isXMLDoc=s.isXML,m.contains=s.contains;var t=m.expr.match.needsContext,u=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,v=/^.[^:#\[\.,]*$/;function w(a,b,c){if(m.isFunction(b))return m.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return m.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(v.test(b))return m.filter(b,a,c);b=m.filter(b,a)}return m.grep(a,function(a){return m.inArray(a,b)>=0!==c})}m.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?m.find.matchesSelector(d,a)?[d]:[]:m.find.matches(a,m.grep(b,function(a){return 1===a.nodeType}))},m.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(m(a).filter(function(){for(b=0;e>b;b++)if(m.contains(d[b],this))return!0}));for(b=0;e>b;b++)m.find(a,d[b],c);return c=this.pushStack(e>1?m.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(w(this,a||[],!1))},not:function(a){return this.pushStack(w(this,a||[],!0))},is:function(a){return!!w(this,"string"==typeof a&&t.test(a)?m(a):a||[],!1).length}});var x,y=a.document,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=m.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||x).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof m?b[0]:b,m.merge(this,m.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:y,!0)),u.test(c[1])&&m.isPlainObject(b))for(c in b)m.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}if(d=y.getElementById(c[2]),d&&d.parentNode){if(d.id!==c[2])return x.find(a);this.length=1,this[0]=d}return this.context=y,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):m.isFunction(a)?"undefined"!=typeof x.ready?x.ready(a):a(m):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),m.makeArray(a,this))};A.prototype=m.fn,x=m(y);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};m.extend({dir:function(a,b,c){var d=[],e=a[b];while(e&&9!==e.nodeType&&(void 0===c||1!==e.nodeType||!m(e).is(c)))1===e.nodeType&&d.push(e),e=e[b];return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),m.fn.extend({has:function(a){var b,c=m(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(m.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=t.test(a)||"string"!=typeof a?m(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&m.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?m.unique(f):f)},index:function(a){return a?"string"==typeof a?m.inArray(this[0],m(a)):m.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(m.unique(m.merge(this.get(),m(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}m.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return m.dir(a,"parentNode")},parentsUntil:function(a,b,c){return m.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return m.dir(a,"nextSibling")},prevAll:function(a){return m.dir(a,"previousSibling")},nextUntil:function(a,b,c){return m.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return m.dir(a,"previousSibling",c)},siblings:function(a){return m.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return m.sibling(a.firstChild)},contents:function(a){return m.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:m.merge([],a.childNodes)}},function(a,b){m.fn[a]=function(c,d){var e=m.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=m.filter(d,e)),this.length>1&&(C[a]||(e=m.unique(e)),B.test(a)&&(e=e.reverse())),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return m.each(a.match(E)||[],function(a,c){b[c]=!0}),b}m.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):m.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(c=a.memory&&l,d=!0,f=g||0,g=0,e=h.length,b=!0;h&&e>f;f++)if(h[f].apply(l[0],l[1])===!1&&a.stopOnFalse){c=!1;break}b=!1,h&&(i?i.length&&j(i.shift()):c?h=[]:k.disable())},k={add:function(){if(h){var d=h.length;!function f(b){m.each(b,function(b,c){var d=m.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),b?e=h.length:c&&(g=d,j(c))}return this},remove:function(){return h&&m.each(arguments,function(a,c){var d;while((d=m.inArray(c,h,d))>-1)h.splice(d,1),b&&(e>=d&&e--,f>=d&&f--)}),this},has:function(a){return a?m.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],e=0,this},disable:function(){return h=i=c=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,c||k.disable(),this},locked:function(){return!i},fireWith:function(a,c){return!h||d&&!i||(c=c||[],c=[a,c.slice?c.slice():c],b?i.push(c):j(c)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!d}};return k},m.extend({Deferred:function(a){var b=[["resolve","done",m.Callbacks("once memory"),"resolved"],["reject","fail",m.Callbacks("once memory"),"rejected"],["notify","progress",m.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return m.Deferred(function(c){m.each(b,function(b,f){var g=m.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&m.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?m.extend(a,d):d}},e={};return d.pipe=d.then,m.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&m.isFunction(a.promise)?e:0,g=1===f?a:m.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&m.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;m.fn.ready=function(a){return m.ready.promise().done(a),this},m.extend({isReady:!1,readyWait:1,holdReady:function(a){a?m.readyWait++:m.ready(!0)},ready:function(a){if(a===!0?!--m.readyWait:!m.isReady){if(!y.body)return setTimeout(m.ready);m.isReady=!0,a!==!0&&--m.readyWait>0||(H.resolveWith(y,[m]),m.fn.triggerHandler&&(m(y).triggerHandler("ready"),m(y).off("ready")))}}});function I(){y.addEventListener?(y.removeEventListener("DOMContentLoaded",J,!1),a.removeEventListener("load",J,!1)):(y.detachEvent("onreadystatechange",J),a.detachEvent("onload",J))}function J(){(y.addEventListener||"load"===event.type||"complete"===y.readyState)&&(I(),m.ready())}m.ready.promise=function(b){if(!H)if(H=m.Deferred(),"complete"===y.readyState)setTimeout(m.ready);else if(y.addEventListener)y.addEventListener("DOMContentLoaded",J,!1),a.addEventListener("load",J,!1);else{y.attachEvent("onreadystatechange",J),a.attachEvent("onload",J);var c=!1;try{c=null==a.frameElement&&y.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!m.isReady){try{c.doScroll("left")}catch(a){return setTimeout(e,50)}I(),m.ready()}}()}return H.promise(b)};var K="undefined",L;for(L in m(k))break;k.ownLast="0"!==L,k.inlineBlockNeedsLayout=!1,m(function(){var a,b,c,d;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",k.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(d))}),function(){var a=y.createElement("div");if(null==k.deleteExpando){k.deleteExpando=!0;try{delete a.test}catch(b){k.deleteExpando=!1}}a=null}(),m.acceptData=function(a){var b=m.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b};var M=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,N=/([A-Z])/g;function O(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(N,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:M.test(c)?m.parseJSON(c):c}catch(e){}m.data(a,b,c)}else c=void 0}return c}function P(a){var b;for(b in a)if(("data"!==b||!m.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;
-
-return!0}function Q(a,b,d,e){if(m.acceptData(a)){var f,g,h=m.expando,i=a.nodeType,j=i?m.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||m.guid++:h),j[k]||(j[k]=i?{}:{toJSON:m.noop}),("object"==typeof b||"function"==typeof b)&&(e?j[k]=m.extend(j[k],b):j[k].data=m.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[m.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[m.camelCase(b)])):f=g,f}}function R(a,b,c){if(m.acceptData(a)){var d,e,f=a.nodeType,g=f?m.cache:a,h=f?a[m.expando]:m.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){m.isArray(b)?b=b.concat(m.map(b,m.camelCase)):b in d?b=[b]:(b=m.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!P(d):!m.isEmptyObject(d))return}(c||(delete g[h].data,P(g[h])))&&(f?m.cleanData([a],!0):k.deleteExpando||g!=g.window?delete g[h]:g[h]=null)}}}m.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?m.cache[a[m.expando]]:a[m.expando],!!a&&!P(a)},data:function(a,b,c){return Q(a,b,c)},removeData:function(a,b){return R(a,b)},_data:function(a,b,c){return Q(a,b,c,!0)},_removeData:function(a,b){return R(a,b,!0)}}),m.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=m.data(f),1===f.nodeType&&!m._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=m.camelCase(d.slice(5)),O(f,d,e[d])));m._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){m.data(this,a)}):arguments.length>1?this.each(function(){m.data(this,a,b)}):f?O(f,a,m.data(f,a)):void 0},removeData:function(a){return this.each(function(){m.removeData(this,a)})}}),m.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=m._data(a,b),c&&(!d||m.isArray(c)?d=m._data(a,b,m.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=m.queue(a,b),d=c.length,e=c.shift(),f=m._queueHooks(a,b),g=function(){m.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return m._data(a,c)||m._data(a,c,{empty:m.Callbacks("once memory").add(function(){m._removeData(a,b+"queue"),m._removeData(a,c)})})}}),m.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthh;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},W=/^(?:checkbox|radio)$/i;!function(){var a=y.createElement("input"),b=y.createElement("div"),c=y.createDocumentFragment();if(b.innerHTML=" a ",k.leadingWhitespace=3===b.firstChild.nodeType,k.tbody=!b.getElementsByTagName("tbody").length,k.htmlSerialize=!!b.getElementsByTagName("link").length,k.html5Clone="<:nav>"!==y.createElement("nav").cloneNode(!0).outerHTML,a.type="checkbox",a.checked=!0,c.appendChild(a),k.appendChecked=a.checked,b.innerHTML="",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,c.appendChild(b),b.innerHTML=" ",k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,k.noCloneEvent=!0,b.attachEvent&&(b.attachEvent("onclick",function(){k.noCloneEvent=!1}),b.cloneNode(!0).click()),null==k.deleteExpando){k.deleteExpando=!0;try{delete b.test}catch(d){k.deleteExpando=!1}}}(),function(){var b,c,d=y.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(k[b+"Bubbles"]=c in a)||(d.setAttribute(c,"t"),k[b+"Bubbles"]=d.attributes[c].expando===!1);d=null}();var X=/^(?:input|select|textarea)$/i,Y=/^key/,Z=/^(?:mouse|pointer|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=/^([^.]*)(?:\.(.+)|)$/;function aa(){return!0}function ba(){return!1}function ca(){try{return y.activeElement}catch(a){}}m.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=m.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof m===K||a&&m.event.triggered===a.type?void 0:m.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(E)||[""],h=b.length;while(h--)f=_.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=m.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=m.event.special[o]||{},l=m.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&m.expr.match.needsContext.test(e),namespace:p.join(".")},i),(n=g[o])||(n=g[o]=[],n.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?n.splice(n.delegateCount++,0,l):n.push(l),m.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m.hasData(a)&&m._data(a);if(r&&(k=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=_.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=m.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,n=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=n.length;while(f--)g=n[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(n.splice(f,1),g.selector&&n.delegateCount--,l.remove&&l.remove.call(a,g));i&&!n.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||m.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)m.event.remove(a,o+b[j],c,d,!0);m.isEmptyObject(k)&&(delete r.handle,m._removeData(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,n,o=[d||y],p=j.call(b,"type")?b.type:b,q=j.call(b,"namespace")?b.namespace.split("."):[];if(h=l=d=d||y,3!==d.nodeType&&8!==d.nodeType&&!$.test(p+m.event.triggered)&&(p.indexOf(".")>=0&&(q=p.split("."),p=q.shift(),q.sort()),g=p.indexOf(":")<0&&"on"+p,b=b[m.expando]?b:new m.Event(p,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:m.makeArray(c,[b]),k=m.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!m.isWindow(d)){for(i=k.delegateType||p,$.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||y)&&o.push(l.defaultView||l.parentWindow||a)}n=0;while((h=o[n++])&&!b.isPropagationStopped())b.type=n>1?i:k.bindType||p,f=(m._data(h,"events")||{})[b.type]&&m._data(h,"handle"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&m.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&m.acceptData(d)&&g&&d[p]&&!m.isWindow(d)){l=d[g],l&&(d[g]=null),m.event.triggered=p;try{d[p]()}catch(r){}m.event.triggered=void 0,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=m.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(m._data(this,"events")||{})[a.type]||[],k=m.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=m.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((m.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+" ",void 0===e[c]&&(e[c]=d.needsContext?m(c,this).index(i)>=0:m.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,handlers:e})}return h ]","i"),ha=/^\s+/,ia=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,ja=/<([\w:]+)/,ka=/\s*$/g,ra={option:[1,""," "],legend:[1,""," "],area:[1,""," "],param:[1,""," "],thead:[1,""],tr:[2,""],col:[2,""],td:[3,""],_default:k.htmlSerialize?[0,"",""]:[1,"X","
"]},sa=da(y),ta=sa.appendChild(y.createElement("div"));ra.optgroup=ra.option,ra.tbody=ra.tfoot=ra.colgroup=ra.caption=ra.thead,ra.th=ra.td;function ua(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==K?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==K?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||m.nodeName(d,b)?f.push(d):m.merge(f,ua(d,b));return void 0===b||b&&m.nodeName(a,b)?m.merge([a],f):f}function va(a){W.test(a.type)&&(a.defaultChecked=a.checked)}function wa(a,b){return m.nodeName(a,"table")&&m.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function xa(a){return a.type=(null!==m.find.attr(a,"type"))+"/"+a.type,a}function ya(a){var b=pa.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function za(a,b){for(var c,d=0;null!=(c=a[d]);d++)m._data(c,"globalEval",!b||m._data(b[d],"globalEval"))}function Aa(a,b){if(1===b.nodeType&&m.hasData(a)){var c,d,e,f=m._data(a),g=m._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)m.event.add(b,c,h[c][d])}g.data&&(g.data=m.extend({},g.data))}}function Ba(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!k.noCloneEvent&&b[m.expando]){e=m._data(b);for(d in e.events)m.removeEvent(b,d,e.handle);b.removeAttribute(m.expando)}"script"===c&&b.text!==a.text?(xa(b).text=a.text,ya(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),k.html5Clone&&a.innerHTML&&!m.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&W.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}m.extend({clone:function(a,b,c){var d,e,f,g,h,i=m.contains(a.ownerDocument,a);if(k.html5Clone||m.isXMLDoc(a)||!ga.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(ta.innerHTML=a.outerHTML,ta.removeChild(f=ta.firstChild)),!(k.noCloneEvent&&k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||m.isXMLDoc(a)))for(d=ua(f),h=ua(a),g=0;null!=(e=h[g]);++g)d[g]&&Ba(e,d[g]);if(b)if(c)for(h=h||ua(a),d=d||ua(f),g=0;null!=(e=h[g]);g++)Aa(e,d[g]);else Aa(a,f);return d=ua(f,"script"),d.length>0&&za(d,!i&&ua(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,l,n=a.length,o=da(b),p=[],q=0;n>q;q++)if(f=a[q],f||0===f)if("object"===m.type(f))m.merge(p,f.nodeType?[f]:f);else if(la.test(f)){h=h||o.appendChild(b.createElement("div")),i=(ja.exec(f)||["",""])[1].toLowerCase(),l=ra[i]||ra._default,h.innerHTML=l[1]+f.replace(ia,"<$1>$2>")+l[2],e=l[0];while(e--)h=h.lastChild;if(!k.leadingWhitespace&&ha.test(f)&&p.push(b.createTextNode(ha.exec(f)[0])),!k.tbody){f="table"!==i||ka.test(f)?""!==l[1]||ka.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)m.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j)}m.merge(p,h.childNodes),h.textContent="";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),k.appendChecked||m.grep(ua(p,"input"),va),q=0;while(f=p[q++])if((!d||-1===m.inArray(f,d))&&(g=m.contains(f.ownerDocument,f),h=ua(o.appendChild(f),"script"),g&&za(h),c)){e=0;while(f=h[e++])oa.test(f.type||"")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=m.expando,j=m.cache,l=k.deleteExpando,n=m.event.special;null!=(d=a[h]);h++)if((b||m.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)n[e]?m.event.remove(d,e):m.removeEvent(d,e,g.handle);j[f]&&(delete j[f],l?delete d[i]:typeof d.removeAttribute!==K?d.removeAttribute(i):d[i]=null,c.push(f))}}}),m.fn.extend({text:function(a){return V(this,function(a){return void 0===a?m.text(this):this.empty().append((this[0]&&this[0].ownerDocument||y).createTextNode(a))},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wa(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wa(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?m.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||m.cleanData(ua(c)),c.parentNode&&(b&&m.contains(c.ownerDocument,c)&&za(ua(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&m.cleanData(ua(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&m.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return m.clone(this,a,b)})},html:function(a){return V(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(fa,""):void 0;if(!("string"!=typeof a||ma.test(a)||!k.htmlSerialize&&ga.test(a)||!k.leadingWhitespace&&ha.test(a)||ra[(ja.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(ia,"<$1>$2>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(m.cleanData(ua(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,m.cleanData(ua(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,n=this,o=l-1,p=a[0],q=m.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&na.test(p))return this.each(function(c){var d=n.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(i=m.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=m.map(ua(i,"script"),xa),f=g.length;l>j;j++)d=i,j!==o&&(d=m.clone(d,!0,!0),f&&m.merge(g,ua(d,"script"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,m.map(g,ya),j=0;f>j;j++)d=g[j],oa.test(d.type||"")&&!m._data(d,"globalEval")&&m.contains(h,d)&&(d.src?m._evalUrl&&m._evalUrl(d.src):m.globalEval((d.text||d.textContent||d.innerHTML||"").replace(qa,"")));i=c=null}return this}}),m.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){m.fn[a]=function(a){for(var c,d=0,e=[],g=m(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),m(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Ca,Da={};function Ea(b,c){var d,e=m(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:m.css(e[0],"display");return e.detach(),f}function Fa(a){var b=y,c=Da[a];return c||(c=Ea(a,b),"none"!==c&&c||(Ca=(Ca||m("")).appendTo(b.documentElement),b=(Ca[0].contentWindow||Ca[0].contentDocument).document,b.write(),b.close(),c=Ea(a,b),Ca.detach()),Da[a]=c),c}!function(){var a;k.shrinkWrapBlocks=function(){if(null!=a)return a;a=!1;var b,c,d;return c=y.getElementsByTagName("body")[0],c&&c.style?(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:1px;width:1px;zoom:1",b.appendChild(y.createElement("div")).style.width="5px",a=3!==b.offsetWidth),c.removeChild(d),a):void 0}}();var Ga=/^margin/,Ha=new RegExp("^("+S+")(?!px)[a-z%]+$","i"),Ia,Ja,Ka=/^(top|right|bottom|left)$/;a.getComputedStyle?(Ia=function(b){return b.ownerDocument.defaultView.opener?b.ownerDocument.defaultView.getComputedStyle(b,null):a.getComputedStyle(b,null)},Ja=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ia(a),g=c?c.getPropertyValue(b)||c[b]:void 0,c&&(""!==g||m.contains(a.ownerDocument,a)||(g=m.style(a,b)),Ha.test(g)&&Ga.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0===g?g:g+""}):y.documentElement.currentStyle&&(Ia=function(a){return a.currentStyle},Ja=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ia(a),g=c?c[b]:void 0,null==g&&h&&h[b]&&(g=h[b]),Ha.test(g)&&!Ka.test(b)&&(d=h.left,e=a.runtimeStyle,f=e&&e.left,f&&(e.left=a.currentStyle.left),h.left="fontSize"===b?"1em":g,g=h.pixelLeft+"px",h.left=d,f&&(e.left=f)),void 0===g?g:g+""||"auto"});function La(a,b){return{get:function(){var c=a();if(null!=c)return c?void delete this.get:(this.get=b).apply(this,arguments)}}}!function(){var b,c,d,e,f,g,h;if(b=y.createElement("div"),b.innerHTML=" a ",d=b.getElementsByTagName("a")[0],c=d&&d.style){c.cssText="float:left;opacity:.5",k.opacity="0.5"===c.opacity,k.cssFloat=!!c.cssFloat,b.style.backgroundClip="content-box",b.cloneNode(!0).style.backgroundClip="",k.clearCloneStyle="content-box"===b.style.backgroundClip,k.boxSizing=""===c.boxSizing||""===c.MozBoxSizing||""===c.WebkitBoxSizing,m.extend(k,{reliableHiddenOffsets:function(){return null==g&&i(),g},boxSizingReliable:function(){return null==f&&i(),f},pixelPosition:function(){return null==e&&i(),e},reliableMarginRight:function(){return null==h&&i(),h}});function i(){var b,c,d,i;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),b.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;margin-top:1%;top:1%;border:1px;padding:1px;width:4px;position:absolute",e=f=!1,h=!0,a.getComputedStyle&&(e="1%"!==(a.getComputedStyle(b,null)||{}).top,f="4px"===(a.getComputedStyle(b,null)||{width:"4px"}).width,i=b.appendChild(y.createElement("div")),i.style.cssText=b.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",i.style.marginRight=i.style.width="0",b.style.width="1px",h=!parseFloat((a.getComputedStyle(i,null)||{}).marginRight),b.removeChild(i)),b.innerHTML="",i=b.getElementsByTagName("td"),i[0].style.cssText="margin:0;border:0;padding:0;display:none",g=0===i[0].offsetHeight,g&&(i[0].style.display="",i[1].style.display="none",g=0===i[0].offsetHeight),c.removeChild(d))}}}(),m.swap=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};var Ma=/alpha\([^)]*\)/i,Na=/opacity\s*=\s*([^)]*)/,Oa=/^(none|table(?!-c[ea]).+)/,Pa=new RegExp("^("+S+")(.*)$","i"),Qa=new RegExp("^([+-])=("+S+")","i"),Ra={position:"absolute",visibility:"hidden",display:"block"},Sa={letterSpacing:"0",fontWeight:"400"},Ta=["Webkit","O","Moz","ms"];function Ua(a,b){if(b in a)return b;var c=b.charAt(0).toUpperCase()+b.slice(1),d=b,e=Ta.length;while(e--)if(b=Ta[e]+c,b in a)return b;return d}function Va(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=m._data(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&U(d)&&(f[g]=m._data(d,"olddisplay",Fa(d.nodeName)))):(e=U(d),(c&&"none"!==c||!e)&&m._data(d,"olddisplay",e?c:m.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}function Wa(a,b,c){var d=Pa.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function Xa(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=m.css(a,c+T[f],!0,e)),d?("content"===c&&(g-=m.css(a,"padding"+T[f],!0,e)),"margin"!==c&&(g-=m.css(a,"border"+T[f]+"Width",!0,e))):(g+=m.css(a,"padding"+T[f],!0,e),"padding"!==c&&(g+=m.css(a,"border"+T[f]+"Width",!0,e)));return g}function Ya(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=Ia(a),g=k.boxSizing&&"border-box"===m.css(a,"boxSizing",!1,f);if(0>=e||null==e){if(e=Ja(a,b,f),(0>e||null==e)&&(e=a.style[b]),Ha.test(e))return e;d=g&&(k.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+Xa(a,b,c||(g?"border":"content"),d,f)+"px"}m.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Ja(a,"opacity");return""===c?"1":c}}}},cssNumber:{columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":k.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=m.camelCase(b),i=a.style;if(b=m.cssProps[h]||(m.cssProps[h]=Ua(i,h)),g=m.cssHooks[b]||m.cssHooks[h],void 0===c)return g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b];if(f=typeof c,"string"===f&&(e=Qa.exec(c))&&(c=(e[1]+1)*e[2]+parseFloat(m.css(a,b)),f="number"),null!=c&&c===c&&("number"!==f||m.cssNumber[h]||(c+="px"),k.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),!(g&&"set"in g&&void 0===(c=g.set(a,c,d)))))try{i[b]=c}catch(j){}}},css:function(a,b,c,d){var e,f,g,h=m.camelCase(b);return b=m.cssProps[h]||(m.cssProps[h]=Ua(a.style,h)),g=m.cssHooks[b]||m.cssHooks[h],g&&"get"in g&&(f=g.get(a,!0,c)),void 0===f&&(f=Ja(a,b,d)),"normal"===f&&b in Sa&&(f=Sa[b]),""===c||c?(e=parseFloat(f),c===!0||m.isNumeric(e)?e||0:f):f}}),m.each(["height","width"],function(a,b){m.cssHooks[b]={get:function(a,c,d){return c?Oa.test(m.css(a,"display"))&&0===a.offsetWidth?m.swap(a,Ra,function(){return Ya(a,b,d)}):Ya(a,b,d):void 0},set:function(a,c,d){var e=d&&Ia(a);return Wa(a,c,d?Xa(a,b,d,k.boxSizing&&"border-box"===m.css(a,"boxSizing",!1,e),e):0)}}}),k.opacity||(m.cssHooks.opacity={get:function(a,b){return Na.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=m.isNumeric(b)?"alpha(opacity="+100*b+")":"",f=d&&d.filter||c.filter||"";c.zoom=1,(b>=1||""===b)&&""===m.trim(f.replace(Ma,""))&&c.removeAttribute&&(c.removeAttribute("filter"),""===b||d&&!d.filter)||(c.filter=Ma.test(f)?f.replace(Ma,e):f+" "+e)}}),m.cssHooks.marginRight=La(k.reliableMarginRight,function(a,b){return b?m.swap(a,{display:"inline-block"},Ja,[a,"marginRight"]):void 0}),m.each({margin:"",padding:"",border:"Width"},function(a,b){m.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+T[d]+b]=f[d]||f[d-2]||f[0];return e}},Ga.test(a)||(m.cssHooks[a+b].set=Wa)}),m.fn.extend({css:function(a,b){return V(this,function(a,b,c){var d,e,f={},g=0;if(m.isArray(b)){for(d=Ia(a),e=b.length;e>g;g++)f[b[g]]=m.css(a,b[g],!1,d);return f}return void 0!==c?m.style(a,b,c):m.css(a,b)},a,b,arguments.length>1)},show:function(){return Va(this,!0)},hide:function(){return Va(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){U(this)?m(this).show():m(this).hide()})}});function Za(a,b,c,d,e){
-return new Za.prototype.init(a,b,c,d,e)}m.Tween=Za,Za.prototype={constructor:Za,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||"swing",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(m.cssNumber[c]?"":"px")},cur:function(){var a=Za.propHooks[this.prop];return a&&a.get?a.get(this):Za.propHooks._default.get(this)},run:function(a){var b,c=Za.propHooks[this.prop];return this.options.duration?this.pos=b=m.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Za.propHooks._default.set(this),this}},Za.prototype.init.prototype=Za.prototype,Za.propHooks={_default:{get:function(a){var b;return null==a.elem[a.prop]||a.elem.style&&null!=a.elem.style[a.prop]?(b=m.css(a.elem,a.prop,""),b&&"auto"!==b?b:0):a.elem[a.prop]},set:function(a){m.fx.step[a.prop]?m.fx.step[a.prop](a):a.elem.style&&(null!=a.elem.style[m.cssProps[a.prop]]||m.cssHooks[a.prop])?m.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},Za.propHooks.scrollTop=Za.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},m.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},m.fx=Za.prototype.init,m.fx.step={};var $a,_a,ab=/^(?:toggle|show|hide)$/,bb=new RegExp("^(?:([+-])=|)("+S+")([a-z%]*)$","i"),cb=/queueHooks$/,db=[ib],eb={"*":[function(a,b){var c=this.createTween(a,b),d=c.cur(),e=bb.exec(b),f=e&&e[3]||(m.cssNumber[a]?"":"px"),g=(m.cssNumber[a]||"px"!==f&&+d)&&bb.exec(m.css(c.elem,a)),h=1,i=20;if(g&&g[3]!==f){f=f||g[3],e=e||[],g=+d||1;do h=h||".5",g/=h,m.style(c.elem,a,g+f);while(h!==(h=c.cur()/d)&&1!==h&&--i)}return e&&(g=c.start=+g||+d||0,c.unit=f,c.end=e[1]?g+(e[1]+1)*e[2]:+e[2]),c}]};function fb(){return setTimeout(function(){$a=void 0}),$a=m.now()}function gb(a,b){var c,d={height:a},e=0;for(b=b?1:0;4>e;e+=2-b)c=T[e],d["margin"+c]=d["padding"+c]=a;return b&&(d.opacity=d.width=a),d}function hb(a,b,c){for(var d,e=(eb[b]||[]).concat(eb["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function ib(a,b,c){var d,e,f,g,h,i,j,l,n=this,o={},p=a.style,q=a.nodeType&&U(a),r=m._data(a,"fxshow");c.queue||(h=m._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,n.always(function(){n.always(function(){h.unqueued--,m.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[p.overflow,p.overflowX,p.overflowY],j=m.css(a,"display"),l="none"===j?m._data(a,"olddisplay")||Fa(a.nodeName):j,"inline"===l&&"none"===m.css(a,"float")&&(k.inlineBlockNeedsLayout&&"inline"!==Fa(a.nodeName)?p.zoom=1:p.display="inline-block")),c.overflow&&(p.overflow="hidden",k.shrinkWrapBlocks()||n.always(function(){p.overflow=c.overflow[0],p.overflowX=c.overflow[1],p.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],ab.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(q?"hide":"show")){if("show"!==e||!r||void 0===r[d])continue;q=!0}o[d]=r&&r[d]||m.style(a,d)}else j=void 0;if(m.isEmptyObject(o))"inline"===("none"===j?Fa(a.nodeName):j)&&(p.display=j);else{r?"hidden"in r&&(q=r.hidden):r=m._data(a,"fxshow",{}),f&&(r.hidden=!q),q?m(a).show():n.done(function(){m(a).hide()}),n.done(function(){var b;m._removeData(a,"fxshow");for(b in o)m.style(a,b,o[b])});for(d in o)g=hb(q?r[d]:0,d,n),d in r||(r[d]=g.start,q&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function jb(a,b){var c,d,e,f,g;for(c in a)if(d=m.camelCase(c),e=b[d],f=a[c],m.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=m.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function kb(a,b,c){var d,e,f=0,g=db.length,h=m.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=$a||fb(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:m.extend({},b),opts:m.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c,startTime:$a||fb(),duration:c.duration,tweens:[],createTween:function(b,c){var d=m.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?h.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;for(jb(k,j.opts.specialEasing);g>f;f++)if(d=db[f].call(j,a,k,j.opts))return d;return m.map(k,hb,j),m.isFunction(j.opts.start)&&j.opts.start.call(a,j),m.fx.timer(m.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}m.Animation=m.extend(kb,{tweener:function(a,b){m.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");for(var c,d=0,e=a.length;e>d;d++)c=a[d],eb[c]=eb[c]||[],eb[c].unshift(b)},prefilter:function(a,b){b?db.unshift(a):db.push(a)}}),m.speed=function(a,b,c){var d=a&&"object"==typeof a?m.extend({},a):{complete:c||!c&&b||m.isFunction(a)&&a,duration:a,easing:c&&b||b&&!m.isFunction(b)&&b};return d.duration=m.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in m.fx.speeds?m.fx.speeds[d.duration]:m.fx.speeds._default,(null==d.queue||d.queue===!0)&&(d.queue="fx"),d.old=d.complete,d.complete=function(){m.isFunction(d.old)&&d.old.call(this),d.queue&&m.dequeue(this,d.queue)},d},m.fn.extend({fadeTo:function(a,b,c,d){return this.filter(U).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=m.isEmptyObject(a),f=m.speed(b,c,d),g=function(){var b=kb(this,m.extend({},a),f);(e||m._data(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=m.timers,g=m._data(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&cb.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));(b||!c)&&m.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=m._data(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=m.timers,g=d?d.length:0;for(c.finish=!0,m.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),m.each(["toggle","show","hide"],function(a,b){var c=m.fn[b];m.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(gb(b,!0),a,d,e)}}),m.each({slideDown:gb("show"),slideUp:gb("hide"),slideToggle:gb("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){m.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),m.timers=[],m.fx.tick=function(){var a,b=m.timers,c=0;for($a=m.now();ca ",d=b.getElementsByTagName("a")[0],c=y.createElement("select"),e=c.appendChild(y.createElement("option")),a=b.getElementsByTagName("input")[0],d.style.cssText="top:1px",k.getSetAttribute="t"!==b.className,k.style=/top/.test(d.getAttribute("style")),k.hrefNormalized="/a"===d.getAttribute("href"),k.checkOn=!!a.value,k.optSelected=e.selected,k.enctype=!!y.createElement("form").enctype,c.disabled=!0,k.optDisabled=!e.disabled,a=y.createElement("input"),a.setAttribute("value",""),k.input=""===a.getAttribute("value"),a.value="t",a.setAttribute("type","radio"),k.radioValue="t"===a.value}();var lb=/\r/g;m.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=m.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,m(this).val()):a,null==e?e="":"number"==typeof e?e+="":m.isArray(e)&&(e=m.map(e,function(a){return null==a?"":a+""})),b=m.valHooks[this.type]||m.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=m.valHooks[e.type]||m.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(lb,""):null==c?"":c)}}}),m.extend({valHooks:{option:{get:function(a){var b=m.find.attr(a,"value");return null!=b?b:m.trim(m.text(a))}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],!(!c.selected&&i!==e||(k.optDisabled?c.disabled:null!==c.getAttribute("disabled"))||c.parentNode.disabled&&m.nodeName(c.parentNode,"optgroup"))){if(b=m(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=m.makeArray(b),g=e.length;while(g--)if(d=e[g],m.inArray(m.valHooks.option.get(d),f)>=0)try{d.selected=c=!0}catch(h){d.scrollHeight}else d.selected=!1;return c||(a.selectedIndex=-1),e}}}}),m.each(["radio","checkbox"],function(){m.valHooks[this]={set:function(a,b){return m.isArray(b)?a.checked=m.inArray(m(a).val(),b)>=0:void 0}},k.checkOn||(m.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var mb,nb,ob=m.expr.attrHandle,pb=/^(?:checked|selected)$/i,qb=k.getSetAttribute,rb=k.input;m.fn.extend({attr:function(a,b){return V(this,m.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){m.removeAttr(this,a)})}}),m.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(a&&3!==f&&8!==f&&2!==f)return typeof a.getAttribute===K?m.prop(a,b,c):(1===f&&m.isXMLDoc(a)||(b=b.toLowerCase(),d=m.attrHooks[b]||(m.expr.match.bool.test(b)?nb:mb)),void 0===c?d&&"get"in d&&null!==(e=d.get(a,b))?e:(e=m.find.attr(a,b),null==e?void 0:e):null!==c?d&&"set"in d&&void 0!==(e=d.set(a,c,b))?e:(a.setAttribute(b,c+""),c):void m.removeAttr(a,b))},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(E);if(f&&1===a.nodeType)while(c=f[e++])d=m.propFix[c]||c,m.expr.match.bool.test(c)?rb&&qb||!pb.test(c)?a[d]=!1:a[m.camelCase("default-"+c)]=a[d]=!1:m.attr(a,c,""),a.removeAttribute(qb?c:d)},attrHooks:{type:{set:function(a,b){if(!k.radioValue&&"radio"===b&&m.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}}}),nb={set:function(a,b,c){return b===!1?m.removeAttr(a,c):rb&&qb||!pb.test(c)?a.setAttribute(!qb&&m.propFix[c]||c,c):a[m.camelCase("default-"+c)]=a[c]=!0,c}},m.each(m.expr.match.bool.source.match(/\w+/g),function(a,b){var c=ob[b]||m.find.attr;ob[b]=rb&&qb||!pb.test(b)?function(a,b,d){var e,f;return d||(f=ob[b],ob[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,ob[b]=f),e}:function(a,b,c){return c?void 0:a[m.camelCase("default-"+b)]?b.toLowerCase():null}}),rb&&qb||(m.attrHooks.value={set:function(a,b,c){return m.nodeName(a,"input")?void(a.defaultValue=b):mb&&mb.set(a,b,c)}}),qb||(mb={set:function(a,b,c){var d=a.getAttributeNode(c);return d||a.setAttributeNode(d=a.ownerDocument.createAttribute(c)),d.value=b+="","value"===c||b===a.getAttribute(c)?b:void 0}},ob.id=ob.name=ob.coords=function(a,b,c){var d;return c?void 0:(d=a.getAttributeNode(b))&&""!==d.value?d.value:null},m.valHooks.button={get:function(a,b){var c=a.getAttributeNode(b);return c&&c.specified?c.value:void 0},set:mb.set},m.attrHooks.contenteditable={set:function(a,b,c){mb.set(a,""===b?!1:b,c)}},m.each(["width","height"],function(a,b){m.attrHooks[b]={set:function(a,c){return""===c?(a.setAttribute(b,"auto"),c):void 0}}})),k.style||(m.attrHooks.style={get:function(a){return a.style.cssText||void 0},set:function(a,b){return a.style.cssText=b+""}});var sb=/^(?:input|select|textarea|button|object)$/i,tb=/^(?:a|area)$/i;m.fn.extend({prop:function(a,b){return V(this,m.prop,a,b,arguments.length>1)},removeProp:function(a){return a=m.propFix[a]||a,this.each(function(){try{this[a]=void 0,delete this[a]}catch(b){}})}}),m.extend({propFix:{"for":"htmlFor","class":"className"},prop:function(a,b,c){var d,e,f,g=a.nodeType;if(a&&3!==g&&8!==g&&2!==g)return f=1!==g||!m.isXMLDoc(a),f&&(b=m.propFix[b]||b,e=m.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=m.find.attr(a,"tabindex");return b?parseInt(b,10):sb.test(a.nodeName)||tb.test(a.nodeName)&&a.href?0:-1}}}}),k.hrefNormalized||m.each(["href","src"],function(a,b){m.propHooks[b]={get:function(a){return a.getAttribute(b,4)}}}),k.optSelected||(m.propHooks.selected={get:function(a){var b=a.parentNode;return b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex),null}}),m.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){m.propFix[this.toLowerCase()]=this}),k.enctype||(m.propFix.enctype="encoding");var ub=/[\t\r\n\f]/g;m.fn.extend({addClass:function(a){var b,c,d,e,f,g,h=0,i=this.length,j="string"==typeof a&&a;if(m.isFunction(a))return this.each(function(b){m(this).addClass(a.call(this,b,this.className))});if(j)for(b=(a||"").match(E)||[];i>h;h++)if(c=this[h],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(ub," "):" ")){f=0;while(e=b[f++])d.indexOf(" "+e+" ")<0&&(d+=e+" ");g=m.trim(d),c.className!==g&&(c.className=g)}return this},removeClass:function(a){var b,c,d,e,f,g,h=0,i=this.length,j=0===arguments.length||"string"==typeof a&&a;if(m.isFunction(a))return this.each(function(b){m(this).removeClass(a.call(this,b,this.className))});if(j)for(b=(a||"").match(E)||[];i>h;h++)if(c=this[h],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(ub," "):"")){f=0;while(e=b[f++])while(d.indexOf(" "+e+" ")>=0)d=d.replace(" "+e+" "," ");g=a?m.trim(d):"",c.className!==g&&(c.className=g)}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):this.each(m.isFunction(a)?function(c){m(this).toggleClass(a.call(this,c,this.className,b),b)}:function(){if("string"===c){var b,d=0,e=m(this),f=a.match(E)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else(c===K||"boolean"===c)&&(this.className&&m._data(this,"__className__",this.className),this.className=this.className||a===!1?"":m._data(this,"__className__")||"")})},hasClass:function(a){for(var b=" "+a+" ",c=0,d=this.length;d>c;c++)if(1===this[c].nodeType&&(" "+this[c].className+" ").replace(ub," ").indexOf(b)>=0)return!0;return!1}}),m.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){m.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),m.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}});var vb=m.now(),wb=/\?/,xb=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;m.parseJSON=function(b){if(a.JSON&&a.JSON.parse)return a.JSON.parse(b+"");var c,d=null,e=m.trim(b+"");return e&&!m.trim(e.replace(xb,function(a,b,e,f){return c&&b&&(d=0),0===d?a:(c=e||b,d+=!f-!e,"")}))?Function("return "+e)():m.error("Invalid JSON: "+b)},m.parseXML=function(b){var c,d;if(!b||"string"!=typeof b)return null;try{a.DOMParser?(d=new DOMParser,c=d.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b))}catch(e){c=void 0}return c&&c.documentElement&&!c.getElementsByTagName("parsererror").length||m.error("Invalid XML: "+b),c};var yb,zb,Ab=/#.*$/,Bb=/([?&])_=[^&]*/,Cb=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Db=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Eb=/^(?:GET|HEAD)$/,Fb=/^\/\//,Gb=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,Hb={},Ib={},Jb="*/".concat("*");try{zb=location.href}catch(Kb){zb=y.createElement("a"),zb.href="",zb=zb.href}yb=Gb.exec(zb.toLowerCase())||[];function Lb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(E)||[];if(m.isFunction(c))while(d=f[e++])"+"===d.charAt(0)?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Mb(a,b,c,d){var e={},f=a===Ib;function g(h){var i;return e[h]=!0,m.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Nb(a,b){var c,d,e=m.ajaxSettings.flatOptions||{};for(d in b)void 0!==b[d]&&((e[d]?a:c||(c={}))[d]=b[d]);return c&&m.extend(!0,a,c),a}function Ob(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===e&&(e=a.mimeType||b.getResponseHeader("Content-Type"));if(e)for(g in h)if(h[g]&&h[g].test(e)){i.unshift(g);break}if(i[0]in c)f=i[0];else{for(g in c){if(!i[0]||a.converters[g+" "+i[0]]){f=g;break}d||(d=g)}f=f||d}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function Pb(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}m.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:zb,type:"GET",isLocal:Db.test(yb[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Jb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":m.parseJSON,"text xml":m.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Nb(Nb(a,m.ajaxSettings),b):Nb(m.ajaxSettings,a)},ajaxPrefilter:Lb(Hb),ajaxTransport:Lb(Ib),ajax:function(a,b){"object"==typeof a&&(b=a,a=void 0),b=b||{};var c,d,e,f,g,h,i,j,k=m.ajaxSetup({},b),l=k.context||k,n=k.context&&(l.nodeType||l.jquery)?m(l):m.event,o=m.Deferred(),p=m.Callbacks("once memory"),q=k.statusCode||{},r={},s={},t=0,u="canceled",v={readyState:0,getResponseHeader:function(a){var b;if(2===t){if(!j){j={};while(b=Cb.exec(f))j[b[1].toLowerCase()]=b[2]}b=j[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===t?f:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return t||(a=s[c]=s[c]||a,r[a]=b),this},overrideMimeType:function(a){return t||(k.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>t)for(b in a)q[b]=[q[b],a[b]];else v.always(a[v.status]);return this},abort:function(a){var b=a||u;return i&&i.abort(b),x(0,b),this}};if(o.promise(v).complete=p.add,v.success=v.done,v.error=v.fail,k.url=((a||k.url||zb)+"").replace(Ab,"").replace(Fb,yb[1]+"//"),k.type=b.method||b.type||k.method||k.type,k.dataTypes=m.trim(k.dataType||"*").toLowerCase().match(E)||[""],null==k.crossDomain&&(c=Gb.exec(k.url.toLowerCase()),k.crossDomain=!(!c||c[1]===yb[1]&&c[2]===yb[2]&&(c[3]||("http:"===c[1]?"80":"443"))===(yb[3]||("http:"===yb[1]?"80":"443")))),k.data&&k.processData&&"string"!=typeof k.data&&(k.data=m.param(k.data,k.traditional)),Mb(Hb,k,b,v),2===t)return v;h=m.event&&k.global,h&&0===m.active++&&m.event.trigger("ajaxStart"),k.type=k.type.toUpperCase(),k.hasContent=!Eb.test(k.type),e=k.url,k.hasContent||(k.data&&(e=k.url+=(wb.test(e)?"&":"?")+k.data,delete k.data),k.cache===!1&&(k.url=Bb.test(e)?e.replace(Bb,"$1_="+vb++):e+(wb.test(e)?"&":"?")+"_="+vb++)),k.ifModified&&(m.lastModified[e]&&v.setRequestHeader("If-Modified-Since",m.lastModified[e]),m.etag[e]&&v.setRequestHeader("If-None-Match",m.etag[e])),(k.data&&k.hasContent&&k.contentType!==!1||b.contentType)&&v.setRequestHeader("Content-Type",k.contentType),v.setRequestHeader("Accept",k.dataTypes[0]&&k.accepts[k.dataTypes[0]]?k.accepts[k.dataTypes[0]]+("*"!==k.dataTypes[0]?", "+Jb+"; q=0.01":""):k.accepts["*"]);for(d in k.headers)v.setRequestHeader(d,k.headers[d]);if(k.beforeSend&&(k.beforeSend.call(l,v,k)===!1||2===t))return v.abort();u="abort";for(d in{success:1,error:1,complete:1})v[d](k[d]);if(i=Mb(Ib,k,b,v)){v.readyState=1,h&&n.trigger("ajaxSend",[v,k]),k.async&&k.timeout>0&&(g=setTimeout(function(){v.abort("timeout")},k.timeout));try{t=1,i.send(r,x)}catch(w){if(!(2>t))throw w;x(-1,w)}}else x(-1,"No Transport");function x(a,b,c,d){var j,r,s,u,w,x=b;2!==t&&(t=2,g&&clearTimeout(g),i=void 0,f=d||"",v.readyState=a>0?4:0,j=a>=200&&300>a||304===a,c&&(u=Ob(k,v,c)),u=Pb(k,u,v,j),j?(k.ifModified&&(w=v.getResponseHeader("Last-Modified"),w&&(m.lastModified[e]=w),w=v.getResponseHeader("etag"),w&&(m.etag[e]=w)),204===a||"HEAD"===k.type?x="nocontent":304===a?x="notmodified":(x=u.state,r=u.data,s=u.error,j=!s)):(s=x,(a||!x)&&(x="error",0>a&&(a=0))),v.status=a,v.statusText=(b||x)+"",j?o.resolveWith(l,[r,x,v]):o.rejectWith(l,[v,x,s]),v.statusCode(q),q=void 0,h&&n.trigger(j?"ajaxSuccess":"ajaxError",[v,k,j?r:s]),p.fireWith(l,[v,x]),h&&(n.trigger("ajaxComplete",[v,k]),--m.active||m.event.trigger("ajaxStop")))}return v},getJSON:function(a,b,c){return m.get(a,b,c,"json")},getScript:function(a,b){return m.get(a,void 0,b,"script")}}),m.each(["get","post"],function(a,b){m[b]=function(a,c,d,e){return m.isFunction(c)&&(e=e||d,d=c,c=void 0),m.ajax({url:a,type:b,dataType:e,data:c,success:d})}}),m._evalUrl=function(a){return m.ajax({url:a,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})},m.fn.extend({wrapAll:function(a){if(m.isFunction(a))return this.each(function(b){m(this).wrapAll(a.call(this,b))});if(this[0]){var b=m(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&1===a.firstChild.nodeType)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){return this.each(m.isFunction(a)?function(b){m(this).wrapInner(a.call(this,b))}:function(){var b=m(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=m.isFunction(a);return this.each(function(c){m(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){m.nodeName(this,"body")||m(this).replaceWith(this.childNodes)}).end()}}),m.expr.filters.hidden=function(a){return a.offsetWidth<=0&&a.offsetHeight<=0||!k.reliableHiddenOffsets()&&"none"===(a.style&&a.style.display||m.css(a,"display"))},m.expr.filters.visible=function(a){return!m.expr.filters.hidden(a)};var Qb=/%20/g,Rb=/\[\]$/,Sb=/\r?\n/g,Tb=/^(?:submit|button|image|reset|file)$/i,Ub=/^(?:input|select|textarea|keygen)/i;function Vb(a,b,c,d){var e;if(m.isArray(b))m.each(b,function(b,e){c||Rb.test(a)?d(a,e):Vb(a+"["+("object"==typeof e?b:"")+"]",e,c,d)});else if(c||"object"!==m.type(b))d(a,b);else for(e in b)Vb(a+"["+e+"]",b[e],c,d)}m.param=function(a,b){var c,d=[],e=function(a,b){b=m.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=m.ajaxSettings&&m.ajaxSettings.traditional),m.isArray(a)||a.jquery&&!m.isPlainObject(a))m.each(a,function(){e(this.name,this.value)});else for(c in a)Vb(c,a[c],b,e);return d.join("&").replace(Qb,"+")},m.fn.extend({serialize:function(){return m.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=m.prop(this,"elements");return a?m.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!m(this).is(":disabled")&&Ub.test(this.nodeName)&&!Tb.test(a)&&(this.checked||!W.test(a))}).map(function(a,b){var c=m(this).val();return null==c?null:m.isArray(c)?m.map(c,function(a){return{name:b.name,value:a.replace(Sb,"\r\n")}}):{name:b.name,value:c.replace(Sb,"\r\n")}}).get()}}),m.ajaxSettings.xhr=void 0!==a.ActiveXObject?function(){return!this.isLocal&&/^(get|post|head|put|delete|options)$/i.test(this.type)&&Zb()||$b()}:Zb;var Wb=0,Xb={},Yb=m.ajaxSettings.xhr();a.attachEvent&&a.attachEvent("onunload",function(){for(var a in Xb)Xb[a](void 0,!0)}),k.cors=!!Yb&&"withCredentials"in Yb,Yb=k.ajax=!!Yb,Yb&&m.ajaxTransport(function(a){if(!a.crossDomain||k.cors){var b;return{send:function(c,d){var e,f=a.xhr(),g=++Wb;if(f.open(a.type,a.url,a.async,a.username,a.password),a.xhrFields)for(e in a.xhrFields)f[e]=a.xhrFields[e];a.mimeType&&f.overrideMimeType&&f.overrideMimeType(a.mimeType),a.crossDomain||c["X-Requested-With"]||(c["X-Requested-With"]="XMLHttpRequest");for(e in c)void 0!==c[e]&&f.setRequestHeader(e,c[e]+"");f.send(a.hasContent&&a.data||null),b=function(c,e){var h,i,j;if(b&&(e||4===f.readyState))if(delete Xb[g],b=void 0,f.onreadystatechange=m.noop,e)4!==f.readyState&&f.abort();else{j={},h=f.status,"string"==typeof f.responseText&&(j.text=f.responseText);try{i=f.statusText}catch(k){i=""}h||!a.isLocal||a.crossDomain?1223===h&&(h=204):h=j.text?200:404}j&&d(h,i,j,f.getAllResponseHeaders())},a.async?4===f.readyState?setTimeout(b):f.onreadystatechange=Xb[g]=b:b()},abort:function(){b&&b(void 0,!0)}}}});function Zb(){try{return new a.XMLHttpRequest}catch(b){}}function $b(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}m.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(a){return m.globalEval(a),a}}}),m.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),m.ajaxTransport("script",function(a){if(a.crossDomain){var b,c=y.head||m("head")[0]||y.documentElement;return{send:function(d,e){b=y.createElement("script"),b.async=!0,a.scriptCharset&&(b.charset=a.scriptCharset),b.src=a.url,b.onload=b.onreadystatechange=function(a,c){(c||!b.readyState||/loaded|complete/.test(b.readyState))&&(b.onload=b.onreadystatechange=null,b.parentNode&&b.parentNode.removeChild(b),b=null,c||e(200,"success"))},c.insertBefore(b,c.firstChild)},abort:function(){b&&b.onload(void 0,!0)}}}});var _b=[],ac=/(=)\?(?=&|$)|\?\?/;m.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=_b.pop()||m.expando+"_"+vb++;return this[a]=!0,a}}),m.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(ac.test(b.url)?"url":"string"==typeof b.data&&!(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&ac.test(b.data)&&"data");return h||"jsonp"===b.dataTypes[0]?(e=b.jsonpCallback=m.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(ac,"$1"+e):b.jsonp!==!1&&(b.url+=(wb.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||m.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,_b.push(e)),g&&m.isFunction(f)&&f(g[0]),g=f=void 0}),"script"):void 0}),m.parseHTML=function(a,b,c){if(!a||"string"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||y;var d=u.exec(a),e=!c&&[];return d?[b.createElement(d[1])]:(d=m.buildFragment([a],b,e),e&&e.length&&m(e).remove(),m.merge([],d.childNodes))};var bc=m.fn.load;m.fn.load=function(a,b,c){if("string"!=typeof a&&bc)return bc.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(" ");return h>=0&&(d=m.trim(a.slice(h,a.length)),a=a.slice(0,h)),m.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(f="POST"),g.length>0&&m.ajax({url:a,type:f,dataType:"html",data:b}).done(function(a){e=arguments,g.html(d?m("").append(m.parseHTML(a)).find(d):a)}).complete(c&&function(a,b){g.each(c,e||[a.responseText,b,a])}),this},m.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){m.fn[b]=function(a){return this.on(b,a)}}),m.expr.filters.animated=function(a){return m.grep(m.timers,function(b){return a===b.elem}).length};var cc=a.document.documentElement;function dc(a){return m.isWindow(a)?a:9===a.nodeType?a.defaultView||a.parentWindow:!1}m.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=m.css(a,"position"),l=m(a),n={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=m.css(a,"top"),i=m.css(a,"left"),j=("absolute"===k||"fixed"===k)&&m.inArray("auto",[f,i])>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),m.isFunction(b)&&(b=b.call(a,c,h)),null!=b.top&&(n.top=b.top-h.top+g),null!=b.left&&(n.left=b.left-h.left+e),"using"in b?b.using.call(a,n):l.css(n)}},m.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){m.offset.setOffset(this,a,b)});var b,c,d={top:0,left:0},e=this[0],f=e&&e.ownerDocument;if(f)return b=f.documentElement,m.contains(b,e)?(typeof e.getBoundingClientRect!==K&&(d=e.getBoundingClientRect()),c=dc(f),{top:d.top+(c.pageYOffset||b.scrollTop)-(b.clientTop||0),left:d.left+(c.pageXOffset||b.scrollLeft)-(b.clientLeft||0)}):d},position:function(){if(this[0]){var a,b,c={top:0,left:0},d=this[0];return"fixed"===m.css(d,"position")?b=d.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),m.nodeName(a[0],"html")||(c=a.offset()),c.top+=m.css(a[0],"borderTopWidth",!0),c.left+=m.css(a[0],"borderLeftWidth",!0)),{top:b.top-c.top-m.css(d,"marginTop",!0),left:b.left-c.left-m.css(d,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||cc;while(a&&!m.nodeName(a,"html")&&"static"===m.css(a,"position"))a=a.offsetParent;return a||cc})}}),m.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c=/Y/.test(b);m.fn[a]=function(d){return V(this,function(a,d,e){var f=dc(a);return void 0===e?f?b in f?f[b]:f.document.documentElement[d]:a[d]:void(f?f.scrollTo(c?m(f).scrollLeft():e,c?e:m(f).scrollTop()):a[d]=e)},a,d,arguments.length,null)}}),m.each(["top","left"],function(a,b){m.cssHooks[b]=La(k.pixelPosition,function(a,c){return c?(c=Ja(a,b),Ha.test(c)?m(a).position()[b]+"px":c):void 0})}),m.each({Height:"height",Width:"width"},function(a,b){m.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){m.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return V(this,function(b,c,d){var e;return m.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?m.css(b,c,g):m.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),m.fn.size=function(){return this.length},m.fn.andSelf=m.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return m});var ec=a.jQuery,fc=a.$;return m.noConflict=function(b){return a.$===m&&(a.$=fc),b&&a.jQuery===m&&(a.jQuery=ec),m},typeof b===K&&(a.jQuery=a.$=m),m});
diff --git a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/debug/shared/less.png b/docs/harbour-sailfinder/qml/pages/lib/werkzeug/debug/shared/less.png
deleted file mode 100644
index 5efefd6..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/debug/shared/less.png and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/debug/shared/more.png b/docs/harbour-sailfinder/qml/pages/lib/werkzeug/debug/shared/more.png
deleted file mode 100644
index 804fa22..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/debug/shared/more.png and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/debug/shared/source.png b/docs/harbour-sailfinder/qml/pages/lib/werkzeug/debug/shared/source.png
deleted file mode 100644
index f7ea904..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/debug/shared/source.png and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/debug/shared/style.css b/docs/harbour-sailfinder/qml/pages/lib/werkzeug/debug/shared/style.css
deleted file mode 100644
index 8833d01..0000000
--- a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/debug/shared/style.css
+++ /dev/null
@@ -1,142 +0,0 @@
-@font-face {
- font-family: 'Ubuntu';
- font-style: normal;
- font-weight: normal;
- src: local('Ubuntu'), local('Ubuntu-Regular'),
- url('?__debugger__=yes&cmd=resource&f=ubuntu.ttf') format('truetype');
-}
-
-body, input { font-family: 'Lucida Grande', 'Lucida Sans Unicode', 'Geneva',
- 'Verdana', sans-serif; color: #000; text-align: center;
- margin: 1em; padding: 0; font-size: 15px; }
-h1, h2, h3 { font-family: 'Ubuntu', 'Lucida Grande', 'Lucida Sans Unicode',
- 'Geneva', 'Verdana', sans-serif; font-weight: normal; }
-
-input { background-color: #fff; margin: 0; text-align: left;
- outline: none !important; }
-input[type="submit"] { padding: 3px 6px; }
-a { color: #11557C; }
-a:hover { color: #177199; }
-pre, code,
-textarea { font-family: 'Consolas', 'Monaco', 'Bitstream Vera Sans Mono',
- monospace; font-size: 14px; }
-
-div.debugger { text-align: left; padding: 12px; margin: auto;
- background-color: white; }
-h1 { font-size: 36px; margin: 0 0 0.3em 0; }
-div.detail p { margin: 0 0 8px 13px; font-size: 14px; white-space: pre-wrap; }
-div.explanation { margin: 20px 13px; font-size: 15px; color: #555; }
-div.footer { font-size: 13px; text-align: right; margin: 30px 0;
- color: #86989B; }
-
-h2 { font-size: 16px; margin: 1.3em 0 0.0 0; padding: 9px;
- background-color: #11557C; color: white; }
-h2 em, h3 em { font-style: normal; color: #A5D6D9; font-weight: normal; }
-
-div.traceback, div.plain { border: 1px solid #ddd; margin: 0 0 1em 0; padding: 10px; }
-div.plain p { margin: 0; }
-div.plain textarea,
-div.plain pre { margin: 10px 0 0 0; padding: 4px;
- background-color: #E8EFF0; border: 1px solid #D3E7E9; }
-div.plain textarea { width: 99%; height: 300px; }
-div.traceback h3 { font-size: 1em; margin: 0 0 0.8em 0; }
-div.traceback ul { list-style: none; margin: 0; padding: 0 0 0 1em; }
-div.traceback h4 { font-size: 13px; font-weight: normal; margin: 0.7em 0 0.1em 0; }
-div.traceback pre { margin: 0; padding: 5px 0 3px 15px;
- background-color: #E8EFF0; border: 1px solid #D3E7E9; }
-div.traceback pre:hover { background-color: #DDECEE; color: black; cursor: pointer; }
-div.traceback div.source.expanded pre + pre { border-top: none; }
-
-div.traceback span.ws { display: none; }
-div.traceback pre.before, div.traceback pre.after { display: none; background: white; }
-div.traceback div.source.expanded pre.before,
-div.traceback div.source.expanded pre.after {
- display: block;
-}
-
-div.traceback div.source.expanded span.ws {
- display: inline;
-}
-
-div.traceback blockquote { margin: 1em 0 0 0; padding: 0; }
-div.traceback img { float: right; padding: 2px; margin: -3px 2px 0 0; display: none; }
-div.traceback img:hover { background-color: #ddd; cursor: pointer;
- border-color: #BFDDE0; }
-div.traceback pre:hover img { display: block; }
-div.traceback cite.filename { font-style: normal; color: #3B666B; }
-
-pre.console { border: 1px solid #ccc; background: white!important;
- color: black; padding: 5px!important;
- margin: 3px 0 0 0!important; cursor: default!important;
- max-height: 400px; overflow: auto; }
-pre.console form { color: #555; }
-pre.console input { background-color: transparent; color: #555;
- width: 90%; font-family: 'Consolas', 'Deja Vu Sans Mono',
- 'Bitstream Vera Sans Mono', monospace; font-size: 14px;
- border: none!important; }
-
-span.string { color: #30799B; }
-span.number { color: #9C1A1C; }
-span.help { color: #3A7734; }
-span.object { color: #485F6E; }
-span.extended { opacity: 0.5; }
-span.extended:hover { opacity: 1; }
-a.toggle { text-decoration: none; background-repeat: no-repeat;
- background-position: center center;
- background-image: url(?__debugger__=yes&cmd=resource&f=more.png); }
-a.toggle:hover { background-color: #444; }
-a.open { background-image: url(?__debugger__=yes&cmd=resource&f=less.png); }
-
-pre.console div.traceback,
-pre.console div.box { margin: 5px 10px; white-space: normal;
- border: 1px solid #11557C; padding: 10px;
- font-family: 'Lucida Grande', 'Lucida Sans Unicode', 'Geneva',
- 'Verdana', sans-serif; }
-pre.console div.box h3,
-pre.console div.traceback h3 { margin: -10px -10px 10px -10px; padding: 5px;
- background: #11557C; color: white; }
-
-pre.console div.traceback pre:hover { cursor: default; background: #E8EFF0; }
-pre.console div.traceback pre.syntaxerror { background: inherit; border: none;
- margin: 20px -10px -10px -10px;
- padding: 10px; border-top: 1px solid #BFDDE0;
- background: #E8EFF0; }
-pre.console div.noframe-traceback pre.syntaxerror { margin-top: -10px; border: none; }
-
-pre.console div.box pre.repr { padding: 0; margin: 0; background-color: white; border: none; }
-pre.console div.box table { margin-top: 6px; }
-pre.console div.box pre { border: none; }
-pre.console div.box pre.help { background-color: white; }
-pre.console div.box pre.help:hover { cursor: default; }
-pre.console table tr { vertical-align: top; }
-div.console { border: 1px solid #ccc; padding: 4px; background-color: #fafafa; }
-
-div.traceback pre, div.console pre {
- white-space: pre-wrap; /* css-3 should we be so lucky... */
- white-space: -moz-pre-wrap; /* Mozilla, since 1999 */
- white-space: -pre-wrap; /* Opera 4-6 ?? */
- white-space: -o-pre-wrap; /* Opera 7 ?? */
- word-wrap: break-word; /* Internet Explorer 5.5+ */
- _white-space: pre; /* IE only hack to re-specify in
- addition to word-wrap */
-}
-
-
-div.pin-prompt {
- position: absolute;
- display: none;
- top: 0;
- bottom: 0;
- left: 0;
- right: 0;
- background: rgba(255, 255, 255, 0.8);
-}
-
-div.pin-prompt .inner {
- background: #eee;
- padding: 10px 50px;
- width: 350px;
- margin: 10% auto 0 auto;
- border: 1px solid #ccc;
- border-radius: 2px;
-}
diff --git a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/debug/shared/ubuntu.ttf b/docs/harbour-sailfinder/qml/pages/lib/werkzeug/debug/shared/ubuntu.ttf
deleted file mode 100644
index 8079f93..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/debug/shared/ubuntu.ttf and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/debug/tbtools.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/werkzeug/debug/tbtools.cpython-34.pyc
deleted file mode 100644
index d8126bb..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/debug/tbtools.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/exceptions.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/werkzeug/exceptions.cpython-34.pyc
deleted file mode 100644
index 9dde24d..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/exceptions.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/filesystem.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/werkzeug/filesystem.cpython-34.pyc
deleted file mode 100644
index 3d52c20..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/filesystem.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/formparser.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/werkzeug/formparser.cpython-34.pyc
deleted file mode 100644
index 02ed842..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/formparser.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/http.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/werkzeug/http.cpython-34.pyc
deleted file mode 100644
index 07089c5..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/http.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/local.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/werkzeug/local.cpython-34.pyc
deleted file mode 100644
index 4382edd..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/local.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/posixemulation.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/werkzeug/posixemulation.cpython-34.pyc
deleted file mode 100644
index 67748e9..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/posixemulation.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/routing.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/werkzeug/routing.cpython-34.pyc
deleted file mode 100644
index 8a28bb4..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/routing.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/script.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/werkzeug/script.cpython-34.pyc
deleted file mode 100644
index 1a43f4d..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/script.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/security.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/werkzeug/security.cpython-34.pyc
deleted file mode 100644
index 06d1891..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/security.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/serving.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/werkzeug/serving.cpython-34.pyc
deleted file mode 100644
index 1da1518..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/serving.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/test.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/werkzeug/test.cpython-34.pyc
deleted file mode 100644
index 1925080..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/test.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/testapp.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/werkzeug/testapp.cpython-34.pyc
deleted file mode 100644
index e565ef5..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/testapp.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/urls.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/werkzeug/urls.cpython-34.pyc
deleted file mode 100644
index e90b5c3..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/urls.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/useragents.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/werkzeug/useragents.cpython-34.pyc
deleted file mode 100644
index 293aa66..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/useragents.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/utils.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/werkzeug/utils.cpython-34.pyc
deleted file mode 100644
index acdd389..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/utils.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/wrappers.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/werkzeug/wrappers.cpython-34.pyc
deleted file mode 100644
index ede5373..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/wrappers.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/wsgi.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/lib/werkzeug/wsgi.cpython-34.pyc
deleted file mode 100644
index 4d2233d..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/lib/werkzeug/wsgi.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/robobrowser/__init__.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/robobrowser/__init__.cpython-34.pyc
deleted file mode 100644
index 9c21119..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/robobrowser/__init__.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/robobrowser/browser.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/robobrowser/browser.cpython-34.pyc
deleted file mode 100644
index 81e894b..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/robobrowser/browser.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/robobrowser/cache.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/robobrowser/cache.cpython-34.pyc
deleted file mode 100644
index 5bf6b10..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/robobrowser/cache.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/robobrowser/compat.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/robobrowser/compat.cpython-34.pyc
deleted file mode 100644
index 5b71d0a..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/robobrowser/compat.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/robobrowser/exceptions.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/robobrowser/exceptions.cpython-34.pyc
deleted file mode 100644
index 473a1e2..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/robobrowser/exceptions.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/robobrowser/forms/__init__.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/robobrowser/forms/__init__.cpython-34.pyc
deleted file mode 100644
index 281d238..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/robobrowser/forms/__init__.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/robobrowser/forms/fields.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/robobrowser/forms/fields.cpython-34.pyc
deleted file mode 100644
index bf3cfff..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/robobrowser/forms/fields.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/robobrowser/forms/form.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/robobrowser/forms/form.cpython-34.pyc
deleted file mode 100644
index eef5149..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/robobrowser/forms/form.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/robobrowser/helpers.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/robobrowser/helpers.cpython-34.pyc
deleted file mode 100644
index 2ed9659..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/robobrowser/helpers.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/robobrowser/ordereddict.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/robobrowser/ordereddict.cpython-34.pyc
deleted file mode 100644
index ef5515a..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/robobrowser/ordereddict.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/qml/pages/robobrowser/responses.cpython-34.pyc b/docs/harbour-sailfinder/qml/pages/robobrowser/responses.cpython-34.pyc
deleted file mode 100644
index f698af3..0000000
Binary files a/docs/harbour-sailfinder/qml/pages/robobrowser/responses.cpython-34.pyc and /dev/null differ
diff --git a/docs/harbour-sailfinder/rpm/harbour-sailfinder.changes.in b/docs/harbour-sailfinder/rpm/harbour-sailfinder.changes.in
deleted file mode 100644
index 92ed38d..0000000
--- a/docs/harbour-sailfinder/rpm/harbour-sailfinder.changes.in
+++ /dev/null
@@ -1,14 +0,0 @@
-# Rename this file as harbour-sailfinder.changes to include changelog
-# entries in your RPM file.
-#
-# Add new changelog entries following the format below.
-# Add newest entries to the top of the list.
-# Separate entries from eachother with a blank line.
-
-# * date Author's Name
version-release
-# - Summary of changes
-
-* Sun Apr 13 2014 Jack Tar 0.0.1-1
-- Scrubbed the deck
-- Hoisted the sails
-
diff --git a/docs/harbour-sailfinder/rpm/harbour-sailfinder.spec b/docs/harbour-sailfinder/rpm/harbour-sailfinder.spec
deleted file mode 100644
index ff1ee1b..0000000
--- a/docs/harbour-sailfinder/rpm/harbour-sailfinder.spec
+++ /dev/null
@@ -1,71 +0,0 @@
-#
-# Do NOT Edit the Auto-generated Part!
-# Generated by: spectacle version 0.27
-#
-
-Name: harbour-sailfinder
-
-# >> macros
-# << macros
-
-%{!?qtc_qmake:%define qtc_qmake %qmake}
-%{!?qtc_qmake5:%define qtc_qmake5 %qmake5}
-%{!?qtc_make:%define qtc_make make}
-%{?qtc_builddir:%define _builddir %qtc_builddir}
-Summary: Sailfinder
-Version: 2.5
-Release: 1
-Group: Qt/Qt
-License: LICENSE
-URL: http://example.org/
-Source0: %{name}-%{version}.tar.bz2
-Source100: harbour-sailfinder.yaml
-Requires: sailfishsilica-qt5 >= 0.10.9
-BuildRequires: pkgconfig(sailfishapp) >= 1.0.2
-BuildRequires: pkgconfig(Qt5Core)
-BuildRequires: pkgconfig(Qt5Qml)
-BuildRequires: pkgconfig(Qt5Quick)
-BuildRequires: desktop-file-utils
-
-%description
-Short description of my Sailfish OS Application
-
-
-%prep
-%setup -q -n %{name}-%{version}
-
-# >> setup
-# << setup
-
-%build
-# >> build pre
-# << build pre
-
-%qtc_qmake5
-
-%qtc_make %{?_smp_mflags}
-
-# >> build post
-# << build post
-
-%install
-rm -rf %{buildroot}
-# >> install pre
-# << install pre
-%qmake5_install
-
-# >> install post
-# << install post
-
-desktop-file-install --delete-original \
- --dir %{buildroot}%{_datadir}/applications \
- %{buildroot}%{_datadir}/applications/*.desktop
-
-%files
-%defattr(-,root,root,-)
-%{_bindir}
-%{_datadir}/%{name}
-%{_datadir}/applications/%{name}.desktop
-%{_datadir}/icons/hicolor/*/apps/%{name}.png
-# >> files
-# << files
diff --git a/docs/harbour-sailfinder/rpm/harbour-sailfinder.yaml b/docs/harbour-sailfinder/rpm/harbour-sailfinder.yaml
deleted file mode 100644
index 4729c76..0000000
--- a/docs/harbour-sailfinder/rpm/harbour-sailfinder.yaml
+++ /dev/null
@@ -1,45 +0,0 @@
-Name: harbour-sailfinder
-Summary: Sailfinder
-Version: 2.5
-Release: 1
-# The contents of the Group field should be one of the groups listed here:
-# http://gitorious.org/meego-developer-tools/spectacle/blobs/master/data/GROUPS
-Group: Qt/Qt
-URL: http://example.org/
-License: LICENSE
-# This must be generated before uploading a package to a remote build service.
-# Usually this line does not need to be modified.
-Sources:
-- '%{name}-%{version}.tar.bz2'
-Description: |
- Short description of my Sailfish OS Application
-Configure: none
-# The qtc5 builder inserts macros to allow QtCreator to have fine
-# control over qmake/make execution
-Builder: qtc5
-
-# This section specifies build dependencies that are resolved using pkgconfig.
-# This is the preferred way of specifying build dependencies for your package.
-PkgConfigBR:
- - sailfishapp >= 1.0.2
- - Qt5Core
- - Qt5Qml
- - Qt5Quick
-
-# Build dependencies without a pkgconfig setup can be listed here
-# PkgBR:
-# - package-needed-to-build
-
-# Runtime dependencies which are not automatically detected
-Requires:
- - sailfishsilica-qt5 >= 0.10.9
-
-# All installed files
-Files:
- - '%{_bindir}'
- - '%{_datadir}/%{name}'
- - '%{_datadir}/applications/%{name}.desktop'
- - '%{_datadir}/icons/hicolor/*/apps/%{name}.png'
-
-# For more information about yaml and what's supported in Sailfish OS
-# build system, please see https://wiki.merproject.org/wiki/Spectacle
diff --git a/docs/harbour-sailfinder/src/harbour-sailfinder.cpp b/docs/harbour-sailfinder/src/harbour-sailfinder.cpp
deleted file mode 100644
index 0e24cbb..0000000
--- a/docs/harbour-sailfinder/src/harbour-sailfinder.cpp
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- Copyright (C) 2013 Jolla Ltd.
- Contact: Thomas Perl
- All rights reserved.
-
- You may use this file under the terms of BSD license as follows:
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
- * Neither the name of the Jolla Ltd nor the
- names of its contributors may be used to endorse or promote products
- derived from this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#ifdef QT_QML_DEBUG
-#include
-#endif
-
-#include
-
-
-int main(int argc, char *argv[])
-{
- // SailfishApp::main() will display "qml/template.qml", if you need more
- // control over initialization, you can use:
- //
- // - SailfishApp::application(int, char *[]) to get the QGuiApplication *
- // - SailfishApp::createView() to get a new QQuickView * instance
- // - SailfishApp::pathTo(QString) to get a QUrl to a resource file
- //
- // To display the view, call "show()" (will show fullscreen on device).
-
- return SailfishApp::main(argc, argv);
-}
diff --git a/docs/harbour-sailfinder/translations/harbour-sailfinder-de.ts b/docs/harbour-sailfinder/translations/harbour-sailfinder-de.ts
deleted file mode 100644
index 896f143..0000000
--- a/docs/harbour-sailfinder/translations/harbour-sailfinder-de.ts
+++ /dev/null
@@ -1,649 +0,0 @@
-
-
-
-
- AboutPage
-
- N/A
-
-
-
-
- ErrorPage
-
- ERROR!
-
-
-
- Report this error
-
-
-
- The error has been copied to your clipboard, please report it on Github or on Openrepos.net (Github is preferred).
-
-
-
- Sailfinder bug tracker
-
-
-
- Sailfinder on Openrepos.net
-
-
-
-
- FirstPage
-
- Login
-
-
-
- Logging in...
-
-
-
- Login failed :-(, check your e-mail & password.
-
-
-
-
- GalleryPage
-
- Facebook albums
-
-
-
- Facebook login expired :-(
-
-
-
- Relogin into Facebook
-
-
-
- Can't download albums :-(
-
-
-
- Check your Facebook permissions
-
-
-
- Gallery
-
-
-
- Upload
-
-
-
- Relogin with Facebook
-
-
-
- Restart Sailfinder now
-
-
-
- Shutdown in 5 seconds
-
-
-
-
- MainPage
-
- No data
-
-
-
- Out of likes!
-
-
-
- Searching for people
-
-
-
- A moment please...
-
-
-
- Searching...
-
-
-
- Loading new people...
-
-
-
- API ERROR
-
-
-
- Reloading in 5 seconds
-
-
-
- Settings
-
-
-
- Profile
-
-
-
- People
-
-
-
- School
-
-
-
- Job
-
-
-
- Instagram
-
-
-
- Matched with:
-
-
-
- Open People
-
-
-
- Swipe further
-
-
-
- No new users in the area :-(
-
-
-
- Extend your search criteria...
-
-
-
- Tinder login expired
-
-
-
- Relogin please
-
-
-
- Account banned :-(
-
-
-
- You can't use Sailfinder without a valid account
-
-
-
- Banned!
-
-
-
-
- MessagingPage
-
- Last seen:
-
-
-
- N/A
-
-
-
- last seen: N/A
-
-
-
- Hi
-
-
-
- !
-
-
-
- Search for GIFs
-
-
-
- GIF
-
-
-
- Message send!
-
-
-
- No messages :(
-
-
-
- Say hi to
-
-
-
-
- NetworkStatus
-
- Network connection error :-(
-
-
-
- Checking connection
-
-
-
-
- PeoplePage
-
- matches
-
-
-
- match
-
-
-
- No matches
-
-
-
- People
-
-
-
- Refresh
-
-
-
- Refreshing...
-
-
-
- A moment please
-
-
-
- Loading matches...
-
-
-
- No matches :-(
-
-
-
- Go swipe on some people!
-
-
-
-
- ProfilePage
-
- 's profile
-
-
-
- Profile
-
-
-
- Update profile
-
-
-
- School
-
-
-
- Job
-
-
-
-
- SailfinderPage
-
- What's Sailfinder?
-
-
-
- Sailfinder is an unofficial Tinder client for Sailfish OS. The application is opensource GPLv3 software and based on PyOtherSide.
-
-
-
- Source code
-
-
-
- Privacy policy
-
-
-
- • Sailfinder will NEVER collect any personal information about the user, but I can't guarantee that the third-party companies used in Sailfinder (Tinder, Facebook, MapQuest, ...) won't collect any information.
-
-• Sailfinder NEVER connects to the analytics API of Tinder, which collects data about the usage of the app in the background on Android.
-
-
-
- Support Sailfinder!
-
-
-
- Donate with Paypal
-
-
-
- I put in a lot of time to develop Sailfinder so please buy me a coffee :)
-
-
-
- Other
-
-
-
- • Developped by Dylan Van Assche (modulebaan)
-
-
-
- Modulebaan.tk
-
-
-
- • Icons by Paomedia
-
-
-
- Paomedia icons on Github
-
-
-
- • Messaging based on 'mitakuuluu-ui-ng' from Thomas Boutroue
-
-
-
- Mitakuuluu-ui-ng on Gitlab
-
-
-
-
- SettingsPage
-
- Settings
-
-
-
- Show bio
-
-
-
- Show school
-
-
-
- Show job
-
-
-
- Show Instagram account
-
-
-
- Location
-
-
-
- Latitude:
-
-
-
- Longitude:
-
-
-
- Waiting for GPS signal...
-
-
-
- 🔎 Zoom map
-
-
-
- Offline
-
-
-
- Name
-
-
-
- N/A
-
-
-
- Type
-
-
-
- Signal strength
-
-
-
- Logout
-
-
-
- Logout Tinder
-
-
-
- About this app
-
-
-
- About
-
-
-
- Online
-
-
-
-
- UpdateProfilePage
-
- N/A
-
-
-
- Facebook
-
-
-
- Local
-
-
-
- Delete
-
-
-
- Save
-
-
-
- Update profile
-
-
-
- Photos
-
-
-
- Upload a new picture
-
-
-
- Delete this picture
-
-
-
- Select a picture
-
-
-
- Bio
-
-
-
- Type your bio here.
-
-
-
- Your bio (max 500 characters)
-
-
-
- Gender
-
-
-
- Male
-
-
-
- Female
-
-
-
- Username
-
-
-
- Tinder username
-
-
-
- Share your profile now!
-
-
-
- Get share URL
-
-
-
- My share URL
-
-
-
- Share text
-
-
-
- Delete username
-
-
-
- Username succesfully deleted!
-
-
-
- Enable discovery to edit your username.
-
-
-
- Discoverable
-
-
-
- Discovery
-
-
-
- Choose if other people can see your Tinder profile or not. This has no effect on your matches you already have. When disabled, you can't change your search criteria.
-
-
-
- Search criteria
-
-
-
- Interested in:
-
-
-
- Everyone
-
-
-
- Minimum age
-
-
-
- Maximum age
-
-
-
- Search distance
-
-
-
- Enable discovery to change the search criteria.
-
-
-
- Username already in use!
-
-
-
- Username created!
-
-
-
- Username changed!
-
-
-
- Username deleted!
-
-
-
-
- helper
-
- days ago
-
-
-
- day ago
-
-
-
- hours ago
-
-
-
- hour ago
-
-
-
- minutes ago
-
-
-
- minute ago
-
-
-
- just now
-
-
-
-
diff --git a/docs/harbour-sailfinder/translations/harbour-sailfinder.ts b/docs/harbour-sailfinder/translations/harbour-sailfinder.ts
deleted file mode 100644
index 896f143..0000000
--- a/docs/harbour-sailfinder/translations/harbour-sailfinder.ts
+++ /dev/null
@@ -1,649 +0,0 @@
-
-
-
-
- AboutPage
-
- N/A
-
-
-
-
- ErrorPage
-
- ERROR!
-
-
-
- Report this error
-
-
-
- The error has been copied to your clipboard, please report it on Github or on Openrepos.net (Github is preferred).
-
-
-
- Sailfinder bug tracker
-
-
-
- Sailfinder on Openrepos.net
-
-
-
-
- FirstPage
-
- Login
-
-
-
- Logging in...
-
-
-
- Login failed :-(, check your e-mail & password.
-
-
-
-
- GalleryPage
-
- Facebook albums
-
-
-
- Facebook login expired :-(
-
-
-
- Relogin into Facebook
-
-
-
- Can't download albums :-(
-
-
-
- Check your Facebook permissions
-
-
-
- Gallery
-
-
-
- Upload
-
-
-
- Relogin with Facebook
-
-
-
- Restart Sailfinder now
-
-
-
- Shutdown in 5 seconds
-
-
-
-
- MainPage
-
- No data
-
-
-
- Out of likes!
-
-
-
- Searching for people
-
-
-
- A moment please...
-
-
-
- Searching...
-
-
-
- Loading new people...
-
-
-
- API ERROR
-
-
-
- Reloading in 5 seconds
-
-
-
- Settings
-
-
-
- Profile
-
-
-
- People
-
-
-
- School
-
-
-
- Job
-
-
-
- Instagram
-
-
-
- Matched with:
-
-
-
- Open People
-
-
-
- Swipe further
-
-
-
- No new users in the area :-(
-
-
-
- Extend your search criteria...
-
-
-
- Tinder login expired
-
-
-
- Relogin please
-
-
-
- Account banned :-(
-
-
-
- You can't use Sailfinder without a valid account
-
-
-
- Banned!
-
-
-
-
- MessagingPage
-
- Last seen:
-
-
-
- N/A
-
-
-
- last seen: N/A
-
-
-
- Hi
-
-
-
- !
-
-
-
- Search for GIFs
-
-
-
- GIF
-
-
-
- Message send!
-
-
-
- No messages :(
-
-
-
- Say hi to
-
-
-
-
- NetworkStatus
-
- Network connection error :-(
-
-
-
- Checking connection
-
-
-
-
- PeoplePage
-
- matches
-
-
-
- match
-
-
-
- No matches
-
-
-
- People
-
-
-
- Refresh
-
-
-
- Refreshing...
-
-
-
- A moment please
-
-
-
- Loading matches...
-
-
-
- No matches :-(
-
-
-
- Go swipe on some people!
-
-
-
-
- ProfilePage
-
- 's profile
-
-
-
- Profile
-
-
-
- Update profile
-
-
-
- School
-
-
-
- Job
-
-
-
-
- SailfinderPage
-
- What's Sailfinder?
-
-
-
- Sailfinder is an unofficial Tinder client for Sailfish OS. The application is opensource GPLv3 software and based on PyOtherSide.
-
-
-
- Source code
-
-
-
- Privacy policy
-
-
-
- • Sailfinder will NEVER collect any personal information about the user, but I can't guarantee that the third-party companies used in Sailfinder (Tinder, Facebook, MapQuest, ...) won't collect any information.
-
-• Sailfinder NEVER connects to the analytics API of Tinder, which collects data about the usage of the app in the background on Android.
-
-
-
- Support Sailfinder!
-
-
-
- Donate with Paypal
-
-
-
- I put in a lot of time to develop Sailfinder so please buy me a coffee :)
-
-
-
- Other
-
-
-
- • Developped by Dylan Van Assche (modulebaan)
-
-
-
- Modulebaan.tk
-
-
-
- • Icons by Paomedia
-
-
-
- Paomedia icons on Github
-
-
-
- • Messaging based on 'mitakuuluu-ui-ng' from Thomas Boutroue
-
-
-
- Mitakuuluu-ui-ng on Gitlab
-
-
-
-
- SettingsPage
-
- Settings
-
-
-
- Show bio
-
-
-
- Show school
-
-
-
- Show job
-
-
-
- Show Instagram account
-
-
-
- Location
-
-
-
- Latitude:
-
-
-
- Longitude:
-
-
-
- Waiting for GPS signal...
-
-
-
- 🔎 Zoom map
-
-
-
- Offline
-
-
-
- Name
-
-
-
- N/A
-
-
-
- Type
-
-
-
- Signal strength
-
-
-
- Logout
-
-
-
- Logout Tinder
-
-
-
- About this app
-
-
-
- About
-
-
-
- Online
-
-
-
-
- UpdateProfilePage
-
- N/A
-
-
-
- Facebook
-
-
-
- Local
-
-
-
- Delete
-
-
-
- Save
-
-
-
- Update profile
-
-
-
- Photos
-
-
-
- Upload a new picture
-
-
-
- Delete this picture
-
-
-
- Select a picture
-
-
-
- Bio
-
-
-
- Type your bio here.
-
-
-
- Your bio (max 500 characters)
-
-
-
- Gender
-
-
-
- Male
-
-
-
- Female
-
-
-
- Username
-
-
-
- Tinder username
-
-
-
- Share your profile now!
-
-
-
- Get share URL
-
-
-
- My share URL
-
-
-
- Share text
-
-
-
- Delete username
-
-
-
- Username succesfully deleted!
-
-
-
- Enable discovery to edit your username.
-
-
-
- Discoverable
-
-
-
- Discovery
-
-
-
- Choose if other people can see your Tinder profile or not. This has no effect on your matches you already have. When disabled, you can't change your search criteria.
-
-
-
- Search criteria
-
-
-
- Interested in:
-
-
-
- Everyone
-
-
-
- Minimum age
-
-
-
- Maximum age
-
-
-
- Search distance
-
-
-
- Enable discovery to change the search criteria.
-
-
-
- Username already in use!
-
-
-
- Username created!
-
-
-
- Username changed!
-
-
-
- Username deleted!
-
-
-
-
- helper
-
- days ago
-
-
-
- day ago
-
-
-
- hours ago
-
-
-
- hour ago
-
-
-
- minutes ago
-
-
-
- minute ago
-
-
-
- just now
-
-
-
-
diff --git a/docs/python_api b/docs/python_api
deleted file mode 100755
index 7c0ed42..0000000
--- a/docs/python_api
+++ /dev/null
@@ -1,433 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-@title: Sailfinder API
-@description: API for Sailfinder to connect with the Tinder servers
-
-@author: Dylan Van Assche
-"""
-import json
-import time
-import pyotherside
-import os
-from lib import constants, requests
-
-session = requests.Session() #Tinder session
-fb_token = ''
-fb_user_id = ''
-last_active = ''
-file_version = 'Sailfinder V2.0'
-
-def uploadTinder(imageFile, userID): #BROKEN
- #print 'UPLOAD'
- image = {'media': open('test.jpeg', 'rb')}
- return session.post('https://imageupload.gotinder.com/image?client_photo_id=ProfilePhoto' + str(int(time.time())*1000), json={'userId': userID}, files={'file': open('test.jpeg', 'rb')})
- #return session.post(constants.TINDER_IMAGE_HOST + '/image?client_photo_id=ProfilePhoto' + str(int(time.time())*1000), data={'userId': '56d422d94f10e5db60fe7823'}, files={'file': open('test.jpeg', 'rb')})
-
-def postTinder(url, data): #OK
- #print 'POST'
- result = session.post(constants.TINDER_HOST + url, data=data)
- if(result.status_code == 200 or result.status_code == 204 or result.status_code == 201):
- try:
- return result.json()
- except:
- return True
- else:
- return False
-
-def getTinder(url, data): #OK
- #print 'GET'
- result = session.post(constants.TINDER_HOST + url, data=data)
- if(result.status_code == 200 or result.status_code == 204 or result.status_code == 201):
- try:
- return result.json()
- except:
- return True
- else:
- return False
-
-def deleteTinder(url, data): #OK
- #print 'DELETE'
- result = session.delete(constants.TINDER_HOST + url, data=data)
-
- if(result.status_code == 200 or result.status_code == 204 or result.status_code == 201):
- try:
- result.json()
- except:
- return True
- else:
- return False
-
-def putTinder(url, data): #OK
- #print 'PUT'
- result = session.put(constants.TINDER_HOST + url, data=data)
- if(result.status_code == 200 or result.status_code == 204 or result.status_code == 201):
- try:
- result.json()
- except:
- return True
- else:
- return False
-
-def loginFacebook(fb_login_url): #OK
- global fb_token
- global fb_user_id
- if(fb_login_url.find("access_token")):
- try:
- link, fb_token, expireTime = fb_login_url.split("=")
- fb_token, trash = fb_token.split("&")
- fb_id_API_url = "https://graph.facebook.com/me?fields=id&access_token=" + fb_token
- fb_user_id = requests.get(fb_id_API_url).json()
- fb_user_id = fb_user_id['id']
- pyotherside.send('loginFacebook', str(fb_user_id), fb_token)
- except:
- pyotherside.send('loginFacebook', False)
-
-def loginTinder(fb_id, fb_token): #OK
- session.headers.update(constants.HEADERS)
- data = json.dumps({"facebook_id": str(fb_id),"facebook_token": fb_token})
- login = postTinder('/auth', data)
- if 'token' not in login:
- pyotherside.send('loginTinder', False)
- #print 'FAIL'
- else:
- tinder_token = login['token']
- session.headers.update({"X-Auth-Token": str(tinder_token)})
- writeFile('tinder.token', str(tinder_token), False, True)
- pyotherside.send('loginTinder', tinder_token)
-
-def read_tinder_token():
- tinder_token = readFile('tinder.token')
- tinder_token = str(tinder_token[0])
- if len(tinder_token) > 5:
- session.headers.update(constants.HEADERS)
- session.headers.update({"X-Auth-Token": tinder_token})
- pyotherside.send('loginTinder', tinder_token)
- else:
- pyotherside.send('loginTinder', False)
-
-def remove_tinder_token():
- deleteFile('tinder.token')
-
-def recommendations(): #OK
- data = json.dumps({"limit": 10})
- recommendations = postTinder('/user/recs', data)
- format_recommendations(recommendations)
-
-def format_recommendations(recommendations):
- try:
- pyotherside.send('recommendations',recommendations['results'])
- except:
- try:
- pyotherside.send('recommendations',recommendations['message'])
- except:
- pyotherside.send('recommendations',recommendations)
-
-def like(personID): #OK
- data = json.dumps({})
- result = getTinder('/like/' + personID, data)
- pyotherside.send('like', result)
-
-def dislike(personID): #OK
- data = json.dumps({})
- result = getTinder('/pass/' + personID, data)
- pyotherside.send('dislike', result)
-
-def superlike(personID): #OK
- data = json.dumps({})
- result = getTinder('/like/' + personID +'/super', data)
- try:
- if(result['super_likes']['remaining'] == 0):
- resets_in = result['super_likes']['resets_at']
- writeFile('superlike.txt', str(resets_in) + "\n", False, True)
- except:
- pass
- pyotherside.send('superlike', result)
-
-def matches(since): #OK
- if(since):
- matches = updates(since)['matches']
- else:
- matches = updates(False)['matches']
- return matches
-
-def report(userID, causeID): #NEEDS TESTING
- data = json.dumps({"cause": causeID})
- result = postTinder('/report/' + userID, data)
- pyotherside.send("REPORT_DEBUG", result)
-
-def unmatch(matchID): #NEEDS TESTING
- data = json.dumps({})
- result = deleteTinder('/user/matches/' + matchID, data)
- pyotherside.send('UNMATCH_DEBUG', result)
-
-def profile(): #OK
- data = json.dumps({})
- profile = getTinder('/profile', data)
- pyotherside.send('profile', profile)
-
-def update_profile(discoverable, age_min, age_max, gender, gender_filter, distance, bio): #OK
- data = json.dumps({"discoverable" : discoverable, "age_filter_min" : age_min, "age_filter_max" : age_max, "gender": gender, "gender_filter" : gender_filter, "distance_filter" : distance, "bio": bio})
- updated_profile = postTinder('/profile', data)
- pyotherside.send('updated_profile', updated_profile)
-
-def delete_account():
- data = json.dumps({})
- result = deleteTinder('/profile', data)
- pyotherside('delete_account', result)
-
-def update_schools(fb_school_id):
- data = json.dumps({"schools": [{"id": fb_school_id}]})
- schools = putTinder('/profile/school', data)
- pyotherside.send('schools', schools)
-
-def delete_schools():
- data = json.dumps({})
- schools = deleteTinder('/profile/school', data)
- pyotherside.send('schools', schools)
-
-def update_jobs(fb_job_id):
- data = json.dumps({"company": [{"id": fb_job_id}]})
- jobs = putTinder('/profile/job', data)
- pyotherside.send('jobs', jobs)
-
-def delete_jobs():
- data = json.dumps({})
- jobs = deleteTinder('/profile/job', data)
- pyotherside.send('jobs', jobs)
-
-def create_username(username): #OK
- data = json.dumps({"username": username})
- result = postTinder('/profile/username', data)
- if(result):
- pyotherside.send('username', 1)
- else:
- pyotherside.send('username', False)
-
-def update_username(username): #OK
- data = json.dumps({"username": username})
- result = putTinder('/profile/username', data)
- #{u'error': u'User has already registered a username'}
- #{u'error': u'User has no username to update'}
- if(result):
- pyotherside.send('username', 2)
- else:
- pyotherside.send('username', False)
-
-def delete_username(): #OK
- result = deleteTinder('/profile/username', None)
- # {u'error': u'User has no username to remove'}
- if(result):
- pyotherside.send('username', 3)
- else:
- pyotherside.send('username', False)
-
-def share_link(tinder_user_id): #OK
- url = postTinder('/user/' + tinder_user_id + '/share', None)
- #pyotherside.send('SHARE LINK HTTP CODE', status_code)
- pyotherside.send('sharelink', url)
-
-def updates(since): #OK
- if since:
- data = json.dumps({"last_activity_date:" : str(since)})
- updates = postTinder('/updates', data)
- else:
- data = json.dumps({"last_activity_date:" : str(since)})
- updates = postTinder('/updates', data)
- return updates
-
-def meta(): #NOT FOUND HTTP 404, LIKES REMAININGS SEE RESPONDS WHEN LIKE/DISLIKE/SUPERLIKE
-# data = json.dumps({})
-# meta = getTinder('/meta', data)
-# return meta
- return 'API deprecated'
-
-def update_location(lat, lon): #OK
- data = json.dumps({"lat": lat, "lon" : lon})
- location = postTinder('/user/ping', data)
- pyotherside.send('location', True)
-
-def upload_picture(imageFile): #BROKEN HTTP 500
- pictures = uploadTinder(imageFile)
- return pictures
-
-def upload_fb_picture(fb_picture_id, ydistance_percent = 0, xdistance_percent = 0, yoffset_percent = 0, xoffset_percent = 0): #OK
- data = json.dumps({"transmit": "fb", "assets": [{"ydistance_percent": ydistance_percent,"id": fb_picture_id,"xoffset_percent": xoffset_percent,"yoffset_percent": yoffset_percent,"xdistance_percent": xdistance_percent}]})
- pictures = postTinder('/media', data)
- return pictures
-
-def get_fb_albums():
- fb_albums_API_url = "https://graph.facebook.com/v2.6/" + fb_user_id + "/albums?access_token=" + fb_token #EAAGm0PX4ZCpsBAAWDgyqlZAUJiFoHeeOknxuxf5LLz7M97R66tnkE3ZASHubh76HoS1KQxOuFXM1UjqPpYA2bMhIdqBqlW9kxp14tPoSgY9ZABoZA2ZB48USTijQDqhEVYZCZBtkvO5dkYjyQme5SFGTDSDSZCptZAxN4ztqrTPva7WAZDZD "#"https://graph.facebook.com/v2.6/"+ str(548385795271621) + "/albums?access_token=" + fb_token
- fb_albums = requests.get(fb_albums_API_url)
- pyotherside.send('fb_albums', fb_albums.json())
-
-
-def get_fb_pictures(fb_album_id):
- #Get all pictures from our album & parse the JSON code
- fb_photos_API_url = "https://graph.facebook.com/v2.6/" + fb_album_id + "/photos?access_token=" + fb_token #EAAGm0PX4ZCpsBAAWDgyqlZAUJiFoHeeOknxuxf5LLz7M97R66tnkE3ZASHubh76HoS1KQxOuFXM1UjqPpYA2bMhIdqBqlW9kxp14tPoSgY9ZABoZA2ZB48USTijQDqhEVYZCZBtkvO5dkYjyQme5SFGTDSDSZCptZAxN4ztqrTPva7WAZDZD "#"https://graph.facebook.com/v2.6/"+ str(548385795271621) + "/albums?access_token=" + fb_token
- fb_photos = requests.get(fb_photos_API_url).json()
-
- #Parse JSON and get all the urls of those pictures & send them to QML
- for i in range(0, len(fb_photos['data'])):
- fb_photo_id = fb_photos['data'][i]['id']
- fb_photo_API_url = "https://graph.facebook.com/v2.6/" + fb_photo_id + "?fields=source&access_token=" + fb_token
- fb_photo = requests.get(fb_photo_API_url)
- pyotherside.send('fb_photos', fb_photo.json())
-
-def delete_picture(tinder_picture_id): #OK
- data = json.dumps({"assets": [tinder_picture_id]})
- pictures = deleteTinder('/media', data)
- return pictures
-
-def send_message(message, matchID):
- data = json.dumps({"message": message})
- postTinder('/user/matches/' + matchID, data)
-
-"""
-@title: Sailfinder helper functions
-@description: Sailfinder functions to interact with the Sailfinder API & QML
-
-@author: Dylan Van Assche
-"""
-
-def init_files():
- homeDir = os.path.expanduser("~")
- os.chdir(homeDir + "/.config/")
- if not os.path.exists("harbour-sailfinder/settings/"):
- os.makedirs("harbour-sailfinder/settings/")
-
- # Search for settings.cfg -> depends on Sailfinder version
- if not os.path.isfile("/settings/settings.json"):
- File = open("harbour-sailfinder/settings/settings.json", "w")
- data = {
- 'version': file_version,
- 'bio': '1',
- 'school': '1',
- 'job': '1',
- 'instagram': '1'
- }
- data = json.dumps(data)
- File.write(data)
- File.close()
- else:
- File = open("harbour-sailfinder/settings/settings.json", "r")
- content = File.readlines()
- File.close()
- version = content['version']
-
- if not version == file_version:
- File = open("harbour-sailfinder/settings/settings.json", "w")
- data = {
- 'version': file_version,
- 'bio': '1',
- 'school': '1',
- 'job': '1',
- 'instagram': '1'
- }
- data = json.dumps(data)
- File.write(data)
- File.close()
-
- # Search for tinder.token
- if not os.path.isfile("harbour-sailfinder/tinder.token"):
- File = open("harbour-sailfinder/tinder.token", "w")
- File.write("N/A\n")
- File.close()
-
- # Search for superlikes.txt
- if not os.path.isfile("harbour-sailfinder/superlike.txt"):
- File = open("harbour-sailfinder/superlike.txt", "w")
- File.write("1970-01-01T00:00:00.000Z\n")
- File.close()
-
-def writeFile(path, data, version, close): #filepath, data to write, keep version number or not, close file?
- try:
- homeDir = os.path.expanduser("~")
- os.chdir(homeDir + "/.config/harbour-sailfinder")
- File = open(path, 'w')
- if version:
- File.write(file_version +"\n")
- File.write(data)
- if close:
- File.close()
- except:
- return False
-
-def readFile(path):
- homeDir = os.path.expanduser("~")
- os.chdir(homeDir + "/.config/harbour-sailfinder")
- File = open(path, 'r')
- data = File.readlines()
- File.close()
- return data
-
-def deleteFile(path):
- homeDir = os.path.expanduser("~")
- os.chdir(homeDir + "/.config/harbour-sailfinder")
- os.remove(path)
-
-def get_settings():
- homeDir = os.path.expanduser("~")
- os.chdir(homeDir + "/.config/harbour-sailfinder")
- with open('settings/settings.json') as settings_data:
- settings = json.load(settings_data)
- pyotherside.send('settings', settings)
-
-def save_settings(bio, school, job, instagram):
- homeDir = os.path.expanduser("~")
- os.chdir(homeDir + "/.config/harbour-sailfinder")
- File = open("settings/settings.json", "w")
- data = {
- 'version': file_version,
- 'bio': bio,
- 'school': school,
- 'job': job,
- 'instagram': instagram
- }
- data = json.dumps(data)
- File.write(data)
- File.close()
-
-def people():
- try:
- homeDir = os.path.expanduser("~")
- os.chdir(homeDir + "/.config/harbour-sailfinder")
- cacheFile = open("cache/matches.cache", 'r')
- data = cacheFile.readlines()
- cacheFile.close()
- except:
- matchesData = matches(last_active)
- pyotherside.send('matches', matchesData)
-
-def last_activity(last_activity_ISO_format):
- global last_active
- if(len(last_activity_ISO_format)):
- last_active = last_activity_ISO_format
- writeFile('last_active.txt', last_active, False, True)
- else:
- try:
- data = readFile('last_active.txt')
- pyotherside.send('last_active', data)
- except:
- pyotherside.send('last_active', '')
-
-def superlike_available():
- superlike_reset_time = readFile('superlike.txt')
- superlike_reset_time = str(superlike_reset_time[0])
- pyotherside.send('superlike_available', superlike_reset_time)
-
-
-#loginTinder(100003006173920,'EAAGm0PX4ZCpsBAPSkglvNThy2B07aKXDDJvUtJe5B0QxjNXPMBMHeMCJov4F06W1Ts8jRuWeVRayZBCRZBThfZAYTCfoHk9SdXugyBvSo8xjMUAcPFKpy754x3g8XjTq9ZCwZAik97DPPwDzdNIBZAeMA3VGUjJiCu7aXrbKs3BqwZDZD')
-#print uploadTinder('test.jpeg', '56d422d94f10e5db60fe7823')
-#result = recommendations()
-#userID = result['results']
-#like(userID[0]['_id'])
-#dislike(userID[1]['_id'])
-#superlike(userID[2]['_id'])
-#upload_FB_picture(10200861059845626)
-#print delete_username()
-#print create_username('modulebaan')
-#print sharelink('56d422d94f10e5db60fe7823') #MY USER ID
-#print '-' * 100
-#print update_username('modulebaanLOL')
-#print '-' * 100
-#print delete_username()
diff --git a/docs/tinder_api.md b/docs/tinder_api.md
index 3e8daca..5952f1c 100755
--- a/docs/tinder_api.md
+++ b/docs/tinder_api.md
@@ -2,7 +2,13 @@
_with Python Requests_
Inspired by this Github Gist.
-
+Currently several new API endpoints are available but they aren't described here yet.
+For example:
+- Direct image upload
+- Facebook image upload
+- Spotify integration
+- Instagram integration
+- Update schools & jobs
### API Details
@@ -142,8 +148,37 @@ Response:
}
```
-### Reporting a user
+### Meta data
+
+Request the current app meta data like number of superlikes, can like and app tutorials.
+The HTTP request type matters a lot, otherwise you get an error.
+
+```python
+meta = session.get(TINDER_HOST + '/meta')
+```
+
+Response:
+```json
+{
+ "client_resources": {...},
+ "globals": {...},
+ "travel": {...},
+ "groups": {...},
+ "products": {...},
+ "notifications": {...},
+ "purchases": [],
+ "rating": {...},
+ "status": {...},
+ "tutorials": {...},
+ "user": { ... },
+ "versions": { ... }
+}
```
+
+Updates interval is also listed in the meta data. This defines how fast you may poll the /updates endpoint for incremental updates (no full history update).
+
+### Reporting a user
+```python
report = session.post(TINDER_HOST + '/report/{user_id}', data=json.dumps({"cause": cause}))
```
@@ -164,15 +199,15 @@ Parameter info:
-### Message sending
+### Send message
Send a message to a match. Note you'll get a HTTP 500 back if you try to send a message to someone who isn't a match!
-```
+```python
send_message = session.post(TINDER_HOST + '/user/matches/{match_id}', data=json.dumps({"message": message}))
```
-response:
+Response:
```json
{
"_id":"53467235483cb56c475cc1d6",
@@ -185,8 +220,24 @@ response:
}
```
+### Like/Unlike message
+
+Like or unlike a message from a match, unliking only possible when the message has been liked by you in the past.
+
+```python
+like_message = session.post(TINDER_HOST + '/message/{message_id}/like')
+unlike_message = session.delete(TINDER_HOST + '/message/{message_id}/like')
+```
+
+Response:
+```
+A 201 or 204 HTTP response, no JSON content is returned.
+```
+
### Updating your location
-> curl 'https://api.gotindaer.com/user/ping --data '{"lat": latitude, "lon": longitude}'
+```python
+location = session.post(TINDER_HOST + '/user/ping', data=json.dumps({"lat": latitude, "lon": longitude}))
+```
```json
{
@@ -195,11 +246,30 @@ response:
}
```
-### Get "updates"
-```bash
-> curl 'https://api.gotindaer.com/updates'
+### Get updates
+
+Updates contain several things such as:
+- Matches + messages
+- Unmatched users
+- Liked messages
+
+The incremental updates (with a supplied ISO string date) are used to check for notifications, update local databases, ...
+
+```python
+updates = session.post(TINDER_HOST + '/updates', data=json.dumps({"last_activity_date": date}))
```
+Parameter info:
+
+
+
+
+ date
+ **string**: Empty will return the whole account history, when an ISO string date is supplied only the updates from that date are returned
+
+
+
+
Response:
```json
{
@@ -233,9 +303,39 @@ Response:
}
```
-### To 'like' or 'pass' a User
-```bash
+### Get information about an user
+
+Returns all the information known about an user based on their user_id.
+The HTTP request type matters a lot, otherwise you get an error.
+
+```python
+about = session.get(TINDER_HOST + '/user/{user_id}')
+```
+
+Response:
+```
+The same as when you request /recs and look at the recommendation it's JSON.
+```
+
+### Unmatch
+
+Unmatching based on the match_id, the other user will receive the match_id through /updates in "blocks" to let the client know that they unmatched.
+
+```python
+unmatch = session.delete(TINDER_HOST + '/user/matches/{match_id}')
+```
+
+Response:
+```
+A 202 or 204 HTTP response, no JSON content is returned.
+```
+
+### To 'like', 'pass' or superlike a User
+```python
> curl https://api.gotinder.com/{like|pass}/{_id}
+like = session.get(TINDER_HOST + '/like/{user_id}')
+superlike = session.post(TINDER_HOST + '/like/{user_id}' + '/super')
+pass = session.get(TINDER_HOST + '/pass/{user_id}')
```
Response:
@@ -247,10 +347,21 @@ Response:
### Recommendations
-```bash
-> curl https://api.gotinder.com/user/recs
+```python
+like = session.post(TINDER_HOST + '/recs', , data=json.dumps({"limit": limit})
```
+Parameter info:
+
+
+
+
+ limit
+ **integer**: 10 seems to be the normal limit
+
+
+
+
```json
{
"status": 200,
diff --git a/harbour-sailfinder.pro.user b/harbour-sailfinder.pro.user
index 68539ef..5c60153 100644
--- a/harbour-sailfinder.pro.user
+++ b/harbour-sailfinder.pro.user
@@ -1,6 +1,6 @@
-
+
EnvironmentId
@@ -427,7 +427,7 @@
MerSDK-SailfishOS-armv7hl
MerSDK-SailfishOS-armv7hl
{fa16f887-b7e2-45de-9971-368afb7b8de7}
- 0
+ 1
2
0
diff --git a/qml/backend/sailfinder/filemanager.py b/qml/backend/sailfinder/filemanager.py
index abf2710..82c8f86 100644
--- a/qml/backend/sailfinder/filemanager.py
+++ b/qml/backend/sailfinder/filemanager.py
@@ -109,9 +109,9 @@ def aged(self, age=constants.filemanager.age["30_MIN"]):
try:
old_working_dir = os.getcwd()
os.chdir(self.working_dir)
- created = os.path.getctime(self.name + self.extension)
+ modified = os.path.getmtime(self.name + self.extension)
logger.log_to_file.debug("Getting last modified from file: " + self.working_dir + "/" + self.name + self.extension + " OK")
- if time.time() - float(created) > age:
+ if time.time() - float(modified) > age:
return True
else:
return False
diff --git a/qml/backend/sailfinder/tinder.py b/qml/backend/sailfinder/tinder.py
index 81c7f10..f75fbf3 100644
--- a/qml/backend/sailfinder/tinder.py
+++ b/qml/backend/sailfinder/tinder.py
@@ -166,7 +166,7 @@ def incremental(self, last_activity_date):
def about(self, user_id): #OK
logger.log_to_file.debug("GETTING ABOUT USER: " + user_id, insert_line=True)
about_file = filemanager.File(user_id, constants.filemanager.extension["JSON"], constants.filemanager.path["MATCHES"])
- if about_file.exists(): # Read from cache if available
+ if about_file.exists() and not about_file.aged(): # Read from cache if available and not out of date
self.about_user = about_file.read()
else:
self.about_user = network.connection.send("/user/"+ user_id, http_type=constants.http.TYPE["GET"])
diff --git a/qml/harbour-sailfinder.qml b/qml/harbour-sailfinder.qml
index fde7a96..fd7c3fd 100644
--- a/qml/harbour-sailfinder.qml
+++ b/qml/harbour-sailfinder.qml
@@ -12,7 +12,7 @@ ApplicationWindow
initialPage: Component { FirstPage { } }
cover: Qt.resolvedUrl("cover/CoverPage.qml")
allowedOrientations: Orientation.All
- _defaultPageOrientations: Orientation.All
+ _defaultPageOrientations: Orientation.All
onCleanup: { // Reset to initial state, except 'pythonReady' since it's already loaded
authenticatingText = qsTr("Authenticating") + "..."
headerRecs = qsTr("Recommendations")
diff --git a/qml/pages/AboutMatchPage.qml b/qml/pages/AboutMatchPage.qml
index c135083..1bd1c4a 100644
--- a/qml/pages/AboutMatchPage.qml
+++ b/qml/pages/AboutMatchPage.qml
@@ -1,49 +1,3 @@
-//import QtQuick 2.0
-//import Sailfish.Silica 1.0
-//import "js/matches.js" as Matches
-
-//SilicaFlickable {
-// width: parent.width; height: parent.height
-// contentHeight: aboutMatchColumn.height
-// Component.onCompleted: Matches.about(userId)
-
-// property string userId
-// property bool loadingAbout: true
-
-// VerticalScrollDecorator {}
-
-// Column {
-// id: aboutMatchColumn
-// width: parent.width
-// spacing: Theme.paddingLarge
-
-// TextLabel { labelText: "Sailfinder " + qsTr("is an unofficial Tinder client for Sailfish OS. You can use almost all the features of the official client on your Sailfish OS smartphone!") }
-
-
-// /*ImageGrid { id: avatars; visible: loadingAbout }
-
-// TextArea {
-// id: bio
-// width: parent.width
-// readOnly: true
-// wrapMode: TextEdit.Wrap
-// label: qsTr("Biography")
-// visible: text && settings.showBio && !loadingAbout
-// }
-
-// GlassButton { id: instagram; show: settings.showInstagram && !loadingAbout; iconSource: "../resources/images/icon-instagram.png"; itemScale: 0.5 }
-// GlassButton { id: job; show: settings.showJob && !loadingAbout; iconSource: "../resources/images/icon-job.png"; itemScale: 0.5 }
-// GlassButton { id: school; show: settings.showSchool && !loadingAbout; iconSource: "../resources/images/icon-school.png"; itemScale: 0.5 }*/
-// }
-
-// /*BusyIndicator {
-// anchors { centerIn: parent }
-// size: BusyIndicatorSize.Large
-// running: Qt.ApplicationActive && loadingAbout
-// }*/
-//}
-
-
import QtQuick 2.2
import Sailfish.Silica 1.0
import "js/matches.js" as Matches
diff --git a/rpm/harbour-sailfinder.changes b/rpm/harbour-sailfinder.changes
index 8915d2e..524d956 100644
--- a/rpm/harbour-sailfinder.changes
+++ b/rpm/harbour-sailfinder.changes
@@ -5,6 +5,7 @@
- [MINOR BUGFIX] Never discover when discovery was switched off in Profile
- [MINOR BUGFIX] Busy discovery indicator in Profile fixed
- [MINOR BUGFIX] Graying out the logout and delete account button correctly
+- [MINOR BUGFIX] Update about user cache when out of date (Github issue #108)
- [IMPROVEMENT] Reload recommendations when discovery criteria are changed (Github issue #96)
- [IMPROVEMENT] Redesigned GIF gallery to make it easier to upload GIFs and send messages (Github issue #98)
- [IMPROVEMENT] Rewritten ImageGrid with a proper GridLayout (Github issue #84)