package Ġcom . ne it ex Ċ Ċ import Ġjava . time . DayOfWeek Ċ Ċ data Ġclass ĠCredentials ( val Ġcsrf Token : ĠString , Ġval Ġsession ID : ĠString ) Ċ Ċ enum Ġclass ĠSch ools ByUser Type Ġ{ ĠP ARENT , ĠP U PI L , ĠTE AC HER , ĠADMIN ISTR ATION Ġ} Ċ Ċ data Ġclass ĠName ( val ĠfirstName : ĠString , Ġval Ġmiddle Name : ĠString ?, Ġval ĠlastName : ĠString ) Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġfrom String ( input : ĠString ): ĠName ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsplit Ġ= Ġinput . split (' Ġ') ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( split . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 2 Ġ-> ĠName ( split [ 1 ], Ġnull , Ġsplit [ 0 ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 3 Ġ-> ĠName ( split [ 1 ], Ġsplit [ 2 ], Ġsplit [ 0 ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ open Ġclass ĠUser ( val Ġid : ĠInt , Ġval Ġtype : ĠSch ools ByUser Type , Ġval Ġname : ĠName ) Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( other Ġis ĠUser ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( other . id Ġ== Ġthis . id ) Ġ&& Ġ( other . name Ġ== Ġthis . name ) Ġ&& Ġ( other . type Ġ== Ġthis . type ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġsuper . equals ( other ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġresult Ġ= Ġid ĊĠĠĠĠĠĠĠ Ġresult Ġ= Ġ 3 1 Ġ* Ġresult Ġ+ Ġtype . hashCode () ĊĠĠĠĠĠĠĠ Ġresult Ġ= Ġ 3 1 Ġ* Ġresult Ġ+ Ġname . hashCode () ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} Ċ } Ċ Ċ data Ġclass ĠSchool Class ( val Ġid : ĠInt , Ġval Ġclass Teacher ID : ĠInt , Ġval Ġclass Title : ĠString ) Ċ Ċ class ĠP up il ( id : ĠInt , Ġname : ĠName , Ġval Ġclass ID : ĠInt ) Ġ: ĠUser ( id , ĠSch ools ByUser Type . PU PI L , Ġname ) Ċ Ċ data Ġclass ĠTime Constraints ( val Ġstart Hour : ĠShort , Ġval Ġstart Minute : ĠShort , Ġval Ġend Hour : ĠShort , Ġval Ġend Minute : ĠShort ) Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġfrom String ( input : ĠString ): ĠTime Constraints ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠstartTime Ġ= Ġinput . substring Before (" ĠâĢĵ Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( startTime Ġ== Ġinput ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠendTime Ġ= Ġinput . substring After (" ĠâĢĵ Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstart Hour Ġ= ĠstartTime . substring Before (': '). to Short () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstart Minute Ġ= ĠstartTime . substring After (': '). to Short () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġend Hour Ġ= ĠendTime . substring Before (': '). to Short () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġend Minute Ġ= ĠendTime . substring After (': '). to Short () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTime Constraints ( start Hour , Ġstart Minute , Ġend Hour , Ġend Minute ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠNumber FormatException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ data Ġclass ĠLess on ( ĊĠĠĠ Ġval Ġplace : ĠShort , ĊĠĠĠ Ġval Ġtime Constraints : ĠTime Constraints , ĊĠĠĠ Ġval Ġtitle : ĠString , ĊĠĠĠ Ġval Ġclass ID : ĠInt , ĊĠĠĠ Ġval Ġteacher ID : ĠArray < Int > ?, ĊĠĠĠ Ġval Ġjournal ID : ĠInt ? Ċ ) Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this Ġ=== Ġother ) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġif Ġ( java Class Ġ!= Ġother ?. java Class ) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġother Ġas ĠLess on ĊĊĠĠĠĠĠĠĠ Ġif Ġ( place Ġ!= Ġother . place ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( time Constraints Ġ!= Ġother . time Constraints ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( title Ġ!= Ġother . title ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( class ID Ġ!= Ġother . class ID ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( teacher ID Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( other . teacher ID Ġ== Ġnull ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! teacher ID . content Equals ( other . teacher ID )) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( other . teacher ID Ġ!= Ġnull ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( journal ID Ġ!= Ġother . journal ID ) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġresult Ġ= Ġplace . toInt () ĊĠĠĠĠĠĠĠ Ġresult Ġ= Ġ 3 1 Ġ* Ġresult Ġ+ Ġtime Constraints . hashCode () ĊĠĠĠĠĠĠĠ Ġresult Ġ= Ġ 3 1 Ġ* Ġresult Ġ+ Ġtitle . hashCode () ĊĠĠĠĠĠĠĠ Ġresult Ġ= Ġ 3 1 Ġ* Ġresult Ġ+ Ġclass ID ĊĠĠĠĠĠĠĠ Ġresult Ġ= Ġ 3 1 Ġ* Ġresult Ġ+ Ġ( teacher ID ?. content HashCode () Ġ?: Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġresult Ġ= Ġ 3 1 Ġ* Ġresult Ġ+ Ġ( journal ID Ġ?: Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠTime table Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġless ons : ĠMap < DayOfWeek , ĠArray < Lesson >> ĊĊĠĠĠ Ġconstructor ( lessons Map : ĠMap < DayOfWeek , ĠArray < Lesson >>) Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( lessons Map . keys . contains All ( kotlin . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġset Ġ= Ġmutable Set Of < DayOfWeek >() ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDay OfWeek . values (). filter Ġ{ Ġit Ġ!= ĠDay OfWeek . S UND AY Ġ}. to Collection ( set ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ run Ġset ĊĠĠĠĠĠĠĠ Ġ})) ĊĠĠĠĠĠĠĠ Ġless ons Ġ= Ġless ons Map ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġmon day : ĠArray < Lesson > Ġ= ĠarrayOf (), ĊĠĠĠĠĠĠĠ Ġt uesday : ĠArray < Lesson > Ġ= ĠarrayOf (), ĊĠĠĠĠĠĠĠ Ġw ed nesday : ĠArray < Lesson > Ġ= ĠarrayOf (), ĊĠĠĠĠĠĠĠ Ġth ursday : ĠArray < Lesson > Ġ= ĠarrayOf (), ĊĠĠĠĠĠĠĠ Ġf riday : ĠArray < Lesson > Ġ= ĠarrayOf (), ĊĠĠĠĠĠĠĠ Ġs aturday : ĠArray < Lesson > Ġ= ĠarrayOf () ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġless ons Ġ= Ġkotlin . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmap Ġ= Ġmutable Map Of < DayOfWeek , ĠArray < Lesson >>() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap [ DayOfWeek . MON DAY ] Ġ= Ġmon day ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap [ DayOfWeek . T UES DAY ] Ġ= Ġt uesday ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap [ DayOfWeek . W ED N ES DAY ] Ġ= Ġw ed nesday ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap [ DayOfWeek . TH UR SD AY ] Ġ= Ġth ursday ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap [ DayOfWeek . FR ID AY ] Ġ= Ġf riday ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap [ DayOfWeek . S ATUR DAY ] Ġ= Ġs aturday ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap . toMap () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġget ( day : ĠDay OfWeek ): ĠArray < Lesson > Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( day Ġ!= ĠDay OfWeek . S UND AY ) ĊĠĠĠĠĠĠĠ Ġreturn Ġless ons [ day ] !! ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġset ( day : ĠDay OfWeek , Ġvalue : ĠArray < Lesson >) Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( day Ġ!= ĠDay OfWeek . S UND AY ) ĊĠĠĠĠĠĠĠ Ġless ons Ġ= Ġless ons . minus ( day ). plus ( Pair ( day , Ġvalue )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġmon day : ĠArray < Lesson > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġless ons [ DayOfWeek . MON DAY ] !! ĊĠĠĠ Ġval Ġt uesday : ĠArray < Lesson > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġless ons [ DayOfWeek . T UES DAY ] !! ĊĠĠĠ Ġval Ġw ed nesday : ĠArray < Lesson > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġless ons [ DayOfWeek . W ED N ES DAY ] !! ĊĠĠĠ Ġval Ġth ursday : ĠArray < Lesson > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġless ons [ DayOfWeek . TH UR SD AY ] !! ĊĠĠĠ Ġval Ġf riday : ĠArray < Lesson > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġless ons [ DayOfWeek . FR ID AY ] !! ĊĠĠĠ Ġval Ġs aturday : ĠArray < Lesson > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġless ons [ DayOfWeek . S ATUR DAY ] !! Ċ } Ċ Ċ class ĠTwo Sh ifts Time table Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġless ons : ĠMap < DayOfWeek , ĠPair < Array < Lesson >, ĠArray < Lesson >>> ĊĊĠĠĠ Ġconstructor ( lessons Map : ĠMap < DayOfWeek , ĠPair < Array < Lesson >, ĠArray < Lesson >> >) Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( lessons Map . keys . contains All ( kotlin . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġset Ġ= Ġmutable Set Of < DayOfWeek >() ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDay OfWeek . values (). filter Ġ{ Ġit Ġ!= ĠDay OfWeek . S UND AY Ġ}. to Collection ( set ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ run Ġset ĊĠĠĠĠĠĠĠ Ġ})) ĊĠĠĠĠĠĠĠ Ġless ons Ġ= Ġless ons Map ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġmon day : ĠPair < Array < Lesson >, ĠArray < Lesson >> Ġ= ĠPair ( array Of (), ĠarrayOf ()), ĊĠĠĠĠĠĠĠ Ġt uesday : ĠPair < Array < Lesson >, ĠArray < Lesson >> Ġ= ĠPair ( array Of (), ĠarrayOf ()), ĊĠĠĠĠĠĠĠ Ġw ed nesday : ĠPair < Array < Lesson >, ĠArray < Lesson >> Ġ= ĠPair ( array Of (), ĠarrayOf ()), ĊĠĠĠĠĠĠĠ Ġth ursday : ĠPair < Array < Lesson >, ĠArray < Lesson >> Ġ= ĠPair ( array Of (), ĠarrayOf ()), ĊĠĠĠĠĠĠĠ Ġf riday : ĠPair < Array < Lesson >, ĠArray < Lesson >> Ġ= ĠPair ( array Of (), ĠarrayOf ()), ĊĠĠĠĠĠĠĠ Ġs aturday : ĠPair < Array < Lesson >, ĠArray < Lesson >> Ġ= ĠPair ( array Of (), ĠarrayOf ()) ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġless ons Ġ= Ġkotlin . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmap Ġ= Ġmutable Map Of < DayOfWeek , ĠPair < Array < Lesson >, ĠArray < Lesson >> >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap [ DayOfWeek . MON DAY ] Ġ= Ġmon day ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap [ DayOfWeek . T UES DAY ] Ġ= Ġt uesday ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap [ DayOfWeek . W ED N ES DAY ] Ġ= Ġw ed nesday ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap [ DayOfWeek . TH UR SD AY ] Ġ= Ġth ursday ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap [ DayOfWeek . FR ID AY ] Ġ= Ġf riday ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap [ DayOfWeek . S ATUR DAY ] Ġ= Ġs aturday ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap . toMap () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġget ( day : ĠDay OfWeek ): ĠPair < Array < Lesson >, ĠArray < Lesson >> Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( day Ġ!= ĠDay OfWeek . S UND AY ) ĊĠĠĠĠĠĠĠ Ġreturn Ġless ons [ day ] !! ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġset ( day : ĠDay OfWeek , Ġvalue : ĠPair < Array < Lesson >, ĠArray < Lesson >>) Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( day Ġ!= ĠDay OfWeek . S UND AY ) ĊĠĠĠĠĠĠĠ Ġless ons Ġ= Ġless ons . minus ( day ). plus ( Pair ( day , Ġvalue )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġmon day : ĠPair < Array < Lesson >, ĠArray < Lesson >> ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġless ons [ DayOfWeek . MON DAY ] !! ĊĠĠĠ Ġval Ġt uesday : ĠPair < Array < Lesson >, ĠArray < Lesson >> ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġless ons [ DayOfWeek . T UES DAY ] !! ĊĠĠĠ Ġval Ġw ed nesday : ĠPair < Array < Lesson >, ĠArray < Lesson >> ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġless ons [ DayOfWeek . W ED N ES DAY ] !! ĊĠĠĠ Ġval Ġth ursday : ĠPair < Array < Lesson >, ĠArray < Lesson >> ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġless ons [ DayOfWeek . TH UR SD AY ] !! ĊĠĠĠ Ġval Ġf riday : ĠPair < Array < Lesson >, ĠArray < Lesson >> ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġless ons [ DayOfWeek . FR ID AY ] !! ĊĠĠĠ Ġval Ġs aturday : ĠPair < Array < Lesson >, ĠArray < Lesson >> ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġless ons [ DayOfWeek . S ATUR DAY ] !! Ċ } Ċ