Full Code of wbsth/cs50ai for AI

master b97b10ad1b39 cached
49 files
1.4 MB
677.4k tokens
170 symbols
1 requests
Download .txt
Showing preview only (1,455K chars total). Download the full file or copy to clipboard to get everything.
Repository: wbsth/cs50ai
Branch: master
Commit: b97b10ad1b39
Files: 49
Total size: 1.4 MB

Directory structure:
gitextract_o39wik8g/

├── .gitignore
├── README.md
├── week0/
│   ├── degrees/
│   │   ├── degrees.py
│   │   ├── small/
│   │   │   ├── movies.csv
│   │   │   ├── people.csv
│   │   │   └── stars.csv
│   │   └── util.py
│   └── tictactoe/
│       ├── requirements.txt
│       ├── runner.py
│       └── tictactoe.py
├── week1/
│   ├── knights/
│   │   ├── logic.py
│   │   └── puzzle.py
│   └── minesweeper/
│       ├── minesweeper.py
│       ├── requirements.txt
│       └── runner.py
├── week2/
│   ├── heredity/
│   │   └── heredity.py
│   └── pagerank/
│       └── pagerank.py
├── week3/
│   └── crossword/
│       ├── crossword.py
│       ├── data/
│       │   ├── structure0.txt
│       │   ├── structure1.txt
│       │   ├── structure2.txt
│       │   ├── words0.txt
│       │   ├── words1.txt
│       │   └── words2.txt
│       └── generate.py
├── week4/
│   ├── nim/
│   │   ├── nim.py
│   │   └── play.py
│   └── shopping/
│       ├── shopping.csv
│       └── shopping.py
├── week5/
│   └── traffic/
│       └── traffic.py
└── week6/
    ├── parser/
    │   ├── parser.py
    │   └── sentences/
    │       ├── 1.txt
    │       ├── 10.txt
    │       ├── 2.txt
    │       ├── 3.txt
    │       ├── 4.txt
    │       ├── 5.txt
    │       ├── 6.txt
    │       ├── 7.txt
    │       ├── 8.txt
    │       ├── 9.txt
    │       └── test.txt
    └── questions/
        ├── corpus/
        │   ├── artificial_intelligence.txt
        │   ├── machine_learning.txt
        │   ├── natural_language_processing.txt
        │   ├── neural_network.txt
        │   ├── probability.txt
        │   └── python.txt
        └── questions.py

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitignore
================================================
*.zip
*.pyc

__pycache__/
.venv/
venv/
.idea/

*/degrees/large/

================================================
FILE: README.md
================================================
# CS50 AI 
Mine solutions for CS50's Introduction to Artificial Intelligence with Python course

*Warning : before visiting this repo files, please read about [CS50's Academic Honesty rules](https://cs50.harvard.edu/college/2021/fall/syllabus/#academic-honesty)*.

## Includes:
* Quizzes answers
* Projects solutions

## Course info:
* __Name:__ CS50's Introduction to Artificial Intelligence with Python
* __University:__ Harvard University
* __WWW:__ https://cs50.harvard.edu/ai/2020/





================================================
FILE: week0/degrees/degrees.py
================================================
import csv
import sys

from util import Node, StackFrontier, QueueFrontier

# Maps names to a set of corresponding person_ids
names = {}

# Maps person_ids to a dictionary of: name, birth, movies (a set of movie_ids)
people = {}

# Maps movie_ids to a dictionary of: title, year, stars (a set of person_ids)
movies = {}


def load_data(directory):
    """
    Load data from CSV files into memory.
    """
    # Load people
    with open(f"{directory}/people.csv", encoding="utf-8") as f:
        reader = csv.DictReader(f)
        for row in reader:
            people[row["id"]] = {
                "name": row["name"],
                "birth": row["birth"],
                "movies": set()
            }
            if row["name"].lower() not in names:
                names[row["name"].lower()] = {row["id"]}
            else:
                names[row["name"].lower()].add(row["id"])


    # Load movies
    with open(f"{directory}/movies.csv", encoding="utf-8") as f:
        reader = csv.DictReader(f)
        for row in reader:
            movies[row["id"]] = {
                "title": row["title"],
                "year": row["year"],
                "stars": set()
            }

    # Load stars
    with open(f"{directory}/stars.csv", encoding="utf-8") as f:
        reader = csv.DictReader(f)
        for row in reader:
            try:
                people[row["person_id"]]["movies"].add(row["movie_id"])
                movies[row["movie_id"]]["stars"].add(row["person_id"])
            except KeyError:
                pass


def main():
    if len(sys.argv) > 2:
        sys.exit("Usage: python degrees.py [directory]")
    directory = sys.argv[1] if len(sys.argv) == 2 else "large"

    # Load data from files into memory
    print("Loading data...")
    load_data(directory)
    print("Data loaded.")

    source = person_id_for_name(input("Name: "))
    if source is None:
        sys.exit("Person not found.")
    target = person_id_for_name(input("Name: "))
    if target is None:
        sys.exit("Person not found.")

    path = shortest_path(source, target)

    if path is None:
        print("Not connected.")
    else:
        degrees = len(path)
        print(f"{degrees} degrees of separation.")
        path = [(None, source)] + path
        for i in range(degrees):
            person1 = people[path[i][1]]["name"]
            person2 = people[path[i + 1][1]]["name"]
            movie = movies[path[i + 1][0]]["title"]
            print(f"{i + 1}: {person1} and {person2} starred in {movie}")


def shortest_path(source, target):
    """
    Returns the shortest list of (movie_id, person_id) pairs
    that connect the source to the target.

    If no possible path, returns None.
    """

    start = Node(state=source, parent=None, action=None)
    frontier = QueueFrontier()
    frontier.add(start)

    explored = set()

    while True:
        if frontier.empty():
            return None

        node = frontier.remove()

        if node.state == target:
            rt = []

            while node.parent is not None:
                rt.append((node.action, node.state))
                node = node.parent

            rt.reverse()
            return rt

        explored.add(node.state)


        # find neighbours
        neighbours = neighbors_for_person(node.state)

        # add neighbours to frontier
        for action, state in neighbours:
            if not frontier.contains_state(state) and state not in explored:
                child = Node(state=state, parent=node, action=action)
                if child.state == target:
                    rt = []

                    while child.parent is not None:
                        rt.append((child.action, child.state))
                        child = child.parent

                    rt.reverse()
                    return rt
                frontier.add(child)


def person_id_for_name(name):
    """
    Returns the IMDB id for a person's name,
    resolving ambiguities as needed.
    """
    person_ids = list(names.get(name.lower(), set()))
    if len(person_ids) == 0:
        return None
    elif len(person_ids) > 1:
        print(f"Which '{name}'?")
        for person_id in person_ids:
            person = people[person_id]
            name = person["name"]
            birth = person["birth"]
            print(f"ID: {person_id}, Name: {name}, Birth: {birth}")
        try:
            person_id = input("Intended Person ID: ")
            if person_id in person_ids:
                return person_id
        except ValueError:
            pass
        return None
    else:
        return person_ids[0]


def neighbors_for_person(person_id):
    """
    Returns (movie_id, person_id) pairs for people
    who starred with a given person.
    """
    movie_ids = people[person_id]["movies"]
    neighbors = set()
    for movie_id in movie_ids:
        for person_id in movies[movie_id]["stars"]:
            neighbors.add((movie_id, person_id))
    return neighbors


if __name__ == "__main__":
    main()


================================================
FILE: week0/degrees/small/movies.csv
================================================
id,title,year
112384,"Apollo 13",1995
104257,"A Few Good Men",1992
109830,"Forrest Gump",1994
93779,"The Princess Bride",1987
95953,"Rain Man",1988


================================================
FILE: week0/degrees/small/people.csv
================================================
id,name,birth
102,"Kevin Bacon",1958
129,"Tom Cruise",1962
144,"Cary Elwes",1962
158,"Tom Hanks",1956
1597,"Mandy Patinkin",1952
163,"Dustin Hoffman",1937
1697,"Chris Sarandon",1942
193,"Demi Moore",1962
197,"Jack Nicholson",1937
200,"Bill Paxton",1955
398,"Sally Field",1946
420,"Valeria Golino",1965
596520,"Gerald R. Molen",1935
641,"Gary Sinise",1955
705,"Robin Wright",1966
914612,"Emma Watson",1990


================================================
FILE: week0/degrees/small/stars.csv
================================================
person_id,movie_id
102,104257
102,112384
129,104257
129,95953
144,93779
158,109830
158,112384
1597,93779
163,95953
1697,93779
193,104257
197,104257
200,112384
398,109830
420,95953
596520,95953
641,109830
641,112384
705,109830
705,93779


================================================
FILE: week0/degrees/util.py
================================================
class Node():
    def __init__(self, state, parent, action):
        self.state = state
        self.parent = parent
        self.action = action


class StackFrontier():
    def __init__(self):
        self.frontier = []

    def add(self, node):
        self.frontier.append(node)

    def contains_state(self, state):
        return any(node.state == state for node in self.frontier)

    def empty(self):
        return len(self.frontier) == 0

    def remove(self):
        if self.empty():
            raise Exception("empty frontier")
        else:
            node = self.frontier[-1]
            self.frontier = self.frontier[:-1]
            return node


class QueueFrontier(StackFrontier):

    def remove(self):
        if self.empty():
            raise Exception("empty frontier")
        else:
            node = self.frontier[0]
            self.frontier = self.frontier[1:]
            return node


================================================
FILE: week0/tictactoe/requirements.txt
================================================
pygame


================================================
FILE: week0/tictactoe/runner.py
================================================
import pygame
import sys
import time

import tictactoe as ttt

pygame.init()
size = width, height = 600, 400

# Colors
black = (0, 0, 0)
white = (255, 255, 255)

screen = pygame.display.set_mode(size)

mediumFont = pygame.font.Font("OpenSans-Regular.ttf", 28)
largeFont = pygame.font.Font("OpenSans-Regular.ttf", 40)
moveFont = pygame.font.Font("OpenSans-Regular.ttf", 60)

user = None
board = ttt.initial_state()
ai_turn = False

while True:

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()

    screen.fill(black)

    # Let user choose a player.
    if user is None:

        # Draw title
        title = largeFont.render("Play Tic-Tac-Toe", True, white)
        titleRect = title.get_rect()
        titleRect.center = ((width / 2), 50)
        screen.blit(title, titleRect)

        # Draw buttons
        playXButton = pygame.Rect((width / 8), (height / 2), width / 4, 50)
        playX = mediumFont.render("Play as X", True, black)
        playXRect = playX.get_rect()
        playXRect.center = playXButton.center
        pygame.draw.rect(screen, white, playXButton)
        screen.blit(playX, playXRect)

        playOButton = pygame.Rect(5 * (width / 8), (height / 2), width / 4, 50)
        playO = mediumFont.render("Play as O", True, black)
        playORect = playO.get_rect()
        playORect.center = playOButton.center
        pygame.draw.rect(screen, white, playOButton)
        screen.blit(playO, playORect)

        # Check if button is clicked
        click, _, _ = pygame.mouse.get_pressed()
        if click == 1:
            mouse = pygame.mouse.get_pos()
            if playXButton.collidepoint(mouse):
                time.sleep(0.2)
                user = ttt.X
            elif playOButton.collidepoint(mouse):
                time.sleep(0.2)
                user = ttt.O

    else:

        # Draw game board
        tile_size = 80
        tile_origin = (width / 2 - (1.5 * tile_size),
                       height / 2 - (1.5 * tile_size))
        tiles = []
        for i in range(3):
            row = []
            for j in range(3):
                rect = pygame.Rect(
                    tile_origin[0] + j * tile_size,
                    tile_origin[1] + i * tile_size,
                    tile_size, tile_size
                )
                pygame.draw.rect(screen, white, rect, 3)

                if board[i][j] != ttt.EMPTY:
                    move = moveFont.render(board[i][j], True, white)
                    moveRect = move.get_rect()
                    moveRect.center = rect.center
                    screen.blit(move, moveRect)
                row.append(rect)
            tiles.append(row)

        game_over = ttt.terminal(board)
        player = ttt.player(board)

        # Show title
        if game_over:
            winner = ttt.winner(board)
            if winner is None:
                title = f"Game Over: Tie."
            else:
                title = f"Game Over: {winner} wins."
        elif user == player:
            title = f"Play as {user}"
        else:
            title = f"Computer thinking..."
        title = largeFont.render(title, True, white)
        titleRect = title.get_rect()
        titleRect.center = ((width / 2), 30)
        screen.blit(title, titleRect)

        # Check for AI move
        if user != player and not game_over:
            if ai_turn:
                time.sleep(0.5)
                move = ttt.minimax(board)
                board = ttt.result(board, move)
                ai_turn = False
            else:
                ai_turn = True

        # Check for a user move
        click, _, _ = pygame.mouse.get_pressed()
        if click == 1 and user == player and not game_over:
            mouse = pygame.mouse.get_pos()
            for i in range(3):
                for j in range(3):
                    if (board[i][j] == ttt.EMPTY and tiles[i][j].collidepoint(mouse)):
                        board = ttt.result(board, (i, j))

        if game_over:
            againButton = pygame.Rect(width / 3, height - 65, width / 3, 50)
            again = mediumFont.render("Play Again", True, black)
            againRect = again.get_rect()
            againRect.center = againButton.center
            pygame.draw.rect(screen, white, againButton)
            screen.blit(again, againRect)
            click, _, _ = pygame.mouse.get_pressed()
            if click == 1:
                mouse = pygame.mouse.get_pos()
                if againButton.collidepoint(mouse):
                    time.sleep(0.2)
                    user = None
                    board = ttt.initial_state()
                    ai_turn = False

    pygame.display.flip()


================================================
FILE: week0/tictactoe/tictactoe.py
================================================
"""
Tic Tac Toe Player
"""

import math
from copy import deepcopy

X = "X"
O = "O"
EMPTY = None


def initial_state():
    """
    Returns starting state of the board.
    """
    return [[EMPTY, EMPTY, EMPTY],
            [EMPTY, EMPTY, EMPTY],
            [EMPTY, EMPTY, EMPTY]]


def player(board):
    """
    Returns player who has the next turn on a board.
    """
    Xcount = 0
    Ocount = 0

    for row in board:
        Xcount += row.count(X)
        Ocount += row.count(O)

    if Xcount <= Ocount:
        return X
    else:
        return O


def actions(board):
    """
    Returns set of all possible actions (i, j) available on the board.
    """

    possible_moves = set()

    for row_index, row in enumerate(board):
        for column_index, item in enumerate(row):
            if item == None:
                possible_moves.add((row_index, column_index))
    
    return possible_moves


def result(board, action):
    """
    Returns the board that results from making move (i, j) on the board.
    """
    player_move = player(board)

    new_board = deepcopy(board)
    i, j = action

    if board[i][j] != None:
        raise Exception
    else:
        new_board[i][j] = player_move

    return new_board


def winner(board):
    """
    Returns the winner of the game, if there is one.
    """
    for player in (X, O):
        # check vertical
            for row in board:
                if row == [player] * 3:
                    return player

        # check horizontal
            for i in range(3):
                column = [board[x][i] for x in range(3)]
                if column == [player] * 3:
                    return player
        
        # check diagonal
            if [board[i][i] for i in range(0, 3)] == [player] * 3:
                return player

            elif [board[i][~i] for i in range(0, 3)] == [player] * 3:
                return player
    return None
                               

def terminal(board):
    """
    Returns True if game is over, False otherwise.
    """
    # game is won by one of the players
    if winner(board) != None:
        return True

    # moves still possible
    for row in board:
        if EMPTY in row:
            return False

    # no possible moves
    return True


def utility(board):
    """
    Returns 1 if X has won the game, -1 if O has won, 0 otherwise.
    """

    win_player = winner(board)

    if win_player == X:
        return 1
    elif win_player == O:
        return -1
    else:
        return 0


def minimax(board):
    """
    Returns the optimal action for the current player on the board.
    """

    def max_value(board):
        optimal_move = ()
        if terminal(board):
            return utility(board), optimal_move
        else:
            v = -5
            for action in actions(board):
                minval = min_value(result(board, action))[0]
                if minval > v:
                    v = minval
                    optimal_move = action
            return v, optimal_move

    def min_value(board):
        optimal_move = ()
        if terminal(board):
            return utility(board), optimal_move
        else:
            v = 5
            for action in actions(board):
                maxval = max_value(result(board, action))[0]
                if maxval < v:
                    v = maxval
                    optimal_move = action
            return v, optimal_move

    curr_player = player(board)

    if terminal(board):
        return None

    if curr_player == X:
        return max_value(board)[1]

    else:
        return min_value(board)[1]


================================================
FILE: week1/knights/logic.py
================================================
import itertools


class Sentence():

    def evaluate(self, model):
        """Evaluates the logical sentence."""
        raise Exception("nothing to evaluate")

    def formula(self):
        """Returns string formula representing logical sentence."""
        return ""

    def symbols(self):
        """Returns a set of all symbols in the logical sentence."""
        return set()

    @classmethod
    def validate(cls, sentence):
        if not isinstance(sentence, Sentence):
            raise TypeError("must be a logical sentence")

    @classmethod
    def parenthesize(cls, s):
        """Parenthesizes an expression if not already parenthesized."""
        def balanced(s):
            """Checks if a string has balanced parentheses."""
            count = 0
            for c in s:
                if c == "(":
                    count += 1
                elif c == ")":
                    if count <= 0:
                        return False
                    count -= 1
            return count == 0
        if not len(s) or s.isalpha() or (
            s[0] == "(" and s[-1] == ")" and balanced(s[1:-1])
        ):
            return s
        else:
            return f"({s})"


class Symbol(Sentence):

    def __init__(self, name):
        self.name = name

    def __eq__(self, other):
        return isinstance(other, Symbol) and self.name == other.name

    def __hash__(self):
        return hash(("symbol", self.name))

    def __repr__(self):
        return self.name

    def evaluate(self, model):
        try:
            return bool(model[self.name])
        except KeyError:
            raise Exception(f"variable {self.name} not in model")

    def formula(self):
        return self.name

    def symbols(self):
        return {self.name}


class Not(Sentence):
    def __init__(self, operand):
        Sentence.validate(operand)
        self.operand = operand

    def __eq__(self, other):
        return isinstance(other, Not) and self.operand == other.operand

    def __hash__(self):
        return hash(("not", hash(self.operand)))

    def __repr__(self):
        return f"Not({self.operand})"

    def evaluate(self, model):
        return not self.operand.evaluate(model)

    def formula(self):
        return "¬" + Sentence.parenthesize(self.operand.formula())

    def symbols(self):
        return self.operand.symbols()


class And(Sentence):
    def __init__(self, *conjuncts):
        for conjunct in conjuncts:
            Sentence.validate(conjunct)
        self.conjuncts = list(conjuncts)

    def __eq__(self, other):
        return isinstance(other, And) and self.conjuncts == other.conjuncts

    def __hash__(self):
        return hash(
            ("and", tuple(hash(conjunct) for conjunct in self.conjuncts))
        )

    def __repr__(self):
        conjunctions = ", ".join(
            [str(conjunct) for conjunct in self.conjuncts]
        )
        return f"And({conjunctions})"

    def add(self, conjunct):
        Sentence.validate(conjunct)
        self.conjuncts.append(conjunct)

    def evaluate(self, model):
        return all(conjunct.evaluate(model) for conjunct in self.conjuncts)

    def formula(self):
        if len(self.conjuncts) == 1:
            return self.conjuncts[0].formula()
        return " ∧ ".join([Sentence.parenthesize(conjunct.formula())
                           for conjunct in self.conjuncts])

    def symbols(self):
        return set.union(*[conjunct.symbols() for conjunct in self.conjuncts])


class Or(Sentence):
    def __init__(self, *disjuncts):
        for disjunct in disjuncts:
            Sentence.validate(disjunct)
        self.disjuncts = list(disjuncts)

    def __eq__(self, other):
        return isinstance(other, Or) and self.disjuncts == other.disjuncts

    def __hash__(self):
        return hash(
            ("or", tuple(hash(disjunct) for disjunct in self.disjuncts))
        )

    def __repr__(self):
        disjuncts = ", ".join([str(disjunct) for disjunct in self.disjuncts])
        return f"Or({disjuncts})"

    def evaluate(self, model):
        return any(disjunct.evaluate(model) for disjunct in self.disjuncts)

    def formula(self):
        if len(self.disjuncts) == 1:
            return self.disjuncts[0].formula()
        return " ∨  ".join([Sentence.parenthesize(disjunct.formula())
                            for disjunct in self.disjuncts])

    def symbols(self):
        return set.union(*[disjunct.symbols() for disjunct in self.disjuncts])


class Implication(Sentence):
    def __init__(self, antecedent, consequent):
        Sentence.validate(antecedent)
        Sentence.validate(consequent)
        self.antecedent = antecedent
        self.consequent = consequent

    def __eq__(self, other):
        return (isinstance(other, Implication)
                and self.antecedent == other.antecedent
                and self.consequent == other.consequent)

    def __hash__(self):
        return hash(("implies", hash(self.antecedent), hash(self.consequent)))

    def __repr__(self):
        return f"Implication({self.antecedent}, {self.consequent})"

    def evaluate(self, model):
        return ((not self.antecedent.evaluate(model))
                or self.consequent.evaluate(model))

    def formula(self):
        antecedent = Sentence.parenthesize(self.antecedent.formula())
        consequent = Sentence.parenthesize(self.consequent.formula())
        return f"{antecedent} => {consequent}"

    def symbols(self):
        return set.union(self.antecedent.symbols(), self.consequent.symbols())


class Biconditional(Sentence):
    def __init__(self, left, right):
        Sentence.validate(left)
        Sentence.validate(right)
        self.left = left
        self.right = right

    def __eq__(self, other):
        return (isinstance(other, Biconditional)
                and self.left == other.left
                and self.right == other.right)

    def __hash__(self):
        return hash(("biconditional", hash(self.left), hash(self.right)))

    def __repr__(self):
        return f"Biconditional({self.left}, {self.right})"

    def evaluate(self, model):
        return ((self.left.evaluate(model)
                 and self.right.evaluate(model))
                or (not self.left.evaluate(model)
                    and not self.right.evaluate(model)))

    def formula(self):
        left = Sentence.parenthesize(str(self.left))
        right = Sentence.parenthesize(str(self.right))
        return f"{left} <=> {right}"

    def symbols(self):
        return set.union(self.left.symbols(), self.right.symbols())


def model_check(knowledge, query):
    """Checks if knowledge base entails query."""

    def check_all(knowledge, query, symbols, model):
        """Checks if knowledge base entails query, given a particular model."""

        # If model has an assignment for each symbol
        if not symbols:

            # If knowledge base is true in model, then query must also be true
            if knowledge.evaluate(model):
                return query.evaluate(model)
            return True
        else:

            # Choose one of the remaining unused symbols
            remaining = symbols.copy()
            p = remaining.pop()

            # Create a model where the symbol is true
            model_true = model.copy()
            model_true[p] = True

            # Create a model where the symbol is false
            model_false = model.copy()
            model_false[p] = False

            # Ensure entailment holds in both models
            return (check_all(knowledge, query, remaining, model_true) and
                    check_all(knowledge, query, remaining, model_false))

    # Get all symbols in both knowledge and query
    symbols = set.union(knowledge.symbols(), query.symbols())

    # Check that knowledge entails query
    return check_all(knowledge, query, symbols, dict())


================================================
FILE: week1/knights/puzzle.py
================================================
from logic import *

AKnight = Symbol("A is a Knight")
AKnave = Symbol("A is a Knave")

BKnight = Symbol("B is a Knight")
BKnave = Symbol("B is a Knave")

CKnight = Symbol("C is a Knight")
CKnave = Symbol("C is a Knave")

# Puzzle 0
# A says "I am both a knight and a knave."
knowledge0 = And(
    Not(And(AKnight, AKnave)),  # cannot be knight and knave at the same time
    Or(AKnight, AKnave),         # will be Knight or Knave
    Implication(AKnight, And(AKnight, AKnave)),
    Implication(AKnave, Not(And(AKnight, AKnave)))
)

# Puzzle 1
# A says "We are both knaves."
# B says nothing.
knowledge1 = And(
    Not(And(AKnight, AKnave)),  # cannot be knight and knave at the same time
    Or(AKnight, AKnave),        # will be Knight or Knave

    Not(And(BKnight, BKnave)),  # cannot be knight and knave at the same time
    Or(BKnight, BKnave),        # will be Knight or Knave

    # Or(And(AKnight, BKnave), And(AKnave, BKnight)), # A and B can't be the same figure

    Implication(AKnight, And(AKnave, BKnave)),
    Implication(AKnave, Not(And(AKnave, BKnave)))
)

# Puzzle 2
# A says "We are the same kind."
# B says "We are of different kinds."
knowledge2 = And(
    Not(And(AKnight, AKnave)),  # cannot be knight and knave at the same time
    Or(AKnight, AKnave),        # will be Knight or Knave

    Not(And(BKnight, BKnave)),  # cannot be knight and knave at the same time
    Or(BKnight, BKnave),        # will be Knight or Knave

    # Or(And(AKnight, BKnave), And(AKnave, BKnight)), # A and B can't be the same figure

    Implication(AKnight, And(AKnight, BKnight)),
    Implication(AKnave, Not(And(AKnave, BKnave))),

    Implication(BKnight, And(BKnight, AKnave)),
    Implication(BKnave, Not(And(BKnave, AKnight)))
)

# Puzzle 3
# A says either "I am a knight." or "I am a knave.", but you don't know which.
# B says "A said 'I am a knave'."
# B says "C is a knave."
# C says "A is a knight."
knowledge3 = And(
    Not(And(AKnight, AKnave)),  # A cannot be knight and knave at the same time
    Or(AKnight, AKnave),        # A will be Knight or Knave

    Not(And(BKnight, BKnave)),  # B cannot be knight and knave at the same time
    Or(BKnight, BKnave),        # B will be Knight or Knave

    Not(And(CKnight, CKnave)),  # C cannot be knight and knave at the same time
    Or(CKnight, CKnave),        # C will be Knight or Knave

    # A says either "I am a knight." or "I am a knave.", but you don't know which.
    Or(
        # "I am a knight."
        And(
            Implication(AKnight, AKnight),
            Implication(AKnave, Not(AKnight))
        ),
        
        # "I am a knave."
        And(
            Implication(AKnight, AKnave),
            Implication(AKnave, Not(AKnave))
        )
    ),

    Not(And(
        # "I am a knight."
        And(
            Implication(AKnight, AKnight),
            Implication(AKnave, Not(AKnight))
        ),
        
        # "I am a knave."
        And(
            Implication(AKnight, AKnave),
            Implication(AKnave, Not(AKnave))
        )
    )),

    # B says "A said 'I am a knave'."
    Implication(BKnight, And(
        Implication(AKnight, AKnave),
        Implication(AKnave, Not(AKnave))
    )),

    Implication(BKnave, Not(And(
        Implication(AKnight, AKnave),
        Implication(AKnave, Not(AKnave))
    ))),


    # B says "C is a knave."
    Implication(BKnight, CKnave),
    Implication(BKnave, Not(CKnave)),

    # C says "A is a knight."
    Implication(CKnight, AKnight),
    Implication(CKnave, Not(AKnight))
)


def main():
    symbols = [AKnight, AKnave, BKnight, BKnave, CKnight, CKnave]
    puzzles = [
        ("Puzzle 0", knowledge0),
        ("Puzzle 1", knowledge1),
        ("Puzzle 2", knowledge2),
        ("Puzzle 3", knowledge3)
    ]
    for puzzle, knowledge in puzzles:
        print(puzzle)
        if len(knowledge.conjuncts) == 0:
            print("    Not yet implemented.")
        else:
            for symbol in symbols:
                if model_check(knowledge, symbol):
                    print(f"    {symbol}")


if __name__ == "__main__":
    main()


================================================
FILE: week1/minesweeper/minesweeper.py
================================================
import itertools
import random
import copy


class Minesweeper():
    """
    Minesweeper game representation
    """

    def __init__(self, height=8, width=8, mines=8):

        # Set initial width, height, and number of mines
        self.height = height
        self.width = width
        self.mines = set()

        # Initialize an empty field with no mines
        self.board = []
        for i in range(self.height):
            row = []
            for j in range(self.width):
                row.append(False)
            self.board.append(row)

        # Add mines randomly
        while len(self.mines) != mines:
            i = random.randrange(height)
            j = random.randrange(width)
            if not self.board[i][j]:
                self.mines.add((i, j))
                self.board[i][j] = True

        # At first, player has found no mines
        self.mines_found = set()

    def print(self):
        """
        Prints a text-based representation
        of where mines are located.
        """
        for i in range(self.height):
            print("--" * self.width + "-")
            for j in range(self.width):
                if self.board[i][j]:
                    print("|X", end="")
                else:
                    print("| ", end="")
            print("|")
        print("--" * self.width + "-")

    def is_mine(self, cell):
        i, j = cell
        return self.board[i][j]

    def nearby_mines(self, cell):
        """
        Returns the number of mines that are
        within one row and column of a given cell,
        not including the cell itself.
        """

        # Keep count of nearby mines
        count = 0

        # Loop over all cells within one row and column
        for i in range(cell[0] - 1, cell[0] + 2):
            for j in range(cell[1] - 1, cell[1] + 2):

                # Ignore the cell itself
                if (i, j) == cell:
                    continue

                # Update count if cell in bounds and is mine
                if 0 <= i < self.height and 0 <= j < self.width:
                    if self.board[i][j]:
                        count += 1

        return count

    def won(self):
        """
        Checks if all mines have been flagged.
        """
        return self.mines_found == self.mines


class Sentence():
    """
    Logical statement about a Minesweeper game
    A sentence consists of a set of board cells,
    and a count of the number of those cells which are mines.
    """

    def __init__(self, cells, count):
        self.cells = set(cells)
        self.count = count

    def __eq__(self, other):
        return self.cells == other.cells and self.count == other.count

    def __str__(self):
        return f"{self.cells} = {self.count}"

    def known_mines(self):
        """
        Returns the set of all cells in self.cells known to be mines.
        """
        if self.count == len(self.cells):
            return self.cells

    def known_safes(self):
        """
        Returns the set of all cells in self.cells known to be safe.
        """
        if self.count == 0:
            return self.cells

    def mark_mine(self, cell):
        """
        Updates internal knowledge representation given the fact that
        a cell is known to be a mine.
        """
        if cell in self.cells:
            self.cells.remove(cell)
            self.count -= 1
        else:
            pass

    def mark_safe(self, cell):
        """
        Updates internal knowledge representation given the fact that
        a cell is known to be safe.
        """
        if cell in self.cells:
            self.cells.remove(cell)
        else:
            pass


class MinesweeperAI():
    """
    Minesweeper game player
    """

    def __init__(self, height=8, width=8):

        # Set initial height and width
        self.height = height
        self.width = width

        # Keep track of which cells have been clicked on
        self.moves_made = set()

        # Keep track of cells known to be safe or mines
        self.mines = set()
        self.safes = set()

        # List of sentences about the game known to be true
        self.knowledge = []

    def mark_mine(self, cell):
        """
        Marks a cell as a mine, and updates all knowledge
        to mark that cell as a mine as well.
        """
        self.mines.add(cell)
        for sentence in self.knowledge:
            sentence.mark_mine(cell)

    def mark_safe(self, cell):
        """
        Marks a cell as safe, and updates all knowledge
        to mark that cell as safe as well.
        """
        self.safes.add(cell)
        for sentence in self.knowledge:
            sentence.mark_safe(cell)

    def add_knowledge(self, cell, count):
        """
        Called when the Minesweeper board tells us, for a given
        safe cell, how many neighboring cells have mines in them.

        This function should:
            1) mark the cell as a move that has been made
            2) mark the cell as safe
            3) add a new sentence to the AI's knowledge base
               based on the value of `cell` and `count`
            4) mark any additional cells as safe or as mines
               if it can be concluded based on the AI's knowledge base
            5) add any new sentences to the AI's knowledge base
               if they can be inferred from existing knowledge
        """

        # mark the cell as one of the moves made in the game
        self.moves_made.add(cell)

        # mark the cell as a safe cell, updating any sequences that contain the cell as well
        self.mark_safe(cell)

        # add new sentence to AI knowledge base based on value of cell and count
        cells = set()
        count_cpy = copy.deepcopy(count)
        close_cells = self.return_close_cells(cell)     # returns neighbour cells
        for cl in close_cells:
            if cl in self.mines:
                count_cpy -= 1
            if cl not in self.mines | self.safes:
                cells.add(cl)                           # only add cells that are of unknown state

        new_sentence = Sentence(cells, count_cpy)           # prepare new sentence

        if len(new_sentence.cells) > 0:                 # add that sentence to knowledge only if it is not empty
            self.knowledge.append(new_sentence)
            # print(f"Adding new sentence: {new_sentence}")

        # # print("Printing knowledge:")
        # for sent in self.knowledge:
        #     # print(sent)

        # check sentences for new cells that could be marked as safe or as mine
        self.check_knowledge()
        # print(f"Safe cells: {self.safes - self.moves_made}")
        # print(f"Mine cells: {self.mines}")
        # print("------------")

        self.extra_inference()

    def return_close_cells(self, cell):
        """
        returns cell that are 1 cell away from cell passed in arg
        """
        # returns cells close to arg cell by 1 cell
        close_cells = set()
        for rows in range(self.height):
            for columns in range(self.width):
                if abs(cell[0] - rows) <= 1 and abs(cell[1] - columns) <= 1 and (rows, columns) != cell:
                    close_cells.add((rows, columns))
        return close_cells

    def check_knowledge(self):
        """
        check knowledge for new safes and mines, updates knowledge if possible
        """
        # copies the knowledge to operate on copy
        knowledge_copy = copy.deepcopy(self.knowledge)
        # iterates through sentences

        for sentence in knowledge_copy:
            if len(sentence.cells) == 0:
                try:
                    self.knowledge.remove(sentence)
                except ValueError:
                    pass
            # check for possible mines and safes
            mines = sentence.known_mines()
            safes = sentence.known_safes()

            # update knowledge if mine or safe was found
            if mines:
                for mine in mines:
                    # print(f"Marking {mine} as mine")
                    self.mark_mine(mine)
                    self.check_knowledge()
            if safes:
                for safe in safes:
                    # print(f"Marking {safe} as safe")
                    self.mark_safe(safe)
                    self.check_knowledge()

    def extra_inference(self):
        """
        update knowledge based on inference
        """
        # iterate through pairs of sentences
        for sentence1 in self.knowledge:
            for sentence2 in self.knowledge:
                # check if sentence 1 is subset of sentence 2
                if sentence1.cells.issubset(sentence2.cells):
                    new_cells = sentence2.cells - sentence1.cells
                    new_count = sentence2.count - sentence1.count
                    new_sentence = Sentence(new_cells, new_count)
                    mines = new_sentence.known_mines()
                    safes = new_sentence.known_safes()
                    if mines:
                        for mine in mines:
                            # print(f"Used inference to mark mine: {mine}")
                            # print(f"FinalSen: {new_sentence}")
                            # print(f"Sent1: {sent1copy}")
                            # print(f"Sent2: {sent2copy}")
                            self.mark_mine(mine)

                    if safes:
                        for safe in safes:
                            # print(f"Used inference to mark safe: {safe}")
                            # print(f"FinalSen: {new_sentence}")
                            # print(f"Sent1: {sent1copy}")
                            # print(f"Sent2: {sent2copy}")
                            self.mark_safe(safe)

    def make_safe_move(self):
        """
        Returns a safe cell to choose on the Minesweeper board.
        The move must be known to be safe, and not already a move
        that has been made.

        This function may use the knowledge in self.mines, self.safes
        and self.moves_made, but should not modify any of those values.
        """
        for i in self.safes - self.moves_made:
            # choose first safe cell that wasn't picked before
            # print(f"Making {i} move")
            return i
        
        return None

    def make_random_move(self):
        """
        Returns a move to make on the Minesweeper board.
        Should choose randomly among cells that:
            1) have not already been chosen, and
            2) are not known to be mines
        """

        maxmoves = self.width * self.height

        while maxmoves > 0:
            maxmoves -= 1

            row = random.randrange(self.height)
            column = random.randrange(self.width)

            if (row, column) not in self.moves_made | self.mines:
                return (row, column)

        return None


================================================
FILE: week1/minesweeper/requirements.txt
================================================
pygame


================================================
FILE: week1/minesweeper/runner.py
================================================
import pygame
import sys
import time

from minesweeper import Minesweeper, MinesweeperAI

HEIGHT = 8
WIDTH = 8
MINES = 8

# Colors
BLACK = (0, 0, 0)
GRAY = (180, 180, 180)
WHITE = (255, 255, 255)

# Create game
pygame.init()
size = width, height = 600, 400
screen = pygame.display.set_mode(size)

# Fonts
OPEN_SANS = "assets/fonts/OpenSans-Regular.ttf"
smallFont = pygame.font.Font(OPEN_SANS, 20)
mediumFont = pygame.font.Font(OPEN_SANS, 28)
largeFont = pygame.font.Font(OPEN_SANS, 40)

# Compute board size
BOARD_PADDING = 20
board_width = ((2 / 3) * width) - (BOARD_PADDING * 2)
board_height = height - (BOARD_PADDING * 2)
cell_size = int(min(board_width / WIDTH, board_height / HEIGHT))
board_origin = (BOARD_PADDING, BOARD_PADDING)

# Add images
flag = pygame.image.load("assets/images/flag.png")
flag = pygame.transform.scale(flag, (cell_size, cell_size))
mine = pygame.image.load("assets/images/mine.png")
mine = pygame.transform.scale(mine, (cell_size, cell_size))

# Create game and AI agent
game = Minesweeper(height=HEIGHT, width=WIDTH, mines=MINES)
ai = MinesweeperAI(height=HEIGHT, width=WIDTH)

# Keep track of revealed cells, flagged cells, and if a mine was hit
revealed = set()
flags = set()
lost = False

# Show instructions initially
instructions = True

while True:

    # Check if game quit
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()

    screen.fill(BLACK)

    # Show game instructions
    if instructions:

        # Title
        title = largeFont.render("Play Minesweeper", True, WHITE)
        titleRect = title.get_rect()
        titleRect.center = ((width / 2), 50)
        screen.blit(title, titleRect)

        # Rules
        rules = [
            "Click a cell to reveal it.",
            "Right-click a cell to mark it as a mine.",
            "Mark all mines successfully to win!"
        ]
        for i, rule in enumerate(rules):
            line = smallFont.render(rule, True, WHITE)
            lineRect = line.get_rect()
            lineRect.center = ((width / 2), 150 + 30 * i)
            screen.blit(line, lineRect)

        # Play game button
        buttonRect = pygame.Rect((width / 4), (3 / 4) * height, width / 2, 50)
        buttonText = mediumFont.render("Play Game", True, BLACK)
        buttonTextRect = buttonText.get_rect()
        buttonTextRect.center = buttonRect.center
        pygame.draw.rect(screen, WHITE, buttonRect)
        screen.blit(buttonText, buttonTextRect)

        # Check if play button clicked
        click, _, _ = pygame.mouse.get_pressed()
        if click == 1:
            mouse = pygame.mouse.get_pos()
            if buttonRect.collidepoint(mouse):
                instructions = False
                time.sleep(0.3)

        pygame.display.flip()
        continue

    # Draw board
    cells = []
    for i in range(HEIGHT):
        row = []
        for j in range(WIDTH):

            # Draw rectangle for cell
            rect = pygame.Rect(
                board_origin[0] + j * cell_size,
                board_origin[1] + i * cell_size,
                cell_size, cell_size
            )
            pygame.draw.rect(screen, GRAY, rect)
            pygame.draw.rect(screen, WHITE, rect, 3)

            # Add a mine, flag, or number if needed
            if game.is_mine((i, j)) and lost:
                screen.blit(mine, rect)
            elif (i, j) in flags:
                screen.blit(flag, rect)
            elif (i, j) in revealed:
                neighbors = smallFont.render(
                    str(game.nearby_mines((i, j))),
                    True, BLACK
                )
                neighborsTextRect = neighbors.get_rect()
                neighborsTextRect.center = rect.center
                screen.blit(neighbors, neighborsTextRect)

            row.append(rect)
        cells.append(row)

    # AI Move button
    aiButton = pygame.Rect(
        (2 / 3) * width + BOARD_PADDING, (1 / 3) * height - 50,
        (width / 3) - BOARD_PADDING * 2, 50
    )
    buttonText = mediumFont.render("AI Move", True, BLACK)
    buttonRect = buttonText.get_rect()
    buttonRect.center = aiButton.center
    pygame.draw.rect(screen, WHITE, aiButton)
    screen.blit(buttonText, buttonRect)

    # Reset button
    resetButton = pygame.Rect(
        (2 / 3) * width + BOARD_PADDING, (1 / 3) * height + 20,
        (width / 3) - BOARD_PADDING * 2, 50
    )
    buttonText = mediumFont.render("Reset", True, BLACK)
    buttonRect = buttonText.get_rect()
    buttonRect.center = resetButton.center
    pygame.draw.rect(screen, WHITE, resetButton)
    screen.blit(buttonText, buttonRect)

    # Display text
    text = "Lost" if lost else "Won" if game.mines == flags else ""
    text = mediumFont.render(text, True, WHITE)
    textRect = text.get_rect()
    textRect.center = ((5 / 6) * width, (2 / 3) * height)
    screen.blit(text, textRect)

    move = None

    left, _, right = pygame.mouse.get_pressed()

    # Check for a right-click to toggle flagging
    if right == 1 and not lost:
        mouse = pygame.mouse.get_pos()
        for i in range(HEIGHT):
            for j in range(WIDTH):
                if cells[i][j].collidepoint(mouse) and (i, j) not in revealed:
                    if (i, j) in flags:
                        flags.remove((i, j))
                    else:
                        flags.add((i, j))
                    time.sleep(0.2)

    elif left == 1:
        mouse = pygame.mouse.get_pos()

        # If AI button clicked, make an AI move
        if aiButton.collidepoint(mouse) and not lost:
            move = ai.make_safe_move()
            if move is None:
                move = ai.make_random_move()
                if move is None:
                    flags = ai.mines.copy()
                    print("No moves left to make.")
                else:
                    print("No known safe moves, AI making random move.")
            else:
                print("AI making safe move.")
            time.sleep(0.2)

        # Reset game state
        elif resetButton.collidepoint(mouse):
            game = Minesweeper(height=HEIGHT, width=WIDTH, mines=MINES)
            ai = MinesweeperAI(height=HEIGHT, width=WIDTH)
            revealed = set()
            flags = set()
            lost = False
            continue

        # User-made move
        elif not lost:
            for i in range(HEIGHT):
                for j in range(WIDTH):
                    if (cells[i][j].collidepoint(mouse)
                            and (i, j) not in flags
                            and (i, j) not in revealed):
                        move = (i, j)

    # Make move and update AI knowledge
    if move:
        if game.is_mine(move):
            lost = True
        else:
            nearby = game.nearby_mines(move)
            revealed.add(move)
            ai.add_knowledge(move, nearby)

    pygame.display.flip()


================================================
FILE: week2/heredity/heredity.py
================================================
import csv
import itertools
import sys

PROBS = {

    # Unconditional probabilities for having gene
    "gene": {
        2: 0.01,
        1: 0.03,
        0: 0.96
    },

    "trait": {

        # Probability of trait given two copies of gene
        2: {
            True: 0.65,
            False: 0.35
        },

        # Probability of trait given one copy of gene
        1: {
            True: 0.56,
            False: 0.44
        },

        # Probability of trait given no gene
        0: {
            True: 0.01,
            False: 0.99
        }
    },

    # Mutation probability
    "mutation": 0.01
}


def main():

    # Check for proper usage
    if len(sys.argv) != 2:
        sys.exit("Usage: python heredity.py data.csv")
    people = load_data(sys.argv[1])

    # Keep track of gene and trait probabilities for each person
    probabilities = {
        person: {
            "gene": {
                2: 0,
                1: 0,
                0: 0
            },
            "trait": {
                True: 0,
                False: 0
            }
        }
        for person in people
    }

    # Loop over all sets of people who might have the trait
    names = set(people)
    for have_trait in powerset(names):

        # Check if current set of people violates known information
        fails_evidence = any(
            (people[person]["trait"] is not None and
             people[person]["trait"] != (person in have_trait))
            for person in names
        )
        if fails_evidence:
            continue

        # Loop over all sets of people who might have the gene
        for one_gene in powerset(names):
            for two_genes in powerset(names - one_gene):

                # Update probabilities with new joint probability
                p = joint_probability(people, one_gene, two_genes, have_trait)
                update(probabilities, one_gene, two_genes, have_trait, p)

    # Ensure probabilities sum to 1
    normalize(probabilities)

    # Print results
    for person in people:
        print(f"{person}:")
        for field in probabilities[person]:
            print(f"  {field.capitalize()}:")
            for value in probabilities[person][field]:
                p = probabilities[person][field][value]
                print(f"    {value}: {p:.4f}")


def load_data(filename):
    """
    Load gene and trait data from a file into a dictionary.
    File assumed to be a CSV containing fields name, mother, father, trait.
    mother, father must both be blank, or both be valid names in the CSV.
    trait should be 0 or 1 if trait is known, blank otherwise.
    """
    data = dict()
    with open(filename) as f:
        reader = csv.DictReader(f)
        for row in reader:
            name = row["name"]
            data[name] = {
                "name": name,
                "mother": row["mother"] or None,
                "father": row["father"] or None,
                "trait": (True if row["trait"] == "1" else
                          False if row["trait"] == "0" else None)
            }
    return data


def powerset(s):
    """
    Return a list of all possible subsets of set s.
    """
    s = list(s)
    return [
        set(s) for s in itertools.chain.from_iterable(
            itertools.combinations(s, r) for r in range(len(s) + 1)
        )
    ]


def joint_probability(people, one_gene, two_genes, have_trait):
    """
    Compute and return a joint probability.

    The probability returned should be the probability that
        * everyone in set `one_gene` has one copy of the gene, and
        * everyone in set `two_genes` has two copies of the gene, and
        * everyone not in `one_gene` or `two_gene` does not have the gene, and
        * everyone in set `have_trait` has the trait, and
        * everyone not in set` have_trait` does not have the trait.
    """
    probability = 1

    for person in people:
        gene_number = 1 if person in one_gene else 2 if person in two_genes else 0
        trait = True if person in have_trait else False

        gene_numb_prop = PROBS['gene'][gene_number]
        trait_prop = PROBS['trait'][gene_number][trait]

        if people[person]['mother'] is None:
            # no parents, use probability distribution
            probability *= gene_numb_prop * trait_prop
        else:
            # info about parents is available
            mother = people[person]['mother']
            father = people[person]['father']
            percentages = {}

            for ppl in [mother, father]:
                number = 1 if ppl in one_gene else 2 if ppl in two_genes else 0
                perc = 0 + PROBS['mutation'] if number == 0 else 0.5 if number == 1 else 1 - PROBS['mutation']
                percentages[ppl] = perc

            if gene_number == 0:
                # 0, none of parents gave gene
                probability *= (1 - percentages[mother]) * (1 - percentages[father])
            elif gene_number == 1:
                # 1, one of parents gave gene
                probability *= (1 - percentages[mother]) * percentages[father] + percentages[mother] * (1 - percentages[father])
            else:
                # 2, both of parents gave gene
                probability *= percentages[mother] * percentages[father]

            probability *= trait_prop

    return probability


def update(probabilities, one_gene, two_genes, have_trait, p):
    """
    Add to `probabilities` a new joint probability `p`.
    Each person should have their "gene" and "trait" distributions updated.
    Which value for each distribution is updated depends on whether
    the person is in `have_gene` and `have_trait`, respectively.
    """
    for person in probabilities:
        gene_number = 1 if person in one_gene else 2 if person in two_genes else 0
        probabilities[person]["gene"][gene_number] += p
        probabilities[person]["trait"][person in have_trait] += p


def normalize(probabilities):
    """
    Update `probabilities` such that each probability distribution
    is normalized (i.e., sums to 1, with relative proportions the same).
    """
    normalized = probabilities.copy()
    for person in probabilities:
        for typ in ['gene', 'trait']:
            summed = sum(probabilities[person][typ].values())
            for category in probabilities[person][typ]:
                val = probabilities[person][typ][category]
                normalized_val = val / summed
                normalized[person][typ][category] = normalized_val
    return normalized


if __name__ == "__main__":
    main()


================================================
FILE: week2/pagerank/pagerank.py
================================================
import os
import random
import re
import sys

DAMPING = 0.85
SAMPLES = 10000


def main():
    if len(sys.argv) != 2:
        sys.exit("Usage: python pagerank.py corpus")
    corpus = crawl(sys.argv[1])
    ranks = sample_pagerank(corpus, DAMPING, SAMPLES)
    print(f"PageRank Results from Sampling (n = {SAMPLES})")
    for page in sorted(ranks):
        print(f"  {page}: {ranks[page]:.4f}")
    ranks = iterate_pagerank(corpus, DAMPING)
    print(f"PageRank Results from Iteration")
    for page in sorted(ranks):
        print(f"  {page}: {ranks[page]:.4f}")


def crawl(directory):
    """
    Parse a directory of HTML pages and check for links to other pages.
    Return a dictionary where each key is a page, and values are
    a list of all other pages in the corpus that are linked to by the page.
    """
    pages = dict()

    # Extract all links from HTML files
    for filename in os.listdir(directory):
        if not filename.endswith(".html"):
            continue
        with open(os.path.join(directory, filename)) as f:
            contents = f.read()
            links = re.findall(r"<a\s+(?:[^>]*?)href=\"([^\"]*)\"", contents)
            pages[filename] = set(links) - {filename}

    # Only include links to other pages in the corpus
    for filename in pages:
        pages[filename] = set(
            link for link in pages[filename]
            if link in pages
        )

    return pages


def transition_model(corpus, page, damping_factor):
    """
    Return a probability distribution over which page to visit next,
    given a current page.

    With probability `damping_factor`, choose a link at random
    linked to by `page`. With probability `1 - damping_factor`, choose
    a link at random chosen from all pages in the corpus.
    """

    prop_dist = {}

    # check if page has outgoing links
    dict_len = len(corpus.keys())
    pages_len = len(corpus[page])

    if len(corpus[page]) < 1:
        # no outgoing pages, choosing randomly from all possible pages
        for key in corpus.keys():
            prop_dist[key] = 1 / dict_len

    else:
        # there are outgoing pages, calculating distribution
        random_factor = (1 - damping_factor) / dict_len
        even_factor = damping_factor / pages_len

        for key in corpus.keys():
            if key not in corpus[page]:
                prop_dist[key] = random_factor
            else:
                prop_dist[key] = even_factor + random_factor

    return prop_dist


def sample_pagerank(corpus, damping_factor, n):
    """
    Return PageRank values for each page by sampling `n` pages
    according to transition model, starting with a page at random.

    Return a dictionary where keys are page names, and values are
    their estimated PageRank value (a value between 0 and 1). All
    PageRank values should sum to 1.
    """

    # prepare dictionary with number of samples == 0
    samples_dict = corpus.copy()
    for i in samples_dict:
        samples_dict[i] = 0
    sample = None

    # itearting n times
    for _ in range(n):
        if sample:
            # previous sample is available, choosing using transition model
            dist = transition_model(corpus, sample, damping_factor)
            dist_lst = list(dist.keys())
            dist_weights = [dist[i] for i in dist]
            sample = random.choices(dist_lst, dist_weights, k=1)[0]
        else:
            # no previous sample, choosing randomly
            sample = random.choice(list(corpus.keys()))

        # count each sample
        samples_dict[sample] += 1

    # turn sample count to percentage
    for item in samples_dict:
        samples_dict[item] /= n

    return samples_dict


def iterate_pagerank(corpus, damping_factor):
    """
    Return PageRank values for each page by iteratively updating
    PageRank values until convergence.

    Return a dictionary where keys are page names, and values are
    their estimated PageRank value (a value between 0 and 1). All
    PageRank values should sum to 1.
    """
    pages_number = len(corpus)
    old_dict = {}
    new_dict = {}

    # assigning each page a rank of 1/n, where n is total number of pages in the corpus
    for page in corpus:
        old_dict[page] = 1 / pages_number

    # repeatedly calculating new rank values basing on all of the current rank values
    while True:
        for page in corpus:
            temp = 0
            for linking_page in corpus:
                # check if page links to our page
                if page in corpus[linking_page]:
                    temp += (old_dict[linking_page] / len(corpus[linking_page]))
                # if page has no links, interpret it as having one link for every other page
                if len(corpus[linking_page]) == 0:
                    temp += (old_dict[linking_page]) / len(corpus)
            temp *= damping_factor
            temp += (1 - damping_factor) / pages_number

            new_dict[page] = temp

        difference = max([abs(new_dict[x] - old_dict[x]) for x in old_dict])
        if difference < 0.001:
            break
        else:
            old_dict = new_dict.copy()

    return old_dict

if __name__ == "__main__":
    main()


================================================
FILE: week3/crossword/crossword.py
================================================
class Variable():

    ACROSS = "across"
    DOWN = "down"

    def __init__(self, i, j, direction, length):
        """Create a new variable with starting point, direction, and length."""
        self.i = i
        self.j = j
        self.direction = direction
        self.length = length
        self.cells = []
        for k in range(self.length):
            self.cells.append(
                (self.i + (k if self.direction == Variable.DOWN else 0),
                 self.j + (k if self.direction == Variable.ACROSS else 0))
            )

    def __hash__(self):
        return hash((self.i, self.j, self.direction, self.length))

    def __eq__(self, other):
        return (
            (self.i == other.i) and
            (self.j == other.j) and
            (self.direction == other.direction) and
            (self.length == other.length)
        )

    def __str__(self):
        return f"({self.i}, {self.j}) {self.direction} : {self.length}"

    def __repr__(self):
        direction = repr(self.direction)
        return f"Variable({self.i}, {self.j}, {direction}, {self.length})"


class Crossword():

    def __init__(self, structure_file, words_file):

        # Determine structure of crossword
        with open(structure_file) as f:
            contents = f.read().splitlines()
            self.height = len(contents)
            self.width = max(len(line) for line in contents)

            self.structure = []
            for i in range(self.height):
                row = []
                for j in range(self.width):
                    if j >= len(contents[i]):
                        row.append(False)
                    elif contents[i][j] == "_":
                        row.append(True)
                    else:
                        row.append(False)
                self.structure.append(row)

        # Save vocabulary list
        with open(words_file) as f:
            self.words = set(f.read().upper().splitlines())

        # Determine variable set
        self.variables = set()
        for i in range(self.height):
            for j in range(self.width):

                # Vertical words
                starts_word = (
                    self.structure[i][j]
                    and (i == 0 or not self.structure[i - 1][j])
                )
                if starts_word:
                    length = 1
                    for k in range(i + 1, self.height):
                        if self.structure[k][j]:
                            length += 1
                        else:
                            break
                    if length > 1:
                        self.variables.add(Variable(
                            i=i, j=j,
                            direction=Variable.DOWN,
                            length=length
                        ))

                # Horizontal words
                starts_word = (
                    self.structure[i][j]
                    and (j == 0 or not self.structure[i][j - 1])
                )
                if starts_word:
                    length = 1
                    for k in range(j + 1, self.width):
                        if self.structure[i][k]:
                            length += 1
                        else:
                            break
                    if length > 1:
                        self.variables.add(Variable(
                            i=i, j=j,
                            direction=Variable.ACROSS,
                            length=length
                        ))

        # Compute overlaps for each word
        # For any pair of variables v1, v2, their overlap is either:
        #    None, if the two variables do not overlap; or
        #    (i, j), where v1's ith character overlaps v2's jth character
        self.overlaps = dict()
        for v1 in self.variables:
            for v2 in self.variables:
                if v1 == v2:
                    continue
                cells1 = v1.cells
                cells2 = v2.cells
                intersection = set(cells1).intersection(cells2)
                if not intersection:
                    self.overlaps[v1, v2] = None
                else:
                    intersection = intersection.pop()
                    self.overlaps[v1, v2] = (
                        cells1.index(intersection),
                        cells2.index(intersection)
                    )

    def neighbors(self, var):
        """Given a variable, return set of overlapping variables."""
        return set(
            v for v in self.variables
            if v != var and self.overlaps[v, var]
        )


================================================
FILE: week3/crossword/data/structure0.txt
================================================
#___#
#_##_
#_##_
#_##_
#____


================================================
FILE: week3/crossword/data/structure1.txt
================================================
##############
#######_####_#
#____________#
#_#####_####_#
#_##_____###_#
#_#####_####_#
#_###______#_#
#######_####_#
##############


================================================
FILE: week3/crossword/data/structure2.txt
================================================
######_
____##_
_##____
_##_##_
_##_##_
#___##_


================================================
FILE: week3/crossword/data/words0.txt
================================================
one
two
three
four
five
six
seven
eight
nine
ten


================================================
FILE: week3/crossword/data/words1.txt
================================================
adversarial
alpha
arc
artificial
bayes
beta
bit
breadth
byte
classification
classify
condition
constraint
create
depth
distribution
end
false
graph
heuristic
infer
inference
initial
intelligence
knowledge
language
learning
line
logic
loss
markov
minimax
network
neural
node
optimization
probability
proposition
prune
reason
recurrent
regression
resolution
resolve
satisfaction
search
sine
start
true
truth
uncertainty


================================================
FILE: week3/crossword/data/words2.txt
================================================
a
abandon
ability
able
abortion
about
above
abroad
absence
absolute
absolutely
absorb
abuse
academic
accept
access
accident
accompany
accomplish
according
account
accurate
accuse
achieve
achievement
acid
acknowledge
acquire
across
act
action
active
activist
activity
actor
actress
actual
actually
ad
adapt
add
addition
additional
address
adequate
adjust
adjustment
administration
administrator
admire
admission
admit
adolescent
adopt
adult
advance
advanced
advantage
adventure
advertising
advice
advise
adviser
advocate
affair
affect
afford
afraid
African
African-American
after
afternoon
again
against
age
agency
agenda
agent
aggressive
ago
agree
agreement
agricultural
ah
ahead
aid
aide
AIDS
aim
air
aircraft
airline
airport
album
alcohol
alive
all
alliance
allow
ally
almost
alone
along
already
also
alter
alternative
although
always
AM
amazing
American
among
amount
analysis
analyst
analyze
ancient
and
anger
angle
angry
animal
anniversary
announce
annual
another
answer
anticipate
anxiety
any
anybody
anymore
anyone
anything
anyway
anywhere
apart
apartment
apparent
apparently
appeal
appear
appearance
apple
application
apply
appoint
appointment
appreciate
approach
appropriate
approval
approve
approximately
Arab
architect
area
argue
argument
arise
arm
armed
army
around
arrange
arrangement
arrest
arrival
arrive
art
article
artist
artistic
as
Asian
aside
ask
asleep
aspect
assault
assert
assess
assessment
asset
assign
assignment
assist
assistance
assistant
associate
association
assume
assumption
assure
at
athlete
athletic
atmosphere
attach
attack
attempt
attend
attention
attitude
attorney
attract
attractive
attribute
audience
author
authority
auto
available
average
avoid
award
aware
awareness
away
awful
baby
back
background
bad
badly
bag
bake
balance
ball
ban
band
bank
bar
barely
barrel
barrier
base
baseball
basic
basically
basis
basket
basketball
bathroom
battery
battle
be
beach
bean
bear
beat
beautiful
beauty
because
become
bed
bedroom
beer
before
begin
beginning
behavior
behind
being
belief
believe
bell
belong
below
belt
bench
bend
beneath
benefit
beside
besides
best
bet
better
between
beyond
Bible
big
bike
bill
billion
bind
biological
bird
birth
birthday
bit
bite
black
blade
blame
blanket
blind
block
blood
blow
blue
board
boat
body
bomb
bombing
bond
bone
book
boom
boot
border
born
borrow
boss
both
bother
bottle
bottom
boundary
bowl
box
boy
boyfriend
brain
branch
brand
bread
break
breakfast
breast
breath
breathe
brick
bridge
brief
briefly
bright
brilliant
bring
British
broad
broken
brother
brown
brush
buck
budget
build
building
bullet
bunch
burden
burn
bury
bus
business
busy
but
butter
button
buy
buyer
by
cabin
cabinet
cable
cake
calculate
call
camera
camp
campaign
campus
can
Canadian
cancer
candidate
cap
capability
capable
capacity
capital
captain
capture
car
carbon
card
care
career
careful
carefully
carrier
carry
case
cash
cast
cat
catch
category
Catholic
cause
ceiling
celebrate
celebration
celebrity
cell
center
central
century
CEO
ceremony
certain
certainly
chain
chair
chairman
challenge
chamber
champion
championship
chance
change
changing
channel
chapter
character
characteristic
characterize
charge
charity
chart
chase
cheap
check
cheek
cheese
chef
chemical
chest
chicken
chief
child
childhood
Chinese
chip
chocolate
choice
cholesterol
choose
Christian
Christmas
church
cigarette
circle
circumstance
cite
citizen
city
civil
civilian
claim
class
classic
classroom
clean
clear
clearly
client
climate
climb
clinic
clinical
clock
close
closely
closer
clothes
clothing
cloud
club
clue
cluster
coach
coal
coalition
coast
coat
code
coffee
cognitive
cold
collapse
colleague
collect
collection
collective
college
colonial
color
column
combination
combine
come
comedy
comfort
comfortable
command
commander
comment
commercial
commission
commit
commitment
committee
common
communicate
communication
community
company
compare
comparison
compete
competition
competitive
competitor
complain
complaint
complete
completely
complex
complicated
component
compose
composition
comprehensive
computer
concentrate
concentration
concept
concern
concerned
concert
conclude
conclusion
concrete
condition
conduct
conference
confidence
confident
confirm
conflict
confront
confusion
Congress
congressional
connect
connection
consciousness
consensus
consequence
conservative
consider
considerable
consideration
consist
consistent
constant
constantly
constitute
constitutional
construct
construction
consultant
consume
consumer
consumption
contact
contain
container
contemporary
content
contest
context
continue
continued
contract
contrast
contribute
contribution
control
controversial
controversy
convention
conventional
conversation
convert
conviction
convince
cook
cookie
cooking
cool
cooperation
cop
cope
copy
core
corn
corner
corporate
corporation
correct
correspondent
cost
cotton
couch
could
council
counselor
count
counter
country
county
couple
courage
course
court
cousin
cover
coverage
cow
crack
craft
crash
crazy
cream
create
creation
creative
creature
credit
crew
crime
criminal
crisis
criteria
critic
critical
criticism
criticize
crop
cross
crowd
crucial
cry
cultural
culture
cup
curious
current
currently
curriculum
custom
customer
cut
cycle
dad
daily
damage
dance
danger
dangerous
dare
dark
darkness
data
date
daughter
day
dead
deal
dealer
dear
death
debate
debt
decade
decide
decision
deck
declare
decline
decrease
deep
deeply
deer
defeat
defend
defendant
defense
defensive
deficit
define
definitely
definition
degree
delay
deliver
delivery
demand
democracy
Democrat
democratic
demonstrate
demonstration
deny
department
depend
dependent
depending
depict
depression
depth
deputy
derive
describe
description
desert
deserve
design
designer
desire
desk
desperate
despite
destroy
destruction
detail
detailed
detect
determine
develop
developing
development
device
devote
dialogue
die
diet
differ
difference
different
differently
difficult
difficulty
dig
digital
dimension
dining
dinner
direct
direction
directly
director
dirt
dirty
disability
disagree
disappear
disaster
discipline
discourse
discover
discovery
discrimination
discuss
discussion
disease
dish
dismiss
disorder
display
dispute
distance
distant
distinct
distinction
distinguish
distribute
distribution
district
diverse
diversity
divide
division
divorce
DNA
do
doctor
document
dog
domestic
dominant
dominate
door
double
doubt
down
downtown
dozen
draft
drag
drama
dramatic
dramatically
draw
drawing
dream
dress
drink
drive
driver
drop
drug
dry
due
during
dust
duty
each
eager
ear
early
earn
earnings
earth
ease
easily
east
eastern
easy
eat
economic
economics
economist
economy
edge
edition
editor
educate
education
educational
educator
effect
effective
effectively
efficiency
efficient
effort
egg
eight
either
elderly
elect
election
electric
electricity
electronic
element
elementary
eliminate
elite
else
elsewhere
e-mail
embrace
emerge
emergency
emission
emotion
emotional
emphasis
emphasize
employ
employee
employer
employment
empty
enable
encounter
encourage
end
enemy
energy
enforcement
engage
engine
engineer
engineering
English
enhance
enjoy
enormous
enough
ensure
enter
enterprise
entertainment
entire
entirely
entrance
entry
environment
environmental
episode
equal
equally
equipment
era
error
escape
especially
essay
essential
essentially
establish
establishment
estate
estimate
etc
ethics
ethnic
European
evaluate
evaluation
even
evening
event
eventually
ever
every
everybody
everyday
everyone
everything
everywhere
evidence
evolution
evolve
exact
exactly
examination
examine
example
exceed
excellent
except
exception
exchange
exciting
executive
exercise
exhibit
exhibition
exist
existence
existing
expand
expansion
expect
expectation
expense
expensive
experience
experiment
expert
explain
explanation
explode
explore
explosion
expose
exposure
express
expression
extend
extension
extensive
extent
external
extra
extraordinary
extreme
extremely
eye
fabric
face
facility
fact
factor
factory
faculty
fade
fail
failure
fair
fairly
faith
fall
false
familiar
family
famous
fan
fantasy
far
farm
farmer
fashion
fast
fat
fate
father
fault
favor
favorite
fear
feature
federal
fee
feed
feel
feeling
fellow
female
fence
few
fewer
fiber
fiction
field
fifteen
fifth
fifty
fight
fighter
fighting
figure
file
fill
film
final
finally
finance
financial
find
finding
fine
finger
finish
fire
firm
first
fish
fishing
fit
fitness
five
fix
flag
flame
flat
flavor
flee
flesh
flight
float
floor
flow
flower
fly
focus
folk
follow
following
food
foot
football
for
force
foreign
forest
forever
forget
form
formal
formation
former
formula
forth
fortune
forward
found
foundation
founder
four
fourth
frame
framework
free
freedom
freeze
French
frequency
frequent
frequently
fresh
friend
friendly
friendship
from
front
fruit
frustration
fuel
full
fully
fun
function
fund
fundamental
funding
funeral
funny
furniture
furthermore
future
gain
galaxy
gallery
game
gang
gap
garage
garden
garlic
gas
gate
gather
gay
gaze
gear
gender
gene
general
generally
generate
generation
genetic
gentleman
gently
German
gesture
get
ghost
giant
gift
gifted
girl
girlfriend
give
given
glad
glance
glass
global
glove
go
goal
God
gold
golden
golf
good
government
governor
grab
grade
gradually
graduate
grain
grand
grandfather
grandmother
grant
grass
grave
gray
great
greatest
green
grocery
ground
group
grow
growing
growth
guarantee
guard
guess
guest
guide
guideline
guilty
gun
guy
habit
habitat
hair
half
hall
hand
handful
handle
hang
happen
happy
hard
hardly
hat
hate
have
he
head
headline
headquarters
health
healthy
hear
hearing
heart
heat
heaven
heavily
heavy
heel
height
helicopter
hell
hello
help
helpful
her
here
heritage
hero
herself
hey
hi
hide
high
highlight
highly
highway
hill
him
himself
hip
hire
his
historian
historic
historical
history
hit
hold
hole
holiday
holy
home
homeless
honest
honey
honor
hope
horizon
horror
horse
hospital
host
hot
hotel
hour
house
household
housing
how
however
huge
human
humor
hundred
hungry
hunter
hunting
hurt
husband
hypothesis
I
ice
idea
ideal
identification
identify
identity
ie
if
ignore
ill
illegal
illness
illustrate
image
imagination
imagine
immediate
immediately
immigrant
immigration
impact
implement
implication
imply
importance
important
impose
impossible
impress
impression
impressive
improve
improvement
in
incentive
incident
include
including
income
incorporate
increase
increased
increasing
increasingly
incredible
indeed
independence
independent
index
Indian
indicate
indication
individual
industrial
industry
infant
infection
inflation
influence
inform
information
ingredient
initial
initially
initiative
injury
inner
innocent
inquiry
inside
insight
insist
inspire
install
instance
instead
institution
institutional
instruction
instructor
instrument
insurance
intellectual
intelligence
intend
intense
intensity
intention
interaction
interest
interested
interesting
internal
international
Internet
interpret
interpretation
intervention
interview
into
introduce
introduction
invasion
invest
investigate
investigation
investigator
investment
investor
invite
involve
involved
involvement
Iraqi
Irish
iron
Islamic
island
Israeli
issue
it
Italian
item
its
itself
jacket
jail
Japanese
jet
Jew
Jewish
job
join
joint
joke
journal
journalist
journey
joy
judge
judgment
juice
jump
junior
jury
just
justice
justify
keep
key
kick
kid
kill
killer
killing
kind
king
kiss
kitchen
knee
knife
knock
know
knowledge
lab
label
labor
laboratory
lack
lady
lake
land
landscape
language
lap
large
largely
last
late
later
Latin
latter
laugh
launch
law
lawn
lawsuit
lawyer
lay
layer
lead
leader
leadership
leading
leaf
league
lean
learn
learning
least
leather
leave
left
leg
legacy
legal
legend
legislation
legitimate
lemon
length
less
lesson
let
letter
level
liberal
library
license
lie
life
lifestyle
lifetime
lift
light
like
likely
limit
limitation
limited
line
link
lip
list
listen
literally
literary
literature
little
live
living
load
loan
local
locate
location
lock
long
long-term
look
loose
lose
loss
lost
lot
lots
loud
love
lovely
lover
low
lower
luck
lucky
lunch
lung
machine
mad
magazine
mail
main
mainly
maintain
maintenance
major
majority
make
maker
makeup
male
mall
man
manage
management
manager
manner
manufacturer
manufacturing
many
map
margin
mark
market
marketing
marriage
married
marry
mask
mass
massive
master
match
material
math
matter
may
maybe
mayor
me
meal
mean
meaning
meanwhile
measure
measurement
meat
mechanism
media
medical
medication
medicine
medium
meet
meeting
member
membership
memory
mental
mention
menu
mere
merely
mess
message
metal
meter
method
Mexican
middle
might
military
milk
million
mind
mine
minister
minor
minority
minute
miracle
mirror
miss
missile
mission
mistake
mix
mixture
mm-hmm
mode
model
moderate
modern
modest
mom
moment
money
monitor
month
mood
moon
moral
more
moreover
morning
mortgage
most
mostly
mother
motion
motivation
motor
mount
mountain
mouse
mouth
move
movement
movie
Mr
Mrs
Ms
much
multiple
murder
muscle
museum
music
musical
musician
Muslim
must
mutual
my
myself
mystery
myth
naked
name
narrative
narrow
nation
national
native
natural
naturally
nature
near
nearby
nearly
necessarily
necessary
neck
need
negative
negotiate
negotiation
neighbor
neighborhood
neither
nerve
nervous
net
network
never
nevertheless
new
newly
news
newspaper
next
nice
night
nine
no
nobody
nod
noise
nomination
none
nonetheless
nor
normal
normally
north
northern
nose
not
note
nothing
notice
notion
novel
now
nowhere
n't
nuclear
number
numerous
nurse
nut
object
objective
obligation
observation
observe
observer
obtain
obvious
obviously
occasion
occasionally
occupation
occupy
occur
ocean
odd
odds
of
off
offense
offensive
offer
office
officer
official
often
oh
oil
ok
okay
old
Olympic
on
once
one
ongoing
onion
online
only
onto
open
opening
operate
operating
operation
operator
opinion
opponent
opportunity
oppose
opposite
opposition
option
or
orange
order
ordinary
organic
organization
organize
orientation
origin
original
originally
other
others
otherwise
ought
our
ourselves
out
outcome
outside
oven
over
overall
overcome
overlook
owe
own
owner
pace
pack
package
page
pain
painful
paint
painter
painting
pair
pale
Palestinian
palm
pan
panel
pant
paper
parent
park
parking
part
participant
participate
participation
particular
particularly
partly
partner
partnership
party
pass
passage
passenger
passion
past
patch
path
patient
pattern
pause
pay
payment
PC
peace
peak
peer
penalty
people
pepper
per
perceive
percentage
perception
perfect
perfectly
perform
performance
perhaps
period
permanent
permission
permit
person
personal
personality
personally
personnel
perspective
persuade
pet
phase
phenomenon
philosophy
phone
photo
photograph
photographer
phrase
physical
physically
physician
piano
pick
picture
pie
piece
pile
pilot
pine
pink
pipe
pitch
place
plan
plane
planet
planning
plant
plastic
plate
platform
play
player
please
pleasure
plenty
plot
plus
PM
pocket
poem
poet
poetry
point
pole
police
policy
political
politically
politician
politics
poll
pollution
pool
poor
pop
popular
population
porch
port
portion
portrait
portray
pose
position
positive
possess
possibility
possible
possibly
post
pot
potato
potential
potentially
pound
pour
poverty
powder
power
powerful
practical
practice
pray
prayer
precisely
predict
prefer
preference
pregnancy
pregnant
preparation
prepare
prescription
presence
present
presentation
preserve
president
presidential
press
pressure
pretend
pretty
prevent
previous
previously
price
pride
priest
primarily
primary
prime
principal
principle
print
prior
priority
prison
prisoner
privacy
private
probably
problem
procedure
proceed
process
produce
producer
product
production
profession
professional
professor
profile
profit
program
progress
project
prominent
promise
promote
prompt
proof
proper
properly
property
proportion
proposal
propose
proposed
prosecutor
prospect
protect
protection
protein
protest
proud
prove
provide
provider
province
provision
psychological
psychologist
psychology
public
publication
publicly
publish
publisher
pull
punishment
purchase
pure
purpose
pursue
push
put
qualify
quality
quarter
quarterback
question
quick
quickly
quiet
quietly
quit
quite
quote
race
racial
radical
radio
rail
rain
raise
range
rank
rapid
rapidly
rare
rarely
rate
rather
rating
ratio
raw
reach
react
reaction
read
reader
reading
ready
real
reality
realize
really
reason
reasonable
recall
receive
recent
recently
recipe
recognition
recognize
recommend
recommendation
record
recording
recover
recovery
recruit
red
reduce
reduction
refer
reference
reflect
reflection
reform
refugee
refuse
regard
regarding
regardless
regime
region
regional
register
regular
regularly
regulate
regulation
reinforce
reject
relate
relation
relationship
relative
relatively
relax
release
relevant
relief
religion
religious
rely
remain
remaining
remarkable
remember
remind
remote
remove
repeat
repeatedly
replace
reply
report
reporter
represent
representation
representative
Republican
reputation
request
require
requirement
research
researcher
resemble
reservation
resident
resist
resistance
resolution
resolve
resort
resource
respect
respond
respondent
response
responsibility
responsible
rest
restaurant
restore
restriction
result
retain
retire
retirement
return
reveal
revenue
review
revolution
rhythm
rice
rich
rid
ride
rifle
right
ring
rise
risk
river
road
rock
role
roll
romantic
roof
room
root
rope
rose
rough
roughly
round
route
routine
row
rub
rule
run
running
rural
rush
Russian
sacred
sad
safe
safety
sake
salad
salary
sale
sales
salt
same
sample
sanction
sand
satellite
satisfaction
satisfy
sauce
save
saving
say
scale
scandal
scared
scenario
scene
schedule
scheme
scholar
scholarship
school
science
scientific
scientist
scope
score
scream
screen
script
sea
search
season
seat
second
secret
secretary
section
sector
secure
security
see
seed
seek
seem
segment
seize
select
selection
self
sell
Senate
senator
send
senior
sense
sensitive
sentence
separate
sequence
series
serious
seriously
serve
service
session
set
setting
settle
settlement
seven
several
severe
sex
sexual
shade
shadow
shake
shall
shape
share
sharp
she
sheet
shelf
shell
shelter
shift
shine
ship
shirt
shit
shock
shoe
shoot
shooting
shop
shopping
shore
short
shortly
shot
should
shoulder
shout
show
shower
shrug
shut
sick
side
sigh
sight
sign
signal
significance
significant
significantly
silence
silent
silver
similar
similarly
simple
simply
sin
since
sing
singer
single
sink
sir
sister
sit
site
situation
six
size
ski
skill
skin
sky
slave
sleep
slice
slide
slight
slightly
slip
slow
slowly
small
smart
smell
smile
smoke
smooth
snap
snow
so
so-called
soccer
social
society
soft
software
soil
solar
soldier
solid
solution
solve
some
somebody
somehow
someone
something
sometimes
somewhat
somewhere
son
song
soon
sophisticated
sorry
sort
soul
sound
soup
source
south
southern
Soviet
space
Spanish
speak
speaker
special
specialist
species
specific
specifically
speech
speed
spend
spending
spin
spirit
spiritual
split
spokesman
sport
spot
spread
spring
square
squeeze
stability
stable
staff
stage
stair
stake
stand
standard
standing
star
stare
start
state
statement
station
statistics
status
stay
steady
steal
steel
step
stick
still
stir
stock
stomach
stone
stop
storage
store
storm
story
straight
strange
stranger
strategic
strategy
stream
street
strength
strengthen
stress
stretch
strike
string
strip
stroke
strong
strongly
structure
struggle
student
studio
study
stuff
stupid
style
subject
submit
subsequent
substance
substantial
succeed
success
successful
successfully
such
sudden
suddenly
sue
suffer
sufficient
sugar
suggest
suggestion
suicide
suit
summer
summit
sun
super
supply
support
supporter
suppose
supposed
Supreme
sure
surely
surface
surgery
surprise
surprised
surprising
surprisingly
surround
survey
survival
survive
survivor
suspect
sustain
swear
sweep
sweet
swim
swing
switch
symbol
symptom
system
table
tablespoon
tactic
tail
take
tale
talent
talk
tall
tank
tap
tape
target
task
taste
tax
taxpayer
tea
teach
teacher
teaching
team
tear
teaspoon
technical
technique
technology
teen
teenager
telephone
telescope
television
tell
temperature
temporary
ten
tend
tendency
tennis
tension
tent
term
terms
terrible
territory
terror
terrorism
terrorist
test
testify
testimony
testing
text
than
thank
thanks
that
the
theater
their
them
theme
themselves
then
theory
therapy
there
therefore
these
they
thick
thin
thing
think
thinking
third
thirty
this
those
though
thought
thousand
threat
threaten
three
throat
through
throughout
throw
thus
ticket
tie
tight
time
tiny
tip
tire
tired
tissue
title
to
tobacco
today
toe
together
tomato
tomorrow
tone
tongue
tonight
too
tool
tooth
top
topic
toss
total
totally
touch
tough
tour
tourist
tournament
toward
towards
tower
town
toy
trace
track
trade
tradition
traditional
traffic
tragedy
trail
train
training
transfer
transform
transformation
transition
translate
transportation
travel
treat
treatment
treaty
tree
tremendous
trend
trial
tribe
trick
trip
troop
trouble
truck
true
truly
trust
truth
try
tube
tunnel
turn
TV
twelve
twenty
twice
twin
two
type
typical
typically
ugly
ultimate
ultimately
unable
uncle
under
undergo
understand
understanding
unfortunately
uniform
union
unique
unit
United
universal
universe
university
unknown
unless
unlike
unlikely
until
unusual
up
upon
upper
urban
urge
us
use
used
useful
user
usual
usually
utility
vacation
valley
valuable
value
variable
variation
variety
various
vary
vast
vegetable
vehicle
venture
version
versus
very
vessel
veteran
via
victim
victory
video
view
viewer
village
violate
violation
violence
violent
virtually
virtue
virus
visible
vision
visit
visitor
visual
vital
voice
volume
volunteer
vote
voter
vs
vulnerable
wage
wait
wake
walk
wall
wander
want
war
warm
warn
warning
wash
waste
watch
water
wave
way
we
weak
wealth
wealthy
weapon
wear
weather
wedding
week
weekend
weekly
weigh
weight
welcome
welfare
well
west
western
wet
what
whatever
wheel
when
whenever
where
whereas
whether
which
while
whisper
white
who
whole
whom
whose
why
wide
widely
widespread
wife
wild
will
willing
win
wind
window
wine
wing
winner
winter
wipe
wire
wisdom
wise
wish
with
withdraw
within
without
witness
woman
wonder
wonderful
wood
wooden
word
work
worker
working
works
workshop
world
worried
worry
worth
would
wound
wrap
write
writer
writing
wrong
yard
yeah
year
yell
yellow
yes
yesterday
yet
yield
you
young
your
yours
yourself
youth
zone


================================================
FILE: week3/crossword/generate.py
================================================
import sys
import copy

from crossword import *


class CrosswordCreator():

    def __init__(self, crossword):
        """
        Create new CSP crossword generate.
        """
        self.crossword = crossword
        self.domains = {
            var: self.crossword.words.copy()
            for var in self.crossword.variables
        }

    def letter_grid(self, assignment):
        """
        Return 2D array representing a given assignment.
        """
        letters = [
            [None for _ in range(self.crossword.width)]
            for _ in range(self.crossword.height)
        ]
        for variable, word in assignment.items():
            direction = variable.direction
            for k in range(len(word)):
                i = variable.i + (k if direction == Variable.DOWN else 0)
                j = variable.j + (k if direction == Variable.ACROSS else 0)
                letters[i][j] = word[k]
        return letters

    def print(self, assignment):
        """
        Print crossword assignment to the terminal.
        """
        letters = self.letter_grid(assignment)
        for i in range(self.crossword.height):
            for j in range(self.crossword.width):
                if self.crossword.structure[i][j]:
                    print(letters[i][j] or " ", end="")
                else:
                    print("█", end="")
            print()

    def save(self, assignment, filename):
        """
        Save crossword assignment to an image file.
        """
        from PIL import Image, ImageDraw, ImageFont
        cell_size = 100
        cell_border = 2
        interior_size = cell_size - 2 * cell_border
        letters = self.letter_grid(assignment)

        # Create a blank canvas
        img = Image.new(
            "RGBA",
            (self.crossword.width * cell_size,
             self.crossword.height * cell_size),
            "black"
        )
        font = ImageFont.truetype("assets/fonts/OpenSans-Regular.ttf", 80)
        draw = ImageDraw.Draw(img)

        for i in range(self.crossword.height):
            for j in range(self.crossword.width):

                rect = [
                    (j * cell_size + cell_border,
                     i * cell_size + cell_border),
                    ((j + 1) * cell_size - cell_border,
                     (i + 1) * cell_size - cell_border)
                ]
                if self.crossword.structure[i][j]:
                    draw.rectangle(rect, fill="white")
                    if letters[i][j]:
                        w, h = draw.textsize(letters[i][j], font=font)
                        draw.text(
                            (rect[0][0] + ((interior_size - w) / 2),
                             rect[0][1] + ((interior_size - h) / 2) - 10),
                            letters[i][j], fill="black", font=font
                        )

        img.save(filename)

    def solve(self):
        """
        Enforce node and arc consistency, and then solve the CSP.
        """
        self.enforce_node_consistency()
        self.ac3()
        return self.backtrack(dict())

    def enforce_node_consistency(self):
        """
        Update `self.domains` such that each variable is node-consistent.
        (Remove any values that are inconsistent with a variable's unary
         constraints; in this case, the length of the word.)
        """
        # do the deep copy of domains
        domain_copy = copy.deepcopy(self.domains)

        # iterate through domains copy
        for variable in domain_copy:
            # getting the variable length
            length = variable.length
            # iterate through words in domain
            for word in domain_copy[variable]:
                if len(word) != length:
                    # if length of the word doesn't fit variable, delete it from
                    # the original domain (not copy)
                    self.domains[variable].remove(word)

    def revise(self, x, y):
        """
        Make variable `x` arc consistent with variable `y`.
        To do so, remove values from `self.domains[x]` for which there is no
        possible corresponding value for `y` in `self.domains[y]`.

        Return True if a revision was made to the domain of `x`; return
        False if no revision was made.
        """
        # getting x and y ovelapping cells, unpack cords to variables
        xoverlap, yoverlap = self.crossword.overlaps[x, y]

        # make variable describing if revision was made
        revision_made = False

        # making domains copy
        domains_copy = copy.deepcopy(self.domains)

        # if overlap occurs
        if xoverlap:
            # iterate through words in x's domain
            for xword in domains_copy[x]:
                matched_value = False
                # iterate through words in y's domain
                for yword in self.domains[y]:
                    # if x's word and y's word have same letter in overlapping position
                    if xword[xoverlap] == yword[yoverlap]:
                        matched_value = True
                        break   # no need to check rest of y's words for that x
                if matched_value:
                    continue   # if x and y was matched, proceed with another x
                else:
                    self.domains[x].remove(xword) # no matching y's word to x, removing word from domain
                    revision_made = True

        # return bolean if revision was made
        return revision_made

    def ac3(self, arcs=None):
        """
        Update `self.domains` such that each variable is arc consistent.
        If `arcs` is None, begin with initial list of all arcs in the problem.
        Otherwise, use `arcs` as the initial list of arcs to make consistent.

        Return True if arc consistency is enforced and no domains are empty;
        return False if one or more domains end up empty.
        """
        if not arcs:
            # no arcs provided, start with an initial queue of all of the arcs in the problem
            queue = []
            # populating queue
            for variable1 in self.domains:
                for variable2 in self.crossword.neighbors(variable1):
                    if self.crossword.overlaps[variable1, variable2] is not None:
                        queue.append((variable1, variable2))

        while len(queue) > 0:
            x, y = queue.pop(0)
            if self.revise(x, y):
                if len(self.domains[x]) == 0:
                    return False
                for neighbour in self.crossword.neighbors(x):
                    if neighbour != y:
                        queue.append((neighbour, x))
            return True

    def assignment_complete(self, assignment):
        """
        Return True if `assignment` is complete (i.e., assigns a value to each
        crossword variable); return False otherwise.
        """
        for variable in self.domains:
            if variable not in assignment:
                return False
        return True

    def consistent(self, assignment):
        """
        Return True if `assignment` is consistent (i.e., words fit in crossword
        puzzle without conflicting characters); return False otherwise.
        """
        # all values are distinct, every value is the correct length,
        # and there are no conflicts between neighboring variables.

        # check if all values are distinct
        words = [*assignment.values()]
        if len(words) != len(set(words)):
            return False

        # check if every value is the correct length
        for variable in assignment:
            if variable.length != len(assignment[variable]):
                return False

        # check if there are any conflicts between neighbouring variables
        for variable in assignment:
            for neighbour in self.crossword.neighbors(variable):
                if neighbour in assignment:
                    x, y = self.crossword.overlaps[variable, neighbour]
                    if assignment[variable][x] != assignment[neighbour][y]:
                        return False

        # all cases checked, no conflicts, can return True
        return True

    def order_domain_values(self, var, assignment):
        """
        Return a list of values in the domain of `var`, in order by
        the number of values they rule out for neighboring variables.
        The first value in the list, for example, should be the one
        that rules out the fewest values among the neighbors of `var`.
        """
        # make temporary dict for holding values
        word_dict = {}

        # getting neighbours of var
        neighbours = self.crossword.neighbors(var)

        # iterating through var's words
        for word in self.domains[var]:
            eliminated = 0
            for neighbour in neighbours:
                # don't count if neighbor has already assigned value
                if neighbour in assignment:
                    continue
                else:
                    # calculate overlap between two variables
                    xoverlap, yoverlap = self.crossword.overlaps[var, neighbour]
                    for neighbour_word in self.domains[neighbour]:
                        # iterate through neighbour's words, check for eliminate ones
                        if word[xoverlap] != neighbour_word[yoverlap]:
                            eliminated += 1
            # add eliminated neighbour's words to temporary dict
            word_dict[word] = eliminated

        # sort variables dictionary by number of eliminated neighbour values
        sorted_dict = {k: v for k, v in sorted(word_dict.items(), key=lambda item: item[1])}

        return [*sorted_dict]

    def select_unassigned_variable(self, assignment):
        """
        Return an unassigned variable not already part of `assignment`.
        Choose the variable with the minimum number of remaining values
        in its domain. If there is a tie, choose the variable with the highest
        degree. If there is a tie, any of the tied variables are acceptable
        return values.
        """

        choice_dict = {}

        # iterating through variables in domains
        for variable in self.domains:
            # iterating through variables in assignment
            if variable not in assignment:
                # if variable is not yet in assigment, add it to temp dict
                choice_dict[variable] = self.domains[variable]

        # make list of variables sorted by number of remaining values
        sorted_list = [v for v, k in sorted(choice_dict.items(), key=lambda item:len(item[1]))]

        # return variable with the minimum number of remaining values
        return sorted_list[0]

    def backtrack(self, assignment):
        """
        Using Backtracking Search, take as input a partial assignment for the
        crossword and return a complete assignment if possible to do so.

        `assignment` is a mapping from variables (keys) to words (values).

        If no assignment is possible, return None.
        """
        # if assignment is already ready
        if len(assignment) == len(self.domains):
            return assignment

        # selecting one of unassigned variables
        variable = self.select_unassigned_variable(assignment)

        # iterating through words in that variable
        for value in self.domains[variable]:
            # making assignment copy, with updated variable value
            assignment_copy = assignment.copy()
            assignment_copy[variable] = value
            # checking for consistency, getting result of that new assignment backtrack
            if self.consistent(assignment_copy):
                result = self.backtrack(assignment_copy)
                if result is not None:
                    return result
        return None


def main():
    # Check usage
    if len(sys.argv) not in [3, 4]:
        sys.exit("Usage: python generate.py structure words [output]")

    # Parse command-line arguments
    structure = sys.argv[1]
    words = sys.argv[2]
    output = sys.argv[3] if len(sys.argv) == 4 else None

    # Generate crossword
    crossword = Crossword(structure, words)
    creator = CrosswordCreator(crossword)
    assignment = creator.solve()

    # Print result
    if assignment is None:
        print("No solution.")
    else:
        creator.print(assignment)
        if output:
            creator.save(assignment, output)


if __name__ == "__main__":
    main()


================================================
FILE: week4/nim/nim.py
================================================
import math
import random
import time


class Nim():

    def __init__(self, initial=[1, 3, 5, 7]):
        """
        Initialize game board.
        Each game board has
            - `piles`: a list of how many elements remain in each pile
            - `player`: 0 or 1 to indicate which player's turn
            - `winner`: None, 0, or 1 to indicate who the winner is
        """
        self.piles = initial.copy()
        self.player = 0
        self.winner = None

    @classmethod
    def available_actions(cls, piles):
        """
        Nim.available_actions(piles) takes a `piles` list as input
        and returns all of the available actions `(i, j)` in that state.

        Action `(i, j)` represents the action of removing `j` items
        from pile `i` (where piles are 0-indexed).
        """
        actions = set()
        for i, pile in enumerate(piles):
            for j in range(1, pile + 1):
                actions.add((i, j))
        return actions

    @classmethod
    def other_player(cls, player):
        """
        Nim.other_player(player) returns the player that is not
        `player`. Assumes `player` is either 0 or 1.
        """
        return 0 if player == 1 else 1

    def switch_player(self):
        """
        Switch the current player to the other player.
        """
        self.player = Nim.other_player(self.player)

    def move(self, action):
        """
        Make the move `action` for the current player.
        `action` must be a tuple `(i, j)`.
        """
        pile, count = action

        # Check for errors
        if self.winner is not None:
            raise Exception("Game already won")
        elif pile < 0 or pile >= len(self.piles):
            raise Exception("Invalid pile")
        elif count < 1 or count > self.piles[pile]:
            raise Exception("Invalid number of objects")

        # Update pile
        self.piles[pile] -= count
        self.switch_player()

        # Check for a winner
        if all(pile == 0 for pile in self.piles):
            self.winner = self.player


class NimAI():

    def __init__(self, alpha=0.5, epsilon=0.1):
        """
        Initialize AI with an empty Q-learning dictionary,
        an alpha (learning) rate, and an epsilon rate.

        The Q-learning dictionary maps `(state, action)`
        pairs to a Q-value (a number).
         - `state` is a tuple of remaining piles, e.g. (1, 1, 4, 4)
         - `action` is a tuple `(i, j)` for an action
        """
        self.q = dict()
        self.alpha = alpha
        self.epsilon = epsilon

    def update(self, old_state, action, new_state, reward):
        """
        Update Q-learning model, given an old state, an action taken
        in that state, a new resulting state, and the reward received
        from taking that action.
        """
        old = self.get_q_value(old_state, action)
        best_future = self.best_future_reward(new_state)
        self.update_q_value(old_state, action, old, reward, best_future)

    def get_q_value(self, state, action):
        """
        Return the Q-value for the state `state` and the action `action`.
        If no Q-value exists yet in `self.q`, return 0.
        """
        try:
            return self.q[tuple(state), action]
        except KeyError:
            return 0

    def update_q_value(self, state, action, old_q, reward, future_rewards):
        """
        Update the Q-value for the state `state` and the action `action`
        given the previous Q-value `old_q`, a current reward `reward`,
        and an estiamte of future rewards `future_rewards`.

        Use the formula:

        Q(s, a) <- old value estimate
                   + alpha * (new value estimate - old value estimate)

        where `old value estimate` is the previous Q-value,
        `alpha` is the learning rate, and `new value estimate`
        is the sum of the current reward and estimated future rewards.
        """
        new_q = old_q + self.alpha * ((reward + future_rewards) - old_q)
        self.q[tuple(state), action] = new_q

    def best_future_reward(self, state):
        """
        Given a state `state`, consider all possible `(state, action)`
        pairs available in that state and return the maximum of all
        of their Q-values.

        Use 0 as the Q-value if a `(state, action)` pair has no
        Q-value in `self.q`. If there are no available actions in
        `state`, return 0.
        """
        max_reward = 0

        for sta, q in self.q.items():
            if sta[0] == state and q > max_reward:
                max_reward = q

        return max_reward

    def choose_action(self, state, epsilon=True):
        """
        Given a state `state`, return an action `(i, j)` to take.

        If `epsilon` is `False`, then return the best action
        available in the state (the one with the highest Q-value,
        using 0 for pairs that have no Q-values).

        If `epsilon` is `True`, then with probability
        `self.epsilon` choose a random available action,
        otherwise choose the best action available.

        If multiple actions have the same Q-value, any of those
        options is an acceptable return value.
        """

        max_reward = 0
        best_action = None

        available_moves = Nim.available_actions(state)

        for move in available_moves:
            try:
                q = self.q[tuple(state), move]
            except KeyError:
                q = 0

            if q > max_reward:
                max_reward = q
                best_action = move

        if max_reward == 0:
            return random.choice(tuple(available_moves))

        if not epsilon:
            return best_action
        else:
            if random.random() < self.epsilon:
                return random.choice(tuple(available_moves))
            else:
                return best_action


def train(n):
    """
    Train an AI by playing `n` games against itself.
    """

    player = NimAI()

    # Play n games
    for i in range(n):
        print(f"Playing training game {i + 1}")
        game = Nim()

        # Keep track of last move made by either player
        last = {
            0: {"state": None, "action": None},
            1: {"state": None, "action": None}
        }

        # Game loop
        while True:

            # Keep track of current state and action
            state = game.piles.copy()
            action = player.choose_action(game.piles)

            # Keep track of last state and action
            last[game.player]["state"] = state
            last[game.player]["action"] = action

            # Make move
            game.move(action)
            new_state = game.piles.copy()

            # When game is over, update Q values with rewards
            if game.winner is not None:
                player.update(state, action, new_state, -1)
                player.update(
                    last[game.player]["state"],
                    last[game.player]["action"],
                    new_state,
                    1
                )
                break

            # If game is continuing, no rewards yet
            elif last[game.player]["state"] is not None:
                player.update(
                    last[game.player]["state"],
                    last[game.player]["action"],
                    new_state,
                    0
                )

    print("Done training")

    # Return the trained AI
    return player


def play(ai, human_player=None):
    """
    Play human game against the AI.
    `human_player` can be set to 0 or 1 to specify whether
    human player moves first or second.
    """

    # If no player order set, choose human's order randomly
    if human_player is None:
        human_player = random.randint(0, 1)

    # Create new game
    game = Nim()

    # Game loop
    while True:

        # Print contents of piles
        print()
        print("Piles:")
        for i, pile in enumerate(game.piles):
            print(f"Pile {i}: {pile}")
        print()

        # Compute available actions
        available_actions = Nim.available_actions(game.piles)
        time.sleep(1)

        # Let human make a move
        if game.player == human_player:
            print("Your Turn")
            while True:
                pile = int(input("Choose Pile: "))
                count = int(input("Choose Count: "))
                if (pile, count) in available_actions:
                    break
                print("Invalid move, try again.")

        # Have AI make a move
        else:
            print("AI's Turn")
            pile, count = ai.choose_action(game.piles, epsilon=False)
            print(f"AI chose to take {count} from pile {pile}.")

        # Make move
        game.move((pile, count))

        # Check for winner
        if game.winner is not None:
            print()
            print("GAME OVER")
            winner = "Human" if game.winner == human_player else "AI"
            print(f"Winner is {winner}")
            return


================================================
FILE: week4/nim/play.py
================================================
from nim import train, play

ai = train(10000)
play(ai)


================================================
FILE: week4/shopping/shopping.csv
================================================
Administrative,Administrative_Duration,Informational,Informational_Duration,ProductRelated,ProductRelated_Duration,BounceRates,ExitRates,PageValues,SpecialDay,Month,OperatingSystems,Browser,Region,TrafficType,VisitorType,Weekend,Revenue
0,0,0,0,1,0,0.2,0.2,0,0,Feb,1,1,1,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,2,64,0,0.1,0,0,Feb,2,2,1,2,Returning_Visitor,FALSE,FALSE
0,0,0,0,1,0,0.2,0.2,0,0,Feb,4,1,9,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,2,2.666666667,0.05,0.14,0,0,Feb,3,2,2,4,Returning_Visitor,FALSE,FALSE
0,0,0,0,10,627.5,0.02,0.05,0,0,Feb,3,3,1,4,Returning_Visitor,TRUE,FALSE
0,0,0,0,19,154.2166667,0.015789474,0.024561404,0,0,Feb,2,2,1,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,1,0,0.2,0.2,0,0.4,Feb,2,4,3,3,Returning_Visitor,FALSE,FALSE
1,0,0,0,0,0,0.2,0.2,0,0,Feb,1,2,1,5,Returning_Visitor,TRUE,FALSE
0,0,0,0,2,37,0,0.1,0,0.8,Feb,2,2,2,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,3,738,0,0.022222222,0,0.4,Feb,2,4,1,2,Returning_Visitor,FALSE,FALSE
0,0,0,0,3,395,0,0.066666667,0,0,Feb,1,1,3,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,16,407.75,0.01875,0.025833333,0,0.4,Feb,1,1,4,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,7,280.5,0,0.028571429,0,0,Feb,1,1,1,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,6,98,0,0.066666667,0,0,Feb,2,5,1,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,2,68,0,0.1,0,0,Feb,3,2,3,3,Returning_Visitor,FALSE,FALSE
2,53,0,0,23,1668.285119,0.008333333,0.016312636,0,0,Feb,1,1,9,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,1,0,0.2,0.2,0,0,Feb,1,1,4,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,13,334.9666667,0,0.007692308,0,0,Feb,1,1,1,4,Returning_Visitor,TRUE,FALSE
0,0,0,0,2,32,0,0.1,0,0,Feb,2,2,1,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,20,2981.166667,0,0.01,0,0,Feb,2,4,4,4,Returning_Visitor,FALSE,FALSE
0,0,0,0,8,136.1666667,0,0.008333333,0,1,Feb,2,2,5,1,Returning_Visitor,TRUE,FALSE
0,0,0,0,2,0,0.2,0.2,0,0,Feb,3,3,1,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,3,105,0,0.033333333,0,0,Feb,3,2,1,5,Returning_Visitor,FALSE,FALSE
0,0,0,0,2,15,0,0.1,0,0.8,Feb,2,4,1,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,1,0,0.2,0.2,0,0,Feb,2,2,4,1,Returning_Visitor,TRUE,FALSE
0,0,0,0,5,156,0,0.04,0,0,Feb,1,1,9,3,Returning_Visitor,FALSE,FALSE
4,64.6,0,0,32,1135.444444,0.002857143,0.00952381,0,0,Feb,2,2,1,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,4,76,0.05,0.1,0,0,Feb,1,1,1,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,4,63,0,0.05,0,0.2,Feb,2,6,1,3,Returning_Visitor,FALSE,FALSE
1,6,1,0,45,1582.75,0.043478261,0.050821256,54.17976426,0.4,Feb,3,2,1,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,2,35,0,0.1,0,0,Feb,1,1,6,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,3,78,0,0.066666667,0,0,Feb,1,2,6,6,Returning_Visitor,TRUE,FALSE
0,0,0,0,8,209.5,0,0.025,0,0,Feb,2,2,1,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,10,183.6666667,0.04,0.08,0,0,Feb,1,1,3,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,14,380.5,0.014285714,0.028571429,0,0,Feb,2,2,1,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,52,2086.242857,0.015384615,0.020352564,0,0,Feb,2,2,7,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,8,388,0.025,0.05625,0,0,Feb,3,2,1,4,Returning_Visitor,TRUE,FALSE
2,18,0,0,5,298,0,0.028571429,0,0.8,Feb,2,2,8,4,Returning_Visitor,FALSE,FALSE
0,0,0,0,7,63,0.028571429,0.071428571,0,0.6,Feb,2,2,1,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,9,482,0,0.022222222,0,0,Feb,2,5,1,6,Returning_Visitor,FALSE,FALSE
1,9,0,0,46,4084.393939,0,0.001794872,0,0,Feb,2,2,8,4,Returning_Visitor,FALSE,FALSE
0,0,0,0,3,22,0,0.066666667,0,0.6,Feb,1,1,3,2,Returning_Visitor,FALSE,FALSE
0,0,0,0,15,310.1666667,0,0.006666667,0,0,Feb,1,1,4,4,Returning_Visitor,FALSE,FALSE
0,0,0,0,2,34,0,0.05,0,0.4,Feb,3,2,2,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,4,88,0,0.05,0,0,Feb,4,1,1,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,22,622.25,0.003030303,0.006060606,0,0.2,Feb,2,5,1,4,Returning_Visitor,FALSE,FALSE
0,0,0,0,14,222.4,0.017142857,0.057142857,0,0,Feb,1,1,1,2,Returning_Visitor,FALSE,FALSE
0,0,0,0,3,80,0.066666667,0.133333333,0,0.2,Feb,3,2,1,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,11,800.8333333,0,0.003636364,0,0,Feb,3,2,1,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,1,0,0.2,0.2,0,0.6,Feb,2,2,3,2,Returning_Visitor,FALSE,FALSE
0,0,0,0,1,0,0.2,0.2,0,0,Feb,1,1,3,4,Returning_Visitor,TRUE,FALSE
0,0,0,0,12,265.1666667,0.011111111,0.026111111,0,0.2,Feb,3,2,1,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,2,29,0,0.1,0,1,Feb,2,4,4,2,Returning_Visitor,TRUE,FALSE
0,0,0,0,4,160,0,0.075,0,0,Feb,4,2,2,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,4,135.6666667,0.05,0.025,0,0.4,Feb,3,3,1,4,Returning_Visitor,FALSE,FALSE
0,0,0,0,1,0,0.2,0.2,0,0.2,Feb,2,4,1,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,1,0,0.2,0.2,0,0.6,Feb,3,2,3,3,Returning_Visitor,FALSE,FALSE
4,56,2,120,36,998.7416667,0,0.014736467,19.44707913,0.2,Feb,2,2,4,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,4,104,0,0.05,0,0.4,Feb,2,6,6,3,Returning_Visitor,FALSE,FALSE
2,16,0,0,16,381.6865079,0.011764706,0.046568627,0,0.6,Feb,2,4,2,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,6,169,0,0.016666667,0,0.4,Feb,1,1,3,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,8,400.8,0.05,0.120833333,0,0,Feb,1,1,1,3,Returning_Visitor,FALSE,FALSE
12,279.4166667,0,0,42,1553.583333,0.009,0.019666667,38.30849268,0,Feb,1,1,3,2,Returning_Visitor,FALSE,FALSE
0,0,0,0,14,706.5,0,0.007142857,0,0,Feb,2,2,5,4,Returning_Visitor,TRUE,FALSE
0,0,0,0,1,0,0.2,0.2,0,0,Feb,2,2,4,3,Returning_Visitor,FALSE,FALSE
3,87.83333333,0,0,27,798.3333333,0,0.012643678,22.9160357,0.8,Feb,2,2,3,1,Returning_Visitor,FALSE,TRUE
4,44,0,0,90,6951.972222,0.002150538,0.015013034,0,0,Feb,4,1,1,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,1,0,0.2,0.2,0,0.6,Feb,2,2,5,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,18,902,0,0.007407407,0,0,Feb,2,7,2,4,Returning_Visitor,FALSE,FALSE
0,0,0,0,1,0,0.2,0.2,0,0.2,Feb,3,2,3,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,1,0,0.2,0.2,0,0,Feb,2,6,1,2,Returning_Visitor,FALSE,FALSE
0,0,0,0,20,197.3777778,0.025,0.0525,0,0,Feb,2,6,6,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,2,43,0,0.1,0,0.4,Feb,2,2,3,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,8,426.6666667,0,0.0125,0,0,Feb,2,4,3,2,Returning_Visitor,FALSE,FALSE
0,0,0,0,3,135,0,0.066666667,0,0,Feb,2,4,3,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,16,588.3333333,0,0.025,0,0,Feb,2,4,1,1,Returning_Visitor,FALSE,FALSE
10,1005.666667,0,0,36,2111.341667,0.004347826,0.014492754,11.43941195,0,Feb,2,6,1,2,Returning_Visitor,FALSE,TRUE
0,0,0,0,2,76,0,0.05,0,0.6,Feb,3,2,3,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,1,0,0.2,0.2,0,1,Feb,1,1,1,3,Returning_Visitor,TRUE,FALSE
0,0,0,0,1,0,0.2,0.2,0,0.4,Feb,1,1,1,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,7,208,0,0.028571429,0,0,Feb,4,1,1,5,Returning_Visitor,TRUE,FALSE
0,0,0,0,4,270,0,0.016666667,0,0.8,Feb,1,1,1,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,6,39.5,0,0.02,0,0,Feb,2,2,1,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,12,375,0.016666667,0.058333333,0,0,Feb,3,2,4,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,1,0,0.2,0.2,0,0.8,Feb,2,2,2,1,Returning_Visitor,TRUE,FALSE
0,0,0,0,1,0,0.2,0.2,0,0,Feb,1,1,1,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,7,150,0.057142857,0.085714286,0,0,Feb,2,2,2,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,3,138,0,0.066666667,0,0,Feb,1,1,1,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,7,337.5,0.028571429,0.023809524,0,0.4,Feb,4,1,3,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,19,620.0333333,0,0.007894737,0,0,Feb,1,1,4,2,Returning_Visitor,FALSE,FALSE
2,36,0,0,15,168.8461538,0,0.011764706,0,0.4,Feb,1,1,1,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,1,0,0.2,0.2,0,0,Feb,1,1,1,2,Returning_Visitor,TRUE,FALSE
0,0,0,0,2,52,0,0.1,0,0,Feb,1,1,1,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,13,649.25,0,0.015384615,0,0,Feb,2,2,1,5,New_Visitor,FALSE,FALSE
0,0,0,0,27,925.3333333,0.003703704,0.025925926,0,0.6,Feb,4,1,3,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,2,33,0,0.1,0,0.2,Feb,1,1,1,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,6,1566.5,0.05,0.066666667,0,0.2,Feb,1,1,1,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,4,105,0,0.025,0,0.6,Feb,1,1,1,4,Returning_Visitor,FALSE,FALSE
0,0,1,0,7,50,0.038095238,0.080952381,0,0.6,Feb,2,4,1,7,Returning_Visitor,FALSE,FALSE
0,0,0,0,16,644.2,0.004166667,0.031666667,0,0,Feb,3,2,3,4,Returning_Visitor,FALSE,FALSE
3,18.33333333,0,0,38,2635.177778,0,0.008947368,0,0.4,Feb,2,4,1,2,Returning_Visitor,FALSE,FALSE
4,61,0,0,19,607,0,0.026984127,17.53595893,1,Feb,1,1,7,4,Returning_Visitor,TRUE,TRUE
0,0,0,0,6,415,0,0.033333333,0,0.4,Feb,1,1,3,2,Returning_Visitor,FALSE,FALSE
2,31,1,16,36,2083.530952,0,0.01351025,0,0.8,Feb,2,2,4,3,Returning_Visitor,FALSE,FALSE
3,58.5,0,0,17,281.6666667,0.007058824,0.017647059,0,0,Feb,1,1,3,4,Returning_Visitor,FALSE,FALSE
0,0,0,0,2,27,0.15,0.15,0,0,Feb,1,1,7,2,Returning_Visitor,FALSE,FALSE
0,0,1,0,9,215,0.044444444,0.074074074,0,0.8,Feb,4,1,1,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,12,162,0.05,0.066666667,0,0,Feb,1,1,1,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,2,114,0.05,0.066666667,0,0.8,Feb,3,3,1,3,Returning_Visitor,FALSE,FALSE
6,326.25,4,94,128,5062.213753,0.000854701,0.01791847,0,0,Feb,2,5,1,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,4,253,0,0.016666667,0,0.6,Feb,2,2,3,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,4,0,0.2,0.2,0,0.4,Feb,2,2,1,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,1,0,0.2,0.2,0,0.8,Feb,1,1,2,3,Returning_Visitor,FALSE,FALSE
2,22,0,0,25,436.5,0.008,0.024,0,0.2,Feb,2,4,1,1,Returning_Visitor,FALSE,FALSE
0,0,1,93,30,1045.833333,0.012903226,0.035483871,0,0.2,Feb,1,1,1,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,12,317.8333333,0,0.005555556,0,0,Feb,1,1,1,4,Returning_Visitor,TRUE,FALSE
0,0,0,0,21,1146.333333,0,0.012962963,0,0.8,Feb,3,2,1,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,11,577,0.018181818,0.027272727,0,0.2,Feb,2,2,3,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,8,95,0,0.075,0,0,Feb,4,1,3,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,6,301.5,0,0.111111111,0,0,Feb,2,4,9,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,6,243,0,0.033333333,0,0,Feb,2,4,4,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,4,135.5,0,0.05,0,0.6,Feb,2,2,1,2,Returning_Visitor,FALSE,FALSE
0,0,2,75,14,442.3333333,0,0.034375,0,0.8,Feb,1,1,3,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,3,41,0,0.066666667,0,0,Feb,1,1,3,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,11,292.9,0.028,0.11952381,0,0,Feb,2,4,3,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,1,0,0.2,0.2,0,0,Feb,1,1,3,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,9,1238.333333,0,0.040740741,0,0.4,Feb,2,2,1,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,10,225.4666667,0,0.05,0,0.4,Feb,1,1,8,3,Returning_Visitor,FALSE,FALSE
4,462,0,0,51,1873.216667,0,0.00754717,0,0.6,Feb,2,2,9,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,3,13,0.133333333,0.166666667,0,0,Feb,2,4,1,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,2,222,0,0.1,0,0,Feb,2,6,1,2,Returning_Visitor,TRUE,FALSE
2,20,0,0,16,214.8333333,0,0.022222222,0,0,Feb,2,2,1,6,Returning_Visitor,FALSE,FALSE
0,0,0,0,1,0,0.2,0.2,0,0,Feb,3,2,3,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,6,2017.166667,0,0.011111111,0,0.8,Feb,2,2,4,3,Returning_Visitor,FALSE,FALSE
6,111.5,0,0,26,449.0277778,0,0.018518519,0,0.6,Feb,1,1,3,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,6,158.1666667,0,0.033333333,0,0,Feb,3,2,4,2,Returning_Visitor,FALSE,FALSE
0,0,0,0,9,303.6666667,0.005555556,0.046296296,0,0,Feb,2,4,5,2,Returning_Visitor,FALSE,FALSE
0,0,0,0,3,25,0,0.066666667,0,0,Feb,2,4,1,5,Returning_Visitor,FALSE,FALSE
0,0,0,0,2,42,0.05,0.15,0,0.4,Feb,2,2,1,4,Returning_Visitor,FALSE,FALSE
4,103.625,0,0,14,1003.416667,0,0.018039216,0,0.2,Feb,1,1,3,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,1,0,0.2,0.2,0,0,Feb,2,2,7,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,9,272.5,0,0.011851852,0,0.2,Feb,1,1,6,3,Returning_Visitor,FALSE,FALSE
3,19,0,0,8,344,0,0.007407407,0,0,Feb,2,4,2,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,1,0,0.2,0.2,0,0,Feb,2,2,2,3,Returning_Visitor,FALSE,FALSE
0,0,1,19,10,852,0,0.009090909,0,0,Feb,2,2,3,6,Returning_Visitor,FALSE,FALSE
0,0,0,0,3,780,0.066666667,0.066666667,0,0.4,Feb,2,4,1,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,3,1038,0,0.033333333,0,0,Feb,2,2,1,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,4,573,0,0.05,0,0,Feb,2,2,3,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,28,1231.233333,0.007142857,0.030357143,0,0,Feb,1,1,4,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,11,316.6666667,0,0.027272727,0,0.8,Feb,2,2,2,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,20,873.7365079,0.0075,0.028166667,0,0,Feb,1,2,1,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,1,0,0.2,0.2,0,0.4,Feb,2,2,3,4,Returning_Visitor,FALSE,FALSE
0,0,0,0,4,16,0.1,0.15,0,0,Feb,2,5,5,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,19,615,0,0.026315789,0,0.2,Feb,2,2,3,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,9,261.75,0,0.026666667,0,0,Feb,2,6,1,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,21,615.8831169,0.033333333,0.04993081,0,0,Feb,3,2,2,1,Returning_Visitor,TRUE,FALSE
0,0,0,0,1,0,0.2,0.2,0,0,Feb,3,3,3,2,Returning_Visitor,TRUE,FALSE
0,0,0,0,6,117.5,0,0.033333333,0,0.8,Feb,1,1,1,3,Returning_Visitor,TRUE,FALSE
0,0,0,0,1,0,0.2,0.2,0,0,Feb,1,1,1,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,1,0,0.2,0.2,0,0,Feb,3,2,3,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,23,501.6666667,0.008695652,0.01884058,0,0.6,Feb,1,1,4,2,Returning_Visitor,FALSE,FALSE
2,58,2,22,31,829.1666667,0.03030303,0.040606061,0,0,Feb,1,1,1,1,Returning_Visitor,TRUE,FALSE
1,9.5,0,0,23,1223,0.015217391,0.012463768,0,0,Feb,1,1,1,2,Returning_Visitor,TRUE,FALSE
0,0,0,0,6,467,0,0.016666667,0,0.4,Feb,1,1,3,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,23,737.1666667,0.008695652,0.011594203,0,0.6,Feb,2,2,1,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,12,129,0,0.033333333,0,0,Feb,1,1,3,2,Returning_Visitor,FALSE,FALSE
0,0,0,0,5,63,0,0.04,0,0,Feb,2,2,1,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,5,125,0.086666667,0.166666667,0,0,Feb,2,2,1,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,11,684.3333333,0.018181818,0.063636364,0,0,Feb,2,4,6,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,20,665.4722222,0,0.0145,0,0.8,Feb,3,2,7,4,Returning_Visitor,TRUE,FALSE
1,0,0,0,15,487.5,0,0.019166667,0,0.8,Feb,1,1,2,4,Returning_Visitor,TRUE,FALSE
0,0,0,0,17,437.1666667,0.011111111,0.033333333,0,0,Feb,2,4,1,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,3,55,0.066666667,0.1,0,0.6,Feb,1,1,1,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,1,0,0.2,0.2,0,0.8,Feb,1,1,1,2,Returning_Visitor,TRUE,FALSE
5,41.3,0,0,24,446.9277778,0,0.008602151,0,1,Feb,2,2,8,1,Returning_Visitor,TRUE,FALSE
3,87,0,0,10,320.5,0,0.015384615,0,0,Feb,1,1,2,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,7,666,0,0.014285714,0,0,Feb,1,1,6,2,Returning_Visitor,FALSE,FALSE
1,0,0,0,21,405.7095238,0.010743802,0.047002635,0,0,Feb,1,1,1,4,Returning_Visitor,FALSE,FALSE
0,0,0,0,1,0,0.2,0.2,0,0,Feb,3,2,3,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,6,163.25,0.033333333,0.033333333,0,0.6,Feb,1,1,6,2,Returning_Visitor,FALSE,FALSE
0,0,0,0,17,284.25,0,0.011764706,0,0,Feb,3,2,6,2,Returning_Visitor,TRUE,FALSE
0,0,0,0,1,0,0.2,0.2,0,0.6,Feb,4,2,1,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,1,0,0.2,0.2,0,0,Feb,2,4,1,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,8,260,0.008333333,0.025,0,0.8,Feb,3,2,1,3,Returning_Visitor,TRUE,FALSE
0,0,16,1210.397619,5,279.8571429,0.003174603,0.012764202,0,0,Mar,2,2,1,8,Returning_Visitor,FALSE,FALSE
0,0,0,0,20,927.45,0.011111111,0.027248677,8.000740741,0,Mar,1,1,3,1,Returning_Visitor,FALSE,FALSE
2,9,0,0,50,836.8,0,0.006339869,0,0,Mar,2,2,3,2,Returning_Visitor,FALSE,FALSE
10,293.7782051,2,153,96,3283.166739,0.001960784,0.013509414,0,0,Mar,3,2,6,2,Returning_Visitor,TRUE,FALSE
9,111.5,1,48.5,49,1868.819697,0,0.020708874,1.706014966,0,Mar,2,2,7,2,Returning_Visitor,FALSE,TRUE
3,47,1,51,68,3008.124108,0.007142857,0.016727891,46.53017511,0,Mar,2,2,1,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,2,0,0.2,0.2,0,0,Mar,1,1,1,3,Returning_Visitor,FALSE,FALSE
3,1226,5,3,24,3230.25,0.036190476,0.096,0,0,Mar,2,2,1,2,Returning_Visitor,FALSE,FALSE
3,52,0,0,9,319,0,0.02,0,0,Mar,1,1,1,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,3,42,0,0.066666667,0,0,Mar,2,2,3,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,22,354.3333333,0.009090909,0.057662338,0,0,Mar,1,1,7,2,Returning_Visitor,TRUE,FALSE
0,0,0,0,98,3556.61241,0.002061856,0.010173465,0,0,Mar,1,1,1,3,Returning_Visitor,FALSE,FALSE
2,56,1,144,67,2563.783333,0,0.005797101,19.34265017,0,Mar,2,2,4,2,New_Visitor,FALSE,TRUE
3,112.9607843,0,0,13,3014.018519,0.013068182,0.06140625,0,0,Mar,2,2,1,2,Returning_Visitor,FALSE,FALSE
0,0,0,0,17,840.2333333,0,0.001666667,109.176,0,Mar,2,2,9,2,New_Visitor,FALSE,TRUE
3,94,2,125,55,1970.844805,0,0.001724138,96.25511582,0,Mar,2,4,1,2,New_Visitor,TRUE,TRUE
1,32,0,0,50,2867,0,0.004,153.4432478,0,Mar,2,2,7,8,Returning_Visitor,TRUE,TRUE
0,0,0,0,5,43,0,0.04,0,0,Mar,1,1,1,9,Returning_Visitor,TRUE,FALSE
5,218,0,0,13,284.5,0,0.004166667,0,0,Mar,1,1,1,2,New_Visitor,FALSE,FALSE
0,0,0,0,3,133.5,0,0.088888889,0,0,Mar,1,2,1,8,Returning_Visitor,FALSE,FALSE
1,119,0,0,12,297.6666667,0,0.008333333,0,0,Mar,3,2,1,10,Returning_Visitor,FALSE,FALSE
3,281,0,0,16,453.75,0,0.005263158,0,0,Mar,2,2,5,2,New_Visitor,FALSE,FALSE
1,18,0,0,16,1331.75,0,0.0125,33.79956701,0,Mar,2,5,2,3,New_Visitor,FALSE,TRUE
2,40,0,0,5,558.5,0,0.028571429,0,0,Mar,2,2,7,2,New_Visitor,TRUE,FALSE
3,107,0,0,4,145.8333333,0,0.016666667,0,0,Mar,3,2,7,1,New_Visitor,FALSE,FALSE
0,0,0,0,8,731,0,0.04375,0,0,Mar,2,4,1,3,Returning_Visitor,FALSE,FALSE
2,49,1,127,4,188,0.033333333,0.0375,0,0,Mar,3,2,3,2,Returning_Visitor,FALSE,FALSE
0,0,0,0,14,565.3333333,0.037619048,0.04952381,0,0,Mar,2,6,3,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,2,50,0,0.05,0,0,Mar,3,2,8,11,Returning_Visitor,FALSE,FALSE
4,57,0,0,7,591,0.006666667,0.033333333,0,0,Mar,1,2,6,6,Returning_Visitor,TRUE,FALSE
2,2,3,261,10,281,0,0.042857143,0,0,Mar,2,2,1,2,Returning_Visitor,FALSE,FALSE
2,123,2,306.3333333,18,483.8333333,0,0.02,0,0,Mar,2,2,4,1,Returning_Visitor,FALSE,FALSE
2,118,0,0,4,42,0,0.066666667,0,0,Mar,1,2,7,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,35,1192.386111,0.005714286,0.028571429,0,0,Mar,2,4,2,2,Returning_Visitor,FALSE,FALSE
0,0,0,0,12,198,0.016666667,0.075,0,0,Mar,2,2,3,2,Returning_Visitor,FALSE,FALSE
0,0,0,0,3,15,0,0.066666667,0,0,Mar,2,4,3,12,Returning_Visitor,FALSE,FALSE
2,38,0,0,14,643,0,0.013333333,35.0928,0,Mar,2,2,5,1,Returning_Visitor,FALSE,TRUE
0,0,0,0,5,23,0.08,0.12,0,0,Mar,2,2,1,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,4,14,0.1,0.15,0,0,Mar,3,2,1,1,Returning_Visitor,FALSE,FALSE
1,54,0,0,6,210.5,0,0.02,0,0,Mar,2,2,1,8,New_Visitor,FALSE,FALSE
1,993,0,0,28,1529.30467,0.001481481,0.009150327,0,0,Mar,3,2,4,2,Returning_Visitor,FALSE,FALSE
0,0,0,0,2,19,0,0.1,0,0,Mar,2,2,3,11,Returning_Visitor,TRUE,FALSE
5,74.25,2,84,37,1599.083333,0,0.006578947,0,0,Mar,2,2,4,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,9,102.5,0,0.022222222,0,0,Mar,2,2,1,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,16,2337,0,0.013333333,17.76266667,0,Mar,2,2,1,1,Returning_Visitor,FALSE,TRUE
0,0,0,0,19,1883.5,0.010526316,0.021052632,0,0,Mar,2,2,1,3,Returning_Visitor,FALSE,FALSE
2,32,0,0,50,1245.3,0.004,0.020666667,7.146260888,0,Mar,2,2,7,9,Returning_Visitor,TRUE,FALSE
6,666.8333333,0,0,22,1674.583333,0,0.014666667,0,0,Mar,2,2,3,2,Returning_Visitor,FALSE,FALSE
0,0,0,0,9,132,0.011111111,0.033333333,0,0,Mar,4,1,1,3,Returning_Visitor,TRUE,FALSE
1,73,1,740,50,1434.255128,0,0.019230769,22.03276923,0,Mar,2,2,3,2,Returning_Visitor,TRUE,FALSE
2,154,0,0,18,367.25,0.005263158,0.044210526,0,0,Mar,3,2,2,1,Returning_Visitor,TRUE,FALSE
3,49.33333333,5,303.25,7,148.5,0,0.014081633,0,0,Mar,3,2,2,2,Returning_Visitor,FALSE,FALSE
3,118.5,0,0,29,1482.210784,0.006896552,0.010600255,0,0,Mar,3,2,1,8,Returning_Visitor,TRUE,FALSE
6,153.5,0,0,34,1048.492063,0.011578947,0.032225685,0,0,Mar,2,6,1,1,Returning_Visitor,TRUE,FALSE
0,0,0,0,9,478,0,0.011111111,0,0,Mar,3,2,2,3,Returning_Visitor,TRUE,FALSE
0,0,0,0,16,980.25,0,0.04,0,0,Mar,2,2,4,3,Returning_Visitor,FALSE,FALSE
8,72.25,1,21.5,51,1124.693074,0.022807018,0.036550087,0,0,Mar,2,2,2,2,Returning_Visitor,FALSE,FALSE
2,24.5,0,0,22,353.1666667,0.018181818,0.031818182,0,0,Mar,2,5,1,3,Returning_Visitor,FALSE,FALSE
1,0,0,0,18,1489.083333,0.023529412,0.046470588,0,0,Mar,2,2,8,1,Returning_Visitor,FALSE,FALSE
0,0,1,1220,28,2389.333333,0.016666667,0.030833333,0,0,Mar,2,2,1,3,Returning_Visitor,TRUE,FALSE
0,0,0,0,7,753,0,0.00952381,0,0,Mar,2,10,1,2,Returning_Visitor,FALSE,FALSE
0,0,0,0,31,688.1666667,0,0.019354839,0,0,Mar,4,1,1,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,14,811,0.015384615,0.041025641,0,0,Mar,2,2,8,1,Returning_Visitor,FALSE,FALSE
1,22,0,0,9,415.25,0.033333333,0.048148148,0,0,Mar,3,3,1,1,Returning_Visitor,FALSE,FALSE
16,155.6313131,0,0,32,908.013456,0.005,0.01805276,4.368515556,0,Mar,2,2,3,2,Returning_Visitor,FALSE,TRUE
1,21.33333333,1,235,71,2753.378571,0.012676056,0.015201207,0,0,Mar,3,2,2,1,Returning_Visitor,TRUE,FALSE
2,191,1,100,46,2452.582143,0.007246377,0.022253906,0,0,Mar,3,2,9,3,Returning_Visitor,TRUE,FALSE
0,0,0,0,18,5188.5,0,0.05,0,0,Mar,2,5,1,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,2,0,0.2,0.2,0,0,Mar,1,1,1,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,5,57,0.08,0.12,0,0,Mar,2,5,2,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,2,8,0,0.1,0,0,Mar,2,2,5,1,Returning_Visitor,TRUE,FALSE
4,96.5,0,0,19,1430.659091,0.01,0.025666667,0,0,Mar,1,1,1,1,Returning_Visitor,FALSE,FALSE
1,13,0,0,2,20,0,0.05,0,0,Mar,3,2,3,2,Returning_Visitor,FALSE,FALSE
5,1388.75,0,0,4,1373.75,0,0.02,0,0,Mar,1,1,7,8,Returning_Visitor,FALSE,FALSE
0,0,0,0,45,844.25,0,0.01037037,0,0,Mar,1,1,3,1,Returning_Visitor,FALSE,FALSE
0,0,1,0,7,188,0,0.033333333,0,0,Mar,2,2,1,8,New_Visitor,FALSE,FALSE
3,51,0,0,14,527.375,0.015555556,0.033862434,0,0,Mar,7,1,6,1,Returning_Visitor,TRUE,FALSE
0,0,0,0,1,0,0.2,0.2,0,0,Mar,3,3,5,2,Returning_Visitor,FALSE,FALSE
1,158,1,64,29,1916.761905,0.006451613,0.018709677,8.772473118,0,Mar,2,2,3,2,Returning_Visitor,TRUE,TRUE
0,0,0,0,9,116.3333333,0,0.066666667,0,0,Mar,2,2,1,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,30,397,0,0.02,0,0,Mar,2,2,7,2,Returning_Visitor,FALSE,FALSE
0,0,0,0,63,5220.083333,0,0.003329865,51.46331148,0,Mar,2,5,3,1,Returning_Visitor,TRUE,TRUE
0,0,0,0,20,219.3333333,0,0.011666667,0,0,Mar,1,8,7,2,Returning_Visitor,FALSE,FALSE
0,0,0,0,5,74,0,0.04,0,0,Mar,2,2,1,10,Returning_Visitor,FALSE,FALSE
0,0,0,0,15,1559.6,0,0.033846154,0,0,Mar,2,4,1,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,6,236.5,0,0.016666667,0,0,Mar,1,1,1,3,Returning_Visitor,TRUE,FALSE
1,10,0,0,14,348.6666667,0.035714286,0.053571429,0,0,Mar,3,2,1,1,Returning_Visitor,TRUE,FALSE
0,0,0,0,1,0,0.2,0.2,0,0,Mar,2,5,1,1,Returning_Visitor,FALSE,FALSE
1,28,1,47,13,224.5,0,0.014285714,0,0,Mar,1,1,1,8,New_Visitor,FALSE,FALSE
4,27,0,0,42,601.7666667,0,0.004545455,0,0,Mar,2,5,3,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,5,75.5,0.02,0.013333333,0,0,Mar,1,1,2,9,Returning_Visitor,TRUE,FALSE
0,0,0,0,2,153,0,0.05,0,0,Mar,2,5,6,1,Returning_Visitor,FALSE,FALSE
4,15,0,0,10,197.2,0,0.016666667,38.99,0,Mar,1,1,1,3,Returning_Visitor,TRUE,TRUE
0,0,0,0,18,3658.5,0.016666667,0.05,0,0,Mar,4,2,9,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,5,1162.5,0,0.025,0,0,Mar,2,2,2,2,Returning_Visitor,FALSE,FALSE
0,0,0,0,32,556.6,0.014583333,0.039583333,0,0,Mar,2,2,3,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,3,41,0,0.033333333,0,0,Mar,2,2,1,3,Returning_Visitor,TRUE,FALSE
0,0,0,0,11,300.0714286,0,0.02,53.9892,0,Mar,2,2,1,11,Returning_Visitor,TRUE,TRUE
13,1249.809524,4,205,36,1626.625433,0.010638298,0.026186255,6.831792392,0,Mar,3,2,2,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,6,69.25,0,0.044444444,0,0,Mar,2,2,4,3,Returning_Visitor,FALSE,FALSE
2,390,0,0,10,1169.1,0.02,0.05,0,0,Mar,3,9,9,2,Returning_Visitor,FALSE,FALSE
0,0,0,0,8,402,0,0.038095238,0,0,Mar,2,2,2,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,1,0,0.2,0.2,0,0,Mar,2,2,1,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,35,3324.333333,0.011428571,0.024761905,0,0,Mar,2,2,1,1,Returning_Visitor,FALSE,FALSE
11,215.5238095,1,70,87,3037.499952,0.002150538,0.007722385,0,0,Mar,2,2,5,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,4,59,0,0.05,0,0,Mar,1,1,1,10,Returning_Visitor,FALSE,FALSE
1,11,0,0,51,1059.253472,0.010588235,0.022643039,0,0,Mar,3,2,6,3,Returning_Visitor,FALSE,FALSE
2,20,0,0,7,720,0,0.011111111,0,0,Mar,2,2,3,6,Returning_Visitor,FALSE,FALSE
0,0,0,0,40,905.4856061,0.0135,0.03747619,0,0,Mar,3,2,2,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,1,0,0.2,0.2,0,0,Mar,1,1,1,1,Returning_Visitor,TRUE,FALSE
2,8,1,14.33333333,14,603.6666667,0,0.0125,44.67925,0,Mar,2,2,1,7,Returning_Visitor,FALSE,TRUE
0,0,0,0,13,328.9166667,0,0.014285714,59.79014286,0,Mar,3,2,1,3,Returning_Visitor,FALSE,TRUE
0,0,0,0,33,778.8166667,0,0.022424242,0,0,Mar,2,5,1,1,Returning_Visitor,FALSE,FALSE
4,171.25,0,0,22,851.5595238,0.004545455,0.031907308,0,0,Mar,3,2,1,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,1,0,0.2,0.2,0,0,Mar,1,1,8,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,3,227.5,0,0.022222222,0,0,Mar,2,2,1,3,Returning_Visitor,FALSE,FALSE
5,227.3333333,0,0,17,528.9,0,0.002272727,0,0,Mar,1,1,1,9,Returning_Visitor,TRUE,FALSE
0,0,0,0,15,872.8333333,0,0.026666667,0,0,Mar,2,2,2,3,Returning_Visitor,TRUE,FALSE
0,0,0,0,2,0,0.2,0.2,0,0,Mar,3,2,3,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,35,835.0666667,0.012571429,0.044761905,0,0,Mar,2,2,6,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,4,82.5,0,0.05,0,0,Mar,3,2,1,3,Returning_Visitor,FALSE,FALSE
0,0,1,0,1,13,0,0.1,0,0,Mar,3,2,3,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,2,9,0,0.1,0,0,Mar,2,2,1,3,Returning_Visitor,TRUE,FALSE
0,0,0,0,2,7,0,0.1,0,0,Mar,2,2,1,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,12,94.5,0.033333333,0.025555556,0,0,Mar,3,2,4,11,Returning_Visitor,FALSE,FALSE
5,86,0,0,23,267.3,0,0.016,0,0,Mar,1,1,4,9,Returning_Visitor,TRUE,FALSE
0,0,0,0,29,3312.5,0.013793103,0.028965517,0,0,Mar,2,2,1,13,Returning_Visitor,FALSE,FALSE
0,0,0,0,3,75,0,0.066666667,0,0,Mar,2,5,1,3,Returning_Visitor,TRUE,FALSE
2,7,0,0,10,75,0.05,0.11,0,0,Mar,2,2,1,1,Returning_Visitor,FALSE,FALSE
0,0,1,24,27,1547.5,0.003703704,0.014814815,0,0,Mar,3,2,1,1,Returning_Visitor,FALSE,FALSE
7,186.9761905,2,40,35,1276.157071,0,0.008681765,0,0,Mar,1,1,6,2,Returning_Visitor,FALSE,FALSE
3,138,2,136,54,2631.1,0,0.00969697,0,0,Mar,1,2,1,2,Returning_Visitor,FALSE,FALSE
0,0,0,0,2,96,0,0.1,0,0,Mar,4,1,1,1,Returning_Visitor,FALSE,FALSE
2,374,0,0,3,1370,0,0.025,0,0,Mar,2,2,1,8,Returning_Visitor,FALSE,FALSE
2,61,0,0,5,97,0,0.04,0,0,Mar,2,2,1,1,Returning_Visitor,FALSE,FALSE
1,14,0,0,46,1380.166667,0,0.01037037,0,0,Mar,4,1,1,1,Returning_Visitor,FALSE,FALSE
1,38,0,0,23,1483.6,0.022916667,0.038373016,7.103020833,0,Mar,3,2,6,1,Returning_Visitor,FALSE,TRUE
0,0,0,0,5,156,0,0.04,0,0,Mar,2,2,4,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,10,240.75,0,0.02,0,0,Mar,2,2,9,2,Returning_Visitor,FALSE,FALSE
2,96,0,0,37,1238.5,0.005128205,0.016410256,0,0,Mar,2,2,1,2,New_Visitor,FALSE,FALSE
6,615.25,0,0,68,2524.719048,0,0.000175593,0,0,Mar,1,2,6,1,Returning_Visitor,FALSE,FALSE
4,111,0,0,4,54,0,0.028571429,0,0,Mar,2,2,1,1,Returning_Visitor,FALSE,FALSE
2,147,0,0,2,35,0,0.05,0,0,Mar,2,2,1,2,New_Visitor,FALSE,FALSE
0,0,0,0,15,175.9166667,0.013333333,0.026666667,0,0,Mar,1,1,1,1,Returning_Visitor,TRUE,FALSE
3,53.16666667,0,0,11,263.6,0,0.003571429,0,0,Mar,3,2,1,9,Returning_Visitor,FALSE,FALSE
2,58,0,0,7,101.8,0,0.011111111,0,0,Mar,3,2,8,2,New_Visitor,FALSE,FALSE
0,0,0,0,1,0,0.2,0.2,0,0,Mar,3,2,3,1,Returning_Visitor,FALSE,FALSE
3,48.5,0,0,55,1042.242857,0,0.002222222,0,0,Mar,4,2,1,2,New_Visitor,FALSE,FALSE
1,21,3,116,21,613.6666667,0.008333333,0.023611111,0,0,Mar,1,2,1,1,Returning_Visitor,FALSE,FALSE
4,115.3333333,0,0,64,1588.944444,0.003076923,0.009213675,0,0,Mar,2,2,1,1,Returning_Visitor,FALSE,FALSE
0,0,1,929,75,4105.666667,0.002631579,0.017324561,0,0,Mar,2,2,3,1,Returning_Visitor,FALSE,FALSE
1,8,0,0,14,269.5,0,0.019047619,0,0,Mar,2,2,3,1,Returning_Visitor,FALSE,FALSE
1,32.28571429,0,0,8,1236.2,0,0.028571429,0,0,Mar,3,2,1,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,49,1384.016667,0,0.011904762,0,0,Mar,2,2,1,2,Returning_Visitor,FALSE,FALSE
0,0,0,0,4,52,0,0.025,0,0,Mar,2,2,1,2,Returning_Visitor,FALSE,FALSE
1,11,0,0,29,664.75,0,0.005057471,0,0,Mar,3,2,1,2,Returning_Visitor,FALSE,FALSE
0,0,0,0,7,64,0,0.014285714,0,0,Mar,2,2,1,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,1,0,0.2,0.2,0,0,Mar,2,2,4,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,8,326.5,0.1,0.125,0,0,Mar,1,1,1,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,25,1690.977778,0.008,0.037333333,0,0,Mar,1,1,8,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,1,0,0.2,0.2,0,0,Mar,2,2,8,1,Returning_Visitor,FALSE,FALSE
4,277.75,0,0,3,178.75,0,0.008,0,0,Mar,3,2,3,8,New_Visitor,FALSE,FALSE
0,0,0,0,12,407,0,0.033333333,0,0,Mar,2,2,4,3,Returning_Visitor,FALSE,FALSE
6,241.1666667,0,0,39,1513.566667,0.005128205,0.021367521,0,0,Mar,1,1,1,3,Returning_Visitor,FALSE,FALSE
3,64,0,0,24,832.0909091,0,0.009876543,0,0,Mar,2,10,1,3,New_Visitor,FALSE,FALSE
1,25.5,0,0,12,250.8333333,0,0.016666667,0,0,Mar,3,2,2,1,Returning_Visitor,TRUE,FALSE
2,64,0,0,15,565.6666667,0,0.00625,0,0,Mar,2,2,1,1,New_Visitor,FALSE,FALSE
0,0,0,0,10,194,0.02,0.04,0,0,Mar,2,5,7,1,Returning_Visitor,FALSE,FALSE
8,130,1,18,19,298,0,0.016666667,19.66818546,0,Mar,2,2,3,1,Returning_Visitor,TRUE,FALSE
9,79,1,155.5,55,1743.066667,0,0.004371585,0,0,Mar,2,2,6,2,Returning_Visitor,FALSE,FALSE
3,84,0,0,27,655.9166667,0,0.011111111,0,0,Mar,2,2,2,1,Returning_Visitor,FALSE,FALSE
0,0,1,9,30,1992.833333,0,0.003333333,9.227000967,0,Mar,2,4,1,3,Returning_Visitor,FALSE,TRUE
0,0,0,0,3,0,0.2,0.2,0,0,Mar,2,2,4,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,24,308.8635531,0,0.028030303,0,0,Mar,2,6,2,2,Returning_Visitor,FALSE,FALSE
3,41,0,0,46,2749.666667,0,0.005555556,0,0,Mar,2,2,1,2,Returning_Visitor,FALSE,FALSE
0,0,0,0,1,0,0.2,0.2,0,0,Mar,3,2,1,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,25,812,0,0.008,0,0,Mar,2,2,1,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,12,166,0.028571429,0.071428571,0,0,Mar,2,2,1,1,Returning_Visitor,TRUE,FALSE
1,14,0,0,4,65,0,0.05,0,0,Mar,2,4,3,1,Returning_Visitor,FALSE,FALSE
4,86,0,0,46,2450.688095,0.027083333,0.047905093,0,0,Mar,1,1,3,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,10,226.8333333,0,0.01,0,0,Mar,1,1,1,2,Returning_Visitor,TRUE,FALSE
3,618,0,0,9,341,0,0.007692308,34.43601877,0,Mar,2,2,9,3,New_Visitor,FALSE,TRUE
0,0,0,0,13,226,0,0.053846154,0,0,Mar,2,2,4,3,Returning_Visitor,TRUE,FALSE
1,11.88888889,0,0,111,3510.879903,9.83E-05,0.009438427,12.01656549,0,Mar,3,2,5,2,Returning_Visitor,FALSE,FALSE
5,51.5,0,0,2,6,0,0.033333333,0,0,Mar,2,5,2,1,Returning_Visitor,FALSE,FALSE
2,7,0,0,27,559.4,0.014814815,0.030452675,0,0,Mar,2,4,4,3,Returning_Visitor,TRUE,FALSE
8,269,0,0,33,1109.883333,0.013888889,0.027742165,0,0,Mar,1,1,4,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,5,239,0,0.04,0,0,Mar,2,2,9,1,Returning_Visitor,FALSE,FALSE
2,44.5,0,0,7,212.1666667,0,0.00625,0,0,Mar,3,2,1,8,New_Visitor,TRUE,FALSE
1,3,14,1165.166667,81,2820.952419,0.008897485,0.029431012,0,0,Mar,2,2,3,2,Returning_Visitor,FALSE,FALSE
0,0,0,0,6,44,0.066666667,0.1,0,0,Mar,2,2,3,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,8,781,0.028571429,0.057142857,0,0,Mar,3,2,4,1,Returning_Visitor,FALSE,FALSE
4,61,0,0,14,175.6666667,0,0.010588235,0,0,Mar,2,2,5,2,Returning_Visitor,FALSE,FALSE
3,90,0,0,25,397.8846154,0.005333333,0.033504762,0,0,Mar,2,2,1,1,Returning_Visitor,TRUE,FALSE
0,0,0,0,25,770.0285714,0.0112,0.034933333,0,0,Mar,3,2,8,10,Returning_Visitor,FALSE,FALSE
2,102.5,3,60,22,1034.975,0,0.014,16.14384,0,Mar,1,1,4,2,Returning_Visitor,FALSE,TRUE
0,0,0,0,2,12,0,0.1,0,0,Mar,1,1,5,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,3,8,0.066666667,0.133333333,0,0,Mar,2,4,1,3,Returning_Visitor,FALSE,FALSE
1,17,0,0,22,399.8,0.019047619,0.038095238,0,0,Mar,1,5,7,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,1,0,0.2,0.2,0,0,Mar,2,2,2,3,Returning_Visitor,FALSE,FALSE
9,213.3214286,5,528,61,2258.430586,0.01,0.020655014,2.810812468,0,Mar,1,1,4,2,Returning_Visitor,FALSE,FALSE
0,0,0,0,2,254,0,0.1,0,0,Mar,3,2,4,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,7,67,0,0.028571429,0,0,Mar,2,2,1,2,Returning_Visitor,FALSE,FALSE
0,0,0,0,4,57,0,0.025,0,0,Mar,2,2,6,2,Returning_Visitor,FALSE,FALSE
0,0,0,0,12,240.4166667,0,0.061688312,0,0,Mar,3,2,1,6,Returning_Visitor,FALSE,FALSE
0,0,0,0,8,551.1666667,0.025,0.035,0,0,Mar,3,2,2,3,Returning_Visitor,FALSE,FALSE
6,71.5,0,0,47,1532.2,0.009929078,0.019797366,27.26888014,0,Mar,2,2,1,1,Returning_Visitor,FALSE,TRUE
0,0,0,0,7,379.5,0.057142857,0.085714286,0,0,Mar,3,2,8,1,Returning_Visitor,FALSE,FALSE
1,6,0,0,14,548.1857143,0.028571429,0.02987013,0,0,Mar,3,2,3,1,Returning_Visitor,TRUE,FALSE
3,304,0,0,31,1735.301587,0.015625,0.0515625,0,0,Mar,1,1,2,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,3,103,0,0.022222222,0,0,Mar,1,1,1,3,Returning_Visitor,TRUE,FALSE
7,151,0,0,44,1406.1,0.004081633,0.006501458,0,0,Mar,1,1,4,2,Returning_Visitor,FALSE,FALSE
3,199.75,0,0,8,331.4,0,0.003333333,0,0,Mar,3,2,2,10,New_Visitor,FALSE,FALSE
1,13.5,1,28,88,1759.275703,0.004545455,0.020644542,0,0,Mar,2,2,1,2,Returning_Visitor,FALSE,FALSE
0,0,0,0,1,0,0.2,0.2,0,0,Mar,2,4,1,1,Returning_Visitor,FALSE,FALSE
7,191.2,4,654.3333333,31,1204.600433,0.000854701,0.013342491,11.92009615,0,Mar,2,2,7,2,Returning_Visitor,FALSE,TRUE
2,47,0,0,39,1743.366667,0,0.016410256,78.93483561,0,Mar,3,3,2,1,Returning_Visitor,FALSE,TRUE
0,0,0,0,10,236,0,0.026666667,0,0,Mar,2,2,1,1,Returning_Visitor,FALSE,FALSE
5,197,4,246,17,427.0833333,0,0.008695652,0,0,Mar,1,1,3,2,New_Visitor,FALSE,FALSE
3,115.125,0,0,46,909.522619,0.004255319,0.020449173,0,0,Mar,2,2,6,1,Returning_Visitor,FALSE,FALSE
4,312.75,0,0,14,702.9166667,0,0.014259259,0,0,Mar,3,2,1,2,New_Visitor,FALSE,FALSE
0,0,0,0,40,962.3333333,0,0.01625,0,0,Mar,2,2,9,1,Returning_Visitor,FALSE,FALSE
4,724,0,0,2,159,0,0.008,0,0,Mar,4,2,1,7,New_Visitor,FALSE,FALSE
0,0,0,0,2,24,0,0.1,0,0,Mar,2,6,1,2,Returning_Visitor,FALSE,FALSE
8,237.5,4,142,30,1569.625,0,0.008108108,15.88906362,0,Mar,1,2,1,9,Returning_Visitor,TRUE,TRUE
3,66.33333333,0,0,15,424.8333333,0,0.0125,0,0,Mar,2,2,6,6,Returning_Visitor,FALSE,FALSE
0,0,0,0,16,154.8333333,0,0.00625,0,0,Mar,2,4,7,1,Returning_Visitor,FALSE,FALSE
2,190,1,0,37,758.4428571,0,0.010526316,0,0,Mar,1,1,6,1,Returning_Visitor,TRUE,FALSE
4,174,1,18.5,11,305.875,0,0.001709402,0,0,Mar,1,2,3,8,New_Visitor,TRUE,FALSE
3,227,0,0,2,62,0,0.025,0,0,Mar,3,2,1,10,Returning_Visitor,TRUE,FALSE
1,23,0,0,15,656.25,0.028571429,0.028571429,0,0,Mar,1,1,8,2,Returning_Visitor,TRUE,FALSE
0,0,0,0,29,617.5,0.006896552,0.01954023,0,0,Mar,2,2,3,10,Returning_Visitor,FALSE,FALSE
0,0,2,39,15,245,0,0.0125,11.9955404,0,Mar,2,2,1,3,Returning_Visitor,TRUE,TRUE
0,0,0,0,3,20,0,0.066666667,0,0,Mar,2,2,2,1,Returning_Visitor,TRUE,FALSE
0,0,0,0,1,0,0.2,0.2,0,0,Mar,1,1,1,1,Returning_Visitor,TRUE,FALSE
0,0,0,0,2,22,0,0.1,0,0,Mar,1,2,9,2,Returning_Visitor,FALSE,FALSE
1,26,1,0,55,872.4,0.003508772,0.01754386,0,0,Mar,2,5,1,1,Returning_Visitor,TRUE,FALSE
0,0,0,0,1,0,0.2,0.2,0,0,Mar,3,2,2,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,38,1372,0.005405405,0.018918919,0,0,Mar,2,2,1,2,Returning_Visitor,FALSE,FALSE
2,41,0,0,7,139,0.022222222,0.055555556,0,0,Mar,2,5,6,2,Returning_Visitor,TRUE,FALSE
4,74,2,629,149,5042.458059,0.003870968,0.007285123,18.36804916,0,Mar,2,2,1,2,Returning_Visitor,FALSE,TRUE
0,0,0,0,5,288.5,0,0.0125,0,0,Mar,2,2,1,2,Returning_Visitor,TRUE,FALSE
0,0,0,0,2,0,0.2,0.2,0,0,Mar,2,2,1,3,Returning_Visitor,TRUE,FALSE
0,0,0,0,6,192,0,0.04,0,0,Mar,2,10,4,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,27,954.6666667,0,0.003846154,0,0,Mar,2,2,1,2,Returning_Visitor,FALSE,FALSE
0,0,0,0,1,0,0.2,0.2,0,0,Mar,2,2,4,11,Returning_Visitor,FALSE,FALSE
2,74,0,0,13,429,0.013333333,0.040444444,0,0,Mar,2,4,3,6,Returning_Visitor,FALSE,FALSE
0,0,0,0,41,1546.5,0,0.008333333,0,0,Mar,3,2,1,1,Returning_Visitor,TRUE,FALSE
2,45,0,0,9,96.46666667,0,0.018181818,0,0,Mar,2,2,3,1,Returning_Visitor,FALSE,FALSE
2,112,0,0,9,198.8333333,0,0.006060606,0,0,Mar,3,2,3,2,New_Visitor,TRUE,FALSE
0,0,0,0,8,181,0.075,0.1,0,0,Mar,3,2,1,13,Returning_Visitor,TRUE,FALSE
2,37,0,0,15,208.5,0,0.011764706,0,0,Mar,2,2,3,2,New_Visitor,TRUE,FALSE
0,0,0,0,21,517.4238095,0.019047619,0.025,0,0,Mar,2,5,2,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,12,358.0666667,0,0.025,0,0,Mar,3,3,2,1,Returning_Visitor,FALSE,FALSE
1,5.5,0,0,22,339.25,0,0.026984127,0,0,Mar,2,2,2,3,Returning_Visitor,FALSE,FALSE
3,50,0,0,13,796,0,0.013333333,0,0,Mar,2,2,5,2,Returning_Visitor,FALSE,FALSE
0,0,0,0,31,1759.416667,0,0.002903226,0,0,Mar,2,2,4,2,Returning_Visitor,TRUE,FALSE
2,26,0,0,19,3277,0.015789474,0.037894737,0,0,Mar,2,2,4,6,Returning_Visitor,FALSE,FALSE
0,0,0,0,13,265.1666667,0,0.046153846,0,0,Mar,2,2,4,2,Returning_Visitor,FALSE,FALSE
5,113.5,0,0,13,437.2,0,0.002222222,0,0,Mar,1,8,4,11,New_Visitor,FALSE,FALSE
0,0,0,0,6,92,0,0.066666667,0,0,Mar,1,1,3,10,Returning_Visitor,FALSE,FALSE
3,279,0,0,0,0,0,0.05,0,0,Mar,3,2,1,10,Returning_Visitor,TRUE,FALSE
3,228,1,267.5,23,1266.267677,0.002197802,0.037765568,0,0,Mar,2,2,3,2,Returning_Visitor,FALSE,FALSE
3,55,2,4,2,19,0,0.033333333,0,0,Mar,1,1,8,2,New_Visitor,FALSE,FALSE
6,112.5,0,0,47,1882.113409,0.004,0.019314286,17.527656,0,Mar,1,1,4,3,Returning_Visitor,FALSE,FALSE
1,17,0,0,12,616.4,0,0.018181818,0,0,Mar,1,1,3,1,Returning_Visitor,TRUE,FALSE
0,0,0,0,5,155,0.04,0.053333333,0,0,Mar,2,2,1,2,Returning_Visitor,FALSE,FALSE
0,0,0,0,11,814.5,0,0.01,0,0,Mar,1,1,1,2,New_Visitor,FALSE,FALSE
0,0,0,0,21,460.4166667,0.019047619,0.036507937,0,0,Mar,2,2,6,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,5,819.5,0,0.036,0,0,Mar,2,2,1,2,Returning_Visitor,TRUE,FALSE
1,8.5,0,0,30,659.2,0,0.006451613,0,0,Mar,2,2,3,3,New_Visitor,TRUE,FALSE
0,0,0,0,5,427,0,0.04,0,0,Mar,3,3,3,9,Returning_Visitor,TRUE,FALSE
0,0,0,0,1,0,0.2,0.2,0,0,Mar,2,2,4,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,17,766.5,0,0.0125,61.9395,0,Mar,2,2,1,2,New_Visitor,TRUE,TRUE
0,0,0,0,1,0,0.2,0.2,0,0,Mar,2,5,5,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,14,2425,0,0.007142857,0,0,Mar,2,2,1,3,Returning_Visitor,FALSE,FALSE
7,319.5,0,0,11,416.5,0,0.007142857,0,0,Mar,3,2,1,9,New_Visitor,TRUE,FALSE
0,0,0,0,15,638.6428571,0.003571429,0.053571429,0,0,Mar,3,2,1,1,Returning_Visitor,FALSE,FALSE
0,0,1,132,8,445,0,0.014285714,0,0,Mar,3,2,4,14,Returning_Visitor,TRUE,FALSE
0,0,0,0,4,81,0,0.025,0,0,Mar,2,2,3,2,Returning_Visitor,FALSE,FALSE
0,0,0,0,20,1985,0.03,0.055,0,0,Mar,1,1,1,1,Returning_Visitor,FALSE,FALSE
5,97.5,0,0,24,758.1444444,0.04,0.059846154,0,0,Mar,3,2,2,1,Returning_Visitor,TRUE,FALSE
7,182.0833333,0,0,15,310.9,0,0.01,0,0,Mar,2,2,4,2,Returning_Visitor,FALSE,FALSE
3,97,0,0,15,482,0.0125,0.025,0,0,Mar,2,2,6,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,2,0,0.2,0.2,0,0,Mar,2,5,1,1,Returning_Visitor,FALSE,FALSE
3,34.83333333,0,0,30,709.8333333,0.026666667,0.046666667,0,0,Mar,1,1,2,1,Returning_Visitor,TRUE,FALSE
0,0,3,57,31,4547.166667,0.012903226,0.039247312,8.682741935,0,Mar,2,4,5,2,Returning_Visitor,FALSE,FALSE
0,0,0,0,9,1040,0.077777778,0.116666667,0,0,Mar,2,4,3,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,3,223,0.066666667,0.133333333,0,0,Mar,1,1,8,3,Returning_Visitor,FALSE,FALSE
0,0,2,14,11,687.5,0.020512821,0.035897436,0,0,Mar,3,2,1,3,Returning_Visitor,TRUE,FALSE
0,0,0,0,30,632.5833333,0,0.021666667,0,0,Mar,2,5,1,1,Returning_Visitor,FALSE,FALSE
1,77,0,0,9,312,0,0.044444444,0,0,Mar,1,1,3,3,New_Visitor,TRUE,FALSE
3,107,0,0,45,2502.966667,0,0.008510638,9.702113281,0,Mar,2,4,1,2,New_Visitor,TRUE,FALSE
10,614.1666667,0,0,47,3608.9,0,0.019871795,7.256219133,0,Mar,2,2,3,1,Returning_Visitor,FALSE,FALSE
13,315.9666667,1,0,15,406.575,0.019047619,0.032380952,0,0,Mar,3,2,3,2,Returning_Visitor,FALSE,FALSE
0,0,0,0,1,0,0.2,0.2,0,0,Mar,2,2,3,3,Returning_Visitor,FALSE,FALSE
1,0,0,0,39,2487.5,0.017105263,0.047105263,0,0,Mar,2,2,1,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,15,212.8,0.019047619,0.042857143,0,0,Mar,1,1,3,1,Returning_Visitor,FALSE,FALSE
2,11,0,0,20,510,0.013636364,0.034848485,0,0,Mar,4,1,6,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,1,0,0.2,0.2,0,0,Mar,3,2,3,1,Returning_Visitor,FALSE,FALSE
2,47.66666667,0,0,5,72.33333333,0,0.014285714,0,0,Mar,1,1,8,2,New_Visitor,FALSE,FALSE
0,0,0,0,13,96.5,0.030769231,0.076923077,0,0,Mar,2,6,4,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,8,267,0,0.05,0,0,Mar,2,2,3,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,8,481.1666667,0,0.025,0,0,Mar,2,2,7,7,Returning_Visitor,FALSE,FALSE
0,0,0,0,4,2528,0,0.066666667,0,0,Mar,2,2,9,1,Returning_Visitor,TRUE,FALSE
2,30,1,148.5,24,1530.194444,0.007407407,0.014814815,10.10222222,0,Mar,1,1,1,10,Returning_Visitor,FALSE,FALSE
0,0,0,0,7,289.5,0,0.014285714,0,0,Mar,1,1,1,1,Returning_Visitor,TRUE,FALSE
0,0,0,0,1,10,0,0.1,0,0,Mar,3,2,3,9,Returning_Visitor,TRUE,FALSE
0,0,0,0,16,676.75,0.014285714,0.035714286,0,0,Mar,4,2,1,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,4,36,0.05,0.1,0,0,Mar,2,2,6,1,Returning_Visitor,FALSE,FALSE
2,25,0,0,6,65,0,0.025,0,0,Mar,2,2,1,2,New_Visitor,TRUE,FALSE
0,0,0,0,16,630.75,0,0.04047619,0,0,Mar,3,2,1,1,Returning_Visitor,TRUE,FALSE
8,359,2,954,14,336.5,0,0.005555556,0,0,Mar,3,2,7,9,Returning_Visitor,TRUE,FALSE
0,0,0,0,5,77,0,0.04,0,0,Mar,2,4,1,3,Returning_Visitor,TRUE,FALSE
5,59,0,0,3,44.66666667,0,0.025,0,0,Mar,2,4,6,2,Returning_Visitor,TRUE,FALSE
4,1347.75,0,0,22,3410.875,0.019871795,0.09,0,0,Mar,2,2,1,2,Returning_Visitor,FALSE,FALSE
0,0,0,0,10,322.5,0.04,0.07,0,0,Mar,2,2,4,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,11,919,0,0.027272727,0,0,Mar,2,6,2,3,Returning_Visitor,FALSE,FALSE
18,280.95,6,762.5,79,2096.911364,0.003333333,0.014008551,25.96702005,0,Mar,2,4,2,2,Returning_Visitor,FALSE,FALSE
4,100.3,0,0,66,2868.133333,0.011428571,0.01725974,9.162351243,0,Mar,3,2,1,1,Returning_Visitor,FALSE,TRUE
1,23,0,0,27,1058.893939,0,0.010493827,1.865777778,0,Mar,2,2,3,13,Returning_Visitor,FALSE,FALSE
6,53.38095238,0,0,5,54.38095238,0,0.003571429,0,0,Mar,2,2,6,2,New_Visitor,TRUE,FALSE
2,8,0,0,11,543.5,0.007692308,0.038461538,0,0,Mar,2,2,3,13,Returning_Visitor,FALSE,FALSE
0,0,0,0,29,1089,0.006896552,0.013793103,0,0,Mar,1,6,1,1,Returning_Visitor,FALSE,FALSE
1,0,1,60,43,1131.808333,0.028787879,0.047348485,0,0,Mar,1,1,1,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,7,314.5,0.033333333,0.066666667,0,0,Mar,2,2,3,1,Returning_Visitor,FALSE,FALSE
14,416.3928571,6,449.3333333,258,11301.20416,0,0.00742538,33.6117917,0,Mar,2,4,9,2,Returning_Visitor,FALSE,TRUE
6,573.5,1,0,33,1946.942857,0.005882353,0.020602653,0,0,Mar,3,2,3,2,Returning_Visitor,FALSE,FALSE
0,0,0,0,1,0,0.2,0.2,0,0,Mar,2,2,1,1,Returning_Visitor,FALSE,FALSE
6,465.8333333,2,71,26,1558,0.006666667,0.013333333,7.169617487,0,Mar,2,2,1,1,Returning_Visitor,TRUE,FALSE
0,0,1,212.5,21,1198.75,0,0.003174603,0,0,Mar,2,4,7,2,Returning_Visitor,FALSE,FALSE
0,0,0,0,1,0,0.2,0.2,0,0,Mar,2,2,4,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,17,927.1666667,0,0.014705882,0,0,Mar,1,1,2,3,Returning_Visitor,FALSE,FALSE
9,97.64285714,0,0,37,584.5958874,0.005128205,0.013043478,0,0,Mar,2,4,1,3,Returning_Visitor,TRUE,FALSE
0,0,0,0,4,135.5,0,0.066666667,0,0,Mar,2,2,3,14,Returning_Visitor,FALSE,FALSE
3,148,0,0,8,292.5,0,0.027272727,0,0,Mar,2,2,1,3,Returning_Visitor,TRUE,FALSE
0,0,0,0,2,68.5,0,0.033333333,0,0,Mar,3,2,1,10,Returning_Visitor,FALSE,FALSE
3,58,0,0,23,364.1666667,0.004,0.02,0,0,Mar,2,2,1,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,26,694.3,0.023076923,0.036410256,0,0,Mar,3,2,2,3,Returning_Visitor,TRUE,FALSE
1,3,0,0,3,236,0,0.025,0,0,Mar,3,2,1,3,Returning_Visitor,TRUE,FALSE
4,97.61111111,0,0,24,1128.468254,0.038461538,0.058577534,0,0,Mar,2,4,3,1,Returning_Visitor,FALSE,FALSE
4,57,0,0,5,81,0,0.025,0,0,Mar,1,1,8,10,Returning_Visitor,FALSE,FALSE
2,34,0,0,21,521.5,0.018181818,0.021212121,0,0,Mar,3,2,5,1,Returning_Visitor,TRUE,FALSE
0,0,0,0,7,496.75,0,0.011111111,0,0,Mar,3,2,6,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,9,104.8333333,0.022222222,0.072222222,0,0,Mar,2,2,4,2,Returning_Visitor,FALSE,FALSE
1,7,0,0,4,45,0,0.0125,0,0,Mar,3,2,3,1,Returning_Visitor,FALSE,FALSE
2,37.5,0,0,2,492.5,0,0.05,0,0,Mar,2,2,1,2,Returning_Visitor,FALSE,FALSE
1,3,0,0,40,624.75,0,0.014634146,0,0,Mar,3,7,3,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,1,0,0.2,0.2,0,0,Mar,3,2,7,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,6,116.5,0,0.066666667,0,0,Mar,2,2,2,3,Returning_Visitor,TRUE,FALSE
0,0,0,0,8,144,0.025,0.045833333,0,0,Mar,3,2,7,3,Returning_Visitor,TRUE,FALSE
2,22.5,0,0,28,686.3222222,0,0.001190476,0,0,Mar,2,4,3,1,Returning_Visitor,FALSE,FALSE
0,0,1,1411,1,1411,0,0.1,0,0,Mar,2,2,1,2,Returning_Visitor,FALSE,FALSE
0,0,0,0,7,126,0.028571429,0.057142857,0,0,Mar,2,5,2,10,Returning_Visitor,FALSE,FALSE
0,0,0,0,6,185,0,0.1,0,0,Mar,1,1,1,10,Returning_Visitor,FALSE,FALSE
0,0,0,0,6,218,0,0.066666667,0,0,Mar,2,2,3,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,1,0,0.2,0.2,0,0,Mar,3,2,3,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,30,484.672619,0,0.018965517,0,0,Mar,2,6,7,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,19,439.8333333,0.005555556,0.003703704,0,0,Mar,1,1,7,2,New_Visitor,FALSE,FALSE
2,38,0,0,21,733.7,0,0.014035088,0,0,Mar,2,7,1,3,Returning_Visitor,TRUE,FALSE
6,77,3,447,34,1469.702381,0,0.02398374,22.80152439,0,Mar,2,2,1,2,Returning_Visitor,FALSE,FALSE
2,58.5,2,125,16,485.8333333,0,0.002222222,0,0,Mar,2,2,7,2,New_Visitor,TRUE,FALSE
0,0,0,0,3,19,0,0.066666667,0,0,Mar,2,4,1,1,Returning_Visitor,TRUE,FALSE
6,99.33333333,1,28.5,5,345.5,0,0.011111111,0,0,Mar,2,2,3,8,New_Visitor,FALSE,FALSE
3,117,0,0,20,543.8,0.00952381,0.019047619,0,0,Mar,1,1,1,2,New_Visitor,FALSE,FALSE
0,0,0,0,3,48,0,0.066666667,0,0,Mar,4,1,1,1,Returning_Visitor,FALSE,FALSE
2,16.66666667,0,0,22,343.3690476,0.001298701,0.039924242,0,0,Mar,3,2,1,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,9,171,0.022222222,0.066666667,0,0,Mar,2,10,4,3,Returning_Visitor,FALSE,FALSE
12,81.5,0,0,61,2202.579167,0.005797101,0.017153855,0,0,Mar,2,2,1,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,11,299.5,0.036363636,0.072727273,0,0,Mar,1,1,3,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,1,0,0.2,0.2,0,0,Mar,2,2,1,1,Returning_Visitor,FALSE,FALSE
0,0,1,90,11,1056.5,0.018181818,0.054545455,0,0,Mar,4,2,1,2,Returning_Visitor,FALSE,FALSE
4,34,0,0,46,627.3083333,0,0.004166667,0,0,Mar,2,2,7,8,New_Visitor,FALSE,FALSE
4,38.5,0,0,33,583.8333333,0.002631579,0.007894737,0,0,Mar,2,2,4,3,Returning_Visitor,TRUE,FALSE
0,0,0,0,7,221.5,0,0.028571429,0,0,Mar,4,1,1,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,44,441.7916667,0.004545455,0.018181818,0,0,Mar,4,2,1,3,Returning_Visitor,FALSE,FALSE
7,156.25,0,0,37,1037.355013,0,0.0165,0,0,Mar,3,2,8,2,Returning_Visitor,FALSE,FALSE
3,15,0,0,11,246,0.018181818,0.054545455,0,0,Mar,2,2,1,8,Returning_Visitor,FALSE,FALSE
0,0,0,0,3,10,0,0.066666667,0,0,Mar,2,2,7,1,Returning_Visitor,FALSE,FALSE
0,0,2,18,1,46,0,0.066666667,0,0,Mar,2,2,7,10,Returning_Visitor,FALSE,FALSE
0,0,0,0,80,801.802381,0,0.0035,0,0,Mar,2,2,3,1,Returning_Visitor,FALSE,FALSE
1,19,0,0,40,1361.166667,0.005,0.0225,0,0,Mar,4,1,2,3,Returning_Visitor,TRUE,FALSE
0,0,0,0,5,53,0.04,0.08,0,0,Mar,2,5,2,2,Returning_Visitor,TRUE,FALSE
1,7,0,0,17,2648.5,0.0125,0.03125,0,0,Mar,2,2,1,2,Returning_Visitor,FALSE,FALSE
0,0,0,0,3,27,0.066666667,0.133333333,0,0,Mar,2,2,1,13,Returning_Visitor,FALSE,FALSE
0,0,0,0,13,255,0,0.015384615,0,0,Mar,2,4,1,1,Returning_Visitor,TRUE,FALSE
0,0,0,0,2,221.5,0,0.05,0,0,Mar,3,2,3,10,Returning_Visitor,TRUE,FALSE
0,0,0,0,7,225,0.028571429,0.085714286,0,0,Mar,4,1,4,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,7,125,0,0.028571429,0,0,Mar,2,2,1,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,12,323,0.033333333,0.066666667,0,0,Mar,2,2,1,3,Returning_Visitor,TRUE,FALSE
5,67.5,3,245,32,1929.329762,0,0.00430839,0,0,Mar,2,4,1,1,Returning_Visitor,FALSE,FALSE
12,311.4090909,0,0,96,4233.4807,0.006635802,0.027174712,3.541145833,0,Mar,2,4,1,1,Returning_Visitor,TRUE,FALSE
0,0,0,0,5,116,0,0.04,0,0,Mar,2,5,1,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,2,0,0.2,0.2,0,0,Mar,3,2,6,1,Returning_Visitor,TRUE,FALSE
3,14,0,0,27,1585.666667,0.026666667,0.058333333,0,0,Mar,2,2,6,1,Returning_Visitor,TRUE,FALSE
6,145,0,0,13,644,0,0.013333333,0,0,Mar,2,2,1,2,New_Visitor,FALSE,FALSE
0,0,0,0,5,488.5,0.032727273,0.033846154,0,0,Mar,2,7,7,6,Returning_Visitor,FALSE,FALSE
0,0,1,15,25,1235.65,0.041666667,0.05327381,0,0,Mar,1,1,1,3,Returning_Visitor,TRUE,FALSE
1,43,0,0,37,1505.166667,0,0.005263158,0,0,Mar,2,2,4,8,New_Visitor,FALSE,FALSE
0,0,0,0,7,495,0,0.00952381,0,0,Mar,4,1,3,2,Returning_Visitor,FALSE,FALSE
4,84,0,0,21,270,0,0.002380952,0,0,Mar,1,1,3,2,Returning_Visitor,FALSE,FALSE
0,0,0,0,2,0,0.2,0.2,0,0,Mar,3,2,1,10,Returning_Visitor,FALSE,FALSE
4,120,0,0,13,293,0,0.014285714,0,0,Mar,1,2,1,10,Returning_Visitor,FALSE,FALSE
0,0,1,0,51,2122.656061,0,0.007051282,9.294775641,0,Mar,2,2,1,10,Returning_Visitor,FALSE,TRUE
0,0,0,0,35,1231.160256,0.005714286,0.023619048,0,0,Mar,2,2,1,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,1,0,0.2,0.2,0,0,Mar,2,2,1,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,17,341.6666667,0.011764706,0.041176471,0,0,Mar,2,6,9,6,Returning_Visitor,FALSE,FALSE
0,0,0,0,1,0,0.2,0.2,0,0,Mar,1,1,3,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,21,1686.333333,0,0.030952381,0,0,Mar,2,5,2,1,Returning_Visitor,FALSE,FALSE
5,263,0,0,3,212,0,0.028571429,0,0,Mar,1,1,9,8,New_Visitor,FALSE,FALSE
1,0,0,0,34,2161.979365,0.00625,0.020233586,0,0,Mar,3,2,1,1,Returning_Visitor,FALSE,FALSE
9,72.94444444,2,125.0952381,17,318.0730159,0.008695652,0.035397453,0,0,Mar,3,2,8,2,Returning_Visitor,FALSE,FALSE
0,0,0,0,1,13,0,0.1,0,0,Mar,2,2,3,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,30,390.6666667,0.006666667,0.056666667,0,0,Mar,2,6,6,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,11,253,0,0.027272727,0,0,Mar,2,2,2,1,Returning_Visitor,FALSE,FALSE
1,18.5,0,0,12,208,0.045454545,0.081818182,0,0,Mar,2,2,4,1,Returning_Visitor,FALSE,FALSE
6,87.33333333,0,0,62,1470.853037,0,0.009683372,0,0,Mar,2,4,6,3,Returning_Visitor,TRUE,FALSE
6,99.60588235,0,0,83,2585.61835,0,0.00761877,6.871308983,0,Mar,2,2,2,2,Returning_Visitor,FALSE,TRUE
3,63,0,0,13,400.3333333,0.030769231,0.046153846,0,0,Mar,4,1,3,1,Returning_Visitor,FALSE,FALSE
3,68,1,103,10,808.5,0,0.015384615,35.99261538,0,Mar,2,2,3,7,Returning_Visitor,TRUE,TRUE
0,0,0,0,12,1484,0,0.016666667,0,0,Mar,2,2,7,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,4,505,0,0.05,0,0,Mar,2,2,1,1,Returning_Visitor,FALSE,FALSE
3,68.5,0,0,37,1121.205556,0.005405405,0.00113798,0,0,Mar,1,1,1,2,Returning_Visitor,TRUE,FALSE
1,135,0,0,2,141,0,0.066666667,0,0,Mar,2,2,1,10,Returning_Visitor,FALSE,FALSE
0,0,0,0,3,234,0,0.033333333,0,0,Mar,1,2,1,2,Returning_Visitor,TRUE,FALSE
1,34,0,0,7,179,0,0.028571429,53.13428571,0,Mar,2,4,2,8,New_Visitor,FALSE,TRUE
6,176.25,12,404,41,2720.671429,0.012962963,0.033262108,8.833825926,0,Mar,2,2,2,2,Returning_Visitor,TRUE,TRUE
16,315.1449864,6,147.8666667,173,6255.017866,0.002531328,0.010737154,0,0,Mar,2,2,2,2,Returning_Visitor,FALSE,FALSE
6,523.2142857,2,263,48,2309.732468,0.003846154,0.014903846,10.60089168,0,Mar,2,2,3,1,Returning_Visitor,FALSE,TRUE
4,76,0,0,39,1936.55,0.004761905,0.023809524,5.51397619,0,Mar,4,1,3,2,Returning_Visitor,FALSE,FALSE
3,118.6666667,0,0,17,694,0.003703704,0.008333333,27.45138186,0,Mar,3,2,1,2,Returning_Visitor,TRUE,TRUE
0,0,0,0,11,125,0.018181818,0.081818182,0,0,Mar,2,2,1,13,Returning_Visitor,FALSE,FALSE
8,174.5,0,0,10,195.5,0,0.006060606,0,0,Mar,1,1,3,2,Returning_Visitor,FALSE,FALSE
1,40,0,0,27,1400.5,0,0.007142857,0,0,Mar,1,1,4,2,Returning_Visitor,FALSE,FALSE
8,201.1666667,3,41,18,914.1666667,0,0.0125,0,0,Mar,1,1,1,3,Returning_Visitor,FALSE,FALSE
13,374.875,1,53,88,5958.071931,0.002105263,0.00954386,0,0,Mar,2,2,3,2,Returning_Visitor,FALSE,FALSE
4,56,0,0,31,270.4916667,0,0.00234375,0,0,Mar,2,2,1,3,Returning_Visitor,FALSE,FALSE
3,92.83333333,0,0,24,463.8166667,0.002666667,0.015333333,17.84230699,0,Mar,1,1,1,2,Returning_Visitor,FALSE,TRUE
0,0,0,0,16,371.5,0.0125,0.025,0,0,Mar,2,5,7,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,6,13,0.133333333,0.166666667,0,0,Mar,2,2,1,3,Returning_Visitor,FALSE,FALSE
1,4,3,148.5,5,185.8333333,0,0.01875,0,0,Mar,2,2,7,2,Returning_Visitor,FALSE,FALSE
2,102,0,0,16,502.8333333,0,0.004444444,0,0,Mar,3,2,4,2,Returning_Visitor,TRUE,FALSE
0,0,0,0,3,1016.5,0.066666667,0.066666667,0,0,Mar,3,2,5,1,Returning_Visitor,FALSE,FALSE
1,11,0,0,16,253,0,0.023529412,0,0,Mar,2,2,1,3,New_Visitor,FALSE,FALSE
0,0,1,126,17,887.0666667,0.0125,0.0296875,0,0,Mar,2,2,1,2,Returning_Visitor,FALSE,FALSE
0,0,0,0,58,3200.366667,0.003448276,0.027586207,0,0,Mar,2,2,6,1,Returning_Visitor,FALSE,FALSE
3,187,2,41,48,1769.697383,0.000606061,0.011616162,16.71534488,0,Mar,2,2,3,2,Returning_Visitor,FALSE,FALSE
0,0,0,0,14,1037.5,0.014285714,0.047619048,0,0,Mar,2,2,4,2,Returning_Visitor,FALSE,FALSE
4,185,0,0,40,1694.75,0.020512821,0.031196581,0,0,Mar,2,2,6,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,37,1643.435516,0.005555556,0.032271242,2.188718519,0,Mar,2,4,3,2,Returning_Visitor,TRUE,TRUE
0,0,0,0,7,383.5,0,0.023809524,0,0,Mar,3,2,6,3,Returning_Visitor,FALSE,FALSE
8,166.2,5,371,23,626.2213675,0.004444444,0.008888889,0,0,Mar,1,1,8,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,4,34,0.1,0.125,0,0,Mar,3,2,3,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,27,1070.461905,0,0.007407407,57.7293604,0,Mar,2,2,3,2,Returning_Visitor,FALSE,TRUE
0,0,0,0,1,0,0.2,0.2,0,0,Mar,3,2,3,3,Returning_Visitor,FALSE,FALSE
2,84,0,0,3,195,0,0.02,0,0,Mar,2,2,5,2,Returning_Visitor,FALSE,FALSE
3,86,0,0,22,1187.833333,0.009090909,0.027272727,0,0,Mar,3,2,3,1,Returning_Visitor,TRUE,FALSE
17,754.1095238,2,77,31,1021.619336,0.004545455,0.026479076,2.08053355,0,Mar,1,1,3,2,Returning_Visitor,FALSE,TRUE
3,24,0,0,6,58,0,0.028571429,0,0,Mar,2,2,8,2,Returning_Visitor,FALSE,FALSE
0,0,0,0,18,771.0833333,0.055555556,0.071428571,0,0,Mar,2,2,3,1,Returning_Visitor,FALSE,FALSE
8,17.34848485,0,0,19,291.2589744,0,0.043589744,0,0,Mar,2,2,7,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,15,695.4,0.014285714,0.028571429,0,0,Mar,2,2,2,1,Returning_Visitor,FALSE,FALSE
2,15,0,0,3,21,0,0.05,0,0,Mar,3,2,4,8,Returning_Visitor,FALSE,FALSE
0,0,0,0,45,1594.283333,0,0.015227273,45.4316713,0,Mar,2,2,1,2,Returning_Visitor,TRUE,TRUE
3,36,1,395,12,343.5833333,0,0.014285714,0,0,Mar,2,2,1,2,New_Visitor,FALSE,FALSE
2,34,0,0,81,2241.002381,0.002439024,0.007012195,0,0,Mar,2,2,1,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,2,5,0,0.1,0,0,Mar,2,2,1,13,Returning_Visitor,TRUE,FALSE
0,0,0,0,2,63,0,0.05,0,0,Mar,3,2,1,1,Returning_Visitor,FALSE,FALSE
2,47,0,0,21,825.0833333,0,0.009090909,10.7929507,0,Mar,2,2,2,2,New_Visitor,FALSE,TRUE
0,0,0,0,54,1357.61783,0,0.004812274,0,0,Mar,2,2,2,2,Returning_Visitor,TRUE,FALSE
5,44.5,1,4,37,836.3333333,0.005,0.045416667,0,0,Mar,2,2,4,1,Returning_Visitor,FALSE,FALSE
6,125.5,0,0,19,1409.416667,0.002469136,0.023703704,0,0,Mar,1,8,3,2,Returning_Visitor,FALSE,FALSE
0,0,0,0,10,60.5,0.02,0.04,0,0,Mar,2,2,3,1,Returning_Visitor,FALSE,FALSE
2,42,2,54,10,420,0,0.008333333,0,0,Mar,2,2,8,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,1,0,0.2,0.2,0,0,Mar,2,5,9,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,2,0,0.2,0.2,0,0,Mar,2,5,1,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,9,389,0,0.011111111,0,0,Mar,2,2,3,3,Returning_Visitor,TRUE,FALSE
2,95,0,0,15,449.5,0.0125,0.04375,0,0,Mar,2,2,4,1,Returning_Visitor,FALSE,FALSE
4,56.5,0,0,8,202.1666667,0,0.01,0,0,Mar,3,2,1,8,New_Visitor,TRUE,FALSE
0,0,0,0,2,17,0,0.1,0,0,Mar,1,1,8,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,12,689.2857143,0,0.058333333,0,0,Mar,3,2,3,1,Returning_Visitor,TRUE,FALSE
5,134.9285714,2,41,31,2013.595238,0,0.014141414,8.482727273,0,Mar,2,2,8,2,Returning_Visitor,FALSE,TRUE
0,0,0,0,17,933.4166667,0.031932773,0.043075335,0,0,Mar,3,2,1,3,Returning_Visitor,FALSE,FALSE
2,64,0,0,19,371.2272727,0.001666667,0.029166667,0,0,Mar,2,4,9,10,Returning_Visitor,FALSE,FALSE
3,68,0,0,8,306,0,0.008888889,0,0,Mar,1,1,9,3,New_Visitor,TRUE,FALSE
2,20.5,0,0,21,719.7380952,0.004347826,0.010434783,0,0,Mar,2,2,1,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,1,0,0.2,0.2,0,0,Mar,2,4,6,2,Returning_Visitor,FALSE,FALSE
0,0,0,0,2,56,0,0.1,0,0,Mar,3,2,1,1,Returning_Visitor,FALSE,FALSE
3,11.33333333,0,0,20,302.3888889,0,0.002380952,0,0,Mar,2,2,1,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,19,491.6666667,0.011111111,0.012222222,0,0,Mar,1,1,1,6,Returning_Visitor,TRUE,FALSE
5,504,0,0,13,922.0833333,0.023529412,0.023529412,0,0,Mar,3,2,8,2,Returning_Visitor,FALSE,FALSE
2,25,0,0,20,667.9166667,0,0.00952381,18.5847619,0,Mar,4,1,1,3,Returning_Visitor,FALSE,FALSE
2,20,0,0,13,181.5,0,0.013333333,0,0,Mar,2,2,1,1,Returning_Visitor,FALSE,FALSE
1,19.66666667,0,0,14,512.1111111,0.028571429,0.03,0,0,Mar,3,2,3,9,Returning_Visitor,TRUE,FALSE
1,13,0,0,15,317,0,0.006666667,0,0,Mar,2,2,1,2,New_Visitor,TRUE,FALSE
0,0,0,0,17,85.66666667,0.023529412,0.080392157,0,0,Mar,2,2,6,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,8,128.5,0,0.025,0,0,Mar,2,2,1,1,Returning_Visitor,FALSE,FALSE
6,76.33333333,0,0,7,78.83333333,0.004444444,0.010666667,0,0,Mar,2,2,8,2,Returning_Visitor,FALSE,FALSE
2,45.44444444,1,40.66666667,57,851.6426534,0,0.007923497,3.077836066,0,Mar,2,4,3,1,Returning_Visitor,TRUE,TRUE
3,31,0,0,58,1400.438961,0,0.005951036,0,0,Mar,2,2,1,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,6,84,0,0.033333333,0,0,Mar,1,1,8,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,12,167.2222222,0,0.001666667,0,0,Mar,3,2,1,3,Returning_Visitor,TRUE,FALSE
0,0,0,0,12,396.5,0,0.037222222,0,0,Mar,2,4,3,2,Returning_Visitor,FALSE,FALSE
0,0,0,0,2,22,0,0.05,0,0,Mar,1,1,3,15,Returning_Visitor,TRUE,FALSE
0,0,0,0,5,371,0,0.02,0,0,Mar,2,2,4,10,Returning_Visitor,FALSE,FALSE
0,0,4,399.3333333,46,1814.583333,0.003673469,0.02675737,0,0,Mar,2,2,2,2,Returning_Visitor,FALSE,FALSE
0,0,0,0,4,30.5,0,0.05,0,0,Mar,2,4,3,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,27,644,0.007692308,0.051923077,0,0,Mar,3,2,2,3,Returning_Visitor,FALSE,FALSE
8,125.1666667,0,0,27,1802.25,0.006060606,0.011774152,0,0,Mar,3,2,1,8,Returning_Visitor,TRUE,FALSE
2,13,0,0,23,855.1666667,0.008,0.025333333,0,0,Mar,2,5,1,3,Returning_Visitor,FALSE,FALSE
1,72.66666667,4,345,24,879.9090909,0,0.035897436,6.482798269,0,Mar,2,4,4,1,Returning_Visitor,FALSE,TRUE
5,100.9166667,0,0,56,1432.223333,0,0.002185792,69.43043195,0,Mar,2,2,3,3,Returning_Visitor,TRUE,TRUE
7,60,3,23,111,2524.501905,0.001694915,0.018834175,6.445051499,0,Mar,3,2,1,2,Returning_Visitor,TRUE,FALSE
3,49.5,1,29.5,45,1545.5,0,0.004,20.97144,0,Mar,2,4,3,8,Returning_Visitor,TRUE,TRUE
8,466.5,2,75.25,44,1616.425824,0.006944444,0.010974434,0,0,Mar,3,2,4,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,8,332,0,0.028571429,0,0,Mar,3,2,1,8,New_Visitor,TRUE,FALSE
0,0,0,0,1,40,0,0.1,0,0,Mar,3,2,1,10,Returning_Visitor,FALSE,FALSE
5,175.2307692,0,0,20,2224.85,0.004347826,0.023913043,0,0,Mar,4,2,8,1,Returning_Visitor,FALSE,FALSE
6,96.85714286,0,0,28,672.5452381,0,0.020707071,19.71468924,0,Mar,1,1,2,10,Returning_Visitor,FALSE,TRUE
0,0,0,0,6,551,0.033333333,0.05,0,0,Mar,1,1,3,1,Returning_Visitor,FALSE,FALSE
19,402.1857143,4,116,64,3179.354257,0.002531646,0.016289934,4.642,0,Mar,2,2,2,2,Returning_Visitor,FALSE,TRUE
0,0,0,0,10,203,0,0.026666667,0,0,Mar,3,2,2,3,Returning_Visitor,FALSE,FALSE
4,178.2,0,0,9,368.2,0.02,0.05,0,0,Mar,3,2,8,3,Returning_Visitor,TRUE,FALSE
7,156.5,1,122,26,694.7121212,0,0.00297619,0,0,Mar,2,4,1,2,Returning_Visitor,FALSE,FALSE
5,58,0,0,10,657.2619048,0,0.004166667,0,0,Mar,1,1,2,2,New_Visitor,FALSE,FALSE
0,0,0,0,7,974.6666667,0.085714286,0.128571429,0,0,Mar,2,2,1,10,Returning_Visitor,FALSE,FALSE
1,43,0,0,43,1223.347222,0,0.004545455,0,0,Mar,1,1,3,2,Returning_Visitor,FALSE,FALSE
0,0,0,0,10,276,0.044444444,0.055555556,0,0,Mar,3,2,3,10,Returning_Visitor,FALSE,FALSE
0,0,1,844,6,1108,0.066666667,0.066666667,0,0,Mar,2,2,4,2,Returning_Visitor,FALSE,FALSE
0,0,0,0,7,223,0,0.028571429,0,0,Mar,1,1,1,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,3,261,0,0.066666667,0,0,Mar,2,5,1,10,Returning_Visitor,FALSE,FALSE
0,0,0,0,21,1372.7,0.019047619,0.035714286,0,0,Mar,1,1,3,1,Returning_Visitor,FALSE,FALSE
2,306,0,0,14,964.5,0,0.030952381,0,0,Mar,2,2,4,1,Returning_Visitor,FALSE,FALSE
3,72,1,0,38,461.5,0.01,0.023666667,0,0,Mar,2,2,3,2,Returning_Visitor,FALSE,FALSE
0,0,0,0,4,41,0.05,0.1,0,0,Mar,3,2,2,1,Returning_Visitor,FALSE,FALSE
1,202,0,0,2,8,0,0.066666667,0,0,Mar,2,2,8,6,New_Visitor,FALSE,FALSE
0,0,0,0,1,0,0.2,0.2,0,0,Mar,1,1,3,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,7,39.25,0.028571429,0.034285714,0,0,Mar,2,2,1,2,Returning_Visitor,FALSE,FALSE
4,359.3,4,407,69,5485.105556,0.010526316,0.017493734,4.494741228,0,Mar,1,1,2,1,Returning_Visitor,TRUE,TRUE
0,0,0,0,8,450,0,0.025,0,0,Mar,4,1,9,3,Returning_Visitor,TRUE,FALSE
0,0,0,0,1,0,0.2,0.2,0,0,Mar,1,1,2,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,20,438.3333333,0.02,0.04,0,0,Mar,2,2,7,1,Returning_Visitor,FALSE,FALSE
1,39,0,0,15,787,0,0.021875,0,0,Mar,4,1,1,10,Returning_Visitor,FALSE,FALSE
0,0,0,0,1,0,0.2,0.2,0,0,Mar,2,4,1,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,6,319,0,0.05,0,0,Mar,1,1,6,1,Returning_Visitor,TRUE,FALSE
0,0,0,0,15,1148,0.014285714,0.05,0,0,Mar,3,2,1,3,Returning_Visitor,FALSE,FALSE
2,41.5,2,60.5,21,534.5,0.004347826,0.02173913,0,0,Mar,2,2,2,13,Returning_Visitor,TRUE,FALSE
0,0,0,0,20,644.4,0,0.007777778,0,0,Mar,1,1,7,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,14,875,0,0.014285714,0,0,Mar,1,1,1,3,Returning_Visitor,TRUE,FALSE
2,123,0,0,7,873,0,0.011111111,0,0,Mar,1,2,2,2,Returning_Visitor,FALSE,FALSE
3,42,0,0,31,3121.369048,0.002857143,0.009285714,0,0,Mar,1,1,3,1,Returning_Visitor,TRUE,FALSE
0,0,1,81,82,3214.020563,0,0.007723577,4.667079268,0,Mar,3,3,2,10,Returning_Visitor,FALSE,TRUE
0,0,0,0,3,14,0,0.066666667,0,0,Mar,4,1,3,3,Returning_Visitor,FALSE,FALSE
1,22,0,0,52,1551.666667,0.001818182,0.019393939,7.882377258,0,Mar,1,1,3,2,Returning_Visitor,FALSE,FALSE
2,95.5,0,0,13,334.5,0,0.002666667,0,0,Mar,3,2,1,8,New_Visitor,FALSE,FALSE
2,48.66666667,0,0,48,3726.333333,0,0.004166667,0,0,Mar,3,2,1,9,Returning_Visitor,TRUE,FALSE
5,294.7,6,329.5,59,2816.781781,0.003214696,0.014766169,2.346800426,0,Mar,2,2,4,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,38,667.1666667,0,0.005263158,0,0,Mar,2,2,4,1,Returning_Visitor,TRUE,FALSE
1,0,0,0,41,1202.904762,0.011529933,0.033252033,0,0,Mar,2,2,2,13,Returning_Visitor,FALSE,FALSE
0,0,0,0,3,0,0.2,0.2,0,0,Mar,1,8,2,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,20,1117.333333,0,0.000956938,0,0,Mar,2,4,7,2,Returning_Visitor,FALSE,FALSE
0,0,0,0,9,211,0,0.044444444,0,0,Mar,2,2,3,2,Returning_Visitor,FALSE,FALSE
3,125,1,70,29,705.4,0,0.015625,0,0,Mar,2,2,1,1,Returning_Visitor,FALSE,FALSE
3,12,1,24,3,5.333333333,0.033333333,0.083333333,0,0,Mar,2,2,1,3,Returning_Visitor,FALSE,FALSE
1,10.5,0,0,7,525,0,0.00952381,0,0,Mar,2,4,4,8,Returning_Visitor,FALSE,FALSE
0,0,0,0,13,635.3333333,0,0.009090909,0,0,Mar,2,2,4,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,50,1803.768849,0.001360544,0.017428305,3.609398514,0,Mar,2,4,7,3,Returning_Visitor,TRUE,TRUE
3,99,0,0,37,2419.133333,0.007894737,0.023245614,0,0,Mar,2,2,3,1,Returning_Visitor,FALSE,FALSE
6,171.0833333,0,0,28,952.2857143,0,0.013333333,52.10818182,0,Mar,2,2,1,2,Returning_Visitor,FALSE,TRUE
7,159.5,0,0,14,249,0.011764706,0.041176471,0,0,Mar,1,1,3,2,Returning_Visitor,TRUE,FALSE
1,5,0,0,13,271,0,0.003571429,0,0,Mar,1,1,2,2,New_Visitor,TRUE,FALSE
5,206,0,0,15,650.6961927,0,0.018487395,0,0,Mar,1,1,1,3,New_Visitor,FALSE,FALSE
2,40,2,162,17,481.6666667,0.024561404,0.036842105,32.64521053,0,Mar,2,7,3,2,Returning_Visitor,FALSE,FALSE
0,0,0,0,7,258.5,0.028571429,0.071428571,0,0,Mar,3,2,6,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,14,510.5,0,0.015384615,31.3094364,0,Mar,2,2,1,2,New_Visitor,FALSE,TRUE
0,0,0,0,16,600.75,0,0.025,0,0,Mar,2,2,2,2,Returning_Visitor,FALSE,FALSE
6,262.25,3,298,49,2302.021242,0.000308642,0.026591844,43.3616369,0,Mar,1,1,1,2,Returning_Visitor,FALSE,TRUE
2,44,0,0,26,1636.016667,0.007692308,0.021794872,0,0,Mar,2,6,1,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,16,519.75,0.0125,0.04,0,0,Mar,3,2,3,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,1,0,0.2,0.2,0,0,Mar,1,1,1,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,11,673,0.018181818,0.063636364,0,0,Mar,2,6,1,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,4,173.5,0,0.05,0,0,Mar,3,3,4,3,Returning_Visitor,TRUE,FALSE
0,0,0,0,16,156.5333333,0,0.04375,0,0,Mar,2,4,1,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,21,574.5333333,0,0.011578947,0,0,Mar,2,2,3,1,Returning_Visitor,FALSE,FALSE
2,62.5,0,0,17,548.3333333,0,0.031372549,0,0,Mar,2,2,1,2,Returning_Visitor,FALSE,FALSE
15,937.1746032,3,357,109,6682.677557,0.000833333,0.005345441,2.526616865,0,Mar,1,2,3,2,Returning_Visitor,FALSE,FALSE
2,48,0,0,51,1671.375,0.001098901,0.016433566,0,0,Mar,2,2,1,6,Returning_Visitor,TRUE,FALSE
0,0,0,0,11,1390.166667,0.012121212,0.014545455,0,0,Mar,1,1,1,3,Returning_Visitor,TRUE,FALSE
6,437.3913043,2,235.55,83,2503.881781,0.002197802,0.004916136,2.086218493,0,Mar,2,2,3,2,Returning_Visitor,FALSE,TRUE
7,159.3333333,0,0,24,520.6666667,0,0.006666667,0,0,Mar,2,10,4,3,New_Visitor,TRUE,FALSE
0,0,0,0,1,0,0.2,0.2,0,0,Mar,2,2,4,1,Returning_Visitor,FALSE,FALSE
2,32.5,0,0,19,423.8166667,0.005952381,0.039104938,0,0,Mar,3,2,1,3,Returning_Visitor,FALSE,FALSE
0,0,2,30,11,1114.916667,0,0.030769231,0,0,Mar,3,2,1,3,Returning_Visitor,FALSE,FALSE
11,212.7416667,3,104,71,1678.905125,0,0.016037881,8.600043095,0,Mar,3,2,8,13,Returning_Visitor,TRUE,FALSE
0,0,0,0,29,438.8666667,0,0.020689655,0,0,Mar,4,2,3,1,Returning_Visitor,TRUE,FALSE
3,16.33333333,0,0,23,505.5833333,0.008,0.03,9.15008,0,Mar,4,1,1,2,Returning_Visitor,FALSE,TRUE
0,0,0,0,9,76,0.022222222,0.055555556,0,0,Mar,2,2,6,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,7,203.5,0,0.033333333,0,0,Mar,1,1,1,9,New_Visitor,TRUE,FALSE
4,130,0,0,28,818.7916667,0,0.003448276,0,0,Mar,2,2,1,2,New_Visitor,FALSE,FALSE
4,15,1,17,17,490,0,0.027272727,15.66445171,0,Mar,2,2,4,10,Returning_Visitor,FALSE,TRUE
0,0,1,0,12,645.9166667,0,0.05,0,0,Mar,1,1,1,2,Returning_Visitor,FALSE,FALSE
0,0,0,0,8,142,0,0.05,0,0,Mar,2,7,2,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,6,25,0,0.033333333,0,0,Mar,2,2,1,2,Returning_Visitor,FALSE,FALSE
2,44,0,0,16,672.5,0.005555556,0.025925926,0,0,Mar,2,2,4,2,Returning_Visitor,TRUE,FALSE
9,140.5,0,0,35,1090.490476,0.013675214,0.016892552,0,0,Mar,1,1,3,2,Returning_Visitor,TRUE,FALSE
0,0,0,0,3,30,0,0.066666667,0,0,Mar,2,2,1,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,13,244.1666667,0,0.030769231,0,0,Mar,2,5,3,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,13,129.5,0.061538462,0.092307692,0,0,Mar,1,8,1,1,Returning_Visitor,FALSE,FALSE
4,56,1,88,22,1734.780952,0,0.010142857,0,0,Mar,3,2,3,9,Returning_Visitor,TRUE,FALSE
3,281,0,0,6,145,0,0.025,0,0,Mar,3,2,8,8,New_Visitor,FALSE,FALSE
2,88,0,0,16,1106.333333,0.025,0.053125,0,0,Mar,1,1,3,3,Returning_Visitor,FALSE,FALSE
1,0,0,0,17,684.9166667,0.015686275,0.049411765,0,0,Mar,2,6,4,1,Returning_Visitor,TRUE,FALSE
9,110.4090909,1,51,62,3120.211102,0.00056338,0.017396907,7.891171006,0,Mar,2,2,1,10,Returning_Visitor,FALSE,FALSE
0,0,0,0,12,1178.666667,0.024242424,0.053030303,0,0,Mar,1,1,6,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,3,58,0,0.066666667,0,0,Mar,1,8,4,11,Returning_Visitor,FALSE,FALSE
10,316.1405025,7,321.6666667,287,12983.78771,0.000668896,0.006998399,1.088158231,0,Mar,2,4,3,8,New_Visitor,FALSE,FALSE
0,0,0,0,6,139,0,0.01,0,0,Mar,1,2,1,8,New_Visitor,FALSE,FALSE
2,27,0,0,6,558,0,0.0125,0,0,Mar,2,2,3,8,New_Visitor,FALSE,FALSE
3,74,2,26,53,893.5111111,0.003571429,0.005357143,44.61199852,0,Mar,1,1,4,9,Returning_Visitor,TRUE,TRUE
0,0,0,0,5,26.5,0.04,0.12,0,0,Mar,1,1,3,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,2,0,0.2,0.2,0,0,Mar,2,2,1,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,3,0,0.2,0.2,0,0,Mar,3,2,6,3,Returning_Visitor,FALSE,FALSE
1,0,1,0,15,708.5333333,0,0.04,54.85543,0,Mar,2,4,3,2,Returning_Visitor,FALSE,FALSE
0,0,0,0,8,244,0.025,0.075,0,0,Mar,3,2,1,3,Returning_Visitor,FALSE,FALSE
2,140,0,0,6,130,0,0.025,0,0,Mar,1,1,4,2,New_Visitor,TRUE,FALSE
3,119,0,0,41,1282.5,0,0.007142857,0,0,Mar,2,6,2,2,New_Visitor,FALSE,FALSE
7,301.7,6,336.5,42,1981.016667,0.005660377,0.021383648,13.00183962,0,Mar,1,1,2,2,Returning_Visitor,TRUE,TRUE
0,0,0,0,8,186.5,0,0.025,0,0,Mar,2,2,3,3,Returning_Visitor,TRUE,FALSE
0,0,0,0,6,119,0,0.033333333,0,0,Mar,3,2,7,1,Returning_Visitor,TRUE,FALSE
0,0,0,0,22,1310.5,0.00952381,0.028571429,23.86359286,0,Mar,2,2,1,1,Returning_Visitor,FALSE,TRUE
0,0,0,0,4,1111,0,0.05,0,0,Mar,4,5,1,1,Returning_Visitor,FALSE,FALSE
6,113.5,0,0,18,1066.5,0,0.005072464,0,0,Mar,2,2,7,2,New_Visitor,FALSE,FALSE
3,421,0,0,4,110.5,0,0.011111111,0,0,Mar,3,2,8,2,New_Visitor,TRUE,FALSE
2,115,0,0,5,36,0,0.033333333,0,0,Mar,1,1,3,11,Returning_Visitor,FALSE,FALSE
0,0,2,76.5,22,850.5333333,0.004545455,0.03446281,0,0,Mar,3,2,3,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,3,16,0.033333333,0.1,0,0,Mar,2,6,1,3,Returning_Visitor,FALSE,FALSE
1,9,0,0,5,49,0,0.05,0,0,Mar,2,2,8,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,10,214.25,0,0.025,0,0,Mar,3,2,2,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,3,0,0.2,0.2,0,0,Mar,1,1,3,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,7,141.8333333,0.064285714,0.15,0,0,Mar,2,2,1,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,5,143.5,0,0.04,0,0,Mar,2,5,3,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,51,5818.916667,0.000980392,0.022984749,0,0,Mar,2,2,1,1,Returning_Visitor,FALSE,FALSE
2,208,1,50,30,1461.666667,0,0.02125,0,0,Mar,2,5,1,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,13,123,0,0.020833333,0,0,Mar,2,2,1,3,Returning_Visitor,FALSE,FALSE
5,193,1,13,66,2049.458471,0.004489796,0.012765306,29.45815149,0,Mar,3,2,3,1,Returning_Visitor,TRUE,FALSE
1,3,0,0,11,271.7166667,0,0.016666667,0,0,Mar,4,1,3,2,Returning_Visitor,TRUE,FALSE
4,87.5,1,20,36,1279.166667,0,0.010810811,0,0,Mar,2,2,1,6,Returning_Visitor,FALSE,FALSE
0,0,0,0,4,0,0.2,0.2,0,0,Mar,1,2,1,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,4,70.5,0.05,0.1,0,0,Mar,3,2,4,3,Returning_Visitor,FALSE,FALSE
5,42.18181818,0,0,12,231.1818182,0,0.01,0,0,Mar,2,2,1,2,New_Visitor,TRUE,FALSE
3,132.5,0,0,36,1567.966667,0,0.007207207,0,0,Mar,3,3,2,8,Returning_Visitor,TRUE,FALSE
7,163.6666667,0,0,8,119.3333333,0.015384615,0.023076923,0,0,Mar,3,2,6,11,New_Visitor,TRUE,FALSE
2,83,0,0,15,605.8857143,0,0.005882353,0,0,Mar,1,1,3,2,Returning_Visitor,TRUE,FALSE
5,117.8333333,0,0,35,502.547619,0.01025641,0.036923077,3.148615385,0,Mar,2,2,2,2,Returning_Visitor,FALSE,TRUE
3,95,0,0,27,808.7,0.006896552,0.010344828,0,0,Mar,3,2,7,3,Returning_Visitor,TRUE,FALSE
0,0,0,0,3,58,0,0.066666667,0,0,Mar,1,1,1,10,Returning_Visitor,FALSE,FALSE
3,60,0,0,19,494.5,0,0.01,0,0,Mar,1,1,3,9,Returning_Visitor,TRUE,FALSE
0,0,0,0,6,203.15,0,0.051111111,0,0,Mar,2,2,7,2,Returning_Visitor,FALSE,FALSE
5,55.5,0,0,63,1656.316667,0.004166667,0.015989583,0,0,Mar,2,2,2,2,Returning_Visitor,TRUE,FALSE
0,0,0,0,32,1420.25,0.00625,0.027083333,0,0,Mar,4,2,1,1,Returning_Visitor,FALSE,FALSE
8,160.5,2,1467,26,721,0,0.031029186,0,0,Mar,2,2,1,1,Returning_Visitor,FALSE,FALSE
4,64.33333333,1,13,27,1433.916667,0,0.018226601,3.691344828,0,Mar,1,4,1,8,New_Visitor,FALSE,TRUE
4,73.33333333,0,0,17,478.8333333,0,0.00877193,0,0,Mar,1,1,3,2,Returning_Visitor,FALSE,FALSE
0,0,0,0,7,182,0.028571429,0.071428571,0,0,Mar,3,2,1,13,Returning_Visitor,TRUE,FALSE
9,215.2333333,5,450,35,1974.352381,0.004761905,0.018866213,15.32910159,0,Mar,2,2,3,2,Returning_Visitor,FALSE,FALSE
4,81.5,0,0,12,223.5833333,0,0.002666667,0,0,Mar,1,1,1,3,Returning_Visitor,FALSE,FALSE
0,0,1,26,15,817.4166667,0.026666667,0.038222222,0,0,Mar,2,2,6,1,Returning_Visitor,FALSE,FALSE
7,201.5,0,0,17,750.1666667,0,0.005555556,0,0,Mar,3,2,4,2,Returning_Visitor,FALSE,FALSE
0,0,0,0,2,13,0.1,0.1,0,0,Mar,1,1,2,1,Returning_Visitor,TRUE,FALSE
8,492.4166667,4,384,52,4699.277778,0.007258065,0.018233487,11.1076505,0,Mar,2,2,1,2,Returning_Visitor,FALSE,TRUE
7,146.25,0,0,42,1030.266667,0,0.008695652,0,0,Mar,2,2,1,2,New_Visitor,FALSE,FALSE
5,156.2690476,4,90,35,776.0190476,0,0.005714286,0,0,Mar,3,2,4,2,Returning_Visitor,FALSE,FALSE
0,0,0,0,3,558,0,0.066666667,0,0,Mar,4,1,3,1,Returning_Visitor,FALSE,FALSE
4,13.61904762,0,0,27,520.3333333,0,0.020322581,8.497935484,0,Mar,3,2,4,2,Returning_Visitor,TRUE,FALSE
0,0,0,0,8,349.5,0,0.028571429,25.188,0,Mar,1,2,1,8,New_Visitor,FALSE,TRUE
2,14,0,0,31,754.5,0,0.00625,0,0,Mar,2,2,1,8,Returning_Visitor,TRUE,FALSE
0,0,0,0,13,305,0,0.016666667,0,0,Mar,1,1,1,2,New_Visitor,FALSE,FALSE
0,0,0,0,21,399.8511905,0,0.023933659,0,0,Mar,3,2,1,1,Returning_Visitor,FALSE,FALSE
1,12,0,0,6,74,0,0.028571429,0,0,Mar,1,1,1,10,Returning_Visitor,FALSE,FALSE
6,352.5,0,0,21,696.6666667,0,0.0125,75.06781572,0,Mar,2,2,6,10,New_Visitor,TRUE,TRUE
0,0,0,0,3,59,0,0.033333333,0,0,Mar,3,2,1,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,3,50,0,0.033333333,0,0,Mar,2,2,1,2,Returning_Visitor,FALSE,FALSE
5,92.75,1,74.75,84,2756.215152,0,0.002462121,0,0,Mar,2,2,9,3,New_Visitor,TRUE,FALSE
0,0,0,0,12,425.1666667,0,0.016666667,0,0,Mar,1,1,6,10,Returning_Visitor,FALSE,FALSE
0,0,0,0,78,1781.69697,0.003205128,0.015811966,0,0,Mar,2,2,8,3,Returning_Visitor,FALSE,FALSE
3,168,0,0,7,296.1666667,0,0.011111111,0,0,Mar,2,2,3,2,New_Visitor,FALSE,FALSE
0,0,0,0,1,0,0.2,0.2,0,0,Mar,2,4,1,1,Returning_Visitor,TRUE,FALSE
5,179.5,0,0,36,1792.8,0,0.004390244,0,0,Mar,2,2,3,10,Returning_Visitor,FALSE,FALSE
0,0,0,0,1,0,0.2,0.2,0,0,Mar,3,2,3,1,Returning_Visitor,FALSE,FALSE
8,274.5,0,0,24,515.5757576,0,0.003703704,0,0,Mar,3,2,2,2,Returning_Visitor,TRUE,FALSE
3,64.5,0,0,35,1334.551371,0,0.007309582,0,0,Mar,3,2,4,2,Returning_Visitor,TRUE,FALSE
0,0,0,0,6,64,0.1,0.133333333,0,0,Mar,4,1,1,1,Returning_Visitor,FALSE,FALSE
1,4,2,102,31,624.5833333,0.016216216,0.031531532,8.708324324,0,Mar,2,2,3,13,Returning_Visitor,TRUE,FALSE
9,171.6666667,3,109.75,41,1284.663492,0.016326531,0.032653061,21.22386735,0,Mar,2,2,1,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,10,316.5,0,0.025,17.538,0,Mar,2,4,1,8,New_Visitor,TRUE,TRUE
0,0,0,0,22,925.8333333,0.018181818,0.048484848,0,0,Mar,2,2,3,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,7,97,0.057142857,0.1,0,0,Mar,2,2,4,1,Returning_Visitor,FALSE,FALSE
1,0,0,0,1,28,0,0.1,0,0,Mar,2,2,1,1,Returning_Visitor,FALSE,FALSE
9,311.9166667,0,0,40,633.4,0.002272727,0.017954545,0,0,Mar,2,2,1,3,Returning_Visitor,FALSE,FALSE
1,98.5,0,0,5,436.5,0,0.016666667,0,0,Mar,7,1,1,2,New_Visitor,TRUE,FALSE
9,867.922619,0,0,137,3909.36829,0,0.005055944,9.930187005,0,Mar,2,2,6,2,Returning_Visitor,FALSE,FALSE
3,147,0,0,3,24,0,0.02,0,0,Mar,3,2,7,1,Returning_Visitor,FALSE,FALSE
2,27,0,0,18,915.1666667,0.021052632,0.036842105,0,0,Mar,2,2,4,1,Returning_Visitor,FALSE,FALSE
3,106.75,0,0,5,137.3333333,0,0.005,0,0,Mar,3,2,1,2,New_Visitor,TRUE,FALSE
0,0,0,0,5,95,0.04,0.12,0,0,Mar,2,2,1,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,1,0,0.2,0.2,0,0,Mar,1,1,2,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,24,778.1666667,0,0.0125,0,0,Mar,2,2,1,2,Returning_Visitor,FALSE,FALSE
1,55,1,47,47,1842.95,0,0.01257764,0,0,Mar,2,2,6,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,27,1206,0.016,0.032,0,0,Mar,2,2,1,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,9,324.5,0.014814815,0.022222222,0,0,Mar,1,2,6,1,Returning_Visitor,FALSE,FALSE
5,241.6666667,5,229,38,1054.944444,0.010869565,0.014565217,8.224168543,0,Mar,2,4,3,2,Returning_Visitor,TRUE,FALSE
0,0,0,0,12,402.1666667,0.041666667,0.065,0,0,Mar,3,2,2,1,Returning_Visitor,FALSE,FALSE
1,47,0,0,5,388,0,0.04,31.188,0,Mar,1,1,7,3,Returning_Visitor,TRUE,TRUE
0,0,0,0,1,0,0.2,0.2,0,0,Mar,3,2,3,11,Returning_Visitor,FALSE,FALSE
3,35,0,0,16,352,0,0.011764706,0,0,Mar,2,2,2,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,11,194,0,0.018181818,0,0,Mar,2,2,6,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,15,751.8,0.026666667,0.04,0,0,Mar,1,2,2,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,9,465.5,0.006666667,0.056666667,43.79717364,0,Mar,2,2,1,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,25,585,0,0.016,0,0,Mar,4,1,1,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,10,253.5,0,0.022222222,63.588,0,Mar,1,1,1,2,New_Visitor,TRUE,TRUE
3,33,2,84.5,4,46.5,0,0.010666667,0,0,Mar,2,2,5,8,New_Visitor,FALSE,FALSE
3,152.5,5,243.5,43,3065.945238,0,0.011666667,3.31108,0,Mar,1,2,1,1,Returning_Visitor,TRUE,TRUE
11,828.0526316,6,389.3666667,57,2099.930554,0.003333333,0.009142857,3.29868,0,Mar,2,2,1,2,Returning_Visitor,FALSE,FALSE
0,0,0,0,2,30,0,0.05,0,0,Mar,3,2,1,9,Returning_Visitor,TRUE,FALSE
0,0,0,0,3,52,0,0.066666667,0,0,Mar,2,5,8,3,Returning_Visitor,TRUE,FALSE
4,162,3,75.5,4,158.5,0,0.016666667,0,0,Mar,2,4,1,10,Returning_Visitor,FALSE,FALSE
4,539.5,0,0,1,0,0,0.05,0,0,Mar,3,2,8,8,New_Visitor,FALSE,FALSE
0,0,0,0,9,250.5,0,0.044444444,0,0,Mar,3,2,7,1,Returning_Visitor,TRUE,FALSE
4,120.5,0,0,66,3960.646154,0.002941176,0.013663064,0,0,Mar,2,4,1,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,9,280,0,0.022222222,0,0,Mar,2,2,1,2,Returning_Visitor,FALSE,FALSE
0,0,0,0,13,281.547619,0.003846154,0.017307692,0,0,Mar,1,1,2,2,Returning_Visitor,TRUE,FALSE
1,12,0,0,13,2004.5,0.028571429,0.04047619,0,0,Mar,1,1,6,2,Returning_Visitor,TRUE,FALSE
12,285.0119048,0,0,53,967.210697,0.000892857,0.033208874,0,0,Mar,2,2,3,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,6,100,0,0.033333333,0,0,Mar,2,2,4,6,Returning_Visitor,TRUE,FALSE
10,198.5,2,158,6,73.21428571,0,0.02,0,0,Mar,1,1,1,2,Returning_Visitor,FALSE,FALSE
4,224,1,32,20,789.35,0,0.002721088,0,0,Mar,1,2,4,2,Returning_Visitor,FALSE,FALSE
0,0,0,0,30,1281,0.006666667,0.02,0,0,Mar,2,4,2,1,Returning_Visitor,FALSE,FALSE
4,162.5,2,44.5,20,1115.266667,0,0.020661157,0,0,Mar,1,2,3,10,Returning_Visitor,FALSE,FALSE
0,0,0,0,1,0,0.2,0.2,0,0,Mar,3,2,2,1,Returning_Visitor,FALSE,FALSE
2,77.5,3,92,18,341.2916667,0,0.009090909,0,0,Mar,1,1,1,2,New_Visitor,TRUE,FALSE
6,192.5,0,0,113,3000.666667,0.003478261,0.005217391,0,0,Mar,2,2,3,2,Returning_Visitor,FALSE,FALSE
6,148.8,4,81.33333333,29,1715.687897,0.010909091,0.027138047,0,0,Mar,2,2,9,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,8,607,0.0375,0.0625,0,0,Mar,1,1,1,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,2,31,0,0.05,0,0,Mar,2,2,7,2,Returning_Visitor,FALSE,FALSE
0,0,0,0,16,1027.657143,0.0125,0.01875,0,0,Mar,1,1,1,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,1,0,0.2,0.2,0,0,Mar,2,2,7,10,Returning_Visitor,FALSE,FALSE
0,0,0,0,8,196.5,0,0.025,0,0,Mar,2,2,1,10,Returning_Visitor,FALSE,FALSE
4,1521,2,64,30,2284.687302,0.019354839,0.042741935,2.304322581,0,Mar,2,2,1,1,Returning_Visitor,FALSE,FALSE
13,112.2666667,0,0,49,1503.490909,0,0.003508772,0,0,Mar,2,2,2,2,New_Visitor,FALSE,FALSE
0,0,0,0,1,0,0.2,0.2,0,0,Mar,2,2,1,10,Returning_Visitor,FALSE,FALSE
3,150,0,0,12,271.3333333,0,0.014285714,0,0,Mar,1,1,4,2,New_Visitor,FALSE,FALSE
0,0,0,0,6,97.33333333,0,0.041666667,0,0,Mar,1,2,1,2,Returning_Visitor,TRUE,FALSE
0,0,0,0,5,161.3333333,0,0.05,0,0,Mar,1,1,1,3,Returning_Visitor,FALSE,FALSE
0,0,4,32.5,7,67,0,0.022222222,0,0,Mar,2,2,1,8,New_Visitor,FALSE,FALSE
0,0,0,0,34,1006.257576,0,0.015196078,0,0,Mar,2,2,7,3,Returning_Visitor,FALSE,FALSE
4,167.5,0,0,22,869.9,0,0.026388889,33.53327578,0,Mar,2,6,4,10,Returning_Visitor,FALSE,TRUE
4,57,1,0,19,479.8666667,0,0.018181818,0,0,Mar,4,2,1,2,Returning_Visitor,FALSE,FALSE
5,345,0,0,7,229.5,0.03,0.026666667,0,0,Mar,3,2,4,2,Returning_Visitor,FALSE,FALSE
0,0,0,0,1,0,0.2,0.2,0,0,Mar,1,1,7,2,Returning_Visitor,TRUE,FALSE
0,0,0,0,20,606,0,0.011111111,0,0,Mar,2,2,6,1,Returning_Visitor,FALSE,FALSE
11,267.1666667,0,0,39,881.4416667,0.004166667,0.011458333,20.11751289,0,Mar,2,2,3,1,New_Visitor,FALSE,FALSE
0,0,0,0,1,0,0.2,0.2,0,0,Mar,3,2,3,9,Returning_Visitor,TRUE,FALSE
3,123,0,0,8,371.6666667,0,0.011111111,0,0,Mar,3,2,4,2,New_Visitor,FALSE,FALSE
0,0,0,0,1,0,0.2,0.2,0,0,Mar,2,2,1,1,Returning_Visitor,FALSE,FALSE
3,1373.5,0,0,43,2798.07381,0,0.010971006,2.915511628,0,Mar,2,6,2,3,Returning_Visitor,FALSE,FALSE
5,29,0,0,4,12,0,0.033333333,0,0,Mar,4,1,1,8,New_Visitor,TRUE,FALSE
0,0,0,0,42,1185.666667,0,0.004761905,0,0,Mar,2,2,1,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,2,60,0,0.05,0,0,Mar,3,2,3,1,Returning_Visitor,FALSE,FALSE
8,29.5,0,0,89,6770.274267,0.006315789,0.030125313,0,0,Mar,2,2,3,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,5,337.25,0,0.02,0,0,Mar,2,2,2,10,Returning_Visitor,FALSE,FALSE
0,0,0,0,13,323.9166667,0,0.008333333,35.8370931,0,Mar,1,1,4,10,Returning_Visitor,FALSE,TRUE
5,79.33333333,3,242.0555556,17,1142.816919,0.006818182,0.018519814,62.16886364,0,Mar,3,2,6,2,Returning_Visitor,FALSE,FALSE
0,0,0,0,1,0,0.2,0.2,0,0,Mar,3,2,3,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,4,148.5,0.05,0.083333333,0,0,Mar,1,1,1,1,Returning_Visitor,TRUE,FALSE
3,16,0,0,11,207,0,0.015384615,0,0,Mar,2,2,2,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,2,11,0,0.1,0,0,Mar,4,2,2,10,Returning_Visitor,FALSE,FALSE
0,0,0,0,6,53,0,0.06,0,0,Mar,2,2,7,3,Returning_Visitor,TRUE,FALSE
2,33,0,0,9,354,0,0.02,0,0,Mar,3,2,1,3,New_Visitor,FALSE,FALSE
3,139,0,0,10,277.1428571,0,0.007692308,0,0,Mar,3,2,1,2,Returning_Visitor,TRUE,FALSE
2,47,0,0,17,411.625,0,0.023529412,0,0,Mar,2,2,4,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,16,392.1428571,0.00625,0.027205882,0,0,Mar,3,2,1,2,Returning_Visitor,FALSE,FALSE
1,54.5,0,0,68,3135.517677,0.003361345,0.01146836,4.095288919,0,Mar,1,1,2,1,Returning_Visitor,FALSE,FALSE
14,272.5,2,52.25,55,1127.288305,0.003125,0.014499164,0,0,Mar,3,2,7,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,25,954.4702381,0,0.012742857,0,0,Mar,3,2,1,1,Returning_Visitor,TRUE,FALSE
0,0,0,0,33,3506.166667,0,0.025,0,0,Mar,1,1,1,1,Returning_Visitor,TRUE,FALSE
0,0,0,0,19,370.3809524,0,0.007894737,0,0,Mar,1,1,1,2,Returning_Visitor,FALSE,FALSE
5,169,0,0,3,50,0,0.033333333,0,0,Mar,1,1,1,9,New_Visitor,FALSE,FALSE
4,59.25,0,0,9,139.25,0.015384615,0.031538462,0,0,Mar,3,2,1,2,Returning_Visitor,FALSE,FALSE
4,175,0,0,15,270.5,0,0.006666667,0,0,Mar,1,1,7,2,Returning_Visitor,FALSE,FALSE
0,0,0,0,9,321,0.033333333,0.085185185,0,0,Mar,2,5,5,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,1,0,0.2,0.2,0,0,Mar,2,2,1,1,Returning_Visitor,FALSE,FALSE
4,159,0,0,3,64.75,0,0.014285714,0,0,Mar,1,1,1,2,Returning_Visitor,FALSE,FALSE
0,0,0,0,4,26.5,0,0.05,0,0,Mar,2,2,9,2,Returning_Visitor,TRUE,FALSE
0,0,0,0,14,927.2777778,0,0.014285714,0,0,Mar,2,2,1,2,Returning_Visitor,FALSE,FALSE
0,0,0,0,7,141.1666667,0,0.007142857,0,0,Mar,3,2,3,1,Returning_Visitor,FALSE,FALSE
11,247.3333333,2,369,90,7221,0.001030928,0.003917526,13.46406308,0,Mar,2,2,3,8,Returning_Visitor,FALSE,TRUE
0,0,0,0,12,218.5,0,0.045833333,0,0,Mar,1,1,4,2,Returning_Visitor,FALSE,FALSE
2,78.33333333,0,0,12,262.5,0.028571429,0.033333333,0,0,Mar,1,1,1,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,17,469.4166667,0,0.011764706,0,0,Mar,1,1,2,2,Returning_Visitor,FALSE,FALSE
1,16,0,0,27,1240.916667,0,0.009259259,28.39335492,0,Mar,2,2,3,1,Returning_Visitor,FALSE,TRUE
1,8,0,0,5,143.5,0,0.011111111,0,0,Mar,3,2,2,3,New_Visitor,TRUE,FALSE
0,0,0,0,7,101,0.028571429,0.057142857,0,0,Mar,2,5,1,3,Returning_Visitor,FALSE,FALSE
5,267.5,0,0,5,62.5,0.022222222,0.044444444,0,0,Mar,2,2,2,3,New_Visitor,TRUE,FALSE
1,14,0,0,6,156,0,0.04,0,0,Mar,1,1,3,1,Returning_Visitor,TRUE,FALSE
0,0,0,0,6,104,0,0.033333333,0,0,Mar,3,2,7,6,Returning_Visitor,FALSE,FALSE
2,17,0,0,15,1349,0,0.005882353,0,0,Mar,2,2,1,1,Returning_Visitor,FALSE,FALSE
1,12,0,0,11,331.25,0.016666667,0.033333333,0,0,Mar,2,2,2,2,Returning_Visitor,TRUE,FALSE
5,114.75,0,0,8,301.5,0,0.018181818,0,0,Mar,2,4,4,2,Returning_Visitor,TRUE,FALSE
0,0,0,0,8,157.5714286,0,0.025,0,0,Mar,3,2,2,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,1,0,0.2,0.2,0,0,Mar,1,1,4,9,Returning_Visitor,TRUE,FALSE
0,0,0,0,19,224.9583333,0,0.010526316,0,0,Mar,1,1,1,2,Returning_Visitor,FALSE,FALSE
1,10,0,0,39,1152.5,0.011965812,0.017802198,0,0,Mar,3,2,1,3,Returning_Visitor,FALSE,FALSE
10,164.5,1,3,61,2292.679762,0,0.009552239,0,0,Mar,2,2,1,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,9,329,0.022222222,0.044444444,0,0,Mar,2,2,3,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,8,111.6666667,0,0.025,0,0,Mar,2,2,1,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,15,1074.428571,0.015384615,0.021538462,0,0,Mar,3,2,1,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,32,1080.047619,0,0.01015625,0,0,Mar,2,2,7,2,Returning_Visitor,FALSE,FALSE
4,387.5,0,0,23,666.9464286,0.007692308,0.026089744,0,0,Mar,1,1,6,10,Returning_Visitor,FALSE,FALSE
2,123,0,0,14,239,0,0.0125,0,0,Mar,2,2,1,2,New_Visitor,TRUE,FALSE
4,272.5,0,0,14,279.9,0,0.028571429,0,0,Mar,1,1,3,10,New_Visitor,FALSE,FALSE
0,0,0,0,1,0,0.2,0.2,0,0,Mar,2,2,7,11,Returning_Visitor,FALSE,FALSE
0,0,0,0,15,1674,0,0.04,0,0,Mar,2,2,4,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,3,15,0,0.066666667,0,0,Mar,2,4,3,1,Returning_Visitor,TRUE,FALSE
0,0,0,0,22,480.9666667,0.004848485,0.026652893,0,0,Mar,2,2,4,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,3,62,0,0.066666667,0,0,Mar,2,2,1,1,Returning_Visitor,FALSE,FALSE
4,320.5,0,0,23,1841.171429,0,0.003913043,0,0,Mar,1,1,1,2,New_Visitor,TRUE,FALSE
0,0,0,0,2,37.5,0,0.033333333,0,0,Mar,3,2,4,3,Returning_Visitor,TRUE,FALSE
2,35,0,0,11,131.3,0,0.015384615,0,0,Mar,2,2,1,2,New_Visitor,FALSE,FALSE
0,0,0,0,2,92,0,0.1,0,0,Mar,2,2,8,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,3,78.33333333,0,0.022222222,0,0,Mar,2,2,7,11,Returning_Visitor,FALSE,FALSE
0,0,0,0,7,114.6,0.028571429,0.033333333,0,0,Mar,3,2,1,10,Returning_Visitor,FALSE,FALSE
2,34,0,0,18,671,0,0.010526316,0,0,Mar,3,2,3,11,New_Visitor,TRUE,FALSE
2,47,0,0,11,624,0,0.020512821,0,0,Mar,2,2,1,1,Returning_Visitor,FALSE,FALSE
2,11,3,123.3333333,34,448.75,0.021621622,0.048648649,0,0,Mar,2,10,6,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,4,35,0,0.05,0,0,Mar,2,2,9,3,Returning_Visitor,FALSE,FALSE
3,13,0,0,7,79.5,0,0.02,0,0,Mar,2,2,1,8,New_Visitor,TRUE,FALSE
0,0,0,0,10,189.5,0,0.036666667,0,0,Mar,3,2,3,3,Returning_Visitor,FALSE,FALSE
2,36,0,0,15,2190.666667,0,0.004444444,0,0,Mar,2,2,3,8,Returning_Visitor,FALSE,FALSE
0,0,0,0,2,0,0.2,0.2,0,0,Mar,2,2,3,3,Returning_Visitor,TRUE,FALSE
0,0,0,0,2,0,0.2,0.2,0,0,Mar,1,1,1,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,5,672.5,0,0.04,0,0,Mar,2,2,1,1,Returning_Visitor,FALSE,FALSE
3,33,0,0,67,2502.816667,0.006060606,0.011147186,0,0,Mar,4,1,1,10,Returning_Visitor,FALSE,FALSE
7,97,6,281.5,83,1778.125214,0.007967033,0.019990486,6.626647741,0,Mar,2,2,3,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,4,49.5,0.05,0.075,0,0,Mar,3,2,1,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,12,261,0.033333333,0.083333333,0,0,Mar,2,2,7,1,Returning_Visitor,FALSE,FALSE
1,37,0,0,12,663.5,0,0.016666667,10.83431037,0,Mar,3,2,6,8,New_Visitor,FALSE,TRUE
4,55,0,0,16,284.9,0.003333333,0.033333333,18.8649,0,Mar,1,1,2,10,Returning_Visitor,FALSE,FALSE
0,0,0,0,7,236,0.057142857,0.085714286,0,0,Mar,2,2,3,2,Returning_Visitor,FALSE,FALSE
3,26,0,0,19,576.0833333,0.009090909,0.018181818,30.65045455,0,Mar,2,2,2,1,Returning_Visitor,TRUE,TRUE
0,0,0,0,3,77,0,0.066666667,0,0,Mar,3,6,1,9,Returning_Visitor,TRUE,FALSE
0,0,0,0,1,0,0.2,0.2,0,0,Mar,2,2,1,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,3,79,0.066666667,0.166666667,0,0,Mar,1,1,3,3,Returning_Visitor,FALSE,FALSE
2,24.5,1,710,66,4566.952839,0.006470588,0.018141923,0,0,Mar,3,2,2,2,Returning_Visitor,FALSE,FALSE
1,24,3,125.5,65,8646,0,0.011764706,0,0,Mar,2,2,1,13,Returning_Visitor,TRUE,FALSE
0,0,0,0,17,600.5,0,0.005882353,0,0,Mar,2,2,7,10,Returning_Visitor,FALSE,FALSE
0,0,0,0,21,434.5,0,0.023809524,0,0,Mar,2,2,7,1,Returning_Visitor,FALSE,FALSE
1,0,0,0,35,499.4,0.011764706,0.028151261,0,0,Mar,2,2,3,1,Returning_Visitor,TRUE,FALSE
9,122,1,87,50,1694.797619,0.008928571,0.018154762,0,0,Mar,1,1,1,3,Returning_Visitor,TRUE,FALSE
1,123,0,0,7,181.5,0,0.025,64.7325,0,Mar,2,2,1,2,New_Visitor,TRUE,TRUE
3,308,0,0,54,1306.151974,0.003508772,0.012962963,0,0,Mar,2,2,4,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,6,75,0,0.016666667,0,0,Mar,1,1,1,2,Returning_Visitor,FALSE,FALSE
0,0,0,0,6,61,0,0.066666667,0,0,Mar,2,4,1,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,12,1165.333333,0.004166667,0.043055556,0,0,Mar,2,2,3,2,Returning_Visitor,FALSE,FALSE
0,0,0,0,1,0,0.2,0.2,0,0,Mar,3,2,5,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,6,70.83333333,0,0.016666667,0,0,Mar,2,2,8,2,Returning_Visitor,FALSE,FALSE
5,72.5,0,0,31,649.3071429,0,0.001041667,35.10378279,0,Mar,2,7,2,2,Returning_Visitor,TRUE,TRUE
1,21,1,61,49,1647.152381,0,0.0008,144.3934888,0,Mar,2,2,7,2,Returning_Visitor,TRUE,TRUE
6,233.0833333,2,63,60,3135.442572,0.001666667,0.009358814,0,0,Mar,3,2,1,10,Returning_Visitor,FALSE,FALSE
0,0,0,0,9,181.3333333,0.02962963,0.055026455,0,0,Mar,2,2,1,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,9,159,0,0.022222222,0,0,Mar,2,2,1,2,Returning_Visitor,TRUE,FALSE
4,315,0,0,8,465.8333333,0,0.024242424,0,0,Mar,3,2,3,3,Returning_Visitor,TRUE,FALSE
0,0,0,0,3,112,0.066666667,0.133333333,0,0,Mar,2,2,7,10,Returning_Visitor,FALSE,FALSE
0,0,0,0,40,952.9666667,0.001666667,0.016666667,0,0,Mar,1,1,2,2,Returning_Visitor,FALSE,FALSE
0,0,0,0,8,372.8333333,0,0.0125,0,0,Mar,1,1,1,1,Returning_Visitor,FALSE,FALSE
6,192.5,0,0,14,327,0,0.00625,0,0,Mar,1,1,1,9,Returning_Visitor,TRUE,FALSE
0,0,0,0,1,0,0.2,0.2,0,0,Mar,2,2,2,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,6,1057,0,0.033333333,0,0,Mar,2,4,4,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,3,12,0,0.066666667,0,0,Mar,2,2,1,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,1,36,0,0.066666667,0,0,Mar,3,2,6,2,Returning_Visitor,TRUE,FALSE
3,43.5,0,0,30,2264.333333,0,0.010416667,0,0,Mar,2,2,1,3,Returning_Visitor,TRUE,FALSE
4,76,0,0,28,866,0,0.02183908,0,0,Mar,2,2,4,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,4,97,0,0.05,0,0,Mar,2,2,2,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,17,701.5424242,0.013333333,0.026666667,0,0,Mar,2,2,6,2,Returning_Visitor,FALSE,FALSE
2,35,0,0,20,979.0833333,0,0.00952381,60.04549665,0,Mar,2,2,3,2,Returning_Visitor,FALSE,TRUE
3,13,0,0,28,324.7692308,0,0.001724138,0,0,Mar,2,2,1,6,Returning_Visitor,FALSE,FALSE
6,160.0952381,3,94.5,47,1682.870247,0.001333333,0.007891429,5.698642857,0,Mar,3,2,6,10,Returning_Visitor,FALSE,TRUE
0,0,0,0,9,210,0.044444444,0.055555556,0,0,Mar,1,1,3,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,20,332,0.03,0.06,0,0,Mar,4,1,3,1,Returning_Visitor,FALSE,FALSE
1,45,0,0,13,1610.916667,0,0.007142857,0,0,Mar,1,1,1,3,New_Visitor,TRUE,FALSE
4,177.1666667,0,0,50,1188.566667,0.007843137,0.018300654,0,0,Mar,2,2,3,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,3,98,0,0.066666667,0,0,Mar,2,6,7,1,Returning_Visitor,FALSE,FALSE
0,0,1,36.33333333,38,1663.683333,0.005405405,0.022972973,0,0,Mar,2,2,4,1,Returning_Visitor,FALSE,FALSE
4,43.5,0,0,39,930.3,0.001190476,0.010997732,0,0,Mar,4,5,1,3,Returning_Visitor,TRUE,FALSE
0,0,0,0,21,1003,0,0.008333333,0,0,Mar,2,4,1,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,3,69,0,0.066666667,0,0,Mar,2,2,2,6,Returning_Visitor,FALSE,FALSE
0,0,0,0,27,1199.725758,0.007407407,0.01691358,9.028406684,0,Mar,1,1,2,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,34,1524.058333,0.019393939,0.025282904,11.77367361,0,Mar,3,2,3,1,Returning_Visitor,FALSE,FALSE
0,0,2,45,11,624,0.015384615,0.046153846,0,0,Mar,2,2,4,10,Returning_Visitor,FALSE,FALSE
0,0,0,0,37,1229.766667,0.005405405,0.014414414,0,0,Mar,2,2,1,3,Returning_Visitor,TRUE,FALSE
0,0,0,0,13,972.6,0,0.007692308,0,0,Mar,2,2,3,10,Returning_Visitor,FALSE,FALSE
5,159,0,0,17,438.4333333,0.003030303,0.027272727,0,0,Mar,1,1,3,3,Returning_Visitor,FALSE,FALSE
0,0,0,0,10,270,0,0.004,0,0,Mar,2,2,1,2,Returning_Visitor,FALSE,FALSE
0,0,0,0,3,333,0,0.066666667,0,0,Mar,2,2,2,1,Returning_Visitor,TRUE,FALSE
0,0,0,0,20,504.2333333,0.01,0.021666667,0,0,Mar,3,2,1,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,27,845.5,0,0.007407407,0,0,Mar,4,1,1,11,Returning_Visitor,TRUE,FALSE
1,54,1,237,16,744.5,0.013333333,0.033777778,0,0,Mar,2,2,6,2,Returning_Visitor,FALSE,FALSE
0,0,0,0,21,1129,0.00952381,0.038095238,0,0,Mar,2,5,5,1,Returning_Visitor,FALSE,FALSE
2,34,0,0,8,358,0,0.02,0,0,Mar,2,2,1,2,Returning_Visitor,FALSE,FALSE
0,0,0,0,24,832,0,0.020289855,21.92521348,0,Mar,2,6,6,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,4,36.5,0,0.05,0,0,Mar,2,2,7,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,7,157,0,0.014285714,0,0,Mar,3,2,1,2,Returning_Visitor,FALSE,FALSE
3,36,0,0,9,71.33333333,0,0.02,0,0,Mar,2,2,1,11,New_Visitor,FALSE,FALSE
7,196,3,138.5,11,227.5,0,0.006666667,0,0,Mar,3,2,5,8,New_Visitor,TRUE,FALSE
1,0,2,56,22,1054.309524,0.004761905,0.023809524,0,0,Mar,1,1,1,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,6,308.1666667,0.083333333,0.095,0,0,Mar,1,1,6,1,Returning_Visitor,FALSE,FALSE
0,0,0,0,10,229.25,0,0.06,0,0,Mar,1,1,6,2,Returning_Visitor,FALSE,FALSE
0,0,1,29,9,225.8333333,0,0.02,0,0,Mar,2,2,1,3,Returning_Visitor,TRUE,FALSE
2,21,1,26,22,326.5833333,0.018181818,0.066666667,0,0,Mar,3,2,4
Download .txt
gitextract_o39wik8g/

├── .gitignore
├── README.md
├── week0/
│   ├── degrees/
│   │   ├── degrees.py
│   │   ├── small/
│   │   │   ├── movies.csv
│   │   │   ├── people.csv
│   │   │   └── stars.csv
│   │   └── util.py
│   └── tictactoe/
│       ├── requirements.txt
│       ├── runner.py
│       └── tictactoe.py
├── week1/
│   ├── knights/
│   │   ├── logic.py
│   │   └── puzzle.py
│   └── minesweeper/
│       ├── minesweeper.py
│       ├── requirements.txt
│       └── runner.py
├── week2/
│   ├── heredity/
│   │   └── heredity.py
│   └── pagerank/
│       └── pagerank.py
├── week3/
│   └── crossword/
│       ├── crossword.py
│       ├── data/
│       │   ├── structure0.txt
│       │   ├── structure1.txt
│       │   ├── structure2.txt
│       │   ├── words0.txt
│       │   ├── words1.txt
│       │   └── words2.txt
│       └── generate.py
├── week4/
│   ├── nim/
│   │   ├── nim.py
│   │   └── play.py
│   └── shopping/
│       ├── shopping.csv
│       └── shopping.py
├── week5/
│   └── traffic/
│       └── traffic.py
└── week6/
    ├── parser/
    │   ├── parser.py
    │   └── sentences/
    │       ├── 1.txt
    │       ├── 10.txt
    │       ├── 2.txt
    │       ├── 3.txt
    │       ├── 4.txt
    │       ├── 5.txt
    │       ├── 6.txt
    │       ├── 7.txt
    │       ├── 8.txt
    │       ├── 9.txt
    │       └── test.txt
    └── questions/
        ├── corpus/
        │   ├── artificial_intelligence.txt
        │   ├── machine_learning.txt
        │   ├── natural_language_processing.txt
        │   ├── neural_network.txt
        │   ├── probability.txt
        │   └── python.txt
        └── questions.py
Download .txt
SYMBOL INDEX (170 symbols across 15 files)

FILE: week0/degrees/degrees.py
  function load_data (line 16) | def load_data(directory):
  function main (line 56) | def main():
  function shortest_path (line 88) | def shortest_path(source, target):
  function person_id_for_name (line 140) | def person_id_for_name(name):
  function neighbors_for_person (line 166) | def neighbors_for_person(person_id):

FILE: week0/degrees/util.py
  class Node (line 1) | class Node():
    method __init__ (line 2) | def __init__(self, state, parent, action):
  class StackFrontier (line 8) | class StackFrontier():
    method __init__ (line 9) | def __init__(self):
    method add (line 12) | def add(self, node):
    method contains_state (line 15) | def contains_state(self, state):
    method empty (line 18) | def empty(self):
    method remove (line 21) | def remove(self):
  class QueueFrontier (line 30) | class QueueFrontier(StackFrontier):
    method remove (line 32) | def remove(self):

FILE: week0/tictactoe/tictactoe.py
  function initial_state (line 13) | def initial_state():
  function player (line 22) | def player(board):
  function actions (line 39) | def actions(board):
  function result (line 54) | def result(board, action):
  function winner (line 71) | def winner(board):
  function terminal (line 96) | def terminal(board):
  function utility (line 113) | def utility(board):
  function minimax (line 128) | def minimax(board):

FILE: week1/knights/logic.py
  class Sentence (line 4) | class Sentence():
    method evaluate (line 6) | def evaluate(self, model):
    method formula (line 10) | def formula(self):
    method symbols (line 14) | def symbols(self):
    method validate (line 19) | def validate(cls, sentence):
    method parenthesize (line 24) | def parenthesize(cls, s):
  class Symbol (line 45) | class Symbol(Sentence):
    method __init__ (line 47) | def __init__(self, name):
    method __eq__ (line 50) | def __eq__(self, other):
    method __hash__ (line 53) | def __hash__(self):
    method __repr__ (line 56) | def __repr__(self):
    method evaluate (line 59) | def evaluate(self, model):
    method formula (line 65) | def formula(self):
    method symbols (line 68) | def symbols(self):
  class Not (line 72) | class Not(Sentence):
    method __init__ (line 73) | def __init__(self, operand):
    method __eq__ (line 77) | def __eq__(self, other):
    method __hash__ (line 80) | def __hash__(self):
    method __repr__ (line 83) | def __repr__(self):
    method evaluate (line 86) | def evaluate(self, model):
    method formula (line 89) | def formula(self):
    method symbols (line 92) | def symbols(self):
  class And (line 96) | class And(Sentence):
    method __init__ (line 97) | def __init__(self, *conjuncts):
    method __eq__ (line 102) | def __eq__(self, other):
    method __hash__ (line 105) | def __hash__(self):
    method __repr__ (line 110) | def __repr__(self):
    method add (line 116) | def add(self, conjunct):
    method evaluate (line 120) | def evaluate(self, model):
    method formula (line 123) | def formula(self):
    method symbols (line 129) | def symbols(self):
  class Or (line 133) | class Or(Sentence):
    method __init__ (line 134) | def __init__(self, *disjuncts):
    method __eq__ (line 139) | def __eq__(self, other):
    method __hash__ (line 142) | def __hash__(self):
    method __repr__ (line 147) | def __repr__(self):
    method evaluate (line 151) | def evaluate(self, model):
    method formula (line 154) | def formula(self):
    method symbols (line 160) | def symbols(self):
  class Implication (line 164) | class Implication(Sentence):
    method __init__ (line 165) | def __init__(self, antecedent, consequent):
    method __eq__ (line 171) | def __eq__(self, other):
    method __hash__ (line 176) | def __hash__(self):
    method __repr__ (line 179) | def __repr__(self):
    method evaluate (line 182) | def evaluate(self, model):
    method formula (line 186) | def formula(self):
    method symbols (line 191) | def symbols(self):
  class Biconditional (line 195) | class Biconditional(Sentence):
    method __init__ (line 196) | def __init__(self, left, right):
    method __eq__ (line 202) | def __eq__(self, other):
    method __hash__ (line 207) | def __hash__(self):
    method __repr__ (line 210) | def __repr__(self):
    method evaluate (line 213) | def evaluate(self, model):
    method formula (line 219) | def formula(self):
    method symbols (line 224) | def symbols(self):
  function model_check (line 228) | def model_check(knowledge, query):

FILE: week1/knights/puzzle.py
  function main (line 122) | def main():

FILE: week1/minesweeper/minesweeper.py
  class Minesweeper (line 6) | class Minesweeper():
    method __init__ (line 11) | def __init__(self, height=8, width=8, mines=8):
    method print (line 37) | def print(self):
    method is_mine (line 52) | def is_mine(self, cell):
    method nearby_mines (line 56) | def nearby_mines(self, cell):
    method won (line 81) | def won(self):
  class Sentence (line 88) | class Sentence():
    method __init__ (line 95) | def __init__(self, cells, count):
    method __eq__ (line 99) | def __eq__(self, other):
    method __str__ (line 102) | def __str__(self):
    method known_mines (line 105) | def known_mines(self):
    method known_safes (line 112) | def known_safes(self):
    method mark_mine (line 119) | def mark_mine(self, cell):
    method mark_safe (line 130) | def mark_safe(self, cell):
  class MinesweeperAI (line 141) | class MinesweeperAI():
    method __init__ (line 146) | def __init__(self, height=8, width=8):
    method mark_mine (line 162) | def mark_mine(self, cell):
    method mark_safe (line 171) | def mark_safe(self, cell):
    method add_knowledge (line 180) | def add_knowledge(self, cell, count):
    method return_close_cells (line 230) | def return_close_cells(self, cell):
    method check_knowledge (line 242) | def check_knowledge(self):
    method extra_inference (line 272) | def extra_inference(self):
    method make_safe_move (line 302) | def make_safe_move(self):
    method make_random_move (line 318) | def make_random_move(self):

FILE: week2/heredity/heredity.py
  function main (line 40) | def main():
  function load_data (line 97) | def load_data(filename):
  function powerset (line 119) | def powerset(s):
  function joint_probability (line 131) | def joint_probability(people, one_gene, two_genes, have_trait):
  function update (line 180) | def update(probabilities, one_gene, two_genes, have_trait, p):
  function normalize (line 193) | def normalize(probabilities):

FILE: week2/pagerank/pagerank.py
  function main (line 10) | def main():
  function crawl (line 24) | def crawl(directory):
  function transition_model (line 51) | def transition_model(corpus, page, damping_factor):
  function sample_pagerank (line 86) | def sample_pagerank(corpus, damping_factor, n):
  function iterate_pagerank (line 124) | def iterate_pagerank(corpus, damping_factor):

FILE: week3/crossword/crossword.py
  class Variable (line 1) | class Variable():
    method __init__ (line 6) | def __init__(self, i, j, direction, length):
    method __hash__ (line 19) | def __hash__(self):
    method __eq__ (line 22) | def __eq__(self, other):
    method __str__ (line 30) | def __str__(self):
    method __repr__ (line 33) | def __repr__(self):
  class Crossword (line 38) | class Crossword():
    method __init__ (line 40) | def __init__(self, structure_file, words_file):
    method neighbors (line 128) | def neighbors(self, var):

FILE: week3/crossword/generate.py
  class CrosswordCreator (line 7) | class CrosswordCreator():
    method __init__ (line 9) | def __init__(self, crossword):
    method letter_grid (line 19) | def letter_grid(self, assignment):
    method print (line 35) | def print(self, assignment):
    method save (line 48) | def save(self, assignment, filename):
    method solve (line 89) | def solve(self):
    method enforce_node_consistency (line 97) | def enforce_node_consistency(self):
    method revise (line 117) | def revise(self, x, y):
    method ac3 (line 155) | def ac3(self, arcs=None):
    method assignment_complete (line 183) | def assignment_complete(self, assignment):
    method consistent (line 193) | def consistent(self, assignment):
    method order_domain_values (line 222) | def order_domain_values(self, var, assignment):
    method select_unassigned_variable (line 257) | def select_unassigned_variable(self, assignment):
    method backtrack (line 281) | def backtrack(self, assignment):
  function main (line 310) | def main():

FILE: week4/nim/nim.py
  class Nim (line 6) | class Nim():
    method __init__ (line 8) | def __init__(self, initial=[1, 3, 5, 7]):
    method available_actions (line 21) | def available_actions(cls, piles):
    method other_player (line 36) | def other_player(cls, player):
    method switch_player (line 43) | def switch_player(self):
    method move (line 49) | def move(self, action):
  class NimAI (line 73) | class NimAI():
    method __init__ (line 75) | def __init__(self, alpha=0.5, epsilon=0.1):
    method update (line 89) | def update(self, old_state, action, new_state, reward):
    method get_q_value (line 99) | def get_q_value(self, state, action):
    method update_q_value (line 109) | def update_q_value(self, state, action, old_q, reward, future_rewards):
    method best_future_reward (line 127) | def best_future_reward(self, state):
    method choose_action (line 145) | def choose_action(self, state, epsilon=True):
  function train (line 188) | def train(n):
  function play (line 247) | def play(ai, human_player=None):

FILE: week4/shopping/shopping.py
  function main (line 12) | def main():
  function load_data (line 36) | def load_data(filename):
  function train_model (line 105) | def train_model(evidence, labels):
  function evaluate (line 116) | def evaluate(labels, predictions):

FILE: week5/traffic/traffic.py
  function main (line 16) | def main():
  function load_data (line 49) | def load_data(data_dir):
  function get_model (line 80) | def get_model():

FILE: week6/parser/parser.py
  function main (line 30) | def main():
  function preprocess (line 63) | def preprocess(sentence):
  function np_chunk (line 75) | def np_chunk(tree):

FILE: week6/questions/questions.py
  function main (line 11) | def main():
  function load_files (line 49) | def load_files(directory):
  function tokenize (line 63) | def tokenize(document):
  function compute_idfs (line 79) | def compute_idfs(documents):
  function top_files (line 103) | def top_files(query, files, idfs, n):
  function top_sentences (line 123) | def top_sentences(query, sentences, idfs, n):
Condensed preview — 49 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (1,471K chars).
[
  {
    "path": ".gitignore",
    "chars": 63,
    "preview": "*.zip\n*.pyc\n\n__pycache__/\n.venv/\nvenv/\n.idea/\n\n*/degrees/large/"
  },
  {
    "path": "README.md",
    "chars": 490,
    "preview": "# CS50 AI \nMine solutions for CS50's Introduction to Artificial Intelligence with Python course\n\n*Warning : before visit"
  },
  {
    "path": "week0/degrees/degrees.py",
    "chars": 5030,
    "preview": "import csv\nimport sys\n\nfrom util import Node, StackFrontier, QueueFrontier\n\n# Maps names to a set of corresponding perso"
  },
  {
    "path": "week0/degrees/small/movies.csv",
    "chars": 148,
    "preview": "id,title,year\n112384,\"Apollo 13\",1995\n104257,\"A Few Good Men\",1992\n109830,\"Forrest Gump\",1994\n93779,\"The Princess Bride\""
  },
  {
    "path": "week0/degrees/small/people.csv",
    "chars": 405,
    "preview": "id,name,birth\n102,\"Kevin Bacon\",1958\n129,\"Tom Cruise\",1962\n144,\"Cary Elwes\",1962\n158,\"Tom Hanks\",1956\n1597,\"Mandy Patink"
  },
  {
    "path": "week0/degrees/small/stars.csv",
    "chars": 236,
    "preview": "person_id,movie_id\n102,104257\n102,112384\n129,104257\n129,95953\n144,93779\n158,109830\n158,112384\n1597,93779\n163,95953\n1697,"
  },
  {
    "path": "week0/degrees/util.py",
    "chars": 916,
    "preview": "class Node():\n    def __init__(self, state, parent, action):\n        self.state = state\n        self.parent = parent\n   "
  },
  {
    "path": "week0/tictactoe/requirements.txt",
    "chars": 7,
    "preview": "pygame\n"
  },
  {
    "path": "week0/tictactoe/runner.py",
    "chars": 4709,
    "preview": "import pygame\nimport sys\nimport time\n\nimport tictactoe as ttt\n\npygame.init()\nsize = width, height = 600, 400\n\n# Colors\nb"
  },
  {
    "path": "week0/tictactoe/tictactoe.py",
    "chars": 3620,
    "preview": "\"\"\"\nTic Tac Toe Player\n\"\"\"\n\nimport math\nfrom copy import deepcopy\n\nX = \"X\"\nO = \"O\"\nEMPTY = None\n\n\ndef initial_state():\n "
  },
  {
    "path": "week1/knights/logic.py",
    "chars": 7897,
    "preview": "import itertools\n\n\nclass Sentence():\n\n    def evaluate(self, model):\n        \"\"\"Evaluates the logical sentence.\"\"\"\n     "
  },
  {
    "path": "week1/knights/puzzle.py",
    "chars": 4103,
    "preview": "from logic import *\n\nAKnight = Symbol(\"A is a Knight\")\nAKnave = Symbol(\"A is a Knave\")\n\nBKnight = Symbol(\"B is a Knight\""
  },
  {
    "path": "week1/minesweeper/minesweeper.py",
    "chars": 10924,
    "preview": "import itertools\nimport random\nimport copy\n\n\nclass Minesweeper():\n    \"\"\"\n    Minesweeper game representation\n    \"\"\"\n\n "
  },
  {
    "path": "week1/minesweeper/requirements.txt",
    "chars": 7,
    "preview": "pygame\n"
  },
  {
    "path": "week1/minesweeper/runner.py",
    "chars": 6910,
    "preview": "import pygame\nimport sys\nimport time\n\nfrom minesweeper import Minesweeper, MinesweeperAI\n\nHEIGHT = 8\nWIDTH = 8\nMINES = 8"
  },
  {
    "path": "week2/heredity/heredity.py",
    "chars": 6588,
    "preview": "import csv\nimport itertools\nimport sys\n\nPROBS = {\n\n    # Unconditional probabilities for having gene\n    \"gene\": {\n     "
  },
  {
    "path": "week2/pagerank/pagerank.py",
    "chars": 5203,
    "preview": "import os\nimport random\nimport re\nimport sys\n\nDAMPING = 0.85\nSAMPLES = 10000\n\n\ndef main():\n    if len(sys.argv) != 2:\n  "
  },
  {
    "path": "week3/crossword/crossword.py",
    "chars": 4613,
    "preview": "class Variable():\n\n    ACROSS = \"across\"\n    DOWN = \"down\"\n\n    def __init__(self, i, j, direction, length):\n        \"\"\""
  },
  {
    "path": "week3/crossword/data/structure0.txt",
    "chars": 30,
    "preview": "#___#\n#_##_\n#_##_\n#_##_\n#____\n"
  },
  {
    "path": "week3/crossword/data/structure1.txt",
    "chars": 135,
    "preview": "##############\n#######_####_#\n#____________#\n#_#####_####_#\n#_##_____###_#\n#_#####_####_#\n#_###______#_#\n#######_####_#\n"
  },
  {
    "path": "week3/crossword/data/structure2.txt",
    "chars": 48,
    "preview": "######_\n____##_\n_##____\n_##_##_\n_##_##_\n#___##_\n"
  },
  {
    "path": "week3/crossword/data/words0.txt",
    "chars": 49,
    "preview": "one\ntwo\nthree\nfour\nfive\nsix\nseven\neight\nnine\nten\n"
  },
  {
    "path": "week3/crossword/data/words1.txt",
    "chars": 418,
    "preview": "adversarial\nalpha\narc\nartificial\nbayes\nbeta\nbit\nbreadth\nbyte\nclassification\nclassify\ncondition\nconstraint\ncreate\ndepth\nd"
  },
  {
    "path": "week3/crossword/data/words2.txt",
    "chars": 22224,
    "preview": "a\nabandon\nability\nable\nabortion\nabout\nabove\nabroad\nabsence\nabsolute\nabsolutely\nabsorb\nabuse\nacademic\naccept\naccess\naccid"
  },
  {
    "path": "week3/crossword/generate.py",
    "chars": 12551,
    "preview": "import sys\nimport copy\n\nfrom crossword import *\n\n\nclass CrosswordCreator():\n\n    def __init__(self, crossword):\n        "
  },
  {
    "path": "week4/nim/nim.py",
    "chars": 9062,
    "preview": "import math\nimport random\nimport time\n\n\nclass Nim():\n\n    def __init__(self, initial=[1, 3, 5, 7]):\n        \"\"\"\n        "
  },
  {
    "path": "week4/nim/play.py",
    "chars": 56,
    "preview": "from nim import train, play\n\nai = train(10000)\nplay(ai)\n"
  },
  {
    "path": "week4/shopping/shopping.csv",
    "chars": 1059732,
    "preview": "Administrative,Administrative_Duration,Informational,Informational_Duration,ProductRelated,ProductRelated_Duration,Bounc"
  },
  {
    "path": "week4/shopping/shopping.py",
    "chars": 4401,
    "preview": "import csv\nimport pandas\nimport sys\n\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.neighbors import "
  },
  {
    "path": "week5/traffic/traffic.py",
    "chars": 3713,
    "preview": "import cv2\nimport numpy as np\nimport os\nimport sys\nimport tensorflow as tf\n\nfrom sklearn.model_selection import train_te"
  },
  {
    "path": "week6/parser/parser.py",
    "chars": 2393,
    "preview": "import nltk\nimport sys\nimport string\n\nTERMINALS = \"\"\"\nAdj -> \"country\" | \"dreadful\" | \"enigmatical\" | \"little\" | \"moist\""
  },
  {
    "path": "week6/parser/sentences/1.txt",
    "chars": 12,
    "preview": "Holmes sat.\n"
  },
  {
    "path": "week6/parser/sentences/10.txt",
    "chars": 55,
    "preview": "I had a little moist red paint in the palm of my hand.\n"
  },
  {
    "path": "week6/parser/sentences/2.txt",
    "chars": 19,
    "preview": "Holmes lit a pipe.\n"
  },
  {
    "path": "week6/parser/sentences/3.txt",
    "chars": 36,
    "preview": "We arrived the day before Thursday.\n"
  },
  {
    "path": "week6/parser/sentences/4.txt",
    "chars": 48,
    "preview": "Holmes sat in the red armchair and he chuckled.\n"
  },
  {
    "path": "week6/parser/sentences/5.txt",
    "chars": 42,
    "preview": "My companion smiled an enigmatical smile. "
  },
  {
    "path": "week6/parser/sentences/6.txt",
    "chars": 28,
    "preview": "Holmes chuckled to himself.\n"
  },
  {
    "path": "week6/parser/sentences/7.txt",
    "chars": 53,
    "preview": "She never said a word until we were at the door here."
  },
  {
    "path": "week6/parser/sentences/8.txt",
    "chars": 34,
    "preview": "Holmes sat down and lit his pipe.\n"
  },
  {
    "path": "week6/parser/sentences/9.txt",
    "chars": 67,
    "preview": "I had a country walk on Thursday and came home in a dreadful mess.\n"
  },
  {
    "path": "week6/parser/sentences/test.txt",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "week6/questions/corpus/artificial_intelligence.txt",
    "chars": 100263,
    "preview": "https://en.wikipedia.org/wiki/Artificial_intelligence\n\nIn computer science, artificial intelligence (AI), sometimes call"
  },
  {
    "path": "week6/questions/corpus/machine_learning.txt",
    "chars": 42327,
    "preview": "https://en.wikipedia.org/wiki/Machine_learning\n\nMachine learning (ML) is the study of computer algorithms that improve a"
  },
  {
    "path": "week6/questions/corpus/natural_language_processing.txt",
    "chars": 20039,
    "preview": "https://en.wikipedia.org/wiki/Natural_language_processing\n\nNatural language processing (NLP) is a subfield of linguistic"
  },
  {
    "path": "week6/questions/corpus/neural_network.txt",
    "chars": 35710,
    "preview": "https://en.wikipedia.org/wiki/Neural_network\n\nArtificial neural networks (ANN) or connectionist systems are computing sy"
  },
  {
    "path": "week6/questions/corpus/probability.txt",
    "chars": 26573,
    "preview": "https://en.wikipedia.org/wiki/Probability\n\nProbability is a numerical description of how likely an event is to occur or "
  },
  {
    "path": "week6/questions/corpus/python.txt",
    "chars": 38870,
    "preview": "https://en.wikipedia.org/wiki/Python_(programming_language)\n\nevel, general-purpose programming language. Created by Guid"
  },
  {
    "path": "week6/questions/questions.py",
    "chars": 4409,
    "preview": "import nltk\nimport sys\nimport os\nimport string\nimport math\n\nFILE_MATCHES = 1\nSENTENCE_MATCHES = 1\n\n\ndef main():\n\n    # C"
  }
]

About this extraction

This page contains the full source code of the wbsth/cs50ai GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 49 files (1.4 MB), approximately 677.4k tokens, and a symbol index with 170 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!