From 1b47b087e6c36f8dc38162d7712f01173c7b85cf Mon Sep 17 00:00:00 2001 From: GitLab Bot Date: Fri, 10 Dec 2021 00:13:05 +0000 Subject: [PATCH] Add latest changes from gitlab-org/gitlab@master --- .../behaviors/shortcuts/shortcuts_issuable.js | 5 +- .../javascripts/pages/projects/edit/index.js | 4 +- .../components/transfer_project_form.vue | 63 +++++ .../settings/init_transfer_project_form.js | 53 ++++ .../confirm_danger/confirm_danger_modal.vue | 4 +- .../namespace_select/namespace_select.vue | 93 +++++++ app/controllers/projects_controller.rb | 3 + .../repositories/lfs_api_controller.rb | 25 +- app/helpers/namespaces_helper.rb | 18 ++ app/models/lfs_object.rb | 1 + app/models/lfs_objects_project.rb | 12 +- app/models/project.rb | 6 + .../groups/update_shared_runners_service.rb | 16 +- app/views/projects/_transfer.html.haml | 10 +- app/views/projects/transfer.js.haml | 2 - .../development/lfs_auto_link_fork_source.yml | 8 + ..._templates_total_unique_counts_monthly.yml | 2 + ...licit_security_dast_api_latest_monthly.yml | 25 ++ ...lates_security_dast_api_latest_monthly.yml | 25 ++ ...i_templates_total_unique_counts_weekly.yml | 2 + ...plicit_security_dast_api_latest_weekly.yml | 25 ++ ...plates_security_dast_api_latest_weekly.yml | 25 ++ ...cure-dependency-scanning-bundler-audit.yml | 16 ++ doc/administration/audit_events.md | 3 +- doc/administration/incoming_email.md | 2 +- doc/administration/index.md | 2 +- .../cicd_reference_documentation_guide.md | 221 ++++++++------- doc/gitlab-basics/index.md | 2 +- doc/update/deprecations.md | 8 + doc/user/project/description_templates.md | 2 +- .../issues/img/new_issue_from_email.png | Bin 4259 -> 0 bytes .../issues/img/new_issue_from_issue_board.png | Bin 20063 -> 0 bytes .../img/new_issue_from_open_issue_v13_6.png | Bin 25667 -> 0 bytes .../img/new_issue_from_projects_dashboard.png | Bin 9674 -> 0 bytes .../img/new_issue_from_tracker_list.png | Bin 19632 -> 0 bytes .../project/issues/img/new_issue_v13_1.png | Bin 69721 -> 0 bytes ..._from_group_level_issue_tracker_v13_11.png | Bin 8863 -> 0 bytes doc/user/project/issues/index.md | 2 +- doc/user/project/issues/managing_issues.md | 262 ++++++++++++------ doc/user/project/working_with_projects.md | 217 +++++++-------- .../Security/API-Fuzzing.latest.gitlab-ci.yml | 4 +- .../Security/DAST-API.latest.gitlab-ci.yml | 52 ++++ lib/gitlab/graphql/tracers/logger_tracer.rb | 13 +- lib/gitlab/graphql/tracers/timer_tracer.rb | 10 +- .../known_events/ci_templates.yml | 8 + qa/qa/page/project/settings/advanced.rb | 19 +- spec/controllers/projects_controller_spec.rb | 49 ++-- .../issuables/shortcuts_issuable_spec.rb | 86 ++++++ .../settings/user_transfers_a_project_spec.rb | 8 +- .../components/transfer_project_form_spec.js | 68 +++++ spec/frontend/transfer_edit_spec.js | 10 +- .../components/namespace_select/mock_data.js | 11 + .../namespace_select/namespace_select_spec.js | 86 ++++++ spec/helpers/namespaces_helper_spec.rb | 33 +++ .../graphql/tracers/logger_tracer_spec.rb | 14 +- .../graphql/tracers/metrics_tracer_spec.rb | 12 +- .../graphql/tracers/timer_tracer_spec.rb | 13 + spec/models/lfs_objects_project_spec.rb | 22 ++ spec/models/project_spec.rb | 23 ++ spec/requests/lfs_http_spec.rb | 32 ++- .../update_shared_runners_service_spec.rb | 6 + spec/support/graphql/fake_query_type.rb | 9 +- 62 files changed, 1366 insertions(+), 386 deletions(-) create mode 100644 app/assets/javascripts/projects/settings/components/transfer_project_form.vue create mode 100644 app/assets/javascripts/projects/settings/init_transfer_project_form.js create mode 100644 app/assets/javascripts/vue_shared/components/namespace_select/namespace_select.vue delete mode 100644 app/views/projects/transfer.js.haml create mode 100644 config/feature_flags/development/lfs_auto_link_fork_source.yml create mode 100644 config/metrics/counts_28d/20211122134101_p_ci_templates_implicit_security_dast_api_latest_monthly.yml create mode 100644 config/metrics/counts_28d/20211201194407_p_ci_templates_security_dast_api_latest_monthly.yml create mode 100644 config/metrics/counts_7d/20211122134101_p_ci_templates_implicit_security_dast_api_latest_weekly.yml create mode 100644 config/metrics/counts_7d/20211201194402_p_ci_templates_security_dast_api_latest_weekly.yml create mode 100644 data/deprecations/14-6-deprecation-secure-dependency-scanning-bundler-audit.yml delete mode 100644 doc/user/project/issues/img/new_issue_from_email.png delete mode 100644 doc/user/project/issues/img/new_issue_from_issue_board.png delete mode 100644 doc/user/project/issues/img/new_issue_from_open_issue_v13_6.png delete mode 100644 doc/user/project/issues/img/new_issue_from_projects_dashboard.png delete mode 100644 doc/user/project/issues/img/new_issue_from_tracker_list.png delete mode 100644 doc/user/project/issues/img/new_issue_v13_1.png delete mode 100644 doc/user/project/issues/img/select_project_from_group_level_issue_tracker_v13_11.png create mode 100644 lib/gitlab/ci/templates/Security/DAST-API.latest.gitlab-ci.yml create mode 100644 spec/frontend/projects/settings/components/transfer_project_form_spec.js create mode 100644 spec/frontend/vue_shared/components/namespace_select/mock_data.js create mode 100644 spec/frontend/vue_shared/components/namespace_select/namespace_select_spec.js diff --git a/app/assets/javascripts/behaviors/shortcuts/shortcuts_issuable.js b/app/assets/javascripts/behaviors/shortcuts/shortcuts_issuable.js index e4e04123ebc..e58c51104c5 100644 --- a/app/assets/javascripts/behaviors/shortcuts/shortcuts_issuable.js +++ b/app/assets/javascripts/behaviors/shortcuts/shortcuts_issuable.js @@ -118,7 +118,10 @@ export default class ShortcutsIssuable extends Shortcuts { // Wait for the sidebar to trigger('click') open // so it doesn't cause our dropdown to close preemptively setTimeout(() => { - document.querySelector(`.block.${name} .shortcut-sidebar-dropdown-toggle`).click(); + const editBtn = + document.querySelector(`.block.${name} .shortcut-sidebar-dropdown-toggle`) || + document.querySelector(`.block.${name} .edit-link`); + editBtn.click(); }, DEBOUNCE_DROPDOWN_DELAY); return false; } diff --git a/app/assets/javascripts/pages/projects/edit/index.js b/app/assets/javascripts/pages/projects/edit/index.js index 03fc785ff26..100ca5b36d9 100644 --- a/app/assets/javascripts/pages/projects/edit/index.js +++ b/app/assets/javascripts/pages/projects/edit/index.js @@ -6,9 +6,9 @@ import initFilePickers from '~/file_pickers'; import mountBadgeSettings from '~/pages/shared/mount_badge_settings'; import initProjectDeleteButton from '~/projects/project_delete_button'; import initServiceDesk from '~/projects/settings_service_desk'; +import initTransferProjectForm from '~/projects/settings/init_transfer_project_form'; import initSearchSettings from '~/search_settings'; import initSettingsPanels from '~/settings_panels'; -import setupTransferEdit from '~/transfer_edit'; import UserCallout from '~/user_callout'; import initTopicsTokenSelector from '~/projects/settings/topics'; import initProjectPermissionsSettings from '../shared/permissions'; @@ -26,7 +26,7 @@ initServiceDesk(); initProjectLoadingSpinner(); initProjectPermissionsSettings(); -setupTransferEdit('.js-project-transfer-form', 'select.select2'); +initTransferProjectForm(); dirtySubmitFactory(document.querySelectorAll('.js-general-settings-form, .js-mr-settings-form')); diff --git a/app/assets/javascripts/projects/settings/components/transfer_project_form.vue b/app/assets/javascripts/projects/settings/components/transfer_project_form.vue new file mode 100644 index 00000000000..b98e1101884 --- /dev/null +++ b/app/assets/javascripts/projects/settings/components/transfer_project_form.vue @@ -0,0 +1,63 @@ + + diff --git a/app/assets/javascripts/projects/settings/init_transfer_project_form.js b/app/assets/javascripts/projects/settings/init_transfer_project_form.js new file mode 100644 index 00000000000..47b49031dc9 --- /dev/null +++ b/app/assets/javascripts/projects/settings/init_transfer_project_form.js @@ -0,0 +1,53 @@ +import Vue from 'vue'; +import { convertObjectPropsToCamelCase } from '~/lib/utils/common_utils'; +import TransferProjectForm from './components/transfer_project_form.vue'; + +const prepareNamespaces = (rawNamespaces = '') => { + const data = JSON.parse(rawNamespaces); + return { + group: data?.group.map(convertObjectPropsToCamelCase), + user: data?.user.map(convertObjectPropsToCamelCase), + }; +}; + +export default () => { + const el = document.querySelector('.js-transfer-project-form'); + if (!el) { + return false; + } + + const { + targetFormId = null, + targetHiddenInputId = null, + buttonText: confirmButtonText = '', + phrase: confirmationPhrase = '', + confirmDangerMessage = '', + namespaces = '', + } = el.dataset; + + return new Vue({ + el, + provide: { + confirmDangerMessage, + }, + render(createElement) { + return createElement(TransferProjectForm, { + props: { + confirmButtonText, + confirmationPhrase, + namespaces: prepareNamespaces(namespaces), + }, + on: { + selectNamespace: (id) => { + if (targetHiddenInputId && document.getElementById(targetHiddenInputId)) { + document.getElementById(targetHiddenInputId).value = id; + } + }, + confirm: () => { + if (targetFormId) document.getElementById(targetFormId)?.submit(); + }, + }, + }); + }, + }); +}; diff --git a/app/assets/javascripts/vue_shared/components/confirm_danger/confirm_danger_modal.vue b/app/assets/javascripts/vue_shared/components/confirm_danger/confirm_danger_modal.vue index 30c96daf7e3..5bbe44b20b3 100644 --- a/app/assets/javascripts/vue_shared/components/confirm_danger/confirm_danger_modal.vue +++ b/app/assets/javascripts/vue_shared/components/confirm_danger/confirm_danger_modal.vue @@ -47,7 +47,7 @@ export default { actionPrimary() { return { text: this.confirmButtonText, - attributes: [{ variant: 'danger', disabled: !this.isValid }], + attributes: [{ variant: 'danger', disabled: !this.isValid, class: 'qa-confirm-button' }], }; }, }, @@ -95,7 +95,7 @@ export default { diff --git a/app/assets/javascripts/vue_shared/components/namespace_select/namespace_select.vue b/app/assets/javascripts/vue_shared/components/namespace_select/namespace_select.vue new file mode 100644 index 00000000000..7d2af7983d1 --- /dev/null +++ b/app/assets/javascripts/vue_shared/components/namespace_select/namespace_select.vue @@ -0,0 +1,93 @@ + + diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index 04c40826d13..6af46e22d8f 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -119,7 +119,10 @@ class ProjectsController < Projects::ApplicationController if @project.errors[:new_namespace].present? flash[:alert] = @project.errors[:new_namespace].first + return redirect_to edit_project_path(@project) end + + render_edit end # rubocop: enable CodeReuse/ActiveRecord diff --git a/app/controllers/repositories/lfs_api_controller.rb b/app/controllers/repositories/lfs_api_controller.rb index 30cafb6747e..c8e44bc8399 100644 --- a/app/controllers/repositories/lfs_api_controller.rb +++ b/app/controllers/repositories/lfs_api_controller.rb @@ -76,7 +76,10 @@ module Repositories existing_oids = project.lfs_objects_oids(oids: objects_oids) objects.each do |object| - object[:actions] = upload_actions(object) unless existing_oids.include?(object[:oid]) + next if existing_oids.include?(object[:oid]) + next if should_auto_link? && oids_from_fork.include?(object[:oid]) && link_to_project!(object) + + object[:actions] = upload_actions(object) end objects @@ -150,6 +153,26 @@ module Repositories Gitlab::LfsToken.new(user).basic_encoding end + + def should_auto_link? + return false unless Feature.enabled?(:lfs_auto_link_fork_source, project) + return false unless project.forked? + + # Sanity check in case for some reason the user doesn't have access to the parent + can?(user, :download_code, project.fork_source) + end + + def oids_from_fork + @oids_from_fork ||= project.lfs_objects_oids_from_fork_source(oids: objects_oids) + end + + def link_to_project!(object) + lfs_object = LfsObject.for_oid_and_size(object[:oid], object[:size]) + + return unless lfs_object + + LfsObjectsProject.link_to_project!(lfs_object, project) + end end end diff --git a/app/helpers/namespaces_helper.rb b/app/helpers/namespaces_helper.rb index 106df168080..6acec417a75 100644 --- a/app/helpers/namespaces_helper.rb +++ b/app/helpers/namespaces_helper.rb @@ -88,6 +88,13 @@ module NamespacesHelper group.namespace_settings.public_send(method_name, **args) # rubocop:disable GitlabSecurity/PublicSend end + def namespaces_as_json(selected = :current_user) + { + group: formatted_namespaces(current_user.manageable_groups_with_routes), + user: formatted_namespaces([current_user.namespace]) + }.to_json + end + private # Many importers create a temporary Group, so use the real @@ -119,6 +126,17 @@ module NamespacesHelper [group_label.camelize, elements] end + + def formatted_namespaces(namespaces) + namespaces.sort_by(&:human_name).map! do |n| + { + id: n.id, + display_path: n.full_path, + human_name: n.human_name, + name: n.name + } + end + end end NamespacesHelper.prepend_mod_with('NamespacesHelper') diff --git a/app/models/lfs_object.rb b/app/models/lfs_object.rb index 9765ac6f2e9..caeffae7bda 100644 --- a/app/models/lfs_object.rb +++ b/app/models/lfs_object.rb @@ -13,6 +13,7 @@ class LfsObject < ApplicationRecord scope :with_files_stored_locally, -> { where(file_store: LfsObjectUploader::Store::LOCAL) } scope :with_files_stored_remotely, -> { where(file_store: LfsObjectUploader::Store::REMOTE) } scope :for_oids, -> (oids) { where(oid: oids) } + scope :for_oid_and_size, -> (oid, size) { find_by(oid: oid, size: size) } validates :oid, presence: true, uniqueness: true diff --git a/app/models/lfs_objects_project.rb b/app/models/lfs_objects_project.rb index e5632ff2842..bf6d1394569 100644 --- a/app/models/lfs_objects_project.rb +++ b/app/models/lfs_objects_project.rb @@ -21,9 +21,19 @@ class LfsObjectsProject < ApplicationRecord scope :project_id_in, ->(ids) { where(project_id: ids) } scope :lfs_object_in, -> (lfs_objects) { where(lfs_object: lfs_objects) } + def self.link_to_project!(lfs_object, project) + # We can't use an upsert here because there is no uniqueness constraint: + # https://gitlab.com/gitlab-org/gitlab/-/issues/347466 + self.safe_find_or_create_by!(lfs_object_id: lfs_object.id, project_id: project.id) # rubocop:disable Performance/ActiveRecordSubtransactionMethods + end + + def self.update_statistics_for_project_id(project_id) + ProjectCacheWorker.perform_async(project_id, [], [:lfs_objects_size]) # rubocop:disable CodeReuse/Worker + end + private def update_project_statistics - ProjectCacheWorker.perform_async(project_id, [], [:lfs_objects_size]) + self.class.update_statistics_for_project_id(project_id) end end diff --git a/app/models/project.rb b/app/models/project.rb index 6d35534bb6a..088a2f9ea27 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -1569,6 +1569,12 @@ class Project < ApplicationRecord oids(lfs_objects, oids: oids) end + def lfs_objects_oids_from_fork_source(oids: []) + return [] unless forked? + + oids(fork_source.lfs_objects, oids: oids) + end + def personal? !group end diff --git a/app/services/groups/update_shared_runners_service.rb b/app/services/groups/update_shared_runners_service.rb index eb6b46a5613..c09dce0761f 100644 --- a/app/services/groups/update_shared_runners_service.rb +++ b/app/services/groups/update_shared_runners_service.rb @@ -8,7 +8,7 @@ module Groups validate_params update_shared_runners - update_pending_builds! + update_pending_builds_async success @@ -28,12 +28,18 @@ module Groups group.update_shared_runners_setting!(params[:shared_runners_setting]) end - def update_pending_builds! - return unless group.previous_changes.include?('shared_runners_enabled') + def update_pending_builds? + group.previous_changes.include?('shared_runners_enabled') + end - update_params = { instance_runners_enabled: group.shared_runners_enabled } + def update_pending_builds_async + return unless update_pending_builds? - ::Ci::UpdatePendingBuildService.new(group, update_params).execute + group.run_after_commit_or_now do |group| + pending_builds_params = { instance_runners_enabled: group.shared_runners_enabled } + + ::Ci::UpdatePendingBuildService.new(group, pending_builds_params).execute + end end end end diff --git a/app/views/projects/_transfer.html.haml b/app/views/projects/_transfer.html.haml index e48008e1cc6..9f9daa7ec6f 100644 --- a/app/views/projects/_transfer.html.haml +++ b/app/views/projects/_transfer.html.haml @@ -1,8 +1,11 @@ - return unless can?(current_user, :change_namespace, @project) +- form_id = "transfer-project-form" +- hidden_input_id = "new_namespace_id" +- initial_data = { namespaces: namespaces_as_json, button_text: s_('ProjectSettings|Transfer project'), confirm_danger_message: transfer_project_message(@project), phrase: @project.name, target_form_id: form_id, target_hidden_input_id: hidden_input_id } .sub-section %h4.danger-title= _('Transfer project') - = form_for @project, url: transfer_project_path(@project), method: :put, remote: true, html: { class: 'js-project-transfer-form' } do |f| + = form_for @project, url: transfer_project_path(@project), method: :put, html: { class: 'js-project-transfer-form', id: form_id } do |f| .form-group - link_start = ''.html_safe % { url: help_page_path('user/project/settings/index', anchor: 'transferring-an-existing-project-into-another-namespace') } %p= _("Transfer your project into another namespace. %{link_start}Learn more.%{link_end}").html_safe % { link_start: link_start, link_end: ''.html_safe } @@ -11,7 +14,6 @@ %li= _('You can only transfer the project to namespaces you manage.') %li= _('You will need to update your local repositories to point to the new location.') %li= _('Project visibility level will be changed to match namespace rules when transferring to a group.') + = hidden_field_tag(hidden_input_id) = label_tag :new_namespace_id, _('Select a new namespace'), class: 'gl-font-weight-bold' - .form-group - = select_tag :new_namespace_id, namespaces_options(nil), include_blank: true, class: 'select2' - = f.submit 'Transfer project', class: "gl-button btn btn-danger js-legacy-confirm-danger qa-transfer-button", data: { "confirm-danger-message" => transfer_project_message(@project) } + .js-transfer-project-form{ data: initial_data } diff --git a/app/views/projects/transfer.js.haml b/app/views/projects/transfer.js.haml deleted file mode 100644 index 6d083c5c516..00000000000 --- a/app/views/projects/transfer.js.haml +++ /dev/null @@ -1,2 +0,0 @@ -:plain - location.href = "#{edit_project_path(@project)}"; diff --git a/config/feature_flags/development/lfs_auto_link_fork_source.yml b/config/feature_flags/development/lfs_auto_link_fork_source.yml new file mode 100644 index 00000000000..b094d56294c --- /dev/null +++ b/config/feature_flags/development/lfs_auto_link_fork_source.yml @@ -0,0 +1,8 @@ +--- +name: lfs_auto_link_fork_source +introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/75972 +rollout_issue_url: +milestone: '14.6' +type: development +group: group::source code +default_enabled: false diff --git a/config/metrics/counts_28d/20210216184559_ci_templates_total_unique_counts_monthly.yml b/config/metrics/counts_28d/20210216184559_ci_templates_total_unique_counts_monthly.yml index c80a7dada11..637b02b93ed 100644 --- a/config/metrics/counts_28d/20210216184559_ci_templates_total_unique_counts_monthly.yml +++ b/config/metrics/counts_28d/20210216184559_ci_templates_total_unique_counts_monthly.yml @@ -49,6 +49,7 @@ options: - p_ci_templates_security_api_fuzzing_latest - p_ci_templates_security_secure_binaries - p_ci_templates_security_dast_api + - p_ci_templates_security_dast_api_latest - p_ci_templates_security_container_scanning - p_ci_templates_security_dast_latest - p_ci_templates_security_dependency_scanning @@ -153,6 +154,7 @@ options: - p_ci_templates_implicit_security_api_fuzzing_latest - p_ci_templates_implicit_security_secure_binaries - p_ci_templates_implicit_security_dast_api + - p_ci_templates_implicit_security_dast_api_latest - p_ci_templates_implicit_security_container_scanning - p_ci_templates_implicit_security_dast_latest - p_ci_templates_implicit_security_dependency_scanning diff --git a/config/metrics/counts_28d/20211122134101_p_ci_templates_implicit_security_dast_api_latest_monthly.yml b/config/metrics/counts_28d/20211122134101_p_ci_templates_implicit_security_dast_api_latest_monthly.yml new file mode 100644 index 00000000000..4b9bf4120f5 --- /dev/null +++ b/config/metrics/counts_28d/20211122134101_p_ci_templates_implicit_security_dast_api_latest_monthly.yml @@ -0,0 +1,25 @@ +--- +key_path: redis_hll_counters.ci_templates.p_ci_templates_implicit_security_dast_api_latest_monthly +description: Monthly counts for DAST API latest CI template +product_section: sec +product_stage: secure +product_group: dynamic_analysis +product_category: dynamic_application_security_testing +value_type: number +status: active +milestone: '14.6' +introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/73876 +time_frame: 28d +data_source: redis_hll +data_category: optional +instrumentation_class: RedisHLLMetric +distribution: +- ce +- ee +tier: +- free +- premium +- ultimate +options: + events: + - p_ci_templates_implicit_security_dast_api_latest diff --git a/config/metrics/counts_28d/20211201194407_p_ci_templates_security_dast_api_latest_monthly.yml b/config/metrics/counts_28d/20211201194407_p_ci_templates_security_dast_api_latest_monthly.yml new file mode 100644 index 00000000000..cfcffe5caca --- /dev/null +++ b/config/metrics/counts_28d/20211201194407_p_ci_templates_security_dast_api_latest_monthly.yml @@ -0,0 +1,25 @@ +--- +key_path: redis_hll_counters.ci_templates.p_ci_templates_security_dast_api_latest_monthly +description: Monthly counts for DAST API latest CI template +product_section: sec +product_stage: secure +product_group: dynamic_analysis +product_category: dynamic_application_security_testing +value_type: number +status: active +milestone: "14.6" +introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/73876 +time_frame: 28d +data_source: redis_hll +data_category: optional +instrumentation_class: RedisHLLMetric +distribution: +- ce +- ee +tier: +- free +- premium +- ultimate +options: + events: + - p_ci_templates_security_dast_api_latest diff --git a/config/metrics/counts_7d/20210216184557_ci_templates_total_unique_counts_weekly.yml b/config/metrics/counts_7d/20210216184557_ci_templates_total_unique_counts_weekly.yml index 31813735ea4..8d545b91d1f 100644 --- a/config/metrics/counts_7d/20210216184557_ci_templates_total_unique_counts_weekly.yml +++ b/config/metrics/counts_7d/20210216184557_ci_templates_total_unique_counts_weekly.yml @@ -49,6 +49,7 @@ options: - p_ci_templates_security_api_fuzzing_latest - p_ci_templates_security_secure_binaries - p_ci_templates_security_dast_api + - p_ci_templates_security_dast_api_latest - p_ci_templates_security_container_scanning - p_ci_templates_security_dast_latest - p_ci_templates_security_dependency_scanning @@ -153,6 +154,7 @@ options: - p_ci_templates_implicit_security_api_fuzzing_latest - p_ci_templates_implicit_security_secure_binaries - p_ci_templates_implicit_security_dast_api + - p_ci_templates_implicit_security_dast_api_latest - p_ci_templates_implicit_security_container_scanning - p_ci_templates_implicit_security_dast_latest - p_ci_templates_implicit_security_dependency_scanning diff --git a/config/metrics/counts_7d/20211122134101_p_ci_templates_implicit_security_dast_api_latest_weekly.yml b/config/metrics/counts_7d/20211122134101_p_ci_templates_implicit_security_dast_api_latest_weekly.yml new file mode 100644 index 00000000000..8d0415dedd2 --- /dev/null +++ b/config/metrics/counts_7d/20211122134101_p_ci_templates_implicit_security_dast_api_latest_weekly.yml @@ -0,0 +1,25 @@ +--- +key_path: redis_hll_counters.ci_templates.p_ci_templates_implicit_security_dast_api_latest_weekly +description: Weekly counts for DAST API latest CI template +product_section: sec +product_stage: secure +product_group: dynamic_analysis +product_category: dynamic_application_security_testing +value_type: number +status: active +milestone: '14.6' +introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/73876 +time_frame: 7d +data_source: redis_hll +data_category: optional +instrumentation_class: RedisHLLMetric +distribution: +- ce +- ee +tier: +- free +- premium +- ultimate +options: + events: + - p_ci_templates_implicit_security_dast_api_latest diff --git a/config/metrics/counts_7d/20211201194402_p_ci_templates_security_dast_api_latest_weekly.yml b/config/metrics/counts_7d/20211201194402_p_ci_templates_security_dast_api_latest_weekly.yml new file mode 100644 index 00000000000..1d4f024b361 --- /dev/null +++ b/config/metrics/counts_7d/20211201194402_p_ci_templates_security_dast_api_latest_weekly.yml @@ -0,0 +1,25 @@ +--- +key_path: redis_hll_counters.ci_templates.p_ci_templates_security_dast_api_latest_weekly +description: Weekly counts for DAST API latest CI template +product_section: sec +product_stage: secure +product_group: dynamic_analysis +product_category: dynamic_application_security_testing +value_type: number +status: active +milestone: "14.6" +introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/73876 +time_frame: 7d +data_source: redis_hll +data_category: optional +instrumentation_class: RedisHLLMetric +distribution: +- ce +- ee +tier: +- free +- premium +- ultimate +options: + events: + - p_ci_templates_security_dast_api_latest diff --git a/data/deprecations/14-6-deprecation-secure-dependency-scanning-bundler-audit.yml b/data/deprecations/14-6-deprecation-secure-dependency-scanning-bundler-audit.yml new file mode 100644 index 00000000000..23e59da21e4 --- /dev/null +++ b/data/deprecations/14-6-deprecation-secure-dependency-scanning-bundler-audit.yml @@ -0,0 +1,16 @@ +- name: "Deprecation of bundler-audit Dependency Scanning tool" # The name of the feature to be deprecated + announcement_milestone: "14.6" # The milestone when this feature was first announced as deprecated. + announcement_date: "2021-12-22" # The date of the milestone release when this feature was first announced as deprecated. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post. + removal_milestone: "15.0" # The milestone when this feature is planned to be removed + body: | # Do not modify this line, instead modify the lines below. + As of 14.6 bundler-audit is being deprecated from Dependency Scanning. It will continue to be in our CI/CD template while deprecated. We are removing bundler-audit from Dependency Scanning on May 22, 2022 in 15.0. After this removal Ruby scanning functionality will not be affected as it is still being covered by Gemnasium. + + If you have explicitly excluded bundler-audit using DS_EXCLUDED_ANALYZERS you will need to clean up (remove the reference) in 15.0. If you have customized your pipeline's Dependency Scanning configuration, for example to edit the `bundler-audit-dependency_scanning` job, you will want to switch to gemnasium-dependency_scanning before removal in 15.0, to prevent your pipeline from failing. If you have not used the DS_EXCLUDED_ANALYZERS to reference bundler-audit, or customized your template specifically for bundler-audit, you will not need to take action. +# The following items are not published on the docs page, but may be used in the future. + stage: secure # (optional - may be required in the future) String value of the stage that the feature was created in. e.g., Growth + tiers: ultimate # (optional - may be required in the future) An array of tiers that the feature is available in currently. e.g., [Free, Silver, Gold, Core, Premium, Ultimate] + issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/289832 # (optional) This is a link to the deprecation issue in GitLab + documentation_url: https://docs.gitlab.com/ee/user/application_security/dependency_scanning/analyzers.html # (optional) This is a link to the current documentation page + image_url: # (optional) This is a link to a thumbnail image depicting the feature + video_url: # (optional) Use the youtube thumbnail URL with the structure of https://img.youtube.com/vi/UNIQUEID/hqdefault.jpg + removal_date: 2022-05-22 # (optional - may be required in the future) YYYY-MM-DD format. This should almost always be the 22nd of a month (YYYY-MM-22), the date of the milestone release when this feature is planned to be removed diff --git a/doc/administration/audit_events.md b/doc/administration/audit_events.md index 71eee78c168..06ad16bbcba 100644 --- a/doc/administration/audit_events.md +++ b/doc/administration/audit_events.md @@ -9,8 +9,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w GitLab offers a way to view the changes made within the GitLab server for owners and administrators on a [paid plan](https://about.gitlab.com/pricing/). -GitLab system administrators can also take advantage of the logs located on the -file system. See [the logs system documentation](logs.md#audit_jsonlog) for more details. +GitLab system administrators can also view all audit events by accessing the [`audit_json.log` file](logs.md#audit_jsonlog). You can: diff --git a/doc/administration/incoming_email.md b/doc/administration/incoming_email.md index 6b390cfc77a..62fbf9e7166 100644 --- a/doc/administration/incoming_email.md +++ b/doc/administration/incoming_email.md @@ -10,7 +10,7 @@ GitLab has several features based on receiving incoming email messages: - [Reply by Email](reply_by_email.md): allow GitLab users to comment on issues and merge requests by replying to notification email. -- [New issue by email](../user/project/issues/managing_issues.md#new-issue-via-email): +- [New issue by email](../user/project/issues/managing_issues.md#by-sending-an-email): allow GitLab users to create a new issue by sending an email to a user-specific email address. - [New merge request by email](../user/project/merge_requests/creating_merge_requests.md#by-sending-an-email): diff --git a/doc/administration/index.md b/doc/administration/index.md index ef9c56c1615..d78c9d80b5f 100644 --- a/doc/administration/index.md +++ b/doc/administration/index.md @@ -133,7 +133,7 @@ Learn how to install, configure, update, and maintain your GitLab instance. - Instances. - [Auditor users](auditor_users.md): Users with read-only access to all projects, groups, and other resources on the GitLab instance. - [Incoming email](incoming_email.md): Configure incoming emails to allow - users to [reply by email](reply_by_email.md), create [issues by email](../user/project/issues/managing_issues.md#new-issue-via-email) and + users to [reply by email](reply_by_email.md), create [issues by email](../user/project/issues/managing_issues.md#by-sending-an-email) and [merge requests by email](../user/project/merge_requests/creating_merge_requests.md#by-sending-an-email), and to enable [Service Desk](../user/project/service_desk.md). - [Postfix for incoming email](reply_by_email_postfix_setup.md): Set up a basic Postfix mail server with IMAP authentication on Ubuntu for incoming diff --git a/doc/development/cicd/cicd_reference_documentation_guide.md b/doc/development/cicd/cicd_reference_documentation_guide.md index aa3888cd866..892c9814c7f 100644 --- a/doc/development/cicd/cicd_reference_documentation_guide.md +++ b/doc/development/cicd/cicd_reference_documentation_guide.md @@ -9,14 +9,14 @@ info: To determine the technical writer assigned to the Stage/Group associated w The CI/CD YAML reference uses a standard style to make it easier to use and update. The reference information should be kept as simple as possible, and expanded details -and examples documented in a separate page. +and examples should be documented on other pages. ## YAML reference structure Every YAML keyword must have its own section in the reference. The sections should be nested so that the keywords follow a logical tree structure. For example: -```plaintext +```markdown ### `artifacts` #### `artifacts:name` #### `artifacts:paths` @@ -27,128 +27,127 @@ be nested so that the keywords follow a logical tree structure. For example: ## YAML reference style -Each keyword entry in the reference should use the following style: +Each keyword entry in the reference: -````markdown -### `keyword-name` +- Must have a simple introductory section. The introduction should give the fundamental + information needed to use the keyword. Advanced details and tasks should be in + feature pages, not the reference page. -> Version information +- Must use the keyword name as the title, for example: -Keyword description and main details. + ```markdown + ### `artifacts` + ``` -**Keyword type**: +- Should include the following sections: + - [Keyword type](#keyword-type) + - [Possible inputs](#possible-inputs) + - [Example of `keyword-name`](#example-of-keyword-name) +- (Optional) Can also include the following sections when needed: + - [Additional details](#additional-details) + - [Related topics](#related-topics) +The keyword name must always be in backticks without a final `:`, like `artifacts`, not `artifacts:`. +If it is a subkey of another keyword, write out all the subkeys to the "parent" key the first time it +is used, like `artifacts:reports:dast`. Afterwards, you can use just the subkey alone, like `dast`. + +## Keyword type + +The keyword can be either a job or global keyword. If it can be used in a `default` +section, make not of that as well, for example: + +- `**Keyword type**: Global keyword.` +- `**Keyword type**: Job keyword. You can use it only as part of a job.` +- ``**Keyword type**: Job keyword. You can use it only as part of a job or in the [`default:` section](#default).`` + +### Possible inputs + +List all the possible inputs, and any extra details about the inputs, such as defaults +or changes due to different GitLab versions, for example: + +```markdown **Possible inputs**: -**Example of `keyword-name`**: - -(optional) In this example... - -(optional) **Additional details**: - -- List of extra details. - -(optional) **Related topics**: - -- List of links to topics related to the keyword. -```` - -- ``### `keyword-name` ``: The keyword name must always be in backticks. - If it is a subkey of another keyword, write out all the keywords, with each separated - by `:`, for example: `artifacts:reports:dast`. - -- ``> Version information``: The [version history details](../documentation/styleguide/index.md#version-text-in-the-version-history). - If the keyword is feature flagged, see the [feature flag documentation guide](../documentation/feature_flags.md) - as well. - -- `Keyword description and main details.`: A simple description of the keyword, and - how to use it. Additional use cases and benefits should be added to a page outside - the reference document. Link to that document in this section. - -- `**Keyword type**:`: Most keywords are defined at the job level, like `script`, - or at the pipeline level, like `stages`. Add the appropriate line: - - - `**Keyword type**: Job keyword. You can use it only as part of a job.` - - `**Keyword type**: Pipeline keyword. You cannot use it as part of a job.` - - If a keyword can be used at both the job and pipeline level, like `variables`, - explain it in detail instead of using the pre-written lines above. - -- `**Possible inputs**:`: Explain in detail which inputs the keyword can accept. - You can add the details in a sentence, paragraph, or list. - -- ``**Example of `keyword-name`**:``: An example configuration that uses the keyword. - Do not add extra keywords that are not required to understand the behavior. - -- (optional) `In this example...`: If the example needs extra details, - add the clarification text below the example. - -- (optional) `**Additional details**:` If there are any caveats or extra details you - want to document along with the keyword, add each one as a list item here. - -- (optional) `**Related topics**:` If there are any other keywords or pages that - relate to this keyword, add these links as list items here. - -### YAML reference style example - -See the [`only:changes` / `except:changes`](../../ci/yaml/index.md#onlychanges--exceptchanges) -documentation for an example of the YAML reference style. The following example is a -shortened version of that documentation's Markdown: - -````markdown -#### `only:changes` / `except:changes` - -> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/19232) in GitLab 11.4. - -Use the `changes` keyword with `only` to run a job, or with `except` to skip a job, -when a Git push event modifies a file. - -Use `changes` in pipelines with the following refs: - -- `branches` -- `external_pull_requests` -- `merge_requests` (see additional details about [using `only:changes` with pipelines for merge requests](../jobs/job_control.md#use-onlychanges-with-pipelines-for-merge-requests)) - -**Keyword type**: Job keyword. You can use it only as part of a job. - -**Possible inputs**: An array including any number of: - -- Paths to files. -- Wildcard paths for single directories, for example `path/to/directory/*`, or a directory - and all its subdirectories, for example `path/to/directory/**/*`. - -**Example of `only:changes`**: - -```yaml -docker build: - script: docker build -t my-image:$CI_COMMIT_REF_SLUG . - only: - refs: - - branches - changes: - - Dockerfile - - docker/scripts/* - - dockerfiles/**/* +- `true` (default if not defined) or `false`. ``` -In this example, `docker build` only runs in branch pipelines, and only if at least one of -these files changed: +```markdown +**Possible inputs**: -- `Dockerfile`. -- Any file in `docker/scripts` -- Any file in `dockerfiles/` or any of its subdirectories. +- A single exit code. +- An array of exit codes. +``` +```markdown +**Possible inputs**: + +- A string with the long description. +- The path to a file that contains the description. Introduced in [GitLab 13.7](https://gitlab.com/gitlab-org/release-cli/-/merge_requests/67). + - The file location must be relative to the project directory (`$CI_PROJECT_DIR`). + - If the file is a symbolic link, it must be in the `$CI_PROJECT_DIR`. + - The `./path/to/file` and filename can't contain spaces. +``` + +### Example of `keyword-name` + +An example of the keyword. Use the minimum number of other keywords necessary +to make the example valid. If the example needs explanation, add it after the example, +for example: + +````markdown +**Example of `dast`**: + +```yaml +stages: + - build + - dast + +include: + - template: DAST.gitlab-ci.yml + +dast: + dast_configuration: + site_profile: "Example Co" + scanner_profile: "Quick Passive Test" +``` + +In this example, the `dast` job extends the `dast` configuration added with the `include:` keyword +to select a specific site profile and scanner profile. +```` + +### Additional details + +The additional details should be an unordered list of extra information that is +useful to know, but not important enough to put in the introduction. This information +can include changes introduced in different GitLab versions. For example: + +```markdown **Additional details**: -- If you use refs other than `branches`, `external_pull_requests`, or `merge_requests`, - `changes` can't determine if a given file is new or old and always returns `true`. -- If you use `only: changes` with other refs, jobs ignore the changes and always run. -- If you use `except: changes` with other refs, jobs ignore the changes and never run. +- The expiration time period begins when the artifact is uploaded and stored on GitLab. + If the expiry time is not defined, it defaults to the [instance wide setting](../../user/admin_area/settings/continuous_integration.md#default-artifacts-expiration). +- To override the expiration date and protect artifacts from being automatically deleted: + - Select **Keep** on the job page. + - [In GitLab 13.3 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/22761), set the value of + `expire_in` to `never`. +``` +### Related topics + +The related topics should be an unordered list of crosslinks to related pages, including: + +- Specific tasks that you can accomplish with the keyword. +- Advanced examples of the keyword. +- Other related keywords that can be used together with this keyword. + +For example: + +```markdown **Related topics**: -- [`only: changes` and `except: changes` examples](../jobs/job_control.md#onlychanges--exceptchanges-examples). -- If you use `changes` with [only allow merge requests to be merged if the pipeline succeeds](../../user/project/merge_requests/merge_when_pipeline_succeeds.md#only-allow-merge-requests-to-be-merged-if-the-pipeline-succeeds), - you should [also use `only:merge_requests`](../jobs/job_control.md#use-onlychanges-with-pipelines-for-merge-requests). -- Use `changes` with [scheduled pipelines](../jobs/job_control.md#use-onlychanges-with-scheduled-pipelines). -```` +- You can specify a [fallback cache key](../caching/index.md#use-a-fallback-cache-key) + to use if the specified `cache:key` is not found. +- You can [use multiple cache keys](../caching/index.md#use-multiple-caches) in a single job. +- See the [common `cache` use cases](../caching/index.md#common-use-cases-for-caches) for more + `cache:key` examples. +``` diff --git a/doc/gitlab-basics/index.md b/doc/gitlab-basics/index.md index 5e4ec0e8c51..5ba5366eafa 100644 --- a/doc/gitlab-basics/index.md +++ b/doc/gitlab-basics/index.md @@ -29,7 +29,7 @@ The following are guides to basic GitLab functionality: - [Feature branch workflow](feature_branch_workflow.md). - [Fork a project](../user/project/repository/forking_workflow.md#creating-a-fork), to duplicate projects so they can be worked on in parallel. - [Add a file](add-file.md), to add new files to a project's repository. -- [Create an issue](../user/project/issues/managing_issues.md#create-a-new-issue), +- [Create an issue](../user/project/issues/managing_issues.md#create-an-issue), to start collaborating within a project. - [Create a merge request](../user/project/merge_requests/creating_merge_requests.md), to request changes made in a branch be merged into a project's repository. diff --git a/doc/update/deprecations.md b/doc/update/deprecations.md index 066c91b7dd9..20c6d692cf6 100644 --- a/doc/update/deprecations.md +++ b/doc/update/deprecations.md @@ -116,6 +116,14 @@ Long term service and support (LTSS) for SUSE Linux Enterprise Server (SLES) 12 Announced: 2021-11-22 +### Deprecation of bundler-audit Dependency Scanning tool + +As of 14.6 bundler-audit is being deprecated from Dependency Scanning. It will continue to be in our CI/CD template while deprecated. We are removing bundler-audit from Dependency Scanning on May 22, 2022 in 15.0. After this removal Ruby scanning functionality will not be affected as it is still being covered by Gemnasium. + +If you have explicitly excluded bundler-audit using DS_EXCLUDED_ANALYZERS you will need to clean up (remove the reference) in 15.0. If you have customized your pipeline's Dependency Scanning configuration, for example to edit the `bundler-audit-dependency_scanning` job, you will want to switch to gemnasium-dependency_scanning before removal in 15.0, to prevent your pipeline from failing. If you have not used the DS_EXCLUDED_ANALYZERS to reference bundler-audit, or customized your template specifically for bundler-audit, you will not need to take action. + +Announced: 2021-12-22 + ### GitLab Serverless [GitLab Serverless](https://docs.gitlab.com/ee/user/project/clusters/serverless/) is a feature set to support Knative-based serverless development with automatic deployments and monitoring. diff --git a/doc/user/project/description_templates.md b/doc/user/project/description_templates.md index 5b19a54bd91..66e5931fa4c 100644 --- a/doc/user/project/description_templates.md +++ b/doc/user/project/description_templates.md @@ -71,7 +71,7 @@ To create the `.gitlab/issue_templates` directory: 1. Select **New directory**. 1. Name your directory `issue_templates` and commit to your default branch. -To check if this has worked correctly, [create a new issue](issues/managing_issues.md#create-a-new-issue) +To check if this has worked correctly, [create a new issue](issues/managing_issues.md#create-an-issue) and see if you can choose a description template. ## Create a merge request template diff --git a/doc/user/project/issues/img/new_issue_from_email.png b/doc/user/project/issues/img/new_issue_from_email.png deleted file mode 100644 index 6da899ea37c32704a30c8a6a46140c3c2afa40b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4259 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 diff --git a/doc/user/project/issues/img/new_issue_from_open_issue_v13_6.png b/doc/user/project/issues/img/new_issue_from_open_issue_v13_6.png deleted file mode 100644 index 902aa40614a5c14308bb3a03907acd3c0dfd3dfb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25667 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≺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 diff --git a/doc/user/project/issues/img/new_issue_from_tracker_list.png b/doc/user/project/issues/img/new_issue_from_tracker_list.png deleted file mode 100644 index 66793cb44fac205e21493b106d373370c980d7eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19632 zcma&NbyyrTT?>*;ybLO47 zzL`I|yQ+3wwPn@b>+ZFl9i|{Bj)F*l2mt|sA}JxF1Of30{BisM5B>4o-v8SH0sFM_N_U`R!Z*TAX{9GY===k_VJX9PE2Ah;dQd3j!>@WC7M7<{xQc_d0 z_)NaPKR&*{J2*JJKW&mTn%LUfK0G`&uHJ)RuC89*xPNiIzn+60-khAAj-TJ|UQh4V zn_MfGw}*0vcW<8W_7-o!=c^SpE64UO>15w*KH77Ab9?tVKXv?M&iIwZrex*jO@fZ* zi+X8h|8~5iLw!RXt9{MO(>)LfOiD=^TEFO7K8lWuaEcx7JAFR9eI#ShcVMD_Jev7i z?>kuoxZWA-Xm3e%cJAr!Sv@)hUEb&0vpAGaEuY*!fKTsUc5lJkE2}HnxmiLgSl?KsZNx1^3M;K6O~rQ zGv~StUp47z0X5STjfn;0yWO?f?n#yU477(UT_Le!?wM^(v&R#YlhcE3xkaV+ZV`BF z;n&AKi8I&hPvGkE5^V0&#tPaMdlg+1ZE^PcS%Vf6j}aCim!}jRB%WfZngRq7#!r6 z9v!{j=^yo-(V(tV(@>wC<9l#dsk@IycC@Q0HoB6zPeZ8PS+3+=D$~fu?B+~r7cj~j zcvd+E((ujpt_c0j%2@nc)g?kw3>h8*iQhqyUNgK_`B&WCV01(IxNAdtW=VJNM2$#< z*IkQaL%p0>+PHpc5d@w&pKk`InQuO@s9<)K-Pk_0P-doU;VTTZDl?K@(IIA=*&QMheHXe4|n=J+dO2naF=NfAL6 zz{*({f(q7R^SgebExMe}ZH15DQq7SW77UDK6m&Q(D!d$gDB@QO1qTQkAi@B`!DsUw z22_Vo;mj_%Fb~=9lZ(jKR4iilcJV10Yq#+!YujD#zBx|i|oi{qs}| zv>+jJa4g{C`C%czf0a>^{8LB{{-^XplpsTCkXvLw2Lh)&2P5^g@10fHAIJ=Bkgyi^Mh_|IO^*NANq7nwAnE%SyE(BU| zR^#~|U?ms@IR%3n_>J>-GG5@;VDf0#BIDJv-vLHszyv1UeQ-0UGrRa-5)H-D&0&|$ zMCHK3zfj;pUkA`DqX@d%ONCv*EdS#Ah6i9hhr4#m?zz@?;k7JhY~R3kwTU!qPMLkavxFzvHY)D-^Jl@QxcEgC{f zI^-Mdea;iuAW6?aC9%#PQ6%qnqzzv_hF7=sALPgy!(lY9oHp+42vWp2Pve}aZ^+ii zf1?`C6o^4VK0u8{E~D_G?{5wp@1nf0ur5$u-X}}|-`BIs&`|rx^urQs#j#}TFR(Ky zY(3$r+j$olb=)W$DK@FB{Ace0IuTxjEZq`g&ki7$b(^-F#EXQaGp&Kb<+7>U1FUXD%d zjH8<=vS%l!Pn`Zf%FW~Y)|#8PC^jd^CMp=^w5Bcp#G3>eD)fl zvw0B5d`5j+!{mEj7J8(9l_t-AKW%rhe^cO`yg6vU=X*^N z;x!F9MrUF$LZnJRD(DeO@xlJ=@byc68u?B|Xv|cV21V&H$x83A@mzL?oav| z$B}xcy`e46bs-gPw|EwFrBvBwnXWrmIJ|2o=GK~)sNXxg#zxo>ZwcF?Q-mzlMdaF? ziJ49W-M3U_I@|A&^KcMr`KYL<1e$+bh;1yQoG=(#`S-8~+}KO3x4$2vCO$Mo0j^LN z$Tq$v0U%oO(a#~D{))fsVF6tur1%4D4L`G4KoTNxzsoCefn+BTX3#=ILlrnxz|8aC zT!AMzLOWG=!D;)0aPfz~`tkw;HKQ0A&>8k9XRX6H=k6u;SJ3KJL5#ACDV;mgOr2G! zo`sWAoA>cLtU`xYcF%|tHSEASWJzT2-~Mc=oP~{@g>vakwha~b+KZ^zK~GWWQ#9;i8M&!=R-)MmeZl$nbv-iz+0U4@99~jLu@kCpJ&aBTpz`;SFOk&vLS~P%u9$lVl zqr4{&`K@Q}3H#Z+H5igWQ*o5Q28d*5kIq5u%y!TAiBnES#-?FHVi7*ii8!nz2YPI; zqKQTCU_kQ81tPDv=CM2FJ~+gh;aF%WVj?0F)1L9btj<$mKrbK#c`RLK<-=B_qh}ytb5nc)HuJ@M)QLTG4r0G){irmv$R!T@1AJ)LPOSFRf zehbU>35%ni7NiaSK#PC+B;!WW%>u84|0{~Bu834rKn*F(OiU1t5zI?0%q!IyMapP| zdj~5LC?HU1b5;4ZJ$<--)F%_b2;oz6&-NV>8I?o4p%=Lhwd**@6yxo=_uMawC9A=)P<$aTl&PXVKSVWqculWu5;Cgbrv<_QGh_ z714=$egE?1h4%Cdi4TnA>1k-_38|O}Fv-W1LJ#v9z2*U)Cfny#e+A|3Fu=zQXo(gI z=GAG>WI|zQn(1kWrWFR`*lehnH*$&Kt^DY?KO9V+Zo`b%(|rpjcRmLdCf!lsX7c>@ zz84T!lI}_)06&E2YfQHo<6=8T5iZ$*uO9YHY5xN10)cC0PB;CoIhmiZ$)1J;b=d8XXx_P%T&}T3={6dt?fn3> ziPvnlLMNx(J|#JMd#iW2I@R)eed*#0*Has>?coX1!@1F|)R)4&psF(XoHgsn(}9k5 zAty)<)}eob`YD;qnInk-LDN`0rQW5~<3--FnUTCkT-05y9Kv)kUnW+(sI}@xY1}WX zISNf^H%Yj7^3#IhaRj&0g+$F`c#NB5D#?!fRq?Eqzck5X>3FCRCkW`-mXoFQw16x; zpnc}!w{TnG`u;aZkL&SvF}!V={r#D#q=!{|1=H6wSP1lb7iuoGw#$lg{F32oef&w3 zqzU|6y=3@WU@I>c(DM_dDhchSg~i8+7zBJ?M@P$n510QWN)Gms|KIrwE$jo~VgdgE z+pW+@!I8(447po&n6;fM}eG*uYCqt>>Q+o8)n#W|bTPq_-$26;RHt zNc&oN)qi0XU1{S~`>0bR;8gg%u}e^6vANw_nm&bEbO%2|XaNc=H~EWT+C)W)@u*5L zDG_-*tXdOfN>zNAri9V(l{%Y?J$Po6Xy*vyqc)Q*Q_E55F&bxdA@eRp_r%3AM-Ync zpA&+WDYDLu{B}~TsSpw1NyJV4-h>OioajCxd!OKF)Agd z-NQvp-!?yfQZY*Z-onxt3;wCX3TT21Re#Fkg59VJ3}@*V&9nLqDDJ%Gdff8C9~v2w z4&2fKt;ST9u!NUshobWut`B4)Y$X&o{Uu!WfB?f@P?Op#Nx6DNdC6S2^x}>L8lixB zS4<$Uj?J6E020tLhpJqs3MaWDU@w_#j0)tiy9|kD)H!(V9^%YGnrd=x&dg}9!#u(Z zOJ>g3Dt>6w&1-p1C=pG6>i57$xxM9MPZQ#44mRceKa?Nt)htXB{7Ug?4Ud3fmQWBfiNUYu$iem3kspi+ zHG-oNyc&9tj4%wnW!k>L4JLuQVufiS!%9`A4`mvQ(E&h#M~nXGcBD-_dXjs*SQXrzR336m;aBLyA@>b0Ic_Dv3BxA-+Q zh%*5ZTT@p!--`o@4VP&orFpX#V4=^1?mwn)sTSGBs9wOOKHtnnTkJyBxEh;s*nUkS zAj{ueh#8zA`-dOeAAk=7+j~P9nzH7OJp0GJDlki#A>c+um^YZ0@zN>=;8+Mp#I{*Z z*6oZ}0R!UFDOme)BpiCiorXqDxeIw0Y)akyg1(_l;*x%9-x0kSh8a_puz}zIhf2Sv z;d4wEDhH{QMC!uQmy6!tW)BHDv9Shrkb*`&f^NNW0Je!JG|KI;kC_AuE|e^5VG4fE z$c`O>V+f!CKS7TLDpimYCNr-GHDz5H+3h)kB%!^HjO-3L+&oXjm(2Z=0a)%@TMOU7 zeqYyD}cI4%UoU^8Oq;tv* zR4+#@w>J7)syXZ>7rOjX>h#1KnlUd{`F@yryEJtP37ksW>^=r-J`p(I55N|Q?CsB& z2p|j~+dztuj8Y1{mo~Jr+BW42?ilr9=x0=p$Xub;3!tuW31zCF)`KPV^0P@s8{%Mz zEFe10M~^9P&$H!T`W#brqDBtZQUEE^a(o`ev`4lUyb6>zI3gUZHal#Fd^G_H7Req; z1moK)3+7oR0&G|^sH@z_2Cs8@J(c0F!;-`9DUi+r-?+944S`JPzi5&Dm+WYAXR%0u zQc}>`g3BAkh5m^-_94$5X5zA#OmVsibCEiUF-*jvDXQ6k;=QN?&+5~=U`3A-hr7W% zv-j$KDiTYxG{Edh!h!u7bR~jWx z_p+X4r3eu2(I_K+hF3Z37(w*}HnN$INO4ooq}eR9(YXcBI4_#djj~Zn00=p5$Q(yh zO~9GouP7LL(i)QIzk@LrW?-g(QlTjp-Kx1QJv>D^UPl7FQd>|KUmG6>N+t$qwNCn&LMiB(t)xbs#ys#`u>SgkKJ8y5;Lijl-m1ykObAZJE_D6ZOQx+pte8f}dc~{E zN>9E)U$)Q=owlg4rBL`re{0INOP>krxth7GZFZi?&=tnULFL(32RER8b5Ywn)iVN2P3JmLOHLqk5ul_Tk3wWjaSyduwL0$56do z5fOttSi%-9)bjeo?3BzXU~Vm&j^(QQvQzK8e3KXIeH zOv!$P*BbL6=*#SwfBgTg62gD*%Kyp&|4-QPU)B9rQ0hOh;nwl<6!b?;J_UV4${(Ea zZv^xI06G7ND06$%J7NNe=@l45Zp3(f|X%+Fs&+GhJa z7ma>1^Wdg4@X0#@h+th!&uDrCq*lVTAjf)f5iF5+r+!EeyU;4PXRKM20RiP@o6X}? zo1;2N&G9dqjc$)|X?hg9Qv7yrxB;~{R@>E#Z(5#RQ{Omhf9Hv_Z>eZ|CLAH&PWxMS z;Piu;nuk5Rba~6=Oq&vvFab*BXI>vQ-v$-9kk^jzmtc5zOb!lep?PbxGCaDMuY_g zeO6*ZOh%X7*C99YS0E7eS%%rB3iJ=uc?gWH7{Zgi7Lz!a<$pTkWCsdb@q0%zBLwgMmmbHA&)d18<-R!THpV*lQTxwYEg zV1OySfc-OBENN>By2X@{AAwT-(h2808LSqVw2GVs3EAfXf-`%9E^`mDkRgWVVCTFd zz(Lq}&ST#j{$v&7#`~$Mp{go3-##)RtBXikoKXQ2CO@ZZ#5u_85cV$$*IA&P;vdQ8 zlr?iHWe!lUqRnNPnzk;QsyXFdd=!U5!S-~F=-f#lV=irr5OuarnHee8aS_HRm>@Kh z{MQf<@`Zc4E>+E3YtkRkdDxW_sEfXX@_*g0Ou{uD88|L?;A)CKw_!7vzZ z1m%{YDRE;_2GS5_l(%xpL{7N(JD*N;q5+M0G4jr_Cvnv4K7cq3COv6hf`!c00<4$< zL#^0YMdy=nY&5-|G6bw zOHeWAE}GCkCRaM*BWFRJLCnHn8cbfmiL)jE!Ti?tV}oax>&$fhU0`8S@1H3x%g7LE z_Eti^k#R*95b%wltW+A2TCVf*YbZ_XESWZCoR=s*xU6NC_|zN=_8wf@wp+kc><|6L=BJFAVa`av2++IiOgohqmp(ki* za)Mr%BiCrxL}}HXIBA9dSEMAf0A>$(o^8N7JG<;wI5*xQ1s_em7|frj1gA! zo)R+N|6V2ljoe+az!QQ`Wz1Oe91l;0$tgKfzAKA;1LV-j(y7t`m9>Imzz!fyzB|aY zZ%Hz|+|!PB`~q@kC`C$Ve6;gpqMd!#h+vX=H@VJdH04h%Tw!LkR|+Imrr*}ueY{&D zOU;taE!Y*i62{qP;s7t_Sny4=@E!dWu{yp|!$uSxo&oEcbqP41JEt(@Fy>Hce?ST) z=Xs5Us#EI^X_tqkEkz&Ov60i=YJORS4s)LDEhTe>lZ<7alXA4{oxMSre}Lm4V@L|Z z-NVQU3%KDXk1>ZF78CCCWDr3g6#eXIoKNPwB03z#$~7^ce(Y_A*z?nrkzD-R;$l>s zdOR9RXqJcUNS91nv&Z`EmX89{o=)=*$5NV%I&H{gsGBp+ynIH%KR$}HNJZ2we(6{6 znpH_d^K%y)-_3-)a+tXN9r>n^I$c+uTKPI$kcXuBH=`sM9^(FH4)yBKv>f7XCeCIN zJujd%v2RLBCcEy%g(_OLe4-4uJ%3rPPZr&@Y$7G&(CgIqfZ|X(s+wN$_&UaRs|ic4-c#K2whiYm^y+~qJ3c5^ zs#RS1b86L`kdyyA(`gXtr~fOxu~$8Ez8@DI*Ki)J+S_LE4X?AKNZD&k4op_Kb-9)> z77~S*sTYKEB?i!ZD&JpN9WJq2TB5Gt@vb>&$UwO^V1@6i4G`Je<@kBfXl_kY&J^O_ z`l4OaXvKHs)i`%m9KZoXoV|WyI9g~g9nZ8#TM?D)pr7 z{`GaFIb@oCxQiR{SXFZXbwR!1?uv1qu2LQ8Yvu2^#|s5;oD@g8-RjTUkw*7?BzCD$ z29s*+cQ>ha9$7%dt5-IEpe@Jq@jn%oNfT>Fg7@NBf5J+?ZNN(@FB!A$FnapJbG(K2zMSId`&;;u{lguvF}**4nmT znyMO&o{uZ^J9LrgZmlHo_Fs8!?vOL|BfrVhUg+>Yw+JTvsF=_-p{ZyOV=Sm~78|V{7-c<2`?xYli@^kOXM=vg5lqj2IPs*K)5c{}{E;*-q3W zh8j%jbd86NPxb0W*wz&-HQv3&jxKsyyFQj608P{g<9wN)I$T8Kg`7ei(Spw~ zl-7}z-@u|w4@;k%hEp=rkWWeC)F<%fqao#WJ3MaG;n-F?WN1w~0u3X8FNC@#N4^jq7x1oXUOn5t9nAJ8nMv;m%a_>#6F$v;azY zQjT8Q63{XG;P$y(Mt6eM-p*X+^DiU%i%a<{y`gU3&t4W5V2_Bo`G@=lP62-#@R?=Z zwDGwYo(yfiNU;x;FIiRBZv zs_T7j3PGdU4&UK98}tpf|>+y<(|er+=8Dr+1&fXv-P>+sz^G!n(Xg-f|}p z`pzJOIx2_y)G2xC3I`zNX}6m02#lDl^`wbxUQM_2OiO%hBA+qRXStU`4jt2i?diVrO?XfcCtsnD-Y85}8e(*2xfN zT7`BE35#DtaIHsL!|2x1ue=D19Z|+?QS(nKS)z4*k9oa~gU3!H)N(AXdXz1PB3k@S zZv>N;IrRt)a$sW*!u;qr<*RD1+CY0^fn8+2)IqV?Klozo601wPVGCE+mC7$g{=kE2 z&8Nr?nwzv#B-&lv>OA@THOZ7JWF>sh_>#^Jx0jd=M}EXtNx+z{f(Onidxi~{2&vBz zu_(#Go?M;G3bx)7j_dmD6@vz|AA?K;NFZA_T1YV6aq~xG4xhh#^KZIrd<(=Qwp9=O;XOpqkJhNuy>85Xv`C8G)`tsSCp z!_JPm_o-x8c0uRXz}8BLS+o45?K7UdclHi3I?caiZcJme%(+za8de_B109rWT9t_=+{scRTh=2jjoDfHY2 zt+ZpER($%#KkPVO$}p%+_5m~GNfaAg#<2TMO=NfMNF~gf^^4b)+J_XLzIG$og!mUu z7HkNtdwV2|;cDxk$Wt5@Qxn7Nrlek;Y$Ey<(HxVvz(0dXys*gEVP=z~+D9_^NwuHD z-`80AXjb+aIFSCJx$S2T?_mCfcN@M9)IF^`ib)fddS$Q5`W@Kfs{&O6gDepAJVI-B zn#Sp_f<*px^^}GVNZ)id?#t0}W3EeyQrM`;Kfp>BLV}jHZSzTcvUrRcG=vEI6{y`a zpdXd=EQ}_A62M%WWO#s#v~B^8_DDH{$uul%f@p)St3WAQ#RIb<`ti#L1hOtsR-xUi zpKbwHF(v@4gkMu9_`l(3qm7M^kHb<74lm9+et{WSD@r_rK2#RmER0)%$@4`G>AFvI zOG1mY@{fmTm#GJlcOx zd;IF6AYSvRsZzHOo3Y(V_lV1ryjjPks+Fj?9~fM{dU~O3`Ad%t%CbKB%Y&fTSB%}_ z4_LPAr{25AD2(Dg_!*d5t_XT;Q2r6C7Y`d^NYi%OgHxG}Hf1zw7q$?#XVXd8Er3MyF5Y{KXo5v5)?l#Q5wf+yBB z%2GJ?1}BKZubV$CENpoXbAqEXfGUj$vmxUF9N_kQml>&>d>#+2J-F*=b1h2LsKTNq zI#=b^n6Sv-88xrv@HCnaDam^8UtwTaa9*tH_FFjdl?!jOpP1D32G-Mc>h!Y=x+pFA z^qeDWTey)FOA23fh+E9B>DLvgzVj9kzSe;gSr9@>E#J!U66|>7y}J!TT%Ank?~_2W|LZI%1>U4 zxYvU|%p?@Ju?}PDj6_R6U9Uu3kofoS^wUS01P`cEh0YYsh0MS0)@RAZK+b;0OKChm zFxCMx1xHh~(Jf()jck8E*k za>A6_#3}hsxcc#aSq=AZOPi_IC%aV{tI9DvlA)%g7Wv6%;0zz1m+%1o)A7bv=FGt) z=lFmrVRZN`p{5|HgwGY1Dt>jp6q-VhX^*}`jRrvndlpKAypbv08rMt7OU*7N%)5*# z$GaE5>c@y;GALyaK1>yx<9mDYETutWZfoNJJ%W|4N?P;=@SZ;vbyPjz1WQY@sB>wA zR3?{8xNqEUYCUqLbs2?@m6uJh;In~V?Bk*P*DWl&_l|lslNrJFAO%> zUA#%~XIF=*`4yIF2=g-evX|^FRE)4x2|ehGbzZF96L8KBP?3E_pZev;0sn59*KegJ zs~vki0~)-08}fIa(4J^0EXDrx(|m&1 zoa|X)6Q<$bC*u+?X&R~>QJIfah6O4#YQOwLLKSiYLYaE2K6y3>=f-(rYno-9DnU6$ z8H8d4>BqkcpM5OQDKJ|p3wmP=$+rcL-8Q%-zm=29t;p^Y3PAXjSvLX`PHMJEG@7Wm z$3uc0@f9Z`j|FHt#y8TaTwkOi9Dzkd(Ra8x8hq-Ay?+J5Bj2{)UXNT8^lCrHXjO97 z1_(b$G~L{MJ*dp%1>;rZGRpBjTsJ2JJSap_B6#SyWWddpYIVOc?GdqvAc7P3i@#3c zoll*9WV-~ZF-@u)T?Ta6D~d= z#gzwH+4E3s93-Kmr7nI^!h@~bfE4SLuEfcW{q9raYk$kFr?UrKwL?Fo4aNlZ`lKLZ z{X#Bz>vF%a45K013UU7v2S7sJIR;m5#jw_Rn9f&l_K7H}qe*bgsLcZ$NEP zUNT2*zJE_op17YHZZRPPTL~IcrbEg(;JNnA&2gu;d*M@UkY#8)7t^ad&=}-x5KDD( zntqvyGGxt%Fdf(A!m4c69999*P3CI}yo%<#?PX^g8Io`f^Hr!Ge++Z$oYVu8hveil zGS_UetWo2ykj%fh+RNYT`5hadZDvbGaB+)TMxz$eIUX1^+xTg;2qe;rrln)?{}x;? z4ooqRqK5`UW$2v==3BDUPg&U6)#(m3e4eTe_e!Ww?xZgT5(=ofDTLi8%XdV{b2)5I zYS!1oWxNGXe#SYkSt5_oA4dYZ4 z=5>GlEG#xg0n0u}s2*b%g&Jk)emQMRfChE0u^XakI}x)GKlE#~{^s0Jwz?i*ARVf3<> zZVcniG1Ytbm8mR};xztO(R zrVgM%db9=oRd6h*B8r$R72tF12){Nx+<}*iX6_xPL6RiUTf7MW1^;8U1_$4`A@{9m? z8VYyzNmOcwSnS(z7Dpwm7G))^6+NRZ4Km*@ldUTmiT-<5-dwMqRHQnSR(d0lEXt0i zl6NU$BX6_Bw3+!j)7N6m%9Fk=lMTKksx+*(ZA`YKucg%Yf zVMbX}--4Q=I&2igB(r26np6ngZom2Jq{FglJ<)$|RH+K<|H{(xQZxR?Z!}uAEo_&B zo$JQwz^z0lpHQ3hSC5Hd8Fl5Q`2{I{Ahf3?V!L@wPcXpMtpvaxuwUdN(B1pJL-k7Q zY@N;l3TtGyWwX~@FXRi((pfdthMVURr(tnIhw`KgF6;3OPmS6<&te3}z`0yp7^j#P z5|X<&2cB&z9p=S%FHU!fg6qfPu=qGNg_PKpC0ttgw+^o%*Fm#QG`W}ZKNV&AX0WfUYY zgZwGlrOGvb1AAC2uu1UApgNTCH7ux@8!03PG2XEJ|L_Q?(o25iyB_H~wkAwfzxc@(Bm;OCp`LA^7e<`4B zr1VmzsS$AGy}uB1!un269?8{i*o8Djm8j2*x33~SS7Q&UsKwh=cQ;Z~`~Jx5y}sR# zeJJqOWzbq+QJ;6C#Tun5D(rlc0n%G4y{pRgSmjWMOQ2AkbsK}|Ob&45PdVbGwGz21{xho3y3-O|nJEqi_|o|jLf zYUf*jnb?|jL=TQAmB3d%rtnAaBae1y`X#Uk^kCgg2??7P zK&;FrM+<$r+bFihnLp@V*9y^@Y$>Y}mn*Bhjzt}olW@vyRlK)u7pS=R@Bj#h0lPb# zWV*iIniOsEyNe>=(N7DAgZspw`o32_l-@OViVSuIE8Sx!id1!NjZKzIz0nmK_U;rssS9}=TD8@#apQTFye!75MI0f zP((hS(4sfgFD?%6ADa<9_^fI#Tlqf5afb#V*aeuH}J$u@jaFP$U-ibN&5?j+|(j46`QEtkzt^ z2#!!oAQOY{Vju~zj3=S9pLuJX-c7|`b7XCBQ)K>tTItRu z3sE7C2_?d%uO$~Y%`@x?%_EBxk1XE}sK}%~^)nqF`W9gf>yvA#R2ob$Si`BYf{Lu8 zQ}OTGA5boOUQd^D&*Qe|_%U(6N8$FDY ze-MGhD-defrAf5c{Q-`@k5I4C*%ef|f_)569D)h2^@hK1?Ri-u{aZW$GhU$0T<|$V_*)?Jd?R=33mSP?N?UwZfWZ zsKRM?-B168DqHCh{Yk1RifY2WuKQp>Y?S2^!x>KN_Sc6yrW&VRK*V95)%Exg6-h5> zbxdbjyxZnhbPT(|-Du#jn(Ss68bvPInGXg3hvin5>Q|uBCy$-!nnZa$L{G|=J`!>r zjlfl^?1(TrnX|n}fEo&Tca}<&E!LfnUKz1X9PM5r;E^*X>yJ9j}P)5 z14iH8@sR6Lpnz%PF7>x#?Sg3KB;L?z|Xk^)$LiQ}dDau@djZqdVafsZ82Tm@Z=3cLg_&#i4q-i?< zBoy9cm_1U%a;`}Q(6hO;7a7S1*ZBoJ#`s|B1fV+%Zgv-MZUm@Y6bl&cFcAC84b!>>S>ufnd^%BpSv_)}GX zp9^lMc-%qJHbnPViR4ZOqU#Ruzm>>0U3GFiegn#(ryqT#)-!il z?(6nTdYQ<_GwKMDquS62{_W=u+6im`L0RmI&G>*P{7^t`6Zt~CRdgJnsGua{0eo-y zdchbo6q_VriF+{h0*A*gMasZ5w0g9EiUE(n81Kb?5=2=wiDIQe(iv9DdVM$|cwVa` z6vU*k2fx+$aA{q1UguoG{25|1t$LQ^V>W=kO8MP1Q5I35TqlaO)RH9?H7`)<<#U%* zndkSPE4x9i9O~klZlh!jvVn9hatS%_N8^aMva^jh%&rHeptPLi&~XJXe24B_A+CC&v5L>V|h{V6Y7s(R@Y&vDqUdEA1O zH&wxJ>y7i=D3+^70+UlcZfO^yvL_skxOA+T1$vhQ!K~>Pu1+WLGYMqo8uRD+rtod( znoP+cnv9V`pV#lzA3P`u{s|UzwLf65*}^Rm##za&m9ne{ffi_QV@$dj%rkW`$lS&LZ( z-j=D$9?qH9qxE;DDE6B#Wm@0hqRP#cekFChN!!jpt-;29Zwg&>HqmiR%&9(FLh^?G zTW`t8twbm-(0h|6Kep0af!fY@*)sJ;H+4PM;O-hiGF^~AGSJ6e&VN`GBW1543brCX z)fhtflEA66b-Vicb{EK6OH7JO%A~*FZdCTfLj2XS0s8R)-pDZSzWk^)s4k-&u+8%lgPlmDclJG}ku4 z74xVkepm?t%_%gdSg4rlW9;v#PvQAjx$AWWdJG`h6^3u)n7C$~T@z3#V(qv5_r$cM z*K(H^%qY7b%8J#c(x$tYdaplo(U=9|^_oNJKD2teC@?3lzZ{ltyBqyn@S~RE-8AfN zPRO6VS415gImq@cHXbX)bG6ea>t{{p7RmThpEho`;%ttYi*L1k4olH54%6cr?bf%} zK||6SlA(jRoEA?jdF$IKdH&HQrqV-TsP>tI6k`0Jy=GJ=Z!heBV>pkXHu4N#W>0Kl zCL6=b{^GQkB^)tW80c!Rqkcf$Lh}w!Yg&kJg~-!54L9S|6TY|0g&)^Q&9W$aTBP%R zgP<OF{`6t_G8v5y2}413hl#RU$ZUW@3WTvJ)}7b;FZ!_9491QS!$hW|L*}6y+;K zcPY;)DC}gf^F3@DFFkBgM4XT+Q%R8QYg5JMhmZgX_lYF}YJe zr~0{&d6WdV2zBpOy68&6dhHhuYX%xU)_d525F(UOGk|h?Z3k{sI6BGm!dBUw=drhZ-`}!z9nVM1kT^`XN z4~%or9-+kA+1TQOBEqC3+~Iuhj@xFVL0Qhrm4X6k0J|t!ac(!@31g301IU?SO*RMU zF2?%<39(^|tJ1jNp(BN{vywW~5D`2I{AFQ`tRb3m#N7;~?W?)uc2NJ@dUwbL zHoQjw^6C5Bko!%qYj{%Sa{-W0v?Dipdwb4h#O)Ck%e8%y4@EOcdLSpF8%KE7^%1Li zjwnZ71|Drj`|w=man0Q0YTeB}UGLj&4;4<|=CiGHJ6vHPG32_J()G)fgYl+I@|+yz z&GLHC-yK_^lYV2nP^Av5*FhkFwsIz?|Ec;SXRi{hKGBbqI$NKOL1_G_l( z7r(h`E(Qpt?y8YLmao;j+(l3zh7rY*m*W+cDD~Xr!P(UkIhQr*n|fFj)MKK4=Sq^N z1~dNj@BIoI@8Zq8$8Ct2nzA*A=1Pu7y9U^=V2|3sD_y$<4-4V**5X7m$m^}Ct)FY{ zwkQx?KQjjV71@8zRr(uIz4uwdHjP{VHTVkDQ{I!0r*0e}+%SpajOr1%x5_)&)baEh z9XE!&-k3*uaR_aiK|g`tklzz}qc;kd>3l~=S~_@j(&so!tM8#r&N%1!*jC7V8fRG0 z(UCJ_OG=TwnJNARKKJxIbI37s_|U4nm3kJgy2Z42urI>`t*!l)5&@pVYsdBph6!@? zog)tHqv&GLUDHf0DPE7tp)@U41dWG62E_!-V z&8}|ragT1w#+w_lKhI;hTix|sd$5kwd}E&Btzx^oY*seV%^D}*=aJ+)on7rJ?BaP5 zCc#;LW$qA=|0Bx@H1@@jnQtzY{bU`)Ujx8J6d!VMTl*P3XJKN<@EP=Z!`4O` z;>mo7Rg&uf00|yRL_t*OqQM_44wg~o@VZsvjbPE{KM%@}Y1VZux_xV8&mkk}vFrq9 z%2x93r;FiJ`qFBKE64NMvW8RHq&yuP4jDVfc4fnMeDB&W@ivVb6R=?vZM`Dm-513y zg?RMg^ykF~YK*rs3%(}pE`|*6f!kNpk8?5g|Ks*pYY%&x;_apx6VU8M$c-+k(qC*k-?;x*o$;lYuSe! z99Mx{Kp8{`3jWx2yryFtIXEtNbFJfYFsP2J)L*m2JITjnn<+unn>ON=*{8unQ_X0=p2tJUc`6&1}N&`~qSU2e?7-Hv$DcuQ}0_sG`c z8S(b|!{65J;h+0q;X42f8?tyL9JplI$4XiDT{2_>jg)I_v_daO;>Agyd)@pyy!N`6 z^n*-1c^yFR-rs?EqYTAfUXh_+#(8^r#d&|p>(JP@mp0|$zPH67|6$|ZTb!1OCz}>0 z9dKWet}z1jq7#o!#|mdKKjGKYtOuNRzd}6Ok-2Yj=p;W8C&%oj#FKrZJx5P{hG;WjD7ut_%hn@#OkzIII0Eyy2>j*>b!VFptJv+`&2E0(!Kf88(e* z${Yr2!)RbMWaOxT9+bwzeHsp@8C&vJosD?Z+^r4df<1Z1y-VZAMl4O$-GQArPWh3p z(h@KJ0mE@mJL2^?)_}DYCepyW87E!Ju2(2NXh4%Kfmx(8v_6RD|k4NIY1jLiwhPgMK+l*iI1ZCgK zWt4dDQvc$POtUQbif+U&>yKdms``+FkIXR`Th( zs2OUE2L+a_+%HBZ-|e_$UA&C0dB;929?NEhJo@QqcH#5br)eW+^i4jqWm_@5;x$#w zPqP0`(hv{&{~KuQT`2V!mdzTlFM+0GkIo;ri*sf8vdioEw6>4=C0W@@c8zbWxEPKy zoqeO&?h*+T8U1KmC&kk#$JumbC%UW0r@60YJ-rVv`3$?du#>f9|A~~lJ0+mUvdgbN z7018}2rSo&N46G6O>v&pe&_Cf$=G|ZWn<6upmd(qx?eJ6!}_>k?bCx6wWq{;BYAbBSto9`stCigbPWcmX@`liJGNlJwaXNDr z8|d@d)>m=lsaEh!8C^q0egpnWXFQaB$iZ=`&p6!hGDIexgX1#K);O*L2Gwzu`fHeY z>wD^k|43iZsl~)2oJpf-&+rRcY^JZrK>VG@9Ph=WlX!)-raMKkopfO%Me*RNhPveAqV0xA^`c%G zo9r5TFIb))Y&5jJh7KLk&!d<&%&!MDg*LD6g0_M$o;pGMUAB@Z$_IC``O)Y%*CGwN z*|jxxagHAE39$HU_;8dx2ik}?fU$8sn*)R&Rk`n=a(5up9-z~kL5MtEmplvJ{F3c_ zm}0+y=mZO8Mb+ zixvOaWD&-(4A%7b?Z!^qg+4b!gwGC3>;7R;)*Y69xECD?#JguP{m{tJ$xBN-yO9f; z)k2sjeP`)CewvUuP1v)@(t5mXT3qYZkBl2}^5N?*I31l;F{oV;?Kt+wtELW z=qWf^u@%1XWk=Q(j}(^`%8BIw@Z~k(4Q)PD-f@}FsG*cHauGjDzV=hjak*z}99IE@ z>bOe%H9S^pQ%Q-_Uo`}jlvFbE;VC0BK;GA3E-(3gfM%U-exX`KQLuaaYr+{98T=fzpimeYQ#G6LP1NKJ3 zwoG@H)kX_KeM-Czf-r3SUjKdWG@)$6?oI)?QZx3s`@vs*dupbk^?2DdYQ(Vb@$QtDLHv}aBZ8jx zt{Kq4*{Q8{fCd$v|25>ep5-0a=|q4pz>@?5?*8}!ezL>GZ;QT`BUJ}AJ*)XT`gP^- zqg8bXK>H(o+mA8&$*Y2tD{Kq;IlBY7+}*@%_ULMYOkfYi`~gd);= z4IxzNp$7=$27l*S>pAD1^DpbZxZgKf)AsEBnLWGAOv2u%DN<1|Q2+n{s@JbxXaWG& zZ~y=q6FCX7hSt`sf%tR9`l;$u0H8dY5^qLIEMIcdRD1>~?PFO504~eDQPEa7IXPKh zTVt`U*}?9h(P)+;9SjCTAP|Iwg_o9=Vq;?ogd=BX=R*R)KPu-8RYt(ijGYj0IGkze ze9kPMAzHD;nNC>PuFXld0-oa^}DaPgeL&dz>*I9XFub9S=3O{9B% zJ~%vxY()|_y9j5i131F&@fovS)7kVdA>ps?y!ZF^4{-x&1i}vCcw`3=o;PvW_3QVK z+2d9$ktM^E)d^u?a1Ek=sUfxHedW|4;T&BTS3heaAh=ux&xwskp-`z4xVZSVUx8PL zcF!*R_MPpm*Q}f)hh}~F1YsO}`x}3pY8L^)O);>R)jfP{{~jQwAJzLS0J(YD@keRj zLZo%|UVrJt=p=T2ZupDR()V{l!a;=9#-5g%$(8-OcXviB;=DXO{AtmojYC++QpfV~&ro|{Qopmyr}&uSxa>;&-u&j&&>UtXqNFdq`j@+Pbys}p2x?8Y z0<*rgr=K@n{N~d#co!m~}r4B)=;THQR4*Zu;sT9T8>`SCa>3wEC2x81lV5F5=^_gfCj0 zaW-rp0|LhKvQtAGFV~dxSGE=0<6-{p60&|cneT;N?;RU-1iPlE)o42DaC~vqxJ~aQ zJ2YD223B*9V9^y%nCaBf(ggsNe~e|Ql989O^D<_>c~Bdz{mTInvegT43L`OsR z0RS(a4Xio%MGyx+CeER? zt=orU!i+~V{+uiinIu5Uh)pVnrpd=*001f&Ju}#gfpD!;Zl85n42xnW>=(4m+*~s! z8prG@5vWK?6@+1i-mylth2BCBgJI}Zz_$jh07)@Bl$k?Fo+1j-#0ZTjK5LipIPS@N z{qYP7n{@u@T>M~`?|YL>jSi0L1{L5514i;JGRAnd#)K6rquwqh19v}nI+z7-ltX-$ zD*6pPyFQY)@a}eq~A3l2aM@RT<`+L9NEOmI47YZ6GXlec#{9_+mn+9bB%i)&XP zRP-+=_00&3lgr`>wc%(*~nM&XcXhY8x|w#4Wfp~>-!iKlNMpa!{$Wwub%&Pyn&Aa63))7R~7 z1N}BhhrkU&lLolhg$*sxn;uczvZz;#uwGFg1&3D=w`hw5(OSIenq(-n~iU)FCq|Ck1`IAyZ7H!9;aLaDBQ&p1ChIUqHG_q z&xxT)D>V@-a^T;}qIX**&N#c{!i3dT>iY~(#T(70OuV9^VTc<%V{~vp*=qsrVcl? zO0dON8>UJ6{$jrlAV<*LKq#JsuVi+-|0OCSVa8@+bO$Qaoe2k0{bZ$fqK6(?HGMh2 zjL$A4oiCaZ1FZvNbJ+J+eX{@xYF5IQQ*LQaCwrpT_vUtw{YY{I7G$t&>JVq zGPEvD^(Ofs!N{dc01SlCjTC_cVaSG(6?eEAPMk0a-CcWt1Xs(+8U&%+x13t`3y0TR z!DypnL%&_CZ2yr)ogTucN>^adWvu4;0&Bkm6Lk70hcZujMSdd$&C^XnM60S*q`%P# zCpSZd03Gx}?`Y!uj&xQY-QVj(b`pLc;+h6cnt&EyD91fHj+7vk@C`i2)@aR={uG=+Ztr?=_X7_5KVui;9BHwGv5+c`t zInpoRb0qZnm#G~@o*=>K>YKuym5d9aUOQ13J(aCjSB=<+tC>xVf|rba$`%;Z&$}CJ z&b`nciQDgR?IgcNI)9pzBkUJ3<2RZobB9zF>M;;$W?q*fCGQb-D8q9vaduz>R0$h` zk(}ElZZBpGb{)0A5WRoC(-lZY-R#Vd?;osm!KwB_W(n9#D;j9TartcfuH$exHsXls zcsKaa61`gh#Lt({lUZd|nRY|+nECJ$CKqg3+=iMUDG|7ie(Te*iq6T$mZ5%?tp5FF z)QDjFW5HR7Q%*m3E)g&RRF*}j7K9ZF6Q(9=bNO||`g2MI{tj4n{?s^|73#9@EIV|% zHgbZs@1fJvzg8T56n%o+E}!jp-rqukhcDDi@+Agt2-NWMy907FHKOdsv<4otM62QC zn4=Gb4}1A-LqT7}`b*zc#^~jryo6svj83^@lok-z5Rpk_fFSgpV34(vqKgqcGYDjy zmb5o~{1^k@)}8vudwN*zu{{%;!&W;YkDC%z0)4ApQ(|+Pu4oF|q;@&Nz*qkwhr-HC z$rM9QUCBc$wKnL__xlvfs2<{%qeIo3sT8RXfd2dw$w; z7)wgOuy-7)+ubO2uyJoN!$(d6zV`P7`9t?KkdlL^mm!CK3lt7 zFlNER-v636uDz?(tP|Y--H%RbJYbd&|E2wA>xz2gWSv{5)nDaqYXujQBO*4jFh}5? z1LWDd==0;0VaV@UzFGE#lTr?R`0xq+__mc`EBMgRx5WHTqT;dR%Pe^G3OvAQ<9$f+ zdc9jAGjvlY*<`IjZ~LDuP9$nAFI_YEm9Xq3#dd@fV(90pWPjK0hC2eX^^K=CYn_jg zg&#Nc#-$Z=ZG+a(?TIBl-WztV$_QTQ-cBr6Z-U`wprw8Da)np^XOpwyVebc8#hZ@ml|s=&z@!AJ zHQ~`$z&0{1$X;gL>`}w?Ur@7_;K3lb$-0=$@@boP2}Yuqiay2LZ@Cm5Cd=ep`hd;8 zj2UmFdq$q`C_&sB+8lUcnE*;+r*djUhtj4=B|mY&HG=<7eBxh6skc)$=_m#GwtEYs zcP;K9F%kgK881?&Ku{En@;Y1r6x4_LsN!@uu$#Li0J#URsL2t7dd2DjKtO@#kt%fs zQXLnmcs$B$XypZXqQG4ecJc&8boTS>YTeX;f{Ksz#P+Up)Km__3s6whHTA*T?;^Vn z|F-}G%YN9m#T~^RiF_O$D0jU`8p6q0X{fP49{7|Bc}I~W){?_(K>X>-^|zK%J$ zzvoZ78@)R8!?^T3Ze|}AO$}9Pmn+mR#vkzKYTBb^vfQ0+5|EbxPw*|hD>G9e;^=6BZJNDd`iEghz=`Gy}Z#VDXa*?_N#tzDfiEepYK%@wIZzuO;p|(@Pb)sx+ zn_B6TyPRBvPtoxO-gC4Bv-*Y8m+|_M-(4$nN#)6j0)4zW^FX40n+rM_1_qyz9@Xn< z@D8nB<%EiWMZ0EgFKJ5P{>Y3>PZ}VcCOWrV&u6be3iurJyh?E8eSKs*#WBhCu}B`L z>9j}Q>?Ue8YbX``{wEY)md(yWAuu9_1aKERC-cY|qrl%G7nY&FvmPlm*v#OYHZl)^ z(E**lAn@cn4ey%9rv{$WB0k+Hq(j&@oZQqESyF{$(;<}UCxr7u1@s*o9x__1AAj1E zFeMa>f1Y5~#lIpd7I8^-NHVXX_B_w^<{8wrQ#dmet3~*CBKjrJ%V~VKsv6`<8jSHT zog}{ln{b87ZfD`>=QIefLT?%9CS^LD9?=tTsKz43X`>&RUno`^ z^^BEfkzWNn??L0{I1G>s8N$+{Y=|;{wBYezCu%eEzuC4B9yxNPGMOJQA zWpj-^23Z0PjAAj^nkPJYIykTF)1+12>U0vGr-;r`g4&vw2}N zwlCXjI2Mk5Fy5m4;^#1M+WSLrtb?4XlHXw?6;xzgGOd9_f5>i-=^>29g;$BJtn4QroX|o+{z59=>a} zm-b#7J&qotIGEhv=+(9^cgR%Un3_vDpicf#v2A@PoIf2Wa+@Z(q4fnLeg%2h zCp;Hd`V00WOur@cb^0HjbjcBJb@%Cc$*LRLX z3skSPfi)V}wpF_W1pV*rZMvV%Ct*C^C#+Ue>)M)XdiWY_^{xUFf+b&+es0#k-StVT zw2AurMmSYoJWm4+d0fq!?z`5k>3ioEA30J!!@F;M!L2sr=vDJinQ=Tf*Gb6zbnAY0 zhSn(EHsTW#H*Eq-ytCwrWiT@>$!^bnrNEFkpPOdolA7hCyiP4>rO)c;B@a<^G!1jg zF12V8iP(3QXiP{0@b!`F$pq8mGK-!^d&TLG?B2Rhkw!#)=nfYz&Jxa?c}?} z4Db^>`BS$Z7>4qp1|RBy%1a)bZKH6;ARJX{vPDYwuJ5t~-1l&Mm-azGl2WD0<%jd( z89tNSGvHFB?sEf+AROuC3JSb(=i$RQ8a3k#hDXb<)A$Vgsi}pbW!qrJq^U(~U(WpV*S?qm?FGdL&KLs;`g7s6+AbQ|$c=}}0~i?(&y@$| z9z2JCl=_WkoY>skz^?LVp6Z`WvclL7N_!-dP1w#%8fO>W!*q}7tCCdN!mr|~FI8yL zQadz>P2ar!ieA6pk;1W?O>!}#yG7w-Jbxn*BQofne) zzlMD49!cvL`9L9@L!9l=Yh}NKRk@+9zr92iHHSiMwS*CLQHy0yhIxQ~Gw%9H7PVeq z^S-ToDJ|J5%|)b#bC0DX%Nk>=JD#7GlE+`K`V;*%+(u_oI&AONkB@J8ie?ajL~k%p zW_v!UcBhoC?|CHEgj1Cgr10ET0&ya);4gASX*?a1TrqH<ijAoEw4@2b$%O)~3D}IU*z0S4EYJQflAPTV3%!&oa#0RfMK=_S#t5 zV!Q1MBMUA33!MV9N#!q^$kx}J^vbQv{q+<*TL_7 zzMVKYWK{NK^V7OjQ0*?(Yh?abfn43WX*iTlZXHreb>M0;b1#3FOz!&m-K)x14fhpQ zsz>u))|z}@BW3>aXs~kjkdl$Tjd*jjL-KUwxoHaiAY1g|$AF%)7n2dezozO5d40%zF&R;|s$GBX%eaRJ>5K&Aa$y z<)Q30^&2M@zxb$rgYz*i<2z0AoRkgG>$MJ;XAop`dUzLFl&wPX z_Qxg3IP9?0KS0q47KfEPux%7ED&z*;y6mH{<;6ok;MLk7Ht4Ok-N*gs=PElHRp!R$ zWe6cM&Zy=SfdK;e>b8ZbGCnBzpb%`ZKf}bb!yG}Ti|0u*6fxPU+`3n&v{19@ z(=h!}{jnh&WO67yqRLpk3f3Sr-AZP=2OXx>%~{s`W2OJhh)-Ek9GVztNsPc^+qszq zr=xdP-^P4#J6ldbwuFPeS=P3Hz_l;2v5GhUyviZ^^x|9?cr#BaBk5JH;pjrUg!M_r z=T~p`amt>W^C6okMoXnLa}tF^bVF6HC$6sHJ_9$@KzxrXRUr)hriUIeJ{|$$yK97p zy0okN&ejP*1quCfh$_zbF{c<_A2&tMmAjhw?=<@icB!_LjVS~WF@fL>7o_wK~<=aGCoF zW}vjXMh{$)>trA9bUHr>O_#sESjOvtr=WTqfTaW;{Qes4+dJlI+sKD!t9OOxvU9Bw zWQ|1{?!*$C5t%nUX`zt*6!U(0@{;0Fi(6m|JVL`C^KUXE?*X-=iS6RU&PcOaQbL0a*=T&iEUmj!yB1TLU zJ4M`|FHOw+AOVL*dgvZ{*hz?w#Ysb7_f>U##@d5c(=_(zV{~uw)T5yc5)YopbGLRE(S#Rp~01N5I}y)0&gYVwx{ z-vwv%2?NXJztabS76M0IBB?*hc2gqwwKOKaIkl==$50}_9+(K9n7^3AsU~alP}I)a zId=CB*67q*_M4x6N^%*lukSb&E0Vko)nTuaLD`v5W&0dpI_%<2y05KoeV05+zDqNLp60?;%Ija{R*O(-@>jephKxwl{cJPJ53}%QlxG=IXNyrIKgz* z>4ngUadk+FapY3&`@=3OU~@kuu=;(5QAYo&KsEpjlN%iQJ)l=liHP6pbIg@M{~mFqa}s0?V;G)=rAH$FXy0+DR^Eo$q9k(0{gMl5$h ze)_7?Op$N5c#>n+$QKBHKRo9x6kzB7E;K5wjjM+@zl;N_FQScrPy*w()@ zTv9`H@xcd;{t!fefs{0xLZ?V?^2nXYueKQ1UdOs5-58z|9zq`RxCDC|C;Efwz4MUr z5B{`rnVc2FUON(=$2ZrCclF)=Si|4JjK>zcbH_4geV(`1Z#f}iSJ+{dJjePVGK}7N zskHZShh{-=Cal*~0I&VAj5jpn>t&g1z)XoTo90){BRaT*ZkafwuT`*h!W$;PrKGsH zG6&~S5k0%9a?}`x){(AANacKQ8LL_A7OH!V842mlyWS9obgRZmr&1v5M_ibnKY#RL zq=0t;*A*~A`U!Y>i z<;h!}-)xicq<~5$1oU+Rg?gPdl)%l}X}H%jHtiKZVm2Htp6wBM0i)JqFALXQzY-#p zqN6JEk46R8Rhnh&hT||sd7$30N=q5}VgJ!J8H3KU7}3(fXnii#G<33d3|GavXx=pX z;@QmkqHLsK0UdL1=CMy7DQ_Fu_Y$*gE5xaRjEM&#c$0PgN}|cH=Qp`dIl`B)t=nkN zuy}A~l++Ca-NJgZoO2h0Jw)3Kb-P zFO29zYoaB}UbbSB`&!kH-&rY67>y3>zy#VN?Oyut@XY-=<*O`nmye_gqk6u5le<@t z95{YY1g}!KnFE?`wAUEi%bS88&CVUonuMc}E+D^&f!MkNo!62k@IHoM&{pk9lw)Y_ z9FD3Up=dHvvd@c}7huktU~JF>`*BYVOWqoNDsuKm29vb>*?ymM*+}1{@c3G+3+d~u z_4B5;X@71IeaOeXjw~JP;IMD0y3rlS8B^-d&TfjZ{D5LObAwE&p<>F|Yt>+IUE|)9 z6)mf`$I5aFZ$1gp;S8Z?PaXnCLlq7($l(*J6dP-Z=2_ zuZ*p@l?~q9s?YYJt37BK#D-Ez**6rNXB+%>8pudWF?+HCKFrg@hEV&^9k8zi^yrug zPmc`W$ncqVu%)ZAZ+kk^!?@Cz98!OyE=0M|js+o8Uw@GCStDPv3$-cQo&RTyugfB_ zO_bRjSMdTN{}ADRQ`}XHLEK+*yw^c{+i+!JbKYG@*^q`pX5Y##^9RNK(hkr3anF^s zGeDXDo`ubc>$gzk;iHogd)_&2>B@2N82lADW+)WR1H&U-JM8Gi4z zC4p(8O!f^k_XKA!i3GCsMeaDeBY}l4fv0G`#V$4+U%93RG8NQ$(ab+}`8H+lmn2@Y z(R4)kH_dxj>3QjSqlPMd)JvawSN)Xyp`Y@q`N_HiH?EZ0ieO4INH;iSZt};`l?+H2pA(=M0Aer^1ynfzlWewZjwmG)j0pBLc>_ zk(TKG>XZ5KsLA|!JjsX=6~#?CtBn`xg_`wDsjf$%Hb>`nnS~VvhnPSINrlj9L-%GB znNnT3;9-H>d+MTd-O`PtkfsvQ*3N3y!z!c(#nmU4_DXIc;vt-g2%Rj7XJvy;Jz+|@ z_i>UJ*TGVG96j>%2XThC(;*-Af2C~}jLhU9(2K9RU8&aYwfrYHGI0N>`(nq{i2EUL0xCd9T$(|q}sXcGvBKPkfy5N zn*>+cwJB{cgwRo1V2h!Ia8nQMpxaGl#-dZ^ZC;;AbhP=Bv&HT_Zs7}YXa**6}$U%dRMhJWPxpZWUF3~v)QP?74l zt=U?3I3?01H}r#;QXheE`7gq z;FEWYmXE$Xda#`Ci?= z9g1fH0QBoy&ErUd(3&{qaW0Bq^2FXgH*a%UJ)Bm?oo&%^g&%VR06#|P`mKINV^2}a zTz81d^0teT_8O5&5IcgXIZtpq)>i?5+m|qk7mCtKeX*){@qe}Ee_z0f5=n%Az;a$- zf+4#=;U@I2WdDo8k=6b0hXk!hXTtAR@OdH^2tC0G)hvR>48l@Kr3_Kj&D-qB&W6XZT>b*=1XPogC%+6Qd6J??nBZ_l}lHhDM>@#FWA9z$354{5izNEr44fgtn{ zC8B7!JCV-VKW7Q<3Js-<>;gT+9F1o&9$wtL0We3?AsH~Q1RVxw0`q5PCN@^qrrXi8 zCQ{Yb?)z!V8H)Wd1OoW@1S07Q;fRx-b7X4vM+{EKcR2{`G!CioR3h!!W*hPec^euv zJ3*;uN9`GsPT1dS?;c6IMOBQmD%AL|Qf)HI?WwK6n4k=5#(mSEB7FYH1hl#30$0jg z(7=Pi7?A#X9PDIsU2iK$3+aAf_%Xblt=g@P)m(8a$Tb39 zH+6)FMQYDPO012VSe}l?&agLp#UvTSg^Q*tUbBbOSqFY|lxHtKAhCYiXJ3GfE7UFu z6nSugNI+1A9;7#INzaru)G+jVXGvH36+UH8fpp6Z1Xvxthmzf4f<@8xv51BKk_WAp z=-c~enVz)UCKVaN_R<$3SfNW#2UhGV$7BV=*`bM*H*!aUGEBc)ot^v~KheJh?n|q? zVPEaQS)WA7z`m;Fdk6??v*seHncyN&i2pwXE@8ZO)^KIJ7 z1`g21!A*rMD=Yi6i%ffo{#eor+iLU;>!$AhGt}58w>#0~*aQ0t$ASJ$KRMuN3v5P7|87V__T%<#4pP&Vm8-dA5A;3 zWNK1#wPXx_l{h$~d8{+#CbUqxW8uvS01diOY0?{rS*gawL1I|_r2I*8bo&cdW48<0+v}IWf+G18M7^Nv6QVL86h+6kyKPv%o#QT3BTu3 z2@5rs8bELvesv43o~9S*AZ(>1b|A2%2h|mv!LnqJQczA9{kp!Bqw;bN}it(BjK79rCxSuAEo!x-G0*jf*=<_X& z&wGy#ud0Fnm<{A}MgW1=13>7(k4?)}jafbNgc(di3KeLI>iJQxlV{U@@b>Vk(C#-` zAMalqCanytM2iGI!BV=l_V*h^nW?YQ_B*K!z0(RpkC%Gnks~%V7IX7D-iLxv(lRA5 zS%&@OQoBLwto(htt3M-sA5-v^>HHqM%S3lQv~P;H!K!kK^D|Opq?$>uX_2~cB(34r z$7Qkvc~`d<*U3b~V-QJc)s(DpA+vjLcb^@6x`d-)TC&0;!y6mRa%^D~e_=*o!g#Tv zC|{A_j2AE7OEVA-zaz{1S`!&tMXamA>8#s7z-VPLCR-SE-VvDIb zDj%DbNj5ymHey%88917@XW}*xJ1G|)*P_&wn zZ-sOAe4W~9V)`gS4By;@M}4qHmTmm@tXxkBut?W~@{qHon)>6wlff;+T~WBn?%j5b zl9u4aQaHC?Na(g6JUX8?Lo8A;<|~Ajm^YE9o%HLt}%@G9$zuG`06r& z1z4vWVL8k6y4E!9FhSZB7VuNpWZWDnVy&~SHSG5Y!~8qYK;_U1souFcWsKY0{SqjF zGF)7n6mhqM58PPw_E2}f@_+)EcG*b`IMhozKE3qwfGKA4@Tm;i?P6OMwyLvNN7V}O zhEDRVPfeo{$mw{sd|-Tj_2U@ci1&_n4m&u5;({_v{s=HHvNcrb(MFp~EXv?p zX_6;OhJQ8-ryZJDs2>P?E}O?|;)3b=QTJ~ab~GoC|FKfU*Smix9SX@v<1UTvClrt0 zlc$oG4B~}6F303^20I!q@>WwXEiHJu-S^P$BiN)q4O`v^T~mP`2^%q*0l2<{7zuM{XDifuJ}dS ztme$g2&$eFjp6O~o?g7c2KV@K^m9&N!ME%)u1jgoLOkoBF8ziSZBtan_UYm6ree=| z&zYL+*)Jvc;`+qCS6rKLggHklBd0cIuvC*mZm($Hocyp0JchjAju_DoYh*)#8HxKX z8tcoAcXb$y^wFXsFr1CweibeMM}{`R4AbUYtjY)-r1Go&q}KetyCzM#;n!YcG|qN! zbnTfbe})3ywMRvj@!m=-#_XHT*+Vs{*K~i z5j4O1t4(75p@dk)GsB`QOxIvMMKraId|}!1^*Vw}Iz{)xiVAej8@6OOduKNWIz+m~558w90 zV3HH9vP*S-6qtd202FSB^G8Y+Y^*#Ke(rm$Da_ax3A0ZA} ziUs1jB7RQSXY_f0sGKynYEwrK@fMFsR`YYBHfmW8-2%|@KJO#IUsc~9G^LVhGJZb^ zOuu%Sr~%MmMWiZ28!4g*)gvA1egfYOFM-DNLUxx@;4WCod9&TmPfsRsk8UlfQ)1-j6}w8gZ3N4YAMl*;ynk78S#to znq&=mzth<_=X3drCqrF}?E8UEt<+9@yf|r2==~ZYQX`|YNmG<+sO0XufD9kN+y=kM zLzIn`UqRWKV=C2+Z;DNiRR|=24|9sxX%#=I-z$1u+jDYBytr!8Z8>mLA=_e-3iOfB zcE;;7KQK(8o9ZQA_Ta^GM+X}3(6N0vf7E`D)ZtKIdY|?*DDCq6alTA%CCuXuzC7ie z80`K8D+Z$d+tZq6d+JJgkjn6|{H-~VE;bG{U!1Xqe=3y^aTI`zwMXNK3Bg!soQJ z6n{v@gY(Xie^b7VMj92xT|298NG3JWO1}3P4LW-YTwUt-?D%xummrhsT_V2@IyWux zJa?pJTY8d_GB}ui%yyF)w_~%DBfgjfLT-$Fg`9yB5=L(~M!ZA2@dV=vcXxLcV_8qb zmQrtV`vi`vDI^MaS0_^A#N>!<0aNN?v}@YEaF1*SPRtNNOIH9NUOd5aUc~YN?Bo{_ z`y5%oMJj^(ICqf(K=1y~O=6-R#PFOPDke(oPjeIhe>wa=DEAW6yjNGQ0ROkMVv?Bf z&?f5vP5^-Gasd0!=nDpaQvWmZ3h|-7y57aB7LB!7qgoVaN*qqu@wDM-RgE+50SPx^dBS(kECX z8+f@q|6+5V%|BIv!4@VJhlXYRKpzg`!c2{%di`!FrALiQ{b2p?o> zFQx?-_x=!|GaluS>R5^`lHXBKcv#~vICK7S6!E=`{bbQfp}GE#rrQopQv&L?;;ssRGp}m4x>0YLOVhr3- zpYXi9w0_S7>GKO{pWS{>A0c9tFPn1bK!g^*Xkcs{?aQg*_HDxB*7$WYI|qxA5nO}8 zPqhcrL%W+y3@fT)b?V6uXN}dD zcuP_3gUOpQ;!#x#bjI^@3?qBrODEX!{cqH?jRva(gi?}259)rFz2Jma50Ym`;_V#;NPWUaYro0wIP7Xa4#VPdNz0Y7$ zJ3iyEm8)LDBBn>ave^2kKm&Z#=~j_0Wgp2VS{s>8cm(rkT-womX|x9 z9)n=zls;hi)R(BUVo)kOTO6mxU~4cl%X)Jzg|rq4+o8H*P{Fb6R_x z<1ad&AsfeKfI@9=kAHvGvNl`l@e2F)y_eFUH}k$e-HfeiKY#l7Z=HE_N%XBpC}a$C zlA;SIt)eECkL$B%k}k{URi{5qr`Igzlug`NAQ#;Ei>E_8JjC;3rSq`;& z1tBz6<(Sb^=6Ffm#I`J#urx-i%Nmov#kBfgW&31;dX*_pS~1EvnQV#?7FNy)ykzI_dn1>e(hsAeilwP3w~^ z9m~y)x$y(Zv*k`(w{%sNby5%O{ZoU^2b(Hn-VXHj`CX&8p_sJMjxqvgz&HDwQwRk>5oW&r?_P6IykfjTq{F zZnupuH;Lw{k?F~}*>Qof%5o22=L2pH>p@$kH5C~q535fcW~!d+g7;Mk`pjY1pofo& zQym-w(Yp30L9_ksopQ_LHQ!R?2Ro}x|FO^Bu`;uxr2L{!4y|hU&r+#t)D`4orIn5P zd%HBF9;!?Xf0HF?UMe+#Rl+1-`6JRrL+P`Q-qWqC>2`1U>OEuH>6|D?}!x+_HY&Pf;CCGM?xG)(g&iKE7v%PA(w}rRPmZjkt7wg&*96FHe@s@upw_` zY-mtbC)~byQ2L`D&Var?YrnJCa)}?YG-MP%m!!#NAkeF;v#t9Fy)Fc!nB9Z!O=Lf5#{D@ z&~U_%ygH83DU&!zUMscZcN(64yB%HCQ=3vc+UBBfXsnuV6|lK}>v$OkX2ZWfecuA! z_OeI4ZkO#5s(x5j>A@M6abtq|k)gon{D<={vsVy(lVif4b4t+a5V_}y;@lO=$%vtr zpxU;Skn+hXxY?QuOU8cN@f-LbT^!fqzJ(*{F_HKl-?ANE;dk3C)LO_^Amz z#rpaH{j88V{8V^~sr6BV)!AQ+pHDpc*yQ)3qC1?eH#~hh)9A0ggF8RM#a5u~jtt5KOIG=wy2cMJg0v;UN6{ePxaZiCDpfvRwEU1g!3IP2gc_6H8JZud&$k&|MUSiATET4uss(27W31I`9Ck~YBRwfIgNJd32HJ9BG*;lV%sD4%!0ncZVdqjaR+Xek zCyVpcH*`>4@wYIn1veir|LlhYg>V>M8n2tqG`ENsXbHX#x?guc5yFapbw9o<0^kym z=st7?%gq6Rjw$g{Ww*nHui_GN8n#!y796Rqd4KnszeaZB5=l|@SIr7C)*Sx8jr5s= z3nap&d%buhiHIaT>wAkR}yGsLH!U<0O>#EcdR z2KTLz@Ao-D&$_P2KCQNEE)5(x*8vf8zvBGx9(-gawU(>SquLV3qi(%lLa$N;1aqk% zFGph$&LrH4YZOBEL9S6lhMOg`MJ!}SAzc=>DZHh5dlh$7c$^K17QtE;M>Ge#m#Lv_ z_%DXlvmPPpTKU23HhX`ctoZR&V{@*QCVX z)jo2hs$%87ZvC~1)3`dv+Y!Aa{ANP&5M*_?d8l0hF;N6u)i7;ln7mBM--<1|2r z(eHedF;OXP3-nQ(t(y9seMcO%6NiB;-)UrCF7|(GEhQ_C-uZt>d+)fWqAhJ$1O=t3 z2uN3yCS5uKVgnQqq<119y@cKgB27R*dItdkkrL@OgpPEP5?V;;orE4Bz!&w-J2StT zdFS5m{WB-$oW0lDtDUv?de+^yK$n7tFU`j$daPf<#^&SU@b zeSR=B2$DjuUa#giLxm99k95Ufls3rn2Lt_uD*o*=S-IA{v(MC+jodzh$6nyY(y)F&OQ^(D3^YH6PQ{D@ObP zHO2%wOe=k#5htl1J{7Xh*HXWVk7F-1ijdN$CB_fROchxGt$l>-Qr-|**}f)MBuj4C zi^^hpzsxxQir!S=iaJl$LwZ}oym1klDBKPkRY$E&8+ZpDcJsyyar@{7A3H|%h(0~ehW`E!>KeF95T(e^{iJ)(1XefS2;lu5nRE=1z@c(t zIG9MBd!FRel_z4(Oy%a!&u@RWzpr9)eSBTYt>ZE_UuvdwK!WItusi` zck~UbgAaw+%~%x#th`Z6M*S!Zygwj7Aj@2VLwbn?jric)Ve~n-QCRF17d6kk#9~!d zUE1MIAj)s=Il6Ty2qlgtbxt5xn@vYhd?0NXaz9>Id+}3 zx=8Xg7t74wqlVY|PA#I_3a`LPR33_;)}SZ?yQOX&DZE zds0a7Td9RmQ#q|G*u1^VH2$D0|BVkgeyOOZBV-wOQrI?6%c>s?xND~rGjuamwy4#1 zUB3y$AGgNTTXyD*NT!WjY)r#S=^(SQnBSBWwiL1@9PzK zyOet-0Zpd~!THsYOh<2GCU4Enc%W_a3Z@HHW3@ zhZNL%V85YMCf`5n$^Al7BUV$KRrY~RPPJA2K>0y*!M&@}4~Y;KHqK&Ol|BSfr3oYj zQbU$np=D6;g9!enJ`3lUsjat`T4Vg3pr{6kcRuMOUsw-!HV_ehh7PKdk|`?Vg`0BdZiUAgIkh6j`KXR zWN;5;q+eCFJL-(YRhNFy^cKgZj;MssJ0(BwpuVu*pnm?7g#3z`PWL+`fSo;Ge!L9Z z+i_<0E$S{#@%h!SvR)BGVk^gj^g6r=+EV+m9X4^%4@}vgCy4uV@F^5wrIN zU8CN!F)xAX+J7*ybE@%@oK>McL%vbxMi@(8#VGEsEUw{7DR>(?zxXH7M zjw8?_N>84Vi~ouM_CEiIT;$k}7^VJ$iSj}Tf)i7D)pyrnEB#F$3P}iTv&dv{-dK@V z>h;~S7z`ZS@9s)kS93f~4Lz8W@Jt{A_LhA0c$Y2pY8u)f$PaPexOVequmqJvWiWxbDQ5xt^-|M{eevl!skcQs2aqykI$Bf1%A!?mc8p0Q>uC86 zTPB>@eeE(KVkfsn@!jPu^JMGR02?H8)^B`fVx zN&8+BYiSWrM=XIeWyHqaB6xmhu?-~U&{CoUTy11a-aQ%Wz1}84Foo!q>6J^60adJ> z0{r#BeW~4bpN-ZjT7>r3>33|8`wU>j_!1kRMgA`-qU-{@{C=Mg#CyCEs`9>uufFWi zWns0y+67w0t1}2N=%zmuDB{14J>`~Wj(^KjVe9O?y9<(eqhnarB1jylu)yE{VY*ex zj7?wmfeCS9P9WdghImi0Qq-7q@;IoVehKE!0+gcheL)KJcHSD1xU8r(Ea`W-ESjZQ zSK>#rpM19A?uawYf=JCL)|wu-WbtGb`z47VurV6qOueUPz&O09rqxn^$G({k@n9p# znd3TSKn8ssNMo|P{Lt*j`qNb@&CAn_+6@PO!W!K%-Amk0GZXKv>ZR$hWCQs53kqD# z!X|?Lp;Sl5fgrd?_%oe^$afVtv@%nB>t8!pzJlq1^m0iz%5ngFe5*o;`+l{T;6j2q z=3S~yAz#K_V{O{fhk819ZaqpCLLRM*csplpKNxImPB~}uJvzLv?SIKBqemvAbVG+R zN{4m)rsQRgUJahQOX@Gbeu^lmx-H7*>0oDcjVJekhoSwwX+CNl+b?Auj5P6a3a>=d zad!g@tp*P&tSrN>aDUHM(@IViNp>Y_KF%~mj?&WSk$3iQN+->t?>B=nE&V;KYwI%h z=aK>97t5KZ-TUwGE4gX7{pa|O(N?cbA!E)~bp7hIqc?=x8#&8|H=$ZK>i#ZysalSu zp$C*u7V4Fh7nmi+#ua2YHx2Hf7xEKh@Kyp#R}{W(>A5UW5|r7gGE`vPzz4F+WV;HA zsn|v4WDb)YMkilcL?y+{NL1)5*M|&RF%z&WcBBgIV3Akp?c>^mSU^y37O6gN()p70&U8^HY>`_-vu(+4kYl)0 z7OMIkb|H%z&J^C+Twn|oT4|b|1+yGp2%COK!+*4$udEJFX|lK9O)0e6rSkSd7bVuZ z7onn~?r!>?uNb;?Uq6~yO&E4xeyMk~)OKa)M`jJAEo8{(5%TKM)*pZy)K+&DdF+NylwKa(u>@m=Ub&18g^A)NN;9xamoelSuJ zufq(gwjHY+Q>3P%p!g^!GNgQ(w%S0eu*#T!fn0^mTDn$DR^|UD6veJL;7mVTXp(qz_fq`Ox^fEywO#b5!n`!^wlj=LX&J6(kt6WJJb zYikWk!K%yVUYT57hiaha01uDDu#pvIwc8gjCp8F5Opw#WQi#nP^r~MN=0I%NeWO0_ zXuW|C|7gRo9y~PUY5=_nyhK$vP>6dU;2b07i#&cc3N!?%{SpX8*R^rgn@L>s+zhYf0U zO=weGN0$nYe<(Qo0aeW=06Kpt0Qb+|^C~7iCJ;qfLvVQ*2)jr>+>GLfcE!j|9d|x+ zu5vhiI4dY~;+Q{tlJ<3LUa==@>7qF;AZ(aE$YE!8g<3VKpp0QV^2|TC?*mH03Khv2 zAbTC2JPq8=UahG_2t$4gPwkI(Fs60$J6w~u@6{15t4%l%zIqEH%XxkF{0nxbC}$I3 zFP$NKq9cX>Hb$RW4>;4`czg?z#|1S>&CJY{N;OH8$~<)9!mCzuoqs=A5J32q|3g5i z;kl&BuWH@Y)_Ume+M$T&JMy4j46A?GP-9cBBM@^Q6PH=1j$_GGjb8CB)^G=Vu;N_- zcoVyei(ixB>!*@ke|hhZ^QRv}97?va9_yE{ML&-jut$1vz~)^E0E}tY{`fKxK|dCZ zGKBMtilws0iq7%k=HO({w3jTpvz}Q$ncKejuw*yEBu!1{^;|nVhQy-hpr#l{_3gqCjpYA-oql;OD_k z4p;75VD{sH#T#n)RF;BsHwb%FyZ(m_smSOZ;y(s4IRuroc+SMM9E<`ru z;jA=)M4s(p`?hCd3Gh0T+SA-&sOEhL%j5@;$7|4v ztw2$ESB{(R4o{;G(I4A3Km!T7;4^YxYCAr`ZiuNn?Nmx3TzljS_65qn&v+>gB@6V# z8Mo96%_F@12*}6hYg=nPcSC&LKb{pP8ZF4)FGu5h(^R9OAZYkF!ie*` zF78S`wsG9nztKH+Imv-Q@M4cz1ec#%M*Xh;Mx$E?bnXuDuZw}T36fnMQn|P{P{ZG7 z+YUW_uGTFtS?M>{wc~IWjgt@eIH<&T%#_BDVbe>l!Ixc8^x##G0w*ObCh8wENC)C` z%clKg8m^;Sng!+%4!NsXIC7}qr`#0vnTwUPKy9<&uJ$DM9 zmMx8jf7(n5MSr;&_3SS9`*B-m@+6)J2Zk%PPp-ds5c*V!yeEA(sj&GFzLDj++(0j% zb6NcG=)i1iaJ7HiHjvF~d6TtfL~tG3h~0{{!ZU&@4%|DWH=9jzDc4>{hM)5P@W#pj^(k^I}CHXN}Fr z_H&&ynK2`dXQvTEu4TZwdQHmJ%)g!y?1sx1bn{(ntfk9p-v3pHS(mjhoVW9a`<|@i zLD#q3Nc&4=&z2tJ+|%a}yS4L?GR>!70Ph+8vC4Vvf@iPoRBR39p zg0mYR&-;^{lP}yGU1xdzMn{}ok5fwb8e32S)!E}V0{aPB;=riW{uLXxIgqn|k4Xjecmy&QI_W#FoF~7o_ zGzc-;zX#6$0pjw%y@*dGz+eB1vm*!oT_{4h`zJ>G&q$j8Wf;`kp29*wA6mlAGIn#G z8~v%%ijx@p)bOD%C;nca$5GSP@4w9FYEvvcsW)J2Yy0gkNe;{?nlvm=^%!5{wlOK; ztBHXeUKGUF=;B3h!XHo<;D_{d6q%NiDi`!Lk+u8%0>GT-x@8i~_XWKpJ&gXc^BOMe zr%Te7>UN(j+3$K=b)c4u2qB$I7^bx3N6B5d~f>?{&CJ34h9 zZ&r17R`uZR`dnLoe<6J&06|r;c`^lQlDcrRv|QeU6rEEJc4J{4)4sPa&2@K# zq0H}K3nXW2U5v>&0#jPQ2l_Hu zg4anII&sN&Ek~Rpc)b=a?Z`N$y|VK<=l!ChTu*vh%PC)2+MQ;(XEQ|)hosCK2BqF)yy+P8xEqC~Qn`AHRdvsIg5v7xU- zf~I$NVx)XB-h5OOyuC6umz>X7>-Dxs>(w#QU3|(amYheMR5@j>L8ID;8@hD(E9N+8 zH^Ul!nO88GJgA)n#9iQ{ZhyU_bNy~khN_O$J99zWY*zoD8ISDP3I{95d9X=+2F84B zCitz^;kH?uHK%fpj9mY`8HnfR@B+^HveUUGvlZ5&s4Oz0R6t-8*k!EyXXHgJd1vJ? zMb>6twTQo+JdV;Ys8dT?Vv5!58>{)Z>y_;Lbk81TPL;^fVqDhqG}kDcG8(2=*_#^#(VM9he0|7AJFt8OIpg1;M3K-r&vQl|K6Xy64VVi+ZEX3ln?C ziJK5Y%7Rl0KV=7?BW;JuEEuNq(^ZKld5AXqmu9P+Jy6o84dUbc<-!6<)?h28bM@+* zOu^c*7M5eZzDb8PYRQ~vz2SL4s%Yn@@yfkdit@IByUpgXS|Xc)@kaozLW?GCZ<>(c znCl+m#3vc{>7Rz|^&GE#1;`>JMO>bt-Z*a!0uEM|X^*u(#twB6hSR2k>tW6xwpQ{tjy%M*z}o@DuO?2sFQHW1rclq-z&&5EndaG#bL?OVzlhM=7tB zN$7r1$zP(=4$SBGw%K=X6NKry+onBfnlAQ*>V__&tq(qe^fG;cs;{#6yXyhxs|P&u zqT6Pt7DZ~Zh02$@Wqk++TZK>#p;@TAp5D1W4Vf<4!enoX35-Xcch8=k>u9rHVlJ$| zwjzwsX}QArfTJp7c#8Y>_evf1TyFAQ+Cps&_0n6Q&;1mk&)uZiZAdw#B?dAgl~w%8 z>8B%)Nw?)z5VA+~bbXQEvSY%XhG0h-%4#4#*Fpa*F8?={YT{`2t<_HBv5BbmW0sNi zTW^G!dgo$y$Uf( zSh~GMooj!OVNkS5^xc>1ApL$+@`WCuK<;RTCB4AL)nX|Z_1ki7Na1Z49_5Cc88m%K z5rp#MD=sstN_Xwh9mhLF)32J{T0$V=7Tday7bGK<#D`D^W=qiz@#3-uOiMcxpBMP( zl*=qO3LMIo->)5)fsST5Bii$0J|+YOP6xST*u3@+S?0{>+RNDb$_~#kE>GdOSfA~1 zV!~3&hJg68cvr|*cJ;N&`uY51eq~vCFaA=|7KK`FXwB4MS6}$|D~gxyCd&Gj(emcx zPd=qjrc3Hg9FCyxH{#V*inQ>u7+T8BP+&Ex(-8EHO#Q#i&YlS-~|XEfX`;@-1D$UVBjrE!LJX@LvX(b%#h={@$Slt z`TSzrn^R^S(Vek_&df1d&-Co_d;m!`{&{?@Qwvk%yScr+LcZS)$EOmzw-;tKeN$?z z!v0b}b&-K{^X>0>z7=7H8Ky=QrbFsnfjiwAa0=<+@~grG?Hsqm<*%6`_W64jHD;~2 zB9^4(0-6?Bmv?2oFU#&3bVJgPbL$J`_~3q?vg!9Qa~or@u^~1nMtpz{F_2|2n9Wc> z>YP_~Dmgjdu#_;kba$?*!QIfG2kHy%1g@m^$u}>xrs%YPJY|JVIXIjoPsMP|N;<0f z>-kmeu^qDzTw{4wyI@afZrAWv8~*uare}t>ycG`C0-jA)evs9(qFI&!YOxC6qLp44 z1q>8`a&hsqwgy!g`F4k{r*`3+XNSh!GsfE$&X6y=3(MFFn`=cOpK^-Ijwm5#Xf~~_ z?q8dJWm2M3DM}yLevj7Njv-xALU}7!ywBjHGut?=*gy4jSy(8UKGx`8yi5q5x^F;g z$2&e8*b)(HbSuf=o#!L61k~%8Yy+JCZ2gP?A!fuCg`%X-Sy}(tjI0eE9Fd0WcL#_#R@Z=(np7eQyFFJ|?xkjR15)5n!51tcFc@ICY6M|YV zBk#ga%W&i8Y2m=5=6sC&Q$nt~oPdNqrb7lswP6iAiyfIE1Bp@X#s1_3anN(e!EU!> z5(jDp@Z)}+P?(MCa4SUNnDTPHZs`*tnP9-#FfP1?vH%|=DkLph=Rt_%&0&tV{ z1~{>WrLNP)Ho@(savWCWJbJP=Zn0(7Y^ap0E4d4@u=)GlmhDh)zF@Ay3yyxeV|QKa z#!5`+m(vigY27*7xmp|FgZGjyZ+8!N)nznpLds7qvtKk2UMStXWM3V$5^r3M1<=jx zUm-ZbO!yFO7-w_W4bLOTL4)$TL3$`|%gu*i37lOE z>+5=$R#c)9TjH|XCh$nZ?aj)Zil&Tl^U`8u1jWbQ`ZPn~BZX$+S9=lD-ZhPQMBH^WYf}(P!YUI)cq%_+Ciby1pF5cGJ@@KTo%oyoLl@E%|c(e zXED8PO^q42Pat{v035x~ur~}D+p(*qAL@RSj=#$`;(MO=2>%ol(ZoV{J_ul`s7m4a zXV0@TaFC19yZKh;k`>%x0 zlqujBXT>WfU|k$X5B?W0=JrMe0fc~{d`qHiuI8hM5AixBv-&ApkY@)QPsMo7dhm})8x0_6Hof7=p0|E+vdMuR8iPly)Zf|=K z%Vlp~d^T$0*U{%~^AWFVho%@U*{k7Tx)&m4^*4jI_J<>n$#)s>6&Ky9Cs|B)AoS66 z8<^gRinEH^%yb`Q6OG6)6zpbuy?2Mdc({I&>NHV{}-2I5w- zo-aGddaD)wuRXmQjB*nv>W`*|50Wx>%l2oX_FmVxbkAH&HclhHmXW+`ry?GV?I{s{p+TYY z+7~SL^cKpzYo1+Yc&d8qa<$UO0zu`#q?%0w@t?-MH7{xmxEp(GG+uM>o6~>KK7>x6 zKJt7NKhvRID|~+_D6T(KM56URcA-DR7fHxv2eZY94fspIU`a5k#>$EHox(^Y^~M3) zs+(Ck8%|=xpBHirLBhps1wFGsc;Uu(d$WQOdv1>Hu}F7*n5NT^e1@loE`z7%_#Ia+ zT}Z4h0r!Fon8l5kD?QNBZ3y(-CX}PY;$KcKVcN>1e)7Q8DtN1n^xf+`gkZ&Bmt5=f z6}Ofnn(m6x;;oBk9?nVQ*`WR)L4rx9L{ZO;&4TU`y7HC#xhf_I9Ojcp9{Wott*`}~ z@nApD+&rKPUjBZsof@|nz}FU;m38f_uq1T$l4WEyND!|?hgH{9=3qtZ(8Vo zNeBJsJ>ma{QU2Kt*FV1dU!9!DU%&q!9*bE4;Ja$(}q7H4NdHFlXRbY1*Pzuiu1Fi6a%iEysqB0E)y`3QQvMRC?VD}+~QpLn|_ zBC#FvGfh;Dph8|(=RC#AJ|;}uto6MrKWrWbT8lv8CvUVhLX%t0O`FCc(pT*Upy*Vdar}vsZ?Hk2;NdTkQYXw8G9>RQE&EuO5Rs=K&HsYHQPl%0$ zowwrA7dyWL*R`?ZTmzr6Wa@|wT%!B$P58O)&mkao)M~nz$t}nvpgD5@-t)aPoVt(D zU4RfbnO|y$(v78$)%#Ayx~?S}GyweKO-;Fj%O@2xi3q0H{tVmbWcRf)^Sz2*)DAAE1ETRBtf1Yu{RWB&% zT;_Dc7kbmg;Hit&2kOv|z0uE?e=n|~DBcz@ud#40{QJuzBLr0X%Ou@jxA>g@_wShy z(8IGYCP&Z!1;RSX!2kL4Apfdyl2ONLPwy~pt!th!PN$s<{uZ0Q5R{jZ?O6Ca`GP-{ zgIn*(sj0p0u}E_B@pdEdyv(%Vw}!9H>AqrwNHS-uMNu3?LXkL z_l^+ZliKrX?6P+vrcYgLRQQ zKypN+1i~-%$goK=jg3)y^3`JkzuRJ3$>95YKC-8xza$8~5^0d8HbjNgdSZxV#s1Y_Y~f=0tC4fFO)93R;`&$k~mV9;v!j6B5X z3F1JZiW|%Isg(8<1jGe{a21X15)5>qPw((*@^4M1o7`2iY6NDjZT)lksdAkuDf=ZDtcX@GGDHw=_@ zFZyPY2MW$eXXb8lGiu|~??iJg?23>(X68YW<-&J}qe|u9*{YJy$j! zaJ*uqCHYcnlgG*N?e>=sFSg`epFnrlU0AIKHwS$rEVm}oF^aamB`Z4t%l+qmmR6Y{ z&vgL(6+mQm0QA?a4GrEzPOS;yt2`*I0w5w3XSYXOgKTVpKzrcxt1+wu^ZtQce@_eA z8%nJVud;}|VfMlDGNG0|jFuKJHxAugLx3iaB*Eu;hI`izsv(v&+vOE8$CMFRXw9F> zcO4~c<7b6EpXTxGoyP6vh9wQjc|iU+-ZYgIxJTa1{EH>L+|~jfHp}|@zuwe<&YUWB z*B6R-i0{>UrNeK|*BMIQ*$+b9jv_QiZlzXc!tYL}$Gr!Q9OChPSJrCAiYwRd3I!Cr zI!CP+01u~tQ-|E%H=ALELihJn$&S6r-OYW)MFcc65}+udgmskbpzT6k;m`jw|0_Pge+M1#|5o$M95&eY^_@{se{@1sV{oha${%>6PFE|2zojr(voe-+2sW=mU)vPGkrHo94S+cBA7-2L%d;&6T6o%yoW1!)IejUy~9AQXPud-6wY53*LviG4hAlCKf|r z4`pE%BP30!1i1~hS=OvKf&!7LeaQ2d7~PpO4S@x(v2*AWS1kaRmwH*C2gnXI-T78Hh-*I-kg9w>`gKg}1A`{ZeOsX3Y8b@T> zgP(64#y>t}Nalak&=!BFSR0JndMe?n{o&QHmMh%LL7x+Tw>i5{EwNV{ZjzWe`($&I zlnkObH^3(t&wd!{qxFFpV5@%=N*U>pUk!eF*YvVfYqr`siB6Hg-j(3!rg%a-Q zEc3i6ZKs@jp|YnaU=rP*pU^y-USmVeCt6lYZ)R?<#H?Rp%Z1Rm0$5M4aJQicz20Jj7gXib#CZ{<89R{_cC$ zosCB}i&%Us#%U=LqmpmygNWUjU3?G9j!0kg$W*E+x|q=#L4iR}=+uR$@szB+5;Vn%Y&bSs zj~8C;IbkK?EZP(yt@zobvpeqjFu=F`n{iIk6HbZrGyV6Vp$ydw(3GhE;9}FgaX?-{RptgPsPY3Pc z9e+gjUXPz1fD7Rl=<}Zacv{qINV`)&J!zT1Az|}6N^zZOc#W65`C4;7_#ia%GixjO z<{@;MfI!0q_WJOo=ixPi^5x9E2ko0w8+x^Z=ZzG*zxp@xYwAs>Hy_pbJpu9v37?kT z(A;1}=>Wa$*^CE_wpUkEs%q7x_bMm%KN!7v1fdmJ94g>C^l+1TO|!d_H{70O*u38vvt3mgM z{i5p1$&OjZ!;s*DB=Y*J5PQVp(H(#G+YVg(Ya~8EW$79e3)fq&fsD!#+d|GWqME@; zWpgvc*-S|-da@!ZB3mavQ!3}k7m*i{NN$%$t+!Q>wxQQ{Z(U^2(8BFdw^@bYT1raL z5=)#h3a!u;*&JEzWQBt_(_9zAf?tQqL1GuTvn|H7cfy-LH`{?u9~+a6wFii#AGmFN zuZ0~#oLl>G-}6_pPuLLsWHE-#?mrwcleCqA`}vT@`x5(K{N{pF4_;jyc?E>WLI)^@ zRQj(`rS$+MvR|L39fujKy>7siddLi_Zo|#x_POmPx2rgg=N(HzgXRWYjzl|yoX;M& zs2;&DdO$0M&KqHRZn%zW<3k`gj7*dowRiJ5_JU>Ov?~Y{o#yyWB zS-)JJY_Sn!Uh~3uc|TxFt)_spp2E+#nsE{;^t04L8Wq???la`n{(7m~$vZbxIC|irEDC26Ppdsg!SJIds4aj+ z75*j+CJZLNC(9^$NA*NP0LIbKJwrji-)L7SDA+yP+>19?Ozb@}hEva6=Nc-mwLOZ@ zVtT3gWu(HpkLrFYwuY$g#Ll%USYrwAFTj`w=Q@Xn);iiV*>NfB)wW8xD~^Qc%-6u;`!6%fv><|)0t88 z+QXVfMB(CBDnblMXqPT9%K{^o#yWV@ zoVJ3oioZK`e0xBSrjRWMtbM$mE6jNCt5b$EUE{kx#Mxx)H7$=u&Q zW;ZIO3@45;2ygel}oeBjY$BSIoH)a};@0vf&_~fiLAB~r~4i%jsHQiN@ zr>wR|HH$w8la``Lft>X()Cx}CQFWuwICFjIH|N=r&o$!W-hnj6X>gRR1Zp=o%hVaG z8NA{hib4=}cNVq7{8#J`k8Q@-F!r%$7<*+~XdqY00|>x)@;LOQm2oM%7nuL#4NzPKSvVe_rIc7eX&p1gwPo}O|k;i$#zos6>0fCcKr!;j;- zyNv#c)nPo2`9$1%HcK;1^T}km@&?nd^_3Et0eNX@X}$?-k||2pBsU|=A1wtsiJ(QZ za_X$*S-M$AXQeUkvsW?6T8C92lXoA8e#|eqy*y`WyVlmL_t4!jYw0YW1I3>DR(uQ< zN9Qz!b#nm9-)iZFO#<_}izPDEdZ5syQ{~)^nbB}q+O3)3w{aSe@{W3ySS1#Y@Tq}l zx~zf|RB)?WbPzcrL?b*_G+vbipCU&a%i%SmbQD#+m{yxvvK>g%d;Tyx=(Jdu=+WRKwXf9o?6hk>D{tICu(o5%J5#mb#(W$-2s!!C z$z9i2*{Z??Pj0OOL&`s*)TWHGH9?K*4cTTKn)M4$$M)nf1311$dlM~!YAciX3W>>!aYMBsU9s4%I z4kKf65TxP|`bBnpu`IjxqjzN-wMuC;`Uc2-fqr;q)Mac>iQIjh))f;pIuwI$aieV} zrSG^j?kNW2hQ}hI-(I^PcQB!4Zklza=6MYLh$Sa_&w$q9G_rbf34hrg_#E61b;>L; z**AU$J|V3+mtO798Otod-=LJ9qWRGB4kTKa=L$Jh=6HCFA#3fuXZ^apNng}5Qvcf# z*zLwVDQ#2nGM~Fv*tKmm8e!|orsh4wj>HXJ@Nd3TPFVQam(4(*K@FK?eJ7g3IaKDd z=7e21(Nan3yDgFP)}>b)QW1KwA@QTUE5-3)={%giH`4OsL-jpV!XJM zPMy;-r*P@mcdcf-@IKvr_|_#0gQ}M0tDZ(P&ys_!I{R;KgOz0`7cTi_yVk2tpvm)$ zmlz~4Vw%P8gh@+4Uac%QdxR%%;P~xD)kf`do1e{g(r$Cc#U+s7<0_(CsAt2&zVZg7 zC}1lWbknz&6#Dkbk6YayAX*c=w?a}AZDn&m({x{p=nTBB)_#u4P(uK}L4<%oU}7tc zyXJTMZ8PuPAW?NMvmbmXoDlk2%vsNrPV@9|LGB1W7iK2q^^j-qo3gH`Sv4b8^uq=%S>5qXqvM-bU#)+0k|is0 z!>F3Kjtp0n{qjz;nN||xt>MvETeDI15~aZZ$oi>lM}P40Q>#^;8?bQ3k;v}gzF|mp zZpLNK64pCco6P#n&}-j?bObZ|K6tSA);PJ6XcrX(j4{0D*dB?QC=sIeNvh%!r*&@iZL5A;Tbjo;bcTsd2&nKy&!K?f-ozcMl zkS?vk9A-91MJwj>R^sP(Z?%ND#jvpREN+oP8m7f(kak2{Z$JGc5dX4 zS1;0kD(K}Tkt*@NuQw^eRxmmW2PW_b%0O_m5{j;$@$aZ)3*1gn(soH#b41bl)$_G< zR%baf5Cs>aNs>5MI%4>LbTzGdzm#bLC(bMct?-|&0}_H;2@USWa1jGtVK;Du*4(k? z3H5%N`dw6+=XAjFc9!fJkqj4n(3dHPb)7CjZj4hOeiu14a?6MvpXp<5Z^jH3$K}vB7!?sX5YDvJbLeb zzTbK+-E^pbhbfVsY#WC`#;dOhVIx;HZ|X}s)5y1gSL&IfRoE-+b6;(IBGu(qcBQ>% zV2Yy3acTI#Z9bIx6;HM1qMD&&@CIstrDm zE9eEvRk8|s2Lhs;BK0W=d(CdGLwY`!@WFY;=hsQpN-uXYM~8+J!|zO%5aA=-XkNZl zx(s=#uZ9kDZNfVGy>9>tPW+^_k0gdO0%jATSMW19b-jfJvka3bBcH5%4pf0jY*Dj(}opB!?f z&<8N&dx<_aKXEE6u}?#{Ey$->5|>|z8Ljkj`SMbYPh{D4X0cP=73g1o1hkhttGchmy2Af@ViyY47DlML8x%rpzQRWPb_oav|Cbw#@VPLrvI50 zy6D1jx7eeWcc`(U8g;33lWRDsvdB|ABKQ-{>~s-rLE1+vy&yv6+~@n?ekX|EPZ@N`0zZ3`s&-)ZDe&tU z$5wl9vu^`(`ujP)o_|Ar88#Au;?HI73OF~Anfis4!WwzAnqUUu} zK3C=?ocD>AUee{{S*b_iM8N9!uFU44+I)6Rn3stMf5qqqslQxREBowKzUm^nj|f(> zKsFVdi=Pm`_MjR`tYK<5m?nE&-U=Cm&ynd;{4gQyb11zKU#8saFoKc71M;_b|sFHr{2+Dbf#Dl-$Uupa8{=+cTli9ENv z+o9!UfaXWdzbD7$=^165MzYqjtW7+_=Ki)xk4_aw(w3gG!mn4GhrVcRWnmLkHtsR< zWqZ&wIfgJXkZvr7oskg(UnYJLxY6w|beHGn?7d@2ItQmPQb_dV?R}io?nvrorZkcE zC{YnsaOt7k{(DK7f1e7c>xVc6*T0%&B#ax=-->YbG#iaT8Dt!ELwCsgEGf~tU(#PF zY23mp_nuq^9;Qt$d)8;XfxyGD?{jmK2aL@StE)QU-fnH*QeAxznp2mGsV zMQk}vctsu}8R7J+$EGjx)H2bh??ow|P5Hjal%wQ~Z*5qKUO2bMx>mP`(?_Ga`c8rr zLa0RTA9Ad}4y-C)Gs1!b*Nn*UPHC_GSSFOmpXUlNB+p*4_B`Jk8hbAa6I84{kQo0Z zIbD@$9J90|GQ>^4kCP`^0d{OkR0XkyI-L9xZkM(oTmBuqAQM8>IQApeRxUfrx|?mp z5y4}U^Wz8QJ3YvH*WwOask2bEp{h0!lQF~JF?U3sVBm z4y!mfRj)rXpRf((#4ZVY`mAd7o3)`mg~=c@%(@hi1cwl<4gtkCww+N@T_?|c4;Xu{ zyrsDc|Nm%v3#d4Prd=2U2?Uqmnvg*7;LauxAb9ZL1b25?Ah?I%x*=H5CAcr{?(VLO zFR;K}^1k={-~If2|Gj%o&-BhrS65ftOjmV1-*$EWzoAKgCB&-=TU%j#wrqk4?*9&! z!lI*=9QgIcv)GKZvTWTqu!6J6i{@ctg}RG^$PxyNZThyj2!^JY-~ILLmfnPOy2&f! zR2+Qlnz&G=A^qJDqIamxml9veq<>82SplBk^C*Y}KU+cJ#pw6d?Q4yB*X|Av4khM> zeT8>A8Zje zc=^s#5b#PE*DewhPHg?oKxeclQNkP3FM0A%Zzvajm2$_5R+GZ-lGfvO6APLz#8(kk zV`ODMP=x#2uek2_{KM-Z_2f?gFx?dS#q73~d_tr=p&CodUZw9J>c3YBPWkhlCX}M# z^*LC05EG&T<~*X9pL2EpLOAoG_u3Il)`B)|UtCNwIa|HluenqDjJ1gAK?0I-zzlW6+Ka59VX|85r75MGvVxFxy;oaOYJmSp9 z=MOmUMZVfMPzZaDLn(N;|6;iND!tyZi-z*caqfil0vsfTrL?qL%btzsoE2Lt_bZ*lA*#{T#cmDARqvrOIMH(VBWAb! z{qcL9oRbf?bK`j?*D{NVHo4_;-}KX~G`6?cxMf@I&dUdwi?3>5s}2hbkiyse+qdST zhL5?=kRhO}!%2!kcq7l%5uZ4{TgTlIY|o#an4S*@=y1K50dN;uUVB%Nan6HtSW@@9 z<(Nts1~N1|axZU7nWN?+g`X#n#`^?MJ%I+IB8)V`@{Ju1*dazViUc(C`YH$L& za#DyzwdHk{?3R_D!vAgPgkSVyc{T2Y3)8P9G;FC3w=C|{d3jwdm9 zEm^HV2-d5trGKQfas<5Y|2Vrna&K+(1Li_<+kY=WK^Fn>9QdYxTI?J1kY*v7{d)A3 z`6k0oI$O1TDFW3^)t&~#%n(*dpvW3ulXb|P;e9;bJrLJvtnN$92W(99d> z|3zc=t6Zn=+p=rCiQdVp~aPi69sZXXV}0WsH&4NSl0bR(gEbd0}3*vDcU9saDwB;hlO9mDL$E5rc|D zjcOucO|e6T!im6xqnxX|K&XkZmJ@s(=IF(A>rFLA(Ka6fk?9I!Gl587Qe?ny95=t7 zAcH8qo0q!xyvdC@87fb&^7}yBVBpD}{=MgY%E1rn(q>Tcxl1!#rq6fOgAu4$*O1!G z^E#yYR?PKj%&^ZXtiP$Ez~jg@RJ2p79lv)GzVG`9u&xLpp}Fj++B@8A8cDaFn#Tb{ znkp-~AHH%F@rmZ*u@j$W^K*PekvVZ|9ZWe3VgCp@7ICjTlX>ycv~+TzhB^;yR)nG- z^-x*|@K{`pWA0sZ+EsQxsrdzv8|%UJS&wnRz!=uxt&Zv2ZG!2Z&n=BBl}t=%YT2{r zJylaR)WPpP>W+Jm8_HJ}d`Wpj&v+&~D~XkGS?Qr!4PMf(ui*CG2=k_bko23Rur6>? zkhEDPnN?iZ&MPH)1Pyk%*<40z^(u89#!JidragETk@6Ha-vUmOVB-DPIjCn_Af8)S zA;v_ouTz0bh+bwiUj71t=#zPDaF~9}1$!eI67Kdbeoq9C0UD;mc}cSI1Y`51JG&nx9Jp zl%6w)Xa0QX9x`0tdKQtDcnQQP=^Bih+xGNg61-A2(u)MLNQwzYBORX|(bf)mxQtkRd6(LlsV1U}&y`K&IWj?ZBz}!Wx zL&C*Z-P75rQ^=!eSLfGLPwH!nzuw4f$>PKd^&{Q2_MZd;Gpy#bZ}ggA7) zff()@xRaS#g*$#sb_$$C ztgw_7&QAmmKPX2*2ciS%U_X;58id!fsMVpe+vxW-o{Eb&vJ5eRiP7ISZ2jK{_c997 zG8$Bx;uPba;=%FY&ACbC3vMYjvDulg6c=i8A zgK)V|3oAhQmwAN;NBF#dj~K^L5bBu!GKz2&^9l7E2w?#5&(oto9!(?=SN_vzekw9j z*n23#1sK9`0pVW%v3UPQRFw;XEr1RzBt!a+jtcls(vViA28bc~Igp@2{*262D858$ zshzLMe+i57KgtY#2|yxs%KDSf42ufr%Ip#y#YO58xIDD7Hfd3W-r^*iA0Q)j=@=pO z266GrM0ZFAjYj%zR@oAUgh(yP-txcEA59?s>ww@7QL_IsJi-n9SK(1I|DEtZU<(Ei zGP@;|NDOk|wf;SK=&VJ-8A^|5-iII781{ChWAbC?&!4DDVJLe)ZRq{h(Ig1H)5y@t zc~g`aa7udzOyi_YA*HjpX$KFyR|`pnx9Zr72EiP|!??9AL`o#5cBVG(>*(DWtlkuwf6w)_vt}7a zj>b2ME-Cy|C?*?ly7uA7xl7~7uZEGRzEDR|eXj)9i2AVv)_hvwdRoQB@2a{H&MZrV zzGeV>K9efsxRe`lW3k&tHRaYbf-?EOlHwe>X;(?rWY+Fsx8q1%OVqvdR+YwSmgdd9 zF6UZMQ?PW4dTVDrkbIL-5S6r>uY5x5Cb-V*)-oTDp{rKPzg)r1Y zng7w$X{axXt{&-o-E25oe9duU0DXl{KJYR2`ZX3rp`U+{?kmh#_JDO(UV`&SAZXsQ z{n@yIC=DaW=BVX>O;rLmr>@oEjIODvTcr70MHq*XvYL5{O+qAE-8k8@CyKhtchPU~ z>My^^MFXJ`A_a|QtI)DV^;i$JYwJ0|6HqSer+3#ezosw|l{}+h5<1=~x_s2UX5qu7 zr4Ne@_WZM2-;tLy7r{z#*E;kLeyNC%v+X=W?gV%Tf#r0duCPY*7w~_dhe3gh2E+PK%;v8T9 z0H-|!4kqJMGR~Zickeph7$7FoDNl3!>R~ysyw?>3!c!Za=)J@?XG4b&oY19He@T+JtpmCY-3?^VPSHq;PVUzj2v`@iYI<%bt z8zC5&NFYcN1^ST#Dk0l15Nn1pY_-uebX!@mSSZWV17NGFq>L&OxtY2K4EO5gDMUv= zFwXy6j2ZUYs>aO;z<)bTI?8+5#~kwaxnZ#{820Y64{x8VhupdsNs~|5$l1|yUFf)q zu_<*6rAA1;ppai@A-(?@7sFX025t?Ubl#IELvp z0sD5wgQ=;)wvg?rjj~)^sLRs_X?;=GPl0R5putAQYhzhMZvrzWcblkUEHl%-xH=v! z^L3O_cV?YGzg~$G`gt>n^|?FKc)gi@J5%8xjVoJDVx+f@)=An{#kbrCRCJE6ai`c7 z%({oc7F{-zrg-b39Q@D|fm*YQwkj27=$H!VSMlY=vwNEP>rO+c zlTZ}5(nX~yZ|*Dsb}*UIveefY57rnt3xs<#46vR!+`VjSR4PoPHTR;s#OZS?jSfAm zGAiF>fP_<>HA*4xYgB1{-yXi|ouEV7l5WNo2QyYn z%?xk7Vtdn;G1ilUp1Q2z&l_1z1-C&RS+E7Qnhp(kL94&X`Y9<=|gVlY^}@iUT8 z6q0DuVOTXOZQ%HrC+(aU??IR9arE%ym%^bLA4L0} zZST{$N}i!`N?uEI6XEWPjqBlYvJ00?(l56efLZe(x(MS)1k^j+{nzJn8fgM4 zw??-%fj@_Nz~H)0oLENj=Lx&DxhnoD$xv6qN|7kHGdDEP^}*;2|LdJ=2?BD5%ea!U z`6dn*$$$W}^k*!q8dj7)1t$XaP2b+1f9r|dqD`%$s)x=`lkv@M2$UR>tUGvi$DRVr ztR2o6))qrVOvCDg_3=%@P{W0dO@&+@LT2((C zOodihS8R!=E%<(##9QK_Q#_fDf9qv<;{ny5dTLnT7Y@~N7sEE;ypuiObx*B_jh5#Xyx$P;l_F1i2=IRLqYd1~*KK-`jO^~e<5y!k7a)YTk6_j6s z+b^FP)T*T|=X=|Ti0ar2*TmB_zlozA#yP)6pZ*-gmgs!ss^-?I z8S`UgPVS-wSB7$M?CQQ$l8NTK3nO+VbGEdsp5}nM$o>n(&tz>e5ON=HVR9Ig+>4<( zxkSpA1mw*bw3s4~LopH{i!AGMn0tPbNWQ#N+G&wp5c^mlh>Q1mouhqu(aCHmJxkT) z<^p!XmAzS%ch6)bcdE9Lha65uL1HVNa&CEhNk^DnZb7-Pp;FpeOWa$cZ=OcIa3$69j-`B z$R9Fllozc}3n3z>b$#LX)H+rm#X)GSusLqQn}@&S6(r^Ndbssc&;(k zp-96|LOs}9l*_cVhw1jUERyr?@JjS?%5IBcZJxgBXP-WorGMp6*60)jhC}xD#4=}S zAqF%HcR&^^n_17G^Bx;d`=)JEZ&}t}#d}-x-sVq=iTzG_lY{l?BOe8>g8+se{u*>^ z3=0xPszP3EH<7RDbvt!YJA1Enof(Vy~>ETE|sxfy{D}572SCT;~Ksn2gF%eTq+1+ zyCx^1mDbJf$PKeWjwz;Ia&a3;geEIdX!5WVCTth!F$oNSDX&oIET9O&gZD*Z$!sf&zdHg^}9()<*8n~ zQC~>O!%CG_pO#$P3eauHI0^{WfC|T%9Rw!op?M})B|1@6>DBMtBgZ5+|5*p%4{E>} zP8nrdb>qxQPU-VC>8wyaLf#tdCP%vXvFJ>Kwl5^&MfcqUsvO4OP~iD~+_OjfVxCjO$Z+f~;EYvNLJn>0RfXeM6zWZeyc$3j_QD8frFyZBs%EpnHLdfq6U z!jZtNj{Kx6fF8aVXh@+f6Q40hjHzH6ruRf$)YWu8Olz9gNHpGDbC(B#V=hiq(s%tG zU}Hle*#=gSHZE1)7#{sA&w|9wc>eHT8=Gb~qrJ~d)$W(2*YRve1NBSzgq6RsAL<@o z_~dAB5d!aUwMhXz6bqRjWb7^)b7gznqPpY@w{{!C)6rLNpUu1Pw`HrFVEJ6H^T}Vf zt#HUtBuw8vzIdZUUNh5cHYy1FbHnV}PBTBbQ7m^JqorzB>t%6DtI@s0WX^-0xpGl# zqcxlIx$RwLbd_r*v=0FdwPh22F&3&g&=q=m+`Vc-W{r_li<&IT&|8%P@v4J-ZPZye zzlL3iut#}CI%C4pB!npH^Pl&|zJjO!kxu^pnMj!abF%%PLFG8M*J&Q*rBQ*S)!mi0 zJJj0q>^hYm>o4(vmQ(fZA6MVaj&lsHe}(zphz!hh4_ON-?N_m;;5K=B^|8Zo`T-p( zHmAE%{bjX6mm$ARdh!2C?s+1GGuXp%q4~!4bWP2SA0W>azb@Fz053K(X=+WPhfkfv znxrVg-cVvZS*D%53bxv?TjtTS;!_N&6Kaetw4e^U2W3jL32(h7Ylr-C147g&H7L8w z<8^nZI-jC)e3I-M;NivK-{@+ci4A+R^25(&L9C^1Wd^wh-)60Eg!U6G`TYPn?=-*8zNrl9H~++*G8Dc)&*6 z#L_=-Ey3U22>~3ErA&7-tQ_bQ-#y9P`JrEyNO_2w=8Gpk76U#8f<(1^KU_u65~D-P zsyx8hHra=(HJjD7&V_cz?jl2BE8t>7C= z<&V<`kwZKf0Ik_4tJ4Eg1Ld5nZU!B{h4iG;V9LEWKfET0mU*_49GRKmJyB95v?pld z1}{p~{QoHprPZWRH@Tx&XC~o4^RHz-F}R&6>VRQZw0AB6Z<1p1!79!#v}naYajj0T zPO(l5k{+>(=>$N%6r|(@>yPH8<1sbt=g-JYLb@yjlS&!3iXk-#8KzxFwa|5!vu7Gb z8_vu`=m4U;y?%!Gbz7u@2aUeM&@V$?OfQ_|V_HV!+GqzrCnAj!AsaG(NrpP)B%6x`j z!BSr-gs&CAOOX1Zx;R z@?A&?{Uxt%6}w%N;`N;D*$zY28+;Y=RTEPkRoTH43YGpSUH;!G(6csNm)oPOV!Mxs z2Jw=l!?R+kcPG_{&-u$;6&*diF`_C4tsy5&a{Wd_4~fN9Yco8>NRo0FUWXR}+ntUU ze9K2~qKS}(T{>WBqigw+vu=fKk;HxAB}wiOx$no@07BrE9D4cI;7LDuoL&kh6K9gqA|4$07cQPWFpI+O^3 zjUS7@Wqoo$<>CYFy2Fwc&sECf^78@P!*H0%QdLS#pjO`sfmYA#>UJ6?#3x%FbuiDh zD&#qp52uI-0s9Iu5yDN-8;;d0S6lgyh*lxnx(?pEyG))fmM_6!6_tO85gMZ;o)~mw z)sUW^z$_PAWzc6EI?1V~Y91xId`3-oQrNrQ6>RPcRlnG?>cQf!tAE#P@|rIXlBFfi z^I>F8Z~JzD{^G*s|CC9?kmFtQtbuJX>GzAhR{a7_-u{Q*>e0DQh|wsgTw+%z6&9+g z{uaJLU_ALORwi}Vb#^%NTy<7tkI0wx;k4)ce5n?CW+yz2g0q+yHB9|?$b9n8FN|Mp zVAF9&kt;M}pHR8-pFlCUUbpb`I8Umxo=7Sgy9pcVn90H?p0hBM4Xx#;*CRl?1-AQf z#=XpaJR>ed`J8pXqkNn`^d`^jC32kKN=3)$srbITGfziIi5Udak<9Aa>mC&VT4FQ^ z-tN4`2UZj)Ig(`K1Jc~s1x$0iW%Pj3?VPitxUL*M2o=i>VF2 zvY*!6qkrXME<^;hdiH*jDZ!?fl-rUTm@q_9;#j+v_qnESnV7oZgYeKPU6v2nYS#77oFL+VbhyYMoA zB7hHVE3=ct&D^AnQ^%*T+FIyb-(yLek2+6JOX#>VRj{O6UC=(KCXKQnO`^K}N<`!o z)|(>-D-gJhlct3ikIF=I#3(5ltiKz*e_w6gpsfZJJjVLL$)Q_Z=$Y}=@)Hk2l#p)$ z5h8R8yi3#+M8JVEO$sWi{a?aIbSoH1iHQZxvI{R-*Gw;u{cK!UJ>wKAVqv=46L0J>r zXQqDzx)onyhH#6B3vUb5*H?vIY_dy=zNY9NBW$p}rLY`R+`EWe8_vENJ+7XI6W-bA zyOXgi1>nfl>DrR~P+m1#-kZ4qisKHF#GE}*?8F!;qCLB4z8=c!2S^gTQC11n+>Zy# z?%*8`0cD;rN}WZ?Z2m}g1*XnxtFj+&MpuSBb*X6ICn_&td5+h-Xa1y$6 zjJYn~bfpf9xI{ZMQHM;LxmIZMR4tQkTw3XxXJ?GD&|Ye5+jkZiMob_^@_l@u&;8+h z?Ebq1ObAD+oNfv^uoVCjSPWx+y$W>|9kwa<%oSZr9DH#+seQ(q zN0*@U=V)w-Xek?bVhdjMqT^WYwi9MY8OWXq@F$nB>fA#|Ebs;{Q!v1*JDQgWNPsSO z8QLN8bU%E&-kYsYdZ;@ufhT?48N&N-I*y9=7y;*1p2K2*H%)t2H!D(y>rB7s0+-Zz zb>B!6^|8ghj&hq=n?5g1(VMyrA~#9QKUm2(l4y(n;j2_Z*NcKM&$!qqUSt*b<*4N+ zV0}-Kfz4BK!=6yI=c!*aneb^|&PZ{tcC)>L_xXjf=*J>*KGBKWhNF_$i@>#;@rlV_ zKKb%$vD# z!Lwvvsw4vbIhuha&AXu;axD2bz@W|xc4yIcMy*ntCrfjsDmvV;RJIg0F$)>$u+1pB zG~uF(%Wu1|g?DEq@U!`5DZ0{EBJkf4#^FN4pZK=wWo*gJ=}X8IxAa1tW4>&kElM73 zJJLAxGnIGO?^McNnv1t77cF8iG2X@xDO8>Ul|5s|)|hXmzSPYUb4QB)SaKIT*L&mR zFG>ol2$~A_CYU|`)r$M>Gh!|5YRldbNPBtF0uSR!w{Az+m(VGtm}?r=DN?ji&(4mG z*$pG+mwWEfF~#thcvVj_l}|->!yg|y?pGFm3?>U|YxBic0T;)*Bpr}{$-^+eXy0nj z3vZ7wyVSTIvDbOh?Z%s(p?nmttY$eJ?#CED*4xt|=s>%Z?m$=P(?}W09lFmMdE4J$ zTxGo^6D4VSK|frd-2HnN@w%lUTWR|2`BG~Rg&{80Bx+De2H9KQu-`VDhpjhNZ$1)>!OWQN;6!jEI=PGCU!RU>jos~apZu2f5(TkQR&I)Qx6YHg_Dx;mNKAcBKRg<%d zHt=Yj=8IPbpLfM&Xf1I)#eH_u7V1|fgqTGh=!{6i44snhJ*jK)b(LXOgUO9a$p#R;wL?0B*aLM(BS}Ah%f+3 zBKUpHglg{3@al0+CtLn1M^@49X>vj7@7Es?S)te)OD?rut)fB22B;}TaM}MVOxzDG zQebpIT)(7Kal(IGxeKwbMd(KUeKpGeOn>r!s$%|UH2&}Cac*gZ+-@l)5U?`~*0!D$ z$DE&xWh|24p+?h@S|d?#d^Gr6LZBQFAo&EFNh$n^IYt<|&nGm&-_E4g`|o!nO_E)^ zqQ^<#L5m??-(GLfzI?N^eI{0(HYj=IcGYlvbok`2*dBFEk4mY>Vn6Dc5aZS(_m8@! zN2xyE{tqtyi&X#eX_jl~Ej|*GY&e1n9#C}eDH2o(QGfqAk$;`#zo7juIrL(m8u0iTR z$y9i1#wj82_3AdqyS0(;;HM0JQft*NmIEWApjYB4N_>KsxAy_S;0f>MJFh-K3LW7bp2qeHB zq)2{5sD+9@GwAq$2thP|NwtL1!Hxa8|3Lx~{RaukRfhi#iDlf`Ip1JkfyK9E@BXZ| zz+Fd1&m!{&)&YaVehb( zy>++@D({RBi-kNqfRODv@B3Sxv)R___3IdIktSj;_^*6NkrLeTIiyhS*`zDl^IO*h#~J*qPA z4|v#4PGLoCb&h2B7Ky#@qO3Kg&};{()Hgrf9L7(EmClSEo7&B2^f z*DmmD?JFOmwhJtw4-!8G{}!-1|;M^6LB+9A+V-)0wt{76^8sMPVZP!e-zYc~(d(O&UW zbcnT=DKKdV;mHvPlJxCo^G{|hV|tp6hxag^WYz>Lt+hGK)#H@SdyVa}VM z>8UUL2aK&;D`%DgUxe)IMn}azyyMiWUqJYExrzPbg#(gg0QFwpG3$cT-cG^ib_9qH zkNv*tDTlQCzSX@-*F%rvHi%bUUD}IxFFk)j8lB%fwzsdCN!DK)Mc=EtIUq|v?jAgl zc{izA8F2NCZ(tvITE|J-Y&dTt+lIU9=6f8xiW%@w3Y?mE$??wZDcI0GiW(d1^U1Aa zXY5$awUSXN!Dy#S`_WWEDjSq;aCjV`jhKc5gJCV`HX>jLAV;))+emrsD%Iu+2{r z_S%>`6GLzyXCKPe(r9P&wGISnUe_xsYKI>`nT;2w5>-?`qMA=hXY^*=YslC&MHocr zrrEwgJ&`!`(HI9`P2E>W2K^QQDfqTlO*M<}KHJ4t@VK?IiaaN9{B@3eoVd6B@;I*u zg95@TZ;ZD7a?mGZ$ZxjFS8*EX$=}rU3J1cc&mx~WKTe}~kUT7f?_~VG^*LZQ1e&Iz zvEaQQqiXxKzsYra@axHeS|(Uev7Nm%E2?UmpgV~dT-a3Y?&Yyn+|+x}A-3pz`F{0E zy7^U|ijkWOMLSTC>CVcAE`3 zR1TZh&QFWD;F*FioWWtQN`!pY_nC+^HqM)5H?1yt(bRIGMKhvCu#1vXYpD0&ap~-6 z)aew6eopGh&1;-ycO==6*3s6FN8P*9Eva?KD>u$A!YFy5=hF*%N?b1VA(IJE z?Q8UQyCOm$qVD)FJKddqJz;8d^%B{|d`2|>(NwU*3-%l1y{HQaX;eFrLdr(i3 zeSFkU+#I2NG`6YZ-F1{913Of>9C5hJo`V+6nh?Z*G7ge!GlpZ>6|V$DPaC!vS2aLO zzc2c>;lGadSuaJ6VLpVY`t;kUne6PYF_pxUVETuS{zchbXoTI-A@wd9sh%zckWOSj zxPLK`oID(OF!tH$KS_sJ(tqOO-D7uu&_{X-ay*Y-W(WJ;IAHoOc~GKKQfy( zN?m)G?K2o(Rf-5ZzIe`3=|c(I5+~80{=)K79^L7YoTyoP`dzzQ$e~B(l_Q(eS3EPk zty}rmXG7^ulv^UgXC9!dx=0379pO*J-<>uDn^Wd?Q6N00DaiXX{ra<#_h*-4-Vi4P zzrmuKvKA!R2PDXXV841{+r;b8Grf`(+9WTY%9X`xwK^CZDb$JC{O9~-h%y5Km@SR@82FDgUsA+^ ziBz9N$y=nM05fHqSF<+*kVOyH)MdXI;;kelX{Es1=9aINUY)zHL-!Q;F`!bHoxD_V#Y{01Pq9h*6@6X6(9hZ2eN?o@l^V^a=a+8?PA>Y^0cA0Y zA{XCYoo7b44^?{`?@o2ib{&S264r*fVdl^&`qSXQI=ssx_dR|F@w#lnQzAa3nYwVU_k-u^g0LRQhJfY-HqbEWgTvE zn6&i9^Lnm*o~sRAVHi(9OKFSjP3SRu@IH(;{29=znS)h<3b_4Vu6K5tw3|f9?Oqc= zEkVO|&zOn|8)U_o@s2kD=@TFIXq0)-%*mA&wv^0FsmPEtVs+6S_E3%9E=WgAoCRrMn~yl^*+zR zg`(CN#|`%|mL84Ytze@f$M!$H5k#fw5d@S#BmnvfU(NZFOIS zwjiSt6>uz`?+se!GXQT$VJI?{J6JUK(>eA@<{w`jVQ2%)jAXZWx=`F7tsMj2#}>W6 zWZPkFl0EIhTY(CB7P8dG1M^_>C@!|HFP~I*L3w(|)6C&wOdgC3^k97L1MKh#`)GB~ zb(A1kYE>A&tTI>HRK&hbCH>tBzBG~%6@dZA%IC3@LxWr%4~`RQEE4HyaUWN`9sboA z@8bo?DVb5{Uo4PS1_AeQvn`VK0^glf2{mIeb=w~^%Vp6rnPXJN`@P+kP z-ihem+&Lp^x($kdgzA7VPs$1WL351;WVZ)xI!55O8w}CU@4oNInR(ij1Pt5G_ z{it9J*%feiHnQs2U2QVq;gd%C=UvJ{qv>%;j15Da29qZcENXzDxTyRfK*xON8Kepa zmQsl~6_UK0OE-skjZ(EqY7j4^b4BPiP6}U;reuSv=!#4UtaJw}>_`PY10aXcwBSC0 z4VKK1*fMveeR1J3m5b;e@=YmTDxrpI3*kZ=s^$P}STF(BsdE42@9gW<5=8cl*~%=h zcvZGk-8fdRC!T zN_SYhdNAF>O3f@XBs|*|+7J__Cw3!DFgpQ>bF;G9cPYHbbiBQ8wR59hF(bl+za7HE z0r=6NLes=;sF_{AbX{J^HNwEs)4AWe!LF8o467oIU_l8d>x&~?-#lk}8yzI5)Abzx z_$xw~Qd{R)=|*1*3W|x>ZGP?167l`wKAU2*@@@kG+|_t)@4|n%;(fvxk*6{w0>d4C znz(Q{IN;;q53<)VjCF7q`xr9}Y%i{v<5SjdlEQ|~1}3t@Z1~KKPhi(A$2|@{Zroop zlfJ*r1Iwv*(q&(!RoY_#r7BA8o6;-{nX5Sv! zX{Ez{dhA8MPA}Eix4JkX_==g~a?mFV5+wNB{a@3cSL_knvKbE*`p7KrPJ;=ZcS~}M zCvwSxMdB8+J{)aFu9(rdc3-hgbn~Of=-(TH^!MSW3+sop9fcTREO6tPo#oc34{-)I zlbBOf`UZ})#nd=l7^sxb5!&|#!QEk|{2FP2R! zr5fL^NZ~*hlldMc-_P1tRaKJmkDrPNKZ6a5XMN;7>PLhBb_p(qyn1`XHe(gGUe26m zV15?O-E*kSqYjI&Yl-m=*wBc-xZ8>4E8-)BJ&)V4a-old!dTxp_!FBU0UMiS>F7GN^~Aq zIH9zkB~N1xjq_&%Oeh>h8Y2Trah>)`!|@wIqHIVorT$1E>+9Mua)}1xQ`m_mFgc6G z_QAN1>Q&4#t;R}4?du9;fF|hrCy~#)bTW7-*7d7VP#rIA6DFJA8OI)MP&OgqEYpDm zCg7qTn8Ru)pj!v_$ac%Ai*{tk$xyPH+(H5X{b8K$ddQiV#E3uJWkW?e)3{oKg7_Sr zTPEF0K3l8KaYPy47pE7LhGM0vssNJZ-)N*%V}i6W1CRqV?P17pTEAsV!@lwAZ)a}P zg;j_4DdE@aBGESN0yS6KaSJbVUY=K3pZU?y8RY~7Jhi}_1t3b+yJWH6yRnNur~{PA zW?3=|>xh>*GXGg^rK@(QSnGtQW0F@byEZ7?l# z;;B&9%7Z9TA1kr$Bg}Lz{}0J=-dw@=yEit?VTT;;cNFR6zUp&}=oB9MT`R zsFLl&NO->8l=B7{n_qG*9bB0EYJ{nloU+YC9khORpKYVEGSXRWE!UYT_r2bW9UuXhs`HIVyNLw;`ieAw z{WxPb8Lcx2mx+6kENllX2Buj$QVg=Re=~eP1coj^ijMti7oH`ydZE~PsF`z^>Xe-$ zfEJ4rFZS7c?Dlo916Q6;gWBguP%6DUPsR?MsTX=hy#0~!Oet4t;Ke%K<~|Q`p(6*Hb8zuQCxSnm&CWh3;+5Mon?O!GLHIPzJIKl0-nPt7NSwmo5y*+t!X z4Y)08=QBY6-Y&Q#$>R-*A@yY7i@RfI!bshDiuL%x05CubB-4jY^PnQ5&<^lF z%KJmI1NxI^?~@%6jRVW?-8$aiBZ4JTq_15s{~nQnc#jeg|9eD%(>@Xj`FlizeP}@% z;79$(5sLCi2c78+*87XBA3u;DM@a)DQ_62LS9ULT!f>|N55JV~bkRQ`3sRgf|wtI^sK?pjKKGwy@qqg9Fi+{4p^!@#=y*|-ne-33`W+H7K z;{+BN+|u@Z*XLIatFmJ(c4rp+4c6i6^UEu{P8qzJB9ETDqFm*~J%8pIDhV+LBFocYc)`5$S^a{uC8PdOuN+BNk=hgqe zQ9OtD@DZfPoZh1#I9m&O%;{f6>41Opf4ur1ML)kkv%0<3uL*v3zLg(}wuV-g)d+Dr zCSf&4!gJ_gr=QT7-FM?*dI-{zG-3HN?s#u?Y^{jmp8V}lla`f#7yIkz<(B1T(# zO!Jnepd@z1OJDNZF*ORUrCiC?1jpa1hb#B0y%&Q5_wiuzwGfyZzNXN7eXoyEFO}X^ z`=Bg4zQNu}9fEmNpG0f^@%jG!B@pSR{6ZgidUL&&8mAiIeqH+eTbHq8_QOJPF>(_i zmF{}LddE8pbfv>mCyBf|wsky+lb9+~$Zm1_(fTIw_-`gfu*u`l-=nM;)YiezoCjav z1GM0H06#z2Ax<7Rz)Bv6IZXc$t@_UVwhOpH#Pf4MQaIS(ZyMV}>N20eDv*5^QzmWs ztU9tP{HW;#IT1+ZS**7@-x91HvAL6F)CM zp!maH0z>ty!j@YLa<)E8@VpOQrs7-WSNIsz6Xgf{kluM*(Y3MDMA4@>Wo}UvzPx4b zH!f&!#h7MwE2FKst#5t%)n5FB{Ar-9MCq}>0W~x`@z=#<+{4TzH$vnufs+itr@N=a zbqk>v_wbXrBhs~oI-Mb`XL{Z@TZ3tJ-6k&}-#!Fq7qD;0EiE+TpCN;5S%EyuI`cJl zf%x4-^eMv(3*BMfqG7Pstq727O7&u1Ou4D3S^e81z5dMsPt+z%c8M*F3!Me88^^RB zvu0RW$98UQL(+EVWmxQ8{nhF@kCL;aaZ`n_#+YC6D4U7NSOtBj*Z%$r&OC5TStja9 zTdsI!%jA%;s2!7*zT;%|FpUJF#yY_DonT3wt3yrrd$){*A4$J7-K>vCx$>kouM1q7 zObXUC&Ul^7_LeO>mZ^9aYOS$0Pskb0Hq8JGSljemvi^+{jJnzYj!L8 z4_cwWJ4qlnu3Vk1is2?BNW&eb7x~mzG1lq;7CpL8znzs?`zM)!mHLtwp;CwPnZGcJ z|5mcvTcFX`liP;{D;~wtURh9ve$~|6Web_7U-P%c_YYMBR!&~?Ml z?3`4ZErk}|G?A$UcAiLvpd|{`wL4G>Aa$iFe${`Q|IGPlYJW2#`$T=ZUduqQ)9OoX z?yCUA25uW_$@IRFrHvGdYDBZcJt?w0nKvoVzfXzTf5}PjGvqmIxS%Wl6Kjnjc}Q-* zRF@HG+Ej>BRR$u4RM$wNm84S4lWuA_oT=P3T`w>#g}^>M?F6?Enkz`P%x!RMHJHs@ zP%I`{PGQ@pVWchU_VV%~%p(h3F5F&>`#Fr$P`&tb^yG|5uRWY)Qg`~wj(*!W@(YaJ z(r*367r~7+M;#sK1-KVBoOO!8-!# zJb*_QlXG4u%!gvYdrLiD+%&m=g!6;W2RQZrD(=0bn(o$hQIIZ8rAg-#1f)yv*Z}DQ z3P_9eCcQ*jXd(&%(xofC2%+~7ibw|m=`~boNvH`B;QsJiYu|O&*>~@K$2eo0e=;(Y zS>M^-Ip61;Til~l(K<ZJ3ZZlj~P9s zT~MbVpw`%%5R;Ic$BH+Vc$=|WeT=0+W1iq{<2k}QeW`e}_d@|quATG!4eIVORyMic zQ31UmOs(UCx+VIic|T-%zN{@lXSpHNqRf;p=0_Rr>jjhIi>fmY)rB!Cpc1Hhen`Lm zCQT~!TB2k%E+Jjlj(qDr92bI zWbgHFRim=6=yg6}e*K(W2j*#MQjGtEw9JjBG1Vf-U=(QJiJZf)RM6j(m2Yo*b9h(( z^0YpEy9LF@!(d~c7;5)jC;AIxddW6S@W8&&825-=y7b6Y=mSaEf-Gbnxerlo@CH;K zcLw;~xW=pt!&-F(xB4S978s_FVqBm6I6AZHo6<$!!aP9F$&SaeQ80*XY>sd!9kHO% zB#+RLNN2bq`TW`~U9vB~-S}=kpNho3*JR}0@`~K_;%;&v)UbRHHPzH)fhJ?&ySO14 zOk=p^tdYMWJL&GGf`TAMm3q;i&2_W!quNv(1MG6Ny?BDStRe!_n>iksT^qC4FN6d8 z6r~QI?KCm-{Y=)}sPUaPgZW2YWzmB-*kHpXw>c9H@Q;J_&c)p>8kq^fYv zL8WLxHz9~ekUjs|m>|}A$@9N(yiQo})%vwJ1(#e40jyw|<~MsJyD8t)CKY%O(9PAC zG}R`)d8J)(^7y&CFU^I1-zo51CFxlwb<97Uy+hbja`C;y3EcA3keaSA7y0|!NE32Az2=eYS)ec0 z*+p`i1=ZDlsy^2GLDJ6$ZgdE% zaTo40$-lscGc|@ zm)+lR=z#0RTzLpHJ}2(&Vx&JMt2v^)jN)#X)4RYV^|j->{lTq+;I1{(<8Wb_d4K*9a5oaE9DDz-QpHl(73?)8;|^ z{LOp!S`GACWST67-#zZacpS+Px2}b#7H+G??#Ou9$GBP`^QVXTuWCRIkGp%WmhDPR zi;&t_Fy-e&kdVKW99dS-xp(U-$alA=p7-P(VgB=5Qj2= ztGR*#y*sU8pmF|+>x8v5@MKe$!KPj7DZaoq%r*H=KK7A5k|+^n~v zjI4FXGytrKlgj1=BilY#V((A4t^|%h@FjIeuPJV&m1s1-1+jEr{_|T1lJGwC=Ucow znCR&x9$e2vfCPW5M;Xp>BJigW9Pw2b8rYAH1bf*VVaSw32aUTNp_-*|^|H;E!4t!s zBKcp>-m-UTEEsq3FYLE$l}#;?n2oZNDL*H!?JEk}?TED`Z5n3n zRA)2%D}L-h!HxYZ(Cz;$+UyE?*FF5OS}&K2PwR34{|3Z{?cuax`QZU4c`%wEs$M3V z_J*nNFGj71*)ag3$L~ZY?nF0jSbz`xwX+MbxhB2Hm)uh0P0&rp0l2&T7p2onhJ0#e z>uLa&FG&(7Polzt_ooX1ir*_77=ZY@0&@lb0e1n#U4gv-l-|`)c<=`d2EYQZkX?8H zSWILY00aIB{G9^_PM+w0m>4sb8kvJJG%P*JwX%vZ&?KI#-PPI5KC<eB8)4WJr}0odyP;0xn*f|zuy+h%u(SX_zzp-}4Ifhvz30yQ1ZgiP3#`(s))Hoc^^ z>ipJwHZ}vY*`_PR{C^L0BjP+y0#>3`tn3s9a4DW;!}DPI%z&k~(|iiJn>eVJ&aaCe zo*QU_n@~`^Kk}wJFcQ_&%}hh%`i`_b_ME4ztJ4bJGweT|G6Wt@S7v2rxo`p)f9_;f z&zyYETC3nyiZ8vYoU2*~YCOPE|JQZ+DLm&la<-`hbu@g?onr^;wGDIx-#=e{>Wzz8 zKHni+iU!fqNTGBJ<15~Fg4Wr4hZ~B5#?sE$fEtl2zaQ7B?Qre?fDIqdM3?GxrH(~Z zpTx7CSZ8R*Wb-aiA4#7CU;>U%D`U)6!Z(I@%7&^~Ah=-3V=wMwamPPGpF-5jHDzRW z$7RmAH_}0*j=lh&KvFA8=9X*_L#QHHG*XXzML^dBeXFR#Qgvj z90!j6He`glIqDAiq}vBOYPj2k%i&C2Y==*)>ew4Uk-)RwkX(I>(;wa-)9bYu)B#VO zfz+kUfQ(q2GY1anYV?`)a&s27>1&qDl8u06Whyv1st&VJ{$V9WXYdw8CqLikIKS3z z^ohJe{E~Zj}CXJ1R~g-O=kSc zoFNVvXQ$URS3@7b>{UB-ohz`oVl0hqyX`39f)?ousL_{I(f()El)>z8b;#r*9-puB zfVtGNyiKC+MnqKA59d?wlKKa^mQFloRE!_`ba$CXgBBue8dNpKmI4#gz=l)$T9BI` zYo9vrM6RfosGT}zM#5PgGUwt}AAWZ3)nF$zB%we^B?z9RqZtYM5voqMYf`3OAY;hm ze{>jTq5yXov+epJhZ>qLfs?GII?|A|sihyf)=P!Z7~_?DQ5R_7Iu(0X|9WJ2HRT zY^xi0jV>N3Ivbv$x|9sT{-qtlLAk$ketN$|l-<)lciI(|zm(qDLd(_i;ivqCd&d(= zL7sW+1x3rH5zRm4Jox?u;wEJ}f3hB@Kdxwuz@SPF_RV&C7kTNuzYT&XVeF?BC7%z- z0a&qQvf|Z(oXi6Gx;=p+9h8)qlfy}RmH#X%!1K(`WXqy~#IALFiaC6KFxOZN6KdeZ z%_Ixs9u;UMk9oj4Tpy4A)nX!ml-@%l5JPAu9d!QY5xOEU1a1jFIDQ<6Uq{0PwJjI&*n6B%C(GPv7FvP4-@i+*}j2h_CkW{0p-TURG4*M=M}LI;)^Zp`l1 zxDLnaH6~)_Qp?fl0+{B9SixquEYMT9?TYr*4zxJhDJ(F0zItHnywRlGfl7iag06Qz z9{WmeSZFfomP!NhkJ>JJOZ3;;*99cn-`l&kbmcq%+tulMw!1plRJbp}2DAVik5gb0 zgt0>ev_O!v>=&(r*?au#$E5J`^PjQH_O2-8p9#}^6S5XJOT9t_q(BihJZ5MWbj40w zzj|)3wM&tK6h09jv(N3=e+%+gulZtM z5ZLi!_I(-nkId*RvB;6acZFXtm?BvrB>hh4uD$P`8`MS@tmE<+RRtM3-Kz>h_tUsFPx!T*ooVdsYEE~HyFK$0Fz3+6rH@Zv= zA7i&BrH*p=}R_I5EHutI0I9W1U7dHQ*DPXw%qDIyU@)NYA{7eB`)f5 z&T*F;V#80G6TbfL5R_BQB*QGexjQ^k{Q^suf-;fIB)@w z(|R&EPQ?k@O&$(v7ON2@#bV{oL-cG%tDZ!S{}26rh)B&ii={mcgvV9%4x{a{B!rJV;I!dzqR zK8(j;&)IO%SKokbQaC!nWELSMi7|&Y8%Me8bdTd+>D5~5Mk8LsYXWH&dmB`--n%3S zl3=t+J0b--BmF$%OLFUrJX52*N>8(!4!+ZrW<97@li8sAiO(})0(J9d4Gs6t^JeW_ z$6eOa3np6yU55Rwk*-f;lMMaTx@`|Ak1y8R_O09e>-*E)c7$AWlDmvQe>3ryOEmVY z2#`3}X?-WFgLorzROV!(1QlqN*(vG)dg6Oh^S8<(A)+X$ff}FBRIrTm*E1**kO+Y- zeV{^_;`TRFRnEohh6C~3UAt{n&(IF z;#RNs2AAtpp-Ix!P+i%8C)no8&6pe1>CZvithd_Qmu0RL@Zw-Hv_2s%+GZLzo&>iRna`T zYMueirNi}0-cghARpbi9hTQ+InE#v5fu8!$Q1<3AoS8My8BssBIO$l+KtJEU=vaF$hg2rE&aOev%!w%2(1ruL zX6#*~gz$OQD9ugho`oQ<5w!m|0~0us&ALsWC%(_nu!JEyLpwg9^PTQhpBfos6(B(X z%lGJU|1ua(!$z)jH6T~o$>C$OqK1!mcYDnl&*ZO8n!o{yfDy7W(dCf#!>ayZCY^M= z{w3hA0GxCd<#6SL3k~ioIuZ3gZx?H)h2io+0Z4j=Sa1aBBrMQp$`WBHbf-67*uQ~W z%_ZxloFEQa8Wc}`m3py{3?9bp6b|z*LCfu1?)6Qkckpk1hxZ8)r|A7z9igrDs@Ha)gij>}%2nY7<2LW%uIhWzb(y z5E4?t#XQrHACFOWi_9>8=^pfH2%j->+81XlWcVcu(;W7AEE4-MxNOQ94D6tZczf6m}drAEg%mRyE648@u<(V7uavC?nDQ=WaXw>q6;r zb!OBL4KwQVPeATx`j@#2%YLl~;3ycZKEfAx7Rcp~Y$DOy$>xlHPSC?nl*#XcUN~Je{YDIe{M^F zz}1@j-vvbe-Vd*Y131q8Gw|o`i@t?^-BSQ0Uu997l<8jsz;o)i0 z0#2tKS7Rs`4IDfEt4yxOD==RExW@jME&E3tV08WamE*ru^M5TfI7>cqH1df%K`QR!l%0CfCS6{SPbPS05((P8kb%?R&Za>2`SL`r_~RW^^Yca#3K)s+PyRb4rn z^@g8WY+>L^CWcPA=WnObF2umj2{D-29ULs=URbwnhAr<>07FqB{HT?O<1F&9dYuF_ zEq7MP9WNe3{lR5DCg;}|4t0x%?@5Shm6t=uBJ!5k2Va*$rb zp2tWEGb2}4BLX2e2p`@c#K+l=t?nZf?_5fVoKfeG_xT|Qv0LpENAH@))`Em8_+5T{PmlNKVSIJdo^qkoFMceCiQmfZ+kps(u|50Al4O~`w9kC|? zq~Z$4cNN+A?NWWh-U6~!Hb_nicXaK_{pPA}g8JxEy9RIojU4){6qL4}D)Aq=^wZ#k zW-2y>7hk2Ro_vKC=H%pXa_o~lvdF6Bu{0akRvTpG@`<5?5&~r;m$X=&rzoyeg&^2-JBwk- z)!mZwpcp@xAn*J>9`X@rFUBDU1x8!KRB=% zEs=E_d4ioL+6;Lp0$X!V2;k){EiJSi2#Rrfkv<*L{zV?ArSp$^n`sjnKEk!ypaTJ) zE@Rzz6Mi$#YiIU_srRwHe~I=*%-WOJW5s(=U%AH{UA%muxphmVn8nh}R`*vka7 zpJ4?w2W_6K@*%!-x9O-@FZAAX=h=|sdvUhBnBtJ~MIP3akQ|*tkA*F)-n)JD(a(0J z`D1&mLg=`=#U0Ib_|GM&R+-y#I9BJ@mU9~c$U^1CHw^Y=i&XYf3fpc|!7Wx5+oi&g z&rqI9o=N6Wy)9f~*RY7?hwu3^wY`eO#9{({ZBP+GETh(WiigML*Js?ZHH265JW&qK zS;FrLRxn%ww>&5#XV_0#sEwpPmuDN8aAPb!momO?uD66~8ZEInd@WBxuVi2m7;xVR zHxbDx`L@Qk>G?vu@_MQuh!`g-%O6+g%VsJoN-%gxuT(J7D50Cft*NpEmQ%nAep9Cp znB^mU_|pSVX=WHKB|*D*4lfRWgb&%4K=&)TrZva=5Y8Ak=e5P|xMvk6@E6)0SB2Gk z;=z-~5)$^rmkRe8Sa4h$%Ba+JT~=Jq2Cq=;i<->tT{5`@d{xnVdQatK;(ze*vF$w{ zXquCv*VBEP^Oep*ouA;7SlYa05L>EKxO z>xFEM>ilD`ttZ9(`Jq<*p=d! zz-^PB&i218vWv1apT2!z=Ks-Nq)GsMn#a{MMS+ zo@(jMzA579>#QP|)M6=7qXrd|?P~JjTCNZ=w<@EcRAr%u8&4}Yd89xikU>)rmcut} z$HfsW8q(|x?1@nA)b%e+!q*3B6CZaI-+xV!QCflgt7$LP!6%3=k`%oXmQyhH;3+Ha zgN?a*rbGa;_g(WT^dKrc#4tPjwd32dp%=Nm+NDAfd%aXZzh`#ETFmZoZBXfq6SJ=B zwZ-ao{bfg)MkR0$?eB_Ud%3=~;)$m;`__p4a?~8gguS^>H?zcWu0k<}G5jt!5jo3w z9dx7kM}H1es=&lZILljCTt6){>^V!eg$0?Od5bb(`mC1zo1Cri+XAEs<{##Ilub_Z z`HSk!&utI!o5IT4wMWJ$rsX(0D{fr!)=!)ZB|VfvB1s*~jhJkvuq(NZ{u)N#OL_)+oiO!=$`!oAmy^anGQf=n2AkV#?+3 zu}!nx$}babDk^sjEV8cUFqwbbvWq)$gnCYhn^tUuAkNwa%I$9=IUMZ=Ef)GV4?SN< zv-OKN&ml#DjVdv`D;D;;S8TGfF*c_Wm&@q|Lq0b~%h?Mal?;@{g+xD^Bu{3--qZBo z-Fsf$8Jis9;^Cneve=y(^D_c`C!NknMuBE#0QOL^guoYZxJpsF9_F%I&6kli{hF@e zdBlNU*=?5=y&BFcZCY_v(MX>S=h1q@q>6mvYSRnz~{#&3Ui~^jbd&e zF=3~3yYK^(rY&W0fjV++!&C>>MjCLtdKr?TEQwQjG@V3A<-|J!@Dug4(jU|G{DGub z3(w&+z0&?b?WCVZkAGMQo7F=&a_(ywyEFODxO641;^d3RhYRaj|Jege;|G(>v8p!~ zwy!}V+fdO{1V(fWQJr$Ke7($Em%E2T)L?RiWT(_21{T13g8Ih2V6>sCx><6TV?o^G zb#Kw|^W1u0l2{VX>tYO>(T=(kA$uYUdpeX3p2JY5<5*#t-vm-9*y%C_F(yyPH zW|jGOO}h$@cbTh`eyU@>xXxaXWE{ET8Ib1^yo?ohv%P`L+F2@DBm87+|Lj5N)C=2_ z_j==CNTZ!3vade@(z~csvT{GvFM3)wcj>o9@e@|n8PRtRHHmCE)9PUMN-LG6?vRr8 zak4J^k~F<`)4JX5)=mvZcR=vx_=q3qwcs|}`RQMmBv@^m^nE9skLxP3iBbiz`%2y&0JQ#HAB zA@8NwO$5QygJ5dlGKTZqLa}CNAed?E&@(ACLK11=Aeqhf+}KQ|$c{Ahi$HsxyaJVXmf;_&`pQgZfeDk%T zG}-HO7Uj^yCBN~{wPGyc!~`m5g6)d(3PYpUouz+|%ikj6&HeV_wM$C>mVoSbb3*-y zTPVon`+G?zf#R@i-HD5j!sN}ANaUquWQq*6w0K>87-z~^|nFy+Ol;N*=k>#x$)oQs@YF`mFwLyijMpeV5!d4 ze6}^jDh_H1aEswXTXFITc=50rCime56VCFAV9H{9yu1-l>mLt-)v!DG^FQXz`SK`;#9t zA%74!)9n_^sZsm?m|#VRWvc$g9s`LdxksU<1xx**o~?AGk29EiTnH@+Md z;Uc4L$`lllZWt@7A@AXr9`w7ih-E1J!J-XsIZCk zoEe>@A#>Nq`Gfx0!DO-x%kS@Ra!!YWyx3j7FUb-cE>f_H^1R(qEn&? zLJ9!oBV~%qFS&SYBBa4{io;*k9o8WHPx6o$~RQpG@L-5V^|RN}Plz`&D)QQA$07u{zEvrrt%!AqaEVN!_(~&@FM?*P z?=XNP{)w-0mx(q655laJiZ>)iM;lvF;bt#Q zh-)EF(tqHR7w)OENz7jq3~D6?9?D#PDfn7DQEkJcaYqzvN>iGb*gMFrrQOI-zwxOn zQ*P_x{hsMie|SF5!LnVe7&%uoM!@a#q|GYr>w~YiZv<<&@-(+8-qsiVkcKz(mgaOw zIz6DVPcp7mi?^$aQ0Ww6_1u?uNtK;WPhqo7XTM%6caQUkb>c(wdE~hXb~J?D$=sVd zgzv4V>R=QbB{pB4Xi-s~A~YLdlvKr6TA$lHYr6{~*tsh`oQk1hUOF(RnN?8bx-|8^ zBsG)%X7%Dq8278}(WN_QBxh%*V-`(Sn^F|%71dGV5LI8<#oHx^IU_guUMWrW^L;7e zxKs=~n`N4&Z`0wjnSD)7ZdYw-ObwCG=;sq(cd;g#BY4!P*$%Dpvp2oYY=$j!J3k5o z>DKu9yP*1b6{=y-2L5dvRbmGGWb1L()3Ru##urN2n4kR zciJDZaWIk6hH`Kq0VIywQD8FzpVJT_?vZRR5q##Z6V7q1Pm~zGn$tGy_!PRAuw}h_ z(k5&-vV{2_->XBWKS(UGelK(rX7_ckdMoJF%ArVcSIsRtoV*!Fsj8fz8G5#5GC2Ec zEC`Te@xNtiv1rc4FP|iB{76Xr%t=vW%-J|P-#6F85m6QQGeS`v-B~2?wB^NSyX!3$ zF`#2AW>i$K=LXhfe`*PeGT+rCAw%cLa`M&&nQSdtGIy^vL}4fVCh?dneDYuXN^8^?Ad&oS3F4#(f(0je#r)x%h9%N$mbW#G>s<@Wp9n~U&eplo*C$w z*+@H?ctSG1S9jQs*!(6Ap?^Dbu`YF!vnSS}g6!EfrNSroj~2*NOI_AVqkjwoD~w7q zC615({8P%i6SR*w^NCSA^|NmuUpFzK)Aw%(B}-t}bVR=`NZu6~5F(4A5X6Iw6yJU4 z8E4pg;CMqGeE+Vhn$1ntO4+(L2leYUIc9G6V`68Jfz~pjU7|n-&bUn0;;w6c>IgIE zr$Li%Qn*-lKKMDF+a1e}dbsrU0Cn%9y1`Ne`n%a(Np}>5ZWtSmH(1>BfOHJ2HpJ?5 z7wwet>_xGD(X|scC6S9qsQCC85n9}5jR=z|{8-j@monGqAglXDNc+8_$a^x}!#U!R zU&L=gie>I(k2sN34#9Hrf-7{m!7rJmS@p5_N`EFlG1}z)L9&{nCHnEf_OC}w@Zz0z zVWpseW4`!B@i9^JlJ|}g?8s(nQZFXcuz#bSTV=!IS5?GeX1D z*KWDowmqDe?ORg%w+A20>d!pYd)t3KXn$lzvNQa%ZCmnk8ef9N(^te$81dw(UC-&u z{t%}KY4DHR7U97lcVqNpovC*$!`}2^MIYCCmNwe|qJ~{d$MJsm(E0ph_^X@HnQsAg zRwIF*QIHAE5RuDa;BXtY40ZjJ7;iB6GSDKLy>i=p^%dp=>%?b`?(+;Ci6xTUaiM}I z&2%|?XR^^hpg0Z(`b^;%Y(Tp(sa?#V%_v^;xmS7Pbsi4hCa>ANfLp$q)~o9!my2pq z2@#ul0Iz0Bp4;E3IWLc!FT03jp4DEVYTvLNd?6udd4I8!)8o1G%~>KDF~aNkrk_F> z1O`jaW8@VjmKY`&`y3~-Z`;&q_*~p|wkaJCWv`m-98q;>6W-|h?S0qJT${3)qfNLF zeE6}5_9#lm$;b6s&VhqCM16~5b0p(J7g^c9ZS5c%6T7gk@Rk3ZgdHBYe7}%D$&Xb+ zFh4WsuOzOHoz7DCk9T;(ljy^?Aj^pr7s`s_Owk|`>Vcd|tanI1gK%MRb|3}ujpHQ6 zIFj3%@Inh&@jzuA`;8I?-HNadQ$vCP?W)-r*;{RGO#Wi4e1BJM8rpf*@yj)xmdB|Zybi6B7Q(Q4CnXkkZ!b6k!<{4 zvDw^r=UB5#%YWNH=J4$P9ANQ+c&X6(QhKfbnjuRDyTKx~V%M|t)bQ=g7-F1AWA|yY zNHqI*t8!-PHwSidH`=BbBq|Vc#AkYVsznvZAH<&%A#f_v znX9SG+%njE&e|US71BmR=!2>~A^w<>qXd)Rz=TnHJpow4>C%MPYj{LYKPtij87Ud1Cge(+v^M zmHMJf@wcA&z`U7$(YBk9<9Az4Ap9xQ#NpRl$%GdqazsJ=h^6lAPtpfEHjYFvwfQdw zA2gd``y8j-3~O5o%VXG)lU4%tbu(zl;#%(-Wd+NAp+Z1;4qMu)17rH_#L|CkB)8H1 zv^djWOpGt%KBor~meb!`cWoBDKijEa^R=+6r@2w}wbH_)C6cWs=MUd2xHI}A8~3KK zKauHKsdTmv@DU#0boIQJgJ?+)o7H>Ns2rT_sm=B36@$7_nnd9WUHk%p_<@Xoi;gFS zp;b4dpPGf=QwFgrGAqB?%Yap@rZAtVj76DZxJOno$|ccd*N2l6DIXJl&75`#pX1sX|>Kx?(sUt4^z!o60JE!}MW zZcZ>V7IS~-#hzacJWJiuD^cIAc%OUP(UZ+QzSL@|FaUTCj!j9?%@9j!I5C!R);>>w z*80^L-Ku^$A=fd6UH5LJBZg4TRvHSm=1c};V`LMrPh?ddhRt9M3F`~(5+5cK3=l2`%CqB*tOv=(A}r`DGUr_R17M)YnHK~y!XmQYHPv(Gx7no;E_EI3=TB}MM)^iR8gGBOWR^-=UsL|}=C|QkYnDlvc`Ej$ zJT?1se$m@9l@HcT#$fXvpP%puMEA+me_479d2pw3IZB<+#->~ri~AzqyFwnF_owA( zv8BTG*Xhy&p7g`+5!CW#QY{G~pfy^@r5yhC&rzy=XnzxvyxaEENA=Zomrkgdm$~n* z;l*r_hCVdC_LAtH%qLkE-ltvp*$=*c`4Y9*)~js#{jcSp${SK-nZVokSj2#PzUgeg znXyL-_sRJWy?u{O=8Kkoe=}1Is;e%hZ=?E!RWjxxz<6$~e%2Xz8`hjgu$e%e(&}|C zlLqghqynAnrken8^R5+B?T*dq&3(4WgzbnTT&avf{(59rAE;dD)|N`6qOFls9(vm; zPN>c!Kxwh$>=D+iQtC2g(NKE_z-!b7#VqcNzRG2<-L@qlg}3^h*f{WaBi<-tx@{3D zis`OGzD`+yIgRz*B7h1!HGwe9#$>m$k90#IZa?jP5B9dt;8cUR0NXO)V8XFFk`C@x z?N)`h`qA^}>DFM{tN`08;3`7N>r!$-@Fy0)e~SBKc1(K*TJXlK0srFT$%&}tly?fN zbN?M8g*R-YqY{j+P&Kc%ZPg|gchU}?PyC;pDW&`p~3tH zB|zeeErWUW5Z`&CG(dY55TjJSEQOLT03-@;7gaVPm)SorII9W&J2Ug2iUH#K|6z>% zS3i<}Gi3k6NPH#Te_EpzsDYOy-YNgfFF;xUUs?Ri3&%gnFY$5rJ&Fo$iYH$^O`)c& L{iOWStI+=k_i*-o diff --git a/doc/user/project/issues/img/select_project_from_group_level_issue_tracker_v13_11.png b/doc/user/project/issues/img/select_project_from_group_level_issue_tracker_v13_11.png deleted file mode 100644 index 4612ae254d4a6ccfad30408f188077baedf6304a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8863 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 diff --git a/doc/user/project/issues/index.md b/doc/user/project/issues/index.md index c535d16bc0f..85c30fa4ae5 100644 --- a/doc/user/project/issues/index.md +++ b/doc/user/project/issues/index.md @@ -29,7 +29,7 @@ To learn how the GitLab Strategic Marketing department uses GitLab issues with [ ## Related topics -- [Create issues](managing_issues.md#create-a-new-issue) +- [Create issues](managing_issues.md#create-an-issue) - [Create an issue from a template](../../project/description_templates.md#use-the-templates) - [Edit issues](managing_issues.md#edit-an-issue) - [Move issues](managing_issues.md#moving-issues) diff --git a/doc/user/project/issues/managing_issues.md b/doc/user/project/issues/managing_issues.md index d357f45b1e7..0f02eec0ce9 100644 --- a/doc/user/project/issues/managing_issues.md +++ b/doc/user/project/issues/managing_issues.md @@ -4,148 +4,228 @@ group: Project Management info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments --- -# Managing issues **(FREE)** +# Manage issues **(FREE)** [GitLab Issues](index.md) are the fundamental medium for collaborating on ideas and planning work in GitLab. -Key actions for issues include: +## Create an issue -- [Creating issues](#create-a-new-issue) -- [Moving issues](#moving-issues) -- [Closing issues](#closing-issues) -- [Deleting issues](#deleting-issues) -- [Promoting issues](#promote-an-issue-to-an-epic) **(PREMIUM)** - -## Create a new issue - -When you create a new issue, you are prompted to enter the fields of the issue. +When you create an issue, you are prompted to enter the fields of the issue. If you know the values you want to assign to an issue, you can use [quick actions](../quick_actions.md) to enter them. -While creating an issue, you can associate it to an existing epic from current group by -selecting it using **Epic** dropdown. +You can create an issue in many ways in GitLab: -### Accessing the New Issue form +- [From a project](#from-a-project) +- [From a group](#from-a-group) +- [From another issue](#from-another-issue) +- [From an issue board](#from-an-issue-board) +- [By sending an email](#by-sending-an-email) +- Using a URL with prefilled fields +- [Using Service Desk](#using-service-desk) -There are many ways to get to the New Issue form from a project's page: +### From a project -- Navigate to your **Project's Dashboard** > **Issues** > **New Issue**: +Prerequisites: - ![New issue from the issue list view](img/new_issue_from_tracker_list.png) +- You must have at least the [Guest role](../../permissions.md) for the project. -- From an **open issue** in your project, click the vertical ellipsis (**{ellipsis_v}**) button - to open a dropdown menu, and then click **New Issue** to create a new issue in the same project: +To create an issue: - ![New issue from an open issue](img/new_issue_from_open_issue_v13_6.png) +1. On the top bar, select **Menu > Projects** and find your project. +1. Either: -- From your **Project's Dashboard**, click the plus sign (**+**) to open a dropdown - menu with a few options. Select **New Issue** to create an issue in that project: + - On the left sidebar, select **Issues**, and then, in the top right corner, select **New issue**. + - On the top bar, select the plus sign (**{plus-square}**) and then, under **This project**, + select **New issue**. - ![New issue from a project's dashboard](img/new_issue_from_projects_dashboard.png) +1. Complete the [fields](#fields-in-the-new-issue-form). +1. Select **Create issue**. -- From an **issue board**, create a new issue by clicking on the plus sign (**+**) at the top of a list. - It opens a new issue for that project, pre-labeled with its respective list. +The newly created issue opens. - ![From the issue board](img/new_issue_from_issue_board.png) +### From a group -### Elements of the New Issue form +Issues belong to projects, but when you're in a group, you can access and create issues that belong +to the projects in the group. -> Ability to add the new issue to an epic [was introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/13847) in [GitLab Premium](https://about.gitlab.com/pricing/) 13.1. +Prerequisites: -![New issue from the issues list](img/new_issue_v13_1.png) +- You must have at least the [Guest role](../../permissions.md) for a project in the group. -When you're creating a new issue, these are the fields you can fill in: +To create an issue from a group: -- Title -- Description -- Checkbox to make the issue [confidential](confidential_issues.md) -- Assignee -- Weight -- [Epic](../../group/epics/index.md) -- Due date -- Milestone -- Labels - -### New issue from the group-level issue tracker - -To visit the issue tracker for all projects in your group: - -1. Go to the group dashboard. +1. On the top bar, select **Menu > Groups** and find your group. 1. On the left sidebar, select **Issues**. -1. In the top-right, select the **Select project to create issue** button. +1. In the top right corner, select **Select project to create issue**. 1. Select the project you'd like to create an issue for. The button now reflects the selected project. -1. Select the button to create an issue in the selected project. +1. Select **New issue in ``**. +1. Complete the [fields](#fields-in-the-new-issue-form). +1. Select **Create issue**. -![Select project to create issue](img/select_project_from_group_level_issue_tracker_v13_11.png) +The newly created issue opens. The project you selected most recently becomes the default for your next visit. -This should save you a lot of time and clicks, if you mostly create issues for the same project. +This can save you a lot of time and clicks, if you mostly create issues for the same project. -### New issue via Service Desk +### From another issue -Enable [Service Desk](../service_desk.md) for your project and offer email support. -Now, when your customer sends a new email, a new issue can be created in -the appropriate project and followed up from there. +> New issue becoming linked to the issue of origin [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/68226) in GitLab 14.3. -### New issue via email +You can create a new issue from an existing one. The two issues can then be marked as related. -A link to **Email a new issue to this project** is displayed at the bottom of a project's -**Issues List** page. The link is shown only if your GitLab instance has [incoming email](../../../administration/incoming_email.md) -configured and there is at least one issue in the issue list. +Prerequisites: -![Bottom of a project issues page](img/new_issue_from_email.png) +- You must have at least the [Guest role](../../permissions.md) for the project. -When you click this link, an email address is generated and displayed, which should be used -by **you only**, to create issues in this project. You can save this address as a -contact in your email client for quick access. +To create an issue from another issue: + +1. In an existing issue, select the vertical ellipsis (**{ellipsis_v}**). +1. Select **New issue**. +1. Complete the [fields](#fields-in-the-new-issue-form). + The new issue's description is prefilled with `Related to #123`, where `123` is the ID of the + issue of origin. If you keep this mention in the description, the two issues become + [linked](related_issues.md). +1. Select **Create issue**. + +The newly created issue opens. + +### From an issue board + +You can create a new issue from an [issue board](../issue_board.md). + +Prerequisites: + +- You must have at least the [Guest role](../../permissions.md) for the project. + +To create an issue from a project issue board: + +1. On the top bar, select **Menu > Projects** and find your project. +1. Select **Issues > Boards**. +1. At the top of a board list, select **New issue** (**{plus-square}**). +1. Enter the issue's title. +1. Select **Create issue**. + +To create an issue from a group issue board: + +1. On the top bar, select **Menu > Groups** and find your group. +1. Select **Issues > Boards**. +1. At the top of a board list, select **New issue** (**{plus-square}**). +1. Enter the issue's title. +1. Under **Projects**, select the project in the group that the issue should belong to. +1. Select **Create issue**. + +The issue is created and shows up in the board list. It shares the list's characteristic, so, for +example, if the list is scoped to a label `Frontend`, the new issue also has this label. + +### By sending an email + +> Generated email address format changed in GitLab 11.7. +> The older format is still supported, so existing aliases and contacts still work. + +You can send an email to create an issue in a project on the project's +**Issues List** page. + +Prerequisites: + +- Your GitLab instance must have [incoming email](../../../administration/incoming_email.md) + configured. +- There must be at least one issue in the issue list. +- You must have at least the [Guest role](../../permissions.md) for the project. + +To email an issue to a project: + +1. On the top bar, select **Menu > Projects** and find your project. +1. Select **Issues**. +1. At the bottom of the page, select **Email a new issue to this project**. +1. To copy the email address, select **Copy** (**{copy-to-clipboard}**). +1. From your email client, send an email to this address. + The subject is used as the title of the new issue, and the email body becomes the description. + You can use [Markdown](../../markdown.md) and [quick actions](../quick_actions.md). + +A new issue is created, with your user as the author. +You can save this address as a contact in your email client to use it again. WARNING: -This is a private email address, generated just for you. **Keep it to yourself**, -as anyone who knows it can create issues or merge requests as if they -were you. If the address is compromised, or you want to regenerate it, -click **Email a new issue to this project**, followed by **reset it**. +The email address you see is a private email address, generated just for you. +**Keep it to yourself**, because anyone who knows it can create issues or merge requests as if they +were you. -Sending an email to this address creates a new issue associated with your account for -this project, where: +To regenerate the email address: -- The email subject becomes the issue title. -- The email body becomes the issue description. -- [Markdown](../../markdown.md) and [quick actions](../quick_actions.md) are supported. +1. On the issues list, select **Email a new issue to this project**. +1. Select **reset this token**. -NOTE: -In GitLab 11.7, we updated the format of the generated email address. However the -older format is still supported, allowing existing aliases or contacts to continue working. - -### New issue via URL with prefilled fields +### Using a URL with prefilled values To link directly to the new issue page with prefilled fields, use query string parameters in a URL. You can embed a URL in an external -HTML page to create issues with certain -fields prefilled. +HTML page to create issues with certain fields prefilled. -| Field | URL Parameter Name | Notes | -|----------------------|-----------------------|-------------------------------------------------------| -| title | `issue[title]` | | -| description | `issue[description]` | Cannot be used at the same time as `issuable_template`. | -| description template | `issuable_template` | Cannot be used at the same time as `issue[description]`. | -| issue type | `issue[issue_type]` | Either `incident` or `issue`. | -| confidential | `issue[confidential]` | Parameter value must be `true` to set to confidential. | +| Field | URL parameter | Notes | +| -------------------- | --------------------- | ------------------------------------------------------------------------------------------------------------------------------- | +| Title | `issue[title]` | Must be [URL-encoded](../../../api/index.md#namespaced-path-encoding). | +| Issue type | `issue[issue_type]` | Either `incident` or `issue`. | +| Description template | `issuable_template` | Cannot be used at the same time as `issue[description]`. Must be [URL-encoded](../../../api/index.md#namespaced-path-encoding). | +| Description | `issue[description]` | Cannot be used at the same time as `issuable_template`. Must be [URL-encoded](../../../api/index.md#namespaced-path-encoding). | +| Confidential | `issue[confidential]` | If `true`, the issue is marked as confidential. | -Follow these examples to form your new issue URL with prefilled fields. +Adapt these examples to form your new issue URL with prefilled fields. +To create an issue in the GitLab project: -- For a new issue in the GitLab Community Edition project with a pre-filled title - and a pre-filled description, the URL would be `https://gitlab.com/gitlab-org/gitlab-foss/-/issues/new?issue[title]=Validate%20new%20concept&issue[description]=Research%20idea` -- For a new issue in the GitLab Community Edition project with a pre-filled title - and a pre-filled description template, the URL would be `https://gitlab.com/gitlab-org/gitlab-foss/-/issues/new?issue[title]=Validate%20new%20concept&issuable_template=Research%20proposal` -- For a new issue in the GitLab Community Edition project with a pre-filled title, - a pre-filled description, and the confidential flag set, the URL would be `https://gitlab.com/gitlab-org/gitlab-foss/-/issues/new?issue[title]=Validate%20new%20concept&issue[description]=Research%20idea&issue[confidential]=true` +- With a prefilled title and description: + + ```plaintext + https://gitlab.com/gitlab-org/gitlab/-/issues/new?issue[title]=Whoa%2C%20we%27re%20half-way%20there&issue[description]=Whoa%2C%20livin%27%20in%20a%20URL + ``` + +- With a prefilled title and description template: + + ```plaintext + https://gitlab.com/gitlab-org/gitlab/-/issues/new?issue[title]=Validate%20new%20concept&issuable_template=Feature%20Proposal%20-%20basic + ``` + +- With a prefilled title, description, and marked as confidential: + + ```plaintext + https://gitlab.com/gitlab-org/gitlab/-/issues/new?issue[title]=Validate%20new%20concept&issue[description]=Research%20idea&issue[confidential]=true + ``` + +### Using Service Desk + +To offer email support, enable [Service Desk](../service_desk.md) for your project. + +Now, when your customer sends a new email, a new issue can be created in +the appropriate project and followed up from there. + +### Fields in the new issue form + +> Adding the new issue to an epic [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/13847) in GitLab 13.1. + +When you're creating a new issue, you can complete the following fields: + +- Title +- Type: either issue (default) or incident +- [Description template](../description_templates.md): overwrites anything in the Description text box +- Description: you can use [Markdown](../../markdown.md) and [quick actions](../quick_actions.md) +- Checkbox to make the issue [confidential](confidential_issues.md) +- [Assignees](#assignee) +- [Weight](issue_weight.md) +- [Epic](../../group/epics/index.md) +- [Due date](due_dates.md) +- [Milestone](../milestones/index.md) +- [Labels](../labels.md) ## Edit an issue You can edit an issue's title and description. +Prerequisites: + +- You must have at least the [Reporter role](../../permissions.md) for a project. + To edit an issue, select **Edit title and description** (**{pencil}**). ### Bulk edit issues at the project level diff --git a/doc/user/project/working_with_projects.md b/doc/user/project/working_with_projects.md index 9469dead0dc..2bcfad97c25 100644 --- a/doc/user/project/working_with_projects.md +++ b/doc/user/project/working_with_projects.md @@ -4,7 +4,7 @@ group: Workspace info: "To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments" --- -# Working with projects **(FREE)** +# Manage projects **(FREE)** Most work in GitLab is done in a [project](../../user/project/index.md). Files and code are saved in projects, and most features are in the scope of projects. @@ -16,7 +16,7 @@ To explore projects: 1. On the top bar, select **Menu > Projects**. 1. Select **Explore projects**. -GitLab displays a list of projects, sorted by last updated date. +The **Projects** page shows a list of projects, sorted by last updated date. - To view projects with the most [stars](#star-a-project), select **Most stars**. - To view projects with the largest number of comments in the past month, select **Trending**. @@ -26,14 +26,37 @@ The **Explore projects** tab is visible to unauthenticated users unless the [**Public** visibility level](../admin_area/settings/visibility_and_access_controls.md#restrict-visibility-levels) is restricted. Then the tab is visible only to signed-in users. +### Who can view the **Projects** page + +When you select a project, the project landing page shows the project contents. + +For public projects, and members of internal and private projects +with [permissions to view the project's code](../permissions.md#project-members-permissions), +the project landing page shows: + +- A [`README` or index file](repository/index.md#readme-and-index-files). +- A list of directories in the project's repository. + +For users without permission to view the project's code, the landing page shows: + +- The wiki homepage. +- The list of issues in the project. + +### Access a project page with the project ID + +> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/53671) in GitLab 11.8. + +To access a project from the GitLab UI using the project ID, +visit the `/projects/:id` URL in your browser or other tool accessing the project. + ## Explore topics -You can explore popular project topics available on GitLab. To explore project topics: +To explore project topics: 1. On the top bar, select **Menu > Projects**. 1. Select **Explore topics**. -GitLab displays a list of topics sorted by the number of associated projects. +The **Projects** page shows list of topics sorted by the number of associated projects. To view projects associated with a topic, select a topic from the list. You can assign topics to a project on the [Project Settings page](settings/index.md#topics). @@ -260,9 +283,8 @@ To add a star to a project: ## Delete a project -After you delete a project, projects in personal namespaces are deleted immediately. You can -[enable delayed project removal](../group/index.md#enable-delayed-project-deletion) to -delay deletion of projects in a group. +After you delete a project, projects in personal namespaces are deleted immediately. To delay deletion of projects in a group +you can [enable delayed project removal](../group/index.md#enable-delayed-project-deletion). To delete a project: @@ -299,56 +321,27 @@ To leave a project: on the project dashboard when a project is part of a group under a [group namespace](../group/index.md#namespaces). -## Use your project as a Go package +## Use a project as a Go package -Any project can be used as a Go package. GitLab responds correctly to `go get` -and `godoc.org` discovery requests, including the -[`go-import`](https://golang.org/cmd/go/#hdr-Remote_import_paths) and -[`go-source`](https://github.com/golang/gddo/wiki/Source-Code-Links) meta tags. +Prerequisites: -Private projects, including projects in subgroups, can be used as a Go package. -These projects may require configuration to work correctly. GitLab responds correctly -to `go get` discovery requests for projects that *are not* in subgroups, -regardless of authentication or authorization. -[Authentication](#authenticate-go-requests) is required to use a private project -in a subgroup as a Go package. Otherwise, GitLab truncates the path for -private projects in subgroups to the first two segments, causing `go get` to -fail. +- Contact your administrator to enable the [GitLab Go Proxy](../packages/go_proxy/index.md). +- To use a private project in a subgroup as a Go package, you must [authenticate Go requests](#authenticate-go-requests-to-private-projects). Go requests that are not authenticated cause +`go get` to fail. You don't need to authenticate Go requests for projects that are not in subgroups. -GitLab implements its own Go proxy. This feature must be enabled by an -administrator and requires additional configuration. See [GitLab Go -Proxy](../packages/go_proxy/index.md). +To use a project as a Go package, use the `go get` and `godoc.org` discovery requests. You can use the meta tags: -### Disable Go module features for private projects +- [`go-import`](https://golang.org/cmd/go/#hdr-Remote_import_paths) +- [`go-source`](https://github.com/golang/gddo/wiki/Source-Code-Links) -In Go 1.12 and later, Go queries module proxies and checksum databases in the -process of [fetching a -module](../../development/go_guide/dependencies.md#fetching). This can be -selectively disabled with `GOPRIVATE` (disable both), -[`GONOPROXY`](../../development/go_guide/dependencies.md#proxies) (disable proxy -queries), and [`GONOSUMDB`](../../development/go_guide/dependencies.md#fetching) -(disable checksum queries). +### Authenticate Go requests to private projects -`GOPRIVATE`, `GONOPROXY`, and `GONOSUMDB` are comma-separated lists of Go -modules and Go module prefixes. For example, -`GOPRIVATE=gitlab.example.com/my/private/project` disables queries for that -one project, but `GOPRIVATE=gitlab.example.com` disables queries for *all* -projects on GitLab.com. Go does not query module proxies if the module name or a -prefix of it appears in `GOPRIVATE` or `GONOPROXY`. Go does not query checksum -databases if the module name or a prefix of it appears in `GONOPRIVATE` or -`GONOSUMDB`. +Prerequisites: -### Authenticate Go requests +- Your GitLab instance must be accessible with HTTPS. +- You must have a [personal access token](../profile/personal_access_tokens.md). -To authenticate requests to private projects made by Go, use a [`.netrc` -file](https://everything.curl.dev/usingcurl/netrc) and a [personal access -token](../profile/personal_access_tokens.md) in the password field. **This only -works if your GitLab instance can be accessed with HTTPS.** The `go` command -does not transmit credentials over insecure connections. This authenticates -all HTTPS requests made directly by Go, but does not authenticate requests made -through Git. - -For example: +To authenticate Go requests, create a [`.netrc`](https://everything.curl.dev/usingcurl/netrc) file with the following information: ```plaintext machine gitlab.example.com @@ -356,98 +349,106 @@ login password ``` -NOTE: On Windows, Go reads `~/_netrc` instead of `~/.netrc`. -### Authenticate Git fetches +The `go` command does not transmit credentials over insecure connections. It authenticates +HTTPS requests made by Go, but does not authenticate requests made +through Git. -If a module cannot be fetched from a proxy, Go falls back to using Git (for -GitLab projects). Git uses `.netrc` to authenticate requests. You can also -configure Git to either: +### Authenticate Git requests -- Embed specific credentials in the request URL. -- Use SSH instead of HTTPS, as Go always uses HTTPS to fetch Git repositories. +If Go cannot fetch a module from a proxy, it uses Git. Git uses a `.netrc` file to authenticate requests, but you can +configure other authentication methods. -```shell -# Embed credentials in any request to GitLab.com: -git config --global url."https://${user}:${personal_access_token}@gitlab.example.com".insteadOf "https://gitlab.example.com" +Configure Git to either: -# Use SSH instead of HTTPS: -git config --global url."git@gitlab.example.com".insteadOf "https://gitlab.example.com" -``` +- Embed credentials in the request URL: + + ```shell + git config --global url."https://${user}:${personal_access_token}@gitlab.example.com".insteadOf "https://gitlab.example.com" + ``` + +- Use SSH instead of HTTPS: + + ```shell + git config --global url."git@gitlab.example.com".insteadOf "https://gitlab.example.com" + ``` + +### Disable Go module fetching for private projects + +To [fetch modules or packages](../../development/go_guide/dependencies.md#fetching), Go uses +the [environment variables](../../development/go_guide/dependencies.md#proxies): + +- `GOPRIVATE` +- `GONOPROXY` +- `GONOSUMDB` + +To disable fetching: + +1. Disable `GOPRIVATE`: + - To disable queries for one project, disable `GOPRIVATE=gitlab.example.com/my/private/project`. + - To disable queries for all projects on GitLab.com, disable `GOPRIVATE=gitlab.example.com`. +1. Disable proxy queries in `GONOPROXY`. +1. Disable checksum queries in `GONOSUMDB`. + +- If the module name or its prefix is in `GOPRIVATE` or `GONOPROXY`, Go does not query module +proxies. +- If the module name or its prefix is in `GONOPRIVATE` or `GONOSUMDB`, Go does not query +Checksum databases. ### Fetch Go modules from Geo secondary sites -As Go modules are stored in Git repositories, you can use the [Geo](../../administration/geo/index.md) -feature that allows Git repositories to be accessed on the secondary Geo servers. +Use [Geo](../../administration/geo/index.md) to access Git repositories that contain Go modules +on secondary Geo servers. -In the following examples, the primary's site domain name is `gitlab.example.com`, -and the secondary's is `gitlab-secondary.example.com`. +You can use SSH or HTTP to access the Geo secondary server. -`go get` will initially generate some HTTP traffic to the primary, but when the module -download commences, the `insteadOf` configuration sends the traffic to the secondary. +#### Use SSH to access the Geo secondary server -#### Use SSH to access the Geo secondary - -To fetch Go modules from the secondary using SSH: +To access the Geo secondary server with SSH: 1. Reconfigure Git on the client to send traffic for the primary to the secondary: - ```plaintext + ```shell git config --global url."git@gitlab-secondary.example.com".insteadOf "https://gitlab.example.com" git config --global url."git@gitlab-secondary.example.com".insteadOf "http://gitlab.example.com" ``` -1. Ensure the client is set up for SSH access to GitLab repositories. This can be tested on the primary, - and GitLab will replicate the public key to the secondary. + - For `gitlab.example.com`, use the primary site domain name. + - For `gitlab-secondary.example.com`, use the secondary site domain name. + +1. Ensure the client is set up for SSH access to GitLab repositories. You can test this on the primary, + and GitLab replicates the public key to the secondary. + +The `go get` request generates HTTP traffic to the primary Geo server. When the module +download starts, the `insteadOf` configuration sends the traffic to the secondary Geo server. #### Use HTTP to access the Geo secondary -Using HTTP to fetch Go modules does not work with CI/CD job tokens, only with -persistent access tokens that are replicated to the secondary. +You must use persistent access tokens that replicate to the secondary server. You cannot use +CI/CD job tokens to fetch Go modules with HTTP. -To fetch Go modules from the secondary using HTTP: +To access the Geo secondary server with HTTP: -1. Put in place a Git `insteadOf` redirect on the client: +1. Add a Git `insteadOf` redirect on the client: - ```plaintext + ```shell git config --global url."https://gitlab-secondary.example.com".insteadOf "https://gitlab.example.com" ``` -1. Generate a [personal access token](../profile/personal_access_tokens.md) and - provide those credentials in the client's `~/.netrc` file: + - For `gitlab.example.com`, use the primary site domain name. + - For `gitlab-secondary.example.com`, use the secondary site domain name. - ```plaintext +1. Generate a [personal access token](../profile/personal_access_tokens.md) and + add the credentials in the client's `~/.netrc` file: + + ```shell machine gitlab.example.com login USERNAME password TOKEN machine gitlab-secondary.example.com login USERNAME password TOKEN ``` -## Access project page with project ID - -> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/53671) in GitLab 11.8. - -To quickly access a project from the GitLab UI using the project ID, -visit the `/projects/:id` URL in your browser or other tool accessing the project. - -## Project's landing page - -The project's landing page shows different information depending on -the project's visibility settings and user permissions. - -For public projects, and to members of internal and private projects -with [permissions to view the project's code](../permissions.md#project-members-permissions): - -- The content of a - [`README` or an index file](repository/index.md#readme-and-index-files) - is displayed (if any), followed by the list of directories in the - project's repository. -- If the project doesn't contain either of these files, the - visitor sees the list of files and directories of the repository. - -For users without permissions to view the project's code, GitLab displays: - -- The wiki homepage, if any. -- The list of issues in the project. +The `go get` request generates HTTP traffic to the primary Geo server. When the module +download starts, the `insteadOf` configuration sends the traffic to the secondary Geo server. ## Related topics diff --git a/lib/gitlab/ci/templates/Security/API-Fuzzing.latest.gitlab-ci.yml b/lib/gitlab/ci/templates/Security/API-Fuzzing.latest.gitlab-ci.yml index 544774d3b06..01041f4f056 100644 --- a/lib/gitlab/ci/templates/Security/API-Fuzzing.latest.gitlab-ci.yml +++ b/lib/gitlab/ci/templates/Security/API-Fuzzing.latest.gitlab-ci.yml @@ -11,11 +11,11 @@ variables: FUZZAPI_VERSION: "1" SECURE_ANALYZERS_PREFIX: "registry.gitlab.com/gitlab-org/security-products/analyzers" - FUZZAPI_IMAGE: ${SECURE_ANALYZERS_PREFIX}/api-fuzzing:${FUZZAPI_VERSION} + FUZZAPI_IMAGE: api-fuzzing apifuzzer_fuzz: stage: fuzz - image: $FUZZAPI_IMAGE + image: $SECURE_ANALYZERS_PREFIX/$FUZZAPI_IMAGE:$FUZZAPI_VERSION allow_failure: true rules: - if: $API_FUZZING_DISABLED diff --git a/lib/gitlab/ci/templates/Security/DAST-API.latest.gitlab-ci.yml b/lib/gitlab/ci/templates/Security/DAST-API.latest.gitlab-ci.yml new file mode 100644 index 00000000000..57f1993921d --- /dev/null +++ b/lib/gitlab/ci/templates/Security/DAST-API.latest.gitlab-ci.yml @@ -0,0 +1,52 @@ +# To contribute improvements to CI/CD templates, please follow the Development guide at: +# https://docs.gitlab.com/ee/development/cicd/templates.html +# This specific template is located at: +# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Security/Dast-API.gitlab-ci.yml + +# To use this template, add the following to your .gitlab-ci.yml file: +# +# include: +# template: DAST-API.latest.gitlab-ci.yml +# +# You also need to add a `dast` stage to your `stages:` configuration. A sample configuration for DAST API: +# +# stages: +# - build +# - test +# - deploy +# - dast + +# Read more about this feature here: https://docs.gitlab.com/ee/user/application_security/dast_api/index.html + +# Configure DAST API scanning with CI/CD variables (https://docs.gitlab.com/ee/ci/variables/index.html). +# List of available variables: https://docs.gitlab.com/ee/user/application_security/dast_api/index.html#available-cicd-variables + +variables: + # Setting this variable affects all Security templates + # (SAST, Dependency Scanning, ...) + SECURE_ANALYZERS_PREFIX: "registry.gitlab.com/gitlab-org/security-products/analyzers" + # + DAST_API_VERSION: "1" + DAST_API_IMAGE: api-fuzzing + +dast_api: + stage: dast + image: $SECURE_ANALYZERS_PREFIX/$DAST_API_IMAGE:$DAST_API_VERSION + allow_failure: true + rules: + - if: $DAST_API_DISABLED + when: never + - if: $DAST_API_DISABLED_FOR_DEFAULT_BRANCH && + $CI_DEFAULT_BRANCH == $CI_COMMIT_REF_NAME + when: never + - if: $CI_COMMIT_BRANCH + script: + - /peach/analyzer-dast-api + artifacts: + when: always + paths: + - gl-assets + - gl-dast-api-report.json + - gl-*.log + reports: + dast: gl-dast-api-report.json diff --git a/lib/gitlab/graphql/tracers/logger_tracer.rb b/lib/gitlab/graphql/tracers/logger_tracer.rb index c7ba56824db..3302b2bae3f 100644 --- a/lib/gitlab/graphql/tracers/logger_tracer.rb +++ b/lib/gitlab/graphql/tracers/logger_tracer.rb @@ -11,19 +11,20 @@ module Gitlab end def trace(key, data) - result = yield - + yield + rescue StandardError => e + data[:exception] = e + raise e + ensure case key when "execute_query" log_execute_query(**data) end - - result end private - def log_execute_query(query: nil, duration_s: 0) + def log_execute_query(query: nil, duration_s: 0, exception: nil) # execute_query should always have :query, but we're just being defensive return unless query @@ -39,6 +40,8 @@ module Gitlab query_string: query.query_string } + Gitlab::ExceptionLogFormatter.format!(exception, info) + info.merge!(::Gitlab::ApplicationContext.current) info.merge!(analysis_info) if analysis_info diff --git a/lib/gitlab/graphql/tracers/timer_tracer.rb b/lib/gitlab/graphql/tracers/timer_tracer.rb index 326620a22bc..8e058621110 100644 --- a/lib/gitlab/graphql/tracers/timer_tracer.rb +++ b/lib/gitlab/graphql/tracers/timer_tracer.rb @@ -17,13 +17,9 @@ module Gitlab def trace(key, data) start_time = Gitlab::Metrics::System.monotonic_time - result = yield - - duration_s = Gitlab::Metrics::System.monotonic_time - start_time - - data[:duration_s] = duration_s - - result + yield + ensure + data[:duration_s] = Gitlab::Metrics::System.monotonic_time - start_time end end end diff --git a/lib/gitlab/usage_data_counters/known_events/ci_templates.yml b/lib/gitlab/usage_data_counters/known_events/ci_templates.yml index 40922433635..d90960b344c 100644 --- a/lib/gitlab/usage_data_counters/known_events/ci_templates.yml +++ b/lib/gitlab/usage_data_counters/known_events/ci_templates.yml @@ -119,6 +119,10 @@ category: ci_templates redis_slot: ci_templates aggregation: weekly +- name: p_ci_templates_security_dast_api_latest + category: ci_templates + redis_slot: ci_templates + aggregation: weekly - name: p_ci_templates_security_container_scanning category: ci_templates redis_slot: ci_templates @@ -551,6 +555,10 @@ category: ci_templates redis_slot: ci_templates aggregation: weekly +- name: p_ci_templates_implicit_security_dast_api_latest + category: ci_templates + redis_slot: ci_templates + aggregation: weekly - name: p_ci_templates_implicit_security_container_scanning category: ci_templates redis_slot: ci_templates diff --git a/qa/qa/page/project/settings/advanced.rb b/qa/qa/page/project/settings/advanced.rb index 0ba856e8a6e..da1f16f4cfc 100644 --- a/qa/qa/page/project/settings/advanced.rb +++ b/qa/qa/page/project/settings/advanced.rb @@ -5,7 +5,6 @@ module QA module Project module Settings class Advanced < Page::Base - include Component::Select2 include Component::ConfirmModal view 'app/views/projects/edit.html.haml' do @@ -13,8 +12,10 @@ module QA element :change_path_button end - view 'app/views/projects/_transfer.html.haml' do - element :transfer_button + view "app/assets/javascripts/vue_shared/components/namespace_select/namespace_select.vue" do + element :namespaces_list + element :namespaces_list_groups + element :namespaces_list_item end view 'app/views/projects/settings/_archive.html.haml' do @@ -42,16 +43,22 @@ module QA click_element :change_path_button end + def select_namespace(item) + click_element :namespaces_list + + within_element(:namespaces_list) do + find_element(:namespaces_list_item, text: item).click + end + end + def transfer_project!(project_name, namespace) QA::Runtime::Logger.info "Transferring project: #{project_name} to namespace: #{namespace}" click_element_coordinates(:archive_project_content) - expand_select_list - # Workaround for a failure to search when there are no spaces around the / # https://gitlab.com/gitlab-org/gitlab/-/issues/218965 - search_and_select(namespace.gsub(%r{([^\s])/([^\s])}, '\1 / \2')) + select_namespace(namespace.gsub(%r{([^\s])/([^\s])}, '\1 / \2')) click_element(:transfer_button) fill_confirmation_text(project_name) diff --git a/spec/controllers/projects_controller_spec.rb b/spec/controllers/projects_controller_spec.rb index a0f0b388b9e..950be154096 100644 --- a/spec/controllers/projects_controller_spec.rb +++ b/spec/controllers/projects_controller_spec.rb @@ -899,10 +899,34 @@ RSpec.describe ProjectsController do describe '#transfer', :enable_admin_mode do render_views - let_it_be(:project, reload: true) { create(:project) } + let(:project) { create(:project) } + let_it_be(:admin) { create(:admin) } let_it_be(:new_namespace) { create(:namespace) } + shared_examples 'project namespace is not changed' do |flash_message| + it 'project namespace is not changed' do + controller.instance_variable_set(:@project, project) + sign_in(admin) + + old_namespace = project.namespace + + put :transfer, + params: { + namespace_id: old_namespace.path, + new_namespace_id: new_namespace_id, + id: project.path + }, + format: :js + + project.reload + + expect(project.namespace).to eq(old_namespace) + expect(response).to redirect_to(edit_project_path(project)) + expect(flash[:alert]).to eq flash_message + end + end + it 'updates namespace' do sign_in(admin) @@ -921,26 +945,15 @@ RSpec.describe ProjectsController do end context 'when new namespace is empty' do - it 'project namespace is not changed' do - controller.instance_variable_set(:@project, project) - sign_in(admin) + let(:new_namespace_id) { nil } - old_namespace = project.namespace + it_behaves_like 'project namespace is not changed', s_('TransferProject|Please select a new namespace for your project.') + end - put :transfer, - params: { - namespace_id: old_namespace.path, - new_namespace_id: nil, - id: project.path - }, - format: :js + context 'when new namespace is the same as the current namespace' do + let(:new_namespace_id) { project.namespace.id } - project.reload - - expect(project.namespace).to eq(old_namespace) - expect(response).to have_gitlab_http_status(:ok) - expect(flash[:alert]).to eq s_('TransferProject|Please select a new namespace for your project.') - end + it_behaves_like 'project namespace is not changed', s_('TransferProject|Project is already in this namespace.') end end diff --git a/spec/features/issuables/shortcuts_issuable_spec.rb b/spec/features/issuables/shortcuts_issuable_spec.rb index 78cd8d0bef3..7e8f39c47a7 100644 --- a/spec/features/issuables/shortcuts_issuable_spec.rb +++ b/spec/features/issuables/shortcuts_issuable_spec.rb @@ -44,4 +44,90 @@ RSpec.describe 'Blob shortcuts', :js do include_examples 'quotes the selected text' end end + + shared_examples "opens assignee dropdown for editing" do + it "opens assignee dropdown for editing" do + find('body').native.send_key('a') + + expect(find('.block.assignee')).to have_selector('.js-sidebar-assignee-data') + end + end + + describe 'pressing "a"' do + describe 'On an Issue' do + before do + stub_feature_flags(issue_assignees_widget: false) + visit project_issue_path(project, issue) + wait_for_requests + end + + include_examples 'opens assignee dropdown for editing' + end + + describe 'On a Merge Request' do + before do + stub_feature_flags(issue_assignees_widget: false) + visit project_merge_request_path(project, merge_request) + wait_for_requests + end + + include_examples 'opens assignee dropdown for editing' + end + end + + shared_examples "opens milestones dropdown for editing" do + it "opens milestones dropdown for editing" do + find('body').native.send_key('m') + + expect(find('[data-testid="milestone-edit"]')).to have_selector('.gl-new-dropdown-inner') + end + end + + describe 'pressing "m"' do + describe 'On an Issue' do + before do + visit project_issue_path(project, issue) + wait_for_requests + end + + include_examples 'opens milestones dropdown for editing' + end + + describe 'On a Merge Request' do + before do + visit project_merge_request_path(project, merge_request) + wait_for_requests + end + + include_examples 'opens milestones dropdown for editing' + end + end + + shared_examples "opens labels dropdown for editing" do + it "opens labels dropdown for editing" do + find('body').native.send_key('l') + + expect(find('.js-labels-block')).to have_selector('[data-testid="labels-select-dropdown-contents"]') + end + end + + describe 'pressing "l"' do + describe 'On an Issue' do + before do + visit project_issue_path(project, issue) + wait_for_requests + end + + include_examples 'opens labels dropdown for editing' + end + + describe 'On a Merge Request' do + before do + visit project_merge_request_path(project, merge_request) + wait_for_requests + end + + include_examples 'opens labels dropdown for editing' + end + end end diff --git a/spec/features/projects/settings/user_transfers_a_project_spec.rb b/spec/features/projects/settings/user_transfers_a_project_spec.rb index ba4c379ef0a..a88b9101869 100644 --- a/spec/features/projects/settings/user_transfers_a_project_spec.rb +++ b/spec/features/projects/settings/user_transfers_a_project_spec.rb @@ -8,6 +8,8 @@ RSpec.describe 'Projects > Settings > User transfers a project', :js do let(:group) { create(:group) } before do + stub_const('Gitlab::QueryLimiting::Transaction::THRESHOLD', 120) + group.add_owner(user) sign_in(user) end @@ -16,10 +18,12 @@ RSpec.describe 'Projects > Settings > User transfers a project', :js do visit edit_project_path(project) page.within('.js-project-transfer-form') do - page.find('.select2-container').click + page.find('[data-testid="transfer-project-namespace"]').click end - page.find("div[role='option']", text: group.full_name).click + page.within('[data-testid="transfer-project-namespace"]') do + page.find("li button", text: group.full_name).click + end click_button('Transfer project') diff --git a/spec/frontend/projects/settings/components/transfer_project_form_spec.js b/spec/frontend/projects/settings/components/transfer_project_form_spec.js new file mode 100644 index 00000000000..f7ce7c6f840 --- /dev/null +++ b/spec/frontend/projects/settings/components/transfer_project_form_spec.js @@ -0,0 +1,68 @@ +import { namespaces } from 'jest/vue_shared/components/namespace_select/mock_data'; +import { shallowMountExtended } from 'helpers/vue_test_utils_helper'; +import TransferProjectForm from '~/projects/settings/components/transfer_project_form.vue'; +import NamespaceSelect from '~/vue_shared/components/namespace_select/namespace_select.vue'; +import ConfirmDanger from '~/vue_shared/components/confirm_danger/confirm_danger.vue'; + +describe('Transfer project form', () => { + let wrapper; + + const confirmButtonText = 'Confirm'; + const confirmationPhrase = 'You must construct additional pylons!'; + + const createComponent = () => + shallowMountExtended(TransferProjectForm, { + propsData: { + namespaces, + confirmButtonText, + confirmationPhrase, + }, + }); + + const findNamespaceSelect = () => wrapper.findComponent(NamespaceSelect); + const findConfirmDanger = () => wrapper.findComponent(ConfirmDanger); + + beforeEach(() => { + wrapper = createComponent(); + }); + + afterEach(() => { + wrapper.destroy(); + }); + + it('renders the namespace selector', () => { + expect(findNamespaceSelect().exists()).toBe(true); + }); + + it('renders the confirm button', () => { + expect(findConfirmDanger().exists()).toBe(true); + }); + + it('disables the confirm button by default', () => { + expect(findConfirmDanger().attributes('disabled')).toBe('true'); + }); + + describe('with a selected namespace', () => { + const [selectedItem] = namespaces.group; + + beforeEach(() => { + findNamespaceSelect().vm.$emit('select', selectedItem); + }); + + it('emits the `selectNamespace` event when a namespace is selected', () => { + const args = [selectedItem.id]; + + expect(wrapper.emitted('selectNamespace')).toEqual([args]); + }); + + it('enables the confirm button', () => { + expect(findConfirmDanger().attributes('disabled')).toBeUndefined(); + }); + + it('clicking the confirm button emits the `confirm` event', () => { + findConfirmDanger().vm.$emit('confirm'); + + expect(wrapper.emitted('confirm')).toBeDefined(); + }); + }); +}); diff --git a/spec/frontend/transfer_edit_spec.js b/spec/frontend/transfer_edit_spec.js index ad8c9c68f37..4091d753fe5 100644 --- a/spec/frontend/transfer_edit_spec.js +++ b/spec/frontend/transfer_edit_spec.js @@ -4,11 +4,11 @@ import { loadHTMLFixture } from 'helpers/fixtures'; import setupTransferEdit from '~/transfer_edit'; describe('setupTransferEdit', () => { - const formSelector = '.js-project-transfer-form'; - const targetSelector = 'select.select2'; + const formSelector = '.js-group-transfer-form'; + const targetSelector = '#new_parent_group_id'; beforeEach(() => { - loadHTMLFixture('projects/edit.html'); + loadHTMLFixture('groups/edit.html'); setupTransferEdit(formSelector, targetSelector); }); @@ -17,8 +17,8 @@ describe('setupTransferEdit', () => { }); it('enables submit button when selection changes to non-empty value', () => { - const nonEmptyValue = $(formSelector).find(targetSelector).find('option').not(':empty').val(); - $(formSelector).find(targetSelector).val(nonEmptyValue).trigger('change'); + const lastValue = $(formSelector).find(targetSelector).find('.dropdown-content li').last(); + $(formSelector).find(targetSelector).val(lastValue).trigger('change'); expect($(formSelector).find(':submit').prop('disabled')).toBeFalsy(); }); diff --git a/spec/frontend/vue_shared/components/namespace_select/mock_data.js b/spec/frontend/vue_shared/components/namespace_select/mock_data.js new file mode 100644 index 00000000000..c9d96672e85 --- /dev/null +++ b/spec/frontend/vue_shared/components/namespace_select/mock_data.js @@ -0,0 +1,11 @@ +export const group = [ + { id: 1, name: 'Group 1', humanName: 'Group 1' }, + { id: 2, name: 'Subgroup 1', humanName: 'Group 1 / Subgroup 1' }, +]; + +export const user = [{ id: 3, name: 'User namespace 1', humanName: 'User namespace 1' }]; + +export const namespaces = { + group, + user, +}; diff --git a/spec/frontend/vue_shared/components/namespace_select/namespace_select_spec.js b/spec/frontend/vue_shared/components/namespace_select/namespace_select_spec.js new file mode 100644 index 00000000000..8f07f63993d --- /dev/null +++ b/spec/frontend/vue_shared/components/namespace_select/namespace_select_spec.js @@ -0,0 +1,86 @@ +import { GlDropdown, GlDropdownItem, GlDropdownSectionHeader } from '@gitlab/ui'; +import { shallowMountExtended } from 'helpers/vue_test_utils_helper'; +import NamespaceSelect, { + i18n, +} from '~/vue_shared/components/namespace_select/namespace_select.vue'; +import { user, group, namespaces } from './mock_data'; + +describe('Namespace Select', () => { + let wrapper; + + const createComponent = (props = {}) => + shallowMountExtended(NamespaceSelect, { + propsData: { + data: namespaces, + ...props, + }, + }); + + const wrappersText = (arr) => arr.wrappers.map((w) => w.text()); + const flatNamespaces = () => [...group, ...user]; + const findDropdown = () => wrapper.findComponent(GlDropdown); + const findDropdownAttributes = (attr) => findDropdown().attributes(attr); + const selectedDropdownItemText = () => findDropdownAttributes('text'); + const findDropdownItems = () => wrapper.findAllComponents(GlDropdownItem); + const findSectionHeaders = () => wrapper.findAllComponents(GlDropdownSectionHeader); + + beforeEach(() => { + wrapper = createComponent(); + }); + + afterEach(() => { + wrapper.destroy(); + }); + + it('renders the dropdown', () => { + expect(findDropdown().exists()).toBe(true); + }); + + it('renders each dropdown item', () => { + const items = findDropdownItems().wrappers; + expect(items).toHaveLength(flatNamespaces().length); + }); + + it('renders the human name for each item', () => { + const dropdownItems = wrappersText(findDropdownItems()); + const flatNames = flatNamespaces().map(({ humanName }) => humanName); + expect(dropdownItems).toEqual(flatNames); + }); + + it('sets the initial dropdown text', () => { + expect(selectedDropdownItemText()).toBe(i18n.DEFAULT_TEXT); + }); + + it('splits group and user namespaces', () => { + const headers = findSectionHeaders(); + expect(headers).toHaveLength(2); + expect(wrappersText(headers)).toEqual([i18n.GROUPS, i18n.USERS]); + }); + + it('sets the dropdown to full width', () => { + expect(findDropdownAttributes('block')).toBeUndefined(); + + wrapper = createComponent({ fullWidth: true }); + + expect(findDropdownAttributes('block')).not.toBeUndefined(); + expect(findDropdownAttributes('block')).toBe('true'); + }); + + describe('with a selected namespace', () => { + const selectedGroupIndex = 1; + const selectedItem = group[selectedGroupIndex]; + + beforeEach(() => { + findDropdownItems().at(selectedGroupIndex).vm.$emit('click'); + }); + + it('sets the dropdown text', () => { + expect(selectedDropdownItemText()).toBe(selectedItem.humanName); + }); + + it('emits the `select` event when a namespace is selected', () => { + const args = [selectedItem]; + expect(wrapper.emitted('select')).toEqual([args]); + }); + }); +}); diff --git a/spec/helpers/namespaces_helper_spec.rb b/spec/helpers/namespaces_helper_spec.rb index 68bc19cb429..6eb560e3f5c 100644 --- a/spec/helpers/namespaces_helper_spec.rb +++ b/spec/helpers/namespaces_helper_spec.rb @@ -45,6 +45,39 @@ RSpec.describe NamespacesHelper do user_group.add_owner(user) end + describe '#namespaces_as_json' do + let(:result) { helper.namespaces_as_json(user) } + + before do + allow(helper).to receive(:current_user).and_return(user) + end + + it 'returns the user\'s groups' do + json_data = Gitlab::Json.parse(result) + + expect(result).to include('group') + expect(json_data['group']).to include( + "id" => user_group.id, + "name" => user_group.name, + "display_path" => user_group.full_path, + "human_name" => user_group.human_name + ) + end + + it 'returns the user\'s namespace' do + user_namespace = user.namespace + json_data = Gitlab::Json.parse(result) + + expect(result).to include('user') + expect(json_data['user']).to include( + "id" => user_namespace.id, + "name" => user_namespace.name, + "display_path" => user_namespace.full_path, + "human_name" => user_namespace.human_name + ) + end + end + describe '#namespaces_options' do context 'when admin mode is enabled', :enable_admin_mode do it 'returns groups without being a member for admin' do diff --git a/spec/lib/gitlab/graphql/tracers/logger_tracer_spec.rb b/spec/lib/gitlab/graphql/tracers/logger_tracer_spec.rb index d83ac4dabc5..5bc077a963e 100644 --- a/spec/lib/gitlab/graphql/tracers/logger_tracer_spec.rb +++ b/spec/lib/gitlab/graphql/tracers/logger_tracer_spec.rb @@ -1,6 +1,5 @@ # frozen_string_literal: true -require "fast_spec_helper" -require "support/graphql/fake_query_type" +require "spec_helper" RSpec.describe Gitlab::Graphql::Tracers::LoggerTracer do let(:dummy_schema) do @@ -49,4 +48,15 @@ RSpec.describe Gitlab::Graphql::Tracers::LoggerTracer do dummy_schema.execute(query_string, variables: variables) end + + it 'logs exceptions for breaking queries' do + query_string = "query fooOperation { breakingField }" + + expect(::Gitlab::GraphqlLogger).to receive(:info).with(a_hash_including({ + 'exception.message' => 'This field is supposed to break', + 'exception.class' => 'RuntimeError' + })) + + expect { dummy_schema.execute(query_string) }.to raise_error(/This field is supposed to break/) + end end diff --git a/spec/lib/gitlab/graphql/tracers/metrics_tracer_spec.rb b/spec/lib/gitlab/graphql/tracers/metrics_tracer_spec.rb index ff6a76aa319..168f5aa529e 100644 --- a/spec/lib/gitlab/graphql/tracers/metrics_tracer_spec.rb +++ b/spec/lib/gitlab/graphql/tracers/metrics_tracer_spec.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -require 'fast_spec_helper' +require 'spec_helper' require 'rspec-parameterized' require "support/graphql/fake_query_type" @@ -36,7 +36,7 @@ RSpec.describe Gitlab::Graphql::Tracers::MetricsTracer do end with_them do - it 'increments sli' do + it 'increments apdex sli' do # Trigger initialization fake_schema @@ -56,5 +56,13 @@ RSpec.describe Gitlab::Graphql::Tracers::MetricsTracer do fake_schema.execute("query lorem { helloWorld }") end end + + it "does not record apdex for failing queries" do + query_string = "query fooOperation { breakingField }" + + expect(Gitlab::Metrics::RailsSlis.graphql_query_apdex).not_to receive(:increment) + + expect { fake_schema.execute(query_string) }.to raise_error(/This field is supposed to break/) + end end end diff --git a/spec/lib/gitlab/graphql/tracers/timer_tracer_spec.rb b/spec/lib/gitlab/graphql/tracers/timer_tracer_spec.rb index 7f837e28772..986120dcd95 100644 --- a/spec/lib/gitlab/graphql/tracers/timer_tracer_spec.rb +++ b/spec/lib/gitlab/graphql/tracers/timer_tracer_spec.rb @@ -20,6 +20,7 @@ RSpec.describe Gitlab::Graphql::Tracers::TimerTracer do before do current_time = 0 + allow(tracer_spy).to receive(:trace) allow(Gitlab::Metrics::System).to receive(:monotonic_time) do current_time += expected_duration end @@ -30,6 +31,18 @@ RSpec.describe Gitlab::Graphql::Tracers::TimerTracer do dummy_schema.execute(query_string) + expect_to_have_traced(tracer_spy, expected_duration, query_string) + end + + it "adds a duration_s even if the query failed" do + query_string = "query fooOperation { breakingField }" + + expect { dummy_schema.execute(query_string) }.to raise_error(/This field is supposed to break/) + + expect_to_have_traced(tracer_spy, expected_duration, query_string) + end + + def expect_to_have_traced(tracer_spy, expected_duration, query_string) # "parse" and "execute_query" are just arbitrary trace events expect(tracer_spy).to have_received(:trace).with("parse", { duration_s: expected_duration, diff --git a/spec/models/lfs_objects_project_spec.rb b/spec/models/lfs_objects_project_spec.rb index df49b60c4fa..7378beeed06 100644 --- a/spec/models/lfs_objects_project_spec.rb +++ b/spec/models/lfs_objects_project_spec.rb @@ -25,6 +25,28 @@ RSpec.describe LfsObjectsProject do end end + describe '#link_to_project!' do + it 'does not throw error when duplicate exists' do + subject + + expect do + result = described_class.link_to_project!(subject.lfs_object, subject.project) + expect(result).to be_a(LfsObjectsProject) + end.not_to change { described_class.count } + end + + it 'upserts a new entry and updates the project cache' do + new_project = create(:project) + + allow(ProjectCacheWorker).to receive(:perform_async).and_call_original + expect(ProjectCacheWorker).to receive(:perform_async).with(new_project.id, [], [:lfs_objects_size]) + expect { described_class.link_to_project!(subject.lfs_object, new_project) } + .to change { described_class.count } + + expect(described_class.find_by(lfs_object_id: subject.lfs_object.id, project_id: new_project.id)).to be_present + end + end + describe '#update_project_statistics' do it 'updates project statistics when the object is added' do expect(ProjectCacheWorker).to receive(:perform_async) diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb index 20fec9c21a2..5cdcffb98d1 100644 --- a/spec/models/project_spec.rb +++ b/spec/models/project_spec.rb @@ -3581,6 +3581,29 @@ RSpec.describe Project, factory_default: :keep do expect(project.forks).to contain_exactly(forked_project) end end + + describe '#lfs_object_oids_from_fork_source' do + let_it_be(:lfs_object) { create(:lfs_object) } + let_it_be(:another_lfs_object) { create(:lfs_object) } + + let(:oids) { [lfs_object.oid, another_lfs_object.oid] } + + context 'when fork has one of two LFS objects' do + before do + create(:lfs_objects_project, lfs_object: lfs_object, project: project) + create(:lfs_objects_project, lfs_object: another_lfs_object, project: forked_project) + end + + it 'returns OIDs of owned LFS objects', :aggregate_failures do + expect(forked_project.lfs_objects_oids_from_fork_source(oids: oids)).to eq([lfs_object.oid]) + expect(forked_project.lfs_objects_oids(oids: oids)).to eq([another_lfs_object.oid]) + end + + it 'returns empty when project is not a fork' do + expect(project.lfs_objects_oids_from_fork_source(oids: oids)).to eq([]) + end + end + end end it_behaves_like 'can housekeep repository' do diff --git a/spec/requests/lfs_http_spec.rb b/spec/requests/lfs_http_spec.rb index 656ae744ac1..47786e20ed6 100644 --- a/spec/requests/lfs_http_spec.rb +++ b/spec/requests/lfs_http_spec.rb @@ -518,13 +518,43 @@ RSpec.describe 'Git LFS API and storage' do end context 'in source of fork project' do + let(:other_project) { create(:project, :empty_repo) } let(:project) { fork_project(other_project) } before do lfs_object.update!(projects: [other_project]) end - it_behaves_like 'batch upload with existing LFS object' + context 'when user has access to both the parent and fork' do + before do + project.add_developer(user) + other_project.add_developer(user) + end + + it 'links existing LFS objects to other project' do + expect(json_response['objects']).to be_kind_of(Array) + expect(json_response['objects'].first).to include(sample_object) + expect(json_response['objects'].first).not_to have_key('actions') + + expect(lfs_object.reload.projects.pluck(:id)).to match_array([other_project.id, project.id]) + end + + context 'when feature flag is disabled' do + before do + stub_feature_flags(lfs_auto_link_fork_source: false) + end + + it_behaves_like 'batch upload with existing LFS object' + end + end + + context 'when user does not have access to parent' do + before do + project.add_developer(user) + end + + it_behaves_like 'batch upload with existing LFS object' + end end end diff --git a/spec/services/groups/update_shared_runners_service_spec.rb b/spec/services/groups/update_shared_runners_service_spec.rb index 53870e810b1..6e938984052 100644 --- a/spec/services/groups/update_shared_runners_service_spec.rb +++ b/spec/services/groups/update_shared_runners_service_spec.rb @@ -63,6 +63,8 @@ RSpec.describe Groups::UpdateSharedRunnersService do let_it_be(:pending_build_2) { create(:ci_pending_build, project: project, instance_runners_enabled: false) } it 'updates pending builds for the group' do + expect(::Ci::UpdatePendingBuildService).to receive(:new).and_call_original + subject expect(pending_build_1.reload.instance_runners_enabled).to be_truthy @@ -73,6 +75,8 @@ RSpec.describe Groups::UpdateSharedRunnersService do let(:params) { { shared_runners_setting: 'invalid_enabled' } } it 'does not update pending builds for the group' do + expect(::Ci::UpdatePendingBuildService).not_to receive(:new).and_call_original + subject expect(pending_build_1.reload.instance_runners_enabled).to be_falsey @@ -99,6 +103,8 @@ RSpec.describe Groups::UpdateSharedRunnersService do let_it_be(:pending_build_2) { create(:ci_pending_build, project: project, instance_runners_enabled: true) } it 'updates pending builds for the group' do + expect(::Ci::UpdatePendingBuildService).to receive(:new).and_call_original + subject expect(pending_build_1.reload.instance_runners_enabled).to be_falsey diff --git a/spec/support/graphql/fake_query_type.rb b/spec/support/graphql/fake_query_type.rb index ffd851a6e6a..18cf2cf3e82 100644 --- a/spec/support/graphql/fake_query_type.rb +++ b/spec/support/graphql/fake_query_type.rb @@ -1,15 +1,22 @@ # frozen_string_literal: true +require 'graphql' module Graphql - class FakeQueryType < Types::BaseObject + class FakeQueryType < ::GraphQL::Schema::Object graphql_name 'FakeQuery' field :hello_world, String, null: true do argument :message, String, required: false end + field :breaking_field, String, null: true + def hello_world(message: "world") "Hello #{message}!" end + + def breaking_field + raise "This field is supposed to break" + end end end