package Ġno . nav . hel se . sy k dom st ids lin je Ċ Ċ import Ġjava . time . DayOfWeek . FR ID AY Ċ import Ġjava . time . DayOfWeek . MON DAY Ċ import Ġjava . time . DayOfWeek . S ATUR DAY Ċ import Ġjava . time . DayOfWeek . S UND AY Ċ import Ġjava . time . DayOfWeek . TH UR SD AY Ċ import Ġjava . time . DayOfWeek . T UES DAY Ċ import Ġjava . time . DayOfWeek . W ED N ES DAY Ċ import Ġjava . time . LocalDate Ċ import Ġno . nav . hel se . person . Sy k dom st ids lin je Visitor Ċ import Ġno . nav . hel se . Ã¸ k onom i . Ã ĺ k onom i Ċ Ċ internal Ġtype alias ĠB este Strategy Ġ= Ġ( Dag , ĠD ag ) Ġ-> ĠD ag Ċ Ċ internal Ġsealed Ġclass ĠD ag ( ĊĠĠĠ Ġprotected Ġval Ġdat o : ĠLocalDate , ĊĠĠĠ Ġprotected Ġval Ġk ilde : ĠS yk dom st ids lin je H en del se . H en del ses k ilde Ċ ) Ġ{ ĊĠĠĠ Ġprivate Ġfun Ġname () Ġ= Ġjava Class . canonical Name . split ('. '). last () ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġinternal Ġval Ġdefault : ĠB este Strategy Ġ= Ġ{ Ġven stre : ĠD ag , Ġh Ã¸ y re : ĠD ag Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( ven stre . dat o Ġ== Ġh Ã¸ y re . dat o ) Ġ{ Ġ" St Ã¸ t ter Ġkun Ġsam men lik ning Ġav Ġd ager Ġmed Ġsam me Ġdat o " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ven stre Ġ== Ġh Ã¸ y re ) Ġven stre Ġelse ĠProblem Dag ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġh Ã¸ y re . dat o , Ġh Ã¸ y re . k ilde , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" K an Ġik ke Ġvel ge Ġmel lom Ġ${ ven stre . name ()} Ġf ra Ġ${ ven stre . k ilde } Ġog Ġ${ h Ã¸ y re . name ()} Ġf ra Ġ${ h Ã¸ y re . k ilde } ." ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġinternal Ġval Ġoverride : ĠB este Strategy Ġ= Ġ{ Ġven stre : ĠD ag , Ġh Ã¸ y re : ĠD ag Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( ven stre . dat o Ġ== Ġh Ã¸ y re . dat o ) Ġ{ Ġ" St Ã¸ t ter Ġkun Ġsam men lik ning Ġav Ġd ager Ġmed Ġsam me Ġdat o " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġh Ã¸ y re ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġinternal Ġval Ġsam men h eng ende Sy k dom : ĠB este Strategy Ġ= Ġ{ Ġven stre : ĠD ag , Ġh Ã¸ y re : ĠD ag Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( ven stre . dat o Ġ== Ġh Ã¸ y re . dat o ) Ġ{ Ġ" St Ã¸ t ter Ġkun Ġsam men lik ning Ġav Ġd ager Ġmed Ġsam me Ġdat o " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( ven stre ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠS yk ed ag , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠS yk Hel ged ag , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠAr be id sg iver dag , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠAr be id sg iver Hel ged ag Ġ-> Ġven stre ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠF er ied ag , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠPer mis j ons dag Ġ-> Ġwhen Ġ( h Ã¸ y re ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠS yk ed ag , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠS yk Hel ged ag , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠAr be id sg iver dag , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠAr be id sg iver Hel ged ag Ġ-> Ġh Ã¸ y re ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġven stre ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġh Ã¸ y re ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġinternal Ġval Ġno Overlap : ĠB este Strategy Ġ= Ġ{ Ġven stre : ĠD ag , Ġh Ã¸ y re : ĠD ag Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( ven stre . dat o Ġ== Ġh Ã¸ y re . dat o ) Ġ{ Ġ" St Ã¸ t ter Ġkun Ġsam men lik ning Ġav Ġd ager Ġmed Ġsam me Ġdat o " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠProblem Dag ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġh Ã¸ y re . dat o , Ġh Ã¸ y re . k ilde , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" St Ã¸ t ter Ġik ke Ġover l app ende Ġperiod er Ġ(${ ven stre . k ilde } Ġog Ġ${ h Ã¸ y re . k ilde })" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġinternal Ġval Ġf yll : ĠB este Strategy Ġ= Ġ{ Ġven stre : ĠD ag , Ġ_: ĠD ag Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġven stre ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġinternal Ġval Ġreplace : ĠB este Strategy Ġ= Ġ{ Ġven stre : ĠD ag , Ġh Ã¸ y re : ĠD ag Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( h Ã¸ y re Ġis ĠU kj ent Dag ) Ġven stre ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġh Ã¸ y re ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠF ord i Ġvi Ġik ke Ġhar Ġ( eller Ġt ren ger ) Ġturn ering Ġfor Ġar be id sg ivers Ã¸ kn ader Ġt ren ger Ġvi Ġen Ġstr ateg i Ġfor ĠÃ¥ ĊĠĠĠĠĠĠĠĠ Ġ* Ġs Ã¸ r ge Ġfor Ġat Ġar be id sd ager Ġv inner Ġover Ġsy ked ager ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġinternal Ġval Ġar be id sd ager V inner : ĠB este Strategy Ġ= Ġ{ Ġven stre : ĠD ag , Ġh Ã¸ y re : ĠD ag Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( ven stre . dat o Ġ== Ġh Ã¸ y re . dat o ) Ġ{ Ġ" St Ã¸ t ter Ġkun Ġsam men lik ning Ġav Ġd ager Ġmed Ġsam me Ġdat o " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( h Ã¸ y re Ġis ĠAr be id sd ag Ġ|| Ġh Ã¸ y re Ġis ĠFr isk Hel ged ag ) Ġh Ã¸ y re ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġven stre ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġkom mer F ra ( hen del se : ĠMel ding ) Ġ= Ġk ilde . er Av Type ( hen del se ) ĊĊĠĠĠ Ġinternal Ġfun Ġproblem ( other : ĠD ag ): ĠD ag Ġ= ĊĠĠĠĠĠĠĠ ĠProblem Dag ( dat o , Ġk ilde , Ġ" K an Ġik ke Ġvel ge Ġmel lom Ġ${ name ()} Ġf ra Ġ$ k ilde Ġog Ġ${ other . name ()} Ġf ra Ġ${ other . k ilde }. ") ĊĊĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?) Ġ= ĊĠĠĠĠĠĠĠ Ġother Ġ!= Ġnull Ġ&& Ġthis :: class Ġ== Ġother :: class Ġ&& Ġthis . equals ( other Ġas ĠD ag ) ĊĊĠĠĠ Ġprotected Ġopen Ġfun Ġequals ( other : ĠD ag ) Ġ= Ġthis . dat o Ġ== Ġother . dat o Ġ&& Ġthis . k ilde Ġ== Ġother . k ilde ĊĊĠĠĠ Ġoverride Ġfun ĠhashCode () Ġ= Ġdat o . hashCode () Ġ* Ġ 3 7 Ġ+ Ġk ilde . hashCode () Ġ* Ġ 4 1 Ġ+ Ġthis :: class . hashCode () ĊĊĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= Ġ"${ this :: class . java . simple Name } Ġ($ dat o ) Ġ$ k ilde " ĊĊĠĠĠ Ġinternal Ġopen Ġfun Ġaccept ( visitor : ĠS yk dom st ids lin je Visitor ) Ġ{} ĊĊĠĠĠ Ġinternal Ġclass ĠU kj ent Dag ( ĊĠĠĠĠĠĠĠ Ġdat o : ĠLocalDate , ĊĠĠĠĠĠĠĠ Ġk ilde : ĠS yk dom st ids lin je H en del se . H en del ses k ilde ĊĠĠĠ Ġ) Ġ: ĠD ag ( dat o , Ġk ilde ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġaccept ( visitor : ĠS yk dom st ids lin je Visitor ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisitor . visit Dag ( this , Ġdat o , Ġk ilde ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġclass ĠAr be id sd ag ( ĊĠĠĠĠĠĠĠ Ġdat o : ĠLocalDate , ĊĠĠĠĠĠĠĠ Ġk ilde : ĠS yk dom st ids lin je H en del se . H en del ses k ilde ĊĠĠĠ Ġ) Ġ: ĠD ag ( dat o , Ġk ilde ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġaccept ( visitor : ĠS yk dom st ids lin je Visitor ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisitor . visit Dag ( this , Ġdat o , Ġk ilde ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġclass ĠAr be id sg iver dag ( ĊĠĠĠĠĠĠĠ Ġdat o : ĠLocalDate , ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠÃ ¸ k onom i : ĠÃ ĺ k onom i , ĊĠĠĠĠĠĠĠ Ġk ilde : ĠS yk dom st ids lin je H en del se . H en del ses k ilde ĊĠĠĠ Ġ) Ġ: ĠD ag ( dat o , Ġk ilde ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġaccept ( visitor : ĠS yk dom st ids lin je Visitor ) Ġ= ĠÃ ¸ k onom i . accept ( visitor , Ġthis , Ġdat o , Ġk ilde ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġclass ĠF er ied ag ( ĊĠĠĠĠĠĠĠ Ġdat o : ĠLocalDate , ĊĠĠĠĠĠĠĠ Ġk ilde : ĠS yk dom st ids lin je H en del se . H en del ses k ilde ĊĠĠĠ Ġ) Ġ: ĠD ag ( dat o , Ġk ilde ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġaccept ( visitor : ĠS yk dom st ids lin je Visitor ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisitor . visit Dag ( this , Ġdat o , Ġk ilde ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġclass ĠFr isk Hel ged ag ( ĊĠĠĠĠĠĠĠ Ġdat o : ĠLocalDate , ĊĠĠĠĠĠĠĠ Ġk ilde : ĠS yk dom st ids lin je H en del se . H en del ses k ilde ĊĠĠĠ Ġ) Ġ: ĠD ag ( dat o , Ġk ilde ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġaccept ( visitor : ĠS yk dom st ids lin je Visitor ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisitor . visit Dag ( this , Ġdat o , Ġk ilde ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġclass ĠAr be id sg iver Hel ged ag ( ĊĠĠĠĠĠĠĠ Ġdat o : ĠLocalDate , ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠÃ ¸ k onom i : ĠÃ ĺ k onom i , ĊĠĠĠĠĠĠĠ Ġk ilde : ĠS yk dom st ids lin je H en del se . H en del ses k ilde ĊĠĠĠ Ġ) Ġ: ĠD ag ( dat o , Ġk ilde ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġaccept ( visitor : ĠS yk dom st ids lin je Visitor ) Ġ= ĠÃ ¸ k onom i . accept ( visitor , Ġthis , Ġdat o , Ġk ilde ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġclass ĠS yk ed ag ( ĊĠĠĠĠĠĠĠ Ġdat o : ĠLocalDate , ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠÃ ¸ k onom i : ĠÃ ĺ k onom i , ĊĠĠĠĠĠĠĠ Ġk ilde : ĠS yk dom st ids lin je H en del se . H en del ses k ilde ĊĠĠĠ Ġ) Ġ: ĠD ag ( dat o , Ġk ilde ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġaccept ( visitor : ĠS yk dom st ids lin je Visitor ) Ġ= ĠÃ ¸ k onom i . accept ( visitor , Ġthis , Ġdat o , Ġk ilde ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġclass ĠFore l det Sy ked ag ( ĊĠĠĠĠĠĠĠ Ġdat o : ĠLocalDate , ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠÃ ¸ k onom i : ĠÃ ĺ k onom i , ĊĠĠĠĠĠĠĠ Ġk ilde : ĠS yk dom st ids lin je H en del se . H en del ses k ilde ĊĠĠĠ Ġ) Ġ: ĠD ag ( dat o , Ġk ilde ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġaccept ( visitor : ĠS yk dom st ids lin je Visitor ) Ġ= ĠÃ ¸ k onom i . accept ( visitor , Ġthis , Ġdat o , Ġk ilde ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġclass ĠS yk Hel ged ag ( ĊĠĠĠĠĠĠĠ Ġdat o : ĠLocalDate , ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠÃ ¸ k onom i : ĠÃ ĺ k onom i , ĊĠĠĠĠĠĠĠ Ġk ilde : ĠS yk dom st ids lin je H en del se . H en del ses k ilde ĊĠĠĠ Ġ) Ġ: ĠD ag ( dat o , Ġk ilde ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġaccept ( visitor : ĠS yk dom st ids lin je Visitor ) Ġ= ĠÃ ¸ k onom i . accept ( visitor , Ġthis , Ġdat o , Ġk ilde ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġclass ĠPer mis j ons dag ( ĊĠĠĠĠĠĠĠ Ġdat o : ĠLocalDate , ĊĠĠĠĠĠĠĠ Ġk ilde : ĠS yk dom st ids lin je H en del se . H en del ses k ilde ĊĠĠĠ Ġ) Ġ: ĠD ag ( dat o , Ġk ilde ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġaccept ( visitor : ĠS yk dom st ids lin je Visitor ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisitor . visit Dag ( this , Ġdat o , Ġk ilde ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġclass ĠProblem Dag ( ĊĠĠĠĠĠĠĠ Ġdat o : ĠLocalDate , ĊĠĠĠĠĠĠĠ Ġk ilde : ĠS yk dom st ids lin je H en del se . H en del ses k ilde , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġme ld ing : ĠString ĊĠĠĠ Ġ) Ġ: ĠD ag ( dat o , Ġk ilde ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġaccept ( visitor : ĠS yk dom st ids lin je Visitor ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisitor . visit Dag ( this , Ġdat o , Ġk ilde , Ġme ld ing ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġclass ĠAv sl Ã¥ tt Dag ( ĊĠĠĠĠĠĠĠ Ġdat o : ĠLocalDate , ĊĠĠĠĠĠĠĠ Ġk ilde : ĠS yk dom st ids lin je H en del se . H en del ses k ilde ĊĠĠĠ Ġ) Ġ: ĠD ag ( dat o , Ġk ilde ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġaccept ( visitor : ĠS yk dom st ids lin je Visitor ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisitor . visit Dag ( this , Ġdat o , Ġk ilde ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġval Ġhel ged ager Ġ= ĠlistOf ( S ATUR DAY , ĠS UND AY ) Ċ internal Ġfun ĠLocalDate . er Hel g () Ġ= Ġthis . day OfWeek Ġin Ġhel ged ager Ċ Ċ // Ġant all Ġuk ed ager Ġmel lom Ġstart Ġog Ġend Inclusive , Ġik ke Ġmed reg net Ġend Inclusive Ġi Ġseg Ġse lv Ċ internal Ġfun ĠClosed Range < LocalDate >. uk ed ager (): ĠInt Ġ{ ĊĠĠĠ Ġval Ġepoch Start Ġ= Ġstart . to Epoch Day () ĊĠĠĠ Ġval Ġepoch End Ġ= Ġend Inclusive . to Epoch Day () ĊĠĠĠ Ġif Ġ( epoch Start Ġ>= Ġepoch End ) Ġreturn Ġ 0 ĊĠĠĠ Ġval Ġd ager Mel lom Ġ= Ġ( epoch End Ġ- Ġepoch Start ). toInt () ĊĠĠĠ Ġval Ġhe le Hel ger Ġ= Ġ( d ager Mel lom Ġ+ Ġstart . day OfWeek . value Ġ- Ġ 1 ) Ġ/ Ġ 7 Ġ* Ġ 2 ĊĠĠĠ Ġval Ġj uster F Ã¸ r ste Hel g Ġ= Ġif Ġ( start . day OfWeek Ġ== ĠS UND AY ) Ġ 1 Ġelse Ġ 0 ĊĠĠĠ Ġval Ġj uster S iste Hel g Ġ= Ġif Ġ( end Inclusive . day OfWeek Ġ== ĠS UND AY ) Ġ 1 Ġelse Ġ 0 ĊĠĠĠ Ġreturn Ġd ager Mel lom Ġ- Ġhe le Hel ger Ġ+ Ġj uster F Ã¸ r ste Hel g Ġ- Ġj uster S iste Hel g Ċ } Ċ Ċ internal Ġfun ĠLocalDate . er Ret t F Ã¸ r ( other : ĠLocalDate ): ĠBoolean Ġ= ĊĠĠĠ Ġthis Ġ< Ġother Ġ&& Ġwhen Ġ( this . day OfWeek ) Ġ{ ĊĠĠĠĠĠĠĠ ĠMON DAY , ĠT UES DAY , ĠW ED N ES DAY , ĠTH UR SD AY , ĠS UND AY Ġ-> Ġthis . plus Days ( 1 ) Ġ== Ġother ĊĠĠĠĠĠĠĠ ĠFR ID AY Ġ-> Ġother Ġin Ġthis . plus Days ( 1 ) .. this . plus Days ( 3 ) ĊĠĠĠĠĠĠĠ ĠS ATUR DAY Ġ-> Ġother Ġin Ġthis . plus Days ( 1 ) .. this . plus Days ( 2 ) ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfalse ĊĠĠĠ Ġ} Ċ