/* Ċ Ġ* ĠCopyright Ġ 2 0 2 0 ĠGoogle ĠLLC . Ċ Ġ* Ċ Ġ* ĠThis Ġcode Ġmay Ġonly Ġbe Ġused Ġunder Ġthe ĠBSD Ġstyle Ġlicense Ġfound Ġat Ċ Ġ* Ġhttp :// polymer . github . io / LICENSE . txt Ċ Ġ* Ċ Ġ* ĠCode Ġdistributed Ġby ĠGoogle Ġas Ġpart Ġof Ġthis Ġproject Ġis Ġalso Ġsubject Ġto Ġan Ġadditional ĠIP Ġrights Ċ Ġ* Ġgrant Ġfound Ġat Ċ Ġ* Ġhttp :// polymer . github . io / PAT ENTS . txt Ċ Ġ*/ Ċ package Ġar cs . core . host Ċ Ċ import Ġar cs . core . common . to Arc Id Ċ import Ġar cs . core . data . Annotation Ċ import Ġar cs . core . data . Capabilities Ċ import Ġar cs . core . data . Capability . T tl Ċ import Ġar cs . core . data . Collection Type Ċ import Ġar cs . core . data . EntityType Ċ import Ġar cs . core . data . Plan Ċ import Ġar cs . core . data . Schema Ċ import Ġar cs . core . data . Schema Serializer Ċ import Ġar cs . core . data . Singleton Type Ċ import Ġar cs . core . data . expression . deserialize Expression Ċ import Ġar cs . core . data . expression . serialize Ċ import Ġar cs . core . data . to Schema Ċ import Ġar cs . core . entity . Reference Ċ import Ġar cs . core . host . api . Particle Ċ import Ġar cs . core . host . generated . Abstract Arc Host Context Particle Ċ import Ġar cs . core . host . generated . Arc Host Context Plan Ċ import Ġar cs . core . storage . Capabilities Resolver Ċ import Ġar cs . core . storage . Storage Key Manager Ċ import Ġar cs . core . type . Tag Ċ import Ġar cs . core . type . Type Ċ import Ġar cs . core . util . plus Ċ import Ġar cs . core . util . traverse Ċ import Ġkotlin . coroutines . Coroutine Context Ċ import Ġkotlinx . coroutines . Job Ċ import Ġkotlinx . coroutines . join All Ċ import Ġkotlinx . coroutines . with Context Ċ Ċ type alias ĠArc Host Context Particle _ Handle Connections Ġ= ĠAbstract Arc Host Context Particle . Handle Connection Ċ type alias ĠArc Host Context Particle _ Particles Ġ= ĠAbstract Arc Host Context Particle . Particle Schema Ċ type alias ĠArc Host Context Particle _ Plan Handle Ġ= ĠAbstract Arc Host Context Particle . Plan Handle Ċ Ċ /** Ċ Ġ* ĠAn Ġimplicit Ġ[ Particle ] Ġthat Ġlives Ġwithin Ġthe Ġ[ Arc Host ] Ġand Ġused Ġas Ġa Ġutility Ġclass Ġto Ċ Ġ* Ġserialize / deserialize Ġ[ Arc Host Context ] Ġinformation Ġfrom Ġ[ Plan . Handle ] s . ĠIt Ġdoes Ġnot Ġlive Ġin Ġan Ċ Ġ* ĠArc Ġor Ġparticip ate Ġin Ġnormal Ġ[ Particle ] Ġlifecycle . Ċ Ġ*/ Ċ class ĠArc Host Context Particle ( ĊĠ Ġprivate Ġval Ġhost Id : ĠString , ĊĠ Ġprivate Ġval Ġhandle Manager : ĠHandle Manager , ĊĠ Ġprivate Ġval Ġstorage Key Manager : ĠStorage Key Manager , ĊĠ Ġprivate Ġval Ġserializer : ĠSchema Serializer < String > Ċ ) Ġ: ĠAbstract Arc Host Context Particle () Ġ{ ĊĠ Ġ/** ĊĠĠ Ġ* ĠGiven Ġan Ġ[ Arc Host Context ], Ġconvert Ġthese Ġtypes Ġto ĠArc ĠSchema Ġtypes , Ġand Ġwrite Ġthem Ġto Ġthe ĊĠĠ Ġ* Ġappropriate Ġhandles . ĠSee Ġ` Arc Host Context . arcs ` Ġfor Ġschema Ġdefinitions . ĊĠĠ Ġ*/ ĊĠ Ġsuspend Ġfun Ġwrite Arc Host Context ( ĊĠĠĠ Ġcontext : Ġar cs . core . host . Arc Host Context ĊĠ Ġ) Ġ= Ġon Handles Ready Ġ{ ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠ Ġhandles . plan Handles . clear () ĊĠĠĠĠĠ Ġval Ġconnections Ġ= Ġcontext . particles . flatMap Ġ{ ĊĠĠĠĠĠĠĠ Ġit . plan Particle . handles . map Ġ{ Ġ( handle Name , Ġhandle ) Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġval Ġplan Handle Ġ= ĠArc Host Context Particle _ Plan Handle ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstorage Key Ġ= Ġhandle . handle . storage Key . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġhandle . handle . type . tag . name , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġschema Ġ= Ġserializer . serialize ( handle . handle . type . to Schema ()) ĊĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠ Ġ// ĠWrite ĠPlan . Handle ĊĠĠĠĠĠĠĠĠĠ Ġhandles . plan Handles . store ( plan Handle ). join () ĊĠĠĠĠĠĠĠĠĠ ĠArc Host Context Particle _ Handle Connections ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconnection Name Ġ= Ġhandle Name , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplan Handle Ġ= Ġhandles . plan Handles . create Reference ( plan Handle ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstorage Key Ġ= Ġhandle . storage Key . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmode Ġ= Ġhandle . mode . name , Ġtype Ġ= Ġhandle . type . tag . name , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġttl Ġ= Ġhandle . ttl . minutes . toDouble (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpression Ġ= Ġhandle . expression ?. serialize () Ġ?: Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġschema Ġ= Ġserializer . serialize ( handle . type . to Schema ()) ĊĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ// ĠWrite ĠPlan . Handle Connection ĊĠĠĠĠĠ Ġhandles . handle Connections . clear () ĊĠĠĠĠĠ Ġconnections . map Ġ{ Ġhandles . handle Connections . store ( it ) Ġ}. join All () ĊĊĠĠĠĠĠ Ġval Ġparticles Ġ= Ġcontext . particles . map Ġ{ ĊĠĠĠĠĠĠĠ ĠArc Host Context Particle _ Particles ( ĊĠĠĠĠĠĠĠĠĠ Ġparticle Name Ġ= Ġit . plan Particle . particle Name , ĊĠĠĠĠĠĠĠĠĠ Ġlocation Ġ= Ġit . plan Particle . location , ĊĠĠĠĠĠĠĠĠĠ Ġparticle State Ġ= Ġit . particle State . toString (), ĊĠĠĠĠĠĠĠĠĠ Ġconsecutive Failures Ġ= Ġit . con secutive Failure Count . toDouble (), ĊĠĠĠĠĠĠĠĠĠ Ġhandles Ġ= Ġconnections . map Ġ{ Ġconnection Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandles . handle Connections . create Reference ( connection ) ĊĠĠĠĠĠĠĠĠĠ Ġ}. toSet () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġ// ĠWrite ĠPlan . Particle Ġ+ ĠParticle Context ĊĠĠĠĠĠ Ġhandles . particles . clear () ĊĠĠĠĠĠ Ġparticles . map Ġ{ Ġhandles . particles . store ( it ) Ġ}. join All () ĊĊĠĠĠĠĠ Ġval Ġarc Host Context Ġ= ĠAbstract Arc Host Context Particle . Arc Host Context ( ĊĠĠĠĠĠĠĠ Ġarc Id Ġ= Ġcontext . arc Id , Ġhost Id Ġ= Ġhost Id , Ġarc State Ġ= Ġcontext . arc State . toString (), ĊĠĠĠĠĠĠĠ Ġparticles Ġ= Ġparticles . map Ġ{ Ġhandles . particles . create Reference ( it ) Ġ}. toSet () ĊĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠ Ġhandles . arc Host Context . clear () ĊĠĠĠĠĠ Ġhandles . arc Host Context . store ( arc Host Context ). join () ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠ Ġ// ĠTODO : Ġretry ? ĊĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Unable Ġto Ġserialize Ġ${ context . arc Id } Ġfor Ġ$ host Id ", Ġe ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠReads Ġ[ Arc Host Context ] Ġfrom Ġserialized Ġrepresentation Ġas ĠArc s ĠSchema Ġtypes . ĠSee ĊĠĠ Ġ* Ġ` Arc Host Context . arcs ' Ġfor ĠSchema Ġdefinitions . ĠNOTE : ĠThis Ġis Ġmore Ġcomplex Ġthan Ġit Ġneeds ĊĠĠ Ġ* Ġto Ġbe Ġbecause Ġreferences Ġare Ġnot Ġsupported Ġyet Ġin Ġschema 2 kotlin , Ġand Ġso Ġthis Ġinformation ĊĠĠ Ġ* Ġis Ġstored Ġin Ġde - normalized Ġformat . ĊĠĠ Ġ*/ ĊĠ Ġsuspend Ġfun Ġread Arc Host Context ( ĊĠĠĠ Ġarc Host Context : Ġar cs . core . host . Arc Host Context ĊĠ Ġ): Ġar cs . core . host . Arc Host Context ? Ġ= Ġon Handles Ready Ġ{ ĊĠĠĠ Ġval Ġarc Id Ġ= Ġarc Host Context . arc Id ĊĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠ Ġ// ĠTODO ( c rom w elli an ): Ġreplace Ġwith Ġ. query ( arc Id , Ġhost Id ) Ġwhen Ġquery Handles Ġare Ġefficient ĊĠĠĠĠĠ Ġval Ġarc State Entity Ġ= Ġhandles . arc Host Context . fetch () ĊĠĠĠĠĠĠĠ Ġ?: Ġreturn @ on Handles Ready Ġnull ĊĠĠĠĠĠ Ġval Ġparticles Ġ= Ġarc State Entity . particles . map Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire NotNull ( it . dere ference ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġ" Invalid Ġparticle Ġreference Ġwhen Ġde serial ising Ġarc Ġ$ arc Id Ġfor Ġhost Ġ$ host Id " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ}. map Ġ{ Ġparticle Entity Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġhandles Map Ġ= Ġcreate Handles Map ( ĊĠĠĠĠĠĠĠĠĠ Ġarc Id , ĊĠĠĠĠĠĠĠĠĠ Ġparticle Entity . particle Name , ĊĠĠĠĠĠĠĠĠĠ Ġparticle Entity . handles ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ ĠParticle Context ( ĊĠĠĠĠĠĠĠĠĠ ĠPlan . Particle ( particle Entity . particle Name , Ġparticle Entity . location , Ġhandles Map ), ĊĠĠĠĠĠĠĠĠĠ ĠParticle State . fromString ( particle Entity . particle State ), ĊĠĠĠĠĠĠĠĠĠ Ġparticle Entity . con secutive Failures . toInt () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġreturn @ on Handles Ready ĠArc Host Context ( ĊĠĠĠĠĠĠĠ Ġarc Id , ĊĠĠĠĠĠĠĠ Ġparticles . to Mutable List (), ĊĠĠĠĠĠĠĠ Ġinitial Arc State Ġ= ĠArc State . fromString ( arc State Entity . arc State ) ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Unable Ġto Ġdeserialize Ġ$ arc Id Ġfor Ġ$ host Id ", Ġe ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġsuspend Ġinline Ġfun Ġ< T > Ġon Handles Ready ( ĊĠĠĠ Ġcoroutine Context : ĠCor outine Context Ġ= Ġhandles . dispatcher , ĊĠĠĠ Ġcross inline Ġblock : Ġsuspend Ġ() Ġ-> ĠT ĊĠ Ġ): ĠT Ġ{ ĊĠĠĠ Ġval Ġon Ready Jobs Ġ= Ġmap Of ( ĊĠĠĠĠĠ Ġ" particles " Ġto ĠJob (), ĊĠĠĠĠĠ Ġ" arc Host Context " Ġto ĠJob (), ĊĠĠĠĠĠ Ġ" handle Connections " Ġto ĠJob (), ĊĠĠĠĠĠ Ġ" plan Handles " Ġto ĠJob () ĊĠĠĠ Ġ) ĊĠĠĠ Ġhandles . particles . on Ready Ġ{ Ġon Ready Jobs [" particles "] ?. complete () Ġ} ĊĠĠĠ Ġhandles . arc Host Context . on Ready Ġ{ Ġon Ready Jobs [" arc Host Context "] ?. complete () Ġ} ĊĠĠĠ Ġhandles . handle Connections . on Ready Ġ{ Ġon Ready Jobs [" handle Connections "] ?. complete () Ġ} ĊĠĠĠ Ġhandles . plan Handles . on Ready Ġ{ Ġon Ready Jobs [" plan Handles "] ?. complete () Ġ} ĊĠĠĠ Ġon Ready Jobs . values . join All () ĊĠĠĠ Ġreturn Ġwith Context ( coroutine Context ) Ġ{ Ġblock () Ġ} ĊĠ Ġ} ĊĊĠ Ġsuspend Ġfun Ġclose () Ġ{ Ġhandle Manager . close () Ġ} ĊĊĠ Ġprivate Ġsuspend Ġfun Ġcreate Handles Map ( ĊĠĠĠ Ġarc Id : ĠString , ĊĠĠĠ Ġparticle Name : ĠString , ĊĠĠĠ Ġhandles : ĠSet < Reference < Arc Host Context Particle _ Handle Connections >> ĊĠ Ġ) Ġ= Ġhandles . map Ġ{ Ġhandle Ġ-> ĊĠĠĠ Ġrequire NotNull ( handle . dere ference ()) Ġ{ ĊĠĠĠĠĠ Ġ" Handle Connection Ġcouldn 't Ġbe Ġdere fer enced Ġfor Ġarc Id Ġ$ arc Id , Ġparticle Ġ$ particle Name " ĊĠĠĠ Ġ} ĊĠ Ġ}. map Ġ{ Ġhandle Ġ-> ĊĠĠĠ Ġval Ġplan Handle Ġ= Ġrequire NotNull ( require NotNull ( handle . plan Handle ). dere ference ()) Ġ{ ĊĠĠĠĠĠ Ġ" Plan Handle Ġcouldn 't Ġbe Ġdere fer enced Ġfor Ġarc Id Ġ$ arc Id , Ġparticle Ġ$ handle . connection Name " ĊĠĠĠ Ġ} ĊĠĠĠ Ġhandle . connection Name Ġto ĠPlan . Handle Connection ( ĊĠĠĠĠĠ ĠPlan . Handle ( ĊĠĠĠĠĠĠĠ Ġstorage Key Manager . parse ( plan Handle . storage Key ), ĊĠĠĠĠĠĠĠ Ġfrom Tag ( arc Id , Ġserializer . deserialize ( plan Handle . schema ), Ġplan Handle . type ), ĊĠĠĠĠĠĠĠ Ġempty List () ĊĠĠĠĠĠ Ġ), ĊĠĠĠĠĠ ĠHandle Mode . valueOf ( handle . mode ), ĊĠĠĠĠĠ Ġfrom Tag ( arc Id , Ġserializer . deserialize ( handle . schema ), Ġhandle . type ), ĊĠĠĠĠĠ Ġif Ġ( handle . ttl Ġ!= ĠT tl . TTL _ INF IN ITE . toDouble ()) Ġ{ ĊĠĠĠĠĠĠĠ ĠlistOf ( Annotation . create T tl ("$ handle . ttl Ġminutes ")) ĊĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġempty List () ĊĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠ Ġhandle . expression . if Empty Ġ{ Ġnull Ġ} ?. let Ġ{ Ġit . deserialize Expression () Ġ} ĊĠĠĠ Ġ) ĊĠ Ġ}. toSet (). associate By ({ Ġit . first Ġ}, Ġ{ Ġit . second Ġ}) ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠUsing Ġinstantiated Ġparticle Ġto Ġobtain Ġ[ Schema ] Ġobjects Ġthrough Ġtheir ĊĠĠ Ġ* Ġassociated Ġ[ Entity Spec ], Ġreconstruct Ġan Ġassociated Ġ[ Type ] Ġobject . ĊĠĠ Ġ*/ ĊĠ Ġfun Ġfrom Tag ( arc Id : ĠString , Ġschema : ĠSchema , Ġtag : ĠString ): ĠType Ġ{ ĊĠĠĠ Ġreturn Ġwhen Ġ( Tag . valueOf ( tag )) Ġ{ ĊĠĠĠĠĠ ĠTag . Singleton Ġ-> ĠSingleton Type ( EntityType ( schema )) ĊĠĠĠĠĠ ĠTag . Collection Ġ-> ĠCollection Type ( EntityType ( schema )) ĊĠĠĠĠĠ ĠTag . Entity Ġ-> ĠEntityType ( schema ) ĊĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException ( ĊĠĠĠĠĠĠĠ Ġ" Illegal ĠTag Ġ$ tag Ġwhen Ġde serializing ĠArc Host Context Ġwith ĠArc Id Ġ'$ arc Id '" ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠWhen Ġrecipe 2 plan Ġis Ġfinished , Ġthe Ġ' Plan ' Ġto Ġserialize / deserialize ĠArc Host Ġinformation ĊĠĠ Ġ* Ġwill Ġbe Ġcode - gen ned , Ġand Ġthis Ġmethod Ġwill Ġmostly Ġgo Ġaway , Ġin Ġcombination Ġwith ĊĠĠ Ġ* Ġthe Ġmove Ġaway Ġfrom Ġden ormal ized Ġschemas Ġto Ġschema Ġdefinitions Ġusing Ġreferences . ĊĠĠ Ġ*/ ĊĠ Ġfun Ġcreate Arc Host Context Persistence Plan ( ĊĠĠĠ Ġcapability : ĠCap abilities , ĊĠĠĠ Ġarc Id : ĠString ĊĠ Ġ): ĠPlan . Partition Ġ{ ĊĠĠĠ Ġval Ġresolver Ġ= ĠCap abilities Resolver ( ĊĠĠĠĠĠ ĠCap abilities Resolver . Options ( arc Id . to Arc Id ()) ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ/* ĊĠĠĠĠ Ġ* ĠBecause Ġquery () Ġisn 't Ġefficient Ġyet , Ġwe Ġdon 't Ġstore Ġall Ġserial izations Ġunder Ġa ĊĠĠĠĠ Ġ* Ġsingle Ġkey Ġin Ġthe Ġrecipe , Ġbut Ġper - arc Id . ĊĠĠĠĠ Ġ* ĠTODO : Ġonce Ġefficient Ġqueries Ġexist , Ġremove Ġand Ġuse Ġrecipe 2 plan Ġkey ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġarc Host Context Key Ġ= Ġresolver . create Storage Key ( ĊĠĠĠĠĠ Ġcapability , ĠEntityType ( Abstract Arc Host Context Particle . Arc Host Context . SCHEMA ), ĊĠĠĠĠĠ Ġ"${ host Id }_ arc State " ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġval Ġparticles Key Ġ= Ġresolver . create Storage Key ( ĊĠĠĠĠĠ Ġcapability , ĠEntityType ( Arc Host Context Particle _ Particles . SCHEMA ), ĊĠĠĠĠĠ Ġ"${ host Id }_ arc State _ particles " ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġval Ġhandle Connections Key Ġ= Ġresolver . create Storage Key ( ĊĠĠĠĠĠ Ġcapability , ĠEntityType ( Arc Host Context Particle _ Handle Connections . SCHEMA ), ĊĠĠĠĠĠ Ġ"${ host Id }_ arc State _ handle Connections " ĊĠĠĠ Ġ) ĊĠĠĠ Ġval Ġplan Handles Key Ġ= Ġresolver . create Storage Key ( ĊĠĠĠĠĠ Ġcapability , ĠEntityType ( Arc Host Context Particle _ Plan Handle . SCHEMA ), ĊĠĠĠĠĠ Ġ"${ host Id }_ arc State _ plan Handles " ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ// Ġreplace Ġkeys Ġwith Ġper - arc Ġcreated Ġones . ĊĠĠĠ Ġval Ġall Storage Key Lens Ġ= ĠPlan . Particle . handles Lens . traverse () Ġ+ ĊĠĠĠĠĠ ĠPlan . Handle Connection . handle Lens Ġ+ ĠPlan . Handle . storage Key Lens ĊĠĠĠ Ġval Ġparticle Ġ= Ġall Storage Key Lens . mod ( Arc Host Context Plan . particles . first ()) Ġ{ Ġstorage Key Ġ-> ĊĠĠĠĠĠ Ġval Ġkey String Ġ= Ġstorage Key . to Key String () ĊĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġ" arc Host Context " Ġin Ġkey String Ġ-> Ġarc Host Context Key ĊĠĠĠĠĠĠĠ Ġ" particles " Ġin Ġkey String Ġ-> Ġparticles Key ĊĠĠĠĠĠĠĠ Ġ" handle Connections " Ġin Ġkey String Ġ-> Ġhandle Connections Key ĊĠĠĠĠĠĠĠ Ġ" plan Handles " Ġin Ġkey String Ġ-> Ġplan Handles Key ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġstorage Key ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn ĠPlan . Partition ( arc Id , Ġhost Id , ĠlistOf ( particle )) ĊĠ Ġ} Ċ } Ċ