help@rskworld.in +91 93305 39277
RSK World
  • Home
  • Development
    • Web Development
    • Mobile Apps
    • Software
    • Games
    • Project
  • Technologies
    • Data Science
    • AI Development
    • Cloud Development
    • Blockchain
    • Cyber Security
    • Dev Tools
    • Testing Tools
  • Blog
  • About
  • Contact

Theme Settings

Color Scheme
Display Options
Font Size
100%
Back to Project
RSK World
fitness-coach-bot
/
static
RSK World
fitness-coach-bot
Fitness Coach Bot - Python + Flask + SQLAlchemy + Workout Plans + Exercise Guidance + Health Tracking + AI Fitness Coach
static
  • css
  • js
workout_buddy_matcher.pyindex.htmlrequirements.txtLICENSE
utils/workout_buddy_matcher.py
Raw Download
Find: Go to:
"""
Workout Buddy Matching System
Author: RSK World (https://rskworld.in)
Founded by: Molla Samser
Designer & Tester: Rima Khatun
Contact: help@rskworld.in, +91 93305 39277
Year: 2026
"""

import json
from datetime import datetime, timedelta
from typing import Dict, List, Optional, Tuple
from dataclasses import dataclass

@dataclass
class WorkoutBuddy:
    user_id: str
    name: str
    fitness_level: str
    goals: List[str]
    preferred_workout_time: str
    location: Optional[str] = None
    preferred_activities: List[str] = None
    availability: Dict = None
    compatibility_score: float = 0.0

class WorkoutBuddyMatcher:
    """AI-powered workout buddy matching system"""
    
    def __init__(self):
        self.buddy_profiles = {}
        self.active_matches = {}
        
    def create_buddy_profile(self, user_data: Dict) -> Dict:
        """Create or update buddy matching profile"""
        profile = WorkoutBuddy(
            user_id=user_data.get('user_id'),
            name=user_data.get('name', 'User'),
            fitness_level=user_data.get('fitness_level', 'beginner'),
            goals=user_data.get('goals', []),
            preferred_workout_time=user_data.get('preferred_workout_time', 'morning'),
            location=user_data.get('location'),
            preferred_activities=user_data.get('preferred_activities', []),
            availability=user_data.get('availability', {})
        )
        
        self.buddy_profiles[profile.user_id] = profile
        
        return {
            'success': True,
            'profile': self._profile_to_dict(profile),
            'message': 'Buddy profile created successfully'
        }
    
    def find_matches(self, user_id: str, limit: int = 5) -> List[Dict]:
        """Find compatible workout buddies"""
        if user_id not in self.buddy_profiles:
            return []
        
        user_profile = self.buddy_profiles[user_id]
        matches = []
        
        for buddy_id, buddy_profile in self.buddy_profiles.items():
            if buddy_id == user_id:
                continue
            
            # Calculate compatibility score
            score = self._calculate_compatibility(user_profile, buddy_profile)
            
            if score > 0.5:  # Minimum compatibility threshold
                buddy_profile.compatibility_score = score
                matches.append({
                    'buddy': self._profile_to_dict(buddy_profile),
                    'compatibility_score': round(score * 100, 1),
                    'match_reasons': self._get_match_reasons(user_profile, buddy_profile)
                })
        
        # Sort by compatibility score
        matches.sort(key=lambda x: x['compatibility_score'], reverse=True)
        
        return matches[:limit]
    
    def _calculate_compatibility(self, user: WorkoutBuddy, buddy: WorkoutBuddy) -> float:
        """Calculate compatibility score between two users"""
        score = 0.0
        factors = 0
        
        # Fitness level compatibility (0.3 weight)
        level_match = self._match_fitness_level(user.fitness_level, buddy.fitness_level)
        score += level_match * 0.3
        factors += 0.3
        
        # Goals compatibility (0.25 weight)
        goals_match = self._match_goals(user.goals, buddy.goals)
        score += goals_match * 0.25
        factors += 0.25
        
        # Workout time compatibility (0.2 weight)
        time_match = 1.0 if user.preferred_workout_time == buddy.preferred_workout_time else 0.5
        score += time_match * 0.2
        factors += 0.2
        
        # Activity preferences (0.15 weight)
        activity_match = self._match_activities(user.preferred_activities, buddy.preferred_activities)
        score += activity_match * 0.15
        factors += 0.15
        
        # Location proximity (0.1 weight) - if both have location
        if user.location and buddy.location:
            location_match = self._calculate_location_proximity(user.location, buddy.location)
            score += location_match * 0.1
            factors += 0.1
        
        # Normalize score
        return score / factors if factors > 0 else 0.0
    
    def _match_fitness_level(self, level1: str, level2: str) -> float:
        """Match fitness levels"""
        levels = {'beginner': 1, 'intermediate': 2, 'advanced': 3}
        level1_num = levels.get(level1.lower(), 2)
        level2_num = levels.get(level2.lower(), 2)
        
        diff = abs(level1_num - level2_num)
        if diff == 0:
            return 1.0
        elif diff == 1:
            return 0.7  # Adjacent levels are somewhat compatible
        else:
            return 0.3  # Too far apart
    
    def _match_goals(self, goals1: List[str], goals2: List[str]) -> float:
        """Match fitness goals"""
        if not goals1 or not goals2:
            return 0.5  # Neutral if no goals specified
        
        common_goals = set(g.lower() for g in goals1) & set(g.lower() for g in goals2)
        all_goals = set(g.lower() for g in goals1) | set(g.lower() for g in goals2)
        
        if not all_goals:
            return 0.5
        
        return len(common_goals) / len(all_goals)
    
    def _match_activities(self, activities1: List[str], activities2: List[str]) -> float:
        """Match preferred activities"""
        if not activities1 or not activities2:
            return 0.5
        
        common = set(a.lower() for a in activities1) & set(a.lower() for a in activities2)
        total = len(set(a.lower() for a in activities1) | set(a.lower() for a in activities2))
        
        if total == 0:
            return 0.5
        
        return len(common) / total
    
    def _calculate_location_proximity(self, loc1: str, loc2: str) -> float:
        """Calculate location proximity (simplified)"""
        # In real implementation, would use geocoding API
        # For now, simple string matching
        if loc1.lower() == loc2.lower():
            return 1.0
        
        # Check if same city (simple check)
        loc1_parts = loc1.lower().split(',')
        loc2_parts = loc2.lower().split(',')
        
        if len(loc1_parts) > 0 and len(loc2_parts) > 0:
            if loc1_parts[0] == loc2_parts[0]:
                return 0.7  # Same city
        
        return 0.3  # Different locations
    
    def _get_match_reasons(self, user: WorkoutBuddy, buddy: WorkoutBuddy) -> List[str]:
        """Get reasons why users are matched"""
        reasons = []
        
        if user.fitness_level == buddy.fitness_level:
            reasons.append(f"Same fitness level: {user.fitness_level}")
        
        common_goals = set(g.lower() for g in user.goals) & set(g.lower() for g in buddy.goals)
        if common_goals:
            reasons.append(f"Shared goals: {', '.join(list(common_goals)[:2])}")
        
        if user.preferred_workout_time == buddy.preferred_workout_time:
            reasons.append(f"Same workout time preference: {user.preferred_workout_time}")
        
        common_activities = set(a.lower() for a in user.preferred_activities or []) & \
                           set(a.lower() for a in buddy.preferred_activities or [])
        if common_activities:
            reasons.append(f"Similar interests: {', '.join(list(common_activities)[:2])}")
        
        return reasons if reasons else ["Potential workout buddy"]
    
    def create_buddy_request(self, from_user_id: str, to_user_id: str, message: Optional[str] = None) -> Dict:
        """Send workout buddy request"""
        request = {
            'id': f"buddy_req_{datetime.now().strftime('%Y%m%d_%H%M%S')}_{from_user_id}",
            'from_user_id': from_user_id,
            'to_user_id': to_user_id,
            'message': message or "Would you like to be workout buddies?",
            'status': 'pending',
            'created_at': datetime.now().isoformat()
        }
        
        return {
            'success': True,
            'request': request,
            'message': 'Buddy request sent successfully'
        }
    
    def accept_buddy_request(self, request_id: str) -> Dict:
        """Accept buddy request"""
        return {
            'success': True,
            'message': 'Buddy request accepted! You are now workout buddies.',
            'match': {
                'created_at': datetime.now().isoformat(),
                'status': 'active'
            }
        }
    
    def suggest_group_workout(self, user_ids: List[str], workout_data: Dict) -> Dict:
        """Suggest group workout for matched buddies"""
        return {
            'success': True,
            'suggestion': {
                'workout_type': workout_data.get('type', 'group_training'),
                'suggested_time': workout_data.get('time'),
                'participants': user_ids,
                'message': 'Group workout suggestion created',
                'created_at': datetime.now().isoformat()
            }
        }
    
    def _profile_to_dict(self, profile: WorkoutBuddy) -> Dict:
        """Convert profile to dictionary"""
        return {
            'user_id': profile.user_id,
            'name': profile.name,
            'fitness_level': profile.fitness_level,
            'goals': profile.goals,
            'preferred_workout_time': profile.preferred_workout_time,
            'location': profile.location,
            'preferred_activities': profile.preferred_activities or [],
            'availability': profile.availability or {}
        }
248 lines•9.5 KB
python
templates/index.html
Raw Download
Find: Go to:
<!DOCTYPE html>
<html lang="en">
<head>
    <!--
    Fitness Coach Bot - Main Interface
    Author: RSK World (https://rskworld.in)
    Founded by: Molla Samser
    Designer & Tester: Rima Khatun
    Contact: help@rskworld.in, +91 93305 39277
    Year: 2026
    -->
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Fitness Coach Bot - Your Personal AI Fitness Trainer</title>
    <meta name="description" content="AI-powered fitness coaching chatbot for workout plans, exercise guidance, and health tracking">
    <meta name="keywords" content="fitness coach, workout plans, exercise guidance, health tracking, AI chatbot">
    <meta name="author" content="RSK World">
    
    <!-- Bootstrap CSS -->
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
    <!-- Font Awesome -->
    <link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css" rel="stylesheet">
    <!-- Custom CSS -->
    <link href="{{ url_for('static', filename='css/style.css') }}" rel="stylesheet">
    <link href="{{ url_for('static', filename='css/advanced-features.css') }}" rel="stylesheet">
</head>
<body class="bg-light">
    <!-- Header -->
    <header class="bg-primary text-white py-3 shadow">
        <div class="container">
            <div class="row align-items-center">
                <div class="col-md-8">
                    <h1 class="h3 mb-0">
                        <i class="fas fa-dumbbell me-2"></i>
                        Fitness Coach Bot
                    </h1>
                    <p class="mb-0 small">Your Personal AI Fitness Trainer</p>
                </div>
                <div class="col-md-4 text-md-end">
                    <span class="badge bg-success me-2">Online</span>
                    <small>Powered by RSK World</small>
                </div>
            </div>
        </div>
    </header>

    <!-- Main Content -->
    <main class="container my-4">
        <div class="row">
            <!-- Chat Section -->
            <div class="col-lg-8 mb-4">
                <div class="card shadow-sm h-100">
                    <div class="card-header bg-white">
                        <h5 class="mb-0">
                            <i class="fas fa-comments me-2 text-primary"></i>
                            Chat with Your Fitness Coach
                        </h5>
                    </div>
                    <div class="card-body p-0">
                        <!-- Chat Messages -->
                        <div id="chatMessages" class="chat-messages p-3" style="height: 400px; overflow-y: auto;">
                            <div class="message bot-message mb-3">
                                <div class="d-flex">
                                    <div class="bot-avatar me-2">
                                        <i class="fas fa-robot text-primary"></i>
                                    </div>
                                    <div class="message-content bg-light rounded p-3">
                                        <p class="mb-0">Hello! I'm your fitness coach bot. I'm here to help you with workout plans, exercise guidance, and health tracking. What would you like to know today?</p>
                                    </div>
                                </div>
                            </div>
                        </div>
                        
                        <!-- Chat Input -->
                        <div class="chat-input p-3 border-top">
                            <div class="input-group">
                                <input type="text" id="messageInput" class="form-control" placeholder="Ask about workouts, nutrition, or fitness goals..." maxlength="500">
                                <button class="btn btn-primary" type="button" id="sendButton">
                                    <i class="fas fa-paper-plane"></i> Send
                                </button>
                            </div>
                            <div class="mt-2">
                                <small class="text-muted">Quick suggestions:</small>
                                <div class="mt-1">
                                    <button class="btn btn-sm btn-outline-secondary me-1 mb-1 quick-suggestion">Create workout plan</button>
                                    <button class="btn btn-sm btn-outline-secondary me-1 mb-1 quick-suggestion">Nutrition advice</button>
                                    <button class="btn btn-sm btn-outline-secondary me-1 mb-1 quick-suggestion">Track progress</button>
                                    <button class="btn btn-sm btn-outline-secondary me-1 mb-1 quick-suggestion">Motivation</button>
                                </div>
                                <div class="mt-2">
                                    <button class="btn btn-sm btn-outline-info" id="voiceToggleButton" title="Voice Commands">
                                        <i class="fas fa-microphone"></i> Voice Command
                                    </button>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
            </div>

            <!-- Sidebar -->
            <div class="col-lg-4">
                <!-- User Profile -->
                <div class="card shadow-sm mb-4">
                    <div class="card-header bg-white">
                        <h6 class="mb-0">
                            <i class="fas fa-user me-2 text-primary"></i>
                            Your Profile
                        </h6>
                    </div>
                    <div class="card-body">
                        <form id="profileForm">
                            <div class="mb-3">
                                <label for="userName" class="form-label">Name</label>
                                <input type="text" class="form-control form-control-sm" id="userName" placeholder="Your name">
                            </div>
                            <div class="row">
                                <div class="col-6 mb-3">
                                    <label for="userAge" class="form-label">Age</label>
                                    <input type="number" class="form-control form-control-sm" id="userAge" placeholder="25">
                                </div>
                                <div class="col-6 mb-3">
                                    <label for="userWeight" class="form-label">Weight (kg)</label>
                                    <input type="number" class="form-control form-control-sm" id="userWeight" placeholder="70">
                                </div>
                            </div>
                            <div class="mb-3">
                                <label for="userGoal" class="form-label">Fitness Goal</label>
                                <select class="form-select form-select-sm" id="userGoal">
                                    <option value="">Select goal...</option>
                                    <option value="weight_loss">Weight Loss</option>
                                    <option value="muscle_gain">Muscle Gain</option>
                                    <option value="endurance">Endurance</option>
                                    <option value="strength">Strength</option>
                                    <option value="general_fitness">General Fitness</option>
                                </select>
                            </div>
                            <button type="submit" class="btn btn-primary btn-sm w-100">Save Profile</button>
                        </form>
                    </div>
                </div>

                <!-- Quick Stats -->
                <div class="card shadow-sm mb-4">
                    <div class="card-header bg-white">
                        <h6 class="mb-0">
                            <i class="fas fa-chart-line me-2 text-primary"></i>
                            Quick Stats
                        </h6>
                    </div>
                    <div class="card-body">
                        <div class="row text-center">
                            <div class="col-6 mb-3">
                                <div class="stat-item">
                                    <h4 class="text-primary mb-0" id="workoutCount">0</h4>
                                    <small class="text-muted">Workouts</small>
                                </div>
                            </div>
                            <div class="col-6 mb-3">
                                <div class="stat-item">
                                    <h4 class="text-success mb-0" id="streakCount">0</h4>
                                    <small class="text-muted">Day Streak</small>
                                </div>
                            </div>
                            <div class="col-6">
                                <div class="stat-item">
                                    <h4 class="text-info mb-0" id="caloriesCount">0</h4>
                                    <small class="text-muted">Calories</small>
                                </div>
                            </div>
                            <div class="col-6">
                                <div class="stat-item">
                                    <h4 class="text-warning mb-0" id="goalsCount">0</h4>
                                    <small class="text-muted">Goals Met</small>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>

                <!-- Health Tips -->
                <div class="card shadow-sm">
                    <div class="card-header bg-white">
                        <h6 class="mb-0">
                            <i class="fas fa-lightbulb me-2 text-warning"></i>
                            Health Tips
                        </h6>
                    </div>
                    <div class="card-body">
                        <div id="healthTips">
                            <div class="tip-item mb-2">
                                <small class="text-muted">💡 Drink at least 8 glasses of water daily</small>
                            </div>
                            <div class="tip-item mb-2">
                                <small class="text-muted">🥗 Include protein in every meal</small>
                            </div>
                            <div class="tip-item">
                                <small class="text-muted">😴 Get 7-9 hours of quality sleep</small>
                            </div>
                        </div>
                        <button class="btn btn-sm btn-outline-primary mt-2" id="refreshTips">
                            <i class="fas fa-sync-alt"></i> More Tips
                        </button>
                    </div>
                </div>
            </div>
        </div>

        <!-- Features Section -->
        <div class="row mt-4">
            <div class="col-12">
                <div class="card shadow-sm">
                    <div class="card-header bg-white">
                        <h5 class="mb-0">
                            <i class="fas fa-star me-2 text-warning"></i>
                            Features
                        </h5>
                    </div>
                    <div class="card-body">
                        <div class="row">
                            <div class="col-md-3 mb-3">
                                <div class="feature-card text-center p-3">
                                    <i class="fas fa-clipboard-list fa-2x text-primary mb-2"></i>
                                    <h6>Workout Plans</h6>
                                    <small class="text-muted">Personalized workout routines</small>
                                </div>
                            </div>
                            <div class="col-md-3 mb-3">
                                <div class="feature-card text-center p-3">
                                    <i class="fas fa-running fa-2x text-success mb-2"></i>
                                    <h6>Exercise Guidance</h6>
                                    <small class="text-muted">Proper form and technique</small>
                                </div>
                            </div>
                            <div class="col-md-3 mb-3">
                                <div class="feature-card text-center p-3">
                                    <i class="fas fa-chart-bar fa-2x text-info mb-2"></i>
                                    <h6>Progress Tracking</h6>
                                    <small class="text-muted">Monitor your improvements</small>
                                </div>
                            </div>
                            <div class="col-md-3 mb-3">
                                <div class="feature-card text-center p-3">
                                    <i class="fas fa-heart fa-2x text-danger mb-2"></i>
                                    <h6>Health Tips</h6>
                                    <small class="text-muted">Nutrition and wellness advice</small>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </div>

        <!-- Voice Recognition Indicator -->
        <div id="voiceListeningIndicator" class="voice-listening-indicator position-fixed" style="display: none; bottom: 100px; right: 30px; background: rgba(0,0,0,0.8); color: white; padding: 15px 20px; border-radius: 20px; z-index: 999;">
            <div class="d-flex align-items-center">
                <div class="spinner-border spinner-border-sm text-primary me-2" role="status"></div>
                <span>Listening...</span>
            </div>
        </div>

        <!-- Pose Detection Container -->
        <div id="poseDetectionContainer" class="mt-4" style="display: none;">
            <div class="card shadow-sm">
                <div class="card-header bg-white">
                    <h5 class="mb-0">
                        <i class="fas fa-video me-2 text-primary"></i>
                        Pose Detection & Form Correction
                    </h5>
                </div>
                <div class="card-body">
                    <div id="poseFeedback" class="alert alert-info mb-3"></div>
                    <div class="row">
                        <div class="col-md-8">
                            <div id="poseCanvasContainer" class="pose-detection-container"></div>
                        </div>
                        <div class="col-md-4">
                            <div class="pose-stats p-3">
                                <h6 class="mb-3">Live Stats</h6>
                                <div class="rep-counter mb-3">
                                    <div class="mb-2">Reps: <span id="repCounter" class="text-primary fw-bold">0</span></div>
                                    <div class="form-score mb-2">Form Score: <span id="formScore" class="text-warning fw-bold">0%</span></div>
                                    <div>Exercise: <span id="currentExercise" class="text-info">None</span></div>
                                </div>
                                <button class="btn btn-danger w-100" onclick="if(window.poseDetector) window.poseDetector.stopDetection()">
                                    <i class="fas fa-stop"></i> Stop Detection
                                </button>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </main>

    <!-- Footer -->
    <footer class="bg-dark text-white py-4 mt-5">
        <div class="container">
            <div class="row">
                <div class="col-md-6">
                    <h6>Fitness Coach Bot</h6>
                    <p class="small mb-0">Your AI-powered personal fitness trainer for workout plans, exercise guidance, and health tracking.</p>
                </div>
                <div class="col-md-6 text-md-end">
                    <p class="small mb-0">
                        © 2026 RSK World. All rights reserved.<br>
                        Developed by: Molla Samser | Designed & Tested by: Rima Khatun<br>
                        Contact: <a href="mailto:help@rskworld.in" class="text-white">help@rskworld.in</a> | +91 93305 39277
                    </p>
                </div>
            </div>
        </div>
    </footer>

    <!-- Bootstrap JS -->
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
    <!-- Chart.js for Analytics -->
    <script src="https://cdn.jsdelivr.net/npm/chart.js@4.4.0/dist/chart.umd.min.js"></script>
    <!-- Custom JS -->
    <script src="{{ url_for('static', filename='js/app.js') }}"></script>
    <script src="{{ url_for('static', filename='js/voice_recognition.js') }}"></script>
    <script src="{{ url_for('static', filename='js/pose_detection.js') }}"></script>
    <script src="{{ url_for('static', filename='js/analytics_dashboard.js') }}"></script>
</body>
</html>
327 lines•17.3 KB
markup
requirements.txt
Raw Download
Find: Go to:
# Fitness Coach Bot - Python Dependencies
# Author: RSK World (https://rskworld.in)
# Founded by: Molla Samser
# Designer & Tester: Rima Khatun
# Contact: help@rskworld.in, +91 93305 39277
# Year: 2026

Flask==2.3.3
Flask-SQLAlchemy==3.0.5
Werkzeug==2.3.7
Jinja2==3.1.2
click==8.1.7
itsdangerous==2.1.2
MarkupSafe==2.1.3
SQLAlchemy>=2.0.31
openai==0.28.1
python-dotenv==1.0.0
gunicorn==21.2.0
numpy>=1.24.3
requests==2.31.0
20 lines•442 B
text
LICENSE
Raw Download
Find: Go to:
MIT License

Copyright (c) 2026 RSK World

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.
22 lines•1.1 KB
text
🚀 Support RSK World

Subscribe to our YouTube channel for latest tutorials & updates!



Click subscribe & support our work ❤️

About RSK World

Founded by Molla Samser, with Designer & Tester Rima Khatun, RSK World is your one-stop destination for free programming resources, source code, and development tools.

Founder: Molla Samser
Designer & Tester: Rima Khatun

Development

  • Game Development
  • Web Development
  • Mobile Development
  • AI Development
  • Development Tools

Legal

  • Terms & Conditions
  • Privacy Policy
  • Disclaimer

Contact Info

Nutanhat, Mongolkote
Purba Burdwan, West Bengal
India, 713147

+91 93305 39277

hello@rskworld.in
support@rskworld.in

© 2026 RSK World. All rights reserved.

Content used for educational purposes only. View Disclaimer