package Ġcom . example . ar ist ot le Ċ Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . view . animation . Animation Utils Ċ import Ġandroid . widget . Compound Button Ċ import Ġandroid . widget . Toast Ċ import Ġandroidx . appcompat . app . AlertDialog Ċ import Ġandroidx . core . view . get Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġcom . example . ar ist ot le . MainActivity . MainActivity Ċ import Ġcom . example . ar ist ot le . Models . Meeting Ċ import Ġcom . example . ar ist ot le . Models . User Ċ import Ġcom . google . android . material . chip . Chip Ċ import Ġcom . google . android . material . chip . Chip Group Ċ import Ġcom . google . gson . Gson Ċ import Ġcom . google . gson . reflect . Type Token Ċ import Ġkotlinx . android . synt hetic . main . fragment _ calendar .* Ċ import Ġkotlinx . android . synt hetic . main . fragment _ meeting .* Ċ import Ġjava . io .* Ċ import Ġjava . lang . reflect . Type Ċ import Ġjava . util .* ĊĊ Ċ class ĠMeeting Fragment Ġ: ĠFragment () Ġ{ ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġpath To Me et ings File Ġ: ĠString ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġpath To User File Ġ: ĠString ĊĊĠĠĠ Ġprivate Ġvar ĠstartTime Selected Ġ= ĠCalendar . getInstance () ĊĠĠĠ Ġprivate Ġvar ĠendTime Selected Ġ= ĠCalendar . getInstance () ĊĠĠĠ Ġprivate Ġvar Ġis Start Selected Ġ= Ġtrue ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġparticipant Chip Group Ġ: ĠCh ip Group ĊĠĠĠ Ġprivate Ġvar Ġclicked Participants Ġ= Ġmutable ListOf < User >() ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( ĊĠĠĠĠĠĠĠ Ġinflater : ĠLayoutInflater , Ġcontainer : ĠViewGroup ?, ĊĠĠĠĠĠĠĠ ĠsavedInstanceState : ĠBundle ? ĊĠĠĠ Ġ): ĠView ? Ġ{ ĊĊĠĠĠĠĠĠĠ Ġpath To Me et ings File Ġ= Ġthis . context ?. files Dir ?. path Ġ+ Ġ"/ Me et ings . json " ĊĠĠĠĠĠĠĠ Ġpath To User File Ġ= Ġthis . context ?. files Dir ?. path Ġ+ Ġ"/ Users . json " ĊĊĠĠĠĠĠĠĠ Ġreturn Ġinflater . inflate ( R . layout . fragment _ meeting , Ġcontainer , Ġfalse ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Created ( view , ĠsavedInstanceState ) ĊĊĠĠĠĠĠĠĠ Ġtime Picker . setIs 2 4 Hour View ( true ) ĊĠĠĠĠĠĠĠ Ġcalendar ViewSet . show Current Month Page () ĊĊĠĠĠĠĠĠĠ Ġclicked Participants Ġ= Ġmutable ListOf < User >() ĊĊĠĠĠĠĠĠĠ Ġparticipant Chip Group Ġ= Ġparticipants Chip Group View ĊĊĠĠĠĠĠĠĠ Ġval Ġusers Ġ= Ġload Users () ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( user : ĠUser Ġin Ġusers ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchip Ġ= ĠCh ip ( participant Chip Group . context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchip . setText ( user . firstName Ġ+ Ġ" Ġ" Ġ+ Ġuser . lastName ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchip . is Check able Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparticipant Chip Group . addView ( chip ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġchip . setOn Checked ChangeListener Ġ{ Ġbutton View , Ġis Checked Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( isChecked ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclicked Participants . add ( user ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclicked Participants . remove ( user ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ ĠstartTime . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġanimation Ġ= ĠAnimation Utils . load Animation ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactivity , ĠR . anim . slide _ up ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsetter . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsetter . start Animation ( animation ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdeactivate Elements () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Start Selected Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠendTime . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġanimation Ġ= ĠAnimation Utils . load Animation ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactivity , ĠR . anim . slide _ up ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsetter . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsetter . start Animation ( animation ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdeactivate Elements () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Start Selected Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcancel Time . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġanimation Ġ= ĠAnimation Utils . load Animation ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactivity , ĠR . anim . slide _ down ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsetter . start Animation ( animation ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsetter . visibility Ġ= ĠView . IN VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc Ġ= ĠCalendar . getInstance () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtime Picker . hour Ġ= Ġc . get ( Calendar . HOUR _ OF _ DAY ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtime Picker . minute Ġ= Ġc . get ( Calendar . MINUTE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcalendar ViewSet . show Current Month Page () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactivate Elements () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġdone Time . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġanimation Ġ= ĠAnimation Utils . load Animation ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactivity , ĠR . anim . slide _ down ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsetter . start Animation ( animation ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsetter . visibility Ġ= ĠView . IN VISIBLE ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactivity Ġ, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Selected Ġtime Ġ" Ġ+ Ġtime Picker . hour . toString (). pad Start ( 2 , Ġ' 0 ') Ġ+ Ġ":" Ġ+ Ġtime Picker . minute . toString (). pad Start ( 2 , Ġ' 0 ') Ġ, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . LENGTH _ SHORT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). show () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcal Ġ= Ġcalendar ViewSet . first Selected Date ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcal . set ( Calendar . HOUR _ OF _ DAY , Ġtime Picker . hour ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcal . set ( Calendar . MINUTE , Ġtime Picker . minute ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( is Start Selected ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartTime Selected . set ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcal . get ( Calendar . YEAR ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcal . get ( Calendar . MONTH ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcal . get ( Calendar . DAY _ OF _ MONTH ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcal . get ( Calendar . HOUR _ OF _ DAY ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcal . get ( Calendar . MINUTE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartTime . setText ( cal . get ( Calendar . HOUR _ OF _ DAY ). toString (). pad Start ( 2 , Ġ' 0 ') Ġ+ Ġ':' Ġ+ Ġcal . get ( Calendar . MINUTE ). toString (). pad Start ( 2 , Ġ' 0 ') Ġ+ Ġ' Ġ' Ġ+ Ġcal . get ( Calendar . DAY _ OF _ MONTH ) Ġ+ Ġ'/' Ġ Ġ+ Ġ( cal . get ( Calendar . MONTH ) Ġ+ Ġ 1 ). toString () Ġ+ Ġ"/" Ġ+ Ġ Ġcal . get ( Calendar . YEAR ). toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠendTime Selected . set ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcal . get ( Calendar . YEAR ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcal . get ( Calendar . MONTH ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcal . get ( Calendar . DAY _ OF _ MONTH ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcal . get ( Calendar . HOUR _ OF _ DAY ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcal . get ( Calendar . MINUTE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠendTime . setText ( cal . get ( Calendar . HOUR _ OF _ DAY ). toString (). pad Start ( 2 , Ġ' 0 ') Ġ+ Ġ':' Ġ+ Ġcal . get ( Calendar . MINUTE ). toString (). pad Start ( 2 , Ġ' 0 ') Ġ+ Ġ' Ġ' Ġ+ Ġcal . get ( Calendar . DAY _ OF _ MONTH ) Ġ+ Ġ'/' Ġ Ġ+ ( cal . get ( Calendar . MONTH ) Ġ+ Ġ 1 ). toString () Ġ+ Ġ"/" Ġ+ Ġ Ġcal . get ( Calendar . YEAR ). toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġactivate Elements () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbutton New Meeting Book . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Meeting Ġ= ĠMeeting ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartTime Selected . time , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠendTime Selected . time , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġedit Text Meeting Subject . text . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġedit Text Location . text . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclicked Participants , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= Ġthis . context ?. let Ġ{ Ġit 1 Ġ-> ĠAlertDialog . Builder ( it 1 ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġchange Fragment Flag Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( edit Text Meeting Subject . text !!. isEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder ?. setTitle (" Subject Ġfield Ġis Ġempty ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder ?. setMessage (" You Ġhave Ġnot Ġwritten Ġa Ġsubject , Ġplease Ġenter Ġa Ġsubject Ġto Ġbook Ġa Ġmeeting ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif ( edit Text Location . text !!. isEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder ?. setTitle (" Location Ġfield Ġis Ġempty ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder ?. setMessage (" You Ġhave Ġnot Ġwritten Ġa Ġlocation , Ġplease Ġenter Ġa Ġlocation Ġto Ġbook Ġa Ġmeeting ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsave Meeting ( new Meeting ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder ?. setTitle (" Your Ġmeeting Ġis Ġbook ed ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder ?. setMessage (" Your Ġmeeting Ġhave Ġbeen Ġbook ed Ġand Ġadded Ġto Ġthe Ġcalendar .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchange Fragment Flag Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder ?. set Positive Button (" Ok ") Ġ{ Ġdialog , Ġwhich -> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġact Ġ= Ġactivity Ġas ĠMainActivity ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( change Fragment Flag ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġact . fragment Switch er ( act . calendar Fragment ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdialog : ĠAlertDialog Ġ= Ġbuilder !!. create () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdialog . show () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġactivate Elements () Ġ{ ĊĠĠĠĠĠĠĠ ĠstartTime . isEnabled Ġ= Ġtrue ĊĠĠĠĠĠĠĠ ĠendTime . isEnabled Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġtext Input Meeting Subject . isEnabled Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġtext Input Location . isEnabled Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġbutton New Meeting Book . isEnabled Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdeactivate Elements () Ġ{ ĊĠĠĠĠĠĠĠ ĠstartTime . isEnabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠ ĠendTime . isEnabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġtext Input Meeting Subject . isEnabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġtext Input Location . isEnabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġbutton New Meeting Book . isEnabled Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsave Meeting ( new Meeting : ĠMeeting ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġmeet ings Json Ġ= Ġload Me et ings () ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! meet ings Json . contains ( new Meeting )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmeet ings Json . add ( new Meeting ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġwriter : ĠWriter Ġ= ĠFile Writer ( path To Me et ings File ) ĊĠĠĠĠĠĠĠ ĠGson (). toJson ( meet ings Json , Ġwriter ) ĊĠĠĠĠĠĠĠ Ġwriter . close () ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġload Me et ings () Ġ: ĠMutable List < Meeting > Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġmeet ings Json Ġ= Ġmutable ListOf < Meeting >() ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreader : ĠReader Ġ= ĠFileReader ( path To Me et ings File ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠRE VIEW _ TYPE Ġ: ĠType Ġ= Ġobject Ġ: ĠType Token < List < Meeting ?> ?> () Ġ{} . type ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmeet ings Json Ġ= ĠGson (). fromJson ( reader , ĠRE VIEW _ TYPE ) Ġ// Ġcontains Ġthe Ġwhole Ġreviews Ġlist ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreader . close () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e Ġ: ĠFileNotFoundException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwriter : ĠWriter Ġ= ĠFile Writer ( path To Me et ings File ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGson (). toJson ( meet ings Json , Ġwriter ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . close () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġmeet ings Json ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġload Users () Ġ: ĠMutable List < User > Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġjson Users Ġ= Ġmutable ListOf < User >() ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreader : ĠReader Ġ= ĠFileReader ( path To User File ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠRE VIEW _ TYPE Ġ: ĠType Ġ= Ġobject Ġ: ĠType Token < List < User ?> ?> () Ġ{} . type ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjson Users Ġ= ĠGson (). fromJson ( reader , ĠRE VIEW _ TYPE ) Ġ// Ġcontains Ġthe Ġwhole Ġreviews Ġlist ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreader . close () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e Ġ: ĠFileNotFoundException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwriter : ĠWriter Ġ= ĠFile Writer ( path To User File ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGson (). toJson ( json Users , Ġwriter ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . close () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġjson Users ĊĠĠĠ Ġ} ĊĊ Ċ } Ċ