diff --git a/.env.example b/.env.example index bed60c01..44c0354e 100644 --- a/.env.example +++ b/.env.example @@ -25,13 +25,13 @@ REDIS_HOST=127.0.0.1 REDIS_PASSWORD=null REDIS_PORT=6379 -MAIL_DRIVER=smtp -MAIL_HOST=smtp.mailtrap.io -MAIL_PORT=2525 -MAIL_USERNAME=null -MAIL_PASSWORD=null -MAIL_ENCRYPTION=null -MAIL_FROM_ADDRESS=null +MAIL_DRIVER= +MAIL_HOST= +MAIL_PORT= +MAIL_USERNAME= +MAIL_PASSWORD= +MAIL_ENCRYPTION= +MAIL_FROM_ADDRESS="${MAIL_USERNAME}" MAIL_FROM_NAME="${APP_NAME}" AWS_ACCESS_KEY_ID= diff --git a/app/Http/Controllers/Admin/DashboardController.php b/app/Http/Controllers/Admin/DashboardController.php new file mode 100644 index 00000000..24fb845f --- /dev/null +++ b/app/Http/Controllers/Admin/DashboardController.php @@ -0,0 +1,56 @@ +stripe = $stripe; + } + + public function index() + { + // Get total users + $total_users = User::all()->count(); + + // Get total used space + $total_used_space = FileManagerFile::all()->map(function ($item) { + return (int)$item->getRawOriginal('filesize'); + })->sum(); + + // Get total premium users + $total_premium_users = Subscription::where('stripe_status', 'active')->get()->count(); + + return [ + 'app_version' => config('vuefilemanager.version'), + 'total_users' => $total_users, + 'total_used_space' => Metric::bytes($total_used_space)->format(), + 'total_premium_users' => $total_premium_users, + ]; + } + + /** + * Get the newest users + * + * @return UsersCollection + */ + public function new_registrations() + { + return new UsersCollection( + User::take(5)->orderByDesc('created_at')->get() + ); + } +} diff --git a/app/Http/Controllers/Admin/GatewayController.php b/app/Http/Controllers/Admin/GatewayController.php deleted file mode 100644 index 4ff9852a..00000000 --- a/app/Http/Controllers/Admin/GatewayController.php +++ /dev/null @@ -1,69 +0,0 @@ -firstOrFail(); - - return new GatewayResource($gateway); - } - - /** - * Get single payment gateway by slug - * - * @param $slug - * @return InvoiceCollection - */ - public function show_transactions($slug) - { - return new InvoiceCollection( - Invoice::where('provider', $slug)->get() - ); - } - - /** - * Update payment gateway options - * - * @param Request $request - * @param $slug - * @return \Illuminate\Contracts\Routing\ResponseFactory|\Illuminate\Http\Response - */ - public function update(Request $request, $slug) - { - // TODO: validation request - - $gateway = PaymentGateway::where('slug', $slug)->first(); - - // Update text data - $gateway->update(make_single_input($request)); - - return response('Saved!', 204); - } -} diff --git a/app/Http/Controllers/Admin/PlanController.php b/app/Http/Controllers/Admin/PlanController.php index f6bc8780..e0c819a6 100644 --- a/app/Http/Controllers/Admin/PlanController.php +++ b/app/Http/Controllers/Admin/PlanController.php @@ -12,6 +12,7 @@ use App\Services\StripeService; use App\User; use Illuminate\Http\Request; use Illuminate\Support\Facades\Cache; +use Laravel\Cashier\Subscription; use Rinvex\Subscriptions\Models\PlanFeature; class PlanController extends Controller @@ -126,10 +127,7 @@ class PlanController extends Controller */ public function subscribers($id) { - $subscribers = app('rinvex.subscriptions.plan') - ->find($id) - ->subscriptions - ->pluck('user_id'); + $subscribers = Subscription::where('stripe_plan', $id)->pluck('user_id'); return new UsersCollection( User::findMany($subscribers) diff --git a/app/Http/Controllers/General/SetupWizardController.php b/app/Http/Controllers/General/SetupWizardController.php index a51c84e7..4151b23c 100644 --- a/app/Http/Controllers/General/SetupWizardController.php +++ b/app/Http/Controllers/General/SetupWizardController.php @@ -106,7 +106,7 @@ class SetupWizardController extends Controller // Store database credentials $database_credentials->each(function ($col) { - $this->setEnvironmentValue($col['name'], $col['value']); + setEnvironmentValue($col['name'], $col['value']); }); // Set database connection @@ -161,8 +161,8 @@ class SetupWizardController extends Controller $client = \DB::table('oauth_clients')->where('name', '=', 'vuefilemanager')->first(); // Set passport client to .env - $this->setEnvironmentValue('PASSPORT_CLIENT_ID', $client->id); - $this->setEnvironmentValue('PASSPORT_CLIENT_SECRET', $client->secret); + setEnvironmentValue('PASSPORT_CLIENT_ID', $client->id); + setEnvironmentValue('PASSPORT_CLIENT_SECRET', $client->secret); // Clear cache Artisan::call('config:clear'); @@ -208,19 +208,13 @@ class SetupWizardController extends Controller ]); // Set stripe credentials to .env - $this->setEnvironmentValue('CASHIER_CURRENCY', $request->currency); - $this->setEnvironmentValue('STRIPE_KEY', $request->key); - $this->setEnvironmentValue('STRIPE_SECRET', $request->secret); - $this->setEnvironmentValue('STRIPE_WEBHOOK_SECRET', $request->webhookSecret); - - // Store options - $settings->each(function ($col) { - Setting::updateOrCreate(['name' => $col['name']], $col); - }); + setEnvironmentValue('CASHIER_CURRENCY', $request->currency); + setEnvironmentValue('STRIPE_KEY', $request->key); + setEnvironmentValue('STRIPE_SECRET', $request->secret); + setEnvironmentValue('STRIPE_WEBHOOK_SECRET', $request->webhookSecret); // Clear cache Artisan::call('config:clear'); - //Artisan::call('config:cache'); return response('Done', 200); } @@ -427,7 +421,7 @@ class SetupWizardController extends Controller // Store storage driver options $storage->each(function ($col) { - $this->setEnvironmentValue($col['name'], $col['value']); + setEnvironmentValue($col['name'], $col['value']); }); // Get options @@ -460,12 +454,11 @@ class SetupWizardController extends Controller // Store mail options $mail->each(function ($col) { - $this->setEnvironmentValue($col['name'], $col['value']); + setEnvironmentValue($col['name'], $col['value']); }); // Clear cache Artisan::call('config:clear'); - //Artisan::call('config:cache'); return response('Done', 200); } @@ -545,10 +538,12 @@ class SetupWizardController extends Controller { // Validate request $request->validate([ - 'email' => 'required|string|email|unique:users', - 'password' => 'required|string|min:6|confirmed', - 'name' => 'required|string', - 'avatar' => 'sometimes|file', + 'email' => 'required|string|email|unique:users', + 'password' => 'required|string|min:6|confirmed', + 'name' => 'required|string', + 'purchase_code' => 'required|string', + 'license' => 'required|string', + 'avatar' => 'sometimes|file', ]); // Store avatar @@ -580,6 +575,18 @@ class SetupWizardController extends Controller 'value' => 1, ]); + // Store License + Setting::create([ + 'name' => 'license', + 'value' => $request->license, + ]); + + // Store Purchase Code + Setting::create([ + 'name' => 'license', + 'value' => $request->purchase_code, + ]); + // Retrieve access token $response = Route::dispatch(self::make_login_request($request)); @@ -613,23 +620,4 @@ class SetupWizardController extends Controller return Request::create(url('/oauth/token'), 'POST', $request->all()); } - - /** - * Set environment value - * - * @param $key - * @param $value - */ - public function setEnvironmentValue($key, $value) - { - $env_path = app()->environmentFilePath(); - - $escaped = preg_quote('=' . env($key), '/'); - - file_put_contents($env_path, preg_replace( - "/^{$key}{$escaped}/m", - $key . '=' . $value, - file_get_contents($env_path) - )); - } } diff --git a/app/Http/Controllers/SettingController.php b/app/Http/Controllers/SettingController.php index 74fb34e4..e369b50e 100644 --- a/app/Http/Controllers/SettingController.php +++ b/app/Http/Controllers/SettingController.php @@ -3,83 +3,105 @@ namespace App\Http\Controllers; use App\Setting; +use Artisan; use Illuminate\Http\Request; class SettingController extends Controller { /** - * Display a listing of the resource. + * Get table content * - * @return \Illuminate\Http\Response + * @param Request $request + * @return mixed */ - public function index() - { - // - } + public function show(Request $request) { - /** - * Show the form for creating a new resource. - * - * @return \Illuminate\Http\Response - */ - public function create() - { - // - } + $column = $request->get('column'); - /** - * Store a newly created resource in storage. - * - * @param \Illuminate\Http\Request $request - * @return \Illuminate\Http\Response - */ - public function store(Request $request) - { - // - } + if (strpos($column, '|') !== false) { - /** - * Display the specified resource. - * - * @param \App\Setting $setting - * @return \Illuminate\Http\Response - */ - public function show(Setting $setting) - { - // - } + $columns = explode('|', $column); - /** - * Show the form for editing the specified resource. - * - * @param \App\Setting $setting - * @return \Illuminate\Http\Response - */ - public function edit(Setting $setting) - { - // + return Setting::whereIn('name', $columns)->pluck('value', 'name'); + } + + return Setting::where('name', $column)->pluck('value', 'name'); } /** * Update the specified resource in storage. * - * @param \Illuminate\Http\Request $request - * @param \App\Setting $setting + * @param \Illuminate\Http\Request $request * @return \Illuminate\Http\Response */ - public function update(Request $request, Setting $setting) + public function update(Request $request) { - // + // Store image if exist + if ($request->hasFile($request->name)) { + + // Store image + $image_path = store_system_image($request->file($request->name), 'system'); + + // Find and update image path + Setting::updateOrCreate(['name' => $request->name], [ + 'value' => $image_path + ]); + + return response('Done', 204); + } + + // Find and update variable + Setting::updateOrCreate(['name' => $request->name], [ + 'value' => $request->value + ]); + + return response('Done', 204); } /** - * Remove the specified resource from storage. + * Set new email credentials to .env file * - * @param \App\Setting $setting - * @return \Illuminate\Http\Response + * @param Request $request + * @return \Illuminate\Contracts\Routing\ResponseFactory|\Illuminate\Http\Response */ - public function destroy(Setting $setting) - { - // + public function set_email(Request $request) { + + // Get options + $mail = collect([ + [ + 'name' => 'MAIL_DRIVER', + 'value' => $request->input('driver'), + ], + [ + 'name' => 'MAIL_HOST', + 'value' => $request->input('host'), + ], + [ + 'name' => 'MAIL_PORT', + 'value' => $request->input('port'), + ], + [ + 'name' => 'MAIL_USERNAME', + 'value' => $request->input('username'), + ], + [ + 'name' => 'MAIL_PASSWORD', + 'value' => $request->input('password'), + ], + [ + 'name' => 'MAIL_ENCRYPTION', + 'value' => $request->input('encryption'), + ], + ]); + + // Store mail options + $mail->each(function ($col) { + setEnvironmentValue($col['name'], $col['value']); + }); + + // Clear cache + Artisan::call('config:clear'); + + return response('Done', 204); } } diff --git a/app/Http/Helpers/helpers.php b/app/Http/Helpers/helpers.php index e29eb118..8c433c1c 100644 --- a/app/Http/Helpers/helpers.php +++ b/app/Http/Helpers/helpers.php @@ -6,11 +6,29 @@ use App\Share; use ByteUnits\Metric; use Carbon\Carbon; use Illuminate\Database\Eloquent\Model; -use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Storage; use Illuminate\Support\Str; use Intervention\Image\ImageManagerStatic as Image; +/** + * Set environment value + * + * @param $key + * @param $value + */ +function setEnvironmentValue($key, $value) +{ + $env_path = app()->environmentFilePath(); + + $escaped = preg_quote('=' . env($key), '/'); + + file_put_contents($env_path, preg_replace( + "/^{$key}{$escaped}/m", + $key . '=' . $value, + file_get_contents($env_path) + )); +} + /** * Get invoice number * @@ -27,6 +45,10 @@ function get_invoice_number() } } +/** + * Forget many cache keys at once + * @param $cache + */ function cache_forget_many($cache) { foreach ($cache as $item) { diff --git a/app/Http/Resources/InvoiceAdminResource.php b/app/Http/Resources/InvoiceAdminResource.php index 3dc232d5..3ddb775e 100644 --- a/app/Http/Resources/InvoiceAdminResource.php +++ b/app/Http/Resources/InvoiceAdminResource.php @@ -52,8 +52,8 @@ class InvoiceAdminResource extends JsonResource 'id' => (string)$user->id, 'type' => 'user', 'attributes' => [ - 'name' => $user->name, - 'avatar' => $user->avatar, + 'name' => $user->name, + 'avatar' => $user->avatar, ] ] ] diff --git a/app/Http/Resources/InvoiceResource.php b/app/Http/Resources/InvoiceResource.php index 8cce4286..c0c83fa5 100644 --- a/app/Http/Resources/InvoiceResource.php +++ b/app/Http/Resources/InvoiceResource.php @@ -26,7 +26,7 @@ class InvoiceResource extends JsonResource 'customer' => $this->customer, 'total' => $this->total(), 'currency' => $this->currency, - 'created_at_formatted' => format_date($this->date()), + 'created_at_formatted' => format_date($this->date(), '%d. %B. %Y'), 'created_at' => $this->created, 'order' => $this->number, 'user_id' => $user ? $user->id : null, diff --git a/app/Http/Resources/PlanResource.php b/app/Http/Resources/PlanResource.php index 03b7bb22..0abbfc43 100644 --- a/app/Http/Resources/PlanResource.php +++ b/app/Http/Resources/PlanResource.php @@ -3,6 +3,8 @@ namespace App\Http\Resources; use Illuminate\Http\Resources\Json\JsonResource; +use Laravel\Cashier\Cashier; +use Laravel\Cashier\Subscription; class PlanResource extends JsonResource { @@ -14,18 +16,22 @@ class PlanResource extends JsonResource */ public function toArray($request) { + // Get subscribers + $subscriber_count = Subscription::where('stripe_plan', $this['plan']['id'])->get(); + return [ 'data' => [ 'id' => $this['plan']['id'], 'type' => 'plans', 'attributes' => [ - 'subscribers' => $this['plan']['aggregate_usage'], - 'status' => $this['plan']['active'], + 'subscribers' => $subscriber_count->count(), + 'status' => $this['plan']['active'] ? 1 : 0, 'name' => $this['product']['name'], 'description' => $this['product']['description'], 'price' => $this['plan']['amount'], + 'price_formatted' => Cashier::formatAmount($this['plan']['amount']), 'capacity_formatted' => format_gigabytes($this['product']['metadata']['capacity']), - 'capacity' => $this['product']['metadata']['capacity'], + 'capacity' => (int) $this['product']['metadata']['capacity'], 'created_at_formatted' => format_date($this['plan']['created']), 'created_at' => $this['plan']['created'], ] diff --git a/config/vuefilemanager.php b/config/vuefilemanager.php index a3407e7d..fc763067 100644 --- a/config/vuefilemanager.php +++ b/config/vuefilemanager.php @@ -2,17 +2,5 @@ return [ - 'version' => '1.6.3', - - // Your app name - 'app_name' => 'VueFileManager', - - // Your app logo - 'app_logo' => '/assets/images/hero.svg', - - // Enable or disable user account registration - 'registration' => true, - - // Limit your storage size for every user if this option is enabled - 'limit_storage_by_capacity' => true, + 'version' => '1.7', ]; \ No newline at end of file diff --git a/public/mix-manifest.json b/public/mix-manifest.json index 0c142982..e9e9a0f9 100644 --- a/public/mix-manifest.json +++ b/public/mix-manifest.json @@ -228,5 +228,383 @@ "/js/main.0cf8831e92ff6f5a1027.hot-update.js": "/js/main.0cf8831e92ff6f5a1027.hot-update.js", "/js/main.5cbee996e80957a738f2.hot-update.js": "/js/main.5cbee996e80957a738f2.hot-update.js", "/js/main.9a24bd7a75a877705d40.hot-update.js": "/js/main.9a24bd7a75a877705d40.hot-update.js", - "/js/main.2ecd9a546308a5bb528a.hot-update.js": "/js/main.2ecd9a546308a5bb528a.hot-update.js" + "/js/main.2ecd9a546308a5bb528a.hot-update.js": "/js/main.2ecd9a546308a5bb528a.hot-update.js", + "/js/main.a9aeb4df0e09a70f4ec8.hot-update.js": "/js/main.a9aeb4df0e09a70f4ec8.hot-update.js", + "/js/main.9bf7aa6441ae107090d4.hot-update.js": "/js/main.9bf7aa6441ae107090d4.hot-update.js", + "/js/main.0daba0063cb5697dc767.hot-update.js": "/js/main.0daba0063cb5697dc767.hot-update.js", + "/js/main.31f05dfd2001129a8fc5.hot-update.js": "/js/main.31f05dfd2001129a8fc5.hot-update.js", + "/js/main.d2b72f113673d28f3c59.hot-update.js": "/js/main.d2b72f113673d28f3c59.hot-update.js", + "/js/main.073817fa2426387d3745.hot-update.js": "/js/main.073817fa2426387d3745.hot-update.js", + "/js/main.37ac8a311fc1087fcc2f.hot-update.js": "/js/main.37ac8a311fc1087fcc2f.hot-update.js", + "/js/main.2bde9f71b5d8131f5928.hot-update.js": "/js/main.2bde9f71b5d8131f5928.hot-update.js", + "/js/main.9df8ef628601cef7a6a5.hot-update.js": "/js/main.9df8ef628601cef7a6a5.hot-update.js", + "/js/main.ca4251328bc4169dd5f6.hot-update.js": "/js/main.ca4251328bc4169dd5f6.hot-update.js", + "/js/main.5761e22b5dc8194b04c7.hot-update.js": "/js/main.5761e22b5dc8194b04c7.hot-update.js", + "/js/main.cab7cbeb3d5d492f39ba.hot-update.js": "/js/main.cab7cbeb3d5d492f39ba.hot-update.js", + "/js/main.726f3d68977a95d4e90e.hot-update.js": "/js/main.726f3d68977a95d4e90e.hot-update.js", + "/js/main.243884a8a7e3a13794a7.hot-update.js": "/js/main.243884a8a7e3a13794a7.hot-update.js", + "/js/main.b363f9fe306c90d3bea9.hot-update.js": "/js/main.b363f9fe306c90d3bea9.hot-update.js", + "/js/main.df63396c1532271c6de1.hot-update.js": "/js/main.df63396c1532271c6de1.hot-update.js", + "/js/main.1f2f6ae9328a61a32c9b.hot-update.js": "/js/main.1f2f6ae9328a61a32c9b.hot-update.js", + "/js/main.0bd8c23a58693130fc17.hot-update.js": "/js/main.0bd8c23a58693130fc17.hot-update.js", + "/js/main.ee79e38ff92d0f742d6e.hot-update.js": "/js/main.ee79e38ff92d0f742d6e.hot-update.js", + "/js/main.517d46a9db04a7db47d3.hot-update.js": "/js/main.517d46a9db04a7db47d3.hot-update.js", + "/js/main.b441e4a6d755a50477a7.hot-update.js": "/js/main.b441e4a6d755a50477a7.hot-update.js", + "/js/main.63531cfb10cfff9d4271.hot-update.js": "/js/main.63531cfb10cfff9d4271.hot-update.js", + "/js/main.2df58097c81bcc54d255.hot-update.js": "/js/main.2df58097c81bcc54d255.hot-update.js", + "/js/main.9e088bfaa8eb3387988a.hot-update.js": "/js/main.9e088bfaa8eb3387988a.hot-update.js", + "/js/main.44a7ebb3f583b95cf504.hot-update.js": "/js/main.44a7ebb3f583b95cf504.hot-update.js", + "/js/main.b6d9dd61120dc4dd5137.hot-update.js": "/js/main.b6d9dd61120dc4dd5137.hot-update.js", + "/js/main.b47af3291ecd700d363a.hot-update.js": "/js/main.b47af3291ecd700d363a.hot-update.js", + "/js/main.731736cf111ded41ca59.hot-update.js": "/js/main.731736cf111ded41ca59.hot-update.js", + "/js/main.8821e3435181c45a4efe.hot-update.js": "/js/main.8821e3435181c45a4efe.hot-update.js", + "/js/main.20979fe3d1769ef98369.hot-update.js": "/js/main.20979fe3d1769ef98369.hot-update.js", + "/js/main.2ffc183bac24a4613d5b.hot-update.js": "/js/main.2ffc183bac24a4613d5b.hot-update.js", + "/js/main.1e6f3de193e1eb41e3f8.hot-update.js": "/js/main.1e6f3de193e1eb41e3f8.hot-update.js", + "/js/main.250e55b4bc88222cf2bd.hot-update.js": "/js/main.250e55b4bc88222cf2bd.hot-update.js", + "/js/main.05b9cad5fcae320220cf.hot-update.js": "/js/main.05b9cad5fcae320220cf.hot-update.js", + "/js/main.70fe96e65497d24ada87.hot-update.js": "/js/main.70fe96e65497d24ada87.hot-update.js", + "/js/main.2d0692b8d1b139678ea5.hot-update.js": "/js/main.2d0692b8d1b139678ea5.hot-update.js", + "/js/main.ccaed9fac1fa6686e62d.hot-update.js": "/js/main.ccaed9fac1fa6686e62d.hot-update.js", + "/js/main.59812fdf3d8df2071110.hot-update.js": "/js/main.59812fdf3d8df2071110.hot-update.js", + "/js/main.ede87598deed0a8c2062.hot-update.js": "/js/main.ede87598deed0a8c2062.hot-update.js", + "/js/main.58751759a25668b5b807.hot-update.js": "/js/main.58751759a25668b5b807.hot-update.js", + "/js/main.965475f49f9a23fc8920.hot-update.js": "/js/main.965475f49f9a23fc8920.hot-update.js", + "/js/main.fd25a0ff5e4fdedd17dd.hot-update.js": "/js/main.fd25a0ff5e4fdedd17dd.hot-update.js", + "/js/main.da72a2d3a9ec9eaad632.hot-update.js": "/js/main.da72a2d3a9ec9eaad632.hot-update.js", + "/js/main.39754f4a16f1a7c40ad3.hot-update.js": "/js/main.39754f4a16f1a7c40ad3.hot-update.js", + "/js/main.6108877fbeecf1a314d3.hot-update.js": "/js/main.6108877fbeecf1a314d3.hot-update.js", + "/js/main.a420126064791edbc6bd.hot-update.js": "/js/main.a420126064791edbc6bd.hot-update.js", + "/js/main.7dd34dcba41c61c93874.hot-update.js": "/js/main.7dd34dcba41c61c93874.hot-update.js", + "/js/main.ee22470c79de439cb17a.hot-update.js": "/js/main.ee22470c79de439cb17a.hot-update.js", + "/js/main.b20467e29f72f2c2a43a.hot-update.js": "/js/main.b20467e29f72f2c2a43a.hot-update.js", + "/js/main.74ed66a1e6e61a59c726.hot-update.js": "/js/main.74ed66a1e6e61a59c726.hot-update.js", + "/js/main.1b35cacb98ad335dc603.hot-update.js": "/js/main.1b35cacb98ad335dc603.hot-update.js", + "/js/main.e2d923caede2fd0e9ee9.hot-update.js": "/js/main.e2d923caede2fd0e9ee9.hot-update.js", + "/js/main.f053c756cb426a7f7f02.hot-update.js": "/js/main.f053c756cb426a7f7f02.hot-update.js", + "/js/main.0d9bc815c8955418e14d.hot-update.js": "/js/main.0d9bc815c8955418e14d.hot-update.js", + "/js/main.212f10ad9990506452bc.hot-update.js": "/js/main.212f10ad9990506452bc.hot-update.js", + "/js/main.13e6dae0d08658ab17da.hot-update.js": "/js/main.13e6dae0d08658ab17da.hot-update.js", + "/js/main.88b4ad3f37f9b1774047.hot-update.js": "/js/main.88b4ad3f37f9b1774047.hot-update.js", + "/js/main.c9b6d032281c78b8413f.hot-update.js": "/js/main.c9b6d032281c78b8413f.hot-update.js", + "/js/main.99443545526048f4cc53.hot-update.js": "/js/main.99443545526048f4cc53.hot-update.js", + "/js/main.a986fccabd91fafa8902.hot-update.js": "/js/main.a986fccabd91fafa8902.hot-update.js", + "/js/main.9c7aa8d3304c04a09c22.hot-update.js": "/js/main.9c7aa8d3304c04a09c22.hot-update.js", + "/js/main.d8a9103a7a6400055308.hot-update.js": "/js/main.d8a9103a7a6400055308.hot-update.js", + "/js/main.6adfb10ae4c11c2c4870.hot-update.js": "/js/main.6adfb10ae4c11c2c4870.hot-update.js", + "/js/main.a36325466e8b00e7b615.hot-update.js": "/js/main.a36325466e8b00e7b615.hot-update.js", + "/js/main.33d6d9af87dab520be16.hot-update.js": "/js/main.33d6d9af87dab520be16.hot-update.js", + "/js/main.df8a6030831d5c6fc7ed.hot-update.js": "/js/main.df8a6030831d5c6fc7ed.hot-update.js", + "/js/main.43e2677447332829f8cf.hot-update.js": "/js/main.43e2677447332829f8cf.hot-update.js", + "/js/main.c50fe1ffc43419a8e371.hot-update.js": "/js/main.c50fe1ffc43419a8e371.hot-update.js", + "/js/main.90bf9b653edbc8c036b4.hot-update.js": "/js/main.90bf9b653edbc8c036b4.hot-update.js", + "/js/main.f487dd6abb989d2be7f5.hot-update.js": "/js/main.f487dd6abb989d2be7f5.hot-update.js", + "/js/main.be807354d256e90aaa4a.hot-update.js": "/js/main.be807354d256e90aaa4a.hot-update.js", + "/js/main.6edb2b0bd968e3732628.hot-update.js": "/js/main.6edb2b0bd968e3732628.hot-update.js", + "/js/main.da00b20ca4885ff4ac09.hot-update.js": "/js/main.da00b20ca4885ff4ac09.hot-update.js", + "/js/main.7c05a3f75b8d0fd3d7a1.hot-update.js": "/js/main.7c05a3f75b8d0fd3d7a1.hot-update.js", + "/js/main.ab38426d3250e1622830.hot-update.js": "/js/main.ab38426d3250e1622830.hot-update.js", + "/js/main.9d0f2dbd79d7b103684d.hot-update.js": "/js/main.9d0f2dbd79d7b103684d.hot-update.js", + "/js/main.b76c61916ae29b6be638.hot-update.js": "/js/main.b76c61916ae29b6be638.hot-update.js", + "/js/main.0bd7da88f8de2ae7f5de.hot-update.js": "/js/main.0bd7da88f8de2ae7f5de.hot-update.js", + "/js/main.37d310f86266f8e2f8af.hot-update.js": "/js/main.37d310f86266f8e2f8af.hot-update.js", + "/js/main.3d92d7ffe2cb83e6438c.hot-update.js": "/js/main.3d92d7ffe2cb83e6438c.hot-update.js", + "/js/main.04244bb60dc1e20dc4c4.hot-update.js": "/js/main.04244bb60dc1e20dc4c4.hot-update.js", + "/js/main.0b94fa8596095bdee261.hot-update.js": "/js/main.0b94fa8596095bdee261.hot-update.js", + "/js/main.e57b173b91990862814a.hot-update.js": "/js/main.e57b173b91990862814a.hot-update.js", + "/js/main.1251088060e2a88fffc3.hot-update.js": "/js/main.1251088060e2a88fffc3.hot-update.js", + "/js/main.96fed4906621b3f94187.hot-update.js": "/js/main.96fed4906621b3f94187.hot-update.js", + "/js/main.fee3081c0b7fffc5f769.hot-update.js": "/js/main.fee3081c0b7fffc5f769.hot-update.js", + "/js/main.c3d6a61bb34165a6b384.hot-update.js": "/js/main.c3d6a61bb34165a6b384.hot-update.js", + "/js/main.df82c14cac779d7006fc.hot-update.js": "/js/main.df82c14cac779d7006fc.hot-update.js", + "/js/main.2d4a45fe1b581c9a7beb.hot-update.js": "/js/main.2d4a45fe1b581c9a7beb.hot-update.js", + "/js/main.6481aa4922d9b76d954c.hot-update.js": "/js/main.6481aa4922d9b76d954c.hot-update.js", + "/js/main.27079245b2bf0120760c.hot-update.js": "/js/main.27079245b2bf0120760c.hot-update.js", + "/js/main.29a09d3256e19a9ceb69.hot-update.js": "/js/main.29a09d3256e19a9ceb69.hot-update.js", + "/js/main.d74598876b29288d6407.hot-update.js": "/js/main.d74598876b29288d6407.hot-update.js", + "/js/main.9bb1e42907e84c4449be.hot-update.js": "/js/main.9bb1e42907e84c4449be.hot-update.js", + "/js/main.62b41bc71640b74b4aa8.hot-update.js": "/js/main.62b41bc71640b74b4aa8.hot-update.js", + "/js/main.17305704d03c324dd8a9.hot-update.js": "/js/main.17305704d03c324dd8a9.hot-update.js", + "/js/main.6e2eff04c81d033b5900.hot-update.js": "/js/main.6e2eff04c81d033b5900.hot-update.js", + "/js/main.fde14e611bd080c04359.hot-update.js": "/js/main.fde14e611bd080c04359.hot-update.js", + "/js/main.f3d1b5f18cb8b280c8a8.hot-update.js": "/js/main.f3d1b5f18cb8b280c8a8.hot-update.js", + "/js/main.ee62b7df7093e451084d.hot-update.js": "/js/main.ee62b7df7093e451084d.hot-update.js", + "/js/main.cdb73ff90d532b4912c7.hot-update.js": "/js/main.cdb73ff90d532b4912c7.hot-update.js", + "/js/main.bf9c690516f80e14267a.hot-update.js": "/js/main.bf9c690516f80e14267a.hot-update.js", + "/js/main.a781a04264a7c7ee8662.hot-update.js": "/js/main.a781a04264a7c7ee8662.hot-update.js", + "/js/main.c32ae81891394df8966c.hot-update.js": "/js/main.c32ae81891394df8966c.hot-update.js", + "/js/main.87376cc90c6422487ef5.hot-update.js": "/js/main.87376cc90c6422487ef5.hot-update.js", + "/js/main.9c15ba958d6f151718e5.hot-update.js": "/js/main.9c15ba958d6f151718e5.hot-update.js", + "/js/main.ca11d0d3e7e6548db463.hot-update.js": "/js/main.ca11d0d3e7e6548db463.hot-update.js", + "/js/main.c0ebe1c24d0f3b200d14.hot-update.js": "/js/main.c0ebe1c24d0f3b200d14.hot-update.js", + "/js/main.2f74177767e6040ca80b.hot-update.js": "/js/main.2f74177767e6040ca80b.hot-update.js", + "/js/main.55d7ec43b99bba0bfcd3.hot-update.js": "/js/main.55d7ec43b99bba0bfcd3.hot-update.js", + "/js/main.d128d1383b2c1a38ce93.hot-update.js": "/js/main.d128d1383b2c1a38ce93.hot-update.js", + "/js/main.5540a8eeb4b79f986c32.hot-update.js": "/js/main.5540a8eeb4b79f986c32.hot-update.js", + "/js/main.ea864bbc020706b3771c.hot-update.js": "/js/main.ea864bbc020706b3771c.hot-update.js", + "/js/main.def370fcc6f9538dbbda.hot-update.js": "/js/main.def370fcc6f9538dbbda.hot-update.js", + "/js/main.2d3cf541ccb2fc9e0e85.hot-update.js": "/js/main.2d3cf541ccb2fc9e0e85.hot-update.js", + "/js/main.afd20da200abbc8c6a08.hot-update.js": "/js/main.afd20da200abbc8c6a08.hot-update.js", + "/js/main.4804fb86e21f548250aa.hot-update.js": "/js/main.4804fb86e21f548250aa.hot-update.js", + "/js/main.6d5b3e87bc0b7e673517.hot-update.js": "/js/main.6d5b3e87bc0b7e673517.hot-update.js", + "/js/main.9a017e2922144c301988.hot-update.js": "/js/main.9a017e2922144c301988.hot-update.js", + "/js/main.5a106890cb5905af701a.hot-update.js": "/js/main.5a106890cb5905af701a.hot-update.js", + "/js/main.dea9c33e910b52cead09.hot-update.js": "/js/main.dea9c33e910b52cead09.hot-update.js", + "/js/main.4224f9a6ac1fe049fd37.hot-update.js": "/js/main.4224f9a6ac1fe049fd37.hot-update.js", + "/js/main.38f268c3a71eab9ce5bc.hot-update.js": "/js/main.38f268c3a71eab9ce5bc.hot-update.js", + "/js/main.0d4e180970ec3c4d45ec.hot-update.js": "/js/main.0d4e180970ec3c4d45ec.hot-update.js", + "/js/main.693e4a862910aaed3aac.hot-update.js": "/js/main.693e4a862910aaed3aac.hot-update.js", + "/js/main.7804b447fa1b91b1a80a.hot-update.js": "/js/main.7804b447fa1b91b1a80a.hot-update.js", + "/js/main.5f90346563b3ff5220fb.hot-update.js": "/js/main.5f90346563b3ff5220fb.hot-update.js", + "/js/main.d656e96b2908c4f503ee.hot-update.js": "/js/main.d656e96b2908c4f503ee.hot-update.js", + "/js/main.2e8f76f47f727a693d5b.hot-update.js": "/js/main.2e8f76f47f727a693d5b.hot-update.js", + "/js/main.37480ef5f8e61c14783d.hot-update.js": "/js/main.37480ef5f8e61c14783d.hot-update.js", + "/js/main.193421983c10faf9d145.hot-update.js": "/js/main.193421983c10faf9d145.hot-update.js", + "/js/main.8fd708f023b6acf486d3.hot-update.js": "/js/main.8fd708f023b6acf486d3.hot-update.js", + "/js/main.5bd9a89dc494d93da831.hot-update.js": "/js/main.5bd9a89dc494d93da831.hot-update.js", + "/js/main.6847a02e533ad6446e5c.hot-update.js": "/js/main.6847a02e533ad6446e5c.hot-update.js", + "/js/main.5790aab9e27dc5b99581.hot-update.js": "/js/main.5790aab9e27dc5b99581.hot-update.js", + "/js/main.9cbed327a373f7d8d699.hot-update.js": "/js/main.9cbed327a373f7d8d699.hot-update.js", + "/js/main.3cb0bdf506f18b7160f7.hot-update.js": "/js/main.3cb0bdf506f18b7160f7.hot-update.js", + "/js/main.9bd00e48a8662f61e1e4.hot-update.js": "/js/main.9bd00e48a8662f61e1e4.hot-update.js", + "/js/main.b3f92e8fb2e0634a415b.hot-update.js": "/js/main.b3f92e8fb2e0634a415b.hot-update.js", + "/js/main.0c2ae430c9e9794d30b1.hot-update.js": "/js/main.0c2ae430c9e9794d30b1.hot-update.js", + "/js/main.cae8e58f9def02d6856e.hot-update.js": "/js/main.cae8e58f9def02d6856e.hot-update.js", + "/js/main.1e975719c8e6293673c7.hot-update.js": "/js/main.1e975719c8e6293673c7.hot-update.js", + "/js/main.f2766ac3b40405939464.hot-update.js": "/js/main.f2766ac3b40405939464.hot-update.js", + "/js/main.9112a25dbcbbb65def79.hot-update.js": "/js/main.9112a25dbcbbb65def79.hot-update.js", + "/js/main.a1a839083b9b0af30fcb.hot-update.js": "/js/main.a1a839083b9b0af30fcb.hot-update.js", + "/js/main.39e716c80acd5a7264b8.hot-update.js": "/js/main.39e716c80acd5a7264b8.hot-update.js", + "/js/main.50270c3093d1b3ca22b0.hot-update.js": "/js/main.50270c3093d1b3ca22b0.hot-update.js", + "/js/main.ef196bbfccb5f8b66167.hot-update.js": "/js/main.ef196bbfccb5f8b66167.hot-update.js", + "/js/main.5ca3431d17a903e5dae4.hot-update.js": "/js/main.5ca3431d17a903e5dae4.hot-update.js", + "/js/main.ac8b2be1c1abcc0327dc.hot-update.js": "/js/main.ac8b2be1c1abcc0327dc.hot-update.js", + "/js/main.06e4b8a06af109921c82.hot-update.js": "/js/main.06e4b8a06af109921c82.hot-update.js", + "/js/main.9baa3c23f69a94e0b5ad.hot-update.js": "/js/main.9baa3c23f69a94e0b5ad.hot-update.js", + "/js/main.5822ef64e54b9209de83.hot-update.js": "/js/main.5822ef64e54b9209de83.hot-update.js", + "/js/main.213d947cbcc3f0ddabe2.hot-update.js": "/js/main.213d947cbcc3f0ddabe2.hot-update.js", + "/js/main.e6eb49612e52d6f68fa5.hot-update.js": "/js/main.e6eb49612e52d6f68fa5.hot-update.js", + "/js/main.06a6d9087f92ba28396f.hot-update.js": "/js/main.06a6d9087f92ba28396f.hot-update.js", + "/js/main.5ab6617ebf4ac899b12a.hot-update.js": "/js/main.5ab6617ebf4ac899b12a.hot-update.js", + "/js/main.6ad11678d55922bb484d.hot-update.js": "/js/main.6ad11678d55922bb484d.hot-update.js", + "/js/main.a3f8b0e0ceef8ef3b710.hot-update.js": "/js/main.a3f8b0e0ceef8ef3b710.hot-update.js", + "/js/main.1cc5c4295c61f0856f9d.hot-update.js": "/js/main.1cc5c4295c61f0856f9d.hot-update.js", + "/js/main.c665b5fc70a69f41abe4.hot-update.js": "/js/main.c665b5fc70a69f41abe4.hot-update.js", + "/js/main.293834e2b76a7f705b38.hot-update.js": "/js/main.293834e2b76a7f705b38.hot-update.js", + "/js/main.0a1c66ffda84f6244db2.hot-update.js": "/js/main.0a1c66ffda84f6244db2.hot-update.js", + "/js/main.9da787fd6d37b9cf6b0d.hot-update.js": "/js/main.9da787fd6d37b9cf6b0d.hot-update.js", + "/js/main.865f8c7aa478fdc0403c.hot-update.js": "/js/main.865f8c7aa478fdc0403c.hot-update.js", + "/js/main.847c9bc6bbf4ad7dfa13.hot-update.js": "/js/main.847c9bc6bbf4ad7dfa13.hot-update.js", + "/js/main.357e30500e48699429ff.hot-update.js": "/js/main.357e30500e48699429ff.hot-update.js", + "/js/main.a25e763451c1a4436288.hot-update.js": "/js/main.a25e763451c1a4436288.hot-update.js", + "/js/main.32e7df5e1300cd27fd38.hot-update.js": "/js/main.32e7df5e1300cd27fd38.hot-update.js", + "/js/main.32ea6e6436c28641e78b.hot-update.js": "/js/main.32ea6e6436c28641e78b.hot-update.js", + "/js/main.08e0c0adedd226a4eedb.hot-update.js": "/js/main.08e0c0adedd226a4eedb.hot-update.js", + "/js/main.78664d675fff7ea43452.hot-update.js": "/js/main.78664d675fff7ea43452.hot-update.js", + "/js/main.eaed9db22000c5d16fec.hot-update.js": "/js/main.eaed9db22000c5d16fec.hot-update.js", + "/js/main.0e05f46777d4a99fe594.hot-update.js": "/js/main.0e05f46777d4a99fe594.hot-update.js", + "/js/main.3cf4c81de9c1ed3d009b.hot-update.js": "/js/main.3cf4c81de9c1ed3d009b.hot-update.js", + "/js/main.3b1bdc22c339357c813f.hot-update.js": "/js/main.3b1bdc22c339357c813f.hot-update.js", + "/js/main.2139e17ae489f5a0ec09.hot-update.js": "/js/main.2139e17ae489f5a0ec09.hot-update.js", + "/js/main.bc5d4d6ceeefe6bf49dc.hot-update.js": "/js/main.bc5d4d6ceeefe6bf49dc.hot-update.js", + "/js/main.3a860712dcfd80c34a59.hot-update.js": "/js/main.3a860712dcfd80c34a59.hot-update.js", + "/js/main.033529d501b9a9e2ca25.hot-update.js": "/js/main.033529d501b9a9e2ca25.hot-update.js", + "/js/main.e870de84740494ac895b.hot-update.js": "/js/main.e870de84740494ac895b.hot-update.js", + "/js/main.918c797daa15df9fded1.hot-update.js": "/js/main.918c797daa15df9fded1.hot-update.js", + "/js/main.22c4dbc3a443023318da.hot-update.js": "/js/main.22c4dbc3a443023318da.hot-update.js", + "/js/main.005cfff54dbee629f505.hot-update.js": "/js/main.005cfff54dbee629f505.hot-update.js", + "/js/main.6f7967a34dc8a961b327.hot-update.js": "/js/main.6f7967a34dc8a961b327.hot-update.js", + "/js/main.479ceaebee83e41a5ade.hot-update.js": "/js/main.479ceaebee83e41a5ade.hot-update.js", + "/js/main.a20acf70f18ebdd66447.hot-update.js": "/js/main.a20acf70f18ebdd66447.hot-update.js", + "/js/main.ee332693faa2218fb662.hot-update.js": "/js/main.ee332693faa2218fb662.hot-update.js", + "/js/main.9d2b4b00f63f83496122.hot-update.js": "/js/main.9d2b4b00f63f83496122.hot-update.js", + "/js/main.14055957de8219277cf2.hot-update.js": "/js/main.14055957de8219277cf2.hot-update.js", + "/js/main.1d042c41bb9132120809.hot-update.js": "/js/main.1d042c41bb9132120809.hot-update.js", + "/js/main.33cde9abbbdf337fa042.hot-update.js": "/js/main.33cde9abbbdf337fa042.hot-update.js", + "/js/main.a7162761be0f4213da47.hot-update.js": "/js/main.a7162761be0f4213da47.hot-update.js", + "/js/main.6e0e492148c23360c4ad.hot-update.js": "/js/main.6e0e492148c23360c4ad.hot-update.js", + "/js/main.0627042acb7ded093af9.hot-update.js": "/js/main.0627042acb7ded093af9.hot-update.js", + "/js/main.c8379f58424b233f021e.hot-update.js": "/js/main.c8379f58424b233f021e.hot-update.js", + "/js/main.ee495d19d310fd76d796.hot-update.js": "/js/main.ee495d19d310fd76d796.hot-update.js", + "/js/main.443446feba272089fbe5.hot-update.js": "/js/main.443446feba272089fbe5.hot-update.js", + "/js/main.0a8e2d5c71cd84bcafa5.hot-update.js": "/js/main.0a8e2d5c71cd84bcafa5.hot-update.js", + "/js/main.ae62fecbaca54f248911.hot-update.js": "/js/main.ae62fecbaca54f248911.hot-update.js", + "/js/main.ac2be1471f24e4d4ba24.hot-update.js": "/js/main.ac2be1471f24e4d4ba24.hot-update.js", + "/js/main.6fe33464860d885096e0.hot-update.js": "/js/main.6fe33464860d885096e0.hot-update.js", + "/js/main.cd23d51469b76577cd44.hot-update.js": "/js/main.cd23d51469b76577cd44.hot-update.js", + "/js/main.597db468fc7721bde000.hot-update.js": "/js/main.597db468fc7721bde000.hot-update.js", + "/js/main.deb9e4b4f44cda4e874c.hot-update.js": "/js/main.deb9e4b4f44cda4e874c.hot-update.js", + "/js/main.4eca7117450e797fb033.hot-update.js": "/js/main.4eca7117450e797fb033.hot-update.js", + "/js/main.836b40243606ace4caf7.hot-update.js": "/js/main.836b40243606ace4caf7.hot-update.js", + "/js/main.b3bc3a73412a51ef454a.hot-update.js": "/js/main.b3bc3a73412a51ef454a.hot-update.js", + "/js/main.92750ee5fc3e1003361c.hot-update.js": "/js/main.92750ee5fc3e1003361c.hot-update.js", + "/js/main.35dd99c6164ae958964e.hot-update.js": "/js/main.35dd99c6164ae958964e.hot-update.js", + "/js/main.721ccf8c6f1a9f27f7e6.hot-update.js": "/js/main.721ccf8c6f1a9f27f7e6.hot-update.js", + "/js/main.1f2c1f70a54b1f4a9c30.hot-update.js": "/js/main.1f2c1f70a54b1f4a9c30.hot-update.js", + "/js/main.8281e75f5ab1a6823519.hot-update.js": "/js/main.8281e75f5ab1a6823519.hot-update.js", + "/js/main.0768e908f1f2c29e02e3.hot-update.js": "/js/main.0768e908f1f2c29e02e3.hot-update.js", + "/js/main.9225c3f05bc4dc4ee3f7.hot-update.js": "/js/main.9225c3f05bc4dc4ee3f7.hot-update.js", + "/js/main.fcc822857e917b9de3c5.hot-update.js": "/js/main.fcc822857e917b9de3c5.hot-update.js", + "/js/main.9e6cc2423230d3bad63a.hot-update.js": "/js/main.9e6cc2423230d3bad63a.hot-update.js", + "/js/main.92d5d0453b3362391ba1.hot-update.js": "/js/main.92d5d0453b3362391ba1.hot-update.js", + "/js/main.df2161c49a65f59cc814.hot-update.js": "/js/main.df2161c49a65f59cc814.hot-update.js", + "/js/main.8e2c35d2851b9f6e093e.hot-update.js": "/js/main.8e2c35d2851b9f6e093e.hot-update.js", + "/js/main.ee6ea14ade1aa0517972.hot-update.js": "/js/main.ee6ea14ade1aa0517972.hot-update.js", + "/js/main.beed37bf065c800da07c.hot-update.js": "/js/main.beed37bf065c800da07c.hot-update.js", + "/js/main.af2f39ea90ae11a196ce.hot-update.js": "/js/main.af2f39ea90ae11a196ce.hot-update.js", + "/js/main.c6164a4f084321d65d93.hot-update.js": "/js/main.c6164a4f084321d65d93.hot-update.js", + "/js/main.c2e596f91cdb037dbfa3.hot-update.js": "/js/main.c2e596f91cdb037dbfa3.hot-update.js", + "/js/main.1049fc5f8a8c9a2f73f1.hot-update.js": "/js/main.1049fc5f8a8c9a2f73f1.hot-update.js", + "/js/main.ea031f841752fa33de34.hot-update.js": "/js/main.ea031f841752fa33de34.hot-update.js", + "/js/main.8ca99c2bdc4900b71d75.hot-update.js": "/js/main.8ca99c2bdc4900b71d75.hot-update.js", + "/js/main.e2c88b3ebc170d555ab3.hot-update.js": "/js/main.e2c88b3ebc170d555ab3.hot-update.js", + "/js/main.df4f07672b66f5362b6c.hot-update.js": "/js/main.df4f07672b66f5362b6c.hot-update.js", + "/js/main.52bd67b62e3b204ff75f.hot-update.js": "/js/main.52bd67b62e3b204ff75f.hot-update.js", + "/js/main.9df3c750abbdf710fdf6.hot-update.js": "/js/main.9df3c750abbdf710fdf6.hot-update.js", + "/js/main.6a799e06681bac8a9936.hot-update.js": "/js/main.6a799e06681bac8a9936.hot-update.js", + "/js/main.33171569b8a14f3177c5.hot-update.js": "/js/main.33171569b8a14f3177c5.hot-update.js", + "/js/main.3b24e8ee819c583b4711.hot-update.js": "/js/main.3b24e8ee819c583b4711.hot-update.js", + "/js/main.19658b188ad9b89b1291.hot-update.js": "/js/main.19658b188ad9b89b1291.hot-update.js", + "/js/main.0f33df348a32c0b85b51.hot-update.js": "/js/main.0f33df348a32c0b85b51.hot-update.js", + "/js/main.dcd9fa74a9b8fb50721c.hot-update.js": "/js/main.dcd9fa74a9b8fb50721c.hot-update.js", + "/js/main.c95068df5ce07b66fea1.hot-update.js": "/js/main.c95068df5ce07b66fea1.hot-update.js", + "/js/main.a3458d59bdadd34e7332.hot-update.js": "/js/main.a3458d59bdadd34e7332.hot-update.js", + "/js/main.64f59bbf5718479f5c1a.hot-update.js": "/js/main.64f59bbf5718479f5c1a.hot-update.js", + "/js/main.85e70811c03956265a4a.hot-update.js": "/js/main.85e70811c03956265a4a.hot-update.js", + "/js/main.18117fa6c58f27fa1550.hot-update.js": "/js/main.18117fa6c58f27fa1550.hot-update.js", + "/js/main.8dbb00ce91497aebf928.hot-update.js": "/js/main.8dbb00ce91497aebf928.hot-update.js", + "/js/main.cbaf2d1fdd9887442320.hot-update.js": "/js/main.cbaf2d1fdd9887442320.hot-update.js", + "/js/main.97d8dbec3784ef41b8de.hot-update.js": "/js/main.97d8dbec3784ef41b8de.hot-update.js", + "/js/main.3bb9e845b47af251d98c.hot-update.js": "/js/main.3bb9e845b47af251d98c.hot-update.js", + "/js/main.92b3e383e6f53242ad8f.hot-update.js": "/js/main.92b3e383e6f53242ad8f.hot-update.js", + "/js/main.224e8c595ad8212532dc.hot-update.js": "/js/main.224e8c595ad8212532dc.hot-update.js", + "/js/main.d5d306a7fb721e5b568b.hot-update.js": "/js/main.d5d306a7fb721e5b568b.hot-update.js", + "/js/main.fd75a70cdfee4df31e3d.hot-update.js": "/js/main.fd75a70cdfee4df31e3d.hot-update.js", + "/js/main.0e90c7c25050b0901e22.hot-update.js": "/js/main.0e90c7c25050b0901e22.hot-update.js", + "/js/main.e5f0c4a2d082e6ed582a.hot-update.js": "/js/main.e5f0c4a2d082e6ed582a.hot-update.js", + "/js/main.ec4b3cf54c23e7a67fdf.hot-update.js": "/js/main.ec4b3cf54c23e7a67fdf.hot-update.js", + "/js/main.6ec5aa28087299c4e856.hot-update.js": "/js/main.6ec5aa28087299c4e856.hot-update.js", + "/js/main.a38904ba2f1080ce202d.hot-update.js": "/js/main.a38904ba2f1080ce202d.hot-update.js", + "/js/main.7db0b0759803351fa5a8.hot-update.js": "/js/main.7db0b0759803351fa5a8.hot-update.js", + "/js/main.304a51e1c9a5dd60ef1f.hot-update.js": "/js/main.304a51e1c9a5dd60ef1f.hot-update.js", + "/js/main.901b82d4317258ea1c53.hot-update.js": "/js/main.901b82d4317258ea1c53.hot-update.js", + "/js/main.497e4e7fb9d33a44d93e.hot-update.js": "/js/main.497e4e7fb9d33a44d93e.hot-update.js", + "/js/main.57b63d01d97fa279f5b5.hot-update.js": "/js/main.57b63d01d97fa279f5b5.hot-update.js", + "/js/main.b7ff67de50c1df9bb09d.hot-update.js": "/js/main.b7ff67de50c1df9bb09d.hot-update.js", + "/js/main.aa8688f0e56f8b3e23f9.hot-update.js": "/js/main.aa8688f0e56f8b3e23f9.hot-update.js", + "/js/main.61483e331d7628ffea3c.hot-update.js": "/js/main.61483e331d7628ffea3c.hot-update.js", + "/js/main.2d5aa09f0165d80526fd.hot-update.js": "/js/main.2d5aa09f0165d80526fd.hot-update.js", + "/js/main.2ebd8f430597b13b630a.hot-update.js": "/js/main.2ebd8f430597b13b630a.hot-update.js", + "/js/main.f6c19a18e72765f9a229.hot-update.js": "/js/main.f6c19a18e72765f9a229.hot-update.js", + "/js/main.d3bfbed0ec0028cb0428.hot-update.js": "/js/main.d3bfbed0ec0028cb0428.hot-update.js", + "/js/main.d47df9461115ef02036f.hot-update.js": "/js/main.d47df9461115ef02036f.hot-update.js", + "/js/main.73cd57634d0f137050ca.hot-update.js": "/js/main.73cd57634d0f137050ca.hot-update.js", + "/js/main.ea50f373ba7287f8fcec.hot-update.js": "/js/main.ea50f373ba7287f8fcec.hot-update.js", + "/js/main.780bd95f63fdce648807.hot-update.js": "/js/main.780bd95f63fdce648807.hot-update.js", + "/js/main.2511471d932786e69741.hot-update.js": "/js/main.2511471d932786e69741.hot-update.js", + "/js/main.e6fe9ef69de6247618e4.hot-update.js": "/js/main.e6fe9ef69de6247618e4.hot-update.js", + "/js/main.a059aae251c2a60e35fa.hot-update.js": "/js/main.a059aae251c2a60e35fa.hot-update.js", + "/js/main.7d2c4d9d7ede9b195ad6.hot-update.js": "/js/main.7d2c4d9d7ede9b195ad6.hot-update.js", + "/js/main.3b27e3dfc95158d78f41.hot-update.js": "/js/main.3b27e3dfc95158d78f41.hot-update.js", + "/js/main.3db5bb5180473c4f9981.hot-update.js": "/js/main.3db5bb5180473c4f9981.hot-update.js", + "/js/main.e3064029ae8fff3e24e0.hot-update.js": "/js/main.e3064029ae8fff3e24e0.hot-update.js", + "/js/main.724b4ccde32156d48650.hot-update.js": "/js/main.724b4ccde32156d48650.hot-update.js", + "/js/main.b669b01458144dedf1ed.hot-update.js": "/js/main.b669b01458144dedf1ed.hot-update.js", + "/js/main.3ebc6636e9b6580176ef.hot-update.js": "/js/main.3ebc6636e9b6580176ef.hot-update.js", + "/js/main.af6ced35684c6ad3a53c.hot-update.js": "/js/main.af6ced35684c6ad3a53c.hot-update.js", + "/js/main.5147fb055a4e390b206c.hot-update.js": "/js/main.5147fb055a4e390b206c.hot-update.js", + "/js/main.52bcb577491bdee1e509.hot-update.js": "/js/main.52bcb577491bdee1e509.hot-update.js", + "/js/main.af9a25403871667c883e.hot-update.js": "/js/main.af9a25403871667c883e.hot-update.js", + "/js/main.dbd2c30f3868860def45.hot-update.js": "/js/main.dbd2c30f3868860def45.hot-update.js", + "/js/main.1ac32029b0ef21cb8d44.hot-update.js": "/js/main.1ac32029b0ef21cb8d44.hot-update.js", + "/js/main.0bcbc8497cb962299815.hot-update.js": "/js/main.0bcbc8497cb962299815.hot-update.js", + "/js/main.177edbc74755c0b26289.hot-update.js": "/js/main.177edbc74755c0b26289.hot-update.js", + "/js/main.16b565aad7c618074b80.hot-update.js": "/js/main.16b565aad7c618074b80.hot-update.js", + "/js/main.50226ddbf0e191df338b.hot-update.js": "/js/main.50226ddbf0e191df338b.hot-update.js", + "/js/main.b85f0c073a0becc8950e.hot-update.js": "/js/main.b85f0c073a0becc8950e.hot-update.js", + "/js/main.88f96a34e9921d36d9b1.hot-update.js": "/js/main.88f96a34e9921d36d9b1.hot-update.js", + "/js/main.758c6b91d4be63105d03.hot-update.js": "/js/main.758c6b91d4be63105d03.hot-update.js", + "/js/main.0cea0f2ec0077ec93401.hot-update.js": "/js/main.0cea0f2ec0077ec93401.hot-update.js", + "/js/main.92e39411babd7e72c72a.hot-update.js": "/js/main.92e39411babd7e72c72a.hot-update.js", + "/js/main.4e386766ef0c2d277b6b.hot-update.js": "/js/main.4e386766ef0c2d277b6b.hot-update.js", + "/js/main.7917fee1daaffbc31e35.hot-update.js": "/js/main.7917fee1daaffbc31e35.hot-update.js", + "/js/main.fe1618b8df6ec204cab2.hot-update.js": "/js/main.fe1618b8df6ec204cab2.hot-update.js", + "/js/main.2cd9f63bf0d43e7148d2.hot-update.js": "/js/main.2cd9f63bf0d43e7148d2.hot-update.js", + "/js/main.518074fbc907d4017f70.hot-update.js": "/js/main.518074fbc907d4017f70.hot-update.js", + "/js/main.7dd9fe7c54dbee4520c9.hot-update.js": "/js/main.7dd9fe7c54dbee4520c9.hot-update.js", + "/js/main.c50c2bdab81c3e8dadd3.hot-update.js": "/js/main.c50c2bdab81c3e8dadd3.hot-update.js", + "/js/main.8c77b46f07ae9c304b33.hot-update.js": "/js/main.8c77b46f07ae9c304b33.hot-update.js", + "/js/main.3c3128c4aca4cb5a2658.hot-update.js": "/js/main.3c3128c4aca4cb5a2658.hot-update.js", + "/js/main.a7707a95ba691d4db803.hot-update.js": "/js/main.a7707a95ba691d4db803.hot-update.js", + "/js/main.c10d7c511b782f5ac55a.hot-update.js": "/js/main.c10d7c511b782f5ac55a.hot-update.js", + "/js/main.0f2c49b1045bd0a436e4.hot-update.js": "/js/main.0f2c49b1045bd0a436e4.hot-update.js", + "/js/main.dba3d626a3c5055e72c7.hot-update.js": "/js/main.dba3d626a3c5055e72c7.hot-update.js", + "/js/main.124319628e4d177a457e.hot-update.js": "/js/main.124319628e4d177a457e.hot-update.js", + "/js/main.0ee8ac9d83933c29f45d.hot-update.js": "/js/main.0ee8ac9d83933c29f45d.hot-update.js", + "/js/main.1861aa984800939f39d9.hot-update.js": "/js/main.1861aa984800939f39d9.hot-update.js", + "/js/main.d4142c7600c1e5b23765.hot-update.js": "/js/main.d4142c7600c1e5b23765.hot-update.js", + "/js/main.4b876ab726f63941830e.hot-update.js": "/js/main.4b876ab726f63941830e.hot-update.js", + "/js/main.ce1298b64c553bce5147.hot-update.js": "/js/main.ce1298b64c553bce5147.hot-update.js", + "/js/main.126669fa69f23f4b2e1e.hot-update.js": "/js/main.126669fa69f23f4b2e1e.hot-update.js", + "/js/main.1dc3aad59b010c3ecfaa.hot-update.js": "/js/main.1dc3aad59b010c3ecfaa.hot-update.js", + "/js/main.b6861e2411d696fc18f7.hot-update.js": "/js/main.b6861e2411d696fc18f7.hot-update.js", + "/js/main.3b9519c66ea3ae751920.hot-update.js": "/js/main.3b9519c66ea3ae751920.hot-update.js", + "/js/main.293d111adda10d8cf051.hot-update.js": "/js/main.293d111adda10d8cf051.hot-update.js", + "/js/main.d834fdf285e5259e659f.hot-update.js": "/js/main.d834fdf285e5259e659f.hot-update.js", + "/js/main.25320ecaa68f65cf39d8.hot-update.js": "/js/main.25320ecaa68f65cf39d8.hot-update.js", + "/js/main.b345766be64fdbd77fad.hot-update.js": "/js/main.b345766be64fdbd77fad.hot-update.js", + "/js/main.73a62d68c6aa716d4442.hot-update.js": "/js/main.73a62d68c6aa716d4442.hot-update.js", + "/js/main.a20280dd94ace4dfe791.hot-update.js": "/js/main.a20280dd94ace4dfe791.hot-update.js", + "/js/main.7cb118acb9c4531576bf.hot-update.js": "/js/main.7cb118acb9c4531576bf.hot-update.js", + "/js/main.94721e0268654221490d.hot-update.js": "/js/main.94721e0268654221490d.hot-update.js", + "/js/main.d188ccf0643fd0323c99.hot-update.js": "/js/main.d188ccf0643fd0323c99.hot-update.js", + "/js/main.79c779b79d5fdc43cb7a.hot-update.js": "/js/main.79c779b79d5fdc43cb7a.hot-update.js", + "/js/main.751b2d66fcc7795387b8.hot-update.js": "/js/main.751b2d66fcc7795387b8.hot-update.js", + "/js/main.f865ed47daf098ce851b.hot-update.js": "/js/main.f865ed47daf098ce851b.hot-update.js", + "/js/main.fde8c29fa890fafb6918.hot-update.js": "/js/main.fde8c29fa890fafb6918.hot-update.js", + "/js/main.fc020c4b1a85703ba2fd.hot-update.js": "/js/main.fc020c4b1a85703ba2fd.hot-update.js", + "/js/main.12e914b5398fed5263c3.hot-update.js": "/js/main.12e914b5398fed5263c3.hot-update.js", + "/js/main.a9e85de5f20a914d9792.hot-update.js": "/js/main.a9e85de5f20a914d9792.hot-update.js", + "/js/main.6b7625a214c48be0e8fe.hot-update.js": "/js/main.6b7625a214c48be0e8fe.hot-update.js", + "/js/main.081425b1a319a39ba57d.hot-update.js": "/js/main.081425b1a319a39ba57d.hot-update.js", + "/js/main.83b69a601e558b4c66dd.hot-update.js": "/js/main.83b69a601e558b4c66dd.hot-update.js", + "/js/main.cd56ccae0a8d70d9fbb5.hot-update.js": "/js/main.cd56ccae0a8d70d9fbb5.hot-update.js", + "/js/main.fddc2d35c7100276599f.hot-update.js": "/js/main.fddc2d35c7100276599f.hot-update.js", + "/js/main.545aae91e9ba07a7fd33.hot-update.js": "/js/main.545aae91e9ba07a7fd33.hot-update.js", + "/js/main.73b0d6729b2068f1605e.hot-update.js": "/js/main.73b0d6729b2068f1605e.hot-update.js", + "/js/main.80906e773a38b7d3a2d7.hot-update.js": "/js/main.80906e773a38b7d3a2d7.hot-update.js", + "/js/main.3e6fac83667df2a5aa9a.hot-update.js": "/js/main.3e6fac83667df2a5aa9a.hot-update.js", + "/js/main.06d8baefc20e76dc93ae.hot-update.js": "/js/main.06d8baefc20e76dc93ae.hot-update.js", + "/js/main.63019f721aff16c32040.hot-update.js": "/js/main.63019f721aff16c32040.hot-update.js", + "/js/main.2668706d7ae6ba7e57d7.hot-update.js": "/js/main.2668706d7ae6ba7e57d7.hot-update.js", + "/js/main.7c95c0035cf9ef725975.hot-update.js": "/js/main.7c95c0035cf9ef725975.hot-update.js", + "/js/main.25e6f3570af5d6997c3b.hot-update.js": "/js/main.25e6f3570af5d6997c3b.hot-update.js", + "/js/main.833de212f7174cf943d0.hot-update.js": "/js/main.833de212f7174cf943d0.hot-update.js", + "/js/main.42f1f72fc008c3d55328.hot-update.js": "/js/main.42f1f72fc008c3d55328.hot-update.js", + "/js/main.c30865644e19484ffdb2.hot-update.js": "/js/main.c30865644e19484ffdb2.hot-update.js", + "/js/main.093932c5788754777120.hot-update.js": "/js/main.093932c5788754777120.hot-update.js", + "/js/main.68a0f6d8fb9a63f25a63.hot-update.js": "/js/main.68a0f6d8fb9a63f25a63.hot-update.js", + "/js/main.dde11d552c1431c3c013.hot-update.js": "/js/main.dde11d552c1431c3c013.hot-update.js", + "/js/main.751b0c260d1129f5fdd0.hot-update.js": "/js/main.751b0c260d1129f5fdd0.hot-update.js", + "/js/main.29d30192df173c07196b.hot-update.js": "/js/main.29d30192df173c07196b.hot-update.js", + "/js/main.60764aab6c1adc329237.hot-update.js": "/js/main.60764aab6c1adc329237.hot-update.js", + "/js/main.3ba38878f8e0401a6622.hot-update.js": "/js/main.3ba38878f8e0401a6622.hot-update.js", + "/js/main.0ac7209eec896afa5fd7.hot-update.js": "/js/main.0ac7209eec896afa5fd7.hot-update.js", + "/js/main.7c43b93309d76b9c689e.hot-update.js": "/js/main.7c43b93309d76b9c689e.hot-update.js", + "/js/main.6b0d4d6682db03e57a7e.hot-update.js": "/js/main.6b0d4d6682db03e57a7e.hot-update.js", + "/js/main.bae2bbea92c87bbe9b6e.hot-update.js": "/js/main.bae2bbea92c87bbe9b6e.hot-update.js", + "/js/main.15d07623969b0491f4a0.hot-update.js": "/js/main.15d07623969b0491f4a0.hot-update.js", + "/js/main.a0152fd5be092487b17a.hot-update.js": "/js/main.a0152fd5be092487b17a.hot-update.js", + "/js/main.4c881d50bd3c151afc7e.hot-update.js": "/js/main.4c881d50bd3c151afc7e.hot-update.js", + "/js/main.4a24e98b1e515772aba1.hot-update.js": "/js/main.4a24e98b1e515772aba1.hot-update.js", + "/js/main.79741fe597e91dc1543e.hot-update.js": "/js/main.79741fe597e91dc1543e.hot-update.js", + "/js/main.cef63d6a6cac0a6f6a11.hot-update.js": "/js/main.cef63d6a6cac0a6f6a11.hot-update.js", + "/js/main.cbfd2196668397b14480.hot-update.js": "/js/main.cbfd2196668397b14480.hot-update.js", + "/js/main.4ddd8429fdd59155d1c3.hot-update.js": "/js/main.4ddd8429fdd59155d1c3.hot-update.js", + "/js/main.bf31b90c9bef9eacbfc6.hot-update.js": "/js/main.bf31b90c9bef9eacbfc6.hot-update.js", + "/js/main.84d101ec6f861c3727d7.hot-update.js": "/js/main.84d101ec6f861c3727d7.hot-update.js", + "/js/main.0dc92a7ac7bacc039422.hot-update.js": "/js/main.0dc92a7ac7bacc039422.hot-update.js", + "/js/main.821175555d08638e00e9.hot-update.js": "/js/main.821175555d08638e00e9.hot-update.js", + "/js/main.150365f52e29e60ad89e.hot-update.js": "/js/main.150365f52e29e60ad89e.hot-update.js", + "/js/main.018aa3ac776b804d86f6.hot-update.js": "/js/main.018aa3ac776b804d86f6.hot-update.js" } diff --git a/resources/js/App.vue b/resources/js/App.vue index fa8cdc8e..e7655086 100644 --- a/resources/js/App.vue +++ b/resources/js/App.vue @@ -122,7 +122,7 @@ diff --git a/resources/js/components/Admin/WidgetTotals.vue b/resources/js/components/Admin/WidgetTotals.vue new file mode 100644 index 00000000..2f191754 --- /dev/null +++ b/resources/js/components/Admin/WidgetTotals.vue @@ -0,0 +1,62 @@ + + + + + diff --git a/resources/js/components/Admin/WidgetWrapper.vue b/resources/js/components/Admin/WidgetWrapper.vue new file mode 100644 index 00000000..4ea775c0 --- /dev/null +++ b/resources/js/components/Admin/WidgetWrapper.vue @@ -0,0 +1,55 @@ + + + + + diff --git a/resources/js/components/FilesView/ButtonBase.vue b/resources/js/components/FilesView/ButtonBase.vue index 3b252bc9..c7f37c22 100644 --- a/resources/js/components/FilesView/ButtonBase.vue +++ b/resources/js/components/FilesView/ButtonBase.vue @@ -1,16 +1,23 @@ @@ -26,40 +33,81 @@ border-radius: 8px; border: 0; padding: 10px 28px; - display: inline-block; white-space: nowrap; + display: flex; + align-items: center; + + .icon { + line-height: 1; + margin-right: 10px; + } + + .content { + width: 100%; + } &:active { transform: scale(0.95); } &.theme { - color: $theme; background: rgba($theme, .1); + + .content { + color: $theme; + } + + polyline, path { + stroke: $theme; + } } &.theme-solid { - color: white; background: $theme; - path { - fill: white; + .content { + color: white; + } + + polyline, path { + stroke: white; } } &.danger { - color: $danger; background: rgba($danger, .1); + + .content { + color: $danger; + } + + polyline, path { + stroke: $danger; + } } &.danger-solid { - color: white; background: $danger; + + .content { + color: white; + } + + polyline, path { + stroke: white; + } } &.secondary { - color: $text; background: $light_background; + + .content { + color: $text; + } + + polyline, path { + stroke: $text; + } } } diff --git a/resources/js/components/Others/EmptyPageContent.vue b/resources/js/components/Others/EmptyPageContent.vue new file mode 100644 index 00000000..8d5b691d --- /dev/null +++ b/resources/js/components/Others/EmptyPageContent.vue @@ -0,0 +1,68 @@ + + + + + diff --git a/resources/js/components/Others/Forms/ImageInput.vue b/resources/js/components/Others/Forms/ImageInput.vue index 7afe91a8..62b18457 100644 --- a/resources/js/components/Others/Forms/ImageInput.vue +++ b/resources/js/components/Others/Forms/ImageInput.vue @@ -120,7 +120,7 @@ height: 100%; object-fit: contain; left: 0; - padding: 7px; + padding: 25px; display: block; &.fit-image { diff --git a/resources/js/components/Others/Forms/InfoBox.vue b/resources/js/components/Others/Forms/InfoBox.vue index 1b67e78b..36711914 100644 --- a/resources/js/components/Others/Forms/InfoBox.vue +++ b/resources/js/components/Others/Forms/InfoBox.vue @@ -34,6 +34,12 @@ @include font-size(15); line-height: 1.6; word-break: break-all; + font-weight: 600; + } + + b { + font-weight: 700; + color: $theme; } a { diff --git a/resources/js/components/Others/PlanPricingTables.vue b/resources/js/components/Others/PlanPricingTables.vue index 29e6e273..ed68a7b4 100644 --- a/resources/js/components/Others/PlanPricingTables.vue +++ b/resources/js/components/Others/PlanPricingTables.vue @@ -120,6 +120,7 @@ .sign-in-button { width: 100%; + text-align: center; } .price { diff --git a/resources/js/components/Sidebar/MenuBar.vue b/resources/js/components/Sidebar/MenuBar.vue index f53671eb..c35d68d1 100644 --- a/resources/js/components/Sidebar/MenuBar.vue +++ b/resources/js/components/Sidebar/MenuBar.vue @@ -32,7 +32,7 @@ - +
@@ -82,16 +82,21 @@ data() { return { adminRoutes: [ + 'AppSettings', + 'AppAppearance', + 'AppBillings', + 'AppEmail', + 'AppOthers', + 'Dashboard', 'PlanSubscribers', + 'PlanCreate', 'PlanSettings', 'PlanDelete', - - 'GatewayTransactions', - 'GatewaySettings', - 'UserInvoices', + 'UserSubscription', 'UserInvoices', 'UserPassword', 'UserStorage', + 'UserDelete', 'PlanCreate', 'UserCreate', 'UserDelete', diff --git a/resources/js/helpers.js b/resources/js/helpers.js index a6a002b7..a85598ca 100644 --- a/resources/js/helpers.js +++ b/resources/js/helpers.js @@ -20,16 +20,13 @@ const Helpers = { }) }, 300) - Vue.prototype.$getCreditCardBrand = function (brand) { - return `/assets/icons/${brand}.svg` - } - Vue.prototype.$updateImage = function (route, name, image) { // Create form let formData = new FormData() // Add image to form + formData.append('name', name) formData.append(name, image) formData.append('_method', 'PATCH') @@ -46,6 +43,14 @@ const Helpers = { }) } + Vue.prototype.$getCreditCardBrand = function (brand) { + return `/assets/icons/${brand}.svg` + } + + Vue.prototype.$getInvoiceLink = function (customer, id) { + return '/invoice/' + customer + '/' + id + } + Vue.prototype.$openImageOnNewTab = function (source) { let win = window.open(source, '_blank') diff --git a/resources/js/router.js b/resources/js/router.js index dae63577..a3e45605 100644 --- a/resources/js/router.js +++ b/resources/js/router.js @@ -29,6 +29,7 @@ import UserProfileMobileMenu from './views/Mobile/UserProfileMobileMenu' import Admin from './views/Admin' import Invoices from './views/Admin/Invoices' +import Dashboard from './views/Admin/Dashboard' import AppSettings from './views/Admin/AppSettings/AppSettings' // App Settings @@ -81,6 +82,15 @@ const routesAdmin = [ title: 'Admin' }, children: [ + { + name: 'Dashboard', + path: '/admin/dashboard', + component: Dashboard, + meta: { + requiresAuth: true, + title: 'Dashboard' + }, + }, { name: 'Invoices', path: '/admin/invoices', diff --git a/resources/js/views/Admin.vue b/resources/js/views/Admin.vue index 83160bf2..3d1f3247 100644 --- a/resources/js/views/Admin.vue +++ b/resources/js/views/Admin.vue @@ -6,6 +6,14 @@