статистика по вакансии
This commit is contained in:
@@ -84,11 +84,10 @@ namespace CandidateReviewBusinessLogic.BusinessLogic
|
||||
Name = u.Name,
|
||||
LastName = u.LastName,
|
||||
Email = u.Email,
|
||||
EmailConfirmed = u.EmailConfirmed,
|
||||
AvatarFilePath = u.AvatarFilePath,
|
||||
Password = u.Password,
|
||||
PhoneNumber = u.PhoneNumber,
|
||||
Role = u.Role
|
||||
Role = u.Role,
|
||||
DateOfBirth = u.DateOfBirth
|
||||
}).ToList() ?? new List<UserViewModel>();
|
||||
|
||||
var companyViewModel = new CompanyViewModel
|
||||
|
||||
@@ -46,5 +46,35 @@ namespace CandidateReviewBusinessLogic.BusinessLogic
|
||||
Resume = GetResume(model)
|
||||
});
|
||||
}
|
||||
|
||||
public List<ResumeViewModel> GetResumesStatistics(ReportBindingModel model)
|
||||
{
|
||||
var list = _resumeStorage.GetFullList().Where(resume =>
|
||||
(!model.DateFrom.HasValue || resume.CreatedAt >= model.DateFrom.Value) &&
|
||||
(!model.DateTo.HasValue || resume.CreatedAt <= model.DateTo.Value)).ToList();
|
||||
|
||||
foreach (var item in list)
|
||||
{
|
||||
item.UserName = _userStorage.GetElement(new UserSearchModel { Id = item.UserId }).Surname + " " + _userStorage.GetElement(new UserSearchModel { Id = item.UserId }).Name + " " + _userStorage.GetElement(new UserSearchModel { Id = item.UserId }).LastName;
|
||||
}
|
||||
|
||||
if (list != null)
|
||||
{
|
||||
return list;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public void SaveResumesStatisticsToPdf(ReportBindingModel model)
|
||||
{
|
||||
_saveToPdf.CreateDocStatistics(new PdfInfo
|
||||
{
|
||||
FileName = model.FileName,
|
||||
Title = "Статистика по откликам на вакансию",
|
||||
Resumes = GetResumesStatistics(model),
|
||||
DateFrom = model.DateFrom,
|
||||
DateTo = model.DateTo
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -79,10 +79,10 @@ namespace CandidateReviewBusinessLogic.BusinessLogic
|
||||
Title = element.Title,
|
||||
Experience = element.Experience,
|
||||
Education = element.Education,
|
||||
PhotoFilePath = element.PhotoFilePath,
|
||||
Description = element.Description,
|
||||
Skills = element.Skills,
|
||||
Status = element.Status,
|
||||
CreatedAt = element.CreatedAt,
|
||||
Assessments = assessmentViewModels
|
||||
};
|
||||
|
||||
@@ -121,10 +121,10 @@ namespace CandidateReviewBusinessLogic.BusinessLogic
|
||||
Title = element.Title,
|
||||
Experience = element.Experience,
|
||||
Education = element.Education,
|
||||
PhotoFilePath = element.PhotoFilePath,
|
||||
Description = element.Description,
|
||||
Skills = element.Skills,
|
||||
Status = element.Status,
|
||||
CreatedAt = element.CreatedAt,
|
||||
Assessments = assessmentViewModels
|
||||
};
|
||||
result.Add(resumeViewModel);
|
||||
|
||||
@@ -77,9 +77,9 @@ namespace CandidateReviewBusinessLogic.BusinessLogic
|
||||
Title = r.Title,
|
||||
Experience = r.Experience,
|
||||
Education = r.Education,
|
||||
PhotoFilePath = r.PhotoFilePath,
|
||||
Description = r.Description,
|
||||
Skills = r.Skills,
|
||||
CreatedAt = r.CreatedAt,
|
||||
Status = r.Status
|
||||
}).ToList() ?? new List<ResumeViewModel>();
|
||||
|
||||
@@ -97,11 +97,10 @@ namespace CandidateReviewBusinessLogic.BusinessLogic
|
||||
LastName = element.LastName,
|
||||
Email = element.Email,
|
||||
Password = hashedPassword,
|
||||
EmailConfirmed = element.EmailConfirmed,
|
||||
AvatarFilePath = element.AvatarFilePath,
|
||||
CompanyId = element.CompanyId,
|
||||
PhoneNumber = element.PhoneNumber,
|
||||
Role = element.Role,
|
||||
DateOfBirth = element.DateOfBirth,
|
||||
Resumes = resumeViewModels
|
||||
};
|
||||
_logger.LogInformation("ReadElement: User found. Id: {Id}", element.Id);
|
||||
@@ -163,7 +162,12 @@ namespace CandidateReviewBusinessLogic.BusinessLogic
|
||||
if (string.IsNullOrEmpty(model.Name))
|
||||
{
|
||||
throw new ArgumentNullException("Нет имени пользователя", nameof(model.Name));
|
||||
}
|
||||
}
|
||||
|
||||
if (model.DateOfBirth >= DateTime.Now.ToUniversalTime().AddHours(4))
|
||||
{
|
||||
throw new ArgumentOutOfRangeException("Дата рождения не может быть позже текущей", nameof(model.DateOfBirth));
|
||||
}
|
||||
|
||||
if (string.IsNullOrEmpty(model.Email))
|
||||
{
|
||||
|
||||
@@ -70,10 +70,10 @@ namespace CandidateReviewBusinessLogic.BusinessLogic
|
||||
Title = r.Title,
|
||||
Experience = r.Experience,
|
||||
Education = r.Education,
|
||||
PhotoFilePath = r.PhotoFilePath,
|
||||
Description = r.Description,
|
||||
Skills = r.Skills,
|
||||
Status = r.Status
|
||||
Status = r.Status,
|
||||
CreatedAt = r.CreatedAt
|
||||
}).ToList() ?? new List<ResumeViewModel>();
|
||||
|
||||
var vacancyViewModel = new VacancyViewModel
|
||||
|
||||
@@ -5,11 +5,42 @@ namespace CandidateReviewBusinessLogic.OfficePackage
|
||||
{
|
||||
public abstract class AbstractSaveToPdf
|
||||
{
|
||||
public void CreateDocStatistics(PdfInfo info)
|
||||
{
|
||||
CreatePdf(info);
|
||||
|
||||
CreateParagraph(new PdfParagraph
|
||||
{
|
||||
Text = info.Title,
|
||||
Style = "NormalTitle",
|
||||
ParagraphAlignment = PdfParagraphAlignmentType.Center
|
||||
});
|
||||
|
||||
int totalResumes = info.Resumes.Count;
|
||||
|
||||
CreateParagraph(new PdfParagraph
|
||||
{
|
||||
Text = $"Общее количество резюме: {totalResumes}",
|
||||
Style = "Normal",
|
||||
ParagraphAlignment = PdfParagraphAlignmentType.Left
|
||||
});
|
||||
|
||||
foreach (var resume in info.Resumes)
|
||||
{
|
||||
CreateParagraph(new PdfParagraph
|
||||
{
|
||||
Text = $"- Кандидат: {resume.UserName}, Дата создания: {resume.CreatedAt:dd.MM.yyyy}, Статус: {resume.Status}",
|
||||
Style = "Normal",
|
||||
ParagraphAlignment = PdfParagraphAlignmentType.Left
|
||||
});
|
||||
}
|
||||
SavePdf(info);
|
||||
}
|
||||
|
||||
public void CreateDocReportResume(PdfInfo info)
|
||||
{
|
||||
CreatePdf(info);
|
||||
|
||||
// Заголовок резюме
|
||||
CreateParagraph(new PdfParagraph
|
||||
{
|
||||
Text = $"Резюме: {info.Title}",
|
||||
@@ -17,7 +48,6 @@ namespace CandidateReviewBusinessLogic.OfficePackage
|
||||
ParagraphAlignment = PdfParagraphAlignmentType.Center
|
||||
});
|
||||
|
||||
// ФИО и вакансия
|
||||
CreateParagraph(new PdfParagraph
|
||||
{
|
||||
Text = $"ФИО: {info.Resume.UserName ?? "Не указано"}",
|
||||
@@ -32,7 +62,6 @@ namespace CandidateReviewBusinessLogic.OfficePackage
|
||||
ParagraphAlignment = PdfParagraphAlignmentType.Left
|
||||
});
|
||||
|
||||
// Образование
|
||||
CreateParagraph(new PdfParagraph
|
||||
{
|
||||
Text = "Образование:",
|
||||
@@ -47,7 +76,6 @@ namespace CandidateReviewBusinessLogic.OfficePackage
|
||||
ParagraphAlignment = PdfParagraphAlignmentType.Left
|
||||
});
|
||||
|
||||
// Опыт работы
|
||||
CreateParagraph(new PdfParagraph
|
||||
{
|
||||
Text = "Опыт работы:",
|
||||
@@ -62,7 +90,6 @@ namespace CandidateReviewBusinessLogic.OfficePackage
|
||||
ParagraphAlignment = PdfParagraphAlignmentType.Left
|
||||
});
|
||||
|
||||
// Навыки
|
||||
CreateParagraph(new PdfParagraph
|
||||
{
|
||||
Text = "Навыки:",
|
||||
@@ -77,7 +104,6 @@ namespace CandidateReviewBusinessLogic.OfficePackage
|
||||
ParagraphAlignment = PdfParagraphAlignmentType.Left
|
||||
});
|
||||
|
||||
// Описание
|
||||
CreateParagraph(new PdfParagraph
|
||||
{
|
||||
Text = "Описание:",
|
||||
|
||||
@@ -6,8 +6,9 @@ namespace CandidateReviewBusinessLogic.OfficePackage.HelperModels
|
||||
{
|
||||
public string FileName { get; set; } = string.Empty;
|
||||
public string Title { get; set; } = string.Empty;
|
||||
public DateTime DateFrom { get; set; }
|
||||
public DateTime DateTo { get; set; }
|
||||
public DateTime? DateFrom { get; set; }
|
||||
public DateTime? DateTo { get; set; }
|
||||
public ResumeViewModel Resume { get; set; } = new();
|
||||
public List<ResumeViewModel> Resumes { get; set; } = new();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -71,10 +71,9 @@ namespace CandidateReviewClientApp.Controllers
|
||||
CompanyId = companyId,
|
||||
Email = APIClient.User.Email,
|
||||
Password = APIClient.User.Password,
|
||||
EmailConfirmed = APIClient.User.EmailConfirmed,
|
||||
Role = APIClient.User.Role,
|
||||
AvatarFilePath = APIClient.User.AvatarFilePath,
|
||||
PhoneNumber = APIClient.User.PhoneNumber
|
||||
PhoneNumber = APIClient.User.PhoneNumber,
|
||||
DateOfBirth = APIClient.User.DateOfBirth
|
||||
});
|
||||
APIClient.Company = APIClient.GetRequest<CompanyViewModel?>($"api/company/profile?id={companyId}");
|
||||
}
|
||||
|
||||
@@ -63,7 +63,7 @@ namespace CandidateReviewUserApp.Controllers
|
||||
}
|
||||
|
||||
[HttpPost]
|
||||
public IActionResult Register(string login, string password, string surname, string name, string lastname)
|
||||
public IActionResult Register(string login, string password, string surname, string name, string lastname, DateTime dateOfBirth)
|
||||
{
|
||||
string returnUrl = HttpContext.Request.Headers["Referer"].ToString();
|
||||
try
|
||||
@@ -90,8 +90,8 @@ namespace CandidateReviewUserApp.Controllers
|
||||
LastName = lastname ?? null,
|
||||
Email = login,
|
||||
Password = password,
|
||||
EmailConfirmed = false,
|
||||
Role = role
|
||||
Role = role,
|
||||
DateOfBirth = dateOfBirth
|
||||
});
|
||||
|
||||
return RedirectToAction("Enter");
|
||||
|
||||
@@ -24,7 +24,6 @@ namespace CandidateReviewClientApp.Controllers
|
||||
return Redirect("~Home/Enter");
|
||||
}
|
||||
|
||||
// Получение данных резюме
|
||||
var resume = APIClient.GetRequest<ResumeViewModel>($"/api/resume/details?id={id}");
|
||||
if (resume == null)
|
||||
{
|
||||
@@ -44,7 +43,7 @@ namespace CandidateReviewClientApp.Controllers
|
||||
return NotFound("Файл отчета не найден.");
|
||||
}
|
||||
|
||||
return PhysicalFile(reportFilePath, "application/pdf", $"Resume_{resume.UserName}.pdf");
|
||||
return PhysicalFile(reportFilePath, "application/pdf", $"Резюме_{resume.UserName}.pdf");
|
||||
}
|
||||
|
||||
[HttpGet]
|
||||
@@ -169,7 +168,7 @@ namespace CandidateReviewClientApp.Controllers
|
||||
{
|
||||
throw new Exception("Пользователь не найден");
|
||||
}
|
||||
if (vacancy != null)
|
||||
if (vacancy != null && model.Status != CandidateReviewDataModels.Enums.ResumeStatusEnum.Черновик)
|
||||
{
|
||||
vacancy.Resumes.Add(new ResumeViewModel
|
||||
{
|
||||
|
||||
@@ -85,10 +85,9 @@ namespace CandidateReviewClientApp.Controllers
|
||||
CompanyId = APIClient.Company.Id,
|
||||
Email = model.Email,
|
||||
Password = model.Password,
|
||||
EmailConfirmed = model.EmailConfirmed,
|
||||
Role = CandidateReviewDataModels.Enums.RoleEnum.Сотрудник,
|
||||
AvatarFilePath = model.AvatarFilePath,
|
||||
PhoneNumber = model.PhoneNumber
|
||||
PhoneNumber = model.PhoneNumber,
|
||||
DateOfBirth = model.DateOfBirth
|
||||
});
|
||||
}
|
||||
return Redirect($"~/Company/CompanyProfile/{model.CompanyId}");
|
||||
|
||||
@@ -14,6 +14,63 @@ namespace CandidateReviewClientApp.Controllers
|
||||
{
|
||||
_logger = logger;
|
||||
}
|
||||
|
||||
[HttpGet]
|
||||
public IActionResult VacancyStatistics(int id)
|
||||
{
|
||||
if (APIClient.User == null)
|
||||
{
|
||||
return Redirect("~Home/Enter");
|
||||
}
|
||||
|
||||
var vacancy = APIClient.GetRequest<VacancyViewModel>($"/api/vacancy/details?id={id}");
|
||||
if (vacancy == null)
|
||||
{
|
||||
return NotFound("Вакансия не найдена.");
|
||||
}
|
||||
|
||||
var viewModel = new VacancyStatisticsViewModel
|
||||
{
|
||||
DateFrom = DateTime.UtcNow,
|
||||
DateTo = DateTime.UtcNow,
|
||||
VacancyId = vacancy.Id
|
||||
};
|
||||
|
||||
return View(viewModel);
|
||||
}
|
||||
|
||||
[HttpGet]
|
||||
public IActionResult GetStatistics(int id, DateTime dateFrom, DateTime dateTo)
|
||||
{
|
||||
if (APIClient.User == null)
|
||||
{
|
||||
return Redirect("~Home/Enter");
|
||||
}
|
||||
|
||||
var vacancy = APIClient.GetRequest<VacancyViewModel>($"/api/vacancy/details?id={id}");
|
||||
if (vacancy == null)
|
||||
{
|
||||
return NotFound("Вакансия не найдена.");
|
||||
}
|
||||
|
||||
var reportFilePath = $"C:\\Users\\User\\source\\repos\\CandidateReview\\Статистика_по_вакансии_{vacancy.JobTitle}.pdf";
|
||||
|
||||
APIClient.PostRequest("api/report/statistics", new ReportBindingModel
|
||||
{
|
||||
VacancyId = vacancy.Id,
|
||||
FileName = reportFilePath,
|
||||
DateFrom = dateFrom,
|
||||
DateTo = dateTo
|
||||
});
|
||||
|
||||
if (!System.IO.File.Exists(reportFilePath))
|
||||
{
|
||||
return NotFound("Файл отчета не найден.");
|
||||
}
|
||||
|
||||
return PhysicalFile(reportFilePath, "application/pdf", $"Статистика_по_вакансии_{vacancy.JobTitle}.pdf");
|
||||
}
|
||||
|
||||
[HttpGet]
|
||||
public IActionResult VacancyDetails(int? id)
|
||||
{
|
||||
|
||||
@@ -32,6 +32,13 @@
|
||||
<label for="password">Пароль:</label>
|
||||
<input type="password" class="form-control" id="password" name="password" required>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="dateOfBirth">Дата рождения:</label>
|
||||
<input type="date" class="form-control" id="dateOfBirth" name="dateOfBirth" required>
|
||||
<div class="invalid-feedback">
|
||||
Выберите корректную дату рождения.
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group text-center mt-3">
|
||||
<button type="submit" class="btn btn-primary">Зарегистрироваться</button>
|
||||
</div>
|
||||
@@ -45,6 +52,25 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
document.addEventListener("DOMContentLoaded", function () {
|
||||
const dateOfBirthInput = document.getElementById("dateOfBirth");
|
||||
const today = new Date().toISOString().split("T")[0];
|
||||
|
||||
dateOfBirthInput.setAttribute("max", today);
|
||||
|
||||
document.getElementById("submitBtn").addEventListener("click", function (event) {
|
||||
if (!dateOfBirthInput.value || dateOfBirthInput.value > today) {
|
||||
dateOfBirthInput.classList.add("is-invalid");
|
||||
event.preventDefault();
|
||||
} else {
|
||||
dateOfBirthInput.classList.remove("is-invalid");
|
||||
alert("Форма успешно отправлена!");
|
||||
}
|
||||
});
|
||||
});
|
||||
</script>
|
||||
|
||||
|
||||
<style>
|
||||
body {
|
||||
|
||||
@@ -29,8 +29,8 @@
|
||||
<dt class="col-sm-4 text-muted">Телефон:</dt>
|
||||
<dd class="col-sm-8">@Model?.PhoneNumber</dd>
|
||||
}
|
||||
<dt class="col-sm-4 text-muted">Роль:</dt>
|
||||
<dd class="col-sm-8">@Model?.Role</dd>
|
||||
<dt class="col-sm-4 text-muted">Дата рождения:</dt>
|
||||
<dd class="col-sm-8">@Model?.DateOfBirth.ToString("dd.MM.yyyy")</dd>
|
||||
</dl>
|
||||
|
||||
<div class="btn-group mt-4" role="group" aria-label="Действия">
|
||||
|
||||
@@ -34,6 +34,14 @@
|
||||
<input type="email" class="form-control" id="Email" name="Email" value="@Model?.Email" @(Model?.Id < 0 ? "readonly" : "") required />
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="dateOfBirth">Дата рождения:</label>
|
||||
<input type="date" class="form-control" id="dateOfBirth" name="dateOfBirth" value="@Model?.DateOfBirth.ToString("dd.MM.yyyy")" required>
|
||||
<div class="invalid-feedback">
|
||||
Выберите корректную дату рождения.
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@if (Model?.Id <= 0)
|
||||
{
|
||||
<div class="mb-3">
|
||||
@@ -62,6 +70,25 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
document.addEventListener("DOMContentLoaded", function () {
|
||||
const dateOfBirthInput = document.getElementById("dateOfBirth");
|
||||
const today = new Date().toISOString().split("T")[0];
|
||||
|
||||
dateOfBirthInput.setAttribute("max", today);
|
||||
|
||||
document.getElementById("submitBtn").addEventListener("click", function (event) {
|
||||
if (!dateOfBirthInput.value || dateOfBirthInput.value > today) {
|
||||
dateOfBirthInput.classList.add("is-invalid");
|
||||
event.preventDefault();
|
||||
} else {
|
||||
dateOfBirthInput.classList.remove("is-invalid");
|
||||
alert("Форма успешно отправлена!");
|
||||
}
|
||||
});
|
||||
});
|
||||
</script>
|
||||
|
||||
@section Scripts {
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.inputmask/5.0.7-beta.29/jquery.inputmask.min.js"></script>
|
||||
|
||||
@@ -15,6 +15,22 @@
|
||||
<button class="btn btn-secondary" onclick="window.history.back();">
|
||||
<i class="bi bi-arrow-left"></i> Назад
|
||||
</button>
|
||||
<form asp-controller="Vacancy" asp-action="GetStatistics" method="get" class="row g-3 needs-validation" novalidate>
|
||||
<input type="hidden" name="id" value="@Model.Id" />
|
||||
<div class="col-md-4">
|
||||
<div class="form-group">
|
||||
<label for="dateFrom">Дата начала</label>
|
||||
<input type="date" class="form-control" id="dateFrom" name="dateFrom" required />
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<div class="form-group">
|
||||
<label for="dateTo">Дата окончания</label>
|
||||
<input type="date" class="form-control" id="dateTo" name="dateTo" required />
|
||||
</div>
|
||||
</div>
|
||||
<button type="submit" class="btn btn-primary">Скачать статистику</button>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<div class="card shadow-sm mb-4">
|
||||
|
||||
@@ -6,5 +6,6 @@
|
||||
public DateTime? DateFrom { get; set; }
|
||||
public DateTime? DateTo { get; set; }
|
||||
public int ResumeId { get; set; }
|
||||
public int VacancyId { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,14 +15,14 @@ namespace CandidateReviewContracts.BindingModels
|
||||
|
||||
public string Education { get; set; } = string.Empty;
|
||||
|
||||
public string? PhotoFilePath { get; set; }
|
||||
|
||||
public string? Description { get; set; }
|
||||
|
||||
public string Skills { get; set; } = string.Empty;
|
||||
|
||||
public ResumeStatusEnum Status { get; set; }
|
||||
|
||||
public DateTime CreatedAt { get; set; }
|
||||
|
||||
public int Id { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,18 +13,16 @@ namespace CandidateReviewContracts.BindingModels
|
||||
|
||||
public string? LastName { get; set; }
|
||||
|
||||
public string? AvatarFilePath { get; set; }
|
||||
|
||||
public string Email { get; set; } = string.Empty;
|
||||
|
||||
public string Password { get; set; } = string.Empty;
|
||||
|
||||
public string? PhoneNumber { get; set; }
|
||||
|
||||
public bool EmailConfirmed { get; set; }
|
||||
|
||||
public RoleEnum Role { get; set; }
|
||||
|
||||
public DateTime DateOfBirth { get; set; }
|
||||
|
||||
public int Id { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,6 +4,7 @@ namespace CandidateReviewContracts.BusinessLogicsContracts
|
||||
{
|
||||
public interface IReportLogic
|
||||
{
|
||||
void SaveResumeToPdf(ReportBindingModel model);
|
||||
void SaveResumeToPdf(ReportBindingModel model);
|
||||
void SaveResumesStatisticsToPdf(ReportBindingModel model);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,6 +8,8 @@
|
||||
|
||||
public string? Title { get; set; }
|
||||
|
||||
public DateTime? CreatedAt { get; set; }
|
||||
|
||||
public int? Id { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -18,15 +18,14 @@ namespace CandidateReviewContracts.ViewModels
|
||||
public string Experience { get; set; } = string.Empty;
|
||||
|
||||
public string Education { get; set; } = string.Empty;
|
||||
|
||||
public string? PhotoFilePath { get; set; }
|
||||
|
||||
public string? Description { get; set; }
|
||||
|
||||
public string Skills { get; set; } = string.Empty;
|
||||
|
||||
public ResumeStatusEnum Status { get; set; }
|
||||
|
||||
public DateTime CreatedAt { get; set; }
|
||||
|
||||
public int Id { get; set; }
|
||||
public List<AssessmentViewModel> Assessments { get; set; } = new();
|
||||
}
|
||||
|
||||
@@ -12,19 +12,15 @@ namespace CandidateReviewContracts.ViewModels
|
||||
public string Name { get; set; } = string.Empty;
|
||||
|
||||
public string? LastName { get; set; }
|
||||
|
||||
public string? AvatarFilePath { get; set; }
|
||||
|
||||
public string Email { get; set; } = string.Empty;
|
||||
|
||||
public string Password { get; set; } = string.Empty;
|
||||
|
||||
public string? PhoneNumber { get; set; }
|
||||
|
||||
public bool EmailConfirmed { get; set; }
|
||||
|
||||
public RoleEnum Role { get; set; }
|
||||
|
||||
public DateTime DateOfBirth { get; set; }
|
||||
|
||||
public int Id { get; set; }
|
||||
|
||||
public List<ResumeViewModel> Resumes { get; set; } = new();
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
namespace CandidateReviewContracts.ViewModels
|
||||
{
|
||||
public class VacancyStatisticsViewModel
|
||||
{
|
||||
public DateTime DateFrom { get; set; }
|
||||
public DateTime DateTo { get; set; }
|
||||
public int VacancyId { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -9,9 +9,9 @@ namespace CandidateReviewDataModels.Models
|
||||
string Title { get; }
|
||||
string Experience { get; }
|
||||
string Education { get; }
|
||||
string? PhotoFilePath { get; }
|
||||
string? Description { get; }
|
||||
string Skills { get; }
|
||||
DateTime CreatedAt { get; }
|
||||
ResumeStatusEnum Status { get; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,11 +8,10 @@ namespace CandidateReviewDataModels.Models
|
||||
string Surname { get; }
|
||||
string Name { get; }
|
||||
string? LastName { get; }
|
||||
string? AvatarFilePath { get; }
|
||||
string Email { get; }
|
||||
string Password { get; }
|
||||
string? PhoneNumber { get; }
|
||||
bool EmailConfirmed { get; }
|
||||
DateTime DateOfBirth { get; }
|
||||
RoleEnum Role { get; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -12,7 +12,7 @@ using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
|
||||
namespace CandidateReviewDatabaseImplement.Migrations
|
||||
{
|
||||
[DbContext(typeof(CandidateReviewDatabase))]
|
||||
[Migration("20241213205048_InitialCreate")]
|
||||
[Migration("20241215102357_InitialCreate")]
|
||||
partial class InitialCreate
|
||||
{
|
||||
/// <inheritdoc />
|
||||
@@ -130,6 +130,9 @@ namespace CandidateReviewDatabaseImplement.Migrations
|
||||
|
||||
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
|
||||
|
||||
b.Property<DateTime>("CreatedAt")
|
||||
.HasColumnType("timestamp with time zone");
|
||||
|
||||
b.Property<string>("Description")
|
||||
.HasColumnType("text");
|
||||
|
||||
@@ -141,9 +144,6 @@ namespace CandidateReviewDatabaseImplement.Migrations
|
||||
.IsRequired()
|
||||
.HasColumnType("text");
|
||||
|
||||
b.Property<string>("PhotoFilePath")
|
||||
.HasColumnType("text");
|
||||
|
||||
b.Property<string>("Skills")
|
||||
.IsRequired()
|
||||
.HasColumnType("text");
|
||||
@@ -178,19 +178,16 @@ namespace CandidateReviewDatabaseImplement.Migrations
|
||||
|
||||
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
|
||||
|
||||
b.Property<string>("AvatarFilePath")
|
||||
.HasColumnType("text");
|
||||
|
||||
b.Property<int?>("CompanyId")
|
||||
.HasColumnType("integer");
|
||||
|
||||
b.Property<DateTime>("DateOfBirth")
|
||||
.HasColumnType("timestamp with time zone");
|
||||
|
||||
b.Property<string>("Email")
|
||||
.IsRequired()
|
||||
.HasColumnType("text");
|
||||
|
||||
b.Property<bool>("EmailConfirmed")
|
||||
.HasColumnType("boolean");
|
||||
|
||||
b.Property<string>("LastName")
|
||||
.HasColumnType("text");
|
||||
|
||||
@@ -68,12 +68,11 @@ namespace CandidateReviewDatabaseImplement.Migrations
|
||||
Surname = table.Column<string>(type: "text", nullable: false),
|
||||
Name = table.Column<string>(type: "text", nullable: false),
|
||||
LastName = table.Column<string>(type: "text", nullable: true),
|
||||
AvatarFilePath = table.Column<string>(type: "text", nullable: true),
|
||||
Email = table.Column<string>(type: "text", nullable: false),
|
||||
Password = table.Column<string>(type: "text", nullable: false),
|
||||
PhoneNumber = table.Column<string>(type: "text", nullable: true),
|
||||
EmailConfirmed = table.Column<bool>(type: "boolean", nullable: false),
|
||||
Role = table.Column<int>(type: "integer", nullable: false)
|
||||
Role = table.Column<int>(type: "integer", nullable: false),
|
||||
DateOfBirth = table.Column<DateTime>(type: "timestamp with time zone", nullable: false)
|
||||
},
|
||||
constraints: table =>
|
||||
{
|
||||
@@ -124,10 +123,10 @@ namespace CandidateReviewDatabaseImplement.Migrations
|
||||
Title = table.Column<string>(type: "text", nullable: false),
|
||||
Experience = table.Column<string>(type: "text", nullable: false),
|
||||
Education = table.Column<string>(type: "text", nullable: false),
|
||||
PhotoFilePath = table.Column<string>(type: "text", nullable: true),
|
||||
Description = table.Column<string>(type: "text", nullable: true),
|
||||
Skills = table.Column<string>(type: "text", nullable: false),
|
||||
Status = table.Column<int>(type: "integer", nullable: false)
|
||||
Status = table.Column<int>(type: "integer", nullable: false),
|
||||
CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false)
|
||||
},
|
||||
constraints: table =>
|
||||
{
|
||||
@@ -127,6 +127,9 @@ namespace CandidateReviewDatabaseImplement.Migrations
|
||||
|
||||
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
|
||||
|
||||
b.Property<DateTime>("CreatedAt")
|
||||
.HasColumnType("timestamp with time zone");
|
||||
|
||||
b.Property<string>("Description")
|
||||
.HasColumnType("text");
|
||||
|
||||
@@ -138,9 +141,6 @@ namespace CandidateReviewDatabaseImplement.Migrations
|
||||
.IsRequired()
|
||||
.HasColumnType("text");
|
||||
|
||||
b.Property<string>("PhotoFilePath")
|
||||
.HasColumnType("text");
|
||||
|
||||
b.Property<string>("Skills")
|
||||
.IsRequired()
|
||||
.HasColumnType("text");
|
||||
@@ -175,19 +175,16 @@ namespace CandidateReviewDatabaseImplement.Migrations
|
||||
|
||||
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
|
||||
|
||||
b.Property<string>("AvatarFilePath")
|
||||
.HasColumnType("text");
|
||||
|
||||
b.Property<int?>("CompanyId")
|
||||
.HasColumnType("integer");
|
||||
|
||||
b.Property<DateTime>("DateOfBirth")
|
||||
.HasColumnType("timestamp with time zone");
|
||||
|
||||
b.Property<string>("Email")
|
||||
.IsRequired()
|
||||
.HasColumnType("text");
|
||||
|
||||
b.Property<bool>("EmailConfirmed")
|
||||
.HasColumnType("boolean");
|
||||
|
||||
b.Property<string>("LastName")
|
||||
.HasColumnType("text");
|
||||
|
||||
|
||||
@@ -19,14 +19,13 @@ namespace CandidateReviewDatabaseImplement.Models
|
||||
public string Experience { get; set; } = string.Empty;
|
||||
[Required]
|
||||
public string Education { get; set; } = string.Empty;
|
||||
|
||||
public string? PhotoFilePath { get; set; }
|
||||
|
||||
public string? Description { get; set; }
|
||||
[Required]
|
||||
public string Skills { get; set; } = string.Empty;
|
||||
[Required]
|
||||
public ResumeStatusEnum Status { get; set; }
|
||||
[Required]
|
||||
public DateTime CreatedAt { get; set; }
|
||||
|
||||
public int Id { get; set; }
|
||||
|
||||
@@ -47,10 +46,10 @@ namespace CandidateReviewDatabaseImplement.Models
|
||||
Title = model.Title,
|
||||
Experience = model.Experience,
|
||||
Education = model.Education,
|
||||
PhotoFilePath = model.PhotoFilePath,
|
||||
Description = model.Description,
|
||||
Skills = model.Skills,
|
||||
Status = model.Status
|
||||
Status = model.Status,
|
||||
CreatedAt = DateTime.Now.ToUniversalTime().AddHours(4)
|
||||
};
|
||||
}
|
||||
public static Resume Create(ResumeViewModel model)
|
||||
@@ -63,10 +62,10 @@ namespace CandidateReviewDatabaseImplement.Models
|
||||
Title = model.Title,
|
||||
Experience = model.Experience,
|
||||
Education = model.Education,
|
||||
PhotoFilePath = model.PhotoFilePath,
|
||||
Description = model.Description,
|
||||
Skills = model.Skills,
|
||||
Status = model.Status
|
||||
Status = model.Status,
|
||||
CreatedAt = DateTime.Now.ToUniversalTime().AddHours(4)
|
||||
};
|
||||
}
|
||||
public void Update(ResumeBindingModel model)
|
||||
@@ -80,7 +79,6 @@ namespace CandidateReviewDatabaseImplement.Models
|
||||
Title = model.Title;
|
||||
Experience = model.Experience;
|
||||
Education = model.Education;
|
||||
PhotoFilePath = model.PhotoFilePath;
|
||||
Description = model.Description;
|
||||
Skills = model.Skills;
|
||||
Status = model.Status;
|
||||
@@ -93,10 +91,10 @@ namespace CandidateReviewDatabaseImplement.Models
|
||||
Title = Title,
|
||||
Experience = Experience,
|
||||
Education = Education,
|
||||
PhotoFilePath = PhotoFilePath,
|
||||
Description = Description,
|
||||
Skills = Skills,
|
||||
Status = Status
|
||||
Status = Status,
|
||||
CreatedAt = CreatedAt
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,7 +3,6 @@ using CandidateReviewContracts.ViewModels;
|
||||
using CandidateReviewDataModels.Enums;
|
||||
using CandidateReviewDataModels.Models;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.ComponentModel.DataAnnotations.Schema;
|
||||
|
||||
namespace CandidateReviewDatabaseImplement.Models
|
||||
{
|
||||
@@ -16,18 +15,18 @@ namespace CandidateReviewDatabaseImplement.Models
|
||||
public string Name { get; set; } = string.Empty;
|
||||
|
||||
public string? LastName { get; set; }
|
||||
public string? AvatarFilePath { get; set; }
|
||||
[Required]
|
||||
public string Email { get; set; } = string.Empty;
|
||||
[Required]
|
||||
public string Password { get; set; } = string.Empty;
|
||||
|
||||
public string? PhoneNumber { get; set; }
|
||||
[Required]
|
||||
public bool EmailConfirmed { get; set; }
|
||||
|
||||
[Required]
|
||||
public RoleEnum Role { get; set; }
|
||||
|
||||
public DateTime DateOfBirth { get; set; }
|
||||
|
||||
public int Id { get; set; }
|
||||
public virtual Company Company { get; set; }
|
||||
|
||||
@@ -43,13 +42,12 @@ namespace CandidateReviewDatabaseImplement.Models
|
||||
Surname = model.Surname,
|
||||
Name = model.Name,
|
||||
LastName = model.LastName,
|
||||
AvatarFilePath = model.AvatarFilePath,
|
||||
Email = model.Email,
|
||||
Password = model.Password,
|
||||
PhoneNumber = model.PhoneNumber,
|
||||
EmailConfirmed = model.EmailConfirmed,
|
||||
Role = model.Role,
|
||||
CompanyId = model.CompanyId
|
||||
CompanyId = model.CompanyId,
|
||||
DateOfBirth = model.DateOfBirth.ToUniversalTime().AddHours(4)
|
||||
};
|
||||
}
|
||||
public static User Create(UserViewModel model)
|
||||
@@ -60,13 +58,12 @@ namespace CandidateReviewDatabaseImplement.Models
|
||||
Surname = model.Surname,
|
||||
Name = model.Name,
|
||||
LastName = model.LastName,
|
||||
AvatarFilePath = model.AvatarFilePath,
|
||||
Email = model.Email,
|
||||
Password = model.Password,
|
||||
PhoneNumber = model.PhoneNumber,
|
||||
EmailConfirmed = model.EmailConfirmed,
|
||||
Role = model.Role,
|
||||
CompanyId = model.CompanyId
|
||||
CompanyId = model.CompanyId,
|
||||
DateOfBirth = model.DateOfBirth
|
||||
};
|
||||
}
|
||||
public void Update(UserBindingModel model)
|
||||
@@ -78,13 +75,10 @@ namespace CandidateReviewDatabaseImplement.Models
|
||||
Surname = model.Surname;
|
||||
Name = model.Name;
|
||||
LastName = model.LastName;
|
||||
AvatarFilePath = model.AvatarFilePath;
|
||||
Email = model.Email;
|
||||
Password = model.Password;
|
||||
PhoneNumber = model.PhoneNumber;
|
||||
EmailConfirmed = model.EmailConfirmed;
|
||||
Role = model.Role;
|
||||
CompanyId = model.CompanyId;
|
||||
DateOfBirth = model.DateOfBirth.ToUniversalTime().AddHours(4);
|
||||
}
|
||||
|
||||
public UserViewModel GetViewModel => new()
|
||||
@@ -93,13 +87,12 @@ namespace CandidateReviewDatabaseImplement.Models
|
||||
Name = Name,
|
||||
Surname = Surname,
|
||||
LastName = LastName,
|
||||
AvatarFilePath = AvatarFilePath,
|
||||
Email = Email,
|
||||
Password = Password,
|
||||
PhoneNumber = PhoneNumber,
|
||||
EmailConfirmed = EmailConfirmed,
|
||||
Role = Role,
|
||||
CompanyId = CompanyId
|
||||
CompanyId = CompanyId,
|
||||
DateOfBirth = DateOfBirth
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -26,5 +26,18 @@ namespace CandidateReviewRestApi.Controllers
|
||||
throw new Exception(ex.Message);
|
||||
}
|
||||
}
|
||||
|
||||
[HttpPost]
|
||||
public void Statistics(ReportBindingModel model)
|
||||
{
|
||||
try
|
||||
{
|
||||
_reportLogic.SaveResumesStatisticsToPdf(model);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw new Exception(ex.Message);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
481
Статистика_по_вакансии_Аналитик.pdf
Normal file
481
Статистика_по_вакансии_Аналитик.pdf
Normal file
@@ -0,0 +1,481 @@
|
||||
%PDF-1.4
|
||||
%<25><><EFBFBD><EFBFBD>
|
||||
1 0 obj
|
||||
<<
|
||||
/CreationDate(D:20241215153146+04'00')
|
||||
/Creator(empira MigraDoc 1.50.4740 \(www.migradoc.com\))
|
||||
/Producer(PDFsharp 1.50.4740 \(www.pdfsharp.com\))
|
||||
>>
|
||||
endobj
|
||||
2 0 obj
|
||||
<<
|
||||
/Type/Catalog
|
||||
/Pages 3 0 R
|
||||
>>
|
||||
endobj
|
||||
3 0 obj
|
||||
<<
|
||||
/Type/Pages
|
||||
/Count 1
|
||||
/Kids[4 0 R]
|
||||
>>
|
||||
endobj
|
||||
4 0 obj
|
||||
<<
|
||||
/Type/Page
|
||||
/MediaBox[0 0 595.276 841.89]
|
||||
/Parent 3 0 R
|
||||
/Contents 5 0 R
|
||||
/Resources
|
||||
<<
|
||||
/ProcSet [/PDF/Text/ImageB/ImageC/ImageI]
|
||||
/ExtGState
|
||||
<<
|
||||
/GS0 6 0 R
|
||||
>>
|
||||
/Font
|
||||
<<
|
||||
/F0 10 0 R
|
||||
/F1 14 0 R
|
||||
>>
|
||||
>>
|
||||
/Group
|
||||
<<
|
||||
/CS/DeviceRGB
|
||||
/S/Transparency
|
||||
>>
|
||||
>>
|
||||
endobj
|
||||
5 0 obj
|
||||
<<
|
||||
/Length 937
|
||||
>>
|
||||
stream
|
||||
q
|
||||
q
|
||||
BT
|
||||
0 0 0 rg
|
||||
/GS0 gs
|
||||
/F0 16 Tf
|
||||
157.9659 756.0862 Td <024B026C025A026C0262026B026C02620264025A> Tj
|
||||
89.8906 0 Td <02690268> Tj
|
||||
21.2188 0 Td <0268026C0264026502620264025A0266> Tj
|
||||
75.3906 0 Td <0267025A> Tj
|
||||
21.2188 0 Td <025C025A0264025A0267026B02620278> Tj
|
||||
/F1 14 Tf
|
||||
-308.9918 -44.8777 Td <0248025B0273025F025F> Tj
|
||||
43.9414 0 Td <02640268026502620271025F026B026C025C0268> Tj
|
||||
70.9775 0 Td <026A025F026102780266025F001D> Tj
|
||||
51.666 0 Td <0014> Tj
|
||||
-166.585 -44.4451 Td <0010> Tj
|
||||
8.1621 0 Td <0244025A0267025E0262025E025A026C001D> Tj
|
||||
64.5039 0 Td <023A026A026C025A0266026802670268025C025A> Tj
|
||||
76.1182 0 Td <024C025A026C027602790267025A> Tj
|
||||
50.9141 0 Td <000F> Tj
|
||||
7 0 Td <023E025A026C025A> Tj
|
||||
31.5957 0 Td <026B02680261025E025A026702620279001D> Tj
|
||||
60.8945 0 Td <0014001800110014001500110015001300150017000F> Tj
|
||||
70 0 Td <024B026C025A026C026D026B001D> Tj
|
||||
-369.1885 -16.0986 Td <0248025B026A025A025B025A026C0275025C025A025F026C026B0279> Tj
|
||||
ET
|
||||
Q
|
||||
Q
|
||||
endstream
|
||||
endobj
|
||||
6 0 obj
|
||||
<<
|
||||
/Type/ExtGState
|
||||
/ca 1
|
||||
>>
|
||||
endobj
|
||||
7 0 obj
|
||||
<<
|
||||
/Type/FontDescriptor
|
||||
/Ascent 891
|
||||
/CapHeight 662
|
||||
/Descent 216
|
||||
/Flags 32
|
||||
/FontBBox[-558 -328 2000 1056]
|
||||
/ItalicAngle 0
|
||||
/StemV 0
|
||||
/XHeight 457
|
||||
/FontName/LZDZRO+Times#20New#20Roman,Bold
|
||||
/FontFile2 15 0 R
|
||||
>>
|
||||
endobj
|
||||
8 0 obj
|
||||
<<
|
||||
/Length 587
|
||||
>>
|
||||
stream
|
||||
/CIDInit /ProcSet findresource begin
|
||||
12 dict begin
|
||||
begincmap
|
||||
/CIDSystemInfo << /Registry (Adobe)/Ordering (UCS)/Supplement 0>> def
|
||||
/CMapName /Adobe-Identity-UCS def /CMapType 2 def
|
||||
1 begincodespacerange
|
||||
<024B><0278>
|
||||
endcodespacerange
|
||||
13 beginbfrange
|
||||
<024B><024B><0421>
|
||||
<026C><026C><0442>
|
||||
<025A><025A><0430>
|
||||
<0262><0262><0438>
|
||||
<026B><026B><0441>
|
||||
<0264><0264><043A>
|
||||
<0269><0269><043F>
|
||||
<0268><0268><043E>
|
||||
<0265><0265><043B>
|
||||
<0266><0266><043C>
|
||||
<0267><0267><043D>
|
||||
<025C><025C><0432>
|
||||
<0278><0278><044E>
|
||||
endbfrange
|
||||
endcmap CMapName currentdict /CMap defineresource pop end end
|
||||
endstream
|
||||
endobj
|
||||
9 0 obj
|
||||
<<
|
||||
/Type/Font
|
||||
/Subtype/CIDFontType2
|
||||
/CIDSystemInfo
|
||||
<<
|
||||
/Ordering(Identity)
|
||||
/Registry(Adobe)
|
||||
/Supplement 0
|
||||
>>
|
||||
/FontDescriptor 7 0 R
|
||||
/BaseFont/LZDZRO+Times#20New#20Roman,Bold
|
||||
/W [587[722]602[500]604[540]610[576]612[576]613[561]614[681]615[576]616[500]617[576]619[443]620[491]632[764]]
|
||||
>>
|
||||
endobj
|
||||
10 0 obj
|
||||
<<
|
||||
/Type/Font
|
||||
/Subtype/Type0
|
||||
/Encoding/Identity-H
|
||||
/ToUnicode 8 0 R
|
||||
/BaseFont/LZDZRO+Times#20New#20Roman,Bold
|
||||
/DescendantFonts[9 0 R]
|
||||
>>
|
||||
endobj
|
||||
11 0 obj
|
||||
<<
|
||||
/Type/FontDescriptor
|
||||
/Ascent 891
|
||||
/CapHeight 662
|
||||
/Descent 216
|
||||
/Flags 32
|
||||
/FontBBox[-568 -307 2046 1040]
|
||||
/ItalicAngle 0
|
||||
/StemV 0
|
||||
/XHeight 447
|
||||
/FontName/YPJNPN+Times#20New#20Roman
|
||||
/FontFile2 16 0 R
|
||||
>>
|
||||
endobj
|
||||
12 0 obj
|
||||
<<
|
||||
/Length 1067
|
||||
>>
|
||||
stream
|
||||
/CIDInit /ProcSet findresource begin
|
||||
12 dict begin
|
||||
begincmap
|
||||
/CIDSystemInfo << /Registry (Adobe)/Ordering (UCS)/Supplement 0>> def
|
||||
/CMapName /Adobe-Identity-UCS def /CMapType 2 def
|
||||
1 begincodespacerange
|
||||
<000F><0279>
|
||||
endcodespacerange
|
||||
37 beginbfrange
|
||||
<0248><0248><041E>
|
||||
<025B><025B><0431>
|
||||
<0273><0273><0449>
|
||||
<025F><025F><0435>
|
||||
<0264><0264><043A>
|
||||
<0268><0268><043E>
|
||||
<0265><0265><043B>
|
||||
<0262><0262><0438>
|
||||
<0271><0271><0447>
|
||||
<026B><026B><0441>
|
||||
<026C><026C><0442>
|
||||
<025C><025C><0432>
|
||||
<026A><026A><0440>
|
||||
<0261><0261><0437>
|
||||
<0278><0278><044E>
|
||||
<0266><0266><043C>
|
||||
<001D><001D><003A>
|
||||
<0014><0014><0031>
|
||||
<0010><0010><002D>
|
||||
<0244><0244><041A>
|
||||
<025A><025A><0430>
|
||||
<0267><0267><043D>
|
||||
<025E><025E><0434>
|
||||
<023A><023A><0410>
|
||||
<024C><024C><0422>
|
||||
<0276><0276><044C>
|
||||
<0279><0279><044F>
|
||||
<000F><000F><002C>
|
||||
<023E><023E><0414>
|
||||
<0018><0018><0035>
|
||||
<0011><0011><002E>
|
||||
<0015><0015><0032>
|
||||
<0013><0013><0030>
|
||||
<0017><0017><0034>
|
||||
<024B><024B><0421>
|
||||
<026D><026D><0443>
|
||||
<0275><0275><044B>
|
||||
endbfrange
|
||||
endcmap CMapName currentdict /CMap defineresource pop end end
|
||||
endstream
|
||||
endobj
|
||||
13 0 obj
|
||||
<<
|
||||
/Type/Font
|
||||
/Subtype/CIDFontType2
|
||||
/CIDSystemInfo
|
||||
<<
|
||||
/Ordering(Identity)
|
||||
/Registry(Adobe)
|
||||
/Supplement 0
|
||||
>>
|
||||
/FontDescriptor 11 0 R
|
||||
/BaseFont/YPJNPN+Times#20New#20Roman
|
||||
/W [15[250]16[333]17[250]19[500]20[500]21[500]23[500]24[500]29[277]570[722]574[682]580[666]584[722]587[666]588[610]602[443]603[508]604[472]606[508]607[443]609[395]610[535]612[485]613[499]614[632]615[535]616[500]618[500]619[443]620[437]621[500]625[502]627[770]629[671]630[456]632[747]633[459]]
|
||||
>>
|
||||
endobj
|
||||
14 0 obj
|
||||
<<
|
||||
/Type/Font
|
||||
/Subtype/Type0
|
||||
/Encoding/Identity-H
|
||||
/ToUnicode 12 0 R
|
||||
/BaseFont/YPJNPN+Times#20New#20Roman
|
||||
/DescendantFonts[13 0 R]
|
||||
>>
|
||||
endobj
|
||||
15 0 obj
|
||||
<<
|
||||
/Length1 51848
|
||||
/Filter/FlateDecode
|
||||
/Length 18487
|
||||
>>
|
||||
stream
|
||||
x<EFBFBD><EFBFBD><EFBFBD> |TE<54>7|<7C>.<2E>d<EFBFBD><64>{<7B><><EFBFBD>,<2C>: I $<24><>%$DL<44>H<EFBFBD>"<22>JXDq#<23><>:2:<3A><0B><><EFBFBD>MG1<47><02><><EFBFBD>(:<3A><>*<2A>"<22><0C><>B<EFBFBD><42>_uo<75>P<><50>y<EFBFBD><79>}<>/<1D><>Ծ<EFBFBD>:u<>T<EFBFBD><54><EFBFBD>Y<><59>d<EFBFBD><64>Y<EFBFBD>̱<EFBFBD><CCB1>ߋ<7F>{<7B>,<2C>]<5D>g<EFBFBD>Sv<53>6<>_&2U<32>y<EFBFBD><79><EFBFBD><EFBFBD><EFBFBD>R<EFBFBD>!<21><><10>
|
||||
<EFBFBD>?o<>ܯ]m<12>ʑg<CA91>|<04>(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>5<EFBFBD><35>eL<><4C><EFBFBD>;8C4<43>s<EFBFBD><73>9<EFBFBD><39><EFBFBD><EFBFBD>/<11><><EFBFBD>Ɨ<EFBFBD>3<EFBFBD><33><EFBFBD><EFBFBD><EFBFBD>Lk<4C><6B>Brrt/<2F><>-<2D><>̅<EFBFBD>A3_<33><15>Չ<02><>o(<28>H<EFBFBD><10>|<1E><>V<17>3p<33><70>W<EFBFBD>!b.<1D>'<27><>$}N<><4E>V<EFBFBD><56>W%<25><1A>pj#<23>%RI<><49><EFBFBD><EFBFBD><EFBFBD>He!<21>KNj<4E>V<EFBFBD><56> <09> <0B>
|
||||
4<EFBFBD><EFBFBD>d<EFBFBD>tˢI<CBA2>D&<26>P<<3C>Яi-<1B>}A<><41>_<EFBFBD>Z<>2/<2F><>D6N<36>C<EFBFBD><43>U{
|
||||
u<10><><EFBFBD><EFBFBD>.AvĄ0<C484><30>JXJ<58><4A>z<>4<EFBFBD>Nw<4E>kQJ+M<>s<EFBFBD><73>h<06>Φ<EFBFBD>ӵTO<>ҥt<07><><EFBFBD><EFBFBD>}<7D>Z<EFBFBD>MQ<4D>N*<2A>ٴ<EFBFBD><D9B4>Y˕/<2F><1E>r<EFBFBD>m<EFBFBD><6D>ڋ<EFBFBD>.<2E>!<21>oQ<6F>ג[iԾ!/}<7D>0m>F2<46><32><EFBFBD>w.<2E>O<EFBFBD><4F>}<7D><>J<EFBFBD>:<3A><><12><>A<17>9mGסo[<5B>El<45><1C>=<3D>ޔ<EFBFBD>ZI{<7B>l<><6C><EFBFBD><EFBFBD><EFBFBD><1E>.<2E>h<EFBFBD><68>-]E<0F><><EFBFBD>}<7D><><1A>T<EFBFBD><54>@<40><>ٱ<><D9B1>Pӕt5<74><1E><><03>^d<>,<2C><>G<EFBFBD>ϳ؇<><D887><EFBFBD><EFBFBD>(<28><11>O<EFBFBD>ѿX.[<5B>.<2E><><EFBFBD><EFBFBD>Uϑ˴')=<3D><><EFBFBD><EFBFBD>t<1A>M<EFBFBD><4D>l<EFBFBD>e<EFBFBD>#<23>=<3D><>ҥ<EFBFBD>Jy<4A><79><EFBFBD><EFBFBD><EFBFBD><1C>ʵ<17>D<EFBFBD>H{9<>C<EFBFBD><43>L<4C><7F>0^<5E><><EFBFBD><EFBFBD>)]*<2A><>Wk<17><><EFBFBD>4<1F><><EFBFBD><1E><><EFBFBD>-S<><53><EFBFBD><EFBFBD>X<EFBFBD>`Ŭ=<3D><>mcJi<4A>Sj<53>g<EFBFBD><1B><1B>ڍ<>Y<><59>y<EFBFBD>y]AWAw<>G<EFBFBD><15>g<EFBFBD><67>Y<EFBFBD><59>լ<EFBFBD><D5AC><EFBFBD>nb/J;<3B><><EFBFBD><19>m<EFBFBD>W<EFBFBD>MY<4D><59>A9<41>F<EFBFBD><08><1E><0B><>r<EFBFBD><72><1D>E<17><>}<7D>{<7B><>e2Ka<4B>(i<0C><><EFBFBD>f<EFBFBD>.v1[<5B>ne<0F><><EFBFBD>&<26><><EFBFBD>b_<62><03><>R<EFBFBD>t<EFBFBD><74><1B>i<EFBFBD><69><EFBFBD>Ni<4E><69>&<26><><EFBFBD><EFBFBD><1A>5%CyW<79><57><<3C>HZ`k<><6B><16><><EFBFBD>bm<62>v<EFBFBD><76><EFBFBD><EFBFBD>_<EFBFBD>B*$<24><><EFBFBD> ]1<><31><EFBFBD><EFBFBD>t+<2B><0B>?A;h7<68>n<EFBFBD><6E><EFBFBD>G1?2<13>) -<2D>dN<64><4E><EFBFBD>ѻ<EFBFBD>X;<3B><>b<EFBFBD><62><07>K<EFBFBD>C<EFBFBD><43><1D>H
|
||||
<EFBFBD>2<EFBFBD><EFBFBD>'<27><>&H3<48>˥<EFBFBD><CBA5><EFBFBD>r<EFBFBD><72><EFBFBD>k<EFBFBD><0B><><EFBFBD>7<EFBFBD><1F><15><><7F>'Ճ<>}<7D>,<2C>k<EFBFBD><6B>><3E>A<EFBFBD><02><05><>J!<21>&H^<0C>\ <09>B<EFBFBD>&`<60><><EFBFBD>b<EFBFBD>-<2D><>t>xt!8~$g<03><>iz<69>^<03>w<EFBFBD>{<7B><>h/<2F><>#q<><71>P<EFBFBD>IO<>Y𧷽#Si<>d<EFBFBD>0<EFBFBD><30><EFBFBD>E<EFBFBD>rv<1D>w<7F><77><EFBFBD>o<EFBFBD><6F><EFBFBD><EFBFBD><1B>/l<0F><>}<7D>><3E>T <20>HcѣV<D1A3>t<EFBFBD>3<7F>9<EFBFBD>e<EFBFBD><65><EFBFBD><13><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>l<EFBFBD><6C>d<EFBFBD><64>#7<>g<EFBFBD><67>ʫd<CAAB><64><EFBFBD><EFBFBD>Wy<57><79><EFBFBD><EFBFBD>(㔅<>v<EFBFBD>u<EFBFBD>|<7C>:^<5E><><EFBFBD>Q<EFBFBD>W<57>><3E><>A<EFBFBD><41><EFBFBD>O<EFBFBD>L<EFBFBD><4C><EFBFBD>7<EFBFBD><37>>7<><37>G<EFBFBD>[<5B>S<EFBFBD>י3?m~߬Yr O<>h<EFBFBD>0:<3A><><EFBFBD><EFBFBD><EFBFBD>J<><4A>&<26><><EFBFBD><EFBFBD>I<EFBFBD><49>W<EFBFBD>߰<EFBFBD>R<><52>
|
||||
-<2D>K3<4B>><3E>Y<EFBFBD>ދW<DE8B>ɏK<C98F>)<29>"z<0C><>k<EFBFBD><0C><><EFBFBD>E<EFBFBD>S?<3F><>R2}}<7D>y<><79><EFBFBD>t<EFBFBD><74><EFBFBD>Fʣ<46><CAA3><EFBFBD>נuV<75><56>H{$<24><>)<29><>h̤SY<12>C<EFBFBD>F<07><><EFBFBD><EFBFBD>*<2A><>Q<EFBFBD><51><EFBFBD><EFBFBD>^<5E>&@<40>ߦ<07><><EFBFBD>NZK<5A>XZ7<5A><37><EFBFBD><1F><>l<EFBFBD><6C>`<60> w+i}M{<7B><>V)<R+U<><12><><EFBFBD>Q<18><>l<EFBFBD><6C>]<1A>}<7D>Y<EFBFBD>!<21><>ޓ<DE93><7F>Oc-<2D><><1E><>1<EFBFBD><31>Y <09>+%<25>^<5E><>K<EFBFBD><4B>!<21><>Q/<2F><><EFBFBD>fз<66>Y.<2E><><EFBFBD>^<5E>y<EFBFBD><79>W<02><>2<EFBFBD>
|
||||
<EFBFBD><EFBFBD>T<EFBFBD><EFBFBD>L<10>{<12><><EFBFBD><EFBFBD>w@Wq=A <09>"bFE;X&<26><>ӻt<17>D[<5B>8ʒ<1F>z$M~Yq<59>ʹW<CDB4><57>Z/<2F>~Je%(<28>Z<>~8<>O<0F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>l6<6C><36>3<>ҵs<D2B5><EFBFBD><F287A18B><0C>N<EFBFBD>]uӟ<75>DG[<5B><><12><><EFBFBD>Tk`?R><3E>y<EFBFBD><1E>c<EFBFBD>So`.mú<6D>Ȳ<EFBFBD>Ҵ_]<5D><>VשO<D7A9>ϩ;L#<23><02>ڻ1<DABB><1F>!<21>6<07><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>b<EFBFBD><62>c<EFBFBD>Ԡ㰆<>-<2D><><EFBFBD>RK<>n<EFBFBD><6E>\<5C><>Z<EFBFBD>`:Fr)J<><4A>n<EFBFBD>|zkȟ<6B> <20><><19><1C><><EFBFBD><EFBFBD><EFBFBD>y><07>[PN<13><>Q_JC;^<5E>z2<><32>)|<7C><>E<EFBFBD>ri<19><>z<EFBFBD>6<EFBFBD><36>mh<6D><68><EFBFBD>)4<>&ڕ<>F<EFBFBD>z<EFBFBD><7A><1C><><EFBFBD>e<EFBFBD>0<EFBFBD>Z<EFBFBD>F<EFBFBD>ɛ<EFBFBD>+e<><65>}B.<2E><><EFBFBD><EFBFBD><EFBFBD>"_'d#<23>ҨB<D2A8><42>I<EFBFBD>h<>ʥ<05><>,<1E>a<04>j*V<>1l1Z<11>~<1C>86<38>JcQ<63>z<EFBFBD><7A>V<EFBFBD>!<21><>n<EFBFBD>qR<71>r<EFBFBD>z*<2A><>.V<>?<3F><12><><EFBFBD>e<EFBFBD><65>ߒ*<2A><><EFBFBD>S<EFBFBD>z<EFBFBD><7A><EFBFBD>T<EFBFBD>UQ^VZR<5A>QT8<54> ߝ7,7';<3B><><EFBFBD><EFBFBD>p<EFBFBD><70><EFBFBD>RS<52><53><13><>bc<62><63>l<EFBFBD><11>a<EFBFBD>!V<>٤*<2A><>(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ew<65><77>l<EFBFBD><6C>q<05><EFBFBD>Y:}5<1E><><EFBFBD><EFBFBD><14>Ǧ<>"eנ<65>^=<3D><>?%<25>9*<2A><> <20><><EFBFBD>t<EFBFBD>v<EFBFBD>;}l<><6C>6<EFBFBD>o<EFBFBD>w<EFBFBD>;|<7C><><EFBFBD>Y<EFBFBD>Ww8<77><19><>hH<68>_<EFBFBD><5F><EFBFBD>NG<4E><47>q<EFBFBD><71>U
|
||||
<EFBFBD><EFBFBD>(nchH<68><48>n^HA>m <09>3._<><5F>{#K<>b<EFBFBD>!%4<><34>(<28>%<1C><>%;<3B>|I<>z<EFBFBD><02><><EFBFBD>0k<30><6B>ur[C}JFF{A<><41><EFBFBD><EFBFBD>q<EFBFBD><71><EFBFBD><EFBFBD><EFBFBD><17>I<>NT<4E>3<EFBFBD><33>̢<1A><02><1B>ޱ1۪<1B>l4<6C><34>6<>9w6<D68C><<3C><><EFBFBD><11>F<EFBFBD><46><EFBFBD><EFBFBD><0B>%<1E><><EFBFBD>躶kƦȫ8<>wժk<1C><><EFBFBD><EFBFBD><06>f<EFBFBD>g{;<3B>@^)<29><>sU#<23><>Ll:Łڤ<C581><DAA4><EFBFBD>|<7C>*T<><54>=<3D><><EFBFBD><EFBFBD>7<EFBFBD><37><EFBFBD>C:<3A>r<EFBFBD><72><EFBFBD>Z<EFBFBD><5A>Ugubh<62>W<EFBFBD>hʊr<7F>w<EFBFBD><77><EFBFBD><EFBFBD><1C><><EFBFBD>93|<7C>)<29><>Y<EFBFBD><59>ciՔ<15>I^Gұ1<05>mQ:c7FD<1A><><EFBFBD><EFBFBD><EFBFBD>y<EFBFBD>q<EFBFBD>%<25>sWӔ~<7E>2<EFBFBD>"<22>x<08><>1ǁ<31><C781>9ѧr<D1A7><72>WN<57><4E><EFBFBD>#><3E><0C>|s1"|ֺ<>U<EFBFBD>Q<<3C><><EFBFBD><EFBFBD>Y6<59>cշ p<><70><EFBFBD>ؐYF<59>)<29><>-q'<27><>~QC|<7C><>s<EFBFBD>}yy\D<>uS<><53>J<EFBFBD>K<0B><><EFBFBD>Ik<49><6B>6<08>G<EFBFBD><47><EFBFBD><EFBFBD><EFBFBD>Q<EFBFBD>`F<1F><><EFBFBD><EFBFBD>4_<><5F>6<EFBFBD><36><EFBFBD><EFBFBD>)~<7E><16><>}R'<27><><16><>;<3B><><EFBFBD>c<><63>w:!<21>O<EFBFBD>]H<>ϒ<EFBFBD><CF92>/<2F><1F>0<30><7F><EFBFBD><EFBFBD>L<EFBFBD><=<3D><>g<><67><EFBFBD>m<EFBFBD><6D>U<EFBFBD>o<><6F><1E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><0C>/<2F><>MN<4D><0C><>"<22>X<08><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><16>S<EFBFBD><53><EFBFBD>$<24>zn<7A><6E><02>!<21><><EFBFBD><EFBFBD>u<EFBFBD>ӟ<EFBFBD>!<19>0S<30>v<EFBFBD><76><12>h6<68><36><EFBFBD>Q<EFBFBD>c<EFBFBD><63><EFBFBD><EFBFBD>Ӽ<>U2<1A>dKMS<4D><53>ZrL\#4ЪU<D0AA>NG<4E><47><EFBFBD>U<EFBFBD><55><EFBFBD><EFBFBD><EFBFBD>N<EFBFBD>j3l<33><6C>U<EFBFBD>
|
||||
<EFBFBD><EFBFBD><11>Ӷ\<5C><>k<EFBFBD><6B><1D><><EFBFBD>FAZ%<25><><EFBFBD>d<EFBFBD>N<EFBFBD><4E>eמ2<D79E>m36<33><36>k<EFBFBD><6B><EFBFBD>%&<26>uֶot!<21>m3<6D>h^*<2A>P<1E>=<0E><><EFBFBD>
|
||||
<EFBFBD><EFBFBD><EFBFBD>,"}<7D>f/Q<><51>UD<55><44><EFBFBD><EFBFBD>c$<24>,<2C>0Fs<46>$=̦W<CCA6>-*<2A>b<EFBFBD><62>ӧ<EFBFBD>1<EFBFBD>`ja=<3D>GO<47>k<EFBFBD><6B> <20><>c<EFBFBD>`<60>G$"<22><0F>uS<75>ʃ<>d<EFBFBD>H<>Ra!<21><><04><>L<EFBFBD>OH<4F><05><>O<EFBFBD>xcHU^<5E>)Ĭ<><C4AC>(<28>bR_<52><5F>gX
|
||||
Y<EFBFBD><EFBFBD>O<EFBFBD>D<EFBFBD><EFBFBD><EFBFBD><EFBFBD>#<23>-<2D>C<EFBFBD><43>G*<2A>n<>a<FeDeDe<44><65>R:쐷<1D><><EFBFBD>#9<>m0<6D>h<EFBFBD><68><EFBFBD>z<1A><>.<2E><><EFBFBD>ⵞ^kHIj<49>NM
|
||||
<07><><EFBFBD><11>lMӜ|u<><75><EFBFBD>7<EFBFBD>\<5C>jY<18>0zEԊ<45><D48A><EFBFBD>1=<1A>P<EFBFBD><50><EFBFBD>WSBL<42><4C>]_<><5F>U<7F><55>)W<>><3E><<3C>R<>=<3D>~<7E>iy<69><79><EFBFBD><EFBFBD>c<EFBFBD>D<EFBFBD><44>"<22><>]i4]Jc<4A><63><EFBFBD>z<EFBFBD><7A>x,*:B=+M<>8+<2B><>fF<><46><EFBFBD><EFBFBD>l<EFBFBD><1D>u<EFBFBD>f<EFBFBD>A<EFBFBD>Zlum^kd<6B>=D
|
||||
iNJ:<3A><>EGJ<47><4A><EFBFBD><EFBFBD><EFBFBD>b<EFBFBD><62><EFBFBD><EFBFBD>yU<><55><EFBFBD>UQ<55><51><EFBFBD><EFBFBD>̶<EFBFBD><CCB6>~<7E><>2<EFBFBD><32><EFBFBD><EFBFBD>=<3D><>^W|<7C>)<,;!<21>b5[%SJvx|H<16>R<EFBFBD>M<><4D>"k<><6B><EFBFBD><EFBFBD>n<EFBFBD>s<EFBFBD><73>ݗ]<5D>:S<>b<EFBFBD>u<EFBFBD>(gv<67>3<EFBFBD>d6<64><36>F<EFBFBD>{F<>řL<C599>L<EFBFBD>TZ<12>*<2A>$<24> <20><><EFBFBD><EFBFBD><EFBFBD>w<EFBFBD><77><EFBFBD><EFBFBD><EFBFBD>/<2F>ӳ{<7B><><EFBFBD>z'<27><><EFBFBD>WY<57>nZ3#<23>QhV<06><>^<5E>y<EFBFBD><79><EFBFBD>7v<><76>}<7D>y<EFBFBD>/<2F>=k<><6B><03><><EFBFBD><EFBFBD>UX<55>ѧ<19>?<3F><0F><17><><EFBFBD><EFBFBD>fx<66>L6[<5B><><EFBFBD>Ux<55><78><EFBFBD>%ח<>b<EFBFBD><62>T<EFBFBD><54>Ӷyg5<67>n<EFBFBD>`<60><>.x<>
|
||||
<EFBFBD><EFBFBD>x<EFBFBD><EFBFBD><EFBFBD><EFBFBD>O<0B><><EFBFBD><06><><EFBFBD> <09>K<EFBFBD><12>,<2C><>ݥak<61><6B>Vlf=Uw*w<15>3B<33><42>֪9<D6AA><39>UKn<><6E><EFBFBD><1A><><EFBFBD><EFBFBD>
|
||||
<EFBFBD>ķV--<2D><>Hq<48>q<EFBFBD>h^KyBŁ<42><C581>Sl<53>u<EFBFBD><75><EFBFBD>u<EFBFBD>g<EFBFBD><67><EFBFBD>U<16>/~<7E>XV<58><56>7_R|c<><63><EFBFBD><EFBFBD>?[<5B><><EFBFBD><EFBFBD><15>/<0E>.fţ-}<7D>k<EFBFBD>ۭV<DBAD><56>XK<58>e<EFBFBD><65><<3C>"YF[&Z.<2E>\gYcy<63><79><EFBFBD><EFBFBD><1D>5Ԓb<D492><62>ȱ<EFBFBD>91<<3C><>F<EFBFBD>ú
|
||||
G<EFBFBD><EFBFBD><<3C>SGa<47><61><EFBFBD><1D>.<2E>L<EFBFBD>'<27>L\<5C><>&qC<71><43>D<EFBFBD><44>į'ʉ<><CA89>[I<>d7K<37><4B><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>|%<25>~X]d<>=K<><4B><EFBFBD>Țȫ/<2F>V[WZ<57>Z<07>DV<44>U<EFBFBD><55><EFBFBD><EFBFBD><EFBFBD>6oUO<55><4F><EFBFBD>ꬒ<EFBFBD><1E>cq)<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Z
|
||||
KqS<EFBFBD><EFBFBD>L*<2A><>^gV<67>"<22><>*<15>^<5E>U<EFBFBD>T5iL<69><4C><EFBFBD>}l<>U<10>C<1D><><EFBFBD><EFBFBD>Z<>~<7E><>ֱ<EFBFBD>PG<50>w<><77>H<EFBFBD>w<EFBFBD>:<3A><>:<3A><>]<5D><04>Jۡ<4A><DBA1><EFBFBD><EFBFBD>#<23><><EFBFBD><EFBFBD>G%Tt,^<5E><><EFBFBD>O<EFBFBD>)<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>b<EFBFBD>UFTVR<56><52>-<2D>h<EFBFBD><68>ተĴD<C4B4>:<3A>GAn=<3D><>R<EFBFBD>!6Y<36><59>J<EFBFBD><4A><EFBFBD>
|
||||
ͮȎH<EFBFBD>J<EFBFBD>0<EFBFBD>5<EFBFBD>e:G<>e<EFBFBD>dK
|
||||
Og!<21>x<EFBFBD>+<2B>Ӊ<EFBFBD>̢j<CCA2><6A><EFBFBD><1F>dql<><6C>#,<0B><>]Z22<32><32><EFBFBD><EFBFBD>6<EFBFBD>ln<6C><1A>#<23>=<3D><>F<EFBFBD><46>C<EFBFBD><43><12><>g<EFBFBD>D<EFBFBD><44>T<EFBFBD>i<><69>k[<5B><>c<EFBFBD> <09>ܚ<EFBFBD><DC9A><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>O]<5D>ڹWݝ<1B><><EFBFBD><EFBFBD>YX<59>:=d<>蜌<EFBFBD>Ϫ<>LZ<4C><5A>Wg<57>U6,-:1<><31><EFBFBD><1D>0<EFBFBD>x<EFBFBD><15><>k<EFBFBD>n<0F><>Ͱe%N<>k<EFBFBD><6B>U<EFBFBD><55><<3C>l<EFBFBD>3<EFBFBD><33><EFBFBD>m<><3<>I<49><7F><EFBFBD><F3AD89B9><EFBFBD><EFBFBD>p<EFBFBD><1F>?:<3A>f_<66><5F>$s<><73><EFBFBD>Ky<4B><79>ٻ<EFBFBD>gڗ[<5B><>,I<>=<3D><><EFBFBD><EFBFBD>c<EFBFBD><63>-<2D><>ҷ8<D2B7><38><EFBFBD>3+<2B>X\<0C><11><>`<60>K<EFBFBD><4B><EFBFBD>e<EFBFBD><65>b<EFBFBD>Ɉ<>KLJ<M<>Ubv<62>9c<39><19>"<22><0C><><EFBFBD>I<EFBFBD><49>ԛb<D49B>*<2A>dl-<2D>!G<><47><EFBFBD><03><><EFBFBD>T{<7B><><EFBFBD>1<1B>8ݔ<38>.<2E>ef<65>鵆E<E9B586><45><EFBFBD>\<5C><><EFBFBD>J됻<4A>
|
||||
!<21>
|
||||
|oDh<44><68><EFBFBD>m<EFBFBD><6D><EFBFBD>(HB<48>b<EFBFBD>AB<05>U<EFBFBD><55>0BKg <09>C<EFBFBD><43><EFBFBD><EFBFBD><EFBFBD>G%<>8<EFBFBD>}#{<7B><>\<5C><>ޮ<EFBFBD><DEAE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>VSB<53><42>(<28>d<EFBFBD><64><EFBFBD><EFBFBD>mO<7F>xK~i<><69>7<EFBFBD><<3C><><EFBFBD>enuRRq<52><71>+<2B>><3E>=<3D><><EFBFBD> <09><>S<EFBFBD>n8e<38><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,'<27>E<EFBFBD>f<EFBFBD><66>gdN<64>6[-<2D>i^<5E><>'}T<>٘<EFBFBD>
|
||||
S<EFBFBD><EFBFBD><08>7<EFBFBD>
|
||||
2V'Ղ<>V<EFBFBD>)<29><><EFBFBD>/<2F>9w9%rz<72><7A>N<EFBFBD><4E>LZ㔜<5A><E3949C><EFBFBD>h)ڻ+<2B><><1A>Es<45> |M<>D=O䔖/Nt<0B><><EFBFBD>:<3A>0q<30><71>;<3B><><EFBFBD>X<EFBFBD>*<2A>s<EFBFBD>)R<> BR<42>=ݑ.<2E>bc<62>b$<24>);%595)U6E<36>G砗i<E7A097>,<2C><1A>N<EFBFBD><4E><EFBFBD><16><><EFBFBD><EFBFBD><EFBFBD>t<13><>N<EFBFBD>jB E<><16>?<3F>/ | ||||