package Ġcom . seed company . cord tables . common Ċ Ċ import Ġcom . seed company . cord tables . components . admin . Get Secure List Query Ċ import Ġcom . seed company . cord tables . components . admin . Get Secure List Query Request Ċ import Ġcom . seed company . cord tables . components . tables . admin . users . Admin Users ListResponse Ċ import Ġorg . springframework . beans . factory . annotation . Autowired Ċ import Ġorg . springframework . dao . Empty Result Data AccessException Ċ import Ġorg . springframework . jdbc . core . Jdbc Template Ċ import Ġorg . springframework . jdbc . core . named param . Map Sql Parameter Source Ċ import Ġorg . springframework . jdbc . core . named param . Named Parameter Jdbc Template Ċ import Ġorg . springframework . jdbc . core . query For Object Ċ import Ġorg . springframework . security . crypto . argon 2 . Arg on 2 Password Encoder Ċ import Ġorg . springframework . stereotype . Component Ċ import Ġjava . sql . SQLException Ċ import Ġjava . util . regex . Pattern Ċ import Ġjavax . sql . DataSource Ċ Ċ @ Component Ċ class ĠUtility ( Ċ // ĠĠĠ Ġ@ Autowired Ċ // ĠĠĠ Ġval Ġapp Config : ĠApp Config , ĊĠ Ġ@ Autowired ĊĠ Ġval Ġds : ĠDataSource , ĊĠ Ġ@ Autowired ĊĠ Ġval Ġsecure List : ĠGet Secure List Query , Ċ ) Ġ{ ĊĊĠ Ġval Ġjdbc Template : ĠJdbc Template Ġ= ĠJdbc Template ( ds ) ĊĠ Ġval Ġencoder Ġ= ĠArg on 2 Password Encoder ( 1 6 , Ġ 3 2 , Ġ 1 , Ġ 4 0 9 6 , Ġ 3 ) ĊĊĠ Ġ// language = SQL ĊĠ Ġval Ġget UserId From SessionId Query Ġ= Ġ""" ĊĠĠĠĠĠĠĠ Ġselect Ġuser _ id Ġfrom Ġsessions Ġwhere Ġsession _ id Ġ= Ġ? ; ĊĠĠĠ Ġ""" . trim Indent () ĊĊĠ Ġfun Ġget Bearer (): ĠString Ġ{ ĊĠĠĠ Ġreturn Ġ" todo " ĊĠ Ġ} ĊĊĠ Ġfun Ġcreate Token (): ĠString Ġ{ ĊĠĠĠ Ġval Ġchar Pool : ĠList < Char > Ġ= Ġ(' a ' .. ' z ') Ġ+ Ġ(' A ' .. ' Z ') Ġ+ Ġ(' 0 ' .. ' 9 ') ĊĊĠĠĠ Ġval Ġtoken Ġ= Ġ( 1 .. 6 4 ) ĊĠĠĠĠĠ Ġ. map Ġ{ Ġi Ġ-> Ġkotlin . random . Random . nextInt ( 0 , Ġchar Pool . size ) Ġ} ĊĠĠĠĠĠ Ġ. map ( char Pool :: get ) ĊĠĠĠĠĠ Ġ. join ToString ("") ĊĊĠĠĠ Ġreturn Ġtoken ĊĠ Ġ} ĊĊĠ Ġfun Ġget UserId From SessionId ( sessionId : ĠString ): ĠString ? Ġ{ ĊĠĠĠ Ġ// language = SQL ĊĠĠĠ Ġval ĠuserId : ĠString ? Ġ= Ġjdbc Template . query For Object ( ĊĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠ Ġselect Ġuser _ id Ġfrom Ġsessions Ġwhere Ġsession _ id Ġ= Ġ? ; ĊĠĠĠĠĠ Ġ""" . trim Indent (), ĊĠĠĠĠĠ ĠString :: class . java , ĊĠĠĠĠĠ ĠsessionId , ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġreturn ĠuserId ĊĠ Ġ} ĊĊĠ Ġfun Ġis Email Valid ( email : ĠString ?): ĠBoolean Ġ{ ĊĠĠĠ Ġif Ġ( email Ġ!= Ġnull Ġ&& Ġemail . contains ('@ ') Ġ&& Ġemail . contains ('. ')) Ġreturn Ġtrue ĊĠĠĠ Ġreturn Ġfalse ĊĠ Ġ} ĊĊĠ Ġfun Ġis Admin ( token : ĠString ): ĠBoolean Ġ{ ĊĊĠĠĠ Ġvar Ġis Admin Ġ= Ġfalse ĊĊĠĠĠ Ġthis . ds . connection . use Ġ{ Ġconn Ġ-> ĊĠĠĠĠĠ Ġ// language = SQL ĊĠĠĠĠĠ Ġval Ġstatement Ġ= Ġconn . prepare Call ( ĊĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselect Ġexists ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĉ select Ġid ĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĉ from Ġadmin . roles ĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĉ where Ġid Ġin Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĉ ĉ select Ġrole ĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĉ ĉ from Ġadmin . role _ membership s ĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĉ ĉ where Ġperson Ġ= Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĉĉ ĉ select Ġperson ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĉĉ ĉ from Ġadmin . tokens ĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĉĉ ĉ where Ġtoken Ġ= Ġ? ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĉ and Ġname Ġ= Ġ' Administrator ' ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠ Ġstatement . setString ( 1 , Ġtoken ); ĊĠĠĠĠĠ Ġval Ġresult Ġ= Ġstatement . executeQuery () ĊĊĠĠĠĠĠ Ġif Ġ( result . next ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġis Admin Ġ= Ġresult . getBoolean ( 1 ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġis Admin ; ĊĠ Ġ} ĊĊĠ Ġfun Ġuser Has Create Permission ( token : ĠString , ĠtableName : ĠString ): ĠBoolean Ġ{ ĊĠĠĠ Ġif Ġ( isAdmin ( token )) Ġ{ ĊĠĠĠĠĠ Ġreturn Ġtrue ; ĊĠĠĠ Ġ} ĊĠĠĠ Ġvar Ġuser Has Create Permission : ĠBoolean Ġ= Ġfalse ; ĊĠĠĠ Ġthis . ds . connection . use Ġ{ Ġconn Ġ-> ĊĠĠĠĠĠ Ġ// language = SQL ĊĠĠĠĠĠ Ġval Ġstatement Ġ= Ġconn . prepare Call ( ĊĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselect Ġexists ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĉ select Ġa . id ĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĉ from Ġadmin . roles Ġas Ġa ĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinner Ġjoin Ġadmin . role _ table _ permissions Ġas Ġb ĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Ġa . id Ġ= Ġb . role ĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĉ where Ġa . id Ġin Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĉ ĉ select Ġrole ĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĉ ĉ from Ġadmin . role _ membership s ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĉ ĉ where Ġperson Ġ= Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĉĉ ĉ select Ġperson ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĉĉ ĉ from Ġadmin . tokens ĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĉĉ ĉ where Ġtoken Ġ= Ġ? ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġand Ġb . table _ name :: text Ġ= Ġ? ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġand Ġb . table _ permission Ġ= Ġ' Create ' ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠ Ġstatement . setString ( 1 , Ġtoken ); ĊĠĠĠĠĠ Ġstatement . setString ( 2 , ĠtableName ); ĊĠĠĠĠĠ Ġval Ġresult Ġ= Ġstatement . executeQuery () ĊĊĠĠĠĠĠ Ġif Ġ( result . next ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġuser Has Create Permission Ġ= Ġresult . getBoolean ( 1 ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġuser Has Create Permission ; ĊĠ Ġ} ĊĊĠ Ġfun Ġuser Has Delete Permission ( token : ĠString , ĠtableName : ĠString ): ĠBoolean Ġ{ ĊĠĠĠ Ġif Ġ( isAdmin ( token )) Ġ{ ĊĠĠĠĠĠ Ġreturn Ġtrue ; ĊĠĠĠ Ġ} ĊĠĠĠ Ġvar Ġuser Has Delete Permission : ĠBoolean Ġ= Ġfalse ; ĊĠĠĠ Ġthis . ds . connection . use Ġ{ Ġconn Ġ-> ĊĠĠĠĠĠ Ġ// language = SQL ĊĠĠĠĠĠ Ġval Ġstatement Ġ= Ġconn . prepare Call ( ĊĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselect Ġexists ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĉ select Ġa . id ĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĉ from Ġadmin . roles Ġas Ġa ĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinner Ġjoin Ġadmin . role _ table _ permissions Ġas Ġb ĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Ġa . id Ġ= Ġb . role ĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĉ where Ġa . id Ġin Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĉ ĉ select Ġrole ĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĉ ĉ from Ġadmin . role _ membership s ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĉ ĉ where Ġperson Ġ= Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĉĉ ĉ select Ġperson ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĉĉ ĉ from Ġadmin . tokens ĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĉĉ ĉ where Ġtoken Ġ= Ġ? ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġand Ġb . table _ name :: text Ġ= Ġ? ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġand Ġb . table _ permission Ġ= Ġ' Delete ' ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠ Ġstatement . setString ( 1 , Ġtoken ); ĊĠĠĠĠĠ Ġstatement . setString ( 2 , ĠtableName ); ĊĠĠĠĠĠ Ġval Ġresult Ġ= Ġstatement . executeQuery () ĊĊĠĠĠĠĠ Ġif Ġ( result . next ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġuser Has Delete Permission Ġ= Ġresult . getBoolean ( 1 ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġuser Has Delete Permission ; ĊĠ Ġ} ĊĊĠ Ġfun Ġuser Has Update Permission ( token : ĠString , ĠtableName : ĠString , ĠcolumnName : ĠString , Ġrow Id : ĠString ): ĠBoolean Ġ{ ĊĠĠĠ Ġif Ġ( isAdmin ( token )) Ġ{ ĊĠĠĠĠĠ Ġreturn Ġtrue ; ĊĠĠĠ Ġ} ĊĠĠĠ Ġvar Ġjdbc Template : ĠNamed Parameter Jdbc Template Ġ= ĠNamed Parameter Jdbc Template ( ds ) ĊĠĠĠ Ġvar Ġuser Has Update Permission Ġ= Ġfalse ; ĊĠĠĠ Ġval Ġparam Source Ġ= ĠMap Sql Parameter Source () ĊĠĠĠ Ġparam Source . add Value (" token ", Ġtoken ) ĊĠĠĠ Ġparam Source . add Value (" table ", ĠtableName ) ĊĠĠĠ Ġparam Source . add Value (" column ", ĠcolumnName ) ĊĠĠĠ Ġparam Source . add Value (" row Id ", Ġrow Id ) ĊĊĠĠĠ Ġthis . ds . connection . use Ġ{ Ġconn Ġ-> ĊĠĠĠĠĠ Ġ// language = SQL ĊĠĠĠĠĠ Ġval Ġstatement Ġ= Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith Ġrow _ level _ access Ġas ĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselect Ġ 1 Ġas Ġdummy _ column ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfrom Ġadmin . group _ row _ access Ġas Ġa ĠĠ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinner Ġjoin Ġadmin . group _ membership s Ġas Ġb ĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Ġa . group _ id Ġ= Ġb . group _ id ĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinner Ġjoin Ġadmin . tokens Ġas Ġc ĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Ġb . person Ġ= Ġc . person ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhere Ġa . table _ name :: text Ġ= Ġ: table ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġand Ġa . row Ġ= Ġ: row Id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġand Ġc . token Ġ= Ġ: token ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolumn _ level _ access Ġas ĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselect Ġ 1 Ġas Ġdummy _ column ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfrom Ġadmin . role _ column _ gr ants Ġa ĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinner Ġjoin Ġadmin . role _ membership s Ġb ĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Ġa . role Ġ= Ġb . role ĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinner Ġjoin Ġadmin . tokens Ġc ĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Ġb . person Ġ= Ġc . person ĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhere Ġa . table _ name :: text Ġ= Ġ: table ĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġand Ġa . column _ name Ġ= Ġ: column ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġand Ġa . access _ level Ġ= Ġ' Write ' ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġand Ġc . token Ġ= Ġ: token ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselect Ġexists ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselect Ġ 1 Ġfrom Ġrow _ level _ access Ġas Ġa ĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinner Ġjoin Ġcolumn _ level _ access Ġas Ġb ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Ġa . dummy _ column Ġ= Ġb . dummy _ column ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠ Ġval Ġresult Ġ= Ġjdbc Template . query For Row Set ( statement , Ġparam Source ) ĊĠĠĠĠĠ Ġprintln (" result Ġ$ result ") ĊĠĠĠĠĠ Ġif Ġ( result . next ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġuser Has Update Permission Ġ= Ġresult . getBoolean ( 1 ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġuser Has Update Permission ĊĠ Ġ} ĊĊĠ Ġfun Ġuser Has Update Permission Multiple Columns ( ĊĠĠĠ Ġtoken : ĠString , ĊĠĠĠ ĠtableName : ĠString , ĊĠĠĠ Ġcolumn Names : ĠMutable List < String > ĊĠ Ġ): ĠBoolean Ġ{ ĊĠĠĠ Ġif Ġ( isAdmin ( token )) Ġ{ ĊĠĠĠĠĠ Ġreturn Ġtrue ; ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġuser Has Update Permission Ġ= Ġfalse ; ĊĠĠĠ Ġthis . ds . connection . use Ġ{ Ġconn Ġ-> ĊĠĠĠĠĠ Ġvar Ġupdate Sql Ġ= Ġ" select Ġcount (*) Ġfrom Ġ\ n " Ġ+ ĊĠĠĠĠĠĠĠ Ġ"( select Ġcolumn _ name Ġfrom Ġadmin . role _ column _ gr ants Ġas Ġa Ġ\ n " Ġ+ ĊĠĠĠĠĠĠĠ Ġ" inner Ġjoin Ġadmin . roles Ġas Ġb Ġ Ġ\ n " Ġ+ ĊĠĠĠĠĠĠĠ Ġ" on Ġa . role Ġ= Ġb . id Ġ\ n " Ġ+ ĊĠĠĠĠĠĠĠ Ġ" where Ġb . id Ġin Ġ(\ n " Ġ+ ĊĠĠĠĠĠĠĠ Ġ"\ t select Ġrole Ġ\ n " Ġ+ ĊĠĠĠĠĠĠĠ Ġ" ĠĠĠ Ġfrom Ġadmin . role _ membership s \ n " Ġ+ ĊĠĠĠĠĠĠĠ Ġ"\ t where Ġperson Ġ= Ġ(\ n " Ġ+ ĊĠĠĠĠĠĠĠ Ġ"\ t \ t \ t \ t \ t select Ġperson \ n " Ġ+ ĊĠĠĠĠĠĠĠ Ġ"\ t \ t \ t \ t \ t from Ġadmin . tokens Ġ\ n " Ġ+ ĊĠĠĠĠĠĠĠ Ġ"\ t \ t \ t \ t \ t where Ġtoken Ġ= Ġ? \ n " Ġ+ ĊĠĠĠĠĠĠĠ Ġ" ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) \ n " Ġ+ ĊĠĠĠĠĠĠĠ Ġ" )\ n " Ġ+ ĊĠĠĠĠĠĠĠ Ġ" Ġand Ġa . table _ name :: text Ġ= Ġ? Ġ\ n " Ġ+ ĊĠĠĠĠĠĠĠ Ġ" Ġand Ġa . access _ level Ġ= Ġ' Write ' Ġ\ n " Ġ+ ĊĠĠĠĠĠĠĠ Ġ" Ġand Ġa . column _ name Ġin Ġ( Ġ'' \ n " Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġneed Ġto Ġadd Ġa Ġempty Ġcolumn Ġabove Ġso Ġthat Ġwhen Ġno Ġupdate Ġis Ġsent , Ġthe Ġquery Ġdoesn 't Ġgive Ġan Ġerror Ġfor Ġan Ġempty Ġsub query Ġin Ġcheck ĊĠĠĠĠĠ Ġcolumn Names . forEach Ġ{ ĠcolumnName Ġ-> ĊĠĠĠĠĠĠĠ Ġupdate Sql Ġ= Ġ"$ update Sql Ġ'$ columnName '," ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġupdate Sql Ġ= Ġupdate Sql . drop Last ( 1 ) ĊĠĠĠĠĠ Ġupdate Sql Ġ= Ġ"$ update Sql Ġ)) sq " ĊĠĠĠĠĠ Ġ// language = SQL ĊĠĠĠĠĠ Ġval Ġstatement Ġ= Ġconn . prepare Call ("$ update Sql Ġ; ") ĊĠĠĠĠĠ Ġstatement . setString ( 1 , Ġtoken ); ĊĠĠĠĠĠ Ġstatement . setString ( 2 , ĠtableName ); ĊĠĠĠĠĠ Ġval Ġresult Ġ= Ġstatement . executeQuery () ĊĊĠĠĠĠĠ Ġif Ġ( result . next ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcount Of Columns With Write Access Ġ= Ġresult . getInt ( 1 ) ĊĠĠĠĠĠĠĠ Ġif Ġ( count Of Columns With Write Access Ġ== Ġcolumn Names . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġuser Has Update Permission Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġuser Has Update Permission ; ĊĊĠ Ġ} ĊĊĠ Ġfun Ġget Readable Tables ( token : ĠString ): ĠList < String > Ġ{ ĊĠĠĠ Ġval Ġtable Names Ġ= Ġmutable ListOf < String >() ĊĊĠĠĠ Ġif Ġ( isAdmin ( token )) Ġ{ ĊĠĠĠĠĠ Ġthis . ds . connection . use Ġ{ Ġconn Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġstatement Ġ= Ġconn . prepare Call ( ĊĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselect Ġtable _ schema Ġ|| Ġ'.' Ġ|| Ġtable _ name Ġas Ġtable _ name ĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfrom Ġinformation _ schema . tables ĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhere Ġtable _ schema Ġin Ġ(' admin ', Ġ' common ', Ġ' sc ', Ġ' sil ', Ġ' up ') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorder Ġby Ġtable _ name Ġasc ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġstatement . executeQuery () ĊĠĠĠĠĠĠĠ Ġwhile Ġ( result . next ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġtable Names . add ( result . getString (" table _ name ")) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġthis . ds . connection . use Ġ{ Ġconn Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġstatement Ġ= Ġconn . prepare Call ( ĊĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselect Ġdistinct Ġtable _ name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfrom Ġadmin . role _ column _ gr ants Ġas Ġa ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinner Ġjoin Ġadmin . role _ membership s Ġas Ġb ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Ġa . role Ġ= Ġb . role ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinner Ġjoin Ġadmin . tokens Ġas Ġc ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Ġb . person Ġ= Ġc . person ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhere Ġc . token Ġ= Ġ? Ġorder Ġby Ġtable _ name Ġasc ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġstatement . setString ( 1 , Ġtoken ) ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġstatement . executeQuery () ĊĠĠĠĠĠĠĠ Ġwhile Ġ( result . next ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġtable Names . add ( result . getString (" table _ name ")) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġtable Names ĊĠĠĠĠĠ Ġ. filter Ġ{ Ġ! it . contains ("_ history ") Ġ} ĊĠĠĠĠĠ Ġ. filter Ġ{ Ġ! it . contains ("_ peer ") Ġ} ĊĠĠĠĠĠ Ġ. map Ġ{ Ġit . replace ('_ ', Ġ'-') Ġ}; ĊĠ Ġ} ĊĊĠ Ġfun Ġupdate Field ( token : ĠString , Ġtable : ĠString , Ġcolumn : ĠString , Ġid : ĠString ?, Ġvalue : ĠAny ?, Ġcast : ĠString ? Ġ= Ġ"") Ġ{ ĊĊĠĠĠ Ġif Ġ( user Has Update Permission ( ĊĠĠĠĠĠĠĠ Ġtoken Ġ= Ġtoken , ĊĠĠĠĠĠĠĠ ĠtableName Ġ= Ġtable , ĊĠĠĠĠĠĠĠ ĠcolumnName Ġ= Ġcolumn , ĊĠĠĠĠĠĠĠ Ġrow Id Ġ= Ġid !! ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠ Ġjdbc Template . update ( ĊĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Ġ$ table ĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset ĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ$ column Ġ= Ġ? $ cast , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodified _ by Ġ= ĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselect Ġperson Ġ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfrom Ġadmin . tokens Ġ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhere Ġtoken Ġ= Ġ? ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodified _ at Ġ= ĠCURRENT _ TIMESTAMP ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhere Ġid Ġ= Ġ? ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent (), ĊĠĠĠĠĠĠĠ Ġvalue , ĊĠĠĠĠĠĠĠ Ġtoken , ĊĠĠĠĠĠĠĠ Ġid , ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ// ĠChar Ġ-> ĠDecimal Ġ-> ĠHex ĊĠ Ġfun Ġconvert StringTo Hex ( str : ĠString ): ĠString ? Ġ{ ĊĠĠĠ Ġval Ġhex Ġ= ĠStringBuffer () ĊĊĠĠĠ Ġ// Ġloop Ġchars Ġone Ġby Ġone ĊĠĠĠ Ġfor Ġ( temp Ġin Ġstr . toCharArray ()) Ġ{ ĊĊĠĠĠĠĠ Ġ// Ġconvert Ġchar Ġto Ġint , Ġfor Ġchar Ġ` a ` Ġdecimal Ġ 9 7 ĊĠĠĠĠĠ Ġval Ġdecimal Ġ= Ġtemp . code ĊĊĠĠĠĠĠ Ġ// Ġconvert Ġint Ġto Ġhex , Ġfor Ġdecimal Ġ 9 7 Ġhex Ġ 6 1 ĊĠĠĠĠĠ Ġhex . append ( Integer . to HexString ( decimal )) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġhex . toString () ĊĠ Ġ} ĊĊĠ Ġ// ĠHex Ġ-> ĠDecimal Ġ-> ĠChar ĊĠ Ġfun Ġconvert Hex ToString ( hex : ĠString ): ĠString ? Ġ{ ĊĠĠĠ Ġval Ġresult Ġ= ĠStringBuilder () ĊĊĠĠĠ Ġ// Ġsplit Ġinto Ġtwo Ġchars Ġper Ġloop , Ġhex , Ġ 0 A , Ġ 0 B , Ġ 0 C ... ĊĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĠĠĠ Ġwhile Ġ( i Ġ< Ġhex . length Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠ Ġval Ġtemp In Hex Ġ= Ġhex . substring ( i , Ġi Ġ+ Ġ 2 ) ĊĊĠĠĠĠĠ Ġ// convert Ġhex Ġto Ġdecimal ĊĠĠĠĠĠ Ġval Ġdecimal Ġ= Ġtemp In Hex . toInt ( 1 6 ) ĊĊĠĠĠĠĠ Ġ// Ġconvert Ġthe Ġdecimal Ġto Ġchar ĊĠĠĠĠĠ Ġresult . append ( decimal . to Char ()) ĊĠĠĠĠĠ Ġi Ġ+= Ġ 2 ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġresult . toString () ĊĠ Ġ} ĊĊĠ Ġfun Ġget People Details From Ids ( id Array : ĠMutable List < String >): ĠMutable List < People Details > Ġ{ ĊĠĠĠ Ġvar Ġpeople Details : ĠMutable List < People Details > Ġ= Ġmutable ListOf () Ċ // ĠĠĠ Ġvar Ġstring People Ids Ġ= Ġ"(" Ċ // ĠĠĠ Ġif ( id Array . isNotEmpty ()) Ġ{ id Array . forEach Ġ{ Ġit Ġ-> Ġstring People Ids + ="$ it ," Ġ}} Ċ // ĠĠĠ Ġelse Ġ{ string People Ids Ġ+= Ġ" 0 ," } Ċ // ĠĠĠ Ġstring People Ids Ġ= Ġstring People Ids . drop Last ( 1 ) Ċ // ĠĠĠ Ġstring People Ids +=" )" Ċ Ċ // ĠĠĠ Ġif Ġ( id Array . isEmpty ()) Ġid Array . add ( 0 ) ĊĊĠĠĠ Ġthis . ds . connection . use Ġ{ Ġconn Ġ-> ĊĠĠĠĠĠ Ġ// language = SQL ĊĠĠĠĠĠ Ġval Ġstatement Ġ= Ġconn . prepare Call ( ĊĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselect Ġid , Ġpublic _ first _ name , Ġpublic _ last _ name Ġfrom Ġadmin . people Ġwhere Ġid Ġ Ġ= ĠANY ( ?) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠ Ġstatement . set Object ( 1 , Ġid Array . to Typed Array (), Ġjava . sql . Types . ARRAY ); ĊĠĠĠĠĠ Ġprintln ( statement ) ĊĠĠĠĠĠ Ġval Ġresult Ġ= Ġstatement . executeQuery () ĊĠĠĠĠĠ Ġwhile Ġ( result . next ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġpeople Details . add ( ĊĠĠĠĠĠĠĠĠĠ ĠPeople Details ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġresult . getInt ( 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpublic _ first _ name Ġ= Ġresult . getString ( 2 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpublic _ last _ name Ġ= Ġresult . getString ( 3 ) ĊĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġpeople Details ; ĊĠ Ġ} ĊĊĠ Ġfun Ġis Schema Exists (): ĠBoolean Ġ{ ĊĠĠĠ Ġvar Ġresult : ĠInt ? Ġ= Ġ 0 ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠ Ġresult Ġ= Ġjdbc Template . query For Object ( ĊĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSELECT Ġcount ( schema _ name ) Ġas Ġsize ĠFROM Ġinformation _ schema . sche m ata ĠWHERE Ġschema _ name Ġ= Ġ' admin '; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent (), ĊĠĠĠĠĠĠĠ ĠInt :: class . java ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠEmpty Result Data AccessException ) Ġ{ ĊĠĠĠĠĠ Ġprintln (" Schemas Ġnot Ġcreated ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġresult Ġ!= Ġnull Ġ&& Ġresult Ġ> Ġ 0 ĊĠ Ġ} ĊĊĠ Ġfun Ġperson Id (): ĠString ? Ġ{ ĊĠĠĠ Ġreturn Ġif Ġ( this . is Schema Exists ()) Ġ{ ĊĠĠĠĠĠ Ġjdbc Template . query For Object ( ĊĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSELECT Ġid ĠFROM Ġadmin . people ĠWHERE Ġsensitivity _ clear ance Ġ= Ġ' High '; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent (), ĊĠĠĠĠĠĠĠ ĠString :: class . java , ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġnull ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġadmin GroupId (): ĠString ? Ġ{ ĊĠĠĠ Ġreturn Ġif Ġ( this . is Schema Exists ()) Ġ{ ĊĠĠĠĠĠ Ġjdbc Template . query For Object ( ĊĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSELECT Ġid ĠFROM Ġadmin . groups ĠWHERE Ġ Ġname Ġ= Ġ' Administr ators '; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent (), ĊĠĠĠĠĠĠĠ ĠString :: class . java ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġnull ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġpublic GroupId (): ĠString ? Ġ{ ĊĠĠĠ Ġreturn Ġif Ġ( this . is Schema Exists ()) Ġ{ ĊĠĠĠĠĠ Ġjdbc Template . query For Object ( ĊĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSELECT Ġid ĠFROM Ġadmin . groups ĠWHERE Ġname =' Public ' ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent (), ĊĠĠĠĠĠĠĠ ĠString :: class . java ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġnull ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġadmin Role (): ĠString ? Ġ{ ĊĠĠĠ Ġreturn Ġif Ġ( this . is Schema Exists ()) Ġ{ ĊĠĠĠĠĠ Ġjdbc Template . query For Object ( ĊĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSELECT Ġid ĠFROM Ġadmin . roles ĠWHERE Ġname =' Administrator ' ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent (), ĊĠĠĠĠĠĠĠ ĠString :: class . java ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġnull ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ// Ġ Ġneed Ġto Ġfigure Ġout Ġif Ġthis Ġwould Ġwork Ġfor Ġnon Ġstring Ġtypes Ċ // Ġ Ġneed Ġto Ġmodify Ġthe Ġsecure List Query Handler ĊĠ Ġfun Ġget SearchResults ( tableName : ĠString , ĠcolumnName : ĠString , Ġsearch Keyword : ĠString , Ġtoken : ĠString ): ĠMutable List < Any ?> Ġ{ ĊĠĠĠ Ġval Ġparam Source Ġ= ĠMap Sql Parameter Source () ĊĠĠĠ Ġval Ġwhere Clause Ġ= Ġ"$ columnName Ġlike Ġ'% $ search Keyword '" ĊĠĠĠ Ġparam Source . add Value (" token ", Ġtoken ) ĊĠĠĠ Ġval Ġquery Ġ= Ġsecure List . get Secure List Query Handler ( ĊĠĠĠĠĠ ĠGet Secure List Query Request ( ĊĠĠĠĠĠĠĠ ĠtableName Ġ= ĠtableName , ĊĠĠĠĠĠĠĠ Ġfilter Ġ= Ġ" order Ġby Ġid ", ĊĠĠĠĠĠĠĠ Ġcolumns Ġ= ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠ ĠcolumnName ĊĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠ Ġwhere Clause Ġ= Ġwhere Clause Ċ // ĠĠĠĠĠĠĠ Ġsearch Keyword Ġ= Ġsearch Keyword ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ). query ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠ Ġval Ġjdbc Result Ġ= Ġjdbc Template . query For Row Set ( query , Ġparam Source ) ĊĠĠĠĠĠ Ġvar Ġresult List Ġ= Ġmutable ListOf < Any ?> () ĊĠĠĠĠĠ Ġwhile Ġ( jdbc Result . next ()) Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġfor Ġnone Ġstring Ġtypes , Ġwe Ġcan Ġhave Ġa Ġswitch Ġcase Ġhere Ġinstead ĊĠĠĠĠĠĠĠ Ġvar ĠcolumnName Value : ĠAny ? Ġ= Ġjdbc Result . getString ( columnName ) ĊĠĠĠĠĠĠĠ Ġif Ġ( jdbc Result . was Null ()) ĠcolumnName Value Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠ Ġresult List . add ( columnName Value ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġreturn Ġresult List ; ĊĠĠĠ Ġ} ĊĠĠĠ Ġcatch ( e : ĠSQLException ) Ġ{ ĊĠĠĠĠĠ Ġprintln (" error Ġwhile Ġlisting Ġ${ e . message }") ĊĠĠĠĠĠ Ġreturn Ġmutable ListOf () ĊĠĠĠ Ġ} ĊĊĠ Ġ} Ċ } ĊĊ Ċ inline Ġfun Ġ< re ified ĠT Ġ: ĠEnum < T >> Ġenum Contains ( name : ĠString ): ĠBoolean Ġ{ ĊĠ Ġreturn Ġenum Values < T >(). any Ġ{ Ġit . name Ġ== Ġname Ġ} Ċ } ĊĊĊ