Дан текстовый файл, каждая строка которого имеет предложенный ниже формат. Необходимо вывести его данные в виде таблицы, и выполнить указанную обработку. Имя файла  задается пользователем. Если выбранный файл имеет иной формат, то сообщить об этом, используя механизм исключений. В качестве интерфейса для ввода исходных данных и вывода результатов использовать web-интерфейс организованный с помощью фреймворка Vaadin. Для выбора операции организовать вертикальное меню, для расположения компонентов использовать `GridLayout`, у страницы должен быть заголовок, например, «Лабораторная работа №4» (стиль заголовка выбрать самостоятельно, заголовок поместить в одну из ячеек `GridLayout`). Данные из фала считать двумя способами: 1. Стандартное чтение из потока с помощью классов `FileReader` или `Scanner` 2. Чтение из потока в функциональном стиле, используя метод `lines()` класса `Files` Сообщение об исключительной ситуации также отразить на странице.  Ниже приведен небольшой пример создания таблицы с помощью списка объектов `Person` и вывода некоторой информации о таблице. ```java package mypack; public class Person {     String name;     String profession;     String age;     public Person(String name, String profession, String age) {         this.name = name;         this.profession = profession;         this.age = age;     }         public String getName() {         return name;     }     public String getProfession() {         return profession;     }     public String getAge() {         return age;     } } ``` ```java package org.example; import java.lang.*; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import com.vaadin.flow.component.Component; import com.vaadin.flow.component.grid.Grid; import com.vaadin.flow.component.html.Div; import com.vaadin.flow.component.html.Paragraph; import com.vaadin.flow.component.orderedlayout.HorizontalLayout; import com.vaadin.flow.component.tabs.Tab; import com.vaadin.flow.component.tabs.Tabs; import com.vaadin.flow.router.Route; import mypack.Person; @Route public class MainView extends HorizontalLayout { // Создаем таблицу, заполняем её данными из списка     class MyGrid{         private Grid grid = new Grid<>(Person.class, false);         private List lst=new ArrayList<>();         MyGrid(){             grid.addColumn(Person::getName).setHeader("Фамилия").setAutoWidth(true);             grid.addColumn(Person::getProfession).setHeader("Профессия").setAutoWidth(true);             grid.addColumn(Person::getAge).setHeader("Возраст").setAutoWidth(true);             lst.add(new Person("Иванов", "врач", "45"));             lst.add(new Person("Петров", "водитель", "25"));             lst.add(new Person("Сидоров", "учитель", "47"));             lst.add(new Person("Семёнов", "продавец", "35"));             lst.add(new Person("Крокодилов", "директор", "55"));             grid.setItems(lst);             grid.setAllRowsVisible(true);         }         public Grid getGrid() {             return grid;         }         public  String toString(){             return Integer._valueOf_(lst.size()).toString();         }     }     public MainView() { // Создаем вертикальное меню, связываем каждый пункт меню с компонентом         Map tabsToComponents = new HashMap<>();         Tab t1 = new Tab("Таблица");         MyGrid gr=new MyGrid();         tabsToComponents.put(t1, gr.getGrid());         Paragraph label = new Paragraph("В таблице "+gr+" строк");         Tab t2 = new Tab("Кое-что о таблице");         tabsToComponents.put(t2, label);         Tabs tabs = new Tabs(t1, t2);         tabs.setOrientation(Tabs.Orientation._VERTICAL_);         tabs.setHeight("240px");         tabs.setWidth("240px");        // Обрабатываем событие выбор пункта меню         tabs.addSelectedChangeListener(event -> {             tabsToComponents.values().forEach(component -> component.setVisible(false));             tabsToComponents.get(tabs.getSelectedTab()).setVisible(true);         });         tabsToComponents.values().forEach(component -> component.setVisible(false));         tabsToComponents.get(t1).setVisible(true);               // Итоговое добавление компонентов на страницу        Div pages = new Div(gr.getGrid(), label);         this.add(tabs, pages);     } } ``` **Вариант 9:** Школа. Найти суммарную нагрузку всех учителей школы, а также по названию предмета, определить, кто из учителей его преподает. Формат строки: Фамилия учителя (строка из 20 символов) предмет (строка из 20 символов) количество часов в неделю (целое число).