From 4a2729af8afbd9807c7c6ef630959a01729c662a Mon Sep 17 00:00:00 2001 From: 21varun12 <21varun12@gmail.com> Date: Thu, 26 Aug 2021 18:28:14 +0800 Subject: [PATCH 01/40] Add Greet --- src/main/java/Duke.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 5d313334c..6b0b55120 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -5,6 +5,11 @@ public static void main(String[] args) { + "| | | | | | | |/ / _ \\\n" + "| |_| | |_| | < __/\n" + "|____/ \\__,_|_|\\_\\___|\n"; + System.out.println("Hello from\n" + logo); + + System.out.println("Hello! I'm Duke"); + System.out.println("What can I do for you?\n"); + System.out.println("Bye. Hope to see you again soon!\n"); } } From b1017c97290079fd657e75556894c84e33ef9641 Mon Sep 17 00:00:00 2001 From: 21varun12 <21varun12@gmail.com> Date: Thu, 26 Aug 2021 23:26:01 +0800 Subject: [PATCH 02/40] Add Echo --- src/main/java/Duke.java | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 6b0b55120..4159c5b94 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -1,15 +1,17 @@ +import java.util.Scanner; + public class Duke { public static void main(String[] args) { - String logo = " ____ _ \n" - + "| _ \\ _ _| | _____ \n" - + "| | | | | | | |/ / _ \\\n" - + "| |_| | |_| | < __/\n" - + "|____/ \\__,_|_|\\_\\___|\n"; + System.out.println("Hello! I'm Duke"); + System.out.println("What can I do for you?"); - System.out.println("Hello from\n" + logo); + Scanner input = new Scanner(System.in); + String command; + do { + command = input.nextLine(); + System.out.println(command); + } while (!command.equalsIgnoreCase("Bye")); - System.out.println("Hello! I'm Duke"); - System.out.println("What can I do for you?\n"); - System.out.println("Bye. Hope to see you again soon!\n"); + System.out.println("Bye. Hope to see you again soon!"); } } From b8e223e428c878b4c14534a44875b8d56e6391c7 Mon Sep 17 00:00:00 2001 From: 21varun12 <21varun12@gmail.com> Date: Thu, 26 Aug 2021 23:56:44 +0800 Subject: [PATCH 03/40] Add add, list --- src/main/java/Duke.java | 11 ++++++++++- src/main/java/TaskManager.java | 19 +++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 src/main/java/TaskManager.java diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 4159c5b94..88d6805b3 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -7,9 +7,18 @@ public static void main(String[] args) { Scanner input = new Scanner(System.in); String command; + TaskManager taskManager; do { command = input.nextLine(); - System.out.println(command); + if (command.equals("list")) { + TaskManager.list(); + } + else if (command.equals("bye")) { + break; + } + else { + TaskManager.add(command); + } } while (!command.equalsIgnoreCase("Bye")); System.out.println("Bye. Hope to see you again soon!"); diff --git a/src/main/java/TaskManager.java b/src/main/java/TaskManager.java new file mode 100644 index 000000000..3c0bc17d1 --- /dev/null +++ b/src/main/java/TaskManager.java @@ -0,0 +1,19 @@ +public class TaskManager { + private static int noTasks = 0; + private static int maxTasks = 100; + private static String[] tasks = new String[maxTasks]; + + static void add(String task) { + if (noTasks < maxTasks) { + tasks[noTasks] = task; + noTasks++; + System.out.printf("added: %s\n", task); + } + } + + static void list() { + for (int i = 0; i < noTasks; i++) { + System.out.printf("%d. %s\n",i+1, tasks[i]); + } + } +} From 3d062354a8f77dc97cd79d8384f6b9a883948ef5 Mon Sep 17 00:00:00 2001 From: 21varun12 <21varun12@gmail.com> Date: Fri, 27 Aug 2021 01:01:16 +0800 Subject: [PATCH 04/40] Add mark as done --- src/main/java/Duke.java | 19 +++++++++++-------- src/main/java/Task.java | 21 +++++++++++++++++++++ src/main/java/TaskManager.java | 32 ++++++++++++++++++++++---------- 3 files changed, 54 insertions(+), 18 deletions(-) create mode 100644 src/main/java/Task.java diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 88d6805b3..7c5197e98 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -7,19 +7,22 @@ public static void main(String[] args) { Scanner input = new Scanner(System.in); String command; - TaskManager taskManager; - do { + + while (true) { command = input.nextLine(); - if (command.equals("list")) { - TaskManager.list(); - } - else if (command.equals("bye")) { + if (command.equals("bye")) { break; } - else { + else if (command.equals("list")) { + TaskManager.list(); + } else if (command.startsWith("done")) { + int taskNo = Integer.parseInt(command.split(" ")[1]); + TaskManager.mark(taskNo - 1); + } + else { TaskManager.add(command); } - } while (!command.equalsIgnoreCase("Bye")); + } System.out.println("Bye. Hope to see you again soon!"); } diff --git a/src/main/java/Task.java b/src/main/java/Task.java new file mode 100644 index 000000000..26e9c49a5 --- /dev/null +++ b/src/main/java/Task.java @@ -0,0 +1,21 @@ +public class Task { + final private String name; + private Boolean status; + + public Task(String name) { + this.name = name; + this.status = false; + } + + public String getName() { + return name; + } + + public void markDone() { + status = true; + } + + public Boolean isDone() { + return status; + } +} diff --git a/src/main/java/TaskManager.java b/src/main/java/TaskManager.java index 3c0bc17d1..49665a452 100644 --- a/src/main/java/TaskManager.java +++ b/src/main/java/TaskManager.java @@ -1,19 +1,31 @@ public class TaskManager { - private static int noTasks = 0; - private static int maxTasks = 100; - private static String[] tasks = new String[maxTasks]; + private static int taskNo = 0; + final private static int maxTasks = 100; + final static Task[] tasks = new Task[maxTasks]; - static void add(String task) { - if (noTasks < maxTasks) { - tasks[noTasks] = task; - noTasks++; - System.out.printf("added: %s\n", task); + static void add(String taskName) { + if (taskNo < maxTasks) { + tasks[taskNo] = new Task(taskName); + taskNo++; + + System.out.printf("added: %s\n", taskName); } } static void list() { - for (int i = 0; i < noTasks; i++) { - System.out.printf("%d. %s\n",i+1, tasks[i]); + for (int i = 0; i < taskNo; ++i) { + Task task = tasks[i]; + Character check = task.isDone() ? 'X' : ' '; + + System.out.printf("%d. [%c] %s\n", i + 1, check, task.getName()); } } + + static void mark(int taskNo) { + Task task = tasks[taskNo]; + task.markDone(); + + System.out.println("Nice! I've marked this task as done:"); + System.out.printf(" [X] %s\n", task.getName()); + } } From 012b539fd1238f36b6cf75bfece0b4f5c7af31cf Mon Sep 17 00:00:00 2001 From: 21varun12 <21varun12@gmail.com> Date: Fri, 27 Aug 2021 01:16:21 +0800 Subject: [PATCH 05/40] Comply with coding standard --- src/main/java/Task.java | 12 ++++++------ src/main/java/TaskManager.java | 3 +-- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/src/main/java/Task.java b/src/main/java/Task.java index 26e9c49a5..0e95c4947 100644 --- a/src/main/java/Task.java +++ b/src/main/java/Task.java @@ -1,21 +1,21 @@ public class Task { final private String name; - private Boolean status; + private Boolean isDone; public Task(String name) { this.name = name; - this.status = false; + this.isDone = false; } public String getName() { return name; } - public void markDone() { - status = true; + public String getStatusIcon() { + return (isDone ? "X" : " "); } - public Boolean isDone() { - return status; + public void markDone() { + isDone = true; } } diff --git a/src/main/java/TaskManager.java b/src/main/java/TaskManager.java index 49665a452..ec6b17d46 100644 --- a/src/main/java/TaskManager.java +++ b/src/main/java/TaskManager.java @@ -15,9 +15,8 @@ static void add(String taskName) { static void list() { for (int i = 0; i < taskNo; ++i) { Task task = tasks[i]; - Character check = task.isDone() ? 'X' : ' '; - System.out.printf("%d. [%c] %s\n", i + 1, check, task.getName()); + System.out.printf("%d. [%s] %s\n", i + 1, task.getStatusIcon(), task.getName()); } } From e4341c7ac4be567e87ccce116cd0c38f0605507f Mon Sep 17 00:00:00 2001 From: 21varun12 <21varun12@gmail.com> Date: Thu, 2 Sep 2021 22:12:56 +0800 Subject: [PATCH 06/40] Add todo --- src/main/java/Todo.java | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 src/main/java/Todo.java diff --git a/src/main/java/Todo.java b/src/main/java/Todo.java new file mode 100644 index 000000000..05ccba05e --- /dev/null +++ b/src/main/java/Todo.java @@ -0,0 +1,11 @@ +public class Todo extends Task { + private static String symbol = "T"; + + public Todo(String name) { + super(name); + } + + public static String getSymbol() { + return symbol; + } +} From 965a1662b5b2013bc264b131eb93a5508298d1ba Mon Sep 17 00:00:00 2001 From: 21varun12 <21varun12@gmail.com> Date: Thu, 2 Sep 2021 22:35:00 +0800 Subject: [PATCH 07/40] Refactor code --- src/main/java/Task.java | 5 +++++ src/main/java/TaskManager.java | 2 +- src/main/java/Todo.java | 7 ++++--- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/main/java/Task.java b/src/main/java/Task.java index 0e95c4947..f93f1e0ad 100644 --- a/src/main/java/Task.java +++ b/src/main/java/Task.java @@ -18,4 +18,9 @@ public String getStatusIcon() { public void markDone() { isDone = true; } + + @Override + public String toString() { + return "[" + getStatusIcon() + "] " + getName(); + } } diff --git a/src/main/java/TaskManager.java b/src/main/java/TaskManager.java index ec6b17d46..695d27876 100644 --- a/src/main/java/TaskManager.java +++ b/src/main/java/TaskManager.java @@ -16,7 +16,7 @@ static void list() { for (int i = 0; i < taskNo; ++i) { Task task = tasks[i]; - System.out.printf("%d. [%s] %s\n", i + 1, task.getStatusIcon(), task.getName()); + System.out.printf("%d. %s\n", i + 1, task); } } diff --git a/src/main/java/Todo.java b/src/main/java/Todo.java index 05ccba05e..c48b806cf 100644 --- a/src/main/java/Todo.java +++ b/src/main/java/Todo.java @@ -1,11 +1,12 @@ public class Todo extends Task { - private static String symbol = "T"; + private static String SYMBOL = "T"; public Todo(String name) { super(name); } - public static String getSymbol() { - return symbol; + @Override + public String toString() { + return "[" + SYMBOL + "]" + super.toString(); } } From b1c24369f0e31cfb9095d419b3cc0c7a3b38944f Mon Sep 17 00:00:00 2001 From: 21varun12 <21varun12@gmail.com> Date: Thu, 2 Sep 2021 22:37:51 +0800 Subject: [PATCH 08/40] Add deadline --- src/main/java/Deadline.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 src/main/java/Deadline.java diff --git a/src/main/java/Deadline.java b/src/main/java/Deadline.java new file mode 100644 index 000000000..4aa2a4480 --- /dev/null +++ b/src/main/java/Deadline.java @@ -0,0 +1,14 @@ +public class Deadline extends Task{ + private static String SYMBOL = "D"; + private String dueDate; + + public Deadline(String name, String dueDate) { + super(name); + this.dueDate = dueDate; + } + + @Override + public String toString() { + return "[" + SYMBOL + "]" + super.toString() + " (by:" + dueDate + ")"; + } +} From 82d95e3de64c3ee8848e095e4eb766f4a7870456 Mon Sep 17 00:00:00 2001 From: 21varun12 <21varun12@gmail.com> Date: Thu, 2 Sep 2021 22:42:08 +0800 Subject: [PATCH 09/40] Add event --- src/main/java/Event.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 src/main/java/Event.java diff --git a/src/main/java/Event.java b/src/main/java/Event.java new file mode 100644 index 000000000..f798169e1 --- /dev/null +++ b/src/main/java/Event.java @@ -0,0 +1,14 @@ +public class Event extends Task{ + private static String SYMBOL = "E"; + private String timeslot; + + public Event(String name, String timeslot) { + super(name); + this.timeslot = timeslot; + } + + @Override + public String toString() { + return "[" + SYMBOL + "]" + super.toString() + " (at:" + timeslot + ")"; + } +} From afaf67b397d64429b946687ba016d8e45e1b42f7 Mon Sep 17 00:00:00 2001 From: 21varun12 <21varun12@gmail.com> Date: Thu, 2 Sep 2021 23:09:48 +0800 Subject: [PATCH 10/40] Update TaskManager Add support for tracking todos, deadlines and events --- src/main/java/Deadline.java | 2 +- src/main/java/Duke.java | 16 ++++++++++++-- src/main/java/Event.java | 2 +- src/main/java/Task.java | 2 +- src/main/java/TaskManager.java | 39 +++++++++++++++++++++++++++++++++- 5 files changed, 55 insertions(+), 6 deletions(-) diff --git a/src/main/java/Deadline.java b/src/main/java/Deadline.java index 4aa2a4480..797c4aa3d 100644 --- a/src/main/java/Deadline.java +++ b/src/main/java/Deadline.java @@ -9,6 +9,6 @@ public Deadline(String name, String dueDate) { @Override public String toString() { - return "[" + SYMBOL + "]" + super.toString() + " (by:" + dueDate + ")"; + return "[" + SYMBOL + "]" + super.toString() + " (by: " + dueDate + ")"; } } diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 7c5197e98..a889bc37e 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -12,12 +12,24 @@ public static void main(String[] args) { command = input.nextLine(); if (command.equals("bye")) { break; - } - else if (command.equals("list")) { + } else if (command.equals("list")) { TaskManager.list(); } else if (command.startsWith("done")) { int taskNo = Integer.parseInt(command.split(" ")[1]); TaskManager.mark(taskNo - 1); + } else if (command.startsWith("todo")) { + String todo = command.replaceFirst("todo ", ""); + TaskManager.todo(todo); + } else if (command.startsWith("deadline")) { + String [] parsedInput = command.replaceFirst("deadline ", "").split("/by "); + String deadlineName = parsedInput[0]; + String dueDate = parsedInput[1]; + TaskManager.deadline(deadlineName, dueDate); + } else if (command.startsWith("event")) { + String [] parsedInput = command.replaceFirst("event ", "").split("/at "); + String eventName = parsedInput[0]; + String timeslot = parsedInput[1]; + TaskManager.event(eventName, timeslot); } else { TaskManager.add(command); diff --git a/src/main/java/Event.java b/src/main/java/Event.java index f798169e1..0614e2be6 100644 --- a/src/main/java/Event.java +++ b/src/main/java/Event.java @@ -9,6 +9,6 @@ public Event(String name, String timeslot) { @Override public String toString() { - return "[" + SYMBOL + "]" + super.toString() + " (at:" + timeslot + ")"; + return "[" + SYMBOL + "]" + super.toString() + " (at: " + timeslot + ")"; } } diff --git a/src/main/java/Task.java b/src/main/java/Task.java index f93f1e0ad..5d3354f3c 100644 --- a/src/main/java/Task.java +++ b/src/main/java/Task.java @@ -21,6 +21,6 @@ public void markDone() { @Override public String toString() { - return "[" + getStatusIcon() + "] " + getName(); + return "[" + getStatusIcon() + "]" + getName(); } } diff --git a/src/main/java/TaskManager.java b/src/main/java/TaskManager.java index 695d27876..0a9624a63 100644 --- a/src/main/java/TaskManager.java +++ b/src/main/java/TaskManager.java @@ -13,6 +13,7 @@ static void add(String taskName) { } static void list() { + System.out.println("Here are the tasks in your list:"); for (int i = 0; i < taskNo; ++i) { Task task = tasks[i]; @@ -25,6 +26,42 @@ static void mark(int taskNo) { task.markDone(); System.out.println("Nice! I've marked this task as done:"); - System.out.printf(" [X] %s\n", task.getName()); + System.out.printf(" %s\n", task); + } + + static void todo(String todoName) { + if (taskNo < maxTasks) { + Todo todo = new Todo(todoName); + tasks[taskNo] = todo; + taskNo++; + + System.out.print("Got it. I've added this task:\n"); + System.out.printf(" %s\n", todo); + System.out.printf("Now you have %d tasks in the list.\n", taskNo); + } + } + + static void deadline(String deadlineName, String dueDate) { + if (taskNo < maxTasks) { + Deadline deadline = new Deadline(deadlineName, dueDate); + tasks[taskNo] = deadline; + taskNo++; + + System.out.print("Got it. I've added this task:\n"); + System.out.printf(" %s\n", deadline); + System.out.printf("Now you have %d tasks in the list.\n", taskNo); + } + } + + static void event(String eventName, String timeslot) { + if (taskNo < maxTasks) { + Event event = new Event(eventName, timeslot); + tasks[taskNo] = event; + taskNo++; + + System.out.print("Got it. I've added this task:\n"); + System.out.printf(" %s\n", event); + System.out.printf("Now you have %d tasks in the list.\n", taskNo); + } } } From f0e08de91b407cf0c41f9055e8eaca2e9004e0ae Mon Sep 17 00:00:00 2001 From: 21varun12 <21varun12@gmail.com> Date: Thu, 2 Sep 2021 23:58:38 +0800 Subject: [PATCH 11/40] Refactor code --- src/main/java/Duke.java | 71 +++++++++++++++++++++------------- src/main/java/Task.java | 4 +- src/main/java/TaskManager.java | 66 +++++++++++-------------------- 3 files changed, 69 insertions(+), 72 deletions(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index a889bc37e..83ff84c84 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -1,41 +1,58 @@ import java.util.Scanner; public class Duke { - public static void main(String[] args) { - System.out.println("Hello! I'm Duke"); - System.out.println("What can I do for you?"); + public static String EXIT_CMD = "bye"; + public static String LIST_CMD = "list"; + public static String DONE_CMD = "done"; + public static String TODO_CMD = "todo"; + public static String DEADLINE_CMD = "deadline"; + public static String EVENT_CMD = "event"; + public static void main(String[] args) { + greetUserOnStart(); Scanner input = new Scanner(System.in); - String command; while (true) { - command = input.nextLine(); - if (command.equals("bye")) { + String command = input.nextLine(); + + // parse and handle commands + if (command.equals(EXIT_CMD)) { break; - } else if (command.equals("list")) { - TaskManager.list(); - } else if (command.startsWith("done")) { - int taskNo = Integer.parseInt(command.split(" ")[1]); - TaskManager.mark(taskNo - 1); - } else if (command.startsWith("todo")) { - String todo = command.replaceFirst("todo ", ""); - TaskManager.todo(todo); - } else if (command.startsWith("deadline")) { - String [] parsedInput = command.replaceFirst("deadline ", "").split("/by "); - String deadlineName = parsedInput[0]; - String dueDate = parsedInput[1]; - TaskManager.deadline(deadlineName, dueDate); - } else if (command.startsWith("event")) { - String [] parsedInput = command.replaceFirst("event ", "").split("/at "); - String eventName = parsedInput[0]; - String timeslot = parsedInput[1]; - TaskManager.event(eventName, timeslot); - } - else { - TaskManager.add(command); + } else if (command.equals(LIST_CMD)) { + TaskManager.listTasks(); + } else if (command.startsWith(DONE_CMD)) { + String parsedInput = command.split(" ")[1]; + int taskNo = Integer.parseInt(parsedInput); + TaskManager.markTaskNoAsDone(taskNo - 1); + } else if (command.startsWith(TODO_CMD)) { + String parsedInput = command.replaceFirst(TODO_CMD, ""); + String todo = parsedInput.strip(); + TaskManager.addTodo(todo); + } else if (command.startsWith(DEADLINE_CMD)) { + String [] parsedInput = command.replaceFirst(DEADLINE_CMD, "").split("/by "); + String deadlineTitle = parsedInput[0].strip(); + String deadlineDue = parsedInput[1].strip(); + TaskManager.addDeadline(deadlineTitle, deadlineDue); + } else if (command.startsWith(EVENT_CMD)) { + String [] parsedInput = command.replaceFirst(EVENT_CMD, "").split("/at "); + String eventTitle = parsedInput[0].strip(); + String eventTime = parsedInput[1].strip(); + TaskManager.addEvent(eventTitle, eventTime); + } else { + // handle invalid command + System.out.println("Invalid command! Please enter a valid command"); } } + greetUserOnEnd(); + } + + public static void greetUserOnStart() { + System.out.println("Hello! I'm Duke"); + System.out.println("What can I do for you?"); + } + + public static void greetUserOnEnd() { System.out.println("Bye. Hope to see you again soon!"); } } diff --git a/src/main/java/Task.java b/src/main/java/Task.java index 5d3354f3c..d6eca51ee 100644 --- a/src/main/java/Task.java +++ b/src/main/java/Task.java @@ -15,12 +15,12 @@ public String getStatusIcon() { return (isDone ? "X" : " "); } - public void markDone() { + public void markAsDone() { isDone = true; } @Override public String toString() { - return "[" + getStatusIcon() + "]" + getName(); + return "[" + getStatusIcon() + "] " + getName(); } } diff --git a/src/main/java/TaskManager.java b/src/main/java/TaskManager.java index 0a9624a63..f88f8488a 100644 --- a/src/main/java/TaskManager.java +++ b/src/main/java/TaskManager.java @@ -3,65 +3,45 @@ public class TaskManager { final private static int maxTasks = 100; final static Task[] tasks = new Task[maxTasks]; - static void add(String taskName) { + static void addTask(Task task) { if (taskNo < maxTasks) { - tasks[taskNo] = new Task(taskName); + tasks[taskNo] = task; taskNo++; - System.out.printf("added: %s\n", taskName); + System.out.print("Got it. I've added this task:\n"); + System.out.printf(" %s\n", task); + System.out.printf("Now you have %d tasks in the list.\n", taskNo); } } - static void list() { + static void addTodo(String todoName) { + Todo todo = new Todo(todoName); + addTask(todo); + } + + static void addDeadline(String deadlineName, String deadlineDue) { + Deadline deadline = new Deadline(deadlineName, deadlineDue); + addTask(deadline); + } + + static void addEvent(String eventName, String eventTime) { + Event event = new Event(eventName, eventTime); + addTask(event); + } + + static void listTasks() { System.out.println("Here are the tasks in your list:"); for (int i = 0; i < taskNo; ++i) { Task task = tasks[i]; - System.out.printf("%d. %s\n", i + 1, task); } } - static void mark(int taskNo) { + static void markTaskNoAsDone(int taskNo) { Task task = tasks[taskNo]; - task.markDone(); + task.markAsDone(); System.out.println("Nice! I've marked this task as done:"); System.out.printf(" %s\n", task); } - - static void todo(String todoName) { - if (taskNo < maxTasks) { - Todo todo = new Todo(todoName); - tasks[taskNo] = todo; - taskNo++; - - System.out.print("Got it. I've added this task:\n"); - System.out.printf(" %s\n", todo); - System.out.printf("Now you have %d tasks in the list.\n", taskNo); - } - } - - static void deadline(String deadlineName, String dueDate) { - if (taskNo < maxTasks) { - Deadline deadline = new Deadline(deadlineName, dueDate); - tasks[taskNo] = deadline; - taskNo++; - - System.out.print("Got it. I've added this task:\n"); - System.out.printf(" %s\n", deadline); - System.out.printf("Now you have %d tasks in the list.\n", taskNo); - } - } - - static void event(String eventName, String timeslot) { - if (taskNo < maxTasks) { - Event event = new Event(eventName, timeslot); - tasks[taskNo] = event; - taskNo++; - - System.out.print("Got it. I've added this task:\n"); - System.out.printf(" %s\n", event); - System.out.printf("Now you have %d tasks in the list.\n", taskNo); - } - } } From 152cfe65420b4ccbcb74eb3cfbf19909695563fe Mon Sep 17 00:00:00 2001 From: 21varun12 <21varun12@gmail.com> Date: Thu, 9 Sep 2021 23:38:29 +0800 Subject: [PATCH 12/40] Add exception classes --- src/main/java/AddTaskException.java | 2 ++ src/main/java/DeadlineException.java | 2 ++ src/main/java/DukeException.java | 3 +++ src/main/java/EventException.java | 2 ++ src/main/java/TodoException.java | 2 ++ 5 files changed, 11 insertions(+) create mode 100644 src/main/java/AddTaskException.java create mode 100644 src/main/java/DeadlineException.java create mode 100644 src/main/java/DukeException.java create mode 100644 src/main/java/EventException.java create mode 100644 src/main/java/TodoException.java diff --git a/src/main/java/AddTaskException.java b/src/main/java/AddTaskException.java new file mode 100644 index 000000000..e923fc0de --- /dev/null +++ b/src/main/java/AddTaskException.java @@ -0,0 +1,2 @@ +public class AddTaskException extends DukeException{ +} diff --git a/src/main/java/DeadlineException.java b/src/main/java/DeadlineException.java new file mode 100644 index 000000000..20542735c --- /dev/null +++ b/src/main/java/DeadlineException.java @@ -0,0 +1,2 @@ +public class DeadlineException extends DukeException{ +} diff --git a/src/main/java/DukeException.java b/src/main/java/DukeException.java new file mode 100644 index 000000000..857dadd88 --- /dev/null +++ b/src/main/java/DukeException.java @@ -0,0 +1,3 @@ +public class DukeException extends Exception{ + +} diff --git a/src/main/java/EventException.java b/src/main/java/EventException.java new file mode 100644 index 000000000..c4bb10b35 --- /dev/null +++ b/src/main/java/EventException.java @@ -0,0 +1,2 @@ +public class EventException extends DukeException{ +} diff --git a/src/main/java/TodoException.java b/src/main/java/TodoException.java new file mode 100644 index 000000000..0c224678f --- /dev/null +++ b/src/main/java/TodoException.java @@ -0,0 +1,2 @@ +public class TodoException extends DukeException{ +} From a7b694f38ff039dee8e4a804ed6270edb68cb2b0 Mon Sep 17 00:00:00 2001 From: 21varun12 <21varun12@gmail.com> Date: Thu, 9 Sep 2021 23:54:35 +0800 Subject: [PATCH 13/40] Add exception handling --- src/main/java/Duke.java | 12 ++++++++++-- src/main/java/TaskManager.java | 5 ++++- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 83ff84c84..53f2ce31e 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -27,7 +27,11 @@ public static void main(String[] args) { } else if (command.startsWith(TODO_CMD)) { String parsedInput = command.replaceFirst(TODO_CMD, ""); String todo = parsedInput.strip(); - TaskManager.addTodo(todo); + try { + TaskManager.addTodo(todo); + } catch (TodoException e) { + System.out.println("OOPS!!! The description of a todo cannot be empty."); + } } else if (command.startsWith(DEADLINE_CMD)) { String [] parsedInput = command.replaceFirst(DEADLINE_CMD, "").split("/by "); String deadlineTitle = parsedInput[0].strip(); @@ -40,7 +44,11 @@ public static void main(String[] args) { TaskManager.addEvent(eventTitle, eventTime); } else { // handle invalid command - System.out.println("Invalid command! Please enter a valid command"); + try { + throw new DukeException(); + } catch (DukeException e) { + System.out.println("OOPS!!! I'm sorry, but I don't know what that means :-("); + } } } diff --git a/src/main/java/TaskManager.java b/src/main/java/TaskManager.java index f88f8488a..7f5abf3c9 100644 --- a/src/main/java/TaskManager.java +++ b/src/main/java/TaskManager.java @@ -14,7 +14,10 @@ static void addTask(Task task) { } } - static void addTodo(String todoName) { + static void addTodo(String todoName) throws TodoException { + if (todoName.isEmpty()) { + throw new TodoException(); + } Todo todo = new Todo(todoName); addTask(todo); } From f7d89c2bd688b4028f39ac690ccff05b00d772fd Mon Sep 17 00:00:00 2001 From: flerovious <85042815+flerovious@users.noreply.github.com> Date: Sun, 19 Sep 2021 20:15:39 +0800 Subject: [PATCH 14/40] Refactor commands --- src/main/java/AddTaskException.java | 2 - src/main/java/Command.java | 5 +++ src/main/java/CommandParser.java | 38 +++++++++++++++++ src/main/java/CommandType.java | 9 ++++ src/main/java/Deadline.java | 2 +- src/main/java/DeadlineCommand.java | 21 +++++++++ src/main/java/DeadlineException.java | 2 - src/main/java/DoneCommand.java | 18 ++++++++ src/main/java/Duke.java | 64 +++++++--------------------- src/main/java/DukeException.java | 6 ++- src/main/java/EventCommand.java | 21 +++++++++ src/main/java/EventException.java | 2 - src/main/java/ExitCommand.java | 13 ++++++ src/main/java/InvalidCommand.java | 13 ++++++ src/main/java/ListCommand.java | 13 ++++++ src/main/java/TaskManager.java | 4 +- src/main/java/TodoCommand.java | 19 +++++++++ src/main/java/TodoException.java | 2 - 18 files changed, 193 insertions(+), 61 deletions(-) delete mode 100644 src/main/java/AddTaskException.java create mode 100644 src/main/java/Command.java create mode 100644 src/main/java/CommandParser.java create mode 100644 src/main/java/CommandType.java create mode 100644 src/main/java/DeadlineCommand.java delete mode 100644 src/main/java/DeadlineException.java create mode 100644 src/main/java/DoneCommand.java create mode 100644 src/main/java/EventCommand.java delete mode 100644 src/main/java/EventException.java create mode 100644 src/main/java/ExitCommand.java create mode 100644 src/main/java/InvalidCommand.java create mode 100644 src/main/java/ListCommand.java create mode 100644 src/main/java/TodoCommand.java delete mode 100644 src/main/java/TodoException.java diff --git a/src/main/java/AddTaskException.java b/src/main/java/AddTaskException.java deleted file mode 100644 index e923fc0de..000000000 --- a/src/main/java/AddTaskException.java +++ /dev/null @@ -1,2 +0,0 @@ -public class AddTaskException extends DukeException{ -} diff --git a/src/main/java/Command.java b/src/main/java/Command.java new file mode 100644 index 000000000..88cf8c43a --- /dev/null +++ b/src/main/java/Command.java @@ -0,0 +1,5 @@ +public interface Command { + void run() throws DukeException; + + CommandType getType(); +} diff --git a/src/main/java/CommandParser.java b/src/main/java/CommandParser.java new file mode 100644 index 000000000..66a5d6b8d --- /dev/null +++ b/src/main/java/CommandParser.java @@ -0,0 +1,38 @@ +public class CommandParser { + public static String EXIT_CMD = "bye"; + public static String LIST_CMD = "list"; + public static String DONE_CMD = "done"; + public static String TODO_CMD = "todo"; + public static String DEADLINE_CMD = "deadline"; + public static String EVENT_CMD = "event"; + + public static Command parse(String command) { + command = command.strip(); + + if (command.equals(EXIT_CMD)) { + return new ExitCommand(); + } else if (command.equals(LIST_CMD)) { + return new ListCommand(); + } else if (command.startsWith(DONE_CMD)) { + String parsedInput = command.split(" ")[1]; + int taskNo = Integer.parseInt(parsedInput); + return new DoneCommand(taskNo - 1); + } else if (command.startsWith(TODO_CMD)) { + String parsedInput = command.replaceFirst(TODO_CMD, ""); + String todo = parsedInput.strip(); + return new TodoCommand(todo); + } else if (command.startsWith(DEADLINE_CMD)) { + String[] parsedInput = command.replaceFirst(DEADLINE_CMD, "").split("/by "); + String deadlineTitle = parsedInput[0].strip(); + String deadlineDue = parsedInput[1].strip(); + return new DeadlineCommand(deadlineTitle, deadlineDue); + } else if (command.startsWith(EVENT_CMD)) { + String[] parsedInput = command.replaceFirst(EVENT_CMD, "").split("/at "); + String eventTitle = parsedInput[0].strip(); + String eventTime = parsedInput[1].strip(); + return new EventCommand(eventTitle, eventTime); + } else { + return new InvalidCommand(); + } + } +} diff --git a/src/main/java/CommandType.java b/src/main/java/CommandType.java new file mode 100644 index 000000000..4029c2a81 --- /dev/null +++ b/src/main/java/CommandType.java @@ -0,0 +1,9 @@ +public enum CommandType { + EXIT, + LIST, + DONE, + TODO, + DEADLINE, + EVENT, + INVALID, +} \ No newline at end of file diff --git a/src/main/java/Deadline.java b/src/main/java/Deadline.java index 797c4aa3d..1be6fef7c 100644 --- a/src/main/java/Deadline.java +++ b/src/main/java/Deadline.java @@ -1,4 +1,4 @@ -public class Deadline extends Task{ +public class Deadline extends Task { private static String SYMBOL = "D"; private String dueDate; diff --git a/src/main/java/DeadlineCommand.java b/src/main/java/DeadlineCommand.java new file mode 100644 index 000000000..d5fc9760b --- /dev/null +++ b/src/main/java/DeadlineCommand.java @@ -0,0 +1,21 @@ +public class DeadlineCommand implements Command { + public static final CommandType type = CommandType.DEADLINE; + + private final String deadlineTitle; + private final String deadlineDue; + + DeadlineCommand(String deadlineTitle, String deadlineDue) { + this.deadlineTitle = deadlineTitle; + this.deadlineDue = deadlineDue; + } + + @Override + public void run() { + TaskManager.addDeadline(deadlineTitle, deadlineDue); + } + + @Override + public CommandType getType() { + return type; + } +} diff --git a/src/main/java/DeadlineException.java b/src/main/java/DeadlineException.java deleted file mode 100644 index 20542735c..000000000 --- a/src/main/java/DeadlineException.java +++ /dev/null @@ -1,2 +0,0 @@ -public class DeadlineException extends DukeException{ -} diff --git a/src/main/java/DoneCommand.java b/src/main/java/DoneCommand.java new file mode 100644 index 000000000..ed8e51ae6 --- /dev/null +++ b/src/main/java/DoneCommand.java @@ -0,0 +1,18 @@ +public class DoneCommand implements Command { + public static final CommandType type = CommandType.DONE; + private final int taskNo; + + public DoneCommand(int taskNo) { + this.taskNo = taskNo - 1; + } + + @Override + public void run() { + TaskManager.markTaskNoAsDone(taskNo); + } + + @Override + public CommandType getType() { + return type; + } +} diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 53f2ce31e..3a5dda6ea 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -1,57 +1,10 @@ import java.util.Scanner; public class Duke { - public static String EXIT_CMD = "bye"; - public static String LIST_CMD = "list"; - public static String DONE_CMD = "done"; - public static String TODO_CMD = "todo"; - public static String DEADLINE_CMD = "deadline"; - public static String EVENT_CMD = "event"; public static void main(String[] args) { greetUserOnStart(); - Scanner input = new Scanner(System.in); - - while (true) { - String command = input.nextLine(); - - // parse and handle commands - if (command.equals(EXIT_CMD)) { - break; - } else if (command.equals(LIST_CMD)) { - TaskManager.listTasks(); - } else if (command.startsWith(DONE_CMD)) { - String parsedInput = command.split(" ")[1]; - int taskNo = Integer.parseInt(parsedInput); - TaskManager.markTaskNoAsDone(taskNo - 1); - } else if (command.startsWith(TODO_CMD)) { - String parsedInput = command.replaceFirst(TODO_CMD, ""); - String todo = parsedInput.strip(); - try { - TaskManager.addTodo(todo); - } catch (TodoException e) { - System.out.println("OOPS!!! The description of a todo cannot be empty."); - } - } else if (command.startsWith(DEADLINE_CMD)) { - String [] parsedInput = command.replaceFirst(DEADLINE_CMD, "").split("/by "); - String deadlineTitle = parsedInput[0].strip(); - String deadlineDue = parsedInput[1].strip(); - TaskManager.addDeadline(deadlineTitle, deadlineDue); - } else if (command.startsWith(EVENT_CMD)) { - String [] parsedInput = command.replaceFirst(EVENT_CMD, "").split("/at "); - String eventTitle = parsedInput[0].strip(); - String eventTime = parsedInput[1].strip(); - TaskManager.addEvent(eventTitle, eventTime); - } else { - // handle invalid command - try { - throw new DukeException(); - } catch (DukeException e) { - System.out.println("OOPS!!! I'm sorry, but I don't know what that means :-("); - } - } - } - + executeDuke(); greetUserOnEnd(); } @@ -60,6 +13,21 @@ public static void greetUserOnStart() { System.out.println("What can I do for you?"); } + private static void executeDuke() { + Scanner in = new Scanner(System.in); + String input = in.nextLine(); + Command command = CommandParser.parse(input); + while (command.getType() != CommandType.EXIT) { + try { + command.run(); + } catch (DukeException e) { + System.out.println(e.getMessage()); + } + input = in.nextLine(); + command = CommandParser.parse(input); + } + } + public static void greetUserOnEnd() { System.out.println("Bye. Hope to see you again soon!"); } diff --git a/src/main/java/DukeException.java b/src/main/java/DukeException.java index 857dadd88..fe8837e3a 100644 --- a/src/main/java/DukeException.java +++ b/src/main/java/DukeException.java @@ -1,3 +1,5 @@ -public class DukeException extends Exception{ - +public class DukeException extends Exception { + public DukeException(String message) { + super(message); + } } diff --git a/src/main/java/EventCommand.java b/src/main/java/EventCommand.java new file mode 100644 index 000000000..5d8847d56 --- /dev/null +++ b/src/main/java/EventCommand.java @@ -0,0 +1,21 @@ +public class EventCommand implements Command { + public static final CommandType type = CommandType.EVENT; + + private final String eventTitle; + private final String eventTime; + + public EventCommand(String eventTitle, String eventTime) { + this.eventTitle = eventTitle; + this.eventTime = eventTime; + } + + @Override + public void run() { + TaskManager.addEvent(eventTitle, eventTime); + } + + @Override + public CommandType getType() { + return type; + } +} diff --git a/src/main/java/EventException.java b/src/main/java/EventException.java deleted file mode 100644 index c4bb10b35..000000000 --- a/src/main/java/EventException.java +++ /dev/null @@ -1,2 +0,0 @@ -public class EventException extends DukeException{ -} diff --git a/src/main/java/ExitCommand.java b/src/main/java/ExitCommand.java new file mode 100644 index 000000000..e2b2db8ba --- /dev/null +++ b/src/main/java/ExitCommand.java @@ -0,0 +1,13 @@ +public class ExitCommand implements Command { + public static final CommandType type = CommandType.EXIT; + + @Override + public void run() { + System.out.println("Exited Duke. See you later."); + } + + @Override + public CommandType getType() { + return type; + } +} diff --git a/src/main/java/InvalidCommand.java b/src/main/java/InvalidCommand.java new file mode 100644 index 000000000..6f8946374 --- /dev/null +++ b/src/main/java/InvalidCommand.java @@ -0,0 +1,13 @@ +public class InvalidCommand implements Command { + public static final CommandType type = CommandType.INVALID; + + @Override + public void run() throws DukeException { + throw new DukeException("OOPS!!! I'm sorry, but I don't know what that means :-("); + } + + @Override + public CommandType getType() { + return type; + } +} diff --git a/src/main/java/ListCommand.java b/src/main/java/ListCommand.java new file mode 100644 index 000000000..2e9ae6256 --- /dev/null +++ b/src/main/java/ListCommand.java @@ -0,0 +1,13 @@ +public class ListCommand implements Command { + public static final CommandType type = CommandType.LIST; + + @Override + public void run() { + TaskManager.listTasks(); + } + + @Override + public CommandType getType() { + return type; + } +} diff --git a/src/main/java/TaskManager.java b/src/main/java/TaskManager.java index 7f5abf3c9..b55e55e65 100644 --- a/src/main/java/TaskManager.java +++ b/src/main/java/TaskManager.java @@ -14,9 +14,9 @@ static void addTask(Task task) { } } - static void addTodo(String todoName) throws TodoException { + static void addTodo(String todoName) throws DukeException { if (todoName.isEmpty()) { - throw new TodoException(); + throw new DukeException("Todo cannot be empty"); } Todo todo = new Todo(todoName); addTask(todo); diff --git a/src/main/java/TodoCommand.java b/src/main/java/TodoCommand.java new file mode 100644 index 000000000..203215972 --- /dev/null +++ b/src/main/java/TodoCommand.java @@ -0,0 +1,19 @@ +public class TodoCommand implements Command { + public static final CommandType type = CommandType.TODO; + + private final String todo; + + public TodoCommand(String todo) { + this.todo = todo; + } + + @Override + public void run() throws DukeException { + TaskManager.addTodo(todo); + } + + @Override + public CommandType getType() { + return type; + } +} diff --git a/src/main/java/TodoException.java b/src/main/java/TodoException.java deleted file mode 100644 index 0c224678f..000000000 --- a/src/main/java/TodoException.java +++ /dev/null @@ -1,2 +0,0 @@ -public class TodoException extends DukeException{ -} From d97147d8aaf4d8369f87526ca974e8f2218a76ed Mon Sep 17 00:00:00 2001 From: flerovious <85042815+flerovious@users.noreply.github.com> Date: Sun, 19 Sep 2021 20:56:04 +0800 Subject: [PATCH 15/40] Refactor with packages --- src/main/java/{ => duke}/CommandParser.java | 4 ++++ src/main/java/{ => duke}/Duke.java | 5 ++++ src/main/java/{ => duke}/DukeException.java | 2 ++ src/main/java/{ => duke}/TaskManager.java | 23 ++++++++++++------- src/main/java/{ => duke/command}/Command.java | 4 ++++ .../java/{ => duke/command}/CommandType.java | 2 ++ .../{ => duke/command}/DeadlineCommand.java | 6 ++++- .../java/{ => duke/command}/DoneCommand.java | 4 ++++ .../java/{ => duke/command}/EventCommand.java | 4 ++++ .../java/{ => duke/command}/ExitCommand.java | 2 ++ .../{ => duke/command}/InvalidCommand.java | 4 ++++ .../java/{ => duke/command}/ListCommand.java | 4 ++++ .../java/{ => duke/command}/TodoCommand.java | 5 ++++ src/main/java/{ => duke/task}/Deadline.java | 3 +++ src/main/java/{ => duke/task}/Event.java | 4 +++- src/main/java/{ => duke/task}/Task.java | 2 ++ src/main/java/{ => duke/task}/Todo.java | 2 ++ 17 files changed, 70 insertions(+), 10 deletions(-) rename src/main/java/{ => duke}/CommandParser.java (97%) rename src/main/java/{ => duke}/Duke.java (92%) rename src/main/java/{ => duke}/DukeException.java (89%) rename src/main/java/{ => duke}/TaskManager.java (66%) rename src/main/java/{ => duke/command}/Command.java (64%) rename src/main/java/{ => duke/command}/CommandType.java (82%) rename src/main/java/{ => duke/command}/DeadlineCommand.java (79%) rename src/main/java/{ => duke/command}/DoneCommand.java (88%) rename src/main/java/{ => duke/command}/EventCommand.java (91%) rename src/main/java/{ => duke/command}/ExitCommand.java (92%) rename src/main/java/{ => duke/command}/InvalidCommand.java (87%) rename src/main/java/{ => duke/command}/ListCommand.java (84%) rename src/main/java/{ => duke/command}/TodoCommand.java (83%) rename src/main/java/{ => duke/task}/Deadline.java (94%) rename src/main/java/{ => duke/task}/Event.java (85%) rename src/main/java/{ => duke/task}/Task.java (96%) rename src/main/java/{ => duke/task}/Todo.java (92%) diff --git a/src/main/java/CommandParser.java b/src/main/java/duke/CommandParser.java similarity index 97% rename from src/main/java/CommandParser.java rename to src/main/java/duke/CommandParser.java index 66a5d6b8d..2ceeba567 100644 --- a/src/main/java/CommandParser.java +++ b/src/main/java/duke/CommandParser.java @@ -1,3 +1,7 @@ +package duke; + +import duke.command.*; + public class CommandParser { public static String EXIT_CMD = "bye"; public static String LIST_CMD = "list"; diff --git a/src/main/java/Duke.java b/src/main/java/duke/Duke.java similarity index 92% rename from src/main/java/Duke.java rename to src/main/java/duke/Duke.java index 3a5dda6ea..42ea944b5 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/duke/Duke.java @@ -1,5 +1,10 @@ +package duke; + import java.util.Scanner; +import duke.command.Command; +import duke.command.CommandType; + public class Duke { public static void main(String[] args) { diff --git a/src/main/java/DukeException.java b/src/main/java/duke/DukeException.java similarity index 89% rename from src/main/java/DukeException.java rename to src/main/java/duke/DukeException.java index fe8837e3a..3fcd0f5ea 100644 --- a/src/main/java/DukeException.java +++ b/src/main/java/duke/DukeException.java @@ -1,3 +1,5 @@ +package duke; + public class DukeException extends Exception { public DukeException(String message) { super(message); diff --git a/src/main/java/TaskManager.java b/src/main/java/duke/TaskManager.java similarity index 66% rename from src/main/java/TaskManager.java rename to src/main/java/duke/TaskManager.java index b55e55e65..8d17897fd 100644 --- a/src/main/java/TaskManager.java +++ b/src/main/java/duke/TaskManager.java @@ -1,9 +1,16 @@ +package duke; + +import duke.task.Deadline; +import duke.task.Event; +import duke.task.Task; +import duke.task.Todo; + public class TaskManager { private static int taskNo = 0; - final private static int maxTasks = 100; - final static Task[] tasks = new Task[maxTasks]; + private static final int maxTasks = 100; + private static final Task[] tasks = new Task[maxTasks]; - static void addTask(Task task) { + public static void addTask(Task task) { if (taskNo < maxTasks) { tasks[taskNo] = task; taskNo++; @@ -14,7 +21,7 @@ static void addTask(Task task) { } } - static void addTodo(String todoName) throws DukeException { + public static void addTodo(String todoName) throws DukeException { if (todoName.isEmpty()) { throw new DukeException("Todo cannot be empty"); } @@ -22,17 +29,17 @@ static void addTodo(String todoName) throws DukeException { addTask(todo); } - static void addDeadline(String deadlineName, String deadlineDue) { + public static void addDeadline(String deadlineName, String deadlineDue) { Deadline deadline = new Deadline(deadlineName, deadlineDue); addTask(deadline); } - static void addEvent(String eventName, String eventTime) { + public static void addEvent(String eventName, String eventTime) { Event event = new Event(eventName, eventTime); addTask(event); } - static void listTasks() { + public static void listTasks() { System.out.println("Here are the tasks in your list:"); for (int i = 0; i < taskNo; ++i) { Task task = tasks[i]; @@ -40,7 +47,7 @@ static void listTasks() { } } - static void markTaskNoAsDone(int taskNo) { + public static void markTaskNoAsDone(int taskNo) { Task task = tasks[taskNo]; task.markAsDone(); diff --git a/src/main/java/Command.java b/src/main/java/duke/command/Command.java similarity index 64% rename from src/main/java/Command.java rename to src/main/java/duke/command/Command.java index 88cf8c43a..626624506 100644 --- a/src/main/java/Command.java +++ b/src/main/java/duke/command/Command.java @@ -1,3 +1,7 @@ +package duke.command; + +import duke.DukeException; + public interface Command { void run() throws DukeException; diff --git a/src/main/java/CommandType.java b/src/main/java/duke/command/CommandType.java similarity index 82% rename from src/main/java/CommandType.java rename to src/main/java/duke/command/CommandType.java index 4029c2a81..cfb3c222f 100644 --- a/src/main/java/CommandType.java +++ b/src/main/java/duke/command/CommandType.java @@ -1,3 +1,5 @@ +package duke.command; + public enum CommandType { EXIT, LIST, diff --git a/src/main/java/DeadlineCommand.java b/src/main/java/duke/command/DeadlineCommand.java similarity index 79% rename from src/main/java/DeadlineCommand.java rename to src/main/java/duke/command/DeadlineCommand.java index d5fc9760b..cf6892543 100644 --- a/src/main/java/DeadlineCommand.java +++ b/src/main/java/duke/command/DeadlineCommand.java @@ -1,10 +1,14 @@ +package duke.command; + +import duke.TaskManager; + public class DeadlineCommand implements Command { public static final CommandType type = CommandType.DEADLINE; private final String deadlineTitle; private final String deadlineDue; - DeadlineCommand(String deadlineTitle, String deadlineDue) { + public DeadlineCommand(String deadlineTitle, String deadlineDue) { this.deadlineTitle = deadlineTitle; this.deadlineDue = deadlineDue; } diff --git a/src/main/java/DoneCommand.java b/src/main/java/duke/command/DoneCommand.java similarity index 88% rename from src/main/java/DoneCommand.java rename to src/main/java/duke/command/DoneCommand.java index ed8e51ae6..f63eadd35 100644 --- a/src/main/java/DoneCommand.java +++ b/src/main/java/duke/command/DoneCommand.java @@ -1,3 +1,7 @@ +package duke.command; + +import duke.TaskManager; + public class DoneCommand implements Command { public static final CommandType type = CommandType.DONE; private final int taskNo; diff --git a/src/main/java/EventCommand.java b/src/main/java/duke/command/EventCommand.java similarity index 91% rename from src/main/java/EventCommand.java rename to src/main/java/duke/command/EventCommand.java index 5d8847d56..2cad3137f 100644 --- a/src/main/java/EventCommand.java +++ b/src/main/java/duke/command/EventCommand.java @@ -1,3 +1,7 @@ +package duke.command; + +import duke.TaskManager; + public class EventCommand implements Command { public static final CommandType type = CommandType.EVENT; diff --git a/src/main/java/ExitCommand.java b/src/main/java/duke/command/ExitCommand.java similarity index 92% rename from src/main/java/ExitCommand.java rename to src/main/java/duke/command/ExitCommand.java index e2b2db8ba..ce4aa8090 100644 --- a/src/main/java/ExitCommand.java +++ b/src/main/java/duke/command/ExitCommand.java @@ -1,3 +1,5 @@ +package duke.command; + public class ExitCommand implements Command { public static final CommandType type = CommandType.EXIT; diff --git a/src/main/java/InvalidCommand.java b/src/main/java/duke/command/InvalidCommand.java similarity index 87% rename from src/main/java/InvalidCommand.java rename to src/main/java/duke/command/InvalidCommand.java index 6f8946374..79fa25d97 100644 --- a/src/main/java/InvalidCommand.java +++ b/src/main/java/duke/command/InvalidCommand.java @@ -1,3 +1,7 @@ +package duke.command; + +import duke.DukeException; + public class InvalidCommand implements Command { public static final CommandType type = CommandType.INVALID; diff --git a/src/main/java/ListCommand.java b/src/main/java/duke/command/ListCommand.java similarity index 84% rename from src/main/java/ListCommand.java rename to src/main/java/duke/command/ListCommand.java index 2e9ae6256..7566c1494 100644 --- a/src/main/java/ListCommand.java +++ b/src/main/java/duke/command/ListCommand.java @@ -1,3 +1,7 @@ +package duke.command; + +import duke.TaskManager; + public class ListCommand implements Command { public static final CommandType type = CommandType.LIST; diff --git a/src/main/java/TodoCommand.java b/src/main/java/duke/command/TodoCommand.java similarity index 83% rename from src/main/java/TodoCommand.java rename to src/main/java/duke/command/TodoCommand.java index 203215972..1358d64fa 100644 --- a/src/main/java/TodoCommand.java +++ b/src/main/java/duke/command/TodoCommand.java @@ -1,3 +1,8 @@ +package duke.command; + +import duke.DukeException; +import duke.TaskManager; + public class TodoCommand implements Command { public static final CommandType type = CommandType.TODO; diff --git a/src/main/java/Deadline.java b/src/main/java/duke/task/Deadline.java similarity index 94% rename from src/main/java/Deadline.java rename to src/main/java/duke/task/Deadline.java index 1be6fef7c..292be3260 100644 --- a/src/main/java/Deadline.java +++ b/src/main/java/duke/task/Deadline.java @@ -1,3 +1,6 @@ +package duke.task; + + public class Deadline extends Task { private static String SYMBOL = "D"; private String dueDate; diff --git a/src/main/java/Event.java b/src/main/java/duke/task/Event.java similarity index 85% rename from src/main/java/Event.java rename to src/main/java/duke/task/Event.java index 0614e2be6..e858e6636 100644 --- a/src/main/java/Event.java +++ b/src/main/java/duke/task/Event.java @@ -1,4 +1,6 @@ -public class Event extends Task{ +package duke.task; + +public class Event extends Task { private static String SYMBOL = "E"; private String timeslot; diff --git a/src/main/java/Task.java b/src/main/java/duke/task/Task.java similarity index 96% rename from src/main/java/Task.java rename to src/main/java/duke/task/Task.java index d6eca51ee..a907c9382 100644 --- a/src/main/java/Task.java +++ b/src/main/java/duke/task/Task.java @@ -1,3 +1,5 @@ +package duke.task; + public class Task { final private String name; private Boolean isDone; diff --git a/src/main/java/Todo.java b/src/main/java/duke/task/Todo.java similarity index 92% rename from src/main/java/Todo.java rename to src/main/java/duke/task/Todo.java index c48b806cf..fb13c3205 100644 --- a/src/main/java/Todo.java +++ b/src/main/java/duke/task/Todo.java @@ -1,3 +1,5 @@ +package duke.task; + public class Todo extends Task { private static String SYMBOL = "T"; From 1cb044c609e3fb87b7cc64f041f7eb8f1556ba59 Mon Sep 17 00:00:00 2001 From: flerovious <85042815+flerovious@users.noreply.github.com> Date: Sun, 19 Sep 2021 21:33:01 +0800 Subject: [PATCH 16/40] Add delete command --- src/main/java/duke/CommandParser.java | 17 ++++++---- src/main/java/duke/TaskManager.java | 31 +++++++++++-------- src/main/java/duke/command/CommandType.java | 1 + src/main/java/duke/command/DeleteCommand.java | 23 ++++++++++++++ src/main/java/duke/command/DoneCommand.java | 2 +- 5 files changed, 54 insertions(+), 20 deletions(-) create mode 100644 src/main/java/duke/command/DeleteCommand.java diff --git a/src/main/java/duke/CommandParser.java b/src/main/java/duke/CommandParser.java index 2ceeba567..a32c9f2de 100644 --- a/src/main/java/duke/CommandParser.java +++ b/src/main/java/duke/CommandParser.java @@ -3,12 +3,13 @@ import duke.command.*; public class CommandParser { - public static String EXIT_CMD = "bye"; - public static String LIST_CMD = "list"; - public static String DONE_CMD = "done"; - public static String TODO_CMD = "todo"; - public static String DEADLINE_CMD = "deadline"; - public static String EVENT_CMD = "event"; + private static final String EXIT_CMD = "bye"; + private static final String LIST_CMD = "list"; + private static final String DONE_CMD = "done"; + private static final String TODO_CMD = "todo"; + private static final String DEADLINE_CMD = "deadline"; + private static final String EVENT_CMD = "event"; + private static final String DELETE_CMD = "delete"; public static Command parse(String command) { command = command.strip(); @@ -35,6 +36,10 @@ public static Command parse(String command) { String eventTitle = parsedInput[0].strip(); String eventTime = parsedInput[1].strip(); return new EventCommand(eventTitle, eventTime); + } else if (command.startsWith(DELETE_CMD)) { + String parsedInput = command.split(" ")[1]; + int taskNo = Integer.parseInt(parsedInput); + return new DeleteCommand(taskNo - 1); } else { return new InvalidCommand(); } diff --git a/src/main/java/duke/TaskManager.java b/src/main/java/duke/TaskManager.java index 8d17897fd..31bde0991 100644 --- a/src/main/java/duke/TaskManager.java +++ b/src/main/java/duke/TaskManager.java @@ -5,20 +5,17 @@ import duke.task.Task; import duke.task.Todo; +import java.util.ArrayList; + public class TaskManager { - private static int taskNo = 0; - private static final int maxTasks = 100; - private static final Task[] tasks = new Task[maxTasks]; + private static final ArrayList tasks = new ArrayList<>(); public static void addTask(Task task) { - if (taskNo < maxTasks) { - tasks[taskNo] = task; - taskNo++; + tasks.add(task); - System.out.print("Got it. I've added this task:\n"); - System.out.printf(" %s\n", task); - System.out.printf("Now you have %d tasks in the list.\n", taskNo); - } + System.out.print("Got it. I've added this task:\n"); + System.out.printf(" %s\n", task); + System.out.printf("Now you have %d tasks in the list.\n", tasks.size()); } public static void addTodo(String todoName) throws DukeException { @@ -41,17 +38,25 @@ public static void addEvent(String eventName, String eventTime) { public static void listTasks() { System.out.println("Here are the tasks in your list:"); - for (int i = 0; i < taskNo; ++i) { - Task task = tasks[i]; + for (int i = 0; i < tasks.size(); ++i) { + Task task = tasks.get(i); System.out.printf("%d. %s\n", i + 1, task); } } public static void markTaskNoAsDone(int taskNo) { - Task task = tasks[taskNo]; + Task task = tasks.get(taskNo); task.markAsDone(); System.out.println("Nice! I've marked this task as done:"); System.out.printf(" %s\n", task); } + + public static void deleteTask(int taskNo) { + Task task = tasks.remove(taskNo); + + System.out.println("Noted. I've removed this task:"); + System.out.printf(" %s\n", task); + System.out.printf("Now you have %d tasks in the list.\n", tasks.size()); + } } diff --git a/src/main/java/duke/command/CommandType.java b/src/main/java/duke/command/CommandType.java index cfb3c222f..a3016a989 100644 --- a/src/main/java/duke/command/CommandType.java +++ b/src/main/java/duke/command/CommandType.java @@ -8,4 +8,5 @@ public enum CommandType { DEADLINE, EVENT, INVALID, + DELETE, } \ No newline at end of file diff --git a/src/main/java/duke/command/DeleteCommand.java b/src/main/java/duke/command/DeleteCommand.java new file mode 100644 index 000000000..670e3c977 --- /dev/null +++ b/src/main/java/duke/command/DeleteCommand.java @@ -0,0 +1,23 @@ +package duke.command; + +import duke.TaskManager; + +public class DeleteCommand implements Command { + public static final CommandType type = CommandType.DELETE; + + private final int taskNo; + + public DeleteCommand(int taskNo) { + this.taskNo = taskNo; + } + + @Override + public void run() { + TaskManager.deleteTask(taskNo); + } + + @Override + public CommandType getType() { + return type; + } +} \ No newline at end of file diff --git a/src/main/java/duke/command/DoneCommand.java b/src/main/java/duke/command/DoneCommand.java index f63eadd35..bda06a982 100644 --- a/src/main/java/duke/command/DoneCommand.java +++ b/src/main/java/duke/command/DoneCommand.java @@ -7,7 +7,7 @@ public class DoneCommand implements Command { private final int taskNo; public DoneCommand(int taskNo) { - this.taskNo = taskNo - 1; + this.taskNo = taskNo; } @Override From 759917379daa75ce4b77f21b49950726f423685e Mon Sep 17 00:00:00 2001 From: flerovious <85042815+flerovious@users.noreply.github.com> Date: Mon, 20 Sep 2021 13:08:25 +0800 Subject: [PATCH 17/40] Add save to local storage feature --- src/main/java/duke/Duke.java | 4 +- src/main/java/duke/Storage.java | 130 ++++++++++++++++++ src/main/java/duke/TaskManager.java | 27 ++-- src/main/java/duke/command/Command.java | 2 +- .../java/duke/command/DeadlineCommand.java | 10 +- src/main/java/duke/command/DoneCommand.java | 11 +- src/main/java/duke/command/EventCommand.java | 10 +- src/main/java/duke/command/ExitCommand.java | 2 +- .../java/duke/command/InvalidCommand.java | 2 +- src/main/java/duke/command/ListCommand.java | 2 +- src/main/java/duke/command/TodoCommand.java | 10 +- src/main/java/duke/task/Deadline.java | 15 +- src/main/java/duke/task/Event.java | 15 +- src/main/java/duke/task/Task.java | 6 +- src/main/java/duke/task/TaskType.java | 7 + src/main/java/duke/task/Todo.java | 13 +- 16 files changed, 236 insertions(+), 30 deletions(-) create mode 100644 src/main/java/duke/Storage.java create mode 100644 src/main/java/duke/task/TaskType.java diff --git a/src/main/java/duke/Duke.java b/src/main/java/duke/Duke.java index 42ea944b5..436ac458b 100644 --- a/src/main/java/duke/Duke.java +++ b/src/main/java/duke/Duke.java @@ -19,12 +19,14 @@ public static void greetUserOnStart() { } private static void executeDuke() { + Storage.importData(); + Scanner in = new Scanner(System.in); String input = in.nextLine(); Command command = CommandParser.parse(input); while (command.getType() != CommandType.EXIT) { try { - command.run(); + command.run(true); } catch (DukeException e) { System.out.println(e.getMessage()); } diff --git a/src/main/java/duke/Storage.java b/src/main/java/duke/Storage.java new file mode 100644 index 000000000..7ec731aaf --- /dev/null +++ b/src/main/java/duke/Storage.java @@ -0,0 +1,130 @@ +package duke; + +import duke.command.*; +import duke.task.Task; + +import java.io.*; +import java.util.Scanner; + +public class Storage { + private static final String DATA_DIR_NAME = "data"; + private static final String DATA_FILE_NAME = "duke.txt"; + private static final String FILE_PATH = DATA_DIR_NAME + File.separator + DATA_FILE_NAME; + + private static final String TODO_CODE = "T"; + private static final String DEADLINE_CODE = "D"; + private static final String EVENT_CODE = "E"; + private static final String DONE = "X"; + private static final String DELIMITER = "#&#"; + private static final String NULL = "NULL"; + + // load data from data file + public static void importData() { + try { + File directory = new File(DATA_DIR_NAME); + if (!directory.exists()) { + directory.mkdir(); + } + File file = new File(FILE_PATH); + if (!file.exists()) { + file.createNewFile(); + } + Scanner input = new Scanner(file); + while (input.hasNext()) { + decodeLine(input.nextLine()); + } + } catch (FileNotFoundException | DukeException e) { + System.out.println(e.getMessage()); + } catch (IOException e) { + e.printStackTrace(); + } + } + + // save data into data file + public static void exportData() { + try { + FileWriter fileWriter = new FileWriter(FILE_PATH); + for (Task task : TaskManager.getTasklist()) { + if (task == null) { + break; + } + String encodedTask = encodeLine(task); + fileWriter.write(encodedTask + System.lineSeparator()); + } + fileWriter.close(); + } catch (FileNotFoundException e) { + System.out.println("Data file missing!"); + } catch (IOException e) { + e.printStackTrace(); + } catch (DukeException e) { + System.out.println(e.getMessage()); + } + } + + // encode line into format <Time> + private static String encodeLine(Task task) throws DukeException { + String taskType = NULL; + String status = NULL; + String title = NULL; + String time = NULL; + + switch (task.getTaskType()) { + case TODO: + taskType = TODO_CODE; + break; + case DEADLINE: + taskType = DEADLINE_CODE; + time = task.getTime(); + break; + case EVENT: + taskType = EVENT_CODE; + time = task.getTime(); + break; + default: + throw new DukeException("Invalid task found in tasklist"); + } + + status = task.getStatusIcon(); + title = task.getName(); + + return String.format("%s%s%s%s%s%s%s", taskType, DELIMITER, status, DELIMITER, title, DELIMITER, time); + } + + // decode line of format <TaskType> <Status> <Title> <Time> + private static void decodeLine(String line) throws DukeException { + String[] data = line.split(DELIMITER); + Command command; + + if (data.length != 4) { + throw new DukeException("Unable to load data. Some data is corrupted"); + } + + final String taskType = data[0]; + final String status = data[1]; + final String title = data[2]; + final String time = data[3]; + + switch (taskType) { + case TODO_CODE: + command = new TodoCommand(title); + break; + case DEADLINE_CODE: + command = new DeadlineCommand(title, time); + break; + case EVENT_CODE: + command = new EventCommand(title, time); + break; + default: + throw new DukeException("Unable to load data. Some data is corrupted"); + } + + command.run(false); + + // mark most recent task as done + if (status.equals(DONE)) { + int taskNo = TaskManager.getTasklistSize(); + command = new DoneCommand(taskNo - 1); + command.run(false); + } + } +} diff --git a/src/main/java/duke/TaskManager.java b/src/main/java/duke/TaskManager.java index 8d17897fd..508ee99bf 100644 --- a/src/main/java/duke/TaskManager.java +++ b/src/main/java/duke/TaskManager.java @@ -14,29 +14,29 @@ public static void addTask(Task task) { if (taskNo < maxTasks) { tasks[taskNo] = task; taskNo++; - - System.out.print("Got it. I've added this task:\n"); - System.out.printf(" %s\n", task); - System.out.printf("Now you have %d tasks in the list.\n", taskNo); + Storage.exportData(); } } - public static void addTodo(String todoName) throws DukeException { + public static Task addTodo(String todoName) throws DukeException { if (todoName.isEmpty()) { throw new DukeException("Todo cannot be empty"); } Todo todo = new Todo(todoName); addTask(todo); + return todo; } - public static void addDeadline(String deadlineName, String deadlineDue) { + public static Task addDeadline(String deadlineName, String deadlineDue) { Deadline deadline = new Deadline(deadlineName, deadlineDue); addTask(deadline); + return deadline; } - public static void addEvent(String eventName, String eventTime) { + public static Task addEvent(String eventName, String eventTime) { Event event = new Event(eventName, eventTime); addTask(event); + return event; } public static void listTasks() { @@ -47,11 +47,18 @@ public static void listTasks() { } } - public static void markTaskNoAsDone(int taskNo) { + public static Task markTaskNoAsDone(int taskNo) { Task task = tasks[taskNo]; task.markAsDone(); + Storage.exportData(); + return task; + } + + public static int getTasklistSize() { + return taskNo; + } - System.out.println("Nice! I've marked this task as done:"); - System.out.printf(" %s\n", task); + public static Task[] getTasklist() { + return tasks; } } diff --git a/src/main/java/duke/command/Command.java b/src/main/java/duke/command/Command.java index 626624506..9b58f501a 100644 --- a/src/main/java/duke/command/Command.java +++ b/src/main/java/duke/command/Command.java @@ -3,7 +3,7 @@ import duke.DukeException; public interface Command { - void run() throws DukeException; + void run(boolean printMessage) throws DukeException; CommandType getType(); } diff --git a/src/main/java/duke/command/DeadlineCommand.java b/src/main/java/duke/command/DeadlineCommand.java index cf6892543..c2a90e319 100644 --- a/src/main/java/duke/command/DeadlineCommand.java +++ b/src/main/java/duke/command/DeadlineCommand.java @@ -1,6 +1,7 @@ package duke.command; import duke.TaskManager; +import duke.task.Task; public class DeadlineCommand implements Command { public static final CommandType type = CommandType.DEADLINE; @@ -14,8 +15,13 @@ public DeadlineCommand(String deadlineTitle, String deadlineDue) { } @Override - public void run() { - TaskManager.addDeadline(deadlineTitle, deadlineDue); + public void run(boolean printMessage) { + Task task = TaskManager.addDeadline(deadlineTitle, deadlineDue); + if (printMessage) { + System.out.print("Got it. I've added this task:\n"); + System.out.printf(" %s\n", task); + System.out.printf("Now you have %d tasks in the list.\n", TaskManager.getTasklistSize()); + } } @Override diff --git a/src/main/java/duke/command/DoneCommand.java b/src/main/java/duke/command/DoneCommand.java index f63eadd35..8d88c00c8 100644 --- a/src/main/java/duke/command/DoneCommand.java +++ b/src/main/java/duke/command/DoneCommand.java @@ -1,18 +1,23 @@ package duke.command; import duke.TaskManager; +import duke.task.Task; public class DoneCommand implements Command { public static final CommandType type = CommandType.DONE; private final int taskNo; public DoneCommand(int taskNo) { - this.taskNo = taskNo - 1; + this.taskNo = taskNo; } @Override - public void run() { - TaskManager.markTaskNoAsDone(taskNo); + public void run(boolean printMessage) { + Task task = TaskManager.markTaskNoAsDone(taskNo); + if (printMessage) { + System.out.println("Nice! I've marked this task as done:"); + System.out.printf(" %s\n", task); + } } @Override diff --git a/src/main/java/duke/command/EventCommand.java b/src/main/java/duke/command/EventCommand.java index 2cad3137f..e102982f8 100644 --- a/src/main/java/duke/command/EventCommand.java +++ b/src/main/java/duke/command/EventCommand.java @@ -1,6 +1,7 @@ package duke.command; import duke.TaskManager; +import duke.task.Task; public class EventCommand implements Command { public static final CommandType type = CommandType.EVENT; @@ -14,8 +15,13 @@ public EventCommand(String eventTitle, String eventTime) { } @Override - public void run() { - TaskManager.addEvent(eventTitle, eventTime); + public void run(boolean printMessage) { + Task task = TaskManager.addEvent(eventTitle, eventTime); + if (printMessage) { + System.out.print("Got it. I've added this task:\n"); + System.out.printf(" %s\n", task); + System.out.printf("Now you have %d tasks in the list.\n", TaskManager.getTasklistSize()); + } } @Override diff --git a/src/main/java/duke/command/ExitCommand.java b/src/main/java/duke/command/ExitCommand.java index ce4aa8090..6f25faaba 100644 --- a/src/main/java/duke/command/ExitCommand.java +++ b/src/main/java/duke/command/ExitCommand.java @@ -4,7 +4,7 @@ public class ExitCommand implements Command { public static final CommandType type = CommandType.EXIT; @Override - public void run() { + public void run(boolean printMessage) { System.out.println("Exited Duke. See you later."); } diff --git a/src/main/java/duke/command/InvalidCommand.java b/src/main/java/duke/command/InvalidCommand.java index 79fa25d97..996eeb815 100644 --- a/src/main/java/duke/command/InvalidCommand.java +++ b/src/main/java/duke/command/InvalidCommand.java @@ -6,7 +6,7 @@ public class InvalidCommand implements Command { public static final CommandType type = CommandType.INVALID; @Override - public void run() throws DukeException { + public void run(boolean printMessage) throws DukeException { throw new DukeException("OOPS!!! I'm sorry, but I don't know what that means :-("); } diff --git a/src/main/java/duke/command/ListCommand.java b/src/main/java/duke/command/ListCommand.java index 7566c1494..9bdd30506 100644 --- a/src/main/java/duke/command/ListCommand.java +++ b/src/main/java/duke/command/ListCommand.java @@ -6,7 +6,7 @@ public class ListCommand implements Command { public static final CommandType type = CommandType.LIST; @Override - public void run() { + public void run(boolean printMessage) { TaskManager.listTasks(); } diff --git a/src/main/java/duke/command/TodoCommand.java b/src/main/java/duke/command/TodoCommand.java index 1358d64fa..f72f55e4f 100644 --- a/src/main/java/duke/command/TodoCommand.java +++ b/src/main/java/duke/command/TodoCommand.java @@ -2,6 +2,7 @@ import duke.DukeException; import duke.TaskManager; +import duke.task.Task; public class TodoCommand implements Command { public static final CommandType type = CommandType.TODO; @@ -13,8 +14,13 @@ public TodoCommand(String todo) { } @Override - public void run() throws DukeException { - TaskManager.addTodo(todo); + public void run(boolean printMessage) throws DukeException { + Task task = TaskManager.addTodo(todo); + if (printMessage) { + System.out.print("Got it. I've added this task:\n"); + System.out.printf(" %s\n", task); + System.out.printf("Now you have %d tasks in the list.\n", TaskManager.getTasklistSize()); + } } @Override diff --git a/src/main/java/duke/task/Deadline.java b/src/main/java/duke/task/Deadline.java index 292be3260..01efb0aed 100644 --- a/src/main/java/duke/task/Deadline.java +++ b/src/main/java/duke/task/Deadline.java @@ -2,16 +2,27 @@ public class Deadline extends Task { - private static String SYMBOL = "D"; - private String dueDate; + private static final TaskType taskType = TaskType.DEADLINE; + private final String dueDate; public Deadline(String name, String dueDate) { super(name); this.dueDate = dueDate; } + @Override + public TaskType getTaskType() { + return taskType; + } + @Override public String toString() { + String SYMBOL = "D"; return "[" + SYMBOL + "]" + super.toString() + " (by: " + dueDate + ")"; } + + @Override + public String getTime() { + return dueDate; + } } diff --git a/src/main/java/duke/task/Event.java b/src/main/java/duke/task/Event.java index e858e6636..0d53f40c2 100644 --- a/src/main/java/duke/task/Event.java +++ b/src/main/java/duke/task/Event.java @@ -1,16 +1,27 @@ package duke.task; public class Event extends Task { - private static String SYMBOL = "E"; - private String timeslot; + private static final TaskType taskType = TaskType.EVENT; + private final String timeslot; public Event(String name, String timeslot) { super(name); this.timeslot = timeslot; } + @Override + public TaskType getTaskType() { + return taskType; + } + @Override public String toString() { + String SYMBOL = "E"; return "[" + SYMBOL + "]" + super.toString() + " (at: " + timeslot + ")"; } + + @Override + public String getTime() { + return timeslot; + } } diff --git a/src/main/java/duke/task/Task.java b/src/main/java/duke/task/Task.java index a907c9382..c20028ee8 100644 --- a/src/main/java/duke/task/Task.java +++ b/src/main/java/duke/task/Task.java @@ -1,6 +1,6 @@ package duke.task; -public class Task { +public abstract class Task { final private String name; private Boolean isDone; @@ -21,6 +21,10 @@ public void markAsDone() { isDone = true; } + public abstract TaskType getTaskType(); + + public abstract String getTime(); + @Override public String toString() { return "[" + getStatusIcon() + "] " + getName(); diff --git a/src/main/java/duke/task/TaskType.java b/src/main/java/duke/task/TaskType.java new file mode 100644 index 000000000..3389c7545 --- /dev/null +++ b/src/main/java/duke/task/TaskType.java @@ -0,0 +1,7 @@ +package duke.task; + +public enum TaskType { + TODO, + DEADLINE, + EVENT, +} diff --git a/src/main/java/duke/task/Todo.java b/src/main/java/duke/task/Todo.java index fb13c3205..ad95cc535 100644 --- a/src/main/java/duke/task/Todo.java +++ b/src/main/java/duke/task/Todo.java @@ -1,14 +1,25 @@ package duke.task; public class Todo extends Task { - private static String SYMBOL = "T"; + private static final TaskType taskType = TaskType.TODO; public Todo(String name) { super(name); } + @Override + public TaskType getTaskType() { + return taskType; + } + @Override public String toString() { + String SYMBOL = "T"; return "[" + SYMBOL + "]" + super.toString(); } + + @Override + public String getTime() { + return null; + } } From 207233717a3f43a75550fb865644d2a13a360970 Mon Sep 17 00:00:00 2001 From: flerovious <85042815+flerovious@users.noreply.github.com> Date: Mon, 20 Sep 2021 13:47:10 +0800 Subject: [PATCH 18/40] Fix bugs with delete command --- src/main/java/duke/TaskManager.java | 12 +++++------- src/main/java/duke/command/DeleteCommand.java | 10 ++++++++-- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/src/main/java/duke/TaskManager.java b/src/main/java/duke/TaskManager.java index 08fe32ee1..2674d80c4 100644 --- a/src/main/java/duke/TaskManager.java +++ b/src/main/java/duke/TaskManager.java @@ -52,18 +52,16 @@ public static Task markTaskNoAsDone(int taskNo) { } public static int getTasklistSize() { - return taskNo; + return tasks.size(); } - public static Task[] getTasklist() { + public static ArrayList<Task> getTasklist() { return tasks; } - public static void deleteTask(int taskNo) { + public static Task deleteTask(int taskNo) { Task task = tasks.remove(taskNo); - - System.out.println("Noted. I've removed this task:"); - System.out.printf(" %s\n", task); - System.out.printf("Now you have %d tasks in the list.\n", tasks.size()); + Storage.exportData(); + return task; } } diff --git a/src/main/java/duke/command/DeleteCommand.java b/src/main/java/duke/command/DeleteCommand.java index 670e3c977..dd4890eea 100644 --- a/src/main/java/duke/command/DeleteCommand.java +++ b/src/main/java/duke/command/DeleteCommand.java @@ -1,6 +1,7 @@ package duke.command; import duke.TaskManager; +import duke.task.Task; public class DeleteCommand implements Command { public static final CommandType type = CommandType.DELETE; @@ -12,8 +13,13 @@ public DeleteCommand(int taskNo) { } @Override - public void run() { - TaskManager.deleteTask(taskNo); + public void run(boolean printMessage) { + Task task = TaskManager.deleteTask(taskNo); + if (printMessage) { + System.out.println("Noted. I've removed this task:"); + System.out.printf(" %s\n", task); + System.out.printf("Now you have %d tasks in the list.\n", TaskManager.getTasklistSize()); + } } @Override From b0e98c2f11538852a03825a15a5a5077aa17c180 Mon Sep 17 00:00:00 2001 From: flerovious <85042815+flerovious@users.noreply.github.com> Date: Fri, 1 Oct 2021 00:15:46 +0800 Subject: [PATCH 19/40] Add JavaDocs --- src/main/java/duke/CommandParser.java | 57 ++++++++++++------- src/main/java/duke/Duke.java | 10 ++++ src/main/java/duke/DukeException.java | 5 ++ src/main/java/duke/Storage.java | 36 +++++++++--- src/main/java/duke/TaskManager.java | 50 ++++++++++++++++ src/main/java/duke/command/Command.java | 10 ++++ .../java/duke/command/DeadlineCommand.java | 17 +++++- src/main/java/duke/command/DeleteCommand.java | 16 +++++- src/main/java/duke/command/DoneCommand.java | 15 ++++- src/main/java/duke/command/EventCommand.java | 17 +++++- src/main/java/duke/command/ExitCommand.java | 10 +++- .../java/duke/command/InvalidCommand.java | 11 +++- src/main/java/duke/command/ListCommand.java | 11 +++- src/main/java/duke/command/TodoCommand.java | 18 +++++- src/main/java/duke/task/Deadline.java | 19 ++++++- src/main/java/duke/task/Event.java | 19 ++++++- src/main/java/duke/task/Task.java | 2 +- src/main/java/duke/task/Todo.java | 18 +++++- 18 files changed, 293 insertions(+), 48 deletions(-) diff --git a/src/main/java/duke/CommandParser.java b/src/main/java/duke/CommandParser.java index a32c9f2de..c8fcc756c 100644 --- a/src/main/java/duke/CommandParser.java +++ b/src/main/java/duke/CommandParser.java @@ -1,43 +1,56 @@ package duke; -import duke.command.*; + +import duke.command.Command; +import duke.command.DoneCommand; +import duke.command.ExitCommand; +import duke.command.ListCommand; +import duke.command.TodoCommand; +import duke.command.DeadlineCommand; +import duke.command.EventCommand; +import duke.command.DeleteCommand; +import duke.command.InvalidCommand; public class CommandParser { - private static final String EXIT_CMD = "bye"; - private static final String LIST_CMD = "list"; - private static final String DONE_CMD = "done"; - private static final String TODO_CMD = "todo"; - private static final String DEADLINE_CMD = "deadline"; - private static final String EVENT_CMD = "event"; - private static final String DELETE_CMD = "delete"; + private static final String CMD_EXIT = "bye"; + private static final String CMD_LIST = "list"; + private static final String CMD_DONE = "done"; + private static final String CMD_TODO = "todo"; + private static final String CMD_DEADLINE = "deadline"; + private static final String CMD_EVENT = "event"; + private static final String CMD_DELETE = "delete"; - public static Command parse(String command) { - command = command.strip(); + /** + * @param input String input from user + * @return Command object corresponding to input command + */ + public static Command parse(String input) { + input = input.strip(); - if (command.equals(EXIT_CMD)) { + if (input.equals(CMD_EXIT)) { return new ExitCommand(); - } else if (command.equals(LIST_CMD)) { + } else if (input.equals(CMD_LIST)) { return new ListCommand(); - } else if (command.startsWith(DONE_CMD)) { - String parsedInput = command.split(" ")[1]; + } else if (input.startsWith(CMD_DONE)) { + String parsedInput = input.split(" ")[1]; int taskNo = Integer.parseInt(parsedInput); return new DoneCommand(taskNo - 1); - } else if (command.startsWith(TODO_CMD)) { - String parsedInput = command.replaceFirst(TODO_CMD, ""); + } else if (input.startsWith(CMD_TODO)) { + String parsedInput = input.replaceFirst(CMD_TODO, ""); String todo = parsedInput.strip(); return new TodoCommand(todo); - } else if (command.startsWith(DEADLINE_CMD)) { - String[] parsedInput = command.replaceFirst(DEADLINE_CMD, "").split("/by "); + } else if (input.startsWith(CMD_DEADLINE)) { + String[] parsedInput = input.replaceFirst(CMD_DEADLINE, "").split("/by "); String deadlineTitle = parsedInput[0].strip(); String deadlineDue = parsedInput[1].strip(); return new DeadlineCommand(deadlineTitle, deadlineDue); - } else if (command.startsWith(EVENT_CMD)) { - String[] parsedInput = command.replaceFirst(EVENT_CMD, "").split("/at "); + } else if (input.startsWith(CMD_EVENT)) { + String[] parsedInput = input.replaceFirst(CMD_EVENT, "").split("/at "); String eventTitle = parsedInput[0].strip(); String eventTime = parsedInput[1].strip(); return new EventCommand(eventTitle, eventTime); - } else if (command.startsWith(DELETE_CMD)) { - String parsedInput = command.split(" ")[1]; + } else if (input.startsWith(CMD_DELETE)) { + String parsedInput = input.split(" ")[1]; int taskNo = Integer.parseInt(parsedInput); return new DeleteCommand(taskNo - 1); } else { diff --git a/src/main/java/duke/Duke.java b/src/main/java/duke/Duke.java index 436ac458b..8dab55d60 100644 --- a/src/main/java/duke/Duke.java +++ b/src/main/java/duke/Duke.java @@ -13,11 +13,17 @@ public static void main(String[] args) { greetUserOnEnd(); } + /** + * Prints greeting message to user on startup + */ public static void greetUserOnStart() { System.out.println("Hello! I'm Duke"); System.out.println("What can I do for you?"); } + /** + * Retrieves data from backup (if any), then executes program until user exits with exit command + */ private static void executeDuke() { Storage.importData(); @@ -35,6 +41,10 @@ private static void executeDuke() { } } + + /** + * Prints greeting message to user on exit + */ public static void greetUserOnEnd() { System.out.println("Bye. Hope to see you again soon!"); } diff --git a/src/main/java/duke/DukeException.java b/src/main/java/duke/DukeException.java index 3fcd0f5ea..55378e376 100644 --- a/src/main/java/duke/DukeException.java +++ b/src/main/java/duke/DukeException.java @@ -1,6 +1,11 @@ package duke; public class DukeException extends Exception { + /** + * Class constructor for DukeException + * + * @param message Error message describing error + */ public DukeException(String message) { super(message); } diff --git a/src/main/java/duke/Storage.java b/src/main/java/duke/Storage.java index 7ec731aaf..c807ae8cc 100644 --- a/src/main/java/duke/Storage.java +++ b/src/main/java/duke/Storage.java @@ -1,9 +1,16 @@ package duke; -import duke.command.*; +import duke.command.Command; +import duke.command.DoneCommand; +import duke.command.TodoCommand; +import duke.command.DeadlineCommand; +import duke.command.EventCommand; import duke.task.Task; -import java.io.*; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileWriter; +import java.io.IOException; import java.util.Scanner; public class Storage { @@ -18,7 +25,9 @@ public class Storage { private static final String DELIMITER = "#&#"; private static final String NULL = "NULL"; - // load data from data file + /** + * Loads task data from DATA_FILE_NAME on startup + */ public static void importData() { try { File directory = new File(DATA_DIR_NAME); @@ -40,7 +49,9 @@ public static void importData() { } } - // save data into data file + /** + * Saves task data to DATA_FILE_NAME on exit + */ public static void exportData() { try { FileWriter fileWriter = new FileWriter(FILE_PATH); @@ -61,7 +72,13 @@ public static void exportData() { } } - // encode line into format <TaskType> <Status> <Title> <Time> + /** + * Converts Task object to String to be saved in data file + * + * @param task Task to be encoded to String used in data file + * @return String of format <TaskType> <Status> <Title> <Time> + * @throws DukeException If an invalid task type is found + */ private static String encodeLine(Task task) throws DukeException { String taskType = NULL; String status = NULL; @@ -87,10 +104,15 @@ private static String encodeLine(Task task) throws DukeException { status = task.getStatusIcon(); title = task.getName(); - return String.format("%s%s%s%s%s%s%s", taskType, DELIMITER, status, DELIMITER, title, DELIMITER, time); + return taskType + DELIMITER + status + DELIMITER + title + DELIMITER +time; } - // decode line of format <TaskType> <Status> <Title> <Time> + /** + * Converts String in data file to Task and loads it to TaskManager + * + * @param line String of format <TaskType> <Status> <Title> <Time> to be decoded to Task used in data file + * @throws DukeException If the String is invalid and does not have any associated Task object + */ private static void decodeLine(String line) throws DukeException { String[] data = line.split(DELIMITER); Command command; diff --git a/src/main/java/duke/TaskManager.java b/src/main/java/duke/TaskManager.java index 2674d80c4..bea74e179 100644 --- a/src/main/java/duke/TaskManager.java +++ b/src/main/java/duke/TaskManager.java @@ -10,11 +10,23 @@ public class TaskManager { private static final ArrayList<Task> tasks = new ArrayList<>(); + /** + * Adds Task to task list and saves addition to data file + * + * @param task Task object to be added + */ public static void addTask(Task task) { tasks.add(task); Storage.exportData(); } + /** + * Adds a todo to task list, saves changes to data file and returns newly added todo + * + * @param todoName Name of todo to be added to task list + * @return Newly added deadline + * @throws DukeException If todo was empty + */ public static Task addTodo(String todoName) throws DukeException { if (todoName.isEmpty()) { throw new DukeException("Todo cannot be empty"); @@ -24,18 +36,35 @@ public static Task addTodo(String todoName) throws DukeException { return todo; } + /** + * Adds a deadline to task list, saves changes to data file and returns newly added deadline + * + * @param deadlineName Name of deadline to be added to task list + * @param deadlineDue Due date of event to be added to task list + * @return Newly added deadline + */ public static Task addDeadline(String deadlineName, String deadlineDue) { Deadline deadline = new Deadline(deadlineName, deadlineDue); addTask(deadline); return deadline; } + /** + * Adds an event to task list, saves changes to data file and returns newly added event + * + * @param eventName Name of event to be added to task list + * @param eventTime Time of event to be added to task list + * @return Newly added event + */ public static Task addEvent(String eventName, String eventTime) { Event event = new Event(eventName, eventTime); addTask(event); return event; } + /** + * Prints list of Tasks in task list in a user friendly format + */ public static void listTasks() { System.out.println("Here are the tasks in your list:"); for (int i = 0; i < tasks.size(); ++i) { @@ -44,6 +73,12 @@ public static void listTasks() { } } + /** + * Marks Task at specified index as done, changes to data file and returns Task + * + * @param taskNo Index of completed task + * @return Returns completed Task + */ public static Task markTaskNoAsDone(int taskNo) { Task task = tasks.get(taskNo); task.markAsDone(); @@ -51,14 +86,29 @@ public static Task markTaskNoAsDone(int taskNo) { return task; } + /** + * @return Size of task list + */ public static int getTasklistSize() { return tasks.size(); } + /** + * Returns task list containing all tasks in memory + * + * @return Task list + */ public static ArrayList<Task> getTasklist() { return tasks; } + + /** + * Deletes Task at specified index, saves changes to data file and returns Task + * + * @param taskNo Index of task in task list + * @return Task that has been deleted + */ public static Task deleteTask(int taskNo) { Task task = tasks.remove(taskNo); Storage.exportData(); diff --git a/src/main/java/duke/command/Command.java b/src/main/java/duke/command/Command.java index 9b58f501a..4b6b6570d 100644 --- a/src/main/java/duke/command/Command.java +++ b/src/main/java/duke/command/Command.java @@ -3,7 +3,17 @@ import duke.DukeException; public interface Command { + + /** + * Interface that provides common functionality among all user input commands + * + * @param printMessage Print message to user on executing command + * @throws DukeException If exception is thrown by any of Command implementers + */ void run(boolean printMessage) throws DukeException; + /** + * @return Type of Command + */ CommandType getType(); } diff --git a/src/main/java/duke/command/DeadlineCommand.java b/src/main/java/duke/command/DeadlineCommand.java index c2a90e319..f4d6ee5cf 100644 --- a/src/main/java/duke/command/DeadlineCommand.java +++ b/src/main/java/duke/command/DeadlineCommand.java @@ -4,16 +4,26 @@ import duke.task.Task; public class DeadlineCommand implements Command { - public static final CommandType type = CommandType.DEADLINE; - + private static final CommandType type = CommandType.DEADLINE; private final String deadlineTitle; private final String deadlineDue; + /** + * Deadline command constructor + * + * @param deadlineTitle Title of deadline + * @param deadlineDue Due date of deadline + */ public DeadlineCommand(String deadlineTitle, String deadlineDue) { this.deadlineTitle = deadlineTitle; this.deadlineDue = deadlineDue; } + /** + * Adds deadline to task list and saves changes to data file + * + * @param printMessage Print message to user on executing command + */ @Override public void run(boolean printMessage) { Task task = TaskManager.addDeadline(deadlineTitle, deadlineDue); @@ -24,6 +34,9 @@ public void run(boolean printMessage) { } } + /** + * @return Type of command + */ @Override public CommandType getType() { return type; diff --git a/src/main/java/duke/command/DeleteCommand.java b/src/main/java/duke/command/DeleteCommand.java index dd4890eea..6ca949289 100644 --- a/src/main/java/duke/command/DeleteCommand.java +++ b/src/main/java/duke/command/DeleteCommand.java @@ -4,14 +4,23 @@ import duke.task.Task; public class DeleteCommand implements Command { - public static final CommandType type = CommandType.DELETE; - + private static final CommandType type = CommandType.DELETE; private final int taskNo; + /** + * Delete command constructor + * + * @param taskNo Task number of task stored in task list to be deleted + */ public DeleteCommand(int taskNo) { this.taskNo = taskNo; } + /** + * Deletes task in task list and saves changes to data file + * + * @param printMessage Print message to user on executing command + */ @Override public void run(boolean printMessage) { Task task = TaskManager.deleteTask(taskNo); @@ -22,6 +31,9 @@ public void run(boolean printMessage) { } } + /** + * @return Type of command + */ @Override public CommandType getType() { return type; diff --git a/src/main/java/duke/command/DoneCommand.java b/src/main/java/duke/command/DoneCommand.java index 8d88c00c8..fd68cd0e0 100644 --- a/src/main/java/duke/command/DoneCommand.java +++ b/src/main/java/duke/command/DoneCommand.java @@ -4,13 +4,23 @@ import duke.task.Task; public class DoneCommand implements Command { - public static final CommandType type = CommandType.DONE; + private static final CommandType type = CommandType.DONE; private final int taskNo; + /** + * Done command constructor + * + * @param taskNo Task number of task stored in task list to be marked as done + */ public DoneCommand(int taskNo) { this.taskNo = taskNo; } + /** + * Marks task at specified index of task list as done and saves changes to data file + * + * @param printMessage Print message to user on executing command + */ @Override public void run(boolean printMessage) { Task task = TaskManager.markTaskNoAsDone(taskNo); @@ -20,6 +30,9 @@ public void run(boolean printMessage) { } } + /** + * @return Type of command + */ @Override public CommandType getType() { return type; diff --git a/src/main/java/duke/command/EventCommand.java b/src/main/java/duke/command/EventCommand.java index e102982f8..f67730d66 100644 --- a/src/main/java/duke/command/EventCommand.java +++ b/src/main/java/duke/command/EventCommand.java @@ -4,16 +4,26 @@ import duke.task.Task; public class EventCommand implements Command { - public static final CommandType type = CommandType.EVENT; - + private static final CommandType type = CommandType.EVENT; private final String eventTitle; private final String eventTime; + /** + * Event command constructor + * + * @param eventTitle Title of event + * @param eventTime Time of event + */ public EventCommand(String eventTitle, String eventTime) { this.eventTitle = eventTitle; this.eventTime = eventTime; } + /** + * Adds event to task list and saves changes to data file + * + * @param printMessage Print message to user on executing command + */ @Override public void run(boolean printMessage) { Task task = TaskManager.addEvent(eventTitle, eventTime); @@ -24,6 +34,9 @@ public void run(boolean printMessage) { } } + /** + * @return Type of command + */ @Override public CommandType getType() { return type; diff --git a/src/main/java/duke/command/ExitCommand.java b/src/main/java/duke/command/ExitCommand.java index 6f25faaba..4595f379e 100644 --- a/src/main/java/duke/command/ExitCommand.java +++ b/src/main/java/duke/command/ExitCommand.java @@ -1,13 +1,21 @@ package duke.command; public class ExitCommand implements Command { - public static final CommandType type = CommandType.EXIT; + private static final CommandType type = CommandType.EXIT; + /** + * Exit command constructor + * + * @param printMessage Print message to user on executing command + */ @Override public void run(boolean printMessage) { System.out.println("Exited Duke. See you later."); } + /** + * @return Type of command + */ @Override public CommandType getType() { return type; diff --git a/src/main/java/duke/command/InvalidCommand.java b/src/main/java/duke/command/InvalidCommand.java index 996eeb815..fe1b0ef6a 100644 --- a/src/main/java/duke/command/InvalidCommand.java +++ b/src/main/java/duke/command/InvalidCommand.java @@ -3,13 +3,22 @@ import duke.DukeException; public class InvalidCommand implements Command { - public static final CommandType type = CommandType.INVALID; + private static final CommandType type = CommandType.INVALID; + /** + * Throws DukeException for running an invalid command + * + * @param printMessage Print message to user on executing command. Value is irrelevant + * @throws DukeException Thrown for running an invalid command + */ @Override public void run(boolean printMessage) throws DukeException { throw new DukeException("OOPS!!! I'm sorry, but I don't know what that means :-("); } + /** + * @return Type of command + */ @Override public CommandType getType() { return type; diff --git a/src/main/java/duke/command/ListCommand.java b/src/main/java/duke/command/ListCommand.java index 9bdd30506..e4fb76058 100644 --- a/src/main/java/duke/command/ListCommand.java +++ b/src/main/java/duke/command/ListCommand.java @@ -3,13 +3,22 @@ import duke.TaskManager; public class ListCommand implements Command { - public static final CommandType type = CommandType.LIST; + private static final CommandType type = CommandType.LIST; + /** + * Lists all Tasks in task list + * + * @param printMessage Print message to user on executing command. Value is irrelevant + * as values will be printed out anyways + */ @Override public void run(boolean printMessage) { TaskManager.listTasks(); } + /** + * @return Type of command + */ @Override public CommandType getType() { return type; diff --git a/src/main/java/duke/command/TodoCommand.java b/src/main/java/duke/command/TodoCommand.java index f72f55e4f..1e3e20d49 100644 --- a/src/main/java/duke/command/TodoCommand.java +++ b/src/main/java/duke/command/TodoCommand.java @@ -5,14 +5,25 @@ import duke.task.Task; public class TodoCommand implements Command { - public static final CommandType type = CommandType.TODO; - + private static final CommandType type = CommandType.TODO; private final String todo; + /** + * Todo command constructor + * + * @param todo Title of todo + */ public TodoCommand(String todo) { this.todo = todo; } + + /** + * Adds todo to task list and saves changes to data file + * + * @param printMessage Print message to user on executing command + * @throws DukeException If todo is empty + */ @Override public void run(boolean printMessage) throws DukeException { Task task = TaskManager.addTodo(todo); @@ -23,6 +34,9 @@ public void run(boolean printMessage) throws DukeException { } } + /** + * @return Type of command + */ @Override public CommandType getType() { return type; diff --git a/src/main/java/duke/task/Deadline.java b/src/main/java/duke/task/Deadline.java index 01efb0aed..9f7f02403 100644 --- a/src/main/java/duke/task/Deadline.java +++ b/src/main/java/duke/task/Deadline.java @@ -5,22 +5,37 @@ public class Deadline extends Task { private static final TaskType taskType = TaskType.DEADLINE; private final String dueDate; - public Deadline(String name, String dueDate) { - super(name); + /** + * Deadline constructor + * + * @param title Title of deadline + * @param dueDate Due date of deadline + */ + public Deadline(String title, String dueDate) { + super(title); this.dueDate = dueDate; } + /** + * @return Type of Task + */ @Override public TaskType getTaskType() { return taskType; } + /** + * @return String representation of Deadline for display + */ @Override public String toString() { String SYMBOL = "D"; return "[" + SYMBOL + "]" + super.toString() + " (by: " + dueDate + ")"; } + /** + * @return Due date of Deadline + */ @Override public String getTime() { return dueDate; diff --git a/src/main/java/duke/task/Event.java b/src/main/java/duke/task/Event.java index 0d53f40c2..23e6ef1da 100644 --- a/src/main/java/duke/task/Event.java +++ b/src/main/java/duke/task/Event.java @@ -4,22 +4,37 @@ public class Event extends Task { private static final TaskType taskType = TaskType.EVENT; private final String timeslot; - public Event(String name, String timeslot) { - super(name); + /** + * Event constructor + * + * @param title Title of event + * @param timeslot Time of event + */ + public Event(String title, String timeslot) { + super(title); this.timeslot = timeslot; } + /** + * @return Type of Task + */ @Override public TaskType getTaskType() { return taskType; } + /** + * @return String representation of Event for display + */ @Override public String toString() { String SYMBOL = "E"; return "[" + SYMBOL + "]" + super.toString() + " (at: " + timeslot + ")"; } + /** + * @return Time of Event + */ @Override public String getTime() { return timeslot; diff --git a/src/main/java/duke/task/Task.java b/src/main/java/duke/task/Task.java index c20028ee8..5d8cfd09e 100644 --- a/src/main/java/duke/task/Task.java +++ b/src/main/java/duke/task/Task.java @@ -1,7 +1,7 @@ package duke.task; public abstract class Task { - final private String name; + private final String name; private Boolean isDone; public Task(String name) { diff --git a/src/main/java/duke/task/Todo.java b/src/main/java/duke/task/Todo.java index ad95cc535..c35f800ed 100644 --- a/src/main/java/duke/task/Todo.java +++ b/src/main/java/duke/task/Todo.java @@ -3,21 +3,35 @@ public class Todo extends Task { private static final TaskType taskType = TaskType.TODO; - public Todo(String name) { - super(name); + /** + * Todo constructor + * + * @param title Title of todo + */ + public Todo(String title) { + super(title); } + /** + * @return Type of Task + */ @Override public TaskType getTaskType() { return taskType; } + /** + * @return String representation of Todo for display + */ @Override public String toString() { String SYMBOL = "T"; return "[" + SYMBOL + "]" + super.toString(); } + /** + * @return Null since Todo does not have any time associated with it + */ @Override public String getTime() { return null; From ee08d39dafcc6a6390446bef4e85098f156aadbf Mon Sep 17 00:00:00 2001 From: flerovious <85042815+flerovious@users.noreply.github.com> Date: Fri, 1 Oct 2021 00:50:41 +0800 Subject: [PATCH 20/40] Add Ui class for user interactions --- src/main/java/duke/Duke.java | 20 +---- src/main/java/duke/Storage.java | 2 +- src/main/java/duke/TaskManager.java | 9 +-- src/main/java/duke/Ui.java | 73 +++++++++++++++++++ .../java/duke/command/DeadlineCommand.java | 5 +- src/main/java/duke/command/DeleteCommand.java | 5 +- src/main/java/duke/command/DoneCommand.java | 4 +- src/main/java/duke/command/EventCommand.java | 5 +- src/main/java/duke/command/ExitCommand.java | 4 +- src/main/java/duke/command/TodoCommand.java | 5 +- 10 files changed, 91 insertions(+), 41 deletions(-) create mode 100644 src/main/java/duke/Ui.java diff --git a/src/main/java/duke/Duke.java b/src/main/java/duke/Duke.java index 8dab55d60..00a7b3f20 100644 --- a/src/main/java/duke/Duke.java +++ b/src/main/java/duke/Duke.java @@ -8,17 +8,9 @@ public class Duke { public static void main(String[] args) { - greetUserOnStart(); + Ui.greetUserOnStart(); executeDuke(); - greetUserOnEnd(); - } - - /** - * Prints greeting message to user on startup - */ - public static void greetUserOnStart() { - System.out.println("Hello! I'm Duke"); - System.out.println("What can I do for you?"); + Ui.greetUserOnEnd(); } /** @@ -40,12 +32,4 @@ private static void executeDuke() { command = CommandParser.parse(input); } } - - - /** - * Prints greeting message to user on exit - */ - public static void greetUserOnEnd() { - System.out.println("Bye. Hope to see you again soon!"); - } } diff --git a/src/main/java/duke/Storage.java b/src/main/java/duke/Storage.java index c807ae8cc..75b0b7955 100644 --- a/src/main/java/duke/Storage.java +++ b/src/main/java/duke/Storage.java @@ -26,7 +26,7 @@ public class Storage { private static final String NULL = "NULL"; /** - * Loads task data from DATA_FILE_NAME on startup + * Loads task data from FILE_PATH on startup */ public static void importData() { try { diff --git a/src/main/java/duke/TaskManager.java b/src/main/java/duke/TaskManager.java index bea74e179..7e7bbfc21 100644 --- a/src/main/java/duke/TaskManager.java +++ b/src/main/java/duke/TaskManager.java @@ -4,7 +4,6 @@ import duke.task.Event; import duke.task.Task; import duke.task.Todo; - import java.util.ArrayList; public class TaskManager { @@ -63,14 +62,10 @@ public static Task addEvent(String eventName, String eventTime) { } /** - * Prints list of Tasks in task list in a user friendly format + * Prints list of Tasks in task list in a user-friendly format */ public static void listTasks() { - System.out.println("Here are the tasks in your list:"); - for (int i = 0; i < tasks.size(); ++i) { - Task task = tasks.get(i); - System.out.printf("%d. %s\n", i + 1, task); - } + Ui.printTaskList(tasks); } /** diff --git a/src/main/java/duke/Ui.java b/src/main/java/duke/Ui.java new file mode 100644 index 000000000..d9adb9008 --- /dev/null +++ b/src/main/java/duke/Ui.java @@ -0,0 +1,73 @@ +package duke; + +import duke.task.Task; + +import java.util.ArrayList; + +public class Ui { + private static final String INDENT = " "; + + /** + * Print confirmation message to user that task has been added successfully to task list + * + * @param task Task that has been added to task list + */ + public static void printTaskAddedMessage(Task task) { + System.out.println("Got it. I've added this task:"); + System.out.println(INDENT + task); + System.out.printf("Now you have %d tasks in the list.", TaskManager.getTasklistSize()); + System.out.println(); + } + + /** + * Print confirmation message to user that task has been removed successfully from task list + * + * @param task Task that has been deleted from task list + */ + public static void printTaskDeletedMessage(Task task) { + System.out.println("Noted. I've removed this task:"); + System.out.println(INDENT + task); + System.out.printf("Now you have %d tasks in the list", TaskManager.getTasklistSize()); + System.out.println(); + } + + /** + * Print confirmation message to user that task has been marked as done + * + * @param task Task in task list that has been marked as done + */ + public static void printTaskDoneMessage(Task task) { + System.out.println("Nice! I've marked this task as done:"); + System.out.println(INDENT + task); + } + + + /** + * Prints list of Tasks in task list in a user-friendly format + * + * @param tasks Task list to be printed + */ + public static void printTaskList(ArrayList<Task> tasks) { + System.out.println("Here are the tasks in your list:"); + for (int i = 0; i < tasks.size(); ++i) { + Task task = tasks.get(i); + System.out.printf("%d. %s", i + 1, task); + System.out.println(); + } + } + + /** + * Prints greeting message to user on exit + */ + public static void greetUserOnEnd() { + System.out.println("Bye. Hope to see you again soon!"); + } + + /** + * Prints greeting message to user on startup + */ + public static void greetUserOnStart() { + System.out.println("Hello! I'm Duke"); + System.out.println("What can I do for you?"); + } +} diff --git a/src/main/java/duke/command/DeadlineCommand.java b/src/main/java/duke/command/DeadlineCommand.java index f4d6ee5cf..73841f516 100644 --- a/src/main/java/duke/command/DeadlineCommand.java +++ b/src/main/java/duke/command/DeadlineCommand.java @@ -2,6 +2,7 @@ import duke.TaskManager; import duke.task.Task; +import duke.Ui; public class DeadlineCommand implements Command { private static final CommandType type = CommandType.DEADLINE; @@ -28,9 +29,7 @@ public DeadlineCommand(String deadlineTitle, String deadlineDue) { public void run(boolean printMessage) { Task task = TaskManager.addDeadline(deadlineTitle, deadlineDue); if (printMessage) { - System.out.print("Got it. I've added this task:\n"); - System.out.printf(" %s\n", task); - System.out.printf("Now you have %d tasks in the list.\n", TaskManager.getTasklistSize()); + Ui.printTaskAddedMessage(task); } } diff --git a/src/main/java/duke/command/DeleteCommand.java b/src/main/java/duke/command/DeleteCommand.java index 6ca949289..b7cb788ee 100644 --- a/src/main/java/duke/command/DeleteCommand.java +++ b/src/main/java/duke/command/DeleteCommand.java @@ -1,6 +1,7 @@ package duke.command; import duke.TaskManager; +import duke.Ui; import duke.task.Task; public class DeleteCommand implements Command { @@ -25,9 +26,7 @@ public DeleteCommand(int taskNo) { public void run(boolean printMessage) { Task task = TaskManager.deleteTask(taskNo); if (printMessage) { - System.out.println("Noted. I've removed this task:"); - System.out.printf(" %s\n", task); - System.out.printf("Now you have %d tasks in the list.\n", TaskManager.getTasklistSize()); + Ui.printTaskDeletedMessage(task); } } diff --git a/src/main/java/duke/command/DoneCommand.java b/src/main/java/duke/command/DoneCommand.java index fd68cd0e0..fb95d8984 100644 --- a/src/main/java/duke/command/DoneCommand.java +++ b/src/main/java/duke/command/DoneCommand.java @@ -1,6 +1,7 @@ package duke.command; import duke.TaskManager; +import duke.Ui; import duke.task.Task; public class DoneCommand implements Command { @@ -25,8 +26,7 @@ public DoneCommand(int taskNo) { public void run(boolean printMessage) { Task task = TaskManager.markTaskNoAsDone(taskNo); if (printMessage) { - System.out.println("Nice! I've marked this task as done:"); - System.out.printf(" %s\n", task); + Ui.printTaskDoneMessage(task); } } diff --git a/src/main/java/duke/command/EventCommand.java b/src/main/java/duke/command/EventCommand.java index f67730d66..744708f34 100644 --- a/src/main/java/duke/command/EventCommand.java +++ b/src/main/java/duke/command/EventCommand.java @@ -1,6 +1,7 @@ package duke.command; import duke.TaskManager; +import duke.Ui; import duke.task.Task; public class EventCommand implements Command { @@ -28,9 +29,7 @@ public EventCommand(String eventTitle, String eventTime) { public void run(boolean printMessage) { Task task = TaskManager.addEvent(eventTitle, eventTime); if (printMessage) { - System.out.print("Got it. I've added this task:\n"); - System.out.printf(" %s\n", task); - System.out.printf("Now you have %d tasks in the list.\n", TaskManager.getTasklistSize()); + Ui.printTaskAddedMessage(task); } } diff --git a/src/main/java/duke/command/ExitCommand.java b/src/main/java/duke/command/ExitCommand.java index 4595f379e..8e2b39073 100644 --- a/src/main/java/duke/command/ExitCommand.java +++ b/src/main/java/duke/command/ExitCommand.java @@ -1,5 +1,7 @@ package duke.command; +import duke.Ui; + public class ExitCommand implements Command { private static final CommandType type = CommandType.EXIT; @@ -10,7 +12,7 @@ public class ExitCommand implements Command { */ @Override public void run(boolean printMessage) { - System.out.println("Exited Duke. See you later."); + Ui.greetUserOnEnd(); } /** diff --git a/src/main/java/duke/command/TodoCommand.java b/src/main/java/duke/command/TodoCommand.java index 1e3e20d49..9c9f0b903 100644 --- a/src/main/java/duke/command/TodoCommand.java +++ b/src/main/java/duke/command/TodoCommand.java @@ -2,6 +2,7 @@ import duke.DukeException; import duke.TaskManager; +import duke.Ui; import duke.task.Task; public class TodoCommand implements Command { @@ -28,9 +29,7 @@ public TodoCommand(String todo) { public void run(boolean printMessage) throws DukeException { Task task = TaskManager.addTodo(todo); if (printMessage) { - System.out.print("Got it. I've added this task:\n"); - System.out.printf(" %s\n", task); - System.out.printf("Now you have %d tasks in the list.\n", TaskManager.getTasklistSize()); + Ui.printTaskAddedMessage(task); } } From 603a7188936acf08db2749337e73e4616ba355ef Mon Sep 17 00:00:00 2001 From: flerovious <85042815+flerovious@users.noreply.github.com> Date: Fri, 1 Oct 2021 00:51:56 +0800 Subject: [PATCH 21/40] Refactor TaskList --- src/main/java/duke/Storage.java | 4 ++-- src/main/java/duke/{TaskManager.java => TaskList.java} | 2 +- src/main/java/duke/Ui.java | 4 ++-- src/main/java/duke/command/DeadlineCommand.java | 4 ++-- src/main/java/duke/command/DeleteCommand.java | 4 ++-- src/main/java/duke/command/DoneCommand.java | 4 ++-- src/main/java/duke/command/EventCommand.java | 4 ++-- src/main/java/duke/command/ListCommand.java | 4 ++-- src/main/java/duke/command/TodoCommand.java | 4 ++-- 9 files changed, 17 insertions(+), 17 deletions(-) rename src/main/java/duke/{TaskManager.java => TaskList.java} (99%) diff --git a/src/main/java/duke/Storage.java b/src/main/java/duke/Storage.java index 75b0b7955..fb54589cc 100644 --- a/src/main/java/duke/Storage.java +++ b/src/main/java/duke/Storage.java @@ -55,7 +55,7 @@ public static void importData() { public static void exportData() { try { FileWriter fileWriter = new FileWriter(FILE_PATH); - for (Task task : TaskManager.getTasklist()) { + for (Task task : TaskList.getTasklist()) { if (task == null) { break; } @@ -144,7 +144,7 @@ private static void decodeLine(String line) throws DukeException { // mark most recent task as done if (status.equals(DONE)) { - int taskNo = TaskManager.getTasklistSize(); + int taskNo = TaskList.getTasklistSize(); command = new DoneCommand(taskNo - 1); command.run(false); } diff --git a/src/main/java/duke/TaskManager.java b/src/main/java/duke/TaskList.java similarity index 99% rename from src/main/java/duke/TaskManager.java rename to src/main/java/duke/TaskList.java index 7e7bbfc21..2673aa9e2 100644 --- a/src/main/java/duke/TaskManager.java +++ b/src/main/java/duke/TaskList.java @@ -6,7 +6,7 @@ import duke.task.Todo; import java.util.ArrayList; -public class TaskManager { +public class TaskList { private static final ArrayList<Task> tasks = new ArrayList<>(); /** diff --git a/src/main/java/duke/Ui.java b/src/main/java/duke/Ui.java index d9adb9008..799e43f56 100644 --- a/src/main/java/duke/Ui.java +++ b/src/main/java/duke/Ui.java @@ -15,7 +15,7 @@ public class Ui { public static void printTaskAddedMessage(Task task) { System.out.println("Got it. I've added this task:"); System.out.println(INDENT + task); - System.out.printf("Now you have %d tasks in the list.", TaskManager.getTasklistSize()); + System.out.printf("Now you have %d tasks in the list.", TaskList.getTasklistSize()); System.out.println(); } @@ -27,7 +27,7 @@ public static void printTaskAddedMessage(Task task) { public static void printTaskDeletedMessage(Task task) { System.out.println("Noted. I've removed this task:"); System.out.println(INDENT + task); - System.out.printf("Now you have %d tasks in the list", TaskManager.getTasklistSize()); + System.out.printf("Now you have %d tasks in the list", TaskList.getTasklistSize()); System.out.println(); } diff --git a/src/main/java/duke/command/DeadlineCommand.java b/src/main/java/duke/command/DeadlineCommand.java index 73841f516..0ad660703 100644 --- a/src/main/java/duke/command/DeadlineCommand.java +++ b/src/main/java/duke/command/DeadlineCommand.java @@ -1,6 +1,6 @@ package duke.command; -import duke.TaskManager; +import duke.TaskList; import duke.task.Task; import duke.Ui; @@ -27,7 +27,7 @@ public DeadlineCommand(String deadlineTitle, String deadlineDue) { */ @Override public void run(boolean printMessage) { - Task task = TaskManager.addDeadline(deadlineTitle, deadlineDue); + Task task = TaskList.addDeadline(deadlineTitle, deadlineDue); if (printMessage) { Ui.printTaskAddedMessage(task); } diff --git a/src/main/java/duke/command/DeleteCommand.java b/src/main/java/duke/command/DeleteCommand.java index b7cb788ee..e834b04a0 100644 --- a/src/main/java/duke/command/DeleteCommand.java +++ b/src/main/java/duke/command/DeleteCommand.java @@ -1,6 +1,6 @@ package duke.command; -import duke.TaskManager; +import duke.TaskList; import duke.Ui; import duke.task.Task; @@ -24,7 +24,7 @@ public DeleteCommand(int taskNo) { */ @Override public void run(boolean printMessage) { - Task task = TaskManager.deleteTask(taskNo); + Task task = TaskList.deleteTask(taskNo); if (printMessage) { Ui.printTaskDeletedMessage(task); } diff --git a/src/main/java/duke/command/DoneCommand.java b/src/main/java/duke/command/DoneCommand.java index fb95d8984..719ed403d 100644 --- a/src/main/java/duke/command/DoneCommand.java +++ b/src/main/java/duke/command/DoneCommand.java @@ -1,6 +1,6 @@ package duke.command; -import duke.TaskManager; +import duke.TaskList; import duke.Ui; import duke.task.Task; @@ -24,7 +24,7 @@ public DoneCommand(int taskNo) { */ @Override public void run(boolean printMessage) { - Task task = TaskManager.markTaskNoAsDone(taskNo); + Task task = TaskList.markTaskNoAsDone(taskNo); if (printMessage) { Ui.printTaskDoneMessage(task); } diff --git a/src/main/java/duke/command/EventCommand.java b/src/main/java/duke/command/EventCommand.java index 744708f34..bb674e338 100644 --- a/src/main/java/duke/command/EventCommand.java +++ b/src/main/java/duke/command/EventCommand.java @@ -1,6 +1,6 @@ package duke.command; -import duke.TaskManager; +import duke.TaskList; import duke.Ui; import duke.task.Task; @@ -27,7 +27,7 @@ public EventCommand(String eventTitle, String eventTime) { */ @Override public void run(boolean printMessage) { - Task task = TaskManager.addEvent(eventTitle, eventTime); + Task task = TaskList.addEvent(eventTitle, eventTime); if (printMessage) { Ui.printTaskAddedMessage(task); } diff --git a/src/main/java/duke/command/ListCommand.java b/src/main/java/duke/command/ListCommand.java index e4fb76058..86cc199cf 100644 --- a/src/main/java/duke/command/ListCommand.java +++ b/src/main/java/duke/command/ListCommand.java @@ -1,6 +1,6 @@ package duke.command; -import duke.TaskManager; +import duke.TaskList; public class ListCommand implements Command { private static final CommandType type = CommandType.LIST; @@ -13,7 +13,7 @@ public class ListCommand implements Command { */ @Override public void run(boolean printMessage) { - TaskManager.listTasks(); + TaskList.listTasks(); } /** diff --git a/src/main/java/duke/command/TodoCommand.java b/src/main/java/duke/command/TodoCommand.java index 9c9f0b903..353e62627 100644 --- a/src/main/java/duke/command/TodoCommand.java +++ b/src/main/java/duke/command/TodoCommand.java @@ -1,7 +1,7 @@ package duke.command; import duke.DukeException; -import duke.TaskManager; +import duke.TaskList; import duke.Ui; import duke.task.Task; @@ -27,7 +27,7 @@ public TodoCommand(String todo) { */ @Override public void run(boolean printMessage) throws DukeException { - Task task = TaskManager.addTodo(todo); + Task task = TaskList.addTodo(todo); if (printMessage) { Ui.printTaskAddedMessage(task); } From ea0d5eb7868056b9dbb37b936c46eef97d81fe54 Mon Sep 17 00:00:00 2001 From: flerovious <85042815+flerovious@users.noreply.github.com> Date: Fri, 1 Oct 2021 00:52:34 +0800 Subject: [PATCH 22/40] Refactor Parser --- src/main/java/duke/Duke.java | 4 ++-- src/main/java/duke/{CommandParser.java => Parser.java} | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) rename src/main/java/duke/{CommandParser.java => Parser.java} (98%) diff --git a/src/main/java/duke/Duke.java b/src/main/java/duke/Duke.java index 00a7b3f20..2b88c5de1 100644 --- a/src/main/java/duke/Duke.java +++ b/src/main/java/duke/Duke.java @@ -21,7 +21,7 @@ private static void executeDuke() { Scanner in = new Scanner(System.in); String input = in.nextLine(); - Command command = CommandParser.parse(input); + Command command = Parser.parse(input); while (command.getType() != CommandType.EXIT) { try { command.run(true); @@ -29,7 +29,7 @@ private static void executeDuke() { System.out.println(e.getMessage()); } input = in.nextLine(); - command = CommandParser.parse(input); + command = Parser.parse(input); } } } diff --git a/src/main/java/duke/CommandParser.java b/src/main/java/duke/Parser.java similarity index 98% rename from src/main/java/duke/CommandParser.java rename to src/main/java/duke/Parser.java index c8fcc756c..fa63cbfe0 100644 --- a/src/main/java/duke/CommandParser.java +++ b/src/main/java/duke/Parser.java @@ -11,7 +11,7 @@ import duke.command.DeleteCommand; import duke.command.InvalidCommand; -public class CommandParser { +public class Parser { private static final String CMD_EXIT = "bye"; private static final String CMD_LIST = "list"; private static final String CMD_DONE = "done"; From 77532324a9575c9180be64728f95595822924224 Mon Sep 17 00:00:00 2001 From: flerovious <85042815+flerovious@users.noreply.github.com> Date: Fri, 1 Oct 2021 01:54:42 +0800 Subject: [PATCH 23/40] Add LocalDate to Deadline and Event --- src/main/java/duke/Parser.java | 30 ++++++++++++++----- src/main/java/duke/Storage.java | 6 ++-- src/main/java/duke/TaskList.java | 6 ++-- .../java/duke/command/DeadlineCommand.java | 7 +++-- src/main/java/duke/command/EventCommand.java | 6 ++-- src/main/java/duke/task/Deadline.java | 21 +++++++++---- src/main/java/duke/task/Event.java | 21 +++++++++---- src/main/java/duke/task/Task.java | 2 ++ src/main/java/duke/task/Todo.java | 8 +++++ 9 files changed, 79 insertions(+), 28 deletions(-) diff --git a/src/main/java/duke/Parser.java b/src/main/java/duke/Parser.java index fa63cbfe0..c4eb22337 100644 --- a/src/main/java/duke/Parser.java +++ b/src/main/java/duke/Parser.java @@ -11,6 +11,8 @@ import duke.command.DeleteCommand; import duke.command.InvalidCommand; +import java.time.format.DateTimeParseException; + public class Parser { private static final String CMD_EXIT = "bye"; private static final String CMD_LIST = "list"; @@ -26,35 +28,47 @@ public class Parser { */ public static Command parse(String input) { input = input.strip(); + Command command; if (input.equals(CMD_EXIT)) { - return new ExitCommand(); + command = new ExitCommand(); } else if (input.equals(CMD_LIST)) { - return new ListCommand(); + command = new ListCommand(); } else if (input.startsWith(CMD_DONE)) { String parsedInput = input.split(" ")[1]; int taskNo = Integer.parseInt(parsedInput); - return new DoneCommand(taskNo - 1); + command = new DoneCommand(taskNo - 1); } else if (input.startsWith(CMD_TODO)) { String parsedInput = input.replaceFirst(CMD_TODO, ""); String todo = parsedInput.strip(); - return new TodoCommand(todo); + command = new TodoCommand(todo); } else if (input.startsWith(CMD_DEADLINE)) { String[] parsedInput = input.replaceFirst(CMD_DEADLINE, "").split("/by "); String deadlineTitle = parsedInput[0].strip(); String deadlineDue = parsedInput[1].strip(); - return new DeadlineCommand(deadlineTitle, deadlineDue); + try { + command = new DeadlineCommand(deadlineTitle, deadlineDue); + } catch (DateTimeParseException e) { + System.out.println("Deadline must be in format of yyyy-mm-dd"); + command = new InvalidCommand(); + } } else if (input.startsWith(CMD_EVENT)) { String[] parsedInput = input.replaceFirst(CMD_EVENT, "").split("/at "); String eventTitle = parsedInput[0].strip(); String eventTime = parsedInput[1].strip(); - return new EventCommand(eventTitle, eventTime); + try { + command = new EventCommand(eventTitle, eventTime); + } catch (DateTimeParseException e) { + System.out.println("Event must be in format of yyyy-mm-dd"); + command = new InvalidCommand(); + } } else if (input.startsWith(CMD_DELETE)) { String parsedInput = input.split(" ")[1]; int taskNo = Integer.parseInt(parsedInput); - return new DeleteCommand(taskNo - 1); + command = new DeleteCommand(taskNo - 1); } else { - return new InvalidCommand(); + command = new InvalidCommand(); } + return command; } } diff --git a/src/main/java/duke/Storage.java b/src/main/java/duke/Storage.java index fb54589cc..406dabce9 100644 --- a/src/main/java/duke/Storage.java +++ b/src/main/java/duke/Storage.java @@ -91,11 +91,11 @@ private static String encodeLine(Task task) throws DukeException { break; case DEADLINE: taskType = DEADLINE_CODE; - time = task.getTime(); + time = task.getStandardTime(); break; case EVENT: taskType = EVENT_CODE; - time = task.getTime(); + time = task.getStandardTime(); break; default: throw new DukeException("Invalid task found in tasklist"); @@ -104,7 +104,7 @@ private static String encodeLine(Task task) throws DukeException { status = task.getStatusIcon(); title = task.getName(); - return taskType + DELIMITER + status + DELIMITER + title + DELIMITER +time; + return taskType + DELIMITER + status + DELIMITER + title + DELIMITER + time; } /** diff --git a/src/main/java/duke/TaskList.java b/src/main/java/duke/TaskList.java index 2673aa9e2..026c58c74 100644 --- a/src/main/java/duke/TaskList.java +++ b/src/main/java/duke/TaskList.java @@ -4,6 +4,8 @@ import duke.task.Event; import duke.task.Task; import duke.task.Todo; + +import java.time.LocalDate; import java.util.ArrayList; public class TaskList { @@ -42,7 +44,7 @@ public static Task addTodo(String todoName) throws DukeException { * @param deadlineDue Due date of event to be added to task list * @return Newly added deadline */ - public static Task addDeadline(String deadlineName, String deadlineDue) { + public static Task addDeadline(String deadlineName, LocalDate deadlineDue) { Deadline deadline = new Deadline(deadlineName, deadlineDue); addTask(deadline); return deadline; @@ -55,7 +57,7 @@ public static Task addDeadline(String deadlineName, String deadlineDue) { * @param eventTime Time of event to be added to task list * @return Newly added event */ - public static Task addEvent(String eventName, String eventTime) { + public static Task addEvent(String eventName, LocalDate eventTime) { Event event = new Event(eventName, eventTime); addTask(event); return event; diff --git a/src/main/java/duke/command/DeadlineCommand.java b/src/main/java/duke/command/DeadlineCommand.java index 0ad660703..409cda22f 100644 --- a/src/main/java/duke/command/DeadlineCommand.java +++ b/src/main/java/duke/command/DeadlineCommand.java @@ -3,21 +3,22 @@ import duke.TaskList; import duke.task.Task; import duke.Ui; +import java.time.LocalDate; public class DeadlineCommand implements Command { private static final CommandType type = CommandType.DEADLINE; private final String deadlineTitle; - private final String deadlineDue; + private final LocalDate deadlineDue; /** * Deadline command constructor * * @param deadlineTitle Title of deadline - * @param deadlineDue Due date of deadline + * @param deadlineDue Due date of deadline in yyyy-mm-dd format */ public DeadlineCommand(String deadlineTitle, String deadlineDue) { this.deadlineTitle = deadlineTitle; - this.deadlineDue = deadlineDue; + this.deadlineDue = LocalDate.parse(deadlineDue); } /** diff --git a/src/main/java/duke/command/EventCommand.java b/src/main/java/duke/command/EventCommand.java index bb674e338..abf3afbf3 100644 --- a/src/main/java/duke/command/EventCommand.java +++ b/src/main/java/duke/command/EventCommand.java @@ -4,10 +4,12 @@ import duke.Ui; import duke.task.Task; +import java.time.LocalDate; + public class EventCommand implements Command { private static final CommandType type = CommandType.EVENT; private final String eventTitle; - private final String eventTime; + private final LocalDate eventTime; /** * Event command constructor @@ -17,7 +19,7 @@ public class EventCommand implements Command { */ public EventCommand(String eventTitle, String eventTime) { this.eventTitle = eventTitle; - this.eventTime = eventTime; + this.eventTime = LocalDate.parse(eventTime); } /** diff --git a/src/main/java/duke/task/Deadline.java b/src/main/java/duke/task/Deadline.java index 9f7f02403..ab744234a 100644 --- a/src/main/java/duke/task/Deadline.java +++ b/src/main/java/duke/task/Deadline.java @@ -1,9 +1,12 @@ package duke.task; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; + public class Deadline extends Task { private static final TaskType taskType = TaskType.DEADLINE; - private final String dueDate; + private final LocalDate dueDate; /** * Deadline constructor @@ -11,7 +14,7 @@ public class Deadline extends Task { * @param title Title of deadline * @param dueDate Due date of deadline */ - public Deadline(String title, String dueDate) { + public Deadline(String title, LocalDate dueDate) { super(title); this.dueDate = dueDate; } @@ -30,14 +33,22 @@ public TaskType getTaskType() { @Override public String toString() { String SYMBOL = "D"; - return "[" + SYMBOL + "]" + super.toString() + " (by: " + dueDate + ")"; + return "[" + SYMBOL + "]" + super.toString() + " (by: " + getTime() + ")"; + } + + /** + * @return Due date of Deadline in yyyy-mm-dd format + */ + @Override + public String getStandardTime() { + return dueDate.toString(); } /** - * @return Due date of Deadline + * @return Due date of Deadline in MMM dd yyyy format */ @Override public String getTime() { - return dueDate; + return dueDate.format(DateTimeFormatter.ofPattern("MMM dd yyyy")); } } diff --git a/src/main/java/duke/task/Event.java b/src/main/java/duke/task/Event.java index 23e6ef1da..ccf5c909b 100644 --- a/src/main/java/duke/task/Event.java +++ b/src/main/java/duke/task/Event.java @@ -1,8 +1,11 @@ package duke.task; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; + public class Event extends Task { private static final TaskType taskType = TaskType.EVENT; - private final String timeslot; + private final LocalDate timeslot; /** * Event constructor @@ -10,7 +13,7 @@ public class Event extends Task { * @param title Title of event * @param timeslot Time of event */ - public Event(String title, String timeslot) { + public Event(String title, LocalDate timeslot) { super(title); this.timeslot = timeslot; } @@ -29,14 +32,22 @@ public TaskType getTaskType() { @Override public String toString() { String SYMBOL = "E"; - return "[" + SYMBOL + "]" + super.toString() + " (at: " + timeslot + ")"; + return "[" + SYMBOL + "]" + super.toString() + " (at: " + getTime() + ")"; + } + + /** + * @return Due date of Deadline in yyyy-mm-dd format + */ + @Override + public String getStandardTime() { + return timeslot.toString(); } /** - * @return Time of Event + * @return Due date of Deadline in MMM dd yyyy format */ @Override public String getTime() { - return timeslot; + return timeslot.format(DateTimeFormatter.ofPattern("MMM dd yyyy")); } } diff --git a/src/main/java/duke/task/Task.java b/src/main/java/duke/task/Task.java index 5d8cfd09e..461d714b7 100644 --- a/src/main/java/duke/task/Task.java +++ b/src/main/java/duke/task/Task.java @@ -29,4 +29,6 @@ public void markAsDone() { public String toString() { return "[" + getStatusIcon() + "] " + getName(); } + + public abstract String getStandardTime(); } diff --git a/src/main/java/duke/task/Todo.java b/src/main/java/duke/task/Todo.java index c35f800ed..9800134df 100644 --- a/src/main/java/duke/task/Todo.java +++ b/src/main/java/duke/task/Todo.java @@ -29,6 +29,14 @@ public String toString() { return "[" + SYMBOL + "]" + super.toString(); } + /** + * @return Null since Todo does not have any time associated with it + */ + @Override + public String getStandardTime() { + return null; + } + /** * @return Null since Todo does not have any time associated with it */ From 133254d73000582d3c1d3b3be88b48029f390e08 Mon Sep 17 00:00:00 2001 From: flerovious <85042815+flerovious@users.noreply.github.com> Date: Fri, 1 Oct 2021 01:59:11 +0800 Subject: [PATCH 24/40] Update InvalidCommand Add message parameter for InvalidCommand to throw DukeException with specified error message --- src/main/java/duke/Parser.java | 8 +++----- src/main/java/duke/command/InvalidCommand.java | 7 ++++++- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/main/java/duke/Parser.java b/src/main/java/duke/Parser.java index c4eb22337..6fc1f0adc 100644 --- a/src/main/java/duke/Parser.java +++ b/src/main/java/duke/Parser.java @@ -49,8 +49,7 @@ public static Command parse(String input) { try { command = new DeadlineCommand(deadlineTitle, deadlineDue); } catch (DateTimeParseException e) { - System.out.println("Deadline must be in format of yyyy-mm-dd"); - command = new InvalidCommand(); + command = new InvalidCommand("Deadline must be in format of yyyy-mm-dd"); } } else if (input.startsWith(CMD_EVENT)) { String[] parsedInput = input.replaceFirst(CMD_EVENT, "").split("/at "); @@ -59,15 +58,14 @@ public static Command parse(String input) { try { command = new EventCommand(eventTitle, eventTime); } catch (DateTimeParseException e) { - System.out.println("Event must be in format of yyyy-mm-dd"); - command = new InvalidCommand(); + command = new InvalidCommand("Event must be in format of yyyy-mm-dd"); } } else if (input.startsWith(CMD_DELETE)) { String parsedInput = input.split(" ")[1]; int taskNo = Integer.parseInt(parsedInput); command = new DeleteCommand(taskNo - 1); } else { - command = new InvalidCommand(); + command = new InvalidCommand("OOPS!!! I'm sorry, but I don't know what that means :-("); } return command; } diff --git a/src/main/java/duke/command/InvalidCommand.java b/src/main/java/duke/command/InvalidCommand.java index fe1b0ef6a..9fad1f6e2 100644 --- a/src/main/java/duke/command/InvalidCommand.java +++ b/src/main/java/duke/command/InvalidCommand.java @@ -4,6 +4,11 @@ public class InvalidCommand implements Command { private static final CommandType type = CommandType.INVALID; + private final String message; + + public InvalidCommand(String message) { + this.message = message; + } /** * Throws DukeException for running an invalid command @@ -13,7 +18,7 @@ public class InvalidCommand implements Command { */ @Override public void run(boolean printMessage) throws DukeException { - throw new DukeException("OOPS!!! I'm sorry, but I don't know what that means :-("); + throw new DukeException(message); } /** From 8eac14993ff671ad7f899072d1fc8d119da6d5f2 Mon Sep 17 00:00:00 2001 From: flerovious <85042815+flerovious@users.noreply.github.com> Date: Fri, 1 Oct 2021 02:21:36 +0800 Subject: [PATCH 25/40] Add find command --- src/main/java/duke/Parser.java | 17 +++++------ src/main/java/duke/TaskList.java | 32 ++++++++++++++++++++- src/main/java/duke/Ui.java | 5 ++-- src/main/java/duke/command/CommandType.java | 1 + src/main/java/duke/command/FindCommand.java | 27 +++++++++++++++++ 5 files changed, 68 insertions(+), 14 deletions(-) create mode 100644 src/main/java/duke/command/FindCommand.java diff --git a/src/main/java/duke/Parser.java b/src/main/java/duke/Parser.java index fa63cbfe0..c688d2479 100644 --- a/src/main/java/duke/Parser.java +++ b/src/main/java/duke/Parser.java @@ -1,15 +1,7 @@ package duke; -import duke.command.Command; -import duke.command.DoneCommand; -import duke.command.ExitCommand; -import duke.command.ListCommand; -import duke.command.TodoCommand; -import duke.command.DeadlineCommand; -import duke.command.EventCommand; -import duke.command.DeleteCommand; -import duke.command.InvalidCommand; +import duke.command.*; public class Parser { private static final String CMD_EXIT = "bye"; @@ -19,6 +11,7 @@ public class Parser { private static final String CMD_DEADLINE = "deadline"; private static final String CMD_EVENT = "event"; private static final String CMD_DELETE = "delete"; + private static final String CMD_FIND = "find"; /** * @param input String input from user @@ -53,7 +46,11 @@ public static Command parse(String input) { String parsedInput = input.split(" ")[1]; int taskNo = Integer.parseInt(parsedInput); return new DeleteCommand(taskNo - 1); - } else { + } else if (input.startsWith(CMD_FIND)) { + String parsedInput = input.split(" ")[1]; + return new FindCommand(parsedInput); + } + else { return new InvalidCommand(); } } diff --git a/src/main/java/duke/TaskList.java b/src/main/java/duke/TaskList.java index 2673aa9e2..cade5af70 100644 --- a/src/main/java/duke/TaskList.java +++ b/src/main/java/duke/TaskList.java @@ -65,7 +65,37 @@ public static Task addEvent(String eventName, String eventTime) { * Prints list of Tasks in task list in a user-friendly format */ public static void listTasks() { - Ui.printTaskList(tasks); + ArrayList<String> list = new ArrayList<>(); + for (Task task : tasks) { + list.add(task.toString()); + } + + if (list.isEmpty()) { + System.out.println("Your task list is empty!:"); + } else { + System.out.println("Here are the tasks in your list:"); + Ui.printTaskList(list); + } + } + + /** + * Prints list of Tasks in task list that contain search keyword in a user-friendly format + * + * @param keyword Search keyword to check against titles of tasks + */ + public static void listMatchingTasks(String keyword) { + ArrayList<String> matches = new ArrayList<>(); + for (Task task : tasks) { + if (task.getName().contains(keyword)) { + matches.add(task.toString()); + } + } + if (matches.isEmpty()) { + System.out.println("No matching tasks found!"); + } else { + System.out.println("Here are the matching tasks in your list:"); + Ui.printTaskList(matches); + } } /** diff --git a/src/main/java/duke/Ui.java b/src/main/java/duke/Ui.java index 799e43f56..c4eb10de2 100644 --- a/src/main/java/duke/Ui.java +++ b/src/main/java/duke/Ui.java @@ -47,10 +47,9 @@ public static void printTaskDoneMessage(Task task) { * * @param tasks Task list to be printed */ - public static void printTaskList(ArrayList<Task> tasks) { - System.out.println("Here are the tasks in your list:"); + public static void printTaskList(ArrayList<String> tasks) { for (int i = 0; i < tasks.size(); ++i) { - Task task = tasks.get(i); + String task = tasks.get(i); System.out.printf("%d. %s", i + 1, task); System.out.println(); } diff --git a/src/main/java/duke/command/CommandType.java b/src/main/java/duke/command/CommandType.java index a3016a989..53eb3908a 100644 --- a/src/main/java/duke/command/CommandType.java +++ b/src/main/java/duke/command/CommandType.java @@ -9,4 +9,5 @@ public enum CommandType { EVENT, INVALID, DELETE, + FIND, } \ No newline at end of file diff --git a/src/main/java/duke/command/FindCommand.java b/src/main/java/duke/command/FindCommand.java new file mode 100644 index 000000000..e784c4e80 --- /dev/null +++ b/src/main/java/duke/command/FindCommand.java @@ -0,0 +1,27 @@ +package duke.command; + +import duke.TaskList; + +public class FindCommand implements Command { + private static final CommandType type = CommandType.FIND; + private final String keyword; + + /** + * Find command constructor + * + * @param keyword Search term to search through task titles + */ + public FindCommand(String keyword) { + this.keyword = keyword; + } + + @Override + public void run(boolean printMessage) { + TaskList.listMatchingTasks(keyword); + } + + @Override + public CommandType getType() { + return type; + } +} From 4e4d2462c5930d8638cd4ecdf0ee671d61eb5e44 Mon Sep 17 00:00:00 2001 From: flerovious <85042815+flerovious@users.noreply.github.com> Date: Fri, 1 Oct 2021 02:43:32 +0800 Subject: [PATCH 26/40] Fix import bug --- src/main/java/duke/Parser.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/duke/Parser.java b/src/main/java/duke/Parser.java index fad7d1a40..015f8fda6 100644 --- a/src/main/java/duke/Parser.java +++ b/src/main/java/duke/Parser.java @@ -10,6 +10,7 @@ import duke.command.EventCommand; import duke.command.DeleteCommand; import duke.command.InvalidCommand; +import duke.command.FindCommand; import java.time.format.DateTimeParseException; public class Parser { From 29af211359f9f8c07a8c43bd7dfbd20929c90031 Mon Sep 17 00:00:00 2001 From: flerovious <85042815+flerovious@users.noreply.github.com> Date: Fri, 1 Oct 2021 02:54:02 +0800 Subject: [PATCH 27/40] Add JavaDocs --- src/main/java/duke/task/Task.java | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/main/java/duke/task/Task.java b/src/main/java/duke/task/Task.java index 461d714b7..00f5d35c0 100644 --- a/src/main/java/duke/task/Task.java +++ b/src/main/java/duke/task/Task.java @@ -4,25 +4,47 @@ public abstract class Task { private final String name; private Boolean isDone; + /** + * Task constructor + * + * @param name Name of task + */ public Task(String name) { this.name = name; this.isDone = false; } + /** + * @return Name of task + */ public String getName() { return name; } + /** + * Returns an icon for task completion status + * + * @return Status icon of task + */ public String getStatusIcon() { return (isDone ? "X" : " "); } + /** + * Marks task as done + */ public void markAsDone() { isDone = true; } + /** + * @return Type of Task + */ public abstract TaskType getTaskType(); + /** + * @return Time of Task in MMM dd yyyy format + */ public abstract String getTime(); @Override @@ -30,5 +52,8 @@ public String toString() { return "[" + getStatusIcon() + "] " + getName(); } + /** + * @return Time of Task in yyyy-mm-dd format + */ public abstract String getStandardTime(); } From 4a13fcaf2631e1d9c77881fee54932060f3808d8 Mon Sep 17 00:00:00 2001 From: flerovious <85042815+flerovious@users.noreply.github.com> Date: Fri, 1 Oct 2021 02:59:42 +0800 Subject: [PATCH 28/40] Refactor code to follow coding standard --- src/main/java/duke/Storage.java | 2 +- src/main/java/duke/TaskList.java | 2 +- src/main/java/duke/task/Deadline.java | 4 ++-- src/main/java/duke/task/Event.java | 4 ++-- src/main/java/duke/task/Task.java | 14 +++++++------- src/main/java/duke/task/Todo.java | 2 +- 6 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/main/java/duke/Storage.java b/src/main/java/duke/Storage.java index 406dabce9..af95fd5a5 100644 --- a/src/main/java/duke/Storage.java +++ b/src/main/java/duke/Storage.java @@ -102,7 +102,7 @@ private static String encodeLine(Task task) throws DukeException { } status = task.getStatusIcon(); - title = task.getName(); + title = task.getTitle(); return taskType + DELIMITER + status + DELIMITER + title + DELIMITER + time; } diff --git a/src/main/java/duke/TaskList.java b/src/main/java/duke/TaskList.java index e2f082a63..57ddb8678 100644 --- a/src/main/java/duke/TaskList.java +++ b/src/main/java/duke/TaskList.java @@ -88,7 +88,7 @@ public static void listTasks() { public static void listMatchingTasks(String keyword) { ArrayList<String> matches = new ArrayList<>(); for (Task task : tasks) { - if (task.getName().contains(keyword)) { + if (task.getTitle().contains(keyword)) { matches.add(task.toString()); } } diff --git a/src/main/java/duke/task/Deadline.java b/src/main/java/duke/task/Deadline.java index ab744234a..003d9cd9c 100644 --- a/src/main/java/duke/task/Deadline.java +++ b/src/main/java/duke/task/Deadline.java @@ -33,7 +33,7 @@ public TaskType getTaskType() { @Override public String toString() { String SYMBOL = "D"; - return "[" + SYMBOL + "]" + super.toString() + " (by: " + getTime() + ")"; + return "[" + SYMBOL + "]" + super.toString() + " (by: " + getDisplayTime() + ")"; } /** @@ -48,7 +48,7 @@ public String getStandardTime() { * @return Due date of Deadline in MMM dd yyyy format */ @Override - public String getTime() { + public String getDisplayTime() { return dueDate.format(DateTimeFormatter.ofPattern("MMM dd yyyy")); } } diff --git a/src/main/java/duke/task/Event.java b/src/main/java/duke/task/Event.java index ccf5c909b..7908b1a0a 100644 --- a/src/main/java/duke/task/Event.java +++ b/src/main/java/duke/task/Event.java @@ -32,7 +32,7 @@ public TaskType getTaskType() { @Override public String toString() { String SYMBOL = "E"; - return "[" + SYMBOL + "]" + super.toString() + " (at: " + getTime() + ")"; + return "[" + SYMBOL + "]" + super.toString() + " (at: " + getDisplayTime() + ")"; } /** @@ -47,7 +47,7 @@ public String getStandardTime() { * @return Due date of Deadline in MMM dd yyyy format */ @Override - public String getTime() { + public String getDisplayTime() { return timeslot.format(DateTimeFormatter.ofPattern("MMM dd yyyy")); } } diff --git a/src/main/java/duke/task/Task.java b/src/main/java/duke/task/Task.java index 00f5d35c0..d2fc3a70d 100644 --- a/src/main/java/duke/task/Task.java +++ b/src/main/java/duke/task/Task.java @@ -7,17 +7,17 @@ public abstract class Task { /** * Task constructor * - * @param name Name of task + * @param title Title of task */ - public Task(String name) { - this.name = name; + public Task(String title) { + this.name = title; this.isDone = false; } /** - * @return Name of task + * @return Title of task */ - public String getName() { + public String getTitle() { return name; } @@ -45,11 +45,11 @@ public void markAsDone() { /** * @return Time of Task in MMM dd yyyy format */ - public abstract String getTime(); + public abstract String getDisplayTime(); @Override public String toString() { - return "[" + getStatusIcon() + "] " + getName(); + return "[" + getStatusIcon() + "] " + getTitle(); } /** diff --git a/src/main/java/duke/task/Todo.java b/src/main/java/duke/task/Todo.java index 9800134df..e75053e23 100644 --- a/src/main/java/duke/task/Todo.java +++ b/src/main/java/duke/task/Todo.java @@ -41,7 +41,7 @@ public String getStandardTime() { * @return Null since Todo does not have any time associated with it */ @Override - public String getTime() { + public String getDisplayTime() { return null; } } From 70533ff7da0f9cd68ea3bdb942b86ba5bbe349dd Mon Sep 17 00:00:00 2001 From: flerovious <85042815+flerovious@users.noreply.github.com> Date: Fri, 1 Oct 2021 03:09:01 +0800 Subject: [PATCH 29/40] Add JavaDoc for Task --- src/main/java/duke/task/Task.java | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/main/java/duke/task/Task.java b/src/main/java/duke/task/Task.java index 5d8cfd09e..0880b4d55 100644 --- a/src/main/java/duke/task/Task.java +++ b/src/main/java/duke/task/Task.java @@ -4,25 +4,47 @@ public abstract class Task { private final String name; private Boolean isDone; + /** + * Task constructor + * + * @param name Name of task + */ public Task(String name) { this.name = name; this.isDone = false; } + /** + * @return Name of task + */ public String getName() { return name; } + /** + * Returns an icon for task completion status + * + * @return Status icon of task + */ public String getStatusIcon() { return (isDone ? "X" : " "); } + /** + * Marks task as done + */ public void markAsDone() { isDone = true; } + /** + * @return Type of Task + */ public abstract TaskType getTaskType(); + /** + * @return Time of Task in MMM dd yyyy format + */ public abstract String getTime(); @Override From b50c6920ebe53189b78ec084d0695d03078b7ea5 Mon Sep 17 00:00:00 2001 From: flerovious <85042815+flerovious@users.noreply.github.com> Date: Fri, 1 Oct 2021 16:10:15 +0800 Subject: [PATCH 30/40] Add help command --- src/main/java/duke/Parser.java | 4 +++ src/main/java/duke/Ui.java | 30 +++++++++++++++++++++ src/main/java/duke/command/CommandType.java | 1 + src/main/java/duke/command/HelpCommand.java | 26 ++++++++++++++++++ 4 files changed, 61 insertions(+) create mode 100644 src/main/java/duke/command/HelpCommand.java diff --git a/src/main/java/duke/Parser.java b/src/main/java/duke/Parser.java index 015f8fda6..46438bd71 100644 --- a/src/main/java/duke/Parser.java +++ b/src/main/java/duke/Parser.java @@ -11,6 +11,7 @@ import duke.command.DeleteCommand; import duke.command.InvalidCommand; import duke.command.FindCommand; +import duke.command.HelpCommand; import java.time.format.DateTimeParseException; public class Parser { @@ -22,6 +23,7 @@ public class Parser { private static final String CMD_EVENT = "event"; private static final String CMD_DELETE = "delete"; private static final String CMD_FIND = "find"; + private static final String CMD_HELP = "help"; /** * @param input String input from user @@ -33,6 +35,8 @@ public static Command parse(String input) { if (input.equals(CMD_EXIT)) { command = new ExitCommand(); + } else if (input.equals(CMD_HELP)) { + command = new HelpCommand(); } else if (input.equals(CMD_LIST)) { command = new ListCommand(); } else if (input.startsWith(CMD_DONE)) { diff --git a/src/main/java/duke/Ui.java b/src/main/java/duke/Ui.java index c4eb10de2..2a22d6cd2 100644 --- a/src/main/java/duke/Ui.java +++ b/src/main/java/duke/Ui.java @@ -6,6 +6,7 @@ public class Ui { private static final String INDENT = " "; + private static final String CURSOR = ">>> "; /** * Print confirmation message to user that task has been added successfully to task list @@ -41,6 +42,35 @@ public static void printTaskDoneMessage(Task task) { System.out.println(INDENT + task); } + /** + * Displays help message for all possible commands and their format + */ + public static void printHelpMessage() { + System.out.println("Add todo task"); + System.out.println(CURSOR + "todo <TASK_TITLE>"); + + System.out.println("Add deadline task"); + System.out.println(CURSOR + "deadline <TASK_TITLE> /by <DATE in yyyy-mm-dd format>"); + + System.out.println("Add event task"); + System.out.println(CURSOR + "event <TASK_TITLE> /at <DATE in yyyy-mm-dd format>"); + + System.out.println("List all tasks in task list"); + System.out.println(CURSOR + "list"); + + System.out.println("Mark task in task list as done"); + System.out.println(CURSOR + "done <TASK_NO>"); + + System.out.println("Delete task in task list"); + System.out.println(CURSOR + "delete <TASK_NO>"); + + System.out.println("Find tasks with matching titles"); + System.out.println(CURSOR + "find <KEYWORD>"); + + System.out.println(); + System.out.println("Refer to https://flerovious.github.io/ip/ for detailed user guide"); + } + /** * Prints list of Tasks in task list in a user-friendly format diff --git a/src/main/java/duke/command/CommandType.java b/src/main/java/duke/command/CommandType.java index 53eb3908a..60d53a622 100644 --- a/src/main/java/duke/command/CommandType.java +++ b/src/main/java/duke/command/CommandType.java @@ -10,4 +10,5 @@ public enum CommandType { INVALID, DELETE, FIND, + HELP, } \ No newline at end of file diff --git a/src/main/java/duke/command/HelpCommand.java b/src/main/java/duke/command/HelpCommand.java new file mode 100644 index 000000000..adf5d3900 --- /dev/null +++ b/src/main/java/duke/command/HelpCommand.java @@ -0,0 +1,26 @@ +package duke.command; + +import duke.DukeException; +import duke.Ui; + +public class HelpCommand implements Command { + + /** + * Displays help message for all possible commands and their format + * + * @param printMessage Print message to user on executing command. Value is irrelevant + * as values will be printed out anyways + */ + @Override + public void run(boolean printMessage) throws DukeException { + Ui.printHelpMessage(); + } + + /** + * @return Type of command + */ + @Override + public CommandType getType() { + return CommandType.HELP; + } +} \ No newline at end of file From 5f4d0b31d99988b2b6414ac0892e1198afa7f300 Mon Sep 17 00:00:00 2001 From: flerovious <85042815+flerovious@users.noreply.github.com> Date: Fri, 1 Oct 2021 17:43:43 +0800 Subject: [PATCH 31/40] Update User Guide --- docs/README.md | 140 ++++++++++++++++-- .../screenshots/command_outcomes/deadline.png | Bin 0 -> 15095 bytes docs/screenshots/command_outcomes/delete.png | Bin 0 -> 23072 bytes docs/screenshots/command_outcomes/done.png | Bin 0 -> 8222 bytes docs/screenshots/command_outcomes/event.png | Bin 0 -> 13095 bytes docs/screenshots/command_outcomes/exit.png | Bin 0 -> 8062 bytes docs/screenshots/command_outcomes/find.png | Bin 0 -> 12451 bytes docs/screenshots/command_outcomes/help.png | Bin 0 -> 38723 bytes docs/screenshots/command_outcomes/list.png | Bin 0 -> 15936 bytes docs/screenshots/command_outcomes/todo.png | Bin 0 -> 12532 bytes docs/screenshots/startup_screen.png | Bin 0 -> 9938 bytes src/main/java/duke/TaskList.java | 2 +- 12 files changed, 127 insertions(+), 15 deletions(-) create mode 100644 docs/screenshots/command_outcomes/deadline.png create mode 100644 docs/screenshots/command_outcomes/delete.png create mode 100644 docs/screenshots/command_outcomes/done.png create mode 100644 docs/screenshots/command_outcomes/event.png create mode 100644 docs/screenshots/command_outcomes/exit.png create mode 100644 docs/screenshots/command_outcomes/find.png create mode 100644 docs/screenshots/command_outcomes/help.png create mode 100644 docs/screenshots/command_outcomes/list.png create mode 100644 docs/screenshots/command_outcomes/todo.png create mode 100644 docs/screenshots/startup_screen.png diff --git a/docs/README.md b/docs/README.md index 8077118eb..0c257e43e 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,29 +1,141 @@ # User Guide +Duke is a cross-platform desktop task manager app that helps you keep track of your tasks through the command line interface. +Fast and lightweight, it is best suited for fast typists. -## Features - -### Feature-ABC +- [Set Up](#setup) +- [Quick Start](#quick-start) +- [Features](#features) + - [Getting help](#getting-help-help) + - [Adding a Todo Task](#adding-a-todo-task-todo) + - [Adding a Deadline Task](#adding-a-deadline-task-deadline) + - [Adding an Event Task](#adding-an-event-task-event) + - [Listing all Tasks](#listing-all-tasks-list) + - [Marking Task as Done](#marking-task-as-done-done) + - [Finding Tasks](#finding-tasks-find) + - [Deleting Tasks](#deleting-tasks-delete) + - [Exiting Duke](#exiting-duke-bye) + - [Auto Save](#auto-save) +- [Command Summary](#command-summary) -Description of the feature. +## Setup +1. Ensure that you have [Java 11](https://docs.aws.amazon.com/corretto/latest/corretto-11-ug/downloads-list.html) installed in your desktop +2. Download the [latest version of Duke](https://github.com/flerovious/ip/releases/tag/A-Release) +3. You should have `ip.jar` downloaded. Now, copy the `ip.jar` to the folder you want to use for Duke +4. Open command prompt on Windows or terminal on Mac/Ubuntu +5. `cd` to the folder selected in step 3 +6. Run Duke with `java -jar ip.jar` in your command prompt or terminal -### Feature-XYZ +## Quick Start +1. On startup, you should see the following \ +![startup_screen](screenshots/startup_screen.png) +2. Type commands and press Enter to execute them. Enter the `help` command if you ever get lost +3. Refer to [Features](#features) below for details of each command -Description of the feature. +## Features +The following are the features of Duke -## Usage +### Getting help `help` +Lists all possible commands and their syntax \ +\ +Example usage: +```console +help +``` +Expected outcome: \ +![startup_screen](screenshots/command_outcomes/help.png) -### `Keyword` - Describe action +### Adding a Todo Task `todo` +Adds a Todo task which includes the title of the todo \ +\ +Example of usage: +```console +todo Prepare for CG2027 finals +``` +Expected outcome: \ +![startup_screen](screenshots/command_outcomes/todo.png) -Describe the action and its outcome. +### Adding a Deadline Task `deadline` +Adds a Deadline task which includes the title of the deadline and the due date in `yyyy-mm-dd` format \ +\ +Example of usage: +```console +deadline CS2113T weekly quiz /by 2021-10-01 +``` +Expected outcome: \ +![startup_screen](screenshots/command_outcomes/deadline.png) -Example of usage: +### Adding an Event Task `event` +Adds an Event task which includes the title of the event and the time of the event \ +\ +Example of usage: +```console +event CG2027 finals /at 2021-10-02 +``` +Expected outcome: \ +![startup_screen](screenshots/command_outcomes/event.png) -`keyword (optional arguments)` +### Listing all Tasks `list` +Shows a list of all tasks in the task list \ +\ +Example of usage: +```console +list +``` +Expected outcome: \ +![startup_screen](screenshots/command_outcomes/list.png) -Expected outcome: +### Marking Task as Done `done` +Marks the task at the given index as done \ +\ +Example of usage: +```console +done 1 +``` +Expected outcome: \ +![startup_screen](screenshots/command_outcomes/done.png) -Description of the outcome. +### Finding Tasks `find` +Finds all tasks in task list with titles that match the search keyword \ +\ +Example of usage: +```console +find finals +``` +Expected outcome: \ +![startup_screen](screenshots/command_outcomes/find.png) +### Deleting Tasks `delete` +Deletes the task at the given index \ +\ +Example of usage: +```console +delete 1 ``` -expected output +Expected outcome: \ +![startup_screen](screenshots/command_outcomes/delete.png) + +### Exiting Duke `bye` +Exits the program \ +\ +Example of usage: +```console +bye ``` +Expected outcome: \ +![startup_screen](screenshots/command_outcomes/exit.png) + +### Auto Save +All changes to Tasks in the task list are automatically saved to `data/duke.txt` relative to `ip.jar` whenever the tasks list is modified + +## Command Summary +| Action | Format & Examples | +| :--- | :--- | +| **Help** | `help` | +| **Todo** | `todo <TASK_TITLE>`<br/>ex: `todo Prepare for CG2027 finals` | +| **Deadline** | `deadline <TASK_TITLE> /by <DATE in yyyy-mm-dd format>`<br/>ex: `deadline CS2113T weekly quiz /by 2021-10-01` | +| **Event** | `event <TASK_TITLE> /at <DATE in yyyy-mm-dd format>`<br/>ex: `event CG2027 finals /at 2021-10-02` | +| **List** | `list` | +| **Done** | `done <TASK_NO>`<br/>ex: `done 1` | +| **Find** | `find <KEYWORD>`<br/>ex: `find finals` | +| **Delete** | `delete <TASK_NO>`<br/>ex: `delete 1` | +| **Exit** | `bye` | \ No newline at end of file diff --git a/docs/screenshots/command_outcomes/deadline.png b/docs/screenshots/command_outcomes/deadline.png new file mode 100644 index 0000000000000000000000000000000000000000..ba2c6e71fac0245446f25dd4f327301e29f45b57 GIT binary patch literal 15095 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 E0PV{q?f?J) literal 0 HcmV?d00001 diff --git a/docs/screenshots/command_outcomes/delete.png b/docs/screenshots/command_outcomes/delete.png new file mode 100644 index 0000000000000000000000000000000000000000..39da081517930809df04767e6d89d5d92b7dc793 GIT binary patch literal 23072 zcmd43g<Dly7cWe+B_t#yq(OR9(v5(G0xBUL(%lULn=a`P5EK-pL%O>`P`XpPyYAfQ zsONp|{r-UOJP(KM+N<W8bB!^6F$h(DCX0<hih+QDfGzjr@pA+O#5wT!Cj<@rpJ?kM z3~Z1#my%MJlaiuRcCa-uw=zaRV2m-+*T<J*W$ZFA(AV$kXJNu{aD5&U67gK$x2LJS z3DRbTB^=t_jv9rCC@M~m#X(BwRg3l#6D7%6!eplLL;o4Wuc16*qI^MH3LDRWFBGVD zIoU)Hk=Mn<(=xP`U$!(gB_q9NNlGGkGyXul;tAf6iuegRuF!*)Sp>s}663N>7LxvH zep_VX72*yuG(%V&#Nrjt@MGNs@yRTpkiCm47T5(0MIgwtrV8H<+MP-F?E}hVp*7-{ zM8=;?;~Dvpq?lBjxuLI=WShI1y59OB60G9>d~f@vHC818nOcpiqe-6=nehylnh58p z)kOde?M4)qOghwvq>F`xeo9D3MBnnD=`1pbzkeLkvN}7^)Filldpo#*g|(H6h2>jx zdwc77d3)=d#L2-iXQ<D=hmBzEWN6fnvNZvotD3QfoXOLt2+ZI!1OYMF903J<LIgjg z;0FN#IW`CZ9sI@zKaVq!{(Or#mx=u6Gr~{!juJ1V<mABb7e)@o#x{;-woZ^4Vis_! zQS+A?P8v@Y1&wU2*$rOX8XB{^S=+%6K@fHm1Rt%9oeZeltgUPu1>Hnw{@Ftie1>m^ z(op@gi<6}YjmA@DDk)nBV=7*D4t5S2Q4A_7Dq)A$CW6l&%ltkZ{7Zz!%*n}45DIm5 zb!B(uX18@Pg>niA2tYZwpj=#RU=KD&cN-@IH#Qqb+J8^-=RA*%9gQ5!?VQYQZK&Yq zH88Ywb`qhXfnVtFfB)X6v77mSSF&;ZJuEOlDEu2JCp!o9@43OD!tkwv%I0pyR<9nL zTZ6{~t|7|B$u0cP{{PQ6|6TEaj@0<?NFF|c|2^`5zWKk8RCP3Vkg~M~mvj>SZ)ScU z{J&rRK2R76ANl`0iGLsSKU=|b7R3;T{+%;X46EEH;s^-h2y%}lUb-P}r{6hK9hvP^ zM<!t*l&9ADfORMEEy2?cn&<HjEIs{G$GX!$2v@u*W-ouWw?|sK8AFsvj}tjl3coxK z(8`4=KjG3@*e=_-w%**jon6cKzPU_0r1WWA6EIb>ydKq@dvq1_?L_y{UE#eZy@*(v zOb8=V*c<SR0NXEBT0!pKa})wZX>mMd@GJZchMqO#pKrlV;xTy23tF$69tr&ZT3S4? zsN&DQ(wSY5+&wm~`P8&O=Tx2|_W$(sU25Dj!EWJ;UmsWB**5G)noO3P8%<VNlfmXn zjl-*NZ!QBi57M?8E_Y0(tScW`juo=uylb;RoiL>wDKV0L@lgg_i>N0%`_Fxz(ac+) zj}~Z+k$e2gGI?iRvA<&7N}b$rd*gX&IbNJ4u>4jEzkQIX%5iOAHNR}2hluW{DP-!N zlJNJd9oI%~&#jW+_Kzk{Z6PoE!?|AkJKEejh?`c!Ig$PPa83{<taxj--m@WJo&u+N zDo26Xaku_7RnU1O`R4jENmwcM_n7^9g2nUqtY>Pzt$+U*{6(*^;Z?Omj{D_yC9OiR z&_(=<XPlnf-;%!B5JPpXRtM58Z_WpOWr7BsxrrOoT_(G+NVwWc&41*^d~1`9Bqc0P z7xk`r_02-nE<IcicW7xj9NNIaH*FWNFkYx56n&rc@jsIS9zJ8Zc=n$4XnqQz-EQ4s zl>0&V!+!SKEyF0Wn=`JGYB7i9CuLse4vur)rz9v#Up{A8;D))*dAp|URok5HUG8^M z_Lmy>va)E8XETjWUtMe#1-$k;L-iARHtV*89j*M|mAaz9m5lue4$C3Rum^40wuh_z z+tpVF*9HsEGK43tjz*MDco)#INna<^&X$|Up&Scd>|HJdQ})%lAF?*0VUs3zM3SM8 zEj;!*3tam3?eEesL!k+TjxGmblOZ)LFo5Y)XMjQ)BgyzQC0KCqCRr6*bkbj*sX6&P zml0w9cY!h@tw>NkKWo`rd+$3iPu8$XEtx3rlclJRi<WiNT=eDl^OYA2kstr86Bu3y zVZ*{3NC%^#{Rms-H2yJTktbogo^IgqlRr!PO@R2a!q=*(SNY2r+J&v<?uRC11NDtF zE>kJ>r?Wx_-ukP7W%b1G;^&}^SFtg&e3WSqSBRsE#{Qf@oEkUx+muahBqq1aFAB## z&XY}*&9S0N%J}&QV;;vFDd&f4Q|%gU=O<IP+qJc6z9$o=CTr=gyxtc_C8rtQC$9qR zobEJFWl5p4ya7w!+GWOBy;d{D-H4H?vB14jZ*cJ^<!bUmr*IkTjeO5wzvT~s^?iB5 z^>VZCEj)8I2$4mWoa+7lJh1w|uku?=KT>oGH~mkrE7yoZo!V5JnVJ;MZx$pddxwK! zwjQTD)?iLdiC^7WYP~DeceL@d7ejZa;8j_NVhR_%gCEhL68{3qrO_jv$7iAU9!@&m z#O^JP#9m(<a~EiSE2XTbx`Exfw`IsVkVSWOLr8n`ek}K_ONOBSpoe8OE0`k8Bm4AE z2=T*0F${!e;noT5RDJYz<+W<B(Jqe1`&8$0G~+r~9ep5J^y}(?IbP;()VYZiS6j$q zWcoAbVd58%$Lv+|Vk9fMf2NiZ$sa@}3CZZc(-4CTLK9u)Ba*+N32b0_@=N9KD}#^3 z>=lku&hU4AK)?pnJO3>%X-V-w+n6__um9XTq6CO<R9UirPMP@x9^mkYQX~GXVk)qK zknZU3eG%M2By5mI(u`C26GKtJ27ed@;h%^>L!H@D`9$23E9?ypQsa5QZ66{!`TV_? zt?>9tFOxYsioMtwc<6h!5Ij}y<$JX+Tbl$OBzt7>dO-Bj>TuR`ccK8f)!wTR{yNw0 z3zN-$e){ws?<3O;_fPQPLp>LmY0{rMArgrra-_U;bDuSd_0@BRZtIGP4y^keO;!`7 z?OtFF8fR=q4pYCC@$CMYVNUx%$c0BCiT#+F@$!Y9^H0@JI<+pVD@l61Vpn?s>U9Tb zJ*rU$2RNN`HNjO6^kzLa3-)O1)lj}-BgG`{Qh06|1onnL%(#zG0@l;Gr}M^-J3I6u z>(kX`0-O0|u`-7kgFY=-E|5CO?}K8uR{un5p<kH+eQNFP8J*a%TfvGM_ow5TiIB|8 zleD+1?Uy=&Tox6!f<>$+dAKb{Szka<AF)$b_uvsj=Pr+erS1yQ&HW-(!pp^n{D@*f zP1FQY>7M}DaCOjIrT=r|rjydw>XTxMVQ=5O-!~!Cfiw*)pYs*sOU0-X#A832JzEqa zR*g&z_)~u*PNjC{bA3E!0?vX)eDp#|gb))|(`qn71e<+gx8ZUCBm47vA3?k8o$`@q zCS7l-c|{8?Sw~bp%Aj6-QhINrR-j3!y>wT2CH_U9uIILKK~H-)@w;lrwM2X8N}HL< zqhH@!e-!D>)uhh(TyDRSl@@4@ZPtt`jj$ZeHxI(0v>{^GHq-T3&xv5wb6W@;trzpX zxtec)vP-~NAO3jN=yTn-HBt6-tWf7^9K+K-a4!}n18L@?`LE*eMjq<)l)yv%w0&m^ zwBf9!B1yO2BL&3K)Y{z!p^sP9lL}dOa(VT1)`M^0x%M6R0DtRN)lyW2E~V!dr_?Pz z(rttHWls(~LiK0M#ra#FW*he=Rt&%+QNZ&`mu*c;ribaHPc-jNB3?)O$kqCQ_?5pX zr>oP$=j%3#hC^ZXt8-A~G_7}d3j|G*p-hR2NPkRkc{#k?Ey&}VbS8pBrJ}~0nsnbV zme;L8*!{*yIwmf&?xu%r_mq;Q!-*yY3jL7L(NvOsbt<e<t~u}1X0D`u6oMESN0SQ- z-yJ=jaeco%9sIy0SpcLvB%d^@UwFS5(W6B#atZH)nf8)N4zp{X@0vgA=bMY~zKaYw z7dsg@;?7v;5j~p^=$EDRCYU~Lrw@6%1gkL?m+E%k{x;SZfFo+=bFu!=v70_gLn-+2 z=~GuQ3LZ$n<!<8~hp|L@bDUp|^;AX6z*%{c<b14&r`&J`6aNbwM*6B)6&LWh#FkEQ zT83n@m73mP$*9zO9QO@nNm)~-avBA#go?|aQ>W9#XOm--@)Td=x0`MJ_=2`VIvCCP zGuFoaAoxH+u&C}JtQa$@oHpL7_~SM+6Ot;TpGI%ez!fNzCZ!e4>Q&lWaM2XXRZ4bn zKWV5s5y99_*ZSX?ejKSzMvvR%P&&&}RRUQU1382HN#-$^?88HStY3ZghN}DIEgw3b z>VE$PQhQ~9@yiBfHAXTDKWsAIaVm%|>=EV^%*#Gzuc4Dz&+B{L#YP@4|7`GPVeP=( zuZHe)a;Mj)b9`6DnYa7Vz8ZlcjvLxtpX+gXt+j`(pmLMk#?2p$z9LCue$}b1(5b2d z*>ZxnufC|^g88G;{DTl00<uL~gmo=k$#<7W>I95>^3U(0TyYNy8;Ov{qFvw38Q)Gi zU)}AZjV^aw;+ykwd=sj5S6J#O6a)w1gK9FhK|;SCfARbk1;n8)`-h7jQ8Xx97ss2( z%?kHR#(%}jh5DsR1XgM2T;Y~JviMQlqJ6f&C8ZHMzj9OKyt!;2DEJ|wcv2v&DUqw( ze1yTR4~b2CyU?<qIO$F3T4*>4#U1TX8{I>>B(Gj_KG}_DU6u9OkqS&xn37T`Q2rr3 zs)P7=JGKDmi16iBSv29+4=wju@x5;3LTdsO6yZ@eF}#*S`cyjKa?Cp6_>Zo;vuedf zy7huwLfP#{if;0BT*b35QJC)_l_VA|Q;u<`BeU=;I#H=V+0#bTbsfU)46kLlt9Fv0 zuA74QIN##bgnwr58(GDN45O7YGt6Erb&4J|cG*>39eMw7GU!<Kj|5olQk2m04~mgz z#6AlivBG<bxwuuZ5o|q$Nps2(Mf6^rqM`1G@2w^)ZEY_}F$i|7Sm!12Mo_OWPb>Xn zYy9jaf|=xQ_FhI(h)k9u(C$~j+&8|_D68UiF?qSm?oT@oetQ7LKye+4@W?o#*csHa zsirqC$HHW>U&fbdYVVP}m#?U+&^$F?lSXfOzDTowDDo-2(AJZQhrQvvi?~v<9hulC zzf3<%Es0&n>azM|(lWq2rF_IhlqiqbAT$S?^H$KXErd(%d=-aU)MlFBvcAj)c8rcA zc4bH6;~|BY`xO$eswYL?&K5=%U){yA@T^tS@tZyjLh!ANaVscdX>HcjCZb(p=d!ly zgWT8y@#-kr)$S<K3$xa-0A|vK4OF8&V?0cXpyF?I{I%}UE$!YJ9qyCs7-H{FVj0-w zroy2v)stmV$~n6}N`+fPL8JCCLYJGQlSoWHy&l!Obt;OeA@lSP4)8x^pG$pzeG%gN zE?RJdk!7e=cqR2fI)`cSI2ZDg7sUZX4+FMY4PusYPmr?7P8g19@wopO)-$1Po<mUe zqG5(iKk2)ZRlprQ{Z*Ca(s3<fC>8I+OpS9{s>lvIk?sCQWFKd9v|oz*0?0Ez@5(?_ z1#QXqx6&L3O7bM}G|%yk6TFP>6t^T<=D+ch)6UPwMO$J#1<Bxim6~05a-G2(YQ7j- zUf;HW*YG}1B)GLxXXIhF4)tqgo)r&J?_+<k7j@av7y$+4)QLvj_?H(C^YXj39dP-Z z<q93<CqH?Ya^MCgeZgy(Cj8`e*!e+>;0~*mt1#|O1hK}9QAb3#a?46J1$YBP#Gh4i z2YP_uTR<P4*PDYQde#J%ib#;FAPH{q`2Amt)3VUIJ%8_O*x<{aq*4aOWL$^^jMq_f zZz)|eM4G5_&c`$8Q3%mMCmZgtS9-AD+WFdhzPbZ^={nCamq812*BG^z<5s6`D}L%C zu;jdzV8WKnWGMBrok*~{0H&CpHl3GdXZgs}N!{TVdUMbHcBs1N$w~l%aeI*h$RlM* zeIKJJ#bz@O1!Q#BKl+9|gxIzq;|S}kE7tDErL8fe=Y2a@WNwM}IRbA-^10TW1deBH zPn_7WegXR7ghmT{R!B@C`HZPYA>^eRiiOqnz(%8J>&pRrtH$e-3dbrUiw4&3g(X(& zR)u*ieK?zOV^p|4P6Jl3pJA8Zb^712c}aV%hAT|ELm$@=)`K8okb0GiGs*3ZJ!V}3 zsf2n*-6Te0#EA9uw)7q_4o)284-)tp(!NdIV{_?vB=WbeETx%$w5Ih6^YgjdpSqEm z22`gkh6QFBzpK%&JYYkf)3L?E?+yPy+C#UNlu&5NN~tU8j^tKQtL)E1>Wb?;y+$A0 z<E3b^sA<b&gdBOkuC$EbOaovInE|TQDk-RCLnX9p#pb&YGZAfT_}KZtRU7v>N@$0p zH<1mqa3=0~&gQDbAgG?Hd{M?%-)<94OuhtVMHl4dlLbtDP_jO91$6|;*7#_|^_wNL z?a6Pe>!07>rBF&2{JEE>UX)S2nri8PY5&lEy)<D`U@gsPesH!~(&4>G^aO!6qj?QJ zbi?geRxqiLq*Y`H*THGy?Tk$=<LPlSnI93G=6zmM;=!IN+eT}EizBD;Fv<Pd4xb6G z)78#B(xo7Hd@^AiZI$HJx?S4Kz6y#N9#D#Zo4Wh_*`$Ko=F<z*h15ruCY8I{*NsQR z3dSwxdqRhO+)v#GZM!|)?N7c`T361DYCCk(2eDy;?788vZO?ihB~)QP(y_C`HaPM1 z=;m@aNdZ6<0lZu%#|A742<5o}^^#`drsVc%_v{xvpYt4n>!XnZD&p4@DA&cUcex>R zk}69bkp&Om)N7q*O@Qn)a|N<^`6UH0^UT+dBy&`>HGsTC%%Fq@zNQ3zz0k(#QBESV zcR$}d^f0*~dsg1{YE=>C{WJ$&b!^F9fEf8q)14F7M?OdQ4p1o<RV`wa4T@gE>$Vh7 zfpt~DcM+pagEj&XZ>q2G{&9@Bax<;oK>^>%Z3eG(YRV(a#EEkA7Y*I+?H^~ll1GXS zq#V1bgWcLk#KYcDDI2iqb?cv<ftyNUdhrRR60gCw{x~s(&sNv2NcrKQ@L|OIP*%YD zXu&)8<rrD4RF`N9kv?#9rVVF{;gTRBJ+~PqFr*+`fHO5h^IhH|9kj)uY}Zsc7}c_6 zGn#1cWWKsr(sp~bCWbDFJSYPSYQ+FFZ2yWCvb&fUc|{Fed^1jQ66P?o_n*^UQr)li zI|Cl!bW(Wcd;9dVRiaoj!$%f)lP2KU2lxsrZ9N~94nx_qJAMKf8?p2X%W8{8u^w8* z`VxjW=Z~ADns7D%^id5uT=;1J6^fMb>@2bL>(Juu?(NN>CLY9)=K?H?)Q9iAN`FmE zR@r|9luv>)vHYS2G1hpQ=^!rvUyq)q@^HTQx%iSI;P~lPnMou{ne23ohB};1`Z@ob zPI|Y{AqrTv0-4(%FO*V1+5d{=5?;7Pi=1ds(ZQImlpoIrqxz$EB1Gk|$GhCXigrs} zwkOrjf^>>(ybj>kYQhd5(kE>_&ZT1t?iJc0@4ZtLW?4YpmW#tz)Ube?IS=(ua#AnS zwVo+)-W<h-?b_6Co9xzxlc*PJo0m=Gs(chbyEu^A!yC;piW2B}7E^4-1rn-l`60j* zXj|rv0I*;bt~{PRygEPZCoxSk_)GyXtjJVG<IRQT9g}F$Z2?-zsPIHKtx3_)q$ok- z3k>=du)ccnUQnv5qP#p~$bYrk4|pxN%?u-Z^hA`M&(CoWovR1}i`!0TJ#ATD>Ur%; zmjT{p1Z28Ri|eA>3#d@jJtEhot{B?>gO%QX@6#F6WLe?kA1|<xcfcxR+sgNRV9=9B zg@I<HgtC<>5s<G+k61D=-znaq&3AYJGeT&+z?T>DZQ+}W@$;Onvgd{Dc=+67P=tKo z@P+E$gH6E!jOf*#6db^4Xz#IdP+n9vUbBTPX+=><M%`Ow)RB<0+qk>18Eeb$+8@x? z>D+t8DgO>P>?4a?HPpr}<Ied(EAle_Hij!};e2*{_AG8iX@~>JI=#wIW}Mcc<)#<V z@!^bDuLbPp#SfDjujnBgQyBpefoD%#e+^|-H1;QRwlYgF(zgcV@GW&lLtmT<jIS>- z16pJbM%axYgZ_crKoyRL?+7dtr}-r{V;SzrhRZHRm)79bm7Za4p4Ds?mIY*DMS+-E zHoCst9TyN4Z5*uJ&gH<yfwB$<M{QjC#U{_*BBG8lv{3~;M8JFngIo;=?bdN!LEf9( z%qK-=H$Ykm+9l8*yxvq=<Y;6@VTW~E;AcIq-e;I!bwwq%cSw*rOT738A+&2_60?_w ze{DIJpq4<OZc4uFm##jO^P29TPZ{*DpgWckB0vo*-&bslDL0KLqb9O@&Y<!kuEKQT zp6la%i4<|p1YVTUY18IUM=4cj9*q_>nJs+L9@hXXS+V9L!wfk?RI>})gY23<=!;{= zZC)4^-Y3r1;DJe(nc|8MVQ}s#6Tu=_yqNMJx-DVF4uMd19v?>34^&-mTIxA+QW`mS z_Z|hDSr*ls*alFC`!5TUCzclJHHzZa37g{Kqo{G&O_FKdf)TY4E{5>=S8GtuVuffP z$&%I2`(s+oJbN#y<8Mlihn3GD6S9KeAbO?$Ov})_4RGEhOncm1xb`vGvos$%XFrJ4 z`X^lknN`ww#Z|10x7}PLjB%|P2qGIl$a!G-Kq=<=F(B4$DV*nOU2QGtIidqldswIg z8PKqaFeD(ltB~~}mF0nZ2WhVFbPV;|==;JnlG-L6cLPUoXA6h@YAbwiZ(M$|9@f9z ztZ+KFXBS@faX)w{Jk0-`;r)TUW_1ts0*3u-_EaWx0*px`g4uZVyn6S;)zRx+j0b#5 zjAlliQQwHh0leK6?cqONk)@k%EDsMmxp-RT!;Nva8=k!_5Ekqi?a|T;3$OLQJgK<; zSXII+HN9fvCQ?KJ7_p}sgLP_c<W!Ei`9#w1+6y`m)Sk4&_MJ-6s+_kx=w}|&UdEWH zDrR+Q_U83C`h|dwHit(m(<a^RKF8-PKthi-|6&%#dWaGAsK=iXZHF-jf`cN4g4)6t zRyCNm336tlL5_k(JUUa68}qVeOI4@#)pYR@Hmm4HNvR6;BsT@B52J!2aY>^7-hA`w zq-9b69*-(-K2PI0?cV0suq*eM?~?l>_iNA`y|KdjDh=(cb{cyS(1>uu3$+ag!rL|D zztgWaYL9UizUun+q4>kAx)o-szJe76xq~EIQk8u=ow2YsX`JqtQZMTcW&`-DJ~To0 zci47sN+Hh}nYFcV+;GT?uy)MU1ZDA7um__{Nr@dklUAK9$nryoMI1N1@;`DtA3lj# zT&zg3OIgQ!t~6g`*p4A|%YvcCU#F{%0}p$-Yxkb<H_s;;(X+PIVTVVY!E&4mQMTlX z2(ZZ)dM|s-7B!Tr9)kM2g)3YPH@7ZP;=br))23Ws+`<V_OJI;Jf`s1+%oIWKAcyX} zmoGBct<I)>nvybGpA%~YgHbErC(%{+<6^=o1!aqP^8%)YhBQQ%<Ka_R-B&Fo;*hLR zp_J$bSgQ&#M1g3Av#HYJC-Yh8!Q+hm@wXJtJ>DBhIQAS5<x&E@&gI<f3p)A>6spRj z;w5@QDiKhh7rM*xGtpZQ*2$m_xHZ%1Y{-NN&ySkkC0_}OUUizhAVOldOL0sr_Q)57 z<W5bL6@FiRwd`N)Tp&7Y{dj2a>%i^J?yZLdi!}$D+G?hoYm&M@)hu$u^~qFkpL?lA zN^{`30oo(h8_%8UhqUCBA|xF8Z%DXJBGLz29tiqw*2dR`CE(C^>xo`1Eh;|)a2hKf zD~eUk6R@gFAF>_ZucPShOa2O<U-aJK7_i}2!(ZZMm<HU{I~7U@RS4IfV`$Byvp|Te zM@pRZ&`1Tf+*tbH$%?F3JXH7NLMvb35z*U3Tz@QKZBkyV<ofLT13@Kx`N<6Xf<rWv z9)aC4siV*T5a-3>2A_38O+z`C{m>~Ov-gV;kBc;^m5nwxi5p**<KqDR$KnJ|jrEh- z%odaN@eP`NsCr?aH!N3Xov-}W$-6h!g&$2m9)n1(n%zhaeKWNAQpxus?g38|hnC2^ zZmV-DTg2Xpz-rHXoM^As`2_^x6wLl4rC~RXSw>-%!#Z~8oSjXY)tZ|)Bg-s#jxV)x z$cbV-)4*hlc&4OggV`D2YB?9Vn4>Q-_@eg~R3oec6uu0zslI5diE(vyTtW0}f|41x z@@mypnaUjychb&Xs`NZ*sEciLtY@BBJP+#aX!TA^Y*{|Y-&zYa8w_(awk2F&X$0q9 zCsYzhKu2sqX*-44*6nv36o0S!P1jR{1s;U(UEwbP8iM??Sd*m9zxvCQ;{voJ_2yU3 zAEsT|3>-s5YOqrDM+1NXf}afOG4$^tlC*$YAA+#>{y8lb3}i!GDvvLJ4j~`~Y<!@M z#yQI$apC{tP5{Nv)6%2&M>l`~!k!N$ME9=-6(|FOa~7W3O<0o}%DC?S8|1sntOt+9 z_j~X0N2(d%g-rhpiC(Al+G`G)fhDr*Sa1)@tXtKHfG7Q<A|kIiH=f%ln8G7>CgeIs zmV)Ww=V947P)}^>7Qw-TkYq`g&}DPYWj#YbJy~;^`_<$(%Q%^Sma9=~?x#}~*4wk+ z+&LLd>3Tc>Z8=_V18{@IZhCf4O8!hDH`zdr*=Os?@)Boi<Ec_(g#iyavPQ#7F{V7A zKoI*q>2(FQA%~OVg#J6omUXvC#l?%BC~*K6`auql7g45n>!EU9Nl;G}Ih`J%a+*j^ z!v=i&`isJ8*PZE!1191)lo+N?>R|F%Dw!II31T-O<(dE<+GOO@({--F7B*t|4M3)L z8*gWCz`OBF6>7eegqg(pc7s-$>JbVJn_d-M0s92<4O;ISz#fWh62>pxarxJ?<MI<+ zMxOGazU%SbZzo;_R6BRH*iF?r$nVTb2J&emsF+0Y{OE+V?!xAaPo*F(0NJn@g}o<M zB+bRA#%1xEI7-2;wU-bBg<gqt%hz8MWuE~@o??J}K(COP3}^7i-O}9)0hKl|?Y@?t z*cpOH+qc*r-j4~b(;uoU`CwDMlBjXBfd0sGl!sWyDdrzB7f7oCozsl~Y7_*ny8O^S z4?sM(oG8ty25c#kkA|m)`{}e}^hA}tk)2p~H^6JQ1N=)^W#B5QpgtWG20XN}_DPka z=g}_%z>7fxf^I<xl`P=6szD4jS1DX*4SpAhNt~Lb>%l~O4sK=WAYIJY$BxoR5vK_U z6FGkk=*I5oe!@y{5OR1pq9lgOsRpmeKZA<=DV>+=r1?Yc*Il^1!Aucwl_!Gq5%au| z_k~lL#m}$vg2e3jZ#_0AzvWFhkLeV!kgM|&G4vSmw#0F}?debHW`Gb%W!7+ogf<`t zYIViA2JZkNs{v8-;p}<MXK;qi67hL-^<;Qks1QRtiD<(%Pk{?z(&?VJ-c?9a-t0j$ zeHtZ@f`%Vc4R0$V^_A7#Tx`PSqmuOn-kPn_-aar|s|>frJ7s3yY2bQ3x7~ab)m`Lg zo1+C!LG4+9Yp6V9+jza@D5(CN?*y(7p^w5--$6X=WX4sm*R?<Okwfp<a&*)2<``eq zq|PM3AbkKtq{jqZ3Xi!1Nittq7Pl`$WNNj)J@5?B?HshSQRPU9)lTt5(;sQFAyV!t z{!suFu_I4{>S3$y>K{R%RROV)(&wys8c1nsA(SrT2CH?41DGvz0@PyVh)GSM!t|<7 ze1HO1W;MZeNy{FVs_poA;@&}XVDa(BPj0E;yWi?e`jQO-*~9MkV4RuK!f4j(fCMU0 ze6WX^%>S_5n~8QsRw9ySSo)RV&Dm1H2UsbL<4$E#Zq<UPoE<}<lF-vyoxnqK*L0Ld z?QJS1c6;~X%P?_GNSkJZQx71<N7CF^Q_%cKq#-6~hUM;PULg|YfK^e;<m@WcYn;`T zchX0bVKvH^hghz}DT$V>$=&GsoEx)5;BLSnbfiZcp6qzJ_QGadBi%Z~op9qv#ytcq z{Gq`I_TVKXg9#Ebp-{j9_AzUSb2pV=aa(EpxkP-bL;xBIYX@8`sA3Ii-42&#d+c74 z@lYv)yef1-Ry*lEOv!_8x9USl3tom?$O)(ItS}jBR`8fqVXK#yy#yYDIsvf?8m`Oq z=WC2l1~;-4?%C;ajo?iVsG(A9xN5mtfursoMq1ru{txxSK%$ZGq}HygZ)<nneb}7h zCc0fdwB6I+=(!XAUa6kGy}ds;g9Ry2oNDxdo|9*Ar8h}y%<<)-Mg&A1uMUQ%5YbFw z_*N!_ivPZs9p<9^O7L-zB{x${M=+(2Srnjg$q0!V@)&hkg3v|J6;dl~-B4(W@^JYj zsv2QUNQkh^ri+D#NXUZ$xXy2Ib0Q>JeOhxO4rpP@QV>6pp1Wcw-jSq_Sc&l2-_ssD zH=`13=vIYb$~9EYYks;?^xOhyRqgH2tnw3ONo^$LNwNjFz)nb^{fnJ`VXZ@9Y5H@0 zcFeQnV5OQsEA@q|Wk;PJkKTukq_TJjK<!bVZ{F_G4<saKK;v=UTdS_~Z{eoS*V1ls zGF;`sdz{97-%xr*3MhLY(xDwIGasbGo1X3*9Q3~@dsuMD!LH)foDJ%IHL8$e@vgv7 zQ#UL(9W-?gNkZb)z7%e5|L3}O1o_G?-KtU3mkn!s?eD&OZ6XO1=~c@ILZj&xyzC8* zAF18^5f7#)ddO{jSoM>Xhh(BDtZh~Jc7%&y3N1>D+0I9Rc+Ocl*q5tR26H3pKA`Z* zcBQ+rqhJ=YOwf?8C=B9Y!J82Ou&9)9+=i-Tl9wb$qSr?+SlsX$($=J^3_XuGj0+rK zP|V`C<6j4d-INR7t<`nCo&$BXYEVgu>8ifqGDbGV_#{+GMz*>Rn0kw|fPxzl8~v*$ zhW*k9Dh<iu4ciq{2L~@-FFiPBWn$M4!0#aSXV<CGNGq&AnQXFFB4y+N$*gRYbCW<r z_-L;cCrOS%SM;jqasDD7#`nTunBpeeQ=SBMPFzMylfdWgGohYw0v#L%hz5bxqogf} zE$Q^IH_~SZ5$@#Ek0B%|I7NlaQdKWXQd2gqe|}XZN#YjvJ`AQZ+B3OPe$vxiCW)uU z%x;WVm)%OPO|Zb3$)1ajLY)y({F7$Id8xOBleN(+L|sB7ve)9c_#H2$Pg}E4?9++; zcGUdr3=PZTe~Nwukq_g6p*61u(p+s)O5X<h;<Gb}g{rGWSKFQRyHZaQnsc`=Mm=aa zzZ0yWX=}cKKM<_Tf+U9vv>St<O_EJ6MTqe#hdX_+G*14|@&n~nBVz+xd)x+L;xXp2 zK0OBlKIi1h!AC{2^FGp$eY_A3Ai^ZEhas%!+oUQ@fE?1VITA?FQ1#?hq+%+Bwx`8n zpAmnId*MrXt~o-vZ#?xu6qny;L|4utIv^tu>{fYZ2kv<v|5Pt9^pB+#TOB#1kB8>J z)HS;2vqN49WzV;x6mrRjQ+BF58f`xTD>Fs$I!c5&Iv!mjGI0CTJ7{ArPn9f5ju#^` zqqxIU&A?CE{Fk5JyVS-yiJi?OPZcJY5o;$;;vTd^&Fgal!<Sz~hlz_qt}Hf;L$7yg zcQq9f5ohQHadw**Z;TNhLkzP5XWV&Q&@3|~ASSGdjFn${#l{5Idu#J)#%K5&&ZX|m zKhRT4GQ`WmowvbBYF$b15Xj3y$GWfI5kX=!(k3!kn*q6HG{kK?j!>t@5Q?W*75{=W z`yfc;+8bE8l1gGfo(1oQ9zU5ma15<GOzHLtajkRzhE}(tT6X6i0}94FFleVWLcSiB zL=m+~AV9o5ycd<-Jk5XDuF<0GekQ%}hNh{<A_;JZCeW16<YGQ`myE}UVAKrB@KM_v zABNp8!agYEee9XeZ~sB$^!Ld7vu~J?+-U$_aJBXA=C+Y3->#gS)vP$z&>)Gx*DiKA z9#(*Ub4*id=`vn<Cq{sUBFH{#h-bsiYI~|Pc90!O*dJy}fIpU_Ly?gavKfxK(vB=O zrO^5!hPUy#zIq4`i%0FS2g~CEmO)ACdE@g7I^8e{iadWMJz&we6e#=kuCW|Ne*jAW zaTxdhT_H<p?n>Q>Zen6#Li16r$tz}0kta9JIW(0l1$<waMAXnw>Q;efAyG_lj`S0d z!g_`7OJN$k{c-;m@!~&as2){1{tS{+`243L&kh#P`Q|keATIFN@6!$^KkWBMfBd!K zd~8uC^ZN?~Uc-R^iQUs@e=2n4g*@wj?TVoAXXFCFAsnlU;qN7K_kQyJ=W!$f2tXQ5 zJMOpbPZ^xdf(&kT{0B6IMF7M=gIw7C_in!2(W__{nty{#pz;S+h~stniKpm9jxRR= zcYs7Wn^r|KundS*MF|>69VoC@x7k2^!TXWqxfTcL#u*!j2Ee-JE+1w59m5wqMp`et ziY-&jN7j=+s34AbmmQ_l0%WPSljTh6dufA0t~*wwd^Y4(U(>n$(f-~aGaiyLY<D<E z0b2}0JznqWTC~WjQQX9mhW6J!^;HP$Vv8@H%42SLak5SJ*x>LGRCcIiJ90o%ftyJB z3u|{QPUqTlgn_f>aKiNcguc*rc^nDX>ktuJxEb-oKW4<_KW4;&hkspG#?qPEn1#3% z;7nzWl)hKrdB7>~gW*26EUDmBxL2kR5R(`)4_v3eV^NAu|M;rf+d<v12dBBQS;oi# z>$~}6*5k#Wxy!YJ#P=RtZ{!uh{eu2no&7kwC7l$XzymXZ`z4w&sFkau_pX7c(+AXI z+&zn-OuzI)XLt0_U!i{=XEz>W(#ocmi*~Qr?N!-2DEz^wy!-A7ZRxX3!K?6M4F$Qs zmwX1l<T2_7T-k_wsKg5=;?3t8>eCN(Ds9qJL_90Lz41Ob<Nq_?naotm1PhqT;Y4hu zjp?ql6UEATKzTCxO)foMInMs7OrnYQ@BV%pe&TAC+>Rwc`N3Wc#J4e7wWlU}R-jSR zGH}a<QwO|)2@CrG`HbVZ#Jgwm{aNLH%x}cidQSoGT8x>KoR=`>rBPDnacrUG#5xYV z4^xgXM#>4ZpI;N|O^y$Mwa0Q02(x<JW<ykmzdlB%Ca|baN~-}MSNUNR+<#~=Ew&m0 z*ViwNq#tD;wz5kCk@Fw<O*sWG*M8m){U){m;bEGc|AKm@jSiU=sIr@rJ`aeTYC8gz zMMlOn!}aQHzqyP;#A7_#g(@?v{~g~{kzxIQ2bsiufd$6|U<WMouX~m*cya>VfN)`i zF62L-n|!$VvxRpi-4;J`4bGC$cC1RwMwW}}{*JZ>jJDEo5>=mFT`Vz%_iK;Rzw?t> zO09hJ^JPLoTdLmQ321}+?(9*`4t_7hpE%$x{#i8et?l;)dN?KzWf6~4|MyMK^#Ml| z_&68R{}xmkIYC%Z&_+zH`yGpprN9x#d5&x)zc+-!z0HdlL(9MUgs+rvy;U#WGW7Qb zd3bEVSAWCsn}JZihFcD=H?$S<e?M455KI!Qka*nxtb|~2#D@BsrXdcB&*8hdWaPX2 zO|;o)OgKnkj_yMvRS6`1PZp*=JtZ5dw4IA^*sfm7SoOzb=KzAEcZYX9qZksH=vu@% ze!-(5seZ7gADmXrpE|BUx3R2dj3(27_Gw;ryxQqAoTTj#TK(%oxFRqi)h(&6y@?=+ zz&SYl(pYZK?jlq$a9m&v6+?<?Ns<A)1iGnRkyd4)1jMSWpO@tH_`?;%3Bda_=h0Us z5g_VV-4*<mIldO?^OnWe{Ik-f5HM5^n{4*)zQ4WtobsQd7w1~HL2d_P!72!Um5pEp zc>L6x<R`98S6jOnElr~I`>?a7b+g5cE}h8_0f8!$|Bh<ROE@QTCIM;QnW^<mP_#es zmqS*SK<Q!gddF*R@l0TaplnRn^HqWC{$jhy&U7_eff_{N6M#J?CtDMrfJOEb2xqGR z20!999RTqsKSuxLS1S~#NSJ5Gz-hM{EnI&%AOsw80;}LbVjCvX`2LA+{Zb!gBJ*Vp ze&ni1Wc;=6IhOvfFK!j^fZTv4Nj?YODeji+K)vCs^La%XtqLpisU~>rgc}LV;I=pe z9{{6BRv>y?KzaQq9)SGJ3ru9%d;EGnh{$U&m-T0rLoy6cQ<q_9W9#2#DXrORfg^Y= zKbk8>iq8W0|7NCG)C+l(M9*LE#a{w9RtZ}XOQu<#i026pcqO@kqa*!Q>FZGUi}la_ zfDgIfCbCnt#5&*#%z1Xv=Gb*Czv+jM_3yK1&?BDn@3*I9JN&dAcEK0~BbmY?<>`u& z_^}Isb)Pl8bY?Exk>~AL+{<2@978Lc`WFG`J^%>Vcy%**Dyx|`ThDX*(cydmPAU)~ zy9e@`rMdv>8+5h;;kTa>dE&>H7u!^ULN8z$ZBS{r$&^jY#1|_FE8C%;ll7(L&#%V! zU)l$LXxjoF5R>^Pzvn2PiuW4n&JWvD&Ve;0c(QZ=<cUO7X~VO<g`flD{~J3)w7wws zM863K*m*+uAM6}j8u}J8Ci`-FPXx_}AR5jP{3yK6W3K~AXHw85;l*@yl8#Ht1Ymah zfz{stsQ0f0ff0sb21L(yA}8atv|j*v7&wvO!=7__-^>^oPRGAy0qksFUZ>X}(_Y}- z2cF{`@%gb?3i)~v*3^XJr&KVN0R3jlHr*ZfP|HAGLl9Y$-mz`ry!4N4E|Fes2JkAT zY><-Iu?KN=?GH%C-@C7p90EnwcsaVADrbNaqZgz$t5H1WzRe!zm+r+^a9=8~?W`3g zcStEDTq2>Gm+|RU?D8P7DGJiL3?BX_ra`AS42toJ-~mv)T?Q@z1$MVbzRK%dI;Z(x zo88@Ftfi0(@zD4SD(x!K#l@iAMxgbrjvGZkD$uIrg`<COFM$4&0cT?B7L=<8do)UV zjGUFdpemUR`E(-T->7}fg~(Er*}#AK!#381ImL55C#esR4o0H4SBDWNba2NL0kWUQ zg2G~<Wuk<rA_QAd*k2JMp$r-_gzm!vcY)cCF8P~}9b%cX6eGYa#I9{Q-8kDsrv!A! zUhy4TTUYHXLK~t1fkH#v98&QLFx$y9=@r_I4CsJ{8w6+i6NLN|g_%*+Q0rqdI5CqS zUJp0Z`DxaBILj2%U2)NTvRimT+0gBE^j&tf6-SIm_JMOeVFRnh>*M0hpdezTL=WQT zUXew~qh_x_+d>!HdyLI`SsO{5`U@?A^o%hKUm#auphF`k0Qi_&C7$Ts>JNOUM|-k* zQCN2%f9ldPKQF2uHJAgu>8<tUl0tVHBf9X2tJW`0cWuF&{a*hrDX|kdp^&frc}UGJ zH#DJK^uuuX8vOoA-Q=EucXp(~+f!(*w<((J0p>V8%FwUxAGg_h*k|$h6!Cp*>Uajc zH)!PqHQvMB{_HDYO=<-0ACKt`>PuV)jU@2)mU+p!J-M=LjK6FbO)T{Z*HL>~bO9$b zy|bFUy@2`P3~i8v{i#piy~TmoxTent4KqyJLhu9*@rbGVuiA4|GA?tv^zhSCJ}-CH z(PP@yIISBJKi2^^0g@2{)+jPQo3!ToUg3wEsM^NL90w~87g#o89N><Ba-XvWw1r-z zd`5*)^{$Jcyj-^@4PWK2<=ugu9fGuPk_qc_Xv5xMPo~Lb-RfHNo-aQ)kcR3t2;<f* zM>h-W0f9Ughc%i9t@rr~Sh~fXkM44+SN{WPdxbgJS2-49XNwI2yw`}5Si|BJ<j$+@ zStbQupjS!$3#L0-xVrOx6m8by3EKx?`jPcS)>g^4RKJkJ7u}|{(cz0eKTy(al)J#& zE)X`7XfPgjgPTRz7sA!T_O^i;WP7WM^3|37LLf1kV_xjrK~8I*DxO!~{dvL=KDDA! zL7so_aJ8Zssl?;H+qrbVoWfa^(U*g@aBdd2&Zq~Lf=<8m-F}8ho1_ammlnQEX^mng z3qQjBp)t<Retr-xAK>}JZ+>t-0*PrXTh+{v8rPa&jH~EnVCdLc^3qxYH4$w|%LU-6 z%MRNanI!9cV4cBs<=&zTPbk|{*@O13LHNv{H?`5*vz)D~emzLGmJRB-=wGI8tpIp_ zq{POskX8zd6tA8hV8u7Mi{nbNJ1kj8Y7fVpDen%LG$yY!9ti6<Axw1-g^8Un-{S_# zRtlEPx$@+BoG=jnFi(CGs`Zxkkf(AO_<y^gix@0<36HP|b#*jSo_K?h(dmEOaHOUz zwC2SXZ_W)HL{Srh^<HW+BIW11n2#45oW!1Y?k{!LMn4ymH8Vh@eLZu!Oi!J0n8ALQ z)kKy3s{Fo7XW83GS1)rVH!QPDF9cfhXJ?<hUvC7cce{CqonBCP1pcFR>7~Vu7TJm+ zX>r7S?2iYqRaz#qV>Iw(N?ztc7lImn9-Da|S7j>tJ1Y6fD?6yc9oSqtHol@;tji5P z!+UPGf2QTU)xT9FC5S$ew=oTYm=OUJ8Crkzyf%o&0=4QL>zu~t#_kR8(-hCBOA@~U zmNy9r7%GkBVnhjQCfdxF-WCnFf#TJydWd*zv971XAIi^jIGbvX6@+}*cX<XB62$b< zy7e@}aNTnHp^<`J!RTtINqRo!v%a_2Y2UpQrg`iKQobOeGCsauv{!kKA|EPVz3Qcq zV*gYNFIOHipR&MW2a;%=D#O?36XmR+@>C}BdpSK|JhAcMPo*l37a}FjHpl<^sNpX- zp@QR8h=y_AAI#eZSCsCO)c;ko2q2)GMMYAZ_^UD5gYq>}N@n-3PK65ZP4Ro9TJgK! z4HG8^<>}Jf@0Wi!_`%CjD*c3lKUc<um!JRFtvo-kaGZ2Esx1cqjZ?qZhTRKAgwk-c z2INR|70^6pw6x<*Dm?D-{HxQ9@ULocs(4Do6RuBU+%6zH20nfxvNZuEn}~(M{d-eY zaR1&))j|*%KCvQAneVQB=YxkytN*Wm&+qFSgejL&YdS3oqIcu1mwnuWJe1x?G1VX= zho#qjQt!uYQmz9TtRIeSD7^M04%><K+^F9kPYqbv2kjXu6v0jT@aC0pb9ZEHc;8$V zDDr4uJpes`L6mKY7F#HX9b~rmd7Yy_!r`c8VKqbEUVnlO`L5Ne_i#UvUPcM(q};>w z*QeL*m~W7pZ*sQQH}Kc-3eQLTdne>=&JR{rLH*70!nJm*G+bc6?cP%$YHe5eSk2x5 zSD?tj$D4+2Ds_HdS$J!~%+{nMuf%(9(<l*BEy<It$dBJF$5P=M(~f;$O*GO(g|*g{ z>mt`EDDKH*GDbRoStg`Z%(!Sdf<BWe`y~K)pE-AyX;+bh7N1qnM8^l$x@NNdt%(Eg zb8CW9lfr!&uUd5>$_lZYq6<`lW!FhQ=Lfw|*%O7iK2Y=Q1PNyC#wXp^yU*7}DP&oq zbff^SCrD}3UXqBdJBw0pI6qvGrSR_Y3r?`d%(tysXK1~dt7dc<AU42kYP_7;&EE`? z(JC`}J*0hwc~A#hZbrFGYI#sp^3)3YC~x+H#i@wtzT<NN3aOb~VG+m+oS)Mi!hq5) zE>k$Z<P1t^H0o1OnUL~60*pjBUXCQvi1>K24=8_moNP#YUYVvFUmUH|N^E_vd~g;d zr6NiFmeSdENCN#;pd`M@CBOSX4A)5UimvgbFJT&vz%nkA<}#iEi!tcoG#J>6QDh!} ziUL{+NBZ(#mGyx((y&CK4pfv~P<j^luVUzOH9JmfNz<>dp_ALaQBCEu8rKKJyUr&) zhJIh5nOWaHBZZPv_&K)|s%sd4ZaJFGR|x-F6?1pp-r_O!2JX56(oD}suBXK3+JoDC zn9dS%vN;A-F!%8$Sa*@x<1(A`+^zovYQax{VsGror7|_sapIyTML=3EsGMas!j@0& z@el^3#WwjFz(#BO97aBV@+O56)8rZ|fLVQXdp&pipwF@hwANjnR5rq0eRqVBH9EE$ zBZ3&-m9#Fwvj<T?U+858@|+zb@)gVun~Przpgo6Pi;)+f6z>$`HT+nIQzM?L>nOc` zlx<WK^`589Ds?~&C8#F{nTrd{U&AmV=GU5=PqImzck=#5mf2vMzzDN>4lA)POGh}| z&94y<P>Dy2Fi6;gv@Aq%me}rE2P6b&WA=)8Oa^FIArWxMe#Gcdz!yT$fYru>0C$BQ zw&!LqfPSV&QcKd8`<y^InSg~F;eEfO!-7<KI9=_?JuTv-P5P$x%eC0eK91vNL8VF6 z%`Xm(AsV;tfsLPe1@CYd*jmQmv+o!_^HCNjpma~{_E3z(-LW;>K8mn8tx?e+;yz~! zt8U$R%~lDl_=H3eX4lF+4%%~cU5aU0`GX4>=j>Y4qkep!Zw@Hv^jk;JYdLiKE=`;Q z2oJc0k}IU+8nnrdAN0!3`{7tV(1`C!`w7G)3&J;z*W0#!2nb@+-{4^BExYc$_!*#f zc3MqWeV>(W-khqm#SL-^d4$VQhsbzpV2FVl$f4JQ+`<3mlrGAx!^;UYb>x4z07_#D z@Pe{3T8i?Q;T!_H;6EK$y<`~}VZ91x4M&c6b;7dl3`$im_TNIjyL{oBWSXTS!O7m` zeo9YKBoj$Gaqe1YC^_<3X;2xq;#08%_fU4;aouOx#-qW;YdDWUpBO%VP~>$81o8I{ z`r69qAlUg1wEF<Oem>G8Gt7}Pm1_aJY$c43hxgyAF;*Gpe0=V+TE9B@-j?z^XHLMA z@mzryYC&9PUE=Z@b1w5_&xXY|azAd>5fQNyxlxBk4b?bXwr;4`@dJv@OQ6NyQ<Blf zte`J$4v3#Yh+6=zd_(Sqn<Ja^{nzfXhs>u@rR}M~<;;PZ>CZo~9hcx-kvpi00|dN2 z-G?_naeJO@O)E-L-{&C7#H)cg^$fll@X`fxtp5<iWHMMGfA8_HH+i@ky@oOeDDN31 zW8&=&$n#LC<DhuN?J<blWZ#o;ui}aMY(b-4KPs^{E~EbWd;|gt?eOQ@ZjE?0N|nJ6 z7u83e#AL9eUEf<zcz=avcydiss*%kBi1p<?!I0O(5))Z$waK+eqRdd0)2;v(w>tr) zIMwG0f)pBPuWr0LS>~=l*!)b+=o*o=L&j?_efe#zEpX^E0S&R-4ec1-4Mz@8R**Xh zD~Woh455tRZc89$!4w~}V(MwKqd}$&?!sjA2SbWlTo_rb1a@<ae(mdSe4(+Yntk-O z>x(PRE$PDU4w+jVAqGD=io@2L`LwHqf8245f_FCQBJ*I{;y!1*SGAZ$8^zyJqp4CC zJKT&;X+_9RfJyT5RTlX}9>;yz7>Cd3xoeDu3(<3V4%^_*bjZN}7C`OUTC!18iL)ap z31v}FYl2I~MZ!5k!rS~AJ_$TNQ=S8jcp2YVrSTNQxNU6eq}`?u2<z<6BWsi{rR19O zsE&h%IjzPy@|3yg+r7VF#*45TS4S<TEK^v&2AEtenY)AFokOI$++k9<-tYmZNtL|0 z_SKbYKYx@*V>X1Nc!&v4(5w~i2lVG>e_<AGc7vr|^&w26FI*cmiLSz(NQ5WZdW?qF z2$J_$a15F<l~T?ZKDD6Iw^0Rt@XwUiI5grwB~y<(#zxm$jJ>ONC)_l{V}oh4CXOeL z+}#<?5`7S{jVfSM^a~-I`E!PRWs;`q-9_L}bZ<lLn-<&TYoSP$%npA`(2VKJ1hvu0 z%H}sp|4_C15kW3hF6sx_^;7}hrx+krre`TKETqt}`sV;!`e=AOoi3??cSjx|92Syf z8a}$^u8;-F(>DfB#Z$7YqVXm+ai5Y^yurg_owR5;{zkVtX=h9vcOS(*>w|P{qVc4A zQ%$>S@X+hGhVzT$SzVbxCa=nQb!R75sLOtikK6$7Emj!rsC=xuE*aC&>0&r^(%piU zA5DBZ4Vbw+7~|*YS0IDYv7Lr^J=lkH8d33i!gMQ{iW7|54OMRDi)n0P=fWQ&R92ea zy~L8tlKvvQK93!4h_`Y=@^2I{KX>>hv7l}YE9z4TB+DTv|N7wj4lYGi&0~JM=mSi& z>CRMZz*y_N#?NSN!Z#8P!NChbReqAz1x?JZvXxUn@u6PZzyl&IUK2!&sN*fMPg-r8 z{~cGv#LGUBQ|w?ZN8oC9A>4%fn28-lKn7#ad%RY4uEE;2C<%j(8ftuzZ{r}~x0w&A zr3~Bgmh<MGiwKWLRa&8+?!R)lgFNRzKx#U7AnzkBw->1%Vz(@DK<oJ3K_}#>McDE8 zisJX4vm{czP!!8vbTJtc15WjAgxz<|<*kqAEb70X50i%s4;VFE*(EGk;G-goR&kzx z#n^e71q?A-3X+8ai)x`Xy5?B}8mM(1oAPUhxSA|1uXSi{ok(99Y>O&vk|T!iwND!B zMh7aeLXebP{qBY#j3z7ep_ddxFx9&F(qNr52K0=(4U1e1+l+?d;d#(IN}oG4O$(EL z)}Pm;Ed;M2y5_wzsk(yE-fB!9IZ_wH4!%{GVM6rP6v9gx>kdUeh;!Y2O}l!nBdyfK zBA?mzG>kipJix|1L{!|n>RS6C_|e11{ClpOkw4cImte#lc%6juEwt}x?+32!udBb^ z>=_JpE#wznQjNVj-|J2IoV!*IjrV%5^i(FQkB3f>SL~HnGs_+AGD#jqEXK7o$0&n6 z(_&^cPF#+V7-$0oIk~E+4TDvNA}j%ovIPJ^qdnQZ(%dk_nQs~-@$S$>X+_pzeL{wC zx%*G-DlzuYMfMCiiTLGp9G%v9y{G(a`E`*EVsOHPaBEn}7ZYfSB&q|#m$?gQTaqN? zbcq*JtDi?<DN1SxVY$E?)LMd`!QNH@SQ&t-0XxQi=(PfwWl_s7#_ZQdq#AUGzP-># zE&L%D&ykfr0>#rTkMs(y8`3*hMhXx(EK(^VdM*Y*A$YhEX{QhSxs9PW`DytbuU`wz zSbh(Yp&udTP8K;MFMf~_0Xsf)3~%r*=Hz3}5DX=<%w6TmBOF~8BhnVt7COMKxKSr- z-sd(^42os&@`|4Cdx^(C;!84ThS^8oYslfYe?gX)bSIc2n>>v+!hFO)aw6NN>$843 z&cHk-C5KU(`268l3iDDTi7r>+w|mu54ND2OH(uaRL)_Kvl?wgD?)bgvYyQ1h)s%(P zz2tX(L*+BkG<MNJy;MO$F$ucuROO1Z6R#0yywwgwK(kK!lbT=VnbIXR33r1qN%H3a zSmaVeE*c#AqG2YD?iUiSHSvwr{H1d6-3MEPx>uLcW4>p7bjwqqiH0*e2(^7vC_b>p z=%<bQbn)$g%P4XHPCy_d6(bwgQ2t%lP()b5K$Wu!1{Ip9+Ct4}iY<RqWm*8#v8Qf0 zfPM?V(2D5ez91e3{r@TA%)_B<`!}u<6S9RNG7(uDOEQ$@N%ky}H4|mYk{DUC&SV+; zS~7}4ND3JwTf^A1KSp+0hX<v}*hhM=dEcMs_wW7BecZ=&U&rzNp6B^Fwf9a*nD|AG zZ8Mv_<&V<I>x9e%9q}e;wK4Rsy3e%MH{T8KpXrMC8)naSBOUC>>(_h(Z6y}>d|)yt zkvDqnDKPJT9hG%6oV;<Syhxyf(!T7-r5_2(y?QPOdn1kajJ)-c6vwMyVSje?-v5&- zx0mrg%D^UF1eQH(5UOgpU!b?{|8tl_@NWdgka+62l-f6Q?<gmAW-^vyZ+6dzx!(OE z{A_NqX3$4CEZeMlXG5xsl|@5rJ~bidXW-1D!bI)itldrI5&oUQkz6zX06A8Ho=}CG z4}~cyoc1UyJTUWV+0JCu%72O#^LrOMb=oc1ZNzPdjeShnO471!cHOm}$(1J?$)};k z9zIKgR1{jry4sj6aNI{&tFok_;jem}@C=DWr7WE_LAZ6WLC*Yc4dAYRO#0b`>vttk zhM3nB_xN9lF)r5l%!?MG-Xivb@af+R$V6Xahdye09qv7J<t3$6+SRC2xlD}s9Bp7{ z!U{!2!yd>Broo-y{^mxa7)bC4)vRa3x6ra@|1PA$EuG_j`5Unkiw^Ro!Sy88>>udB zJ~6vdWPkbaz(A`dwqDV}(L`&9q7d$xRA{k$UMfqjZ;a`g*fOuE?8|D={@(nydM|<s zTWCvLTmQDkY1I#qyZ!}Nhhpj>aKZlg$+AvF4Mo68R_l36qBMt=A}-e`qSCuDvFrMf zx<fX}1VJBsLa9*RPyE~Q&o$Fk(#7~Z&YMNwtPD*!^7c(0#NrWSxj7iS|B%qScutb6 z<hveU>X@lRIFfg@U_ixMr>Dy33lI;o*yK)@9*Pv{g5jNC`^by$*bXf_z~J!#odQ4b z&#^<fBUheo%(0bqSst3Jv2^oZR%!45{dhK@Q?N$9e`tB=u{#2zO^`K7<6l#oB@*Zq z%`@+i|0a2DfMn9HmCteb>hR{XAlfTmBW->7=Cgd^LxdkfSz5vzqX$VGpIPzs`UKd_ z60K}aIViMI)vGexyikTblrMTil5zB1>XxyCxj7?C9K-bGdrQ*ow+aLQOCZ)?+A8F& z1Ny~!S!eQ@E2p<?c)F_Jn-vc}YgoopAmz{tSH?THBCw|T4XJXB)I>kt<;=u&0P174 z8CsUXHjeOgrn@A%YtN9K8#1gvN4>99UV?@wD+619jj{F3)OYI2+Jwzpt%{E@KQOK7 zo+oxpkEN=|gE6Q$G3li^n_c2<-`-2ApLoPVk#)^7U;dW34MTgLY1jDty*mziXRN{{ zI_&aP*uB|#!M;!EFPc9d_fCx2r-UKLoYf}TLw7_NMptCw-5fllU&?(1oiLzGLinj9 z`n!K9P#OfQkJ91(&jIi*geJ%ZD}cbl$=8)X1Vi$G4pX#!C_Drm>@N9wnc*&AJgFz5 zfydU%C;Qd43c96V_#6K~cykYYD$X5az-?S9<i3?6=0aKarpRa?jCye8N29f~lE-!V zQqIwsBR7o^Q_kDICgy|{&g$XeBy0zkmE{g*rv>(1BgZqK@2`ncJA_>t8v*+U==qc9 z@u=D6&H_#XL{$0No4F}imZ9DQ39L+%ahJf%$Oi}57ld_PTH3?O4Fd!->uN;fT)d1C zAb)=>QX$jy;1^<!j@M}GQFfxJr4E->PRqJ5AO;K1D7g=|dM&_D(AJ%vQs|+X0PW(7 z)s@FU0gda$@1c-KE13Nb%;<%=(KzOBo@^YZIDOXRN0S-`GQ5F9=oyv<r4Z-tVa6QI z>EUQB)ZPuq03O={h5O_@lF60cD(~rU(z9f6DAwZ_NxBJ8xoTR6XlyOKUnSj2b#M(v zsM*>2R7H&`*WuCxofRdXcZAwU<2<ZAr|N(d(ZWOxRB#B}w49!^%tEDkxiSjUp1;OJ z$^p!V&HMZH)sEihe1acAa8j((0Z)S83x-HAiEc?fd+;sO^zJHR(dw-rm~gy*&)v>F z7%MVgoE!n+U?vc00;xYIWgvx+HpzN-WVZl1I2O47cla2>|H~6`;^zVhO4BhE*wh!R zVnG2)YI>OcEEl`z*~=hrQupZRD`?KTHppE(wN(0LVWIn4z0ypTWb*n(rNd9DqHIUt zsoHLwTxj9vdyR=A#nx^8@OEF~ASMiAKtI;_?_t{ZPuR21Gs5vpi2@gU0Do87VKO4f zI57HDf3}+;!R2fOF4ZR8O#?_HrSi>)N=eIYmIT~YJw`cko!H)&R}j}mccQ7K)1~%Y zc0WY}4XjIU%3k3j5cWAkqx_fYs}OaUyqqa}UJD?MvrpJFf<auFJZO?{^g>ChCgW*- zipIFd3U#R;;hOCeZ5cQ!L<3<GRwm4eZa*VHjegH<)*at~@^C91guVqGC&QoP>yrT! zuVX-r=*NMEB$w^qNiD|-wOvG|Xrp6hOFg(0kf!b&+*l^{zO#HEao=PMFo*Qe#cB}4 z5@kqVcSaUE_)3Su&EstiM7mNaJEDryO5?tAX2vdP*@`?6*-SH4jRIopj{`28$qvCA z1N3OgT}dsWiI4Z8eO3#X9z<Rq1yhAT-T{)QKT88wGA2S`b*|vlgUK3v&&AJXHjFod zkvg$MbjuL?A*;e$WqQvg)%UoZdtR@W+NpIiaDe*_ctV{2YP|sBL{*724Jc$12zq0= z5XS#ui;9h^Afp>%yrgFvPG8-xVBF-iFg+;>ffr5V9V0)59|;2s;i4R7_d4fk?_=X? z5dt{)us{U=)#y)>QfX_T)`X5ymKOe{{yLqW>q&%Z5{#y3lp^$v^fno8-i{(6(au=Y z+h(p2;@e1K=OxDInrMR@RYz<61DU94j73NWdZt?Qe~Wzm@UetUckYsFi{}9tqWivQ z;bt<j)~Ft{U}*Y^M!z<={ugXKn$FR*_PF%?I@md^H$RViPY+Si)yfQ{9N=B$0XDsH zS=Xclj@GU~iO~#>11`c6Q1YC_FCRqy0GU)AC*j|lJqV}<9%RcOAYP_9f9HvZIC?3% z^65d$t=wKuLhz_4#W>EZlA2)56QJH^TkFA!ppYC`N@sv`-)WblSK(b3Y<wF*yHC&w zhdGf3ZQFRmX&@vxM4V|p&3dyeKky+30&(+Z4(1@}u`O~`Y0U}yw{Urdj;;1GKj4CH z=QQycYmh0uc6oa--g~uscEwb^>D(|G7tz#HTvbJ^@S3IoXQUBt9LjQVIqIM9hJUmk z?+R35M66Ji1CmA>o7X$;UQ$?PczD7AhF&;A1gF5<5`hopxxDfl2xOIQcXd3$O^RGa z2|PufQ$iAD5~$@n+B<XHi!qiRVfwO)YvSU_?(`zp{#OCwa;$CT!}t<b19#lDbrwFK z1aWbr7kVYqD+Y{m4bPeQ)r0+RxVpcAE?UMOaG9K28!u{nrU;zRVOqO0FM%ypcEugo zSpG$|k>)xKDXPi>8`4^6X>(zlrYOaTJ1bN5kD{||)|c%XAsu+9j$0+Rr9ygy{n!*5 z^wC`@`^LC#&F$MRaJbO!J^TqT<HZmWCSqt@@C&t|3V)x<7yQ;|sKEe8?nC`LKPyLV z7%~tlyq#R*#}byK7`>Xb-W}?lN0QV2L-|tajghfDC}0~K&y6Zh?kEAvOjeMveGi9R zdU5g{%L2vx-iq9a@QJTG;wd$^cNLn<Q_RxeqXn7@=3}3n8`-7!&X;qaN|0-?={R}Q ztlzc)YX|K%ED1=D0}$fEOBXek{TmrJXWQQm5+j+j01m2*7tAu6@mj<g+e&Mzt}``V zd|jn!23O1H6|)hc#h6B4AH#&LOWe)u;`)#_Nt(C9s<SiNC*9eUSTnS`?0Syz$lV~E znN%1f3OjepsR`P=GIs`PmCK@ob$Z1<_x!rXW<t?9HO(#$q-4WDdrVG2e}klN)w4}r zem*O_iXo#M+3|7QIUby6hJsJwt0w>dR+m`wl&BDD*Yf4(KgQ=5kWpA;A=BCv$IO$b zPT+p%XSpc6m{<#X#QP90A+%G=|C639qRTZe5gbKn1wykmYyRM;%+j5#HO0ud9EeSq z$TTqwm>RQ)HVU7+;Gm(WM^;o(WT13KaGtrvhwc2FpM1HCa^yJE^Y>+S@7!+nf!4Ac z?NhC4Ryw{ZtR}m{yYDzQefm_FGC}Ze7=AEo$#1{uqt4Bpd|XQw(!4UesymA!Y<6o& z^6C7t7k3~vORs`LfiUa>7z5bi=etcsWA9rodXmw3$u>_a#<}yFj`FyZWSQb#u=Zy_ z<%@dgl-#D;+18yoQz5)^IJz~v%w`Y5VdfEJ`rO)AIBdg=CJk+7Lf4qP^r<F4s-_LW z{A2FK-`dQs5(<<K+|J0U@q3Qr8>wHwE`k0)!pRm~Ym*AhaV09Cf3(>!XdK4BUdOe{ z5w*j>3>!#80bC28L(=At(X7%EntllRQ{$Akr-uxFIQ^-y@TKM+dj!v1f)l5c{APj? zsza29T7~6o>A=&M)X}q+Uz5|Cp{XK#trTDPu5>9E0_s|aZkF>iSHhWI<CbmYH%-45 zS6V=&V432}{7c^ep&o$ZB5neDD2t9XUfV^rh$t1GYM!d!EDU^P((?%&RD@HtWmIRa zIcos@rbXC?q)eoO<>=w9(bG`0JM7AX-=mCyHLZp=kWcC#sA3{}46xI5BC?Ht`(VHH zCsRidnzN>)NB1uZ_B`Z>qR*Um2s@vt+OMePukUe|Y&CI5cbkrJI70*kRfy9-P<I0$ z6NY9-9ceuHm`J<qu6m;>FbP6tKf?Sg7}xOgg6%balE#AM_EX`Yknrk+8*P<LrVU5w zopVew<zhlPa?gITv_&g+`^5<oKM8qdzolwzq`dWO-VUYNjqm1jD4dz&zIko{lsB5c zvCph1_*|)6WD_>kYp0``^1Ir1FtOWX!1IIh&bs#7xwY1c$NbvOUM3FqHYyDp{SQN# zW<8s0EtdB(u&9~Dh*OvPSJ!`?Tx$Okko=YS*LgnE>hiB-0WZsvq0otY{1QB;RxTK4 z`;gWRh1cvfyahIs-Nwne$n;3%7a58sv`B~1E_NsVy2Pt(ubfK$`JJD+o3H-MLlidL z<doJQvOgPK8b6Yj;jMApnDjN_c+9<|E9}xKAx~5dXCp%tvM69THK1&@je&V=-2DXq z^oI1c8qWt(Ir~myg-I73bmuDzY@!q$V10Ju<j0ueafk8cXncIVN&UCE!7tlr1!_!Q z<darcch=u^NJ5}RRA8|!fj3Y71@qyuldE`^vwpl*(b=B*Z_}WKF4&Q*+HaB6{?8+} l@Ss0fSt0ctKG0=6fMwnc-hhOK&(K?f4RlPj%e3x9{0DVTNbmpv literal 0 HcmV?d00001 diff --git a/docs/screenshots/command_outcomes/done.png b/docs/screenshots/command_outcomes/done.png new file mode 100644 index 0000000000000000000000000000000000000000..c616bc8be07b8d6f3a2abbaa4b8329b4ac6f0ac7 GIT binary patch literal 8222 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 V^mrlkk%w=@P)P-e5^+Pn{{urWi#7lN literal 0 HcmV?d00001 diff --git a/docs/screenshots/command_outcomes/event.png b/docs/screenshots/command_outcomes/event.png new file mode 100644 index 0000000000000000000000000000000000000000..28da1539080662a18d58a4b4407696b4ec22c647 GIT binary patch literal 13095 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 zce�n=FS~XdYmqC~AZ~P}ln6im-oNZfqWsA~G3G&J?ShT@#N$xKL%-?O36Jc(B?T zsG<?>Fa(J}%;cEm?}L%@e{vps7MJvHg$atwEWJi2!J9D6YTJV6bl3YMQ30(wpX%V~ zH5aPjJUG-z{h*BAi&9W&TfF<m0rhbwUXsj`uyg5lKcy=>R3=a=?T=5u2L~J<rav$z zH@My+#<Q1~I84$sq7=0*ZLCK3vUCij2rt&tWvunh2#J{lT$h8fVTeDCXE~6OxE!vI z64~rK^QmB&%D=RzUqWXba0{SlYn+jkK|Cokc<~xHs5(E(watHKid}~dY5W$j%9P7^ z`}*p+?xd>;N6y!Varf6VSM)*JtU1({p$gYhSJ$iiD#gXuf(Y?;Y#G!6;j#SRS)ge4 zQqbo*Z#@lP9rF1k1iRo|2C7OW1_A2ioe}ou`x9@a;S|OL{R|F}Pp_X>tLJ6?9a!30 z!@QZ32|^*&Z-#-0#?%za)bvG~r^=wCS|xH&VYd$(o-PPI?52h>_g2<9Ro69L_nE^I zaob%`C9KpW`u!o{-g}b5Xw7s6;$e;zA!=%tl2JM&%{W--HMKvT5j`JwO$gQIB$o)V zysxcnK|Vp!sZ6?M2-H?-2{V@i#VASGcr|p=^D$-rZd~6l1KRgTer<n+^%F@+x7~Ry ztZBC~3+iWi5C3o$BnR&d87ueDuGE+-G|Q#_`qTc{=CSIJ@=a5ePxNS&U`_nFwxawH zR*pcA0y4DqrEn*TH&{Dk^A-XjD_rA+)OVf^qq2RqTZDb*yIKwOIB=O_WzAblILy<9 z;5DgJGUN4#4dlu&9Gy&wfmaxy$U$Heb|k9JF71I-$WHpe9NH+eCSp1FTIzYc6d9im zF}MBa)*k$!lzl2h2`>{quPggVR;DRJS8v?@O5PysLuprVjziyz3vKF27QOyx67$5s z-n;A519u4v5sO}xVp*y48Y#`0{kP)Bpf?{=t{)$$Z6wt<=G<CL_#cR#!QSf{>G`EF z>)VofpDA4`?Kd(DuDJFPT(u(tQ{!;Ks4;c#C)BEo({8{=L-TG?L{q#%o0`#2>r_TN zR^)mXDa4A+T6b`CJ9BJQ<@d|sBq^o?l)_+lja_yfdyxNUZFU<^BHuG@7YDOjK8VMP zLqDkpfs1NuwXLM;yC04E+I{*n2Ll=UE;nB)ensQUx*&mUN+{zH;mfoa{Wt43Sfxnb zmQyNLfW8>K`I+<m(`!J?Qz}Yghb`VIN*+&`(La?xgOZ5g@nxwG;TZM)@c`rypnUEA zJNX~|FBJZy@YgXX*72YGfg<7wP)>>s)%)Ar|Ap#b@B_jXK|Nkd%7{ZR;7Ln17kNK4 zIEs+7k>Ms&@pa6Z=h|$LVj~y<8a%|E)pjwjFq#5J27fJZchp^|B|6o;7eZoN#Tq6N z^YX<DZQ4CYQTmNVs`nW^8jiM^c5T;v-~!tBJ)qr%hDwivx}PJvKS~2*=}$6#mq+E& z=6Y2d=+Lb=w~?E4GTXL1ol(W&kpx@ev^huLQvPtC8>Nsd>G0xIok&Y_$0f@1Ncp-f zp)<<i1q&7S)&d9EY}Go(TS{k~FVS?Rh<2rz*&bWzoJ9IA?l6yV+;c#crO(xvXC5px zG{>Hd)i80zdJG_Skx=wND8^9f`aD#lXpJyg=UC&X2`FO-Z4x@Xlnzeh2$Kcf1<`#R zHiF{_&q|rEV^s8g+IH6G*M|GKNH;EnaOIEWDt7Sv6%i>JX+)A=Wj*Qb#UO<<^{!Hg zeFyy3>9`=4sb)lGBq1}CI236Zkscc5t^^Ip0e-syKAdv(n0VB4;a*C`n2lPa&gqDs zAAzHL${&Ty;ve;ifTZK$v^`drSD~vqk<jG!$JSmSdoxAqs&PA~M#(@bR3^?McS0D2 z)P&=Ao@nU2)x&5SYd4sf7nS4V^uXE96m4qomr7h3*#TWA<tWEfw1FdpXkvQ$k^FD^ z?QJjq70+5t&X#�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 literal 0 HcmV?d00001 diff --git a/docs/screenshots/command_outcomes/exit.png b/docs/screenshots/command_outcomes/exit.png new file mode 100644 index 0000000000000000000000000000000000000000..8815ff6ff020b4299795917111c947e22f981223 GIT binary patch literal 8062 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 PZ?Gy#8j4l&=Ar)w`ws}U literal 0 HcmV?d00001 diff --git a/docs/screenshots/command_outcomes/find.png b/docs/screenshots/command_outcomes/find.png new file mode 100644 index 0000000000000000000000000000000000000000..717973c7d60067b69481a3a798d667439ec5080b GIT binary patch literal 12451 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 Ppt`)wo0p|hhJODKb|S5| literal 0 HcmV?d00001 diff --git a/docs/screenshots/command_outcomes/help.png b/docs/screenshots/command_outcomes/help.png new file mode 100644 index 0000000000000000000000000000000000000000..82371149e8dbd12836a12363d813a225d81cc188 GIT binary patch literal 38723 zcmdSBbyQVd_$^GAhc1zn^3dH~N_T@aB8`;fp+P|<q@{&Jhcrlslme0pNC=3OAl=+` zUgLeo?|%P$<Bso+@i}04IGnxq-fOS*JoA}zK0MV_zlV!+3kL}a30Fx`UK<GsMHvYR zIRy&?yrb$EbO?S>u$Pn5RFadU({y)zVDDs$ganPZwy+>lVu$uyT3T52e_&(5aeu7+ z<jFH_i=e@d-VUrDCy4mdfnM|%$jFk?Oc3r{qycX+bZ?-gc*#8Y(w_I>g!%huDLGl0 zs4I<&e^@aMx?4d$*&Wn%Dd~(XQ%&8jj*e6m8@7}blHgC&()Egjqgv8OR0LwwUGqp* zcVs@@>u`__%?R0|l&+U{ze_&~c}Ff?uTGTUBT7W+z=gGY*2orq7LFzo>EGN)<i<6S z!&sMxCNH)|u1jVMw@ZWyqsX!7b@Fi;Y254V@92*UK_>Y|Fq!Qd+?}BH4E44?-MbD8 z9#rTF!EG}9gKlpT42&zu@YGwQ?I>mt2<9;<BN<Z{b;rr`0^tvzu)4m@4|jBkZeL%I zEI}Y!=@3Xz<@NQo|M~TGPznz>_kxv$@GdTrv!|8y2ehrvU|#iY4V50KsUfj~*H}o% zQT9k^;1x3Xz6HLKkWdpMkubskMBrOK2j$OiQIvB~|GY*{L3~g~M@~rz{I6r}Zfon} z@zB+i_IxuQ3^ir1Yv^gHrYdUf>da|r<7#Eg>ErB%I0Q-DM-;qtw)M26^Ko`^@euWq zp#SF+qTn^+Z7zDce?H>rC_!(irb#E~>TXLX$jQygO)rT<M@J{_Zu3A?TmJ6v!@*Ay z^bb8f-9)*#9zTA}`IwK>)!mMZM?^$~i<_5=mzM*4g2Tht#naM<!^MN)*C2n!k+=1* zcDHx)w0Cu(LyT)_<?7`rK~Il3(cgc+uG7}X{@*jXc>KOCaD!Zk-*EA8a&!G18yqT* zcvn=@-pAI-NZ#HVOb<ARBtN&1_&=Zj-+uG&8UJ&n;lD=;2n+uA$p8H2e;%plVe2mE z>I_clDf#b{`F-$zfBE}BaW2H2|7RwCP4hqRf_aw25$F2*%p`H7Xp>Ztkff26<Yjby zkhd~1t4Q>k``T}$WO&?lA6C?rmL8}IX0Psu&dG@(F=4N(^hp%g`fN})!uqB*u}eDu zJ(^B|2xlM`8j6BK#Hc)+;Nf>M;^*go<~@>;ww~6+cN|pm&HH$LCx2o6$Nu5twsE0y zmoLq+;UQ>>!GFH!P(z$3tZvGnFiQXV%E8jq`Wo@~M`;uqv?8c)uq8is9MbPE@BxAU zvk&CIz5Q^aD1M?yORnwe%&}qIvRA<AljbcU7pH=zpzF4PpS|Q$Jdgi#p*2Kqb<iZv z`^FoSrE4mgxi`PG1)5w&ld>`6-s0b7GJhcZ=LV!v-Y_pZXzkUEetG-&1`LZ@)H9Cr ze)CD1#6CST5#6t^kW@mf66j=^k&fT-502Bl)t7QncmplI`ztebj>t(Y1{E0x-#^N+ z>X#Lj-4*lRiYrh_83f~@uBhS}*EtlhtFswYBuWOJDRzdUukJ2&m&}zKRHoa=Q2aRq zGSTky;LQn2_mM1#x3%`;cgZ-68Dq$~lEDoO#od-e!Qs@-fAWk*!uZEr6T^6+MhcTk zvf@i-HJjbVPGomDW&{qYHqLa-h$I`EewikY!DNY^?f21KxRK_IKaVdMEr4OsUTg4` zQ04n{0hJ2#_6i&o4ULqm%X1YlYSJoJ{D*V_o#fXPd=L7=F!2-TTK$g`txz2`8TIKB z#XP>L4!NT<ZH)w7)kr^Wc3+KV4Ga3uoYSC*b0`bB%vB{a>aJXz?w3fO?yog$=+!>d zY6>{5PNxs^!j=+tDJ&>ZTI!16Xmaz`tO)emd7s9|Dni19@$XDLxr3|`Gu9o2FE@pX zLl}_w?l~nn-3>O){7$1EukXd`>O*7xvnszTb?9jEmiNRn+*|3!m*OYIXSo*vWu(XX zy8wHh2Cq%LQaar=@A7;l(Gj)&^iEbBm5BSN*OQVLsnxbO%oz1Qt-eniS1v8wt*uP- z3KjczffHDxbk-#kM7S=r-DgqG6nmVEf{ueF2^Dc$l=eMcP2pH`@h9thK}{?i@pyAe z&0)Ht9G1kYR~^$|ZqhJu2RqIHJei3?%tczS^|1mZ5t_f36(?PWEiZ8B{j~?XGg>HM zzsPaAqNL(pEKL%N4*bdZG}av+wFb8(S^I^yR?m%zfrM;v-|Cq@+OqU8S@iZhh6S8v zEzs<st0qU7KK+mX3=6@^pDZ^yHlH8UvcYSo55PmBO$%3mjs;hGH@JK;zS?ZRQeja_ zeOFT%9K&x8XZUxSD`LspYK@^=*`_Zn2#4BYOa14mD3XK}1teZn@Rw<wa1x{byT5HP zP})>mZ6hPA@cx~)MWGN?TdlpfkKV`ryZrKQODnM4@>5m$v-#r2K(r|EJg$E9_sEX~ zIe8?w5^$zJSEXo=qMNAQ?EhK#&k6~72!c*@B+YojpAeJJkIbsf@}<>@>d$3K^MjEU z<YMiW{zNbBbR^P(#2;pYfA<63EiiIkZeQ)+le4G=M{6rT=Ayj!=L!jMLvo_E2NIZ8 z3sTGy+5*pSrD#={iX<_cw*|<Irw*bI<?9w}Yv;;FSkMz@@4tq@Bl@bTUA&4+8Y&<( z;-9ujmj7-MC$vyjWv`8icn}hlUI{ugCVqXr&u&<i!|yPm=)TgQ``WYt?q2aUD0XW! zH|$_@nk!YYXYHaW+kWYdQ<MpHPO8Ae(T@LZL;;71IIz|RFVBw)l#^KNZRY;Y9bL%8 zowy&9JzJk^RO%ciZN9xv3uO_8s=f8z9;Cx7)tRoiU*NXX<-XW~Y(T-tn>3^u%s?M> zb-^2O;znxH;`7M1=@#FEXH0b#ohTyiD^I*2n@V5_<p-SZxo=K!oSv>_+k!yjzB4bO zf*}S!<om!y=aCZTHXBkb?N(v<CJ#gqgQM-)J1WWS@vnqjF;-r{HYSQ+CPKAjX(ap@ z`(kNR6k^B*nmpD}Rx&Vs_rE1sc1IRpnY{Hb-{+70{p{#eh<0nCoyT|VhBMqxb}dDG zc5^1mjQCLLptPFCAdGQ(e0v`cB7-uxFZ$%6xKSn)oZ&19|B0Qw)gk56kA0ua-g<vf z)+;mQp%C*fBY|p4Cv%x|&NjHF)H}}(g7C^tv6Wii&EFpUUIMSn{@%wt1zQl%6F5u+ z)5IQEXdiHU!AbAlmj{p8rsoM^^gvg{jik_UmT?eta7Y#`EIWdcL)`^k=c!bmt^I!9 zbSi|1tLA;Q)P>&UcUVFt>ZxeN$4y|~<lc)i(fG)^De$~r^_Ad<>d_9NV(kLuWQe!w zDhiP=)m)Ruy<`p(_^_1)*Zt;NuPxOvaJRlEySb{FqIz+7$k7uWA*e~{kZ7_{`%Be* zowUdkVs){ctunJ#WBm$K7JM3UO%b_|p>l!&#iRGIY=@GQ4h}pERM+ceeC5SSm@@UT zXRm4>ev}2t<qmDYZpenlEX$AIyGc5k86=5Nbo=Y8OB_6Qg<YKzuwIeaRcU3?sx_=L zB?CpJF)-oo6hwC^Le@L>*G5c~iK@kX_wolxaU$^$i$G&-bDC`2P7^P8OWLScgH599 zY(02g02-O<P-faxZ6S&~{#?_O=e`}jy}iAIGO4@aBo@=ww0Tfnj9d2aa8WIeY!E|) zVQv_qo+(-o@K_p~4974HJT5XMT+|u~;n+hFyOw>!q0^=a-bHpym>8C@9lpBA+8g!d zXUBshS&wVaQ}-zOAI53JYP-Vhh3y)Be&)ST<&kTCyu<n7m5_m?vZg6HmsuH{b$hSs z;yJC9nL@7GflBrGlH~6oauE|;nuo@OJr#3yxLHaopDW&U$|52oN=mTi8|cJZxXSS5 zuJH>4(aICWO}hlVE4lCZP{AsK+q#uz_sxPX4<Q3fQ4zEk)q{yF4Af%Yy6Q8o?U(fe z3Q_W!jm+v9MP=%{%NrkGN4?LI5R-#F`-3&gR6F#vLRY_!6{ze@nYbD`RiU^5=!3F} z!A_2~tHBCzK=ts$A)FVPow~zmoD)2Q5O`z90M%j0p@K>1;&iy%@;h8M|M9c5Z+5m$ zjl?C?hCl0FzKE(Q$=0Xpdtmge4riLc&bNhDW6*=x4N-C}ELZc6Y{%BCtnk`F${xzT zI=ExY(KD#<H~NPJ5%voQ?F-NU$j+DP)WC-EXr_905P6-P9c+EpDNhZ>*BMIYIJ9?k zWVK`Bo(s{yD`QrBC71-zQEB!UJ3Ejc2c>Xm3&Q32NIJ|~{RW;A-$`^$;(S*NgP*Pk zs5Ruygsj&vtEFQ}Mj`bQlpa+1jZlmV5i_gCO_iIJj-YmYyiBvp(o&`msB7s0dm~Zm z7Q2Br%xv%3o!<zpOqTB4TBTdw-+F&#fFbbgKueNsS8EKJj3S_blC8@7$6RsVQvY)w z)ty?`1+&0J_i?zIvZYbYgXeXjgSzS|w#^aN_4*i9?wbR5vUP`M4;vz?Wbu_T+SsqQ zYDQQiHa@+v<^{tdVY>b^v&KOj<R#Q6oFw`MGPk$qnrgnbJX*dhz=5Ok(q-p!ja||q zWOz<9E(>;MZ>x2FwpoeV#(|FM0@VZXY*bGZZ{b8%xJ+A<isEm2pgHH4x@tGS-g9{o zig96=BW+o7PouNR){b>8S#U-e8oWF7v9xz???xev`LrpCP>m|_=ETRVa%jVag;$rd zWUU^XmW%tdzv&!Hy@OnV#fMP*Z@QI68Bpq&yvHK)s>}H0pWGQ2+zwLZ>Cnrj_&;yu z6Cl#*M4A)MpLF{F)6a}ue&B3t0&q;({o8vMkZq1z7u{C}2Rue3?jUjorI5=>R=a&9 zBJlte>>vGlyHvj%N7%gDMrnPj{FP~|pWe3*ugKlhX-Qah73(TNn07xua{m1Gab?;4 zxB5R8+A9_EwO-%Vetj4B6g=ee#@bqb-=zrh6|h|PzC2zq`kCtu5(+38RzKTie~4q+ z5OJJhC#6+~q2rLmtz`$9C3D_q1&M7SuJT2ZetEk1<-zzFx5ZocRb`P!U*)B#@P923 z?QCgnlSEO^?{t@EhcQZAr0j;8EI5dytaJrWlk_`KWZ~5$+ARgR17z2(=(mq|%p%J` zvSk2?KS9uWMzJm6ls9AK<(=4P6nuAcZeARWYXHzexc=$QYY45RxOBbe`j~d5S!-}3 z*ocZTWE{Hb!Nj*gI_v{by!<FP01A6}4gheOcGm!xL4|1vS1vdD4UoR|+@bgOr%WcE z{zBz+n}neF0?AfOJzJ8)C9H}%e!=~yrDhNI^K0+wk1uZr={*5>7>Y(=)=UKZk_Cj0 zeR(vtQLxnuz>@%TO!~Rb(ID8VI}#T?dhzW}o1@Xt3mOU5%9g$8L>8U9hk??e3;5Nx zL(KQzdg~36R>Zo=3U3R0Z6r>9!@#}OKO%L_4iE=6lr!T3h3FPlN9fUFC#r_h_~twx zYSynft9T2gB3gTMsvKP(TUE$urglKba?fNq-1zF^lw$~!1jjJIg8HK+sMnCE@Ki@E zZ{duK+%)C+ZdEc^jF#7`iGoAU$&QIf)t_Vf{X%Vjd~eC=V-`qN11~isSzg}J(2v#@ zUcdcH!r$ALC0)b=Ufm;Y@6M{6THi%73(`;dR?z7x`RVu9u`7c~Z2B1<n9<~AoY?_; zPxp0`MFm@b)R2$}CL?m8b|T0^{6SX%B9DJ$c>b6(I*s;WQH2eqaYu&M*p1LI;W(m_ z+zEWv56TCl&m?U6s_$M<mj<W+gi~R|(~DNHKCU5Ex8nB9zA*6oXaLl}`HJ!MV-@$s zHe2R-K4=WRa@ocq+St81-?_K-ST9!=eYL?0psWz>X;6nkCW8;L+U`GGP8V>T@O6s_ z{Z2YIJ`T!T&b{SWsS?L-6;8IES7ygXA?UM;2+&-tj>ulI?*O#01<x<E!A@A9yNL{k zn98TFyK=#uxk?M3<sIsU3gbWfl-33UFv>zgu}-1!6^CX%1|C%r`@Iw{bA2UH+?NGt z!_{6rFiN*54t-rCk^0R}gV>2SnmiF7$_JKr^6|VsmqV1LVH~GvV@{b?6dtv<KCiIL zEQi9Ag%;nMgCAc^PAQ#1-B$1PnLa(Lb$HkA7O%~dj&{s(FSjS^hr2V5mDm9}p27gT zu$wk&(v~<5tXx$QxkdehLFnwU8(Ec`1$JMC^ja>zd+s2h33dnC6xPL7r>ltn{KqZp zTic+{O-=}J;r@QxVstth8ANo>t?@@LlEU!QVid@gMLO;j`w31{l3knvMm(6qK@ev2 z#Luvmoe>54Y`rsbwRzxS(w>0BWJ!{CxTQq6D;^2dF4!Hrmym6K@n+@*GTYhK@GL+o zp3c?lUOVZj@xRIyB^kP+yl^s$XpAuX^P}w~s}QC&7jR(>yj{<`J6vdY<IGHO+=gi~ z+=s3EBVT4qxK;*2`l}EGh+^C2k%_I|UV^~Wd$hWKPUvBL`~ejNIgqZw72QNPylk`% z{6YNWk!3!#UA-|JMw`Xy2n~p|Rywz3XmxPl)#;jWQZ@36<<5+zZCs(&AKUhg8vhhb zapGv=q)d=34T-}<3v9_`MK0r7#qxZ2Rsz`2>GR=Yg0yctNyBXO{N`_|*uC6p-_?E_ z&6QgP<%xsC4ZJnu+?t`NnWzLbyC44`t`(lR?m-*;T_IVijkX?7=8VOqGTcpK{r4iM zWzM?`8vwwMCOsPVEcSEq`%>s|{+Sa|BKEVQnUXRYiU3qz0zG+Pu{aS{Lj4R8g4B+3 zRnc@z5yS^o&6~3O)3h)(tfN>(S;BBsp}jF21f=4ZvTL^JJ9{0sdmY+^7DT5?-c>p1 z@)<ihN)mJEBUtz=<qe>)c0ivi(t3?{rRj%bztSIH;<}BuZ9&3nfzEg_StUwvWojgl z3U);j{;b+RyFwo9imsgKbu!iIhv?nqA7MivgR|qY?Q=g|Dokna)}m-*zyi#XCK*pa zBGHTWU4_tW(zYr{HY0V_7=*3E?`W%d1rXX!pS82=>*1$H*j=9<v8on1Hby6Wky0YZ zm10t5SXxdn){<?PC5*Jf*d#4eKM6-6xm&f1v-`MfLnfcYq`oZu>wdy>W*X<d4GA>E z{@sud0HLu3m0Gav%O+vRP?p&rAu%_;*g~e=^fWs@K@lafMFT-I>(247QY_)6^kUIZ ze@gC~>1ge%s)Myd(x;t$*NY}$#RTC>FPV*$2?Bx_H2^(DTjz%#MoSU`kkD+67EE+k zB}9%7e#`QsQ9G<vz|hfh{Gv91(WIO^;uTrx_~OkrKsE;Fr}BnXqdC6xp1=@--mAhp z1f1GHcjY>WG<a3D=r#xEoyQA7u0~0c=UaS2@kPs{g$#F}Rqb__$X_h#;z<=N${qjs z!pGPvRL5QJgg?xcxJ=bXT_7cA>Gx%Jf8`ghmv$#o^uH)r3#trL9~Qhhc`F)?U9B_2 z)3UXr{h}kdtZ=b~S7=~_&G|ueUv&^P?x?umZ3FYc$@^e~;Dkt5E}q{^i!?8SV`Q?H zlbxg}ZIDHWYMGUuW!S6jdB6vr^=aZ*Q^>MpykURk`x|LV*P>NFQ(!UHRQ<JA03{lC zh!t+Ok$9L|)%%x%VEn(rsQ#aGvYJ|hjMLH}h!yCU8>i(9mSOzCibz;!dWp)(>?~ZZ z2MGt;v(u^iP426@>3}pqSF>g%=O><3YTvK1rS_aQaseqq@4OSYy)z6GQ!VzTh{v}? z0H+2VD_fZXZ-&D{>ly;^fD(B9Rp04Lv)A*+-f~&?C%*#p5D|ivE!MebBr;QL&yY(( zt5#*v89G*^#V`=h5cR_SOZs3Fv-i^jF{u=K)7KfR^X)<AE(>ktu-<6WmjEd=!fWo$ z1B&9?NH!M$JPCl5ozbw3zQm&zRcwb{e$^+3K46~vs(+hI{#Sgn#m>ic^nHFyzy=_P zu@+wsP`F2L&D61_3Xe!ISNR{i9HK&?H}5xl@_elZH5Y>j&R<mB6B}HZmk0nsF@SmR zGemT_(J>1K)U-k;i$UtvZgjH*oMLb(B;A_TZpL%`f?Htf^*#Jzz@k*|ZGCzphX9II zUq7L)jN<h#%>gRP2GCOO``^^wrdDo4b>Pn+H@Q0oX>HXqMJGk4#LA89w8@eM9H$g_ z=3A4zc0i!zb)6S)^4?A-(=i!8!eDe4>CcvG2iVUvlf|s1v6|oo1>d^_(<+M)K#ul^ z3a&<N7U>kKYv;*h`yPCcr;>u18jTHSirKBM*1r^THKP!8N^NeNs<^+&-1Uc?+sy=A zD`kN8qL{~jm>RjI)u9xFu=T^uY1`op5%+`dTK0f@>H#EzpL}YvNxmW>g@j)%g7|=I zWLJ=60|aWb8^mH<Ta*CM;j8zVVg_KD6_5~@L%%zuCYP?tIp^No{#<kK65z=@{R<o& zuGlzKpJWHR@p1YPba{{3EM;8(GScBkueX4Fo@@3R6204UUxsfr%KO<(9@*78z^oR~ zSt>sU(Ho^#+%Q=7>Hi>bIt);<$e18K<ea9Ol6+NW9W$XJKM-II9f3{C_(1_l3@O9f zRV&dgPMDbvQeCYLC@QyyAvpA@+}|9!Zhg@jn0fRzg&A6`utNkYS{+P6c6aNkA4*H6 zEV()pH{>*_SEa=X@Mu9{XRZ1n!!ns0bbXZ|_Sj_-^9i4Gr8=$CjaBVwTpVRUAeUR) ziR!@qFgnj<Pi2G0B7C6A&9ND$4gX<uCiM#;fB7>qL{>J8JK9;O91JhOQXe$zYIB|y zETu`!3gInCV$2W@JgfCG+esa?Kh-n=E3d;^I<opTDpmRT*w}<_u6`o-Wf(2{!+uH` z{Fx`?owcSMJ8MUPmPb||1B8LzQ4#S>xW$Ya)7CPr4lLEoA5c{Q;;VtGgVAmzOHb#O zW=|$^U^t68)Y8xko9PHpJzmj2Q-4!ER>}y-=#Er63UFYe2A%^_1gbvs+q`feNWjse z_|#g)&tYp0yJj!=V;TlpNd0amg^-J>bbVFwCsh4H1fF3vsBk*vw7fOUAw2Ym=54`G zhT(jw@uM>>T7Me&1%fB9`r)-Rf1iUOIF^WHvp0sEZ74xP!;l%2gq3-t-e*jo*MBol zbY=+j098uGDK>9!JIm$O%$mDM%pmQxa3)e+Rox4HW&m>&zS`}^4|{-mO<qfm$`|m6 zpv0h(v$FllZ`4zGUC*UIoQH_pzH&h!s@oMnvrzL86m+!Vt^aU9q|s-cxv;N2PeWPy z-dOjsMqPkJd4AvP+aKat2D>p`%|fKvb3Nf!5x3zIrWB*_jc&gjRCoY^odKEK76k4- z>}l2qKkdx!Gon2?5dYajjJ)6*I%yBKJAkC_Jknxe_D!PH@SPTR9piT+<@WyF9K^}A z{<LD_ul7)NRPpIMD5!Max@AQz5WzoZAP@gYo#_>V8`nD(CmQ@`^&}%E<ZVy_ClyTj z=E=_iB<iYgnky*@|07*gx`0&f9Fef%48F|iH}<e9Q)#UYz=c#>NDoj7yXCZ8><uO3 z6AgA8;Olo=QizkFlu0@Q&>Q(xZD<lZmRby+h;*_tQE}ho(xQAEnT(VgUjcbs?d;RA z5debe^+LLm!~44&viAX7?l3v><E`x=zB2-a)&d<PkOm3w>xlUNv-Gw}NrU0)M=iEP zWCgmN?zUXhYRP{Tg~dA|o^}s>_g1u`L-$dixP6L5APloSTsBCX0Ga|CtwE1P1MKn) za{Z%Aci4!$(t7+tJwrG*!0PN^{k8t~ZK+yIK;R*_>D4^=kU(x8pf&HajC<&u&1W~< zpWe5?9{SY|AHKT5pNi4Vdjh!bQdi8|G^-j};zm!Ul{%t1{e2E64JL12_|E&TQJ)vb zox`_r)8geUK<3-nM>DidVKd<L@*c}q8k`A3)q#mU{*efR<&87BpeAblDz5emUJHSO z*FIiPco!Wpu9*!}Z~h^eY0$=KuFcEueI!G>rYTeJ^2CALw}cjF82H(>fM-F}xrg3P zz8$vm{zhNwE!nIiSG1;qwB*fXL7GSK?Zda6@C!|;vZ=6$u~Qk1_RXG)KjYp)X@e?% z)D8YuJ5i(qg6g5xU|EuF>+eqiS%oeO5J$Z)1&96$rHZUTQAsFyYiRUWtMMTMdXB~n zd(7|6u1Hr5)EniJA6B-1rJ1ivKz0$guVMdtR6adWii(?KlKx5=Kon$E{+a)w`tSJ@ zqJf~3zrm^hPnnE(`~T$yX@^ULWK`gHxUrE<S*ZB(69jR7HzsL?0aBF<2EYWd0`4R_ zsFOV&jh=2aUy1m1$oz`_bM;R`B4o*hgx#hkO63RgC|PJ@5+jVCpZ*VKsi*vC*qu_) z3HqE;sD7~hk52t&7H@v|-t${bfcxJ2_R1Ax6oa`QUR%@o7T*F8__MskU>A*L#&xWV z0U*H_m^8S!A8zQSfrQ&35~x|Ed3!P&Fj@(q_!$D&#ddq94kb$zAt5<T6x}utx~zMl z4KepwLKpGgN)0&v@>oBhDAR35t1ZCS_vo`7pUqRhVW9r@M!iIYr4=CIq#)GlG(J1t zl~RThy;5cksmoeP$fpX^CT*}22nooC!T{wu2oQ%Z?S}i@nOyb|#AE_rDjXA^rXL)O zz(Ve42lmq&=x^1#*B1;AO?ah*OhfEC71vIdB06-3*;-!!>MWYyc}5o~GKG2G+cO0} zkOL(t>VaZKWO{zn<SVK6H!lQu+qj*|aPNiB8=Y0*p<d}1$i(edz0pcx7`U=iYarM2 z0wTl+D9Rlj#JrZw1U>+lOq$g;f$9MPQ`mlh8KH16DpaSom2ez~KlkdMiP!^tu=TrV zgb;42%Y&By+Q^G~Z$Sa4)exfuGHL<fqmds~c_Q?X0&HQzuXGvS;sGb44zz=P!O`^# zO&)!$Oc@v8;TBZfhpKkU0&ysbYVhN9>U^I1Pn?HbB%c7EgGsVJMT?ArEh&BJ76{ZP zwL?AdU{-g6uHP1ji<FXYiQ*OpSx>qST+F#u50~@}|Ll$dVbj2`CxydAzco(o<LC(P zd5m3EZQ8miU^4Q}+hLE&6G|0|!R>Ew3^~WuOb;Vihk@pHfHFJrk*Q}2RLEb$%S;-E z6*>8^NV&{RcjF=zz5^C5nH1ftTe{X`P2H&8Da}sL620qH!2Y)n=&r&(rEf3|S9dLZ zz{23zT>SX@-fEJ8Sv;@pppP*UH|_-B-3m;7jj*>?KOJ}5_ko05CMZV;D*kL+uo#cF z=)V%h$;6==j#?1@#DO0d7@TST{N4bhJ>zL#=&5{WgLz>y-uE>i=xxZI?q^?@(KI(c z$Q*o7waK5csX$IvvQTR(JZt0U5<bp3c&35GmDTu8>g+p1NM3fyZL$$51BGI*&8g4^ zmehSAfF8_nUM{#Vc~Wge$-Ma`RE9vp%7<?-4*~fQYf&a<{*851`qvI=SNu3RSX{S= zDx1Y_cd!MB$TQ<U+t#DB+!n!JxBiQXlZ*dgVp0V8;4p*Z+IIxNi~p_hK!|vzs8_<B z>;P?MjV!A8LpJ}TtwC*m;C!%s+Gzo}5$^I3A!@O6bJ(fEm&Hyv6HoB+_9bBac$~GB z2h-+L;`wO?p~BZE%dyDgIig(R!AnAjVz^*Sv{ENOXuEEDLgKAeFHWZFsc7dK_Oxtm zSdj4aI=<9J4xB!kgoPf^JhdCv?wQ72kLI8DdNAk`tDbXcx#w=UN=dn|C<-Lu#~c9> z3I0yRv=Y!{$@b%Lqhw1Rur6|s)cWvsnlx8Gj}#UbvMI2nCZIVI&(SZM1*aglpmlk5 zRiH{gSnLR?_W5ZgK(pv4?tfGku>V0Ql-!uQYl+<9;sYoK1YQT9Q}W$Q^%_MmpHu9z z>{&q-I<Bc0T{!@p+od5=uk)<Fo~nVe>t*uzY2-{EF%PcC<(b#&%kW_YrjNAoIe89j zD)&#ojT=Pc!yjPa(@@dHbdtI^4*aZtdIL2XWlcBMz6m)EQzV$a3NV<5-4RbNzMx!q z<#gme-?i?<$9eZJgkMA=XLfn^bGffnPkpET8rHMlP0FgPxjz(zPn!%(D#`$E^GzUK zJ{5WBpB;)%V)b^<M&n5oQrY919V4JtkxE)UQrj6)>{x6Lt8)d#M8&|8U6j2xRHjk= z4et-2>Q~$Ryc=_ca9QMxcy`Qk+HB(+2M&8u4tPbU+(9#SJ+g4moLOCN+Bx><&i?_w zOoocQ6nsc=z%hrqC>FgAeTMDxsGD!<hq(i5;XZDi0JW6rs%%o!eq$e~V)9`(M{+H` zTRRaJqM9lIW|qwj*|063$qCSs&o74`VH^(<Yl!DU2z)*wi5WI7*~RcEV(P${m$|a8 z{mQ~+Z!oFTT008e?D=|nymKeX<;yZh0G)oN83#x#1P|@p5+e6m*;U=*Cil}}L!V0s zJju!VXxv7x>fkXqkYL0|qd+;frB3Iujug;CKFyVjDv6SSzaUur6nT^v=%<Y8u35wl zeJC>SzU_rokH7gOFd8Sl*&sLxot!aIj(SlZ@ck~mC;%@^uFE+;T9!Ty-lv5VFZl1Y z7Ewp?jG8sN$?!zfA?u4nL%mf9zb;*)Y*Ji2ck8yYc!&EHvTN7%{MjqYz=%$fNmO>; zqlPZPj1L0wy!^qd`4s(7Ztqdr)Tsk^s(Vra03}U@-Iy|(yLTiRnRH8i-N*4=A~{M~ z;@U`dtfH3kgx4($L8e<J3#$A3=S`Nz7542+%EPtPaosVuU{&EA#<=Lz=QnG&fhd~w z&T+x>f;(xSwT}kBS5Jy^kqkLoIS?Xp{*~|<ZCqa&M%HaCP3hf)XK9pc`;P&)J9UHj zLh<@%Y!DO`mF&xRi>?uy3x&V~!>5v=?YWXuw(HJ_jS!u{Nr2xZ5X+&06pCpA$lwX| z)qu@?6ZMpxx(EuquyXwby0vdFQF6YULUKf<JG)G{M9tWwceDEN(|Pyqj^ez$R2#1~ zy`P+IQnpgVrgT%6K=aO}zSE4^xSwS@uB*^4sr#~HdhC5XvV7p?D21Bd(`@F^s{ysz z+tgc5K)$rU2i@@54~dN$54ri&jZaSNZhIGx=p?HC!BPl3EO1b<&(hJ)d}bVNHmcgJ z9Tr&ky+Z|Wy7+Qi-CW390Xv$Sgrh7YEHAt*%sf4ib(k%v;Y8l7(B<%FG~c#R<w1PU zD{&#!eSz%;`GH(&fKYW{u}6ZIOsw#@Ig}p^mt!FuS+`woCuS%$!Iz_oGfX5h9~B9e zNn-gt?Hqb4={;zr+S8Z^3d(!t^cD~=R^_w#cfN)`ixqj#p-*a}EG|_0%>7}^=P=1@ zV1+4ykf1~Kxsy;6^*J+04^4*C+V^iRZg=`V^Jx6eb1dRAC;awdM?^5O4+Aw2@^vdr zjc_@ibn|DJxFs)(d#fzp%TN-5Zwr*;(`;2ShkR&QfKk@%b5_JF$Cks~BH!W01UusB zGZ*HCdz>&L!8Bo20W@U%Etj8N4d-%BdXO+oREfJ$jzDf>@EycB8MarD)MWs%Li2P{ zeBSesc?aPFn{cI$1eORUT}!|vSRK0fuEGbevr+}0Gculu3Y2>YUp`2;gNoP%g(u*9 z&DSmvF=1W{8s=<w4xQPjJoN_2&Mrte)=T1_3U+Oc?6|0gs`8wCb;F|>Fa9htlJ9Dx zTD1WtaSaM|h&qBcH*P|YK~Jt&MqWo-Z^&RlD$LlIDI4i#JXwmO-H@B+pek8v!KS5x zv|#O~_*@=N-(TI1H(Q;t{o3R@W;TAdXo<OItoqifnFwyL>b$i5-uGqd3N{mVhGkL* zJ~DarxCZwAM&s~7U8E3|@Mh=Jn^SihLT*hd7&4w6ZBu&MW++MM$h<pfgA|rmAz9)~ zxqSA73$@a6r*?*rMGKQKon(I|wXkdJeDS(T{gDLycSqcF_%w@6jWIW3&2;YY5Z)eh zSKA@iX?i$IQ|Z2S`0T+&-J12n@%iam33O>GLdZuL*Gh6+O-8ohBDqG0|C1z%knr<d zox@<~$Moa&Kc%C(tnqi(L%0aaZuxEC>ECG~e8_~om-@gBW8B?KwB^v>2wwXv8xUBL zI?U`(sy=lD-M}Hf2(ifO758pLrDVT%(!XHh+G?wZtlr{=(qj^lCEMkIZR(#5J1b_g z>mqC;OofLn5MNAJJ8-vhbuXc2BMI9@?jeV@BPW`twh|r$uIpB~adk#xEilf-p2=k{ zO$=~Su6yAWV2z_6IetD6txL()J5odB<+LVRRgiT>+GnHvNsigF>dty)&YgPq7>41? zl`dTGE-Y~F{}VWfFgPGDeB$ganiG!75mH3hwlyaSTONYeryBm)<TLAq(K5Mca(CA? zgjkejG3cb5c7k%b=P5DAqxW@ItEj5iH_JXgGF)GSfLhZtl_=N?ZHU8iT_%|KXtT1t zB#^zdr-d6u@@v#OLjW2+va)HTD+_#E4?X;}PlUjd=8I%ws*T;T#@ODjPN*z)gc6%_ z<ByyoIi9dXoJ)*IpWqz)78DHevMFifvIil&R58Kza`w`}3Mgz3M_r+`$?=M)7|y0# zKphy?3pg<l8a^l5zc8lYY315p4WEf37NSY+JYm3xD!O&`4QfHvPWUlN9ND|QG3H(d zozE^z=r-;X6RI1HFKbS-oP1ryzKqmU*DTY*e`_AO?&V;72Y4yKUMVVH7<sO_Dl+ow z$Ruwi<M0D}-#=kyVY{o)<Die~P27zUkrO8C4I;_TH#lI5IcZ1apmHbcdZUI&`R2n` zKQC?suwI)HLj;+D684h!HflTR`(rs|*}ktbEwD>J$KA2hoUk`vahYL;6a?Jd8fm;t z7CD`>TQOX1P}i29k=2@(OdaWc>RYMb-e7|Db_>W5{hjSM@Cvb@v<q~yKHt*pCQ3NH zcF(g7%mekdErSErG9Pah%Kms&FJyC92JJwaM84;cM8B|;XYTYl6*Sx;w83Y)==m#> zK|%~3NG+D8pXAkv^(Ja!MTGc^3n033l#bbD2YzEB(-X(|M96U0(6{3;rj#&Gw+8Fj zC@|nclycoHW@c$JvdcR}PB1Of*hAL?i^FlRq>DSEZ<dKeRw*N*NU5Z+_oc3NSOObg zSbiB#Hurzz6Cb=6gINpf|2%T9X2&bDOZyp%7c^aSzRDeg&CCmHO?1*;wITQH13zth zHYI%3L1Y}Jl9*9p_h2^t1ufhi)_{MBey#p2#c=zDKbrC^5a}*CS?Q$4e;VBBItjMp z4$$Z6jSSYHerP+qvqrn8;ooAjOX!`zvxxknK_8;&f^YSOIdy%pE;i~-pr2ayw28QU zd|}|^3rV|$^khd3;*r4dqjxpx@yQWMw;C-O1TOO`EtYn1G{@+@=#K{ZCcnNZyBT&N zb$zO_JQ-W{!YW<tQ)_rHanR+ac@qBZc`S;AuwVoR;H=T%M_?|ik7h007A=rNs};M? zU~y#Irhi*?(Bf6gcqrmYKTjnGB$}h01D^p$zN~3qYFFcm<k;h>+SZ>H28^rdln)sO zM$(v5L$?z@l=P);gz(y%<55MUvq#Kej;fH2`|cWbH|XC?i28lbm%q<BZ-EhEm>4Cl z*0*4oM9aRAub&ty08D^LXuDN!u3fpbv9pn=PA~C%Ox{fg^4O}|PP#U~85%*P3i7wf zd~0Q@bj5}9)$V<7w*P8CZ|*E!>Ggg}86x^ib|}(~6X)b5uD^Xk%J|nAO9Cj7r}QK4 ze~A=c3Ghx@Ta2O1UnWJK5F7^GV^8_Zzx-bw=zscWh4M|C+*#Ft8zmIZlXN3piCN01 zM3<#lGdI+=?m(<vlN8}$0p3~R#G503w6noKN)M39nVe^8<29pWnRTlyWb8p-0ATRt z?lrlnt(p?wQL_16Jhx3w?Oe#}L86Ti+`-eI;=kpoe0IbI{Z???udf0T*2_Uzi|&7? zy5qTYvkBwZYP%6mpl`hd%m@yAF^3=2^K4<lW$M6lk^~^^PzWlfscl@pE~gwa4Pk2Y zCUElU0@Dl7mpJ~@0-zV|^tpPVKb`?0_9GlY=qr1BLtH}uirawF1&}irbe~G}*laCj zngMyi#zwgZsGclSKq0IqNd>_uBm){}xDfJ8*>m9Ap<W&dMZW>=m|^M>pmp};#71cs zQOE$x{1P+-^aCaWHCi^vdt*XLIT3n0mPR6Bxi5AoPa$Rn)Njb{!(pIlVX(@wTUV;` z{@W?v^uFJVE>0Wa-rp@BNaHJ{k_<4!qY;OKI{E$RE+A~!3KoGL&uceKCE|BbRO>j+ zY1IV5miVV)1-9E{z*+VmtdA$r1CHz^QcyZ5&2TmjfxifI1*M=8kgM){D@tthj8a(S zz(vJE_mClx_aes)Lc!ZJxCw3=%rwp6e`Ff{qB6AG-dzKg4?pHb-$?8MY{DQQrV_0R zNrmo{%<x$CVCgkP+#qK~$JQy;WY49;yn%`VAxNwN?jZ{+@jo0oi%iFO9vb>0cvuJq z%{DM32?ccv&~0UrpiRNh$OE`bm~V~}F1`X5Zl=1*>wol**#{reSsVv|Nooa%lFC%8 z_|&4hi|65@42YVox3fB|o=#e+`O$Ku!^>!&i#~p-{_Z>!Hp)b9>a*h=E^w{->^Ut! zY*)<;mDOtYwBIxwimJiABLx)$@?tVLJ%(F|Tz#g>=W1If35okGI-1`Ia(ZslL?=Ah zD6<1HWIkY|_Bt_Xi|R#3_Wy_^+RuXv6|jHR1xH=lXi^1WMlfn=$7MC8YZJm>7HVYU z#dU@hn?{Dy5Nb*T31>G-082`>y`Z3=m_<6%3CIE^F1VC}6Iz2Gsm494gx4+7X;*S> zJ}2b^4{xc{=sS5#)odB1uxiu-GO6-|4$&f1`1I%%pw^UtWR<jsIYbU8Je(*<M%OW1 zqKlf0)$D>@9vTFuoBR$oz^PvW1hbMV9KfO|pOS?jkq{fEE$&<6dq<!mB%IA>k7*o5 zUUFc#o_u{qDa0vFHAU{<k#oI2B6Wk^I5jd<He$WYwe9pBC!B=+<wYDc-4B!GR#+II zzy@+;!V<M#lhUYmi*y7127Rg#uz@Oo)Jg)1&fG6W=ROTt7lJ8()@H(#yhZ1Jc|#Sw zfYXa8k<pNeTP=bXCGn1s6w@6#C=WBJ6xq0h<%0mUHY+UmQEl%$y{XTjO4(UVkxXpI z{b3}HlaIPP2<sA~7lVvG9MOpbuvS)X`r<!|PQGdy@7Npbd%f%14GZ;f&Uh@GX#m)g zChdV*I~W2x+WJhfXN~qJ?$C!k`xe<(9{!K9*CDuv?kVj>oJD-dq%5ZD<J-d(2aBI5 zR97?BTVC)SuCilF%4&%Jl#kpIvYaG`W905Gy^;p>r4B}^rtqon<Nyav>A;rLoK4r$ z8%eZfR;ex%%0zpS8cBR~c+m_f8ACk1IBTva9G2-HC~{1#qP>8tZLHc>r654W)<^Xp zEgM+16oKwmeST;CZnp;Z73YafFrKFD;+=^aI}L%|t|)BOV!qTtk#S$@ZXy(gVvn`q zL3)%`XFwr^+FsAxxmP$j?rKOH<tihi<sRt<Y!A5J5OX?1$8<qw);h;&eW|yVnpL$f zYqG0R>wLAu!<(9;+#fyx2RFnh7ypiGDjjHA(9gyU?mp!k5r0jhxb2a2`{VKxuyddV zILW0CXO@zM{xna}@ewIL)@KE(ibL@I2ABICEQYo@?42|DDUscNA+86~mYoK#dHR8~ zN3y$pn>*<Sl)JwZVKR<Y%a#nB5DKG<ZdL<eFRTu0EeFf;>_gKG?ixYYhaK}`+3PP= zmSJZZNcz2CnX53R^4llWp>TQPg%IWLy%KOtZaMiHv-ghD725v#x8@VzF1oZc*QA4J zB3LYJ&%rC5Nil~}RF&{l9RyM5LQWz(+p)=*|JbJ$ZBguFud}CLKcvKJzsauF$Bze( z`YqImmoZm8>~yfnc5xp}qdCvawr_$BSvugB$pzM6Z}&P#7%pYd<{!LO|Jz5C5FgAH zt<5W#;l=z12+)OSqL~IJ$})ZR{gd~B4GIUSGqw?C4=De_1A2t2Lhq#d%glf<ppXJB zW)P?Kz2M(g8hLr3#mIk3{bjL0h$?KLBPWs6FU|Qc@ObhBC@)W{cnJSkKBV>Oz{qR| zyuUnvh@3(|2%rd|r8WJZD+(!-1|#c#x2=!=3q|OGTtwgXPW~_QF$w`AmyHfNSq~ER zgH(jD(qDQkCpt4y-bJihY({XNkX<8wY<ZO&U^v=KX}?gYwp}i#;uv~3W>9Xd2LJ-8 z8X2O+C{77G-)_vWK)w!i#W49SOTjLD-p?Y83+oH*?RFwX-5`RZ45zRgX*YXqG8<Hy zC4u~bo-vN-rAt`L@>gfoD`9MKT}TEfd=MC=R)KfVSpJrP10$m42FSfL(JCq`FUie( zWL{8<F)sujXOhx7+{y4x<T5wQ3OxD@G0MvVs-gDJr4@r5X=GnOquT<-0eF$qAg3Eo zz@-iVZ)Q0@YCWPokob-|T2Jp@4iNXNT^A%LqvDf^M>a{kdJaQry8zR<0vZCUy*Bkl zfLI^xafR)j89CnmW<zLh`SsoBM5g;7aKZt!>ivvHW9N<n*0Rn>6Y$gY1NliD81vWC zI(O~>s{%d3m=C--#i;<u6#LWZHoy0joF92EU!Pf-%agy5D~Gv0U1<(cIe9z<@Pl?V zBoXamW2&5uNjb6VD+s#Bu1gEYz*zixK6JL$-ug?GcdoeaUVkc&H5%%BpdB&ZdqEWs zCS(xwIc{5NgA7;<=2n`DotneAR?{9uJzN;8kQ$#>vUVnFk0&Q@`|*#tH_F&|+QG#a zBU9n%RA~Z%hbhXP-?ddC^DF778MF!r3@=Lheas4rpcUk%*??!(3DkS*?R<K^aP7jP zG5ikgxAHU#x-M-&u&V~pp@>A^?yWDC6bkwcGTmwO7gQplWDcz4>@R_Hn6>v-bR^8> zleu_U!3Wi~ua|R*HnaCRlu6n2bzL93gq5~d13q>C8|)zp$SvgJ`IdxWktEwH$S6bP z5gILcO1=-!*a+rVz_oGuba$FOm*59YslTL^@`f@1j0V{%Tj*^E6MxnsS=>Uj_bE5+ zRTF(0db1NX{sK5_jGSFYb3!gI_D8C128jH<2_Iqi)Ab{>KdgG<gFb%V%@$bXbAWIQ z+X7o#t~{~dJS=k~IwyN=II|Rg714+3SKJ}6sVf+Ezi`QvtGP<^6298?xx%D@lj_mn z14|U2pFILsAMep(lU(ZJzJXo!zI;`hH_`0n*l9uqCq&pYehDo6RLr9YK}8hR_!K<3 zi9~D?Of<+85aJS@XX|ZK&k&uCt3WNOe(>QIQ;byZUYIJ7N6}Du#}0wZ*2pprA6~xe z{VWau)}gPV$SAJRs=@CFIj^dmU9^0je&IjP=ojBP1pgm(705eL;1}T9z`z%54MwJN z-9gx))svYT;K%nE-P{7h_G6{4ZgS(6>~|ePY)OwXe_*SQ$UL10O#56hP76DcQBxpc z(Uu2xkD^z%nWu}HsMe@k*b%NMR#K-z^-KrqP3o6xk;%Aq3hnJjGmeP1H={RJ5lk<9 zPD++&BF6x;Un+|s<|Ap%N=vrA06SNEE(BUW;)hbWhJY8EeW<E9Lnb~M>z&XXEr6f; z?3p8y91lSwkXrrv`ns|f4xF)b2CV_Bk$lk>i7Uh{vnsYXjso}~*v(oDpJO)CfaYGd zg@FC%ixK)!ZYQUwb5B<HH5xd~Os0#4QsZ+W2zxg($c$jp^-$Ytv|&Rc`^Td1x;;TN z+Q!{<$-w4YNZgZrKD!od*!)ME)0K9+Or4$zpd(;)W#DCUnG%d3vK<d23+SsX1&}s& zP3}kth1F`r4PS8PjVMYQ@+Qf5`fR!g<~@gQ>D^5!Sc`W5e9-mflgn&Y-J+a}LOfbY zcA)Df0<ZFeB5W7I6Z4!_(VRdZ#Z6>`zD*7q6yR;sLOlU6*V8k3E`6RhzN6C%({TYP z#Jr4A3DM`MVN7L$J{_{14H{_=>NiQa#IPFYw>nou>xTL~Xpe*28aj!?(oML1T^b8K zV!AzWkM%(Hf_|KiSEX%n_?m`}n5l5nx>{kOOJWhwG6bskmMC733yE8UW(_A>OVD71 z^(G9~)f)U0SyIX3LD0MP6}Y>x<R`K~0sAq=!|ujt@`r)XIKFy9^~+M9QH$v>qErQ( zx_@p9e0wWwdl_Q$s1o6o8MFu{$E^yBpuBRwIqu25x_0crkUS#wrQXN+I<WAwa`;Z~ zZwot0Il*v?TY5wU_KPMz$w^lc6VlKhf{s(FtxO}SJl*MM9bpcj)7oLTLze`Fle<Tz zv(arSG&&5}m?aEDJ-I*N?^RVVhW4nzQ8S7FigG^f`@YU;>a*K7+Gi{|$KgT+rFFaN z<{tv03VB^OH-<4cGFw&0EGf<R|41qw#Hf5E(ssd8#4b9GenNl#7J$v%+|7<$dAMK4 ztJceMg2Ch8;tK5_amCYvDk=>6!+fsN&w=0=(~NOc=)1>+nt93qEHg4h?P=tO(D;R0 z<-<tDFrk1-f{mu7q+t#keHc4)a2={n5>^#wwp7r(b|OIvR3y>))^1)TE&J^%eL4G1 z$qFTZ?xdQ+pEFTJ7`;^bY;)vTnx>08zz*Yn#BX-4X?j?L>_WI(Jkh6UZ7v@A6Kk(Z z{i~!x#|=TV1WRNO$skaLJ#6Lfj6I;eK8f<<>B^&|Ry{er{Ix6C%uEavl*sX3UZ(dY zGkK!9ya#1b@eQN)x*lcqwavO-weT2p{6K2ACF@CSPR4R*XITs-a+{!EFS-7#MLHgN z9v=KuhDJI0zEW2=HnI-IS-GLY$qDATlh50bO3g+|DYMDof4Uqu_|J$3xsrvgOU7v0 z&NkRq9mCgAq3{3ESze*?xI7Sd8^w2frhXVq8hEtXFKKJz`gT3g2GNWV#z_Jb#(#@m z=GKGnn$gHfSlhKy`>C-YmY*|z+Fsa8aJ#{655ly$=7EYMLSj?q6P_3Dk2fNGu1mG? z5=^Ls(<koL<0paCRYasZiY~~<@v!v{vJrv?0_EX+(>Y=vC4lP(ANf}RBkSZiMU-Fn zMp$r)613^;6H5#aWI0+t!Od(W*y6nhtMXB^H3sVV)=cWsd$F7Ch7v*-uq%;SlGx>( zXd>2NOg0RqRKJfh#@LVafsw%O>d1OdK2?QU$R$HUbg`=o+mpaWwS_`jD^!FC2lJcT zHgLk{cSexy1Y?SoA^aB!Kz9~&Si66qSJ3CG@k?H5i%1$MhAvT&s9)q<Se%NpKlC}T zS*U81St^Z)5`;TiBA<ig7B6m#8UU+BAu5Rnk-R9tjb@q;KDqd0hs+|Rr%t=c-PQ|V z8e{Jb-qSX9wOMlY_Ox#l%79bEFf+S8>60pvA-}=n7T9V2fda@YQY;90<-?i1)J|WU zebexj8_j03@N#CK@$d-8I|e%u<ENfFbcZ7MqZ9+>tWW25_fHFFDMreH3MBKhxG;-| z9XY%J&9%~pTTE=!Rb>2KcMn2Zi6rU!5ZwSVd~We0+&m<3M$OJ5Jv%vejSOE*n9}Nu zSm!CXnzh3X<(z$Ho?`MuM&W@j)(~10PMgAPqHmKQ7n(<YMxxqz3KMpptq5u^bKttx zgKit#X5QiatYSKAzo77OeM2H{bjJp#nepz<o0m7t1))_~yXL+?!`ZfK+qvhFnb(GO zX58Hdq=wIBWV@ze%Y0@zInYkm(W|d{zKqIvu-K<q@yVO;;Ks=X-C+)A;YUAN`^*Xr z#f1RzT{A6Wb`I)X7fD0B99;{VNuaQxUncW8^J8F%pKK#b%I*>dC-t~!M^F&;8MAa8 z2XEn9uMn!kj(Fv^G5KysDQ}A7tI)6u?uvyV`W{m4cw)DYf<564wB7FEu@|j}QzrWS z88S;~Pa1F}BElz$8Zjh6L8>y`!;8Ftr8?fZgAGFhT@UlLOS>T>lo@<sr@@^w(L#>p zjJJbSr+p*dyJgC<ba{qc8Vk0nx6ULD{`B#UI3#aV^7*ljUnV-60dzD8-f^B(3vcAX zC$NvTVp5yU>4WyZ?e#ZfHEG2i4-E?f>q7$}d^3BOFc+YRlRHxay{-gmS=E#Cj8f}y zq6sphuVRTTs)5n4d65fs&D~J$YBx%%NN5xkgBXk-LB*;Sg8c4BKrwpvfJPzDXDcrp zPBOqn(RHLph$`I5z#;zjaXTzVsm=SEkpmymR3T$I7EN?Ui^E64XIR-mp`!m2DFkJM zlzY*#4r9zp;6~!KAzCeUU^G$;n*QkGas-st^;0|sWTp!K88ubd;OCOLzVHtI`+Y~1 z*!4?Gt~(Qw8I3=yAn#};Z#2&HkcRm!BR@$hHM>oSP)2Mqe<>r6xMnYTRV#HWy?uM5 zHiRlYhke-lBBiiV^vA7cD5hyq%!cXfT#6u&tKjK{t0SS__l~||)k=vOGQ>pmq5hbq za|mULj9rE$Bx&j&S|Lv&5})IpP(azu8zs9LVL{w*&cnR?heK{Ez}LV4oHq@AeGHs# z{3osQ5cl8eN!Sexws{M`$Vn7r)JxEK#|tqP##F!>cfDyb2mjLb0pB+r&2;4^+Tu7W zF(XQH=-Hz;ju8X-G~N_t>S5Vr?082Yc-;KTVJ7DA`bzT!_mibpdcOsb-m$Ftrt8b& z1rz;(5y|uSzB4J-Rn$CI;Ys8Hk9Wg#L@x5_aRHVei6fD8QD3t^clXakx<WSOePQ7j z^u0E>UX!(o9)k@(?DTGD^X}Ieu0cxImfZQ&H+c^}EGtl?a(dl(+Nf^1)TK*Dq81>B z$;EA0Tqq|zU94{1j63NHKNa79&*vaebpLA7z+5j%Q*!~~&SY6QULuZ6A%m24nza!z zt@#5<o!}~YSEoBhkc7za8>ow1TRqpUfYrOj+~k1#LX4-)a#G|6A=DYP;vJP@O$S`S zTuv@8Jjy*Y=*MZe^i*dw!n!=8^^klNKNV8Y+pax^#ZNKt!Ml}l=c?k<VLbiIe5hu~ z%IUB8N>T#!pY>H+LH4dM)}-zmtP7_}Qy?EdZ2PkM{$*cU6jH|F_1SbgtGQYOx%B;U z`GNI4zD=@YjO3o>t5F>{7cYS%4;4yhDzls1ZRq|y(e)5JKS`ksd3jR~Wr|*2I|!%C z`QxCx@`8m^1(WReiIP)c&Q+Lt55C6rH(Qio4(11nxK*8fU!S+&6;EkF<Ho&VE*HRX z$51iRv`W-A(nC|SMgP(4rX8!D#`1I<Ek>~0X4l%?yH-l&P+KQFYhE^Fai^{8S+<%f zKECN2FD@XANGMhAi>2>Vd2x;s;-Ml(MA-R6A^BN;Dg`erO#briytE;of+9Hg>(T`N z8cFGp82~l#j9cqJGz2h`CX)JRI{&3TxB;CpfJGefccf~1z&RMbng0CX59#p#;V`>u zTHp^OluQ8bo{iV$6$4$zCKJj-LdM%`SUEh{2xjCHR^ye<9QboF{ea-)0xgqCfIs@w z^W`yUJ!Szldjg_Y7&x#%sm}HzH1Z9?3%TNZaq_5}BtGWPA2_mg0~*CCSm0&Wt=6E_ z=>Gh!rnSfbw8H4U`Z7bI-pY`4c<#qjevjAV#md?KE031bv?I1v#GKF}oZAJUs#XFg zvjHxbyU}C+tGcg@s%riE6{JBrMI<DpL20A~0SQ3_MM?pY2I=llDK}lhQ4mBrrKBVU z1(cKyDJdzbI~T_PyzjSr#~tI|_YB7Qu*VkG-s@S<Gv}}7@Af$6f+8V=QatS6T7jq$ z6a*z9f;T6F3;|!0M__PfffxzV2BQf|)!EVB;PA)h9-368MKS?c8MzcCo8E@JSrpgJ zx})`dyd5KirTV;Io&>Kn$ADFp{F)!=K_4^gHTEr!)!tc?dnf%7l!^mliQvUCgRq!( z_uBgplv0?OYLD7P)##c{;976QNo$ASNE9%=4@nx7DbP}P^yg^3xwo$dOwEgbnNX5+ z?vy@=P7!xe3!CjpHw-4C&)<far2ITBka!jq>;5&beD#Y(I_?`qCJGI-+rQm1{%=_Y z0!Iw`oCBwpKhOQ9Lhb{aQ0%;NTZOClAdkRGJZnG&dRtVBCD1dy)h@Q}@x19scn284 z+2E}uv()awdLkh<VO4<~<}=i}K25Xc1}e%3f+p=i9NLjc+wuM+d<2+{8=$%!&_P&_ zt52vIAvz@n`bIo*W&&@dw+2e}^(Cc(&9~rCiTT_*7%VQ$)CXKm$G1=au-qxP5^(vh zuUGak_N;H2?A+}k5ryDBxb_6Q?T6>d4G^}&Ooch=AWzjw9J+rEtC2Fx?1PyJ&JZ-O zwkXE((Jtp_ekFP;T`wCaQ$qK9YgkYSg6G#v7TS@Ck-Y*4hTfaCja3ft1-<~uped#@ zF*=IASx(b^ZNd-eqSg-l(?Xu8Ww$#)fkmfHt-!rf47T)}STQCO=OkPU$+>htQu*Za z<&rU+Rr9z$V%#YDoV1?)-@ziY1wmTTbMrb_Q>q12ZH<kWK}uQWeJDnF^BZ7rGhilq z9`Q3}K!`@f<FjP1t5!GbAuVCO(o*Lm1QLu&#Fc-^o+w1nX9;i-3Yds?ploIkyXYc* zA4d^^?&T1Aons?BG&E%z^r;w@gz^jLx^**j!M<-gv@}vtaDx?cI0jBJPtH(9eGCbJ z77~N~8VJg6Rb|qbZPpUCVBC*p??#Iaot9zR7moOFU-JaJr0}a`R|YL63S2x&fW08L z^bW-Z;J6U=q^VwbE~X4A6<DpoL&gk@j?U3F;+9ML#h9?NnrJx55nG9dbXeIwi^Y}6 zne4vZG61sZNLxh5R{CdIihZ2uDiLA3UzZvKPdF(9LM$DwJ!KV1c3vLT6eX%Z+#cai zMh_T2lePVv_?;A9258hbAYS10;r%^GdQlZ^D)IvJ$ir|;pc;C?C6)-bGA!n-JyWHG zK$5VT6n1^R93QflgjraX%))+^3AZL}(d#c@h?uU9*BkC}HrV3!Np<_)v`;u2E@bp_ z5SA)83+`S9j{#br11lw)mS}-P%6i7I<#2?ZXww4HRW8!%0yM9!{G!%o5}eq{G&_Qv z^LBcBPKQAw^%=WCBZM6YTPrO<jPp<vu|zpEmJ4Idx$g=wyc5s{cUu`z5O$v^!VI+9 zC0&6GpWy;9!Vv(w26*TNu+nSjqyal{v7TkcBNM~tIN$(WAGzMtT_h7d7@SHXXnh{n zlP*Qm`y6O$*s`BvAK*ME?yOoyRj2(^3!_k8)XPP6wx+}WeaOQC3-QL;yrm-WgS4Eb zjP*I%OsAYz+U(mCtH>I7ESPH8ni%U?xq|O>nCL)Q;Ul+>UqOdL$RfY{48+=+{_4?! zMq!e1I~R~5!Jk5Fdu{P`L9QG->uSwr#4sqrv$+iG^bvmuibLMyavy;I3qM!YgscXi z*LeiqRNGY+X#^$|wIxSKeU$iLC<OKcaZ1l*?BnAOZfViRdHmrD+k(11j6^^S&30ug zK~hI!WB>bmA6fDj0FzbrLEBoaQ{aP*lKD3~*9)k)S9gR;;JQ;Y@};!8C%0|cy(h~9 zHclQG0>lzBUZA+1%bwL&_z+hMd-w)<WHEosDZ`gabuHwPKNI7OhY9ON5vIX|j3u7E zJM5vY&eFKNy;&9fhW2X=kc!~IWb)=OX;6I8uTsR({AQ(<@L#y!0ns9i9<~nuO%Z91 z0^pvy(ew*)87DvONS2nv4!z}HyDPCAoarVw@p^y%6|*oL*zI3^@+ANMY64uy_F~jG zJF!ile5O(0F<4xVi?;v%YJP+T2)0YS{P$n|A77B()xW2BF#ErLVJ?Z1dO6mgL-^)C zK>r&pRED~(HsZfMs@HDcPO90PO9o>Ag)skgCCCVHHzdHiVSg6yFPp+l@ApCr_537$ zFq#Kq0;Mf*DZr$_36yI*SP|MjzrH0G79xS5?i`Tyq?#rn`hpAdZ$%Rm4=1WNoM8y) zKU(d=`=Ik64*&MxDx1sd822utv@!4rovY^lwjleb()Tt0d)t)W$pE|e@ax+$I7k(d zR490wHnbBC;vD<A7n?xv-{y;UI?vN)tcC;5*RqHeafH<Xoc3B6Da#BP10LSC2CIX^ z_fb)nxc?$VPy->t`wkNjh$HzSO9}r;%WGF>@Bo_tn^>|vV5>-CmBh}dV{g`VS~oaS zQh*h188SVLE19=0h8QeU#0Z<GThw?HwCKw*;DZwNIjSM&(bw&W<K{fx@i~r{Dc8u5 z-KeNPysr1@OP=0^{hd`R5uXZ>pnoYaEFfpw6$Y=A`Yh%iBC>$Zqo04{cx%8AGo1Qw zK%Mj=vE5C$1r1`w#!Xm$>K`E^@ihvo8PfE6Z@|}qPi4ujumC5K!?%x&Tbz)tWR&|6 zYCFWQVmqdvrJ9&I{M4cqgwVN%P*89vkXV0qlLQ1YCM_*LrOoMF><c@O$dktpIkNU} zE7fWj9yZ~grHljSr2_~a?ppV)7<j;Q)8iVxARdnO!PXyVxgJ0br=|52F-U%4WS1fM zyS(+{r8N|AbqfjVZoby(t@H9g;uGg{`Riw=hFJb}D#e=OUQsT*$PM5!aLr^rxrP5R zP^rp8Dx$w_kCwXROPx4l(JSYYq561uy?Q}tmpgm&>5lVXW1`vw7!y&DyVgEpTfdTX z?tOIx*Wb`ShB~B%gj2TzYS@CTbV?rmZ@CN^AT|#gd9-_`AxCUD3K+HaRPl;~?Gan_ zbmjviNm_uFC7hjm0KAyOn78@EgF+e|>qIU)P%NrYOJ(agHMq2L?sCuHjJS0GCP<Xl zWzWYydJn+xltb}A>2xQtPBo+SWCJ!EeC=-{)}Out5-is%FNId@(JM%eR4j}kdOce> zb;i0iT*%y4oeU*^P)a6zkT~(W<<BO>93_U)3*^;4dt&nGagGB#O0HK)Xy%TGEz44e z3+la@3itza4ZI7fE@MUAPAkJVuM5g1%2s+GzWtdboJE_8cBFe6n^0SsD(gH6sQH<} z3v3s@@kf)P#1MwdT$?$==AoKB*%Xt|+ZV?qwP|kf_fEDeymMOQu1cCPw4U_9IA;F) zO`wsU^7|&4(f*eTMRHzX2PI$875a};&K>s4O!KyLf477GG4G)sIG6j|K4+PzSH$Pg z9bVflbW$H&MRIpwEzTf;icsv{=0F^$Q&2IOwCvSt0l7~DwdMGbG6=I?$Ohrn%`e3o z=M6^-nyb-Veu%08;^qdJ;0mU^BGt{jLC~T-z@2Y?pqkHHFWQ=%zDnh*5{!_a5}UJ~ z^A2$*1s$vcSjB+nt3ZzhCo`*#O1j5)QMaiuHqe7Cy-*jY);N3V!GxC0ad#F(yY?0s z*83<nyYlL+RC?^>ccn`iB6+MpV?MR#JWBNv*sKOSA9(OjGG)ykdF_1=9XmMs>R2?w z`JX&Tl4{umLF9<KkB+`z;3V?sTht}c9U*%$xaM?-nxP$Z4HLYghJkF}*)cc%Nr3hY zGH5k)!S`#@&*vc2D9?zrvPy2~Y2lzXX+@+#nd6N<KNr~Slbr)_>;AMj$-Dmw1i(Mf z#Rbb21<a)i@Lq^e#bJ9{4-PBa8E7ryQbyFkY-l=IXj}|hE<FfaOb)fw2iDYdcWrV} zA7YwfGlk8%s8yW*?D2yy=!o+*{|SC5_xo^gfHu{15{V>=jUQ2au_A3SaoOnIDb72E zp#8~p%5yo1y=Arhk{1oNC4QE|^R@0|VfFmG)mbf1%5$1~UNuApsfu2x*BFqgJWySt zURvsZeICLwHFw+~9d;H14i~*2J!`3r$k_)4S|?~lW*{vq4tB(LpyRpL?eeusD<CX& zaSy$70yxY2a1bu)-7{^YL%y(3Ml_(*P}tAJ#+rd9D<Ef;c%E{Evu1o2Vg~Ma#$BHS z3iW(wf><A3c)qab6+Y__>@l!mF~BWB0sY19lgy+L{(yggn;he$(Hht^h<4?JU^m4> z9>co4^TR)>?^I724HNESKK)OefFC0CV}ZlW;HKt!bouG94C;lq|J<bx97SKm4k`n} z{UKk2um4GZW-}!-eIv~9WALzAaFb}i6EUF_LM*+X7IS)iDqncC55T5)s5M^2)9T;r z_KnYl+pi3c&HIogR_wL!Y=QWwmwJAPwUnUs#Q&Dyea5FAMN>WKN^zRzM^>J^GDzT1 z;NkJ3zy+Z7ao`pUXlT%8rLXDMx|b!T1xy9_qM;KB?DB~mJ`l1QWrwa))1hq@A!Leu zUG>6mmp;fql@eXqmEKEu6&UQZW(R3Xi81d_1uV#UEq67R(*4OIAV;zY&;uZgAjwbg z_`$GW4H!sCHC$@SJTP_hpNE=g^dY$h{zuKURTfGt-dWZ{vsMmtflWQ7-bHn4wTpfn zuKMB-s!+lu=Nj!#|BvJ);MmSz@qCq+`alZZK*{L(dqMee!BF8UwP^ahenGRY!tdM? zhQWk%i$6VO>Q2tj31KvK1za5l)ql1in2<x*_0$}IE6+Vu#V4`#R4+3;Fh#TPwgay! zC!U$x43YUA4<%4=#IUGbT)H`4=M_tesOg6lJjaEtv9ku=p=sem)pVmTq)^t#y_1IY z6Jh`4e_{_lf0UYJSMJ`%5LaXIZWzw#338<ScFEi7Uc=A}gGy&er845UrgX19-s!wX zuwAVM3+_6bdYX3j`qcefDAjzenhAz8y^Fq<)H{?N4t1dxG&V@}_D&t1by6-i*W`fD z*l2y0uF^xNRaX!K20qE1E2pD2@zxfKLe#J9HG99>Ue6K(SxXtw%jV8u6r(XYN!AJy zbm?BbGFDrS)GvGN5Kg*E!KJbt73%!llkc$$eD|!&ja7uI8-lT6nC5-OsROZ_)O!<q z6Hf+qYBq-^QI4;%d*3Nqj8@vCWv_(mzQa8UEtV$0alNSAjh(zn?c@ioY0C4#cd~)L z>i9KBKbIa##Yky%BdM0En`<t<hJDbaUuf?Txh}HeJC5lMp3F^KNP&zk*@Gg3ZY?-D z)R|g%(7Yk94OZ|PnG=_Y;%%vld9;m<@W|40s-F;1UNoz@*vZ43<Xf@V%3xWuvhuZh z;6_XoMjiGiELHP{{zzM_Nx689x=dWx*Jrj*!A%<uUO0uZYq0#Q%l#R=AZxx>P1k)e z?UZuyfRFoJ*OWzv;OG(qxm2ISJ*U**i}ZbW?efaU<!m1FO;Clnir@39H_GK6eZE<e z9Z*0=8T`(q^Q4$qXCRKv476a&lWo}WkdQAD!+NcMfM<6QEZ{F}A)L<E=P;p#zN8N8 z_a(6Ji{?E&rF4jT7?+Gy3GgsX5V{5IB0{$;+EU)AJE@u0*o*l~XMzX<0<T<6HKB`1 zO`i);H;~Q=icFll)jk(x)ggLvop<XsMsy9c4Q89-iM?glZUs&S_^kR<QJcT((A^cB zoX)p%Z4K{)a{&p}?0+1ob)}y_&sn2J%;kF?S7m~G;Jw{W-g>J&+2D?Vd1Qex+(u8+ zvSp>|0T;M|=emO1^iyF}J>eCls=0Mx&ozcE&gTTX?C*GSD6^CrgU`_R7rW&h^%5>X z*m&{zv8<Ir=zni-kAkgr=_#dcEqGyH-cF><v-wndx`SG$d#LGkL0vB4B=2Uo`0Akg zUS0a~!6jnV>4_4;m63{D<BhTsb<>yKHtw^S{Oc3C>Sx<H`F^GzzZ%f!AL%^x(g;Ki zG)LUT<ewnTPv6dG!W7+GNu!u4RV>6mh{CpwX#Am^w9kpAj~8{PmgYqC>rD*NPCo7E zl6e=}D6~k{ZWj9_v-?|-rZtz+6{byopwSXdFu1o%<(K!KS93rnQ)K#lD;u6&x+R-+ zfhB!9sb6}U0p=2mIVn+h;R8mg6?}`B2mz#;o4`ghBxjMj*eLP07K2O#lF$xCj*`p4 zTa17m{Qi-G{&nLS>wm)Il{lb^yOAqCMEyVfJumhX^_VsxY9$3}>JT+}6(pWAy`Hih z0(k5sKXVR2uK}^V`EC#PRAr>fgQ5#!hiZHse?Es+F8mf0U^9@CQ4H~vNZ~OGiA;}` z0H1zw_37CSXx;AEBe@8T_`Gd!-pxSvW69KYXGBs8*+KD$$j5ng>`e?gxZT}<d}9PT zMJ$v+kbB6kAuZ;#$c*F+Z2=G(4~dS~K+<%-{dbz5FNVo=22(C&L<@G>1GHc!AGq@O z<oJD={_z3Fc`PZ5vTiFteVrQV@OzXXJ?RAq<zjdZ>j>tNL|K5BqY=U0e-pT!z7M!Q zHz1?<p_aWb!hVMc7~5%-Tj_mP1ZFFb<%|L`o*tZqc_RILQb*HL+O*H#-38w)816WI z4yNh3Y5s(_OH1HX-bTR`0d`PxQ&z|f8gSIlF1wk}dg<x`Xz-d#7D139GEq<DIXh&| zYJup+tVPtt2y^(Y(`#h6NA!J#?+4|;x``P+dy<?v{$G+aYwsGYnnV5b)_Elt#i>sp z9SC0`Zl10}IC(UDk}5N_PBQXW$9w6=MR}@GL9+|VwsjD@OPXZhlOMzv^IN$|fCI^h zP?AyVB1Az>mUs<0YyB+2qGi}~Z|YL~KgpN`4;la!$+2Kpos?eK1)t?-?bzDu@YTj3 zDV?A&dI2a#2c9D|-j}US(+OqM5~iAbpURxoNrRTO4fKw&CjWFkd4!LN+jkufycYnE z=y51d&c*(X)ilB*RDK4XE~!69Ig&y!bPNiz4UoLGBRYSPc|!661W*S{|CEHOCqWt% zRaES9m35=CMJ6pMQd4sx1;X&NSp*Gq4L^Q5at7G{?%j-Jp>wl_l33Z|8wA>@Ch*A& zms@k%Xx)b7O>Jrc4R^llfoN1$u2IV)tBp|<YZTTi-of49!Q!{9X$0;o`Ep?yvR`RC ztxV*t!I$Dt=>OjaIN)SuBJTJo!%A$8C<wn~2eU>zL`rt<uh#RfNrp3PztWIFqHF(c zcE5kxAgV|(U<xOwFJEGaEGs)3Zrt6OR(c<D-5{nj>{M=0ICTl)@5)HJt}#s1TnR3I z0nuC8vsJ&tRQ&94VVOP0LE^#@%yMjalKD(MsqU$XcdzNZK{N2i6Ud_2o5m2T_T>iy zxv1*G;AyOBxCVrjiFF8YEW9Dj;m5KFg?XGv9#>(b^j<HTT0dyQ%DJf9h_p<Q+6>Eq zof=xHn_7ByX@qRj(E%H1OL!^CU>%o4f^9|g?nedrW2c|*$JF81{rVhd_;+k)aazMT z4&DqbZFJXfPbPaXf=D`8vzDIAUnMhI_c!cEaELs|Pcx?OhYDI)zh?m4w}!4V<|_J2 zqYu*yul|L*-1tJP%ls>^(`LW$tu#%cdV1Afmo$wSKus^184JLWp3BAmZG?g)4+WNN zr4ZlZAKFA&sZm%KPVYo@r8RUQVbS0-rXgd+&n1Dzp+^5wpJVS>j6;l<<**+VgH+Gg z3Q-NcEHoM>3FpfT(fx{r*#WA1SrP^D6}161(Y|}SZzf)x!6Z@EDuq?{xcpq!FK0rV zJ2DaAonH<qK^Ag0D*ML^OjPK<%J+TQc0Q$5B*gD4O+kG8bc&?N?DG7NE5C~}F=cDx zp-^Uks8K;c$+d&;*^)akl9~5~43g$~QyhYDH~8hwk&Ejlri7Dr%jh*goF|t=;q!)D z?fKG;1^DUIzEI2P>b|>jeBj6&dC}<S8P1^t4U`5+-x6=GvfxSY5G5UVVIqg!c+GP$ zC;J85%8pD>)iRaEbmVC4a#L9liBQm|M&7EqLjRpoWkKp-t;z0LRY%heY(+~|OOv19 z5t`;#s;A@iZzSMB*1EH+Ljv6`LyEWZuT0Ot%nFz+P^L`yg)J|^5leSfCr>v6m2AX0 zed2@oyqhg`cnwaRWfoH6g8fhJEkAzZw>`oB^Nb??1^?L7lvt|Kkl*_8ri|>7cPGsk zJq{bYy!R71*lOp*PiOTK6JZ;@AvgL-z!(#GgQ*@4By952^sIS#0TiuQD5x38XHHRy z=~_)3V+P?KNhfRv7{-1rCS%55BIi=ny?Ts9u-otIK&T)R_X+Tu_BwEP+Ftt$+3B|( zoY^cmdy4{yu9zeddaJJyJ!bW#&>?sj)SX846U+Oi#?Ml+itmQHm5=ypk4hyfeqT8; zkDm`OWAV%8=iv?e^~d}5pKqbcVvNZ&tA8mz$0}^oH^>%;O0sX~6LKm+YK36vJ%->& zO$a5#pcfBhLX+YYQEh7F7(JD3PB6GO@8>8uOw_stM8we9k4+!6IxT|`SBlQ-9*tGI z00;=p4oW9QoncoMGdfE+e$U?|I8xc9g<j`-!#JK*E&4%fp*wNM8P}_{e22lS5~8QM z9u|^kjB7}-XYclk44b$p3)dc{?EN((sUjQ5pAgVMf`f;Jm+0~Ev#^Z)ka$lciyFyy z*f>X*Ks&4Xdgu9?3`v5dNBP|@S9&~3of<|d-J8UGuHe0GDb}SipJRMQ!5Z0@_DMH2 zxQ7+uY<Q%x;%NIxlrx?C-#@&n+TI`*Xe-P3j%j<nl|H1j)C*K2aW@wL#l>gm96jw> zck0Up_SEfDA^XRN<Ht9{Ne`xtE(ZpPo%^@~4_it0-#Gt3Ifj)YQ$~wpH_9xtwN;+N ziz@03ZkNx8W9TR@<ecLbedemVXFN;0QKF8S_~L_=fX0pI(pLp2!pff$twpO9oMJf> z_m9%)MQr+ug=W9YJwI162mx)WCXJ56e%WeCktV1vMRAthben_0T(A9+)$va!u0=X! zzcV+@@|LJ_J=1<a_`?`6!<neE>WDYLUO*s=%V@XEzw1(U9Q+5vXP`l{vVsjv=>EP& zDhsrVY+;GUpK1~~D_}!t+{2vy`ZJVpfL6h6=$8HauVN5i#r<zAU;YA)42%e^f+3Fo z`%nOo2@49<n2dN`#lOEg5V3v`FLR;(IyU|{E{G%82~w<11QNk4e3rxv<_0HEZd3|J z@7LU~5YpK|Gzk_vhlO62ArRLeSGdeI=#bAJ+vr4ljbmU?=t~n56Gtg%3(1g>P+cOw zdP$}ORaE*UEV|&Q`lXj~&D5%w<j-8BWH2E{-NkI7h*BVz(TKi2<g(t{7n|0VC_bN- zSTZ^;8KQnGRs2rR$k(2(+Cx#>`mY04V>O~&9!2xu=`aTZZgm#1H6p3)HPfojfCCyq z3HAWg@u;xG!JW8ARZ!`a6O^=kxJ>PQuQlQ_DEj#!hqfL<%Hyk1eb!etRp!0Ah2~@C z;``!d-YZCB$UjGs;cT%3ef068D1b(-pdV;U0Y}JOe)ac_W~~$<#wXygd>{pY7eAaJ zPaQpq-1dJg+=F&Y$0|)<pKHNkfx4vq1HY)}ZegO3by6ZExD3^LREVc;{`>E3QpsY5 z`r?F2bFdOGYG&2}i^`{!rMjN$4Ncu`&0-KfJ1!6MuX^UDLOpc$3iHvsoz-!v&)jbf z{4oI1)b@Wl>!Z0)*E5xJ++)B^j7B2DkIPJ<EOQPS3xY($=iGc9Hv}O|E_)~~HGY60 z1V9#1V(<^ZK8a9?($pzrKf5vX8g4X_;CUG_XK6u(xMM4wi>pHI&&Ahf(8!J1U-U3| zPcFWI5(kj56O$5fL4JVRE&-pT&JKS<Cky5)WkC}=2OwX0Q>d#eOsq(X;&s&kn#i&5 zx^N<}1__{@z~ZIyfaK*1j*z9~?)IuL5SOgxUPT|oRxP#P2Jr_}U7<)Ot6qgoY9b(! zTS9L=HOqsVd6hld$zlcFv}&>K_l&i!VaUT>VsJ#ykh3*5qq%Z{#CDQ2a{(BPiY6Ei zu#-Z84uin>gh%ZHI!P^QTgG6}OBdLMmd(L?@nv&1Vn{&$+YNFL9@|{&6bI-)tgBGm zcfPpK0<LI@8A9fop9emnggZ7>E#<~Q6g%S(@CyK<ss*x|c<x7!KW3!B3X=NaZqG(? zHG*d4A>{u(a9#{K_5Jhfc#3))Be5Uw7lY?`zu#wE=gdz%va}b;b|;!z+Z>SDXJSBy zpG1<-WlcQJEFkZ`IQ{^c?Z|W6jWuj97!{HQa)F|0gUrDTW)FcGDi_1SoXQ!sFO1M! z#$3JTd@ftRxf{eUkU{H6TFJn0s1JdrRvq!Ywk_nDk%7LG60%{^KMVUowF7Vl?PfEX zx-PGQZrW5gN$HCDRRZnez<K0?&A?J>5I5Nrk_-l`mW$O<yKW3OmgQ&9%}Rzg@hX%( z();x-WBEM^B$W*!OzR$Jkx=i-%!PGhm7zVnQYDl%EPx+LG$tIZs-*T~SJHu?fMoSD zOx7v^KTHYG_u`jY*L3(AO2I?yylV+6d!0b*!9vCa?xj}XuT+Sy0SH=R`jKbew97dI z?lNAo$f^vvN5=)^8)Ax*M5n=J5wkV%{a!Vn7I=1jMK~4ytb#RJ$v)_Di~-!7Y<b8} zK&9I3KKZnIxwummZm;zdQWZV~)A~{})1%JyrFLh`Qk^k>>OISzb<0pBStWg|jlCOw zn4$g3qk*X!?C<BTkw;z{LpfObe#VT6nLizyUmsNRJ-4k@s%zQLuz2Gb;Lw^8#Q@P^ zVN<<Q&Q#&E(asjE4(WncYpXyjTLqNTyH5CFM4m&Ngwk7(An2>xe5#P|(QLdSk4XWs zT1w~vJlsKRo}aNu;2~{eLs$5E?%G3$xp!<jE5H*MY}NdRm~TbBIX}gHF~?ab=~!Z) zKq|;hN58IeJAoyb>Y`q_C2wNt#Gdx-l<6J7e%WFw>HWx5Q|?tp%M<^EozS|5)Lw<4 z1e2_x0ip#fEa~ssHDKy^Vs6ef*=MY&Y+X_GqO>0m&_2kFd+qsa3FaVM#iK8-GP^sJ zs)pu={{Z1ILSxg-HSSNM43B-ud6Hn&e27Kegxtj5$L;oRLpGz8pRjnzo;5MWc@i7( zw3I1YVQUrYmA@O>Y(3RdHoqACFgaI0xF_MTbpsPe)GQWo+>+2C!ETYJQI~PAEFcG+ z-A<wRdF*_*o{rP!(uhuuNC&zkhvKHI!NJOzPFiO|vj{5xC&rR4s;LgC8>#8j&lbHR zIz+#FM1`lnPA~uc^pLT;)ckXf>QWQEjhNb$*|)WIcVe<luz3!OoQ+TaoU-tdL>Y%8 zE1GOV+<vM#(BdbL)EN6zJb(_yFhR(sTk6=8^U)YIGs!IZwIGfE((Nv%&qqe!p&H-1 zDI0FtGe$nCnCn1u<-X4FL_+{~a-W*`hnoHG)pMhcJ(sy8zAY-Q37r=TykK3q)`<UR zEk(l3q4Bmxv)H=onEMiUfis3@i7(q2&X)(_&t45s+|oC8tD?D8INfy2?D+V?4KsK$ zKR~A_xfyCahVLU@^O(d1KC7i!?vCii`B$rcoWc}R@#=Sw)k5sog^LnBDp2<B?k6xH zGpi#}oHlU~DAGe71zM(HU6$ivHRGLL1G8v;)U>>|ZXMamXxMx8)rPR`;McYAh3!c* zaLRJfpUo8uhr{OAkF-AewR@<kvp2j?{s#ORG!php=%mU)+wz~!|9Q<Xk0eT?<E%0b z>B$@Z=e}na|D{ZJibHtSk6x7z;OjF15R0lx4?-aXp>^BYpqF&-uYo%`X3r`Pk;Hs( zUR?t2prct;XY~yXy@DJE*Bi<GPB3T@cK|3UTWI$m0G4H)rIwmx_kj+!?WPR?%Bqm* zW_s{|>Q&lh_+_g=yiA$}%!WvW;eX;#d2rmzubMks0?1nlNYPe3QK>+FCBd0B;JMa- zZ3fKeb{rH_NzfQ3!W=;;ytiG=;N&s`xXCi<l7-1q1q2Wx`|Boj(jIQ5zqU#SbQyHa zY0X@N+P4`O@&TzUeA;rpFS@U26CxlZ5U#0cZ(4u3FFO)azjagYIHXY-PYidK19XNQ z+hbMG6OrdMiO#3o>lRz$>H|%h7C?PW0|49HM~Z<2<PrA#xsZ+219PBf6#_+sTH8pW zu^cSr<UmK{yajJr(GIhIsNF}HkG9{%TQx(<D=ZteGx6e?+D5nLJOElF<!ERXKz|87 z`ljIsnQ{O61jZP$k|%M100apcr)G^Sm2d7@$M;`J!<m07J@^BpZ!f}miX7I8A>m@s zJ&^F6h>?N&0!x8aU@t%!A7H1cb!?!kk*4?h5xoGYkLXHiAHf*4Pa|iDhSyBAqJ-@j zBv)J8)a{w|K@GCcv$t7&2xihGw9{C+_AUEyY6uS3@EGbD?oAk45S;XGGtk!^s0>M7 zGPiY!THvmAm>ur*?}(NXr;`7AWR%b|WOHC!!{Tj(^LTkpUZ4TB;%SegB_%cl5Lps$ z-EOAR{E8Jnvto!6TPU_E<VKi*7Dh*;Qo_DGXZhxv+n+aIFlemVO<LP8fSUdKTH1@^ z`R^*`DtiRNsXj-0b49J^OJq6nQ$ebvr~V1}Zvr{H(5&YgvVjwcBlSM@=0~s;gb{!Z zDQR7JDg)MX?^c()!QBdoXQCIZDF?JRfO^X7jEXBB$<?C_k-&4ZPZ{OL@Nd9J$s<T5 z`}I*&;iFgpXcTO_2sc@fz>=9vb*P()g5RE%U@1?p<b4g8NWLV0gd7Z}ifPkIkU3h{ zbivv+C*}ujhY(IEBq5b69ci;=4$5ig-!AJ&GNFzX_{z_AnCe9Ck+Vqd{FOJ#=m*4W zX4A2KF1662HHRf&NMn*u%-j(8je!yZQ~^-%pdrK=yq^Om=Pw>RVD1@q;nu6up67_y zz0je?iV6*Y50*}<T6M2EMn!YnJl^p4HrdEVd=UlN|Mx+jVtx|W%$>|&!Ipqi>4f$c z`5?j#1FmSq;@u-b^TCYNK45}=wslVO_+ZmO@!Ap0Ef~sR@_#n{f_>X)D!6DZjyQfg zBEVFkh^i*L@}2}60UeVWwVLOTPl_Le$33-1xj70ZWtg(Cb$}l#F_5U?^HwLBANM)- z61?9=Ol$iC29YIzP#_7UN0deC5`DlepK16^FfjSGlX-HTiDxnQb-sY>yudZh@p;vb zkH|)i?9~bk+U!-V!~^~z6A(9Z8SLp9Rp6^VGj{sQ5v(ll5#xPVi*GflN=)jyPw-`f zx|0ZpSTHEhV+Aiy;l1p&>G`n8q{IFs<Q}oP2gF?^fnsy`j_dc(8IUr4^*mT_#Wh1{ zBTikwkRO`YPd>fxOpAUoVJ(-@%8l^o`I1rHt5$+Nk{3^<<u92gW!Cj1#{IMZyF!xk zGYKO7Z2lmido}YhPjTjj#L713I_+<;hs8y)xOORsnbZ&fyPz&>Ac4K`qSq#pV>>hm zQn3<*$6TB6Z>VR#8Eq1@_8wJ%{MzxMgv;HG66*q(L8Jr3oSwu|uCBVlzPc>+=3zz- zan#c6@E)%(r?<f={cJ=~nP8It88@wLSh&1bx?pap4dt&@yM+;h$0Ak@&URWe|H&Yv z(@NbVCubh&j_2W*SJgGi{kgk7-Nf_KDgV+))28C{%S|r`cx{G?TL`V8r8Bp9LlvlG z^5Ah<_-+(2v1{T%nCpcx{2dzxdEDD<y0oigf^+`3whZg0p~+Kb?=e?ZoVzrpod)ij zL-`rarPAoOQ-?928UFJM8+D)G$>}QHK#D`5?8>r+!}o$8Koku>jA*O*$I3L5R~as) zrY?OGA!Id^gIO>FlaFANwbBqUAU*y_mx!~rg}uW%>UzMCFS$4;HuIc2VtN?AghV2w zl_>Iz-v=DlDL)X&nSsSPYGMd?jLP}ReCUt~qO_a8Yxd>^AlSo~vq6Jw+!F~BzdBCD zepln!V*e-+r;+vO>Coc^i~(_RE4R3=2ao)_eV$?}g}s*jQN>`hQ#Uc`z_GZ$ykW_C zQhICbVsy}@Z%FbCs*2GD>xA;}L2o6=AG72sv)>*;Lho9=X2XE4>q@LCZC*Lys!Aan z9{928!c`MWdbDOPfwn4`D?nvIl`5{)JT%2(%y@MwWAvk@J_xPY)(%4Gy$ks@2j$u- zyT$S)N1{Td))x5)wxJpuDxM@4vckg;UdCyI?+C|cu&`kw+97P0iSijUR=7(*GvC>g z?gv!XOmX-bXT;@`$zFtVnSE+V3&ak$1YJpa8sG5~>14(hB8fYEEzhoIe!$@!i-Z|x zLvQWUb}~S#C!}-6J_LISto@~{gsYEX|M2+t{;{a(4vvlsWfCKMOcd@CWavg9Zg$>7 z7ju_?2h6v%xN-d%Gf)2Mr)nexm|?y%*=g<_w5%KR=DKHy&aUfXT&+IHlaUX%jMNLr z8<)=`loNXqa^AfSE3<@t;QUVW_3kF}ohxS9MFgk)o6?De_?ky%(90~?GAW`PlWsCg zI3ww3wV3ROLI?XeqVqT1;Q>B~H(7;YWAWt@7)4Ty-+-fkaO)b|7@;~n+9JmDeXahT zA)m<YUk@l=vUK7!r{MgGRJ93vkdL|_TjQCAAW0qxf-cW{LeG3&v2fX<9AADlKncxU zBx1r;*GxICm@mNZL78I3u*jeF8(Cmo44Dsek@?kOOJm$10U+e%+Z;&3e8pxZ!l5fA zkMjANKCxBV3cqG_`@W#h=wwNyDHU7jKZ6}khnf8_qx7Vm+6a+0@IY-~mpr_9vZRoP zE)wHt=a_b*Xgjy$PaW!uGZW<-c!O}Vqx8>9(%xiHbgs^44?q4>uKxe`9_cTEy>JZK zK)IB6PUmKpql|P9H<k9|VJ`CSpx%f~btUr?j3PyPudojgC?OD5;Z@&9j-^d#3t9DF z!(<p57-tJr-jk~1qx}yct|HAhcd+Z=$WBn<t?jSb=-@O1Rf|R9Lx`Ekh=6ibdFiN9 zxS;^7sdGV82B997VRMl`M{lf)gR&h-bm)Q@0hQ7tdwiA85wEtV%7vkqm^BwS)aKC~ z(M+iYWy8?;nSo#^-Qs?Zlij+7biQhE?4M^j`dDVs_a3o@w9RLydta1Yg!m6LC<e^l zKcO)LVpRbyEfau=;D{Vh^;sk@{H`U3cUo&nyb%!0<4)N8$<<g67G`)ED%YU#<Ez4T z%>DQ4kPM98uf74wwwhhZb|Kp#C_mbGk&8&O11fQ|SA|!><^#}vO!GJ2_sU84yt$vI zkYNW|!4R`@$x{g@7u4MGU8glTkP|bC)$fHYM|dsp&xtU0=u78Y;CBR#8!=V~S01el zfA)4nCgS{eTnWZ?M0T20%%?a;&_Kj^j$TO?V$$k@@p`2BijuE><6$2R01sP=emfl@ zUNZuN-fosa3gv17<CPBUFL{ZR$(vB&b%B=kjP(XvZ~{`I13h8xeY9sTo)W@l4TZsx zmBKb$ww2A>1=f)?K)~Dw`pV{Mc2^14jV0ZGh^TF5pE^Z$_nN$nHlNS&{`gAbh)wke zt~=#jgt1d-RRF+!fYWQGjJ=1OM~WcbZ7z``z2J>>I6V;B{7{IMuk1mEgg`-E5Cm@l z^B654x<-$4Dm6^IhucQn$Z5zlerRU`iVri;vmlkH!r18!_0MDMDMe)SI{^YYhQR1{ zK^&$jOelId-U@eL?90bT=Xf-SNm|caM<lt{0c=>@b6TBz^-@p3xTa6Xm(}R;tdlM0 z6oSBMeqvzyrnLJp=Mp41{P+UM*`U-T5KR~R%<Rgw(w74i#yT_a-TVQhgx0FPNDW@e zmO3LQx_A}a1BB)U`6-+DrGQ~1!xsA$0pdXM*aAa?2Jpn$O7-_jr{nI}6qUnhA)Ao1 zBwmk}p-XZclC8i|?r;M(p>`>8aP!H5ONhB&8yGukC^8@Mfz_q-*1|V6u?6PUIQZ@e zr3m`G1J7ozgG8ai6g$1(mLIt|2n5PxQPc$>2}_2uF#&|7LoT6%yz!Y56(TD}?B77R z{$_Ru#tbIHaW=9uF;IV0_O#w{w)kl;^7T<{?F9U++KEh%3<U78UrYV^-jQa6RLdmk zOFH}Iy(P`jD<)CnDm5brB6&E~SZ&vIMwodt?!)*$7)@d)o&7XMj5{h6_w7uK3Ms>+ zjEsDx{6~QNO1@?=3bE-m{v&H1g5zKTvd%1E;)Tro93T06S~gq0qc<SkdH~(#*T~HP zsr-DKN3UG*M(sZmnwWz!^o!%9Ng;c>R9mxBRVAmGbs&xj-nxS9Bm1<7zOS^U;{XiO zHX*Q}t2K-I+im}C(Xn#t<dv=k{Rcfz!J84EW3DlTLbmqnydr9zGK5~pt&ZUH+j;!# ziA@&6{y>}w1l!vLK>)41;J$>)@9zt}2?~(BTc~{{*HW9>EuDbDgYVU=`k$hQX@g1x zsb_ZrDuoy4cXHSF8$8H`e}78~Z#a8S_k4l|X7$i!-9r?HVB{SbTzwO=5$21NGKdjQ zp^TxqPbT}07j-ajV@2@Z2dB)Lm-pBvixtmR9YX8w!4&2Q4P*I$!(PCUooB*lIWNE> z?Ydcl2fn>Rn)Em>Jri-8I%~lv)T&*l@?a_u1vjvvWlYF?Qrw}bL6u7WnNyK8{t?Dk zo9R{>`h4S`xX&crL(S9PSV3h^Je6iE3VN-gnV#I4{;<=Icl9ONwHb39q+Hn=(=@*@ zvhvg<^5-EmHMm=yTaHdEhsQ+<<eNc(J3}l-I%|aQ8om75=T@UR6;Ij}JEUB#t2*54 z@p0Z080(!>xYpp=FwHJBHD|1J52ll6LAheEd>Z{i0#eD<e-#-01kwE?_I;ZC{ekA~ z>AP9#*eaQ4jw+esc_SoU)a~!oTrCYE3?@udOZN)w1s#F@=o=bC&aip%y!-w0lr_9V z{B(AObfJRHc6^wdm<6qp5pcnxpS~?CR`tw&sNh~P#o0^q_<rrxTf;U7#*unO+@J+G z!Y2aRqO{p#DFqISx}2E2Lo);e&!o|iu1jLbWA}j~!(><cway2^R(;R)79pj5KkV~s zb(0Q6a##R?mdIUl8FR}%qvQpZOTb*-8}{w+QECVDjAlMsbadnQ8Wc=nMEgN;QxX-j z55&h%FoQufgQH;@GC}O#1>y_iW>n6}AJ%ep2j{~&2$iPx%d~k`sL%2!BEpxNwq9gP zq>ubuG4Am69nO-x6s0LK{tFGwqEr{;_;!C`q3a@{(MFAA4H`_Ast6KlU{}^jHIP=# zJ4DGJsF4}b9LvY-Hz9{XYWd7YxrO&`b>bM+R#lb5jk17A-od@vux2+TF<h0Cuq`(E z%?dPp_d+ssKcWH$1cn+5?K@OkSR%MLu9mf~m8Uxuo(o<Ks6TGLB=ACY<Zj3IYIMo# zH%K)j&2S--6fM6QFNzrNU|no~xnzZ3&ZU8(W+lkPn@_))s{#nL5sQ_BXnCXiNyG#o zn<=Fiej=+Moov#zMpI&O<zP*2>3#O;?{Hv6oAiiG6VNJkJh>3ZBkda%IY~t2cylIe znk}L6`kt%w(T{8?x7jR9-aLYCMwD*LC}xu5Xn~=WM_PC1%gP>Z3Muo77ZtFMU*F1g z=G!_zI=IKrrlRj<P29Y7*HnD-k%WW2Xtg`*NU=7SAM%k)C?+sUK&+nKUaWW}JzQnf z8IXyK<p5rZi~1)>RcK=y>gaRP8!&yjJw<0w<688Tv1TfqQ+0FtnfTh5x2Toz3+A^@ zR=uzERoNU+3kB2MJ!&RkB(*;cn&julH#)p(#PaSo(_cN3X1X%wy>D&1t)qPUn!uXv zEnWIBJzblm134ne`{J}V#^qmlz1Q(KL!=HGylKsF9$!x1t=Bm!1&VAFgz>|dy+(y^ z*KHj^qL|vA?H%?2UHqx!HNI$pqWOaOk?a83N+ywOt|e<x7y%!quT*Fs=<l)AKK(hW zUkkT9(FxMqN~c}{j<YQ!wo-q%VryVmUqWF@8}E2AIrQ$LKi`B3hEr3(x5cEzqx%C| z_F*Ft+S~e)#EM)cej=vU0;D|?2u!o@`Y~bs{n^`j_H+4CTm4$NMfZn}B#SW@LXhQf z5D(?K&B1ZiS!G;GiOZgM%v?KHaoe4?>?XC!eV)E76reeK-}#&zcDEcw9PeV4)yU)9 zHW@RIe~wO-#?LPueZ88puPnx^^03h0^Q!kwbzsJHOuiyd=k!iMqOGg%VbgSjz?KI& zbLKq&jjf2=+WtX3#S0vg_N~mRHy&_w;>rCcQ}dEk%YHGz+QYtsC$L5{{Z2~x&-mg{ zN5lNhVjY_EETl#D;9{syks)VeaJZYTKLRyELbdj_dc_=^g}3l1ieV_f)KJc5e5;6| zhJoJP!`~Mpe~!Wa3YU5Y^Do+l7X78eH*VqUu{Zy~$Y>;?iqEyViHHjpJGlRJ0}SX@ zEDRZ_J9Wi8e_o1e#b8El>`vw^{sKeb|NpPwqeh+a2%doCl5R21Ncz~^zt^hKi?MN( zK9%M?Y>@@Dau$$iabKZ+>{6unLcIfdTDTdwd%=GuFb6T=kw4Pg$Oy<C-$`-Q{tJS> zrP}?27u-v3SpYhk!KkA&l3|Armj?!Y!ruZu?2&eS(Fcfaceev^NFCru!pAJ2x<(QZ z-GD;v0?)%lj|orZ1bQDpu7XaB+MTFFa6J!7K$TTH1j(2gd4L`#fj#UGoIJP$b)X=$ z5SPJ@%MWIWOA;ZFJxqP{Pqj*EK%@!;Fbg0vjrU+i-UpCN&Zvz@@X*iu9IPwus|wqW zEzf?6_}!_YF#Kw^**`^J@I_d6adWY6&{<GUI>YElLF?g5BMZPVR<~`bszDCqSLbCI z{L<E}TC~Gt1AWD_sBAcevq1ZH!Z7c_wmtHeLE32Y7;M2^b0fv3k16Eh^&P@o=*3}P zmcT82`yjS7VmTZQQrQx4Vq^hyy<G`@$MSQPF~m856jf{uzA>mB1~>Lsa3%Nadu@H* ze!DLtURVSj!G4D7#=+vPdI8hUqt%;__K1y3XO~NQgj~Kl#dG%!_3E5(oj?NmOTSWt zcEBvyb`^pUIm!u#x^Gz-Gg7TTXE>GSxzUc%qoAZy0`Y`}eJ?lk!2@`Pi8=9=oHmkE zhv4JeqL{RP^X;n{>xQjO$j+3slwaN5l_oi|nGcuzL7*95ei$U!G8j`;aA)F>vGXf& zmSEoG1NOg=Dfk}7O{i}_G!aQHyCtll0~yigo=<GWW1l`Q7@Td@mB4>OL4l~qaVXDA zLWk$8>-5tvkIP^q-0u>l-#T;@Dy8_v*7#Lo$Oe(7&LOZqb$-UQDr-V<Dz7t$Y%5Z; zd|X>?{{hf*4(i)2waNAb7!KsJ?2Mp-AeFSF<kB@l(&r?Z5qMKh!{$Ld1ko|Qgm~pS z$aO1}Q~iEB>kbBK(=DL<>)e)$T4V5Df(?_lMiCaxquUDJ05#4Pck&1V0#=k(zR@ab z@aU65`Jt<w5)K^(%@|W4X(P>5=D--AK|&(3y~8|Wol$jzdW~W%PbnBmYB|oE7Hi19 zS3LL?j*5490*l4>S_wUP7Wb)2U&8)&@(Dwg0W9TLErVFiJ~-)`h_9cZ@0u5{XJ3Kw zBgwIoJXeS$e?++~A>fT9ONul#G&>yzmP5rapQf)1{B-`-wXXJK@pETa(&f(Z(}B&< zCw(wH+MwcPTNj4K3^{Rm{I<1QaTLU(&n!0ZnXRObcBc{cF2l@1ivMc!*4mTaYp#>8 zj*;%G0*4`Zz-S(ZvsW+k7_i9GG~(D2H<^aY*K0H`k^eBNx_2CvRI)N|k}kBT5O@4` z#Kq*X`&)9jWqW1+<(3%)fh0Q-wuRQUH>pOZ0AbHL*-Hb2{c_{c1`KAZ&<k^6bZ(_{ z+yJHNPS?jF!I~M;BGq<MIYp593jn*iRSbh+NAXS%T!RGEF?U6zDeUPC*06-8!9_iV zPJ%!5d~iOfe=W{?{m`VfqcfYHd8S_8`1H9&Gp0X}9@AXws_8y}eq_}4<DlfV2KCC0 zQ0e20Yk^TJI8?e?lv~Ymfg-Zn8w~*{HCghq2cH_p!YlBI&dv%vp%zx~I-VN7`G;Dx zgJl>~t(4N`Ki#CcTDPB{dff@?!V$t}YJKU&sXeyhmFn{!_y}-6z0*h#C!Blg*!ARc zy%H?L<l5BdW^AZIHjN=E^2BykE@74BXvOomPcP$rp<nmsYYK4ey~c*g>(L6?5I?3| zMHYf{YY19hh^s*tU4}O5>Vr65>#bH5A25XzE91~i#jUZf8)MxS!<G4&Jbv)LIyUhU z!u3CRZ`8lj!>KL)``{stes`R8mZi!sgRn-qx$vVVD?VSha~<>N_8|)lT@-m2l|+O| z)2z(L{@1s9o>22QCTq^+V^+A{O(;Ju@Hy-x)S3)ajx*~{v4He~W7l+K*!?BWb@Nc> zz$`=Nw_V)<GbT}MOrja6d_~-%R)X^J<D(rN-(m@AR+GNZmlyZv|3I+}=$bgpTkMlX z-(WL6v)l4dqq|t1IypHOvK)F}auAKBJ|asK`$B7?>j*4laLztK4uWgr%9(rbyOxCV zn*5YR`<NI?Ai*zjhbnT0H^i$siuR$L5+jPlIptn`<xJ&n$f@=oe(MRjeGlNr?@ffV zaq@uPsM|no=a93z{G<d&s&D}yh{6&QU+2H=z>*_7CS#4_OIY!2zo>V+`@+Qpryv|V zbl+)J((_^x3K(4%5^xyI2P22v+M99G7^dDQcq!Is=ab4Jjq+CT`5dBkRf6NarT2v_ zQ@H%o{*`o8KBHQNY0V0gInV%`7xCX39RPiVxc)a@VR-1dZngfoHL=pKG)!IvbthZQ zG}x|rHw|^qSEN4mlHehrh+YJ0R@{}6mwEEjE=b8&y!+|9l<vii0Ech=T-?O>b6!cb zzkir3dp-MFyo@J_B_pGm-lI)mCN~Ys@ujfRX-mE}1`m+h5S(K`Q9GN4M#*~-s|{`w zHB6!1V~_g$Hq431*$P6mh0?eaEATw@<pP@?fzEvFt*ZWoZ^?<_p}c0yOazHa6LGu@ z>is*BHOjv)JBrXxBSW6;9E+*AAxdC+#`r4L>s$MMFpmBq5w4v#u)l}#H@=rFURsyp zN`7}%-qkzd#yG^5qIRx+n847=J!qyAE$9Uc(zB>k76SjU%kiT(a2qTEjlbHZ>ZpRI zA&hYjy~C})GG6bbnw1T^oKyM!rxFm5CIWq9ZWsvSw#>&X$bFaT+kW|oO-bgHjl|k- z^=fsmR?|yzP8t>{Qkz*c=61<JjVYL4>5~3@Z{2}`0Y`NkKbVYMQMP2Ab#jaG=-MB6 zcq0{#OOA2c*rlIjA=C8k9Zqh0_vzPP{i*~R(1T<dW;ad+^=g#K{XSp;6onat8sRFc wd%rMictMRCbO&r*|LDm5ed+(+dv<-6UPz|m-MUbG3jVvMpeCO$YvljG0P4uT8UO$Q literal 0 HcmV?d00001 diff --git a/docs/screenshots/command_outcomes/list.png b/docs/screenshots/command_outcomes/list.png new file mode 100644 index 0000000000000000000000000000000000000000..01769ea5a99163bdfee191576c50d3721570f826 GIT binary patch literal 15936 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 SgP-0amX}s~Ste-|@P7cT84X<k literal 0 HcmV?d00001 diff --git a/docs/screenshots/command_outcomes/todo.png b/docs/screenshots/command_outcomes/todo.png new file mode 100644 index 0000000000000000000000000000000000000000..1b444692fafd72ce888ee42e738aadcfd43ab072 GIT binary patch literal 12532 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 T0RPqi{3yu1k}Z}t2>5>hFz&rv literal 0 HcmV?d00001 diff --git a/docs/screenshots/startup_screen.png b/docs/screenshots/startup_screen.png new file mode 100644 index 0000000000000000000000000000000000000000..e171a6adde38ca51e6ff1f50b4370fe6cc26c630 GIT binary patch literal 9938 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 F{SOGgp%MT9 literal 0 HcmV?d00001 diff --git a/src/main/java/duke/TaskList.java b/src/main/java/duke/TaskList.java index 57ddb8678..7eeae532a 100644 --- a/src/main/java/duke/TaskList.java +++ b/src/main/java/duke/TaskList.java @@ -73,7 +73,7 @@ public static void listTasks() { } if (list.isEmpty()) { - System.out.println("Your task list is empty!:"); + System.out.println("Your task list is empty!"); } else { System.out.println("Here are the tasks in your list:"); Ui.printTaskList(list); From ffcec7acc89455f07ee83f9abaefbfb05c799516 Mon Sep 17 00:00:00 2001 From: flerovious <85042815+flerovious@users.noreply.github.com> Date: Fri, 1 Oct 2021 17:48:40 +0800 Subject: [PATCH 32/40] Set theme jekyll-theme-cayman --- docs/_config.yml | 1 + 1 file changed, 1 insertion(+) create mode 100644 docs/_config.yml diff --git a/docs/_config.yml b/docs/_config.yml new file mode 100644 index 000000000..c4192631f --- /dev/null +++ b/docs/_config.yml @@ -0,0 +1 @@ +theme: jekyll-theme-cayman \ No newline at end of file From 53714ecd2a5a756971a81398cfe5d8e1fd971685 Mon Sep 17 00:00:00 2001 From: flerovious <85042815+flerovious@users.noreply.github.com> Date: Fri, 1 Oct 2021 17:59:36 +0800 Subject: [PATCH 33/40] Set theme jekyll-theme-slate --- docs/_config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_config.yml b/docs/_config.yml index c4192631f..c74188174 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -1 +1 @@ -theme: jekyll-theme-cayman \ No newline at end of file +theme: jekyll-theme-slate \ No newline at end of file From ee1cd581257d1f34e83b417ec0c0a5fad7caf636 Mon Sep 17 00:00:00 2001 From: flerovious <85042815+flerovious@users.noreply.github.com> Date: Fri, 1 Oct 2021 18:02:02 +0800 Subject: [PATCH 34/40] Set theme jekyll-theme-cayman --- docs/_config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_config.yml b/docs/_config.yml index c74188174..c4192631f 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -1 +1 @@ -theme: jekyll-theme-slate \ No newline at end of file +theme: jekyll-theme-cayman \ No newline at end of file From a87690f9eb65af01eb7463d6e11bdb5f68de3ef3 Mon Sep 17 00:00:00 2001 From: flerovious <85042815+flerovious@users.noreply.github.com> Date: Fri, 1 Oct 2021 18:02:40 +0800 Subject: [PATCH 35/40] Set theme jekyll-theme-hacker --- docs/_config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_config.yml b/docs/_config.yml index c4192631f..fc24e7a62 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -1 +1 @@ -theme: jekyll-theme-cayman \ No newline at end of file +theme: jekyll-theme-hacker \ No newline at end of file From 244f594bc4a81ec4b3e5fc31cd31312f5ec715b6 Mon Sep 17 00:00:00 2001 From: flerovious <85042815+flerovious@users.noreply.github.com> Date: Fri, 1 Oct 2021 18:08:15 +0800 Subject: [PATCH 36/40] Set theme jekyll-theme-cayman --- docs/_config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_config.yml b/docs/_config.yml index fc24e7a62..c4192631f 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -1 +1 @@ -theme: jekyll-theme-hacker \ No newline at end of file +theme: jekyll-theme-cayman \ No newline at end of file From d326977305c030083b5a1d6e7390813ae9afc8d3 Mon Sep 17 00:00:00 2001 From: flerovious <85042815+flerovious@users.noreply.github.com> Date: Fri, 1 Oct 2021 18:10:29 +0800 Subject: [PATCH 37/40] Set theme jekyll-theme-minimal --- docs/_config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_config.yml b/docs/_config.yml index c4192631f..2f7efbeab 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -1 +1 @@ -theme: jekyll-theme-cayman \ No newline at end of file +theme: jekyll-theme-minimal \ No newline at end of file From a06710449e0087307ceac539c935f821ddc291c0 Mon Sep 17 00:00:00 2001 From: flerovious <85042815+flerovious@users.noreply.github.com> Date: Fri, 1 Oct 2021 18:43:52 +0800 Subject: [PATCH 38/40] Fix table rendering --- docs/README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/README.md b/docs/README.md index 0c257e43e..8d22f674c 100644 --- a/docs/README.md +++ b/docs/README.md @@ -131,11 +131,11 @@ All changes to Tasks in the task list are automatically saved to `data/duke.txt` | Action | Format & Examples | | :--- | :--- | | **Help** | `help` | -| **Todo** | `todo <TASK_TITLE>`<br/>ex: `todo Prepare for CG2027 finals` | -| **Deadline** | `deadline <TASK_TITLE> /by <DATE in yyyy-mm-dd format>`<br/>ex: `deadline CS2113T weekly quiz /by 2021-10-01` | -| **Event** | `event <TASK_TITLE> /at <DATE in yyyy-mm-dd format>`<br/>ex: `event CG2027 finals /at 2021-10-02` | +| **Todo** | `todo <TASK_TITLE>`<br>ex: `todo Prepare for CG2027 finals` | +| **Deadline** | `deadline <TASK_TITLE> /by <DATE in yyyy-mm-dd format>`<br>ex: `deadline CS2113T weekly quiz /by 2021-10-01` | +| **Event** | `event <TASK_TITLE> /at <DATE in yyyy-mm-dd format>`<br>ex: `event CG2027 finals /at 2021-10-02` | | **List** | `list` | -| **Done** | `done <TASK_NO>`<br/>ex: `done 1` | -| **Find** | `find <KEYWORD>`<br/>ex: `find finals` | -| **Delete** | `delete <TASK_NO>`<br/>ex: `delete 1` | +| **Done** | `done <TASK_NO>`<br>ex: `done 1` | +| **Find** | `find <KEYWORD>`<br>ex: `find finals` | +| **Delete** | `delete <TASK_NO>`<br>ex: `delete 1` | | **Exit** | `bye` | \ No newline at end of file From dc9254430ebc1a83a6f24c117ce99da6b69bd2b2 Mon Sep 17 00:00:00 2001 From: flerovious <85042815+flerovious@users.noreply.github.com> Date: Fri, 1 Oct 2021 18:49:33 +0800 Subject: [PATCH 39/40] Fix table rendering --- docs/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/README.md b/docs/README.md index 8d22f674c..c9440b95e 100644 --- a/docs/README.md +++ b/docs/README.md @@ -128,6 +128,7 @@ Expected outcome: \ All changes to Tasks in the task list are automatically saved to `data/duke.txt` relative to `ip.jar` whenever the tasks list is modified ## Command Summary + | Action | Format & Examples | | :--- | :--- | | **Help** | `help` | From 97b015f5891c3e1e8b9ff6a22c5c297f0fa300b6 Mon Sep 17 00:00:00 2001 From: flerovious <85042815+flerovious@users.noreply.github.com> Date: Fri, 1 Oct 2021 18:50:49 +0800 Subject: [PATCH 40/40] Set theme jekyll-theme-cayman --- docs/_config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_config.yml b/docs/_config.yml index 2f7efbeab..c4192631f 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -1 +1 @@ -theme: jekyll-theme-minimal \ No newline at end of file +theme: jekyll-theme-cayman \ No newline at end of file