From 210c39d51cc8940c1272e1f9fed924ae4c67150c Mon Sep 17 00:00:00 2001 From: Daniel Firsht Date: Thu, 9 Mar 2017 10:35:46 -0600 Subject: [PATCH 01/43] updated blocking user copy --- .../TogetherStream/Controllers/StreamViewController.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iOS/TogetherStream/TogetherStream/Controllers/StreamViewController.swift b/iOS/TogetherStream/TogetherStream/Controllers/StreamViewController.swift index 252fdb5..56e8f3a 100644 --- a/iOS/TogetherStream/TogetherStream/Controllers/StreamViewController.swift +++ b/iOS/TogetherStream/TogetherStream/Controllers/StreamViewController.swift @@ -506,7 +506,7 @@ class StreamViewController: UIViewController { /// /// - Parameter message: The message whos subject would be blocked. fileprivate func blockSubject(of message: Message) { - let alert = UIAlertController(title: "Block User", message: "Are you sure you wish to block this user? They will be removed from your friends list and you will be removed from theirs. This action cannot be undone.", preferredStyle: .alert) + let alert = UIAlertController(title: "Block User", message: "Are you sure you wish to block this user? They will be removed from your friends list within the app and you will be removed from theirs. This action cannot be undone.", preferredStyle: .alert) alert.addAction(UIAlertAction(title: "Cancel", style: .cancel)) alert.addAction(UIAlertAction(title: "Confirm", style: .destructive) {_ in self.viewModel.blockSubject(of: message) { error in @@ -517,7 +517,7 @@ class StreamViewController: UIViewController { } else { title = "User Blocked" - message = "User has been blocked. They will be removed from your friends list and you will be removed from theirs." + message = "User has been blocked. They will be removed from your friends list within the app and you will be removed from theirs." } let alert = UIAlertController(title: title, message: message, preferredStyle: .alert) alert.addAction(UIAlertAction(title: "OK", style: .default)) From 4abece5f944d4d0d69b246a69623d4523ea23f1f Mon Sep 17 00:00:00 2001 From: Daniel Firsht Date: Thu, 9 Mar 2017 11:06:35 -0600 Subject: [PATCH 02/43] added placeholders --- .../TogetherStream.xcodeproj/project.pbxproj | 8 +- .../Configuration/GoogleService-Info.plist | 26 +++++ .../TogetherStream/Configuration/Info.plist | 107 ++++++++++++++++++ .../TogetherStreamTests/Info.plist | 22 ++++ .../TogetherStreamUITests/Info.plist | 22 ++++ 5 files changed, 181 insertions(+), 4 deletions(-) create mode 100644 iOS/TogetherStream/TogetherStream/Configuration/GoogleService-Info.plist create mode 100644 iOS/TogetherStream/TogetherStream/Configuration/Info.plist create mode 100644 iOS/TogetherStream/TogetherStreamTests/Info.plist create mode 100644 iOS/TogetherStream/TogetherStreamUITests/Info.plist diff --git a/iOS/TogetherStream/TogetherStream.xcodeproj/project.pbxproj b/iOS/TogetherStream/TogetherStream.xcodeproj/project.pbxproj index 1fb68b3..a9a73db 100644 --- a/iOS/TogetherStream/TogetherStream.xcodeproj/project.pbxproj +++ b/iOS/TogetherStream/TogetherStream.xcodeproj/project.pbxproj @@ -71,9 +71,9 @@ 68991ED01E411F7F00F5B4A0 /* ProfileTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 68991ECE1E411F7F00F5B4A0 /* ProfileTableViewCell.xib */; }; 689A111E1E2FF35200B87DEF /* Popup.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 689A111D1E2FF35200B87DEF /* Popup.storyboard */; }; 689A11201E2FFF3900B87DEF /* PopupViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 689A111F1E2FFF3900B87DEF /* PopupViewController.swift */; }; - 68D1A7C41E4113E50073E571 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 68D1A7C31E4113E50073E571 /* GoogleService-Info.plist */; }; 832ED16E7142946E401F004B /* Pods_TogetherStreamUITests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 08ACD779EBDAC91A4230AC59 /* Pods_TogetherStreamUITests.framework */; }; A20B11401E6F1B54003A49ED /* LicenseAgreementViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A20B113F1E6F1B54003A49ED /* LicenseAgreementViewController.swift */; }; + A20B117A1E71C23C003A49ED /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = A20B11791E71C23C003A49ED /* GoogleService-Info.plist */; }; A23377A91E01DDD500E43DA0 /* HeartbeatDataManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = A23377A81E01DDD500E43DA0 /* HeartbeatDataManager.swift */; }; A2483D451E3BB6AE007E92DD /* VideoQueueTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = A2483D431E3BB6AE007E92DD /* VideoQueueTableViewCell.swift */; }; A2483D461E3BB6AE007E92DD /* VideoQueueTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = A2483D441E3BB6AE007E92DD /* VideoQueueTableViewCell.xib */; }; @@ -207,11 +207,11 @@ 68991ECE1E411F7F00F5B4A0 /* ProfileTableViewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = ProfileTableViewCell.xib; sourceTree = ""; }; 689A111D1E2FF35200B87DEF /* Popup.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Popup.storyboard; sourceTree = ""; }; 689A111F1E2FFF3900B87DEF /* PopupViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PopupViewController.swift; sourceTree = ""; }; - 68D1A7C31E4113E50073E571 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; 753248237D2956AB73628500 /* Pods-Stormtrooper.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Stormtrooper.release.xcconfig"; path = "Pods/Target Support Files/Pods-Stormtrooper/Pods-Stormtrooper.release.xcconfig"; sourceTree = ""; }; 9D347DC144B6BDAA4A91BD74 /* Pods-StormtrooperUITests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-StormtrooperUITests.release.xcconfig"; path = "Pods/Target Support Files/Pods-StormtrooperUITests/Pods-StormtrooperUITests.release.xcconfig"; sourceTree = ""; }; 9EFF70948471E4709B39FE4E /* Pods-TogetherStreamTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-TogetherStreamTests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-TogetherStreamTests/Pods-TogetherStreamTests.debug.xcconfig"; sourceTree = ""; }; A20B113F1E6F1B54003A49ED /* LicenseAgreementViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LicenseAgreementViewController.swift; sourceTree = ""; }; + A20B11791E71C23C003A49ED /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; A23377A81E01DDD500E43DA0 /* HeartbeatDataManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = HeartbeatDataManager.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; A2483D431E3BB6AE007E92DD /* VideoQueueTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VideoQueueTableViewCell.swift; sourceTree = ""; }; A2483D441E3BB6AE007E92DD /* VideoQueueTableViewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = VideoQueueTableViewCell.xib; sourceTree = ""; }; @@ -360,7 +360,7 @@ 34C6E52D1DF21B8600EB4972 /* Configuration */ = { isa = PBXGroup; children = ( - 68D1A7C31E4113E50073E571 /* GoogleService-Info.plist */, + A20B11791E71C23C003A49ED /* GoogleService-Info.plist */, 34C6E52E1DF21B8600EB4972 /* Info.plist */, 34C6E5301DF21BAD00EB4972 /* private.plist */, ); @@ -713,7 +713,6 @@ files = ( A2D44DC21E32B15900053099 /* SearchResultTableViewCell.xib in Resources */, 68991ED01E411F7F00F5B4A0 /* ProfileTableViewCell.xib in Resources */, - 68D1A7C41E4113E50073E571 /* GoogleService-Info.plist in Resources */, A2D44DBE1E3024DC00053099 /* NoStreamsTableViewCell.xib in Resources */, 34AD4C0E1E20400E00210F61 /* WorkSans-SemiBold.ttf in Resources */, 34AD4C061E20400E00210F61 /* OFL.txt in Resources */, @@ -731,6 +730,7 @@ 34AB458C1E259BDD000730DC /* NameStream.storyboard in Resources */, 34AD4BFE1E20400E00210F61 /* OpenSans-ExtraBold.ttf in Resources */, 34AB45901E259C15000730DC /* Stream.storyboard in Resources */, + A20B117A1E71C23C003A49ED /* GoogleService-Info.plist in Resources */, 34AD4C0A1E20400E00210F61 /* WorkSans-ExtraLight.ttf in Resources */, 34AD4C0F1E20400E00210F61 /* WorkSans-Thin.ttf in Resources */, 34AD4C091E20400E00210F61 /* WorkSans-ExtraBold.ttf in Resources */, diff --git a/iOS/TogetherStream/TogetherStream/Configuration/GoogleService-Info.plist b/iOS/TogetherStream/TogetherStream/Configuration/GoogleService-Info.plist new file mode 100644 index 0000000..0a39768 --- /dev/null +++ b/iOS/TogetherStream/TogetherStream/Configuration/GoogleService-Info.plist @@ -0,0 +1,26 @@ + + + + + TRACKING_ID + <YOUR_TRACKING_ID> + PLIST_VERSION + 1 + BUNDLE_ID + <YOUR_BUNDLE_ID> + PROJECT_ID + together-stream + IS_ADS_ENABLED + + IS_ANALYTICS_ENABLED + + IS_APPINVITE_ENABLED + + IS_GCM_ENABLED + + IS_SIGNIN_ENABLED + + GOOGLE_APP_ID + <YOUR_GOOGLE_APP_ID> + + diff --git a/iOS/TogetherStream/TogetherStream/Configuration/Info.plist b/iOS/TogetherStream/TogetherStream/Configuration/Info.plist new file mode 100644 index 0000000..276d524 --- /dev/null +++ b/iOS/TogetherStream/TogetherStream/Configuration/Info.plist @@ -0,0 +1,107 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleDisplayName + Together + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0.0 + CFBundleURLTypes + + + CFBundleURLSchemes + + fb<YOUR_FB_APP_ID> + + + + CFBundleVersion + 18 + Fabric + + APIKey + <YOUR_FABRIC_KEY> + Kits + + + KitInfo + + KitName + Crashlytics + + + + FacebookAppID + <YOUR_FB_APP_ID> + FacebookDisplayName + Together Stream + ITSAppUsesNonExemptEncryption + + LSApplicationQueriesSchemes + + fbapi + fb-messenger-api + fbauth2 + fbshareextension + + LSRequiresIPhoneOS + + UIAppFonts + + OpenSans-Bold.ttf + OpenSans-BoldItalic.ttf + OpenSans-ExtraBold.ttf + OpenSans-ExtraBoldItalic.ttf + OpenSans-Italic.ttf + OpenSans-Light.ttf + OpenSans-LightItalic.ttf + OpenSans-Regular.ttf + OpenSans-Semibold.ttf + OpenSans-SemiboldItalic.ttf + WorkSans-Black.ttf + WorkSans-Bold.ttf + WorkSans-ExtraBold.ttf + WorkSans-ExtraLight.ttf + WorkSans-Light.ttf + WorkSans-Medium.ttf + WorkSans-Regular.ttf + WorkSans-SemiBold.ttf + WorkSans-Thin + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UIStatusBarHidden + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UIViewControllerBasedStatusBarAppearance + + + diff --git a/iOS/TogetherStream/TogetherStreamTests/Info.plist b/iOS/TogetherStream/TogetherStreamTests/Info.plist new file mode 100644 index 0000000..6c6c23c --- /dev/null +++ b/iOS/TogetherStream/TogetherStreamTests/Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + + diff --git a/iOS/TogetherStream/TogetherStreamUITests/Info.plist b/iOS/TogetherStream/TogetherStreamUITests/Info.plist new file mode 100644 index 0000000..6c6c23c --- /dev/null +++ b/iOS/TogetherStream/TogetherStreamUITests/Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + + From 5af236f3acd24ed7503c13dbf54b462521055346 Mon Sep 17 00:00:00 2001 From: Daniel Firsht Date: Thu, 9 Mar 2017 14:07:55 -0600 Subject: [PATCH 03/43] removed unused methods (#490) --- backend/auth/index.js | 6 ---- backend/auth/youtube/index.js | 40 --------------------- backend/auth/youtube/passport.js | 60 -------------------------------- backend/config/appVars.js | 5 --- backend/id/id.service.js | 40 --------------------- backend/id/index.js | 24 ------------- backend/package.json | 1 - backend/routes/index.js | 3 -- 8 files changed, 179 deletions(-) delete mode 100644 backend/auth/youtube/index.js delete mode 100644 backend/auth/youtube/passport.js delete mode 100644 backend/id/id.service.js delete mode 100644 backend/id/index.js diff --git a/backend/auth/index.js b/backend/auth/index.js index 67991f9..f6d5077 100644 --- a/backend/auth/index.js +++ b/backend/auth/index.js @@ -21,12 +21,10 @@ var authService = require('./auth.service'); // Configure Passport require('./facebook/passport').setup(appVars); require('./facebook/token/passport').setup(appVars); -require('./youtube/passport').setup(appVars); var router = express.Router(); router.use('/facebook', require('./facebook')); -router.use('/youtube', require('./youtube')); router.get('/success', authService.handleLoginSuccess); @@ -38,8 +36,4 @@ router.get('/logout', authService.logout); router.get('/refresh', authService.refresh); -router.get('/me', authService.isAuthenticated(), function (req, res, next) { - res.json(req.user); -}); - module.exports = router; \ No newline at end of file diff --git a/backend/auth/youtube/index.js b/backend/auth/youtube/index.js deleted file mode 100644 index b083c07..0000000 --- a/backend/auth/youtube/index.js +++ /dev/null @@ -1,40 +0,0 @@ -/* - Copyright 2017 IBM Corporation - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -'use strict'; - -var express = require('express'); -var passport = require('passport'); -var authService = require('../auth.service'); - -var router = express.Router(); - -router.get('/login', passport.authenticate('youtube')); - -router.get('/connect', authService.isAuthenticated(), passport.authorize('youtube')); - -router.get( - '/callback', - passport.authenticate( - 'youtube', - { - successRedirect: '/auth/success', - failureRedirect: '/auth/failure?provider=youtube' - }) -); - - -module.exports = router; \ No newline at end of file diff --git a/backend/auth/youtube/passport.js b/backend/auth/youtube/passport.js deleted file mode 100644 index 4a023a2..0000000 --- a/backend/auth/youtube/passport.js +++ /dev/null @@ -1,60 +0,0 @@ -/* - Copyright 2017 IBM Corporation - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -var passport = require('passport'); -var YoutubeV3Strategy = require('passport-youtube-v3').Strategy; -var securityHelper = require('../security.helper'); -var userController = require('../../user/user.controller'); - -// exposed function to configure the Facebook Passport Strategy -exports.setup = function (appVars) { - passport.use(new YoutubeV3Strategy({ - clientID: appVars.google.clientID, - clientSecret: appVars.google.clientSecret, - callbackURL: appVars.google.redirectURL, - passReqToCallback: true, - scope: ['https://www.googleapis.com/auth/youtube.readonly', "https://www.googleapis.com/auth/plus.login"] - }, - function (req, accessToken, refreshToken, profile, done) { - var encryptedAccess = securityHelper.encrypt(accessToken, appVars.accessTokenKey); - var encryptedRefresh = securityHelper.encrypt(refreshToken, appVars.refreshTokenKey); - - // create the external account object from the yt profile received - // and the encryption of the access token. - var googleAccount = { - provider: 'youtube', - id: profile.id, - accessToken: { - cipher: encryptedAccess.text, - iv: encryptedAccess.iv, - tag: encryptedAccess.tag - }, - refreshToken: { - cipher: encryptedRefresh.text, - iv: encryptedRefresh.iv, - tag: encryptedRefresh.tag - } - }; - - userController.processExternalAuthentication(req, googleAccount) - .then(function (user) { - done(null, user); - }, function (error) { - done(error); - }); - } - )); -}; \ No newline at end of file diff --git a/backend/config/appVars.js b/backend/config/appVars.js index abb94d9..70ac9eb 100644 --- a/backend/config/appVars.js +++ b/backend/config/appVars.js @@ -55,11 +55,6 @@ var appVars = { clientSecret: credentials.facebook.secret, redirectURL: appEnv.url + "/auth/facebook/callback" }, - google: { - clientID: credentials.google.clientID, - clientSecret: credentials.google.clientSecret, - redirectURL: appEnv.url + "/auth/youtube/callback" - }, pool: new pg.Pool(config), accessTokenKey: credentials.app.accessTokenKey, refreshTokenKey: credentials.app.refreshTokenKey, diff --git a/backend/id/id.service.js b/backend/id/id.service.js deleted file mode 100644 index b3500c2..0000000 --- a/backend/id/id.service.js +++ /dev/null @@ -1,40 +0,0 @@ -/* - Copyright 2017 IBM Corporation - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -var appVars = require('../config/appVars'); -var userController = require('../user/user.controller') - -var idService = {}; - -idService.retrieveExternalIds = function (req, res) { - userController.getUserByID(req.params['userID']) - .then(function (user) { - if(user == null) { - res.sendStatus(204); - return - } - var ids = {}; - for(var i = 0; i < user.externalAccounts.length; ++i) { - var account = user.externalAccounts[i]; - ids[account.provider] = account.id; - } - res.send(ids); - }, function (error) { - res.sendStatus(401); - }) -}; - -module.exports = idService; \ No newline at end of file diff --git a/backend/id/index.js b/backend/id/index.js deleted file mode 100644 index 9faf3b6..0000000 --- a/backend/id/index.js +++ /dev/null @@ -1,24 +0,0 @@ -/* - Copyright 2017 IBM Corporation - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -var express = require('express'); -var idService = require('./id.service'); - -var router = express.Router(); - -router.get('/:userID', idService.retrieveExternalIds); - -module.exports = router; \ No newline at end of file diff --git a/backend/package.json b/backend/package.json index 84f0993..6000558 100644 --- a/backend/package.json +++ b/backend/package.json @@ -24,7 +24,6 @@ "passport": "^0.3.2", "passport-facebook": "^2.1.1", "passport-facebook-token": "^3.3.0", - "passport-youtube-v3": "^2.0.0", "pg": "^6.1.0", "request": "^2.79.0", "serve-favicon": "~2.3.0" diff --git a/backend/routes/index.js b/backend/routes/index.js index 6e460ae..ccb6d96 100644 --- a/backend/routes/index.js +++ b/backend/routes/index.js @@ -18,7 +18,6 @@ var express = require('express'); var auth = require('../auth'); var blocks = require('../blocks'); var invites = require('../invites'); -var id = require('../id'); var router = express.Router(); var authService = require('../auth/auth.service'); var favicon = require('serve-favicon'); @@ -36,8 +35,6 @@ router.use("/blocks", authService.isAuthenticated(), blocks); router.use("/invites", authService.isAuthenticated(), invites); -router.use("/id", id); - // Loading assets router.use(express.static('./public', { maxAge: sixHours From 8c3f38d4ba5ee6f12591dcf9a89c1a19199d242b Mon Sep 17 00:00:00 2001 From: Daniel Firsht Date: Thu, 9 Mar 2017 14:25:53 -0600 Subject: [PATCH 04/43] Update README.md --- README.md | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 9ac3924..388e219 100644 --- a/README.md +++ b/README.md @@ -42,6 +42,13 @@ Together Stream uses push notifications to send stream invites to users with the 3. Go through these steps to generate a `cert.pem` and a `key.pem` https://github.com/node-apn/node-apn/wiki/Preparing-Certificates 4. Add these certificates to `backend/config/private/` +### Google Analytics Configuration +To keep track of analytics, generate a configuration file by following the instructions here: https://developers.google.com/analytics/devguides/collection/ios/v3/ +**Note** You can skip adding the Google Analytics SDK to the project since it was installed above. + +*Skip Installation* +You can skip installing Google Analytics by removing the method `setupGoogleAnalytics` in the `AppDelegate` and `sendGoogleAnalyticsEvent` in `Utilities/Utils.swift` + ### Backend Configuration 1. In `backend/config/private/credentials.js` replace the `accessTokenKey` and `refreshTokenKey` with a unique string exactly **32 characters** long. This is used to encrypt the access tokens and refresh tokens in the database. 2. Replace the `sessionSecret` with a unique string. This is used to encrypt the session tokens. @@ -64,10 +71,6 @@ Make sure that when you are creating your container, you add your Facebook crede "CSYNC_FACEBOOK_SECRET=asfdasdf"` 2. Add the public IP of the container as `csync_url` to the `private.plist` located at `iOS/TogetherStream/TogetherStream/Configuration` -### Google Analytics Configuration (Optional) -If you wish to keep track of analytics, you can add a configuration file by following the instructions here: https://developers.google.com/analytics/devguides/collection/ios/v3/ -**Note** You can skip adding Google Analytics to the project since it was installed above. - ## Local Configuration (Optional) ### Requirements [npm](https://www.npmjs.com/) 4.1.2 From bf5641f141764e9ab2a222d40b7b1e61b42f5b1b Mon Sep 17 00:00:00 2001 From: Daniel Firsht Date: Thu, 9 Mar 2017 15:46:56 -0600 Subject: [PATCH 05/43] Added disclaimer --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 388e219..fe92c21 100644 --- a/README.md +++ b/README.md @@ -86,3 +86,6 @@ Make sure that when you are creating your container, you add your Facebook crede 7. Follow the instructions here to allow connections to a http address: http://stackoverflow.com/questions/31254725/transport-security-has-blocked-a-cleartext-http 8. If you would like to run your Contexual Sync server locally as well, follow the instructions here: https://github.com/csync/csync-server#local-deployment. Make sure you change the `private.plist` in the iOS app to the local Contextual Sync server. + +## Disclaimer +Together Stream is intended solely for use with an Apple iOS product and intended to be used in conjunction with officially licensed Apple development tools and further customized and distributed under the terms and conditions of your licensed Apple Developer Program. From 582a77e6c03cd40adb42a48da750d2b6ec8ff8af Mon Sep 17 00:00:00 2001 From: Daniel Firsht Date: Thu, 9 Mar 2017 15:53:25 -0600 Subject: [PATCH 06/43] added licenses --- LICENSE | 201 ------------------------------------------------ LICENSE-IOS | 9 +++ LICENSE-NON-IOS | 7 ++ README.md | 4 + 4 files changed, 20 insertions(+), 201 deletions(-) delete mode 100644 LICENSE create mode 100644 LICENSE-IOS create mode 100644 LICENSE-NON-IOS diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 8bd7d41..0000000 --- a/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2017 IBM Corporation - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/LICENSE-IOS b/LICENSE-IOS new file mode 100644 index 0000000..6aaaf38 --- /dev/null +++ b/LICENSE-IOS @@ -0,0 +1,9 @@ +Copyright 2017 IBM Corporation + +Together Stream is intended solely for use with an Apple iOS product and intended to be used in conjunction with officially licensed Apple development tools and further customized and distributed under the terms and conditions of your licensed Apple Developer Program. + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/LICENSE-NON-IOS b/LICENSE-NON-IOS new file mode 100644 index 0000000..b9cac07 --- /dev/null +++ b/LICENSE-NON-IOS @@ -0,0 +1,7 @@ +Copyright 2017 IBM Corporation + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/README.md b/README.md index fe92c21..4c34be6 100644 --- a/README.md +++ b/README.md @@ -89,3 +89,7 @@ Make sure you change the `private.plist` in the iOS app to the local Contextual ## Disclaimer Together Stream is intended solely for use with an Apple iOS product and intended to be used in conjunction with officially licensed Apple development tools and further customized and distributed under the terms and conditions of your licensed Apple Developer Program. + +## Licenses +[iOS](LICENSE-IOS) +[Non-iOS](LICENSE-NON-IOS) From d92dbc229513fcb1c6e59071805391489dba1289 Mon Sep 17 00:00:00 2001 From: Daniel Firsht Date: Thu, 9 Mar 2017 15:54:08 -0600 Subject: [PATCH 07/43] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4c34be6..18ae6c9 100644 --- a/README.md +++ b/README.md @@ -91,5 +91,5 @@ Make sure you change the `private.plist` in the iOS app to the local Contextual Together Stream is intended solely for use with an Apple iOS product and intended to be used in conjunction with officially licensed Apple development tools and further customized and distributed under the terms and conditions of your licensed Apple Developer Program. ## Licenses -[iOS](LICENSE-IOS) +[iOS](LICENSE-IOS) [Non-iOS](LICENSE-NON-IOS) From 1c6cf383fcd9c701a8772911403b43ba76c10adc Mon Sep 17 00:00:00 2001 From: Daniel Firsht Date: Thu, 9 Mar 2017 15:58:00 -0600 Subject: [PATCH 08/43] removed app icon --- .../AppIcon.appiconset/20x20.png | Bin 761 -> 0 bytes .../AppIcon.appiconset/20x20@2x-1.png | Bin 1760 -> 0 bytes .../AppIcon.appiconset/20x20@2x.png | Bin 1760 -> 0 bytes .../AppIcon.appiconset/20x20@3x.png | Bin 2996 -> 0 bytes .../AppIcon.appiconset/29x29.png | Bin 1121 -> 0 bytes .../AppIcon.appiconset/29x29@2x-1.png | Bin 2836 -> 0 bytes .../AppIcon.appiconset/29x29@2x.png | Bin 2836 -> 0 bytes .../AppIcon.appiconset/29x29@3x.png | Bin 4842 -> 0 bytes .../AppIcon.appiconset/40x40.png | Bin 1760 -> 0 bytes .../AppIcon.appiconset/40x40@2x-1.png | Bin 4209 -> 0 bytes .../AppIcon.appiconset/40x40@2x.png | Bin 4209 -> 0 bytes .../AppIcon.appiconset/40x40@3x.png | Bin 7471 -> 0 bytes .../AppIcon.appiconset/60x60@2x.png | Bin 7471 -> 0 bytes .../AppIcon.appiconset/60x60@3x.png | Bin 14108 -> 0 bytes .../AppIcon.appiconset/76x76.png | Bin 3991 -> 0 bytes .../AppIcon.appiconset/76x76@2x.png | Bin 10730 -> 0 bytes .../AppIcon.appiconset/83.5x83.5@2x.png | Bin 12410 -> 0 bytes .../AppIcon.appiconset/Contents.json | 51 ++++++------------ 18 files changed, 17 insertions(+), 34 deletions(-) delete mode 100644 iOS/TogetherStream/TogetherStream/Assets.xcassets/AppIcon.appiconset/20x20.png delete mode 100644 iOS/TogetherStream/TogetherStream/Assets.xcassets/AppIcon.appiconset/20x20@2x-1.png delete mode 100644 iOS/TogetherStream/TogetherStream/Assets.xcassets/AppIcon.appiconset/20x20@2x.png delete mode 100644 iOS/TogetherStream/TogetherStream/Assets.xcassets/AppIcon.appiconset/20x20@3x.png delete mode 100644 iOS/TogetherStream/TogetherStream/Assets.xcassets/AppIcon.appiconset/29x29.png delete mode 100644 iOS/TogetherStream/TogetherStream/Assets.xcassets/AppIcon.appiconset/29x29@2x-1.png delete mode 100644 iOS/TogetherStream/TogetherStream/Assets.xcassets/AppIcon.appiconset/29x29@2x.png delete mode 100644 iOS/TogetherStream/TogetherStream/Assets.xcassets/AppIcon.appiconset/29x29@3x.png delete mode 100644 iOS/TogetherStream/TogetherStream/Assets.xcassets/AppIcon.appiconset/40x40.png delete mode 100644 iOS/TogetherStream/TogetherStream/Assets.xcassets/AppIcon.appiconset/40x40@2x-1.png delete mode 100644 iOS/TogetherStream/TogetherStream/Assets.xcassets/AppIcon.appiconset/40x40@2x.png delete mode 100644 iOS/TogetherStream/TogetherStream/Assets.xcassets/AppIcon.appiconset/40x40@3x.png delete mode 100644 iOS/TogetherStream/TogetherStream/Assets.xcassets/AppIcon.appiconset/60x60@2x.png delete mode 100644 iOS/TogetherStream/TogetherStream/Assets.xcassets/AppIcon.appiconset/60x60@3x.png delete mode 100644 iOS/TogetherStream/TogetherStream/Assets.xcassets/AppIcon.appiconset/76x76.png delete mode 100644 iOS/TogetherStream/TogetherStream/Assets.xcassets/AppIcon.appiconset/76x76@2x.png delete mode 100644 iOS/TogetherStream/TogetherStream/Assets.xcassets/AppIcon.appiconset/83.5x83.5@2x.png diff --git a/iOS/TogetherStream/TogetherStream/Assets.xcassets/AppIcon.appiconset/20x20.png b/iOS/TogetherStream/TogetherStream/Assets.xcassets/AppIcon.appiconset/20x20.png deleted file mode 100644 index ad958d611e5e8e307ebfd7d573ace1da5c6c3528..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 761 zcmVPx%vq?ljR5%fJRLyP^F%bT|YwwmMO_NCB)KWz`AjBCsap3{_AV|CeFOf$nP$(e(dGZ958>#E*5>>fO4ERNC(+U{}e>DaE53b4Rfd$HZow5ZgQ0b@l$ z#KR!L)8+&hX^3~pK0akN#Lx(6=L-<+b~P=m?0IrWA}gU(LR{{e1)kI*e9J?;n78ph zZDLkxgw)Gj$z5+YEgMyq0&frCeo`uS;J%sT9{XkX6E7DXyiE`ArwkDC@J&d+-D*7- zP}_K-m~?fHhqo4F3rur`fR37S$II|2jPM|c5b&O_iajLcS_S==Wd~@(zhNkbY3bq1 z%-~0&kkeII-|=HStB>&5{Nj2Y!iFq(wq#_MfC=oHfC}r2xyEgiAfW&EEWl~p!E1(Y zY+X2OFm;@F8vC z^P<6I7=)~yP{{>&t6*Hl*8nZCWw<_pE)#=SvpPPeQinc_r^u>cc`8;ZS=cdI2#~z>)%&Kr?fnZ&?UG^HEr%#m80H3=_v4ch3Nqp+QSccF zsBM%B`8echxjia$tzKWkaH?jPrxg;CuvvBsM%gDo^=EQ=%kc2%=mxMN`M!^Cw`&&kmKZn_Db)d7a&RdTWhQi?N?9ATZ`T02{?Ca}mwA*b2L9i2a rE1+XI91d5GvL{IykH9%R|00000NkvXXu0mjfP@`%^ diff --git a/iOS/TogetherStream/TogetherStream/Assets.xcassets/AppIcon.appiconset/20x20@2x-1.png b/iOS/TogetherStream/TogetherStream/Assets.xcassets/AppIcon.appiconset/20x20@2x-1.png deleted file mode 100644 index 99ea1db5bf6b74a144eba27ded4a2bbb6740972d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1760 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 Hu0mjf{EimT diff --git a/iOS/TogetherStream/TogetherStream/Assets.xcassets/AppIcon.appiconset/40x40@2x.png b/iOS/TogetherStream/TogetherStream/Assets.xcassets/AppIcon.appiconset/40x40@2x.png deleted file mode 100644 index ee091b1a4bbe6cbf7a2ec8608590b670738ed865..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4209 zcmV-%5RUJOP)Px_D@jB_RCodHTTP5qRTe(=U;W=8Ap;{K!oY|QFbv`(4wEQ}qak5~PU3DRQD)^N z#)Vs#7-#%hyK%w7&BTm=j6VaS5Zkz6|?)vLF->G+RpLgrMSFft8 zYQ}_1y570xo_l`2ckaFCy($tbSFD(&M1m6JwFnv#BF8dOw2XN&ap`vW;MzjJ(=7=D z7Q8lDYq!2gw?b}IWBhp8(6?t7|S@C5CAPW4JJ1$SK$Jw zIGdnKjEP!A({M@mHC^Yfx^b|r1W=wdm?Hi*(ZH_WcKrTqav z$ga!Re#QZ#6&dz_E`YdqtdSfb&QX>B)f(in7p6Jv`*M@CK08Hc0OU+ReN*m{<(*-W zy<6kWYW<@9({$?^!)K=LU51R8Nh01N4Tn)t;_5c=uoq(EUB@7<%@pVyXX25W0XkFe zm2A!Om`QTkkDFNuuE8$!IVm_S>v3%(H<^HdgJ}2_H5Q1T3I=n_3?wpiRjNQ+hi~%U zn4>*Y!*rxLKvT0x%5p~fYpj}rXuCY>#o}98YLzKB+Cs`6sEzpmWy5ywVRP1b2XuI1 z$C_}f%n0`JKG~C;rMnr(yR!xQrZh_X3&Xs;2k6IYnzF1p$#+q1q_(SR&!+gG`C)Vu zJ~k2!y2-(F;EdCRqxqV4WZf?2qSP5m*LF%QZTzjwOw(Tnzo)+~_?C9`UZ;UXg=UzK zgUPfyPeSZ!IZYcq?YLS1k%gvdTK1v2fw|SG&X_E@t5V)c*r*>lvkkGeh+5^e|oK{W8t-aH^w4*^L?tvfC`r2cT~+ z)S7Td%|U~^ZcfG!8I>1WqK-yz_={==$l+v#{>Yj5aDI$FoEfBlO)ubDGA{=Wz?A0s z*=f+UzdislV2wLKS-zef;III~A9B^Q4vm|7B@mjgmh^m+0Y!%e_u(!3R1 zD<^4jrYd`yKWu9ukbo=>l@wpM;!GhOwcLLL}cXg z(jY(G)QWP<=|mO=0tjQeweyZ?y$CwT$MCgMiZTq}vRqX_guP~)0TT1pWhUuY=}G#! z(!+b?ZFGczoS5aJocB*tx3w##Pyl@fbhhcpG+)y(a>?jVF^WC>@m(p+nN*=W^A%Z^ zwengUi%+8e%?m{=z^e4Sz3dsX?JprKAg$(o|sN1>3ktg zCni!f&1*UAX(fhAp9r!MKrT(q&=dKql7X|{a`y=~(P;>vFAKF|2dp|kopC)iiblp| zkd6F!af3^oqvI(WDh ze(Z}=VK&gmrA&br?>`EQsA!9t@Hve}Ld%$_iF!2wOx?%4b|xe;1pDGxDM=R#Ra)IQ z>wl#c<)}9X|4;)?R8#c9%mUiWwc$v$S9sQYINidD+!BC6pqV&qb{a+-t^gpzAbvNK zq*c9@*c!3CG7Q`}1NSb!blA^NCnH>3r&t$WJm@$y9oqm4#s&~e*VcttuBH}r=vMAx z9EWj;O!A9|B1f8KI_gFl;KukXfe-lW0lcyK4+Dos$GmJ>b8zXnG#$q$$ixN^!gFTP zQ?14HR~j0U$U;1w$j?O33249uOZ8eMO$QjXckuGHnwJ+9dH&u7H`f3kq9Qu?gUT5^QD8}4tz_uE!a`oIL-ajAZJ->=O*c^Zi zj5c6F17PfgUDh1{u*${;)3d(i3*hh*k?;BEBJWHM(t8Zt57jJXd5<%|)w!a;GGo3t z3^V4nX#jnC1Dug@c+}>Gqhm>~_7x{?7GC3DDrXqDA^P|9AYBvSYJ1$=LiL>R{M0}R zt^E(98^qBPfOU>IMlg=Qb~S+4pQ_Sb{H7+u^hh~NZ*#^SEDX{p7sNT<{P5j!t<~T& zdz|*w6KHs8W==~0x_hBrx_lQwx3l3FGgzv>?l1GcmZg7=578n1and+mO943Saoiv$ zmcueBfGTJ`r_^WjKVhjnUWdNa1-?4gQ7;UcML`9u(sQ*aIG^x09l82MAI@5V9>A-Br*=~=1v#$yubC)IR+442V{7u0=%fE zZD~609Ff!DXj&<0qMety)XOm9rC=h?=9vG_B`@ZVP~J1^|dF<&-Q@d=CL|3IJ}ZhYn8l(!~`Y z{_*6BY>7sS8P2#K`j&yiOLXjg5VmuiAnn7y=V(-5o`_tmKJIB6gSsC^N6BFbsG8|pe_oPgJ)C4FZl;3nr=aV$&IJX$ybd?RMBN=9k1!)*l+`-E*C zErBy_M2F*3DoRP;>&(VB$ zEK1IuXZlfd^q8hGx9tGRX=uGt=A3LWB2n^?5e;5u$eel7)}sdg#I@Ug04*{#!aD5m z-L93>fw@B5w{i~cigrt`BLM0>DJsKkkUFb8BxKCvYZ}90`os7#$J6W5iY=t|iF>YH zR~G$_02pM*@U(;A>At3oe9%>&$We3bn7%;)w8#bU>ud+e$p6-?6KpdB4(g!WsUCVo zzgO!?7BX#5{}?ptMbQC(8qio#s6inQI-SqwW5pvATuFUL+%fcx^B%25ET920GRAyg z({eoE%ILz{wF_ARNGsI(92#PE`h{8ZNsp!Pxbsd7)ivLKQa5^wVGsy?7WUmyBYo>y zhd|d4kvb24;*8J?>_l9ZN`=bhvQKp?m7;2u|9eBgewxYf+Z+D5Z?Rak<5(HlEdC1( z_Hcfq&10rP7IV7Ux&|P?yZ!dt>7IM;@x^!k{CQfsbSd@r*8abn87veEbo%sZx^aX5 zU))0vkvZ(9rl#nVPd*XQF=y-6tpYOUUB7;vKL7l4IVFvrPG7qQV5wB1_3PKuGtWHZ zi|LIw-k?Vwd4z_Chkbl>u3o)LyLRoOr=Nb>jw4%l?%YXd&z_|%Tei@1&pl`7ojG%c zjvYHj>2%k^qSVTjE1$O>beKREA#0W_St6E@NuPfDDUFSd(cs`94Gj&^$&)AP#EBCE z*y6>D1&lAg_<|NKT0{c_1Cm_;7Mb?slTXs}<;z9aS6_WahYuf?ti@99R_mH2WCg%^ z@x>QuVq$`jk*~b+3LQFhh+cj5RXTd~sKmT`_ilRj*=GsaWZFwFy(EB{{sRv@K+Bdb zlZ-aJH{X1dUVr^{!k*gA*1cTksE`>r08EJl8UdRt0)Ozq2W3wLK-dT0fB${T<#Ik? zR;*Y-k3asnWUK)TH>leO2yAy1Koe}#_0dNkCH$dbDPyT>U`9trX~BX8v}4B(nwgoA zg9C@q|EhIu3C9g^|Ni~-^2;yN$jAt7*sy`NZ{O}KRgN4vA}2Gl7|ZFzyW&gwb$syy(Jrzj4QRjXFf#*G^#+{Ye!j5crHOsiL~mOf7Cr=EI> z?!EV3=>vQKhY|+axNhA#;iDAl@9(F5`}WzoPzE~u(KP^(VO%oNwr$&NNC+Bx8m`#a z(C)wge)$7^;lc&lyLT_W@WKnW4n!$*>eMNE>#euw%9ShjsbtfpO@te>XV0Fl0+@LC z;fDj?R3U(NHWa|9>j0u|Sdysm%#(&0!?MNxHaR&d*@=@F4NDt;s3$SDX3ZLzk1=E` z_C<5bgV*WSH2@I^Ky2n&7^MkHAM9^t-$dDiKlA|<^g%Bg`ufBcW`{qzwuBLfsRP}Z z8Wq1mpqMP{=3|@dx5O00yv2);Kv&C{_-_4lByRyY&wKS>c1pZsk127f00000NkvXX Hu0mjf{EimT diff --git a/iOS/TogetherStream/TogetherStream/Assets.xcassets/AppIcon.appiconset/40x40@3x.png b/iOS/TogetherStream/TogetherStream/Assets.xcassets/AppIcon.appiconset/40x40@3x.png deleted file mode 100644 index 9bf0410e23577a3fc1ba3e18370752c7df222c2f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7471 zcmV+~9nj*5P)Py6=}AOERCodHU0bkZReAo;{Wg~~1BDPI!!RNQh)NkXflwGRSei1CN-&gKDa)#m z;wg_lP?q}SL&AfPR;7HfN~bj$&^3ABmurew>5;4ICyEAn^=EQ~NuH(Y>?SW0+ew;Tgc zL4RP%^aa{RSWV{uXA#H9RA@+oN>=JoG*5-l6c6N*Y&26MSm0B7v`EHR!lU_P9GM(5 zpq*$|k7?rs^iIOe&N?>+3l73*$El1K0`<=J#HW&xXjZS{L07?-I?+lM{WE$B0!okP zOQI<~r8Mv;KG#+s5lcsK3Q#4-`dx)5lQD_Oc4A6uJeBQ|RW)JYDqSgzE)}WGnZoq>s zkI(b3iJG2u*GDiX**b39Wz$l|*8r@HFN9Z0YoI4)#+B7^1RWk9bd=G{;*56XSi!%H ze;pfXiuOi?mxPvSDj6cH+K4;qt8snt%m6L(XOYMDa_k7nF-@TsXm-?EkUiUqmh@Sg zY6o{Pt)wa{{W^+=qnF|!C&&Xj^0aj{Nk>{_`d9Q7CT4Kppdbc)A&n`^T zYs+I|a(I9lkWeL4XqP$HKrY2h_izaBqLzge81$LBZED-3jvNA?JJWInR)GurQ9tIQV| z)$(P0ng=po5!oiOd2+p`4W}THEVf=a19cFpuI0pOPIL+yga)H6@i7mk{=PEy#$j1D$L{@e*5Etd>W$lRiZg)vBHR^=Q$LJ~$2+t{ckXQvWQEZ9~wb z6%^J}nI*o!Lj<6~c`1YZKK{JEG)7M@Y@!z!=-JvJjc{LsbF8kB{mG_t$By>73do)c zp;d~#RJx-btJh$qHU$@HCCSP78U&T`1)V~}R|^HxIm*RD3v}_+0)2etB>iGxGd;UF zMJLY;(I`*d>9(K+pELj3iNnN@=`(%3ZVt<--yo<)4tXQ5EI6S%c0g~nEb|o*s?Hx= zqJNw`O4p8_qW@i<6tEBT3LJ~EAs+Ldf0-=|d+SrvsUXuJjlwKgWLY=LFaj)q0vZRJ zCCDbC0Z-CrWlWd?u6&t}icJ8$#LMmrc|`xs)M>hTWaEj;zQg z$vK0|^e>x^&}Sx2(4)NSesFG@-dGuvX&Wo=!f1tA<&VUo+S1Km_5=aFP}-F%DC#UB z0qjjP60ot?GEGf+N!BF8n5fi*F6?$q4zAFq!TKz;!ceU6b$Sca{%Ptc-8gZQcJnp* zzS(Iyuskk6jbQw;PstZpv;Nq2n>=1lp{kc90Su#A(A>5=P6fwQBCKrE2Og9FwD2j= z>z%ECL+uKGZQ(n4jIdxu6k*$Q;mjb7^9IUiCXUg^$4}BPdDZ=s*=_XF@&w~qznAu` ziht-(v6b>Eo+M|O*Bj&vU>j6STAHE|5Q+v!1u1r{>*`-a=H_EUz-GTCawlv#r z=3JNi3ji0U6n40aURsaVIIAU}o5Ue}iU+omEE+v71%NBrHvzaZfu~_`;6XZZ=y8caUokRA z_`Jf4u=^P3-3wdj)R|!hy0*G$(!jTd@ima^Rae^hu?8`cb;(=x9*?GF8r9b#8}-)s zohh^{%zAC2Ksk& z%j99&#`o5sV?kCHN1`je_LV2$apG4ZU8%YN!;&4rW!AmmGFk(W6JM&7St-)7kcZf5 z2Dmd2*KGhuti0dD+n`^bdYkUp`YL^S@@?K0T@avUo3!YToZKE+)7l7Ai?>xT1-O#7 zcF)Lm<&;x!e2Bp~wme9<@9lJnKu_}s{%0P^|FQLVblcP)=pvrV7x@IRuM}DP0;U(I zN3+5mY?m&wyipO)K(DXVCwq|2I%pZ6D zDPDB_{lvTUiLvAKi^VN;-~4tuureu*$~LHRIpqj|s(8IS5+mBtW+}k&49xBgjkD1c z@Y;Y9EuOI)r04{1iJqvh>T!s5;*EvhFAmX`p=Ein5N%Y|QI#+5j^Q@y#_?lx-PlRm zv$&al%0Ta5o|2Ob+n_OD(T|juXsAQ6M|I7Pr2t341XLoJ`{Lkm#^=$Zd_1l(P$aIt z(J??XJc?gm7@}PhD}}XSG}oyk;>0x?k0Y<=(fpUACuOq)BYNL**fdf1(vlYwYhe-F zDd!wLO#zmSsVTRs4Ie(n z&!ay)f@jiGbpQN0w0C(k-(ukf1WfSjTbcvR{$-;R{#F4i@DyZqyx>`53NVU?`D=_- zVXDT{q@ClqJFfdJl`eiEg1Bk&fsq;d!0-&cyfPs`Kee=#W&+TK)ohg;*mVh7tHtZbUn&h#h!JqN_1t%nmxW)O1*X%mA^WQ_;rl-GANi9#o!M9a*hgNXd@^CvA)Ua7`<=6u4 z8eOWkYZQgm5y`>`8DtM}#J%wm9?cW{AYuyd-}boFci4Dk&$n0~<7@OsdHM#phiap; z4LTIA(UJ+3k8ZeG9bmR@!E+t7fWm7_3qe618wXc)0N`Loe8m0nB9D$k4Du3>=B<1S zHN?pGa4^FiUJKNBz_tu5(_ip)`maV#@Js$H^a|fzEz9Xx%&7==@Czq=+oddF9=$59 zZD)cY0>XP(V}txUEjJGG>iX$ZBXoReKkINEUyHNicG0v3F@R z|4mhvvEuC5fkd?jFbrD&ZQFB>c@Rc`<-`w8-Diacuw_uv`Z$j|s??=@AjG;W~)b^b%(l ze|Fj~&R9I*&5m~%*oWq~(t|u=u~Hsoo!Apk+qEhm+|~86CV<^1N(^9j-36dr3N#Kh zB{T4JJzB>ARtWgRa=c>&fLkp97SEya=c@9jtMk+J4uIv+IuS=~02T4-w^?HRng;vA z*Qz5W{A&VObb2GwqglsGcuM^23K@9fgM_yFSTX+X@$Z*M=mGvS)kk>L9yv3@E9KP@ zTk5nIyQSH7sj|i$YX_M1d#|7r&cY5k+&G-}dNEBGevPI?6-FyYEq=obf0p{#{1!US zz+%Ks@<)oAhNZ1yFXV+8s?zGpTl?+^z^+LSDw~!AlNXFD-vc6i!OL`$e2v6jHQHqb zzyiNl`3GR`Wnh2Kf6G+=6BlR1dVngL*f4F$i=}bfKB6u2uZ-R?fW1)+qZyzffJ8$( zTUVC3**!Y`#(3KZuA}vr53Hs5=cNZ2*n4KCVD@9*pt%4TXZZ<;B zT2Pa*b_`%>EjY-|d1oN5d#MP>snyd;H2o)dq05x`uJiuIary}Z`wRX9@>!mo^))ud z>w%zXi7(hlZN-DGEHB2NcAFgqShgL_^(O@rJ>;OgsXKP}>IlEEa^5~tqxX!SkynRc z8~3o7w)ZVe(A_gz>DLS_wim~Ev`$0>OpK6=r4VoIz|jDzyHefoG}M=b$}61(xZKWa zPlM#FGIh6xq~U`faQU;Tn%oOx;e_|Yp5Y%sz5Dc5{w07Z{@FzQy)bWS0$A-gKtN#{ zYJ$6>NguupSc#4<{ve6$`L%EF?GjY<*4iCVZuGp`#ml=s3WI#TEl9j&tyG#v+&o zXSPj3$J^}8GJ|{J=rUcwqj&e*6y3!m_IaL?YXdxD8Q7SV1RVTD;TRGPZ5xN;L${Q` z6EtKS9g)TAu{ji3*5j>bl8%x}jHRTzJ+gJs)xr+rTHMP5YgqVhTW^=7fs*bQoMmD-7P5I#3NqRzY;CziCu{v z2{;-a-R0H0HiEsg%}IquBtg9U=?U|M2{K- z&}zX8bAt@xVFvce0PHcYV?~TbRV+3+wjKHGQTrGB3bIaI;EmP==n|exr{WPCstrEq zvHsY0)aM<$4=^0$Pdc-M7aq-XP}2Y`uCa%fhk1iyQl{hMJS}6y0@!*|nJJv%>9?xX z8Sf?0OIU%%iT5ry8O?wrzFV4Vr<^F7^$%@NPr<*)XO2Aq*qzc;Q0cTc&c!Ak$m3;-7HDrp<7@(rY{w{OJwA z?64OMXedWk_~r9@HT%ZM1at?NM(DAb33_^dTz(P(z>e|9mSjT(E;QAKOexJM^hQat z5qVj6Hi{!%AA|jZEb}Cq@llJXy5UK(iJ@5O8Ne{@IfQqco|_w^zuh!P=MAsOpHyPB zqP(^^LXXZ&(zEkp>6c*jHCC9+muDlfs05XQqIhJg*X^Jvvw`W~@`QHAmz;=7xHnun zgwNAsWITP|NvOpJcJ9~#x!x2GqA-~<4Ug&mlsEtXZu6{wj0Mx4xp4t@o}ct!@q~NX ztc2twa%h96l%{xu&$N@Qq3hkQQaK|N!Lz=kc3ly^r3l^VaA}4I!q&gK#`P$w@R7cqvWsKrM<*j%|B9@F&?2Eutu=wdk{FM{F3M zU7F#EF5&21`gDKi>zKYw0VTfKh_@_IPvC+#$P^{(Cxxg}dK>ZybNx$_rQ}psR;{Y9 zDPMy)#31^WKcY{ylT(IMmAIdRagX=_V1LFK)7ooCYD;3p`1ul}U`M zVtA6QVp(go=KzbtCNLzd5S*n2nF1dxOf;oeXlN^%XFKufOj;TASsJ&K-6-quh-mCr z$0Vy{bphCOQ2AP3Re?&vbvsIVwAdGqO?bpV!{hpFc%u4- zM^7ful8pvDNw>$7I#(;}0x--M&Ny~B1-R;8bDB+#l14G`k=05@^MGjJ zPbM2wmeP!F&%bp8cr_gjY9@dNoOxG^3Cx9CY*`;|yQ(@XXWMP+S$BZ5v#unl>}8n-jsDYJPc*;V9>7W8Jcz?*2swsfm|Ug0x5l2c`K zT>*w4P0xPitga%sln8WipaohG$oMqPCMWbYJ9zp$8INzxG~=^pR}YGH2iS8kJ?4v@ z0le7k=&?$|Dj4*D%fzbK@pwF%QY>~2kM^Z60fvLx$rw*Y3qfVH$mkqBK944%CSfu= z7@9ltXdcx0li9E|#h>v7|4V5~&Iz?nf^Giv1;B-5d0yL~?6n9ofyYZsy_P&!BN&35&7tUG`mpT?GCe)O>FAI(ocb70Ox<|Q zhmuX>OoP1iAQ`c(5(8Q)fhV<5QF3T{58T0{7lp{3Zr9b+?I&x@Q+PBPXkw=>BtD~R zix(GotbZcMdb2p0I6OKwCViz}5bAI#Xk;5UQDTxoNr{R+XrKZu$(jI@Y>-K9$SFOE zu4r|ZdQVDnu$KTzs*nwN&qi(chB8{|}k@ zcfiuQ(Q^1}k!{)7S%J1P&=-rWwmd&8R4D^z0j`v$jmvZv;Eju2CC_{MR%IoR9HwTA zIjjY$@MzT@zqh9F_@Kw*)%yFTz99e}9v-Ga{*`vG)N1%m9Da{$2!HqBmz5R%ckT1@ z(m681e{IORJpQGnrAz_91-}IoHlcGPl)eXeadDAuz4cbQ?z-#Td_MHhLv-ZG5&FUx zzTozQ2pzA#{yN=r&potf&mOw*#vAD?U-?Rb{|7(#0o`}seKf{<1Ix?Hv~%Z9`r6mN zRyY}+e)?(p_P4(+;1`ti8KLh1#wa@X+;i!@?|rYEx^3IG(Za$4U3lSzZhs^KtZS~h zhHk(8b{ZWWb@knF!wvM{gAa-b0RG5FK0-To?1(DT@!-LOO)m+Fd7Uf%ytmFyS@W1W zF(vBjA?lz32psW=(>3JdG^*tQ?3cduB^i;HA2L^5aRps;(M6(je0-d)zy5lVQ;9b1 zRGt|6urjo3*RF5$psz#M-#+Po;DHC| z#EBF1p$~mX`hWPtAJQFn+(CEWeK&31yqPY!O5M?;N9nh}{Vh#SP73YNp+f>nWH@~IFunZp%hEi4{CFf2M&G;dzAHL4 zxRK$LpZp~K_{Tq%>DeyCa00<5P7>P}<@@c}_W&bdSoPYKw58d80Ka|vcF8vuO|f9~ z0jRi|j`VoMNatCNuD<%}NJ__ObEAL@$2SDPDZ?#PZn@2$cH3?A{`bFM$hhv>+a%53@AVC_$Z98v0QH=6&XErmOeh$=Z@u-F zJH6so3zq>Dtezo*1>6fSydboV`t?T(aJ&ZNIvlUTH{X0S-E`AUa$jr#d+oK?==tZL z&&Y4Q@diEf%rhBnqc#3$0shgCek2$UpF-^)&Wv1sAC5UA1#N4*QQOIWHqhnSae|u$5f31dyhT# zm@Mw1PR~y4>(^u71B{V&-g)QAq9?A3kxbOF5W+6k^z<}ccG+cg{`u#pJVWO4%P*G? zcDrK1t``|2*NEi=ye+M+Wd;{pwdUec*%sM<0EZ zKKt3v(&LXmE?c0W$AbOvYp=bQo_z92`uf+uE?b_luV0U=8S7UM*)MD{;@(pOg*s@M zTH`&i?FV4^L^>WgeD}NGb@f3HKKu9Ymz6UfN}#Rpd818zU){%P6W98F1Op&!M@Eor zLSKCGMOg^Ng_P}w9Coj;-HAmMcEvE_F;aB__^^c;<2&E^j_?6s&~Yu+i?WwqdZ{q_ zwXS}u5Af87w?g~6#0LtVlW}B&r&$4D05L9>G(S!R^rK*b7Dq1Xdhv#S=)kP85z2<} z63J|q&Py6=}AOERCodHU0bkZReAo;{Wg~~1BDPI!!RNQh)NkXflwGRSei1CN-&gKDa)#m z;wg_lP?q}SL&AfPR;7HfN~bj$&^3ABmurew>5;4ICyEAn^=EQ~NuH(Y>?SW0+ew;Tgc zL4RP%^aa{RSWV{uXA#H9RA@+oN>=JoG*5-l6c6N*Y&26MSm0B7v`EHR!lU_P9GM(5 zpq*$|k7?rs^iIOe&N?>+3l73*$El1K0`<=J#HW&xXjZS{L07?-I?+lM{WE$B0!okP zOQI<~r8Mv;KG#+s5lcsK3Q#4-`dx)5lQD_Oc4A6uJeBQ|RW)JYDqSgzE)}WGnZoq>s zkI(b3iJG2u*GDiX**b39Wz$l|*8r@HFN9Z0YoI4)#+B7^1RWk9bd=G{;*56XSi!%H ze;pfXiuOi?mxPvSDj6cH+K4;qt8snt%m6L(XOYMDa_k7nF-@TsXm-?EkUiUqmh@Sg zY6o{Pt)wa{{W^+=qnF|!C&&Xj^0aj{Nk>{_`d9Q7CT4Kppdbc)A&n`^T zYs+I|a(I9lkWeL4XqP$HKrY2h_izaBqLzge81$LBZED-3jvNA?JJWInR)GurQ9tIQV| z)$(P0ng=po5!oiOd2+p`4W}THEVf=a19cFpuI0pOPIL+yga)H6@i7mk{=PEy#$j1D$L{@e*5Etd>W$lRiZg)vBHR^=Q$LJ~$2+t{ckXQvWQEZ9~wb z6%^J}nI*o!Lj<6~c`1YZKK{JEG)7M@Y@!z!=-JvJjc{LsbF8kB{mG_t$By>73do)c zp;d~#RJx-btJh$qHU$@HCCSP78U&T`1)V~}R|^HxIm*RD3v}_+0)2etB>iGxGd;UF zMJLY;(I`*d>9(K+pELj3iNnN@=`(%3ZVt<--yo<)4tXQ5EI6S%c0g~nEb|o*s?Hx= zqJNw`O4p8_qW@i<6tEBT3LJ~EAs+Ldf0-=|d+SrvsUXuJjlwKgWLY=LFaj)q0vZRJ zCCDbC0Z-CrWlWd?u6&t}icJ8$#LMmrc|`xs)M>hTWaEj;zQg z$vK0|^e>x^&}Sx2(4)NSesFG@-dGuvX&Wo=!f1tA<&VUo+S1Km_5=aFP}-F%DC#UB z0qjjP60ot?GEGf+N!BF8n5fi*F6?$q4zAFq!TKz;!ceU6b$Sca{%Ptc-8gZQcJnp* zzS(Iyuskk6jbQw;PstZpv;Nq2n>=1lp{kc90Su#A(A>5=P6fwQBCKrE2Og9FwD2j= z>z%ECL+uKGZQ(n4jIdxu6k*$Q;mjb7^9IUiCXUg^$4}BPdDZ=s*=_XF@&w~qznAu` ziht-(v6b>Eo+M|O*Bj&vU>j6STAHE|5Q+v!1u1r{>*`-a=H_EUz-GTCawlv#r z=3JNi3ji0U6n40aURsaVIIAU}o5Ue}iU+omEE+v71%NBrHvzaZfu~_`;6XZZ=y8caUokRA z_`Jf4u=^P3-3wdj)R|!hy0*G$(!jTd@ima^Rae^hu?8`cb;(=x9*?GF8r9b#8}-)s zohh^{%zAC2Ksk& z%j99&#`o5sV?kCHN1`je_LV2$apG4ZU8%YN!;&4rW!AmmGFk(W6JM&7St-)7kcZf5 z2Dmd2*KGhuti0dD+n`^bdYkUp`YL^S@@?K0T@avUo3!YToZKE+)7l7Ai?>xT1-O#7 zcF)Lm<&;x!e2Bp~wme9<@9lJnKu_}s{%0P^|FQLVblcP)=pvrV7x@IRuM}DP0;U(I zN3+5mY?m&wyipO)K(DXVCwq|2I%pZ6D zDPDB_{lvTUiLvAKi^VN;-~4tuureu*$~LHRIpqj|s(8IS5+mBtW+}k&49xBgjkD1c z@Y;Y9EuOI)r04{1iJqvh>T!s5;*EvhFAmX`p=Ein5N%Y|QI#+5j^Q@y#_?lx-PlRm zv$&al%0Ta5o|2Ob+n_OD(T|juXsAQ6M|I7Pr2t341XLoJ`{Lkm#^=$Zd_1l(P$aIt z(J??XJc?gm7@}PhD}}XSG}oyk;>0x?k0Y<=(fpUACuOq)BYNL**fdf1(vlYwYhe-F zDd!wLO#zmSsVTRs4Ie(n z&!ay)f@jiGbpQN0w0C(k-(ukf1WfSjTbcvR{$-;R{#F4i@DyZqyx>`53NVU?`D=_- zVXDT{q@ClqJFfdJl`eiEg1Bk&fsq;d!0-&cyfPs`Kee=#W&+TK)ohg;*mVh7tHtZbUn&h#h!JqN_1t%nmxW)O1*X%mA^WQ_;rl-GANi9#o!M9a*hgNXd@^CvA)Ua7`<=6u4 z8eOWkYZQgm5y`>`8DtM}#J%wm9?cW{AYuyd-}boFci4Dk&$n0~<7@OsdHM#phiap; z4LTIA(UJ+3k8ZeG9bmR@!E+t7fWm7_3qe618wXc)0N`Loe8m0nB9D$k4Du3>=B<1S zHN?pGa4^FiUJKNBz_tu5(_ip)`maV#@Js$H^a|fzEz9Xx%&7==@Czq=+oddF9=$59 zZD)cY0>XP(V}txUEjJGG>iX$ZBXoReKkINEUyHNicG0v3F@R z|4mhvvEuC5fkd?jFbrD&ZQFB>c@Rc`<-`w8-Diacuw_uv`Z$j|s??=@AjG;W~)b^b%(l ze|Fj~&R9I*&5m~%*oWq~(t|u=u~Hsoo!Apk+qEhm+|~86CV<^1N(^9j-36dr3N#Kh zB{T4JJzB>ARtWgRa=c>&fLkp97SEya=c@9jtMk+J4uIv+IuS=~02T4-w^?HRng;vA z*Qz5W{A&VObb2GwqglsGcuM^23K@9fgM_yFSTX+X@$Z*M=mGvS)kk>L9yv3@E9KP@ zTk5nIyQSH7sj|i$YX_M1d#|7r&cY5k+&G-}dNEBGevPI?6-FyYEq=obf0p{#{1!US zz+%Ks@<)oAhNZ1yFXV+8s?zGpTl?+^z^+LSDw~!AlNXFD-vc6i!OL`$e2v6jHQHqb zzyiNl`3GR`Wnh2Kf6G+=6BlR1dVngL*f4F$i=}bfKB6u2uZ-R?fW1)+qZyzffJ8$( zTUVC3**!Y`#(3KZuA}vr53Hs5=cNZ2*n4KCVD@9*pt%4TXZZ<;B zT2Pa*b_`%>EjY-|d1oN5d#MP>snyd;H2o)dq05x`uJiuIary}Z`wRX9@>!mo^))ud z>w%zXi7(hlZN-DGEHB2NcAFgqShgL_^(O@rJ>;OgsXKP}>IlEEa^5~tqxX!SkynRc z8~3o7w)ZVe(A_gz>DLS_wim~Ev`$0>OpK6=r4VoIz|jDzyHefoG}M=b$}61(xZKWa zPlM#FGIh6xq~U`faQU;Tn%oOx;e_|Yp5Y%sz5Dc5{w07Z{@FzQy)bWS0$A-gKtN#{ zYJ$6>NguupSc#4<{ve6$`L%EF?GjY<*4iCVZuGp`#ml=s3WI#TEl9j&tyG#v+&o zXSPj3$J^}8GJ|{J=rUcwqj&e*6y3!m_IaL?YXdxD8Q7SV1RVTD;TRGPZ5xN;L${Q` z6EtKS9g)TAu{ji3*5j>bl8%x}jHRTzJ+gJs)xr+rTHMP5YgqVhTW^=7fs*bQoMmD-7P5I#3NqRzY;CziCu{v z2{;-a-R0H0HiEsg%}IquBtg9U=?U|M2{K- z&}zX8bAt@xVFvce0PHcYV?~TbRV+3+wjKHGQTrGB3bIaI;EmP==n|exr{WPCstrEq zvHsY0)aM<$4=^0$Pdc-M7aq-XP}2Y`uCa%fhk1iyQl{hMJS}6y0@!*|nJJv%>9?xX z8Sf?0OIU%%iT5ry8O?wrzFV4Vr<^F7^$%@NPr<*)XO2Aq*qzc;Q0cTc&c!Ak$m3;-7HDrp<7@(rY{w{OJwA z?64OMXedWk_~r9@HT%ZM1at?NM(DAb33_^dTz(P(z>e|9mSjT(E;QAKOexJM^hQat z5qVj6Hi{!%AA|jZEb}Cq@llJXy5UK(iJ@5O8Ne{@IfQqco|_w^zuh!P=MAsOpHyPB zqP(^^LXXZ&(zEkp>6c*jHCC9+muDlfs05XQqIhJg*X^Jvvw`W~@`QHAmz;=7xHnun zgwNAsWITP|NvOpJcJ9~#x!x2GqA-~<4Ug&mlsEtXZu6{wj0Mx4xp4t@o}ct!@q~NX ztc2twa%h96l%{xu&$N@Qq3hkQQaK|N!Lz=kc3ly^r3l^VaA}4I!q&gK#`P$w@R7cqvWsKrM<*j%|B9@F&?2Eutu=wdk{FM{F3M zU7F#EF5&21`gDKi>zKYw0VTfKh_@_IPvC+#$P^{(Cxxg}dK>ZybNx$_rQ}psR;{Y9 zDPMy)#31^WKcY{ylT(IMmAIdRagX=_V1LFK)7ooCYD;3p`1ul}U`M zVtA6QVp(go=KzbtCNLzd5S*n2nF1dxOf;oeXlN^%XFKufOj;TASsJ&K-6-quh-mCr z$0Vy{bphCOQ2AP3Re?&vbvsIVwAdGqO?bpV!{hpFc%u4- zM^7ful8pvDNw>$7I#(;}0x--M&Ny~B1-R;8bDB+#l14G`k=05@^MGjJ zPbM2wmeP!F&%bp8cr_gjY9@dNoOxG^3Cx9CY*`;|yQ(@XXWMP+S$BZ5v#unl>}8n-jsDYJPc*;V9>7W8Jcz?*2swsfm|Ug0x5l2c`K zT>*w4P0xPitga%sln8WipaohG$oMqPCMWbYJ9zp$8INzxG~=^pR}YGH2iS8kJ?4v@ z0le7k=&?$|Dj4*D%fzbK@pwF%QY>~2kM^Z60fvLx$rw*Y3qfVH$mkqBK944%CSfu= z7@9ltXdcx0li9E|#h>v7|4V5~&Iz?nf^Giv1;B-5d0yL~?6n9ofyYZsy_P&!BN&35&7tUG`mpT?GCe)O>FAI(ocb70Ox<|Q zhmuX>OoP1iAQ`c(5(8Q)fhV<5QF3T{58T0{7lp{3Zr9b+?I&x@Q+PBPXkw=>BtD~R zix(GotbZcMdb2p0I6OKwCViz}5bAI#Xk;5UQDTxoNr{R+XrKZu$(jI@Y>-K9$SFOE zu4r|ZdQVDnu$KTzs*nwN&qi(chB8{|}k@ zcfiuQ(Q^1}k!{)7S%J1P&=-rWwmd&8R4D^z0j`v$jmvZv;Eju2CC_{MR%IoR9HwTA zIjjY$@MzT@zqh9F_@Kw*)%yFTz99e}9v-Ga{*`vG)N1%m9Da{$2!HqBmz5R%ckT1@ z(m681e{IORJpQGnrAz_91-}IoHlcGPl)eXeadDAuz4cbQ?z-#Td_MHhLv-ZG5&FUx zzTozQ2pzA#{yN=r&potf&mOw*#vAD?U-?Rb{|7(#0o`}seKf{<1Ix?Hv~%Z9`r6mN zRyY}+e)?(p_P4(+;1`ti8KLh1#wa@X+;i!@?|rYEx^3IG(Za$4U3lSzZhs^KtZS~h zhHk(8b{ZWWb@knF!wvM{gAa-b0RG5FK0-To?1(DT@!-LOO)m+Fd7Uf%ytmFyS@W1W zF(vBjA?lz32psW=(>3JdG^*tQ?3cduB^i;HA2L^5aRps;(M6(je0-d)zy5lVQ;9b1 zRGt|6urjo3*RF5$psz#M-#+Po;DHC| z#EBF1p$~mX`hWPtAJQFn+(CEWeK&31yqPY!O5M?;N9nh}{Vh#SP73YNp+f>nWH@~IFunZp%hEi4{CFf2M&G;dzAHL4 zxRK$LpZp~K_{Tq%>DeyCa00<5P7>P}<@@c}_W&bdSoPYKw58d80Ka|vcF8vuO|f9~ z0jRi|j`VoMNatCNuD<%}NJ__ObEAL@$2SDPDZ?#PZn@2$cH3?A{`bFM$hhv>+a%53@AVC_$Z98v0QH=6&XErmOeh$=Z@u-F zJH6so3zq>Dtezo*1>6fSydboV`t?T(aJ&ZNIvlUTH{X0S-E`AUa$jr#d+oK?==tZL z&&Y4Q@diEf%rhBnqc#3$0shgCek2$UpF-^)&Wv1sAC5UA1#N4*QQOIWHqhnSae|u$5f31dyhT# zm@Mw1PR~y4>(^u71B{V&-g)QAq9?A3kxbOF5W+6k^z<}ccG+cg{`u#pJVWO4%P*G? zcDrK1t``|2*NEi=ye+M+Wd;{pwdUec*%sM<0EZ zKKt3v(&LXmE?c0W$AbOvYp=bQo_z92`uf+uE?b_luV0U=8S7UM*)MD{;@(pOg*s@M zTH`&i?FV4^L^>WgeD}NGb@f3HKKu9Ymz6UfN}#Rpd818zU){%P6W98F1Op&!M@Eor zLSKCGMOg^Ng_P}w9Coj;-HAmMcEvE_F;aB__^^c;<2&E^j_?6s&~Yu+i?WwqdZ{q_ zwXS}u5Af87w?g~6#0LtVlW}B&r&$4D05L9>G(S!R^rK*b7Dq1Xdhv#S=)kP85z2<} z63J|q&2H znPh*-Y<72^ohR8OF`v}rvCzrU0RRA&qJoUZf3op^9ToWBC^iM;{ZAmcX~;_fs(-&b z0ssUT6=fu~yb;aC;c_%#;V7uMQWGz-T)48+&bH&e?IIebB<&C4cxs+i3z@47?`|8h(|%jgasB&hazEK{DvA2h-fV?)%#ZSl`pkKwx_jY!KhUSnX=&mGMr?upt`2SI=>!oDRrhLt?U9 zEd#b(&Nc*Xq8j8(f%4FpVhi~nNWJ}8zY<6My-9e7Hw~w+`*R&p?QDk8O_)D5L-7!u zaFTMV2jmaKHm-==K8suwmuCJ_PQ;F>RYc$6=%2xcsbvco@;utEcoa22G<^?r{rf1e zhKuDtK;`XCB#D7!BNy*z(F=;%Y2f*=c|i#-1{e|2Vx}$(v9#8*`$DFdRLyU~dvdjQ8WOoOR2w@&Tae?%QxR?4sV zj5!V$>Na(JYso_NCypFTi^rCK?<%1TyGQ`}bwb9$vb=GU@Z$rqU#);DSrQZN&-TI@ z{z_~QNaYQk3zA>273717uIza-yvH-Kv(M0{W4kPI$OSl1=pL%&#tYh~ry{&VI~f*6l}Vz||-A_qyL3c0s;{ z+l+xrvVy0JK+=DR)~J(r&-&C^`8zh#htE5&M$%fyC7q1S zx!;m!M=HhrV}0Kz6-;wWgOv$5p?Wrplbk131$j9w6)A<_*VBg9h@GWvvaPjo*o^Xv46j`mJEvVhNiHgH(&^da$+SkIKNiP3I4|jf zb?>cz!)Q^NquClMSaa(Hr67{ZJLKZPLuW6dvoUm)^H{^U3KUyEe`2MDv7fiVGnhUz zq+Y@$vxUQZKKLi`90(?f3z6gp{2})!gjMS7GP)u@hW}p)xIVSqRqkgd9s4was$#}5lQOJ7+>yi9Lqgx?_x|!F# z7sF%lH)#vEH2sJT4a1RCNO%>9cP2hz)YH6S7~=;zi1>u*E)-i(9~&~-!qN-_SE_RD z{UYtd@Sh=4ci`KK4m*kwb)V_Q03m7a3I(^{#Skke{WS*7M9?Yfvk;SLqHe%B1Uq;T z$nG{ut31f({xlGrW8R)DSojs=w|?9++wL;qlcQF)(jFpR`Qly&3S^+i+>oB0nR>Cy z&p6XA;CLGN?bNLaE8b6H&mnrsXyh3P4>g4nQinC_^@#Sufw(534ZGD@B4@t~^u5Za z)!Lbt{;t3N!Z6CrjPLA3bvfg2#e$kxswT85e<=1;lSK^PS*}qt{y;dG6G@qJRG~{l;&l zFsb!%w;11OtA{xm7`w~=p4{(cD)?;Z!s5s$nl5dnbG1#k%SHvmdm!Wr9|qE4^dBz^ zz{v#+xJXH76EJ5=oxMjL^x4C>42LfYp^_~>!m>fCW2V_xT((yKPWwo*oBA&Dg(`pj zK-*^)WZKw3J~hy}>#$xD>CIpR^aaT`Aw=GPLDDV3c(jbP?2gqlwDg4__+DDWBrEx~ zC0n3}MufK!60xuDEICQWYUGpVvot(;<)3E3;3Xtg&MO`h^ka~Y`*LKab&E0QAf4#! zeO(OBN;;LV&UAtKjQLcaAmAO`2l2KEgLyrj!EbsT5#jmW{p1t75hb)#p?cWrgZ3(- z2>xfDP%3k44pc8Y20^J8)*5J;4L2UFbC08hmr$BtEqZLirIJ-HD`ogfD)FID-Q2)Z zzN+Bw;Cy-2KKf9MmZsS3l~kavxv2~=HAKaGk<;OK2iE=Zk$~4QpkXnDJy=Y7;GqU> z!MV8U4ym!b+vD-w{r=NCJzA<6Bb#mA+i{rq1#Fvh8Pl>N{im6g5b7_iszVP(BsOgu z-mMc^P&lv1&)iu>GlkGp4hUu;uGWY5&G5<-pT6HrLZMTGR4|((FhaN+0mT$pfbNgi zGD2+~AwoG$AdTwk zZa(2!d>1;c(Ei0UX!kN&UH?9J2u&4PuCicpBC6UVGt_`Ox2f-oC|Nx>sQ?6z6o+sG zkDXMbE6s%uc-CJ*z0k}mY1&3DGy z*E`}(dWUFo6o0}rJ)@V>F_sYv>e8=UJ zXtzX%y_I^a-xBeLv-W)l$q^G)2A$^aIQ6nHr`cFN!gIg6Jrf){(9a}*&*SCK{=UZj zHnxitB>7W<^?7~~uPW?N%KOqz818LaiC6?)u(XPelq2Gz)Qu^fz1!^M*r_v`M)w?u zw1!vgoviR%)XV{cU$<}|B_fGjZ3XOJIhOpxJ=i^|Fm1u|t&m@rp0vKKo={*36dg z1UQ?*L5e_87#dd=EdAWEeghB0XNRkX9w*OCR1Q?yi7;3G8sIv)BQ;A@5cl3UmbqkR z$y>5Kh{B~s&iR>1XuYta!9AZmfy%!~?|FNl?4Fv$;u#!8$eSia#D-}zm&A_(mEGor+wEXSPT;uf18>Jk`{e%3jC`|Xtk`F+Dj1v9L9vm`=N365XaecCT#Y&}W>_A#{^nEu`71MrIo7E}Hf z)ZvnM4u)(W$_6&NXPrx(?=b`DO*4D5bI(7e<`wIElz9KDQj-*#P22bk@&Lj#q*w^O zR~!m~qwLy61eV_+gbfSw!nG|}SWdrZPH4o=LJ1_qL=4XHh@1wuOZJZ+)6U1+G_jXz z-~PeP?hV@amx3Wq)z7|Q@n9SvBiBz1ZyUTG+97vm!t{m1VO5-tf`u?8S*9`5N9`TM6&b@$d#L3V<-=&UzksPBS!q~+W5J^e z11mZ^@~onx2ZPKvWwG^3c3Ev=SebX|8&ws0EmywYw@gaIqP622Y~_?S)a6#iu)}8Q zDlMl=5?F<1UvKJu5Ry8uSC&B>MJ_X@OKSs|cgWKj3j8 zf{}esd8GH&ICLqTo5mb(XB<{wOj2p3op)*%sAdo=iTHzOGH7wEuH!G<%_fpyZcAPQ~Jf}sr{t-F&|D1ClGc= zn&w}?U9&U(yup)!WkU!(uo1%8#Q;IZxJoO~jpvXkQLz1I(ZW-&re=q>Xn;gQW`I*2 zm8v%Nvmi*wYsC=#Igz^%KHQ@q?a1JIu?ZY2mDwHFxPmoCqP!d$!fEKx5#6;9CS{on z#^(k7{N5f*&nAik(YMHSfGaq^XaU>h{TN**M_U!$qR+*RTONx1w)#!hry4OId8!%; zioT+W(_R{SR)tXf;UjB^uZfR=z+;DU1va!ib?@SW|2Cyb_%?Wa2a#pwG;@fP#Kck% z$sVQ0vP9Iu`Ek}%xXWWp{xoUZVG8VM8RMRg21 z6!jw|^-PxK^beil*ucvikHEFULJrRsthf)lE*4+&n-5_qL19iGf?e+MGH*A9f)-xa z+APi!|G2@%N88+woT(EKHnf?I-DosrG}O^1f3jV*CT zu)zUDV(m``z7Drf2W}fk$PR`A*|ZQnBmqvncR-c_QX+Us_byw*N6TuVF6dXkg_{{2) z0p{R@tm+(*olPFU)C=)Va4)deN3aasC!a=o;AAPSy7>i*K2ac&fu@;$g?7^x#E(Lq zK^-CUNrBBZdk4c#uuaQlW=hU|qV4^f7#@@B*!l8P$@4EVu-_p$Z)Prk>&?U8Y|Zn} z`UY>_kF^~Ex4|Mlo;lT-7L1#7=mPs!Yzsy|jl~r7*PWO<*uce~@*0WAC|4XK_&ov; zR3X=zdtoCS4yb1KVobjjeFwsxnQbDCiK8eToiJ#I%kS{_G`_wl~iHbPDbdXQupw*x03ogN_IGC#;D<<(Ev(N5@;&&P#ACOnjUX1 z=T9c4w2JebsxIM|M~=82M_|2fV4EK>weH$&=C(gsDWYWW5TCd{jPuCoAtU- z@NYelffzy#<>&fBnulf&68%ecaw+p>-L6!LMzJh z17**|(f-wj`^trX`_Ml+G2{pm@q^2{cXn0BqdpkZP*7k5Gq1=WFAt67>1{ydCl%7+ zk+o!ERI{CZT-pAHS#?hJ`LP{gli{_M6Dk(NE?RNJ#kHuK=&7Fle^%#Q{<8aW?fdsI zU$-=?W-F--N@-!i(iuOHI|hKSH})_GvMc)(OGSxn&Ig}4b`F#1yyOv+HGuo!IHfmJ z>*ajQCL*B{b4K7xJLC?WyMnUn}IP}JHGgW%3MT#9R6#(Pe<`$ zQ|yt9ToIo;6-eAu3dIjyZ7H%5I)#wr8~8ayr{}(e={+eTtz!pW!W%m*&GG|lEZo5f z*U-RkX@6t0)6O~OnKuR+k=x7;M7<7I5uRd6U)S}7glvJIP6D&m388i82WvZ}w?q#t zR9BjP{5auboD;n%p8zh(Yjblp`8 z;NXCxNn0JQB*0zGz=pg80kfKSJU3HdUX<;R^H|g=`Bb8>|3t5adVvcoXCEb;Z@(d;f&k4Y`a{SdnCm6$H54{l`Dq?-CC<{A_Y&Y zXTa?#&%I|(+m-UKpw+D6wPVexFDb3CJhHTfR!r&kTu@_D_ro^+!}rS1QF8MnbbFcZ zsr?@CW}KPJF*87uxSAoNNT5~f1=D#k*8*pxiHpPByHYQNJG1swH^!=lnw*cn-x4p^ zS3W*zT<{mrcpa-Tg1?Qmp1OA%0NvBl)Ed$>O!^Z0&BV?ymakd^f-@#@5ueMj9MtC; z6R6$&ogBxjJ}0Hg8oR~yN8cizy8Xv9Yp~fbldG+z|1hVP%WQ@h-{k2%NHYj|`W!00 zNMZo=r^4_nLy_%eI|sF+mR9NwZ*wCNzLPNRy&wOYv-qb$YwSJZ-TZ{+`FR@OIgDIv zT_#j?`xV_<(Gb&S}zzV zmAI4nxWv@lCu3o7h5-#J{p+2OA3PjPn2f#_M$|!uji8UzDyeoQ%+G6yLh}!}4*H~t ziD{QpVO?JD1{ZD@-*J)o9W#22iZ!fzU_E_Lz<=;R*fve z0@Y~;-9KU2#BwmC55EUgjuLv9#lhzhJq@)4M9f8MBeJgSI4=ZrB>&p1{yR)Z^V&jt zI!pMbA%g4Jp}cN`8u1c9pR2Rolv&5P?+ zD%hxBQ5p*(P_pKfcL8=lZSKM-I`2M(={0zz8ptrfWbkkLgMy+hAg#Xarji~@hlJ&``K7)~2 zE=ULBPYv`h5yQ@}Li)8T{W`PBk~dBwsRuv@M=uIeXdEB^*JZ5bsn7(ZynW6Rs>14`r@oxqe|q*h}3&Xrp~oyrh^Q*(rFZrcSO^01#H5y-GJr)ZQD z3x7Y9Agl16Lcip0`)KAf@W?c+X(u~3z5WkoD7Id3;*a5KTFmnR)8M~!3R1Q&-GD-x z91|t+_c`Ugz{~_TwuPMwJWk_Qv5*n9H>qj=QIpRO^6<-q3+&zZ?YT!a`EOJ`lB!!A zGFrOdO!F~Gqtx{+3{AsEX0~ZTR3y#OU1zpoNR7dZVZww!A0l+zQbT|XL$OzhZ;l}1 z8m67ELD4T$`|ktnjySwT4@k-C1j)`u;tG7cfn{O;7=wqA!A_BK2yMCK+QaC3iT>MO zBCFc~)!Cc+F#PeIGEw`Y}(|hLr%r`{8*1_}~}5c5_#;SBYJMmnazkuMcC?_0dX* z>v_Tm?*3})zMYEMhANC`^2=Bl$o)^i0OpX=S6A)_q(bdeEk~`p6!PC~Gs)D(fg~jy z0tna2@Z4FUeDT2`c#Ji-3!gQWigytJc@omk!)+tEJjtLnck+k$)S<|c0%{L+WXr?k ze{yx4@;IupW(EiDOvXQha#EZPg<%jznmwLH;OIUQn6s5NQB%@*v=TI9&Lp_%$syK^ zHS;HlRf1qCHt&yuczD+2F#11zGG-5X)KQ5-He!j70W*|4 zJx0LfF{IwV)??+rHROK@qT#sKJ4uoJ0j%Piz-7$`_zm`F8?8i(*@u&0Np?@*E8rU{BSV$zHetk2Au*foD@ipGlA{k zHBU|>@?Uv2{yB)B;tdJmaT?h&54Q7W>it;~jNN+;CB6xPd>{}{E1X9H3^A?2B)QPc zlsneYZDht3%f`$Lvab}Cq~RA8YJ=}KC@m8Snsg>1XLg>$Ro@I({CpiV{@LC^pHUDV zS@IvI@F>B<%n%h)MDA*}sz64FwQf@vob6`7-Re8{)W^TjrNLP_;g{0%|k@JNoxZ7UwMXl2YEI?o13pS@qjm z?cJzc?#l{?DAZ^OmH#+AL(mI(MtF?>iEg<9^_!~jBHGv3v4M6F;iu7P-~1o@Znjo| zSYqG5|Nf1*AN3zNL_J0~x;qtmHsYxn@4>{-PX!2U2pU@Gv-bTq?zBliyq8hZ9hXjt zyeo5;!=@x#@)7vI62+!l>9R`2K#r4o#lL}qk8nLQ&$hNfA(o!Q1Ws9P7bbcx690up z4e{H}$y5HxsF~-DK#bk{Z8$j2yId8qH=3(`)5#MGHfe(9E)%Bg?jwhUCc>PWx5)nE zSF=y?qn}wC%b~{d-Wn=!DT`9tpn(s&O-jzXb}xSnZ!jAHk1Z1z=YIV3TU{za8tPlv zePdLMW970HR@;hLQd0}a0ApyeI4U@#d2kvwqngu%9Byngt^>t#v9JcHqFv3#4QlOt zRDT}~S8>>chW*H-ngt7(OFt*Vc%FBc-lmJ+aDoV|tRZF0HcXp`-Cozw4(qQbH|)HN zqk|YUYA50BX}&T|mz|Z}GnyQT)UX)pohT32{!CI0F+o}9nHDwn70w~j>o6(m)kFmH zI=6ald{RtS!xVMlt8G2G$hb(uWMYWVrbN@uriW?18Zz^GO$PA>4%+B_6({a;F17Ez zB(3pxi}#c`+@p)f=@rl9VN{Qw-DhJSq~HPDWWKai)D}g;$s3d??gI41U`dGg_2;M} zEWhG1X&<}c_Qy*&Fd*nMz9YZ;FFcF@v>t|RxgW|1N=EtYw#fPi$=&WrGY)Nxq6F~) z-?%yVA=cf#b23?C)IWZa{kOaiHA2r`a5dz^r;s9ZCKUTfURvxO&e~Wh^*PEE5+;&$ zuSCcmm45c2g6kueUJi{_%x?pODsp8s7cqdnX@;;IuK=#6)NU2G917)M5-^23L2mBG zhAWu<(p)2uTQGNB?F50QwZSWuv*nc_K>Z@nS4{e?DU*;O4i?zh%@OAHkTq3aSCd{uwM)VM2e@& z*u5bqqs*xP1ro9s*w9`;MViBiJ4fJ3sx8_WA{SR9QA?ZP_o2lQ4bkIAgAH^5mM0hU}#SdwhRViVFcZ&^uo8L?ym z2j$<-IP3F+A%)glIr1X859GKv0Fqu%8(pm^3vV}IelCJqc4_T0;>Sqv>Cor~by zt=B}Ls5w_((V)Vbj~l9)8-dcMfmf6KTfZSg5$%>% zQi(Ra$x{$tP_n{ErEJ289ER^E z4R36smI6ilAcGZRnjRVOu*bg0(MJsb1GE#XHV=+4+k>HxM2N7z$hFY%{hTwEX=(CWeU0!gNhec|cJW(nF3*N4v@4&PLNiv*mX5 zQdIr9&4q15OQ5L~_h1@9FZjfjK0a&*w37M2tI>r1=Xh2%YXHSY#(}VcR!H8NMO$d) zRuRbTt84ti7a+2)qx?)d`hepA*9;MvBpyag?}K%bswer|X3;PH~37ZRup5{vDPPLYsfqcx|YwOD2JwLR(+ zuEn@i2&3dLQZ$TRyM$4S-ktbCW|3NUqBaXxQS5hdu@_S@Hw6w9ROrMAcpxKLbG$bf$d@m)O?c}#ExN>mu8t3&E7J6KFOtv zf~|dm%FjXrIBuP)fMr8vwyxG;Rrc9F&C5eZ5yP*VH%dO~Fv_rlszPLbd?~gm713OW zT^L6?Lh#TQ`-@XVu!?eAkbd@FLFQTBsYfJnO7=E^?-<&wUJI^}bskmuxc22Q8?$*N zrnL97VY^I%_%5ETX=|~&pM8@nk3xF%KH)GzQ*iaQk|PN>1#s4KZ2_lbh}U7r+a{3J zLn`C^J(KEbtNqj~%Vc*I#`M)bUCRAI9m_3hhM5c2NQIT0)`l`HR0ECAl1!*nl{bpFPfP2-g>=qYs5L zFHF4NddjibF*eERQrnEebp0>*NiYW?vKJ^u_Yi$M`#^o`HbxZ`nG=t0+A zBt2tr;cpjG?vJt|gJbSkrNce2`3XswusHQ2&?TbxadbT1@AWjtfD4TE4Zs#y@vpkn z=RQso$)Hw5Z9N_Y)a(ne*$eW0wD@`~0X}1yk*WvOwyX zzxUP;&Y|gR;~%-)jhN37&c0WDk-p``L#Yes=IjZi=>NzTaM>^W<{Zlr5*WObad{jw zW5Yz;h4KwuE_8KW57i6IW|UHA5KIxCL;(9~&+7#4w}@4b=}+E(teq|Ia4+cc{+d?|IK`b<2DbBHDegRiy&do7D1M{p(Vnb{=Zvj(gLerK0^NT zzWRbIoa23siv!q0!*MPMVjEu&n$>5UYh5V(NTuSKS zj5L+woWA=&x&(_#x6)*rXKNd!0I0rx6vzNDQqsmx>FYO1*@+yHZG?N1O)Wf7#z|DG zb{sC1wPm%klL(lUeBz&Cze??wYiBf;A`xmr$jFn?zR%sQAT7!=YgML-I|eJYj~g>V zV5mWwA7ko|qx{AS5znj$f``U7irpX2cG9i#E@@KMSz;WtVyi(P<|@t>PXEBsMgL`O zgioDnmYPb?Q54|g^)#jpGSAC;_IkhKQ=ZmVDmVcD+iqGFCr(Gujia7JliRZZ+*Wq} zBFH!d*%5;@p0leZh&{@F6%#Ir$-FiIWzm_iEv=fyqz5G))>=zXg8cZJmk8k{e@XE= zG>sCBP`mAPyTU>smkG8Vlz=efae4DK73vp{LQ&peInE~Yt1k#_W`Hmli;@dILgCiL0T-YAh2)iK1T@C!VfsR7Y*WJ=pV4OTnY+HAf<5 zLb!FA_`vk|*ZQD!G!F7^+?mSO=+rg!k)H5A(<@vK0@!@Wyj!v>H10)8(+VF#19Nk zg88ECfC9cG#gl}mVo8I1Pzo|?7!n7~J-iwLX9OI?^DJ7U5O3Kon(q$11@~xb{HU?m z#<`AvneU)Ws>;?43i1d{MHb94JeP%KbQJ@&l5VbXO!6Y62 zrwoJ7EQjSxen{m}3$;P_Czxq#t>Q{Ur|VS5!ig_DPwSCE=&=INqKDWG>(u<` zpPJau?j<)tNvk6JTSZA_*ROCHt}M=3+E078B3#s;h`mr7 zyZ?L4G4babv1VB4no1G8G*Kabt|4jij<8=c}k>znlq--bfp1*z{O50I-o zO^t_nj_rx#5pm;&cOz8|^+yBV5xH;SB9Kd0a+8>vKTJF@I0KP%OiqVPqZ<(uNJox2 z^ozr*A7IAMfbF2;A5vuiXDG00bcnlPaVoWdm>!d+vpf4jmQ`1lg?vT@rk2<;GvuCr zY8;o96xR&f?zg}DYVf*=h;#-m3*jhw0?rfN-+YO5y;7XO9{OD zolD3+rz~|HM)_lP$*prWX^7t)F)megwf(rM7oUqBawS0NjK6S1=eq3b;y2kT1A(D& zkXW!ot}8v$Y|7?IB0KcU`JKv+nFH=)^7{_kge>&!`xn33p| zQsQwdtbHZr!R3PkR%2Aiv28!|?4D{r?+paT;Iwy|GCLx)z8|| zf^jlZAv2|i?HK@V(r|Dj1TkSIMHA1Gf$))-ab`?gxHs0Q5zX(%)YRY7eBZSuf8F(R zX>QFultL?ueT4jdf(vsnYnTRWJ!Un$Zub1HeNkZd*Obkracr)H2c{ps>)CcxJek`N zWcjRuYXzyRmu)y9iy;3B$j@k)SLaVVDXB&O{l8SDhZM#64w9J98Sp|~*CSQS8`MHT zViP}thxRMTxc8Vl<7=*CycPYoQ3CtJVqB8RMLjZNTJX= zQvnUV44h#)kVC9c5y!PAOs(cn(i#$rlgS?OTU0yLw1MP0BJrK*cxLpH?@9gF%lCB* zz*g+dXEZ<5Tv00)Y7s@z3k~mzAbpZD?^kW)Z zvKUIdhN@4HIv|NcV$)vok=HQY&cYYqWR7}E|< z;Tr$jY8=;*rudz`=%wpF?lC0nvW-rtz&@6ub76!au#xjBEi1q z-988Cjanl}>HcMqlTDf$j;L-q(~!r+F9Wn|72b85D7HkB6xmyP@uPAt5=ODV0Dd zguoi_1OUyf7nOiR!{{L2Z{JWeW+S#M>m7Xo92S0!AzEOo9oY895B0m92ctx))Pz|6 zIsLePnZgoU z-|mK&aRJn+m^4r6R#JTam>rBu)(W^m%&hw#|^|3VON2Q^bo>xb& z^R~nGrY3>=fA>9GU5``F*w;9sm%$zXo=ygGNCYLWV$@{>XtudyqX~gwpFWJ*u>n5%>eh4|p1& z{+FyiSSuQ=TA6<GY`M0Mho&vD)pX)p zHi*Gzq|cwX-ntERbxpTAd@?rwC}XpWTq4?d3@~yTG6K}OKGxz01AbB5$#z>3T(=%0 z)TW=>CGi@ z0mubwT6belp(k=dLgT0Hj3YF_$CsPwLqAtah=xe)9 z&(ohj2a$JmEviBF?KT<7jK4@$`UbKd^{ znY!J|lh)1NaG37}kxjJG_1yLqa56iI%znM^d3)XbCQUN5y!ju-*rPpaI_FjhpIfCt z;!a}4JHV*XvIh3M2td^LXj&tE|6f8g~-ysT#Vee8Qh-1uYEwf22_I0Tb`lv7 zci5Hu(P$PqL=SDf0g32_>S6`fbw0r4CB{!2*}tB*pH%OzKIdQfGjENC1Q{+q|EURV zvbVlA!hj_OoLXSoV0`j+LR8-_6nj2xc!A`6(wh(sh_p_a>LYR_BHsVweJQ{l`c0 zdz=GK3_2Y`rdQ`(zL}#@Bo9r-TQ^*_RzPx^QAtEWRCodHTS<%@TS_7$uw^0xwxvixiBLef_!31( z7DtXbpT!Y{%g7c($HiC+~Yz|KG2wtE#J~ z7a_zib=Rx+zxDgyzf|>1V#EFSFHs^v3F5|AxdhNoPqd6Ei-?tGlL55x=lZb{5qw9~ zN(S3C0rc^jlt7GwCC1LszUz|jUf=3IkG=xS42IT=MQawzYm3ZC!YbINUIujt1X4=!_7+LIY5?tc;t0+-usE1;4?c z+ERkAOH`Gs599z4j4SJh87;Kd3!{ypK3&sd7tTY@I|$mGtu);dk81;9jV9{!`{5Z{ znXJ)7wLl-1hv;@AMH%i(y2h+6)>|?MRvkwe-Qw5**2c(s`mh`z-WAIMOq*zvfF$ZB z(?YYII#<-r;w)`1%u$8upJmJRSbmO9GH4%^hiR&jrZi{Ai)V9?v`@BS!3?4Ud`tK~ zdtn72vR!;xz%c*q$mj$#-Nq4YV2-a%)dVa|OSBb9uDIfD+Qz`4+Dl<8KV$`yl)&ca8wiPBewZjP7t~nhBVt~sta9guHZF949sga{Y3oB@{ zmS?0Blu0+gBdpnPb}J>22#`7T^L`>bVxfD7Spf>M$_UmrVYr} zSs7JU;014SDM=~jJ;tCtnwz83l_I@aTEW*Ls_Q%x%N0@$sbtu|2WuRvX-jUNe$8v#1XtQy4BUs6VFoot zS(Y+O91KIp0I6y8$s+0s+q|Ts`!5Svs3{+47C@hZ1ns2Z>uJ5klr&RL_Zr~9+nimX zP5hbUbKKiJRZmpzpt+?qS6st;B+&+3+KDBgqX(?^fQ32nR2GNGBZ@#{H4H)|Tovvz$lE<1B~ix;|B=y~EdN-{_b0r{Z_~G*P26uYYyBMTN)W$tBud+g=Y~QPLV1 zOKb2n9c767QjFCs16FGzr@Lzm3;?=2RiVEOU8nsF+@9k9Xic)h{6rHtHx7xhgP63h zD7pnOJsO&Z5erlV?MP|KR`&p`(n!)&&DkMaCBiwVC;+!IS*1T0Z%D=cwRnxzCCkp! zMM%Z@a|!nl-4nQmAzd?JERE4J+f)SY96O_(!giLQ!oMk}XgIk{2-_hf_X?njhO7E0c(#3i~Ld{@^b*!B@2$2m0%;Q8m)HEBkVET-M->#*(wy{1< zmQu8_P^V&wL5rj4GYp_naRuHzf0w^Wzh&S~@s9d719z@IBr#@P9aLGjr~hEU*ntKk zkk;TajpIfq4bnNTvQj-spDrZmr}-MK$~d4c12>5mz@e&kj^qnO4D7n2Hl&l%j=)zR2yOeBmfSJ^CJw}Z!)tC z*bx1zyoOHKMu^`wG?x}Abl6%J{W$t|oKRVD6xzsSIEs8SN#9gb^vP_RZdVhsleSTd z>_%J_1`gL>W#;H_LtoOPnQ3|4id1aV83~x)Su_os7ATCEFnm{s8|xd>6FX;-zwj9J z@mz|&DkbdO*;qy*gm8{a@pODVdyBUU9%K`9gicsjBw$doz-Zd%(8_dKaR4sQ5oLI7 z`*c1{pUv~s0<#Bgi9yTqUMx=ru;V}rVcwIfTrm1XZc3?fJzQz(y02I>|AmE|W1tc_?oUQIi_?Z0CKhG}U}$w4Dyc(@{x9yNegVS7>M zGE@`r_^OuWcV{c;D8B-_y_DgK0#I%+CO($axoA30$gu%~F}OCBV`&b=zElKlCE~bm zF9Uygg^jD5x>YhjU8wR8Dg2W0{qh|&8v>NXt3Z>@%q%U|Vtb+^z&uWT&Mj!|eRd>K zXX)WIR}dqH-vZF^%M#jTB~NcI;BD*(El`>lcpOXO4VeHaR=gGGvO+JN0mf!@32UdJ z9=hldSorJitWW|JsIv^zq4_a7$v~C3{;-(mZT+DZxw!)hdCyx}>0JI-$AEcU=_=z6 zCoPXeS2x%dS7jRXlRW=f3)5#R1^Oog^^yFdq=9l?kGoJw9ENTQK*y|TT?j2YiqRcl zY)D2B2Cehnz=ro-g=B*^kJRXNxj+Z!#%P>@s`B!Vipn)TE8jYfU|QmJW3{m({+Ml9 zfO$s40>vJCfE6kO#{;~+o=fHEAGcT2c$t6PWuUSFK-smEQ!OGD#Xv1EP!s&C_X+;%9sq@>2~--uYS-+5aU8bFG#y~T>Y%TK z_?Hb>KnxwR02JPUF7P|6j}{Ajh8p4%dR7j{PBl5^^uXvOHQm;+3rLub=4*dJcDn*h z8;8?4%}l*H{?+JX2I@bhA-cjq;hg3CtyqL5T?v}@Irad+eeh|U)(fMpa4XRjU>GYijoGYr&6r6L{Y&(&H+Ufr03sB9YU>Dx0HY|}iJ1@gIHPen{;X(lGz1keJk z%lClHJmb$X)co!mFr5H`!qSZ24$Y_nC_KVU*HiRCDbE#Er0cb`1xn;3TK6m!kXSR^ zR>~#{-wc#vFN9`wE8l9$1F9!4CEGP%%9fCLt1w>5(x!Y_)~G24>c0yN)Ix#2tvf*3 zUvD^io21_m-|OUb0-E+zPJj&$%N-1{8!#~1pGQyK^aL=S0AA3YWPongQZ&YY(sZ$! zrEi(W`ecAo2ZUxQZIWpUMo>Nw^k9U6(Zbg@0$lY3Fuz?)i}Pi?LC5>~V4!rMn)cfY zyVp8lwABp&LF-sKAE67ubj3L37}4k}jO&JV3l$}6is}$4S2i~7>U(@>e?Hnq!hB1! z4ed`%wuwW_xFN`UH$(UC8j*l?qGc>Igix{?v=%Tz)P=2V$hv1_U4ED?&4)_QDh$Rv z$>;#l8P&9Gn*=;&0`#OmjL)4K08K~gDSJHy%#(}`jvdt(&Lq&45Cg=x~l(u|%1rj2{()n`U;cGQh0${o!T5Jd3Di8kEY~CS83@=m3CrV*J1~~^pZ;C& z>=_OBt}TQDzSzYT_wd2A_+UDn&-1^mETfqqJ*sXn;CY_K*rDTIIy@@EcY_O~wSu;* zX(X+ESQ^UOzA3q$RH;;Khv9)ytJOSu*{t)X z)(ZEL7zkhh>X~Prq5IT&dF9F#x^?RoZQi`uliuRuBAq&Qiq4!lL(e_;91RT(N&kfl z7wGlZUzc5L$BrGeWy==f!}cq$yh1l_+z_BW#`k?CI%gdhfmWXl`zfo_+RN+PHC}5vN0k4$<}N*9QVv zYQu&Nf483dL}2P&ym(Qn1Bo6va)b^XI6$XQpQf3a8L2XW@zP5#(dyN!Y2CVYgi3q) z<(KJ!2Ogl6D_0VZKNAxZluoB<&z?O3&ef||Y5)HH1n@DnJ;#hbK^L6xOX(t5$h{z;qlP9i_Ev*GhGkN~M9US^n4u z2ADnypd!pYu4o4j9wb!Rv17*s6fFE$$IJup(W6IY>S3)qeE6_{g+3ftjEq0Ie%uda zN+KaF-uK*dkK}OYop;iM4?ZZM@unj@RL-VNn`mroOzyGBV^Cz?IxpSvs*((mL`}Xal z=bwLGrXf0Bc;N+Fvu2Ha-hKC7diB*;t^D4-du0PL>!I!F12K>a!@`YY!{p?oP2t+L zYlO2EjupBAEF4?`==$~RsaPyZ_syF(WtYw6a&m-t?X}mW$}qig05+S0w$%@MAQgtd z0fgSokRYaz|IrAtW*5bdXx1n5_=9`sq0cmcIEd*8e*>v7I6}ff4abYH1|a;+0JGfp xcz%1G-Vbb->@=|NtNf3EbvQCV0@fj5{|8;Db1U2fF$w?x002ovPDHLkV1kP6kE8$q diff --git a/iOS/TogetherStream/TogetherStream/Assets.xcassets/AppIcon.appiconset/76x76@2x.png b/iOS/TogetherStream/TogetherStream/Assets.xcassets/AppIcon.appiconset/76x76@2x.png deleted file mode 100644 index 45df96193bec7e1f3d6fd3674348367c785aaabf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10730 zcmV1^@s67{VYS00001b5ch_0Itp) z=>PyJq)9|URCodHeQAtkN0nyezExJ0%S(d?H(uzO#sl^U+t6;?(=F4YM~u+4#GjVB zB`hI}Q3C?a4-kLQAQ1Co==p`jFAxZcVUeKSwxN4yz}W4rjg4)LjTi7DmG?WrO z<0<{hVAP8?GFh(VR=K8RA)?EO$5U-~lqG?h4d|af9ZoxTAe+U328gChR#QCCp<8RO zKogsuyzqAFahx4@5-b5_Ndz$_vPLJCbO?(nS)8J9(s80X1J$O&?Ktwq&TwSezDF;B z3;szgUYxL((H+|vKL+U0k}bzZRNK*qQTCn^-MT2*l2%HjlFjUQK`*rdy2~Tm9zFS# zIYL13v;Yd+pOowS%W*Yz5y@_z)K`(S%)DR zUXqZ25*<7$u$9^<$YyP^7L<~fP?%PnCLQ^#?F}owZOy0iF+m2VP$#lp$F&1@{ zUDN!It|oxVmFz`RONvTHjprFKiDn&TLsVMX5@9-)2hF2HsYFi(ciu??m;_f#VgyHx?!{^nlynR|8xgD>Bb(SBJ6E8)5@TD;s%Dol>)uFPRR_Z6n%Xo}(j8v^`=AqSg-VD!)Bjh?9X~m>Es^hc=jJ zY=c&7KibS}sdhkbx?q&(jyTN$h6K@vgB15wB0-YGp!4k2Ej&vXQ<~1Q#|Gl6UEz?o-tOFFi zB%kO?R@`8oLuY=8F3S2yvZ)BROx^XOK$ST}yNEsUmy&iWp$Xn1%Tqi%4~ z-)<9{CBJ3NJ=JOG6t^8u-lHLw7WC8xWR-lPdpQv~IeIcXn8s72n}7}hXF4TWMeiuD zWOY7EQ=*pXcuuyn(bXtqzJXWpMbt9+(t6I&GaWI6rtpERkyj!+`ZQmIwGGAVFt1aP zG(~SrGTK(MT&1rjU_i!}ZUG7TS{q(x8(JwA>(7~9uK;E`HcN`-#d;~hd_{@@$eNB3 zmIYI-lcONFV|^eVFX|mS)I5-t{AGE3=>og-$#hIx$zMaybhOQ;^Vpsh*_177WSi^R z2v!ToB+vR!>igq9oC7ya(X08jhqg1BUGd0FH^l6 z|C(eoUW<-xl4l-l7(1DciPOpodnbdedf|{FNeQuFP*-xA77#fSM?C0dbntA6vO;d9 zBf@lq{WSv8{OEf4%egng+b0&o1cB_;_3`k_rP*-*@@zQ1J{HD_##aor$8FeHJf9(B z{8LTyY0cjb@=)rS6Vpg)qlImwI@HyXi!Zzov8Cd^0uwtbOPcDu5*(rK2uaTjHtM(kKHvD9U%1SM^Gu#RZ1E zppb5AGuD|7meff$jNN3bM2~i`(wn6b z3i3?_Hvw4m;|Aa_X5I*YGIb*SlGbN;F3pGMS0@?A7}YwJh$ILr9^hb={V0DNCt{p51?8~OpORn5SfQbKYpxWJ~J~%X#|4 z+mb^ykfFo7nOaoxYqo5o-N;(q7In1G8?$tB$=E`;cK`8k`1EAB>D0k+FO6yowEe+A zgCA7fIGJNEz5+m^C<7el9ymBBDsItXdB<*(yw)9-b6Sd2tDD+7OoEo9@t6Z`K@*Xx z%VG^SQDOo;TVQ88AZ)R~9-3aEMcVAxdN??~9?ltA2$xPS1dL?25YX~}bZsoSCzD~}q(L<;6 z#@Bd6!PJRS?QOIT@;?r|6uxxmx$swWN9n1-8t=JPQqfz)-4MIPl;St}E73(yY^S=M z7&{;Xd^@2efWcwcWx9G?dNpO{UZoGVJm$x$XPct88iDqQV@u)h z=3fc_=g_m^Z|07KLnA9;k$4%P5%SHd5RE)&p31Nhdz z6i;rdxmJqN&|$k|zeI0tc(B}!Z3+qui_qGgOQgH&03<_$M3NI}NI<=JoLN#r@%j3kSn9bO(wj1M(Oo zi!s_0`y7kSlhbA=dGKvJslQ-P_k&}9yGR=VBM&4<>x|H|00kUTug22>8(G-*5(YZ| zwGy8wi{b$2nL_GozT^y{>bHXm+XI4e9wdui}8 z?WLiS7gof}W0~q_Kfzbnpk%W}&ZtOY9??&Cq z!ViFDlAOV_$!?1P4ci$1W#(A;&(p{0?Tvlm76RI1w0XNuQR2>%fj~K|#l6LNYWBJf zV4LLY0HZ{3FcxT_6RmaMbd%7Mtfs@MEf%c7#%T0H44X9vy(Jpa@Tlp}X*9cf>Nq{` zoZ}Jgp_MthBOR@P=J~4Q5k6=rPQEP-lCAU4Mz{Z~4zLbB)q;#ktIt%tT*hfRTj2=Vb^EgeJSfky& zyg!^gJx0^Ax@$FYvZ5KiI>zqUkg1vN4bfK_U=%cO=9y^`!P}ub0S_!4oJpK!;T*E1 zWF|XEW^NU#n<}u0ja80eQx=+)U>oH>(6dfF?|gdoRl4guE8MYkAiREhoF7BsEnMVF za>&uCde#ERP85|#_TBVJ(kaHoh_#4UH3NX{f^neK=XDij1^y}Ry-!cW@`fQCT%sT$tj9~EL*lI7V)|x3203_TH zoI}9++qqYGM7weBrEvb}60hF?ME0nVYraU8_08l_sSotDyatPIxYHzfNQN_fyWVd> zwpYnS2jZR&o1#ZoN5j9HT;J4wm>XY9qC6egKeEPC=3h)53;#+t0zX_~y>G5T7h zb=WH_707yhSJ}}C58n3ZQQzec6fYsmXpVuw$Yf~f6Q|3 zfGo>>8;ANR(-B}iri(}!B zXYogG+glK`Y})=Qf$XY@;{i_ven=zQgRA>^otECTRe9xHIe7vd{bOgH?TE4+z@o!7 zkah4lfkot;WC%-+CEy8vD@WKy|6mlGq(?@_)<(lKiy>S*jaLx2zaU?-X^STV@0vIf z9;GSshf8M%JRMk|cQ__#w9`2%fo%JusXS;8u#(3F8W(sGOeK(I^b+tA9n!ri=p2k< z<9L)qzjg5lWhhtgj%}C3=kp2IL7O?oe%Y8f;^9xpI0jylH%u*CpKM7QV3I4u9Ee zT93U(BN_Ik&Kl20hb=VGGgZ8$fe*Gg{)DE_cTXPY2kkGePchJNv0$%>FW8tv-ME{3 zEzsxl?f^#4z~OB4i4LN}Y9ko}ZU7Ecp_dBDX7$KGf_n)tZUe57eY7}2Aj96+2?84a z5M*K-7yc<1<^(ywHpc;a8gLbX?COa(!VGP9ytFnMwT6-F8~cs0A>kX|A}q}uAO|Hr_sZwC&E$sWg(gXK{Q=R(D6Z=9T`B+ljtP0)RPpj%e9%e@eaL${of_Ya zPA8j|kK`i}_>2?UCPrwNo&K!tIIYPZI581^yHL%Sn@*N(un%?I2w^X63V%C5K>NFy z=Lvc$d$=RthO(uc)m+9<&=5#=6{#T`c51e^AsGxb`odoejWfsybaeg{0qp+cW8nn# z;%46GA7m)VBYpzmy2)eVJrl3fzS@?$c+0N$wsnkD1e_XJBA7C|08x$-imeNMKu22Z z^OQM8nZal_NeIK^q@#3~dC%+P;rB};Lk}`Z)t?f;q&JZJ;tV4SeK>9&U;u&#hDgi6 z1jjwPr!TUaS2Na!Oc;|gnqkBmCy>q12h-3mX(W5>Wc4mSWQMiiZ#v&he=LmGwX^i; zybi$m%>yhtmpLyE+aPRR0f)gS}VFq%!!@$plm1hi2G+^~WSxy06s>tDHtnIakv)#Gqmn{gkJZ#ogR$ip|~x`CtYl4KU<7!Auz0$p#n~IHA^eUO{+I4s=Rb)X zm?Q9mJ^&V;G(1Eq*-+w>76}wL0$D6xcV!o@&V843?Fdk_NV5+@kffy-h_aS(U zAF0V9Rfb+v8R!9hSAmS~Ea~C+Gc-;9(VX?Ue=Z5I@Hd$JBP;|gyal^T&m$&jUXq`d zs^_ut3Hq2OoBE&^-uDh*@TPF37Z%7XB8P*thL-sh0V#ny&<=K<;%ZU(V9@T78yK6p5OE&$dCpU@V7g}+9^58?eI0qZgR1rlWyBNoz`GHgIo z`N`jX@T}QnPXQ)FE?+Ua-3X?PZjzA14SiU_CH|t@(6M-H;dmeZegyV0GMyq|-LZHe z{Nt%Z;R*ck9p#k&w2cJph{b3V2jyt;Dr6k9e$k8`oc9!9MQ0HliXF9L(6s;+o%MDA z$^e9A8oGMrDyCj+F`S^ERR0-`ST~=leo>M3d3k#TEm>em+xE}aN_6BFJow(P(sO`e z9mY;uFqI;RV5+f8^qS!I6QqNBF*O2M7_snwFK=Hsz`qImJNzars$rovx+?Mj^ z(0S%T8r#_IGTprgSd#-3oO?$}I_WBN^@Zy)hlYr4i_Mk_SnK>>e1CR|eolaXZ1_3) z$6dG^#M>MgW_XRIK)@F=8gxM8`O&SsXQNwM-vB1-v6@33$Vv$+(Q8Jxmmu(;As}>% zF|6G%VjZUcYxytqTVg+=QR_toEKGyl+H3++;+d3{=tivTYTp2sJn0f7{R%Ys)29>o zJx}lOY8Z3hnwT*);h~`7-n*@0=tZ!z&I7 zMy{J`Ujf$Sa4pDEg4*_2H&ORk7Ovwpo_MwB7=+PBXB$<2AUt^*(}8s|m;~4fT4S zyPw{*-O_pA0fsBmD?YVa?3Z|+o$aKd1M$K3*M;=c16btSzdjORJ-sp+ZY5ydwlL3s zzgUe}q%EL|dCEXxF2szd0%tm8QM`N`J1pnXh*4^TbvE(Ue}I(&A-Z=JA%AMR?x%kZc)@i3h=?~q$;wkJQ{m>52f`f-`}j}&@uMraE0ox?iz((Ri@%URd*_&R zjC`Vd5jnCfX6T-3TU!4CMxK;{EYaIKznyY;k8hpkLrjlvr?)8ZxCWz_0PFGPsc;hk z>#oIp;ROACBAyZ2#d{50DxfSks>7L%I*OtvTiys}WVwnjDoL-Z_WXMw0Mm)E5oC$9 z%vgs^Old)4uw?d!zOZxuhcq=_FoSaEFx0a$By5OozcHe^xwJ7t1N+xi7p;Nl8>4o=YT zL(H%8;{8`k)8Qrp);&ve^riy=3sWIE&;ILJ#CtNrVG*y2G%`v6iFD{xIbm(8RNAq& z!HaZQ&2)@B--N}c<-oS6J(sNk$~4M1!}Tg|d&S@F1Mze>i?1{9Z3V`R4I3yWe#LG49tgmq zn;TbBqf0qcbaU$V)v(ntM?WjDJU$uz*K6m52bN~4m;4A+7_m??a8)G#y99y~Jz7Cd z5+FOsO2bLVllN$($U0j97up^Oz$D1xs6+v}qu7RGI@^vDbS4(>_>qw()@H)5*7k)b zPfYXc(fBQ~X>>)Wj_4R;J+cG}VHJR&^IFppT{o>yviS^y7rYI@qZW5fES#oL?@9$+!iZLTT~ zfaSLuW}8%09gL~)1Oe-QTD0FycZ9#EXNG8f91nrKk$`BPcTHD)V<&4@z4jD8v(rIV zsTEJzo&g!twqSek07H1>aF!ei*#sx#ejjNWMUQz-hd1ayp*_IB+817;w;cHA0^&I0 z`U}T4bHNlktk?#cp^pn>p_|;5NS`C?09N&m7AM#PNH<9)Sze&iv9=y7Mc39oq*AQdmAp5)|2fzFOZB9e|uR%p=ieCudS44C7#0j#tL zmRtN%ry2iSRk1mW-^w~nz`7H_q7OzdOpjCP4X%w8awiIq(1LUX(Kz{1m)3=@W$9dE zalrul+Ky^3>)=RdTTz}p6?vk0@~{oM6z?yMBgc3&H1(gjGac3 zC=nZ7yWt%IO7v3H8{+O6-p|4tq%W?H)9W&`w9c9duhS3v;twh8h-D3=wqvJe{OET^ z+e9UcQS_s2mnSk^9#bsF@1{0N13*#2pMK4R zU(n|`E#$EU!N5|WNl7mGksR7MVI4<4+1e20vtnl%xm0y*C!RftvZb~m-jP>o&!IQj zvaX@N{Q&d4GBmt~41lC7(eR}zz)Z({_deU~tF{J_a{I{D%lMzgUroSnq#ru5(s$UWK@c$J7EPPP#osxpiib>Tp7Hs>aItwaIi7#H=#)dSV z`6@&@7DuWM0LkomZ5mpN#n8o-lrtf~H+9~0I&#rl-zxT-bly@0n$#|d&6v9d(tDjan2+N4gwNM?&igA62V(vH5i zm&rp`$!9#RBn-ZDvO37Dr7|wK5qutVx{L&R( z0-0)Vf9W*BI@)>%$_Ne$C2bP|CLU_n=>YZ*CrY$sc4 zs!VN|7=Vt6!>$C3H4?OhzDHXYfa2AG=!3eKhL>~uO;3Ce7> zpr_j(yg#bSF>43ovpX(}Wv* z3@qb;R-lVq1{#s4qzGSkDroXyyV17foplTiJkagkV`fJT#3RQ@b~4|5E$DoFp{CliVIlPmbQ^p z<-{C4-#}|>116Az9WjD6bruJLFI{4XxE&VdGM?=~Z7ZIqWID3mV!R}u+O>92myc;5 zI!RA>O4j2EjgO|Shdu*SR~SR1i;|1B#fPpUmi{KYv*1fl#nEh zNsv|Y+?J{6vXPIBr)-0c!fiNo@Wv-5CvogtV4w%3 zm6cLkHo4lL4m>T2^Q@DYkW*4k0U*)DnBj4v9a|Nt(v}OlbQ7RurI~c}VvIg?@=e>2 z^Grv@0)B~?=te%%QM~cDUU(sRy(uMNDC?~NrsTJL>iMJ+!1g^E({KWhp|`F|n_gSO zYi(@j2#$~9KV0sWy$tjz1AFM|Q)2hbRvFj>*d7x4nt?rl^)c}@OiYBaG5n@sxvZ|P zGPovNY%;IY|Lj{@S_;d{%K^4!TW4x&st5?k+X8Sk`39fX*6^=QcURd}00Rg<{NWFW z>#n=5v6pVT>89}5V~>T;eC9Kaa$o{rufF;q#yWd^q>qb6uTped}A{=9_O$Ia z>#XqRH@~^DEB5c-&mH-uH@&G*PMGJPe|~u9JKq`J``-74&wlo^;pLZK<~B+IyZ-v? z!%u$l6HyNso!<7gw}s0tyDZV{$-aI2T2I+lcbMyE#wV?zB=4;%PnjJpgixq^E8{!pL*)4@aa!~nlA$QC2O{t z;0`A2DuAIMu+Rs1a3`s!F`O?fEHED<9X_bzj!)mcK@Q*o51sDa5rPL9w1f7%@~(Hi zD_nBPC44ghuz3agr%s(pqwH?nrr33BFaeL(S(Ybt-T43*Km%am1CZ&0DedW}pXMzG zPhVs)8eM+*;XB{?4lmqm0uBKq7q&QLbi!zen~qK! z!H%gNOWJi)WWRa>>!pVuewf#00vN9?OrNqY!{+J*7hI6U?!W*3aQyi3R6i3=_5kMe zGS*=L6h1gd!Kj0~(D%Rp{Ru#hYIx+4M*{8+ZNZ)EPk;K;w4k^A-CEz9B2CX?ef5Pe ze1Y#00g89L;~n9XpZp|C0c0Qg(1*g^ci$bbZ{-!xfBy5Ihf6QLG-CsFzxmB?c$*_* z?DERq2xdAM>!c^2d@?-o#1rB1#~%;RKmU9tfyYZ1Uwm=4wV?&@K>Ln6?qGmw`faz} z)^U2(^1J1H*8xmVZ?=>4w5R1{8iYL7S6GP4$6IgVMgVu1dJ2`cFv>mq?6bUH6B_o- z?!5C(cl6ReiTrLl?y4ygK*6IMj3U@>kjF&mFr4F&4;J9~VEV&b5!ma}TMm%JqaE4F z2bgTZGr24J` z7^b%yZn%LT`=F!nOi&7@wy%8UD_s5F_r4c?{p(+c&wcK5yokr$o|JRWIVa!|6AAze z5a@#EnJ>QhV))XRzQm7zG&n^L0Kf0P`}o->o`>Fk`|Uj1315zQ!{V!7{VG?#{`Iei z?|=XM8Q4W`Cm-|d?c_+vcNxLFQ3oTF(5I)T`K}Nnm@Sa==pqLY0Av^q@l4VyumPES z@4c7bqPXXtd)&Pn?tj)6`j56XB&nfTgJb5Exak zb@AYX5AyyN+Q1qMVAE5u*ug#+Kn}S_AAOYH;=nmdy}m2prZkRn*(o31DIqK10Q#ZprN1+J+D~% zp3F|9?Wz$B9e~c24(`+;rRl1Z9{Aqk-s)l05^#anG(}q7-BRyvA+lSd-iu>k8Q25Z zz*2o?Hnaz@Gqc|Z7WE#$2A1kGv!OkJotgbUu&DO{Hn3EmnGNj$?9A-PyQG)Y83RCodHeff_iSC!_i+%s$U3Ihf&;2vXWXxzv&3^35fjS)f&q8mmUGzgg= zMo6RK7X}3X0Mj$l00IO;j6k3n1cC;_Cg6ZhPA z?u~Qey_d_&_cHUA-isS&Kj(gNBjQHns~s1dciyRhwqr-w!5#HQG-<6KQ9wUMYLQ>^ z^gfL9zOn_IiKgrb-O~YI+K$2==%6KC5mZ}Kr&3f>)FnGRD6Uh{ht8)Gul#UdG$Cu` zB5bLZ=%hHKk0cj6R;;Y+$d~$?VSj{^poGf-(8a7JssXXN7L=+SHbK-lDMi1R~X%cf{qp+%1P zpl6y&N5sJ{AsxUYlW5!D~FD;AQPHU&@xqu}#m8M~AY< z^XO0!r+N!{OQ(sh^lLRyJouB3IpbP>q3_X^?akD!z=^ygKxzYpf)FniQ?gfus_7J9 ztMQ|aL|3+wd2|Xp8PCwERBTuvzvNF0(N<`(Rjkyl@tn9cc%UPC-dVtoG`e;2^K7MH zH&G{nQwnPq%qf(vgA4@I4Ec<&6g@gbng+tt^XQUajc>%7!c!p3^a>sD65rr)O$$2b z$6rY^xoy{Js!KcFLE^W-8KX8!r3R^^xlXX+8L=`HKRXEv-cT#1kK7%?kO=wwr?!$;Seu!XV?KC`~*Tmns!{Ag4i+ zf;Y$}7CMG4#F51!3UTZ5$(E_7e55$VrpHrs5iPe~91=tFW!TDYepJmwH{+L%2Yi1> zlFafjio|?H_X-ZVRBY@h9p1&4(NY|cFLWTD_?E6A&ti&R(^ovhq)S3>HCs^{^o-~E zDCq5UHZuU-LK9=i0)i+=vAyCoflzF?+hTwqm-(?24IN7?qmd5mX0b*A$*+{hz8Q;W z3vqd|DSBqJ(8+jNKyjy#w?sA@jZf=lVPa9OL2Wk>HG67+P{715=pFNnQCQR2CB~KF zEc|(N5zF}MR4n|oEqIw;5>lN)UU4>MH^1gIQbfUO07a2#0L@}zU`x=cqSkB~KAEI+ zM1*xq+mYF5*Nc^OT|LqP&&*K*(pw{5&6a*Ud+qpQr`)boue8%o`w5(8auEpNW&B8Y z2iD3^*#bM+13mJznl%$4>v7Th2qkT;yK!7j327 z4ckpTLwsOJ6*#FtUQr|yiw`i=3WK7@fla((0ASOyC%&NP@smvv?r`hr$vXw6881H) zhP}+Dkt5q|qJt+O)d7HR={3;3dTFzR*3V|ntk{xCEQrbT3M;y_&Gb~kGrE$OF8C~? zbTm);*e=s&@zjp6M37$g495dT>q*~KQGPQ%=vLk^)}*6&EDG^LN9fpg+xV?T^bE9o*E7# zH1tC{C@-c+Zx@TW<*l++(`({oMv9shJhrQBft`F6bWu%wAq@Do1%@Y}hmaO>=@aCmtn3==?y zIXbfK`Hp$u6tD5j(L|jr2QWNatdxJ%baQsi7UaDqJU(!XIztCDsQF^GXRwdyJI+7% zT*^K#U z5lHVKklsQdJxH^ufV64gTwVvcbBHm9GS-wI3uSw)gQ3W;$zI|aI+csu2WW%XMlh&4 z74Da_f)s)1-t2;b60o;NZd{+edY83Lwmxccbp z>ffRhIpUjbDm$X6$3bX=x*d^ZB>{7QPz1E1P!+NIjuO1XHkFR>GP+XcLSx@3HlL=H zEV@giaKY$Y7^N97Esl}O4xV9?uEd)NsuSZ%aSBV( zK}wN$wuElg(crPaf(}|!B(V6hz!UWBvyTXHulVO2) z4AST$i@^5Oy=YyyrqHTYQV1%XS?o9v`Un=4#=(n6yy+_%XyTRb~~6E{hpXHIXZK{rqD zMv=H4k?z@RSF=nHAoTpSGt?!2k>)!*S^77_^Wh(+o)73Fz*X)4?}yC-1XG=a1! zzc#UQEh(-9rb0f;y@#L#Zl0AhpG=s`;LeB4Tm@BFBUsi2Y>fP+>Pm}gER zyEAT-&+I8%(Q50|2%gemm-t$T2H$uDx=v6HIor$I$L#L6~&c1kNj_j)og%_Jp6)OnP8xg5|K*nwkJ7&XgI1RUXht zJVj4-oKB{vWSB0#6&+oPF8M3?{k)sNDT$a#c)*N>^@?WNRD;o^*Q=r-286UkUlRnh z-NW=kN#PuiN@oeAyXmRZ2kBIQ+2k?4ak^%DUwDX?p-{67q)|W1&!}PItD0o4yQC+3 znGp$wxJC??Xur@haAK6K>qQjbOuWNnlP=^@aMcnIG&L9^WnVK1R~cGG7j7|g;&eVt zc1m!HY0v>uJau{x0rVXcC&KM>JHyYW_tV1u6xVJH+EyNl274>XAe%Tmdj(x$XMe=A z>nT$GwaviEAhePL4Xp&D$jY{o$^oc!V1Po!#VrDdJOiyXAER$M3HsjZHUfojom9P{>w%P{z+54HKhgljelP?O+J|Uz)j@^z>#DdLVaEE0i zJRO>_|4`aBfVcrtWN|40^smQW4ENCt3XuMGeitw3r)4OyQsl>E(25310w8z=fD7?_ zx5lO$+*1D_yQF=yy~nwi>^@nrRv7d-dwZhS=JmtqD#Upjz=L zVe6VyUt`tsh(&_Un!TDZ5xk;Wva6&aCb+|Agl0{wt9jR(ow^c`UPNo9uc6N)ixc76 znSFEvwI>{=cdHu8B4X*Piw|CncN;RwRdABwuSN z5;c<-g)?51kF3r%E79q|GU95=w*wP35j+|NP|qKp4gYob!SFx#9SDCvbvW#ybyPgR z#|@a-yc|LIc!nW1@5rxpu7>+HA=%(0({hB>yf_Kh(ZCfqtPpOJs1Ah{sZBoI}e4^X+eK>x%#8LCd*B^SFtx~+q@>5w#LR# z&C@!EqOMJlObIMWu%t^GnGV24_A(j-l@Hj-_)&+&@TD5$*0RAj7Ted_u8y%<&=27Z z0_8_{J{PW-JQ99AyEpt|c3*gs-ipHYF8(Nwo623=(Df2}s+*?+!GZ^!L1;cWDIvL= z?lzGOWKdQh%xo1!125@9C-M`G1!#|ev{nt4@WC^6TyL(OWjjK7>V(rfPV<*f&{HS6 z9=&FEe>gzbr&xX(MG!`9EE;OVbi*Cc}@ zJ135X-$al;Oi!Kg8*5lAMQfKk*HhJsmExDjOG|WGxX=2{;G|$V2`6#0Xc4&PY^i`~ z0aR*Z+C?n%$@D~Fgb-%aCx9$=XFQNM*E5burqd@oZNZ5+n*eI%p$B(WU~&p;`CJW6Kzd|x zD4agBv>H<@)eXRdTSE_$JVe>tLndO&7lK!QZma&^h+Gg`x1uG5mVS#x~?H z3;Gw2PKVdh2iKywar({t-f#j>ov2Fk{2n=24fIsY0RyPJ&Z!f%fXRF$OU*1yGk8dlNwrvA_7FP;cxVURfYA2f!Z2NXIyrS|d#%J}LH~l`neg9sJstkX zp2x!b$DijHqw$s$u3OQ#BC3vw#$5GP$e81bzj5jYVX0BXV^(leeUAGbB0@XM^b zrI-3E+~-p}>5fnbFM&KhmwsJog%;OGty<6@3g^%tHF#IFUq#vC;7|x=7+*E<@wso$f>vsi=j;}e{ zHWDk2I_(o+s+FaU4)jeu%NB%V%YZAy6>d3Z`ofV)e=8l9X*ucXdHNYeqMg$R*PmWm zvY>w&J$3qzQ_qFJqot@D=k|twp4%V(v^2?g{D3Hf;eY_{<=tl>Cj#;#c=PA=l8qmsnZ80 z4~M@UKT0=Ed&0GIr-w%fq{vOyO5O28!0TAwmDHnaa3WDouuKHNB$~OjRLV-Epres) zRy0LV{wm3;fNS{pQp~~+nw;KIm{TF6qFNtILvG!?rHtN=l=xSQ!k`xz}N z;MUBuQQGWgUk(HSbQA{w&hwPlQ}aV%nnwP@$)zwxw0@pNkuPdiE$GvqklmU~9FI1kd$` zScV9MBlI{Ef$gAE{0nrGboYxx1klBB+9>^nCI!W{sH^u41@Qr-$OliHE};ee`)CHm zOnT44?l4D3AD%jakJfMbbPdib4P-*8l(T1KO0r2-I;7*B_D#C7kHWcj#r_&@;fqi4 zj7~grUk>v$d)|9;G@LWO6kbWEc`V%b`z(r*pmwsLk0(yAr_UehZ=J54KRw*Ou!o;I zrAMQz;EyfXy=p55rx&4`@jMZaUIXANY>ocbymwkIsM-LCn3u_*$SN z4mWz|(^IGazVkqM+t^Wlrk|phi6Ies-&qwn-KRzhP-RNyOC$~QrT#|jBRmEvRf`wu zX%@wMpE&J5Lg2jf#0Y`4dOp7q@vX)uK#JV{^W-!1mi~PH!u19NbXDLqfhLtgVn%Yc znGy0LtK=cavWh0ABd4|7gB}JD>)CuAN;@Oe!PBG(`W#u@5pFv^5}ur;A6g(DWCy8X zG5>4==B1;@Xf|#A&m`VGMXz#O6*w_-S^(rzH%&JQV3Li<)0TlJblJuk6g&ol&=o*U zJ(26dmgAx?fE1^BfD`~lT)%s9INV2f^jL3%+#of?{}*%}D(fKF=keXZBvu8^#<&%r zJh>Xslnxh1D=MBQZ$zH~N{(?Xp@0DC7=aXPppVTAg*%Q9(e+ye;EjlHB|h<#34hn5 z=FQ5?2G)H|!0BFluB1w;82vo^2tYA|VoemM^O1NhdXN_FZ#z01X6ZT<{6T1#G4X#o z0i?R|1cEV9yZae}2#OxEO;vVFdf;RFcrqR1!#6sP&;={oe*W5c{Q znh$q>CIcWmMt}Wjt=n$Y7_A*RJ25h1Fs+5& zNvHUJZ;0>&{r3I8(t^DC78CI|qTFj&IlAtW3+OVD?APUFq;SE8CV;E-50$Ipfrn8G{bQQePVVfJUorRQR<5jYe67ZyeRVH*)!-hyNT8hJCu@Yd`s4P z?XMj;2~4uIRE`6{S^_qK5=ocY31DfP@jy?!QmH@okqu7qm_e~7ieIn0pYGz1FZS0R zJO+M(K#5oFzCC?*_~GoCjc+Vrf|2pikG$187IT{Q9txN2S*9PB-PqUwO8nB@5&FfuYw3^W@TbR5E>C1HfbaxR zjtTag#%dkXT2pXxd`JMTOb#?JIgbt^1 z2TMeFx#Q6CX!!NaY4jUS`@_@tjV3}XznK)r3#CQuwMIEGuiLSz8S0#{_TX&rZN7OF zj!PC6^9PJ5+w0Vfivfh@*?Q-3GLVDSQ&O?KO-x-k-{17Fxv=g|BP zdetrs^STBkpnQh@kNKa|kJtVSf%4F)QJN*IN3Jpk);Mv5&N%V-A#&@?xW*Z+3pgcl z6Nsxws#VC|4Df1eE%D+i9AG(4YoF`=V+{hzr|AEb$2H}3^fQak)2V!%X30rDN`NbM zUto-f#O>x!I=z@E)&-pD#;8mjGajWgP)~`?o0GRf2|vS z+jE#s-%l)#(~p4d{X%~L$ z^BCQURPKO>9lKz(bcoYwVlB(`RfPHE(2k401%B5Z!AnDwWYu1t@Vc& zCK#0XueeW~0x0S9O)o?9;jk6}Qj>-*xOvH@1=gUy?%-@nq6vWR5xWLSZjG>ZU4mo2nlyxtZPVClxs~?U z9h`1pMUgT&;^DN9W)*r>qnkPE-3|sBr&>HYLciOFwMbkN{GLGhPbc?>JLrFmo5Rl` z5+EnYrrd;@^=jj+9Y7n^o5rzGu|2al;EZ77i|^u8lM16_6`3;ea$oE8aUVG@Q|!Cx zkKq8$Zk`eWl=uU>yXU6DKhaG2Tl&8?7cf&YD2btF$_$vOVNoxswKwC{?gJ=p*n}Qh zX1^ja&!R{6sy00VrzD3$W-S&^ik5hwqmjJLE9_L#efiC)P!h=F4ElTbm|0`2$PTA( z{2!Wk0F*RS0-Q_qG6}$n|J_)FQtB$UxjF?fwL^;!-KINt*7t0BbnSEn{hojmak+46 zO00>uf@FKGB4ELP{EAoT&K#?LjKPZoH3InXGRAGQI|-Eg!oBkmlr&S~nw768)okh6 zVtP~k%88=UP#nK5b=sJ0%kCLCy;BJybb;#>1A{ID-!{Vy7C@Z%Z)9FUKL)mw){v~f zaTid|5Ga2=vn%|JKzaYdB;{EB=?B&@<(g8@lBsS0AzG{#_A;KTW0b6BNkwOU`7%Il zo$?_LKbb$Vu?E|offKQM0QKmSUzvP$vKMauZZXDqvm7s7TrgQbrDI^RNdDsTP`I8z z`O}ko!$Sm0fDALJV5bD8WL(yzyvAfX7%{-cJcC}d8J(q5KK3Or>Oy|KT2H~LlPVMP zic-p9UkZ|D2TN#!X^0V@1p)wO%`@nfF0&?D>&L5C{`U3UF(RhvsKo8Kr3KsGwmiAE!%0ox8O96R1P#A-L+Fkl(&lCX@VOe zCxeW;a;!bRW>@w5o)suh(G#4Za1G6pIDJ1(Pj+xE2~cvLREuu%g=_*MlC^4F04mup z=u#`TSMVe!YsE$MOy7yweW$nJ^x~6(%2vw}O+cFsf|lv4el_%%B{7@)<({Rmo31s7 zX_XQ$`2O@Ht||A@Gw{}HYjWC_ZAvHBBLO2ZTAikvBt6(ci-1cy1-%lg4wA;1(9lbO z7b9!1?KwD+G>TM9Cel;kbaKQKfNF9-_7Oj>GcjwvX6ItKfPRhc*~Jk$eeVrdpWGAh zwh(?Pgx?U-b)deNdsDs48pK+Hm(^L(Ghd1hoy05X!oxPR8+Dj&=zzYG)^l)jkX{0j zo{FP0B3{1(6mcU3-1=OEU!bE$LjUL3-tcp}u6%|-iI+6w5n~N-UQJ>RU>hw1g{Ko| z$V$Wi&g$&h^3_dFX491DoVYRIY>Lk-Qila^GQHkB+?C^XxN-X1hnwjag#Y>2Zh8ZK zgl>MSx6b9XE!$c=UhXwPMX+>0L$hY%Lf!*Yq8IX&VKuu7VI8*p2Tm`^Sfp5XPijNx zc)@pwX2s{|Pa%Fsp!~zkR5-LW%zp||JAETUXTX^iGq7gJj27iw9mQX1Hv=e)loJH< zu;>+a)!!QiPPz8v+{!d4Y4a2=gW4wu1t{^X{2+ny_W51mKKixblk_qM7R~WQNLmRh zc%yI5*L4eCQ#l=udMx^KsimnGlb{iSUfLVEe8P_1Qk#jn4l5gJUE%9o)$rtnzpa| z6_Y612P@>XbbvSqM$IPKfDY)~O8Z0vFdOgqqiWM;W5G$qaF4E7s8l$~0`%%n#)Q(d zEoMZtC+UyIenW2u;q^8A_>~7r7N$X}<-m+;fMYk`7=sM~J>%vI3MeHb+7cjHv1B|4 zpe4XXhXDwmM$GQmmN7c}8w*Yfs_E!L0jy$jE>ayQv9%-vlz5l&0Dq0gR;H;6KT9(5d;1I^Os+fwlv8EVAL?L=@d7-f42H zl>_jW=w*zD7skWQ^p?;A1j+@PwE>0#Ti;5)7Kdk}ThJ;W zEyq>Q8$XX;>U;Zr0Zv?FSp$JV1-({qhO?K_>gfW?KhBSb8)kNf2MLsTw-WSG%%R4B zuV^4BKkwSo%_7#s^cU?xH>+9H0Udg1%vW^KlFfpi@_$zZD^ai>^Xtd4qp0Zuux%0c4fs7S(>jAYPce>Ge90Pq0H zd*&v>^#saC7OMYzuR488iCbQHw(|zh0H!_r17{6)w8WDoqLyds!EbD}L5FWuFP4NI zQJ`&0I})KIUD_s_iY|O_+p>^Lh%e@Q^~zPUy}kgafYJqFOw21nmQja0umw=!t@Ar) zD^Na4pu`CeGic*GqXLkk;5-;aEAs$gtU>3?7V?;QI`*g|r%NyQOc(J)dt%Ca4^#MJ zztq!o&9i`3c_k?;cP1M(fzdXtFTjZy1)y!>T{T-kIZdyvRiK;-e_~M5X`L6&Q>iOo z81P~iNkA#+DL6x?k=G=j6pKy=Iw?+3^>n(RqdGOa(LU2XTM|PT+r9xOVr~TJDw9Ux zFjJl+P~JK-8E%}O3QsJI@`@>D%Br=>o(+QM+o5N=(K0qncL3d(yRwmW9se@xd2ysz zGGncsOs|cPmR8J96I6dC`Slezk&BxI4XQ5MaRON<4N?Fl6o|5q?1f^sE&F zq5a8#LteBRXNtm>_;K@tUDByt60pODyL!h@@<*N4A;(VAnZV1BU246;N2Uj1)tFbv z3){_41d46nfwPFOwHp&g@_2ms@Z2ch#IywRo`CWw{U4RL(Tf;25-{;zC7y-1K$+hx zWERLD->?vo2e+8LX(%o==B%9?%(!B53;8a{ieF&PFZ6%~UJTcRaGi`NcptSh#R0mK2|<&o~9l^%Qc zbUZrZRyHIJ-bQ)`OeLT)RaB#k919$K_4s&;naPCt}iiDW>=-&K&hf^& zUF9Ruq@(NzDFNBwL56b_VP~72`5c)IBfAMW2_sPGv@P^HWaP!#7)wJQW{8kqiB4gR zW9rgQ0$X9r+il9biKp%LH8^#k9rtNQz(u!N0HW(6monfbnllq7elfVoZb3)fNvBML zd@#?@N%jmK0MxWe^jhwc2YAtzY}!TZ+a?TF>G+I(&*V`2i295QU4rI}q@@4_i;hpM>{TXzTPcbST-5rRT zGYz7S9DP;Tj1>!_2P5%Io>9C^ui!WFN*`&TI-EmcEAc^Z;w3@V@#K|A)>ZNem=I8O z<{=#&<1c2t*6ZHk-|@4$ew=@jms_G8jDz&OPy!I9}H9gi-x z=B<(!I`q6)Gn=9yTf-K!2C6nqq-o?ci3rUbh79z=4w!Gmbt8ojTMROmL=5iw-58oxT+tgO>`b=+bTC zi41Q&5E=zfHVYltX%|oCv)vBa=hI??T#7|xjF^O_w>3S*WFG7ow)kK%=ur30ex# zku>dOg+cL}TJ(|WKwkNV1^HN}(#?U=$>bcm7nz=2GCQGlKTC0euv-RvaAl4F!=fGhN85*(D8>vX#k;5o@b#3A;%b@h5+x z5Vt1JuwSULy{s-#2Y&E(SsnT7z)$AakT>I3N+ajI;uUJQxtk^Ai6V#&8cTH}TiCP; z=y@(>Jvnh9@}8XVMILe`O?Vw|)v2;$ohWGf*7l^%n%1oo%hy`jbL@;vPED;a%x$&p z3aoDhM*8IxyuN8}TOY&<4E7DtAXa=k=8h|{4bF~BwJq4|3T%V3*A?IP*Kq~5!P#-C zwgr1#fo*X1y5igZI-SgB;0@h{o$5dZV87D9b$mK`qi%vpZLTl zO7XP+_~Va_M7Zv{>-hBg&_fS}lP6DxZ++`q%*VCg``-7yB>VK!PlsRp;uj1M0BZN{ z-3&$z{@1)Z@BBOyTZ)OOqiUU%)oizz=80MZ+wHVHF1*xpndz>-{w;; zt_?LfaU=50Z+??!Je-DcEepN|=dNA5!t>8R&vLV~v*F4suQb6qMQ?+>`OR+*Kls59 zc&2^pTi@#5g}V9)HCCA&pj8e zy6UQQqtnhbW<*>AwK8gqih*8*a$-Bo(ZqVoi3X4*|r^X4!6Eb9OP3cozP> z?|m;@=lsxzK9qs!o$q{SxaOK`T&n=*Bab{1{_uxCgxA0R^_kqwH{Z-lQCn%bC@Vm* zvwd1G3evRO$vWrRXP+Igz}|Ff$20X`{pwelE8GZSMs0V^nkjAaoh<=QS(C)NB>KAH z`VMq_01$vm_RAMIv@B#wKJ4<(6e=5X_pN>6w2jyEjvqgs$PYgFV8G*33!DJ6#MA`( zWNedkHvMTGV8kiGGFka8Q{r21WT~iQolLP=-4R0&$-@l)I-FfGo z;lzm(?xRjie^61>(PdMD#0 zr*!~&CGF8i9}QPueYJUNF6{w`SQmZv*=NJuci+u3cDtuUIHhl&*2_u`_J^TQwhupH~! zKICwU{r>mAU%Qqpg#i?_W5)sY{7ytlzQ0E4tuL)-@ERvq~P$a@={129NiHN Date: Thu, 9 Mar 2017 16:21:30 -0600 Subject: [PATCH 09/43] added contributing and templates. closes #467 --- .github/CONTRIBUTING.md | 30 ++++++++++++++++++++++++++++++ .github/ISSUE_TEMPLATE.md | 7 +++++++ .github/PULL_REQUEST_TEMPLATE.md | 6 ++++++ 3 files changed, 43 insertions(+) create mode 100755 .github/CONTRIBUTING.md create mode 100755 .github/ISSUE_TEMPLATE.md create mode 100755 .github/PULL_REQUEST_TEMPLATE.md diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md new file mode 100755 index 0000000..faf4873 --- /dev/null +++ b/.github/CONTRIBUTING.md @@ -0,0 +1,30 @@ +## Coding guidelines + +Contributions to TogetherStream should use the good coding style. Please refer to the [Swift API coding guidelines](https://swift.org/documentation/api-design-guidelines/) and best practices for other languages. + +## Documentation + +All code changes should include comments describing the design, assumptions, dependencies, and non-obvious aspects of the implementation. +Hopefully the existing code provides a good example of appropriate code comments. +If necessary, make the appropriate updates in the README.md and other documentation files. + +## Contributing your changes + +1. If one does not exist already, open an issue that your contribution is going to resolve or fix. + 1. Make sure to give the issue a clear title and a very focused description. +2. Make a branch from the develop branch using the following naming convention: + 1. `YOUR_INITIALS/ISSUE#-DESCRIPTIVE-NAME` + 2. For example, `kb/94-create-contributingmd` was the branch that had the commit containing this + tutorial. +3. Commit your changes! +4. When you have completed making all your changes, create a Pull Request (PR) from your git manager +or our Github repo from your branch to master. +5. Fill in the template for the PR. +6. Contributions require sign-off. We require that any contributers agree to the [Developer's Certificate of Origin 1.1 (DCO)](http://elinux.org/Developer_Certificate_Of_Origin), otherwise your pull request will be rejected. + 1. When committing using the command line you can sign off using the --signoff or -s flag. This adds a Signed-off-by line by the committer at the end of the commit log message.`git commit -s -m "Commit message"` +7. That's it, thanks for the contribution! + +## Setting up your environment + +Please refer to the [README](README.md) for setup instructions + diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md new file mode 100755 index 0000000..6566a73 --- /dev/null +++ b/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,7 @@ +Version: +Steps to Reproduce: +* +* +* +Expected Behavior: +Actual Behavior: diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100755 index 0000000..b55e32e --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,6 @@ +Resolves #{Issue Number} +Proposed Changes: +* {Detailed list of changes} +* +* +DCO1.1 Signed-off-by: {name} <{email, do not delete <>}> From e9babc43f27b16c99c9608a56093b560477486c1 Mon Sep 17 00:00:00 2001 From: Daniel Firsht Date: Thu, 9 Mar 2017 16:24:27 -0600 Subject: [PATCH 10/43] updated issue template --- .github/ISSUE_TEMPLATE.md | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index 6566a73..6ddf29d 100755 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -3,5 +3,6 @@ Steps to Reproduce: * * * + Expected Behavior: Actual Behavior: From dbbdb83f904dc2e1405b029ed03d60d87101ba6f Mon Sep 17 00:00:00 2001 From: Daniel Firsht Date: Thu, 9 Mar 2017 16:40:43 -0600 Subject: [PATCH 11/43] modified email invite message and added credential template (#491) --- backend/config/appVars.js | 5 +++-- backend/config/private/credentials.js | 12 +++++++----- backend/invites/invites.service.js | 10 +++++----- 3 files changed, 15 insertions(+), 12 deletions(-) diff --git a/backend/config/appVars.js b/backend/config/appVars.js index 70ac9eb..8171d03 100644 --- a/backend/config/appVars.js +++ b/backend/config/appVars.js @@ -63,9 +63,10 @@ var appVars = { key: __dirname + '/private/key.pem' }), mail: { - server: credentials.email.server, + userName: credentials.email.displayUserName, + domainName: credentials.email.displayDomainName, transporter: nodemailer.createTransport('smtps://' + credentials.email.userName + ':' + - credentials.email.password + '@' + credentials.email.server) + credentials.email.password + '@' + credentials.email.domainName) } }; diff --git a/backend/config/private/credentials.js b/backend/config/private/credentials.js index 3850e7a..11f8750 100644 --- a/backend/config/private/credentials.js +++ b/backend/config/private/credentials.js @@ -3,15 +3,17 @@ module.exports = { appID: 'YOUR_FB_APP_ID', secret: 'YOUR_FB_APP_SECRET' }, - google: { - clientID: 'YOUR_GOOGLE_CLIENT_ID', - clientSecret: 'YOUR_GOOGLE_CLIENT_SECRET', - apiKey: 'YOUR_GOOGLE_API_KEY' - }, app: { accessTokenKey: Buffer.from('YOUR_ACCESS_TOKEN_KEY'), refreshTokenKey: Buffer.from('YOUR_REFRESH_TOKEN_KEY'), postgresServiceName: 'compose-for-postgresql' }, + email: { + userName: 'YOUR_EMAIL_USER_NAME', + domainName: 'YOUR_EMAIL_DOMAIN_NAME', + displayUserName: 'YOUR_EMAIL_USER_NAME', + displayDomainName: 'YOUR_EMAIL_DOMAIN_NAME', + password: 'YOUR_EMAIL_PASSWORD' + }, sessionSecret: "YOUR_SESSION_SECRET" }; diff --git a/backend/invites/invites.service.js b/backend/invites/invites.service.js index 0a8d949..a6b1ef6 100644 --- a/backend/invites/invites.service.js +++ b/backend/invites/invites.service.js @@ -92,12 +92,12 @@ var sendEmail = function (participant, req) { var streamId = req.body['streamPath'].split('.').pop(); var jsonBody = JSON.parse(body); var mailOptions = { - from: '"Together Stream" ', // sender address - to: jsonBody.email, // list of receivers + from: '"Together Stream" <' + appVars.mail.userName + '@' + appVars.mail.domainName + '>', // sender address + to: jsonBody.email, subject: 'New Stream Invite from ' + req.body['host'], // Subject line - text: req.body['host'] + ' has invited you to join their stream on Together Stream –' + - ' a collaborative and synchronized streaming experience. Enter code: ' + streamId + - '. http://togetherstream.csync.io/app?stream_id=' + streamId + text: 'Howdy!\n\n' + req.body['host'] + ' is streaming videos on Together Stream (like right now). ' + + 'Come watch together in real time! \uD83D\uDC6F \n\n' + 'Download the iOS app or use this code to join on web: ' + + + streamId + '\n\nhttp://togetherstream.csync.io/app?stream_id=' + streamId }; appVars.mail.transporter.sendMail(mailOptions, function(error, info){ if(error){ From 2b89a304af3d9f6799bdd9d889abf87dd130641d Mon Sep 17 00:00:00 2001 From: Daniel Firsht Date: Mon, 13 Mar 2017 09:55:48 -0500 Subject: [PATCH 12/43] ignored app icons --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 559c88e..540f178 100644 --- a/.gitignore +++ b/.gitignore @@ -77,6 +77,7 @@ backend/public/app/bower_components iOS/TogetherStream/TogetherStream/Configuration/private.plist # Other +iOS/TogetherStream/TogetherStream/Assets.xcassets/AppIcon.appiconset/* manifest.yml.prod manifest.yml.staging backend/**/private/* From ec825ad262351eaf6d5ff189b543e855f7133126 Mon Sep 17 00:00:00 2001 From: Daniel Firsht Date: Mon, 13 Mar 2017 10:47:34 -0500 Subject: [PATCH 13/43] added headers to all files (#496) --- backend/app.js | 19 ++++--------------- backend/auth/auth.service.js | 18 ++++-------------- backend/auth/facebook/index.js | 19 ++++--------------- backend/auth/facebook/passport.js | 19 ++++--------------- backend/auth/facebook/token/index.js | 19 ++++--------------- backend/auth/facebook/token/passport.js | 19 ++++--------------- backend/auth/index.js | 19 ++++--------------- backend/auth/security.helper.js | 19 ++++--------------- backend/blocks/blocks.service.js | 7 ++++--- backend/blocks/index.js | 7 ++++--- backend/config/appVars.js | 19 ++++--------------- backend/config/index.js | 19 ++++--------------- backend/invites/device-token.js | 19 ++++--------------- backend/invites/index.js | 19 ++++--------------- backend/invites/invites.service.js | 19 ++++--------------- backend/public/app/index.html | 5 +++++ .../app/src/behaviors/csync-behavior.html | 5 +++++ .../app/src/behaviors/facebook-behavior.html | 5 +++++ .../app/src/behaviors/server-behavior.html | 5 +++++ .../app/src/behaviors/youtube-behavior.html | 5 +++++ backend/public/app/src/shared-styles.html | 5 +++++ backend/public/app/src/ts-app.html | 5 +++++ backend/public/app/src/ts-chat-message.html | 5 +++++ backend/public/app/src/ts-chat.html | 5 +++++ backend/public/app/src/ts-header.html | 5 +++++ backend/public/app/src/ts-portal.html | 5 +++++ backend/public/app/src/ts-video.html | 5 +++++ .../public/app/test/ts-app/ts-app_test.html | 5 +++++ backend/public/developers/index.html | 5 +++++ backend/public/index.html | 5 +++++ backend/public/stylesheets/common.css | 5 +++++ backend/public/stylesheets/docs.css | 5 +++++ backend/public/stylesheets/main.css | 5 +++++ backend/routes/index.js | 19 ++++--------------- backend/user/user.controller.js | 19 ++++--------------- .../TogetherStream/AppDelegate.swift | 7 ++----- .../Controllers/AboutViewController.swift | 7 ++----- .../Controllers/AddVideosViewController.swift | 7 ++----- .../Controllers/HomeViewController.swift | 7 ++----- .../InviteStreamViewController.swift | 7 ++----- .../LicenseAgreementViewController.swift | 7 ++----- .../Controllers/LoginViewController.swift | 7 ++----- .../MainNavigationController.swift | 7 ++----- .../NameStreamViewController.swift | 7 ++----- .../Controllers/PopupViewController.swift | 7 ++----- .../Controllers/ProfileViewController.swift | 7 ++----- .../Controllers/StreamViewController.swift | 7 ++----- .../Controllers/StreamViewModel.swift | 7 ++----- .../DataManagers/AccountDataManager.swift | 7 ++----- .../DataManagers/CSyncDataManager.swift | 7 ++----- .../DataManagers/ChatDataManager.swift | 7 ++----- .../DataManagers/FacebookDataManager.swift | 7 ++----- .../DataManagers/HeartbeatDataManager.swift | 7 ++----- .../ParticipantsDataManager.swift | 7 ++----- .../DataManagers/ServerError.swift | 7 ++----- .../ThreadSafeCallbackQueue.swift | 7 ++----- .../DataManagers/YouTubeDataManager.swift | 7 ++----- .../TogetherStream/Extensions/UIColor.swift | 7 ++----- .../Extensions/UITableViewExtension.swift | 19 ++++--------------- .../UIViewControllerExtension.swift | 7 ++----- .../Extensions/UIViewExtensions.swift | 19 ++++--------------- .../TogetherStream/Models/ChatMessage.swift | 7 ++----- .../TogetherStream/Models/Message.swift | 7 ++----- .../Models/ParticipantMessage.swift | 7 ++----- .../TogetherStream/Models/Stream.swift | 7 ++----- .../TogetherStream/Models/User.swift | 7 ++----- .../TogetherStream/Models/Video.swift | 7 ++----- .../TogetherStream-Bridging-Header.h | 19 ++++--------------- .../TogetherStream/Utilities/Utils.swift | 19 ++++--------------- .../ViewModels/AddVideosViewModel.swift | 7 ++----- .../ViewModels/HomeViewModel.swift | 7 ++----- .../ViewModels/InviteStreamViewModel.swift | 7 ++----- .../Views/ChatEventTableViewCell.swift | 7 ++----- .../Views/ChatMessageTableViewCell.swift | 7 ++----- .../Views/ChatTextFieldAccessoryView.swift | 7 ++----- .../Views/FriendTableViewCell.swift | 7 ++----- .../InviteFriendsHeaderTableViewCell.swift | 7 ++----- .../TogetherStream/Views/NextBannerView.swift | 7 ++----- .../Views/NoStreamsTableViewCell.swift | 7 ++----- .../Views/ProfileTableViewCell.swift | 7 ++----- .../Views/SearchResultHeaderView.swift | 7 ++----- .../Views/SearchResultTableViewCell.swift | 7 ++----- .../Views/StreamTableViewCell.swift | 7 ++----- .../Views/TextEmailTableViewCell.swift | 7 ++----- .../Views/VideoQueueTableViewCell.swift | 7 ++----- .../TogetherStreamTests.swift | 7 ++----- .../TogetherStreamUITests.swift | 7 ++----- 87 files changed, 270 insertions(+), 530 deletions(-) diff --git a/backend/app.js b/backend/app.js index b650bb3..bd71784 100644 --- a/backend/app.js +++ b/backend/app.js @@ -1,18 +1,7 @@ -/* - Copyright 2017 IBM Corporation - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ +// +// © Copyright IBM Corporation 2017 +// LICENSE: MIT http://ibm.biz/license-non-ios +// require('newrelic'); // setup new relic performance monitoring 'use strict'; diff --git a/backend/auth/auth.service.js b/backend/auth/auth.service.js index c9e8e44..8b90af0 100644 --- a/backend/auth/auth.service.js +++ b/backend/auth/auth.service.js @@ -1,18 +1,8 @@ -/* - Copyright 2017 IBM Corporation +// +// © Copyright IBM Corporation 2017 +// LICENSE: MIT http://ibm.biz/license-non-ios +// - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ var securityHelper = require('./security.helper'); var compose = require('composable-middleware'); var userController = require('../user/user.controller'); diff --git a/backend/auth/facebook/index.js b/backend/auth/facebook/index.js index 1e62137..c7977d8 100755 --- a/backend/auth/facebook/index.js +++ b/backend/auth/facebook/index.js @@ -1,18 +1,7 @@ -/* - Copyright 2017 IBM Corporation - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ +// +// © Copyright IBM Corporation 2017 +// LICENSE: MIT http://ibm.biz/license-non-ios +// 'use strict'; diff --git a/backend/auth/facebook/passport.js b/backend/auth/facebook/passport.js index d5de95b..90eb589 100755 --- a/backend/auth/facebook/passport.js +++ b/backend/auth/facebook/passport.js @@ -1,18 +1,7 @@ -/* - Copyright 2017 IBM Corporation - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ +// +// © Copyright IBM Corporation 2017 +// LICENSE: MIT http://ibm.biz/license-non-ios +// 'use strict'; diff --git a/backend/auth/facebook/token/index.js b/backend/auth/facebook/token/index.js index 0ae7ec2..e80c2ef 100644 --- a/backend/auth/facebook/token/index.js +++ b/backend/auth/facebook/token/index.js @@ -1,18 +1,7 @@ -/* - Copyright 2017 IBM Corporation - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ +// +// © Copyright IBM Corporation 2017 +// LICENSE: MIT http://ibm.biz/license-non-ios +// 'use strict'; diff --git a/backend/auth/facebook/token/passport.js b/backend/auth/facebook/token/passport.js index a14f6a7..8648e9c 100644 --- a/backend/auth/facebook/token/passport.js +++ b/backend/auth/facebook/token/passport.js @@ -1,18 +1,7 @@ -/* - Copyright 2017 IBM Corporation - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ +// +// © Copyright IBM Corporation 2017 +// LICENSE: MIT http://ibm.biz/license-non-ios +// 'use strict'; diff --git a/backend/auth/index.js b/backend/auth/index.js index f6d5077..78250d3 100644 --- a/backend/auth/index.js +++ b/backend/auth/index.js @@ -1,18 +1,7 @@ -/* - Copyright 2017 IBM Corporation - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ +// +// © Copyright IBM Corporation 2017 +// LICENSE: MIT http://ibm.biz/license-non-ios +// var express = require('express'); var appVars = require('../config/appVars'); diff --git a/backend/auth/security.helper.js b/backend/auth/security.helper.js index 9719387..bb4882f 100644 --- a/backend/auth/security.helper.js +++ b/backend/auth/security.helper.js @@ -1,18 +1,7 @@ -/* - Copyright 2017 IBM Corporation - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ +// +// © Copyright IBM Corporation 2017 +// LICENSE: MIT http://ibm.biz/license-non-ios +// 'use strict'; diff --git a/backend/blocks/blocks.service.js b/backend/blocks/blocks.service.js index caa60e0..5304a40 100644 --- a/backend/blocks/blocks.service.js +++ b/backend/blocks/blocks.service.js @@ -1,6 +1,7 @@ -/** - * Created by danielfirsht on 3/7/17. - */ +// +// © Copyright IBM Corporation 2017 +// LICENSE: MIT http://ibm.biz/license-non-ios +// var userController = require('../user/user.controller'); var appVars = require('../config/appVars'); diff --git a/backend/blocks/index.js b/backend/blocks/index.js index 028b7cd..4de277a 100644 --- a/backend/blocks/index.js +++ b/backend/blocks/index.js @@ -1,6 +1,7 @@ -/** - * Created by danielfirsht on 3/7/17. - */ +// +// © Copyright IBM Corporation 2017 +// LICENSE: MIT http://ibm.biz/license-non-ios +// var express = require('express'); var blocksService = require('./blocks.service.js'); diff --git a/backend/config/appVars.js b/backend/config/appVars.js index 8171d03..b05c9b2 100644 --- a/backend/config/appVars.js +++ b/backend/config/appVars.js @@ -1,18 +1,7 @@ -/* - Copyright 2017 IBM Corporation - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ +// +// © Copyright IBM Corporation 2017 +// LICENSE: MIT http://ibm.biz/license-non-ios +// var apn = require("apn"); var cfenv = require("cfenv"); diff --git a/backend/config/index.js b/backend/config/index.js index 83f82ab..406def0 100644 --- a/backend/config/index.js +++ b/backend/config/index.js @@ -1,18 +1,7 @@ -/* - Copyright 2017 IBM Corporation - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ +// +// © Copyright IBM Corporation 2017 +// LICENSE: MIT http://ibm.biz/license-non-ios +// 'use strict'; var favicon = require('serve-favicon'); diff --git a/backend/invites/device-token.js b/backend/invites/device-token.js index a2aa6db..151d256 100644 --- a/backend/invites/device-token.js +++ b/backend/invites/device-token.js @@ -1,18 +1,7 @@ -/* - Copyright 2017 IBM Corporation - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ +// +// © Copyright IBM Corporation 2017 +// LICENSE: MIT http://ibm.biz/license-non-ios +// var express = require('express'); var userController = require('../user/user.controller'); diff --git a/backend/invites/index.js b/backend/invites/index.js index 1d53f41..952d321 100644 --- a/backend/invites/index.js +++ b/backend/invites/index.js @@ -1,18 +1,7 @@ -/* - Copyright 2017 IBM Corporation - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ +// +// © Copyright IBM Corporation 2017 +// LICENSE: MIT http://ibm.biz/license-non-ios +// var express = require('express'); var authService = require('../auth/auth.service'); diff --git a/backend/invites/invites.service.js b/backend/invites/invites.service.js index a6b1ef6..24009a9 100644 --- a/backend/invites/invites.service.js +++ b/backend/invites/invites.service.js @@ -1,18 +1,7 @@ -/* - Copyright 2017 IBM Corporation - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ +// +// © Copyright IBM Corporation 2017 +// LICENSE: MIT http://ibm.biz/license-non-ios +// var apn = require('apn'); var userController = require('../user/user.controller'); diff --git a/backend/public/app/index.html b/backend/public/app/index.html index 1ff9aab..4a7ae20 100644 --- a/backend/public/app/index.html +++ b/backend/public/app/index.html @@ -1,3 +1,8 @@ + + diff --git a/backend/public/app/src/behaviors/csync-behavior.html b/backend/public/app/src/behaviors/csync-behavior.html index e2f1882..a5cb1bf 100644 --- a/backend/public/app/src/behaviors/csync-behavior.html +++ b/backend/public/app/src/behaviors/csync-behavior.html @@ -1,3 +1,8 @@ + + \ No newline at end of file diff --git a/backend/public/app/src/behaviors/server-behavior.html b/backend/public/app/src/behaviors/server-behavior.html index 557b4db..e4b4c79 100644 --- a/backend/public/app/src/behaviors/server-behavior.html +++ b/backend/public/app/src/behaviors/server-behavior.html @@ -43,42 +43,6 @@ } }.bind(this) xhr.send(null); - }, - /** - * Validates with the server whether this stream id is valid. - * @param {string} streamId - Stream id input by the user on portal page. - */ - isValidStreamId: function(streamId, callback) { - let xhr = new XMLHttpRequest(); - - xhr.open('GET', '/invites', true); - xhr.setRequestHeader('Authorization', this.serverAccessToken) - xhr.onload = function () { - if (xhr.status === 200) { - let invitesArr = JSON.parse(xhr.response) - var streamIdIsValid = false - - if (invitesArr) { - invitesArr.forEach(function(invite) { - let splitStr = invite.csync_path.split('.') - - if (splitStr[1] === streamId) { - streamIdIsValid = true - this.set("streamName", invite.stream_name) - } - }.bind(this)) - } - callback(streamIdIsValid) - } else if (xhr.status === 401) { - // Get new server token when needing authentication expires. - this.getServerAccessToken(function() { - this.isValidStreamId(streamId, callback) - }.bind(this)) - } else { - console.error("Couldn't reach server.", xhr) - } - }.bind(this) - xhr.send(null); } }; \ No newline at end of file diff --git a/backend/public/app/src/ts-app.html b/backend/public/app/src/ts-app.html index 7b63c7a..0ac206d 100644 --- a/backend/public/app/src/ts-app.html +++ b/backend/public/app/src/ts-app.html @@ -102,16 +102,19 @@ * @param {string} streamId - New stream id. */ joinStream: function() { + let that = this let showPortalPage = function () { - this.isValidStreamId(this.streamId, function callback(isValid) { - if (isValid) { - this.set("showingPortalPage", false) - this.authenticateWithFacebookAccessToken(this.facebookAccessToken, this.setupCsyncListeners.bind(this)) - } else { - alert("Please input a valid stream id.") - } - }.bind(this)) - }.bind(this) + that.authenticateWithFacebookAccessToken(that.facebookAccessToken, function () { + that.isValidStreamId(that.streamId, function callback(isValid) { + if (isValid) { + that.setupCsyncListeners() + that.set("showingPortalPage", false) + } else { + alert("Please input a valid stream id.") + } + }) + }) + } if (!this.isLoggedIn) { this.fbLogin(function callback () { diff --git a/backend/public/app/src/ts-chat-message.html b/backend/public/app/src/ts-chat-message.html index a7eac53..a41b698 100644 --- a/backend/public/app/src/ts-chat-message.html +++ b/backend/public/app/src/ts-chat-message.html @@ -23,6 +23,9 @@ font-size: small; margin: 2px; } + .right-container p { + margin-top: -4px; + } .inline { display: flex; } diff --git a/backend/public/app/src/ts-chat.html b/backend/public/app/src/ts-chat.html index 4fa5d83..85f3a1d 100644 --- a/backend/public/app/src/ts-chat.html +++ b/backend/public/app/src/ts-chat.html @@ -14,7 +14,8 @@ display: flex; flex-direction: column; justify-content: space-between; - width: 30% + width: 30%; + height: 100%; } .bottom-container { display: flex; diff --git a/backend/public/app/src/ts-video.html b/backend/public/app/src/ts-video.html index 1842160..30712f3 100644 --- a/backend/public/app/src/ts-video.html +++ b/backend/public/app/src/ts-video.html @@ -11,6 +11,10 @@