@@ -3,13 +3,12 @@ |
||
| 3 | 3 | namespace plunner\Http\Controllers\Employees\Auth; |
| 4 | 4 | |
| 5 | 5 | use Illuminate\Http\Request; |
| 6 | -use Log; |
|
| 7 | -use plunner\Company; |
|
| 8 | -use plunner\employee; |
|
| 9 | -use plunner\Http\Controllers\Controller; |
|
| 10 | 6 | use Tymon\JWTAuth\Support\auth\AuthenticatesAndRegistersUsers; |
| 11 | 7 | use Tymon\JWTAuth\Support\auth\ThrottlesLogins; |
| 12 | 8 | use Validator; |
| 9 | +use plunner\Company; |
|
| 10 | +use plunner\Http\Controllers\Controller; |
|
| 11 | +use plunner\employee; |
|
| 13 | 12 | |
| 14 | 13 | /** |
| 15 | 14 | * Class AuthController |
@@ -79,8 +79,9 @@ |
||
| 79 | 79 | if ($request->input('remember', false)) { |
| 80 | 80 | config(['jwt.ttl' => '43200']); //30 days |
| 81 | 81 | $this->custom = array_merge($this->custom, ['remember' => 'true']); |
| 82 | - } else |
|
| 83 | - $this->custom = array_merge($this->custom, ['remember' => 'false']); |
|
| 82 | + } else { |
|
| 83 | + $this->custom = array_merge($this->custom, ['remember' => 'false']); |
|
| 84 | + } |
|
| 84 | 85 | |
| 85 | 86 | return $this->postLoginOriginal($request); |
| 86 | 87 | } |
@@ -43,7 +43,7 @@ discard block |
||
| 43 | 43 | * en = employee normal |
| 44 | 44 | * @var array |
| 45 | 45 | */ |
| 46 | - protected $custom = ['mode' => 'en']; |
|
| 46 | + protected $custom = [ 'mode' => 'en' ]; |
|
| 47 | 47 | |
| 48 | 48 | /** |
| 49 | 49 | * @var company |
@@ -56,13 +56,13 @@ discard block |
||
| 56 | 56 | */ |
| 57 | 57 | public function __construct() |
| 58 | 58 | { |
| 59 | - config(['auth.model' => \plunner\Employee::class]); |
|
| 60 | - config(['jwt.user' => \plunner\Employee::class]); |
|
| 59 | + config([ 'auth.model' => \plunner\Employee::class ]); |
|
| 60 | + config([ 'jwt.user' => \plunner\Employee::class ]); |
|
| 61 | 61 | } |
| 62 | 62 | |
| 63 | 63 | public function postRegister(Request $request) |
| 64 | 64 | { |
| 65 | - $this->validate($request, ['company' => 'required|exists:companies,name']); |
|
| 65 | + $this->validate($request, [ 'company' => 'required|exists:companies,name' ]); |
|
| 66 | 66 | $this->company = Company::whereName($request->input('company'))->firstOrFail(); |
| 67 | 67 | return $this->postRegisterOriginal($request); |
| 68 | 68 | } |
@@ -70,17 +70,17 @@ discard block |
||
| 70 | 70 | public function postLogin(Request $request) |
| 71 | 71 | { |
| 72 | 72 | //get company ID and impiled it in the request |
| 73 | - $this->validate($request, ['company' => 'required|exists:companies,name']); |
|
| 73 | + $this->validate($request, [ 'company' => 'required|exists:companies,name' ]); |
|
| 74 | 74 | $this->company = Company::whereName($request->input('company'))->firstOrFail(); |
| 75 | - $request->merge(['company_id' => $this->company->id]); |
|
| 75 | + $request->merge([ 'company_id' => $this->company->id ]); |
|
| 76 | 76 | |
| 77 | 77 | //remember me |
| 78 | - $this->validate($request, ['remember' => 'required|boolean']); |
|
| 78 | + $this->validate($request, [ 'remember' => 'required|boolean' ]); |
|
| 79 | 79 | if ($request->input('remember', false)) { |
| 80 | - config(['jwt.ttl' => '43200']); //30 days |
|
| 81 | - $this->custom = array_merge($this->custom, ['remember' => 'true']); |
|
| 80 | + config([ 'jwt.ttl' => '43200' ]); //30 days |
|
| 81 | + $this->custom = array_merge($this->custom, [ 'remember' => 'true' ]); |
|
| 82 | 82 | } else |
| 83 | - $this->custom = array_merge($this->custom, ['remember' => 'false']); |
|
| 83 | + $this->custom = array_merge($this->custom, [ 'remember' => 'false' ]); |
|
| 84 | 84 | |
| 85 | 85 | return $this->postLoginOriginal($request); |
| 86 | 86 | } |
@@ -95,7 +95,7 @@ discard block |
||
| 95 | 95 | { |
| 96 | 96 | return Validator::make($data, [ |
| 97 | 97 | 'name' => 'required|min:1|max:255', |
| 98 | - 'email' => 'required|email|max:255|unique:employees,email,NULL,id,company_id,' . $this->company->id, |
|
| 98 | + 'email' => 'required|email|max:255|unique:employees,email,NULL,id,company_id,'.$this->company->id, |
|
| 99 | 99 | 'password' => 'required|confirmed|min:6', |
| 100 | 100 | ]); |
| 101 | 101 | } |
@@ -109,9 +109,9 @@ discard block |
||
| 109 | 109 | protected function create(array $data) |
| 110 | 110 | { |
| 111 | 111 | return $this->company->save(new employee([ |
| 112 | - 'name' => $data['name'], |
|
| 113 | - 'email' => $data['email'], |
|
| 114 | - 'password' => bcrypt($data['password']), |
|
| 112 | + 'name' => $data[ 'name' ], |
|
| 113 | + 'email' => $data[ 'email' ], |
|
| 114 | + 'password' => bcrypt($data[ 'password' ]), |
|
| 115 | 115 | ])); |
| 116 | 116 | } |
| 117 | 117 | } |
@@ -3,9 +3,9 @@ |
||
| 3 | 3 | namespace plunner\Http\Controllers\Employees\Auth; |
| 4 | 4 | |
| 5 | 5 | use Illuminate\Http\Request; |
| 6 | +use Tymon\JWTAuth\Support\auth\ResetsPasswords; |
|
| 6 | 7 | use plunner\Company; |
| 7 | 8 | use plunner\Http\Controllers\Controller; |
| 8 | -use Tymon\JWTAuth\Support\auth\ResetsPasswords; |
|
| 9 | 9 | |
| 10 | 10 | /** |
| 11 | 11 | * Class PasswordController |
@@ -36,12 +36,12 @@ discard block |
||
| 36 | 36 | * en = employee normal |
| 37 | 37 | * @var array |
| 38 | 38 | */ |
| 39 | - protected $custom = ['mode' => 'en']; |
|
| 39 | + protected $custom = [ 'mode' => 'en' ]; |
|
| 40 | 40 | |
| 41 | 41 | /** |
| 42 | 42 | * @var array |
| 43 | 43 | */ |
| 44 | - protected $username = ['email', 'company_id']; |
|
| 44 | + protected $username = [ 'email', 'company_id' ]; |
|
| 45 | 45 | |
| 46 | 46 | /** |
| 47 | 47 | * @var company |
@@ -54,24 +54,24 @@ discard block |
||
| 54 | 54 | */ |
| 55 | 55 | public function __construct() |
| 56 | 56 | { |
| 57 | - config(['auth.model' => \plunner\Employee::class]); |
|
| 58 | - config(['jwt.user' => \plunner\Employee::class]); |
|
| 59 | - config(['auth.password.table' => 'password_resets_employees', 'auth.password.email' => 'emails.employees.password']); |
|
| 57 | + config([ 'auth.model' => \plunner\Employee::class ]); |
|
| 58 | + config([ 'jwt.user' => \plunner\Employee::class ]); |
|
| 59 | + config([ 'auth.password.table' => 'password_resets_employees', 'auth.password.email' => 'emails.employees.password' ]); |
|
| 60 | 60 | } |
| 61 | 61 | |
| 62 | 62 | public function postEmail(Request $request) |
| 63 | 63 | { |
| 64 | - $this->validate($request, ['company' => 'required|exists:companies,name']); |
|
| 64 | + $this->validate($request, [ 'company' => 'required|exists:companies,name' ]); |
|
| 65 | 65 | $this->company = Company::whereName($request->input('company'))->firstOrFail(); |
| 66 | - $request->merge(['company_id' => $this->company->id]); |
|
| 66 | + $request->merge([ 'company_id' => $this->company->id ]); |
|
| 67 | 67 | return $this->postEmailOriginal($request); |
| 68 | 68 | } |
| 69 | 69 | |
| 70 | 70 | public function postReset(Request $request) |
| 71 | 71 | { |
| 72 | - $this->validate($request, ['company' => 'required|exists:companies,name']); |
|
| 72 | + $this->validate($request, [ 'company' => 'required|exists:companies,name' ]); |
|
| 73 | 73 | $this->company = Company::whereName($request->input('company'))->firstOrFail(); |
| 74 | - $request->merge(['company_id' => $this->company->id]); |
|
| 74 | + $request->merge([ 'company_id' => $this->company->id ]); |
|
| 75 | 75 | return $this->postResetOriginal($request); |
| 76 | 76 | } |
| 77 | 77 | |
@@ -28,6 +28,6 @@ |
||
| 28 | 28 | */ |
| 29 | 29 | public function handle() |
| 30 | 30 | { |
| 31 | - $this->comment(PHP_EOL . Inspiring::quote() . PHP_EOL); |
|
| 31 | + $this->comment(PHP_EOL.Inspiring::quote().PHP_EOL); |
|
| 32 | 32 | } |
| 33 | 33 | } |
@@ -71,9 +71,9 @@ discard block |
||
| 71 | 71 | */ |
| 72 | 72 | private function makeForeground(Caldav $calendar) |
| 73 | 73 | { |
| 74 | - $this->info('Sync calendar ' . $calendar->calendar_id . ' started'); |
|
| 74 | + $this->info('Sync calendar '.$calendar->calendar_id.' started'); |
|
| 75 | 75 | (new Sync($calendar))->sync(); |
| 76 | - $this->info('Sync calendar ' . $calendar->calendar_id . ' completed'); |
|
| 76 | + $this->info('Sync calendar '.$calendar->calendar_id.' completed'); |
|
| 77 | 77 | } |
| 78 | 78 | |
| 79 | 79 | private function syncAll() |
@@ -97,7 +97,7 @@ discard block |
||
| 97 | 97 | */ |
| 98 | 98 | private function makeBackground(Caldav $calendar) |
| 99 | 99 | { |
| 100 | - $event = $this->schedule->command('sync:caldav ' . $calendar->calendar_id)->withoutOverlapping(); |
|
| 100 | + $event = $this->schedule->command('sync:caldav '.$calendar->calendar_id)->withoutOverlapping(); |
|
| 101 | 101 | if ($event->isDue($this->laravel)) |
| 102 | 102 | $event->run($this->laravel); |
| 103 | 103 | } |
@@ -59,10 +59,11 @@ discard block |
||
| 59 | 59 | { |
| 60 | 60 | // |
| 61 | 61 | $calendarId = $this->argument('calendarId'); |
| 62 | - if (is_numeric($calendarId)) |
|
| 63 | - $this->makeForeground(Caldav::findOrFail($calendarId)); |
|
| 64 | - else |
|
| 65 | - $this->syncAll(); |
|
| 62 | + if (is_numeric($calendarId)) { |
|
| 63 | + $this->makeForeground(Caldav::findOrFail($calendarId)); |
|
| 64 | + } else { |
|
| 65 | + $this->syncAll(); |
|
| 66 | + } |
|
| 66 | 67 | } |
| 67 | 68 | |
| 68 | 69 | /** |
@@ -82,13 +83,15 @@ discard block |
||
| 82 | 83 | if ($this->option('background')) { |
| 83 | 84 | \Log::debug(self::BACKGROUND_MOD_MEX); |
| 84 | 85 | $this->info(self::BACKGROUND_MOD_MEX); |
| 85 | - foreach ($calendars as $calendar) |
|
| 86 | - $this->makeBackground($calendar); |
|
| 86 | + foreach ($calendars as $calendar) { |
|
| 87 | + $this->makeBackground($calendar); |
|
| 88 | + } |
|
| 87 | 89 | \Log::debug(self::BACKGROUND_COMPLETED_MEX); |
| 88 | 90 | $this->info(self::BACKGROUND_COMPLETED_MEX); |
| 89 | - } else |
|
| 90 | - foreach ($calendars as $calendar) |
|
| 91 | + } else { |
|
| 92 | + foreach ($calendars as $calendar) |
|
| 91 | 93 | $this->makeForeground($calendar); |
| 94 | + } |
|
| 92 | 95 | } |
| 93 | 96 | |
| 94 | 97 | /** |
@@ -98,7 +101,8 @@ discard block |
||
| 98 | 101 | private function makeBackground(Caldav $calendar) |
| 99 | 102 | { |
| 100 | 103 | $event = $this->schedule->command('sync:caldav ' . $calendar->calendar_id)->withoutOverlapping(); |
| 101 | - if ($event->isDue($this->laravel)) |
|
| 102 | - $event->run($this->laravel); |
|
| 104 | + if ($event->isDue($this->laravel)) { |
|
| 105 | + $event->run($this->laravel); |
|
| 106 | + } |
|
| 103 | 107 | } |
| 104 | 108 | } |
@@ -43,19 +43,19 @@ discard block |
||
| 43 | 43 | * |
| 44 | 44 | * @var array |
| 45 | 45 | */ |
| 46 | - protected $fillable = ['name', 'email', 'password']; |
|
| 46 | + protected $fillable = [ 'name', 'email', 'password' ]; |
|
| 47 | 47 | |
| 48 | 48 | /** |
| 49 | 49 | * The attributes excluded from the model's JSON form. |
| 50 | 50 | * |
| 51 | 51 | * @var array |
| 52 | 52 | */ |
| 53 | - protected $hidden = ['password', 'remember_token', 'pivot']; |
|
| 53 | + protected $hidden = [ 'password', 'remember_token', 'pivot' ]; |
|
| 54 | 54 | |
| 55 | 55 | /** |
| 56 | 56 | * @var array |
| 57 | 57 | */ |
| 58 | - protected $appends = ['is_planner']; |
|
| 58 | + protected $appends = [ 'is_planner' ]; |
|
| 59 | 59 | |
| 60 | 60 | public function getIsPlannerAttribute() |
| 61 | 61 | { |
@@ -97,16 +97,16 @@ discard block |
||
| 97 | 97 | public function getEmailForPasswordReset() |
| 98 | 98 | { |
| 99 | 99 | list(, $caller) = debug_backtrace(false); |
| 100 | - if (isset($caller['class'])) |
|
| 101 | - $caller = explode('\\', $caller['class']); |
|
| 100 | + if (isset($caller[ 'class' ])) |
|
| 101 | + $caller = explode('\\', $caller[ 'class' ]); |
|
| 102 | 102 | else |
| 103 | 103 | $caller = ''; |
| 104 | 104 | |
| 105 | 105 | //check if this function is called by email sender |
| 106 | - if ((count($caller) && $caller[count($caller) - 1] == 'PasswordBroker') || (defined('HHVM_VERSION') && $caller == '')) |
|
| 106 | + if ((count($caller) && $caller[ count($caller) - 1 ] == 'PasswordBroker') || (defined('HHVM_VERSION') && $caller == '')) |
|
| 107 | 107 | return $this->email; |
| 108 | 108 | //return unique identify for token repository |
| 109 | - return $this->email . $this->company->id; |
|
| 109 | + return $this->email.$this->company->id; |
|
| 110 | 110 | } |
| 111 | 111 | |
| 112 | 112 | /** |
@@ -97,14 +97,16 @@ |
||
| 97 | 97 | public function getEmailForPasswordReset() |
| 98 | 98 | { |
| 99 | 99 | list(, $caller) = debug_backtrace(false); |
| 100 | - if (isset($caller['class'])) |
|
| 101 | - $caller = explode('\\', $caller['class']); |
|
| 102 | - else |
|
| 103 | - $caller = ''; |
|
| 100 | + if (isset($caller['class'])) { |
|
| 101 | + $caller = explode('\\', $caller['class']); |
|
| 102 | + } else { |
|
| 103 | + $caller = ''; |
|
| 104 | + } |
|
| 104 | 105 | |
| 105 | 106 | //check if this function is called by email sender |
| 106 | - if ((count($caller) && $caller[count($caller) - 1] == 'PasswordBroker') || (defined('HHVM_VERSION') && $caller == '')) |
|
| 107 | - return $this->email; |
|
| 107 | + if ((count($caller) && $caller[count($caller) - 1] == 'PasswordBroker') || (defined('HHVM_VERSION') && $caller == '')) { |
|
| 108 | + return $this->email; |
|
| 109 | + } |
|
| 108 | 110 | //return unique identify for token repository |
| 109 | 111 | return $this->email . $this->company->id; |
| 110 | 112 | } |
@@ -31,17 +31,17 @@ |
||
| 31 | 31 | * |
| 32 | 32 | * @var array |
| 33 | 33 | */ |
| 34 | - protected $fillable = ['name', 'description', 'planner_id']; |
|
| 34 | + protected $fillable = [ 'name', 'description', 'planner_id' ]; |
|
| 35 | 35 | |
| 36 | 36 | /** |
| 37 | 37 | * @var array |
| 38 | 38 | */ |
| 39 | - protected $hidden = ['planner', 'pivot']; |
|
| 39 | + protected $hidden = [ 'planner', 'pivot' ]; |
|
| 40 | 40 | |
| 41 | 41 | /** |
| 42 | 42 | * @var array |
| 43 | 43 | */ |
| 44 | - protected $appends = ['planner_name']; |
|
| 44 | + protected $appends = [ 'planner_name' ]; |
|
| 45 | 45 | |
| 46 | 46 | public function getPlannerNameAttribute() |
| 47 | 47 | { |
@@ -45,8 +45,9 @@ |
||
| 45 | 45 | |
| 46 | 46 | public function getPlannerNameAttribute() |
| 47 | 47 | { |
| 48 | - if (is_object($this->planner) && $this->planner->exists) |
|
| 49 | - return $this->planner->name; |
|
| 48 | + if (is_object($this->planner) && $this->planner->exists) { |
|
| 49 | + return $this->planner->name; |
|
| 50 | + } |
|
| 50 | 51 | return null; |
| 51 | 52 | } |
| 52 | 53 | |
@@ -31,7 +31,7 @@ discard block |
||
| 31 | 31 | * cn = company normal |
| 32 | 32 | * @var array |
| 33 | 33 | */ |
| 34 | - protected $custom = ['mode' => 'cn']; |
|
| 34 | + protected $custom = [ 'mode' => 'cn' ]; |
|
| 35 | 35 | |
| 36 | 36 | |
| 37 | 37 | /** |
@@ -40,8 +40,8 @@ discard block |
||
| 40 | 40 | */ |
| 41 | 41 | public function __construct() |
| 42 | 42 | { |
| 43 | - config(['auth.model' => \plunner\Company::class]); |
|
| 44 | - config(['jwt.user' => \plunner\Company::class]); |
|
| 45 | - config(['auth.password.table' => 'password_resets_companies', 'auth.password.email' => 'emails.companies.password']); |
|
| 43 | + config([ 'auth.model' => \plunner\Company::class ]); |
|
| 44 | + config([ 'jwt.user' => \plunner\Company::class ]); |
|
| 45 | + config([ 'auth.password.table' => 'password_resets_companies', 'auth.password.email' => 'emails.companies.password' ]); |
|
| 46 | 46 | } |
| 47 | 47 | } |
@@ -18,8 +18,8 @@ discard block |
||
| 18 | 18 | { |
| 19 | 19 | public function __construct() |
| 20 | 20 | { |
| 21 | - config(['auth.model' => \plunner\Company::class]); |
|
| 22 | - config(['jwt.user' => \plunner\Company::class]); |
|
| 21 | + config([ 'auth.model' => \plunner\Company::class ]); |
|
| 22 | + config([ 'jwt.user' => \plunner\Company::class ]); |
|
| 23 | 23 | $this->middleware('jwt.authandrefresh:mode-cn'); |
| 24 | 24 | } |
| 25 | 25 | |
@@ -50,8 +50,8 @@ discard block |
||
| 50 | 50 | // |
| 51 | 51 | $company = \Auth::user(); |
| 52 | 52 | $input = $request->all(); |
| 53 | - if (isset($input['password'])) |
|
| 54 | - $input['password'] = bcrypt($input['password']); |
|
| 53 | + if (isset($input[ 'password' ])) |
|
| 54 | + $input[ 'password' ] = bcrypt($input[ 'password' ]); |
|
| 55 | 55 | $employee = $company->employees()->create($input); |
| 56 | 56 | return $employee; |
| 57 | 57 | } |
@@ -83,8 +83,8 @@ discard block |
||
| 83 | 83 | $employee = Employee::findOrFail($id); |
| 84 | 84 | $this->authorize($employee); |
| 85 | 85 | $input = $request->all(); |
| 86 | - if (isset($input['password'])) |
|
| 87 | - $input['password'] = bcrypt($input['password']); |
|
| 86 | + if (isset($input[ 'password' ])) |
|
| 87 | + $input[ 'password' ] = bcrypt($input[ 'password' ]); |
|
| 88 | 88 | $employee->update($input); |
| 89 | 89 | return $employee; |
| 90 | 90 | } |
@@ -50,8 +50,9 @@ discard block |
||
| 50 | 50 | // |
| 51 | 51 | $company = \Auth::user(); |
| 52 | 52 | $input = $request->all(); |
| 53 | - if (isset($input['password'])) |
|
| 54 | - $input['password'] = bcrypt($input['password']); |
|
| 53 | + if (isset($input['password'])) { |
|
| 54 | + $input['password'] = bcrypt($input['password']); |
|
| 55 | + } |
|
| 55 | 56 | $employee = $company->employees()->create($input); |
| 56 | 57 | return $employee; |
| 57 | 58 | } |
@@ -83,8 +84,9 @@ discard block |
||
| 83 | 84 | $employee = Employee::findOrFail($id); |
| 84 | 85 | $this->authorize($employee); |
| 85 | 86 | $input = $request->all(); |
| 86 | - if (isset($input['password'])) |
|
| 87 | - $input['password'] = bcrypt($input['password']); |
|
| 87 | + if (isset($input['password'])) { |
|
| 88 | + $input['password'] = bcrypt($input['password']); |
|
| 89 | + } |
|
| 88 | 90 | $employee->update($input); |
| 89 | 91 | return $employee; |
| 90 | 92 | } |
@@ -19,8 +19,8 @@ discard block |
||
| 19 | 19 | { |
| 20 | 20 | public function __construct() |
| 21 | 21 | { |
| 22 | - config(['auth.model' => \plunner\Company::class]); |
|
| 23 | - config(['jwt.user' => \plunner\Company::class]); |
|
| 22 | + config([ 'auth.model' => \plunner\Company::class ]); |
|
| 23 | + config([ 'jwt.user' => \plunner\Company::class ]); |
|
| 24 | 24 | $this->middleware('jwt.authandrefresh:mode-cn'); |
| 25 | 25 | } |
| 26 | 26 | |
@@ -51,7 +51,7 @@ discard block |
||
| 51 | 51 | // |
| 52 | 52 | $group = Group::findOrFail($groupId); |
| 53 | 53 | $this->authorize($group); |
| 54 | - $id = $request->all()['id']; |
|
| 54 | + $id = $request->all()[ 'id' ]; |
|
| 55 | 55 | $group->employees()->attach($id); |
| 56 | 56 | return $group->employees; |
| 57 | 57 | } |
@@ -70,7 +70,7 @@ discard block |
||
| 70 | 70 | $this->authorize($employee); |
| 71 | 71 | $group = Group::findOrFail($groupId); |
| 72 | 72 | if (!$employee->belongsToGroup($group)) |
| 73 | - return Response::json(['error' => 'employId <> groupId'], 404); |
|
| 73 | + return Response::json([ 'error' => 'employId <> groupId' ], 404); |
|
| 74 | 74 | $employee->groups()->detach($groupId); |
| 75 | 75 | return $group->employees; |
| 76 | 76 | } |
@@ -69,8 +69,9 @@ |
||
| 69 | 69 | $employee = Employee::findOrFail($employeeId); |
| 70 | 70 | $this->authorize($employee); |
| 71 | 71 | $group = Group::findOrFail($groupId); |
| 72 | - if (!$employee->belongsToGroup($group)) |
|
| 73 | - return Response::json(['error' => 'employId <> groupId'], 404); |
|
| 72 | + if (!$employee->belongsToGroup($group)) { |
|
| 73 | + return Response::json(['error' => 'employId <> groupId'], 404); |
|
| 74 | + } |
|
| 74 | 75 | $employee->groups()->detach($groupId); |
| 75 | 76 | return $group->employees; |
| 76 | 77 | } |