diff --git a/source/main.cc b/source/main.cc index fc2d996..1c54a46 100644 --- a/source/main.cc +++ b/source/main.cc @@ -9,11 +9,6 @@ int main(int argc, char** argv) { for (int i=1; i 1){ str_argv = argv[1]; } diff --git a/source/menu_os.cc b/source/menu_os.cc index faee722..5e2bf02 100644 --- a/source/menu_os.cc +++ b/source/menu_os.cc @@ -135,7 +135,6 @@ void Menu_os::event_template(Gtk::Label* label, string& name_level, string& key) this->close_revealer(); revealer->set_reveal_child(true); name_level_3 = ""; - //entry->set_text(name_level_1); } else if (map_menu_level_1[key]->vec_menu_level_3.size() == 0) { entry->set_text(name_level_1); diff --git a/source/ubl-settings-bootloader.cc b/source/ubl-settings-bootloader.cc index 5164cfc..b18da4a 100644 --- a/source/ubl-settings-bootloader.cc +++ b/source/ubl-settings-bootloader.cc @@ -263,13 +263,11 @@ void MainWindow::settings() { vector os_control_list; this->pars_os(os_control_list); this->download_local_cfg(); - this->download_globl_cfg(); vector>> vec_list_os = format_os_list(os_control_list); obj_menu_os.set_main_revealer(revilerMenuOS); obj_menu_os.set_builder(builder, path_glade); obj_menu_os.set_map(vec_list_os); obj_menu_os.set_entry(entrListOS); - // obj_menu_os.set_last_launched_os(map_global_cmd_selection["GRUB_DEFAULT"]); obj_menu_os.set_last_launched_os(this->str_last_launched_os); obj_menu_os.init(); obj_menu_os.event(); @@ -400,7 +398,6 @@ void MainWindow::item_selected_kernel(const Gtk::TreeModel::Path&, const Gtk::Tr if (this->intel_idle_cstate_check(size_kernel, list_store_kernel, "GRUB_CMDLINE_LINUX") == false) { string str_flags = template_item_selected(size_kernel, list_store_kernel, "GRUB_CMDLINE_LINUX"); map_cmd_selection["GRUB_CMDLINE_LINUX"] = str_flags; - // Utils::str_replace_all(str_flags, " ", ", "); entryKernel->set_text(str_flags); } } @@ -415,7 +412,6 @@ void MainWindow::item_selected_OTT(const Gtk::TreeModel::Path&, const Gtk::TreeM if (this->intel_idle_cstate_check(size_OTT, list_store_OTT, "GRUB_TERMINAL_OUTPUT") == false) { string str_flags = template_item_selected(size_OTT, list_store_OTT, "GRUB_TERMINAL_OUTPUT"); map_cmd_selection["GRUB_TERMINAL_OUTPUT"] = str_flags; - // Utils::str_replace_all(str_flags, " ", ", "); entryOTT->set_text(str_flags); } } @@ -430,7 +426,6 @@ void MainWindow::item_selected_IPT(const Gtk::TreeModel::Path&, const Gtk::TreeM if (this->intel_idle_cstate_check(size_IPT, list_store_IPT, "GRUB_TERMINAL_INPUT") == false) { string str_flags = template_item_selected(size_IPT, list_store_IPT, "GRUB_TERMINAL_INPUT"); map_cmd_selection["GRUB_TERMINAL_INPUT"] = str_flags; - // Utils::str_replace_all(str_flags, " ", ", "); entryIPT->set_text(str_flags); } } @@ -670,7 +665,6 @@ void MainWindow::localization() { aboutWindows->set_website_label(project_Home_page); lblInfoHead->set_text(name_app); lblHeaderName->set_text(name_app); - lblHeaderAboutTopic->set_label(str_about); lblBootMenuUsers->set_text(str_title_Boot_Menu_Users); lblRingtoneStartup->set_text(str_title_Ringtone_Startup); lblInfoCommand->set_text(command_line_parameters); @@ -690,8 +684,6 @@ void MainWindow::localization() { btnSaveGlob->set_label(save_global); btnLoadGlob->set_label(load_global); btnLoadLocal->set_label(load_local); - btnSave->set_label(str_save); - btnLoad->set_label(str_load); this->set_title(name_app); cmbDownloadMode->append(loading_animation_with); cmbDownloadMode->append(loading_animation_without); @@ -759,7 +751,6 @@ void MainWindow::set_entry_to_tree_view(Glib::RefPtr &list_store flag_blocked_tree_view = true; vector vec_params; std::string text = entry.get_text(); - // Utils::str_replace_all(text, " ", ""); vec_params = Utils::split(text, ' '); for (auto &name: vec_Option) { this->set_row(list_store, size, name, false); @@ -767,7 +758,6 @@ void MainWindow::set_entry_to_tree_view(Glib::RefPtr &list_store for (auto &name: vec_params) { this->set_row(list_store, size, name, true); } - // Utils::str_replace_all(text, ",", " "); if (text.length() > 0) { if (text[0] == ' ') { text = text.substr(1, text.length() - 1); @@ -857,27 +847,34 @@ void MainWindow::event() { } } void MainWindow::wrapper_edit_user(bool check, string column1, string column2) { + iter_user_del = this->treeViewUser->get_selection()->get_selected(); if (flag_validate_del_user && list_store_user->iter_is_valid(iter_user_del)) { Gtk::TreeModel::Row row = *iter_user_del; if(row) { row[m_columns_user.check_button] = check; row[m_columns_user.name] = column1; row[m_columns_user.password] = column2; + obj_view_edit_add_table.old_data.column1=""; + obj_view_edit_add_table.old_data.column2=""; } } } void MainWindow::wrapper_edit_melody(bool check, string column1, string column2) { + iter_melody_del = this->treeViewMelody->get_selection()->get_selected(); if (flag_validate_del_melody && list_store_melody->iter_is_valid(iter_melody_del)) { Gtk::TreeModel::Row row = *iter_melody_del; if(row) { row[m_columns_user.check_button] = check; row[m_columns_user.name] = column1; row[m_columns_user.password] = column2; + obj_view_edit_add_table.old_data.column1=""; + obj_view_edit_add_table.old_data.column2=""; } } } void MainWindow::wrapper_edit_show_user() { + iter_user_del = this->treeViewUser->get_selection()->get_selected(); if (flag_validate_del_user && list_store_user->iter_is_valid(iter_user_del)) { Gtk::TreeModel::Row row = *iter_user_del; if(row) { @@ -892,6 +889,7 @@ void MainWindow::wrapper_edit_show_user() { } void MainWindow::wrapper_edit_show_melody() { + iter_melody_del = this->treeViewMelody->get_selection()->get_selected(); if (flag_validate_del_melody && list_store_melody->iter_is_valid(iter_melody_del)) { Gtk::TreeModel::Row row = *iter_melody_del; if(row) { @@ -915,7 +913,6 @@ void MainWindow::check_resize_window() { else { height = plug->get_window()->get_height(); width = plug->get_window()->get_width(); - // lblInfoHead->set_text(to_string(height)); } if (height != old_height) { if (minimal_height >= height) { @@ -968,7 +965,6 @@ void MainWindow::set_tree_view_user() { } else { - // map_cmd_selection[key] = ""; } if (row[m_columns_user.check_button]) { if (users_root.length() != 0) { @@ -1119,6 +1115,7 @@ void MainWindow::wrapper_add_data_melody() { } void MainWindow::remove_user() { + iter_user_del = this->treeViewUser->get_selection()->get_selected(); if (flag_validate_del_user && list_store_user->iter_is_valid(iter_user_del)) { Gtk::TreeModel::Row row = *iter_user_del; if(row) { @@ -1127,23 +1124,24 @@ void MainWindow::remove_user() { map_cmd_selection[key] = ""; } list_store_user->erase(iter_user_del); - flag_validate_del_user = false; + flag_validate_del_user = true; info_status_app(info_box_ok_css); imgInfo->set_from_icon_name(icon_checked, Gtk::ICON_SIZE_MENU); lblWarning->set_text(str_del_user); } - flag_validate_del_user = false; + flag_validate_del_user = true; } void MainWindow::remove_melody() { + iter_melody_del = this->treeViewMelody->get_selection()->get_selected(); if (flag_validate_del_melody && list_store_melody->iter_is_valid(iter_melody_del)) { list_store_melody->erase(iter_melody_del); - flag_validate_del_melody = false; + flag_validate_del_melody = true; info_status_app(info_box_ok_css); imgInfo->set_from_icon_name(icon_checked, Gtk::ICON_SIZE_MENU); lblWarning->set_text(str_del_melody); } - flag_validate_del_melody = false; + flag_validate_del_melody = true; } void MainWindow::select_line_user(const Gtk::TreeModel::Path&, const Gtk::TreeModel::iterator& iter) { @@ -1299,15 +1297,12 @@ void MainWindow::wrapper_save_local_cfg() { void MainWindow::set_data_cfg() { string str_flags = entryKernel->get_text(); - // Utils::str_remove(str_flags, ","); Utils::str_replace_all(str_flags, " \"", "\""); map_cmd_selection["GRUB_CMDLINE_LINUX"] = str_flags; str_flags = entryIPT->get_text(); - // Utils::str_remove(str_flags, ","); Utils::str_replace_all(str_flags, " \"", "\""); map_cmd_selection["GRUB_TERMINAL_INPUT"] = str_flags; str_flags = entryOTT->get_text(); - // Utils::str_remove(str_flags, ","); Utils::str_replace_all(str_flags, " \"", "\""); map_cmd_selection["GRUB_TERMINAL_OUTPUT"] = str_flags; if (chbLoadVariantSelectionTimer->get_active()) { @@ -1383,7 +1378,6 @@ void MainWindow::set_entry(Gtk::Entry* entry, std::map &map_temp if (map_temp.find(key) != map_temp.end()) { string value = map_temp[key]; Utils::str_replace_all(value, "\"", ""); - // Utils::str_replace_all(value, " ", ", "); entry->set_text(value); } else { diff --git a/source/ubl-settings-bootloader.h b/source/ubl-settings-bootloader.h index 49c2281..b13f27b 100644 --- a/source/ubl-settings-bootloader.h +++ b/source/ubl-settings-bootloader.h @@ -44,19 +44,19 @@ void me_thread(string cmd); #define str_tooltip_del_melody _("Delete melody") #define str_tooltip_boot_menu _("Selecting the loading mode option") #define copyright _("Copyright © UBSoft LLC, 2022 - ") -#define name_app _("ubl-settings-bootloader") +#define name_app _("System boot") #define website _("https://wiki.ublinux.com") -#define project_Home_page _("Project Home Page") +#define project_Home_page _("Project homepage") #define configuring_system_boot _("Configuring system boot parameters") #define system_boot _("System boot setup") -#define str_about _("About ubl-settings-bootloader") +#define str_about _("About System boot") #define command_line_parameters _("Command line parameters:") #define load_default _("Load default:") #define seconds _("seconds") #define download_menu _("Download menu") #define terminal_for_input _("Terminal for input") #define terminal_for_output _("Terminal for output") -#define boot_selection_menu_timer _("Boot selection menu timer") +#define boot_selection_menu_timer _("Boot selection menu timer:") #define str_help _("Help") #define str_about_1 _("About") #define str_save _("Save") @@ -81,8 +81,8 @@ void me_thread(string cmd); #define redirected_documentation _("You will be redirected to documentation website where documentation is\n""translated and supported by community.") #define user_name_configuration_editing_code _("User name to enter boot configuration editing mode") #define user_password_configuration_edit_mode _("User password to enter boot configuration edit mode") -#define loading_animation_with _("Loading animation with the magazine") -#define loading_animation_without _("Loading animation without a magazine") +#define loading_animation_with _("Loading animation with log") +#define loading_animation_without _("Loading animation without log") #define lack_loading_animation_800_600 _("Lack of loading animation with the\noutput of the abbreviated log") #define lack_loading_animation _("Lack of loading animation with the output of the abbreviated log") #define web_url _("https://wiki.ublinux.com") diff --git a/ubl-settings-bootloader.css b/ubl-settings-bootloader.css index b9558d6..7ee9ef8 100644 --- a/ubl-settings-bootloader.css +++ b/ubl-settings-bootloader.css @@ -160,4 +160,7 @@ opacity:0.99; border-width: 1px; border-style: solid; border-color: @theme_text_color; +} +.bultar { + border:none; } \ No newline at end of file diff --git a/ubl-settings-bootloader.glade b/ubl-settings-bootloader.glade index 2457e21..0732620 100644 --- a/ubl-settings-bootloader.glade +++ b/ubl-settings-bootloader.glade @@ -1,22 +1,15 @@ - + - - both - True - - - False False True center - com.ublinux.ubl-settings-diskquota + com.ublinux.ubl-settings-bootloader dialog - True True ubl-settings-bootloader 1.0 @@ -69,7 +62,7 @@ 5 5 2 - ubl-settings-bootloader + System boot @@ -120,7 +113,7 @@ True False end - ubl-settings-bootloader + System boot 0 @@ -355,8 +348,8 @@ - 650 - 500 + 800 + 600 False com.ublinux.ubl-settings-bootloader @@ -442,11 +435,19 @@ True True + 5 + 5 + 5 + never in True False + 5 + 5 + 5 + 5 True @@ -461,12 +462,6 @@ True False - 5 - 5 - 5 - 5 - 5 - 5 0.019999999552965164 in @@ -482,24 +477,24 @@ True False + 5 vertical + 5 True False + 5 Boot selection menu timer True True False - 3 - 5 - 3 - 5 - 5 - 5 True + False @@ -511,12 +506,6 @@ True True - 5 - 5 - 5 - 5 - 5 - 5 False @@ -528,12 +517,6 @@ True False - 5 - 5 - 5 - 5 - 5 - 5 Seconds @@ -553,17 +536,12 @@ True False + 5 True False start - 5 - 5 - 5 - 5 - 5 - 5 Default load start 0 @@ -578,12 +556,6 @@ True True - 5 - 5 - 5 - 5 - 5 - 5 True @@ -596,12 +568,6 @@ True True True - 5 - 10 - 5 - 10 - 5 - 5 True @@ -627,17 +593,12 @@ True False + 5 True False start - 5 - 5 - 5 - 5 - 5 - 5 Load screen display mode: start 0 @@ -652,12 +613,6 @@ True False - 5 - 10 - 5 - 10 - 5 - 5 True @@ -676,156 +631,125 @@ True False - 5 - 10 - 5 - 10 - 5 - 5 0.019999999552965164 in - + True False - + True False - 5 + 5 + 5 + 5 + 5 + 5 + 5 True False vertical - - 100 + True True - 5 - 3 - 5 - 3 - 5 - in - - - True - False - - - True - True - - - - - - - - False + True True 0 + + True + True + 0 + - - - True - True - 0 - - - - - True - False - vertical - + True - True - True - 5 - 10 - 5 - 10 - 5 - 5 + False + vertical + 5 - + + True + True + True + + True False - list-add + value-increase-symbolic + + + + + False + True + 0 + - - - False - True - 0 - - - - - True - True - True - 5 - 10 - 5 - 10 - 3 - 5 - + + True + True + True + + True False - gtk-select-all + document-edit-symbolic + + + + + False + True + 1 + - - - False - True - 1 - - - - - True - True - True - 5 - 10 - 5 - 10 - 3 - 10 - + + True + True + True + + True False - gtk-remove + user-trash-symbolic + + + + + False + True + 2 + False True - 2 + 1 - - False - True - 1 - @@ -846,7 +770,7 @@ - False + True True 5 @@ -855,54 +779,54 @@ True False - 5 - 10 - 5 - 10 - 5 5 0.019999999552965164 in - + True False + 5 - + True False - 5 + 5 + 5 + 5 + 5 + + + True + True + + + True + True + 0 + + True False vertical + 5 - - 100 + True True - 5 - 5 - 5 - 5 - 5 - in + True - + True False - - - True - True - - - - - + value-increase-symbolic + False @@ -910,101 +834,58 @@ 0 - - - - - True - True - 0 - - - - - True - False - vertical - - - True - True - True - 5 - 10 - 5 - 10 - 5 - 5 - + True - False - list-add - - - - - False - True - 0 - - - - - True - True - True - 5 - 10 - 5 - 10 - 3 - 5 - - + True + True + + True False - gtk-select-all + document-edit-symbolic + + + + + False + True + 1 + - - - False - True - 1 - - - - - True - True - True - 5 - 10 - 5 - 10 - 3 - 10 - + + True + True + True + + True False - gtk-remove + user-trash-symbolic + + + + + False + True + 2 + False True - 2 + 1 - - False - True - 1 - @@ -1025,7 +906,7 @@ - False + True True 5 @@ -1063,51 +944,25 @@ True False - 5 - 5 - 5 - 5 - 5 - 5 0.019999999552965164 in True False + 5 5 + 5 True False vertical + 5 - - 140 + True True - 5 - 10 - 5 - 10 - 5 - 5 - in - - - True - False - - - True - True - - - - - - - False @@ -1119,16 +974,11 @@ True False + 5 True False - 5 - 5 - 5 - 5 - 1 - 5 Command line parameters: @@ -1141,10 +991,7 @@ True True - 5 - 10 - 5 - 10 + center 5 5 @@ -1191,72 +1038,42 @@ True False - 5 - 5 - 5 - 5 - 5 - 5 0.019999999552965164 in True False + 5 5 + 5 True False vertical + 5 - - 140 + True True - 5 - 10 - 5 - 10 - 5 - 5 - in - - - True - False - - - True - True - - - - - - - False True - 1 + 0 True False + 5 True False - 5 - 5 - 5 - 5 - 1 - 5 + center Command line parameters: @@ -1269,10 +1086,7 @@ True True - 5 - 10 - 5 - 10 + center 5 5 @@ -1319,51 +1133,25 @@ True False - 5 - 5 - 5 - 5 - 5 - 5 0.019999999552965164 in True False + 5 5 + 5 True False vertical + 5 - - 140 + True True - 5 - 10 - 5 - 10 - 5 - 5 - in - - - True - False - - - True - True - - - - - - - False @@ -1375,16 +1163,12 @@ True False + 5 True False - 5 - 5 - 5 - 5 - 1 - 5 + center Command line parameters: @@ -1397,10 +1181,7 @@ True True - 5 - 10 - 5 - 10 + center 5 5 @@ -1472,7 +1253,7 @@ True False - ubl-settings-bootloader + System boot @@ -1572,6 +1353,7 @@ @@ -1642,6 +1424,7 @@ @@ -1651,35 +1434,13 @@ - - both - True - - - - - - - - both - True - - - - - - - - - - - - - False Внимание! + False + True center + com.ublinux.ubl-settings-bootloader dialog @@ -1705,7 +1466,7 @@ 5 5 50 - gtk-dialog-warning + dialog-information-symbolic True @@ -1916,11 +1677,12 @@ False True True - com.ublinux.ubl-settings-datetime + com.ublinux.ubl-settings-bootloader True False + 5 vertical @@ -2155,7 +1917,7 @@ True False - ubl-settings-bootloader + System boot @@ -2170,22 +1932,12 @@ - - - - - - - - False - start - start False + True 450 - 250 - dialog-question-symbolic + com.ublinux.ubl-settings-bootloader True @@ -2361,7 +2113,7 @@ True False - ubl-settings-bootloader + System boot @@ -2384,7 +2136,7 @@ False True True - com.ublinux.ubl-settings-datetime + com.ublinux.ubl-settings-bootloader @@ -2397,7 +2149,7 @@ True False - ubl-settings-bootloader + System boot diff --git a/ubl-settings-bootloader.pot b/ubl-settings-bootloader.pot index 7b40070..820815c 100644 --- a/ubl-settings-bootloader.pot +++ b/ubl-settings-bootloader.pot @@ -92,7 +92,7 @@ msgid "About" msgstr "" #: source/ubl-settings-bootloader.h:44 source/ubl-settings-bootloader.h:43 -msgid "About ubl-settings-bootloader" +msgid "About System boot" msgstr "" #: source/ubl-settings-bootloader.h:92 source/ubl-settings-bootloader.h:91 @@ -121,7 +121,7 @@ msgid "Boot screen display mode:" msgstr "" #: source/ubl-settings-bootloader.h:51 source/ubl-settings-bootloader.h:50 -msgid "Boot selection menu timer" +msgid "Boot selection menu timer:" msgstr "" #: source/ubl-settings-bootloader.h:62 source/ubl-settings-bootloader.h:61 @@ -308,12 +308,12 @@ msgstr "" #: source/ubl-settings-bootloader.h:73 source/ubl-settings-bootloader.h:72 #: source/ubl-settings-bootloader.cc:448 -msgid "Loading animation with the magazine" +msgid "Loading animation with log" msgstr "" #: source/ubl-settings-bootloader.h:74 source/ubl-settings-bootloader.h:73 #: source/ubl-settings-bootloader.cc:449 -msgid "Loading animation without a magazine" +msgid "Loading animation without log" msgstr "" #: source/ubl-settings-bootloader.h:85 source/ubl-settings-bootloader.h:84 @@ -387,7 +387,7 @@ msgstr "" #: source/ubl-settings-bootloader.h:41 source/ubl-settings-bootloader.h:40 #: source/ubl-settings-bootloader.cc:416 source/ubl-settings-bootloader.cc:420 #: source/ubl-settings-bootloader.cc:284 source/ubl-settings-bootloader.cc:288 -msgid "Project Home Page" +msgid "Project homepage" msgstr "" #: source/ubl-settings-bootloader.h:61 source/ubl-settings-bootloader.h:60 @@ -568,7 +568,7 @@ msgstr "" #: source/ubl-settings-bootloader.cc:413 source/ubl-settings-bootloader.cc:418 #: source/ubl-settings-bootloader.cc:439 source/ubl-settings-bootloader.cc:281 #: source/ubl-settings-bootloader.cc:286 source/ubl-settings-bootloader.cc:309 -msgid "ubl-settings-bootloader" +msgid "System boot" msgstr "" #: source/ubl-settings-bootloader.h:79 source/ubl-settings-bootloader.h:78 diff --git a/ubl-settings-bootloader_ru.po b/ubl-settings-bootloader_ru.po index 952e3ff..76d8cf1 100644 --- a/ubl-settings-bootloader_ru.po +++ b/ubl-settings-bootloader_ru.po @@ -44,7 +44,7 @@ msgid "About" msgstr "О программе" #: source/ubl-settings-bootloader.h:44 source/ubl-settings-bootloader.h:43 -msgid "About ubl-settings-bootloader" +msgid "About System boot" msgstr "О программе Загрузка системы" #: source/ubl-settings-bootloader.h:92 source/ubl-settings-bootloader.h:91 @@ -73,8 +73,8 @@ msgid "Boot screen display mode:" msgstr "Режим отображения экрана загрузки:" #: source/ubl-settings-bootloader.h:51 source/ubl-settings-bootloader.h:50 -msgid "Boot selection menu timer" -msgstr "Таймер меню выбора варианта загрузки" +msgid "Boot selection menu timer:" +msgstr "Таймер меню выбора варианта загрузки:" #: source/ubl-settings-bootloader.h:62 source/ubl-settings-bootloader.h:61 msgid "Cancel" @@ -282,12 +282,12 @@ msgstr "Режим отображения экрана загрузки:" #: source/ubl-settings-bootloader.h:73 source/ubl-settings-bootloader.h:72 #: source/ubl-settings-bootloader.cc:448 -msgid "Loading animation with the magazine" +msgid "Loading animation with log" msgstr "Анимация загрузки с журналом" #: source/ubl-settings-bootloader.h:74 source/ubl-settings-bootloader.h:73 #: source/ubl-settings-bootloader.cc:449 -msgid "Loading animation without a magazine" +msgid "Loading animation without log" msgstr "Анимация загрузки без журнала" #: source/ubl-settings-bootloader.h:85 source/ubl-settings-bootloader.h:84 @@ -364,7 +364,7 @@ msgstr "Предотвращает переход процессора в сос #: source/ubl-settings-bootloader.h:41 source/ubl-settings-bootloader.h:40 #: source/ubl-settings-bootloader.cc:416 source/ubl-settings-bootloader.cc:420 #: source/ubl-settings-bootloader.cc:284 source/ubl-settings-bootloader.cc:288 -msgid "Project Home Page" +msgid "Project homepage" msgstr "Домашняя страница проекта" #: source/ubl-settings-bootloader.h:61 source/ubl-settings-bootloader.h:60 @@ -605,7 +605,7 @@ msgstr "splash (Показать окно приветствия)" #: source/ubl-settings-bootloader.cc:413 source/ubl-settings-bootloader.cc:418 #: source/ubl-settings-bootloader.cc:439 source/ubl-settings-bootloader.cc:281 #: source/ubl-settings-bootloader.cc:286 source/ubl-settings-bootloader.cc:309 -msgid "ubl-settings-bootloader" +msgid "System boot" msgstr "Загрузка системы" #: source/ubl-settings-bootloader.h:79 source/ubl-settings-bootloader.h:78