Compare commits

..

No commits in common. "master" and "bb3fc2715f2ea72eaa57d224697b8221c520d1e5" have entirely different histories.

13562 changed files with 88 additions and 753 deletions

3
.idea/.gitignore vendored
View File

@ -1,3 +0,0 @@
# Default ignored files
/shelf/
/workspace.xml

View File

@ -4,4 +4,5 @@ class AgentActionType (Enum):
MOVE_FORWARD = 0 MOVE_FORWARD = 0
TURN_LEFT = 1 TURN_LEFT = 1
TURN_RIGHT = 2 TURN_RIGHT = 2
EMPTY_CAN = 3
UNKNOWN = None UNKNOWN = None

168
bfs.py
View File

@ -1,165 +1,95 @@
from agentState import AgentState from agentState import AgentState
from typing import Dict, Tuple, List from typing import Dict, Tuple
from city import City
from gridCellType import GridCellType from gridCellType import GridCellType
from agentActionType import AgentActionType from agentActionType import AgentActionType
from agentOrientation import AgentOrientation from agentOrientation import AgentOrientation
from queue import Queue, PriorityQueue from queue import Queue
from turnCar import turn_left_orientation, turn_right_orientation from turnCar import turn_left_orientation, turn_right_orientation
class Succ:
state: AgentState
action: AgentActionType
class Successor: # klasa reprezentuje sukcesora, stan i akcję którą można po nim podjąć def __init__(self, state: AgentState, action: AgentActionType) -> None:
def __init__(self, state: AgentState, action: AgentActionType, cost: int, predicted_cost: int) -> None:
self.state = state self.state = state
self.action = action self.action = action
self.cost = cost
self.predicted_cost = predicted_cost
def find_path_to_nearest_can(startState: AgentState, grid: Dict[Tuple[int, int], GridCellType]) -> list[AgentActionType]:
class SuccessorList: # lista sukcesorów, czyli możliwych ścieżek po danym stanie q: Queue[list[Succ]] = Queue()
succ_list: list[Successor] visited: list[AgentState] = []
startStates: list[Succ] = [Succ(startState, AgentActionType.UNKNOWN)]
def __init__(self, succ_list: list[Successor]) -> None: q.put(startStates)
self.succ_list = succ_list while not q.empty():
currently_checked = q.get()
def __gt__(self, other): visited.append(currently_checked[-1].state)
return self.succ_list[-1].predicted_cost > other.succ_list[-1].predicted_cost if is_state_success(currently_checked[-1].state, grid):
return extract_actions(currently_checked)
def __lt__(self, other): successors = succ(currently_checked[-1].state)
return self.succ_list[-1].predicted_cost < other.succ_list[-1].predicted_cost
def find_path_to_nearest_can(startState: AgentState, grid: Dict[Tuple[int, int], GridCellType], city: City) -> List[
AgentActionType]: # znajduje ścieżkę do najbliższego kosza na smieci
visited: List[AgentState] = []
queue: PriorityQueue[SuccessorList] = PriorityQueue() # kolejka priorytetowa przechodująca listę sukcesorów
queue.put(SuccessorList([Successor(startState, AgentActionType.UNKNOWN, 0, _heuristics(startState.position, city))]))
while not queue.empty(): # dopóki kolejka nie jest pusta, pobiera z niej aktualny element
current = queue.get()
previous = current.succ_list[-1]
visited.append(previous.state)
if is_state_success(previous.state, grid): # jeśli ostatni stan w liście jest stanem końcowym (agent dotarł do śmietnika)
return extract_actions(current)
successors = get_successors(previous, grid, city)
for s in successors: for s in successors:
already_visited = False already_visited = False
for v in visited: for v in visited:
if v.position == s.state.position and v.orientation == s.state.orientation: if v.position[0] == s.state.position[0] and v.position[1] == s.state.position[1] and s.state.orientation == v.orientation:
already_visited = True already_visited = True
break break
if already_visited: if already_visited:
continue continue
if is_state_valid(s.state, grid): if is_state_valid(s.state, grid):
new_list = current.succ_list.copy() new_list = currently_checked.copy()
new_list.append(s) new_list.append(s)
queue.put(SuccessorList(new_list)) q.put(new_list)
return [] return []
def extract_actions(successors: SuccessorList) -> list[AgentActionType]: # wyodrębnienie akcji z listy sukcesorów, z pominięciem uknown
def extract_actions(successors: list[Succ]) -> list[AgentActionType]:
output: list[AgentActionType] = [] output: list[AgentActionType] = []
for s in successors.succ_list: for s in successors:
if s.action != AgentActionType.UNKNOWN: if s.action != AgentActionType.UNKNOWN:
output.append(s.action) output.append(s.action)
return output return output
def succ(state: AgentState) -> list[Succ]:
def get_successors(succ: Successor, grid: Dict[Tuple[int, int], GridCellType], city: City) -> List[Successor]: result: list[Succ] = []
result: List[Successor] = [] # generuje następników dla danego stanu, result.append(Succ(AgentState(state.position, turn_left_orientation(state.orientation)), AgentActionType.TURN_LEFT))
result.append(Succ(AgentState(state.position, turn_right_orientation(state.orientation)), AgentActionType.TURN_RIGHT))
turn_left_cost = 1 + succ.cost state_succ = move_forward_succ(state)
turn_left_state = AgentState(succ.state.position, turn_left_orientation(succ.state.orientation)) if state_succ != None:
turn_left_heuristics = _heuristics(succ.state.position, city) result.append(move_forward_succ(state))
result.append(
Successor(turn_left_state, AgentActionType.TURN_LEFT, turn_left_cost, turn_left_cost + turn_left_heuristics))
turn_right_cost = 1 + succ.cost
turn_right_state = AgentState(succ.state.position, turn_right_orientation(succ.state.orientation))
turn_right_heuristics = _heuristics(succ.state.position, city)
result.append(
Successor(turn_right_state, AgentActionType.TURN_RIGHT, turn_right_cost,
turn_right_cost + turn_right_heuristics))
state_succ = move_forward_succ(succ, city, grid)
if state_succ is not None:
result.append(state_succ)
return result return result
def move_forward_succ(state: AgentState) -> Succ:
def move_forward_succ(succ: Successor, city: City, grid: Dict[Tuple[int, int], GridCellType]) -> Successor: position = get_next_cell(state)
position = get_next_cell(succ.state) if position == None:
if position is None:
return None return None
return Succ(AgentState(position, state.orientation), AgentActionType.MOVE_FORWARD)
cost = get_cost_for_action(AgentActionType.MOVE_FORWARD, grid[position]) + succ.cost
predicted_cost = cost + _heuristics(position, city)
new_state = AgentState(position, succ.state.orientation)
return Successor(new_state, AgentActionType.MOVE_FORWARD, cost, predicted_cost)
def get_next_cell(state: AgentState) -> Tuple[int, int]: def get_next_cell(state: AgentState) -> Tuple[int, int]:
x, y = state.position if state.orientation == AgentOrientation.UP:
orientation = state.orientation if state.position[1] - 1 < 1:
if orientation == AgentOrientation.UP:
if y - 1 < 1:
return None return None
return x, y - 1 return (state.position[0], state.position[1] - 1)
elif orientation == AgentOrientation.DOWN: if state.orientation == AgentOrientation.DOWN:
if y + 1 > 27: if state.position[1] + 1 > 27:
return None return None
return x, y + 1 return (state.position[0], state.position[1] + 1)
elif orientation == AgentOrientation.LEFT: if state.orientation == AgentOrientation.LEFT:
if x - 1 < 1: if state.position[0] - 1 < 1:
return None return None
return x - 1, y return (state.position[0] - 1, state.position[1])
elif x + 1 > 27: if state.position[0] + 1 > 27:
return None return None
else: return (state.position[0] + 1, state.position[1])
return x + 1, y
def is_state_success(state: AgentState, grid: Dict[Tuple[int, int], GridCellType]) -> bool: def is_state_success(state: AgentState, grid: Dict[Tuple[int, int], GridCellType]) -> bool:
next_cell = get_next_cell(state) next_cell = get_next_cell(state)
try: try:
return grid[next_cell] == GridCellType.GARBAGE_CAN # agent dotarł do śmietnika return grid[next_cell] == GridCellType.GARBAGE_CAN
except KeyError: except:
return False return False
def get_cost_for_action(action: AgentActionType, cell_type: GridCellType) -> int:
if action in [AgentActionType.TURN_LEFT, AgentActionType.TURN_RIGHT]:
return 1
if cell_type == GridCellType.SPEED_BUMP and action == AgentActionType.MOVE_FORWARD:
return -10000
if action == AgentActionType.MOVE_FORWARD:
return 3
def is_state_valid(state: AgentState, grid: Dict[Tuple[int, int], GridCellType]) -> bool: def is_state_valid(state: AgentState, grid: Dict[Tuple[int, int], GridCellType]) -> bool:
try: try:
return grid[state.position] == GridCellType.STREET_HORIZONTAL or grid[ return grid[state.position] == GridCellType.STREET_HORIZONTAL or grid[state.position] == GridCellType.STREET_VERTICAL
state.position] == GridCellType.STREET_VERTICAL or grid[state.position] == GridCellType.SPEED_BUMP except:
except KeyError:
return False return False
def _heuristics(position: Tuple[int, int], city: City):
min_distance: int = 300
found_nonvisited: bool = False
for can in city.cans:
if can.is_visited:
continue
found_nonvisited = True
distance = 3 * (abs(position[0] - can.position[0]) + abs(position[1] - can.position[1]))
if distance < min_distance:
min_distance = distance
if found_nonvisited:
return min_distance
return -1

32
city.py
View File

@ -1,44 +1,38 @@
from typing import List, Dict, Tuple from typing import List
from garbageCan import GarbageCan from garbageCan import GarbageCan
from speedBump import SpeedBump
from street import Street from street import Street
from gameContext import GameContext from gameContext import GameContext
class Node:
garbageCan: GarbageCan
id: int
def __init__(self, id: int, can: GarbageCan) -> None:
self.id
self.can = can
class City: class City:
cans: List[GarbageCan] nodes: List[GarbageCan]
bumps: List[SpeedBump]
streets: List[Street] streets: List[Street]
cans_dict: Dict[Tuple[int, int], GarbageCan] = {}
def __init__(self) -> None: def __init__(self) -> None:
self.cans = [] self.nodes = []
self.streets = [] self.streets = []
self.bumps = []
def add_can(self, can: GarbageCan) -> None: def add_node(self, node: GarbageCan) -> None:
self.cans.append(can) self.nodes.append(node)
self.cans_dict[can.position] = can
def add_street(self, street: Street) -> None: def add_street(self, street: Street) -> None:
self.streets.append(street) self.streets.append(street)
def add_bump(self, bump: SpeedBump) -> None:
self.streets.append(bump)
def render_city(self, game_context: GameContext) -> None: def render_city(self, game_context: GameContext) -> None:
self._render_streets(game_context) self._render_streets(game_context)
self._render_nodes(game_context) self._render_nodes(game_context)
self._render_bumps(game_context)
def _render_streets(self, game_context: GameContext) -> None: def _render_streets(self, game_context: GameContext) -> None:
for street in self.streets: for street in self.streets:
street.render(game_context) street.render(game_context)
def _render_nodes(self, game_context: GameContext) -> None: def _render_nodes(self, game_context: GameContext) -> None:
for node in self.cans: for node in self.nodes:
node.render(game_context) node.render(game_context)
def _render_bumps(self, game_context: GameContext) -> None:
for bump in self.bumps:
bump.render(game_context)

View File

@ -16,8 +16,6 @@ class GameContext:
dust_car = None dust_car = None
landfill = None landfill = None
def __init__(self) -> None: def __init__(self) -> None:
self._init_grid() self._init_grid()

View File

@ -1,41 +1,21 @@
from enum import Enum from enum import Enum
class GarbageType (Enum):
class GarbageType(Enum):
PAPER = 0, PAPER = 0,
PLASTIC_AND_METAL = 1 PLASTIC_AND_METAL = 1
GLASS = 3 GLASS = 3
BIO = 4 BIO = 4
MIXED = 5 MIXED = 5
class Garbage: class Garbage:
img: str img: str
shape: str
flexibility: str
does_smell: str
weight: str
size: str
color: str
softness: str
does_din: str
def __init__(self, img: str, shape: str, flexibility: str, does_smell: str, weight: str, size: str, color: str, softness: str, does_din: str) -> None: def __init__(self, img: str) -> None:
self.img = img self.img = img
self.shape = shape
self.flexibility = flexibility
self.does_smell = does_smell
self.weight = weight
self.size = size
self.color = color
self.softness = softness
self.does_din = does_din
class RecognizedGarbage (Garbage):
class RecognizedGarbage:
garbage_type: GarbageType garbage_type: GarbageType
src: Garbage
def __init__(self, src: Garbage, garbage_type: GarbageType) -> None: def __init__(self, src: Garbage, garbage_type: GarbageType) -> None:
super().__init__(src.img)
self.garbage_type = garbage_type self.garbage_type = garbage_type
self.src = src

View File

@ -3,16 +3,13 @@ from typing import List, Tuple
from gameContext import GameContext from gameContext import GameContext
from gridCellType import GridCellType from gridCellType import GridCellType
class GarbageCan: class GarbageCan:
position: Tuple[int, int] position: Tuple[int, int]
garbage: List[Garbage] garbage: List[Garbage]
is_visited: bool
def __init__(self, position: Tuple[int, int]) -> None: def __init__(self, position: Tuple[int, int]) -> None:
self.position = position self.position = position
self.garbage = [] self.garbage = []
self.is_visited = False
def add_garbage(self, garbage: Garbage) -> None: def add_garbage(self, garbage: Garbage) -> None:
self.garbage.append(garbage) self.garbage.append(garbage)
@ -20,7 +17,6 @@ class GarbageCan:
def remove_garbage(self, garbage: Garbage) -> None: def remove_garbage(self, garbage: Garbage) -> None:
self.garbage.remove(garbage) self.garbage.remove(garbage)
def render(self, game_context: GameContext) -> None: def render(self, game_context: GameContext) -> None:
game_context.render_in_cell(self.position, "imgs/container.png") game_context.render_in_cell(self.position, "imgs/container.png")
game_context.grid[self.position] = GridCellType.GARBAGE_CAN game_context.grid[self.position] = GridCellType.GARBAGE_CAN

View File

@ -1,6 +1,6 @@
from typing import List, Tuple from typing import List, Tuple
from agentOrientation import AgentOrientation from agentOrientation import AgentOrientation
from garbage import GarbageType, RecognizedGarbage from garbage import RecognizedGarbage
from gameContext import GameContext from gameContext import GameContext
class GarbageTruck: class GarbageTruck:
@ -22,19 +22,19 @@ class GarbageTruck:
def sort_garbage(self, RecognizedGarbage) -> None: def sort_garbage(self, RecognizedGarbage) -> None:
if RecognizedGarbage.garbage_type == GarbageType.PAPER: if RecognizedGarbage.garbage_type == 0:
self.paper.append(RecognizedGarbage) self.paper.append(RecognizedGarbage)
elif RecognizedGarbage.garbage_type == GarbageType.PLASTIC_AND_METAL: elif RecognizedGarbage.garbage_type == 1:
self.plastic_and_metal.append(RecognizedGarbage) self.plastic_and_metal.append(RecognizedGarbage)
elif RecognizedGarbage.garbage_type == GarbageType.GLASS: elif RecognizedGarbage.garbage_type == 3:
self.glass.append(RecognizedGarbage) self.glass.append(RecognizedGarbage)
elif RecognizedGarbage.garbage_type == GarbageType.BIO: elif RecognizedGarbage.garbage_type == 4:
self.bio.append(RecognizedGarbage) self.bio.append(RecognizedGarbage)
elif RecognizedGarbage.garbage_type == GarbageType.MIXED: elif RecognizedGarbage.garbage_type == 5:
self.mixed.append(RecognizedGarbage) self.mixed.append(RecognizedGarbage)
def render(self, game_context: GameContext) -> None: def render(self, game_context: GameContext) -> None:

View File

@ -7,5 +7,3 @@ class GridCellType(Enum):
GARBAGE_CAN = 3 GARBAGE_CAN = 3
VISITED_GARBAGE_CAN = 4 VISITED_GARBAGE_CAN = 4
LANDFILL = 5 LANDFILL = 5
SPEED_BUMP = 6
UNKNOWN = None

Binary file not shown.

Before

Width:  |  Height:  |  Size: 293 B

View File

@ -1,95 +0,0 @@
import os
from trainingData import TrainingData
from sklearn import tree
import joblib
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
import numpy as np
def _read_training_data() -> TrainingData:
attributes = []
classes = []
location = os.path.realpath(os.path.join(os.getcwd(), os.path.dirname(__file__)))
file = open(os.path.join(location, 'training_data.csv'))
lines = file.readlines()[1:]
file.close()
for line in lines:
actual_row = line.replace('\n', '')
values = actual_row.split(',')
line_attributes = values[:-1]
line_class = values[-1]
attributes.append(line_attributes)
classes.append(line_class.strip())
return TrainingData(attributes, classes)
def _attributes_to_floats(attributes: list[str]) -> list[float]:
output: list[float] = []
if attributes[0] == 'Longitiudonal':
output.append(0)
elif attributes[0] == 'Round':
output.append(1)
elif attributes[0] == 'Flat':
output.append(2)
elif attributes[0] == 'Irregular':
output.append(3)
if attributes[1] == 'Low':
output.append(0)
elif attributes[1] == 'Medium':
output.append(1)
elif attributes[1] == 'High':
output.append(2)
if attributes[2] == "Yes":
output.append(0)
else:
output.append(1)
if attributes[3] == 'Low':
output.append(0)
elif attributes[3] == 'Medium':
output.append(1)
elif attributes[3] == 'High':
output.append(2)
if attributes[4] == 'Low':
output.append(0)
elif attributes[4] == 'Medium':
output.append(1)
elif attributes[4] == 'High':
output.append(2)
if attributes[5] == 'Transparent':
output.append(0)
elif attributes[5] == 'Light':
output.append(1)
elif attributes[5] == 'Dark':
output.append(2)
elif attributes[5] == "Colorful":
output.append(3)
if attributes[6] == 'Low':
output.append(0)
elif attributes[6] == 'Medium':
output.append(1)
elif attributes[6] == 'High':
output.append(2)
if attributes[7] == "Yes":
output.append(0)
else:
output.append(1)
return output
trainning_data = _read_training_data()
X = trainning_data.attributes
Y = trainning_data.classes
model = tree.DecisionTreeClassifier()
encoded = [_attributes_to_floats(x) for x in X]
dtc = model.fit(encoded, Y)
joblib.dump(model, 'model.pkl')

View File

@ -1,29 +0,0 @@
Shape,Flexibility,DoesSmell,Weight,Size,Color,Softness,DoesDin
Irregular,High,No,High,Medium,Dark,Low,Yes
Longitiudonal,Low,No,Low,Low,Light,Medium,Yes
Longitiudonal,Medium,No,Medium,Low,Dark,High,No
Longitiudonal,Low,No,Medium,Low,Dark,High,Yes
Round,Low,Yes,High,High,Transparent,High,Yes
Irregular,Medium,Yes,High,Low,Transparent,Medium,No
Longitiudonal,Medium,Yes,Low,High,Colorful,Medium,Yes
Longitiudonal,Low,No,Low,Medium,Dark,Medium,Yes
Flat,Medium,Yes,High,Low,Transparent,Low,Yes
Irregular,Medium,Yes,High,Medium,Dark,Low,No
Longitiudonal,High,No,Low,High,Colorful,Low,Yes
Round,Medium,No,Medium,Medium,Dark,Low,No
Longitiudonal,Medium,No,Medium,Medium,Transparent,High,No
Flat,Medium,Yes,Low,Low,Light,Medium,No
Flat,Medium,Yes,Medium,High,Light,Medium,No
Flat,Low,No,High,Low,Dark,High,No
Longitiudonal,Medium,Yes,High,High,Dark,Low,Yes
Flat,Low,Yes,Low,Low,Transparent,Low,No
Flat,Low,No,Medium,Low,Colorful,Low,No
Longitiudonal,Low,Yes,High,Medium,Transparent,Low,No
Longitiudonal,Low,No,Medium,High,Dark,Low,Yes
Irregular,Medium,No,Medium,Medium,Light,Low,Yes
Longitiudonal,High,No,High,High,Colorful,Low,No
Flat,Low,No,Low,Low,Dark,High,No
Flat,Low,Yes,Low,High,Dark,Low,Yes
Irregular,Medium,Yes,High,High,Dark,Low,No
Flat,High,No,High,Low,Dark,Medium,Yes
Longitiudonal,High,Yes,Low,Medium,Colorful,Low,Yes
1 Shape Flexibility DoesSmell Weight Size Color Softness DoesDin
2 Irregular High No High Medium Dark Low Yes
3 Longitiudonal Low No Low Low Light Medium Yes
4 Longitiudonal Medium No Medium Low Dark High No
5 Longitiudonal Low No Medium Low Dark High Yes
6 Round Low Yes High High Transparent High Yes
7 Irregular Medium Yes High Low Transparent Medium No
8 Longitiudonal Medium Yes Low High Colorful Medium Yes
9 Longitiudonal Low No Low Medium Dark Medium Yes
10 Flat Medium Yes High Low Transparent Low Yes
11 Irregular Medium Yes High Medium Dark Low No
12 Longitiudonal High No Low High Colorful Low Yes
13 Round Medium No Medium Medium Dark Low No
14 Longitiudonal Medium No Medium Medium Transparent High No
15 Flat Medium Yes Low Low Light Medium No
16 Flat Medium Yes Medium High Light Medium No
17 Flat Low No High Low Dark High No
18 Longitiudonal Medium Yes High High Dark Low Yes
19 Flat Low Yes Low Low Transparent Low No
20 Flat Low No Medium Low Colorful Low No
21 Longitiudonal Low Yes High Medium Transparent Low No
22 Longitiudonal Low No Medium High Dark Low Yes
23 Irregular Medium No Medium Medium Light Low Yes
24 Longitiudonal High No High High Colorful Low No
25 Flat Low No Low Low Dark High No
26 Flat Low Yes Low High Dark Low Yes
27 Irregular Medium Yes High High Dark Low No
28 Flat High No High Low Dark Medium Yes
29 Longitiudonal High Yes Low Medium Colorful Low Yes

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 KiB

Some files were not shown because too many files have changed in this diff Show More