diff --git a/20230809-LS.csproj b/20230809-LS.csproj
new file mode 100644
index 0000000..7547697
--- /dev/null
+++ b/20230809-LS.csproj
@@ -0,0 +1,11 @@
+
+
+
+ Exe
+ net7.0
+ _20230809_LS
+ enable
+ enable
+
+
+
diff --git a/20230809-LS.csproj b/20230809-LS.csproj
new file mode 100644
index 0000000..7547697
--- /dev/null
+++ b/20230809-LS.csproj
@@ -0,0 +1,11 @@
+
+
+
+ Exe
+ net7.0
+ _20230809_LS
+ enable
+ enable
+
+
+
diff --git a/DinnerEvents.cs b/DinnerEvents.cs
new file mode 100644
index 0000000..e2dec30
--- /dev/null
+++ b/DinnerEvents.cs
@@ -0,0 +1,7 @@
+namespace Dinner;
+
+interface IEvent { }
+
+record DinnerPlanned(Guid DinnerId) : IEvent;
+record DinnerSeatReserved(Guid DinnerId, Guid GuestId) : IEvent;
+record DinnerHosted(Guid DinnerId, IEnumerable Reservations) : IEvent;
\ No newline at end of file
diff --git a/20230809-LS.csproj b/20230809-LS.csproj
new file mode 100644
index 0000000..7547697
--- /dev/null
+++ b/20230809-LS.csproj
@@ -0,0 +1,11 @@
+
+
+
+ Exe
+ net7.0
+ _20230809_LS
+ enable
+ enable
+
+
+
diff --git a/DinnerEvents.cs b/DinnerEvents.cs
new file mode 100644
index 0000000..e2dec30
--- /dev/null
+++ b/DinnerEvents.cs
@@ -0,0 +1,7 @@
+namespace Dinner;
+
+interface IEvent { }
+
+record DinnerPlanned(Guid DinnerId) : IEvent;
+record DinnerSeatReserved(Guid DinnerId, Guid GuestId) : IEvent;
+record DinnerHosted(Guid DinnerId, IEnumerable Reservations) : IEvent;
\ No newline at end of file
diff --git a/Program.cs b/Program.cs
new file mode 100644
index 0000000..507262d
--- /dev/null
+++ b/Program.cs
@@ -0,0 +1,83 @@
+namespace Dinner;
+
+class Dinner
+{
+ private readonly uint _availableSeats;
+ private readonly DateTime _scheduled;
+ private readonly List _reservations;
+ private readonly List _events = new();
+ private readonly Guid _dinnerId;
+
+ private Dinner(Guid dinnerId, uint availableSeats, DateTime scheduled)
+ {
+ _dinnerId = dinnerId;
+ _availableSeats = availableSeats;
+ _scheduled = scheduled;
+ _reservations = new List();
+
+ _events.Add(new DinnerPlanned(_dinnerId));
+ }
+
+ public static Dinner PlanDinner(Guid dinnerId, uint availableSeats, DateTime scheduled)
+ {
+ if (availableSeats == 0)
+ {
+ throw new InvalidOperationException("Must have at least one seat at a dinner.");
+ }
+
+ return new Dinner(dinnerId, availableSeats, scheduled);
+ }
+
+ public bool ReserveSeat(Guest guest)
+ {
+ if (_reservations.Count <= _availableSeats)
+ {
+ _reservations.Add(new Reservation(Guid.NewGuid(), guest));
+ _events.Add(new DinnerSeatReserved(_dinnerId, guest.GuestId));
+
+ return true;
+ }
+
+ return false;
+ }
+
+ public void CancelReservation(Guest guest)
+ {
+ var reservation = _reservations.SingleOrDefault(x => x.Guest.Equals(guest));
+ if (reservation == null)
+ {
+ throw new InvalidOperationException("Guest does not have a reservation.");
+ }
+
+ _reservations.Remove(reservation);
+ }
+
+ public void ConfirmReservation(Guest guest)
+ {
+ var reservation = _reservations.SingleOrDefault(x => x.Guest.Equals(guest));
+ if (reservation == null)
+ {
+ throw new InvalidOperationException("Guest does not have a reservation.");
+ }
+
+ reservation.Confirm();
+ }
+
+ public void StartDinner()
+ {
+ var confirmedReservations = _reservations.Where(x => x.IsConfirmed);
+ _events.Add(new DinnerHosted(_dinnerId, confirmedReservations));
+ }
+}
+
+record Reservation(Guid ReservationId, Guest Guest)
+{
+ public bool IsConfirmed { get; private set; }
+
+ public void Confirm()
+ {
+ IsConfirmed = true;
+ }
+}
+
+record Guest(Guid GuestId, string Name);
\ No newline at end of file