From dbd6b2dc0ad4a379490cbb1ea23eee9d90526163 Mon Sep 17 00:00:00 2001 From: Luke Bennett Date: Thu, 8 Sep 2016 19:23:30 +0100 Subject: [PATCH 001/174] Changed build header username area to use the full name with the username as the tooltip --- app/views/projects/builds/_user.html.haml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/views/projects/builds/_user.html.haml b/app/views/projects/builds/_user.html.haml index 2642de8021d..75101b78652 100644 --- a/app/views/projects/builds/_user.html.haml +++ b/app/views/projects/builds/_user.html.haml @@ -1,4 +1,5 @@ by %a{ href: user_path(@build.user) } = image_tag avatar_icon(@build.user, 24), class: "avatar s24" - %strong= @build.user.to_reference + %strong{ data: { toggle: 'tooltip', placement: 'top', title: @build.user.to_reference } } + = @build.user.name From f099e36c181d3f089a18dab20b5aa0cc982da0a1 Mon Sep 17 00:00:00 2001 From: Luke Bennett Date: Thu, 8 Sep 2016 21:00:24 +0100 Subject: [PATCH 002/174] Change username full name back to only username on xs viewports --- app/views/projects/builds/_user.html.haml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/app/views/projects/builds/_user.html.haml b/app/views/projects/builds/_user.html.haml index 75101b78652..83f299da651 100644 --- a/app/views/projects/builds/_user.html.haml +++ b/app/views/projects/builds/_user.html.haml @@ -1,5 +1,7 @@ by %a{ href: user_path(@build.user) } - = image_tag avatar_icon(@build.user, 24), class: "avatar s24" - %strong{ data: { toggle: 'tooltip', placement: 'top', title: @build.user.to_reference } } - = @build.user.name + %span.hidden-xs + = image_tag avatar_icon(@build.user, 24), class: "avatar s24" + %strong{ data: { toggle: 'tooltip', placement: 'top', title: @build.user.to_reference } } + = @build.user.name + %strong.visible-xs-inline= @build.user.to_reference From 735b2b5769cb170b466bd2f5ddc116a997ac75a5 Mon Sep 17 00:00:00 2001 From: Filipa Lacerda Date: Tue, 4 Oct 2016 10:45:42 +0100 Subject: [PATCH 003/174] Adds link to close environment in a merge request --- app/assets/stylesheets/pages/merge_requests.scss | 9 +++++++++ .../projects/merge_requests/widget/_heading.html.haml | 3 +++ 2 files changed, 12 insertions(+) diff --git a/app/assets/stylesheets/pages/merge_requests.scss b/app/assets/stylesheets/pages/merge_requests.scss index bc8693ae467..f2c2e06ad3e 100644 --- a/app/assets/stylesheets/pages/merge_requests.scss +++ b/app/assets/stylesheets/pages/merge_requests.scss @@ -177,6 +177,15 @@ .ci-coverage { float: right; } + + .close-env-container { + color: $gl-text-color; + float: right; + + a { + color: $gl-text-color; + } + } } .mr_source_commit, diff --git a/app/views/projects/merge_requests/widget/_heading.html.haml b/app/views/projects/merge_requests/widget/_heading.html.haml index b5f5e11d4c3..c56283836a9 100644 --- a/app/views/projects/merge_requests/widget/_heading.html.haml +++ b/app/views/projects/merge_requests/widget/_heading.html.haml @@ -57,3 +57,6 @@ - if external_url = link_to external_url, target: '_blank' do = icon('external-link', text: "View on #{external_url.gsub(/\A.*?:\/\//, '')}", right: true) + %span.close-env-container + = link_to '#', class: 'close-evn-link' do + = icon('stop-circle-o', text: 'Stop environment') \ No newline at end of file From 10ea760251af3bcb38f03ca07df8728b0f125c12 Mon Sep 17 00:00:00 2001 From: Filipa Lacerda Date: Tue, 4 Oct 2016 13:59:31 +0100 Subject: [PATCH 004/174] Adds new line in the end of the file --- app/views/projects/merge_requests/widget/_heading.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/projects/merge_requests/widget/_heading.html.haml b/app/views/projects/merge_requests/widget/_heading.html.haml index c56283836a9..7d9ed7dd5a1 100644 --- a/app/views/projects/merge_requests/widget/_heading.html.haml +++ b/app/views/projects/merge_requests/widget/_heading.html.haml @@ -59,4 +59,4 @@ = icon('external-link', text: "View on #{external_url.gsub(/\A.*?:\/\//, '')}", right: true) %span.close-env-container = link_to '#', class: 'close-evn-link' do - = icon('stop-circle-o', text: 'Stop environment') \ No newline at end of file + = icon('stop-circle-o', text: 'Stop environment') From b60e8309c58fc24c6aaa86adc7c8ddab2aac54e0 Mon Sep 17 00:00:00 2001 From: Filipa Lacerda Date: Tue, 4 Oct 2016 14:11:04 +0100 Subject: [PATCH 005/174] Adds variables to controller --- app/controllers/projects/environments_controller.rb | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/controllers/projects/environments_controller.rb b/app/controllers/projects/environments_controller.rb index 58678f96879..d5de9e796df 100644 --- a/app/controllers/projects/environments_controller.rb +++ b/app/controllers/projects/environments_controller.rb @@ -6,7 +6,12 @@ class Projects::EnvironmentsController < Projects::ApplicationController before_action :environment, only: [:show, :edit, :update, :destroy] def index + @scope = params[:scope] @environments = project.environments + + # TODO: fix the values of this vars to show the correct results + @available_environments_count = project.environments.count + @stopped_environments_count = project.environments.count end def show From 08e708579213b5ee2ed80f1fd8d3966a897ed6ff Mon Sep 17 00:00:00 2001 From: Filipa Lacerda Date: Tue, 4 Oct 2016 14:11:41 +0100 Subject: [PATCH 006/174] Adds tabs to environments list --- app/views/projects/environments/index.html.haml | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/app/views/projects/environments/index.html.haml b/app/views/projects/environments/index.html.haml index b3eb5b0011a..393f9e0d57b 100644 --- a/app/views/projects/environments/index.html.haml +++ b/app/views/projects/environments/index.html.haml @@ -5,6 +5,19 @@ %div{ class: container_class } - if can?(current_user, :create_environment, @project) && !@environments.blank? .top-area + %ul.nav-links + %li{class: ('active' if @scope.nil?)} + = link_to project_environments_path(@project) do + Availabe + %span.badge.js-avaibale-environments-count + = number_with_delimiter(@available_environments_count) + + %li{class: ('active' if @scope == 'stopped')} + = link_to project_environments_path(@project, scope: :stopped) do + Stopped + %span.badge.js-stopped-environments-count + = number_with_delimiter(@stopped_environments_count) + .nav-controls = link_to new_namespace_project_environment_path(@project.namespace, @project), class: 'btn btn-create' do New environment From bc49974d94c8ddec59fbc3ebaf16a0e00269e647 Mon Sep 17 00:00:00 2001 From: Filipa Lacerda Date: Tue, 4 Oct 2016 21:26:33 +0100 Subject: [PATCH 007/174] Adds stop environment button to environments list --- app/assets/stylesheets/pages/environments.scss | 8 ++++++++ app/views/projects/deployments/_actions.haml | 5 +++++ app/views/projects/environments/_environment.html.haml | 5 +++-- app/views/projects/environments/show.html.haml | 2 +- 4 files changed, 17 insertions(+), 3 deletions(-) diff --git a/app/assets/stylesheets/pages/environments.scss b/app/assets/stylesheets/pages/environments.scss index d01c60ee6ab..2e14bdb0eb3 100644 --- a/app/assets/stylesheets/pages/environments.scss +++ b/app/assets/stylesheets/pages/environments.scss @@ -24,6 +24,14 @@ .branch-name { color: $gl-dark-link-color; } + + .close-env-link { + color: $table-text-gray; + + .close-env-icon { + font-size: 14px; + } + } } .table.builds.environments { diff --git a/app/views/projects/deployments/_actions.haml b/app/views/projects/deployments/_actions.haml index 16d134eb6b6..a1d9da285c0 100644 --- a/app/views/projects/deployments/_actions.haml +++ b/app/views/projects/deployments/_actions.haml @@ -14,6 +14,11 @@ = custom_icon('icon_play') %span= action.name.humanize + - if :can_be_stopped? + .inline + %a.close-env-link.btn + = icon('stop', class: 'close-env-icon') + - if local_assigns.fetch(:allow_rollback, false) = link_to [:retry, @project.namespace.becomes(Namespace), @project, deployment.deployable], method: :post, class: 'btn btn-build' do - if deployment.last? diff --git a/app/views/projects/environments/_environment.html.haml b/app/views/projects/environments/_environment.html.haml index 36a6162a5a8..27b7254fcfb 100644 --- a/app/views/projects/environments/_environment.html.haml +++ b/app/views/projects/environments/_environment.html.haml @@ -1,4 +1,5 @@ - last_deployment = environment.last_deployment +- can_be_stopped = true %tr.environment %td @@ -20,5 +21,5 @@ - if last_deployment #{time_ago_with_tooltip(last_deployment.created_at)} - %td - = render 'projects/deployments/actions', deployment: last_deployment + %td.hidden-xs + = render 'projects/deployments/actions', deployment: last_deployment, can_be_stopped: can_be_stopped diff --git a/app/views/projects/environments/show.html.haml b/app/views/projects/environments/show.html.haml index 8f8c1c4ce22..6412c809d52 100644 --- a/app/views/projects/environments/show.html.haml +++ b/app/views/projects/environments/show.html.haml @@ -30,7 +30,7 @@ %th Commit %th Build %th - %th + %th.hidden-xs = render @deployments From ed975fdcd4bb2ecb47753e2e1c017175c211adbe Mon Sep 17 00:00:00 2001 From: Filipa Lacerda Date: Tue, 4 Oct 2016 21:33:50 +0100 Subject: [PATCH 008/174] Replaces destroy button with close one --- app/views/projects/environments/show.html.haml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/views/projects/environments/show.html.haml b/app/views/projects/environments/show.html.haml index 6412c809d52..5ca35bb92b1 100644 --- a/app/views/projects/environments/show.html.haml +++ b/app/views/projects/environments/show.html.haml @@ -10,7 +10,8 @@ .nav-controls - if can?(current_user, :update_environment, @environment) = link_to 'Edit', edit_namespace_project_environment_path(@project.namespace, @project, @environment), class: 'btn' - = link_to 'Destroy', namespace_project_environment_path(@project.namespace, @project, @environment), data: { confirm: 'Are you sure you want to delete this environment?' }, class: 'btn btn-danger', method: :delete + / TODO: Confirm if the method is :delete + = link_to 'Close', namespace_project_environment_path(@project.namespace, @project, @environment), data: { confirm: 'Are you sure you want to delete this environment?' }, class: 'btn btn-danger', method: :delete - if @deployments.blank? .blank-state.blank-state-no-icon From 34a980851ebdaeff1734c2adb031253fdfe7b46f Mon Sep 17 00:00:00 2001 From: Filipa Lacerda Date: Tue, 4 Oct 2016 21:41:36 +0100 Subject: [PATCH 009/174] Adds close button to builds list --- app/views/projects/deployments/_actions.haml | 7 +++---- app/views/projects/deployments/_deployment.html.haml | 2 +- app/views/projects/environments/_environment.html.haml | 3 +-- app/views/projects/environments/index.html.haml | 2 +- 4 files changed, 6 insertions(+), 8 deletions(-) diff --git a/app/views/projects/deployments/_actions.haml b/app/views/projects/deployments/_actions.haml index a1d9da285c0..01b33be719f 100644 --- a/app/views/projects/deployments/_actions.haml +++ b/app/views/projects/deployments/_actions.haml @@ -14,10 +14,9 @@ = custom_icon('icon_play') %span= action.name.humanize - - if :can_be_stopped? - .inline - %a.close-env-link.btn - = icon('stop', class: 'close-env-icon') + .inline + %a.close-env-link.btn + = icon('stop', class: 'close-env-icon') - if local_assigns.fetch(:allow_rollback, false) = link_to [:retry, @project.namespace.becomes(Namespace), @project, deployment.deployable], method: :post, class: 'btn btn-build' do diff --git a/app/views/projects/deployments/_deployment.html.haml b/app/views/projects/deployments/_deployment.html.haml index cd95841ca5a..fce7b1cb34e 100644 --- a/app/views/projects/deployments/_deployment.html.haml +++ b/app/views/projects/deployments/_deployment.html.haml @@ -14,5 +14,5 @@ %td #{time_ago_with_tooltip(deployment.created_at)} - %td + %td.hidden-xs = render 'projects/deployments/actions', deployment: deployment, allow_rollback: true diff --git a/app/views/projects/environments/_environment.html.haml b/app/views/projects/environments/_environment.html.haml index 27b7254fcfb..2e9c395f08a 100644 --- a/app/views/projects/environments/_environment.html.haml +++ b/app/views/projects/environments/_environment.html.haml @@ -1,5 +1,4 @@ - last_deployment = environment.last_deployment -- can_be_stopped = true %tr.environment %td @@ -22,4 +21,4 @@ #{time_ago_with_tooltip(last_deployment.created_at)} %td.hidden-xs - = render 'projects/deployments/actions', deployment: last_deployment, can_be_stopped: can_be_stopped + = render 'projects/deployments/actions', deployment: last_deployment diff --git a/app/views/projects/environments/index.html.haml b/app/views/projects/environments/index.html.haml index 393f9e0d57b..949f0855777 100644 --- a/app/views/projects/environments/index.html.haml +++ b/app/views/projects/environments/index.html.haml @@ -42,5 +42,5 @@ %th Last Deployment %th Commit %th - %th + %th.hidden-xs = render @environments From f82d6c180d171d09d6822aaffb447b4c048749a6 Mon Sep 17 00:00:00 2001 From: Filipa Lacerda Date: Tue, 4 Oct 2016 22:33:37 +0100 Subject: [PATCH 010/174] Updates failing test --- spec/features/environments_spec.rb | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/spec/features/environments_spec.rb b/spec/features/environments_spec.rb index 4309a726917..3b38a7f5007 100644 --- a/spec/features/environments_spec.rb +++ b/spec/features/environments_spec.rb @@ -175,12 +175,12 @@ feature 'Environments', feature: true do before do visit namespace_project_environment_path(project.namespace, project, environment) end - + context 'when logged as master' do given(:role) { :master } - scenario 'does delete environment' do - click_link 'Destroy' + scenario 'does close environment' do + click_link 'Close' expect(page).not_to have_link(environment.name) end end @@ -188,8 +188,8 @@ feature 'Environments', feature: true do context 'when logged as developer' do given(:role) { :developer } - scenario 'does not have a Destroy link' do - expect(page).not_to have_link('Destroy') + scenario 'does not have a Close link' do + expect(page).not_to have_link('Close') end end end From 2c01b19f8f55c7105506cdbe964d24d0a3c6dfc4 Mon Sep 17 00:00:00 2001 From: Filipa Lacerda Date: Wed, 5 Oct 2016 10:49:17 +0100 Subject: [PATCH 011/174] Fixes space between buttons --- app/views/projects/deployments/_actions.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/projects/deployments/_actions.haml b/app/views/projects/deployments/_actions.haml index 01b33be719f..6e5e1288722 100644 --- a/app/views/projects/deployments/_actions.haml +++ b/app/views/projects/deployments/_actions.haml @@ -19,7 +19,7 @@ = icon('stop', class: 'close-env-icon') - if local_assigns.fetch(:allow_rollback, false) - = link_to [:retry, @project.namespace.becomes(Namespace), @project, deployment.deployable], method: :post, class: 'btn btn-build' do + = link_to [:retry, @project.namespace.becomes(Namespace), @project, deployment.deployable], method: :post, class: 'btn' do - if deployment.last? Re-deploy - else From 3f85c3ef1629870e22f6a676585e8de80e5120c3 Mon Sep 17 00:00:00 2001 From: Kamil Trzcinski Date: Thu, 6 Oct 2016 13:10:50 +0200 Subject: [PATCH 012/174] Initial support for closing environments --- app/models/ci/build.rb | 4 ++++ app/models/deployment.rb | 13 +++++++++++++ app/models/environment.rb | 18 ++++++++++++++++++ app/services/create_deployment_service.rb | 12 +++++++++++- .../20161006104309_add_state_to_environment.rb | 9 +++++++++ lib/gitlab/ci/config/node/environment.rb | 4 +++- 6 files changed, 58 insertions(+), 2 deletions(-) create mode 100644 db/migrate/20161006104309_add_state_to_environment.rb diff --git a/app/models/ci/build.rb b/app/models/ci/build.rb index 5dbf66173de..aea881d9aa8 100644 --- a/app/models/ci/build.rb +++ b/app/models/ci/build.rb @@ -110,6 +110,10 @@ module Ci project.builds_enabled? && commands.present? && manual? && skipped? end + def closes_environment?(name) + environment == name && options.fetch(:environment, {}).fetch(:close, false) + end + def play(current_user = nil) # Try to queue a current build if self.enqueue diff --git a/app/models/deployment.rb b/app/models/deployment.rb index 82b27b78229..070c76339b1 100644 --- a/app/models/deployment.rb +++ b/app/models/deployment.rb @@ -77,6 +77,19 @@ class Deployment < ActiveRecord::Base take end + def close_action + return nil unless manual_actions + + @close_action ||= + manual_actions.find do |manual_action| + manual_action.try(:closes_environment?, deployable.environment) + end + end + + def closeable? + close_action.present? + end + private def ref_path diff --git a/app/models/environment.rb b/app/models/environment.rb index f0f3ee23223..6ec498ea2b7 100644 --- a/app/models/environment.rb +++ b/app/models/environment.rb @@ -19,6 +19,24 @@ class Environment < ActiveRecord::Base allow_nil: true, addressable_url: true + delegate :closeable?, :close_action, to: :last_deployment, allow_nil: true + + scope :opened, -> { where(state: [:opened]) } + scope :closed, -> { where(state: [:closed]) } + + state_machine :state, initial: :opened do + event :close do + transition opened: :closed + end + + event :reopen do + transition closed: :opened + end + + state :opened + state :closed + end + def last_deployment deployments.last end diff --git a/app/services/create_deployment_service.rb b/app/services/create_deployment_service.rb index 799ad3e1bd0..c87542e57a2 100644 --- a/app/services/create_deployment_service.rb +++ b/app/services/create_deployment_service.rb @@ -4,6 +4,13 @@ class CreateDeploymentService < BaseService def execute(deployable = nil) environment = find_or_create_environment + if close? + environment.close + return + end + + environment.reopen + deployment = project.deployments.create( environment: environment, ref: params[:ref], @@ -14,7 +21,6 @@ class CreateDeploymentService < BaseService ) deployment.update_merge_request_metrics! - deployment end @@ -44,6 +50,10 @@ class CreateDeploymentService < BaseService options[:url] end + def close? + options[:close] + end + def options params[:options] || {} end diff --git a/db/migrate/20161006104309_add_state_to_environment.rb b/db/migrate/20161006104309_add_state_to_environment.rb new file mode 100644 index 00000000000..2a6fd1a6a93 --- /dev/null +++ b/db/migrate/20161006104309_add_state_to_environment.rb @@ -0,0 +1,9 @@ +class AddStateToEnvironment < ActiveRecord::Migration + include Gitlab::Database::MigrationHelpers + + DOWNTIME = false + + def change + add_column :environments, :state, :string + end +end diff --git a/lib/gitlab/ci/config/node/environment.rb b/lib/gitlab/ci/config/node/environment.rb index d388ab6b879..daa115f9017 100644 --- a/lib/gitlab/ci/config/node/environment.rb +++ b/lib/gitlab/ci/config/node/environment.rb @@ -8,7 +8,7 @@ module Gitlab class Environment < Entry include Validatable - ALLOWED_KEYS = %i[name url] + ALLOWED_KEYS = %i[name url close] validations do validate do @@ -35,6 +35,8 @@ module Gitlab length: { maximum: 255 }, addressable_url: true, allow_nil: true + + validates :close, boolean: true, allow_nil: true end end From fd4e0703e81de31aaabdfc983b013382841fcaa3 Mon Sep 17 00:00:00 2001 From: Kamil Trzcinski Date: Thu, 6 Oct 2016 13:13:47 +0200 Subject: [PATCH 013/174] Add play type --- app/models/ci/build.rb | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/app/models/ci/build.rb b/app/models/ci/build.rb index aea881d9aa8..09c5223c60d 100644 --- a/app/models/ci/build.rb +++ b/app/models/ci/build.rb @@ -110,8 +110,12 @@ module Ci project.builds_enabled? && commands.present? && manual? && skipped? end + def close_environment? + options.fetch(:environment, {}).fetch(:close, false) + end + def closes_environment?(name) - environment == name && options.fetch(:environment, {}).fetch(:close, false) + environment == name && close_environment? end def play(current_user = nil) @@ -125,6 +129,16 @@ module Ci end end + def play_type + return nil unless playable? + + if close_environment? + :close + else + :play + end + end + def retryable? project.builds_enabled? && commands.present? && complete? end From c319cc5ab5064459aaf803ee719a08e9663726ea Mon Sep 17 00:00:00 2001 From: Kamil Trzcinski Date: Thu, 6 Oct 2016 13:45:45 +0200 Subject: [PATCH 014/174] Make environments to be close able --- .../projects/environments_controller.rb | 11 ++++--- app/models/project.rb | 2 +- app/views/projects/deployments/_actions.haml | 8 +++-- .../environments/_environment.html.haml | 2 +- .../projects/environments/index.html.haml | 32 +++++++++---------- .../projects/environments/show.html.haml | 7 ++-- .../merge_requests/widget/_heading.html.haml | 5 +-- ...20161006104309_add_state_to_environment.rb | 10 ++++-- 8 files changed, 45 insertions(+), 32 deletions(-) diff --git a/app/controllers/projects/environments_controller.rb b/app/controllers/projects/environments_controller.rb index d5de9e796df..4fe8c3a1889 100644 --- a/app/controllers/projects/environments_controller.rb +++ b/app/controllers/projects/environments_controller.rb @@ -7,11 +7,12 @@ class Projects::EnvironmentsController < Projects::ApplicationController def index @scope = params[:scope] - @environments = project.environments - - # TODO: fix the values of this vars to show the correct results - @available_environments_count = project.environments.count - @stopped_environments_count = project.environments.count + @all_environments = project.environments + @environments = + case @scope + when 'closed' then @all_environments.closed + else @all_environments.opened + end end def show diff --git a/app/models/project.rb b/app/models/project.rb index ecd742a17d5..12705f9ae48 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -1302,7 +1302,7 @@ class Project < ActiveRecord::Base environment_ids.where(ref: ref) end - environments.where(id: environment_ids).select do |environment| + environments.opened.where(id: environment_ids).select do |environment| environment.includes_commit?(commit) end end diff --git a/app/views/projects/deployments/_actions.haml b/app/views/projects/deployments/_actions.haml index 6e5e1288722..2d9c229ed5b 100644 --- a/app/views/projects/deployments/_actions.haml +++ b/app/views/projects/deployments/_actions.haml @@ -14,9 +14,11 @@ = custom_icon('icon_play') %span= action.name.humanize - .inline - %a.close-env-link.btn - = icon('stop', class: 'close-env-icon') + - if local_assigns.fetch(:allow_close, false) && deployment.closeable? + .inline + %a.close-env-link.btn + = link_to [:play, @project.namespace.becomes(Namespace), @project, deployment.close_action], method: :post, rel: 'nofollow', data: { confirm: 'Are you sure you want to close this environment?' } do + = icon('stop', class: 'close-env-icon') - if local_assigns.fetch(:allow_rollback, false) = link_to [:retry, @project.namespace.becomes(Namespace), @project, deployment.deployable], method: :post, class: 'btn' do diff --git a/app/views/projects/environments/_environment.html.haml b/app/views/projects/environments/_environment.html.haml index 2e9c395f08a..205392b1e81 100644 --- a/app/views/projects/environments/_environment.html.haml +++ b/app/views/projects/environments/_environment.html.haml @@ -21,4 +21,4 @@ #{time_ago_with_tooltip(last_deployment.created_at)} %td.hidden-xs - = render 'projects/deployments/actions', deployment: last_deployment + = render 'projects/deployments/actions', deployment: last_deployment, allow_close: environment.opened? diff --git a/app/views/projects/environments/index.html.haml b/app/views/projects/environments/index.html.haml index 949f0855777..702cccd6ab3 100644 --- a/app/views/projects/environments/index.html.haml +++ b/app/views/projects/environments/index.html.haml @@ -3,26 +3,26 @@ = render "projects/pipelines/head" %div{ class: container_class } - - if can?(current_user, :create_environment, @project) && !@environments.blank? - .top-area - %ul.nav-links - %li{class: ('active' if @scope.nil?)} - = link_to project_environments_path(@project) do - Availabe - %span.badge.js-avaibale-environments-count - = number_with_delimiter(@available_environments_count) - - %li{class: ('active' if @scope == 'stopped')} - = link_to project_environments_path(@project, scope: :stopped) do - Stopped - %span.badge.js-stopped-environments-count - = number_with_delimiter(@stopped_environments_count) + .top-area + %ul.nav-links + %li{class: ('active' if @scope.nil?)} + = link_to project_environments_path(@project) do + Availabe + %span.badge.js-avaibale-environments-count + = number_with_delimiter(@all_environments.opened.count) - .nav-controls + %li{class: ('active' if @scope == 'closed')} + = link_to project_environments_path(@project, scope: :stopped) do + Stopped + %span.badge.js-stopped-environments-count + = number_with_delimiter(@all_environments.closed.count) + + .nav-controls + - if can?(current_user, :create_environment, @project) && !@all_environments.blank? = link_to new_namespace_project_environment_path(@project.namespace, @project), class: 'btn btn-create' do New environment - - if @environments.blank? + - if @all_environments.blank? .blank-state.blank-state-no-icon %h2.blank-state-title You don't have any environments right now. diff --git a/app/views/projects/environments/show.html.haml b/app/views/projects/environments/show.html.haml index 5ca35bb92b1..5f4a0ef082c 100644 --- a/app/views/projects/environments/show.html.haml +++ b/app/views/projects/environments/show.html.haml @@ -2,6 +2,8 @@ - page_title "Environments" = render "projects/pipelines/head" +- last_deployment = @environment.last_deployment + %div{ class: container_class } .top-area .col-md-9 @@ -10,8 +12,9 @@ .nav-controls - if can?(current_user, :update_environment, @environment) = link_to 'Edit', edit_namespace_project_environment_path(@project.namespace, @project, @environment), class: 'btn' - / TODO: Confirm if the method is :delete - = link_to 'Close', namespace_project_environment_path(@project.namespace, @project, @environment), data: { confirm: 'Are you sure you want to delete this environment?' }, class: 'btn btn-danger', method: :delete + - if @environment.opened? && last_deployment.try(:close_action) + = link_to 'Close', [:play, @project.namespace.becomes(Namespace), @project, last_deployment.close_action], data: { confirm: 'Are you sure you want to close this environment?' }, class: 'btn btn-danger', method: :post + = link_to 'Destroy', namespace_project_environment_path(@project.namespace, @project, @environment), data: { confirm: 'Are you sure you want to delete this environment?' }, class: 'btn btn-danger', method: :delete - if @deployments.blank? .blank-state.blank-state-no-icon diff --git a/app/views/projects/merge_requests/widget/_heading.html.haml b/app/views/projects/merge_requests/widget/_heading.html.haml index 7d9ed7dd5a1..a92f0f9f481 100644 --- a/app/views/projects/merge_requests/widget/_heading.html.haml +++ b/app/views/projects/merge_requests/widget/_heading.html.haml @@ -58,5 +58,6 @@ = link_to external_url, target: '_blank' do = icon('external-link', text: "View on #{external_url.gsub(/\A.*?:\/\//, '')}", right: true) %span.close-env-container - = link_to '#', class: 'close-evn-link' do - = icon('stop-circle-o', text: 'Stop environment') + - if environment.closeable? + = link_to [:play, @project.namespace.becomes(Namespace), @project, environment.close_action], method: :post, class: 'close-evn-link', rel: 'nofollow', data: { confirm: 'Are you sure you want to close this environment?' } do + = icon('stop-circle-o', text: 'Stop environment') diff --git a/db/migrate/20161006104309_add_state_to_environment.rb b/db/migrate/20161006104309_add_state_to_environment.rb index 2a6fd1a6a93..83dff07069f 100644 --- a/db/migrate/20161006104309_add_state_to_environment.rb +++ b/db/migrate/20161006104309_add_state_to_environment.rb @@ -1,9 +1,15 @@ class AddStateToEnvironment < ActiveRecord::Migration include Gitlab::Database::MigrationHelpers + disable_ddl_transaction! + DOWNTIME = false - def change - add_column :environments, :state, :string + def up + add_column_with_default(:environments, :state, :string, default: :opened) + end + + def down + remove_column(:environments, :state) end end From 0e1f39d8cee3a6d23fccb195f8257178df840805 Mon Sep 17 00:00:00 2001 From: Kamil Trzcinski Date: Thu, 6 Oct 2016 14:16:03 +0200 Subject: [PATCH 015/174] Allow to close environments --- app/views/projects/deployments/_actions.haml | 5 ++--- app/views/projects/environments/index.html.haml | 4 ++-- app/views/projects/environments/show.html.haml | 1 - db/fixtures/development/14_pipelines.rb | 1 + db/schema.rb | 5 +++-- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/app/views/projects/deployments/_actions.haml b/app/views/projects/deployments/_actions.haml index 2d9c229ed5b..7b7e37353e3 100644 --- a/app/views/projects/deployments/_actions.haml +++ b/app/views/projects/deployments/_actions.haml @@ -16,9 +16,8 @@ - if local_assigns.fetch(:allow_close, false) && deployment.closeable? .inline - %a.close-env-link.btn - = link_to [:play, @project.namespace.becomes(Namespace), @project, deployment.close_action], method: :post, rel: 'nofollow', data: { confirm: 'Are you sure you want to close this environment?' } do - = icon('stop', class: 'close-env-icon') + = link_to [:play, @project.namespace.becomes(Namespace), @project, deployment.close_action], method: :post, class: 'btn close-env-link', rel: 'nofollow', data: { confirm: 'Are you sure you want to close this environment?' } do + = icon('stop', class: 'close-env-icon') - if local_assigns.fetch(:allow_rollback, false) = link_to [:retry, @project.namespace.becomes(Namespace), @project, deployment.deployable], method: :post, class: 'btn' do diff --git a/app/views/projects/environments/index.html.haml b/app/views/projects/environments/index.html.haml index 702cccd6ab3..11e2ff506b4 100644 --- a/app/views/projects/environments/index.html.haml +++ b/app/views/projects/environments/index.html.haml @@ -7,12 +7,12 @@ %ul.nav-links %li{class: ('active' if @scope.nil?)} = link_to project_environments_path(@project) do - Availabe + Available %span.badge.js-avaibale-environments-count = number_with_delimiter(@all_environments.opened.count) %li{class: ('active' if @scope == 'closed')} - = link_to project_environments_path(@project, scope: :stopped) do + = link_to project_environments_path(@project, scope: :closed) do Stopped %span.badge.js-stopped-environments-count = number_with_delimiter(@all_environments.closed.count) diff --git a/app/views/projects/environments/show.html.haml b/app/views/projects/environments/show.html.haml index 5f4a0ef082c..4981b95a19b 100644 --- a/app/views/projects/environments/show.html.haml +++ b/app/views/projects/environments/show.html.haml @@ -14,7 +14,6 @@ = link_to 'Edit', edit_namespace_project_environment_path(@project.namespace, @project, @environment), class: 'btn' - if @environment.opened? && last_deployment.try(:close_action) = link_to 'Close', [:play, @project.namespace.becomes(Namespace), @project, last_deployment.close_action], data: { confirm: 'Are you sure you want to close this environment?' }, class: 'btn btn-danger', method: :post - = link_to 'Destroy', namespace_project_environment_path(@project.namespace, @project, @environment), data: { confirm: 'Are you sure you want to delete this environment?' }, class: 'btn btn-danger', method: :delete - if @deployments.blank? .blank-state.blank-state-no-icon diff --git a/db/fixtures/development/14_pipelines.rb b/db/fixtures/development/14_pipelines.rb index 803cbca584d..d3fabe111a1 100644 --- a/db/fixtures/development/14_pipelines.rb +++ b/db/fixtures/development/14_pipelines.rb @@ -17,6 +17,7 @@ class Gitlab::Seeder::Pipelines { name: 'env:beta', stage: 'deploy', environment: 'beta', status: :running }, { name: 'env:gamma', stage: 'deploy', environment: 'gamma', status: :canceled }, { name: 'staging', stage: 'deploy', environment: 'staging', status_event: :success }, + { name: 'close staging', stage: 'deploy', environment: 'staging', when: 'manual', status: :skipped, options: { environment: { close: true } } }, { name: 'production', stage: 'deploy', environment: 'production', when: 'manual', status: :skipped }, { name: 'slack', stage: 'notify', when: 'manual', status: :created }, ] diff --git a/db/schema.rb b/db/schema.rb index ad62c249b3f..b9dc5b5f895 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20160926145521) do +ActiveRecord::Schema.define(version: 20161006104309) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -392,11 +392,12 @@ ActiveRecord::Schema.define(version: 20160926145521) do create_table "environments", force: :cascade do |t| t.integer "project_id" - t.string "name", null: false + t.string "name", null: false t.datetime "created_at" t.datetime "updated_at" t.string "external_url" t.string "environment_type" + t.string "state", default: "opened", null: false end add_index "environments", ["project_id", "name"], name: "index_environments_on_project_id_and_name", using: :btree From 443619300d067a83cbd53872635c2c3cfd1f6655 Mon Sep 17 00:00:00 2001 From: Luke Bennett Date: Fri, 23 Sep 2016 15:18:33 +0100 Subject: [PATCH 016/174] Added `issuable_filters_present` to check for active filters before rendering the reset button Added tests --- app/helpers/issuables_helper.rb | 4 ++++ app/views/shared/issuable/_filter.html.haml | 5 +++-- spec/features/issues/reset_filters_spec.rb | 8 ++++++++ 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/app/helpers/issuables_helper.rb b/app/helpers/issuables_helper.rb index 692fadd505f..03b2db1bc91 100644 --- a/app/helpers/issuables_helper.rb +++ b/app/helpers/issuables_helper.rb @@ -124,6 +124,10 @@ module IssuablesHelper end end + def issuable_filters_present + params[:search] || params[:author_id] || params[:assignee_id] || params[:milestone_title] || params[:label_name] + end + def issuables_count_for_state(issuable_type, state) issuables_finder = public_send("#{issuable_type}_finder") issuables_finder.params[:state] = state diff --git a/app/views/shared/issuable/_filter.html.haml b/app/views/shared/issuable/_filter.html.haml index 31620297be0..6b43a76c404 100644 --- a/app/views/shared/issuable/_filter.html.haml +++ b/app/views/shared/issuable/_filter.html.haml @@ -29,8 +29,9 @@ .filter-item.inline.labels-filter = render "shared/issuable/label_dropdown", selected: finder.labels.select(:title).uniq, use_id: false, selected_toggle: params[:label_name], data_options: { field_name: "label_name[]" } - .filter-item.inline.reset-filters - %a{href: page_filter_path(without: [:assignee_id, :author_id, :milestone_title, :label_name, :search])} Reset filters + - if issuable_filters_present + .filter-item.inline.reset-filters + %a{href: page_filter_path(without: [:assignee_id, :author_id, :milestone_title, :label_name, :search])} Reset filters .pull-right - if boards_page diff --git a/spec/features/issues/reset_filters_spec.rb b/spec/features/issues/reset_filters_spec.rb index f4d0f13c3d5..c9a3ecf16ea 100644 --- a/spec/features/issues/reset_filters_spec.rb +++ b/spec/features/issues/reset_filters_spec.rb @@ -75,6 +75,14 @@ feature 'Issues filter reset button', feature: true, js: true do end end + context 'when no filters have been applied' do + it 'the reset link should not be visible' do + visit_issues(project) + expect(page).to have_css('.issue', count: 2) + expect(page).not_to have_css '.reset_filters' + end + end + def reset_filters find('.reset-filters').click end From 594c320851afbf4c8dd1c78600a0195f12d6ce41 Mon Sep 17 00:00:00 2001 From: Filipa Lacerda Date: Mon, 10 Oct 2016 21:44:29 +0100 Subject: [PATCH 017/174] Adds tests to verify if tabs are rendered --- spec/features/environments_spec.rb | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/spec/features/environments_spec.rb b/spec/features/environments_spec.rb index 3b38a7f5007..99246589eae 100644 --- a/spec/features/environments_spec.rb +++ b/spec/features/environments_spec.rb @@ -18,11 +18,26 @@ feature 'Environments', feature: true do before do visit namespace_project_environments_path(project.namespace, project) end + + context 'shows two tabs' do + scenario 'does show Available tab with link' do + expect(page).to have_link('Available') + end + + scenario 'does show Stopped tab with link' do + expect(page).to have_link('Stopped') + end + end context 'without environments' do scenario 'does show no environments' do expect(page).to have_content('You don\'t have any environments right now.') end + + scenario 'does show 0 as counter for environments in both tabs' do + expect(page.find('.js-avaibale-environments-count').text).to eq('0') + expect(page.find('.js-stopped-environments-count').text).to eq('0') + end end context 'with environments' do From 7d12683de51721e75b314b29272f4f024f7f0655 Mon Sep 17 00:00:00 2001 From: Filipa Lacerda Date: Tue, 11 Oct 2016 11:03:11 +0100 Subject: [PATCH 018/174] Fixes broken tests --- spec/features/environments_spec.rb | 47 +++++++++++++++++-- .../merge_when_build_succeeds_spec.rb | 9 ++++ 2 files changed, 53 insertions(+), 3 deletions(-) diff --git a/spec/features/environments_spec.rb b/spec/features/environments_spec.rb index 99246589eae..a8244ca89c6 100644 --- a/spec/features/environments_spec.rb +++ b/spec/features/environments_spec.rb @@ -46,6 +46,14 @@ feature 'Environments', feature: true do scenario 'does show environment name' do expect(page).to have_link(environment.name) end + + scenario 'does show number of opened environments in Availabe tab' do + expect(page.find('.js-avaibale-environments-count').text).to eq('1') + end + + scenario 'does show number of closed environments in Stopped tab' do + expect(page.find('.js-stopped-environments-count').text).to eq('0') + end context 'without deployments' do scenario 'does show no deployments' do @@ -76,6 +84,16 @@ feature 'Environments', feature: true do expect(page).to have_content(manual.name) expect(manual.reload).to be_pending end + + scenario 'does show close button' do + # TODO: Add test to verify if close button is visible + # This needs to be true: if local_assigns.fetch(:allow_close, false) && deployment.closeable? + end + + scenario 'does allow to close environment' do + # TODO: Add test to verify if close environment works + # This needs to be true: if local_assigns.fetch(:allow_close, false) && deployment.closeable? + end end end end @@ -137,6 +155,16 @@ feature 'Environments', feature: true do expect(page).to have_content(manual.name) expect(manual.reload).to be_pending end + + scenario 'does show close button' do + # TODO: Add test to verify if close button is visible + # This needs to be true: if local_assigns.fetch(:allow_close, false) && deployment.closeable? + end + + scenario 'does allow to close environment' do + # TODO: Add test to verify if close environment works + # This needs to be true: if local_assigns.fetch(:allow_close, false) && deployment.closeable? + end end end end @@ -194,9 +222,22 @@ feature 'Environments', feature: true do context 'when logged as master' do given(:role) { :master } - scenario 'does close environment' do - click_link 'Close' - expect(page).not_to have_link(environment.name) + scenario 'does not have a Close link' do + expect(page).not_to have_link('Close') + end + + context 'when environment is opened and can be closed' do + let(:project) { create(:project) } + let(:environment) { create(:environment, project: project) } + + let!(:deployment) do + create(:deployment, environment: environment, sha: project.commit('master').id) + end + + scenario 'does have a Close link' do + # TODO: Add missing validation. In order to have Close link + # this must be true: last_deployment.try(:close_action) + end end end diff --git a/spec/features/merge_requests/merge_when_build_succeeds_spec.rb b/spec/features/merge_requests/merge_when_build_succeeds_spec.rb index 60bc07bd1a0..2c1a45af596 100644 --- a/spec/features/merge_requests/merge_when_build_succeeds_spec.rb +++ b/spec/features/merge_requests/merge_when_build_succeeds_spec.rb @@ -79,6 +79,15 @@ feature 'Merge When Build Succeeds', feature: true, js: true do end end + context 'Has Environment' do + let(:environment) { create(:environment, project: project) } + + it 'does show link to close the environment' do + # TODO add test to verify if the button is visible when this condition + # is met: if environment.closeable? + end + end + def visit_merge_request(merge_request) visit namespace_project_merge_request_path(merge_request.project.namespace, merge_request.project, merge_request) end From 04593581037bca7a7c3b00c719404e610c158cc1 Mon Sep 17 00:00:00 2001 From: Robert Schilling Date: Thu, 13 Oct 2016 19:32:10 +0200 Subject: [PATCH 019/174] API: Fix Sytem hooks delete behavior --- doc/api/system_hooks.md | 7 ++----- lib/api/system_hooks.rb | 10 ++++------ spec/requests/api/system_hooks_spec.rb | 7 ++++--- 3 files changed, 10 insertions(+), 14 deletions(-) diff --git a/doc/api/system_hooks.md b/doc/api/system_hooks.md index 1802fae14fe..073e99b7147 100644 --- a/doc/api/system_hooks.md +++ b/doc/api/system_hooks.md @@ -98,11 +98,8 @@ Example response: ## Delete system hook -Deletes a system hook. This is an idempotent API function and returns `200 OK` -even if the hook is not available. - -If the hook is deleted, a JSON object is returned. An error is raised if the -hook is not found. +Deletes a system hook. It returns `200 OK` if the hooks is deleted and +`404 Not Found` if the hook is not found. --- diff --git a/lib/api/system_hooks.rb b/lib/api/system_hooks.rb index 2e76b91051f..794e34874f4 100644 --- a/lib/api/system_hooks.rb +++ b/lib/api/system_hooks.rb @@ -56,12 +56,10 @@ module API requires :id, type: Integer, desc: 'The ID of the system hook' end delete ":id" do - begin - hook = SystemHook.find(params[:id]) - present hook.destroy, with: Entities::Hook - rescue - # SystemHook raises an Error if no hook with id found - end + hook = SystemHook.find_by(id: params[:id]) + not_found!('System hook') unless hook + + present hook.destroy, with: Entities::Hook end end end diff --git a/spec/requests/api/system_hooks_spec.rb b/spec/requests/api/system_hooks_spec.rb index 1ce2658569e..f8a1aed5441 100644 --- a/spec/requests/api/system_hooks_spec.rb +++ b/spec/requests/api/system_hooks_spec.rb @@ -73,9 +73,10 @@ describe API::API, api: true do end.to change { SystemHook.count }.by(-1) end - it "returns success if hook id not found" do - delete api("/hooks/12345", admin) - expect(response).to have_http_status(200) + it 'returns 404 if the system hook does not exist' do + delete api('/hooks/12345', admin) + + expect(response).to have_http_status(404) end end end From db9c03bf4426346c631a6cd366a84626ead8d6e3 Mon Sep 17 00:00:00 2001 From: Kamil Trzcinski Date: Mon, 17 Oct 2016 11:33:24 +0200 Subject: [PATCH 020/174] Add environment stop action [ci skip] --- app/controllers/projects/environments_controller.rb | 6 +++++- app/controllers/projects/merge_requests_controller.rb | 1 + app/models/ci/build.rb | 10 ---------- config/routes/project.rb | 6 +++++- 4 files changed, 11 insertions(+), 12 deletions(-) diff --git a/app/controllers/projects/environments_controller.rb b/app/controllers/projects/environments_controller.rb index 4fe8c3a1889..2ec316a1ebd 100644 --- a/app/controllers/projects/environments_controller.rb +++ b/app/controllers/projects/environments_controller.rb @@ -2,7 +2,7 @@ class Projects::EnvironmentsController < Projects::ApplicationController layout 'project' before_action :authorize_read_environment! before_action :authorize_create_environment!, only: [:new, :create] - before_action :authorize_update_environment!, only: [:edit, :update, :destroy] + before_action :authorize_update_environment!, only: [:edit, :update, :stop, :destroy] before_action :environment, only: [:show, :edit, :update, :destroy] def index @@ -44,6 +44,10 @@ class Projects::EnvironmentsController < Projects::ApplicationController end end + def stop + + end + def destroy if @environment.destroy flash[:notice] = 'Environment was successfully removed.' diff --git a/app/controllers/projects/merge_requests_controller.rb b/app/controllers/projects/merge_requests_controller.rb index 9207c954335..1c1938f957b 100644 --- a/app/controllers/projects/merge_requests_controller.rb +++ b/app/controllers/projects/merge_requests_controller.rb @@ -416,6 +416,7 @@ class Projects::MergeRequestsController < Projects::ApplicationController id: environment.id, name: environment.name, url: namespace_project_environment_path(project.namespace, project, environment), + stop_url: (stop_namespace_project_environment_path(project.namespace, project, environment) if environment.closeable?), external_url: environment.external_url, external_url_formatted: environment.formatted_external_url, deployed_at: deployment.try(:created_at), diff --git a/app/models/ci/build.rb b/app/models/ci/build.rb index fd762b8c5ce..6f3e83976e7 100644 --- a/app/models/ci/build.rb +++ b/app/models/ci/build.rb @@ -125,16 +125,6 @@ module Ci end end - def play_type - return nil unless playable? - - if close_environment? - :close - else - :play - end - end - def retryable? project.builds_enabled? && commands.present? && complete? end diff --git a/config/routes/project.rb b/config/routes/project.rb index 2cd8c60794a..d73f76cd091 100644 --- a/config/routes/project.rb +++ b/config/routes/project.rb @@ -318,7 +318,11 @@ resources :namespaces, path: '/', constraints: { id: /[a-zA-Z.0-9_\-]+/ }, only: end end - resources :environments + resources :environments do + member do + post :stop + end + end resource :cycle_analytics, only: [:show] From 92d12fab66e66358e8fb9204870053e4bab66b71 Mon Sep 17 00:00:00 2001 From: Filipa Lacerda Date: Mon, 17 Oct 2016 11:44:08 +0100 Subject: [PATCH 021/174] Updates MR template to include stop link --- app/assets/javascripts/merge_request_widget.js.es6 | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/app/assets/javascripts/merge_request_widget.js.es6 b/app/assets/javascripts/merge_request_widget.js.es6 index fcadc4bc515..fb55d13a223 100644 --- a/app/assets/javascripts/merge_request_widget.js.es6 +++ b/app/assets/javascripts/merge_request_widget.js.es6 @@ -17,6 +17,12 @@ View on <%- external_url_formatted %> + + + + Stop environment + + `; @@ -205,6 +211,11 @@ if ($(`.mr-state-widget #${ environment.id }`).length) return; const $template = $(DEPLOYMENT_TEMPLATE); if (!environment.external_url || !environment.external_url_formatted) $('.js-environment-link', $template).remove(); + + if (!environment.stop_url) { + $('.js-close-env-link', $template).remove(); + } + if (environment.deployed_at && environment.deployed_at_formatted) { environment.deployed_at = $.timeago(environment.deployed_at) + '.'; } else { From 6cdbb27ec3cf72ce6728986909aa3df54b7a26c6 Mon Sep 17 00:00:00 2001 From: Kamil Trzcinski Date: Mon, 17 Oct 2016 12:45:31 +0200 Subject: [PATCH 022/174] Refactor code to use available and stopped statuses and refactor views to use separate renders --- .../projects/environments_controller.rb | 8 ++-- .../projects/merge_requests_controller.rb | 2 +- app/models/ci/build.rb | 8 ---- app/models/deployment.rb | 15 +++--- app/models/environment.rb | 20 ++++---- app/models/project.rb | 2 +- app/services/create_deployment_service.rb | 14 +++--- app/views/projects/deployments/_actions.haml | 46 ++++++------------- .../deployments/_deployment.html.haml | 4 +- app/views/projects/deployments/_rollback.haml | 6 +++ .../environments/_environment.html.haml | 6 ++- .../environments/_external_url.html.haml | 3 ++ .../projects/environments/_stop.html.haml | 5 ++ .../projects/environments/index.html.haml | 10 ++-- .../projects/environments/show.html.haml | 10 ++-- db/fixtures/development/14_pipelines.rb | 4 +- ...20161006104309_add_state_to_environment.rb | 2 +- ...1017095000_add_properties_to_deployment.rb | 29 ++++++++++++ db/schema.rb | 11 +---- 19 files changed, 111 insertions(+), 94 deletions(-) create mode 100644 app/views/projects/deployments/_rollback.haml create mode 100644 app/views/projects/environments/_external_url.html.haml create mode 100644 app/views/projects/environments/_stop.html.haml create mode 100644 db/migrate/20161017095000_add_properties_to_deployment.rb diff --git a/app/controllers/projects/environments_controller.rb b/app/controllers/projects/environments_controller.rb index 2ec316a1ebd..40da5be2e49 100644 --- a/app/controllers/projects/environments_controller.rb +++ b/app/controllers/projects/environments_controller.rb @@ -10,8 +10,8 @@ class Projects::EnvironmentsController < Projects::ApplicationController @all_environments = project.environments @environments = case @scope - when 'closed' then @all_environments.closed - else @all_environments.opened + when 'stopped' then @all_environments.stopped + else @all_environments.available end end @@ -45,7 +45,9 @@ class Projects::EnvironmentsController < Projects::ApplicationController end def stop - + action = @environment.stop_action + new_action = action.active? ? action : action.play(current_user) + redirect_to [project.namespace.become(Namespace), project, new_action] end def destroy diff --git a/app/controllers/projects/merge_requests_controller.rb b/app/controllers/projects/merge_requests_controller.rb index 1c1938f957b..86e12660c23 100644 --- a/app/controllers/projects/merge_requests_controller.rb +++ b/app/controllers/projects/merge_requests_controller.rb @@ -416,7 +416,7 @@ class Projects::MergeRequestsController < Projects::ApplicationController id: environment.id, name: environment.name, url: namespace_project_environment_path(project.namespace, project, environment), - stop_url: (stop_namespace_project_environment_path(project.namespace, project, environment) if environment.closeable?), + stop_url: (stop_namespace_project_environment_path(project.namespace, project, environment) if environment.stoppable?), external_url: environment.external_url, external_url_formatted: environment.formatted_external_url, deployed_at: deployment.try(:created_at), diff --git a/app/models/ci/build.rb b/app/models/ci/build.rb index 6f3e83976e7..87475119b23 100644 --- a/app/models/ci/build.rb +++ b/app/models/ci/build.rb @@ -106,14 +106,6 @@ module Ci project.builds_enabled? && commands.present? && manual? && skipped? end - def close_environment? - options.fetch(:environment, {}).fetch(:close, false) - end - - def closes_environment?(name) - environment == name && close_environment? - end - def play(current_user = nil) # Try to queue a current build if self.enqueue diff --git a/app/models/deployment.rb b/app/models/deployment.rb index 054d54f124e..18d9e96301c 100644 --- a/app/models/deployment.rb +++ b/app/models/deployment.rb @@ -11,6 +11,8 @@ class Deployment < ActiveRecord::Base delegate :name, to: :environment, prefix: true + store :properties, accessors: [:on_stop] + after_save :create_ref def commit @@ -34,7 +36,7 @@ class Deployment < ActiveRecord::Base end def manual_actions - deployable.try(:other_actions) + @manual_actions ||= deployable.try(:other_actions) end def includes_commit?(commit) @@ -84,17 +86,14 @@ class Deployment < ActiveRecord::Base take end - def close_action + def stop_action return nil unless manual_actions - @close_action ||= - manual_actions.find do |manual_action| - manual_action.try(:closes_environment?, deployable.environment) - end + @stop_action ||= manual_actions.find_by(name: on_stop) end - def closeable? - close_action.present? + def stoppable? + on_stop.present? && stop_action.present? end def formatted_deployment_time diff --git a/app/models/environment.rb b/app/models/environment.rb index 07f14a7ad8d..93e7dedd6f8 100644 --- a/app/models/environment.rb +++ b/app/models/environment.rb @@ -19,22 +19,22 @@ class Environment < ActiveRecord::Base allow_nil: true, addressable_url: true - delegate :closeable?, :close_action, to: :last_deployment, allow_nil: true + delegate :stoppable?, :stop_action, to: :last_deployment, allow_nil: true - scope :opened, -> { where(state: [:opened]) } - scope :closed, -> { where(state: [:closed]) } + scope :available, -> { where(state: [:available]) } + scope :stopped, -> { where(state: [:stopped]) } - state_machine :state, initial: :opened do - event :close do - transition opened: :closed + state_machine :state, initial: :available do + event :start do + transition stopped: :available end - event :reopen do - transition closed: :opened + event :stop do + transition available: :stopped end - state :opened - state :closed + state :available + state :stopped end def last_deployment diff --git a/app/models/project.rb b/app/models/project.rb index 2e8073733d4..197edabe821 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -1292,7 +1292,7 @@ class Project < ActiveRecord::Base environment_ids.where(ref: ref) end - environments.opened.where(id: environment_ids).select do |environment| + environments.available.where(id: environment_ids).select do |environment| environment.includes_commit?(commit) end end diff --git a/app/services/create_deployment_service.rb b/app/services/create_deployment_service.rb index 923de58b244..47c740addb0 100644 --- a/app/services/create_deployment_service.rb +++ b/app/services/create_deployment_service.rb @@ -8,12 +8,12 @@ class CreateDeploymentService < BaseService @deployable = deployable @environment = prepare_environment - if close? - @environment.close + if stop? + @environment.stop return end - @environment.reopen + @environment.start deploy.tap do |deployment| deployment.update_merge_request_metrics! @@ -61,10 +61,6 @@ class CreateDeploymentService < BaseService options[:url] end - def close? - options[:close] - end - def options params[:options] || {} end @@ -72,4 +68,8 @@ class CreateDeploymentService < BaseService def variables params[:variables] || [] end + + def stop? + params[:options].fetch(:stop, false) + end end diff --git a/app/views/projects/deployments/_actions.haml b/app/views/projects/deployments/_actions.haml index 387ff018073..58a214bdbd1 100644 --- a/app/views/projects/deployments/_actions.haml +++ b/app/views/projects/deployments/_actions.haml @@ -1,33 +1,15 @@ -- if can?(current_user, :create_deployment, deployment) && deployment.deployable - .pull-right - - - external_url = deployment.environment.external_url - - if external_url - = link_to external_url, target: '_blank', class: 'btn external-url' do - = icon('external-link') - - - actions = deployment.manual_actions - - if actions.present? - .inline - .dropdown - %a.dropdown-new.btn.btn-default{type: 'button', 'data-toggle' => 'dropdown'} - = custom_icon('icon_play') - = icon('caret-down') - %ul.dropdown-menu.dropdown-menu-align-right - - actions.each do |action| - %li - = link_to [:play, @project.namespace.becomes(Namespace), @project, action], method: :post, rel: 'nofollow' do - = custom_icon('icon_play') - %span= action.name.humanize +- if can?(current_user, :create_deployment, deployment) + - actions = deployment.manual_actions + - if actions.present? + .inline + .dropdown + %a.dropdown-new.btn.btn-default{type: 'button', 'data-toggle' => 'dropdown'} + = custom_icon('icon_play') + = icon('caret-down') + %ul.dropdown-menu.dropdown-menu-align-right + - actions.each do |action| + %li + = link_to [:play, @project.namespace.becomes(Namespace), @project, action], method: :post, rel: 'nofollow' do + = custom_icon('icon_play') + %span= action.name.humanize - - if local_assigns.fetch(:allow_close, false) && deployment.closeable? - .inline - = link_to [:play, @project.namespace.becomes(Namespace), @project, deployment.close_action], method: :post, class: 'btn close-env-link', rel: 'nofollow', data: { confirm: 'Are you sure you want to close this environment?' } do - = icon('stop', class: 'close-env-icon') - - - if local_assigns.fetch(:allow_rollback, false) - = link_to [:retry, @project.namespace.becomes(Namespace), @project, deployment.deployable], method: :post, class: 'btn' do - - if deployment.last? - Re-deploy - - else - Rollback diff --git a/app/views/projects/deployments/_deployment.html.haml b/app/views/projects/deployments/_deployment.html.haml index ca0005abd0c..9238f232c7e 100644 --- a/app/views/projects/deployments/_deployment.html.haml +++ b/app/views/projects/deployments/_deployment.html.haml @@ -17,4 +17,6 @@ #{time_ago_with_tooltip(deployment.created_at)} %td.hidden-xs - = render 'projects/deployments/actions', deployment: deployment, allow_rollback: true + .pull-right + = render 'projects/deployments/actions', deployment: deployment + = render 'projects/deployments/rollback', deployment: deployment diff --git a/app/views/projects/deployments/_rollback.haml b/app/views/projects/deployments/_rollback.haml new file mode 100644 index 00000000000..5941e01c6f1 --- /dev/null +++ b/app/views/projects/deployments/_rollback.haml @@ -0,0 +1,6 @@ +- if can?(current_user, :create_deployment, deployment) && deployment.deployable + = link_to [:retry, @project.namespace.becomes(Namespace), @project, deployment.deployable], method: :post, class: 'btn btn-build' do + - if deployment.last? + Re-deploy + - else + Rollback diff --git a/app/views/projects/environments/_environment.html.haml b/app/views/projects/environments/_environment.html.haml index 19c536897bd..b75d5df4150 100644 --- a/app/views/projects/environments/_environment.html.haml +++ b/app/views/projects/environments/_environment.html.haml @@ -28,4 +28,8 @@ #{time_ago_with_tooltip(last_deployment.created_at)} %td.hidden-xs - = render 'projects/deployments/actions', deployment: last_deployment, allow_close: environment.opened? + .pull-right + = render 'projects/environments/external_url', environment: environment + = render 'projects/deployments/actions', deployment: last_deployment + = render 'projects/environments/stop', environment: environment + = render 'projects/deployments/rollback', deployment: last_deployment diff --git a/app/views/projects/environments/_external_url.html.haml b/app/views/projects/environments/_external_url.html.haml new file mode 100644 index 00000000000..6255e4baea0 --- /dev/null +++ b/app/views/projects/environments/_external_url.html.haml @@ -0,0 +1,3 @@ +- if environment.external_url + = link_to environment.external_url, target: '_blank', class: 'btn external-url' do + = icon('external-link') diff --git a/app/views/projects/environments/_stop.html.haml b/app/views/projects/environments/_stop.html.haml new file mode 100644 index 00000000000..6ed6aee141b --- /dev/null +++ b/app/views/projects/environments/_stop.html.haml @@ -0,0 +1,5 @@ +- if environment.available? && environment.stoppable? + .inline + = link_to stop_namespace_project_environment_path(@project.namespace, @project, environment), method: :post, + class: 'btn close-env-link', rel: 'nofollow', data: { confirm: 'Are you sure you want to close this environment?' } do + = icon('stop', class: 'close-env-icon') diff --git a/app/views/projects/environments/index.html.haml b/app/views/projects/environments/index.html.haml index f0b64a8775b..70185176222 100644 --- a/app/views/projects/environments/index.html.haml +++ b/app/views/projects/environments/index.html.haml @@ -8,14 +8,14 @@ %li{class: ('active' if @scope.nil?)} = link_to project_environments_path(@project) do Available - %span.badge.js-avaibale-environments-count - = number_with_delimiter(@all_environments.opened.count) + %span.badge.js-available-environments-count + = number_with_delimiter(@all_environments.available.count) - %li{class: ('active' if @scope == 'closed')} - = link_to project_environments_path(@project, scope: :closed) do + %li{class: ('active' if @scope == 'stopped')} + = link_to project_environments_path(@project, scope: :stopped) do Stopped %span.badge.js-stopped-environments-count - = number_with_delimiter(@all_environments.closed.count) + = number_with_delimiter(@all_environments.stopped.count) .nav-controls - if can?(current_user, :create_environment, @project) && !@all_environments.blank? diff --git a/app/views/projects/environments/show.html.haml b/app/views/projects/environments/show.html.haml index c4209d499ad..3b4d0395db0 100644 --- a/app/views/projects/environments/show.html.haml +++ b/app/views/projects/environments/show.html.haml @@ -2,18 +2,20 @@ - page_title "Environments" = render "projects/pipelines/head" -- last_deployment = @environment.last_deployment - %div{ class: container_class } .top-area .col-md-9 %h3.page-title= @environment.name.capitalize .col-md-3 .nav-controls + - if can?(current_user, :read_environmnet, @environment) + = render 'projects/environments/external_url', environment: @environment + - if can?(current_user, :update_environment, @environment) = link_to 'Edit', edit_namespace_project_environment_path(@project.namespace, @project, @environment), class: 'btn' - - if @environment.opened? && last_deployment.try(:close_action) - = link_to 'Close', [:play, @project.namespace.becomes(Namespace), @project, last_deployment.close_action], data: { confirm: 'Are you sure you want to close this environment?' }, class: 'btn btn-danger', method: :post + - if @environment.available? && @environment.stoppable? + = link_to 'Stop', stop_namespace_project_environment_path(@project.namespace, @project, @environment), data: { confirm: 'Are you sure you want to close this environment?' }, class: 'btn btn-danger', method: :post + = link_to 'Destroy', namespace_project_environment_path(@project.namespace, @project, @environment), data: { confirm: 'Are you sure you want to delete this environment?' }, class: 'btn btn-danger', method: :delete .deployments-container - if @deployments.blank? diff --git a/db/fixtures/development/14_pipelines.rb b/db/fixtures/development/14_pipelines.rb index d3fabe111a1..08ad3097d34 100644 --- a/db/fixtures/development/14_pipelines.rb +++ b/db/fixtures/development/14_pipelines.rb @@ -16,8 +16,8 @@ class Gitlab::Seeder::Pipelines { name: 'env:alpha', stage: 'deploy', environment: 'alpha', status: :pending }, { name: 'env:beta', stage: 'deploy', environment: 'beta', status: :running }, { name: 'env:gamma', stage: 'deploy', environment: 'gamma', status: :canceled }, - { name: 'staging', stage: 'deploy', environment: 'staging', status_event: :success }, - { name: 'close staging', stage: 'deploy', environment: 'staging', when: 'manual', status: :skipped, options: { environment: { close: true } } }, + { name: 'staging', stage: 'deploy', environment: 'staging', status_event: :success, options: { environment: { on_stop: 'stop staging' } } }, + { name: 'stop staging', stage: 'deploy', environment: 'staging', when: 'manual', status: :skipped }, { name: 'production', stage: 'deploy', environment: 'production', when: 'manual', status: :skipped }, { name: 'slack', stage: 'notify', when: 'manual', status: :created }, ] diff --git a/db/migrate/20161006104309_add_state_to_environment.rb b/db/migrate/20161006104309_add_state_to_environment.rb index 83dff07069f..ccb546654f9 100644 --- a/db/migrate/20161006104309_add_state_to_environment.rb +++ b/db/migrate/20161006104309_add_state_to_environment.rb @@ -6,7 +6,7 @@ class AddStateToEnvironment < ActiveRecord::Migration DOWNTIME = false def up - add_column_with_default(:environments, :state, :string, default: :opened) + add_column_with_default(:environments, :state, :string, default: :available) end def down diff --git a/db/migrate/20161017095000_add_properties_to_deployment.rb b/db/migrate/20161017095000_add_properties_to_deployment.rb new file mode 100644 index 00000000000..6371166a4d2 --- /dev/null +++ b/db/migrate/20161017095000_add_properties_to_deployment.rb @@ -0,0 +1,29 @@ +# See http://doc.gitlab.com/ce/development/migration_style_guide.html +# for more information on how to write migrations for GitLab. + +class AddPropertiesToDeployment < ActiveRecord::Migration + include Gitlab::Database::MigrationHelpers + + # Set this constant to true if this migration requires downtime. + DOWNTIME = false + + # When a migration requires downtime you **must** uncomment the following + # constant and define a short and easy to understand explanation as to why the + # migration requires downtime. + # DOWNTIME_REASON = '' + + # When using the methods "add_concurrent_index" or "add_column_with_default" + # you must disable the use of transactions as these methods can not run in an + # existing transaction. When using "add_concurrent_index" make sure that this + # method is the _only_ method called in the migration, any other changes + # should go in a separate migration. This ensures that upon failure _only_ the + # index creation fails and can be retried or reverted easily. + # + # To disable transactions uncomment the following line and remove these + # comments: + # disable_ddl_transaction! + + def change + add_column :deployments, :properties, :text + end +end diff --git a/db/schema.rb b/db/schema.rb index ba2cf686fa9..b574f4d4a6a 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -398,22 +398,13 @@ ActiveRecord::Schema.define(version: 20161007133303) do add_index "emails", ["user_id"], name: "index_emails_on_user_id", using: :btree create_table "environments", force: :cascade do |t| -<<<<<<< HEAD - t.integer "project_id" - t.string "name", null: false - t.datetime "created_at" - t.datetime "updated_at" - t.string "external_url" - t.string "environment_type" - t.string "state", default: "opened", null: false -======= t.integer "project_id" t.string "name", null: false t.datetime "created_at" t.datetime "updated_at" t.string "external_url" t.string "environment_type" ->>>>>>> origin/master + t.string "state", default: "available", null: false end add_index "environments", ["project_id", "name"], name: "index_environments_on_project_id_and_name", using: :btree From 5f98d059396dc8c0faab4defd0414049c909b6c1 Mon Sep 17 00:00:00 2001 From: Kamil Trzcinski Date: Mon, 17 Oct 2016 12:46:00 +0200 Subject: [PATCH 023/174] Add `action` and `on_stop` to `environment` in .gitlab-ci.yml --- app/services/create_deployment_service.rb | 22 +++++++++------------- lib/gitlab/ci/config/node/environment.rb | 14 +++++++++++--- 2 files changed, 20 insertions(+), 16 deletions(-) diff --git a/app/services/create_deployment_service.rb b/app/services/create_deployment_service.rb index 47c740addb0..2e859a30cac 100644 --- a/app/services/create_deployment_service.rb +++ b/app/services/create_deployment_service.rb @@ -6,14 +6,12 @@ class CreateDeploymentService < BaseService ActiveRecord::Base.transaction do @deployable = deployable - @environment = prepare_environment + @environment = environment + @environment.external_url = expanded_url if expanded_url + @environment.state_event = action + @environment.save - if stop? - @environment.stop - return - end - - @environment.start + return if @environment.stopped? deploy.tap do |deployment| deployment.update_merge_request_metrics! @@ -37,10 +35,8 @@ class CreateDeploymentService < BaseService deployable: @deployable) end - def prepare_environment - project.environments.find_or_create_by(name: expanded_name) do |environment| - environment.external_url = expanded_url - end + def environment + @environment ||= project.environments.find_or_create_by(name: expanded_name) end def expanded_name @@ -69,7 +65,7 @@ class CreateDeploymentService < BaseService params[:variables] || [] end - def stop? - params[:options].fetch(:stop, false) + def action + params[:options].fetch(:action, 'start') end end diff --git a/lib/gitlab/ci/config/node/environment.rb b/lib/gitlab/ci/config/node/environment.rb index daa115f9017..1c1d07843b1 100644 --- a/lib/gitlab/ci/config/node/environment.rb +++ b/lib/gitlab/ci/config/node/environment.rb @@ -8,7 +8,7 @@ module Gitlab class Environment < Entry include Validatable - ALLOWED_KEYS = %i[name url close] + ALLOWED_KEYS = %i[name url action on_stop] validations do validate do @@ -36,7 +36,11 @@ module Gitlab addressable_url: true, allow_nil: true - validates :close, boolean: true, allow_nil: true + validates :action, + inclusion: { in: %w[start stop], message: 'should be start or stop, ' }, + allow_nil: true + + validates :on_stop, string: true, allow_nil: true end end @@ -56,9 +60,13 @@ module Gitlab value[:url] end + def action + value[:action] || 'start' + end + def value case @config - when String then { name: @config } + when String then { name: @config, action: 'start' } when Hash then @config else {} end From 021263916c3c1560a461ab0d519a309a6f918800 Mon Sep 17 00:00:00 2001 From: Kamil Trzcinski Date: Mon, 17 Oct 2016 12:48:19 +0200 Subject: [PATCH 024/174] Save `on_stop` in deployment --- app/services/create_deployment_service.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/services/create_deployment_service.rb b/app/services/create_deployment_service.rb index 2e859a30cac..5e6745cdd4e 100644 --- a/app/services/create_deployment_service.rb +++ b/app/services/create_deployment_service.rb @@ -32,7 +32,8 @@ class CreateDeploymentService < BaseService tag: params[:tag], sha: params[:sha], user: current_user, - deployable: @deployable) + deployable: @deployable, + on_stop: options.fetch(:on_stop, nil)) end def environment From a8cc76e2a82ed225b246a31d45d41d5ca52a529e Mon Sep 17 00:00:00 2001 From: Filipa Lacerda Date: Mon, 17 Oct 2016 11:48:56 +0100 Subject: [PATCH 025/174] Renames button to show 'Stop' instead of 'Close' --- app/views/projects/environments/show.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/projects/environments/show.html.haml b/app/views/projects/environments/show.html.haml index c4209d499ad..6507768ddc5 100644 --- a/app/views/projects/environments/show.html.haml +++ b/app/views/projects/environments/show.html.haml @@ -13,7 +13,7 @@ - if can?(current_user, :update_environment, @environment) = link_to 'Edit', edit_namespace_project_environment_path(@project.namespace, @project, @environment), class: 'btn' - if @environment.opened? && last_deployment.try(:close_action) - = link_to 'Close', [:play, @project.namespace.becomes(Namespace), @project, last_deployment.close_action], data: { confirm: 'Are you sure you want to close this environment?' }, class: 'btn btn-danger', method: :post + = link_to 'Stop', [:play, @project.namespace.becomes(Namespace), @project, last_deployment.close_action], data: { confirm: 'Are you sure you want to close this environment?' }, class: 'btn btn-danger', method: :post .deployments-container - if @deployments.blank? From 53d79469b0dd2b3c054dabe685231747352aee9f Mon Sep 17 00:00:00 2001 From: Kamil Trzcinski Date: Mon, 17 Oct 2016 12:51:37 +0200 Subject: [PATCH 026/174] Update `db/schema.rb` --- db/schema.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/db/schema.rb b/db/schema.rb index b574f4d4a6a..f568a5ec699 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20161007133303) do +ActiveRecord::Schema.define(version: 20161017095000) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -380,6 +380,7 @@ ActiveRecord::Schema.define(version: 20161007133303) do t.string "deployable_type" t.datetime "created_at" t.datetime "updated_at" + t.text "properties" end add_index "deployments", ["project_id", "environment_id", "iid"], name: "index_deployments_on_project_id_and_environment_id_and_iid", using: :btree From 18bb0a5696cd701d3a77c059fabb5d2f798f3a83 Mon Sep 17 00:00:00 2001 From: Kamil Trzcinski Date: Mon, 17 Oct 2016 15:34:30 +0200 Subject: [PATCH 027/174] Add on_stop column [ci skip] --- app/models/deployment.rb | 2 -- ...1017095000_add_properties_to_deployment.rb | 22 +------------------ db/schema.rb | 2 +- 3 files changed, 2 insertions(+), 24 deletions(-) diff --git a/app/models/deployment.rb b/app/models/deployment.rb index 18d9e96301c..f6cccae4334 100644 --- a/app/models/deployment.rb +++ b/app/models/deployment.rb @@ -11,8 +11,6 @@ class Deployment < ActiveRecord::Base delegate :name, to: :environment, prefix: true - store :properties, accessors: [:on_stop] - after_save :create_ref def commit diff --git a/db/migrate/20161017095000_add_properties_to_deployment.rb b/db/migrate/20161017095000_add_properties_to_deployment.rb index 6371166a4d2..f620ee0de1c 100644 --- a/db/migrate/20161017095000_add_properties_to_deployment.rb +++ b/db/migrate/20161017095000_add_properties_to_deployment.rb @@ -1,29 +1,9 @@ -# See http://doc.gitlab.com/ce/development/migration_style_guide.html -# for more information on how to write migrations for GitLab. - class AddPropertiesToDeployment < ActiveRecord::Migration include Gitlab::Database::MigrationHelpers - # Set this constant to true if this migration requires downtime. DOWNTIME = false - # When a migration requires downtime you **must** uncomment the following - # constant and define a short and easy to understand explanation as to why the - # migration requires downtime. - # DOWNTIME_REASON = '' - - # When using the methods "add_concurrent_index" or "add_column_with_default" - # you must disable the use of transactions as these methods can not run in an - # existing transaction. When using "add_concurrent_index" make sure that this - # method is the _only_ method called in the migration, any other changes - # should go in a separate migration. This ensures that upon failure _only_ the - # index creation fails and can be retried or reverted easily. - # - # To disable transactions uncomment the following line and remove these - # comments: - # disable_ddl_transaction! - def change - add_column :deployments, :properties, :text + add_column :deployments, :on_stop, :string end end diff --git a/db/schema.rb b/db/schema.rb index f568a5ec699..d4e35626e9b 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -380,7 +380,7 @@ ActiveRecord::Schema.define(version: 20161017095000) do t.string "deployable_type" t.datetime "created_at" t.datetime "updated_at" - t.text "properties" + t.string "on_stop" end add_index "deployments", ["project_id", "environment_id", "iid"], name: "index_deployments_on_project_id_and_environment_id_and_iid", using: :btree From 50d3cc2b677dac855a6270f5ffed7085df8edcf8 Mon Sep 17 00:00:00 2001 From: Kamil Trzcinski Date: Mon, 17 Oct 2016 15:40:18 +0200 Subject: [PATCH 028/174] Remove destroy from environments [ci skip] --- .../projects/environments_controller.rb | 16 +++------------- config/routes/project.rb | 2 +- 2 files changed, 4 insertions(+), 14 deletions(-) diff --git a/app/controllers/projects/environments_controller.rb b/app/controllers/projects/environments_controller.rb index 40da5be2e49..efdfbd24cae 100644 --- a/app/controllers/projects/environments_controller.rb +++ b/app/controllers/projects/environments_controller.rb @@ -2,8 +2,8 @@ class Projects::EnvironmentsController < Projects::ApplicationController layout 'project' before_action :authorize_read_environment! before_action :authorize_create_environment!, only: [:new, :create] - before_action :authorize_update_environment!, only: [:edit, :update, :stop, :destroy] - before_action :environment, only: [:show, :edit, :update, :destroy] + before_action :authorize_update_environment!, only: [:edit, :update, :stop] + before_action :environment, only: [:show, :edit, :update, :stop] def index @scope = params[:scope] @@ -47,17 +47,7 @@ class Projects::EnvironmentsController < Projects::ApplicationController def stop action = @environment.stop_action new_action = action.active? ? action : action.play(current_user) - redirect_to [project.namespace.become(Namespace), project, new_action] - end - - def destroy - if @environment.destroy - flash[:notice] = 'Environment was successfully removed.' - else - flash[:alert] = 'Failed to remove environment.' - end - - redirect_to namespace_project_environments_path(project.namespace, project) + redirect_to [project.namespace.becomes(Namespace), project, new_action] end private diff --git a/config/routes/project.rb b/config/routes/project.rb index d73f76cd091..5e01d9a9e8f 100644 --- a/config/routes/project.rb +++ b/config/routes/project.rb @@ -318,7 +318,7 @@ resources :namespaces, path: '/', constraints: { id: /[a-zA-Z.0-9_\-]+/ }, only: end end - resources :environments do + resources :environments, except: [:destroy] do member do post :stop end From 409fee3300e387a781008155b6a4682098fb3d68 Mon Sep 17 00:00:00 2001 From: Filipa Lacerda Date: Mon, 17 Oct 2016 14:51:33 +0100 Subject: [PATCH 029/174] Updates close to say stop in confirm message --- app/assets/javascripts/merge_request_widget.js.es6 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/assets/javascripts/merge_request_widget.js.es6 b/app/assets/javascripts/merge_request_widget.js.es6 index fb55d13a223..639859ab96f 100644 --- a/app/assets/javascripts/merge_request_widget.js.es6 +++ b/app/assets/javascripts/merge_request_widget.js.es6 @@ -18,7 +18,7 @@ - + Stop environment From f7f6e0c07f6066d1c7d5d7d467e5200453e2a233 Mon Sep 17 00:00:00 2001 From: Filipa Lacerda Date: Mon, 17 Oct 2016 14:54:27 +0100 Subject: [PATCH 030/174] Adds entry to CHANGELOG --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 38765b347d0..15699bcf273 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -120,6 +120,7 @@ Please view this file on the master branch, on stable branches it's out of date. - Fix a typo in doc/api/labels.md - API: all unknown routing will be handled with 404 Not Found - Add docs for request profiling + - Delete dynamic environments (aka Review Apps) - Make guests unable to view MRs on private projects ## 8.12.7 From b8fd2dddb29d0b3d2a117c7234e19ce25ced168c Mon Sep 17 00:00:00 2001 From: Filipa Lacerda Date: Mon, 17 Oct 2016 15:08:01 +0100 Subject: [PATCH 031/174] Changes after review --- app/views/projects/environments/_stop.html.haml | 2 +- app/views/projects/environments/index.html.haml | 6 +++--- app/views/projects/environments/show.html.haml | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/views/projects/environments/_stop.html.haml b/app/views/projects/environments/_stop.html.haml index 6ed6aee141b..ccda591590a 100644 --- a/app/views/projects/environments/_stop.html.haml +++ b/app/views/projects/environments/_stop.html.haml @@ -1,5 +1,5 @@ - if environment.available? && environment.stoppable? .inline = link_to stop_namespace_project_environment_path(@project.namespace, @project, environment), method: :post, - class: 'btn close-env-link', rel: 'nofollow', data: { confirm: 'Are you sure you want to close this environment?' } do + class: 'btn close-env-link', rel: 'nofollow', data: { confirm: 'Are you sure you want to stop this environment?' } do = icon('stop', class: 'close-env-icon') diff --git a/app/views/projects/environments/index.html.haml b/app/views/projects/environments/index.html.haml index 70185176222..eeac6e3be1a 100644 --- a/app/views/projects/environments/index.html.haml +++ b/app/views/projects/environments/index.html.haml @@ -16,9 +16,9 @@ Stopped %span.badge.js-stopped-environments-count = number_with_delimiter(@all_environments.stopped.count) - - .nav-controls - - if can?(current_user, :create_environment, @project) && !@all_environments.blank? + + - if can?(current_user, :create_environment, @project) && !@all_environments.blank? + .nav-controls = link_to new_namespace_project_environment_path(@project.namespace, @project), class: 'btn btn-create' do New environment diff --git a/app/views/projects/environments/show.html.haml b/app/views/projects/environments/show.html.haml index 3b4d0395db0..d765ddb97ce 100644 --- a/app/views/projects/environments/show.html.haml +++ b/app/views/projects/environments/show.html.haml @@ -14,7 +14,7 @@ - if can?(current_user, :update_environment, @environment) = link_to 'Edit', edit_namespace_project_environment_path(@project.namespace, @project, @environment), class: 'btn' - if @environment.available? && @environment.stoppable? - = link_to 'Stop', stop_namespace_project_environment_path(@project.namespace, @project, @environment), data: { confirm: 'Are you sure you want to close this environment?' }, class: 'btn btn-danger', method: :post + = link_to 'Stop', stop_namespace_project_environment_path(@project.namespace, @project, @environment), data: { confirm: 'Are you sure you want to stop this environment?' }, class: 'btn btn-danger', method: :post = link_to 'Destroy', namespace_project_environment_path(@project.namespace, @project, @environment), data: { confirm: 'Are you sure you want to delete this environment?' }, class: 'btn btn-danger', method: :delete .deployments-container From 9b790f1cf97157240178601c62d2e557a404503e Mon Sep 17 00:00:00 2001 From: Kamil Trzcinski Date: Mon, 17 Oct 2016 16:13:19 +0200 Subject: [PATCH 032/174] Improve after code review --- .../javascripts/merge_request_widget.js.es6 | 2 +- .../projects/environments_controller.rb | 11 ++-- app/models/deployment.rb | 3 +- app/models/environment.rb | 9 +-- app/services/create_deployment_service.rb | 5 +- .../projects/environments/_stop.html.haml | 4 +- .../projects/environments/index.html.haml | 4 +- .../projects/environments/show.html.haml | 5 +- lib/gitlab/ci/config/node/environment.rb | 4 +- .../gitlab/ci/config/node/environment_spec.rb | 62 +++++++++++++++++++ 10 files changed, 86 insertions(+), 23 deletions(-) diff --git a/app/assets/javascripts/merge_request_widget.js.es6 b/app/assets/javascripts/merge_request_widget.js.es6 index fb55d13a223..639859ab96f 100644 --- a/app/assets/javascripts/merge_request_widget.js.es6 +++ b/app/assets/javascripts/merge_request_widget.js.es6 @@ -18,7 +18,7 @@ - + Stop environment diff --git a/app/controllers/projects/environments_controller.rb b/app/controllers/projects/environments_controller.rb index efdfbd24cae..86bc17a720a 100644 --- a/app/controllers/projects/environments_controller.rb +++ b/app/controllers/projects/environments_controller.rb @@ -8,11 +8,8 @@ class Projects::EnvironmentsController < Projects::ApplicationController def index @scope = params[:scope] @all_environments = project.environments - @environments = - case @scope - when 'stopped' then @all_environments.stopped - else @all_environments.available - end + @environments = @scope == 'stopped' ? + @all_environments.stopped : @all_environments.available end def show @@ -45,9 +42,11 @@ class Projects::EnvironmentsController < Projects::ApplicationController end def stop + return render_404 unless @environment.stoppable? + action = @environment.stop_action new_action = action.active? ? action : action.play(current_user) - redirect_to [project.namespace.becomes(Namespace), project, new_action] + redirect_to polymorphic_path([project.namespace.becomes(Namespace), project, new_action]) end private diff --git a/app/models/deployment.rb b/app/models/deployment.rb index f6cccae4334..1f8c5fb3d85 100644 --- a/app/models/deployment.rb +++ b/app/models/deployment.rb @@ -85,13 +85,14 @@ class Deployment < ActiveRecord::Base end def stop_action + return nil unless on_stop.present? return nil unless manual_actions @stop_action ||= manual_actions.find_by(name: on_stop) end def stoppable? - on_stop.present? && stop_action.present? + stop_action.present? end def formatted_deployment_time diff --git a/app/models/environment.rb b/app/models/environment.rb index 93e7dedd6f8..20da71ccb3f 100644 --- a/app/models/environment.rb +++ b/app/models/environment.rb @@ -19,10 +19,7 @@ class Environment < ActiveRecord::Base allow_nil: true, addressable_url: true - delegate :stoppable?, :stop_action, to: :last_deployment, allow_nil: true - - scope :available, -> { where(state: [:available]) } - scope :stopped, -> { where(state: [:stopped]) } + delegate :stop_action, to: :last_deployment, allow_nil: true state_machine :state, initial: :available do event :start do @@ -84,4 +81,8 @@ class Environment < ActiveRecord::Base external_url.gsub(/\A.*?:\/\//, '') end + + def stoppable? + available? && stop_action.present? + end end diff --git a/app/services/create_deployment_service.rb b/app/services/create_deployment_service.rb index 5e6745cdd4e..85c0bf72074 100644 --- a/app/services/create_deployment_service.rb +++ b/app/services/create_deployment_service.rb @@ -6,10 +6,11 @@ class CreateDeploymentService < BaseService ActiveRecord::Base.transaction do @deployable = deployable + @environment = environment @environment.external_url = expanded_url if expanded_url @environment.state_event = action - @environment.save + @environment.save! return if @environment.stopped? @@ -33,7 +34,7 @@ class CreateDeploymentService < BaseService sha: params[:sha], user: current_user, deployable: @deployable, - on_stop: options.fetch(:on_stop, nil)) + on_stop: options[:on_stop]) end def environment diff --git a/app/views/projects/environments/_stop.html.haml b/app/views/projects/environments/_stop.html.haml index 6ed6aee141b..c7dec086890 100644 --- a/app/views/projects/environments/_stop.html.haml +++ b/app/views/projects/environments/_stop.html.haml @@ -1,5 +1,5 @@ -- if environment.available? && environment.stoppable? +- if environment.stoppable? .inline = link_to stop_namespace_project_environment_path(@project.namespace, @project, environment), method: :post, - class: 'btn close-env-link', rel: 'nofollow', data: { confirm: 'Are you sure you want to close this environment?' } do + class: 'btn close-env-link', rel: 'nofollow', data: { confirm: 'Are you sure you want to stop this environment?' } do = icon('stop', class: 'close-env-icon') diff --git a/app/views/projects/environments/index.html.haml b/app/views/projects/environments/index.html.haml index 70185176222..705a1360ec5 100644 --- a/app/views/projects/environments/index.html.haml +++ b/app/views/projects/environments/index.html.haml @@ -17,8 +17,8 @@ %span.badge.js-stopped-environments-count = number_with_delimiter(@all_environments.stopped.count) - .nav-controls - - if can?(current_user, :create_environment, @project) && !@all_environments.blank? + - if can?(current_user, :create_environment, @project) && !@all_environments.blank? + .nav-controls = link_to new_namespace_project_environment_path(@project.namespace, @project), class: 'btn btn-create' do New environment diff --git a/app/views/projects/environments/show.html.haml b/app/views/projects/environments/show.html.haml index 3b4d0395db0..b6a1a7fc89e 100644 --- a/app/views/projects/environments/show.html.haml +++ b/app/views/projects/environments/show.html.haml @@ -13,9 +13,8 @@ - if can?(current_user, :update_environment, @environment) = link_to 'Edit', edit_namespace_project_environment_path(@project.namespace, @project, @environment), class: 'btn' - - if @environment.available? && @environment.stoppable? - = link_to 'Stop', stop_namespace_project_environment_path(@project.namespace, @project, @environment), data: { confirm: 'Are you sure you want to close this environment?' }, class: 'btn btn-danger', method: :post - = link_to 'Destroy', namespace_project_environment_path(@project.namespace, @project, @environment), data: { confirm: 'Are you sure you want to delete this environment?' }, class: 'btn btn-danger', method: :delete + - if @environment.stoppable? + = link_to 'Stop', stop_namespace_project_environment_path(@project.namespace, @project, @environment), data: { confirm: 'Are you sure you want to stop this environment?' }, class: 'btn btn-danger', method: :post .deployments-container - if @deployments.blank? diff --git a/lib/gitlab/ci/config/node/environment.rb b/lib/gitlab/ci/config/node/environment.rb index 1c1d07843b1..b392f272bd6 100644 --- a/lib/gitlab/ci/config/node/environment.rb +++ b/lib/gitlab/ci/config/node/environment.rb @@ -37,10 +37,10 @@ module Gitlab allow_nil: true validates :action, - inclusion: { in: %w[start stop], message: 'should be start or stop, ' }, + inclusion: { in: %w[start stop], message: 'should be start or stop' }, allow_nil: true - validates :on_stop, string: true, allow_nil: true + validates :on_stop, type: String, allow_nil: true end end diff --git a/spec/lib/gitlab/ci/config/node/environment_spec.rb b/spec/lib/gitlab/ci/config/node/environment_spec.rb index df453223da7..430e18a816f 100644 --- a/spec/lib/gitlab/ci/config/node/environment_spec.rb +++ b/spec/lib/gitlab/ci/config/node/environment_spec.rb @@ -87,6 +87,68 @@ describe Gitlab::Ci::Config::Node::Environment do end end + context 'when valid action is used' do + let(:config) do + { name: 'production', + action: 'start' } + end + + it 'is valid' do + expect(entry).to be_valid + end + end + + context 'when invalid action is used' do + let(:config) do + { name: 'production', + action: false } + end + + describe '#valid?' do + it 'is not valid' do + expect(entry).not_to be_valid + end + end + + describe '#errors' do + it 'contains error about invalid action' do + expect(entry.errors) + .to include 'environment action should be start or stop' + end + end + end + + context 'when on_stop is used' do + let(:config) do + { name: 'production', + on_stop: 'close_app' } + end + + it 'is valid' do + expect(entry).to be_valid + end + end + + context 'when invalid on_stop is used' do + let(:config) do + { name: 'production', + on_stop: false } + end + + describe '#valid?' do + it 'is not valid' do + expect(entry).not_to be_valid + end + end + + describe '#errors' do + it 'contains error about invalid action' do + expect(entry.errors) + .to include 'environment action should be start or stop' + end + end + end + context 'when variables are used for environment' do let(:config) do { name: 'review/$CI_BUILD_REF_NAME', From 25dd1712ca01d017fd3b9c2d230a62e82444b5a1 Mon Sep 17 00:00:00 2001 From: Kamil Trzcinski Date: Mon, 17 Oct 2016 16:23:17 +0200 Subject: [PATCH 033/174] Add specs to test on_stop and action on environments --- lib/gitlab/ci/config/node/environment.rb | 4 ++++ spec/lib/gitlab/ci/config/node/environment_spec.rb | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/lib/gitlab/ci/config/node/environment.rb b/lib/gitlab/ci/config/node/environment.rb index b392f272bd6..9a95ef43628 100644 --- a/lib/gitlab/ci/config/node/environment.rb +++ b/lib/gitlab/ci/config/node/environment.rb @@ -64,6 +64,10 @@ module Gitlab value[:action] || 'start' end + def on_stop + value[:on_stop] + end + def value case @config when String then { name: @config, action: 'start' } diff --git a/spec/lib/gitlab/ci/config/node/environment_spec.rb b/spec/lib/gitlab/ci/config/node/environment_spec.rb index 430e18a816f..dbeb28c8aad 100644 --- a/spec/lib/gitlab/ci/config/node/environment_spec.rb +++ b/spec/lib/gitlab/ci/config/node/environment_spec.rb @@ -101,7 +101,7 @@ describe Gitlab::Ci::Config::Node::Environment do context 'when invalid action is used' do let(:config) do { name: 'production', - action: false } + action: 'invalid' } end describe '#valid?' do @@ -144,7 +144,7 @@ describe Gitlab::Ci::Config::Node::Environment do describe '#errors' do it 'contains error about invalid action' do expect(entry.errors) - .to include 'environment action should be start or stop' + .to include 'environment on stop should be a string' end end end From 4a369185d77013b2138f2daf6d85b1358425e75c Mon Sep 17 00:00:00 2001 From: Kamil Trzcinski Date: Mon, 17 Oct 2016 17:10:26 +0200 Subject: [PATCH 034/174] Work on specs --- app/services/create_deployment_service.rb | 4 +- spec/models/deployment_spec.rb | 46 ++++++++++++++ spec/models/environment_spec.rb | 32 ++++++++++ .../create_deployment_service_spec.rb | 61 ++++++++++++++++++- 4 files changed, 140 insertions(+), 3 deletions(-) diff --git a/app/services/create_deployment_service.rb b/app/services/create_deployment_service.rb index 85c0bf72074..c55d2ed231a 100644 --- a/app/services/create_deployment_service.rb +++ b/app/services/create_deployment_service.rb @@ -9,7 +9,7 @@ class CreateDeploymentService < BaseService @environment = environment @environment.external_url = expanded_url if expanded_url - @environment.state_event = action + @environment.fire_state_event(action) @environment.save! return if @environment.stopped? @@ -68,6 +68,6 @@ class CreateDeploymentService < BaseService end def action - params[:options].fetch(:action, 'start') + options[:action] || 'start' end end diff --git a/spec/models/deployment_spec.rb b/spec/models/deployment_spec.rb index 01a4a53a264..ca594a320c0 100644 --- a/spec/models/deployment_spec.rb +++ b/spec/models/deployment_spec.rb @@ -48,4 +48,50 @@ describe Deployment, models: true do end end end + + describe '#stop_action' do + let(:build) { create(:ci_build) } + + subject { deployment.stop_action } + + context 'when no other actions' do + let(:deployment) { FactoryGirl.build(:deployment, deployable: build) } + + it { is_expected.to be_nil } + end + + context 'with other actions' do + let!(:close_action) { create(:ci_build, pipeline: build.pipeline, name: 'close_app', when: :manual) } + + context 'when matching action is defined' do + let(:deployment) { FactoryGirl.build(:deployment, deployable: build, on_stop: 'close_other_app') } + + it { is_expected.to be_nil } + end + + context 'when no matching action is defined' do + let(:deployment) { FactoryGirl.build(:deployment, deployable: build, on_stop: 'close_app') } + + it { is_expected.to eq(close_action) } + end + end + end + + describe '#stoppable?' do + subject { deployment.stoppable? } + + context 'when no other actions' do + let(:deployment) { build(:deployment) } + + it { is_expected.to be_falsey } + end + + context 'when matching action is defined' do + let(:build) { create(:ci_build) } + let(:deployment) { FactoryGirl.build(:deployment, deployable: build, on_stop: 'close_app') } + let!(:close_action) { create(:ci_build, pipeline: build.pipeline, name: 'close_app', when: :manual) } + + it { is_expected.to be_truthy } + end + end end diff --git a/spec/models/environment_spec.rb b/spec/models/environment_spec.rb index e172ee8e590..b019f2ddb77 100644 --- a/spec/models/environment_spec.rb +++ b/spec/models/environment_spec.rb @@ -8,6 +8,8 @@ describe Environment, models: true do it { is_expected.to delegate_method(:last_deployment).to(:deployments).as(:last) } + it { is_expected.to delegate_method(:stop_action).to(:last_deployment).as(:last) } + it { is_expected.to validate_presence_of(:name) } it { is_expected.to validate_uniqueness_of(:name).scoped_to(:project_id) } it { is_expected.to validate_length_of(:name).is_within(0..255) } @@ -96,4 +98,34 @@ describe Environment, models: true do is_expected.to be_nil end end + + describe '#stoppable?' do + subject { environment.stoppable? } + + context 'when no other actions' do + it { is_expected.to be_falsey } + end + + context 'when matching action is defined' do + let(:build) { create(:ci_build) } + let!(:deployment) { create(:deployment, environment: environment, deployable: build, on_stop: 'close_app') } + let!(:close_action) { create(:ci_build, pipeline: build.pipeline, name: 'close_app', when: :manual) } + + context 'when environment is available' do + before do + environment.start + end + + it { is_expected.to be_truthy } + end + + context 'when environment is stopped' do + before do + environment.stop + end + + it { is_expected.to be_falsey } + end + end + end end diff --git a/spec/services/create_deployment_service_spec.rb b/spec/services/create_deployment_service_spec.rb index 5fe56e7725f..d4ceb83caf8 100644 --- a/spec/services/create_deployment_service_spec.rb +++ b/spec/services/create_deployment_service_spec.rb @@ -7,11 +7,13 @@ describe CreateDeploymentService, services: true do let(:service) { described_class.new(project, user, params) } describe '#execute' do + let(:options) { nil } let(:params) do { environment: 'production', ref: 'master', tag: false, sha: '97de212e80737a608d939f648d959671fb0a0142', + options: options } end @@ -28,7 +30,7 @@ describe CreateDeploymentService, services: true do end context 'when environment exist' do - before { create(:environment, project: project, name: 'production') } + let!(:environment) { create(:environment, project: project, name: 'production') } it 'does not create a new environment' do expect { subject }.not_to change { Environment.count } @@ -37,6 +39,46 @@ describe CreateDeploymentService, services: true do it 'does create a deployment' do expect(subject).to be_persisted end + + context 'and start action is defined' do + let(:options) { { action: 'start' } } + + context 'and environment is stopped' do + before do + environment.stop + end + + it 'makes environment available' do + subject + + expect(environment.reload).to be_available + end + + it 'does not create a deployment' do + expect(subject).not_to be_persisted + end + end + end + + context 'and stop action is defined' do + let(:options) { { action: 'stop' } } + + context 'and environment is available' do + before do + environment.start + end + + it 'makes environment stopped' do + subject + + expect(environment.reload).to be_stopped + end + + it 'does not create a deployment' do + expect(subject).to be_nil + end + end + end end context 'for environment with invalid name' do @@ -83,6 +125,23 @@ describe CreateDeploymentService, services: true do it 'does create a new deployment' do expect(subject).to be_persisted end + + context 'and environment exist' do + it 'does not create a new environment' do + expect { subject }.not_to change { Environment.count } + end + + it 'updates external url' do + subject + + expect(subject.environment.name).to eq('review-apps/feature-review-apps') + expect(subject.environment.external_url).to eq('http://feature-review-apps.review-apps.gitlab.com') + end + + it 'does create a new deployment' do + expect(subject).to be_persisted + end + end end context 'when project was removed' do From e9880722076081df1576a3fb01e2c30feb6208ba Mon Sep 17 00:00:00 2001 From: Kamil Trzcinski Date: Mon, 17 Oct 2016 21:06:10 +0200 Subject: [PATCH 035/174] Fix environments specs --- .../projects/environments_controller.rb | 5 +- app/models/environment.rb | 3 + app/services/create_deployment_service.rb | 2 +- .../environments/_external_url.html.haml | 2 +- .../projects/environments/_stop.html.haml | 2 +- .../projects/environments/show.html.haml | 8 +- spec/features/environments_spec.rb | 76 ++++++++++++++----- .../create_deployment_service_spec.rb | 8 +- 8 files changed, 74 insertions(+), 32 deletions(-) diff --git a/app/controllers/projects/environments_controller.rb b/app/controllers/projects/environments_controller.rb index 86bc17a720a..02a659d3894 100644 --- a/app/controllers/projects/environments_controller.rb +++ b/app/controllers/projects/environments_controller.rb @@ -1,8 +1,9 @@ class Projects::EnvironmentsController < Projects::ApplicationController layout 'project' before_action :authorize_read_environment! - before_action :authorize_create_environment!, only: [:new, :create] - before_action :authorize_update_environment!, only: [:edit, :update, :stop] + before_action :authorize_create_environment!, only: [:new, :create, :stop] + before_action :authorize_create_deployment!, only: [:stop] + before_action :authorize_update_environment!, only: [:edit, :update] before_action :environment, only: [:show, :edit, :update, :stop] def index diff --git a/app/models/environment.rb b/app/models/environment.rb index 20da71ccb3f..ff55e751f70 100644 --- a/app/models/environment.rb +++ b/app/models/environment.rb @@ -21,6 +21,9 @@ class Environment < ActiveRecord::Base delegate :stop_action, to: :last_deployment, allow_nil: true + scope :available, -> { with_state(:available) } + scope :stopped, -> { with_state(:stopped) } + state_machine :state, initial: :available do event :start do transition stopped: :available diff --git a/app/services/create_deployment_service.rb b/app/services/create_deployment_service.rb index c55d2ed231a..8ae15ad32f4 100644 --- a/app/services/create_deployment_service.rb +++ b/app/services/create_deployment_service.rb @@ -10,8 +10,8 @@ class CreateDeploymentService < BaseService @environment = environment @environment.external_url = expanded_url if expanded_url @environment.fire_state_event(action) - @environment.save! + return unless @environment.save return if @environment.stopped? deploy.tap do |deployment| diff --git a/app/views/projects/environments/_external_url.html.haml b/app/views/projects/environments/_external_url.html.haml index 6255e4baea0..4c8fe1c271b 100644 --- a/app/views/projects/environments/_external_url.html.haml +++ b/app/views/projects/environments/_external_url.html.haml @@ -1,3 +1,3 @@ -- if environment.external_url +- if environment.external_url && can?(current_user, :read_environment, environment) = link_to environment.external_url, target: '_blank', class: 'btn external-url' do = icon('external-link') diff --git a/app/views/projects/environments/_stop.html.haml b/app/views/projects/environments/_stop.html.haml index c7dec086890..880f8c8c62c 100644 --- a/app/views/projects/environments/_stop.html.haml +++ b/app/views/projects/environments/_stop.html.haml @@ -1,4 +1,4 @@ -- if environment.stoppable? +- if can?(current_user, :create_deployment, environment) && environment.stoppable? .inline = link_to stop_namespace_project_environment_path(@project.namespace, @project, environment), method: :post, class: 'btn close-env-link', rel: 'nofollow', data: { confirm: 'Are you sure you want to stop this environment?' } do diff --git a/app/views/projects/environments/show.html.haml b/app/views/projects/environments/show.html.haml index b6a1a7fc89e..bf082a05c39 100644 --- a/app/views/projects/environments/show.html.haml +++ b/app/views/projects/environments/show.html.haml @@ -8,13 +8,11 @@ %h3.page-title= @environment.name.capitalize .col-md-3 .nav-controls - - if can?(current_user, :read_environmnet, @environment) - = render 'projects/environments/external_url', environment: @environment - + = render 'projects/environments/external_url', environment: @environment - if can?(current_user, :update_environment, @environment) = link_to 'Edit', edit_namespace_project_environment_path(@project.namespace, @project, @environment), class: 'btn' - - if @environment.stoppable? - = link_to 'Stop', stop_namespace_project_environment_path(@project.namespace, @project, @environment), data: { confirm: 'Are you sure you want to stop this environment?' }, class: 'btn btn-danger', method: :post + - if can?(current_user, :create_deployment, @environment) && @environment.stoppable? + = link_to 'Stop', stop_namespace_project_environment_path(@project.namespace, @project, @environment), data: { confirm: 'Are you sure you want to stop this environment?' }, class: 'btn btn-danger', method: :post .deployments-container - if @deployments.blank? diff --git a/spec/features/environments_spec.rb b/spec/features/environments_spec.rb index 35f5706f920..1b51bf9ef66 100644 --- a/spec/features/environments_spec.rb +++ b/spec/features/environments_spec.rb @@ -35,7 +35,7 @@ feature 'Environments', feature: true do end scenario 'does show 0 as counter for environments in both tabs' do - expect(page.find('.js-avaibale-environments-count').text).to eq('0') + expect(page.find('.js-available-environments-count').text).to eq('0') expect(page.find('.js-stopped-environments-count').text).to eq('0') end end @@ -48,7 +48,7 @@ feature 'Environments', feature: true do end scenario 'does show number of opened environments in Availabe tab' do - expect(page.find('.js-avaibale-environments-count').text).to eq('1') + expect(page.find('.js-available-environments-count').text).to eq('1') end scenario 'does show number of closed environments in Stopped tab' do @@ -92,6 +92,14 @@ feature 'Environments', feature: true do scenario 'does show build name and id' do expect(page).to have_link("#{build.name} (##{build.id})") end + + scenario 'does not show stop button' do + expect(page).not_to have_selector('.close-env-link') + end + + scenario 'does not show external link button' do + expect(page).not_to have_css('external-url') + end context 'with external_url' do given(:environment) { create(:environment, project: project, external_url: 'https://git.gitlab.com') } @@ -103,14 +111,27 @@ feature 'Environments', feature: true do end end - scenario 'does show close button' do - # TODO: Add test to verify if close button is visible - # This needs to be true: if local_assigns.fetch(:allow_close, false) && deployment.closeable? - end - - scenario 'does allow to close environment' do - # TODO: Add test to verify if close environment works - # This needs to be true: if local_assigns.fetch(:allow_close, false) && deployment.closeable? + context 'with stop action' do + given(:manual) { create(:ci_build, :manual, pipeline: pipeline, name: 'close_app') } + given(:deployment) { create(:deployment, environment: environment, deployable: build, on_stop: 'close_app') } + + scenario 'does show stop button' do + expect(page).to have_selector('.close-env-link') + end + + scenario 'does allow to stop environment' do + first('.close-env-link').click + + expect(page).to have_content('close_app') + end + + context 'for reporter' do + let(:role) { :reporter } + + scenario 'does not show stop button' do + expect(page).not_to have_selector('.close-env-link') + end + end end end end @@ -160,6 +181,10 @@ feature 'Environments', feature: true do expect(page).to have_link('Re-deploy') end + scenario 'does not show stop button' do + expect(page).not_to have_link('Stop') + end + context 'with manual action' do given(:manual) { create(:ci_build, :manual, pipeline: pipeline, name: 'deploy to production') } @@ -178,20 +203,33 @@ feature 'Environments', feature: true do given(:environment) { create(:environment, project: project, external_url: 'https://git.gitlab.com') } given(:build) { create(:ci_build, pipeline: pipeline) } given(:deployment) { create(:deployment, environment: environment, deployable: build) } - + scenario 'does show an external link button' do expect(page).to have_link(nil, href: environment.external_url) end end - scenario 'does show close button' do - # TODO: Add test to verify if close button is visible - # This needs to be true: if local_assigns.fetch(:allow_close, false) && deployment.closeable? - end - - scenario 'does allow to close environment' do - # TODO: Add test to verify if close environment works - # This needs to be true: if local_assigns.fetch(:allow_close, false) && deployment.closeable? + context 'with stop action' do + given(:manual) { create(:ci_build, :manual, pipeline: pipeline, name: 'close_app') } + given(:deployment) { create(:deployment, environment: environment, deployable: build, on_stop: 'close_app') } + + scenario 'does show stop button' do + expect(page).to have_link('Stop') + end + + scenario 'does allow to stop environment' do + click_link('Stop') + + expect(page).to have_content('close_app') + end + + context 'for reporter' do + let(:role) { :reporter } + + scenario 'does not show stop button' do + expect(page).not_to have_link('Stop') + end + end end end end diff --git a/spec/services/create_deployment_service_spec.rb b/spec/services/create_deployment_service_spec.rb index d4ceb83caf8..5a4562b939b 100644 --- a/spec/services/create_deployment_service_spec.rb +++ b/spec/services/create_deployment_service_spec.rb @@ -54,8 +54,8 @@ describe CreateDeploymentService, services: true do expect(environment.reload).to be_available end - it 'does not create a deployment' do - expect(subject).not_to be_persisted + it 'does create a deployment' do + expect(subject).to be_persisted end end end @@ -95,7 +95,7 @@ describe CreateDeploymentService, services: true do end it 'does not create a deployment' do - expect(subject).not_to be_persisted + expect(subject).to be_nil end end @@ -127,6 +127,8 @@ describe CreateDeploymentService, services: true do end context 'and environment exist' do + let!(:environment) { create(:environment, project: project, name: 'review-apps/feature-review-apps') } + it 'does not create a new environment' do expect { subject }.not_to change { Environment.count } end From 34e19b9b8dccd7cd2e6c2bb408e75c70f3b6f3b9 Mon Sep 17 00:00:00 2001 From: Kamil Trzcinski Date: Mon, 17 Oct 2016 22:01:56 +0200 Subject: [PATCH 036/174] Fix specs --- .../projects/environments_controller.rb | 2 +- spec/features/environments_spec.rb | 42 +---------------- .../merge_when_build_succeeds_spec.rb | 9 ---- .../merge_requests/widget_deployments_spec.rb | 47 ++++++++++++++++--- 4 files changed, 43 insertions(+), 57 deletions(-) diff --git a/app/controllers/projects/environments_controller.rb b/app/controllers/projects/environments_controller.rb index 02a659d3894..e243253c5f1 100644 --- a/app/controllers/projects/environments_controller.rb +++ b/app/controllers/projects/environments_controller.rb @@ -1,7 +1,7 @@ class Projects::EnvironmentsController < Projects::ApplicationController layout 'project' before_action :authorize_read_environment! - before_action :authorize_create_environment!, only: [:new, :create, :stop] + before_action :authorize_create_environment!, only: [:new, :create] before_action :authorize_create_deployment!, only: [:stop] before_action :authorize_update_environment!, only: [:edit, :update] before_action :environment, only: [:show, :edit, :update, :stop] diff --git a/spec/features/environments_spec.rb b/spec/features/environments_spec.rb index 1b51bf9ef66..16c44e42f63 100644 --- a/spec/features/environments_spec.rb +++ b/spec/features/environments_spec.rb @@ -119,7 +119,7 @@ feature 'Environments', feature: true do expect(page).to have_selector('.close-env-link') end - scenario 'does allow to stop environment' do + scenario 'starts build when stop button clicked' do first('.close-env-link').click expect(page).to have_content('close_app') @@ -217,7 +217,7 @@ feature 'Environments', feature: true do expect(page).to have_link('Stop') end - scenario 'does allow to stop environment' do + scenario ' scenario 'does allow to stop environment' do' do click_link('Stop') expect(page).to have_content('close_app') @@ -277,42 +277,4 @@ feature 'Environments', feature: true do end end end - - describe 'when deleting existing environment' do - given(:environment) { create(:environment, project: project) } - - before do - visit namespace_project_environment_path(project.namespace, project, environment) - end - - context 'when logged as master' do - given(:role) { :master } - - scenario 'does not have a Close link' do - expect(page).not_to have_link('Close') - end - - context 'when environment is opened and can be closed' do - let(:project) { create(:project) } - let(:environment) { create(:environment, project: project) } - - let!(:deployment) do - create(:deployment, environment: environment, sha: project.commit('master').id) - end - - scenario 'does have a Close link' do - # TODO: Add missing validation. In order to have Close link - # this must be true: last_deployment.try(:close_action) - end - end - end - - context 'when logged as developer' do - given(:role) { :developer } - - scenario 'does not have a Close link' do - expect(page).not_to have_link('Close') - end - end - end end diff --git a/spec/features/merge_requests/merge_when_build_succeeds_spec.rb b/spec/features/merge_requests/merge_when_build_succeeds_spec.rb index 5d6ce6e1830..c3c3ab33872 100644 --- a/spec/features/merge_requests/merge_when_build_succeeds_spec.rb +++ b/spec/features/merge_requests/merge_when_build_succeeds_spec.rb @@ -101,15 +101,6 @@ feature 'Merge When Build Succeeds', feature: true, js: true do expect(page).not_to have_link "Merge When Build Succeeds" end end - - context 'Has Environment' do - let(:environment) { create(:environment, project: project) } - - it 'does show link to close the environment' do - # TODO add test to verify if the button is visible when this condition - # is met: if environment.closeable? - end - end def visit_merge_request(merge_request) visit namespace_project_merge_request_path(merge_request.project.namespace, merge_request.project, merge_request) diff --git a/spec/features/merge_requests/widget_deployments_spec.rb b/spec/features/merge_requests/widget_deployments_spec.rb index 8e23ec50d4a..0c8ee844b47 100644 --- a/spec/features/merge_requests/widget_deployments_spec.rb +++ b/spec/features/merge_requests/widget_deployments_spec.rb @@ -4,23 +4,56 @@ feature 'Widget Deployments Header', feature: true, js: true do include WaitForAjax describe 'when deployed to an environment' do - let(:project) { merge_request.target_project } - let(:merge_request) { create(:merge_request, :merged) } - let(:environment) { create(:environment, project: project) } - let!(:deployment) do + given(:user) { create(:user) } + given(:project) { merge_request.target_project } + given(:merge_request) { create(:merge_request, :merged) } + given(:environment) { create(:environment, project: project) } + given(:role) { :developer } + given!(:deployment) do create(:deployment, environment: environment, sha: project.commit('master').id) end + given!(:manual) { } - before do - login_as :admin + background do + login_as(user) + project.team << [user, role] visit namespace_project_merge_request_path(project.namespace, project, merge_request) end - it 'displays that the environment is deployed' do + scenario 'displays that the environment is deployed' do wait_for_ajax expect(page).to have_content("Deployed to #{environment.name}") expect(find('.ci_widget > span > span')['data-title']).to eq(deployment.created_at.to_time.in_time_zone.to_s(:medium)) end + + context 'with stop action' do + given(:pipeline) { create(:ci_pipeline, project: project) } + given(:build) { create(:ci_build, pipeline: pipeline) } + given(:manual) { create(:ci_build, :manual, pipeline: pipeline, name: 'close_app') } + given(:deployment) { create(:deployment, environment: environment, deployable: build, on_stop: 'close_app') } + + background do + wait_for_ajax + end + + scenario 'does show stop button' do + expect(page).to have_link('Stop environment') + end + + scenario 'does start build when stop button clicked' do + click_link('Stop environment') + + expect(page).to have_content('close_app') + end + + context 'for reporter' do + given(:role) { :reporter } + + scenario 'does not show stop button' do + expect(page).not_to have_link('Stop environment') + end + end + end end end From c3cf103fee47c056c7258d2921a34cf68a02022c Mon Sep 17 00:00:00 2001 From: Filipa Lacerda Date: Mon, 17 Oct 2016 22:10:43 +0100 Subject: [PATCH 037/174] Updates class name for consistency --- app/assets/javascripts/merge_request_widget.js.es6 | 4 ++-- app/assets/stylesheets/pages/environments.scss | 4 ++-- app/assets/stylesheets/pages/merge_requests.scss | 2 +- app/views/projects/environments/_stop.html.haml | 4 ++-- spec/features/environments_spec.rb | 8 ++++---- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/app/assets/javascripts/merge_request_widget.js.es6 b/app/assets/javascripts/merge_request_widget.js.es6 index 639859ab96f..3ff6851d59b 100644 --- a/app/assets/javascripts/merge_request_widget.js.es6 +++ b/app/assets/javascripts/merge_request_widget.js.es6 @@ -17,7 +17,7 @@ View on <%- external_url_formatted %> - + Stop environment @@ -213,7 +213,7 @@ if (!environment.external_url || !environment.external_url_formatted) $('.js-environment-link', $template).remove(); if (!environment.stop_url) { - $('.js-close-env-link', $template).remove(); + $('.js-stop-env-link', $template).remove(); } if (environment.deployed_at && environment.deployed_at_formatted) { diff --git a/app/assets/stylesheets/pages/environments.scss b/app/assets/stylesheets/pages/environments.scss index 9d3492abfb5..12ee0a5dc3d 100644 --- a/app/assets/stylesheets/pages/environments.scss +++ b/app/assets/stylesheets/pages/environments.scss @@ -38,10 +38,10 @@ color: $gl-dark-link-color; } - .close-env-link { + .stop-env-link { color: $table-text-gray; - .close-env-icon { + .stop-env-icon { font-size: 14px; } } diff --git a/app/assets/stylesheets/pages/merge_requests.scss b/app/assets/stylesheets/pages/merge_requests.scss index f14f13494e0..e27a82ee5f1 100644 --- a/app/assets/stylesheets/pages/merge_requests.scss +++ b/app/assets/stylesheets/pages/merge_requests.scss @@ -184,7 +184,7 @@ float: right; } - .close-env-container { + .stop-env-container { color: $gl-text-color; float: right; diff --git a/app/views/projects/environments/_stop.html.haml b/app/views/projects/environments/_stop.html.haml index 880f8c8c62c..69848123c17 100644 --- a/app/views/projects/environments/_stop.html.haml +++ b/app/views/projects/environments/_stop.html.haml @@ -1,5 +1,5 @@ - if can?(current_user, :create_deployment, environment) && environment.stoppable? .inline = link_to stop_namespace_project_environment_path(@project.namespace, @project, environment), method: :post, - class: 'btn close-env-link', rel: 'nofollow', data: { confirm: 'Are you sure you want to stop this environment?' } do - = icon('stop', class: 'close-env-icon') + class: 'btn stop-env-link', rel: 'nofollow', data: { confirm: 'Are you sure you want to stop this environment?' } do + = icon('stop', class: 'stop-env-icon') diff --git a/spec/features/environments_spec.rb b/spec/features/environments_spec.rb index 16c44e42f63..c4f230d2007 100644 --- a/spec/features/environments_spec.rb +++ b/spec/features/environments_spec.rb @@ -94,7 +94,7 @@ feature 'Environments', feature: true do end scenario 'does not show stop button' do - expect(page).not_to have_selector('.close-env-link') + expect(page).not_to have_selector('.stop-env-link') end scenario 'does not show external link button' do @@ -116,11 +116,11 @@ feature 'Environments', feature: true do given(:deployment) { create(:deployment, environment: environment, deployable: build, on_stop: 'close_app') } scenario 'does show stop button' do - expect(page).to have_selector('.close-env-link') + expect(page).to have_selector('.stop-env-link') end scenario 'starts build when stop button clicked' do - first('.close-env-link').click + first('.stop-env-link').click expect(page).to have_content('close_app') end @@ -129,7 +129,7 @@ feature 'Environments', feature: true do let(:role) { :reporter } scenario 'does not show stop button' do - expect(page).not_to have_selector('.close-env-link') + expect(page).not_to have_selector('.stop-env-link') end end end From 5a46e22a6521af8058078e00a8e6f2252b21e8f7 Mon Sep 17 00:00:00 2001 From: Filipa Lacerda Date: Mon, 17 Oct 2016 22:12:26 +0100 Subject: [PATCH 038/174] Fixes typo --- spec/features/environments_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/features/environments_spec.rb b/spec/features/environments_spec.rb index c4f230d2007..7f67ff7df92 100644 --- a/spec/features/environments_spec.rb +++ b/spec/features/environments_spec.rb @@ -47,7 +47,7 @@ feature 'Environments', feature: true do expect(page).to have_link(environment.name) end - scenario 'does show number of opened environments in Availabe tab' do + scenario 'does show number of opened environments in Available tab' do expect(page.find('.js-available-environments-count').text).to eq('1') end From c4e0c051251a37b9afc5630b65701ae5a28de15b Mon Sep 17 00:00:00 2001 From: Filipa Lacerda Date: Mon, 17 Oct 2016 22:39:52 +0100 Subject: [PATCH 039/174] Fixes broken test --- spec/features/environments_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/features/environments_spec.rb b/spec/features/environments_spec.rb index 7f67ff7df92..6cc13290f2c 100644 --- a/spec/features/environments_spec.rb +++ b/spec/features/environments_spec.rb @@ -217,7 +217,7 @@ feature 'Environments', feature: true do expect(page).to have_link('Stop') end - scenario ' scenario 'does allow to stop environment' do' do + scenario 'does allow to stop environment' do click_link('Stop') expect(page).to have_content('close_app') From bebfceb1df03e8afa10af5aead8e657654a14f01 Mon Sep 17 00:00:00 2001 From: Kamil Trzcinski Date: Mon, 17 Oct 2016 23:40:44 +0200 Subject: [PATCH 040/174] Fix specs --- spec/features/environments_spec.rb | 18 +++++++++--------- spec/lib/ci/gitlab_ci_yaml_processor_spec.rb | 2 +- .../gitlab/ci/config/node/environment_spec.rb | 2 +- spec/models/environment_spec.rb | 2 +- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/spec/features/environments_spec.rb b/spec/features/environments_spec.rb index 7f67ff7df92..7200e9ad4c1 100644 --- a/spec/features/environments_spec.rb +++ b/spec/features/environments_spec.rb @@ -18,7 +18,7 @@ feature 'Environments', feature: true do before do visit namespace_project_environments_path(project.namespace, project) end - + context 'shows two tabs' do scenario 'does show Available tab with link' do expect(page).to have_link('Available') @@ -33,7 +33,7 @@ feature 'Environments', feature: true do scenario 'does show no environments' do expect(page).to have_content('You don\'t have any environments right now.') end - + scenario 'does show 0 as counter for environments in both tabs' do expect(page.find('.js-available-environments-count').text).to eq('0') expect(page.find('.js-stopped-environments-count').text).to eq('0') @@ -46,7 +46,7 @@ feature 'Environments', feature: true do scenario 'does show environment name' do expect(page).to have_link(environment.name) end - + scenario 'does show number of opened environments in Available tab' do expect(page.find('.js-available-environments-count').text).to eq('1') end @@ -67,7 +67,7 @@ feature 'Environments', feature: true do scenario 'does show deployment SHA' do expect(page).to have_link(deployment.short_sha) end - + scenario 'does show deployment internal id' do expect(page).to have_content(deployment.iid) end @@ -88,7 +88,7 @@ feature 'Environments', feature: true do expect(page).to have_content(manual.name) expect(manual.reload).to be_pending end - + scenario 'does show build name and id' do expect(page).to have_link("#{build.name} (##{build.id})") end @@ -100,12 +100,12 @@ feature 'Environments', feature: true do scenario 'does not show external link button' do expect(page).not_to have_css('external-url') end - + context 'with external_url' do given(:environment) { create(:environment, project: project, external_url: 'https://git.gitlab.com') } given(:build) { create(:ci_build, pipeline: pipeline) } given(:deployment) { create(:deployment, environment: environment, deployable: build) } - + scenario 'does show an external link button' do expect(page).to have_link(nil, href: environment.external_url) end @@ -198,7 +198,7 @@ feature 'Environments', feature: true do expect(page).to have_content(manual.name) expect(manual.reload).to be_pending end - + context 'with external_url' do given(:environment) { create(:environment, project: project, external_url: 'https://git.gitlab.com') } given(:build) { create(:ci_build, pipeline: pipeline) } @@ -217,7 +217,7 @@ feature 'Environments', feature: true do expect(page).to have_link('Stop') end - scenario ' scenario 'does allow to stop environment' do' do + scenario 'does allow to stop environment' do click_link('Stop') expect(page).to have_content('close_app') diff --git a/spec/lib/ci/gitlab_ci_yaml_processor_spec.rb b/spec/lib/ci/gitlab_ci_yaml_processor_spec.rb index 6dedd25e9d3..a46ff07f625 100644 --- a/spec/lib/ci/gitlab_ci_yaml_processor_spec.rb +++ b/spec/lib/ci/gitlab_ci_yaml_processor_spec.rb @@ -754,7 +754,7 @@ module Ci it 'does return production' do expect(builds.size).to eq(1) expect(builds.first[:environment]).to eq(environment) - expect(builds.first[:options]).to include(environment: { name: environment }) + expect(builds.first[:options]).to include(environment: { name: environment, action: "start" }) end end diff --git a/spec/lib/gitlab/ci/config/node/environment_spec.rb b/spec/lib/gitlab/ci/config/node/environment_spec.rb index dbeb28c8aad..df925ff1afd 100644 --- a/spec/lib/gitlab/ci/config/node/environment_spec.rb +++ b/spec/lib/gitlab/ci/config/node/environment_spec.rb @@ -28,7 +28,7 @@ describe Gitlab::Ci::Config::Node::Environment do describe '#value' do it 'returns valid hash' do - expect(entry.value).to eq(name: 'production') + expect(entry.value).to include(name: 'production') end end diff --git a/spec/models/environment_spec.rb b/spec/models/environment_spec.rb index b019f2ddb77..1c1fef57fc4 100644 --- a/spec/models/environment_spec.rb +++ b/spec/models/environment_spec.rb @@ -8,7 +8,7 @@ describe Environment, models: true do it { is_expected.to delegate_method(:last_deployment).to(:deployments).as(:last) } - it { is_expected.to delegate_method(:stop_action).to(:last_deployment).as(:last) } + it { is_expected.to delegate_method(:stop_action).to(:last_deployment) } it { is_expected.to validate_presence_of(:name) } it { is_expected.to validate_uniqueness_of(:name).scoped_to(:project_id) } From 829a708a970b31afdcda21fff072eda0c61dfd4c Mon Sep 17 00:00:00 2001 From: Kamil Trzcinski Date: Tue, 18 Oct 2016 11:22:22 +0200 Subject: [PATCH 041/174] Fix remaining specs failures --- app/controllers/projects/merge_requests_controller.rb | 7 ++++++- app/views/projects/environments/index.html.haml | 2 +- app/views/projects/environments/show.html.haml | 2 +- .../features/merge_requests/widget_deployments_spec.rb | 10 ++++++---- 4 files changed, 14 insertions(+), 7 deletions(-) diff --git a/app/controllers/projects/merge_requests_controller.rb b/app/controllers/projects/merge_requests_controller.rb index 86e12660c23..7bac0a2b1c7 100644 --- a/app/controllers/projects/merge_requests_controller.rb +++ b/app/controllers/projects/merge_requests_controller.rb @@ -412,11 +412,16 @@ class Projects::MergeRequestsController < Projects::ApplicationController project = environment.project deployment = environment.first_deployment_for(@merge_request.diff_head_commit) + stop_url = + if environment.stoppable? && can?(current_user, :create_deployment, environment) + stop_namespace_project_environment_path(project.namespace, project, environment) + end + { id: environment.id, name: environment.name, url: namespace_project_environment_path(project.namespace, project, environment), - stop_url: (stop_namespace_project_environment_path(project.namespace, project, environment) if environment.stoppable?), + stop_url: stop_url, external_url: environment.external_url, external_url_formatted: environment.formatted_external_url, deployed_at: deployment.try(:created_at), diff --git a/app/views/projects/environments/index.html.haml b/app/views/projects/environments/index.html.haml index 705a1360ec5..8f555afcf11 100644 --- a/app/views/projects/environments/index.html.haml +++ b/app/views/projects/environments/index.html.haml @@ -23,7 +23,7 @@ New environment .environments-container - - if @environments.blank? + - if @all_environments.blank? .blank-state.blank-state-no-icon %h2.blank-state-title You don't have any environments right now. diff --git a/app/views/projects/environments/show.html.haml b/app/views/projects/environments/show.html.haml index bf082a05c39..bcac73d3698 100644 --- a/app/views/projects/environments/show.html.haml +++ b/app/views/projects/environments/show.html.haml @@ -3,7 +3,7 @@ = render "projects/pipelines/head" %div{ class: container_class } - .top-area + .top-area.adjust .col-md-9 %h3.page-title= @environment.name.capitalize .col-md-3 diff --git a/spec/features/merge_requests/widget_deployments_spec.rb b/spec/features/merge_requests/widget_deployments_spec.rb index 0c8ee844b47..1be35b27d84 100644 --- a/spec/features/merge_requests/widget_deployments_spec.rb +++ b/spec/features/merge_requests/widget_deployments_spec.rb @@ -9,9 +9,8 @@ feature 'Widget Deployments Header', feature: true, js: true do given(:merge_request) { create(:merge_request, :merged) } given(:environment) { create(:environment, project: project) } given(:role) { :developer } - given!(:deployment) do - create(:deployment, environment: environment, sha: project.commit('master').id) - end + given(:sha) { project.commit('master').id } + given!(:deployment) { create(:deployment, environment: environment, sha: sha) } given!(:manual) { } background do @@ -31,7 +30,10 @@ feature 'Widget Deployments Header', feature: true, js: true do given(:pipeline) { create(:ci_pipeline, project: project) } given(:build) { create(:ci_build, pipeline: pipeline) } given(:manual) { create(:ci_build, :manual, pipeline: pipeline, name: 'close_app') } - given(:deployment) { create(:deployment, environment: environment, deployable: build, on_stop: 'close_app') } + given(:deployment) do + create(:deployment, environment: environment, ref: merge_request.target_branch, + sha: sha, deployable: build, on_stop: 'close_app') + end background do wait_for_ajax From 0aa232704c5df68f0ed111e355a07cfaf241e8a9 Mon Sep 17 00:00:00 2001 From: Kamil Trzcinski Date: Tue, 18 Oct 2016 12:02:50 +0200 Subject: [PATCH 042/174] Add `stop!` to `environment` --- .../projects/environments_controller.rb | 11 ++++-- app/models/environment.rb | 6 +++ spec/models/environment_spec.rb | 37 +++++++++++++++++++ 3 files changed, 50 insertions(+), 4 deletions(-) diff --git a/app/controllers/projects/environments_controller.rb b/app/controllers/projects/environments_controller.rb index e243253c5f1..5837f913d16 100644 --- a/app/controllers/projects/environments_controller.rb +++ b/app/controllers/projects/environments_controller.rb @@ -9,8 +9,12 @@ class Projects::EnvironmentsController < Projects::ApplicationController def index @scope = params[:scope] @all_environments = project.environments - @environments = @scope == 'stopped' ? - @all_environments.stopped : @all_environments.available + @environments = + if @scope == 'stopped' then + @all_environments.stopped + else + @all_environments.available + end end def show @@ -45,8 +49,7 @@ class Projects::EnvironmentsController < Projects::ApplicationController def stop return render_404 unless @environment.stoppable? - action = @environment.stop_action - new_action = action.active? ? action : action.play(current_user) + new_action = @environment.stop!(current_user) redirect_to polymorphic_path([project.namespace.becomes(Namespace), project, new_action]) end diff --git a/app/models/environment.rb b/app/models/environment.rb index ff55e751f70..d575f1dc73a 100644 --- a/app/models/environment.rb +++ b/app/models/environment.rb @@ -88,4 +88,10 @@ class Environment < ActiveRecord::Base def stoppable? available? && stop_action.present? end + + def stop!(current_user) + return unless stoppable? + + stop_action.play(current_user) + end end diff --git a/spec/models/environment_spec.rb b/spec/models/environment_spec.rb index 1c1fef57fc4..e1755f940b3 100644 --- a/spec/models/environment_spec.rb +++ b/spec/models/environment_spec.rb @@ -128,4 +128,41 @@ describe Environment, models: true do end end end + + describe '#stop!' do + let(:user) { create(:user) } + + subject { environment.stop!(user) } + + before do + expect(environment).to receive(:stoppable?).and_call_original + end + + context 'when no other actions' do + it { is_expected.to be_nil } + end + + context 'when matching action is defined' do + let(:build) { create(:ci_build) } + let!(:deployment) { create(:deployment, environment: environment, deployable: build, on_stop: 'close_app') } + + context 'when action did not yet finish' do + let!(:close_action) { create(:ci_build, :manual, pipeline: build.pipeline, name: 'close_app') } + + it 'returns the same action' do + is_expected.to eq(close_action) + is_expected.to include(user: user) + end + end + + context 'if action did finish' do + let!(:close_action) { create(:ci_build, :manual, :success, pipeline: build.pipeline, name: 'close_app') } + + it 'returns a new action of the same type' do + is_expected.to be_persisted + is_expected.to include(name: close_action.name, user: user) + end + end + end + end end From ad85928752ea6c41863c6b8225ff2279e3044bef Mon Sep 17 00:00:00 2001 From: Kamil Trzcinski Date: Tue, 18 Oct 2016 12:22:51 +0200 Subject: [PATCH 043/174] Add logical validation to gitlab-ci.yml --- .../projects/environments_controller.rb | 2 +- lib/ci/gitlab_ci_yaml_processor.rb | 30 ++++++++++++ spec/lib/ci/gitlab_ci_yaml_processor_spec.rb | 46 +++++++++++++++++++ 3 files changed, 77 insertions(+), 1 deletion(-) diff --git a/app/controllers/projects/environments_controller.rb b/app/controllers/projects/environments_controller.rb index 5837f913d16..ea22b2dcc15 100644 --- a/app/controllers/projects/environments_controller.rb +++ b/app/controllers/projects/environments_controller.rb @@ -10,7 +10,7 @@ class Projects::EnvironmentsController < Projects::ApplicationController @scope = params[:scope] @all_environments = project.environments @environments = - if @scope == 'stopped' then + if @scope == 'stopped' @all_environments.stopped else @all_environments.available diff --git a/lib/ci/gitlab_ci_yaml_processor.rb b/lib/ci/gitlab_ci_yaml_processor.rb index 2fd1fced65c..3e33c9399e2 100644 --- a/lib/ci/gitlab_ci_yaml_processor.rb +++ b/lib/ci/gitlab_ci_yaml_processor.rb @@ -109,6 +109,7 @@ module Ci validate_job_stage!(name, job) validate_job_dependencies!(name, job) + validate_job_environment!(name, job) end end @@ -150,6 +151,35 @@ module Ci end end + def validate_job_environment!(name, job) + return unless job[:environment] + return unless job[:environment].is_a?(Hash) + + environment = job[:environment] + validate_on_stop_job!(name, environment, environment[:on_stop]) + end + + def validate_on_stop_job!(name, environment, on_stop) + return unless on_stop + + on_stop_job = @jobs[on_stop.to_sym] + unless on_stop_job + raise ValidationError, "#{name} job: on_stop job #{on_stop} is not defined" + end + + unless on_stop_job[:environment] + raise ValidationError, "#{name} job: on_stop job #{on_stop} does not have environment defined" + end + + unless on_stop_job[:environment][:name] == environment[:name] + raise ValidationError, "#{name} job: on_stop job #{on_stop} have different environment name" + end + + unless on_stop_job[:environment][:action] == 'stop' + raise ValidationError, "#{name} job: on_stop job #{on_stop} needs to have action stop defined" + end + end + def process?(only_params, except_params, ref, tag, trigger_request) if only_params.present? return false unless matching?(only_params, ref, tag, trigger_request) diff --git a/spec/lib/ci/gitlab_ci_yaml_processor_spec.rb b/spec/lib/ci/gitlab_ci_yaml_processor_spec.rb index a46ff07f625..84f21631719 100644 --- a/spec/lib/ci/gitlab_ci_yaml_processor_spec.rb +++ b/spec/lib/ci/gitlab_ci_yaml_processor_spec.rb @@ -796,6 +796,52 @@ module Ci expect { builds }.to raise_error("jobs:deploy_to_production:environment name #{Gitlab::Regex.environment_name_regex_message}") end end + + context 'when on_stop is specified' do + let(:review) { { stage: 'deploy', script: 'test', environment: { name: 'review', on_stop: 'close_review' } } } + let(:config) { { review: review, close_review: close_review }.compact } + + context 'with matching job' do + let(:close_review) { { stage: 'deploy', script: 'test', environment: { name: 'review', action: 'stop' } } } + + it 'does return a list of builds' do + expect(builds.size).to eq(2) + expect(builds.first[:environment]).to eq('review') + end + end + + context 'without matching job' do + let(:close_review) { nil } + + it 'raises error' do + expect { builds }.to raise_error('review job: on_stop job close_review is not defined') + end + end + + context 'with close job without environment' do + let(:close_review) { { stage: 'deploy', script: 'test' } } + + it 'raises error' do + expect { builds }.to raise_error('review job: on_stop job close_review does not have environment defined') + end + end + + context 'with close job for different environment' do + let(:close_review) { { stage: 'deploy', script: 'test', environment: 'production' } } + + it 'raises error' do + expect { builds }.to raise_error('review job: on_stop job close_review have different environment name') + end + end + + context 'with close job without stop action' do + let(:close_review) { { stage: 'deploy', script: 'test', environment: { name: 'review' } } } + + it 'raises error' do + expect { builds }.to raise_error('review job: on_stop job close_review needs to have action stop defined') + end + end + end end describe "Dependencies" do From c4e45d89d407016c89c5217cb91a7a82cf8710f1 Mon Sep 17 00:00:00 2001 From: Kamil Trzcinski Date: Tue, 18 Oct 2016 13:51:12 +0200 Subject: [PATCH 044/174] Fix remaining offenses --- spec/features/merge_requests/widget_deployments_spec.rb | 2 +- spec/models/environment_spec.rb | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/spec/features/merge_requests/widget_deployments_spec.rb b/spec/features/merge_requests/widget_deployments_spec.rb index 1be35b27d84..6676821b807 100644 --- a/spec/features/merge_requests/widget_deployments_spec.rb +++ b/spec/features/merge_requests/widget_deployments_spec.rb @@ -32,7 +32,7 @@ feature 'Widget Deployments Header', feature: true, js: true do given(:manual) { create(:ci_build, :manual, pipeline: pipeline, name: 'close_app') } given(:deployment) do create(:deployment, environment: environment, ref: merge_request.target_branch, - sha: sha, deployable: build, on_stop: 'close_app') + sha: sha, deployable: build, on_stop: 'close_app') end background do diff --git a/spec/models/environment_spec.rb b/spec/models/environment_spec.rb index e1755f940b3..a94e6d0165f 100644 --- a/spec/models/environment_spec.rb +++ b/spec/models/environment_spec.rb @@ -150,8 +150,8 @@ describe Environment, models: true do let!(:close_action) { create(:ci_build, :manual, pipeline: build.pipeline, name: 'close_app') } it 'returns the same action' do - is_expected.to eq(close_action) - is_expected.to include(user: user) + expect(subject).to eq(close_action) + expect(subject.user).to eq(user) end end @@ -160,7 +160,8 @@ describe Environment, models: true do it 'returns a new action of the same type' do is_expected.to be_persisted - is_expected.to include(name: close_action.name, user: user) + expect(subject.name).to eq(close_action.name) + expect(subject.user).to eq(user) end end end From 9c8c5e9dc050f32cec05f6903105ff34d726979b Mon Sep 17 00:00:00 2001 From: amaia Date: Mon, 17 Oct 2016 05:53:12 -0700 Subject: [PATCH 045/174] fix: commit messages being double-escaped in activies tab --- CHANGELOG.md | 1 + lib/banzai/filter/html_entity_filter.rb | 2 +- spec/lib/banzai/filter/html_entity_filter_spec.rb | 5 +++++ 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 90379e011d6..5d6d5bc591c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -119,6 +119,7 @@ Please view this file on the master branch, on stable branches it's out of date. - Cleanup Ci::ApplicationController. !6757 (Takuya Noguchi) - Fixes padding in all clipboard icons that have .btn class - Fix a typo in doc/api/labels.md + - Fix double-escaping in activities tab (Alexandre Maia) - API: all unknown routing will be handled with 404 Not Found - Add docs for request profiling - Make guests unable to view MRs on private projects diff --git a/lib/banzai/filter/html_entity_filter.rb b/lib/banzai/filter/html_entity_filter.rb index e008fd428b0..f3bd587c28b 100644 --- a/lib/banzai/filter/html_entity_filter.rb +++ b/lib/banzai/filter/html_entity_filter.rb @@ -5,7 +5,7 @@ module Banzai # Text filter that escapes these HTML entities: & " < > class HtmlEntityFilter < HTML::Pipeline::TextFilter def call - ERB::Util.html_escape(text) + ERB::Util.html_escape_once(text) end end end diff --git a/spec/lib/banzai/filter/html_entity_filter_spec.rb b/spec/lib/banzai/filter/html_entity_filter_spec.rb index 4c68ce6d6e4..f9e6bd609f0 100644 --- a/spec/lib/banzai/filter/html_entity_filter_spec.rb +++ b/spec/lib/banzai/filter/html_entity_filter_spec.rb @@ -11,4 +11,9 @@ describe Banzai::Filter::HtmlEntityFilter, lib: true do expect(output).to eq(escaped) end + + it 'does not double-escape' do + escaped = ERB::Util.html_escape("Merge branch 'blabla' into 'master'") + expect(filter(escaped)).to eq(escaped) + end end From bc493bd88e35deb9e228aadb029320506814f863 Mon Sep 17 00:00:00 2001 From: Annabel Dunstone Date: Tue, 30 Aug 2016 15:25:41 -0500 Subject: [PATCH 046/174] Add pipelines tab to new MR --- app/views/projects/merge_requests/_new_submit.html.haml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/app/views/projects/merge_requests/_new_submit.html.haml b/app/views/projects/merge_requests/_new_submit.html.haml index da6927879a4..3a670cb70dd 100644 --- a/app/views/projects/merge_requests/_new_submit.html.haml +++ b/app/views/projects/merge_requests/_new_submit.html.haml @@ -18,6 +18,7 @@ = f.hidden_field :target_branch .mr-compare.merge-request +<<<<<<< 4a8cb230c6ba28ccdcd6da91855005e4fa0c46bf - if @commits.empty? .commits-empty %h4 @@ -30,6 +31,10 @@ Commits %span.badge= @commits.size - if @pipeline + %li.builds-tab + = link_to url_for(params), data: {target: 'div#pipelines', action: 'pipelines', toggle: 'tab'} do + Pipelines + %span.badge= @statuses.size %li.builds-tab = link_to url_for(params), data: {target: 'div#builds', action: 'builds', toggle: 'tab'} do Builds @@ -47,6 +52,8 @@ - if @pipeline #builds.builds.tab-pane = render "projects/merge_requests/show/builds" + #pipelines.pipelines.tab-pane + = render "projects/merge_requests/show/pipelines" .mr-loading-status = spinner From 04c03d9d5ce1b6240ad0a7f500b2faeba453401e Mon Sep 17 00:00:00 2001 From: Annabel Dunstone Gray Date: Mon, 10 Oct 2016 10:22:04 -0500 Subject: [PATCH 047/174] Fix pipeline tab content display and badge count --- app/views/projects/merge_requests/show/_pipelines.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/projects/merge_requests/show/_pipelines.html.haml b/app/views/projects/merge_requests/show/_pipelines.html.haml index afe3f3430c6..db0ba88417b 100644 --- a/app/views/projects/merge_requests/show/_pipelines.html.haml +++ b/app/views/projects/merge_requests/show/_pipelines.html.haml @@ -1 +1 @@ -= render "projects/commit/pipelines_list", pipelines: @pipelines, link_to_commit: true += render "projects/commit/pipelines_list", pipelines: @pipeline, link_to_commit: true From 4945959b7c3c930778d1b88367d5e60fd06b52a0 Mon Sep 17 00:00:00 2001 From: Annabel Dunstone Gray Date: Tue, 11 Oct 2016 08:46:53 -0500 Subject: [PATCH 048/174] Fix variable to show multiple pipelines for MR --- app/views/projects/merge_requests/_new_submit.html.haml | 1 - app/views/projects/merge_requests/show/_pipelines.html.haml | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/app/views/projects/merge_requests/_new_submit.html.haml b/app/views/projects/merge_requests/_new_submit.html.haml index 3a670cb70dd..bfe461e6943 100644 --- a/app/views/projects/merge_requests/_new_submit.html.haml +++ b/app/views/projects/merge_requests/_new_submit.html.haml @@ -18,7 +18,6 @@ = f.hidden_field :target_branch .mr-compare.merge-request -<<<<<<< 4a8cb230c6ba28ccdcd6da91855005e4fa0c46bf - if @commits.empty? .commits-empty %h4 diff --git a/app/views/projects/merge_requests/show/_pipelines.html.haml b/app/views/projects/merge_requests/show/_pipelines.html.haml index db0ba88417b..afe3f3430c6 100644 --- a/app/views/projects/merge_requests/show/_pipelines.html.haml +++ b/app/views/projects/merge_requests/show/_pipelines.html.haml @@ -1 +1 @@ -= render "projects/commit/pipelines_list", pipelines: @pipeline, link_to_commit: true += render "projects/commit/pipelines_list", pipelines: @pipelines, link_to_commit: true From 27c762b8db3e2b6896ef88ea1a078745ae33909d Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Mon, 17 Oct 2016 11:48:36 +0200 Subject: [PATCH 049/174] Remove obsolete variable assigned to MR widget view --- app/controllers/projects/merge_requests_controller.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/app/controllers/projects/merge_requests_controller.rb b/app/controllers/projects/merge_requests_controller.rb index a39b47b6d95..cfa463b6452 100644 --- a/app/controllers/projects/merge_requests_controller.rb +++ b/app/controllers/projects/merge_requests_controller.rb @@ -517,7 +517,6 @@ class Projects::MergeRequestsController < Projects::ApplicationController def define_widget_vars @pipeline = @merge_request.pipeline - @pipelines = [@pipeline].compact end def define_commit_vars From db0e700d2ff9a372a8bd903faf305c0debd9b372 Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Mon, 17 Oct 2016 12:55:18 +0200 Subject: [PATCH 050/174] Use all pipelines variable when creating merge request --- app/controllers/projects/merge_requests_controller.rb | 4 ++-- app/views/projects/merge_requests/_new_submit.html.haml | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/controllers/projects/merge_requests_controller.rb b/app/controllers/projects/merge_requests_controller.rb index cfa463b6452..bce89d0a9ad 100644 --- a/app/controllers/projects/merge_requests_controller.rb +++ b/app/controllers/projects/merge_requests_controller.rb @@ -558,8 +558,8 @@ class Projects::MergeRequestsController < Projects::ApplicationController @commit = @merge_request.diff_head_commit @base_commit = @merge_request.diff_base_commit - @pipeline = @merge_request.pipeline - @statuses = @pipeline.statuses.relevant if @pipeline + @pipelines = @merge_request.all_pipelines + @statuses = @pipelines.first.statuses.relevant if @pipelines.any? @note_counts = Note.where(commit_id: @commits.map(&:id)). group(:commit_id).count end diff --git a/app/views/projects/merge_requests/_new_submit.html.haml b/app/views/projects/merge_requests/_new_submit.html.haml index bfe461e6943..9c6f562f7db 100644 --- a/app/views/projects/merge_requests/_new_submit.html.haml +++ b/app/views/projects/merge_requests/_new_submit.html.haml @@ -29,11 +29,11 @@ = link_to url_for(params), data: {target: 'div#commits', action: 'new', toggle: 'tab'} do Commits %span.badge= @commits.size - - if @pipeline + - if @pipelines.any? %li.builds-tab = link_to url_for(params), data: {target: 'div#pipelines', action: 'pipelines', toggle: 'tab'} do Pipelines - %span.badge= @statuses.size + %span.badge= @pipelines.size %li.builds-tab = link_to url_for(params), data: {target: 'div#builds', action: 'builds', toggle: 'tab'} do Builds @@ -48,7 +48,7 @@ = render "projects/merge_requests/show/commits" #diffs.diffs.tab-pane - # This tab is always loaded via AJAX - - if @pipeline + - if @pipelines.any? #builds.builds.tab-pane = render "projects/merge_requests/show/builds" #pipelines.pipelines.tab-pane @@ -65,5 +65,5 @@ :javascript var merge_request = new MergeRequest({ action: "#{(@show_changes_tab ? 'new/diffs' : 'new')}", - buildsLoaded: "#{@pipeline ? 'true' : 'false'}" + buildsLoaded: "#{@pipelines.any? ? 'true' : 'false'}" }); From f7da506529ab0989069fe1c9d9bf9d819c13211d Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Mon, 17 Oct 2016 13:55:30 +0200 Subject: [PATCH 051/174] Extract pipeline vars in merge requests controller --- .../projects/merge_requests_controller.rb | 18 +++++++++++++----- .../projects/merge_requests/_show.html.haml | 2 +- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/app/controllers/projects/merge_requests_controller.rb b/app/controllers/projects/merge_requests_controller.rb index bce89d0a9ad..4df0648a502 100644 --- a/app/controllers/projects/merge_requests_controller.rb +++ b/app/controllers/projects/merge_requests_controller.rb @@ -483,13 +483,12 @@ class Projects::MergeRequestsController < Projects::ApplicationController @noteable = @merge_request @commits_count = @merge_request.commits.count - @pipeline = @merge_request.pipeline - @statuses = @pipeline.statuses.relevant if @pipeline - if @merge_request.locked_long_ago? @merge_request.unlock_mr @merge_request.close end + + define_pipelines_vars end # Discussion tab data is rendered on html responses of actions @@ -543,6 +542,15 @@ class Projects::MergeRequestsController < Projects::ApplicationController ) end + def define_pipelines_vars + @pipelines = @merge_request.all_pipelines + + if @pipelines.any? + @pipeline = @pipelines.first + @statuses = @pipeline.statuses.relevant + end + end + def define_new_vars @noteable = @merge_request @@ -558,10 +566,10 @@ class Projects::MergeRequestsController < Projects::ApplicationController @commit = @merge_request.diff_head_commit @base_commit = @merge_request.diff_base_commit - @pipelines = @merge_request.all_pipelines - @statuses = @pipelines.first.statuses.relevant if @pipelines.any? @note_counts = Note.where(commit_id: @commits.map(&:id)). group(:commit_id).count + + define_pipelines_vars end def invalid_mr diff --git a/app/views/projects/merge_requests/_show.html.haml b/app/views/projects/merge_requests/_show.html.haml index 662463bc72b..fb4afe3bff2 100644 --- a/app/views/projects/merge_requests/_show.html.haml +++ b/app/views/projects/merge_requests/_show.html.haml @@ -61,7 +61,7 @@ %li.pipelines-tab = link_to pipelines_namespace_project_merge_request_path(@project.namespace, @project, @merge_request), data: { target: '#pipelines', action: 'pipelines', toggle: 'tab' } do Pipelines - %span.badge= @merge_request.all_pipelines.size + %span.badge= @pipelines.size %li.builds-tab = link_to builds_namespace_project_merge_request_path(@project.namespace, @project, @merge_request), data: { target: '#builds', action: 'builds', toggle: 'tab' } do Builds From d5b1d0ea501bb6eb0e18f63f4ddc0ba3f32d372a Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Mon, 17 Oct 2016 14:15:06 +0200 Subject: [PATCH 052/174] Use temporary compare commits when MR not persisted --- app/models/merge_request.rb | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb index 8c6905a442d..88e46ecdc8b 100644 --- a/app/models/merge_request.rb +++ b/app/models/merge_request.rb @@ -787,21 +787,19 @@ class MergeRequest < ActiveRecord::Base def all_pipelines return unless source_project - @all_pipelines ||= begin - sha = if persisted? - all_commits_sha - else - diff_head_sha - end - - source_project.pipelines.order(id: :desc). - where(sha: sha, ref: source_branch) - end + @all_pipelines ||= source_project.pipelines + .where(sha: all_commits_sha, ref: source_branch) + .order(id: :desc) end # Note that this could also return SHA from now dangling commits + # def all_commits_sha - merge_request_diffs.flat_map(&:commits_sha).uniq + if persisted? + merge_request_diffs.flat_map(&:commits_sha).uniq + else + compare_commits.reverse.map(&:id) + end end def merge_commit From ab8ef17fb2a2aa85a76d9106894280be9b910fda Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Mon, 17 Oct 2016 15:31:21 +0200 Subject: [PATCH 053/174] Extend merge request tests for all commits method --- app/models/merge_request.rb | 7 ++-- spec/models/merge_request_spec.rb | 60 +++++++++++++++++++++---------- 2 files changed, 46 insertions(+), 21 deletions(-) diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb index 88e46ecdc8b..ced0c13b837 100644 --- a/app/models/merge_request.rb +++ b/app/models/merge_request.rb @@ -788,8 +788,8 @@ class MergeRequest < ActiveRecord::Base return unless source_project @all_pipelines ||= source_project.pipelines - .where(sha: all_commits_sha, ref: source_branch) - .order(id: :desc) + .where(sha: all_commits_sha, ref: source_branch) + .order(id: :desc) end # Note that this could also return SHA from now dangling commits @@ -798,7 +798,8 @@ class MergeRequest < ActiveRecord::Base if persisted? merge_request_diffs.flat_map(&:commits_sha).uniq else - compare_commits.reverse.map(&:id) + cached_commits = compare_commits.to_a.reverse.map(&:id) + cached_commits.any? ? cached_commits : [diff_head_sha] end end diff --git a/spec/models/merge_request_spec.rb b/spec/models/merge_request_spec.rb index 91a423b670c..344f69a703e 100644 --- a/spec/models/merge_request_spec.rb +++ b/spec/models/merge_request_spec.rb @@ -640,32 +640,56 @@ describe MergeRequest, models: true do end describe '#all_commits_sha' do - let(:all_commits_sha) do - subject.merge_request_diffs.flat_map(&:commits).map(&:sha).uniq - end + context 'when merge request is persisted' do + let(:all_commits_sha) do + subject.merge_request_diffs.flat_map(&:commits).map(&:sha).uniq + end - shared_examples 'returning all SHA' do - it 'returns all SHA from all merge_request_diffs' do - expect(subject.merge_request_diffs.size).to eq(2) - expect(subject.all_commits_sha).to eq(all_commits_sha) + shared_examples 'returning all SHA' do + it 'returns all SHA from all merge_request_diffs' do + expect(subject.merge_request_diffs.size).to eq(2) + expect(subject.all_commits_sha).to eq(all_commits_sha) + end + end + + context 'with a completely different branch' do + before do + subject.update(target_branch: 'v1.0.0') + end + + it_behaves_like 'returning all SHA' + end + + context 'with a branch having no difference' do + before do + subject.update(target_branch: 'v1.1.0') + subject.reload # make sure commits were not cached + end + + it_behaves_like 'returning all SHA' end end - context 'with a completely different branch' do - before do - subject.update(target_branch: 'v1.0.0') + context 'when merge request is not persisted' do + context 'when compare commits are set in the service' do + let(:commit) { spy('commit') } + + subject do + build(:merge_request, compare_commits: [commit, commit]) + end + + it 'returns commits from compare commits temporary data' do + expect(subject.all_commits_sha).to eq [commit, commit] + end end - it_behaves_like 'returning all SHA' - end + context 'when compare commits are not set in the service' do + subject { build(:merge_request) } - context 'with a branch having no difference' do - before do - subject.update(target_branch: 'v1.1.0') - subject.reload # make sure commits were not cached + it 'returns array with diff head sha element only' do + expect(subject.all_commits_sha).to eq [subject.diff_head_sha] + end end - - it_behaves_like 'returning all SHA' end end From 72d84e48511fcf88b1d9efb622eb37cdff95aa1c Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Tue, 18 Oct 2016 12:05:47 +0200 Subject: [PATCH 054/174] Improve code that creates a list of commits for MR --- app/models/merge_request.rb | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb index ced0c13b837..fedc35102ef 100644 --- a/app/models/merge_request.rb +++ b/app/models/merge_request.rb @@ -797,9 +797,10 @@ class MergeRequest < ActiveRecord::Base def all_commits_sha if persisted? merge_request_diffs.flat_map(&:commits_sha).uniq + elsif compare_commits + compare_commits.to_a.reverse.map(&:id) else - cached_commits = compare_commits.to_a.reverse.map(&:id) - cached_commits.any? ? cached_commits : [diff_head_sha] + [diff_head_sha] end end From 3032a0ca891808c9aa1ba69d540bf97e40a84670 Mon Sep 17 00:00:00 2001 From: Kamil Trzcinski Date: Tue, 18 Oct 2016 16:46:19 +0200 Subject: [PATCH 055/174] Merge two scenarios into one --- spec/features/environments_spec.rb | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/spec/features/environments_spec.rb b/spec/features/environments_spec.rb index 7200e9ad4c1..b565586ee14 100644 --- a/spec/features/environments_spec.rb +++ b/spec/features/environments_spec.rb @@ -20,11 +20,8 @@ feature 'Environments', feature: true do end context 'shows two tabs' do - scenario 'does show Available tab with link' do + scenario 'shows "Available" and "Stopped" tab with links' do expect(page).to have_link('Available') - end - - scenario 'does show Stopped tab with link' do expect(page).to have_link('Stopped') end end @@ -47,11 +44,8 @@ feature 'Environments', feature: true do expect(page).to have_link(environment.name) end - scenario 'does show number of opened environments in Available tab' do + scenario 'does show number of available and stopped environments' do expect(page.find('.js-available-environments-count').text).to eq('1') - end - - scenario 'does show number of closed environments in Stopped tab' do expect(page.find('.js-stopped-environments-count').text).to eq('0') end From cc6d42861bed8fc4c050ee8906d77bdb49783de5 Mon Sep 17 00:00:00 2001 From: Sean McGivern Date: Tue, 18 Oct 2016 17:28:57 +0100 Subject: [PATCH 056/174] Backport git access spec changes from EE These were introduced in: --- spec/lib/gitlab/git_access_spec.rb | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/spec/lib/gitlab/git_access_spec.rb b/spec/lib/gitlab/git_access_spec.rb index de68e32e5b4..a5aa387f4f7 100644 --- a/spec/lib/gitlab/git_access_spec.rb +++ b/spec/lib/gitlab/git_access_spec.rb @@ -185,6 +185,7 @@ describe Gitlab::GitAccess, lib: true do end end + # Run permission checks for a user def self.run_permission_checks(permissions_matrix) permissions_matrix.keys.each do |role| describe "#{role} access" do @@ -194,13 +195,12 @@ describe Gitlab::GitAccess, lib: true do else project.team << [user, role] end - end - permissions_matrix[role].each do |action, allowed| - context action do - subject { access.push_access_check(changes[action]) } - - it { expect(subject.allowed?).to allowed ? be_truthy : be_falsey } + permissions_matrix[role].each do |action, allowed| + context action do + subject { access.push_access_check(changes[action]) } + it { expect(subject.allowed?).to allowed ? be_truthy : be_falsey } + end end end end From 8989baaae7091832855b976b0eeda32d8b545dcb Mon Sep 17 00:00:00 2001 From: Stan Hu Date: Tue, 18 Oct 2016 15:10:31 -0700 Subject: [PATCH 057/174] Fix broken award emoji for comments Closes #23506 --- app/helpers/award_emoji_helper.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/helpers/award_emoji_helper.rb b/app/helpers/award_emoji_helper.rb index 493f14f6f9d..592ffe7b89f 100644 --- a/app/helpers/award_emoji_helper.rb +++ b/app/helpers/award_emoji_helper.rb @@ -4,7 +4,7 @@ module AwardEmojiHelper if awardable.is_a?(Note) # We render a list of notes very frequently and calling the specific method is a lot faster than the generic one (6.5x) - toggle_award_emoji_namespace_project_note_url(namespace_id: @project.namespace_id, project_id: @project.id, id: awardable.id) + toggle_award_emoji_namespace_project_note_url(namespace_id: @project.namespace, project_id: @project, id: awardable.id) else url_for([:toggle_award_emoji, @project.namespace.becomes(Namespace), @project, awardable]) end From b3fb7f5d5746d95db718d5b418f015b7e45ecbeb Mon Sep 17 00:00:00 2001 From: Stan Hu Date: Tue, 18 Oct 2016 16:12:26 -0700 Subject: [PATCH 058/174] Add spec for toggling award emoji on issue notes --- spec/features/issues/award_emoji_spec.rb | 46 +++++++++++++++++++++--- 1 file changed, 41 insertions(+), 5 deletions(-) diff --git a/spec/features/issues/award_emoji_spec.rb b/spec/features/issues/award_emoji_spec.rb index 79cc50bc18e..ef00f209998 100644 --- a/spec/features/issues/award_emoji_spec.rb +++ b/spec/features/issues/award_emoji_spec.rb @@ -1,6 +1,8 @@ require 'rails_helper' describe 'Awards Emoji', feature: true do + include WaitForAjax + let!(:project) { create(:project) } let!(:user) { create(:user) } @@ -16,20 +18,22 @@ describe 'Awards Emoji', feature: true do project: project) end + let!(:note) { create(:note_on_issue, noteable: issue, project: issue.project, note: "Hello world") } + before do visit namespace_project_issue_path(project.namespace, project, issue) end it 'increments the thumbsdown emoji', js: true do find('[data-emoji="thumbsdown"]').click - sleep 2 + wait_for_ajax expect(thumbsdown_emoji).to have_text("1") end context 'click the thumbsup emoji' do it 'increments the thumbsup emoji', js: true do find('[data-emoji="thumbsup"]').click - sleep 2 + wait_for_ajax expect(thumbsup_emoji).to have_text("1") end @@ -41,7 +45,7 @@ describe 'Awards Emoji', feature: true do context 'click the thumbsdown emoji' do it 'increments the thumbsdown emoji', js: true do find('[data-emoji="thumbsdown"]').click - sleep 2 + wait_for_ajax expect(thumbsdown_emoji).to have_text("1") end @@ -49,13 +53,45 @@ describe 'Awards Emoji', feature: true do expect(thumbsup_emoji).to have_text("0") end end + + it 'toggles the smiley emoji on a note', js: true do + toggle_smiley_emoji(true) + + within('.note-awards') do + expect(find(emoji_counter)).to have_text("1") + end + + toggle_smiley_emoji(false) + + within('.note-awards') do + expect(page).not_to have_selector(emoji_counter) + end + end end def thumbsup_emoji - page.all('span.js-counter').first + page.all(emoji_counter).first end def thumbsdown_emoji - page.all('span.js-counter').last + page.all(emoji_counter).last + end + + def emoji_counter + 'span.js-counter' + end + + def toggle_smiley_emoji(status) + within('.note') do + find('.note-emoji-button').click + end + + unless status + first('[data-emoji="smiley"]').click + else + find('[data-emoji="smiley"]').click + end + + wait_for_ajax end end From 4e028d333bbbcafcd89b04778b0b37775b6015c4 Mon Sep 17 00:00:00 2001 From: Luke Bennett Date: Wed, 19 Oct 2016 04:55:26 +0100 Subject: [PATCH 059/174] Return the title for id of 'No label' --- app/assets/javascripts/labels_select.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/assets/javascripts/labels_select.js b/app/assets/javascripts/labels_select.js index f1e719937c7..b4f6e70f694 100644 --- a/app/assets/javascripts/labels_select.js +++ b/app/assets/javascripts/labels_select.js @@ -266,7 +266,7 @@ }, fieldName: $dropdown.data('field-name'), id: function(label) { - if (label.id <= 0) return; + if (label.id <= 0) return label.title; if ($dropdown.hasClass('js-issuable-form-dropdown')) { return label.id; From 47b0edbe746d5ca2a1502d3f0bf0213fe1789567 Mon Sep 17 00:00:00 2001 From: Stan Hu Date: Tue, 18 Oct 2016 21:26:20 -0700 Subject: [PATCH 060/174] Improve error logging of MergeService Relates to #23505 --- app/services/merge_requests/merge_service.rb | 14 ++++++++++---- spec/services/merge_requests/merge_service_spec.rb | 4 ++-- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/app/services/merge_requests/merge_service.rb b/app/services/merge_requests/merge_service.rb index b037780c431..38477c1f321 100644 --- a/app/services/merge_requests/merge_service.rb +++ b/app/services/merge_requests/merge_service.rb @@ -11,14 +11,14 @@ module MergeRequests def execute(merge_request) @merge_request = merge_request - return error('Merge request is not mergeable') unless @merge_request.mergeable? + return log_merge_error('Merge request is not mergeable', true) unless @merge_request.mergeable? merge_request.in_locked_state do if commit after_merge success else - error('Can not merge changes') + log_merge_error('Can not merge changes', true) end end end @@ -46,8 +46,8 @@ module MergeRequests merge_request.update(merge_error: e.message) false rescue StandardError => e - merge_request.update(merge_error: "Something went wrong during merge") - Rails.logger.error(e.message) + merge_request.update(merge_error: "Something went wrong during merge: #{e.message}") + log_merge_error(e.message) false ensure merge_request.update(in_progress_merge_commit_sha: nil) @@ -65,5 +65,11 @@ module MergeRequests def branch_deletion_user @merge_request.force_remove_source_branch? ? @merge_request.author : current_user end + + def log_merge_error(message, http_error = false) + Rails.logger.error("MergeService error: #{message}") + + error(message) if http_error + end end end diff --git a/spec/services/merge_requests/merge_service_spec.rb b/spec/services/merge_requests/merge_service_spec.rb index ee53e110aee..9163c0c104e 100644 --- a/spec/services/merge_requests/merge_service_spec.rb +++ b/spec/services/merge_requests/merge_service_spec.rb @@ -120,13 +120,13 @@ describe MergeRequests::MergeService, services: true do let(:service) { MergeRequests::MergeService.new(project, user, commit_message: 'Awesome message') } it 'saves error if there is an exception' do - allow(service).to receive(:repository).and_raise("error") + allow(service).to receive(:repository).and_raise("error message") allow(service).to receive(:execute_hooks) service.execute(merge_request) - expect(merge_request.merge_error).to eq("Something went wrong during merge") + expect(merge_request.merge_error).to eq("Something went wrong during merge: error message") end it 'saves error if there is an PreReceiveError exception' do From 75b7ba3f7b89f10f7088b84b4594e747c571f016 Mon Sep 17 00:00:00 2001 From: Stan Hu Date: Tue, 18 Oct 2016 21:59:57 -0700 Subject: [PATCH 061/174] Identify merge request project and IID in log message --- app/services/merge_requests/merge_service.rb | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/app/services/merge_requests/merge_service.rb b/app/services/merge_requests/merge_service.rb index 38477c1f321..ab9056a3250 100644 --- a/app/services/merge_requests/merge_service.rb +++ b/app/services/merge_requests/merge_service.rb @@ -67,9 +67,15 @@ module MergeRequests end def log_merge_error(message, http_error = false) - Rails.logger.error("MergeService error: #{message}") + Rails.logger.error("MergeService ERROR: #{merge_request_info} - #{message}") error(message) if http_error end + + def merge_request_info + project = merge_request.project + + "#{project.to_reference}#{merge_request.to_reference}" + end end end From c8c3cd82d5f93fd325a10fa1c059499a78175ddb Mon Sep 17 00:00:00 2001 From: Adam Niedzielski Date: Wed, 19 Oct 2016 09:32:39 +0200 Subject: [PATCH 062/174] Use Hash rocket syntax to fix cycle analytics under Ruby 2.1 Refers to #23510 --- app/views/projects/cycle_analytics/show.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/projects/cycle_analytics/show.html.haml b/app/views/projects/cycle_analytics/show.html.haml index 7f346df8797..ef24ec0cf29 100644 --- a/app/views/projects/cycle_analytics/show.html.haml +++ b/app/views/projects/cycle_analytics/show.html.haml @@ -5,7 +5,7 @@ #cycle-analytics{class: container_class, "v-cloak" => "true", data: { request_path: project_cycle_analytics_path(@project)}} .bordered-box.landing.content-block{"v-if" => "!isHelpDismissed"} - = icon('times', class: 'dismiss-icon', "@click": "dismissLanding()") + = icon('times', class: 'dismiss-icon', "@click" => "dismissLanding()") .row .col-sm-3.col-xs-12.svg-container = custom_icon('icon_cycle_analytics_splash') From 9a14b0bb6993349c568b6f819b43200ae6441e69 Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Wed, 19 Oct 2016 10:47:40 +0200 Subject: [PATCH 063/174] Fix name of feature that restricts builds traces --- app/views/projects/pipelines_settings/show.html.haml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/views/projects/pipelines_settings/show.html.haml b/app/views/projects/pipelines_settings/show.html.haml index 0740e9b56ab..bebf0ccd54d 100644 --- a/app/views/projects/pipelines_settings/show.html.haml +++ b/app/views/projects/pipelines_settings/show.html.haml @@ -64,8 +64,8 @@ .checkbox = f.label :public_builds do = f.check_box :public_builds - %strong Public pipelines - .help-block Allow everyone to access pipelines for Public and Internal projects + %strong Public builds + .help-block Allow everyone to access builds traces for Public and Internal projects .form-group.append-bottom-default = f.label :runners_token, "Runners token", class: 'label-light' From 8cf45f63613276f47099def265ab4cde8eb0c758 Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Wed, 19 Oct 2016 12:22:35 +0200 Subject: [PATCH 064/174] Revert "Merge branch 'gjlaubenstein/gitlab-ce-21712-change-issue-show-html-title'" This reverts commit 434d98b22a6381447a9c59cec16fc324ade198df, reversing changes made to b6a83be65f6711a3cf808400c549bdd3ec7eda74. --- CHANGELOG.md | 1 - app/views/projects/issues/edit.html.haml | 2 +- app/views/projects/issues/show.html.haml | 2 +- app/views/projects/merge_requests/_show.html.haml | 2 +- app/views/projects/merge_requests/edit.html.haml | 2 +- 5 files changed, 4 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f4d317fd1db..f1ef9238c10 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -105,7 +105,6 @@ Please view this file on the master branch, on stable branches it's out of date. - Optimize GitHub importing for speed and memory - API: expose pipeline data in builds API (!6502, Guilherme Salazar) - Notify the Merger about merge after successful build (Dimitris Karakasilis) - - Reorder issue and merge request titles to show IDs first. !6503 (Greg Laubenstein) - Reduce queries needed to find users using their SSH keys when pushing commits - Prevent rendering the link to all when the author has no access (Katarzyna Kobierska Ula Budziszewska) - Fix broken repository 500 errors in project list diff --git a/app/views/projects/issues/edit.html.haml b/app/views/projects/issues/edit.html.haml index 3a6fbbc7fbc..7cf1923456e 100644 --- a/app/views/projects/issues/edit.html.haml +++ b/app/views/projects/issues/edit.html.haml @@ -1,4 +1,4 @@ -- page_title "Edit", "#{@issue.to_reference} #{@issue.title}", "Issues" +- page_title "Edit", "#{@issue.title} (##{@issue.iid})", "Issues" %h3.page-title Edit Issue ##{@issue.iid} diff --git a/app/views/projects/issues/show.html.haml b/app/views/projects/issues/show.html.haml index 09347ad5fff..49c47a7dc6a 100644 --- a/app/views/projects/issues/show.html.haml +++ b/app/views/projects/issues/show.html.haml @@ -1,4 +1,4 @@ -- page_title "#{@issue.to_reference} #{@issue.title}", "Issues" +- page_title "#{@issue.title} (##{@issue.iid})", "Issues" - page_description @issue.description - page_card_attributes @issue.card_attributes diff --git a/app/views/projects/merge_requests/_show.html.haml b/app/views/projects/merge_requests/_show.html.haml index 662463bc72b..5c41db36e44 100644 --- a/app/views/projects/merge_requests/_show.html.haml +++ b/app/views/projects/merge_requests/_show.html.haml @@ -1,4 +1,4 @@ -- page_title "#{@merge_request.to_reference} #{@merge_request.title}", "Merge Requests" +- page_title "#{@merge_request.title} (#{@merge_request.to_reference})", "Merge Requests" - page_description @merge_request.description - page_card_attributes @merge_request.card_attributes - content_for :page_specific_javascripts do diff --git a/app/views/projects/merge_requests/edit.html.haml b/app/views/projects/merge_requests/edit.html.haml index 7c3ac6652ee..03159f123f3 100644 --- a/app/views/projects/merge_requests/edit.html.haml +++ b/app/views/projects/merge_requests/edit.html.haml @@ -1,4 +1,4 @@ -- page_title "Edit", "#{@merge_request.to_reference} #{@merge_request.title}", "Merge Requests" +- page_title "Edit", "#{@merge_request.title} (#{@merge_request.to_reference}", "Merge Requests" %h3.page-title Edit Merge Request #{@merge_request.to_reference} From 31d369b796466a726bbfce9ab72df11c8644f945 Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Wed, 19 Oct 2016 12:23:51 +0200 Subject: [PATCH 065/174] Use `to_reference` for Issue "show" and "edit" page titles Thanks to Greg Laubenstein for noticing in !6503 --- app/views/projects/issues/edit.html.haml | 2 +- app/views/projects/issues/show.html.haml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/views/projects/issues/edit.html.haml b/app/views/projects/issues/edit.html.haml index 7cf1923456e..1b7d878c38c 100644 --- a/app/views/projects/issues/edit.html.haml +++ b/app/views/projects/issues/edit.html.haml @@ -1,4 +1,4 @@ -- page_title "Edit", "#{@issue.title} (##{@issue.iid})", "Issues" +- page_title "Edit", "#{@issue.title} (#{@issue.to_reference})", "Issues" %h3.page-title Edit Issue ##{@issue.iid} diff --git a/app/views/projects/issues/show.html.haml b/app/views/projects/issues/show.html.haml index 49c47a7dc6a..6f3f238a436 100644 --- a/app/views/projects/issues/show.html.haml +++ b/app/views/projects/issues/show.html.haml @@ -1,4 +1,4 @@ -- page_title "#{@issue.title} (##{@issue.iid})", "Issues" +- page_title "#{@issue.title} (#{@issue.to_reference})", "Issues" - page_description @issue.description - page_card_attributes @issue.card_attributes From c7282f89596293423c61d6676db60a9a347d09ef Mon Sep 17 00:00:00 2001 From: Robert Schilling Date: Fri, 14 Oct 2016 10:45:23 +0200 Subject: [PATCH 066/174] Grapify the commit status API --- lib/api/commit_statuses.rb | 53 ++++++++++++----------- spec/requests/api/commit_statuses_spec.rb | 4 +- 2 files changed, 29 insertions(+), 28 deletions(-) diff --git a/lib/api/commit_statuses.rb b/lib/api/commit_statuses.rb index dfbdd597d29..f282a3b9cd6 100644 --- a/lib/api/commit_statuses.rb +++ b/lib/api/commit_statuses.rb @@ -6,17 +6,17 @@ module API resource :projects do before { authenticate! } - # Get a commit's statuses - # - # Parameters: - # id (required) - The ID of a project - # sha (required) - The commit hash - # ref (optional) - The ref - # stage (optional) - The stage - # name (optional) - The name - # all (optional) - Show all statuses, default: false - # Examples: - # GET /projects/:id/repository/commits/:sha/statuses + desc "Get a commit's statuses" do + success Entities::CommitStatus + end + params do + requires :id, type: String, desc: 'The ID of a project' + requires :sha, type: String, desc: 'The commit hash' + optional :ref, type: String, desc: 'The ref' + optional :stage, type: String, desc: 'The stage' + optional :name, type: String, desc: 'The name' + optional :all, type: String, desc: 'Show all statuses, default: false' + end get ':id/repository/commits/:sha/statuses' do authorize!(:read_commit_status, user_project) @@ -31,22 +31,23 @@ module API present paginate(statuses), with: Entities::CommitStatus end - # Post status to commit - # - # Parameters: - # id (required) - The ID of a project - # sha (required) - The commit hash - # ref (optional) - The ref - # state (required) - The state of the status. Can be: pending, running, success, failed or canceled - # target_url (optional) - The target URL to associate with this status - # description (optional) - A short description of the status - # name or context (optional) - A string label to differentiate this status from the status of other systems. Default: "default" - # Examples: - # POST /projects/:id/statuses/:sha + desc 'Post status to a commit' do + success Entities::CommitStatus + end + params do + requires :id, type: String, desc: 'The ID of a project' + requires :sha, type: String, desc: 'The commit hash' + requires :state, type: String, desc: 'The state of the status', + values: ['pending', 'running', 'success', 'failed', 'canceled'] + optional :ref, type: String, desc: 'The ref' + optional :target_url, type: String, desc: 'The target URL to associate with this status' + optional :description, type: String, desc: 'A short description of the status' + optional :name, type: String, desc: 'A string label to differentiate this status from the status of other systems. Default: "default"' + optional :context, type: String, desc: 'A string label to differentiate this status from the status of other systems. Default: "default"' + end post ':id/statuses/:sha' do authorize! :create_commit_status, user_project - required_attributes! [:state] - attrs = attributes_for_keys [:target_url, :description] + commit = @project.commit(params[:sha]) not_found! 'Commit' unless commit @@ -68,7 +69,7 @@ module API status = GenericCommitStatus.running_or_pending.find_or_initialize_by( project: @project, pipeline: pipeline, user: current_user, name: name, ref: ref) - status.attributes = attrs + status.attributes = declared(params).slice(:target_url, :description) begin case params[:state].to_s diff --git a/spec/requests/api/commit_statuses_spec.rb b/spec/requests/api/commit_statuses_spec.rb index 7aa7e85a9e2..335efc4db6c 100644 --- a/spec/requests/api/commit_statuses_spec.rb +++ b/spec/requests/api/commit_statuses_spec.rb @@ -196,7 +196,7 @@ describe API::CommitStatuses, api: true do end context 'reporter user' do - before { post api(post_url, reporter) } + before { post api(post_url, reporter), state: 'running' } it 'does not create commit status' do expect(response).to have_http_status(403) @@ -204,7 +204,7 @@ describe API::CommitStatuses, api: true do end context 'guest user' do - before { post api(post_url, guest) } + before { post api(post_url, guest), state: 'running' } it 'does not create commit status' do expect(response).to have_http_status(403) From fa075771a62a6fdb1c0ce505a14a4eee87ff55a0 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Wed, 19 Oct 2016 14:13:44 +0300 Subject: [PATCH 067/174] Refactor group_members_controller_spec Signed-off-by: Dmitriy Zaporozhets --- .../groups/group_members_controller_spec.rb | 120 +++++------------- spec/factories/group_members.rb | 1 + 2 files changed, 35 insertions(+), 86 deletions(-) diff --git a/spec/controllers/groups/group_members_controller_spec.rb b/spec/controllers/groups/group_members_controller_spec.rb index a0870891cf4..ad15b3f8f40 100644 --- a/spec/controllers/groups/group_members_controller_spec.rb +++ b/spec/controllers/groups/group_members_controller_spec.rb @@ -2,16 +2,10 @@ require 'spec_helper' describe Groups::GroupMembersController do let(:user) { create(:user) } + let(:group) { create(:group, :public) } - describe '#index' do - let(:group) { create(:group) } - - before do - group.add_owner(user) - stub_application_setting(restricted_visibility_levels: [Gitlab::VisibilityLevel::PUBLIC]) - end - - it 'renders index with group members' do + describe 'GET index' do + it 'renders index with 200 status code' do get :index, group_id: group expect(response).to have_http_status(200) @@ -19,74 +13,56 @@ describe Groups::GroupMembersController do end end - describe '#destroy' do - let(:group) { create(:group, :public) } + describe 'DELETE destroy' do + let(:member) { create(:group_member, :developer, group: group) } + + before { sign_in(user) } context 'when member is not found' do it 'returns 403' do - delete :destroy, group_id: group, - id: 42 + delete :destroy, group_id: group, id: 42 expect(response).to have_http_status(403) end end context 'when member is found' do - let(:user) { create(:user) } - let(:group_user) { create(:user) } - let(:member) do - group.add_developer(group_user) - group.members.find_by(user_id: group_user) - end - context 'when user does not have enough rights' do - before do - group.add_developer(user) - sign_in(user) - end + before { group.add_developer(user) } it 'returns 403' do - delete :destroy, group_id: group, - id: member + delete :destroy, group_id: group, id: member expect(response).to have_http_status(403) - expect(group.users).to include group_user + expect(group.members).to include member end end context 'when user has enough rights' do - before do - group.add_owner(user) - sign_in(user) - end + before { group.add_owner(user) } it '[HTML] removes user from members' do - delete :destroy, group_id: group, - id: member + delete :destroy, group_id: group, id: member expect(response).to set_flash.to 'User was successfully removed from group.' expect(response).to redirect_to(group_group_members_path(group)) - expect(group.users).not_to include group_user + expect(group.members).not_to include member end it '[JS] removes user from members' do - xhr :delete, :destroy, group_id: group, - id: member + xhr :delete, :destroy, group_id: group, id: member expect(response).to be_success - expect(group.users).not_to include group_user + expect(group.members).not_to include member end end end end - describe '#leave' do - let(:group) { create(:group, :public) } - let(:user) { create(:user) } + describe 'DELETE leave' do + before { sign_in(user) } context 'when member is not found' do - before { sign_in(user) } - it 'returns 404' do delete :leave, group_id: group @@ -96,10 +72,7 @@ describe Groups::GroupMembersController do context 'when member is found' do context 'and is not an owner' do - before do - group.add_developer(user) - sign_in(user) - end + before { group.add_developer(user) } it 'removes user from members' do delete :leave, group_id: group @@ -111,10 +84,7 @@ describe Groups::GroupMembersController do end context 'and is an owner' do - before do - group.add_owner(user) - sign_in(user) - end + before { group.add_owner(user) } it 'cannot removes himself from the group' do delete :leave, group_id: group @@ -124,10 +94,7 @@ describe Groups::GroupMembersController do end context 'and is a requester' do - before do - group.request_access(user) - sign_in(user) - end + before { group.request_access(user) } it 'removes user from members' do delete :leave, group_id: group @@ -141,13 +108,8 @@ describe Groups::GroupMembersController do end end - describe '#request_access' do - let(:group) { create(:group, :public) } - let(:user) { create(:user) } - - before do - sign_in(user) - end + describe 'POST request_access' do + before { sign_in(user) } it 'creates a new GroupMember that is not a team member' do post :request_access, group_id: group @@ -159,53 +121,39 @@ describe Groups::GroupMembersController do end end - describe '#approve_access_request' do - let(:group) { create(:group, :public) } + describe 'POST approve_access_request' do + let(:member) { create(:group_member, :access_request, group: group) } + + before { sign_in(user) } context 'when member is not found' do it 'returns 403' do - post :approve_access_request, group_id: group, - id: 42 + post :approve_access_request, group_id: group, id: 42 expect(response).to have_http_status(403) end end context 'when member is found' do - let(:user) { create(:user) } - let(:group_requester) { create(:user) } - let(:member) do - group.request_access(group_requester) - group.requesters.find_by(user_id: group_requester) - end - context 'when user does not have enough rights' do - before do - group.add_developer(user) - sign_in(user) - end + before { group.add_developer(user) } it 'returns 403' do - post :approve_access_request, group_id: group, - id: member + post :approve_access_request, group_id: group, id: member expect(response).to have_http_status(403) - expect(group.users).not_to include group_requester + expect(group.members).not_to include member end end context 'when user has enough rights' do - before do - group.add_owner(user) - sign_in(user) - end + before { group.add_owner(user) } it 'adds user to members' do - post :approve_access_request, group_id: group, - id: member + post :approve_access_request, group_id: group, id: member expect(response).to redirect_to(group_group_members_path(group)) - expect(group.users).to include group_requester + expect(group.members).to include member end end end diff --git a/spec/factories/group_members.rb b/spec/factories/group_members.rb index 795df5dfda9..080b2e75ea1 100644 --- a/spec/factories/group_members.rb +++ b/spec/factories/group_members.rb @@ -9,5 +9,6 @@ FactoryGirl.define do trait(:developer) { access_level GroupMember::DEVELOPER } trait(:master) { access_level GroupMember::MASTER } trait(:owner) { access_level GroupMember::OWNER } + trait(:access_request) { requested_at Time.now } end end From 67b96255d89de8e31234d68a3408adb8b9779dd9 Mon Sep 17 00:00:00 2001 From: Kamil Trzcinski Date: Wed, 19 Oct 2016 14:03:31 +0200 Subject: [PATCH 068/174] Keep around commits only on pipeline create --- CHANGELOG.md | 1 + app/models/ci/pipeline.rb | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f4d317fd1db..44c0b80bf6d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ Please view this file on the master branch, on stable branches it's out of date. - Ability to resolve merge request conflicts with editor !6374 - Add `/projects/visible` API endpoint (Ben Boeckel) - Fix centering of custom header logos (Ashley Dumaine) + - Keep around commits only pipeline creation as pipeline data doesn't change over time - ExpireBuildArtifactsWorker query builds table without ordering enqueuing one job per build to cleanup - Add an example for testing a phoenix application with Gitlab CI in the docs (Manthan Mallikarjun) - Cancelled pipelines could be retried. !6927 diff --git a/app/models/ci/pipeline.rb b/app/models/ci/pipeline.rb index e75fe6c222b..e84c91b417d 100644 --- a/app/models/ci/pipeline.rb +++ b/app/models/ci/pipeline.rb @@ -19,7 +19,7 @@ module Ci validates_presence_of :status, unless: :importing? validate :valid_commit_sha, unless: :importing? - after_save :keep_around_commits, unless: :importing? + after_create :keep_around_commits, unless: :importing? delegate :stages, to: :statuses From 357c794a49843ca9984642ddd091612e3200a8e3 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Wed, 19 Oct 2016 15:13:59 +0300 Subject: [PATCH 069/174] Refactor project_members_controller_spec Signed-off-by: Dmitriy Zaporozhets --- .../project_members_controller_spec.rb | 113 ++++++------------ spec/factories/project_members.rb | 1 + 2 files changed, 36 insertions(+), 78 deletions(-) diff --git a/spec/controllers/projects/project_members_controller_spec.rb b/spec/controllers/projects/project_members_controller_spec.rb index 074f85157de..ea56bd72912 100644 --- a/spec/controllers/projects/project_members_controller_spec.rb +++ b/spec/controllers/projects/project_members_controller_spec.rb @@ -1,10 +1,11 @@ require('spec_helper') describe Projects::ProjectMembersController do - describe '#apply_import' do - let(:project) { create(:project) } + let(:user) { create(:user) } + let(:project) { create(:project, :public) } + + describe 'POST apply_import' do let(:another_project) { create(:project, :private) } - let(:user) { create(:user) } let(:member) { create(:user) } before do @@ -47,23 +48,19 @@ describe Projects::ProjectMembersController do end end - describe '#index' do - context 'when user is member' do - before do - project = create(:project, :private) - member = create(:user) - project.team << [member, :guest] - sign_in(member) + describe 'GET index' do + it 'renders index with 200 status code' do + get :index, namespace_id: project.namespace, project_id: project - get :index, namespace_id: project.namespace, project_id: project - end - - it { expect(response).to have_http_status(200) } + expect(response).to have_http_status(200) + expect(response).to render_template(:index) end end - describe '#destroy' do - let(:project) { create(:project, :public) } + describe 'DELETE destroy' do + let(:member) { create(:project_member, :developer, project: project) } + + before { sign_in(user) } context 'when member is not found' do it 'returns 404' do @@ -76,18 +73,8 @@ describe Projects::ProjectMembersController do end context 'when member is found' do - let(:user) { create(:user) } - let(:team_user) { create(:user) } - let(:member) do - project.team << [team_user, :developer] - project.members.find_by(user_id: team_user.id) - end - context 'when user does not have enough rights' do - before do - project.team << [user, :developer] - sign_in(user) - end + before { project.team << [user, :developer] } it 'returns 404' do delete :destroy, namespace_id: project.namespace, @@ -95,15 +82,12 @@ describe Projects::ProjectMembersController do id: member expect(response).to have_http_status(404) - expect(project.users).to include team_user + expect(project.members).to include member end end context 'when user has enough rights' do - before do - project.team << [user, :master] - sign_in(user) - end + before { project.team << [user, :master] } it '[HTML] removes user from members' do delete :destroy, namespace_id: project.namespace, @@ -113,7 +97,7 @@ describe Projects::ProjectMembersController do expect(response).to redirect_to( namespace_project_project_members_path(project.namespace, project) ) - expect(project.users).not_to include team_user + expect(project.members).not_to include member end it '[JS] removes user from members' do @@ -122,19 +106,16 @@ describe Projects::ProjectMembersController do id: member expect(response).to be_success - expect(project.users).not_to include team_user + expect(project.members).not_to include member end end end end - describe '#leave' do - let(:project) { create(:project, :public) } - let(:user) { create(:user) } + describe 'DELETE leave' do + before { sign_in(user) } context 'when member is not found' do - before { sign_in(user) } - it 'returns 404' do delete :leave, namespace_id: project.namespace, project_id: project @@ -145,10 +126,7 @@ describe Projects::ProjectMembersController do context 'when member is found' do context 'and is not an owner' do - before do - project.team << [user, :developer] - sign_in(user) - end + before { project.team << [user, :developer] } it 'removes user from members' do delete :leave, namespace_id: project.namespace, @@ -161,11 +139,9 @@ describe Projects::ProjectMembersController do end context 'and is an owner' do - before do - project.update(namespace_id: user.namespace_id) - project.team << [user, :master, user] - sign_in(user) - end + let(:project) { create(:project, namespace: user.namespace) } + + before { project.team << [user, :master] } it 'cannot remove himself from the project' do delete :leave, namespace_id: project.namespace, @@ -176,10 +152,7 @@ describe Projects::ProjectMembersController do end context 'and is a requester' do - before do - project.request_access(user) - sign_in(user) - end + before { project.request_access(user) } it 'removes user from members' do delete :leave, namespace_id: project.namespace, @@ -194,13 +167,8 @@ describe Projects::ProjectMembersController do end end - describe '#request_access' do - let(:project) { create(:project, :public) } - let(:user) { create(:user) } - - before do - sign_in(user) - end + describe 'POST request_access' do + before { sign_in(user) } it 'creates a new ProjectMember that is not a team member' do post :request_access, namespace_id: project.namespace, @@ -215,8 +183,10 @@ describe Projects::ProjectMembersController do end end - describe '#approve' do - let(:project) { create(:project, :public) } + describe 'POST approve' do + let(:member) { create(:project_member, :access_request, project: project) } + + before { sign_in(user) } context 'when member is not found' do it 'returns 404' do @@ -229,18 +199,8 @@ describe Projects::ProjectMembersController do end context 'when member is found' do - let(:user) { create(:user) } - let(:team_requester) { create(:user) } - let(:member) do - project.request_access(team_requester) - project.requesters.find_by(user_id: team_requester.id) - end - context 'when user does not have enough rights' do - before do - project.team << [user, :developer] - sign_in(user) - end + before { project.team << [user, :developer] } it 'returns 404' do post :approve_access_request, namespace_id: project.namespace, @@ -248,15 +208,12 @@ describe Projects::ProjectMembersController do id: member expect(response).to have_http_status(404) - expect(project.users).not_to include team_requester + expect(project.members).not_to include member end end context 'when user has enough rights' do - before do - project.team << [user, :master] - sign_in(user) - end + before { project.team << [user, :master] } it 'adds user to members' do post :approve_access_request, namespace_id: project.namespace, @@ -266,7 +223,7 @@ describe Projects::ProjectMembersController do expect(response).to redirect_to( namespace_project_project_members_path(project.namespace, project) ) - expect(project.users).to include team_requester + expect(project.members).to include member end end end diff --git a/spec/factories/project_members.rb b/spec/factories/project_members.rb index 1ddb305a8af..c21927640d1 100644 --- a/spec/factories/project_members.rb +++ b/spec/factories/project_members.rb @@ -8,5 +8,6 @@ FactoryGirl.define do trait(:reporter) { access_level ProjectMember::REPORTER } trait(:developer) { access_level ProjectMember::DEVELOPER } trait(:master) { access_level ProjectMember::MASTER } + trait(:access_request) { requested_at Time.now } end end From 43da118f85d1e53770d106905be3358c6452c37e Mon Sep 17 00:00:00 2001 From: Patricio Cano Date: Wed, 19 Oct 2016 10:40:25 -0500 Subject: [PATCH 070/174] Bump `omniauth-saml` to 1.7.0 to include security fixes and metadata support for IdP auto-configuration. --- Gemfile | 2 +- Gemfile.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Gemfile b/Gemfile index 05166b6a828..46245ab62d1 100644 --- a/Gemfile +++ b/Gemfile @@ -29,7 +29,7 @@ gem 'omniauth-github', '~> 1.1.1' gem 'omniauth-gitlab', '~> 1.0.0' gem 'omniauth-google-oauth2', '~> 0.4.1' gem 'omniauth-kerberos', '~> 0.3.0', group: :kerberos -gem 'omniauth-saml', '~> 1.6.0' +gem 'omniauth-saml', '~> 1.7.0' gem 'omniauth-shibboleth', '~> 1.2.0' gem 'omniauth-twitter', '~> 1.2.0' gem 'omniauth_crowd', '~> 2.2.0' diff --git a/Gemfile.lock b/Gemfile.lock index a9892d1c130..442184b9228 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -473,9 +473,9 @@ GEM omniauth-oauth2 (1.3.1) oauth2 (~> 1.0) omniauth (~> 1.2) - omniauth-saml (1.6.0) + omniauth-saml (1.7.0) omniauth (~> 1.3) - ruby-saml (~> 1.3) + ruby-saml (~> 1.4) omniauth-shibboleth (1.2.1) omniauth (>= 1.0.0) omniauth-twitter (1.2.1) @@ -635,7 +635,7 @@ GEM crack (~> 0.4) ruby-prof (0.16.2) ruby-progressbar (1.8.1) - ruby-saml (1.3.0) + ruby-saml (1.4.1) nokogiri (>= 1.5.10) ruby_parser (3.8.2) sexp_processor (~> 4.1) @@ -915,7 +915,7 @@ DEPENDENCIES omniauth-gitlab (~> 1.0.0) omniauth-google-oauth2 (~> 0.4.1) omniauth-kerberos (~> 0.3.0) - omniauth-saml (~> 1.6.0) + omniauth-saml (~> 1.7.0) omniauth-shibboleth (~> 1.2.0) omniauth-twitter (~> 1.2.0) omniauth_crowd (~> 2.2.0) From 8e4301d982ce28d80e711865ac294a98ddce3ec6 Mon Sep 17 00:00:00 2001 From: Felipe Artur Date: Thu, 6 Oct 2016 19:05:27 -0300 Subject: [PATCH 071/174] Prevent wrong markdown on issue ids when project has Jira service activated --- CHANGELOG.md | 1 + app/models/external_issue.rb | 5 -- app/models/project.rb | 4 + .../project_services/issue_tracker_service.rb | 6 ++ app/models/project_services/jira_service.rb | 5 ++ .../filter/abstract_reference_filter.rb | 16 +++- .../filter/external_issue_reference_filter.rb | 29 +++---- lib/banzai/filter/issue_reference_filter.rb | 8 ++ .../external_issue_reference_filter_spec.rb | 76 ++++++++++++++++--- .../filter/issue_reference_filter_spec.rb | 17 +---- spec/models/external_issue_spec.rb | 15 ---- .../project_services/jira_service_spec.rb | 9 +++ .../project_services/redmine_service_spec.rb | 8 ++ spec/services/git_push_service_spec.rb | 56 +++++++++----- .../merge_requests/merge_service_spec.rb | 12 +++ .../issue_tracker_service_shared_example.rb | 15 ++++ 16 files changed, 199 insertions(+), 83 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f4d317fd1db..c4fcca1b016 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ Please view this file on the master branch, on stable branches it's out of date. - Update runner version only when updating contacted_at - Add link from system note to compare with previous version - Use gitlab-shell v3.6.6 + - Ignore references to internal issues when using external issues tracker - Ability to resolve merge request conflicts with editor !6374 - Add `/projects/visible` API endpoint (Ben Boeckel) - Fix centering of custom header logos (Ashley Dumaine) diff --git a/app/models/external_issue.rb b/app/models/external_issue.rb index b7894c99846..fd9a8c1b8b7 100644 --- a/app/models/external_issue.rb +++ b/app/models/external_issue.rb @@ -29,11 +29,6 @@ class ExternalIssue @project end - # Pattern used to extract `JIRA-123` issue references from text - def self.reference_pattern - @reference_pattern ||= %r{(?\b([A-Z][A-Z0-9_]+-)\d+)} - end - def to_reference(_from_project = nil) id end diff --git a/app/models/project.rb b/app/models/project.rb index db7301219e5..a645c9b29cc 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -664,6 +664,10 @@ class Project < ActiveRecord::Base end end + def issue_reference_pattern + issues_tracker.reference_pattern + end + def default_issues_tracker? !external_issue_tracker end diff --git a/app/models/project_services/issue_tracker_service.rb b/app/models/project_services/issue_tracker_service.rb index d1df6d0292f..b26ddd518d7 100644 --- a/app/models/project_services/issue_tracker_service.rb +++ b/app/models/project_services/issue_tracker_service.rb @@ -3,6 +3,12 @@ class IssueTrackerService < Service default_value_for :category, 'issue_tracker' + # Pattern used to extract links from comments + # Override this method on services that uses different patterns + def reference_pattern + @reference_pattern ||= %r{(\b[A-Z][A-Z0-9_]+-|#{Issue.reference_prefix})(?\d+)} + end + def default? default end diff --git a/app/models/project_services/jira_service.rb b/app/models/project_services/jira_service.rb index 97bcbacf2b9..f81b66fd219 100644 --- a/app/models/project_services/jira_service.rb +++ b/app/models/project_services/jira_service.rb @@ -13,6 +13,11 @@ class JiraService < IssueTrackerService before_update :reset_password + # {PROJECT-KEY}-{NUMBER} Examples: JIRA-1, PROJECT-1 + def reference_pattern + @reference_pattern ||= %r{(?\b([A-Z][A-Z0-9_]+-)\d+)} + end + def reset_password # don't reset the password if a new one is provided if api_url_changed? && !password_touched? diff --git a/lib/banzai/filter/abstract_reference_filter.rb b/lib/banzai/filter/abstract_reference_filter.rb index affe34394c2..cb213a76a05 100644 --- a/lib/banzai/filter/abstract_reference_filter.rb +++ b/lib/banzai/filter/abstract_reference_filter.rb @@ -208,8 +208,12 @@ module Banzai @references_per_project ||= begin refs = Hash.new { |hash, key| hash[key] = Set.new } - regex = Regexp.union(object_class.reference_pattern, - object_class.link_reference_pattern) + regex = + if uses_reference_pattern? + Regexp.union(object_class.reference_pattern, object_class.link_reference_pattern) + else + object_class.link_reference_pattern + end nodes.each do |node| node.to_html.scan(regex) do @@ -295,6 +299,14 @@ module Banzai value end end + + # There might be special cases like filters + # that should ignore reference pattern + # eg: IssueReferenceFilter when using a external issues tracker + # In those cases this method should be overridden on the filter subclass + def uses_reference_pattern? + true + end end end end diff --git a/lib/banzai/filter/external_issue_reference_filter.rb b/lib/banzai/filter/external_issue_reference_filter.rb index eaa702952cc..0d20be557a0 100644 --- a/lib/banzai/filter/external_issue_reference_filter.rb +++ b/lib/banzai/filter/external_issue_reference_filter.rb @@ -8,7 +8,7 @@ module Banzai # Public: Find `JIRA-123` issue references in text # - # ExternalIssueReferenceFilter.references_in(text) do |match, issue| + # ExternalIssueReferenceFilter.references_in(text, pattern) do |match, issue| # "##{issue}" # end # @@ -17,8 +17,8 @@ module Banzai # Yields the String match and the String issue reference. # # Returns a String replaced with the return of the block. - def self.references_in(text) - text.gsub(ExternalIssue.reference_pattern) do |match| + def self.references_in(text, pattern) + text.gsub(pattern) do |match| yield match, $~[:issue] end end @@ -27,7 +27,7 @@ module Banzai # Early return if the project isn't using an external tracker return doc if project.nil? || default_issues_tracker? - ref_pattern = ExternalIssue.reference_pattern + ref_pattern = issue_reference_pattern ref_start_pattern = /\A#{ref_pattern}\z/ each_node do |node| @@ -60,7 +60,7 @@ module Banzai def issue_link_filter(text, link_text: nil) project = context[:project] - self.class.references_in(text) do |match, id| + self.class.references_in(text, issue_reference_pattern) do |match, id| ExternalIssue.new(id, project) url = url_for_issue(id, project, only_path: context[:only_path]) @@ -82,18 +82,21 @@ module Banzai end def default_issues_tracker? - if RequestStore.active? - default_issues_tracker_cache[project.id] ||= - project.default_issues_tracker? - else - project.default_issues_tracker? - end + external_issues_cached(:default_issues_tracker?) + end + + def issue_reference_pattern + external_issues_cached(:issue_reference_pattern) end private - def default_issues_tracker_cache - RequestStore[:banzai_default_issues_tracker_cache] ||= {} + def external_issues_cached(attribute) + return project.public_send(attribute) unless RequestStore.active? + + cached_attributes = RequestStore[:banzai_external_issues_tracker_attributes] ||= Hash.new { |h, k| h[k] = {} } + cached_attributes[project.id][attribute] = project.public_send(attribute) if cached_attributes[project.id][attribute].nil? + cached_attributes[project.id][attribute] end end end diff --git a/lib/banzai/filter/issue_reference_filter.rb b/lib/banzai/filter/issue_reference_filter.rb index 54c5f9a71a4..4d1bc687696 100644 --- a/lib/banzai/filter/issue_reference_filter.rb +++ b/lib/banzai/filter/issue_reference_filter.rb @@ -4,6 +4,10 @@ module Banzai # issues that do not exist are ignored. # # This filter supports cross-project references. + # + # When external issues tracker like Jira is activated we should not + # use issue reference pattern, but we should still be able + # to reference issues from other GitLab projects. class IssueReferenceFilter < AbstractReferenceFilter self.reference_type = :issue @@ -11,6 +15,10 @@ module Banzai Issue end + def uses_reference_pattern? + context[:project].default_issues_tracker? + end + def find_object(project, iid) issues_per_project[project][iid] end diff --git a/spec/lib/banzai/filter/external_issue_reference_filter_spec.rb b/spec/lib/banzai/filter/external_issue_reference_filter_spec.rb index 7116c09fb21..2f9343fadaf 100644 --- a/spec/lib/banzai/filter/external_issue_reference_filter_spec.rb +++ b/spec/lib/banzai/filter/external_issue_reference_filter_spec.rb @@ -7,12 +7,7 @@ describe Banzai::Filter::ExternalIssueReferenceFilter, lib: true do IssuesHelper end - let(:project) { create(:jira_project) } - - context 'JIRA issue references' do - let(:issue) { ExternalIssue.new('JIRA-123', project) } - let(:reference) { issue.to_reference } - + shared_examples_for "external issue tracker" do it 'requires project context' do expect { described_class.call('') }.to raise_error(ArgumentError, /:project/) end @@ -20,6 +15,7 @@ describe Banzai::Filter::ExternalIssueReferenceFilter, lib: true do %w(pre code a style).each do |elem| it "ignores valid references contained inside '#{elem}' element" do exp = act = "<#{elem}>Issue #{reference}" + expect(filter(act).to_html).to eq exp end end @@ -33,25 +29,30 @@ describe Banzai::Filter::ExternalIssueReferenceFilter, lib: true do it 'links to a valid reference' do doc = filter("Issue #{reference}") + issue_id = doc.css('a').first.attr("data-external-issue") + expect(doc.css('a').first.attr('href')) - .to eq helper.url_for_issue(reference, project) + .to eq helper.url_for_issue(issue_id, project) end it 'links to the external tracker' do doc = filter("Issue #{reference}") - link = doc.css('a').first.attr('href') - expect(link).to eq "http://jira.example/browse/#{reference}" + link = doc.css('a').first.attr('href') + issue_id = doc.css('a').first.attr("data-external-issue") + + expect(link).to eq(helper.url_for_issue(issue_id, project)) end it 'links with adjacent text' do doc = filter("Issue (#{reference}.)") + expect(doc.to_html).to match(/\(#{reference}<\/a>\.\)/) end it 'includes a title attribute' do doc = filter("Issue #{reference}") - expect(doc.css('a').first.attr('title')).to eq "Issue in JIRA tracker" + expect(doc.css('a').first.attr('title')).to include("Issue in #{project.issues_tracker.title}") end it 'escapes the title attribute' do @@ -69,9 +70,60 @@ describe Banzai::Filter::ExternalIssueReferenceFilter, lib: true do it 'supports an :only_path context' do doc = filter("Issue #{reference}", only_path: true) - link = doc.css('a').first.attr('href') - expect(link).to eq helper.url_for_issue("#{reference}", project, only_path: true) + link = doc.css('a').first.attr('href') + issue_id = doc.css('a').first["data-external-issue"] + + expect(link).to eq helper.url_for_issue(issue_id, project, only_path: true) + end + + context 'with RequestStore enabled' do + let(:reference_filter) { HTML::Pipeline.new([described_class]) } + + before { allow(RequestStore).to receive(:active?).and_return(true) } + + it 'queries the collection on the first call' do + expect_any_instance_of(Project).to receive(:default_issues_tracker?).once.and_call_original + expect_any_instance_of(Project).to receive(:issue_reference_pattern).once.and_call_original + + not_cached = reference_filter.call("look for #{reference}", { project: project }) + + expect_any_instance_of(Project).not_to receive(:default_issues_tracker?) + expect_any_instance_of(Project).not_to receive(:issue_reference_pattern) + + cached = reference_filter.call("look for #{reference}", { project: project }) + + # Links must be the same + expect(cached[:output].css('a').first[:href]).to eq(not_cached[:output].css('a').first[:href]) + end + end + end + + context "redmine project" do + let(:project) { create(:redmine_project) } + let(:issue) { ExternalIssue.new("#123", project) } + let(:reference) { issue.to_reference } + + it_behaves_like "external issue tracker" + end + + context "jira project" do + let(:project) { create(:jira_project) } + let(:reference) { issue.to_reference } + + context "with right markdown" do + let(:issue) { ExternalIssue.new("JIRA-123", project) } + + it_behaves_like "external issue tracker" + end + + context "with wrong markdown" do + let(:issue) { ExternalIssue.new("#123", project) } + + it "ignores reference" do + exp = act = "Issue #{reference}" + expect(filter(act).to_html).to eq exp + end end end end diff --git a/spec/lib/banzai/filter/issue_reference_filter_spec.rb b/spec/lib/banzai/filter/issue_reference_filter_spec.rb index fce86a9b6ad..a2025672ad9 100644 --- a/spec/lib/banzai/filter/issue_reference_filter_spec.rb +++ b/spec/lib/banzai/filter/issue_reference_filter_spec.rb @@ -25,9 +25,7 @@ describe Banzai::Filter::IssueReferenceFilter, lib: true do let(:reference) { issue.to_reference } it 'ignores valid references when using non-default tracker' do - expect_any_instance_of(described_class).to receive(:find_object). - with(project, issue.iid). - and_return(nil) + allow(project).to receive(:default_issues_tracker?).and_return(false) exp = act = "Issue #{reference}" expect(reference_filter(act).to_html).to eq exp @@ -199,19 +197,6 @@ describe Banzai::Filter::IssueReferenceFilter, lib: true do end end - context 'referencing external issues' do - let(:project) { create(:redmine_project) } - - it 'renders internal issue IDs as external issue links' do - doc = reference_filter('#1') - link = doc.css('a').first - - expect(link.attr('data-reference-type')).to eq('external_issue') - expect(link.attr('title')).to eq('Issue in Redmine') - expect(link.attr('data-external-issue')).to eq('1') - end - end - describe '#issues_per_Project' do context 'using an internal issue tracker' do it 'returns a Hash containing the issues per project' do diff --git a/spec/models/external_issue_spec.rb b/spec/models/external_issue_spec.rb index 4fc3b065592..ebba6e14578 100644 --- a/spec/models/external_issue_spec.rb +++ b/spec/models/external_issue_spec.rb @@ -10,21 +10,6 @@ describe ExternalIssue, models: true do it { is_expected.to include_module(Referable) } end - describe '.reference_pattern' do - it 'allows underscores in the project name' do - expect(ExternalIssue.reference_pattern.match('EXT_EXT-1234')[0]).to eq 'EXT_EXT-1234' - end - - it 'allows numbers in the project name' do - expect(ExternalIssue.reference_pattern.match('EXT3_EXT-1234')[0]).to eq 'EXT3_EXT-1234' - end - - it 'requires the project name to begin with A-Z' do - expect(ExternalIssue.reference_pattern.match('3EXT_EXT-1234')).to eq nil - expect(ExternalIssue.reference_pattern.match('EXT_EXT-1234')[0]).to eq 'EXT_EXT-1234' - end - end - describe '#to_reference' do it 'returns a String reference to the object' do expect(issue.to_reference).to eq issue.id diff --git a/spec/models/project_services/jira_service_spec.rb b/spec/models/project_services/jira_service_spec.rb index b48a3176007..6ff32aea018 100644 --- a/spec/models/project_services/jira_service_spec.rb +++ b/spec/models/project_services/jira_service_spec.rb @@ -30,6 +30,15 @@ describe JiraService, models: true do end end + describe '#reference_pattern' do + it_behaves_like 'allows project key on reference pattern' + + it 'does not allow # on the code' do + expect(subject.reference_pattern.match('#123')).to be_nil + expect(subject.reference_pattern.match('1#23#12')).to be_nil + end + end + describe "Execute" do let(:user) { create(:user) } let(:project) { create(:project) } diff --git a/spec/models/project_services/redmine_service_spec.rb b/spec/models/project_services/redmine_service_spec.rb index b8679cd2563..0a7b237a051 100644 --- a/spec/models/project_services/redmine_service_spec.rb +++ b/spec/models/project_services/redmine_service_spec.rb @@ -26,4 +26,12 @@ describe RedmineService, models: true do it { is_expected.not_to validate_presence_of(:new_issue_url) } end end + + describe '#reference_pattern' do + it_behaves_like 'allows project key on reference pattern' + + it 'does allow # on the reference' do + expect(subject.reference_pattern.match('#123')[:issue]).to eq('123') + end + end end diff --git a/spec/services/git_push_service_spec.rb b/spec/services/git_push_service_spec.rb index 8dda34c7a03..ad5170afc21 100644 --- a/spec/services/git_push_service_spec.rb +++ b/spec/services/git_push_service_spec.rb @@ -415,7 +415,7 @@ describe GitPushService, services: true do it "doesn't close issues when external issue tracker is in use" do allow_any_instance_of(Project).to receive(:default_issues_tracker?). and_return(false) - external_issue_tracker = double(title: 'My Tracker', issue_path: issue.iid) + external_issue_tracker = double(title: 'My Tracker', issue_path: issue.iid, reference_pattern: project.issue_reference_pattern) allow_any_instance_of(Project).to receive(:external_issue_tracker).and_return(external_issue_tracker) # The push still shouldn't create cross-reference notes. @@ -484,30 +484,46 @@ describe GitPushService, services: true do end context "closing an issue" do - let(:message) { "this is some work.\n\ncloses JIRA-1" } + let(:message) { "this is some work.\n\ncloses JIRA-1" } + let(:transition_body) { { transition: { id: '2' } }.to_json } + let(:comment_body) { { body: "Issue solved with [#{closing_commit.id}|http://localhost/#{project.path_with_namespace}/commit/#{closing_commit.id}]." }.to_json } - it "initiates one api call to jira server to close the issue" do - transition_body = { - transition: { - id: '2' - } - }.to_json + context "using right markdown" do + it "initiates one api call to jira server to close the issue" do + execute_service(project, commit_author, @oldrev, @newrev, @ref ) - execute_service(project, commit_author, @oldrev, @newrev, @ref ) - expect(WebMock).to have_requested(:post, jira_api_transition_url).with( - body: transition_body - ).once + expect(WebMock).to have_requested(:post, jira_api_transition_url).with( + body: transition_body + ).once + end + + it "initiates one api call to jira server to comment on the issue" do + execute_service(project, commit_author, @oldrev, @newrev, @ref ) + + expect(WebMock).to have_requested(:post, jira_api_comment_url).with( + body: comment_body + ).once + end end - it "initiates one api call to jira server to comment on the issue" do - comment_body = { - body: "Issue solved with [#{closing_commit.id}|http://localhost/#{project.path_with_namespace}/commit/#{closing_commit.id}]." - }.to_json + context "using wrong markdown" do + let(:message) { "this is some work.\n\ncloses #1" } - execute_service(project, commit_author, @oldrev, @newrev, @ref ) - expect(WebMock).to have_requested(:post, jira_api_comment_url).with( - body: comment_body - ).once + it "does not initiates one api call to jira server to close the issue" do + execute_service(project, commit_author, @oldrev, @newrev, @ref ) + + expect(WebMock).not_to have_requested(:post, jira_api_transition_url).with( + body: transition_body + ) + end + + it "does not initiates one api call to jira server to comment on the issue" do + execute_service(project, commit_author, @oldrev, @newrev, @ref ) + + expect(WebMock).not_to have_requested(:post, jira_api_comment_url).with( + body: comment_body + ).once + end end end end diff --git a/spec/services/merge_requests/merge_service_spec.rb b/spec/services/merge_requests/merge_service_spec.rb index 9163c0c104e..f93d7732a9a 100644 --- a/spec/services/merge_requests/merge_service_spec.rb +++ b/spec/services/merge_requests/merge_service_spec.rb @@ -74,6 +74,18 @@ describe MergeRequests::MergeService, services: true do service.execute(merge_request) end + + context "wrong issue markdown" do + it 'does not close issues on JIRA issue tracker' do + jira_issue = ExternalIssue.new('#123', project) + commit = double('commit', safe_message: "Fixes #{jira_issue.to_reference}") + allow(merge_request).to receive(:commits).and_return([commit]) + + expect_any_instance_of(JiraService).not_to receive(:close_issue) + + service.execute(merge_request) + end + end end end diff --git a/spec/support/issue_tracker_service_shared_example.rb b/spec/support/issue_tracker_service_shared_example.rb index b6d7436c360..e70b3963d9d 100644 --- a/spec/support/issue_tracker_service_shared_example.rb +++ b/spec/support/issue_tracker_service_shared_example.rb @@ -5,3 +5,18 @@ RSpec.shared_examples 'issue tracker service URL attribute' do |url_attr| it { is_expected.not_to allow_value('ftp://example.com').for(url_attr) } it { is_expected.not_to allow_value('herp-and-derp').for(url_attr) } end + +RSpec.shared_examples 'allows project key on reference pattern' do |url_attr| + it 'allows underscores in the project name' do + expect(subject.reference_pattern.match('EXT_EXT-1234')[0]).to eq 'EXT_EXT-1234' + end + + it 'allows numbers in the project name' do + expect(subject.reference_pattern.match('EXT3_EXT-1234')[0]).to eq 'EXT3_EXT-1234' + end + + it 'requires the project name to begin with A-Z' do + expect(subject.reference_pattern.match('3EXT_EXT-1234')).to eq nil + expect(subject.reference_pattern.match('EXT_EXT-1234')[0]).to eq 'EXT_EXT-1234' + end +end From ce78bdf96bf5744783f06a60d3c7078b4534390d Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Wed, 19 Oct 2016 18:46:47 +0300 Subject: [PATCH 072/174] Its time for 8.14 in master Signed-off-by: Dmitriy Zaporozhets --- CHANGELOG.md | 2 ++ VERSION | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c866696889e..30b18ca84aa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,7 @@ Please view this file on the master branch, on stable branches it's out of date. +## 8.14.0 (2016-11-22) + ## 8.13.0 (2016-10-22) - Fix save button on project pipeline settings page. (!6955) diff --git a/VERSION b/VERSION index dff4cd02d5f..919f462addc 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -8.13.0-pre +8.14.0-pre From 257c58ebeb2de8fe44f83c751b91e09c306aa588 Mon Sep 17 00:00:00 2001 From: Bryce Johnson Date: Tue, 18 Oct 2016 19:03:10 +0200 Subject: [PATCH 073/174] Set webkit-overflow-scrolling to auto for children of body. --- CHANGELOG.md | 1 + app/assets/stylesheets/framework/files.scss | 1 - app/assets/stylesheets/framework/layout.scss | 12 ++++++++++++ app/assets/stylesheets/pages/diff.scss | 1 - 4 files changed, 13 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c866696889e..2c4d94c4cc5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -126,6 +126,7 @@ Please view this file on the master branch, on stable branches it's out of date. - API: all unknown routing will be handled with 404 Not Found - Add docs for request profiling - Delete dynamic environments + - Fix buggy iOS tooltip layering behavior. - Make guests unable to view MRs on private projects ## 8.12.7 diff --git a/app/assets/stylesheets/framework/files.scss b/app/assets/stylesheets/framework/files.scss index 13c1bbf0359..f49d7b92a00 100644 --- a/app/assets/stylesheets/framework/files.scss +++ b/app/assets/stylesheets/framework/files.scss @@ -167,7 +167,6 @@ */ &.code { padding: 0; - -webkit-overflow-scrolling: auto; // See https://gitlab.com/gitlab-org/gitlab-ce/issues/13987 } } } diff --git a/app/assets/stylesheets/framework/layout.scss b/app/assets/stylesheets/framework/layout.scss index 8bb047db2dd..7baa4296abf 100644 --- a/app/assets/stylesheets/framework/layout.scss +++ b/app/assets/stylesheets/framework/layout.scss @@ -27,3 +27,15 @@ body { .container-limited { max-width: $fixed-layout-width; } + + +/* The following prevents side effects related to iOS Safari's implementation of -webkit-overflow-scrolling: touch, +which is applied to the body by jquery.nicescroling plugin to force hardware acceleration for momentum scrolling. Side +effects are commonly related to inconsisent z-index behavior (e.g. tooltips). By applying the following to direct children +of the body element here, we negate cascading side effects but allow momentum scrolling to be applied to the body */ + +.navbar, +.page-gutter, +.page-with-sidebar { + -webkit-overflow-scrolling: auto; +} diff --git a/app/assets/stylesheets/pages/diff.scss b/app/assets/stylesheets/pages/diff.scss index bdc82a8f0f5..fe6421f8b3f 100644 --- a/app/assets/stylesheets/pages/diff.scss +++ b/app/assets/stylesheets/pages/diff.scss @@ -52,7 +52,6 @@ background: #fff; color: #333; border-radius: 0 0 3px 3px; - -webkit-overflow-scrolling: auto; .unfold { cursor: pointer; From d820c090ec85f8118e4cea75bd63d800e812ea25 Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Mon, 19 Sep 2016 12:04:38 -0300 Subject: [PATCH 074/174] Add GroupLabel model --- app/models/group.rb | 1 + app/models/group_label.rb | 5 +++++ db/migrate/20160919144305_add_type_to_labels.rb | 9 +++++++++ db/migrate/20160919145149_add_group_id_to_labels.rb | 13 +++++++++++++ db/schema.rb | 4 ++++ spec/models/group_label_spec.rb | 11 +++++++++++ spec/models/group_spec.rb | 1 + 7 files changed, 44 insertions(+) create mode 100644 app/models/group_label.rb create mode 100644 db/migrate/20160919144305_add_type_to_labels.rb create mode 100644 db/migrate/20160919145149_add_group_id_to_labels.rb create mode 100644 spec/models/group_label_spec.rb diff --git a/app/models/group.rb b/app/models/group.rb index a2f88cca828..00a595d2705 100644 --- a/app/models/group.rb +++ b/app/models/group.rb @@ -19,6 +19,7 @@ class Group < Namespace has_many :project_group_links, dependent: :destroy has_many :shared_projects, through: :project_group_links, source: :project has_many :notification_settings, dependent: :destroy, as: :source + has_many :labels, class_name: 'GroupLabel' validate :avatar_type, if: ->(user) { user.avatar.present? && user.avatar_changed? } validate :visibility_level_allowed_by_projects diff --git a/app/models/group_label.rb b/app/models/group_label.rb new file mode 100644 index 00000000000..a854d075820 --- /dev/null +++ b/app/models/group_label.rb @@ -0,0 +1,5 @@ +class GroupLabel < Label + belongs_to :group + + validates :group, presence: true +end diff --git a/db/migrate/20160919144305_add_type_to_labels.rb b/db/migrate/20160919144305_add_type_to_labels.rb new file mode 100644 index 00000000000..43aac7846d3 --- /dev/null +++ b/db/migrate/20160919144305_add_type_to_labels.rb @@ -0,0 +1,9 @@ +class AddTypeToLabels < ActiveRecord::Migration + include Gitlab::Database::MigrationHelpers + + DOWNTIME = false + + def change + add_column :labels, :type, :string + end +end diff --git a/db/migrate/20160919145149_add_group_id_to_labels.rb b/db/migrate/20160919145149_add_group_id_to_labels.rb new file mode 100644 index 00000000000..05e21af0584 --- /dev/null +++ b/db/migrate/20160919145149_add_group_id_to_labels.rb @@ -0,0 +1,13 @@ +class AddGroupIdToLabels < ActiveRecord::Migration + include Gitlab::Database::MigrationHelpers + + DOWNTIME = false + + disable_ddl_transaction! + + def change + add_column :labels, :group_id, :integer + add_foreign_key :labels, :namespaces, column: :group_id, on_delete: :cascade + add_concurrent_index :labels, :group_id + end +end diff --git a/db/schema.rb b/db/schema.rb index 5ce855fe08f..37f0be0e834 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -529,8 +529,11 @@ ActiveRecord::Schema.define(version: 20161017095000) do t.string "description" t.integer "priority" t.text "description_html" + t.string "type" + t.integer "group_id" end + add_index "labels", ["group_id"], name: "index_labels_on_group_id", using: :btree add_index "labels", ["priority"], name: "index_labels_on_priority", using: :btree add_index "labels", ["project_id"], name: "index_labels_on_project_id", using: :btree add_index "labels", ["title"], name: "index_labels_on_title", using: :btree @@ -1213,6 +1216,7 @@ ActiveRecord::Schema.define(version: 20161017095000) do add_foreign_key "boards", "projects" add_foreign_key "issue_metrics", "issues", on_delete: :cascade + add_foreign_key "labels", "namespaces", column: "group_id", on_delete: :cascade add_foreign_key "lists", "boards" add_foreign_key "lists", "labels" add_foreign_key "merge_request_metrics", "merge_requests", on_delete: :cascade diff --git a/spec/models/group_label_spec.rb b/spec/models/group_label_spec.rb new file mode 100644 index 00000000000..a82d23bcc0b --- /dev/null +++ b/spec/models/group_label_spec.rb @@ -0,0 +1,11 @@ +require 'spec_helper' + +describe GroupLabel, models: true do + describe 'relationships' do + it { is_expected.to belong_to(:group) } + end + + describe 'validations' do + it { is_expected.to validate_presence_of(:group) } + end +end diff --git a/spec/models/group_spec.rb b/spec/models/group_spec.rb index 0b3ef9b98fd..ac862055ebc 100644 --- a/spec/models/group_spec.rb +++ b/spec/models/group_spec.rb @@ -12,6 +12,7 @@ describe Group, models: true do it { is_expected.to have_many(:project_group_links).dependent(:destroy) } it { is_expected.to have_many(:shared_projects).through(:project_group_links) } it { is_expected.to have_many(:notification_settings).dependent(:destroy) } + it { is_expected.to have_many(:labels).class_name('GroupLabel') } describe '#members & #requesters' do let(:requester) { create(:user) } From 52e0c3b565b7b177abbf8ea3bc573651060179a2 Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Mon, 19 Sep 2016 16:49:08 -0300 Subject: [PATCH 075/174] Add CRUD for Group Labels --- app/assets/javascripts/dispatcher.js.es6 | 2 + app/controllers/groups/labels_controller.rb | 67 ++++++++++++++++++++ app/helpers/labels_helper.rb | 28 ++++++-- app/policies/group_policy.rb | 1 + app/views/groups/labels/_form.html.haml | 33 ++++++++++ app/views/groups/labels/_label.html.haml | 53 ++++++++++++++++ app/views/groups/labels/_label_row.html.haml | 6 ++ app/views/groups/labels/destroy.js.haml | 2 + app/views/groups/labels/edit.html.haml | 8 +++ app/views/groups/labels/index.html.haml | 24 +++++++ app/views/groups/labels/new.html.haml | 9 +++ app/views/layouts/nav/_group.html.haml | 4 ++ config/routes/group.rb | 6 ++ 13 files changed, 238 insertions(+), 5 deletions(-) create mode 100644 app/controllers/groups/labels_controller.rb create mode 100644 app/views/groups/labels/_form.html.haml create mode 100644 app/views/groups/labels/_label.html.haml create mode 100644 app/views/groups/labels/_label_row.html.haml create mode 100644 app/views/groups/labels/destroy.js.haml create mode 100644 app/views/groups/labels/edit.html.haml create mode 100644 app/views/groups/labels/index.html.haml create mode 100644 app/views/groups/labels/new.html.haml diff --git a/app/assets/javascripts/dispatcher.js.es6 b/app/assets/javascripts/dispatcher.js.es6 index 73691f40c74..afc0d6f8c62 100644 --- a/app/assets/javascripts/dispatcher.js.es6 +++ b/app/assets/javascripts/dispatcher.js.es6 @@ -168,6 +168,8 @@ shortcut_handler = new ShortcutsNavigation(); new ShortcutsBlob(true); break; + case 'groups:labels:new': + case 'groups:labels:edit': case 'projects:labels:new': case 'projects:labels:edit': new Labels(); diff --git a/app/controllers/groups/labels_controller.rb b/app/controllers/groups/labels_controller.rb new file mode 100644 index 00000000000..449298f51a8 --- /dev/null +++ b/app/controllers/groups/labels_controller.rb @@ -0,0 +1,67 @@ +class Groups::LabelsController < Groups::ApplicationController + include ToggleSubscriptionAction + + before_action :label, only: [:edit, :update, :destroy, :toggle_subscription] + before_action :authorize_admin_labels!, only: [:new, :create, :edit, :update, :destroy] + + respond_to :html + + def index + @labels = @group.labels.page(params[:page]) + end + + def new + @label = @group.labels.new + end + + def create + @label = @group.labels.create(label_params) + + if @label.valid? + redirect_to group_labels_path(@group) + else + render :new + end + end + + def edit + end + + def update + if @label.update_attributes(label_params) + redirect_to group_labels_path(@group) + else + render :edit + end + end + + def destroy + @label.destroy + + respond_to do |format| + format.html do + redirect_to group_labels_path(@group), notice: 'Label was removed' + end + format.js + end + end + + protected + + def authorize_admin_labels! + return render_404 unless can?(current_user, :admin_label, @group) + end + + def authorize_read_labels! + return render_404 unless can?(current_user, :read_label, @group) + end + + def label + @label ||= @group.labels.find(params[:id]) + end + alias_method :subscribable_resource, :label + + def label_params + params.require(:label).permit(:title, :description, :color) + end +end diff --git a/app/helpers/labels_helper.rb b/app/helpers/labels_helper.rb index b9f3d6c75c2..540eb6dd493 100644 --- a/app/helpers/labels_helper.rb +++ b/app/helpers/labels_helper.rb @@ -43,11 +43,29 @@ module LabelsHelper end end - def label_filter_path(project, label, type: issue) - send("namespace_project_#{type.to_s.pluralize}_path", - project.namespace, - project, - label_name: [label.name]) + def link_to_group_label(label, group: nil, type: :issue, tooltip: true, css_class: nil, &block) + group ||= @group || label.group + link = label_filter_path(group, label, type: type) + + if block_given? + link_to link, class: css_class, &block + else + link_to render_colored_label(label, tooltip: tooltip), link, class: css_class + end + end + + def label_filter_path(subject, label, type: issue) + case subject + when Project + send("namespace_project_#{type.to_s.pluralize}_path", + subject.namespace, + subject, + label_name: [label.name]) + when Group + send("#{type.to_s.pluralize}_group_path", + subject, + label_name: [label.name]) + end end def project_label_names diff --git a/app/policies/group_policy.rb b/app/policies/group_policy.rb index 97ff6233968..b65fb68cd88 100644 --- a/app/policies/group_policy.rb +++ b/app/policies/group_policy.rb @@ -19,6 +19,7 @@ class GroupPolicy < BasePolicy if master can! :create_projects can! :admin_milestones + can! :admin_label end # Only group owner and administrators can admin group diff --git a/app/views/groups/labels/_form.html.haml b/app/views/groups/labels/_form.html.haml new file mode 100644 index 00000000000..008b5fb9ba1 --- /dev/null +++ b/app/views/groups/labels/_form.html.haml @@ -0,0 +1,33 @@ += form_for @label, as: :label, url: url, html: { class: 'form-horizontal label-form js-quick-submit js-requires-input' } do |f| + = form_errors(@label) + + .form-group + = f.label :title, class: 'control-label' + .col-sm-10 + = f.text_field :title, class: "form-control", required: true, autofocus: true + .form-group + = f.label :description, class: 'control-label' + .col-sm-10 + = f.text_field :description, class: "form-control js-quick-submit" + .form-group + = f.label :color, "Background color", class: 'control-label' + .col-sm-10 + .input-group + .input-group-addon.label-color-preview   + = f.color_field :color, class: "form-control" + .help-block + Choose any color. + %br + Or you can choose one of suggested colors below + + .suggest-colors + - suggested_colors.each do |color| + = link_to '#', style: "background-color: #{color}", data: { color: color } do +   + + .form-actions + - if @label.persisted? + = f.submit 'Save changes', class: 'btn btn-save js-save-button' + - else + = f.submit 'Create Label', class: 'btn btn-create js-save-button' + = link_to "Cancel", group_labels_path(@group), class: 'btn btn-cancel' diff --git a/app/views/groups/labels/_label.html.haml b/app/views/groups/labels/_label.html.haml new file mode 100644 index 00000000000..b9aab76f057 --- /dev/null +++ b/app/views/groups/labels/_label.html.haml @@ -0,0 +1,53 @@ +- label_css_id = dom_id(label) +- open_issues_count = label.open_issues_count(current_user) +- open_merge_requests_count = label.open_merge_requests_count + +%li{id: label_css_id, data: { id: label.id } } + = render 'label_row', label: label + + .visible-xs.visible-sm-inline-block.visible-md-inline-block.dropdown + %button.btn.btn-default.label-options-toggle{ data: { toggle: 'dropdown' } } + Options + %span.caret + .dropdown-menu.dropdown-menu-align-right + %ul + %li + = link_to_group_label(label, type: :merge_request) do + = pluralize open_merge_requests_count, 'merge request' + %li + = link_to_group_label(label) do + = pluralize open_issues_count, 'open issue' + - if current_user + %li.label-subscription{ data: { url: toggle_subscription_group_label_path(@group, label) } } + %a.js-subscribe-button.label-subscribe-button.subscription-status{ role: "button", href: "#", data: { toggle: "tooltip", status: label_subscription_status(label) } } + %span= label_subscription_toggle_button_text(label) + - if can? current_user, :admin_label, @group + %li + = link_to 'Edit', edit_group_label_path(@group, label) + %li + = link_to 'Delete', group_label_path(@group, label), title: 'Delete', method: :delete, remote: true, data: {confirm: "Remove this label? Are you sure?"} + + .pull-right.hidden-xs.hidden-sm.hidden-md + = link_to_group_label(label, type: :merge_request, css_class: 'btn btn-transparent btn-action') do + = pluralize open_merge_requests_count, 'merge request' + = link_to_group_label(label, css_class: 'btn btn-transparent btn-action') do + = pluralize open_issues_count, 'open issue' + + - if current_user + .label-subscription.inline{ data: { url: toggle_subscription_group_label_path(@group, label) } } + %button.js-subscribe-button.label-subscribe-button.btn.btn-transparent.btn-action.subscription-status{ type: "button", title: label_subscription_toggle_button_text(label), data: { toggle: "tooltip", status: label_subscription_status(label) } } + %span.sr-only= label_subscription_toggle_button_text(label) + = icon('eye', class: 'label-subscribe-button-icon') + = icon('spinner spin', class: 'label-subscribe-button-loading') + + - if can? current_user, :admin_label, @group + = link_to edit_group_label_path(@group, label), title: 'Edit', class: 'btn btn-transparent btn-action', data: {toggle: 'tooltip'} do + %span.sr-only Edit + = icon('pencil-square-o') + = link_to group_label_path(@group, label), title: 'Delete', class: 'btn btn-transparent btn-action remove-row', method: :delete, remote: true, data: {confirm: 'Remove this label? Are you sure?', toggle: 'tooltip'} do + %span.sr-only Delete + = icon('trash-o') + + - if current_user + :javascript + new Subscription('##{dom_id(label)} .label-subscription'); diff --git a/app/views/groups/labels/_label_row.html.haml b/app/views/groups/labels/_label_row.html.haml new file mode 100644 index 00000000000..e21fac25b01 --- /dev/null +++ b/app/views/groups/labels/_label_row.html.haml @@ -0,0 +1,6 @@ +%span.label-row + %span.label-name + = link_to_group_label(label, tooltip: false) + - if label.description + %span.label-description + = markdown(label.description, pipeline: :single_line) diff --git a/app/views/groups/labels/destroy.js.haml b/app/views/groups/labels/destroy.js.haml new file mode 100644 index 00000000000..3dfbfc77c0d --- /dev/null +++ b/app/views/groups/labels/destroy.js.haml @@ -0,0 +1,2 @@ +- if @group.labels.empty? + $('.labels').load(document.URL + ' .nothing-here-block').hide().fadeIn(1000) diff --git a/app/views/groups/labels/edit.html.haml b/app/views/groups/labels/edit.html.haml new file mode 100644 index 00000000000..e247393abd5 --- /dev/null +++ b/app/views/groups/labels/edit.html.haml @@ -0,0 +1,8 @@ +- page_title 'Edit', @label.name, 'Labels' + +%h3.page-title + = icon('folder-open') + Edit Group Label +%hr + += render 'form', url: group_label_path(@group, @label) diff --git a/app/views/groups/labels/index.html.haml b/app/views/groups/labels/index.html.haml new file mode 100644 index 00000000000..d9f1d350cb3 --- /dev/null +++ b/app/views/groups/labels/index.html.haml @@ -0,0 +1,24 @@ +- page_title 'Labels' + +.top-area.adjust + .nav-text + Labels can be applied to issues and merge requests. + + .nav-controls + - if can?(current_user, :admin_label, @group) + = link_to new_group_label_path(@group), class: "btn btn-new" do + New label + +.labels + - hide = @group.labels.empty? || (params[:page].present? && params[:page] != '1') + .group-labels + %h5{ class: ('hide' if hide) } + = icon('folder-open') + Group Labels + - if @labels.present? + %ul.content-list.manage-labels-list.js-group-labels + = render partial: 'label', collection: @labels, as: :label + = paginate @labels, theme: 'gitlab' + - else + .nothing-here-block + No labels created yet. diff --git a/app/views/groups/labels/new.html.haml b/app/views/groups/labels/new.html.haml new file mode 100644 index 00000000000..01a50607db4 --- /dev/null +++ b/app/views/groups/labels/new.html.haml @@ -0,0 +1,9 @@ +- page_title 'New Group Label' +- header_title group_title(@group, 'Labels', group_labels_path(@group)) + +%h3.page-title + = icon('folder-open') + New Group Label +%hr + += render 'form', url: group_labels_path diff --git a/app/views/layouts/nav/_group.html.haml b/app/views/layouts/nav/_group.html.haml index 27ac1760166..f7edb47b666 100644 --- a/app/views/layouts/nav/_group.html.haml +++ b/app/views/layouts/nav/_group.html.haml @@ -13,6 +13,10 @@ = link_to activity_group_path(@group), title: 'Activity' do %span Activity + = nav_link(controller: [:group, :labels]) do + = link_to group_labels_path(@group), title: 'Labels' do + %span + Labels = nav_link(controller: [:group, :milestones]) do = link_to group_milestones_path(@group), title: 'Milestones' do %span diff --git a/config/routes/group.rb b/config/routes/group.rb index 06b464d79c8..7bb9aa50875 100644 --- a/config/routes/group.rb +++ b/config/routes/group.rb @@ -28,5 +28,11 @@ resources :groups, constraints: { id: /[a-zA-Z.0-9_\-]+(? Date: Mon, 19 Sep 2016 17:16:16 -0300 Subject: [PATCH 076/174] Add LabelsFinder --- app/finders/labels_finder.rb | 58 ++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 app/finders/labels_finder.rb diff --git a/app/finders/labels_finder.rb b/app/finders/labels_finder.rb new file mode 100644 index 00000000000..cf7018cf8a2 --- /dev/null +++ b/app/finders/labels_finder.rb @@ -0,0 +1,58 @@ +class LabelsFinder + def initialize(current_user, params = {}) + @current_user = current_user + @params = params + end + + def execute + items = init_collection + items = with_title(items) + sort(items) + end + + private + + attr_reader :current_user, :params + + def init_collection + label_ids = [] + label_ids << Label.where(group_id: projects.where.not(group: nil).select(:namespace_id)).select(:id) + label_ids << Label.where(project_id: projects).select(:id) + + union = Gitlab::SQL::Union.new(label_ids) + + Label.where("labels.id IN (#{union.to_sql})") + .reorder(title: :asc) + end + + def with_title(items) + items = items.where(title: title) if title.present? + items + end + + def sort(items) + items.reorder(title: :asc) + end + + def project_id + params[:project_id].presence + end + + def title + params[:title].presence + end + + def projects + return @projects if defined?(@projects) + + if project_id + @projects = ProjectsFinder.new.execute(current_user) + .where(id: project_id) + .reorder(nil) + else + @projects = Project.none + end + + @projects + end +end From 398ab263fd08a5d9d7b19c5b3d06f33814a474eb Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Mon, 19 Sep 2016 17:21:39 -0300 Subject: [PATCH 077/174] Allow users to apply group labels on Issues/MRs --- .../dashboard/labels_controller.rb | 5 ++++- app/controllers/projects/issues_controller.rb | 9 +++++--- app/controllers/projects/labels_controller.rb | 2 +- .../projects/merge_requests_controller.rb | 5 ++++- app/finders/issuable_finder.rb | 4 +++- app/models/label.rb | 6 +++++- app/services/issuable_base_service.rb | 15 ++++++++----- app/services/projects/autocomplete_service.rb | 2 +- app/views/shared/issuable/_filter.html.haml | 9 ++++---- app/views/shared/issuable/_form.html.haml | 2 +- spec/services/issues/create_service_spec.rb | 21 +++++++++++++++++++ 11 files changed, 60 insertions(+), 20 deletions(-) diff --git a/app/controllers/dashboard/labels_controller.rb b/app/controllers/dashboard/labels_controller.rb index 2a88350a4ca..797f8503b2d 100644 --- a/app/controllers/dashboard/labels_controller.rb +++ b/app/controllers/dashboard/labels_controller.rb @@ -1,6 +1,9 @@ class Dashboard::LabelsController < Dashboard::ApplicationController def index - labels = Label.where(project_id: projects).select(:id, :title, :color).uniq(:title) + labels = LabelsFinder.new(current_user, project_id: projects) + .execute + .select(:id, :title, :color) + .uniq(:title) respond_to do |format| format.json { render json: labels } diff --git a/app/controllers/projects/issues_controller.rb b/app/controllers/projects/issues_controller.rb index 96041b07647..d85bc85092f 100644 --- a/app/controllers/projects/issues_controller.rb +++ b/app/controllers/projects/issues_controller.rb @@ -25,8 +25,7 @@ class Projects::IssuesController < Projects::ApplicationController def index @issues = issues_collection @issues = @issues.page(params[:page]) - - @labels = @project.labels.where(title: params[:label_name]) + @labels = LabelsFinder.new(current_user, project_id: @project.id, title: params[:label_name]).execute if params[:label_name].presence respond_to do |format| format.html @@ -45,11 +44,15 @@ class Projects::IssuesController < Projects::ApplicationController assignee_id: "" ) - @issue = @noteable = @project.issues.new(issue_params) + @issue = @noteable = @project.issues.new(issue_params) + @labels = LabelsFinder.new(current_user, project_id: @project.id).execute + respond_with(@issue) end def edit + @labels = LabelsFinder.new(current_user, project_id: @project.id).execute + respond_with(@issue) end diff --git a/app/controllers/projects/labels_controller.rb b/app/controllers/projects/labels_controller.rb index a6626df4826..35224f965bf 100644 --- a/app/controllers/projects/labels_controller.rb +++ b/app/controllers/projects/labels_controller.rb @@ -17,7 +17,7 @@ class Projects::LabelsController < Projects::ApplicationController respond_to do |format| format.html format.json do - render json: @project.labels + render json: LabelsFinder.new(current_user, project_id: @project.id).execute end end end diff --git a/app/controllers/projects/merge_requests_controller.rb b/app/controllers/projects/merge_requests_controller.rb index 04386258c19..c8970155497 100644 --- a/app/controllers/projects/merge_requests_controller.rb +++ b/app/controllers/projects/merge_requests_controller.rb @@ -40,7 +40,7 @@ class Projects::MergeRequestsController < Projects::ApplicationController @merge_requests = @merge_requests.page(params[:page]) @merge_requests = @merge_requests.preload(:target_project) - @labels = @project.labels.where(title: params[:label_name]) + @labels = LabelsFinder.new(current_user, project_id: @project.id, title: params[:label_name]).execute if params[:label_name].presence respond_to do |format| format.html @@ -263,6 +263,7 @@ class Projects::MergeRequestsController < Projects::ApplicationController @source_project = @merge_request.source_project @target_project = @merge_request.target_project @target_branches = @merge_request.target_project.repository.branch_names + @labels = LabelsFinder.new(current_user, project_id: @project.id).execute end def update @@ -575,6 +576,8 @@ class Projects::MergeRequestsController < Projects::ApplicationController @note_counts = Note.where(commit_id: @commits.map(&:id)). group(:commit_id).count + @labels = LabelsFinder.new(current_user, project_id: @project.id).execute + define_pipelines_vars end diff --git a/app/finders/issuable_finder.rb b/app/finders/issuable_finder.rb index 9f170428100..37151f8d134 100644 --- a/app/finders/issuable_finder.rb +++ b/app/finders/issuable_finder.rb @@ -274,8 +274,10 @@ class IssuableFinder items = items.without_label else items = items.with_label(label_names, params[:sort]) + if projects - items = items.where(labels: { project_id: projects }) + label_ids = LabelsFinder.new(current_user, project_id: projects).execute.select(:id) + items = items.where(labels: { id: label_ids }) end end end diff --git a/app/models/label.rb b/app/models/label.rb index e8e12e2904e..295c5bfaf70 100644 --- a/app/models/label.rb +++ b/app/models/label.rb @@ -23,7 +23,7 @@ class Label < ActiveRecord::Base has_many :merge_requests, through: :label_links, source: :target, source_type: 'MergeRequest' validates :color, color: true, allow_blank: false - validates :project, presence: true, unless: Proc.new { |service| service.template? } + validates :project, presence: true, if: :project_label? # Don't allow ',' for label titles validates :title, @@ -127,6 +127,10 @@ class Label < ActiveRecord::Base private + def project_label? + type.blank? && !template? + end + def label_format_reference(format = :id) raise StandardError, 'Unknown format' unless [:id, :name].include?(format) diff --git a/app/services/issuable_base_service.rb b/app/services/issuable_base_service.rb index 57d521f2fea..b3e4f8dcf27 100644 --- a/app/services/issuable_base_service.rb +++ b/app/services/issuable_base_service.rb @@ -80,17 +80,18 @@ class IssuableBaseService < BaseService def filter_labels_in_param(key) return if params[key].to_a.empty? - params[key] = project.labels.where(id: params[key]).pluck(:id) + params[key] = available_labels.where(id: params[key]).pluck(:id) end def find_or_create_label_ids labels = params.delete(:labels) return unless labels - params[:label_ids] = labels.split(",").map do |label_name| - project.labels.create_with(color: Label::DEFAULT_COLOR) - .find_or_create_by(title: label_name.strip) - .id + params[:label_ids] = labels.split(',').map do |label_name| + label = available_labels.find_by(title: title).select(:id) + label ||= project.labels.create(title: label_name.strip, color: Label::DEFAULT_COLOR) + + label.id end end @@ -111,6 +112,10 @@ class IssuableBaseService < BaseService new_label_ids end + def available_labels + LabelsFinder.new(current_user, project_id: @project.id).execute + end + def merge_slash_commands_into_params!(issuable) description, command_params = SlashCommands::InterpretService.new(project, current_user). diff --git a/app/services/projects/autocomplete_service.rb b/app/services/projects/autocomplete_service.rb index f578f8dbea2..015f2828921 100644 --- a/app/services/projects/autocomplete_service.rb +++ b/app/services/projects/autocomplete_service.rb @@ -13,7 +13,7 @@ module Projects end def labels - @project.labels.select([:title, :color]) + LabelsFinder.new(current_user, project_id: project.id).execute.select([:title, :color]) end def commands(noteable, type) diff --git a/app/views/shared/issuable/_filter.html.haml b/app/views/shared/issuable/_filter.html.haml index 31620297be0..8c2036a1cde 100644 --- a/app/views/shared/issuable/_filter.html.haml +++ b/app/views/shared/issuable/_filter.html.haml @@ -77,11 +77,10 @@ = hidden_field_tag :state_event, params[:state_event] .filter-item.inline = button_tag "Update #{type.to_s.humanize(capitalize: false)}", class: "btn update_selected_issues btn-save" - - - if !@labels.nil? - .row-content-block.second-block.filtered-labels{ class: ("hidden" if !@labels.any?) } - - if @labels.any? - = render "shared/labels_row", labels: @labels + - has_labels = @labels && @labels.any? + .row-content-block.second-block.filtered-labels{ class: ("hidden" unless has_labels) } + - if has_labels + = render 'shared/labels_row', labels: @labels :javascript new UsersSelect(); diff --git a/app/views/shared/issuable/_form.html.haml b/app/views/shared/issuable/_form.html.haml index a7944a60130..34c66a17303 100644 --- a/app/views/shared/issuable/_form.html.haml +++ b/app/views/shared/issuable/_form.html.haml @@ -95,7 +95,7 @@ .issuable-form-select-holder = render "shared/issuable/milestone_dropdown", selected: issuable.milestone, name: "#{issuable.class.model_name.param_key}[milestone_id]", show_any: false, show_menu_above: true, show_upcoming: false, extra_class: "js-issuable-form-dropdown js-dropdown-keep-input", dropdown_title: "Select milestone" .form-group - - has_labels = issuable.project.labels.any? + - has_labels = @labels && @labels.any? = f.label :label_ids, "Labels", class: "control-label #{"col-lg-4" if has_due_date}" = f.hidden_field :label_ids, multiple: true, value: '' .col-sm-10{ class: "#{"col-lg-8" if has_due_date} #{'issuable-form-padding-top' if !has_labels}" } diff --git a/spec/services/issues/create_service_spec.rb b/spec/services/issues/create_service_spec.rb index 1050502fa19..5c0331ebe66 100644 --- a/spec/services/issues/create_service_spec.rb +++ b/spec/services/issues/create_service_spec.rb @@ -67,6 +67,27 @@ describe Issues::CreateService, services: true do expect(Todo.where(attributes).count).to eq 1 end + context 'when label belongs to project group' do + let(:group) { create(:group) } + let(:group_labels) { create_pair(:group_label, group: group) } + + let(:opts) do + { + title: 'Title', + description: 'Description', + label_ids: group_labels.map(&:id) + } + end + + before do + project.update(group: group) + end + + it 'assigns group labels' do + expect(issue.labels).to match_array group_labels + end + end + context 'when label belongs to different project' do let(:label) { create(:label) } From bf9d928b45516e716b0f7f099361ca03aa1454f8 Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Mon, 19 Sep 2016 17:34:27 -0300 Subject: [PATCH 078/174] Allow user to create a board list based on a group label --- app/controllers/projects/issues_controller.rb | 5 ++++- app/services/boards/lists/create_service.rb | 6 +++++- spec/services/boards/lists/create_service_spec.rb | 4 ++++ spec/services/boards/lists/generate_service_spec.rb | 4 ++++ 4 files changed, 17 insertions(+), 2 deletions(-) diff --git a/app/controllers/projects/issues_controller.rb b/app/controllers/projects/issues_controller.rb index d85bc85092f..4f6d7ca80df 100644 --- a/app/controllers/projects/issues_controller.rb +++ b/app/controllers/projects/issues_controller.rb @@ -25,7 +25,10 @@ class Projects::IssuesController < Projects::ApplicationController def index @issues = issues_collection @issues = @issues.page(params[:page]) - @labels = LabelsFinder.new(current_user, project_id: @project.id, title: params[:label_name]).execute if params[:label_name].presence + + if params[:label_name].presence + @labels = LabelsFinder.new(current_user, project_id: @project.id, title: params[:label_name]).execute + end respond_to do |format| format.html diff --git a/app/services/boards/lists/create_service.rb b/app/services/boards/lists/create_service.rb index abc7aeece39..fe0d762ccd2 100644 --- a/app/services/boards/lists/create_service.rb +++ b/app/services/boards/lists/create_service.rb @@ -3,7 +3,7 @@ module Boards class CreateService < BaseService def execute(board) List.transaction do - label = project.labels.find(params[:label_id]) + label = available_labels.find(params[:label_id]) position = next_position(board) create_list(board, label, position) @@ -12,6 +12,10 @@ module Boards private + def available_labels + LabelsFinder.new(current_user, project_id: project.id).execute + end + def next_position(board) max_position = board.lists.movable.maximum(:position) max_position.nil? ? 0 : max_position.succ diff --git a/spec/services/boards/lists/create_service_spec.rb b/spec/services/boards/lists/create_service_spec.rb index e7806add916..a7e9efcf93f 100644 --- a/spec/services/boards/lists/create_service_spec.rb +++ b/spec/services/boards/lists/create_service_spec.rb @@ -9,6 +9,10 @@ describe Boards::Lists::CreateService, services: true do subject(:service) { described_class.new(project, user, label_id: label.id) } + before do + project.team << [user, :developer] + end + context 'when board lists is empty' do it 'creates a new list at beginning of the list' do list = service.execute(board) diff --git a/spec/services/boards/lists/generate_service_spec.rb b/spec/services/boards/lists/generate_service_spec.rb index 8b2f5e81338..ed0337662af 100644 --- a/spec/services/boards/lists/generate_service_spec.rb +++ b/spec/services/boards/lists/generate_service_spec.rb @@ -8,6 +8,10 @@ describe Boards::Lists::GenerateService, services: true do subject(:service) { described_class.new(project, user) } + before do + project.team << [user, :developer] + end + context 'when board lists is empty' do it 'creates the default lists' do expect { service.execute(board) }.to change(board.lists, :count).by(2) From bdb7bf4b5188ffd68e54cbf671ba9ce1a4ffb1d1 Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Tue, 20 Sep 2016 00:09:57 -0300 Subject: [PATCH 079/174] List group labels on project labels page --- app/assets/stylesheets/pages/labels.scss | 10 +- app/controllers/groups/labels_controller.rb | 20 +++- .../projects/application_controller.rb | 4 + app/controllers/projects/issues_controller.rb | 4 +- app/controllers/projects/labels_controller.rb | 11 +- .../projects/merge_requests_controller.rb | 2 +- app/helpers/labels_helper.rb | 43 ++++++++ app/models/label.rb | 24 +++- app/views/groups/labels/_form.html.haml | 2 +- app/views/groups/labels/_label.html.haml | 2 +- app/views/projects/labels/_form.html.haml | 2 +- app/views/projects/labels/_label.html.haml | 23 ++-- app/views/projects/labels/destroy.js.haml | 2 +- app/views/projects/labels/edit.html.haml | 3 +- app/views/projects/labels/index.html.haml | 53 +++++---- app/views/projects/labels/new.html.haml | 3 +- app/views/shared/_label_row.html.haml | 3 +- .../labels/update_prioritization_spec.rb | 104 +++++++++++------- 18 files changed, 226 insertions(+), 89 deletions(-) diff --git a/app/assets/stylesheets/pages/labels.scss b/app/assets/stylesheets/pages/labels.scss index 9bac6d46355..cbd009ccd07 100644 --- a/app/assets/stylesheets/pages/labels.scss +++ b/app/assets/stylesheets/pages/labels.scss @@ -140,6 +140,10 @@ color: $gray-light; } + .label-type { + opacity: 0.3; + } + li:hover { .draggable-handler { display: inline-block; @@ -148,7 +152,11 @@ } } -.other-labels { +.group-labels + .project-labels { + margin-top: 30px; +} + +.group-labels, .project-labels { .remove-priority { display: none; } diff --git a/app/controllers/groups/labels_controller.rb b/app/controllers/groups/labels_controller.rb index 449298f51a8..0ec2fcda0ef 100644 --- a/app/controllers/groups/labels_controller.rb +++ b/app/controllers/groups/labels_controller.rb @@ -3,6 +3,7 @@ class Groups::LabelsController < Groups::ApplicationController before_action :label, only: [:edit, :update, :destroy, :toggle_subscription] before_action :authorize_admin_labels!, only: [:new, :create, :edit, :update, :destroy] + before_action :save_previous_label_path, only: [:edit] respond_to :html @@ -25,11 +26,12 @@ class Groups::LabelsController < Groups::ApplicationController end def edit + @previous_labels_path = previous_labels_path end def update if @label.update_attributes(label_params) - redirect_to group_labels_path(@group) + redirect_back_or_group_labels_path else render :edit end @@ -64,4 +66,20 @@ class Groups::LabelsController < Groups::ApplicationController def label_params params.require(:label).permit(:title, :description, :color) end + + def redirect_back_or_group_labels_path(options = {}) + redirect_to previous_labels_path, options + end + + def previous_labels_path + session.fetch(:previous_labels_path, fallback_path) + end + + def fallback_path + group_labels_path(@group) + end + + def save_previous_label_path + session[:previous_labels_path] = URI(request.referer || '').path + end end diff --git a/app/controllers/projects/application_controller.rb b/app/controllers/projects/application_controller.rb index b2ff36f6538..5daf4311cc8 100644 --- a/app/controllers/projects/application_controller.rb +++ b/app/controllers/projects/application_controller.rb @@ -44,6 +44,10 @@ class Projects::ApplicationController < ApplicationController @project end + def project_labels + @project_labels ||= LabelsFinder.new(current_user, project_id: @project.id).execute + end + def repository @repository ||= project.repository end diff --git a/app/controllers/projects/issues_controller.rb b/app/controllers/projects/issues_controller.rb index 4f6d7ca80df..1558426e1a4 100644 --- a/app/controllers/projects/issues_controller.rb +++ b/app/controllers/projects/issues_controller.rb @@ -48,13 +48,13 @@ class Projects::IssuesController < Projects::ApplicationController ) @issue = @noteable = @project.issues.new(issue_params) - @labels = LabelsFinder.new(current_user, project_id: @project.id).execute + @labels = project_labels respond_with(@issue) end def edit - @labels = LabelsFinder.new(current_user, project_id: @project.id).execute + @labels = project_labels respond_with(@issue) end diff --git a/app/controllers/projects/labels_controller.rb b/app/controllers/projects/labels_controller.rb index 35224f965bf..3db3c091da6 100644 --- a/app/controllers/projects/labels_controller.rb +++ b/app/controllers/projects/labels_controller.rb @@ -11,13 +11,15 @@ class Projects::LabelsController < Projects::ApplicationController respond_to :js, :html def index + @project_labels = project_labels + @prioritized_labels = project_labels.prioritized + @group_labels = @project.group.labels.unprioritized if @project.group.present? @labels = @project.labels.unprioritized.page(params[:page]) - @prioritized_labels = @project.labels.prioritized respond_to do |format| format.html format.json do - render json: LabelsFinder.new(current_user, project_id: @project.id).execute + render json: @project_labels end end end @@ -68,6 +70,7 @@ class Projects::LabelsController < Projects::ApplicationController def destroy @label.destroy + @project_labels = project_labels respond_to do |format| format.html do @@ -80,6 +83,8 @@ class Projects::LabelsController < Projects::ApplicationController def remove_priority respond_to do |format| + label = project_labels.find(params[:id]) + if label.update_attribute(:priority, nil) format.json { render json: label } else @@ -92,7 +97,7 @@ class Projects::LabelsController < Projects::ApplicationController def set_priorities Label.transaction do params[:label_ids].each_with_index do |label_id, index| - label = @project.labels.find_by_id(label_id) + label = project_labels.find_by_id(label_id) label.update_attribute(:priority, index) if label end end diff --git a/app/controllers/projects/merge_requests_controller.rb b/app/controllers/projects/merge_requests_controller.rb index c8970155497..291c3f64914 100644 --- a/app/controllers/projects/merge_requests_controller.rb +++ b/app/controllers/projects/merge_requests_controller.rb @@ -263,7 +263,7 @@ class Projects::MergeRequestsController < Projects::ApplicationController @source_project = @merge_request.source_project @target_project = @merge_request.target_project @target_branches = @merge_request.target_project.repository.branch_names - @labels = LabelsFinder.new(current_user, project_id: @project.id).execute + @labels = project_labels end def update diff --git a/app/helpers/labels_helper.rb b/app/helpers/labels_helper.rb index 540eb6dd493..3f0e502fbc9 100644 --- a/app/helpers/labels_helper.rb +++ b/app/helpers/labels_helper.rb @@ -68,6 +68,49 @@ module LabelsHelper end end + def can_admin_label(label) + subject = + case label + when GroupLabel then label.group + else label.project + end + + can?(current_user, :admin_label, subject) + end + + def edit_label_path(label) + case label + when GroupLabel then edit_group_label_path(label.group, label) + else edit_namespace_project_label_path(label.project.namespace, label.project, label) + end + end + + def destroy_label_path(label) + case label + when GroupLabel then group_label_path(label.group, label) + else namespace_project_label_path(label.project.namespace, label.project, label) + end + end + + def label_type_icon(label, options = {}) + title, icon = + case label + when GroupLabel then ['Group', 'folder-open'] + else ['Project', 'bookmark'] + end + + options[:class] ||= '' + options[:class] << ' has-tooltip js-label-type' + + content_tag :span, + class: options[:class], + data: { 'placement' => 'top' }, + title: title, + aria: { label: title } do + icon(icon, base: true) + end + end + def project_label_names @project.labels.pluck(:title) end diff --git a/app/models/label.rb b/app/models/label.rb index 295c5bfaf70..f43bebbf71b 100644 --- a/app/models/label.rb +++ b/app/models/label.rb @@ -101,16 +101,16 @@ class Label < ActiveRecord::Base end end - def open_issues_count(user = nil) - issues.visible_to_user(user).opened.count + def open_issues_count(user = nil, project = nil) + issues_count(user, project_id: project.try(:id) || project_id, state: 'opened') end - def closed_issues_count(user = nil) - issues.visible_to_user(user).closed.count + def closed_issues_count(user = nil, project = nil) + issues_count(user, project_id: project.try(:id) || project_id, state: 'closed') end - def open_merge_requests_count - merge_requests.opened.count + def open_merge_requests_count(user = nil, project = nil) + merge_requests_count(user, project_id: project.try(:id) || project_id, state: 'opened') end def template? @@ -127,6 +127,18 @@ class Label < ActiveRecord::Base private + def issues_count(user, params = {}) + IssuesFinder.new(user, { label_name: title, scope: 'all' }.merge(params)) + .execute + .count + end + + def merge_requests_count(user, params = {}) + MergeRequestsFinder.new(user, { label_name: title, scope: 'all' }.merge(params)) + .execute + .count + end + def project_label? type.blank? && !template? end diff --git a/app/views/groups/labels/_form.html.haml b/app/views/groups/labels/_form.html.haml index 008b5fb9ba1..a0b44b0dcfb 100644 --- a/app/views/groups/labels/_form.html.haml +++ b/app/views/groups/labels/_form.html.haml @@ -30,4 +30,4 @@ = f.submit 'Save changes', class: 'btn btn-save js-save-button' - else = f.submit 'Create Label', class: 'btn btn-create js-save-button' - = link_to "Cancel", group_labels_path(@group), class: 'btn btn-cancel' + = link_to 'Cancel', @previous_labels_path, class: 'btn btn-cancel' diff --git a/app/views/groups/labels/_label.html.haml b/app/views/groups/labels/_label.html.haml index b9aab76f057..9faf90c303e 100644 --- a/app/views/groups/labels/_label.html.haml +++ b/app/views/groups/labels/_label.html.haml @@ -1,6 +1,6 @@ - label_css_id = dom_id(label) - open_issues_count = label.open_issues_count(current_user) -- open_merge_requests_count = label.open_merge_requests_count +- open_merge_requests_count = label.open_merge_requests_count(current_user) %li{id: label_css_id, data: { id: label.id } } = render 'label_row', label: label diff --git a/app/views/projects/labels/_form.html.haml b/app/views/projects/labels/_form.html.haml index 6ab6ae50389..5f7be074f25 100644 --- a/app/views/projects/labels/_form.html.haml +++ b/app/views/projects/labels/_form.html.haml @@ -30,4 +30,4 @@ = f.submit 'Save changes', class: 'btn btn-save js-save-button' - else = f.submit 'Create Label', class: 'btn btn-create js-save-button' - = link_to "Cancel", namespace_project_labels_path(@project.namespace, @project), class: 'btn btn-cancel' + = link_to 'Cancel', namespace_project_labels_path(@project.namespace, @project), class: 'btn btn-cancel' diff --git a/app/views/projects/labels/_label.html.haml b/app/views/projects/labels/_label.html.haml index 71f7f354d72..2b7b79390f7 100644 --- a/app/views/projects/labels/_label.html.haml +++ b/app/views/projects/labels/_label.html.haml @@ -1,4 +1,7 @@ - label_css_id = dom_id(label) +- open_issues_count = label.open_issues_count(current_user, @project) +- open_merge_requests_count = label.open_merge_requests_count(current_user, @project) + %li{id: label_css_id, data: { id: label.id } } = render "shared/label_row", label: label @@ -10,25 +13,25 @@ %ul %li = link_to_label(label, type: :merge_request) do - = pluralize label.open_merge_requests_count, 'merge request' + = pluralize open_merge_requests_count, 'merge request' %li = link_to_label(label) do - = pluralize label.open_issues_count(current_user), 'open issue' + = pluralize open_issues_count, 'open issue' - if current_user %li.label-subscription{ data: { url: toggle_subscription_namespace_project_label_path(@project.namespace, @project, label) } } %a.js-subscribe-button.label-subscribe-button.subscription-status{ role: "button", href: "#", data: { toggle: "tooltip", status: label_subscription_status(label) } } %span= label_subscription_toggle_button_text(label) - - if can? current_user, :admin_label, @project + - if can_admin_label(label) %li - = link_to "Edit", edit_namespace_project_label_path(@project.namespace, @project, label) + = link_to 'Edit', edit_label_path(label) %li - = link_to "Delete", namespace_project_label_path(@project.namespace, @project, label), title: "Delete", method: :delete, remote: true, data: {confirm: "Remove this label? Are you sure?"} + = link_to 'Delete', destroy_label_path(label), title: 'Delete', method: :delete, remote: true, data: {confirm: 'Remove this label? Are you sure?'} .pull-right.hidden-xs.hidden-sm.hidden-md = link_to_label(label, type: :merge_request, css_class: 'btn btn-transparent btn-action') do - = pluralize label.open_merge_requests_count, 'merge request' + = pluralize open_merge_requests_count, 'merge request' = link_to_label(label, css_class: 'btn btn-transparent btn-action') do - = pluralize label.open_issues_count(current_user), 'open issue' + = pluralize open_issues_count, 'open issue' - if current_user .label-subscription.inline{ data: { url: toggle_subscription_namespace_project_label_path(@project.namespace, @project, label) } } @@ -37,11 +40,11 @@ = icon('eye', class: 'label-subscribe-button-icon') = icon('spinner spin', class: 'label-subscribe-button-loading') - - if can? current_user, :admin_label, @project - = link_to edit_namespace_project_label_path(@project.namespace, @project, label), title: "Edit", class: 'btn btn-transparent btn-action', data: {toggle: "tooltip"} do + - if can_admin_label(label) + = link_to edit_label_path(label), title: "Edit", class: 'btn btn-transparent btn-action', data: {toggle: "tooltip"} do %span.sr-only Edit = icon('pencil-square-o') - = link_to namespace_project_label_path(@project.namespace, @project, label), title: "Delete", class: 'btn btn-transparent btn-action remove-row', method: :delete, remote: true, data: {confirm: "Remove this label? Are you sure?", toggle: "tooltip"} do + = link_to destroy_label_path(label), title: "Delete", class: 'btn btn-transparent btn-action remove-row', method: :delete, remote: true, data: {confirm: "Remove this label? Are you sure?", toggle: "tooltip"} do %span.sr-only Delete = icon('trash-o') diff --git a/app/views/projects/labels/destroy.js.haml b/app/views/projects/labels/destroy.js.haml index d59563b122a..0b9937c4808 100644 --- a/app/views/projects/labels/destroy.js.haml +++ b/app/views/projects/labels/destroy.js.haml @@ -1,2 +1,2 @@ -- if @project.labels.size == 0 +- if @project_labels.none? $('.labels').load(document.URL + ' .nothing-here-block').hide().fadeIn(1000) diff --git a/app/views/projects/labels/edit.html.haml b/app/views/projects/labels/edit.html.haml index 52b187e7e58..c9ec371c3e1 100644 --- a/app/views/projects/labels/edit.html.haml +++ b/app/views/projects/labels/edit.html.haml @@ -4,6 +4,7 @@ %div{ class: container_class } %h3.page-title - Edit Label + = icon('bookmark') + Edit Project Label %hr = render 'form' diff --git a/app/views/projects/labels/index.html.haml b/app/views/projects/labels/index.html.haml index db66a0edbd8..286b58f57c2 100644 --- a/app/views/projects/labels/index.html.haml +++ b/app/views/projects/labels/index.html.haml @@ -14,25 +14,38 @@ New label .labels - - if can?(current_user, :admin_label, @project) + - unless @project_labels.empty? -# Only show it in the first page - - hide = @project.labels.empty? || (params[:page].present? && params[:page] != '1') - .prioritized-labels{ class: ('hide' if hide) } - %h5 Prioritized Labels - %ul.content-list.manage-labels-list.js-prioritized-labels{ "data-url" => set_priorities_namespace_project_labels_path(@project.namespace, @project) } - %p.empty-message{ class: ('hidden' unless @prioritized_labels.empty?) } No prioritized labels yet - - if @prioritized_labels.present? - = render @prioritized_labels - .other-labels + - hide = params[:page].present? && params[:page] != '1' - if can?(current_user, :admin_label, @project) - %h5{ class: ('hide' if hide) } Other Labels - - if @labels.present? - %ul.content-list.manage-labels-list.js-other-labels - = render @labels - = paginate @labels, theme: 'gitlab' - - else - .nothing-here-block - - if can?(current_user, :admin_label, @project) - Create a label or #{link_to 'generate a default set of labels', generate_namespace_project_labels_path(@project.namespace, @project), method: :post}. - - else - No labels created + .prioritized-labels{ class: ('hide' if hide) } + %h5 Prioritized Labels + %ul.content-list.manage-labels-list.js-prioritized-labels{ "data-url" => set_priorities_namespace_project_labels_path(@project.namespace, @project) } + %p.empty-message{ class: ('hidden' unless @prioritized_labels.empty?) } No prioritized labels yet + - if @prioritized_labels.present? + = render partial: 'label', collection: @prioritized_labels, as: :label + + .group-labels{ class: ('hide' if hide || @project.group.blank?) } + %h5 + = icon('folder-open') + Group Labels + %ul.content-list.manage-labels-list.js-group-labels + %p.empty-message{ class: ('hidden' unless @group_labels.empty?) } No group labels + - if @group_labels.present? + = render partial: 'label', collection: @group_labels, as: :label + + .project-labels + %h5{ class: ('hide' if hide) } + = icon('bookmark') + Project Labels + %ul.content-list.manage-labels-list.js-project-labels + %p.empty-message{ class: ('hidden' unless @labels.empty?) } No project labels + - if @labels.present? + = render @labels + = paginate @labels, theme: 'gitlab' + - else + .nothing-here-block + - if can?(current_user, :admin_label, @project) + Create a label or #{link_to 'generate a default set of labels', generate_namespace_project_labels_path(@project.namespace, @project), method: :post}. + - else + No labels created yet. diff --git a/app/views/projects/labels/new.html.haml b/app/views/projects/labels/new.html.haml index a1bb66cfb6c..a1e2df6c55d 100644 --- a/app/views/projects/labels/new.html.haml +++ b/app/views/projects/labels/new.html.haml @@ -4,6 +4,7 @@ %div{ class: container_class } %h3.page-title - New Label + = icon('bookmark') + New Project Label %hr = render 'form' diff --git a/app/views/shared/_label_row.html.haml b/app/views/shared/_label_row.html.haml index 6f593e8dff9..751b2d1c158 100644 --- a/app/views/shared/_label_row.html.haml +++ b/app/views/shared/_label_row.html.haml @@ -3,13 +3,14 @@ .draggable-handler = icon('bars') .js-toggle-priority.toggle-priority{ data: { url: remove_priority_namespace_project_label_path(@project.namespace, @project, label), - dom_id: dom_id(label) } } + dom_id: dom_id(label), type: label.type } } %button.add-priority.btn.has-tooltip{ title: 'Prioritize', :'data-placement' => 'top' } = icon('star-o') %button.remove-priority.btn.has-tooltip{ title: 'Remove priority', :'data-placement' => 'top' } = icon('star') %span.label-name = link_to_label(label, tooltip: false) + = label_type_icon(label, class: "#{'hidden' if label.priority.blank?}" ) - if label.description %span.label-description = markdown_field(label, :description) diff --git a/spec/features/projects/labels/update_prioritization_spec.rb b/spec/features/projects/labels/update_prioritization_spec.rb index cb7495da8eb..21896f0a787 100644 --- a/spec/features/projects/labels/update_prioritization_spec.rb +++ b/spec/features/projects/labels/update_prioritization_spec.rb @@ -3,23 +3,61 @@ require 'spec_helper' feature 'Prioritize labels', feature: true do include WaitForAjax - context 'when project belongs to user' do - let(:user) { create(:user) } - let(:project) { create(:project, name: 'test', namespace: user.namespace) } + let(:user) { create(:user) } + let(:group) { create(:group) } + let(:project) { create(:empty_project, :public, namespace: group) } + let!(:bug) { create(:label, project: project, title: 'bug') } + let!(:wontfix) { create(:label, project: project, title: 'wontfix') } + let!(:feature) { create(:group_label, group: group, title: 'feature') } - scenario 'user can prioritize a label', js: true do - bug = create(:label, title: 'bug') - wontfix = create(:label, title: 'wontfix') - - project.labels << bug - project.labels << wontfix + context 'when user belongs to project team' do + before do + project.team << [user, :developer] login_as user + end + + scenario 'user can prioritize a group label', js: true do visit namespace_project_labels_path(project.namespace, project) expect(page).to have_content('No prioritized labels yet') - page.within('.other-labels') do + page.within('.group-labels') do + first('.js-toggle-priority').click + wait_for_ajax + expect(page).not_to have_content('feature') + end + + page.within('.prioritized-labels') do + expect(page).not_to have_content('No prioritized labels yet') + expect(page).to have_content('feature') + end + end + + scenario 'user can unprioritize a group label', js: true do + feature.update(priority: 1) + + visit namespace_project_labels_path(project.namespace, project) + + page.within('.prioritized-labels') do + expect(page).to have_content('feature') + + first('.js-toggle-priority').click + wait_for_ajax + expect(page).not_to have_content('bug') + end + + page.within('.group-labels') do + expect(page).to have_content('feature') + end + end + + scenario 'user can prioritize a project label', js: true do + visit namespace_project_labels_path(project.namespace, project) + + expect(page).to have_content('No prioritized labels yet') + + page.within('.project-labels') do first('.js-toggle-priority').click wait_for_ajax expect(page).not_to have_content('bug') @@ -31,48 +69,40 @@ feature 'Prioritize labels', feature: true do end end - scenario 'user can unprioritize a label', js: true do - bug = create(:label, title: 'bug', priority: 1) - wontfix = create(:label, title: 'wontfix') + scenario 'user can unprioritize a project label', js: true do + bug.update(priority: 1) - project.labels << bug - project.labels << wontfix - - login_as user visit namespace_project_labels_path(project.namespace, project) - expect(page).to have_content('bug') - page.within('.prioritized-labels') do + expect(page).to have_content('bug') + first('.js-toggle-priority').click wait_for_ajax expect(page).not_to have_content('bug') end - page.within('.other-labels') do + page.within('.project-labels') do expect(page).to have_content('bug') expect(page).to have_content('wontfix') end end scenario 'user can sort prioritized labels and persist across reloads', js: true do - bug = create(:label, title: 'bug', priority: 1) - wontfix = create(:label, title: 'wontfix', priority: 2) + bug.update(priority: 1) + feature.update(priority: 2) - project.labels << bug - project.labels << wontfix - - login_as user visit namespace_project_labels_path(project.namespace, project) expect(page).to have_content 'bug' + expect(page).to have_content 'feature' expect(page).to have_content 'wontfix' # Sort labels - find("#label_#{bug.id}").drag_to find("#label_#{wontfix.id}") + find("#project_label_#{bug.id}").drag_to find("#group_label_#{feature.id}") page.within('.prioritized-labels') do - expect(first('li')).to have_content('wontfix') + expect(first('li')).to have_content('feature') expect(page.all('li').last).to have_content('bug') end @@ -80,7 +110,7 @@ feature 'Prioritize labels', feature: true do wait_for_ajax page.within('.prioritized-labels') do - expect(first('li')).to have_content('wontfix') + expect(first('li')).to have_content('feature') expect(page.all('li').last).to have_content('bug') end end @@ -88,28 +118,26 @@ feature 'Prioritize labels', feature: true do context 'as a guest' do it 'does not prioritize labels' do - user = create(:user) guest = create(:user) - project = create(:project, name: 'test', namespace: user.namespace) - - create(:label, title: 'bug') login_as guest + visit namespace_project_labels_path(project.namespace, project) + expect(page).to have_content 'bug' + expect(page).to have_content 'wontfix' + expect(page).to have_content 'feature' expect(page).not_to have_css('.prioritized-labels') end end context 'as a non signed in user' do it 'does not prioritize labels' do - user = create(:user) - project = create(:project, name: 'test', namespace: user.namespace) - - create(:label, title: 'bug') - visit namespace_project_labels_path(project.namespace, project) + expect(page).to have_content 'bug' + expect(page).to have_content 'wontfix' + expect(page).to have_content 'feature' expect(page).not_to have_css('.prioritized-labels') end end From 9463551ece6c12574559a4768943ab90db7f617b Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Tue, 20 Sep 2016 00:17:04 -0300 Subject: [PATCH 080/174] Validates uniqueness of title unless label is a template --- app/models/label.rb | 6 ++---- spec/models/label_spec.rb | 1 + 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/app/models/label.rb b/app/models/label.rb index f43bebbf71b..be0c20479d5 100644 --- a/app/models/label.rb +++ b/app/models/label.rb @@ -26,10 +26,8 @@ class Label < ActiveRecord::Base validates :project, presence: true, if: :project_label? # Don't allow ',' for label titles - validates :title, - presence: true, - format: { with: /\A[^,]+\z/ }, - uniqueness: { scope: :project_id } + validates :title, presence: true, format: { with: /\A[^,]+\z/ } + validates :title, uniqueness: true, unless: :template? before_save :nullify_priority diff --git a/spec/models/label_spec.rb b/spec/models/label_spec.rb index 5a5d1a5d60c..894021dc8e6 100644 --- a/spec/models/label_spec.rb +++ b/spec/models/label_spec.rb @@ -19,6 +19,7 @@ describe Label, models: true do describe 'validation' do it { is_expected.to validate_presence_of(:project) } + it { is_expected.to validate_uniqueness_of(:title) } it 'validates color code' do expect(label).not_to allow_value('G-ITLAB').for(:color) From 7f2e29ff3da54c4525dc55b4447fea2963e17fd3 Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Tue, 20 Sep 2016 00:18:50 -0300 Subject: [PATCH 081/174] Remove unused method LabelsHelper#project_label_names --- app/helpers/labels_helper.rb | 4 ---- 1 file changed, 4 deletions(-) diff --git a/app/helpers/labels_helper.rb b/app/helpers/labels_helper.rb index 3f0e502fbc9..9df8d37af9e 100644 --- a/app/helpers/labels_helper.rb +++ b/app/helpers/labels_helper.rb @@ -111,10 +111,6 @@ module LabelsHelper end end - def project_label_names - @project.labels.pluck(:title) - end - def render_colored_label(label, label_suffix = '', tooltip: true) label_color = label.color || Label::DEFAULT_COLOR text_color = text_color_for_bg(label_color) From 476c26deb22a6e958dc3251e9771560b058a34a3 Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Tue, 20 Sep 2016 00:59:26 -0300 Subject: [PATCH 082/174] Replace label references with links for group labels --- lib/banzai/filter/label_reference_filter.rb | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/lib/banzai/filter/label_reference_filter.rb b/lib/banzai/filter/label_reference_filter.rb index 8f262ef3d8d..3a09912f1be 100644 --- a/lib/banzai/filter/label_reference_filter.rb +++ b/lib/banzai/filter/label_reference_filter.rb @@ -9,7 +9,7 @@ module Banzai end def find_object(project, id) - project.labels.find(id) + find_labels(project).find(id) end def self.references_in(text, pattern = Label.reference_pattern) @@ -35,7 +35,17 @@ module Banzai return unless project label_params = label_params(label_id, label_name) - project.labels.find_by(label_params) + find_labels(project).find_by(label_params) + end + + def find_labels(project) + label_ids = [] + label_ids << project.group.labels.select(:id) if project.group.present? + label_ids << project.labels.select(:id) + + union = Gitlab::SQL::Union.new(label_ids) + + object_class.where("labels.id IN (#{union.to_sql})") end # Parameters to pass to `Label.find_by` based on the given arguments @@ -60,7 +70,7 @@ module Banzai end def object_link_text(object, matches) - if context[:project] == object.project + if object.project.nil? || object.project == context[:project] LabelsHelper.render_colored_label(object) else LabelsHelper.render_colored_cross_project_label(object) From cf14482a5aceb62c178c19cc70e9354dc23dd9e1 Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Tue, 20 Sep 2016 01:08:04 -0300 Subject: [PATCH 083/174] LabelsFinder inherits from UnionFinder --- app/finders/labels_finder.rb | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/app/finders/labels_finder.rb b/app/finders/labels_finder.rb index cf7018cf8a2..a27ff56309b 100644 --- a/app/finders/labels_finder.rb +++ b/app/finders/labels_finder.rb @@ -1,11 +1,11 @@ -class LabelsFinder +class LabelsFinder < UnionFinder def initialize(current_user, params = {}) @current_user = current_user @params = params end def execute - items = init_collection + items = find_union(label_ids, Label) items = with_title(items) sort(items) end @@ -14,15 +14,10 @@ class LabelsFinder attr_reader :current_user, :params - def init_collection + def label_ids label_ids = [] label_ids << Label.where(group_id: projects.where.not(group: nil).select(:namespace_id)).select(:id) - label_ids << Label.where(project_id: projects).select(:id) - - union = Gitlab::SQL::Union.new(label_ids) - - Label.where("labels.id IN (#{union.to_sql})") - .reorder(title: :asc) + label_ids << Label.where(project_id: projects.select(:id)).select(:id) end def with_title(items) From baf47a0bd0e0563cbc99b3ae4b1336b8b3b4380a Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Tue, 20 Sep 2016 11:03:41 -0300 Subject: [PATCH 084/174] Remove project_labels from Projects::ApplicationController --- app/controllers/concerns/issuable_actions.rb | 5 ++ .../projects/application_controller.rb | 4 - app/controllers/projects/issues_controller.rb | 6 +- app/controllers/projects/labels_controller.rb | 28 ++++--- .../projects/merge_requests_controller.rb | 1 - app/views/projects/labels/destroy.js.haml | 2 +- app/views/projects/labels/index.html.haml | 10 +-- .../projects/labels_controller_spec.rb | 80 ++++++++++++++----- 8 files changed, 88 insertions(+), 48 deletions(-) diff --git a/app/controllers/concerns/issuable_actions.rb b/app/controllers/concerns/issuable_actions.rb index bb32bc502e6..27f1e91d865 100644 --- a/app/controllers/concerns/issuable_actions.rb +++ b/app/controllers/concerns/issuable_actions.rb @@ -2,6 +2,7 @@ module IssuableActions extend ActiveSupport::Concern included do + before_action :labels, only: [:new, :edit] before_action :authorize_destroy_issuable!, only: :destroy before_action :authorize_admin_issuable!, only: :bulk_update end @@ -25,6 +26,10 @@ module IssuableActions private + def labels + @labels ||= LabelsFinder.new(current_user, project_id: @project.id).execute + end + def authorize_destroy_issuable! unless can?(current_user, :"destroy_#{issuable.to_ability_name}", issuable) return access_denied! diff --git a/app/controllers/projects/application_controller.rb b/app/controllers/projects/application_controller.rb index 5daf4311cc8..b2ff36f6538 100644 --- a/app/controllers/projects/application_controller.rb +++ b/app/controllers/projects/application_controller.rb @@ -44,10 +44,6 @@ class Projects::ApplicationController < ApplicationController @project end - def project_labels - @project_labels ||= LabelsFinder.new(current_user, project_id: @project.id).execute - end - def repository @repository ||= project.repository end diff --git a/app/controllers/projects/issues_controller.rb b/app/controllers/projects/issues_controller.rb index 1558426e1a4..9f18c8c03df 100644 --- a/app/controllers/projects/issues_controller.rb +++ b/app/controllers/projects/issues_controller.rb @@ -47,15 +47,11 @@ class Projects::IssuesController < Projects::ApplicationController assignee_id: "" ) - @issue = @noteable = @project.issues.new(issue_params) - @labels = project_labels - + @issue = @noteable = @project.issues.new(issue_params) respond_with(@issue) end def edit - @labels = project_labels - respond_with(@issue) end diff --git a/app/controllers/projects/labels_controller.rb b/app/controllers/projects/labels_controller.rb index 3db3c091da6..33c3b7f79c2 100644 --- a/app/controllers/projects/labels_controller.rb +++ b/app/controllers/projects/labels_controller.rb @@ -3,23 +3,23 @@ class Projects::LabelsController < Projects::ApplicationController before_action :module_enabled before_action :label, only: [:edit, :update, :destroy] + before_action :labels, only: [:index] before_action :authorize_read_label! - before_action :authorize_admin_labels!, only: [ - :new, :create, :edit, :update, :generate, :destroy, :remove_priority, :set_priorities - ] + before_action :authorize_admin_labels!, only: [:new, :create, :edit, :update, + :generate, :destroy, :remove_priority, + :set_priorities] respond_to :js, :html def index - @project_labels = project_labels - @prioritized_labels = project_labels.prioritized + @prioritized_labels = @labels.prioritized @group_labels = @project.group.labels.unprioritized if @project.group.present? - @labels = @project.labels.unprioritized.page(params[:page]) + @project_labels = @project.labels.unprioritized.page(params[:page]) respond_to do |format| format.html format.json do - render json: @project_labels + render json: @labels end end end @@ -38,7 +38,7 @@ class Projects::LabelsController < Projects::ApplicationController end else respond_to do |format| - format.html { render 'new' } + format.html { render :new } format.json { render json: { message: @label.errors.messages }, status: 400 } end end @@ -51,7 +51,7 @@ class Projects::LabelsController < Projects::ApplicationController if @label.update_attributes(label_params) redirect_to namespace_project_labels_path(@project.namespace, @project) else - render 'edit' + render :edit end end @@ -70,7 +70,7 @@ class Projects::LabelsController < Projects::ApplicationController def destroy @label.destroy - @project_labels = project_labels + @labels = labels respond_to do |format| format.html do @@ -83,7 +83,7 @@ class Projects::LabelsController < Projects::ApplicationController def remove_priority respond_to do |format| - label = project_labels.find(params[:id]) + label = labels.find(params[:id]) if label.update_attribute(:priority, nil) format.json { render json: label } @@ -97,7 +97,7 @@ class Projects::LabelsController < Projects::ApplicationController def set_priorities Label.transaction do params[:label_ids].each_with_index do |label_id, index| - label = project_labels.find_by_id(label_id) + label = labels.find_by_id(label_id) label.update_attribute(:priority, index) if label end end @@ -124,6 +124,10 @@ class Projects::LabelsController < Projects::ApplicationController end alias_method :subscribable_resource, :label + def labels + @labels ||= LabelsFinder.new(current_user, project_id: @project.id).execute + end + def authorize_admin_labels! return render_404 unless can?(current_user, :admin_label, @project) end diff --git a/app/controllers/projects/merge_requests_controller.rb b/app/controllers/projects/merge_requests_controller.rb index 291c3f64914..9171b47cda1 100644 --- a/app/controllers/projects/merge_requests_controller.rb +++ b/app/controllers/projects/merge_requests_controller.rb @@ -263,7 +263,6 @@ class Projects::MergeRequestsController < Projects::ApplicationController @source_project = @merge_request.source_project @target_project = @merge_request.target_project @target_branches = @merge_request.target_project.repository.branch_names - @labels = project_labels end def update diff --git a/app/views/projects/labels/destroy.js.haml b/app/views/projects/labels/destroy.js.haml index 0b9937c4808..8d09e2bda11 100644 --- a/app/views/projects/labels/destroy.js.haml +++ b/app/views/projects/labels/destroy.js.haml @@ -1,2 +1,2 @@ -- if @project_labels.none? +- if @labels.empty? $('.labels').load(document.URL + ' .nothing-here-block').hide().fadeIn(1000) diff --git a/app/views/projects/labels/index.html.haml b/app/views/projects/labels/index.html.haml index 286b58f57c2..05282338493 100644 --- a/app/views/projects/labels/index.html.haml +++ b/app/views/projects/labels/index.html.haml @@ -14,7 +14,7 @@ New label .labels - - unless @project_labels.empty? + - unless @labels.empty? -# Only show it in the first page - hide = params[:page].present? && params[:page] != '1' - if can?(current_user, :admin_label, @project) @@ -39,10 +39,10 @@ = icon('bookmark') Project Labels %ul.content-list.manage-labels-list.js-project-labels - %p.empty-message{ class: ('hidden' unless @labels.empty?) } No project labels - - if @labels.present? - = render @labels - = paginate @labels, theme: 'gitlab' + %p.empty-message{ class: ('hidden' unless @project_labels.empty?) } No project labels + - if @project_labels.present? + = render @project_labels + = paginate @project_labels, theme: 'gitlab' - else .nothing-here-block - if can?(current_user, :admin_label, @project) diff --git a/spec/controllers/projects/labels_controller_spec.rb b/spec/controllers/projects/labels_controller_spec.rb index 3492b6ffbbb..2b39f9cf0d1 100644 --- a/spec/controllers/projects/labels_controller_spec.rb +++ b/spec/controllers/projects/labels_controller_spec.rb @@ -1,52 +1,92 @@ require 'spec_helper' describe Projects::LabelsController do - let(:project) { create(:project) } + let(:group) { create(:group) } + let(:project) { create(:project, namespace: group) } let(:user) { create(:user) } before do project.team << [user, :master] + sign_in(user) end describe 'GET #index' do - def create_label(attributes) - create(:label, attributes.merge(project: project)) - end + let!(:label_1) { create(:label, project: project, priority: 1, title: 'Label 1') } + let!(:label_2) { create(:label, project: project, priority: 3, title: 'Label 2') } + let!(:label_3) { create(:label, project: project, priority: 1, title: 'Label 3') } + let!(:label_4) { create(:label, project: project, priority: nil, title: 'Label 4') } + let!(:label_5) { create(:label, project: project, priority: nil, title: 'Label 5') } - before do - 15.times { |i| create_label(priority: (i % 3) + 1, title: "label #{15 - i}") } - 5.times { |i| create_label(title: "label #{100 - i}") } - - get :index, namespace_id: project.namespace.to_param, project_id: project.to_param - end + let!(:group_label_1) { create(:group_label, group: group, priority: 3, title: 'Group Label 1') } + let!(:group_label_2) { create(:group_label, group: group, priority: 1, title: 'Group Label 2') } + let!(:group_label_3) { create(:group_label, group: group, priority: nil, title: 'Group Label 3') } + let!(:group_label_4) { create(:group_label, group: group, priority: nil, title: 'Group Label 4') } context '@prioritized_labels' do - let(:prioritized_labels) { assigns(:prioritized_labels) } + before do + list_labels + end it 'contains only prioritized labels' do - expect(prioritized_labels).to all(have_attributes(priority: a_value > 0)) + expect(assigns(:prioritized_labels)).to all(have_attributes(priority: a_value > 0)) end it 'is sorted by priority, then label title' do - priorities_and_titles = prioritized_labels.pluck(:priority, :title) - - expect(priorities_and_titles.sort).to eq(priorities_and_titles) + expect(assigns(:prioritized_labels)).to match_array [group_label_2, label_1, label_3, group_label_1, label_2] end end - context '@labels' do - let(:labels) { assigns(:labels) } + context '@group_labels' do + it 'contains only group labels' do + list_labels + + expect(assigns(:group_labels)).to all(have_attributes(group_id: a_value > 0)) + end it 'contains only unprioritized labels' do - expect(labels).to all(have_attributes(priority: nil)) + list_labels + + expect(assigns(:group_labels)).to all(have_attributes(priority: nil)) end it 'is sorted by label title' do - titles = labels.pluck(:title) + list_labels - expect(titles.sort).to eq(titles) + expect(assigns(:group_labels)).to match_array [group_label_3, group_label_4] end + + it 'is nil when project does not belong to a group' do + project.update(namespace: create(:namespace)) + + list_labels + + expect(assigns(:group_labels)).to be_nil + end + end + + context '@project_labels' do + before do + list_labels + end + + it 'contains only project labels' do + list_labels + + expect(assigns(:project_labels)).to all(have_attributes(project_id: a_value > 0)) + end + + it 'contains only unprioritized labels' do + expect(assigns(:project_labels)).to all(have_attributes(priority: nil)) + end + + it 'is sorted by label title' do + expect(assigns(:project_labels)).to match_array [label_4, label_5] + end + end + + def list_labels + get :index, namespace_id: project.namespace.to_param, project_id: project.to_param end end end From b10e5764ac0765b556d64dfebb9dad948154e31a Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Tue, 20 Sep 2016 11:55:31 -0300 Subject: [PATCH 085/174] List only labels that belongs to the group on the group issues page --- .../dashboard/labels_controller.rb | 7 +------ app/controllers/groups/labels_controller.rb | 10 +++++++++- app/finders/labels_finder.rb | 19 ++++++++++--------- app/helpers/labels_helper.rb | 3 +++ 4 files changed, 23 insertions(+), 16 deletions(-) diff --git a/app/controllers/dashboard/labels_controller.rb b/app/controllers/dashboard/labels_controller.rb index 797f8503b2d..05f7bc37952 100644 --- a/app/controllers/dashboard/labels_controller.rb +++ b/app/controllers/dashboard/labels_controller.rb @@ -1,12 +1,7 @@ class Dashboard::LabelsController < Dashboard::ApplicationController def index - labels = LabelsFinder.new(current_user, project_id: projects) - .execute - .select(:id, :title, :color) - .uniq(:title) - respond_to do |format| - format.json { render json: labels } + format.json { render json: LabelsFinder.new(current_user).execute } end end end diff --git a/app/controllers/groups/labels_controller.rb b/app/controllers/groups/labels_controller.rb index 0ec2fcda0ef..0ebdee55c79 100644 --- a/app/controllers/groups/labels_controller.rb +++ b/app/controllers/groups/labels_controller.rb @@ -8,7 +8,15 @@ class Groups::LabelsController < Groups::ApplicationController respond_to :html def index - @labels = @group.labels.page(params[:page]) + respond_to do |format| + format.html do + @labels = @group.labels.page(params[:page]) + end + + format.json do + render json: LabelsFinder.new(current_user, group_id: @group.id).execute + end + end end def new diff --git a/app/finders/labels_finder.rb b/app/finders/labels_finder.rb index a27ff56309b..85ef9bea08d 100644 --- a/app/finders/labels_finder.rb +++ b/app/finders/labels_finder.rb @@ -20,13 +20,17 @@ class LabelsFinder < UnionFinder label_ids << Label.where(project_id: projects.select(:id)).select(:id) end + def sort(items) + items.reorder(title: :asc, type: :desc) + end + def with_title(items) items = items.where(title: title) if title.present? items end - def sort(items) - items.reorder(title: :asc) + def group_id + params[:group_id].presence end def project_id @@ -40,13 +44,10 @@ class LabelsFinder < UnionFinder def projects return @projects if defined?(@projects) - if project_id - @projects = ProjectsFinder.new.execute(current_user) - .where(id: project_id) - .reorder(nil) - else - @projects = Project.none - end + @projects = ProjectsFinder.new.execute(current_user) + @projects = @projects.joins(:namespace).where(namespaces: { id: group_id, type: 'Group' }) if group_id + @projects = @projects.where(id: project_id) if project_id + @projects = @projects.reorder(nil) @projects end diff --git a/app/helpers/labels_helper.rb b/app/helpers/labels_helper.rb index 9df8d37af9e..8e5321c05fa 100644 --- a/app/helpers/labels_helper.rb +++ b/app/helpers/labels_helper.rb @@ -172,7 +172,10 @@ module LabelsHelper end def labels_filter_path + return group_labels_path(@group, :json) if @group + project = @target_project || @project + if project namespace_project_labels_path(project.namespace, project, :json) else From 1c73d302e2ce5a27aba7171af741b3590d48aba9 Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Tue, 20 Sep 2016 12:00:18 -0300 Subject: [PATCH 086/174] Avoid an extra a query per label when setting label priority --- app/controllers/projects/labels_controller.rb | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/controllers/projects/labels_controller.rb b/app/controllers/projects/labels_controller.rb index 33c3b7f79c2..919c6f239cb 100644 --- a/app/controllers/projects/labels_controller.rb +++ b/app/controllers/projects/labels_controller.rb @@ -97,8 +97,9 @@ class Projects::LabelsController < Projects::ApplicationController def set_priorities Label.transaction do params[:label_ids].each_with_index do |label_id, index| - label = labels.find_by_id(label_id) - label.update_attribute(:priority, index) if label + next unless labels.where(id: label_id).any? + + Label.where(id: label_id).update_all(priority: index) end end From 2910896b53f107558904e228340009bb9fccca4e Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Tue, 20 Sep 2016 13:54:29 -0300 Subject: [PATCH 087/174] Remove duplication between global and the regular label partials --- app/helpers/labels_helper.rb | 54 +++++++++---------- app/views/groups/labels/_label.html.haml | 53 ------------------ app/views/groups/labels/_label_row.html.haml | 6 --- app/views/groups/labels/index.html.haml | 2 +- app/views/projects/issues/_issue.html.haml | 2 +- app/views/projects/labels/index.html.haml | 6 +-- .../merge_requests/_merge_request.html.haml | 2 +- .../labels => shared}/_label.html.haml | 4 +- app/views/shared/_label_row.html.haml | 3 +- 9 files changed, 34 insertions(+), 98 deletions(-) delete mode 100644 app/views/groups/labels/_label.html.haml delete mode 100644 app/views/groups/labels/_label_row.html.haml rename app/views/{projects/labels => shared}/_label.html.haml (95%) diff --git a/app/helpers/labels_helper.rb b/app/helpers/labels_helper.rb index 8e5321c05fa..65fc460c670 100644 --- a/app/helpers/labels_helper.rb +++ b/app/helpers/labels_helper.rb @@ -4,9 +4,8 @@ module LabelsHelper # Link to a Label # # label - Label object to link to - # project - Project object which will be used as the context for the label's - # link. If omitted, defaults to `@project`, or the label's own - # project. + # subject - Project/Group object which will be used as the context for the + # label's link. If omitted, defaults to the label's own group/project. # type - The type of item the link will point to (:issue or # :merge_request). If omitted, defaults to :issue. # block - An optional block that will be passed to `link_to`, forming the @@ -18,12 +17,11 @@ module LabelsHelper # # Allow the generated link to use the label's own project # link_to_label(label) # - # # Force the generated link to use @project - # @project = Project.first - # link_to_label(label) + # # Force the generated link to use a provided group + # link_to_label(label, subject: Group.last) # # # Force the generated link to use a provided project - # link_to_label(label, project: Project.last) + # link_to_label(label, subject: Project.last) # # # Force the generated link to point to merge requests instead of issues # link_to_label(label, type: :merge_request) @@ -32,9 +30,8 @@ module LabelsHelper # link_to_label(label) { "My Custom Label Text" } # # Returns a String - def link_to_label(label, project: nil, type: :issue, tooltip: true, css_class: nil, &block) - project ||= @project || label.project - link = label_filter_path(project, label, type: type) + def link_to_label(label, subject: nil, type: :issue, tooltip: true, css_class: nil, &block) + link = label_filter_path(label, type: type) if block_given? link_to link, class: css_class, &block @@ -43,27 +40,16 @@ module LabelsHelper end end - def link_to_group_label(label, group: nil, type: :issue, tooltip: true, css_class: nil, &block) - group ||= @group || label.group - link = label_filter_path(group, label, type: type) - - if block_given? - link_to link, class: css_class, &block - else - link_to render_colored_label(label, tooltip: tooltip), link, class: css_class - end - end - - def label_filter_path(subject, label, type: issue) - case subject - when Project - send("namespace_project_#{type.to_s.pluralize}_path", - subject.namespace, - subject, - label_name: [label.name]) - when Group + def label_filter_path(label, type: issue) + case label + when GroupLabel send("#{type.to_s.pluralize}_group_path", - subject, + label.group, + label_name: [label.name]) + else + send("namespace_project_#{type.to_s.pluralize}_path", + label.project.namespace, + label.project, label_name: [label.name]) end end @@ -92,6 +78,13 @@ module LabelsHelper end end + def toggle_subscription_label_path(label) + case label + when GroupLabel then toggle_subscription_group_label_path(label.group, label) + else toggle_subscription_namespace_project_label_path(label.project.namespace, label.project, label) + end + end + def label_type_icon(label, options = {}) title, icon = case label @@ -101,6 +94,7 @@ module LabelsHelper options[:class] ||= '' options[:class] << ' has-tooltip js-label-type' + options[:class] << ' hidden' if options.fetch(:hidden, false) content_tag :span, class: options[:class], diff --git a/app/views/groups/labels/_label.html.haml b/app/views/groups/labels/_label.html.haml deleted file mode 100644 index 9faf90c303e..00000000000 --- a/app/views/groups/labels/_label.html.haml +++ /dev/null @@ -1,53 +0,0 @@ -- label_css_id = dom_id(label) -- open_issues_count = label.open_issues_count(current_user) -- open_merge_requests_count = label.open_merge_requests_count(current_user) - -%li{id: label_css_id, data: { id: label.id } } - = render 'label_row', label: label - - .visible-xs.visible-sm-inline-block.visible-md-inline-block.dropdown - %button.btn.btn-default.label-options-toggle{ data: { toggle: 'dropdown' } } - Options - %span.caret - .dropdown-menu.dropdown-menu-align-right - %ul - %li - = link_to_group_label(label, type: :merge_request) do - = pluralize open_merge_requests_count, 'merge request' - %li - = link_to_group_label(label) do - = pluralize open_issues_count, 'open issue' - - if current_user - %li.label-subscription{ data: { url: toggle_subscription_group_label_path(@group, label) } } - %a.js-subscribe-button.label-subscribe-button.subscription-status{ role: "button", href: "#", data: { toggle: "tooltip", status: label_subscription_status(label) } } - %span= label_subscription_toggle_button_text(label) - - if can? current_user, :admin_label, @group - %li - = link_to 'Edit', edit_group_label_path(@group, label) - %li - = link_to 'Delete', group_label_path(@group, label), title: 'Delete', method: :delete, remote: true, data: {confirm: "Remove this label? Are you sure?"} - - .pull-right.hidden-xs.hidden-sm.hidden-md - = link_to_group_label(label, type: :merge_request, css_class: 'btn btn-transparent btn-action') do - = pluralize open_merge_requests_count, 'merge request' - = link_to_group_label(label, css_class: 'btn btn-transparent btn-action') do - = pluralize open_issues_count, 'open issue' - - - if current_user - .label-subscription.inline{ data: { url: toggle_subscription_group_label_path(@group, label) } } - %button.js-subscribe-button.label-subscribe-button.btn.btn-transparent.btn-action.subscription-status{ type: "button", title: label_subscription_toggle_button_text(label), data: { toggle: "tooltip", status: label_subscription_status(label) } } - %span.sr-only= label_subscription_toggle_button_text(label) - = icon('eye', class: 'label-subscribe-button-icon') - = icon('spinner spin', class: 'label-subscribe-button-loading') - - - if can? current_user, :admin_label, @group - = link_to edit_group_label_path(@group, label), title: 'Edit', class: 'btn btn-transparent btn-action', data: {toggle: 'tooltip'} do - %span.sr-only Edit - = icon('pencil-square-o') - = link_to group_label_path(@group, label), title: 'Delete', class: 'btn btn-transparent btn-action remove-row', method: :delete, remote: true, data: {confirm: 'Remove this label? Are you sure?', toggle: 'tooltip'} do - %span.sr-only Delete - = icon('trash-o') - - - if current_user - :javascript - new Subscription('##{dom_id(label)} .label-subscription'); diff --git a/app/views/groups/labels/_label_row.html.haml b/app/views/groups/labels/_label_row.html.haml deleted file mode 100644 index e21fac25b01..00000000000 --- a/app/views/groups/labels/_label_row.html.haml +++ /dev/null @@ -1,6 +0,0 @@ -%span.label-row - %span.label-name - = link_to_group_label(label, tooltip: false) - - if label.description - %span.label-description - = markdown(label.description, pipeline: :single_line) diff --git a/app/views/groups/labels/index.html.haml b/app/views/groups/labels/index.html.haml index d9f1d350cb3..8e93ea4f625 100644 --- a/app/views/groups/labels/index.html.haml +++ b/app/views/groups/labels/index.html.haml @@ -17,7 +17,7 @@ Group Labels - if @labels.present? %ul.content-list.manage-labels-list.js-group-labels - = render partial: 'label', collection: @labels, as: :label + = render partial: 'shared/label', collection: @labels, as: :label = paginate @labels, theme: 'gitlab' - else .nothing-here-block diff --git a/app/views/projects/issues/_issue.html.haml b/app/views/projects/issues/_issue.html.haml index 8b1a8a8a2d9..c80210d6ff4 100644 --- a/app/views/projects/issues/_issue.html.haml +++ b/app/views/projects/issues/_issue.html.haml @@ -50,7 +50,7 @@ - if issue.labels.any?   - issue.labels.each do |label| - = link_to_label(label, project: issue.project) + = link_to_label(label, subject: issue.project) - if issue.tasks?   %span.task-status diff --git a/app/views/projects/labels/index.html.haml b/app/views/projects/labels/index.html.haml index 05282338493..8e6f84fc430 100644 --- a/app/views/projects/labels/index.html.haml +++ b/app/views/projects/labels/index.html.haml @@ -23,7 +23,7 @@ %ul.content-list.manage-labels-list.js-prioritized-labels{ "data-url" => set_priorities_namespace_project_labels_path(@project.namespace, @project) } %p.empty-message{ class: ('hidden' unless @prioritized_labels.empty?) } No prioritized labels yet - if @prioritized_labels.present? - = render partial: 'label', collection: @prioritized_labels, as: :label + = render partial: 'shared/label', collection: @prioritized_labels, as: :label .group-labels{ class: ('hide' if hide || @project.group.blank?) } %h5 @@ -32,7 +32,7 @@ %ul.content-list.manage-labels-list.js-group-labels %p.empty-message{ class: ('hidden' unless @group_labels.empty?) } No group labels - if @group_labels.present? - = render partial: 'label', collection: @group_labels, as: :label + = render partial: 'shared/label', collection: @group_labels, as: :label .project-labels %h5{ class: ('hide' if hide) } @@ -41,7 +41,7 @@ %ul.content-list.manage-labels-list.js-project-labels %p.empty-message{ class: ('hidden' unless @project_labels.empty?) } No project labels - if @project_labels.present? - = render @project_labels + = render partial: 'shared/label', collection: @project_labels, as: :label = paginate @project_labels, theme: 'gitlab' - else .nothing-here-block diff --git a/app/views/projects/merge_requests/_merge_request.html.haml b/app/views/projects/merge_requests/_merge_request.html.haml index 68fb7d5a414..ad62bf50b57 100644 --- a/app/views/projects/merge_requests/_merge_request.html.haml +++ b/app/views/projects/merge_requests/_merge_request.html.haml @@ -62,7 +62,7 @@ - if merge_request.labels.any?   - merge_request.labels.each do |label| - = link_to_label(label, project: merge_request.project, type: 'merge_request') + = link_to_label(label, subject: merge_request.project, type: 'merge_request') - if merge_request.tasks?   %span.task-status diff --git a/app/views/projects/labels/_label.html.haml b/app/views/shared/_label.html.haml similarity index 95% rename from app/views/projects/labels/_label.html.haml rename to app/views/shared/_label.html.haml index 2b7b79390f7..13795807ab8 100644 --- a/app/views/projects/labels/_label.html.haml +++ b/app/views/shared/_label.html.haml @@ -18,7 +18,7 @@ = link_to_label(label) do = pluralize open_issues_count, 'open issue' - if current_user - %li.label-subscription{ data: { url: toggle_subscription_namespace_project_label_path(@project.namespace, @project, label) } } + %li.label-subscription{ data: { url: toggle_subscription_label_path(label) } } %a.js-subscribe-button.label-subscribe-button.subscription-status{ role: "button", href: "#", data: { toggle: "tooltip", status: label_subscription_status(label) } } %span= label_subscription_toggle_button_text(label) - if can_admin_label(label) @@ -34,7 +34,7 @@ = pluralize open_issues_count, 'open issue' - if current_user - .label-subscription.inline{ data: { url: toggle_subscription_namespace_project_label_path(@project.namespace, @project, label) } } + .label-subscription.inline{ data: { url: toggle_subscription_label_path(label) } } %button.js-subscribe-button.label-subscribe-button.btn.btn-transparent.btn-action.subscription-status{ type: "button", title: label_subscription_toggle_button_text(label), data: { toggle: "tooltip", status: label_subscription_status(label) } } %span.sr-only= label_subscription_toggle_button_text(label) = icon('eye', class: 'label-subscribe-button-icon') diff --git a/app/views/shared/_label_row.html.haml b/app/views/shared/_label_row.html.haml index 751b2d1c158..8a1ebdd7fb6 100644 --- a/app/views/shared/_label_row.html.haml +++ b/app/views/shared/_label_row.html.haml @@ -10,7 +10,8 @@ = icon('star') %span.label-name = link_to_label(label, tooltip: false) - = label_type_icon(label, class: "#{'hidden' if label.priority.blank?}" ) + - if can?(current_user, :admin_label, @project) + = label_type_icon(label, hidden: label.priority.blank?) - if label.description %span.label-description = markdown_field(label, :description) From 701544fb48a5add0cc7cbba729e6438d7a040385 Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Tue, 20 Sep 2016 15:19:57 -0300 Subject: [PATCH 088/174] Hides project/group labels section if there are none --- app/views/projects/labels/index.html.haml | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/app/views/projects/labels/index.html.haml b/app/views/projects/labels/index.html.haml index 8e6f84fc430..99f8e8095ad 100644 --- a/app/views/projects/labels/index.html.haml +++ b/app/views/projects/labels/index.html.haml @@ -18,28 +18,26 @@ -# Only show it in the first page - hide = params[:page].present? && params[:page] != '1' - if can?(current_user, :admin_label, @project) - .prioritized-labels{ class: ('hide' if hide) } + .prioritized-labels{ class: ('hidden' if hide) } %h5 Prioritized Labels %ul.content-list.manage-labels-list.js-prioritized-labels{ "data-url" => set_priorities_namespace_project_labels_path(@project.namespace, @project) } %p.empty-message{ class: ('hidden' unless @prioritized_labels.empty?) } No prioritized labels yet - if @prioritized_labels.present? = render partial: 'shared/label', collection: @prioritized_labels, as: :label - .group-labels{ class: ('hide' if hide || @project.group.blank?) } + .group-labels{ class: ('hidden' if hide || @project.group.blank? || @group_labels.empty?) } %h5 = icon('folder-open') Group Labels %ul.content-list.manage-labels-list.js-group-labels - %p.empty-message{ class: ('hidden' unless @group_labels.empty?) } No group labels - if @group_labels.present? = render partial: 'shared/label', collection: @group_labels, as: :label - .project-labels - %h5{ class: ('hide' if hide) } + .project-labels{ class: ('hidden' if @project_labels.empty?) } + %h5{ class: ('hidden' if hide) } = icon('bookmark') Project Labels %ul.content-list.manage-labels-list.js-project-labels - %p.empty-message{ class: ('hidden' unless @project_labels.empty?) } No project labels - if @project_labels.present? = render partial: 'shared/label', collection: @project_labels, as: :label = paginate @project_labels, theme: 'gitlab' From 32c663ff248f6ad2f2fa10fd2e81d6535fb88fd6 Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Tue, 20 Sep 2016 15:50:11 -0300 Subject: [PATCH 089/174] Use policies to handle with global/project label permissions --- app/helpers/labels_helper.rb | 10 ---------- app/policies/group_label_policy.rb | 5 +++++ app/policies/label_policy.rb | 7 +++++++ app/views/shared/_label.html.haml | 4 ++-- 4 files changed, 14 insertions(+), 12 deletions(-) create mode 100644 app/policies/group_label_policy.rb create mode 100644 app/policies/label_policy.rb diff --git a/app/helpers/labels_helper.rb b/app/helpers/labels_helper.rb index 65fc460c670..c14caa5e387 100644 --- a/app/helpers/labels_helper.rb +++ b/app/helpers/labels_helper.rb @@ -54,16 +54,6 @@ module LabelsHelper end end - def can_admin_label(label) - subject = - case label - when GroupLabel then label.group - else label.project - end - - can?(current_user, :admin_label, subject) - end - def edit_label_path(label) case label when GroupLabel then edit_group_label_path(label.group, label) diff --git a/app/policies/group_label_policy.rb b/app/policies/group_label_policy.rb new file mode 100644 index 00000000000..4d4052c5800 --- /dev/null +++ b/app/policies/group_label_policy.rb @@ -0,0 +1,5 @@ +class GroupLabelPolicy < BasePolicy + def rules + can! :admin_label if Ability.allowed?(@user, :admin_label, @subject.group) + end +end diff --git a/app/policies/label_policy.rb b/app/policies/label_policy.rb new file mode 100644 index 00000000000..1677ad7f1bb --- /dev/null +++ b/app/policies/label_policy.rb @@ -0,0 +1,7 @@ +class LabelPolicy < BasePolicy + def rules + return unless @user + + can! :admin_label if Ability.allowed?(@user, :admin_label, @subject.project) + end +end diff --git a/app/views/shared/_label.html.haml b/app/views/shared/_label.html.haml index 13795807ab8..c0b912b0584 100644 --- a/app/views/shared/_label.html.haml +++ b/app/views/shared/_label.html.haml @@ -21,7 +21,7 @@ %li.label-subscription{ data: { url: toggle_subscription_label_path(label) } } %a.js-subscribe-button.label-subscribe-button.subscription-status{ role: "button", href: "#", data: { toggle: "tooltip", status: label_subscription_status(label) } } %span= label_subscription_toggle_button_text(label) - - if can_admin_label(label) + - if can?(current_user, :admin_label, label) %li = link_to 'Edit', edit_label_path(label) %li @@ -40,7 +40,7 @@ = icon('eye', class: 'label-subscribe-button-icon') = icon('spinner spin', class: 'label-subscribe-button-loading') - - if can_admin_label(label) + - if can?(current_user, :admin_label, label) = link_to edit_label_path(label), title: "Edit", class: 'btn btn-transparent btn-action', data: {toggle: "tooltip"} do %span.sr-only Edit = icon('pencil-square-o') From e2dd75c0a2d863c8e530e54f3a0a015bdec1e84f Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Tue, 20 Sep 2016 16:09:31 -0300 Subject: [PATCH 090/174] Makes the query to retrieve group labels more simpler --- app/finders/labels_finder.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/finders/labels_finder.rb b/app/finders/labels_finder.rb index 85ef9bea08d..b8828bcdd32 100644 --- a/app/finders/labels_finder.rb +++ b/app/finders/labels_finder.rb @@ -16,7 +16,7 @@ class LabelsFinder < UnionFinder def label_ids label_ids = [] - label_ids << Label.where(group_id: projects.where.not(group: nil).select(:namespace_id)).select(:id) + label_ids << Label.where(group_id: projects.joins(:namespace).where(namespaces: { type: 'Group' }).select(:namespace_id)).select(:id) label_ids << Label.where(project_id: projects.select(:id)).select(:id) end From cfedd42badc6b84457d1de35cb31988777462d5a Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Tue, 20 Sep 2016 17:07:56 -0300 Subject: [PATCH 091/174] Add ProjectLabel model --- app/finders/issuable_finder.rb | 3 +- app/helpers/labels_helper.rb | 8 ++-- app/models/label.rb | 7 --- app/models/project.rb | 6 ++- app/models/project_label.rb | 5 ++ ...abel_policy.rb => project_label_policy.rb} | 4 +- app/views/projects/labels/_form.html.haml | 2 +- app/views/projects/labels/edit.html.haml | 2 +- app/views/projects/labels/new.html.haml | 2 +- ...191518_set_project_label_type_on_labels.rb | 17 +++++++ lib/banzai/filter/label_reference_filter.rb | 2 +- lib/gitlab/google_code_import/importer.rb | 2 +- spec/factories/labels.rb | 2 +- spec/models/label_spec.rb | 48 +++++++++---------- spec/models/project_label_spec.rb | 11 +++++ spec/models/project_spec.rb | 2 +- 16 files changed, 73 insertions(+), 50 deletions(-) create mode 100644 app/models/project_label.rb rename app/policies/{label_policy.rb => project_label_policy.rb} (64%) create mode 100644 db/migrate/20160920191518_set_project_label_type_on_labels.rb create mode 100644 spec/models/project_label_spec.rb diff --git a/app/finders/issuable_finder.rb b/app/finders/issuable_finder.rb index 37151f8d134..6f2adf47c3a 100644 --- a/app/finders/issuable_finder.rb +++ b/app/finders/issuable_finder.rb @@ -128,7 +128,8 @@ class IssuableFinder @labels = Label.where(title: label_names) if projects - @labels = @labels.where(project: projects) + label_ids = LabelsFinder.new(current_user, project_id: projects).execute.select(:id) + @labels = @labels.where(labels: { id: label_ids }) end else @labels = Label.none diff --git a/app/helpers/labels_helper.rb b/app/helpers/labels_helper.rb index c14caa5e387..844bd3fd183 100644 --- a/app/helpers/labels_helper.rb +++ b/app/helpers/labels_helper.rb @@ -57,21 +57,21 @@ module LabelsHelper def edit_label_path(label) case label when GroupLabel then edit_group_label_path(label.group, label) - else edit_namespace_project_label_path(label.project.namespace, label.project, label) + when ProjectLabel then edit_namespace_project_label_path(label.project.namespace, label.project, label) end end def destroy_label_path(label) case label when GroupLabel then group_label_path(label.group, label) - else namespace_project_label_path(label.project.namespace, label.project, label) + when ProjectLabel then namespace_project_label_path(label.project.namespace, label.project, label) end end def toggle_subscription_label_path(label) case label when GroupLabel then toggle_subscription_group_label_path(label.group, label) - else toggle_subscription_namespace_project_label_path(label.project.namespace, label.project, label) + when ProjectLabel then toggle_subscription_namespace_project_label_path(label.project.namespace, label.project, label) end end @@ -79,7 +79,7 @@ module LabelsHelper title, icon = case label when GroupLabel then ['Group', 'folder-open'] - else ['Project', 'bookmark'] + when ProjectLabel then ['Project', 'bookmark'] end options[:class] ||= '' diff --git a/app/models/label.rb b/app/models/label.rb index be0c20479d5..0a68be7a30f 100644 --- a/app/models/label.rb +++ b/app/models/label.rb @@ -15,15 +15,12 @@ class Label < ActiveRecord::Base default_value_for :color, DEFAULT_COLOR - belongs_to :project - has_many :lists, dependent: :destroy has_many :label_links, dependent: :destroy has_many :issues, through: :label_links, source: :target, source_type: 'Issue' has_many :merge_requests, through: :label_links, source: :target, source_type: 'MergeRequest' validates :color, color: true, allow_blank: false - validates :project, presence: true, if: :project_label? # Don't allow ',' for label titles validates :title, presence: true, format: { with: /\A[^,]+\z/ } @@ -137,10 +134,6 @@ class Label < ActiveRecord::Base .count end - def project_label? - type.blank? && !template? - end - def label_format_reference(format = :id) raise StandardError, 'Unknown format' unless [:id, :name].include?(format) diff --git a/app/models/project.rb b/app/models/project.rb index db7301219e5..41125223044 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -107,7 +107,7 @@ class Project < ActiveRecord::Base # Merge requests from source project should be kept when source project was removed has_many :fork_merge_requests, foreign_key: 'source_project_id', class_name: MergeRequest has_many :issues, dependent: :destroy - has_many :labels, dependent: :destroy + has_many :labels, dependent: :destroy, class_name: 'ProjectLabel' has_many :services, dependent: :destroy has_many :events, dependent: :destroy has_many :milestones, dependent: :destroy @@ -730,8 +730,10 @@ class Project < ActiveRecord::Base def create_labels Label.templates.each do |label| label = label.dup - label.template = nil + label.template = false label.project_id = self.id + label.type = 'ProjectLabel' + label.save end end diff --git a/app/models/project_label.rb b/app/models/project_label.rb new file mode 100644 index 00000000000..3e41113e340 --- /dev/null +++ b/app/models/project_label.rb @@ -0,0 +1,5 @@ +class ProjectLabel < Label + belongs_to :project + + validates :project, presence: true +end diff --git a/app/policies/label_policy.rb b/app/policies/project_label_policy.rb similarity index 64% rename from app/policies/label_policy.rb rename to app/policies/project_label_policy.rb index 1677ad7f1bb..e7bd58372a6 100644 --- a/app/policies/label_policy.rb +++ b/app/policies/project_label_policy.rb @@ -1,7 +1,5 @@ -class LabelPolicy < BasePolicy +class ProjectLabelPolicy < BasePolicy def rules - return unless @user - can! :admin_label if Ability.allowed?(@user, :admin_label, @subject.project) end end diff --git a/app/views/projects/labels/_form.html.haml b/app/views/projects/labels/_form.html.haml index 5f7be074f25..28a062c7eb5 100644 --- a/app/views/projects/labels/_form.html.haml +++ b/app/views/projects/labels/_form.html.haml @@ -1,4 +1,4 @@ -= form_for [@project.namespace.becomes(Namespace), @project, @label], html: { class: 'form-horizontal label-form js-quick-submit js-requires-input' } do |f| += form_for @label, as: :label, url: url, html: { class: 'form-horizontal label-form js-quick-submit js-requires-input' } do |f| = form_errors(@label) .form-group diff --git a/app/views/projects/labels/edit.html.haml b/app/views/projects/labels/edit.html.haml index c9ec371c3e1..372abcb8773 100644 --- a/app/views/projects/labels/edit.html.haml +++ b/app/views/projects/labels/edit.html.haml @@ -7,4 +7,4 @@ = icon('bookmark') Edit Project Label %hr - = render 'form' + = render 'form', url: namespace_project_label_path(@project.namespace.becomes(Namespace), @project, @label) diff --git a/app/views/projects/labels/new.html.haml b/app/views/projects/labels/new.html.haml index a1e2df6c55d..f170c41bfc4 100644 --- a/app/views/projects/labels/new.html.haml +++ b/app/views/projects/labels/new.html.haml @@ -7,4 +7,4 @@ = icon('bookmark') New Project Label %hr - = render 'form' + = render 'form', url: namespace_project_labels_path(@project.namespace.becomes(Namespace), @project) diff --git a/db/migrate/20160920191518_set_project_label_type_on_labels.rb b/db/migrate/20160920191518_set_project_label_type_on_labels.rb new file mode 100644 index 00000000000..af47d0320e2 --- /dev/null +++ b/db/migrate/20160920191518_set_project_label_type_on_labels.rb @@ -0,0 +1,17 @@ +class SetProjectLabelTypeOnLabels < ActiveRecord::Migration + include Gitlab::Database::MigrationHelpers + + DOWNTIME = false + + def up + update_column_in_batches(:labels, :type, 'ProjectLabel') do |table, query| + query.where(table[:project_id].not_eq(nil)) + end + end + + def down + update_column_in_batches(:labels, :type, nil) do |table, query| + query.where(table[:project_id].not_eq(nil)) + end + end +end diff --git a/lib/banzai/filter/label_reference_filter.rb b/lib/banzai/filter/label_reference_filter.rb index 3a09912f1be..4c4784b0052 100644 --- a/lib/banzai/filter/label_reference_filter.rb +++ b/lib/banzai/filter/label_reference_filter.rb @@ -70,7 +70,7 @@ module Banzai end def object_link_text(object, matches) - if object.project.nil? || object.project == context[:project] + if object.is_a?(GroupLabel) || object.project == context[:project] LabelsHelper.render_colored_label(object) else LabelsHelper.render_colored_cross_project_label(object) diff --git a/lib/gitlab/google_code_import/importer.rb b/lib/gitlab/google_code_import/importer.rb index 62da327931f..ef8c3e35619 100644 --- a/lib/gitlab/google_code_import/importer.rb +++ b/lib/gitlab/google_code_import/importer.rb @@ -237,7 +237,7 @@ module Gitlab def create_label(name) color = nice_label_color(name) - Label.create!(project_id: project.id, name: name, color: color) + project.labels.create!(name: name, color: color) end def format_content(raw_content) diff --git a/spec/factories/labels.rb b/spec/factories/labels.rb index eb489099854..ec4c56457ea 100644 --- a/spec/factories/labels.rb +++ b/spec/factories/labels.rb @@ -1,5 +1,5 @@ FactoryGirl.define do - factory :label do + factory :label, class: ProjectLabel do sequence(:title) { |n| "label#{n}" } color "#990000" project diff --git a/spec/models/label_spec.rb b/spec/models/label_spec.rb index 894021dc8e6..1f1fe45d5a7 100644 --- a/spec/models/label_spec.rb +++ b/spec/models/label_spec.rb @@ -1,47 +1,41 @@ require 'spec_helper' describe Label, models: true do - let(:label) { create(:label) } + describe 'modules' do + it { is_expected.to include_module(Referable) } + it { is_expected.to include_module(Subscribable) } + end describe 'associations' do - it { is_expected.to belong_to(:project) } - - it { is_expected.to have_many(:label_links).dependent(:destroy) } it { is_expected.to have_many(:issues).through(:label_links).source(:target) } + it { is_expected.to have_many(:label_links).dependent(:destroy) } it { is_expected.to have_many(:lists).dependent(:destroy) } end - describe 'modules' do - subject { described_class } - - it { is_expected.to include_module(Referable) } - end - describe 'validation' do - it { is_expected.to validate_presence_of(:project) } it { is_expected.to validate_uniqueness_of(:title) } it 'validates color code' do - expect(label).not_to allow_value('G-ITLAB').for(:color) - expect(label).not_to allow_value('AABBCC').for(:color) - expect(label).not_to allow_value('#AABBCCEE').for(:color) - expect(label).not_to allow_value('GGHHII').for(:color) - expect(label).not_to allow_value('#').for(:color) - expect(label).not_to allow_value('').for(:color) + is_expected.not_to allow_value('G-ITLAB').for(:color) + is_expected.not_to allow_value('AABBCC').for(:color) + is_expected.not_to allow_value('#AABBCCEE').for(:color) + is_expected.not_to allow_value('GGHHII').for(:color) + is_expected.not_to allow_value('#').for(:color) + is_expected.not_to allow_value('').for(:color) - expect(label).to allow_value('#AABBCC').for(:color) - expect(label).to allow_value('#abcdef').for(:color) + is_expected.to allow_value('#AABBCC').for(:color) + is_expected.to allow_value('#abcdef').for(:color) end it 'validates title' do - expect(label).not_to allow_value('G,ITLAB').for(:title) - expect(label).not_to allow_value('').for(:title) + is_expected.not_to allow_value('G,ITLAB').for(:title) + is_expected.not_to allow_value('').for(:title) - expect(label).to allow_value('GITLAB').for(:title) - expect(label).to allow_value('gitlab').for(:title) - expect(label).to allow_value('G?ITLAB').for(:title) - expect(label).to allow_value('G&ITLAB').for(:title) - expect(label).to allow_value("customer's request").for(:title) + is_expected.to allow_value('GITLAB').for(:title) + is_expected.to allow_value('gitlab').for(:title) + is_expected.to allow_value('G?ITLAB').for(:title) + is_expected.to allow_value('G&ITLAB').for(:title) + is_expected.to allow_value("customer's request").for(:title) end end @@ -53,6 +47,8 @@ describe Label, models: true do end describe '#to_reference' do + let(:label) { create(:label) } + context 'using id' do it 'returns a String reference to the object' do expect(label.to_reference).to eq "~#{label.id}" diff --git a/spec/models/project_label_spec.rb b/spec/models/project_label_spec.rb new file mode 100644 index 00000000000..93062b9d402 --- /dev/null +++ b/spec/models/project_label_spec.rb @@ -0,0 +1,11 @@ +require 'spec_helper' + +describe ProjectLabel, models: true do + describe 'relationships' do + it { is_expected.to belong_to(:project) } + end + + describe 'validations' do + it { is_expected.to validate_presence_of(:project) } + end +end diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb index 67dbcc362f6..e6d98e25d0b 100644 --- a/spec/models/project_spec.rb +++ b/spec/models/project_spec.rb @@ -56,7 +56,7 @@ describe Project, models: true do it { is_expected.to have_many(:runners) } it { is_expected.to have_many(:variables) } it { is_expected.to have_many(:triggers) } - it { is_expected.to have_many(:labels).dependent(:destroy) } + it { is_expected.to have_many(:labels).class_name('ProjectLabel').dependent(:destroy) } it { is_expected.to have_many(:users_star_projects).dependent(:destroy) } it { is_expected.to have_many(:environments).dependent(:destroy) } it { is_expected.to have_many(:deployments).dependent(:destroy) } From e28058c4107ce454a84b3e3b5750f936dace7db1 Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Wed, 21 Sep 2016 17:47:58 -0300 Subject: [PATCH 092/174] Validate if project label title does not exist at group level --- app/models/label.rb | 5 +++-- app/models/project_label.rb | 14 +++++++++++++ config/locales/en.yml | 1 + spec/factories/labels.rb | 6 ++++++ spec/models/label_spec.rb | 2 +- spec/models/project_label_spec.rb | 34 +++++++++++++++++++++++++++++++ 6 files changed, 59 insertions(+), 3 deletions(-) diff --git a/app/models/label.rb b/app/models/label.rb index 0a68be7a30f..f844a3d3378 100644 --- a/app/models/label.rb +++ b/app/models/label.rb @@ -24,13 +24,14 @@ class Label < ActiveRecord::Base # Don't allow ',' for label titles validates :title, presence: true, format: { with: /\A[^,]+\z/ } - validates :title, uniqueness: true, unless: :template? + validates :title, uniqueness: { scope: [:group_id, :project_id] } before_save :nullify_priority default_scope { order(title: :asc) } - scope :templates, -> { where(template: true) } + scope :templates, -> { where(template: true) } + scope :with_title, ->(title) { where(title: title) } def self.prioritized where.not(priority: nil).reorder(:priority, :title) diff --git a/app/models/project_label.rb b/app/models/project_label.rb index 3e41113e340..1171aa2dbb3 100644 --- a/app/models/project_label.rb +++ b/app/models/project_label.rb @@ -2,4 +2,18 @@ class ProjectLabel < Label belongs_to :project validates :project, presence: true + + validate :title_must_not_exist_at_group_level + + delegate :group, to: :project, allow_nil: true + + private + + def title_must_not_exist_at_group_level + return unless group.present? + + if group.labels.with_title(self.title).exists? + errors.add(:title, :label_already_exists_at_group_level, group: group.name) + end + end end diff --git a/config/locales/en.yml b/config/locales/en.yml index cedb5e207bd..12a59be79f0 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -5,6 +5,7 @@ en: hello: "Hello world" errors: messages: + label_already_exists_at_group_level: "already exists at group level for %{group}. Please choose another one." wrong_size: "is the wrong size (should be %{file_size})" size_too_small: "is too small (should be at least %{file_size})" size_too_big: "is too big (should be at most %{file_size})" diff --git a/spec/factories/labels.rb b/spec/factories/labels.rb index ec4c56457ea..5c789d72bac 100644 --- a/spec/factories/labels.rb +++ b/spec/factories/labels.rb @@ -4,4 +4,10 @@ FactoryGirl.define do color "#990000" project end + + factory :group_label, class: GroupLabel do + sequence(:title) { |n| "label#{n}" } + color "#990000" + group + end end diff --git a/spec/models/label_spec.rb b/spec/models/label_spec.rb index 1f1fe45d5a7..ab640e216cf 100644 --- a/spec/models/label_spec.rb +++ b/spec/models/label_spec.rb @@ -13,7 +13,7 @@ describe Label, models: true do end describe 'validation' do - it { is_expected.to validate_uniqueness_of(:title) } + it { is_expected.to validate_uniqueness_of(:title).scoped_to([:group_id, :project_id]) } it 'validates color code' do is_expected.not_to allow_value('G-ITLAB').for(:color) diff --git a/spec/models/project_label_spec.rb b/spec/models/project_label_spec.rb index 93062b9d402..355bb2a938c 100644 --- a/spec/models/project_label_spec.rb +++ b/spec/models/project_label_spec.rb @@ -7,5 +7,39 @@ describe ProjectLabel, models: true do describe 'validations' do it { is_expected.to validate_presence_of(:project) } + + context 'validates if title must not exist at group level' do + let(:group) { create(:group, name: 'gitlab-org') } + let(:project) { create(:empty_project, group: group) } + + before do + create(:group_label, group: group, title: 'Bug') + end + + it 'returns error if title already exists at group level' do + label = described_class.new(project: project, title: 'Bug') + + label.valid? + + expect(label.errors[:title]).to include 'already exists at group level for gitlab-org. Please choose another one.' + end + + it 'does not returns error if title does not exist at group level' do + label = described_class.new(project: project, title: 'Security') + + label.valid? + + expect(label.errors[:title]).to be_empty + end + + it 'does not returns error if project does not belong to group' do + another_project = create(:empty_project) + label = described_class.new(project: another_project, title: 'Bug') + + label.valid? + + expect(label.errors[:title]).to be_empty + end + end end end From 8522ef44bf4298a750d352ff17832b3f4fc6756d Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Mon, 26 Sep 2016 17:10:54 -0300 Subject: [PATCH 093/174] Recreates missing group labels when moving project to another group --- app/services/labels/transfer_service.rb | 52 +++++++++++++++++++ app/services/projects/transfer_service.rb | 4 ++ spec/factories/merge_requests.rb | 10 ++++ spec/services/labels/transfer_service_spec.rb | 41 +++++++++++++++ .../projects/transfer_service_spec.rb | 10 ++++ 5 files changed, 117 insertions(+) create mode 100644 app/services/labels/transfer_service.rb create mode 100644 spec/services/labels/transfer_service_spec.rb diff --git a/app/services/labels/transfer_service.rb b/app/services/labels/transfer_service.rb new file mode 100644 index 00000000000..81897c62c0f --- /dev/null +++ b/app/services/labels/transfer_service.rb @@ -0,0 +1,52 @@ +# Labels::TransferService class +# +# User for recreate the missing group labels at project level +# +module Labels + class TransferService + def initialize(current_user, group, project) + @current_user = current_user + @group = group + @project = project + end + + def execute + return unless group.present? + + Label.transaction do + labels_to_transfer = Label.where(id: label_links.select(:label_id).uniq) + + labels_to_transfer.find_each do |label| + new_label_id = find_or_create_label!(label) + + LabelLink.where(label_id: label.id).update_all(label_id: new_label_id) + end + end + end + + private + + attr_reader :current_user, :group, :project + + def label_links + label_link_ids = [] + label_link_ids << LabelLink.where(target: project.issues, label: group.labels).select(:id) + label_link_ids << LabelLink.where(target: project.merge_requests, label: group.labels).select(:id) + + union = Gitlab::SQL::Union.new(label_link_ids) + + LabelLink.where("label_links.id IN (#{union.to_sql})") + end + + def labels + @labels ||= LabelsFinder.new(current_user, project_id: project.id).execute + end + + def find_or_create_label!(label) + new_label = labels.find_by(title: label.title) + new_label ||= project.labels.create!(label.attributes.slice("title", "description", "color")) + + new_label.id + end + end +end diff --git a/app/services/projects/transfer_service.rb b/app/services/projects/transfer_service.rb index bc7f8bf433b..28470f59807 100644 --- a/app/services/projects/transfer_service.rb +++ b/app/services/projects/transfer_service.rb @@ -28,6 +28,7 @@ module Projects Project.transaction do old_path = project.path_with_namespace old_namespace = project.namespace + old_group = project.group new_path = File.join(new_namespace.try(:path) || '', project.path) if Project.where(path: project.path, namespace_id: new_namespace.try(:id)).present? @@ -57,6 +58,9 @@ module Projects # Move wiki repo also if present gitlab_shell.mv_repository(project.repository_storage_path, "#{old_path}.wiki", "#{new_path}.wiki") + # Move missing group labels to project + Labels::TransferService.new(current_user, old_group, project).execute + # clear project cached events project.reset_events_cache diff --git a/spec/factories/merge_requests.rb b/spec/factories/merge_requests.rb index c6a08d78b78..f780e01253c 100644 --- a/spec/factories/merge_requests.rb +++ b/spec/factories/merge_requests.rb @@ -68,5 +68,15 @@ FactoryGirl.define do factory :closed_merge_request, traits: [:closed] factory :reopened_merge_request, traits: [:reopened] factory :merge_request_with_diffs, traits: [:with_diffs] + + factory :labeled_merge_request do + transient do + labels [] + end + + after(:create) do |merge_request, evaluator| + merge_request.update_attributes(labels: evaluator.labels) + end + end end end diff --git a/spec/services/labels/transfer_service_spec.rb b/spec/services/labels/transfer_service_spec.rb new file mode 100644 index 00000000000..a72a05f6c99 --- /dev/null +++ b/spec/services/labels/transfer_service_spec.rb @@ -0,0 +1,41 @@ +require 'spec_helper' + +describe Labels::TransferService, services: true do + describe '#execute' do + let(:user) { create(:user) } + let(:group_1) { create(:group) } + let(:group_2) { create(:group) } + let(:project) { create(:project, namespace: group_2) } + + let(:group_label_1) { create(:group_label, group: group_1, name: 'Group Label 1') } + let(:group_label_2) { create(:group_label, group: group_1, name: 'Group Label 2') } + let(:group_label_3) { create(:group_label, group: group_1, name: 'Group Label 3') } + let(:group_label_4) { create(:group_label, group: group_2, name: 'Group Label 4') } + let(:project_label_1) { create(:label, project: project, name: 'Project Label 1') } + + subject(:service) { described_class.new(user, group_1, project) } + + before do + create(:labeled_issue, project: project, labels: [group_label_1]) + create(:labeled_issue, project: project, labels: [group_label_4]) + create(:labeled_issue, project: project, labels: [project_label_1]) + create(:labeled_merge_request, source_project: project, labels: [group_label_1, group_label_2]) + end + + it 'recreates the missing group labels at project level' do + expect { service.execute }.to change(project.labels, :count).by(2) + end + + it 'does not recreate missing group labels that are not applied to issues or merge requests' do + service.execute + + expect(project.labels.where(title: group_label_3.title)).to be_empty + end + + it 'does not recreate missing group labels that already exist in the project group' do + service.execute + + expect(project.labels.where(title: group_label_4.title)).to be_empty + end + end +end diff --git a/spec/services/projects/transfer_service_spec.rb b/spec/services/projects/transfer_service_spec.rb index 57c71544dff..1540b90163a 100644 --- a/spec/services/projects/transfer_service_spec.rb +++ b/spec/services/projects/transfer_service_spec.rb @@ -71,4 +71,14 @@ describe Projects::TransferService, services: true do it { expect(private_project.visibility_level).to eq(Gitlab::VisibilityLevel::PRIVATE) } end end + + context 'missing group labels applied to issues or merge requests' do + it 'delegates tranfer to Labels::TransferService' do + group.add_owner(user) + + expect_any_instance_of(Labels::TransferService).to receive(:execute).once.and_call_original + + transfer_project(project, user, group) + end + end end From ae88126d13d05ea040af495d77dcd1a84253d282 Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Mon, 26 Sep 2016 18:06:46 -0300 Subject: [PATCH 094/174] Show labels widget on issuable sidebar if project has only group labels --- app/controllers/concerns/issuable_actions.rb | 2 +- app/views/shared/issuable/_sidebar.html.haml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/controllers/concerns/issuable_actions.rb b/app/controllers/concerns/issuable_actions.rb index 27f1e91d865..be86fa106f8 100644 --- a/app/controllers/concerns/issuable_actions.rb +++ b/app/controllers/concerns/issuable_actions.rb @@ -2,7 +2,7 @@ module IssuableActions extend ActiveSupport::Concern included do - before_action :labels, only: [:new, :edit] + before_action :labels, only: [:show, :new, :edit] before_action :authorize_destroy_issuable!, only: :destroy before_action :authorize_admin_issuable!, only: :bulk_update end diff --git a/app/views/shared/issuable/_sidebar.html.haml b/app/views/shared/issuable/_sidebar.html.haml index ba9f0c27661..7363ead09ff 100644 --- a/app/views/shared/issuable/_sidebar.html.haml +++ b/app/views/shared/issuable/_sidebar.html.haml @@ -107,7 +107,7 @@ = dropdown_content do .js-due-date-calendar - - if issuable.project.labels.any? + - if @labels && @labels.any? - selected_labels = issuable.labels .block.labels .sidebar-collapsed-icon.js-sidebar-labels-tooltip{ title: issuable_labels_tooltip(issuable.labels_array), data: { placement: "left", container: "body" } } From b654229dcd3e4460ad7305ee7714395f044a72aa Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Mon, 26 Sep 2016 19:58:36 -0300 Subject: [PATCH 095/174] Fix LabelsHelper#link_to_label to use the subject argument --- app/helpers/labels_helper.rb | 22 ++++++++++++------- app/views/shared/_label.html.haml | 8 +++---- app/views/shared/_label_row.html.haml | 2 +- app/views/shared/_labels_row.html.haml | 2 +- spec/helpers/labels_helper_spec.rb | 29 +++++++++++++------------- 5 files changed, 34 insertions(+), 29 deletions(-) diff --git a/app/helpers/labels_helper.rb b/app/helpers/labels_helper.rb index 844bd3fd183..e26e82c6448 100644 --- a/app/helpers/labels_helper.rb +++ b/app/helpers/labels_helper.rb @@ -31,7 +31,13 @@ module LabelsHelper # # Returns a String def link_to_label(label, subject: nil, type: :issue, tooltip: true, css_class: nil, &block) - link = label_filter_path(label, type: type) + subject ||= + case label + when GroupLabel then label.group + when ProjectLabel then label.project + end + + link = label_filter_path(subject, label, type: type) if block_given? link_to link, class: css_class, &block @@ -40,16 +46,16 @@ module LabelsHelper end end - def label_filter_path(label, type: issue) - case label - when GroupLabel + def label_filter_path(subject, label, type: issue) + case subject + when Group send("#{type.to_s.pluralize}_group_path", - label.group, + subject, label_name: [label.name]) - else + when Project send("namespace_project_#{type.to_s.pluralize}_path", - label.project.namespace, - label.project, + subject.namespace, + subject, label_name: [label.name]) end end diff --git a/app/views/shared/_label.html.haml b/app/views/shared/_label.html.haml index c0b912b0584..ba8a3efccda 100644 --- a/app/views/shared/_label.html.haml +++ b/app/views/shared/_label.html.haml @@ -12,10 +12,10 @@ .dropdown-menu.dropdown-menu-align-right %ul %li - = link_to_label(label, type: :merge_request) do + = link_to_label(label, subject: @project, type: :merge_request) do = pluralize open_merge_requests_count, 'merge request' %li - = link_to_label(label) do + = link_to_label(label, subject: @project) do = pluralize open_issues_count, 'open issue' - if current_user %li.label-subscription{ data: { url: toggle_subscription_label_path(label) } } @@ -28,9 +28,9 @@ = link_to 'Delete', destroy_label_path(label), title: 'Delete', method: :delete, remote: true, data: {confirm: 'Remove this label? Are you sure?'} .pull-right.hidden-xs.hidden-sm.hidden-md - = link_to_label(label, type: :merge_request, css_class: 'btn btn-transparent btn-action') do + = link_to_label(label, subject: @project, type: :merge_request, css_class: 'btn btn-transparent btn-action') do = pluralize open_merge_requests_count, 'merge request' - = link_to_label(label, css_class: 'btn btn-transparent btn-action') do + = link_to_label(label, subject: @project, css_class: 'btn btn-transparent btn-action') do = pluralize open_issues_count, 'open issue' - if current_user diff --git a/app/views/shared/_label_row.html.haml b/app/views/shared/_label_row.html.haml index 8a1ebdd7fb6..a623bbc6b11 100644 --- a/app/views/shared/_label_row.html.haml +++ b/app/views/shared/_label_row.html.haml @@ -9,7 +9,7 @@ %button.remove-priority.btn.has-tooltip{ title: 'Remove priority', :'data-placement' => 'top' } = icon('star') %span.label-name - = link_to_label(label, tooltip: false) + = link_to_label(label, subject: @project, tooltip: false) - if can?(current_user, :admin_label, @project) = label_type_icon(label, hidden: label.priority.blank?) - if label.description diff --git a/app/views/shared/_labels_row.html.haml b/app/views/shared/_labels_row.html.haml index e324d0e5203..21b37a7c9ae 100644 --- a/app/views/shared/_labels_row.html.haml +++ b/app/views/shared/_labels_row.html.haml @@ -1,5 +1,5 @@ - labels.each do |label| %span.label-row.btn-group{ role: "group", aria: { label: label.name }, style: "color: #{text_color_for_bg(label.color)}" } - = link_to_label(label, css_class: 'btn btn-transparent') + = link_to_label(label, subject: @project, css_class: 'btn btn-transparent') %button.btn.btn-transparent.label-remove.js-label-filter-remove{ type: "button", style: "background-color: #{label.color};", data: { label: label.title } } = icon("times") diff --git a/spec/helpers/labels_helper_spec.rb b/spec/helpers/labels_helper_spec.rb index 501f150cfda..d30daf47543 100644 --- a/spec/helpers/labels_helper_spec.rb +++ b/spec/helpers/labels_helper_spec.rb @@ -5,27 +5,26 @@ describe LabelsHelper do let(:project) { create(:empty_project) } let(:label) { create(:label, project: project) } - context 'with @project set' do - before do - @project = project - end - - it 'uses the instance variable' do - expect(link_to_label(label)).to match %r{} - end - end - - context 'without @project set' do + context 'without subject' do it "uses the label's project" do expect(link_to_label(label)).to match %r{.*} end end - context 'with a project argument' do - let(:another_project) { double('project', namespace: 'foo3', to_param: 'bar3') } + context 'with a project as subject' do + let(:namespace) { build(:namespace, name: 'foo3') } + let(:another_project) { build(:empty_project, namespace: namespace, name: 'bar3') } - it 'links to merge requests page' do - expect(link_to_label(label, project: another_project)).to match %r{.*} + it 'links to project issues page' do + expect(link_to_label(label, subject: another_project)).to match %r{.*} + end + end + + context 'with a group as subject' do + let(:group) { build(:group, name: 'bar') } + + it 'links to group issues page' do + expect(link_to_label(label, subject: group)).to match %r{.*} end end From 20b6974a5c7866b24969937caadd5cf483c8f8a4 Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Mon, 26 Sep 2016 23:23:58 -0300 Subject: [PATCH 096/174] Fix Issuable#add_labels_by_names to validate if label exists on group --- app/models/concerns/issuable.rb | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/app/models/concerns/issuable.rb b/app/models/concerns/issuable.rb index c4b42ad82c7..1647d693a9d 100644 --- a/app/models/concerns/issuable.rb +++ b/app/models/concerns/issuable.rb @@ -235,9 +235,19 @@ module Issuable end def add_labels_by_names(label_names) + label_ids = [] + label_ids << project.group.labels.select(:id) if project.group.present? + label_ids << project.labels.select(:id) + + union = Gitlab::SQL::Union.new(label_ids) + + available_labels = Label.where("labels.id IN (#{union.to_sql})") + label_names.each do |label_name| - label = project.labels.create_with(color: Label::DEFAULT_COLOR). - find_or_create_by(title: label_name.strip) + title = label_name.strip + label = available_labels.find_by(title: title) + label = project.labels.build(title: title, color: Label::DEFAULT_COLOR) if label.nil? + self.labels << label end end From e00c739f975672eaba474824436ec70d979e1fcc Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Mon, 26 Sep 2016 23:36:31 -0300 Subject: [PATCH 097/174] Add Label attributes: type, and group_id to safe model attributes --- spec/lib/gitlab/import_export/safe_model_attributes.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/spec/lib/gitlab/import_export/safe_model_attributes.yml b/spec/lib/gitlab/import_export/safe_model_attributes.yml index 8c8be66df9f..26049914bac 100644 --- a/spec/lib/gitlab/import_export/safe_model_attributes.yml +++ b/spec/lib/gitlab/import_export/safe_model_attributes.yml @@ -64,7 +64,9 @@ Label: - id - title - color +- group_id - project_id +- type - created_at - updated_at - template From 1644276bac361c43a56936cbbadef2a15fe646a6 Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Tue, 27 Sep 2016 23:57:41 -0300 Subject: [PATCH 098/174] Add tests to LabelsFinder --- spec/finders/labels_finder_spec.rb | 69 ++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 spec/finders/labels_finder_spec.rb diff --git a/spec/finders/labels_finder_spec.rb b/spec/finders/labels_finder_spec.rb new file mode 100644 index 00000000000..27acc464ea2 --- /dev/null +++ b/spec/finders/labels_finder_spec.rb @@ -0,0 +1,69 @@ +require 'spec_helper' + +describe LabelsFinder do + describe '#execute' do + let(:group_1) { create(:group) } + let(:group_2) { create(:group) } + let(:group_3) { create(:group) } + + let(:project_1) { create(:empty_project, namespace: group_1) } + let(:project_2) { create(:empty_project, namespace: group_2) } + let(:project_3) { create(:empty_project) } + let(:project_4) { create(:empty_project, :public) } + let(:project_5) { create(:empty_project, namespace: group_1) } + + let!(:project_label_1) { create(:label, project: project_1, title: 'Label 1') } + let!(:project_label_2) { create(:label, project: project_2, title: 'Label 2') } + let!(:project_label_4) { create(:label, project: project_4, title: 'Label 4') } + let!(:project_label_5) { create(:label, project: project_5, title: 'Label 5') } + + let!(:group_label_1) { create(:group_label, group: group_1, title: 'Label 1') } + let!(:group_label_2) { create(:group_label, group: group_1, title: 'Group Label 2') } + let!(:group_label_3) { create(:group_label, group: group_2, title: 'Group Label 3') } + + let(:user) { create(:user) } + + before do + create(:label, project: project_3, title: 'Label 3') + create(:group_label, group: group_3, title: 'Group Label 4') + + project_1.team << [user, :developer] + end + + context 'with no filter' do + it 'returns labels from projects the user have access' do + group_2.add_developer(user) + + finder = described_class.new(user) + + expect(finder.execute).to eq [group_label_2, group_label_3, project_label_1, group_label_1, project_label_2, project_label_4] + end + end + + context 'filtering by group_id' do + it 'returns labels available for any project within the group' do + group_1.add_developer(user) + + finder = described_class.new(user, group_id: group_1.id) + + expect(finder.execute).to eq [group_label_2, project_label_1, group_label_1, project_label_5] + end + end + + context 'filtering by project_id' do + it 'returns labels available for the project' do + finder = described_class.new(user, project_id: project_1.id) + + expect(finder.execute).to eq [group_label_2, project_label_1, group_label_1] + end + end + + context 'filtering by title' do + it 'returns label with that title' do + finder = described_class.new(user, title: 'Group Label 2') + + expect(finder.execute).to eq [group_label_2] + end + end + end +end From e036a72dca49766df3ee455d6ac955c30846f3fb Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Wed, 28 Sep 2016 11:12:44 -0300 Subject: [PATCH 099/174] Add Lavel#type to methods in lib/gitlab/import_export/import_export.yml --- lib/gitlab/import_export/import_export.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/gitlab/import_export/import_export.yml b/lib/gitlab/import_export/import_export.yml index bb9d1080330..4204a13dd63 100644 --- a/lib/gitlab/import_export/import_export.yml +++ b/lib/gitlab/import_export/import_export.yml @@ -71,6 +71,8 @@ excluded_attributes: - :awardable_id methods: + labels: + - :type statuses: - :type services: From fd0ba37276f6246c4095c4879bf9e1186f7c5ad8 Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Wed, 28 Sep 2016 11:23:42 -0300 Subject: [PATCH 100/174] Update project test file for project import integration test --- .../import_export/test_project_export.tar.gz | Bin 1363770 -> 680875 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/spec/features/projects/import_export/test_project_export.tar.gz b/spec/features/projects/import_export/test_project_export.tar.gz index d04bdea0fe4b177e54770a1c25f83fd841f5a4bc..50b42bcec13c1a017dc437378bc09cb7b4dcc788 100644 GIT binary patch delta 122448 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

E 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%0D04WxxEy8uxHl)P*`djgFlutIWC2^BU!k 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%0DDi%9x#h`_3BnQzrLB0A8!cg^6 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 From 484f19ed1c5c07cbf8ea26fab8b6759961fcf9ca Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Wed, 28 Sep 2016 16:17:41 -0300 Subject: [PATCH 101/174] Include global labels when moving an issue to another project --- app/services/issues/move_service.rb | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/app/services/issues/move_service.rb b/app/services/issues/move_service.rb index ab667456db7..a2a5f57d069 100644 --- a/app/services/issues/move_service.rb +++ b/app/services/issues/move_service.rb @@ -52,8 +52,12 @@ module Issues end def cloneable_label_ids - @new_project.labels - .where(title: @old_issue.labels.pluck(:title)).pluck(:id) + params = { + project_id: @new_project.id, + title: @old_issue.labels.pluck(:title) + } + + LabelsFinder.new(current_user, params).execute.pluck(:id) end def cloneable_milestone_id From 07709c5576a06179c5365b0d7fe154c5f67ca7e5 Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Thu, 29 Sep 2016 00:21:47 -0300 Subject: [PATCH 102/174] Unfold references for group labels when moving issue to another project --- app/helpers/labels_helper.rb | 4 +- app/models/group_label.rb | 17 ++++ app/models/label.rb | 24 ------ app/models/project_label.rb | 24 ++++++ lib/banzai/filter/label_reference_filter.rb | 39 ++++++++- lib/gitlab/gfm/reference_rewriter.rb | 18 +++- .../filter/label_reference_filter_spec.rb | 82 +++++++++++++++++++ .../lib/gitlab/gfm/reference_rewriter_spec.rb | 26 +++++- spec/models/group_label_spec.rb | 28 +++++++ spec/models/label_spec.rb | 46 ----------- spec/models/project_label_spec.rb | 46 +++++++++++ 11 files changed, 275 insertions(+), 79 deletions(-) diff --git a/app/helpers/labels_helper.rb b/app/helpers/labels_helper.rb index e26e82c6448..6d0d33b84fb 100644 --- a/app/helpers/labels_helper.rb +++ b/app/helpers/labels_helper.rb @@ -115,8 +115,8 @@ module LabelsHelper span.html_safe end - def render_colored_cross_project_label(label, tooltip: true) - label_suffix = label.project.name_with_namespace + def render_colored_cross_project_label(label, source_project = nil, tooltip: true) + label_suffix = source_project ? source_project.name_with_namespace : label.project.name_with_namespace label_suffix = " in #{escape_once(label_suffix)}" render_colored_label(label, label_suffix, tooltip: tooltip) end diff --git a/app/models/group_label.rb b/app/models/group_label.rb index a854d075820..bfcaf3df27e 100644 --- a/app/models/group_label.rb +++ b/app/models/group_label.rb @@ -2,4 +2,21 @@ class GroupLabel < Label belongs_to :group validates :group, presence: true + + ## + # Returns the String necessary to reference this GroupLabel in Markdown + # + # format - Symbol format to use (default: :id, optional: :name) + # + # Examples: + # + # GroupLabel.first.to_reference # => "~1" + # GroupLabel.first.to_reference(format: :name) # => "~\"bug\"" + # + # Returns a String + # + def to_reference(from_project = nil, format: :id) + format_reference = label_format_reference(format) + "#{self.class.reference_prefix}#{format_reference}" + end end diff --git a/app/models/label.rb b/app/models/label.rb index f844a3d3378..7dd2d8790b0 100644 --- a/app/models/label.rb +++ b/app/models/label.rb @@ -73,30 +73,6 @@ class Label < ActiveRecord::Base nil end - ## - # Returns the String necessary to reference this Label in Markdown - # - # format - Symbol format to use (default: :id, optional: :name) - # - # Examples: - # - # Label.first.to_reference # => "~1" - # Label.first.to_reference(format: :name) # => "~\"bug\"" - # Label.first.to_reference(project) # => "gitlab-org/gitlab-ce~1" - # - # Returns a String - # - def to_reference(from_project = nil, format: :id) - format_reference = label_format_reference(format) - reference = "#{self.class.reference_prefix}#{format_reference}" - - if cross_project_reference?(from_project) - project.to_reference + reference - else - reference - end - end - def open_issues_count(user = nil, project = nil) issues_count(user, project_id: project.try(:id) || project_id, state: 'opened') end diff --git a/app/models/project_label.rb b/app/models/project_label.rb index 1171aa2dbb3..2fc074dc401 100644 --- a/app/models/project_label.rb +++ b/app/models/project_label.rb @@ -7,6 +7,30 @@ class ProjectLabel < Label delegate :group, to: :project, allow_nil: true + ## + # Returns the String necessary to reference this ProjectLabel in Markdown + # + # format - Symbol format to use (default: :id, optional: :name) + # + # Examples: + # + # ProjectLabel.first.to_reference # => "~1" + # ProjectLabel.first.to_reference(format: :name) # => "~\"bug\"" + # ProjectLabel.first.to_reference(project) # => "gitlab-org/gitlab-ce~1" + # + # Returns a String + # + def to_reference(from_project = nil, format: :id) + format_reference = label_format_reference(format) + reference = "#{self.class.reference_prefix}#{format_reference}" + + if cross_project_reference?(from_project) + project.to_reference + reference + else + reference + end + end + private def title_must_not_exist_at_group_level diff --git a/lib/banzai/filter/label_reference_filter.rb b/lib/banzai/filter/label_reference_filter.rb index 4c4784b0052..649c697b415 100644 --- a/lib/banzai/filter/label_reference_filter.rb +++ b/lib/banzai/filter/label_reference_filter.rb @@ -70,13 +70,46 @@ module Banzai end def object_link_text(object, matches) - if object.is_a?(GroupLabel) || object.project == context[:project] - LabelsHelper.render_colored_label(object) + if same_group?(object) && namespace_match?(matches) + render_same_project_label(object) + elsif same_project?(object) + render_same_project_label(object) else - LabelsHelper.render_colored_cross_project_label(object) + render_cross_project_label(object, matches) end end + def same_group?(object) + object.is_a?(GroupLabel) && object.group == project.group + end + + def namespace_match?(matches) + matches[:project].blank? || matches[:project] == project.path_with_namespace + end + + def same_project?(object) + object.is_a?(ProjectLabel) && object.project == project + end + + def project + context[:project] + end + + def render_same_project_label(object) + LabelsHelper.render_colored_label(object) + end + + def render_cross_project_label(object, matches) + source_project = + if matches[:project] + Project.find_with_namespace(matches[:project]) + else + object.project + end + + LabelsHelper.render_colored_cross_project_label(object, source_project) + end + def unescape_html_entities(text) CGI.unescapeHTML(text.to_s) end diff --git a/lib/gitlab/gfm/reference_rewriter.rb b/lib/gitlab/gfm/reference_rewriter.rb index 78d7a4f27cf..d0b8cd90e0e 100644 --- a/lib/gitlab/gfm/reference_rewriter.rb +++ b/lib/gitlab/gfm/reference_rewriter.rb @@ -58,7 +58,7 @@ module Gitlab referable = find_referable(reference) return reference unless referable - cross_reference = referable.to_reference(target_project) + cross_reference = build_cross_reference(referable, target_project) return reference if reference == cross_reference new_text = before + cross_reference + after @@ -72,6 +72,22 @@ module Gitlab extractor.all.first end + def build_cross_reference(referable, target_project) + if referable.respond_to?(:project) + referable.to_reference(target_project) + else + to_reference(referable, target_project) + end + end + + def to_reference(referable, target_project) + if @source_project != target_project + @source_project.to_reference + referable.to_reference + else + referable.to_reference + end + end + def substitution_valid?(substituted) @original_html == markdown(substituted) end diff --git a/spec/lib/banzai/filter/label_reference_filter_spec.rb b/spec/lib/banzai/filter/label_reference_filter_spec.rb index 908ccebbf87..9c09f00ae8a 100644 --- a/spec/lib/banzai/filter/label_reference_filter_spec.rb +++ b/spec/lib/banzai/filter/label_reference_filter_spec.rb @@ -305,6 +305,58 @@ describe Banzai::Filter::LabelReferenceFilter, lib: true do end end + describe 'group label references' do + let(:group) { create(:group) } + let(:project) { create(:empty_project, :public, namespace: group) } + let(:group_label) { create(:group_label, name: 'gfm references', group: group) } + + context 'without project reference' do + let(:reference) { group_label.to_reference(format: :name) } + + it 'links to a valid reference' do + doc = reference_filter("See #{reference}", project: project) + + expect(doc.css('a').first.attr('href')).to eq urls. + namespace_project_issues_url(project.namespace, project, label_name: group_label.name) + expect(doc.text).to eq 'See gfm references' + end + + it 'links with adjacent text' do + doc = reference_filter("Label (#{reference}.)") + expect(doc.to_html).to match(%r(\(#{group_label.name}\.\))) + end + + it 'ignores invalid label names' do + exp = act = %(Label #{Label.reference_prefix}"#{group_label.name.reverse}") + + expect(reference_filter(act).to_html).to eq exp + end + end + + context 'with project reference' do + let(:reference) { project.to_reference + group_label.to_reference(format: :name) } + + it 'links to a valid reference' do + doc = reference_filter("See #{reference}", project: project) + + expect(doc.css('a').first.attr('href')).to eq urls. + namespace_project_issues_url(project.namespace, project, label_name: group_label.name) + expect(doc.text).to eq 'See gfm references' + end + + it 'links with adjacent text' do + doc = reference_filter("Label (#{reference}.)") + expect(doc.to_html).to match(%r(\(#{group_label.name}\.\))) + end + + it 'ignores invalid label names' do + exp = act = %(Label #{project.to_reference}#{Label.reference_prefix}"#{group_label.name.reverse}") + + expect(reference_filter(act).to_html).to eq exp + end + end + end + describe 'cross project label references' do context 'valid project referenced' do let(:another_project) { create(:empty_project, :public) } @@ -339,4 +391,34 @@ describe Banzai::Filter::LabelReferenceFilter, lib: true do end end end + + describe 'cross group label references' do + context 'valid project referenced' do + let(:group) { create(:group) } + let(:project) { create(:empty_project, :public, namespace: group) } + let(:another_group) { create(:group) } + let(:another_project) { create(:empty_project, :public, namespace: another_group) } + let(:project_name) { another_project.name_with_namespace } + let(:group_label) { create(:group_label, group: another_group, color: '#00ff00') } + let(:reference) { another_project.to_reference + group_label.to_reference } + + let!(:result) { reference_filter("See #{reference}", project: project) } + + it 'points to referenced project issues page' do + expect(result.css('a').first.attr('href')) + .to eq urls.namespace_project_issues_url(another_project.namespace, + another_project, + label_name: group_label.name) + end + + it 'has valid color' do + expect(result.css('a span').first.attr('style')) + .to match /background-color: #00ff00/ + end + + it 'contains cross project content' do + expect(result.css('a').first.text).to eq "#{group_label.name} in #{project_name}" + end + end + end end diff --git a/spec/lib/gitlab/gfm/reference_rewriter_spec.rb b/spec/lib/gitlab/gfm/reference_rewriter_spec.rb index 0af249d8690..f045463c1cb 100644 --- a/spec/lib/gitlab/gfm/reference_rewriter_spec.rb +++ b/spec/lib/gitlab/gfm/reference_rewriter_spec.rb @@ -2,8 +2,8 @@ require 'spec_helper' describe Gitlab::Gfm::ReferenceRewriter do let(:text) { 'some text' } - let(:old_project) { create(:project) } - let(:new_project) { create(:project) } + let(:old_project) { create(:project, name: 'old') } + let(:new_project) { create(:project, name: 'new') } let(:user) { create(:user) } before { old_project.team << [user, :guest] } @@ -62,7 +62,7 @@ describe Gitlab::Gfm::ReferenceRewriter do it { is_expected.to eq "#{ref}, `#1`, #{ref}, `#1`" } end - context 'description with labels' do + context 'description with project labels' do let!(:label) { create(:label, id: 123, name: 'test', project: old_project) } let(:project_ref) { old_project.to_reference } @@ -76,6 +76,26 @@ describe Gitlab::Gfm::ReferenceRewriter do it { is_expected.to eq %Q{#{project_ref}#1 and #{project_ref}~123} } end end + + context 'description with group labels' do + let(:old_group) { create(:group) } + let!(:group_label) { create(:group_label, id: 321, name: 'group label', group: old_group) } + let(:project_ref) { old_project.to_reference } + + before do + old_project.update(namespace: old_group) + end + + context 'label referenced by id' do + let(:text) { '#1 and ~321' } + it { is_expected.to eq %Q{#{project_ref}#1 and #{project_ref}~321} } + end + + context 'label referenced by text' do + let(:text) { '#1 and ~"group label"' } + it { is_expected.to eq %Q{#{project_ref}#1 and #{project_ref}~321} } + end + end end context 'reference contains milestone' do diff --git a/spec/models/group_label_spec.rb b/spec/models/group_label_spec.rb index a82d23bcc0b..92b07a3cd44 100644 --- a/spec/models/group_label_spec.rb +++ b/spec/models/group_label_spec.rb @@ -8,4 +8,32 @@ describe GroupLabel, models: true do describe 'validations' do it { is_expected.to validate_presence_of(:group) } end + + describe '#to_reference' do + let(:label) { create(:group_label) } + + context 'using id' do + it 'returns a String reference to the object' do + expect(label.to_reference).to eq "~#{label.id}" + end + end + + context 'using name' do + it 'returns a String reference to the object' do + expect(label.to_reference(format: :name)).to eq %(~"#{label.name}") + end + + it 'uses id when name contains double quote' do + label = create(:label, name: %q{"irony"}) + expect(label.to_reference(format: :name)).to eq "~#{label.id}" + end + end + + context 'using invalid format' do + it 'raises error' do + expect { label.to_reference(format: :invalid) } + .to raise_error StandardError, /Unknown format/ + end + end + end end diff --git a/spec/models/label_spec.rb b/spec/models/label_spec.rb index ab640e216cf..c6e1ea19987 100644 --- a/spec/models/label_spec.rb +++ b/spec/models/label_spec.rb @@ -45,50 +45,4 @@ describe Label, models: true do expect(label.title).to eq('foo & bar?') end end - - describe '#to_reference' do - let(:label) { create(:label) } - - context 'using id' do - it 'returns a String reference to the object' do - expect(label.to_reference).to eq "~#{label.id}" - end - end - - context 'using name' do - it 'returns a String reference to the object' do - expect(label.to_reference(format: :name)).to eq %(~"#{label.name}") - end - - it 'uses id when name contains double quote' do - label = create(:label, name: %q{"irony"}) - expect(label.to_reference(format: :name)).to eq "~#{label.id}" - end - end - - context 'using invalid format' do - it 'raises error' do - expect { label.to_reference(format: :invalid) } - .to raise_error StandardError, /Unknown format/ - end - end - - context 'cross project reference' do - let(:project) { create(:project) } - - context 'using name' do - it 'returns cross reference with label name' do - expect(label.to_reference(project, format: :name)) - .to eq %Q(#{label.project.to_reference}~"#{label.name}") - end - end - - context 'using id' do - it 'returns cross reference with label id' do - expect(label.to_reference(project, format: :id)) - .to eq %Q(#{label.project.to_reference}~#{label.id}) - end - end - end - end end diff --git a/spec/models/project_label_spec.rb b/spec/models/project_label_spec.rb index 355bb2a938c..7966c52c38d 100644 --- a/spec/models/project_label_spec.rb +++ b/spec/models/project_label_spec.rb @@ -42,4 +42,50 @@ describe ProjectLabel, models: true do end end end + + describe '#to_reference' do + let(:label) { create(:label) } + + context 'using id' do + it 'returns a String reference to the object' do + expect(label.to_reference).to eq "~#{label.id}" + end + end + + context 'using name' do + it 'returns a String reference to the object' do + expect(label.to_reference(format: :name)).to eq %(~"#{label.name}") + end + + it 'uses id when name contains double quote' do + label = create(:label, name: %q{"irony"}) + expect(label.to_reference(format: :name)).to eq "~#{label.id}" + end + end + + context 'using invalid format' do + it 'raises error' do + expect { label.to_reference(format: :invalid) } + .to raise_error StandardError, /Unknown format/ + end + end + + context 'cross project reference' do + let(:project) { create(:project) } + + context 'using name' do + it 'returns cross reference with label name' do + expect(label.to_reference(project, format: :name)) + .to eq %Q(#{label.project.to_reference}~"#{label.name}") + end + end + + context 'using id' do + it 'returns cross reference with label id' do + expect(label.to_reference(project, format: :id)) + .to eq %Q(#{label.project.to_reference}~#{label.id}) + end + end + end + end end From 0bfa39d5bdb9f53bfc319b9351230b3eb405b619 Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Thu, 29 Sep 2016 01:03:28 -0300 Subject: [PATCH 103/174] Remove scopes/types for labels --- app/assets/stylesheets/pages/labels.scss | 10 +--- app/controllers/projects/labels_controller.rb | 19 +++---- app/helpers/labels_helper.rb | 20 ------- app/views/groups/labels/edit.html.haml | 3 +- app/views/groups/labels/index.html.haml | 8 +-- app/views/groups/labels/new.html.haml | 5 +- app/views/projects/labels/edit.html.haml | 3 +- app/views/projects/labels/index.html.haml | 52 ++++++++----------- app/views/projects/labels/new.html.haml | 3 +- app/views/shared/_label_row.html.haml | 2 - .../projects/labels_controller_spec.rb | 38 +++----------- .../labels/update_prioritization_spec.rb | 10 ++-- 12 files changed, 50 insertions(+), 123 deletions(-) diff --git a/app/assets/stylesheets/pages/labels.scss b/app/assets/stylesheets/pages/labels.scss index cbd009ccd07..9bac6d46355 100644 --- a/app/assets/stylesheets/pages/labels.scss +++ b/app/assets/stylesheets/pages/labels.scss @@ -140,10 +140,6 @@ color: $gray-light; } - .label-type { - opacity: 0.3; - } - li:hover { .draggable-handler { display: inline-block; @@ -152,11 +148,7 @@ } } -.group-labels + .project-labels { - margin-top: 30px; -} - -.group-labels, .project-labels { +.other-labels { .remove-priority { display: none; } diff --git a/app/controllers/projects/labels_controller.rb b/app/controllers/projects/labels_controller.rb index 919c6f239cb..3154a4435f6 100644 --- a/app/controllers/projects/labels_controller.rb +++ b/app/controllers/projects/labels_controller.rb @@ -3,7 +3,7 @@ class Projects::LabelsController < Projects::ApplicationController before_action :module_enabled before_action :label, only: [:edit, :update, :destroy] - before_action :labels, only: [:index] + before_action :find_labels, only: [:index, :set_priorities, :remove_priority] before_action :authorize_read_label! before_action :authorize_admin_labels!, only: [:new, :create, :edit, :update, :generate, :destroy, :remove_priority, @@ -12,9 +12,8 @@ class Projects::LabelsController < Projects::ApplicationController respond_to :js, :html def index - @prioritized_labels = @labels.prioritized - @group_labels = @project.group.labels.unprioritized if @project.group.present? - @project_labels = @project.labels.unprioritized.page(params[:page]) + @prioritized_labels = @available_labels.prioritized + @labels = @available_labels.unprioritized.page(params[:page]) respond_to do |format| format.html @@ -70,7 +69,7 @@ class Projects::LabelsController < Projects::ApplicationController def destroy @label.destroy - @labels = labels + @labels = find_labels respond_to do |format| format.html do @@ -83,7 +82,7 @@ class Projects::LabelsController < Projects::ApplicationController def remove_priority respond_to do |format| - label = labels.find(params[:id]) + label = @available_labels.find(params[:id]) if label.update_attribute(:priority, nil) format.json { render json: label } @@ -96,8 +95,10 @@ class Projects::LabelsController < Projects::ApplicationController def set_priorities Label.transaction do + label_ids = @available_labels.where(id: params[:label_ids]).pluck(:id) + params[:label_ids].each_with_index do |label_id, index| - next unless labels.where(id: label_id).any? + next unless label_ids.include?(label_id.to_i) Label.where(id: label_id).update_all(priority: index) end @@ -125,8 +126,8 @@ class Projects::LabelsController < Projects::ApplicationController end alias_method :subscribable_resource, :label - def labels - @labels ||= LabelsFinder.new(current_user, project_id: @project.id).execute + def find_labels + @available_labels ||= LabelsFinder.new(current_user, project_id: @project.id).execute end def authorize_admin_labels! diff --git a/app/helpers/labels_helper.rb b/app/helpers/labels_helper.rb index 6d0d33b84fb..e8992c114b0 100644 --- a/app/helpers/labels_helper.rb +++ b/app/helpers/labels_helper.rb @@ -81,26 +81,6 @@ module LabelsHelper end end - def label_type_icon(label, options = {}) - title, icon = - case label - when GroupLabel then ['Group', 'folder-open'] - when ProjectLabel then ['Project', 'bookmark'] - end - - options[:class] ||= '' - options[:class] << ' has-tooltip js-label-type' - options[:class] << ' hidden' if options.fetch(:hidden, false) - - content_tag :span, - class: options[:class], - data: { 'placement' => 'top' }, - title: title, - aria: { label: title } do - icon(icon, base: true) - end - end - def render_colored_label(label, label_suffix = '', tooltip: true) label_color = label.color || Label::DEFAULT_COLOR text_color = text_color_for_bg(label_color) diff --git a/app/views/groups/labels/edit.html.haml b/app/views/groups/labels/edit.html.haml index e247393abd5..28471f407ad 100644 --- a/app/views/groups/labels/edit.html.haml +++ b/app/views/groups/labels/edit.html.haml @@ -1,8 +1,7 @@ - page_title 'Edit', @label.name, 'Labels' %h3.page-title - = icon('folder-open') - Edit Group Label + Edit Label %hr = render 'form', url: group_label_path(@group, @label) diff --git a/app/views/groups/labels/index.html.haml b/app/views/groups/labels/index.html.haml index 8e93ea4f625..6c69e3465f4 100644 --- a/app/views/groups/labels/index.html.haml +++ b/app/views/groups/labels/index.html.haml @@ -10,13 +10,9 @@ New label .labels - - hide = @group.labels.empty? || (params[:page].present? && params[:page] != '1') - .group-labels - %h5{ class: ('hide' if hide) } - = icon('folder-open') - Group Labels + .other-labels - if @labels.present? - %ul.content-list.manage-labels-list.js-group-labels + %ul.content-list.manage-labels-list.js-other-labels = render partial: 'shared/label', collection: @labels, as: :label = paginate @labels, theme: 'gitlab' - else diff --git a/app/views/groups/labels/new.html.haml b/app/views/groups/labels/new.html.haml index 01a50607db4..257ae97de03 100644 --- a/app/views/groups/labels/new.html.haml +++ b/app/views/groups/labels/new.html.haml @@ -1,9 +1,8 @@ -- page_title 'New Group Label' +- page_title 'New Label' - header_title group_title(@group, 'Labels', group_labels_path(@group)) %h3.page-title - = icon('folder-open') - New Group Label + New Label %hr = render 'form', url: group_labels_path diff --git a/app/views/projects/labels/edit.html.haml b/app/views/projects/labels/edit.html.haml index 372abcb8773..49adb593559 100644 --- a/app/views/projects/labels/edit.html.haml +++ b/app/views/projects/labels/edit.html.haml @@ -4,7 +4,6 @@ %div{ class: container_class } %h3.page-title - = icon('bookmark') - Edit Project Label + Edit Label %hr = render 'form', url: namespace_project_label_path(@project.namespace.becomes(Namespace), @project, @label) diff --git a/app/views/projects/labels/index.html.haml b/app/views/projects/labels/index.html.haml index 99f8e8095ad..c1ec9cabc40 100644 --- a/app/views/projects/labels/index.html.haml +++ b/app/views/projects/labels/index.html.haml @@ -14,36 +14,26 @@ New label .labels - - unless @labels.empty? + - if can?(current_user, :admin_label, @project) -# Only show it in the first page - - hide = params[:page].present? && params[:page] != '1' + - hide = @project.labels.empty? || (params[:page].present? && params[:page] != '1') + .prioritized-labels{ class: ('hide' if hide) } + %h5 Prioritized Labels + %ul.content-list.manage-labels-list.js-prioritized-labels{ "data-url" => set_priorities_namespace_project_labels_path(@project.namespace, @project) } + %p.empty-message{ class: ('hidden' unless @prioritized_labels.empty?) } No prioritized labels yet + - if @prioritized_labels.present? + = render partial: 'shared/label', collection: @prioritized_labels, as: :label + + .other-labels - if can?(current_user, :admin_label, @project) - .prioritized-labels{ class: ('hidden' if hide) } - %h5 Prioritized Labels - %ul.content-list.manage-labels-list.js-prioritized-labels{ "data-url" => set_priorities_namespace_project_labels_path(@project.namespace, @project) } - %p.empty-message{ class: ('hidden' unless @prioritized_labels.empty?) } No prioritized labels yet - - if @prioritized_labels.present? - = render partial: 'shared/label', collection: @prioritized_labels, as: :label - - .group-labels{ class: ('hidden' if hide || @project.group.blank? || @group_labels.empty?) } - %h5 - = icon('folder-open') - Group Labels - %ul.content-list.manage-labels-list.js-group-labels - - if @group_labels.present? - = render partial: 'shared/label', collection: @group_labels, as: :label - - .project-labels{ class: ('hidden' if @project_labels.empty?) } - %h5{ class: ('hidden' if hide) } - = icon('bookmark') - Project Labels - %ul.content-list.manage-labels-list.js-project-labels - - if @project_labels.present? - = render partial: 'shared/label', collection: @project_labels, as: :label - = paginate @project_labels, theme: 'gitlab' - - else - .nothing-here-block - - if can?(current_user, :admin_label, @project) - Create a label or #{link_to 'generate a default set of labels', generate_namespace_project_labels_path(@project.namespace, @project), method: :post}. - - else - No labels created yet. + %h5{ class: ('hide' if hide) } Other Labels + %ul.content-list.manage-labels-list.js-other-labels + - if @labels.present? + = render partial: 'shared/label', collection: @labels, as: :label + = paginate @labels, theme: 'gitlab' + - if @labels.blank? + .nothing-here-block + - if can?(current_user, :admin_label, @project) + Create a label or #{link_to 'generate a default set of labels', generate_namespace_project_labels_path(@project.namespace, @project), method: :post}. + - else + No labels created diff --git a/app/views/projects/labels/new.html.haml b/app/views/projects/labels/new.html.haml index f170c41bfc4..0c177feb43c 100644 --- a/app/views/projects/labels/new.html.haml +++ b/app/views/projects/labels/new.html.haml @@ -4,7 +4,6 @@ %div{ class: container_class } %h3.page-title - = icon('bookmark') - New Project Label + New Label %hr = render 'form', url: namespace_project_labels_path(@project.namespace.becomes(Namespace), @project) diff --git a/app/views/shared/_label_row.html.haml b/app/views/shared/_label_row.html.haml index a623bbc6b11..813ce4f1405 100644 --- a/app/views/shared/_label_row.html.haml +++ b/app/views/shared/_label_row.html.haml @@ -10,8 +10,6 @@ = icon('star') %span.label-name = link_to_label(label, subject: @project, tooltip: false) - - if can?(current_user, :admin_label, @project) - = label_type_icon(label, hidden: label.priority.blank?) - if label.description %span.label-description = markdown_field(label, :description) diff --git a/spec/controllers/projects/labels_controller_spec.rb b/spec/controllers/projects/labels_controller_spec.rb index 2b39f9cf0d1..29251f49810 100644 --- a/spec/controllers/projects/labels_controller_spec.rb +++ b/spec/controllers/projects/labels_controller_spec.rb @@ -33,55 +33,29 @@ describe Projects::LabelsController do end it 'is sorted by priority, then label title' do - expect(assigns(:prioritized_labels)).to match_array [group_label_2, label_1, label_3, group_label_1, label_2] + expect(assigns(:prioritized_labels)).to eq [group_label_2, label_1, label_3, group_label_1, label_2] end end - context '@group_labels' do - it 'contains only group labels' do - list_labels - - expect(assigns(:group_labels)).to all(have_attributes(group_id: a_value > 0)) - end - + context '@labels' do it 'contains only unprioritized labels' do list_labels - expect(assigns(:group_labels)).to all(have_attributes(priority: nil)) + expect(assigns(:labels)).to all(have_attributes(priority: nil)) end it 'is sorted by label title' do list_labels - expect(assigns(:group_labels)).to match_array [group_label_3, group_label_4] + expect(assigns(:labels)).to eq [group_label_3, group_label_4, label_4, label_5] end - it 'is nil when project does not belong to a group' do + it 'does not include group labels when project does not belong to a group' do project.update(namespace: create(:namespace)) list_labels - expect(assigns(:group_labels)).to be_nil - end - end - - context '@project_labels' do - before do - list_labels - end - - it 'contains only project labels' do - list_labels - - expect(assigns(:project_labels)).to all(have_attributes(project_id: a_value > 0)) - end - - it 'contains only unprioritized labels' do - expect(assigns(:project_labels)).to all(have_attributes(priority: nil)) - end - - it 'is sorted by label title' do - expect(assigns(:project_labels)).to match_array [label_4, label_5] + expect(assigns(:labels)).not_to include(group_label_3, group_label_4) end end diff --git a/spec/features/projects/labels/update_prioritization_spec.rb b/spec/features/projects/labels/update_prioritization_spec.rb index 21896f0a787..84a12a38c26 100644 --- a/spec/features/projects/labels/update_prioritization_spec.rb +++ b/spec/features/projects/labels/update_prioritization_spec.rb @@ -22,8 +22,8 @@ feature 'Prioritize labels', feature: true do expect(page).to have_content('No prioritized labels yet') - page.within('.group-labels') do - first('.js-toggle-priority').click + page.within('.other-labels') do + all('.js-toggle-priority')[1].click wait_for_ajax expect(page).not_to have_content('feature') end @@ -47,7 +47,7 @@ feature 'Prioritize labels', feature: true do expect(page).not_to have_content('bug') end - page.within('.group-labels') do + page.within('.other-labels') do expect(page).to have_content('feature') end end @@ -57,7 +57,7 @@ feature 'Prioritize labels', feature: true do expect(page).to have_content('No prioritized labels yet') - page.within('.project-labels') do + page.within('.other-labels') do first('.js-toggle-priority').click wait_for_ajax expect(page).not_to have_content('bug') @@ -82,7 +82,7 @@ feature 'Prioritize labels', feature: true do expect(page).not_to have_content('bug') end - page.within('.project-labels') do + page.within('.other-labels') do expect(page).to have_content('bug') expect(page).to have_content('wontfix') end From 848a146fc3bd34ec94a206f2ed6ef33d539bfce5 Mon Sep 17 00:00:00 2001 From: James Lopez Date: Thu, 29 Sep 2016 09:51:12 +0200 Subject: [PATCH 104/174] Fix import test --- lib/gitlab/import_export/import_export.yml | 4 +++- lib/gitlab/import_export/relation_factory.rb | 5 +++-- .../import_export/test_project_export.tar.gz | Bin 680875 -> 680856 bytes 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/lib/gitlab/import_export/import_export.yml b/lib/gitlab/import_export/import_export.yml index 4204a13dd63..59abca04b35 100644 --- a/lib/gitlab/import_export/import_export.yml +++ b/lib/gitlab/import_export/import_export.yml @@ -71,7 +71,9 @@ excluded_attributes: - :awardable_id methods: - labels: + project_labels: + - :type + label: - :type statuses: - :type diff --git a/lib/gitlab/import_export/relation_factory.rb b/lib/gitlab/import_export/relation_factory.rb index 9300f789e1b..5a84bc97226 100644 --- a/lib/gitlab/import_export/relation_factory.rb +++ b/lib/gitlab/import_export/relation_factory.rb @@ -9,7 +9,8 @@ module Gitlab builds: 'Ci::Build', hooks: 'ProjectHook', merge_access_levels: 'ProtectedBranch::MergeAccessLevel', - push_access_levels: 'ProtectedBranch::PushAccessLevel' }.freeze + push_access_levels: 'ProtectedBranch::PushAccessLevel', + labels: :project_labels }.freeze USER_REFERENCES = %w[author_id assignee_id updated_by_id user_id].freeze @@ -19,7 +20,7 @@ module Gitlab IMPORTED_OBJECT_MAX_RETRIES = 5.freeze - EXISTING_OBJECT_CHECK = %i[milestone milestones label labels].freeze + EXISTING_OBJECT_CHECK = %i[milestone milestones label labels project_label project_labels].freeze FINDER_ATTRIBUTES = %w[title project_id].freeze diff --git a/spec/features/projects/import_export/test_project_export.tar.gz b/spec/features/projects/import_export/test_project_export.tar.gz index 50b42bcec13c1a017dc437378bc09cb7b4dcc788..8f683cf89aa281dc252fd753aa69c8f875ffae80 100644 GIT binary patch delta 107543 zcmV(rK<>Y*$0?Y{DSsb}2mr|T>{kE-eZ_{_n$YbsI}-CW6mMJ z`5SYr)h!?h_#YoY^ni$n{CySu`wA2S|9$;?06;CzqFANky=O6e#Va)$I{(qkT2W-!T*lg@P+5S#H0a8R141-u%iJ*YO za2OCS0uq7=qkj;h)*>KL2owqt2Es&yp)eSmI}+s~Xp4kfdkAuSB0W602_Q(66$mO~ zZ7n2(vKB#zfRHF47z}}lSc?i-L7?b6AP^x82K}ol(#h4+m*2`A?u@V{09t{q5HL6x zW+fsjghbDTgdh+wBvcqI0)ispqEI0yL+)6cQ-}61Ijx zg{|RGC;|*Y!4N1g0wIckqwhpTtr7o)t_8xy8Rck)@FW03Q9vss*vc9NM1ZW32qaPz z1xJbqplLEtu$^FvHNxfKYG|YZwT<^O2$mun<%P1{W5ALx3Q- z^}nkE2@oI{SOhAHLV<;$5K$Nm2m!&Z(BJ?<5W;^Vj|3t`;2>etzw3es;9#VPHQFl_ zSbqqK1{X|JL`W2lKwAz1Ss@_kI0BJiq}6|=D?}g)gF;YfScAX_G**xhA+V^mu&AgN zSQvo>Az^ShR9F~l1^O>^MF?OJIM5me6Gb~M1V=BAhM6$PN*D+dMS;UcT?U{)bV8u${e=XKkDd=A2Y4B4JiS zNH|IuZ1tZt(YpWdx1F+rj64B>ri`2_nzJ#{fAtw8J~^*PWJr41$R1AwX!NXnAp#0< zf(BTSK{6^)PGppwofiZGs~UkW?87(KZ24S(SlG=dD7#2aR?LlyhIxWus(;okS;;`A z!;2CoiI3|<{4`|(6OrZKc+joH`s!X5(L6Xt=ZP;Ap4(;!tWLleNl?Yn>Hl)4dr)pTGDvqdnI zOHh8N!PP`Eg*!N$%~kGQTm*>X?qPL#$*k>S2GRNC_;>#Za+8H*Cx7NgW=2l*MQ&4& zrM+wp&JV_*H84gg*w?+R&&QwzT*C<7ZeW7`A1{aW4P?O{TdvZBymteVe-DY{U6wZIC`2+ zW2K_o<4kitH;BJGK&CZH@9M>ei04tLq-Ny48YJhe%dx>5cD6?q|w2}iT!=} zXuqwdkfS2pVFE6@8#6?+^ z1R4&_YQRqlXPHT)&P*sMlu2&wANIiVCtC2a@j!(P_bjx0 zd!t9P92*Q~Cl39XMVI2uF+o>`yUFpj^R;SNK;;IJi`)COnk}*3sm7P-Q(vUm54AIM zWxOb_-^7F~&8vEf#a5mEuI|s>j|{fYnWAsjF>SLW+*lg6Sa=od^Fs1*K4B?t%Vepk zH?R54IDaeb&hXKT6<@oPwf7j2_iTw0NYTE=sG^C83UHP4^-zuBAt^y5sM?gy%=hIz z3F@2tGTWHa78_Ss^5}FJeWP_uR!ow-kkyEaKYbhZOsd|vR1&cnW8YIk4eHUEmIb3^ z3Ww=gdTUnLj||zJl)7O~>j?Alij@&e8{;!Ruj zCJKdT#l9$W78@RBIBdP}cM~&x6MAouz~keTpM4)Gv|lAMfx;&zHBQ|51CUJKKi8^V zm*in!V+uL;Q4+hEdM&#_2|$JFZE^6D6v6YCp2DO)8HvM0616+zUY6`!9LyJw3!8$8 z+JES9v$=Y|ohi1W9^Fg+EubJ_B30OEGPj8L{1@U|ZAK;82J%6L{ zXD`g}X+IQq0OQm+yiO%{Mw$xc5RRR6^xPSzyZJM5Jv|<*eM;J$S|8;$z`s;4rlwb_ zOK=x&Z_Y!CEw#azYuFo*sgypzHUs~9I-tv(T`WEYd-$r=i&DX%}@s3Mw(XZ zHm>W?;t1*;-AMxx2a3s1tSWKWYJb+;z&)V=M{&=>E{sBVH^y{gbPz`V)EKhI>jCN@ zT1~DO$=LFqdbCFbN8F#LX&iY)I=e3Lj#xl7Eg<)8V@=dFDm3qH)_KXR@h)$32%Zaywd&1Hr=4SS- zrD%@X?I)6(97&d~e4n+fh&^>uFv(5BX3a$TEU&ro_cuziJ_ysisRgv-9Rzx{tWf>0ERC z(Fvn{LdZ_WAF3D`vBLt91+BN2XZUx=H2TG`(X|u|KBT#{PfvZSOzhnAZYvjeQp;36 zMs?`)_Zlmsux%rc8-E8QrUsWbsw%0;v2$utfnbPFHPVWhu?0g}p{yW=M|n6&Bf~8B zd762?j8JllVnv30Ys^M{&)wz4&7DVAVDG-ENloeUV11(;sYh31i<$AZq;l2rX5vr} zp`ZNe_`A5C-%AQZ^w$g&-fxLl;=N9U^QVQQrR9Lyr)d;_%76MNwLbJ==D7MRvy5^g zLR>nHtRU6q#$y(9QR^#?6LBK|as+;?tzBf%}CuOxZo6QeF3 z6KGjxbI8fgTXz;dITWv`Us9F&@85rR zVfD<@nV-_}E`M*5ILf&~7>QY&V_gh9T^N4Hx~p!?)8D^6&G748H1WIlK?#d~1sS;$ z%h1{#=EfpLJ07o_5r_6|lb-wI`}ai-c>Tx24#lD@P8FB% zleIER;!M?U;|r^vWF1FP(ceaKPOR225g2*vdzSwMuMw6a?ggVZ$ zSFbAAxHc%Ia5ITlFoUyXv(?dc3>6-aSyL8exFVQLKTv2=0(q08T9Pu(l)K1Kq+fd9 z=603lXMgYEOG}7wJKiS^CZUoUsH0`ZIp!y8ZKUWuceVll){Dv906|S9;Y}!q;Rv)h zd`_Epa4_RM%Ur#5Bmq&^elDPd*tih5OifOcm0}*UDSN~G;!0z1dDApcXj$Mk2^1>Bwwee z$A69e(z)AJMo)YnnO%w?gC`&FEeLLt9LH;IXa3a&v=jIKF?mI&RVm7G{!~f!mEO^F zn^)Z`DNqHJCC;~RMnSPdWI(LLWb@Y<#m_Ka2ajv-hiC=ik3Wh?0SP742c*HnxsBI(^rZzw?kRmXxY3>A=;vOkbf9doExFye6_Q4vEoenPS8x+I~~Ow{tGIX znf`0KD4(gQc{Y2^tk%7>K>KTHaYgFy1I$+(>2=jY-Uc)l69XE_d4FOXEAuz##QII& z$fR+Oywq+xc;DG=i(-oI(@z-0_PhQ@WOVmA-~G&cqVv?agF0_A=aG_wA9AZ|GKC& z8V|evo9swa^bBcSIj70Pg@is)19WvQPss2#x7H?O6^kqW5iTH%(nvF_fS*uVJ(;-g zpPr#+ejz0|?vT4y-@D$>A0XN35fBx)=!jk^Nf!CQ^|&$-hVH{Prh_( z3#-p~d~s9bW&Jz)ZUOB0@;-U!I*1%m`>PQ|Te*fQN)?VlfiP{Gr92UCjMdJ1V&>!5 z?uuCI?AUbRC6BNyRwtJk2%^fNeW)xqB$}T*yZsnj9bj_%#AAboTKR$8CBBt@J*{m4 z`#t>oc7jdA&$=RiR>gX4wSR2e1kV3BeK*+pI^t`o60HO5lqChDDpmNFEr!go3uzzw zYv$|5>xK5&GdYp3>Giy+*X%3AI@#gxs{5pN$>i{|{-jod+84`t` ztem8*;$%w2=EmI`{L=w+%qV-3~-jwy}96Ub{v<- z82Nx9Okbbnb($9v^w6zO{y|6?Z-h+2`DSrtO!cDW!dpkilxK7SY-YCC!*lnYk$B&n zsGEl!;@uD?@(pDbvr1tPogAB}pdJv;FP$D-UoL8-*6D5xT7O4WH{q-27|TW@e5{$$DN?`!aA7Umt6my^i9mK@8cA zd~oS^lFTV4A9ZY}-QSEvgnWG-b33e4sy-Z1R2poUI@^IuSl-xJsZJ>oSZQ?ws4~Ag z)AZtWon8+&7Jq5$aGtSy6jlcB&ympBq;F0FGi#=>^P2*M)b`@V^)ZFir+uEouF=Q) zl#9>nea*g{yII+r7UxW*vl9F!$l*D?cRAYw%0|;cYP_mF`Uoq3C8ltUC1+wmC_AJk zTQL(ytnava$=<^1v<+zBC0HqZ(vIi)ic>jCeH%6;uYX+_oBFc&Rkh|>h8aimc9Fmf zg8S|AF)2}0^0d#*p?os~VO1Ksgwd>xbZuUeV&FZe_H963&G)-S+eOyrje;2+{f?y> zHb1)YCt{kN%Fje?-|D|Lp`9)K{h{~{)!E)Hr1;I}x?wnw_}E6uh5S(tu~}MOP^?XFv8!s)ySj^7GyH}Ou?*E zw!O_N+l0a%ksSdEj2Vz1?aCxo)C62VNcmn_Mkx7LgiE+0WH4?*?iY?c2A_RVNn0_QF{<%+$lq=sX{l63SDN z5&|9=H8>x9kr>C7-hB67G+vCiHpoM%q62ex=q3}M%ux4DOT&zju%|o%j`!^N&@o;K zu;TW;RX?s>U?fkKPv5>#sw9au@$N<{N`I+TLiAF}AC^T^?R&{V<#_J<>U7)69J9W2 z1aL&MPkBz;>l<<|F%tepl5{NTT;nuQo-3&zJ}CV;%RP(c!=5F$#SRwDu8^C$ZcQD} z04U{sAb!bRv+Vwo!smlj5wUMydu-U*?D;-3xnO&>bGpZZoAN3WQW0CjBs25;n}7Z} zV-R&$D<8{o>XLtH?Uhosmx`*lKg1(_=8CPWI9RWuWi4eQ$eEV5t@VajK-A#=l2h*y zaW_PcUhJeScq{WoGGLT$w}wBYv3fFzMv_CNmjdvTy~6NJyL4AoqT^R|+8XU%B%4hp z^bgupJhC5?DITBmZfB$nPu7O;s(;{M_u9$~EdX0E!WFuM!V?p}?>`ufFm-=Y9A9(2 zf3)Y9Lyn1@NkB^WFlZ;!jnpTy-PcdxihNll*~-qqqc6*ogitb{aiy2Zzrg~>XYWVXr<9E1_J0Chv05)oSCs;;T)L*1|pLXW@F#VU{o)`1wGTvK=NZnOdk>b~Q-ru$>pz;@4t3 zJH%45n2q~}QW&|CRG|3mdF8D4%($#vvw4oO;B`oJLw!>ELZf%br;$|i`nNI{9IH+_ zdQg86b7FwTfF}=6FRTqYvUgaUni>}TX{f91LYpsJr$%9h;M9r1Ie$)}uYAJSz0#;; z-nYpF=#9f>_PO&Hzn10`1KTgER2pObm@YzgRI|g`frhLOq7(E?^OvTymXswf4& z*288!!8ooiHLoia&i6;JPF|aY6^=wf9_=%y$FSA56)|2*jNaQjx25h9e@b(kSWy}_ z6I#lQQ%mi#6EwfqUw@Wm{npXXp!9gz?2?bAlZf%+32Nk8)BFo3_y$s%Fxew(r})4| z5J&Nbx%>Dyx05AJ)07^OC2h2?zjxMyjyol>OXlqT8V zvh#wR>K2pfnB6JsFN#z3sDP4%UELD!@6b@2;DsvKA590zoqyci?`oh->b4Adm4F!R z`X%-*dVbX2-tVVg-cj|`pe+vu1$%$){wuzOB+CQDmk)iXrXL&lw%EIKfCrB&;KsAK zYu$$+5+lJ>o=}0ymoXbp*`zmy_Cbm6yP%k&eu3?`V4pIA!f1_?0fyq4yN7Cozo@$4 zJHJS8#cK@Rj(=SB?r@k$ulp|Uzw8bd2%Qa)qEh^&v2n)b63rwLphw01f!>gVu$F906w=bIzt^mJA*{SN!oI6cuR(*4$@&&c94}bfJmWph1u5Zo);Y;aU$8(@llBgc zL~tQU?PlpvNWq-C9>Vx>IND#_TiMP0@9mnhz6__e*cwaq)XKRZAQO_o}TtzJlXQx{ZpKCR3fP+B6mI#ga)s2ILT%`- z2gb~i!vh|9dr7yA-5PZltl@!O;<=r-CU}*ac$%O9ialej9-@Xyy~H_fi84O_C(?Pp zRoSa7u1Xow)Ba*N)jzd#@c5hu&2CNXA3U0qbTu)M0dLqVR#0@^S}bSU>r)Z`QA@q< zu78b|f433IDeG3ML{$RmRmznU)gL@bVY8-~p_*-PtJJA{xTZJ^tjI5jm5pVWrN4=h zf2a)(;84{H;uxM*j-^YYXHyFpQ-!Menw`<)4)F_~A2H2R-wsHv*WO^g7~om|2ppPX z)l8}7Kxp-gF~yAAV*4!^Os~JNr(OLTHGg=r^|j*zPoUIIJ z&h6vRzhRdfSK_@7rtAycFQgwC_Uv>Xo8?2C1 zv4RHUOY#1|qB&8FA*59KXmSUO@qbvBeB?D}V-yQ+W9vGh^rM^hOpotOufNK<$A1IW zHJjgC^OsG{R^T%8a+<^XeYj<*1i;`a!ucyB*$L*EL zD+AU*BnIgfpl8nyu4C8yNwpy&_jSdXYm@tg=X}K|1k+Vnq*%G&?{$W&YJXo9>z-?j z90LO5zn^0~AMQ3)`^|-E3B;`kFM&BEktrf`do$+n^I0b`EeALFtOb3kI>#?BET-`T zG3>0^<^F@#{uOPQAEv4tA3c2al@N!>eFKEm+ResBkSFDMnV_m(_Pw}0aHeMOSBuDi zCb{MiyTB$V{i)lKlDxdId4H6z?51+cz~d;We&l27=~l;l`69ysp*S0Nx~Nd3Lhze} z=*Y@Z*+3ec!eqS6;I);K#&F}rCa+mJ>9@9O5mYV2w=^$$cTev9QjTI9DJAEBFBg}0 z+8aYDPoi$vS8rK_P>BAm(_Zu>i!WG^Rdg=)g2gx-=dh{HfcdKE_kT7Z*KOIl@p+h{ zZwnEMRz4ib_9dT3Tmdg|;^lQ>ss)B=%wlXQJthB#e6Y(J;nT%tdvkge(@fwSo+?TJ z#%P=$*kI--yH@Pa3D3s3biLH9Huxi!^hBL9pXU5(x?eIiJ0En)BZNg8saK2&#SlzFLpa($IC@6q^eBhF0aYB65F+j&Z*i^U9rSBjiwbSnQ!A3D}d)Z zk>kM{^xymsU4PgC(cp)aM2yCk%JobTz!xL!uRp>l&L}Qxeita85DptL7H9k$(29jR zmWN9)A6B-$S$pu!i4Hfz44#tywUo3Swwa{!C}6kT;$nYwSxtdwI#m8Oxh%PC-D9ot zp)y5kqsfh)lczFx`?@K3t!q(f#7`4)-pY5oCB2H`*nfSfLLDli^@Pgob-rN{)wGnU7TI(o2U1F4H1lvQT9e3lc@-+hLUp? z;B}30lbj=()~ zUcndsuy)kzc7az1=DXLjrHVjy*nJT#=2e+Pnl^fWLZuI2p9IKn{-{$cbl8{IM~Yho zcCL>$R?TgxBnNa#D<0S$9f^x*Zq%M75g9os*nghoMN+Sl0Lps?pcB?xlGjtpX1H-F z#UtJC@g?2b`L(8i(^tl>CLJVK#~RHhteo>B9VeYY;?LO_KT2>y8q4jxpEiB8O~jAd zH|y6r=+uaYJu)C_KSo6;9C99i@NLX}Hj(J;h103;#~}n@wHG^kmvFF?Ua3lIa8X_5 zY=7L7LMbE2Y;f{TjZ*wYISX}&U4`CUBMhb>(mvPOElJ&d7kq%wlN#~T_e{MC>wvS1aYC+Vd+r3BUw(_~w+bKj#d>EDZ#fOrF{ zStrwzBFQO+ApVgjSuws@aT~vOEq;;TVt)#P8DP18;YAU+~7y1KjriI$8^h#38@2quzN2r9l2Q=6~2bD*u=CU1(Kua zWm3sQJuvx4Wko_TNR8hYnCAW}blIZ#tzW#+S*0pp)vQO<&XX!XdkW`d{6tgqS5`YT#r7Kv|&mx;d{1sv+* zP$#>EPX{m3#=QetFPDnRoiTSH_gqyM;$~-rJu9M*-3h7M-}ClXK(`0cIQ#PU(C&iz z@&4)ZgDj=O<8UuC&lCLZ7?EY+L4Qg0I#O`;BGF^OZaZamINUgMJ?pq({QV{EhqpFy z;#2IwB{IbdKi9!qKCeXviY`guy4M{^y8Z`C2UOjBrx^{g?G8oc+jM?iY@EcMIlStl z6k$mRaW~%WE~Dg^PDWK`2zOh7t?Z<|rh_)FAbdij^coxMVrYv&pr5qM1AnQ;>H5*+ zdI!TEEl__OZL`!r3sYrNaca`oXlz{S#xWXk7AmvAi-TBRd9 zZLz7@i_tfW^w|Ow*ZznVQv0>TIVJHSkC7Lfu8Cvk92XI0bc2cJPx(C_tfbYoK}GZ* z0uyzj`E^J=%=DJ&AvMllCVy_fl!Zc>{YEk9%nF-Znah~Z(xhfSCuzj5+wV4JYHK}7 zc}{mWGbAP=xjRRx!1lYaj|CR5J4I!>0z2)sv z`W%ioB#g$-fJFpR56mM$#qcO=z9;$JrBOlb;6w@zMXMw>9vt{8a|JHLPNhS=xJ0Pe zjBfmcL*pO(KSMVLS$}^dzy453H#qb29@V%o>2@7kFRl5e?@7_;$hcpnUX>`Pfwgai zp2>!)-zaFS`Rk`&#=8941~}VIq4a(dsLZ#AnuLPfBJu9IjmD$eBkkHLT#i>!N87-2T`ooDLR(SLj}i0J9mqeYJ9Hp=>G z!I@<$|1^}vL7&7JbzwSZqaABA!ug<+gspd$C{+to={9nz^yMH!QW6!4j>nS^nJ?nbRlcGEczh!FE-S@R&jJAvYH=jOUk;mVZm44Da zF3H?npa%Q+CiILe6bg2}YoZOC*`>+F=nJ`)@4d zWl|JE_Pc)I1!8oNGOXu`{sG#jBs9>%uI{KhpGGl+Ig@1!7h(2#V#^202Qy<5 zkG^@x_J3A`mFqu%R^dO^>9zOWDOWD%Baiusb{sZI1N%s^Hamyoqf?44PL_$V7~xQC zSM`P4=?@&VZhn^ix?|^|Rx*mud+T&JPvG?*fnsm?K1kqvY!b|-u^%jVsSuAz_Lvfl z7djUI!G9ClfQDKjluJ)iHG9K*2u^>V)bW_l`hU+ktsuGJ^Y3IcH-WbDAPv^SJ!_;~ z1a#bj++-d%_g6Mn>&RlYz53^boNAKHn&cEHb`QpuE=d+C37rMN>v3~_{^xCGG8-FU_FN}XsXChxvx&KS{L6)nP+J~w=-y+K0p&1IKeb2tifkbf6? z7Ar3!`)8{do;el zn^cd|{(gMxoc);U@zptXgJYPLW%q!*lOE6~3IW6w7hNG9C0aXqWJz&*!TG5mySm(b z*E#M;)u7acJ_N5nhmA#t!y)B?o_~&Y^`qxc3Me84?J7TcJ)!&S=`BSGj|!h%}X|tcN zY{W%V-&4VC?>vkM2VaFEDi+^r9^Nbd^ zye{zEyw2;sC1Kytp|Mqj##XYz!d%BS(VBgmv)?D(ZyR!Ew9L{=&s|v81hOpX_O8X;>E> z_%MEak2*N@VI7;$m)n;8xqm(x%l0II+_<7YV5f>Y7q8Ba|G0Oz&71Uef59UJN~AO` zHJ=HvR0#pC{2b2SZG|>vKc%o3*3she)2qHh?c6)@U;0cI!qLw`*`-gi4!ImBYf z3IJ5it8Yl)JimNo8|S22;bGLLRlB4RLe8j|JsJ^P%uMQ{SY!^a8{cIw=#0Cv{gre| z{`iAQsRHYAv}I5DVOwLhS^ACDPcCy)jr7jFNW%W89;=OUQOoj;!Y2A)##jIGQEIz{7pujxSjT;A3J!RddR;#JWB1U| zbc}Y8YuO=aFU$snCoQx;d-Q!Y&&N`chECcVyB z+mx>2-77%iFuh3GY8B+AYsFaVXyp}N2p@AHS&IYnR}6E1OPlMaz6E<@8HB%iS~m@uvZ>iGTNupOav~f|Qqg5DuOU`7TT0_ij-AewHE6Cxe!rF=HD6X62fPwI8au>3VA}Gr;NIDq z5a~dUTEMtoGd+P*CG{P2OxW_gRpp$wfJACv$nvYrY=1;50oYMDbHBpm-|K~&iz6i| zQnT$AzoT%TL$q(61spnfvc$A?EGlaB`^@@>7j1_1J>v;-(|-S;>+-ID#;2Od!=KSk zezTQww#wTC`{TJX^S7^)0?p|rqo0Cf`Jx3n-*KlIy`aF*ZMint=`?9@jp$`&6!6Vk z`1&!|Wq&7H(#n&P-qgag$=&x~!I;ukajPO}M%?F@Jh0V4f53BWB_4(d;3*SVl-0z0@GiNxl24ST??s z8y>?hp`#?~4yWeq*@&8Sd-md*_Cb%}pcK=2&VS!PYd|-eidW~nC^XQ{s9IBtFo&6C zaIkef2NAehE2KDq0Uht69qXSIrNAGxR*!lZIxVRJnm-B$DFOsjDoA3dj6=s_p3u2HJGD zYoaZM_cL7MGT%v04ks)DjL4w$Kl}dwNy_ z5U`l*G(Wd*OfaFc!zw*lXhxok=5^^ev47g?PlJL0T>c`u)<#AHLfV&Y?S8Ete6(#* zo)d+XRyzgUdP{y|OQUdJAK8^Dle8^L@NfhJC7{1*Kt)_cSWmJbuYah<{mJpZzg^vq zs)_FtgZ1TpzC;^SFhyp#MAyv`jaJ3kQ>q%ATE|@DkKUz~%g4J*hL@M}vXBd{mVbEF zVaP-Nns|TtCB}Dq`Zi7OO`!5aTwbnh($Ye#wcxsRdbRrZyA)jpGm(KMDqoJh9k|WX zl+J(o2p$x^mq~3v);EPLU7%V=Au)@^w5lM0ZaG%HS$2NqdojC#Z|ASMocM?}v?Il# zv%7A4&TT50ed6tlA2MdR$DWHebAQwx*0IO|I=`3wD1`JO0z8+W`!s$pQ)RZuE$U2& zNJ~5VdU4aMGJo+(7NP8Cl*(;-wz;G%-+l}Td|`o$_uT#sLq(Sg;6Q+mO+|aDyYdx9 z(i$FsJJN$mjZn6v=j2jQ{iTI&0IOa4|L!%Z29KXdNpT^0K5+q4RTR>I&VR2Qg;p5a zdYWA71SeJ+5fEv13XfbpOjlKyW7nM^QjEHGEZ@Z6QlwU(v1%9VK&#*W zQX-)lWA(%Z>ia8LI*PDhM}K8NU^SR+H>q-0Q>z;Z-82FVjMF@y0`ZA zJ3@&;tezz|8~Em8UJe$hjB$9Fb}a?+d42AohlCQgw;LvR0p5GVw@0==Q?a(+I72^a zeuLdd?BK@qw}F=WPI9h36Um(Gc6Kr$6Yi#hf>YP*T&!!_7E@ zq^56?SB~PSLSocvBc+C;w2mOtcr%cXHSAe>RPw6IsT=c^czg&As%tx|_w53*^+Gkgvc307tz&Po~2_NAN;xsdIgVsh#4!bsvbPGprCcsmBV|-obrc$`M1BSlg#cki?PW{^XHsM)c;xC<=_}R!+{a z;h6Xxk5SdcARLf((Yu#EJT(0os!;PdiXyzvae$>Mj~Us{A-n8&V4v5Fe!Or#^KIJm z-rWt-+e~U`m)b`84-A`*Uc&m9P!&Yo)5Ph>EYAp)F!!XvM+nK zRa5K`#ec4`IjHD9mnQIYOs6oHJN`VZGnmC4Ab7LF@ZH?+LxXw2BjTkgd!-De zjvb}ai;$kl$|lRp(w{La08{o4(n8VO0lr-p#D52GF^rAg+KT%pj#sr$GI7;6a=6c^ zGBzD!BIy0gsbv#zUM;0D1Rcqqy3w_(?BwpLmG3Ln+byN3N_4gkMrZxibm>6T?tJ(cpTAry9&-U? zM}OgnH1k<2i{J&U>s=|D&S=lu?&X1iv)8M#fJ#go?5`a6@d51;yedLvlb#f@g1?g# zP6+W<=nww+(&3R<*R$FIiw+lC&M`=Rt|N`Eddr_WC#7kO^peDN7!H!Znr>tsrqzb~CB5#(zp zrdWS&HL*GNboO#$L%Eq3_R%r(?VekF$$9Tr8VEcP=+^tJ(WpIaRcS$+R^1PGEoaA5 zS30LV+JTl|BmJ~MHOG(3zy+UG^mJJCyVCj(2e${APrK46N)uFkKV?4^8-Lls?Jl8z zN!uU0Yt}pe=&T>*II@^&q1Y!nddP1g=zY}L0r{!E$T1kY)j7eL{P6SYbMyDFF?5dy zvZO1Xc;#l>yyO2$0O1t@dQYmHZxVdWh2bxPaf>k_`(nbuf@hQB8p zmg2TbOtoTPxBKRSAvm1F7aD3QgD2mUZYBTtu*FR!pUzF_^ZI?>SAP^eLxUW>m=vK8 zGp;dM2`c$4IVje=!Bxg@Y3ZFBSaR>$>?;fyrWkK&0(w90qe+b_FioQuO=_h%qo;Hp zbUox&eoJxKBGxFyBO)cmnl4O3^BUN zhcohZG*E)!Mn4p;7JrrW193DNr-^Im37kGumEYnH0*f2pcY;Q1qXOTk%y0oPGn{Pl z%O94fJq&LXF}r);9i^Qq{Go5qPVpJ16btLEwlDYg`O7Td`oryQ9`L0j`}zoGHzmTb zEcn*Cari6u`e%CWgPE_BRr``Ii6Yz+T(KS3<>J*p9%kJ&NPidIkQ|zCKL1{aWhuf> zAmlPDKhN$J|B6 zK}zSHzse4NzUeiq-Jv~hIL`I!R4Ue&~G)ed0qX%93p zV;iN=s8mszjxuyAsx&V*Tr~b(Yc(A*_Bp-K>A6|wtHI;!_KNb|GS{r_OXlulT29)Y zQeqV2oeLM>3002?EtTH%76_o8mf{Ak#-qP?x7gK6et(N8F-A2#+FkgMak-8 zmn*;H;??D$3RZg8eX0v^nw`j!k=k&V84G)99m@Sm8zVAF`-EwD`sE0qx zZvD!0jDvk~ZCe!qh7~4XqoR2PBMSzs{e|~j3^eBRY$C&VjseZn%Pqfr^Yj?wS|l9Q zoSeuN_Y>WtSqs(+l9|?AsSPXSKcz;r`c7px4Pr{NuumKT1XM)z%)*gHvx{mJTVu(v zYJXe1IiEp0ua66gSqcJe9!I@yt4UDhb5r-4Fks^QY_(hg9EMy~E3Gq6ccDb_hhaGi` zZcm(KQq|d^CD*U^R%3c4XL3PEsqO}^Nq?J~()p~$EKkr6V4lN+2554F!6JpmGZp^| zvv!2rUTM^MLriXav$vezG4i?Agg@xf>nA%YCy6(oc!O&0w7&P0;+ELls$ssNl*Q-E z@+0Hxsx23Q`@Nb?Oy4b;WQbFXxv{V4RIT zF~&b2pPPE#Sv&v4GWcCtRqe4!%hVhG;rhc==Z_Ae7UQ@#3FFYxp&oTH9)-DIYd=bJ zS|x;Ry1HknEfysd*GBPuauh~8|9||nG<;ps!0p-nobTMHK~(o@x+nPU)a{G!a}vw? zUnnx=yid3Jk>r1B`1sx-G2^9m&OVmaYS;h|>u9E_YGGBO9GliVwH6xU|3Jd~Z+16vPGVe-XVgwinkXCeNvrq53*TxPKVie=qW< z5V)7%k1=(BzIz?C{<^evIn*>?Svkh-gq~@M#E)&@iCm=0&G%VP*PCb zez5zZRsEu)DDh0yIZxPg!GA7fpdbY6k^FsU046}$ztbJlmD-xFraWPI8MjZ4Fc=6F z25F6}e&+l5^z(?|6J%@GaNsr1h8T`k4ZXv*yY%Ny-WMew$?_j@gH#|eof;uXgba`K z?;bOSodC0H`OeAjzSE=0b?$;m!%Md*lR48?;a3KWpB>ALSY3YDl&?DVla7Ccxx9xF z>1`jZf7?0Q+c+L0TVhynZ(ka?+@EzhQ3a3km%(5}ss84Y*$qu85Rrgnck8Xu zJ6@#dacDX3Sf!XV(c7agz369-L`Gpwr$(CZQHh{{~{W@AfYII;v{P-346UHl>#Mh4w}JEO^=D=@a}(LtE?Z=62LLM_ zMN3CVGow5`MI>Pk|NN^yvDsjB=nSY-(Au@1O(P6QRn;Ud9U!&}DIYECMZ(O;etVU; zn(mKvmxYbUDFxQ}>`grOYoDzxK()8b=}D_&!7?ZKPnmyG0Jk1YSFUM83@B=+D9q|5 zI5*}VhaDu%YIWB-tJ8smP?!w>@W6PsBDjC@#0UTs8k4kz6BbJEr{m7M_~TI`nz}~D z%*aR~Pcbt|D@Q>iCn{mveqhsZU2!0O);#W6*5H3+-_F-qUjT9`gP>xd|K?0*;t0&(%*uIzQLOKufrReenRFlrnQIiXpCMuU} zZfAVCT>OUmQgeZ%hNoIgDS&3fd>o~q|E)}dhGJ}7Mvi8DYIbpw%IvPOdHYvL;mzr) zx~ow5)%mq?Bn0oO@QYF)*3A2mIT?&RB z7=WG$f3fo4ER9K0$IZ%5NXgR8Ptweo?=jwG`E(8o6v#Ti=BZw^#pbe_;{yPY;J|Ct z{d*Awm2Bk_EnUTwoA{aY3d8~~+0(1QQRz56fb%gNFjc(A?BU&*4^ zaeBL3*HXuKI-W_&--!VH=pxvc{2LD8RC>P4huADRO<` z0LIc_4*%a7_4wmP=jQ2^Um+wZeW8D}3v>EaZd@3KkUIX}(UD0iAnG;#ZfRLj0dwC! z@jk9r&9s{aixYAK_;*=jXyLvt?w%F{<)T4}o;?TL@$1VVoiRY5;N zD?AC=+}z{K-0T-_ZEsx~G`iE>Q-lmA@XAsOR^Aq%;xPLGIokOiQ}p9V?A2U5IK8bVfunuve+H2NxzaGk2uZppI^}d)lz)?-!^#3ujkhXeP{Pqv*vDu#h>gs~qK+;?#<1lui#Kk#M}DCYVO=bhO!DgbL6ReJ@hCj z={aAjeW{1KdZV@g@MC|ZV#P53R)jNT9Q=QVHI-=ZO}d`j^{magWRp^vZNIBL3H^{n z1}0D#`wy`+-VR1xSDCNl)hk)Vw^){Uew_O|brH^|wuYYm>0u!E2R87ksgCQ^*sJ-T zOeTnGq&~e7KsAS9Q2T)nGV^nXRB!PR8+cq+WcM7GWg|@Nj1+&}r2IVb26rJcht~B^ zzrI<^D#p9L264V;lt3er3Kxo{!em3qAB|vmwT?y5^&NcM{fo*F`xpT<9Tc7Z=Nk2x zY4tIEPFKI*{k20@OL=`ae0}<&7mlb5`U+a&Nys`A`;H$$`+)ba`)Bc5akxA!n(R6& zu#8etTBa7Tq;r48-=Kdw%{RR5ZJaLa^*lIpCXo&L|5v1&Si%=Y;Q!KSj9y}T@jr^5 zyuVLoBAs?We9*Tmbt!*rr)SVL!w^_SE6yuW30ToT<*!yfo8%o|ch*dk^}g$wxfaX- zRh84URB|%&(epFY)8Lh|UPWr3r>VAmS7j$8 zWoA~W$E1JF@3PQpv1i5%)4I-lmY_sGr)rSVY1u@SH1iTQlc3Z(#BZ?=m7=X5{bpi& zpQ#Dy-pLoE$pOZG2yGhRJ#u*ECI9nIX!j>&A{PD|5dR(^g`+H^$)F?k#HA&o16Hir ze9R*jWX|m$_aJx}l(PweKQ)XN7&(1fa(gZ8J2ZctCZq!Rr%YsEI_)v4_u|UAbAVcQ z+%br4H{wW#zy{gINCUlYhuxDZ=qn72KsU#`DbBr>G6mJn_b)6KLa#%>rv&GHWtKgR zm)EAtdxGak-M~GitXwt>Js|Wsl>POx=L#bBZ=*0Sq2FpJQ)1jswmB(CWZS zt^a>aKs8SHKNASvb&k?2kT`5e7yM>a{-a$+B6{`Wk_~n+-O#5olZ?L)(^lVkX-WXt z=M=)hG?G;k6$e8I)vi7wOLQt4&(O??n!ywOp%n3@+wTt|FNT1*0nNpd*Yf8$$*lxo zTXaC_Lh7m9aIFB>UH@UVv)_Z5EtFShGkt&kx~|NX?ov`#@1wx)iHdVt zY@_uc2 z$bCSj-}wC?%ry4HR)2;!GK^GsxT8_o4glC$T_w|ie?WO@?3B3&1ON&QSYZ}`@}Fa^ zehx!W0PtBLr`}{}kDO_pOFJBKx1T{;J=j-D?@AfaeLu5x;mqtlx!an}PKA$eazwjY-<4Ee zCLhmIpQdy%NF*ZhEYB<}zC-gRU#V^5?JF~Ivd>QGe+E}W3ak=f?{HT9;w0_sr zQmxf~@R&8F>*}brSum_^qZeLw+DEVhlwf*UPhXU>VH~e49z~gT*v-?5b*FlE{L^pDWcAm2VH%p-p@-t@%xB1Z z)HL=yap||cnys@5-_~nbbzpztj+FI!Vq<&T=e!n`^jTHUztq@H;c|JYqV%*)JL3eu z+r4aGfxf=2__FQd;b2sQ)D;bi%0F)6N2O}Mv|?2E-}cmOa$Dc%81m(X!olI+2E+kf z(x8oO??s@yYR5fEuWG~azuk3?^_L85UE#|8jluK2`QF&tfX#X|L{)!nS=a0^WGl>6c@HD=)S#~?? z`vW^M&JqrG_1>r(lce$RB3-X-{co4dsS&#y9z=K2R`io z;dZ5ZLQhLw%1In5X+A*B*|)`2j4T0Q%V!qnXR#0+TQPr_QfXw!NQ#x>{dhhsop*(s z_6M3j3wKHnD$OTbF!68ted~ZG&BiQ~qiCa7p;q@ZJIKIBG{Hi4@AcaiL2eQGxT7|; zv0zAjEf)1;HROYVmkk3|9aR?S5=~}>srG)$F@#FpHaaK27ka(KrW8PgD(y!rMY;r$Wzlk$IFDXxUru+QD??R*wveq40w__<3DB|8Fz;2Z?y!UbDtNGp1es>xe9Xj#y(?(l++%)h|65)S6Nskg-jzIz5#=_g8I&5%@lUTE9 zf`mT0Fu>n2LEte0&y&%rs_623jGjfmDAj$eoT2yi_j5dg>l3i>X6Y*MnTfTGkmL1n z7`>M3Jwq9;N2T!QZrC_Lnj3l;!Ao2M7h{PzDlQQ=Vqh6mno*nkzNtMS-S+$Z>Sj);V5zu@h5(=Y1rJ-DQ2O=+(09hLhvP*?_1i!0e#|P zAYq!*I@(N`ojk2w9GBnq52GvIKo|~JfX%9zwkLnY+H^E~ z6a&Eh>4aZc8)+OMhwRu^5rYx;QW@XAR;Zw2AT(vk9RAfUX+3F%Vge!M=2`j=on+jA5kOXlsTX6(Rxs z?b&JFG1L6X)*^U`d+gsX(5Dkt%M^9+D)qrA{*s4*!O+^Pq7*CaF2QoNX z-q%Qt`k>I^k@d<#Q%Qg8$=x7)x8SZ{s}arcfk4ZNi{-wky(?OjV-3S*mh;<0J@T`W zu6db{=NmD(*L>l##0!&rIB_I9k=)1BvjlF|;N_e?d)~V+t~&KQ24eZoPGSCSY#&A} z=@9HR>l`PklV^CRJ!MY_6;z1Ut+RWwE^(T_R#^*>j_@3Z$tQoZHaR=q+rtpJ_bBqj zFIwmS=1I_ps&gstuPWdO+?Y?BzzkGp@JLI`#H43D4Cof)D*ua$1UHVOgbG9dI+zQa4J$XZD!IAqkbEz-? zs)vKqyT$$S@)>`8s$HiXk`R+F6t1r=bLH@Iy8gO|4(~4ea~ge~Pp>>C#5yr`%Fjgp z3dDN5o1=5a%qlN-q+2TKjX*8Y|pQg6&+uS&xx$$HubXf zvzsNKZV!KV&xaG1ESo@aULT@yO1Ml>=BKlIXkI1m(DA$=5?N(8=SfO{wp z{iO&NQNZ$OL1Gze#P=ZNZvKQ2L|_}4xlQz<6UIU5Tp#25@W;U9=gxTq9`A7HTa|W^ zo;YF7it2?Qq}K7BU&P=z3#7MiOV{$vLpXmm=hC>|ko9t?8xKN{Or`h~+$i|aQSJ@! zdjDQn8Ya5L`j*^I9GPw1hg&^#8yHdfWxq8vC$qrx7bM4~zQpN~z(+d68F^s846S>+ z9?J|G3MJ#7I*ch&XmAU2O|7wf7d2}!B$!u9)5@t^n1wVVmy3S{lQE1wGKt(oQBXXDy4aWu$mGxN))Y-%a7&P6 zyPu3Q(r)a*9EK1R6avcvBdAbWTrb{pi0LS6Gs05Ujik}%{PUsw8cjSSL-x|#&o9_@ z^^m3nat0HHjOXz8G*Dn9XICax&0%of#ByEOLq+lAs85&+RG&kCC_BG6kSl*KD-9tF zXc+Y+XpjS`w;vn3UEHP%zOVviiVI=~o6Yo!HjvvK8#bU-Epu%qim}#*=-1$E(@AF| z+>?0>YHi;zIdej8=y@2XLcElR_?dk_F1m%6=%`m?Vf0uiVyL zo1oAITpF95Vk#`yYzvl`=%#;oY?=;{t2BU`r3y*F<-y4$E;4i+!CcnC*V4DSCZ-)a zC)8;o$Rj##`jjlYXd{&iqQF?%+>`t!dUrz=GklgIamc1puT&4_L2E4`wsuvV zGSltsB8zA}7?g_U>eqlcXmA?ri&3k5bjbMT03QNlT}x6y z;t~)7i(9XU^qP(2dcYJBN`tan%_rB1w8BW48DgzdNl{iRl|F_@onA9yG_9JC!ej=h zV;^G;7=gvM>jWYUtP(|a;cgfMxNP=%p}DB)#~m-LP&q4T^vZwYIXoGC8mx9WuU_mE zMq-6*P}{Jktn9_U?0t|4S-frX^iJEfdegRk4tkn%!}YijU4cEN*Myhiap`oBs#Zb~ z8$eWxEl6@$?x7MfTGQ$;KHFw?V)Yyf=9ke?F(f8bj<64&U$MO8^?e;n73& zxD36`J@*&5dBuNhbDfYS>oC~|b04vzP()i{bsWiY9wd1TNYj!GY7>>o)V)N70dj8$ zE85W;o=c%t+l|yfD#Y}V;EoRRJ9h`O%9GYLU#URl=a~1##1FKFN5&pJ; zeJwkrgZDB_ zGeia@E-$8CF%FLNAAo7zKk2V2h}0CKasr^C3981D3HMqReI(+>sOn<{^qW@I*faAE zgF(~sGC+T;JgO6WheL6%ujBHvk#TWORMM-cB)5M`!+=}?8WSbyY&qwV4EsQ|vhT3b z#`*;nX-gNJ#^{Yv4XY)ymx_AAvV9Lfjs_X$PsI5eY zlklI>$R(Tvq-J+~;2X|H4UReM$pC!~3H>258#O(18qmtOr+|rR1s%313!%xPHfF4!Bx{YA?ILs--s6VhDs-m^5Ikwj`xND{ zq;Y?}$B7uqXvhI+YayYr=|p9qsUSPOe}y;^A`mIX@*e@@TOE^ zbQIT&O5d_Xw_jiCTi(6FMhEC7_E_k+wUV*a^oDa=r zs!!u-P7WQOwh`wNZ~f(@(|Wmm*DV9`-0-0KQj&CG499zDV${z*^;KTLSQz%yM4LB0 z5X*ND{lT#hMd#aMulRclR%ybi<&Mp~G3i&`0)a$pbR=I-aYR#FTIG>`80G}L@MM3R z^%G_#`_?d0&~BhW(Ojkhrl?4lWWi#wFxQZnbedWpR z-BV2=0@mKDdf;}eF%=hYDH~%aLZU2XQGyn-DfN+1odBP?!}Gjf=JtK#z&6cq9(ri9 z)XtYvf#^(>!C*PLT-PX~)VF+QXr6yg{#}pPVvp7@1(n{7zgZ?dyOxy$Voh`s^TJ~yJy7XS z^=1U(*xRf6fK0SDA1T9E2vW!r{x^-_gWk4o{^**EL72o(kWf)=qdE;HS2=&p$FNC& z0ROjexsVxc&)fa7v|(_mrTuN*P|^x}zaqt`wAzO(Uek^=i?h@zrzCBpHvqoUMkQTb{ygks1GYp*vMW*(Exg+Ds zfo|WxPTclSNvhPZN*(8-IKY2tr*xqDh8)yccu{m{ffk!A6*KZds#S6@S_qP1&c(`R zasjk^(sbNwLTSV9B@3x^^YN;QI*~;a(i?vwe-V^ilUv?!WZ2$X*D95$#$@s)y>-Oh zIFQ92%YU9c-wIs|aT2BmyiaBS=6+af#$r$Rv2;Rbx4X1nVaAR1Yb0DmT>eY)dMi+kaj<09F9hx6N znouMPS1_b8J?2#4bWnd?h-ykW*sZ&{VRcS4BAeafHw7iuu}JI`$2NGi;_3kQ=7|-u ztoLh5iS1@YwigaJlE_Vw+zK8+aqg>#fdzGGqWCsgdl}t(ck4Keq_xjZROXis(^Y0N z4Ur>Vw$3LLD0+fF;a*NDO!Z?Q15IFaq+%r&M%F8)L4#gwDye^Lg=aJF&w$&i+QmyO zlH#E{_bh&Ok3bLpv8KsjGjwl!1Mol^vg|^jPoMBxwaDz@Fi7c>4gpr0BKR#&2=`Qw z`3$`(8Ix*1K?G`2;hCYUCA64$57Cm9vmx{2u2GJNgAtX&ODiM4d?9E^6vyhQ1~Z@S ziHYXD(o)ks22y{h+!Ych<3&`>%FJzR1+w%zrK(T%TP@BG_`RUX5PSBadcQ(km`0>l zMZ>Yx8E8TURk$@>^*Jb{HVw{kp%ONMenTFUDIXqBmKKlPSkMZdd76h5Sw-G&m%f0J#JDHyFVg=CL_Iof~cZkgXCMe2H|udaYL=%ZEX z;0JSQFId9G5UgCMuyAPjw4ZJ9s5pVFn#2MMjokfZYJl2zF$E?_;(&}B4|@um2q!B*DeMZX-1N`Cim6`KIT04IWzt0FqHZZ7QFC~%o!p$bbjjs?X zQ(FiSxubw$c^hdrf9?3kFep#DgiKo}D_=W{CX^{#&<*RQeV@O@u-!$3&7D6w8jNJy ziZN6xZC}Lc0g8lCKWCeofyUX&Vk8DLh+23(p?CajJWM-Bb%nWyoa7&y#-WB^gUmK% zoUeb~@Ka@>`HOr*e=V#TiUxQ_O}W$lq--xAJ+$7obcyljugt9gG&327SF0;BIhe*0 zY7PUBY4dxLb7$Sv(=e|QvI;#ax(}Xp@)~qVq=pi$B<43*k33x>sp>qqWK&;EiX{=C zF%4`aRoqij3UBg~FW0aC;Gb{rauZ|>x_5svF#Jd&TDi|iB1JvCqcodJc4Yt^!v0&O)Zo&nVWX<%Zjt1nJ%zcXQ{WRcQpzMj%Gb5HB?j5bitKoj> z8iPFR_7HnZN-G-UNXGOAMpCqAUk5{}v?~0ly{ea*W1=LC{Xb5~52jE~hC)QD!5!t5tvnKA%Ry#G&PwuZ>CEagbsYp{_0k3~AIe#Tfosi72yGo0SZQ+1WT9 zmfo;*_W&Sqn5TIsJ3ip+iCG;}P<`sBvSk!DgVN)#zBCaLdR~>IGJr6OhY^2a@#!oh zc(ogJ&^~4g_~R(x2TWywp}}=pBzhUc6+!gv;k+HL)hZqMZ?XMw?84f=C!$nvPhNl3 zg2qeM;3%&zSwG~`Ta5)HJ9lH2k;oP&Q~DJb86P%Fu;4+JIbTo^#_*1Ju_JchGCaOz zI7^R%9qHTXn?w5H%Yw}_S#5tE7>56`?U8%}jWWsl)+PtQ{X#=Yb~~0|GD7P+%0XmOXn#M%=b>v(LI!@ zpe9Tdiq1cG#eVXHpS7|1Ssst0$OO$pzdz*#2y7Cxl-T|?GDdRfd>Mbn{P0$YY^qYI zb4xdYWS>~?$MRPp$9js_(;I*k`=s^@ev#~g$!T?{KBz(XldkSsqmrSSPeCV$V^qLO zhvJehWhHr(DkP5UTR>&r*vAIZ$PTV9REVm1#UY^+zhNHvG76OgJ!val5&6-h#Gz= z(|o#vV}7w8!r^w=Ibf36)6Wx@M*I(77BDW+Z8VBJ`6y<|6Pn}TWTT~{)(>E+(`Q}y`J-eb@tXNE2ZM_Ye|wCra4YSg{bKm$G= zZwGEl*o2o|kev9D08rRUE^wI@4xFr+McW{fj)%>9axwRiBIFxVa?gz|%c_%@{&hf# zBzYx-HM68->u`Q+VdTQAh+42VGsinFc99Ee_r-(Z zjdR=*!H<`gnB#6*2iRO%m@Sky?ImDZl-Jk=8WE`LjnRKoY?FX>4k!=#Nco#TBg++A zb(S(>B+0V4G}scHFSh9hO48IXSO=8&^oR{`%X?U3arw0SHE%DGH3f$UW2#>|^Djzx z*-dozT!wh$zIQ}qsI4B>tz@+>(@bzm=+`!QUs9`71AlDqOP=;K&>5MK`f!v{v)z^! z9nZ7G+kbzFuu`EF=t3w#2&}y;0Frv^il0BAU{%#Z*kr-YWLwIDX&G;Y|KN+yJlA1J zz<86dYL@QSS{$QEYebP}!2Tsgf4m$kxQPAj$r2GH(+iQIvpFRH)c?KDci#^ZRg)i8 z)fE-k;_=3u{CE%An@QYX%k?86^7~_)AmbTxd82=Dkp!)3{ezJ%qO;aoEDvQ$f2J#f zAK>F;0jv_-7mGSf^yargpd+zAW>OwI>zeIcOuFSaatb+qtwsCU0=sx$0XIuyNCx|E6a7Id?c}zmRPJLf{ zoN#|Y7ePJjI&&3z$&p_Zr`7&Rkx2UZk#}5+1GQ7EnA3=cCqIMBHS`tB%#>c*3w}o` zs&?*L9s1&t|es{i6q>K9*ei%X5Q6+NV;`?F=4A2U$fnu*#%c81xJbR(vC+<$}}1D={Cn??}p{7 zhVvs^F9STD+lGuM)So^H>=U44qc(rYr<-$M0D9Z*g_1j?C$WAaa`540TtGb3E4)-C z%T&a=4rk{UQTxc*O|JX={zLkZ`xG_-r#?3~)LZh5R!S;$&YWNRJveIg8gB>}A^|K} zQXh!OG+GZVs^YQH5j;u1^i9yU3A+M_{AKbjQR3<$w-qqibSLD@0t1i{ivE8KMt-LA z@igasfbf<_G`9Uv9yyzBk&d5aVx>%>u{ouQ0AyJp-EGYv9yz&Mn@-prh`y)l1SM42 zCL#?vR~x7$I@mSUx?Km+QciC8D5)WtfRfc_V8#H#S??b?b^y+aq?_YW~48rsN9;~ zUViGv6tJ(@sNj%wCZueQbW;Cxfz1^S^;=YgqLx#+33@uPX3xNvEf&?|sm`m5kJ0dD z=IQC;s*Hmt;NahwF{mXos@L^<8&s+l8}elQx1rWeQr>!G>>MdBLMwkltD!p=g{h>Q zv&v@xCjHBMravvub!DOB=_Oi|PV2KBm{T2*&UT%gHk}?zbTM;&zX7rx4Y3VKH@|kt zos_$Vh}@4#$2BF_ZMK@!)XcgI`B2vn3+*eF<44^pNS~Uask}3LSgGEs5U+D8u>qG@ z^NZS;4u>0IWIx6=zL0-kN2OdSjV>O7;w8>6+4ET-$br9J26H$K%9)FLy7KHh?4y&% zc5U1j={hggH2aqpPKHCD@c5#3sOt;Om^g|9dNpoL)TwhbE%ol8b$*{3h(2o}`9JFm_HQ)` ze-Gq7rw_5`21>w+RUAq9n)NbJckTt(m~4nzOKq&{Qe4CJHOtxZ2GlOJLV3rr%s{+E zx;P$UOY04k0cuHcBBgFb!MgTQyGt{{%nVowZpwq>$^f>S$ZV1i|ESx|vWYGlmW^&U zqF4{g0J`6jyqkZJ+X5CU5r)1r6W~XhWjR692jt@M76sdy3Z5Kbm_K8gZ`^T6p+=fF z3i1T#07+9`x>7Udeo<@+Rbjb^z@;(3&=cW#aN{VPxK9L0!e*v3%qFi-iD|Wm9LDno z^hmMvv)4dtCIr)2gPwp=f*{HLsBK5GSK54_Xo5b3*hha;orDS-!6XrVwKKTo`b{k} zQOmYglN?y4qnnf0?c{>`akZI&4h%2+-B#rSq?kNbW0%>9C*5_Ja~k0T^<1u{UAHN_ zLi6x&@xr0H^pS581a^vkbdIW}ar&)14IEt|;QAaB;e#1_^(HMIiD8;pGL^7Nwr#P@ z9ot~d(^7x5Os8C;mzBgPQU;=iQ=Rf`MWcsmQ7y6L;I4*Z6e}NqtS!5h+v)!Gc=3s)A^cgfGf^b!>uwsa|ALm=qR!&vc}VA)S?0 zsua6ERaxUY8W>4iQgFT$3lIxh(gGj511N|xF9u%MIEw}XLgcrILwxk4kq=2wi+8wx zGwXkH->!&8T`>c~s92xdQ(+jF;tIGxdy(zN!gi`tCC1%tFG5%zcs)YzGns1*nzsZ+R~wkROp zROx)LyFW2wa||(GD|a{b^C$+F$IrE*c$%G;Z2MP+;L$SyxqQN;o(K`_&fH40gLTZAFKc}{yuY)I1QDS*2pX_B zkU4cirUAVi66BizA*WgiEm9h3yIY3HI&A0qK0hCKS4oP-a15V}2^F$9jj||NoH2i$ zSa8UZTAAp?gm4~i;zcEF>sWvp$b2+;yos1GU%yqA^!f)Q9FG6uw;Zt~A>lCOL4|MF zrL8~6TG+)zaRnZfpMnKBQ6XQm0|7%JN|iVJE7bkI((wreYALI58rAkK3k!v0UhaAJ z^Dm)lwN|1RF%uMdw5rL_oVG2m<&S^VNw(al&7Wk`>ps*^99o&MU-bR;^7H$Caz$Wb$#4dA31*&bE$R*&iu6&QF|Ut4fKZWc8>C2RD8& zK{*+}0#AIV%8_8t$M+*~FULTwmJ(U1CO1f44Y@zgYZ$i{-;a8Y4!=Rjr|y4pGQYmk zzcUnKh%71#u&6^T?6eWlXuL5-)GT}(zz+r)yg|0n2zo{m6Jfbze10=84?rU1?_!3` z8Ps>PIyw{!Ftv3x2N%Vb1QVplkCd@+xrmAMQA!`VyTkj8XP~GfZ*bd z1BuYMif7L0RLyP*AsRqjq4<%cMBew{Oid zD%Mcqs%q<}(z3l*cUOPvA;SSJ!YM11AJLEksoaya;~a-|k&+URup|5FQQ+D{s!=py zT)z)g$MEk}PCBgGCt_p$q*P=aFGDujL$ws>?cT43AMx|}^{Y`^j*gkGntkruPWivy z4q*bH135?h3^;|x@nS*~t(WQG;t)EU=;!se4F<;Pf8Ntjz7m@6D(lp?2lmHMY#V~pc4HZ$7 z$~CtBfra}-2z!eWRVrP&BJc$-cif%^*CjwmcAJvhc?iy%sMN6}_))gDzB3P7a6 zsJ(Z#hUq}IT7?itBiV^OE!76z>3vD6&G5-UVidC=Ds+?l^AgDJFl;R^KBBw3=rtXF(D&mes7(28N0*=+4?Ox+ zMzmU`wrfYT3h`Yb1Uz}rqgPl`x|-El)RgCYPM2)BWue5dB%sGgMPG8da4uM>@Y8p# zC>rCmXD?`)oAhgxFElNU8e*NWZBEI)V#>AT<>G(WCP|6(0^1{?-bud(xJeHs#+c!0 zQy2z&$v^eOiEgReJmk6ynrm$~MF47pkgMK}JE!;3OE|XX6Z?I}sl9_N?;6V4y@8;n zr2aak6M9v=^aUIJdm>OoL`mG@f=}@+l$~~|1UmvEiI(;Okr6oi{@noef=d}xA00si znu>qlS1Aq*UgO(KD(FHlzwv0E-SYe`GXQ`qKYLl~G|P+BjbCeM;A#%#OwQKKszx)P z40MeA=J2JuuiGQ=6m;Wp|8D~1pP3-s!M5NGHwTF9x-S84iB69EdBQAj-mp@^&}~`!3(S`{jhkS)T8Sha zug`}PLMtioc%UoV2PvXd|^_`-jY zb%)c>;_Q$$pl46@C7Sw2#WC5hSh0>BcDWx&fxu-~JFTc)p0`9vpbJ>!Of3X(KHvn( zYcw~cKUSWVUz4&cAUH>uw-Ey?E+VU-b4Pzbg6~(8 zS!9>V6g*bClw@a}4vQA}O2I=>sID{im2fo83^yGl?t~EF*LD`N%IA~qDE894dw6D~ z)*wm$zE; z+xW?ks)GpkPYoD?xs<|TWuScq7}JSv#oGik%-Q1RLSRJ$K>94R$1ETWb!4ZItmcZu;(D`4vsN)e9E$?--*r30F$5zU%E!GghFWN)9wn>jHXCrCT68S&>QV$M*03dE^Yi4Om{GJ=!68Bf5a)7F8$@Emhb&rBo=Sv~%Tq zW`B#B^sz?bYk~83#eoB7CWn)`xsyHAV0@-yW=BsagO7iuumOMC_TuQO8U>ZQgLBNS zO54@Pa%fc#tKse;6RZY1^9gg=&C3>3bMtzs~%9#=c z_7-LE$cnYi9|T`L@qGRIvfj()z`?8Q?Dh)Ijk*h@td@CS_er}Rf}Og&ac)~(+YnN2 z_nu8yb3SS6g0uz7Y!|xecHUOd8d`MrXw&WzJFW2se%ODR8nmimE>7JEs~T%kCRzOS z-RsFMK`!#C*8{Ci-TY65@0V%JC&M7eC@CHxq_v=W1E zijbBm%NISa;m1wwFR&b^!9S<;YM-IBe)BDRKg$PEc3{-;e_w`)lf=8$l?P)d`Fwu9 z{^s$3tbu>;q)BD$xz;ByJ2>ZqNvEfjh?;}+62sX4Ib$9B8EtciSKccMz4q``eTbu} z@xd}9OF~A42X?yCccMRa7n(}F$c9;!EuErCMm85q-9xm$#A7fkDPR(akcTO(zR=Th z4;tt&E(!`?8oYIE+s}>gPK&-Arpg>=p65D`JA8l03c!ViGgY=o+1N5p((|Yo6%DQ| z21+8$-$EtX7CYBqsTv;X^2UyB==+&ixK*L2sqA&wdEtg#33=Rvu`UKgFJfm&6yYW=0ZtD;^2IY7q0mv($%=G?QNEvtDlOlHal(VEb>G(7IA zF;JB8_hh+KZk))3=P8;QU)F824QbC-vtqvYOSg!maTe^kLGDlsYqc?$&D*fCMV#hRL|Fi;T2?(N(k^|RXL?FgI*>$zdjba8WVt`F<`83EG zN}4nXN3l_hM^8J9d(!qdoXTB~Ut_XvU}%L1djoBs@&^FVmH!q}MROF?(otjX%IEw@ zSY?16eO8+GIy-*@BaP`imZ1z9@+cVeG1tq@vm4)CL8qcb@!X;leb(d(R~j~q@|Z&46|6GGwCIr9rvfVmO(GS_ zJOi&NJQK@6(>?@uDHBj>We5l2b4${mCNlrF++0f3BADWZSF$xr)i=Y4FQDEuWA-F? zJEhJ6(;C0($xZ#Dqv3^~lai!`0R~0Fh`{0mzw8#yi+=p& zSuQu-l4R7FpN_n94Q>|ZEfbVx$dgybx&l?r}AP`q9ZXvmp!^cx$w?c5_nr;NXD;H#jOlg|@Dt z8GJK0ZnT4~Gs0HuqcUaK6bsIi8akR3ZHqT=PJ)Jt7ZM6iM5ZDygkEFt7^CeKcvmyp z`1fdlkzGFyQ?#{~#S?0~nSVEbOD>Cd^IsSp=oq;7W}hWh!ZrlzD3CMVaw4*ORuhD8>DzbPS1qwdm*R# zs8Cb|E2y8j%Rxf@ zUvuXFh3J176Xt(^PV9Q{?=9k9c^ay6jzAWK{!1+s-nO7c!Nz5W>N<{Lg2|+G3tql< zG+U?I8C9&Oy+pU=HgGVA(uvz&z}+ETT^j#O!1+E>tS{ifDIoi^Ny%w_cVvCuuzzT= zqImOl0Jmn_?Sb_lOGx5E&*Zh?J`bm<%WtU2NnRLes}Bo*zHS87APc|XmRvHXFn^oR z^Ko*H1u|I0<`r^zgh)4gs>l&S4%Ub@?kMQrR?O7gH#eWFB=>QCz81Ljgo-tt*vm1c!Lom(>3M-oVjSF~W= zf*wCK9F>|Jl|OcOz{CxN!P+-+^P>^Q!y;d^zIf$-*@+2%N}iyP4Ph&vmmIoKNo*_s zV}@`VqaoW`Y+Spt-xu+ac`W*ygy)n_ZK1@fn7C1e>8S3ATP$7mvb2rV8U_w1i1cFrP8?|NeuSHofUhn5M6|Ko^KcWHZuG!%{8O!VmZ^FItOz`wtdMpjENzN)dF46!?Zv?d#uPv^JbFG$WJje`yiuRMG8X$K$+ zO7A5-)_HMz^3*kHCIQ^j5}61hgw-NJ3|M((+o(1fq!7d9Ex(+OV$!kM%US&6oB^DlJ4s+^$&(%b3@k!s{7qR|&7b^_^*Vov7jN~%$%McIz&X1;j+{lgxey4B~bG~D{t(!L+ ztG>n#=Etg{AnyQ^7QgA^ZD>sQ?_1G-w&Gc;!X<0Kj@`|9llin4w#B@Ofs^34W-nZM z)2R{1C`z}4Z`qTxdOs3ma?{pxXbhAm#SR^C5Sx;O%SVfPw(X5t3r{s1cd;Y#!zF|C z&|sQm`e>FNyiY`!qJ~^n!}5@VtdN%E7*R%3&Yz06F~+)o({(vsJ#M&)hQ+~uvuL5F z-W0i0PAUm2v1=cXX-vn%y_f)Rrg0I&~GNcG!!(^N!Ck&c*pc#waL3V2|qww|V!Zv_r;A)+6@imrooyKy- z;N8??@qw4gIATi+mB>}Lv_6o3cX;#nby+!>>Nhp-!%J&un)L z82{)Ux%cWm>|kmwip6E>Y+QZ}!LC;bSUah?28)MFG>Z0cHmE-yUW1JR*%Ch}$`KE+ zEezZSc(Ocv2KtvYT&}wVMwStHu)mMaU9}J2u1C0qn5#c7>hvv`96>rQ5Bozas__1`3W@7;E(<@Auozus~=6Kv1rcz zwP}ED3l?_UY?^Dy;$m{A)!!*T$}8F9DRUli>QBk&+Q2edErY6IhcV5v<-fZv!@yC0 zbK8Rs%@tWb+im^cmQE^v&-pdQZJa;yiOy>NRqCf>)$L_8Wn4sm!f=s*q_qq4Vv!jQ zlJaegidHu7CUhbKzpA)GxRaK5GbV!^{mzLxr85Hy@MJ(dJRH^%{n;2}y^XENPG`Ah zFhk$^9Ou(Ok~h*&-V||43}c|l^b#H^J95lb9Jw>VtT*MvifUKa_h`dIekZ!_1s~|u z)b>0Zv#mT)MmLCm&L?Kk1;7=GnLb;y(kxbg&WU?Qr}2v9riT2C4?Wey;!|pk2HerK zprb+2%6PEO2jvVYHTp>kiKuyc-j5);ORZs z{W7IY@m~|E?zAP}W;j9<{0H(kQY{|2fx{{p!@|%M6|1#s_Sz-n*k6++WF8$1 z)=Dg2P|hUBI1F^U6sZ*LP@1?VEDF~xGg)afGPhs*i&b?`n^a`#yu3Hzu9;+a-=gdg zudPO{8h^_(k>})srVQGhRQr)Ujwtq5M$6=&3iCvNZ@v-!CI#QX{t@Y#8zyJ@r%7Iw z1QCrR_Hr~`w}MbvcSNSmkm5nC=N~EM(6$%dWd7JxkSbpL5=KZ4fCJ$GGrs-9fxt*g z0^iiDFS&0B0mH7CMP=}#WX zTYe{h)dl&Mn`m|%TjCp0V^6M;rKWc?od?qflC}2EYwK6V^RQ993J_-j7guZBg zinuyRBlu@4WW*NDU+*9yhIMzlA2uv7u^mH^)5EymTCV8kS4*co6x1Xk?~Oq-Beqdu z3#lOt!vHAr88SvqQoS(!Iugbk@*_;sXIWR_iKUUitGWW-&Q&$G+bgl`D&B&B%@`I8 zy@-3JVe?`~40rF0hY*+D%M_wgD9#H>#!N;B%nusLze%{4Nb7X<|G|qW-(}mXca4fk z$%<$%iI#L^pA}L3%SdixHJrV0DMhO>!z8B95m>GGjyYjRyC@K{b#o#o`A)J*mP3PS zvN|Q0f{3i^0zws&6sRmdX0BL&UwKYvfjZ64hBT!?T1NuLxmm;S4YlKmHqHJg;^S=8`ajl@=_4)XoW{bvFrCdd)Mh!Na z8%8yuDn)F6WCAM3D;h7NRR;Xy$DpX@qlp9ZwiAHO)){TnytJ~AER2eOLlaBlvI>?B zYz#LK<^{6`_2h{mzo{t{fbD!cj>Z}P2Nj#5N0Sat;2hN|9{O^OdH&KRdS{^@#lKM7 z)n8QP-1qgiG{S@5$TxsM77mgA7MDZ3H|C&nyk#C=f+Y~$D;iiQFMXAa!tUY+mnPOG z2o5)&kmk&vTBfgMbid($T$x1G6>k$(e2mJ8V%Aeae0PhQJ}y;pPNnaYRGtBYa+Vpr zbkxJ=>i4eLVGKT?o?QwV!12V#C=Z zjD^Rjcdy(1y0}*F{V}H7?GNxqU9cRWNRR{(erq61I>0eI#%|YHiAlmEPn5Z54uzr5 z|7Da5z+&@CBN((mMj^9GO8Q9Wd6L0MwsK#Pm1K#34&=EQFK7D0SK$$(29|IT68i7e zK1wEp0Q-mys+Y8Xh@9Fz&vhkxc#~GA_&Us#^a8IxzLW~-U~EhdOrhOaEE^3TtKVEK z9$#IVE@(ZTYyti>P;M@~6%x;1mz2d{PYxX3Z#b;qCqwYd&CfD)feAMv+=AhC$e!*P zyz*DleKpa8`ZV@@;m-J@gFXH_k99)ns zkn%h%q_LYU)_b>3Sya;sn*HkhxA;n!ZJ^?zwtnF^xNjzGs{guruYh-wKHti$jkMg$ z72eQv{RuXI#*5L(@O{QA!nkGVQOnC4g+mt-iz2YzTHTRmgW9`G=k#VN(|{>6jD?Ky3?o{^T7b9 z+E!Jtg~DXC#^+)ZAFg{pp8{`jZ54FSw3dnsE7K_NRwL&;f$%KdmN-&8=EL5Ty@~G9 zOPpTnuR}E&=&Yk=@UiZ43rAUO;#Z_!8;Ko*9!a=FNZP|2wUrMG1H16kM=u#(j^I6!0NThdkUYs(2{UaiR(uT!an(U_x% z2iKaczK`M*1@q#TQ6S{6yev7(gZ)a49FbhqG<+y+v|F=fYR~sp+iDwo3Z!}rK!W-< z(YXkKS{4OFK*+9p4{@?!#7j9Od|UmlbbxMu=lMtXi9`kbxf9F#T@Z!P&UP+UG()Rlp!+i_A05{Y zv`2PTredk*$=Pq_s^J6qcMFcbB?Z{x#Cy(rx>%;({*D|_d*`QotOn1Gck9zZQ+CcOx;$FDRMw5IUk=nT z_D6NPU}p@I#+`}~%gm|fVFM$cj24m4A;sautrMa8b^Dv9BEh9 zz`S&GUnuC-XWoGN3FPL6dafa)2O2maYIx7G_0VC_VQs&DgQt>jRMMb3b8N2BDQKr_ z7I9C0yIK?2^Q*d?M)lTjf~5TGfyxfmj+@Ukfhum_&wilN8%t6GLBYv3Dl$udB(-x) z{AJNa7#W>8?vA;GksXGp&1KcZ* zUWSorQsJZ-5}c`ie{?$}Pd)s9&q|12cr#nD@z4Ce*pN9Km z5k^d7ChaEu1Tv0R!{_AFJw>F-tFYH`xTqRt6mKV#f;}!K4NQ$9n z+u|2z4;1ur6WnfWwzgYgXogO*QvM|ACgm6&+VPW=oK)SE7zPLsa%*yqR!pxv z-vQsBBfw;0t`8A+ec<+g_DiSr+0iLdJ@&_Izcy>=rSoI&_^dAx_qEqH&zJL2^LYGM zB0jc&L*Bp6rf_%(PIn;(eMAlXf}G>z!osgk=bgu2JqERZPkgplo;sVZClewnTFwyR zCPO|C(RTi<9M7yYtA`^*VGK`C=)zX%-*;Mn9hL7S=4uH$Kt&9H505LziCmS-3^sag zwSj=-%T6md7D4~l!0GAPVQAod&)r;kw5K&QZmewDiE_oNaUP{=4dm+ApctcjE+LD;CL^*E#U1%OQOpdjsJYI zPtQ3pwgUbvJSxn8nfE^y0t3IZ+0SNXI`-0Ll>*iKg21kV@Nt)+8$!{KZ)OYLf^BlA zv&w0!=v>N&2_Xv=!7rZo`(osN8J5xh1;g4Oj@%-6ADlln;Ysifsy_%eGvRRNF&D^? zCQ_pKP#uXzHBE0!1ujsV;af~jw8JxR=ET-MFua$UMY5HD<$c9p%{N}1T{%{yd83NV zeo;>W?SO*kF^$_4AEGaElh~aT-T`J7^a!66*Ka55rPe*m3%^n~ZSY`n&qlCE48tsk zJM=8Bu-HKB;E0yMLYj>1E8DrY6_d5mrNFl=x+7``tRr8>p$nbiAe1SXFKb0yH?j-o zz;qeiARZ`x;be`Qq!xm(iq=W`hm88ytvZzKhX_#Z;2va3*I}$?D=R{q`5sR!=_VF~ zQHW+6;_#X(`vnr<&d(<>?^*DydtK8l%(2Z4(pvD+A7Y{ejW`?n1vM?lO`k!pg_blWba(BCwUjC@UCrkTEzVf&kWqkx06*~kD^4QLuv~|u=95a^T zz3cgZd=0pj{u(?Xj2%_grFa{7vM{FLKJsR*Eic?r5W0#{OO3U`>W2o1!&B)*C78tM zJVpzDI|}KXJ&Z(?nCs7b?xHxYq!=YTGREti!DaX{d;IzSV1mhWw}Dz_2*jZbIe&kK~TacQwZ^kLPI8pO1!r zODn(gRN~>$d}=MT3aN=n??VD!-eotj`iWpt7s@2$e3x%9Me+K@U~VJ9fnEhQFh**X zU`j4bqq2|3CC@~}(L|Sg>&N{4@XJD2-0^ni59~iJ!v*F%g?ZXk!UZ{8a|F2rU)8)P(uffYg$EVytZm zLfY>9pw+g0L%4i^x&-d49p6H0>y6g+ntqlW%$N@`J>Cw3Xpoto1cW^^(PP_B{?b!9 z?4X0&K*R}rJ}$oZKT=BmA;?VH5mf&FsFQ!_(odV-=$&Z~{7#tIM6P*RfkK}5+&aLOe^ z6>c1pxLumXS6vu56ZCw$>{9c81G)LnQw0%xJAx;1aB6G$1^M5t=hL3|SIwpCwW$A3 zTl+mWaCm64@4rtxK1omsoE0JB^&2h~GD&&4+N5WCi42Q^kAxJkoez{aPMPq~xY;|} zjn1DeyuFlixIw!8NNhNQhrmtM;|v7-+Sde$mykIZx-UTKL{U&$_${%2j7mA`7eQ|k zOpmERT)>?>4q!^jUcJEx*X&w*leNGuX4w2@U_^%-OeJ+anhGj>G-v zXEx2win?MotFTLF_|?u9HM}8?H%&tJp^I8Y(UUzzV$48lOG*_=3e1gbT8Z14KYN|O z{r7uspugd)yWp~G&U@}f|JD2EL+C6IMd=izfZig*0t5yEj6soqdH)z^q0h|H#&3B` z5!&OnKE*Lz9u%1cUCaxihP_>C_ z*$Y6{$pEa&Rfi;Vd`w)Az8lzp^~@ewpeI3f5>4vUtVZH z2FWb=l|cHEn9$y;nd2sIUf6mwA#x;0P-f)JBn8wQqR2wzGf*P1ivMtr$&@aW#kmS*uOF*IL zI@1@BsD?4fXA8oN!IaMge?Q|{(<<%{8HULGa@A#x%Vp3_+u*xi>TK@(;zcT0Erg)$ zD=N7|8jBA1s7rWba7C?WtaY$Zw<;-?LAjfM&mJ9uNM6{gFv*Gwy(_(n3$xx@EO*|K zI3kW~VpP=tTV#?C8dbU9%8*xUQW-)_2}+}HK`+DHbAHc0K$q0l+cC@axaf8_f@LWz z(g{6>nT8vMp^)HKJ^Ywbe@ci>@=QN7e$g%6AFUiXBe0}SXs2MdPGciEJ!KYcRx5;m zoh)@^i%?=f6(@QD>qOS}iV%KRiWn`KVGESk`-+bW*JeApcibIk5amO#XgFRci)73M@E&*p4)!9)w7*d4 zED%k%Xs8pwk=T@iA3#TJvJ`?M|A{7Jf7#;eUb0u?{)Wg+Z0Ac~D7Lx*!=m9cxRBNu zPTZCkyki){Jx=(HhVSlo*iEn`_~#=+4uYH=o7AhIy9JLLL0<`7w4lrZ>53$O6_-Uh zcUfd)+t~>y1_%l$c&pl>;o??dBv1nAv>XR=WKi5^IBnTz z{^2^O$cnzJeeihQuDx;?T7vNq^$^AEbUd*3d@TTjIQQsRm+8nT?xh=?YqvYvV-Dc5X?I5x{*}r|$U-HK8R98GfFZu{?_xr^hyyRAq(l*><<8ywA|ZMC z6um$z6|A|uGzN8l0KizV90Uzhg7iI2)CqeMmYnlpF9HJe(b~$e-63$k=kE)t4LQ<9 zC+=<7BrIck?1k`xqpURREvbi(vcw{pTJ2JmMKwQIcrwR~ym9C+hG7cNJqwvF$8MnF# z8nUr82pI(I{?6d&!{yLZ?ZTKn>y;)yhZjA;{%qn-Naw>k4?DFm2G{+_;u%q1CBTH7 zDiTdB6xaWMQem@fc$$fQn`(k}CGtoXXRQfPrcrfCpk~=s-IDLZA1Ry7AT-*AYGw<; z>fmIhQVju?W5aD-Cg^e-uJvQp-7YVY<+XJ%@A>#c!Pn$jjd03zW`#ojGGl-Or@D2Et`HD^Mz+S&Qr}z?Uvpz0Rf=+LLUG$W zGbM=qb8i&5tu8C{7>KpgwDUuorSfOshDeQF5@j}KJ2n{t(+L%6PG@`zmxVTh&0%N8 zPbFt$OBbCVcK_2anI>&YI7Gr(7(jWa^l1=0)A_?4x>F_uGf-H1Lx3FnTW*D=@yBhs z$hx?HSckjQAM%kmAVwsH=rk2SEt~0p2qXk*3@PT>*0&XQQ(+}(pSUJ2#Oj`9ew$y% zTtXGVq)ghsx534l!CI-G(`PHWCCjt&p^}|HE*+E7;%k3t0xvv@zMqwWBh>8t`8@5dnPBmVGmCkw-kj=Il(eaLd{(qgmJPBy3bc7#m4m8$_){#lo_ zvGX{?T9Zr15xNY-iPG%hUf{=VbJtX$7=$jC`(7?V+@9kH-5NB1h|SBb9Yq|C*aG2^ zEK}$(scEx@1i3JmDs&ORem#~2T$zdI;yPDB1rc93%0e)_IYT%P4~<6_G>piIWMGbe zIVLa;)*d?@2xjnd9Dz|&g19$jei5Xl#&A+3f*LelwP!2biqv4BYJ<0t!X6uwV%f$9 ztBX_8;En><#B|LhNjq!gB=0-CTaah z&)<_Yvcy!<6ec=OK27Ul85LX5Aa!ehXB7A47J`{vfa2Z0@XTTy_muddn6NZ9XY1d* zD1^(c`aQ-xuwLvr*Ha-MhJjmhjhM&@aE1b(?I>flR_W5z=XLEbcbPl_=>;Tn9dM;} zuU$3)*PwNIChodq&TdvL={_Vym>1%ZUntZZF zGYbYS-?@*w4yl}3J3mL0%ObuvAJj&#)q5ZNd{+ZH5Aa!x>46ld3(JKFZLTN(!>-?! zL&0Rg*?gs!L4UMVGc}TlX!jt0`HQNQ+qe^Z!(55jh8|EJPnTgfyO8Kh5;7!y&Od+* zhVYCMuK9O6WIpX)B>h|vRWA_<2f=(q(W7#xGt!!`vr=6*l^sg0vceImPs=;5u z=E3J93TD{|BjRLl__)X`|1JeUkGf<#P&dd|^`!OmFfI>HyvbW?6A-cI5pRTXX1_14 zEXXJWGDy6v+=FUO=Y1}3$u!2q0(Iee#Aznv+`K>vVqi-T;m2?cHb;gwVp^A3~IQ-s*=N_@4-G3U(F};dM z#r%*08kU+dbkoAE$SpAVFg!{<9q1_gIbF2Q>z|aa4zwUOteLss@vH5w*z6lcq>BsU zy$T)=O5E;Rec#j?Mrvw?mzP<4ux6ML)(y?kG5%4{<20A;W(Qz@j*$Akhg= zNvzP_KFr6Jdum%Trc!87l5|GISqH{tD3kNa*^|&``0kg%{5ZrP;8^8t%6(!+qYBCG zli7qi@V4FwDH;xc{IfxL8d(+`4b1W)m9t8iZ;tnp#9^HiAYlza2TyuU=8F-d9@KrvE`9rLm~fBI?1BZ)WX|Hcww+|pm&j=>-_gYc!LI!QwDt(R1sOc6l|#* z)a+triL>{({+G_2gOLtU4nxODw%e}V!<(!2UQdfd*o*pq2JwJ{nlA=%dJk8SIMv%{Wb}%Zw#B%mExhhTV0pusL zVIgUDTAJ^K?VJ z21-XL!(m$8-Jn92Es8vUar!MWNPuBI_T_}m@V$NkwM7Q%i6vO1 zV6SpH68V5mCP;`>{LYhK_?mlR6gEGoZ~0dumZ{G6e9m)UBcNC}0Yk7_5GoyL0x$^< zN$eTImp&EAe2;)a&JStkUmwkv(oBntj~ZA%3f;AOm#>nz2C!}KIc#!~#fBl81A$n7 zFpIYfxjk7!ZhBvHV55;LKQYmIK2-jW{m(Wp;W@2VZ{0W>axSg<0)>jmy{c*O{ol@qm-gJk^F z-yrDPDq(Ihp{R+`Q8JZ}w`x*DLj2hNgn97@2v^kKyGkmOR^lcaTZ3&q$Y@&|RHfKr zL@|RMwtmnuLYJZ?^XjXNng3YCx)-v}W?scY^^^odlbEiP)@+M`3kFhV9ApuHNZ{YM z#4u`AI0wYiqhc6?Vz4nJea9SoaWz71LZgP!J@!|Ozpg5hyf>Ug1ZCly&vSbhg`&(D zk3PB100$j6Zj-DA_DRonz&N zfyl+{s?(rPz4r4RO?Dt3!3=oW4>bDhu8@PH5Z47!kPWvrg8CMhGGMi{37*+P9z3Sa zdMstsT1P4KdUtA_f=xm|R5X+S%a}udHJ<|x2DE}GI~mVoO_uO9Xgl0`+`J7vvMci^ zMTi#@R&g;1!V(x1hFej8e%9>DQQRu*$pk&e)+Bg@x!>K3TMXequ98=x$+62EN*n+<5!{ zqT*w@C++0tt44>fI;PZ*6qIXv`!#q`?e|y)nJZ}qnPF$6k>$O zfQ>t+rgU8)vS%wzs<|RSn1qw!A_KlMVfwlY+2lB0RI4dU(5Kk4UiGs^251bbk{+k` zXC#K4ZCMO|!{it9I#U*DLdymw9~RaXmdw2r&mL6l1wJS%)wVY=D%nX7X(~}-`K@TT zV2)zk&4=9{K`xtAjOmJRO5aHEnS4e-DVd_!6Ju>tP=sg|fQ5P{m?<(9fEH}@2`{E( zSK`eUR=H=yCj;>LtR3O%f<>2_`!39`0Ee5bv|`|Y+(gP!?wsq5Id&-r;rzSILbM9C zNd8^Xd96lJM&}W%GRaE@to=|xj|$oQ8%N~O`ui%V3w^rGjEf_a5(hN`(0@M)@l+e%wc z5P-xOGbR#fX0QcJ(PW6_+`B${|FPD=#%)l4dZamEmX7v|Zn8jLwN>|d5Tad}4G;Xp zcWc(XLeoo-odtp+nTc;&AfSb>8?`3 z;-z;86uv)P3c@YGy$t(T%&O!_?0&;j2-5x#q#W^$saSUTAgC>+GP=D3sEP~d`A>R( z1*Dp%+Qy)87jy6{eFHyCsvxzaWHZM{>2JIti=>-$7 zmtF?QZdbVWjnk&8uOZ*j6E5jR$$IF2(iVUP_3)?Px@Rvudf7+9LD>(T1BZ7uQmF;D zb`qA!`wD7_o+F7;8emH4XMtzsBHh0p5TE%8LjXj?jn|EvnD@Sa{kUTXMQh<}m*tcG z`~%&;rh^tm9Ga%PkZLU1fn_9f!r>wz7rG0n1ni7fFA zBt9dA`Eo0$nMP^-Yf!HVS+X?&%JCfI$a|^O?w<>x);osKy5wH!OLSJ16k!kC_)AziDjbacqkv(v@pRsy zEGUKaNhVrcxurFph=FoCVzK{iKI;Lz0J0;HuI3@Vj%z}a3Do8#;%ZF=(4|{w%fUn z5JUI+(`urK@Pxd4%M_UP!8kY7BdP_&nygZfLp8)l%Yl1faUx$g|t90 z-Q~80s%f&oU$LM*L&nG=@mltmvEG!}j8}%vV$OefUI8rp%2@h;(}_pS@iSGRbB3b71cLg-qt-bZq2ha)DziW)fN5}flZlS64bmT`e*6M6 zZVUhR6}#a|?))!*?PCx#;*a%=zW2vh6`D5HhI(M7v4zeh6qbQ zX6);ESyG*rp0&JJgERTQN2|9-p7JQBC`)&?a_%0r1+5$rUw{KyihElKsXn}mrFo#x z(g?q>AS8FsVZf(8syT2ksnfw7tan7#4*8Ewc??72LKV7y5oZ(sav=K; z)eT*(%|m{F+dvKc!i8S;DK*$@^0lBUIac+nk`9j2tlbnYsY8C7fZL|b`3aLoc%3XU ziTUcf<(S*&yG!{YUQQ30ur3`;z^$|S%5b~6S}JuZ>=}-aplL{NLHAqJjA%CA!Dm+6 z(3jFZQ*ef_mC_ve*$%sDiwm;AclZZ3^X>0~E~B!4d*kg(>$)2p_1Si?P~?^tiTzJ3 zF-9iCeFVT}Roe1?fq)+44xep(%k4D%8V`rM@55SIeZ^o)S7A?e^a*PP__BO~m(!Wo z`O=udOeE&4;pNNhPdK%vsD+B~PM@3VYfP48Bz{>+Y2L$ct#lcbL zR_pqK&ni2#?`P>DToKNZ<4Kw`AKDE=RMMV*kNNm4oDjO|EhU~Gn)lyd3on-I1!(Z` z%-k?&kQN;TZcE6(k3V=FyJOltU!w*Yfz(cqg=$-fmy})DuLB395vWsRTa{$qF)LUy+qSFlOC5@2;&-;hGF9EqG4&IN~m zF}v0lqrK*!6=b|!*Vw*IylkthtjxbPf>N==;{y4`Wh-4+FK1iYVOf`7Jba`=OhJ`Fm7=I1A#mEOPAzB~6bkCp$UqzVhQJ?+|JV;i zOZt^PIsdi^YLEJA$mKMD-C0MCzmB|_F>#lyUAS@_HX4K`f{m;0%rtlF`v<&~nE5ne zV=fv5|CcLsivS27*wmDMy6BF7NTC4OKiG-52!orhpFv#hkKY*RHXf!Kbcj++$8A#Z zOcY_#kK9}I-M?UF06>@MWDoD1x;qVVc}h7}G5w_tK`7)I#vqW5Z3Z)Zm%oR4>AvU&Tkl{0-tf25X6`ed%Iv;5>2}xr~l3wlQopm-0fQ` z_#CD5&1d?LvQ{V#Y+Y9SsNVxlbwOR7$lVmD^up(P$na#pmpux8WM@-YBVEF_3rGL9 z@t-&{Y__1hpeb#QuF#Kv8c;mTp zaIF1-MZpZYb5T+3bB$8p`gg)+CgCK9sKDzvKX`p+@?)wkm(KPe9fCu3OMX8@gv3LOvJXZeT6)VJ6Y zgm=ZX>X5Jgg0}X5eE3(FNQHjq2Y9C}km5jW)|WhlmoIbSp9H_MGOOCRB=1mFfAT+y z2GU=nr2Jb}C3XhA!d6eFh=A3_GV9wnQu$TT6^cnsN5)7z?QA=83WFH)LqsWQcR4s4tKn+eN~EoNd+K&+F;#tNkSDjpSm3 z#(Vqc^#L??UA5MqG`>M0Bln?-FsT0R@Ub`G0Vs1e!i>{`@I?xb6D5=bB>4tVvhEG*tA!QNMpGy+UCM z7j%7EI-75zdm$2xr}ppi zPX?I%TgGzie~Hs}-5eOkisV_o3tjW9VJ!2Nr|~nwUp$GAr%!p_{;A6(Hqe0_!hVo^ z9ux7W+TYYK-|AwH%k90g)x{NleQtVkAF1?i)Ofepy#*2V_A~rA#@$4^E2Cd1A7|gt zb)0w2BULWO3cXGj&7Fz<0jWf2aZ#0u{#32CC=XDItlK^BG$6 z=oqHyXl72wdAX`0_{!Eur_@eIC&1Gy&}18KiU9yrQcB}>NyqitM@AxuQ9RT0{$J6F zENhs48Zlbuoe7@6mdsuL93t7JH4Q!4E0`30_6_}K)r*^LYmafYs(BozR6%!o6~O)G zd`ntEe*tbScW-W84_wPyY3`+>g-nVN=qWy5<6UMEeY7RKe61D5=NKMC?nFQ40g9eS zA4a5^C&S@a_q(VWWoe4*LIt{yS=DUmmDgN&zEW<0d^~?DlaHPcpp!FMQTQ+FRA67p z=198i%qMWtUub^sfxW|hu=VGPX>{}ZLnFH3f2(RC-}sR4;V@gBn8DBEW)%RtPe+|Y zcsh^3jNlmgFO#uQMXHZHsV7;d``5~$+PpOX#6!*T2Crw=@mbFB48>vP_B zVh;xwq7%wrJwF@Zrk<;QE8?(ZEXr+xfA`2%bBLZvY)1vjoEu zKn+?sS|(W}LNx$6K*qn9k1+<$xA6l3V?Pa~UiUb<f?1Eh#m;J01rU$ zzqi^00tY}1?CO1Dehd!-06##$zqjr~0yjVnuwqRwxIz7W01ZI$zn8qS2hO&I0yjSh zi;lSs?v3?Smp8-$H~~Pnc*Fv(Ko5^+A~9SEnYR7^01H6$zqd670|P(}D^*WT(FD2w z03JZ$zqbl=2$BJ}*G2<`J`ECCqj^hYafJX!K)AoRXoUkmKn=ArF|=TFMZEwpK+nIo zw8aA`Kn-~2m4M_1pK<^fKy)y}t0k?Yx1bsdY9nS9JyyNzp024s$zqj6V36cS~ zmq!G7J`Fl;y~MN41XchbK;OT&9fkxLK$ji#2?&4eT?c>^Mb^eMr}NBurg1R?LsfNE zSNEDgK}979h)R&F?ylZ#*_~M?kTK_g=}c$f%;}WhfT$SGoK87&zzB+-o(i5KM*gbq zneLw5*`1zccI0lyJB6KnGd*4Pb=9l)z4yIuuG;CPxi8;-;cZ;Fs^-wsFJ5@Zt;=>l zXRCkM!uLjfzVQ3=&fVVapAl?YYetm(86$@vVO? zT;6ZRq%Zz>!sCM%{r$o}969Q%cYk01yM1O2JmRwDyRSHMzx`gGv*OO-^_R|{_roKP z-v8^dH{JbRuk+6yzuAl<7ymSSlNAd`yt?^g7d^M-HCO)0TG`{UJ-#{Z+}=%8nc9En zxs473!{Dov7i}_2JYUBz_{*eQ?^Lh9ZpFpJ9+>r#z25T6Hh8Yr)o=Z9%!W6_uKLp- z-aq~P3HyCy9W(cr3m@5Ww4PbE)7fLU>V4!_&Ch;1@5fn}9Pst>-YdpU`DW1WXYMoV z4!H5oW9FZ5#YrzsJ>`^dpQ0bmK7W6oBbq9Hn~ynHzzFr>GZ2FIkoSp z?+)5~@&QxU-TtcVoehI7UVP!w`_5aIK5*Hn`HQywuGbHnjoWIyU9TZ$jeG5`^9BvO z;pv0dn?E`J`=RUJJGIZx1|l-w~I5-12{azyIOq ze|^8xUCGD4nE$WrcC$B~^57tQqg~!RVf{_6`sRf6g3-%2+4l3v(~iAh*LyC0;i6+k z^;vw|$?I$1FS^~i^!T2yWS{-pr}O8(*4sWObMb@lkcI1>_l%~m`RLwfY%zV%_Z#+n z{;Nj?G>#f25VEqzsb@SjY~g=qfBVzfOWq!K$*{j(_;I$!j?;dA@vTL-9CQ5RVpsWF zeB&4Io4@GqAMdfU$N4WDf6BZc&;EAe)H%ogYx41Xj7u~=vOw#fc;Kyrj=FE+(;vOI z{fDotm_6pTS3Vtb|Hd+v|W0$+cw#4`os(NO|QTEzW;e+{@2@l zG4J{#PV3$G=96J!)_~!cJlAwh%SXPmSMf1_+;)S(%6ivxt>-=$?cbwu`Ndyt zb?~g6-kSH(^dWI;+17vO>~i5@TQod)pK--Di$UhcPyhPm5rcl(Vg|hEpKtH9#fpa+ zntJ1?uU?z+UV8RDpWd?W(m5mF*zNUyH)Y2CvDXjgH9y=pcyB$v%_R%=op{+VYmfUU zd-L93Mtw2l(Mv!7{JG6%95wvu$Bw!GL%6`0^4w21o$m;AP2GQD_Fdy2|5xTSe9xl& zx4z@y2kdkE{M^$q*6;cKKHJZ_?&edL(-pjN!(+a9f6tSR#~%9j!Fm7bzrjd$?zTIm zzq@n6p>L8s_c?IwC+EG{XTrqHvfJv61{Av9eu?H_WOnrFK8#5m}YwJl*?9#CPhBGGL zzVT0+&e&`6=KG&HvKAOGUmJ&sjR z-Fnm~{q~)BIof~!SI_?TuyvPhwDg_hF1;pp%vWDoMiak!*cKZd)X(nm@vR^J{^!Y0 zpZ?c(?wfzRX!?17d~?)APxm@{z=_YyzWk$UAD;61qdoRmevz2n%lH5H_@xgo+5FKn zXN)`=scXOfe{1#KCf5Jip8D6%ExGK7U(P*#o6l1>e81z)%Z|Q?j67i8q!lAaJ=^c5 z-_1YxaP!7#3r?H+z@7W-Pky~w{rc{`Z`VJ6ev5w{Xa4Y%J!S8sAANnF{+aLT@OzUR zK6}@;>ks(h&24tj*4^TPPu`t$@Z~FeJh9n~KAYX}#iHaky>6Jk#@6>ep|7>o{`Y^L zN-umzcwigtzx1jzj#{?vIme9s!^ro?ob=M(>*>!Nan*O^GvhzUKK#m^KMx}hT=&yH zAFY4=;HUQb$G-i{c4rJrpE7#dX}{ij`{#c==#u2|%X>|4ybKN6Dt*!4h90oV(xs^W zzRM=dJcQw)lW8k(z+nNvd0xCy#W99&Bf0x zIPQ*{CQLhf%E3px{>M)~zJJU`x4bmD>AnA(c+C?NW0~u(8TXVmwa+vE?zwc@S8v}D z|L%jWUfg`0?T-EGtq(80`ibwi-+uAzL`u0PIbvmxlN*m;Q2*dDkIlSo%F~BU?=gP> zkYDB>ga+-iUHY{@&Frz|*XpYi>IW}5C#~Mo=iO;{jazoep!K$yv*s=kKD>OV zd*=SK?6m}$v)y**s=NI9&->op;mm*DKd3+0+ONH54e9aX%*g}eBlo`N?9=7bmTmmgaih;aYes)+_dl<( z=jq=(z3atm9K6SUCmpqS|GoP?xBDBjcmH{_ua{3$mp;*a`-=D9{^*O|qc3^n)7aW; zojz|bZKucA9r2eRe>|I|KY3aVSa!z7mt6d1{rBfCInUg5pTRSmZr|&q6Sw2{?=yYV zcQd<;L?=9^9lzFL)8^eVXUc!8d)#@})(gM9Z?6Y0VdvlT@u$0dGvxR1#2#~QYrNr= z>8CBYWU>2kvD4p}zISrRpZlM!zut43NA5~*-?-kJ|6 ztbm{X`s9k+7k_v5qC-BpX#F7{+e)Ol0t~&qj8RyTRnBDQ9HFjUx zqeqW9{jR&{)jvJ(^kYk}d>lTt{p6OR#~Ztz^4{Ig9=78R=gmLi@FO2S_@g&ZpWAEC z-p8&V8+5@zU#@ZV+kf6@jSK3{^Kahr)tCEiKjiwQvj@EXq&a{5_3sWl&yFaEgn`ebI&#F^t4_CbR^3LN<8T0QqE#1ucsMn z-(PqAyncV%KfcZUkx%|KW!|DmTONGJz zdt-miPhMVo$P0VT88T|%f2PgcX6=UU?(I9^M>1vFvycAa(@h`S|CtAFJyt*Cl1nch zkT@5mo_pk@rzSl4_jylW^7=YAy|wT7Ngr)>#NFquGjicC=k1jm)3npDt47UTa}##n ze)sIL;>nL6`NPAH_xtlR|5-MjU3l>|55j+5v-Udk`)SIZ53f&NzI8zJU5gqg>^1cL z=cZnN%PoJuW&0}@#?QO=${kMq?8ZxaPk-~MgD!jV-pSX_9axt+bH$tU?no+Izw`dA ze{8e)YdsFX;K-4$+?LsHe#6`S*<8$A5T(0yL)_3k>a+-a`-zqu5*TkpDa;G+F@_{)lhbzi^t=?%`@cl1NcPhZDa`qwK5J+iPLnYrDRo8N!zvFjsG zPU|({`S))@M<22B{>?wz=ZJsw{bkD=@7#6!>mJ!`?RR&b{r%`yhdfgWM%bPac=BY=2nM00S)@$>dHs5IM zL7R@*>G98QzGvP^U(M)y$rpc4bZiytCKfr~bUfm>ULO`^4vuf7xTgoj1Mq z;PG27G`D-UaY6lz-jn~?=Zcy8U-aeLU#@s@(JnuKlezM?`Cq|rUzvY7YsLo~#E*Y) z?B_3!pYzGqyX>^&u0PIM_a*iCw}$@uk1K~B_?ORmE!(ok;Pq~qapd5=&e{Fx^PfIu zlSzl1X8!5%ahpAM;HV83o4>rZIDOhaFMhb@CjU73Z%Zeiu|}VnADn(`{HBZle(rkN z9X9^TS(y3P95C&PU2lJT?VEvU%8IjQ-gwPgN9}*wbAR5ghk5xI!yh?iucrnNxUTuL zexGe})6-9$wD%5I9XEFT<_}Eof9za#?Ona>|BO<8zW=CiPh9w~C5y+<5eI+u#YY=m zd&(ZqzIWeS=S*TlpMGe`?=M-tY|BAgH!a&?;?uir`gZ@x*AIVOaK-E+Ke+PN50)SB z?YxtFt!()@HEG!cXH7kE@neJb9CPL#bAPS>_Ko3}OkD4mHQqk@r~fQ_ca4@;pBnJy z>2H6~blR+Yw%B0*El<4jmGsK<4)|))<$KOL>e0iGSn<-b4>!X<%vx{GlHuok2VdUw zxKp2e^e@+s`(b}ALp@x+}iuUZM!+3-HT zwjZrC#&(aqC@n&$fr&dt%=$Z`*%kheLL~YU?xCxo6By`_38n z($w90%{Xb;E-l|)cJ*CH?QzJ0=XQKAb^V4r-#@!$t?7&Z^xP%(ORt~ydhdNsxp?I+ zi*H);=2Z=!&AXX=b4vf$*^yvL{4qLW?inLVVuJyD903Pb!H>gY0}tA4^B2zC z>h~|7Q#a(3U7c%powLJDJJ|0I*e`ZBe{|*=bB}rT_>YH9Ui13q*xAP=ukZ2Drn~L* zmp5PCWa-0T>S154b@?aw+r$auj=1@mFVESj`Q(4$w+;LL*~hm0@U(xm`~(c^__yEf zJ7DvBcI)}UObAk`WxH*6=*96nHa&a8y_Sr6mVwhhz2cgK`(OLs)Dur!GIY%KCk@+h zivi!Q-)mXV(^Q`dFY#4opw3K;@xCpolFTzO=nmt7VB{+Yv$<=?1X=rZCB$9RrjCibrw&XDW@glBolS@iEL9- z@487&+A*9aCo^??6Q9JJ>gqx7I+ijUok`rPtG8KGn)j}2Vg_$Y*VT`iUgwBcA;G=t zGESz6*VWf$csdh9KJ8f%M;!Znzm*aZZH9Jk> zwvq`ROs}p4_dE&2L6Q3_y!;W_WIBJAV)7>*6CiRjF*#Ie@u!(grLw{Lp3-*GIjoMT8)nPmBklf`M*cPLE(Sx&~|U9 zh#fP%As1hkWiyS*lzSzl=J85&P_^5T52W~dYCVB*3_E^sTiNArLn*ioICEV7K6Dg< zAdCRPQ9L1F6`PoKm zI!CagbELp%x8vEhyB-9S1VWRfM3|)hVs>n13ZEby<5OC=CqzIj@H5SpwRqi!Td-MCg;U; zJV(+<+D7(wJU<45dZ5SEj&|0zcEx8zEixlf_n^=%ch*q|f6Wfow<30>9~c^%kYb*A z;Z&rVm!g8aS3#Hlmg z;+T#&qx!d8aPPv&nV99VG;47L7`Qx07}>PNf>CKsN(?wG9S>nC*}@YA$IAST7*j)M zZ!ws*V~NjoSW|!K1mDE-x19U(tsa2pAa$yYBv3fZah7 z3Wc~0!(r8SS#J(Icn*u$6$h>=VVg*1La0RmVed8Zfx~%A)^eC|ad?cgRBMQ4rnhq7rJ<>&+tCjn;JPz-lJZ3WSXa9xNc?${{HqOKtp`c3~f$`=UpB* z^9PxvZHr~V$sK0mV-sT&vAqtM8goBViHQShkx7j0;WW1-Q(_Ebb}HE%JJ^u{v{-IV z_uMNQtY8FG=~_vLHEdTyRRvMi-)eRQTrw#pPPc#Uf=l(mbr3Uoii`7bEEQUt#K*=G z*=DgWh0ryCrBVV~gV|JpvZ5Hn)xsE#Ll^~PzFiGtRmT|hF*d|QQY`HxGOoKOpvIe; z#7SRlZ)qle@SPa3BQ~=sPP2fZ5o=Dz_`(%7AC+YBSzAh=HeGl+6e$w@X^0H$f!~>{UCpA zR|8qqL8ka18!V%{$%FuflZZ9*R09`BHQ|4!GqIgXX?z8t?k>hx=t6N_Eyes4*i{E# z!UgT-@EVuPw;V5qaf16&C`(U%hWy-G?oF#vSgmqzg7nc4Jw1x2l44Pi)CF@XxPW7l zWSmD~OyW(YXg2v{*&Gdt6uMF3lyrZBXB+O`6nBIxCt=;pVo5jfF7{V>jPQ;PKHRbi zx&MYvo5jgAv>K3US|l=UmFf6`iNYl(Ds0yd3rvf#X)qv01~oM$T@Sn2oupjqu9(0~ zvT`IDitDA*iNbbWxWmxZ)`Kw>X4()U+ptVaXC?y#*}xzGan;h8&NHd=lfVT zVTrZI%F`8QG9{x*>2m0@Dk2Sbkd{-#u7ro@pFEg>XlSHpiv1#uFQ9D^YWM6N+HDwK0rL#bc_IhA9^6meRJLW1~q zHC$8>7ZI7Ufc`izU#`XlDq@_u6q(DFiF0#WoLnl#jwx|mx)dU8R|7@`fl&@Sh62W7 zpi7(vS)wT}uI1jlXsouI zgF=i(04=#Tx!hTxw9%FO^p;3@a<|yt2)vGT4RKOgNv-JTU+ZL z-TdmnOe|@djGHV|9*0&%uu&2VHG+YQT1cO20<(1efP-JKMlw z0*BcQbI)7SiIyvelQ4fBOa5KDOneGYnPRToFm$tDaFnmTY0HSTUI)q!v#XKHH&9&5 zB|(?Phm4Tfy5cKMa(N0j?jWNQhB$)=L^@6fB}B?HO(?G(oCz;YzPQ~)uV)GopH+qW$u|1lb^?8EJv0(iChIy zD3hpIR%Ayk396R&gW^CbsrV7Lt0As}h>PTEgCKT2svrUx1SGvQ?O-<%$VnwzB}SGe zOsWVvs6|Oz^X-3XpsPCQ^e|zPOF?l9Wc_02Mz_M2H90Kp1rsXAl%P1$qA+T{T@4@= z1V~h-1Qdh-Qe13#Zu~O0+qpV3PE%7hA9#`>&&shTD6Y_GJ6F!GhLH+lBpPc1VTd&e z@vP}gF1^jG(ie-7EZBD=M-?MaP#n`JaUI{ThK~y3qa1(o1h$G=CtQ%o({Mr@nH?_x zASpIaystcZq>4@riMVHx+Me~>I5kiSJ2iRP4_S@x$e@$JT8jW(PUa9?c%$%>WDFsea2lN^4`OZxfnS8}rX`sf86GW*HmM@& zw9>M)VY`1C>Z*jgXtYU9Jh#;_RDvz3lz47YY4Krxc!y7EX>v?vBnz?^vl*X;m2ASq zY|`?wX?;B-H~*vyh!RbW;`qQgRZ;mwN%-Ips)liOO~e7y&NetK6C?5CzNMpwJalDYU zt286ecj-Le>&LLe)Mq4)1Xjz{5!<60C6eIV)o@lpoJDZ31>AygwOh89k5S7CB`>YR z^R$26t|b{UH%ZUw7FR2WA*mwdAdQl1>D$#HS6#><0D|zhFH(|+om)7P^THfA2TrCH zRE{5kaTIYyLbVmC;_!&bkANWfEeq=db~Xqm6$Ci*`2((NTRENt#+42_CKa)(VWomt ziN=$FAOb!r;PeyXec}T7#3S##?K#xBOm2Vw5e+iBvf2+tmP9buTA~Tn`HS(WYC}lyR~-MK;%) zPDnMQ$OK6hVWyVu@e;PH!K~^qBW*T7Z_mp&RLJESSx$raEa7Y?(*-V*7fYC!WxRhZ zwxo&>q-wPDT+Xfr!74$pR%G(OSY(33l3LP1^2>2^HQK&}sMI@aatx_r(@N^BfFzOO z=v87#a2((c+PUWYUn1E=36{^2-+{SqX^a(u&1lyBbO=h>|FD zi2zAJmkh}hXrUf8ZcihL6eoXCF>VCJ35u3$l(VbBqJpr9&W#9g1l-7xO-*^#qnxwM zg}ajS0sx_UwQy81)cUF{(xi%hj*6nF1^RY1Bv#$e2}qLx5`1nbTUMFKb~S0A?hmRW z^Sx;^xtL944yB5yqmiTteY+a!s*bvVLm8NfH8W5AO%lN&ZNa?P?bUzfI*FJeroBwo zq>7-^BJsn%T@7?q2VEeYQ_$YVZ7v_{2|fWWI1qu2J3I%i>FUm3!eXcK?9)em0flB~`uMKa1C%jU39l*0ki<5a`tvy2D1hbS)* zQAUT|yK-YRTy~6VpHNg+140o;A`~n2^mvm|x?5D(uKjLNZ5e+>T0|8pohz;3Q%v5H z$)=noU zmaUtJXqMP&5ksa{X`+z^gwNsLbL&Rg-Muge7Vl_aW?LLdL1uU)RuO4cIur=hXj(LM z71%HR@_UM-C2aR8%W%(tsytm+sGh@wFW zmkTm-DnU`Z)0L(S#r#4N4F@^98V)LmgNT%&7Lt$h1nBei5J4-+it&SDs!}p`FIv4}a zr+?sQxwwDw*hDvb)Mh46ac|pY8MpIyIV@u}5l5p4cLsJf#8nA#k=P)a!tAp_I073q zaEez8A@V5*gc%Hsju<1=;(=G>`2m;B)!w#uVLs+eemO6&QD?P~a|wiiPKqIZ9A zPAQBRXw$h&oX_s^OujQhI>wC1+(#7=r)bd-m$R!OuIh*j=-^?YswyuG&{#w*!^t&7 z@Oozoh?YfyR1tbAh?0=t+tr{~b?5~g@PAjS6>R_HSH!M5z*?P3t$u4ndGBB_+jR3EFeG~5DP*dnaangT*Tt^YR8oa6vFB%D6Br?1t9aj~2xxAlB+K)>V zv8%zWI`FDBx%(e#atDKH8ZKFmT&1q(IJ-rYxspSdnspV(+hziwRTgL^kq%!pj@3>G zv<^zN5^`*nrI*hE@Jq=$IBfY4ThJOC6a4**s&4}j<;!^B~`G9+3_uup#t%&CpZ zh_{n=^75KN-^I%10SLEOjY5q0c3rr^z}58JrKn7?h@x7EYg{87YAUf58!3ijaFtVr z3FQi^xF{?VW_AyNXEt=eEyK?rQg7_*!f@!?LW_P^Ox zo6c#+vm6+Gt@z4i0jP0Ji&8u1+tt8QL9j&30#E~*cc_~HDY^cZCT5DM4K)z395chb zya3^`RxT5O#(@%r_4Vy)7^xseqGbZ8A^lai9aJuPTWm0ad}dB-(@B4LoydJjdvPoh z=eo#!prfSHLL5c&#rh~P=-Pp91E*wx9!;1y%f$f7OAV-Ef+JF*#R_tE zHON)n>%rl}n+!4g?v2}+KD1Efx`**>WZl(jB2DR_ZBP-r8q%tcv`}rXo2Bh`@X419 z_=*BqnL3$IlFOIvmX&`DP({$;NCIBIT@7?q0$oiXv!;*vU!sp0YMIzSr^q9d@50>> z-Q!~(QLPD`Rd2XQBk9Dcag1sCe9k~gO_?U+CX-J`L0?kYk<@F|Wn|M9>p&M%UkzBC zHV;lw7N=4jAHA6=UHcfeD}%+sLCpTZ&~ZXwEZyRmVoP>hCH{Y~HdM^Ynr=~U$R%Wv ziyI@2mqr|t^DXQ#+!5hJs^zYcI7QL$m9wkitAhB7M)(9V_<>V+%5-Ue zv8U&wWL|b~t|5PjtE-%_Lb{p07v}fFE{6=NA`rDGy|V(l8W5`v#2~ugKV>#L88Q6H zphCjy#ODTVJ@t*SW8*7v@W^dxBalKQu1D$H7}(W7Q$f%~B!x)0!b?EGUxxxUU+LWE z)DV1S9l3y+nXDJ;b+J`BqDYN{NK*H{T@5!C#7#7!hy;HD|3QgDC)`bNkaeT7FIIkG zak2u0p<|WX60~AOks61Qs72qdhL{Q>rW~S(ghV%Uxp;2YXAnII^G5kpEI+uKQ+ah& z4a#GXs+c!}lxV3CIlCGbtL`cVaedkMgt_^k`6#JdLz=Y0_$omeRS{ZBB++u;t_H2D zLn|n`8t8wX|AH-#C)2s$VR>Eos);XLTJkV#SHoA8@Ks}nYV6Q|2RnpAqOF76sve&# zaaX_=SAQts>xFnK{Dr-%d=2Z?%n@33>PW26k*fZbT#KQysH0He#m`AGv&}&iM#cd1 z8JE6O>*`Rp&m=*x8c<1X;8~1H!j;mi^=3*fnI3-=wkv~5Qi4r-Ku$m1O^g;RV1rbB z2*S1bvLF|_Zh=TPZ8|MZ1vw-frznb3=i7DNrYq-f_1tuA&0@L%fNev=wg@mdpq9 z8t#88h`UIK2_>MsM+U%i+#-8d+C0rW#~W1l&_o7ImXgl5s4@zNxEK2vK!(g8draWL-L{_(mCf+Guc%;tcp+(Mu@}_h$2+& z+tqMUL0pu>2;qQ$KF}*ROUOT5h0$CLDl0WLnv(@p)8&ebRxwouY0*}soLvoh)pmKX z5<35THH$%rMvkeJgYaMQnuP>WtXx6AnRkC8^F&pIpc1JCiEmefVAUa5P{ihCWaWQd zZzlTyhU&5N!KiFOZJX27lq`!zsv`Vwq!y^YT@8L!hhM;e?@Xk^XsjoV^^Bs_mnQ{a z7sDxZp}0ajh}pNbs|=j#>S|!>08DwQI=wY9Fhs(tkQZ>_Rw2?#rWkkN*%z_P69Z~% zVj%Q5{C5kbLbW8P6}GF+a=Th7S^j^P75o@Tv~HYB?dboRI&LoDeMl zp~Q*@mx9cWF#gNR?eK7dfmmkaS_iE}i`bQy+tGf02CQ;^1}Nf&X_4|Xv{lAQXcYC1 z+_1KG5%M#lb%kyPrrhGw@v4?X9gDn7`8NP$JNgJW8rT)@1FaTWrlQI`Yn6YSH~BS{ z_Df2O*mWTDET$)&a9Ub;CO26r0dAJg&t?9bHS=aeU^hs>0h;_+DUv+CNeqg3I24)g znark4?%zl5$K1#a^FB*{?=<&G00A7wc1(A-@;|ENN=@RVbZSx9F8_H2Pq&kpp!(hmnJP)=% zpX|o-6zDiN!9sd@BhN)GIx;&ziD%_FHCeT?Aky> zDnYSCQY@3%9JRr78tYy)y4wXJU+Cv$hv!)iFHxl9L}4*spaZrch)<9>^73cfc=6s? z$(OTfiCb~^T&(C;;Doil@%+KF(8&x$b*)@hv0LRDFp11?S(|@YQobW*G_iyw%$#&Q zcBI#c*A*vmgtL?kl;~wQ-q>*7lC{KcZ!zwR-1wcs!|CO@q;vm6yp)Q9la4%06riu@ z;l&#iSHq(4r52WA&1s2EJ1Iet;_|>Uz7=?K5gzX?lf_0j-pD#l*7$T*JQ3VV`{yCg z!hgKOSIR|$(v5$4H6)>V>M0JWSQ$>(s#k9GG zsiI-RbZ8-DsA^@?zy&^nJlrGXl9jLE2xWsevj$nyB9?z?cOB!hUu1-YZ`wIpwtb+L zU}s(Y5Kyu{Ic(ScaHeXQ5rbPcwr#?w@P>&BHEu#`8knlK0SpQhRqqnIK)@}?$Q{nz zj<;5@i)3VH5?87v?Md&sTV~|s@81M)YUu)(uwC~99A&x+sZC8n2+|c|shrr@vM|w9 z-9VZ`HJg8TRnannD4fUZc8_oqbte{f{4Q_DE0yEzPB>Lc>b!*Qx*sq!u3%0z#n4Pb zF*6vjR9l0HQA~&l6ap=-aT|3}inoA9kh?p|C4<7HngSq}RM{2_i6LfMEK;0#>2hUa zr9_@L^@PQuVMXg=O`z2lD^OuN)eRMB3TIGJH3NSVW{aNz#(ax2Xv;Ccl7ftPM9}-dgWxcc{UD&SsA;PpY!={{C+%m*kVNe@VjbUnVtQtsH zbqg{@HDOmKcne$v*|tMu&ppoE-6fRDm^-Zo6_sVAcGJ%3W2}lpBX!53oYZ`~?uR^% zm~elR705Kob+Jt{u##IL$nFn)mV<+}1{Z!^cS3 z+rJ6Qpc2Jx_U*bK$_Nr?f38py=ok?L6NM8+RaH}CoU4Xd{h)B9dDoaOVAT?*NSy%y#S(vJ zLIE;v%D5C#DxSnzKvm{OB48{1q|aoNR2+6$Ibr6FaX{kK0RtPR&aiF}6>*JNTpW3I zt|^#6jWbn4nz%nhclo|_nl;D|J;-A?W6TmqBnjUUlEAe3ByGEoF||H6KwKl`OpT3Z z0;A zW-CNTm_cAus2GZhEd?3KvJ`CBjmr@ zie7TI-FPJOvPvtJhk{yTdU!~BQ0gfJ(qz(4^OV@b;$)%b^l3LdV#t4#ltbJAt}sbE zfmETdkk?l3OhAei6ezo?6Y@stH}Vyo#)v@Dg* zlpC%}=n2OOE-4%rw(EX?Q!Jv{mI8F$vLO~Op@j^UAY0RzO&QfJLa=ZSJHZV{%TfuF z2D}YN>z<$J<*-4A%WiBx}GpwF~9rW&Qhq69Na zsKPiSL<1CIN|D)Bzzb3m4h%PY6bqcILFbCG3KvDTpb-$Pc-jh%(}+tG?XF9cg^|il zu_IzcIM-}$b3>7W`4%>*VToOmBhEl4qT&(LRv-#-&T=#K{nA*{wjEP0Pd*!y%UucR zn~G@$3`GLnR&?D4HdBaVT9)2LB837mL6*Y6 zAPyj0YT;3b+E$4JOu6oL6z^ImB@45{cHIvioN{Q{7Q@66I}IRAm057&BuxR=05DC( zM269s=yW-$EHKC`2rF572Qa^tl`Iq}FN3A}DY>9@1#ExVuKNMbv~;Z4y1_6fNateb z;!G8Lm@alR&4z#}Kvi|a?kXoI$SoM*b}V-Lp2_%4C|ct+WekN}+|=FR=g7G&)yE%< zh(Fj}@yD2L5L?p?9Z*Hn5fWHK7G#=*F;W!Db<;*z??kOjH2j77Sg{y$)t&Qka=-Uy zLZNrl$GLAeIz0^%GT@Kbw4Bmfj|=*8qpCo38sn-OoW-(aBYM%Q}{-f ziB+Y-NbHyx)`IXkZ*IvaE) z^tmu>S6o|$6k!O}sM<1>B71XRvt(o>Y}d}zp)f^A+o1@xA`GF}I#S6=yf2$9R<`D7 zmFs`<_}(5@=DY)68;73C&(kyEmYJUc-&NC_pY4T5$qUi7PM)0qEOx zou5QkQ$NX2p_h4%Okh&!Em^=~HnfpKu>ll|nM~mfSC{|ahd2w_Ofyuh5Jol1I0Y&Pn5bM8 z2NHrc8)}de)>S$PAYhn}5N?;vOrDE@g|nB^jJL?bV;P~4t+mBR=DKtE{By-AKqXE~ zXElcHx*v8-lUO=dH7+w%HJedxTZ|)B=ca{!Ed)#k8M5_G)SgD906{<#4-B%_q?hVC zOuhnD+Uujpg~wZQ-cN~ZAlj~$v+I61u{CZ|U?NR5F#uFxhG{l1i9!H_7PC0ln5A`9 zb20&wfGO_pw_FK!u-p;HPhHIQJf9c{IT5IQCn+y#;I)zBnev#y>Zd;e zJzDxx&aV66O%-Q5XxOR-peD99i<`v8DmEEKTp_yT4G|XWN>_PB0S7(QO=WTG6>`#l zUJhPJm&{4HbaYOR!^}qK1gnp{2$dp#VY}{!JZKvPDhgE;Vgm%Jr6Ob+Vu@2UOEJVo zYC;GI?kY|i1f28$*L!l4_C5dGQ&tH3<=ISG#9#H{robrjF}_{*gPU;Ek*$a=RUGm- zLt<0K&_>YGREU^i2&Z1ffZJVFb__zb?RoAZW{M5DK|myvjP0sMEjV_g=v6F#IL=4y zOBEa!*i{8zt5w0VqKng^t((XOTxS?lW)Y0I1x&-lj9JJ~fC0NIjTq1p@QN&&Ag2*k z8D1z3l=hdeB6i&lUcxt1u()|*6Kbd!L#CK2gQ~3ng2VxnQgQB7w5ry#(@v!=MB&V7 z>2BAaovIX1TOhhZnF$y*xB-BFLa=TNzt%#kZ6f((8Yah#ARaAkp^Q%}lC}U0Tjm1m zmLd*sz@%IwD&|nPRf36z4NP=SG*v5_w$P>%P6ufVw32BHG%A}5N^sw`E;#>HU2yV= z3ToR#g`9%^c-aZ6$#EMQv`$%Ya~VjaOog@@`zQdxFrG@c$kU+ANAO~Q4XHppSca(F z)V#bhy-N?~OLyI*hCIg{DRV)mQKZR~N=xqJ)`%X$n%&c{EK?5aZ+VH>QnWoG|0^Z* z`@3P^K#M=?HX;Z(g4jUuf*1fdiPjw}IV3LAUMos2nXRA&B=iX30_8dciZKof#br83 z#q$zS9D^wFD&MZ_{2+CIH9f{bO*qmP;ZRX+l_I352rHbK)KECkxlMJzk)l|Y&P&h& z!nnT`OK^{%b6okwAbn0gz24KB=2o=agzEU(VeF7dxi7w5_rsVbTs2B%g0PM?Q+V7O zwZ-^I86>6~;#GphaZWS3DmNiuiU)eVN^@j!pfpjWD57*uLiLexJHpR9^2|@;97^>K^xMmRp*cd|1Hj#;W zm-$2iFFaJrPX%%bVX3K5ooG&}r6m-yiky~EefYsh8>nyB4dG{CMNz~qX_~sFa7$qV z6Sk^AXxWN?aJ?)_49=`B;)#JC@Wg|}=;X_da&C9N&qK_w+)9_1m{5JdAs8)ZG-ucS z0EdK2ZxWp-RM#vi!YgIb4GmMv(iyXLg+krb6i`iSPmL~BZR@(mOpP*AM;P0XaNUFi z%43R+xr!LU2Bo?eC(lb&+s+i8j`f6~h^%yEVc_C_veE)run!c#!u42jH_~=xrANvq zXk-DZ^AgUI$ml2kBma%_u+DSji?z{@4qvaWYIK`R<`;$NBN85B_okVo5_jcCnVEu;8h9{#W^bM{wR+Azy7XbHvt>qNzme)(RHi zm|%f_1#al3Wl#;uu9Ft#8kQ9n0BaOMO9v*#x*>pLPy?GpVLH@Q1BfLUKq@!+;*(7J zK-34&kr34rBu6awPIa?1=-1$6gqPWYRCtG%Y%|quuiAFP z+g#Y6@W`VRp73I`*!Jm)JVzx49@Z0FkF-^P8~7gK zBQh)zJ0#n7;>6aFXv{{Lw)QX8X4-Sp*lb+Pj&f3^tOi6BX zM~pf+^s1LvCD&@yW+Ucof+OJN;zn#Bdv9ju|G?enQ~q-&aPa20Y@ zN?LG)6vJjZGm%^r6sQ7XNcR(Q25rTE;wFWPrDGuW1=}Dp7e(r05N;a8Qf#V}KmyR} z38;s(3P>n=sR|(>@@RyS&}w#zESFKIqvRMXx^NMyGsbN%RiQC11Dx$WZIflZINicb z-p&Ij*TBHYd%$d`iTh7cGL@RzJ2oh0IdZXV7XB@pz+H#sU@6JlkZ`rdWI~#M`@VGC zdzW~Jx4b6AlUnQo@eZC-+y)p>3%x$U~7$K8GNHDV%U2M_{QcP3!xK-pERh65Z zGhi7AAj42}6LX9S*Gz^qRnt{0`@ET?6o$kx3D#p!4Ga~#RE01Uc{IWpk~8N{ms?33<sQR@u4Pvu&AZz7Ss_SKqHErEM#=xUV7sod%}p#tAio`_fd|6wlXnVKp_ws@p8L${G8oG?Tz%9%KS7~33TPBF!r zMHC~#oB^5DRpmKrbInT6Ss5$NDlNX=bC!Q)WX{LQG)h6BY*SNyQH<}=n8~!H>-+W< zli!$iPcVJG!%XAE;4ktmeRWFcp7PTU&5DmI1Vy@|bysPN5^5Wq0F#;&L*3FTfSil{ zNF0o9iu#}2RcPIfJQ}Un-O%$Z^AF|YUF7K%AjDXl zSam`evoWz%3z(W_D}W-eq=er_C{ZShQP^4Nb8B>pN~;z z78vn#PT-ko$z*efBj3UGI?mB@%u?bkt&ySua`!h8+?Woo)@C+B7c3eZ zZ+*>n`ev5M2g((Al*~iLZdi)KO4gIr$(A5(%gM@M%!>8RGzbE!%{h{BE={py&=XTz zH*IX1s>#HE-&EBq+BXxl?X=i_Ihk6yaxxl+rCH#xU9E3scj}u-+7ZQ-q9d&<%*4Vl z!Aed})J3T=>qrfERFJ_V<&J_U6J|1%62qPoHTD`K<`eqms8_sF4aTt+Mc>A^>$9|sjf`Sa}+%qpz6ur(qc_A+^VV^~-QiD~_8-sD8 zMJdYl?YbYnpk?Wp0)Uwchzf<{2TaQ{n8COObzl=lRZ6<7N{t4!LpcTAoM3KVP+o2e z;naV*$F$me++Uj+E;YW(C}gWX7}bbiRJ$#I7{wXHRt;Gpi7_V%!objV3m8zisX*n3 z=%$PWbrl#xx|gzPv~*|ExwX&V2)m+vCXCZaik7}z_k)IMXqpZ=G!V3atrJDnI59OY zi`XEAnyxdGVyzQO-w|upXs8)tuJ|Y!W3iSdW{SD>)E070??Pw4%2%(!xJH#oSjpLc zbw8|Vw#f_yQNv=0LPQ{u9ep$?{z93;F}1l#aF_MX1T?5fIzp};P9oPNGgJoR*7sMs zW(~%5HA-QIZ`b{>p;K(x5ZV@HP-7elM^{%&s$phBQ?n5OhDMAoR>lQ1C=YVa*lFQ| zc(rHlW|QJADK5^Imh7fepc)ya8m;<&75X63isajMKh!a*A{M# zMW|sg8{3MBg&W>QT>}7B!wZtv4%};=BgIO&R3d3kMlLt2KE7Zi@5s07e)s|^GcAHR z)eH>+#8i`5gc%kDmP(=UP=HQMvE+3XzGwlyCVKyRB2uxm)9lDYT}}|UtU|MY>O&3b zQCeU6cHIwZx>(8>v1Gm<)`+cW$bz~em29vfwo@QZQBcK3CyKtKK`ju~8Z3S*K2mO- ziI|g43xv6~U?mkwfjf<=_44v7#v^ z;wquQ7XL*GvNTGRE{gyJ0rQ@JFsjzALd2R-MXg)+dT~`RCDvGAR~aPL)%~|DQwGxj z*Hs3HMNO_+T)6u-K~OO)0}~4?RM81AD(Z3N`ElHuQ5_;7RY0bCP^*M=rcik~~V7PBLzDrz!GNqSoW;gj_>^*NX#EN};vD zuG_7*T!k2#h6%)R7(iyJNHxSG!%xs94F<#t2&L+L)VL| zq~szTw(EBA(#639GX|&$foFWi5xZ^&EMfqE3(NSf#+eEYn_!ijh$tGS+@`kN^O0>@T@_H#lnSm}q{{Fj zT3k^}_2DS6>vr(c2~jP@HYm0XU@DYDWN~goT{SggU`P#%8US?FF+{_mV+e@t3}ZXf zSkK7KHxybAtGXA;>&3BJaxV%H>V5(c=$#_Mn>*8mpZu;1|WRo?%g=HGY z*6lksE5)wI)(szj*nhy_f$?T*Y+diz*t!ItT*5+rhP+ANBH=XU-&ydwqR5xsO#5^r z3w>bJRD17wUV?n#C+L&`%hpw0<%n^^hGHLph9c(A#sERg0oQDV74H+={QSZX09-uc zs;N?O8Sxk4rzo5nI$}g@A2wkoL_jw+Ft%=HUC{-nHkzG(9?j1Cm6$?Hu`so44Nyh5 zk*;Xe)VK;v!`3ucL5nLLormjm3rdntVUX$K>;p7Q)3I&qQe0WLRq=qT7y%R3b=o}$ z=sdT34YSKz3ze$IVccb&DD9`d6|w8`wGh+)xwTM?)BniRyE?3e|2w1E`P6erb*7n& zi2Fm_HVm$R0BW1SG<5(?25k;)othny%5_NiyOwGgRIZ|`p+OU>hVG7&f^2MHrZC0R z`sw6aNZWXYX=d3GnZTf)rpha#7S}pr0^8bk`HHB5|G5=W1^+A0@anK4{_l)t=MzgQ z5R0OU34*!?8L@4ua}}xxiG@<*I+FD`;_G*`B8ta<&r*@1Lc$D%3Kvmlw(vKhsi-;! zx=Ibxwk?a5yCQZh#Y>_~@kSlXx^RK|k?x}(6N{eJ?3JbGODtU>gtV(Q;8KWvlD6H) zm|7njATFD7rp87yvF;|PHS$b4=FX>SdB2HI3w{$+aObAHZIL^*6a&~)j2^KSN~pp( z6Wf!2fRja3T?+fDnyw?lBJJQi8^34OAeC>IMH{ma}ndsl4P3e2_ zuhF&&zT=Z6 z*A7Ea1?7V>7N{c12T}K$qJdPk4CMn-N#z57j7xR4&Ji|V&*N2Wq^pON4{!wKgMm|I zZfB^2A$NNU$jtS+&PW~Ll10H`yW(wiNfD`ow$s;6TisR8%_;nvB~>fJcJ0qypml)T z(K?W7>P5Th(%=`JR639?Ol9J@tQ!v(WLm=75$|ahzZ2ubn%!FRNKyyFb1Kzu7)lL) zTI@CGuB6m~+8V+KhHfd>R?1f+@M@fSUH~B;8|)>|+t~((WxQ@wA;khW%{kw4Bk1+& z7Kg=S!UAUH1w$#G8nNJKyfz&*ZG(=r4M>oxIe?3AB2^(AD?AUf{LWK1@F$Qp zS6ssY#0iR0{o>no9hr_-Tk2CW4TWfboC&v57bi)}(zy(?D^x+MqNtTl8!YD z)F6d%h$~%?SLey=Ut~kiZ90~eYk`LvR}Q1mF{8;EfGSrhfVhgHw7B%`x*z0J47i~o zTS17cimoDRh*wN*5~wObV_Y25fyp~Msjo@`hZ^KH9w4Sttp0KpG{rs@?gW;9%`f$3 zs1{ToYZOOY-g0)`4{LCZL#F5J2&#YKWsW5{Dk73$S4oTAgT?84YVel4D4X zD(qL7(r@9OZ;{t+;j-*BTc)H>1Sta$*GQCh&Awgt!waTV=M)p0i#-qN*y5Zb0UNnN zO6?110K-<)PL!udlrm65QU+6hOx_|e;^bt$lC~|o59Wlrr1Mm90Rs@%BO*lat_ZPI z8;gw#%W@~In~K3S4iH1)AcSp|ai&>{j6Ro-kZ1x1YLI_ecrIc*#k`7Pw@%$@Nwdmp z7>EZUl7>OfuKU4**s7t}766c{RAPi`oG`#lv81TF1u$1kU4f{4c$A}mVW5%_NW4wO z6}6DZSl`=`Fey*Hp!%{*P>r%2`F7n8Z&Vk~4CYWXC@?sLHo-bV$UU{$x@us?CC}dp zyhU?x)KwY)`Hs^p@I)KoU+J=lM&^8Tf z8qh>0q>5!379d?!)S(7{sU#z^Y13(OGNE3%Zj{dr9ApLZn3GKLATsEx*0JWC%uiVo z2i3=+(m~~L5xee(LtSpH(4+<<8q#G#s960hP1SW^TDmG*o?yT`dM6GqIt7 z3dajN&JV%S^Fs`b3`0{*&aiHXb=uak!U=*z!v?i66!&IXmQwvz&7>YE^`N7U5fyCJ zTRW*&&!P1 zv>Sko#Krqx7m~PMGEKF>t~eL372)DhR4#s%J4h6KO zeR4lWBIIfNg#5syRNOb5be@Oy*!TRQC>`TWx~e%LTdB!^mEw-+@Pyb)0(q`TM7^e$ z%s!#@3W)<)K-BxaC)yJAVxx}C)whB3hyubrbjM=vb9^7&%}B|s_WFwU@z|hdSDrOy zIcA2%QaL(a3=?NDE6*gmTwpwQWF~aT6dNn|8XdU7^V~aYJblMJJr2S|!+A^Aa#+F= zgK1`S1ib`*Z^l2;%MH_0(amwRV%@GZWe@c@0TDtzfnC?RsLE=31VReuhN5x=ZBA`w z7`n|gv41NzrVMkH8o)q|tCgngaS-c~65LKxQ_`1&Z)Ob%4yiy*@g);gNx&}W+ zo`hvG=-DJ-m*!;<^}hl7XhihU?utH4Arsi+s_?H>LsOut3Iyspfz&jZfiT5lt)pEP z*TF$tXNdIGTo1*gUGqK*uQ(wu=39di;(dW#_rry*TMXNpVnPD~f)TRC2^i>DMq>zs z8X^{dgBrBDjF88ADDo`B%%PlGH$%v!T=O6ickR0Lc@H>SW>RBmj$VL4ClSbsz^?m& zhC_^jq3QrKgKDyLMinlSOfb_lKr9Wa785H=C&-Fu96bq=8wYyryKGd6{ z(quh|gASCWir95OoM5JzHlj!;lHYePU#*%N%v0UZx_|;ETgps-s_;%e7ingY50sw@_ zFf3iAif!7ur2+$(HZ`G+D8?M}u2N$pL89W31v^+eS2E#tc66gwky-reqYOo2Pkp<8 z?uRl2DYT$vGmZ_*qQug53K6!U4#YSakeHk>rgS275DjHYDBhIsUYgB>8_9W1Fx`wL z>4G~}VZ)WO==? zLGt9zG`4dTvfdN^Csk7d4Xzg_v;*3Is;ymDsWz^zSTZSNKoavR!^nn~*fSMX(G>wI zs$t>Q5zVyB%BCdc88SVJY9m>7)y90=34r1Rb|53))-Hl-BMHL)BV7I`oXO%5M3HrR za6QJ=)ajAei|a~BS<|pxRhHY;DVxQh1ena!p~{$HVhtF&Vj8+kNVdd3Qb3n~@U9E# zl7KMS8Oj8ca&&S@m0J=Jx77eFDGM65>uxJ9VW!xpi3zAUmY60ZShFprV}qK6s8|75 zfrhD9G&?GvJOU!ExD`rBkh84DQ3r?CB6d+$+(Jb(D=q(Dh8%g7n2XT$;+h^o?LM&U zoE91*ripY!Os0ulo7o6MgHuj_44`O`Tebp_s*3-N*Ta5rrp3gm4RNj@Ok}?X#55BaRN&o~I@KMhcVR=b zhz7;tFO^OWO;uIdl9y=6=B8m1u5j_eM!V`=l-q_dw=9HgiU-bz-T=5N;OL z0WcK|%hf`w4QGVm?EFGa0AYk6s#?h6(3H|UI?#bwrzzDD5{EDwiWR(rg}RPe*v6cS zNAv&L`x1C6x9)$T5JC|p^BCdGgF@yxV}>Hman3Q%^E@YWM9EYcqmax)WJ(zlB~nPp zOoYt-2i;ru*1dJ#?(lnm|L=W1pL0FK3X6dJR| zkHy=2oDmL)U$KGN|6}*yH;#+jrn9hqq*=1EegAO{aJ;+sH`j{9`4!81yHHoPM8wQ4RinM)mg&*k3TJ z)wii(te+XMFPYVNJF~S$MdR?}%m@bt0Rb?$5#FXjFfa%PiUL8wI0XJ(%x^HOp<7kT zKzRLv3j>hCQ26guO2e=1tXSn7zvNZp`@qV?@tXzFKD!kVwB_&oZb7t9cl(l6{qcr2 zC?j*MgPXOr?eVGWqN<`Rs^q&-8a+}f5 zipFlym8>oC%58+QuyAGlncx3=&_abFAVJ{o6iNIPc?Jst5Pq`!7t z|E2Z+n${2gw96%h_m54jjCP8rnW9+jQCOSpT6>>=arl2CasRno{_T>dpl_E8`CRU= zTO5J@k4991*sXOs6pluKu^2;7?mW z;#Q`Xra#ry{8T3PXZ{BcWrW=-hUsWyiZR_Luzgm?5&y3ZU>+tfd7D9`&|(r@TU!; z9iHUJ#JBAlHCFgX{3ZEgE9GRHH)(3WUD09dAKy*;|3?%M@|_9@`CnB)AP@~kgK;<@ z4vat|Ay@>+2m^(l`V2n~lpz-TBOf<|Hf6Y}i$@%_P{azxa&Nc}rr(a)8K zc2bhJGiQHM0(;9J--;~!>{6t zTLtV<_BMF^+^+xlS^WU4wf!GR2lz+)A|&ve0p-u-{`b@p48)1c%1*%blk1`2?D--EWqb-|9kp}Lm~k<1R9P&<3I=~2#nkM9~y;5 zVc`%U9Dss=F$g&3FDokv`IL?#{n53;eylivb=ax%@hP9~S6M0FN(}f%6b|_9LhYZ+ z{qHFp3~zJbkgbd-Bm{whU_cOmGz7o;1Aw7MPz=fljYdO^KtS++;N^dx!hOn25yxQg zYT*TD-QHjN-V6Z%Kp6OUW(aKGPZ0V$)w;hT_qV9k|0VJX3=0I|{X6s)Srv@|ARt%> z3V<=fPo;1$0))kEojL)>fd8_p0-pl$zsGR;9#ZtDZI-_?4P|Fr2mCvK4A3v-{^yho zuUHTx7~V0%zd~>jC=84NLU9lz4zg7#4}k(8@P-5d_*)rHpg&ME5)B0bU^pxmZ(cD- z1Q>%tAdDbz9MT8}**ZD{h5r`}hB5jD>qcg0pOSTZpVDZnNYs|q{I57*5+MM9ecWA# z{!=H3{&pMw>XStOz-fbclY1tKr3&p+J7G2e+SGMAOr)$8zHdclY1t zV9RgQ&RL~2{x+CVSUA`S4S*XVvG_KEpx ze*)Ur&f3xDbE@o42deHgR%!b|Jw3PA*fyp%*sVClCs?))kN@>!*JoDB5v2(Pt`UR=j2=C3= zZO`^!1kbiqbn8!))z;k1j&`)d;MeV@R`_4Fu+X!@x?qhQ9k2pBBSiqOdIDzF=&b>a zfB8K6wlmRv{0xJ&v9NaiSsS*iuv={tr%f$?cbpD8N4#T!pO?1UkF|3$HQMg|tq7dM z7NdE4=ErSKjXO8q`pj-?rx4$HczdpoH|_Z5SvwnSVX;Mz|FlD~^ZVPB>+PO5H8#fo z%;z)aPK&oC@qfE))51Sj-d~N-&z0t*75zCf`BlC-9u89+-hkU1Y&lfFj%0pC=RbXa z!4m6$+8Lw2{1P5L`(MWvKfd<~_D?^9b+IwU+lWseVXd4@?X0bKBCEfa-kGa+-reG> z;~(DIYKN|FzvZWF4`wHno#|G1_2ZDi_om}->o8t70oyD^2W#`~-*c35wi1`rm2$Bb z2fA4+S_;UDo3j6GOeIZ)g(bED`&0mbVe7nzztnUBzVrIyrV|7eg#Tu7uU`&f*#AA# z3HwpgiTHC&Cv4|{l|NuQ@%@hX{l2f?L9jo;bi)2Mo&TE7Ki72Pbr|_e)9LIgr{D-i zAq7ljFzQH{lK=+d`WvPb|Kq>9*GCLL{WB@r0qD6bOGi8!Wzix7y_H`4y*q+ZO+{tlQbzGqtzJE9kG@{KZ1~*B|0l z*5E5Yv}Md~t1ML95qtriv_3L!T{{XCSGRi-f`xmSq0PEM`gg*|} z?;ObZ6}kU%uuT6kpnyLP)OU_5*#8fs>YoD&@WVjCe>;No6}jI7YOCi=ajpi|Ru--X zXuGY+dnfPr;}iTB0QrxaM+EZ6!Te?d@#k{?-J@>%)&^UPBlB%f`=7yo4DrL5A->6V z{ao(98?%3SfWdzptZ(L)eJ=Ok4c7mS0ru+}rGFeV z!TJHPemKqn1b*L~^-=DB-{tdP2<8vRLV%#}oYO%6&S^gg7W{`}9YD}`jy%w}M;^+? zbZ1v?t3JM&sU6DT=e3X3PTJE>?h=Uo|30q&Csu9n9}bHE!QVL+!T*lM9|h}&!y-WN zclwv$fBnlJ1?z|7A>WZ)|GC_MH(38Stl}V(03$me3JV}2>ZMy!Z&gHMK$X$fcp697f5}4{})hwd=G22 zUB|)R-eRkCwJFYj)aWA<^=nZ6=AioN#vf^PKc#p42Z(KpY$tfw;ah98T{dF7*7r{= zyPr_`saE^P#1{ziOTd2BOQ>z4pn(PcRu)@TKz{DrFF)9R!Y|*pw=%V{!G7^mfRFw3 zwO{)7Uc~RLETTl1i|58ARG(^0tf&=FdQ$=3iy-T@zu+5i^t5$N}zzU#M=Lk99|5E`#T!+ z_g);VPN1zK6RbPP?}egqMo1hEg@J-$U?>0uMr;)@06-ydj1dM31;gP8BoYNev)W;C z_Cj0fiS|N&JCx<`|Eip{xYXXgs^XH0_y!Q-|0B9a?vj|)e0*OmfP&!3z07wJ0dqp) zbbhI&5vCkb1#1XFv%=zXJ@#AnIXn1Lf@_xTB`4JgEs zE{Xi|0)lG1Z7q+93HCD(#j<7_3&$GkN%n#-j zx_fMYk9#QeH^)Ez`qlUc!tgJw(7&!ppRWJ$@&5^b1O|%PDqjLdZXE@RhT}&q916rh zfLJI94hDe!a|QY1_``re=)d^?9oHYg|37vV{_y+{0>VLnf9L%ntti0HIfPi3t=gD^ z_`VY~cKgOXe$V~`L3qTW;9uE)Fc1j**Z%(<7fUE9fpydgZ33d93P(-7sc6v<66X)s z*>vE&l)W{6lBCn8o;nOp?KAj)Yv`$PKi!#IGVXdUyQhL?|AQq1F@jM^3c}@yV=G;USP3^K*1CLm(b5ow z?D8cbC0-YyCLksPbhB-)=AsN;TwQ8=U%UV&-%q;8ya~560n(0d21sriQ?a46o$1{< zYc(D=HNWVgS+2H?6eByh+kf-r8j&x5wVFfKCdVc#kj7y{oPdDTpXpuoK#LgjrdXR8 zPelo7MR*d=s=*kKl!R0b0Lafzx|hJOj=+Xgm3WT?n^X?lNi`s^CIzvN_(@fUuwJI% zIqG8R+8mJpSCJ^@J(DMih|~|!?XRPXIS+T z)gqioRU`nkyYEQ&<=plqAbxUxIQS&Hw3-d46!C6<4(WD-l=}MHQoDHHc>~cStDAf# zyt1X4JRQ1EdLH-sQxg&e*U%7@#?f``rSv3aI4^Nh^*MVAZvd$dg_ULCNxuPVnjvqP z;YdJVS)UxLl&YhyflQwC&+%cUA<(4Qy=T{JLv!A}yZk~^peQXg`od=R(Dpbl6u)@Nlq5*DD7dQpq_4(WbM!8l$iDcXpW?)!+(u+=}YC1$OW zyR~^rJ3y6okq2T3WM%MuuvcA)_?Q{xe!3z;e`-0_{dxKY^a5}X(()nwe;sLx26nkY)wiEaV`_%BV5|c?1u$?5Jh^P`!r=_F@ z2p8S)jsW3XMktryKC50#qyz^G4<0>Q!)w#hD za&qHE+jCORy?gfDDB0iRJm33-oTlJ>N*D3UNJYpESAxJonG5%CixbfB5+qUcx_Ptt z0%CZH*JPQJfSke$o0VF;Z0f|s1%8q=qrIfNb#5#ZQqV|$g7?PzvdSTpG>JoSM7(=< zFY}!4t}fl3cySsgC+?hoDeoy9g{l{Wk-+p8_s%o)~57}1+7^+YRI!o729*Ze8F4PYCSaNc<2NfWQ- zy4`X&NspX=Uu-x->_bgQBfZMG*Dv(?h5&Q24I>rG`a1PV(vzftq4%YuwAcX`V(C;V z40jWz(gadVg1IP6DNokkmbz#|OKP!T0BtYdY_rX|&B~!7ck?JmX2>-8ohRN!!D&@x zdFW@Ps|3$nt^fj)_dA77JZ)}VZ>>_(Ys2h0m`VG82x`_gn>4F>Ig~K4%_T-I_|o}m zYEC1um1p|}-k%@7TNS=WlU9G>bn70kz4PgZPd>`mxhJpUfU)Q8o}~P6Uz<07?1E(s zU(^lH2TcYd^$C=R7l znn_@Pd}2>G$<2THk|uR59rOiDk+OX9MhaINEAger_ZiX+4K`D55M0_fcvxl$M?}6f zGiMP#yuh-OI#13b7Nt9Wb(Ab(fZk%r1Qw$kN6KA0YRUGl|2}B5!bbDq^yaY^<=17t zbV~EiV`=XKH`U79F28O#s0EnpPY*O2Z@zSYY9+NJr#pO;adu434_jC|)!%SwZ*9qj z?Ce!5zk80y2E4CaJ|!=)D$;mEN1^lry>F1Qnb{R-4bhW`{l3N_YVHyztAgp2mRK?v z$tB!Y$>wvIBN>{Gp?E9GVp$hLO_x~!z;ZO2LWMfb+Gw}rrhfb}?lex*>(^M<`Bzha z2D}F!U6Bn4JFDYUy~=cM|J@C-)g}^K;Wh z%wr0Aq;dY7laescY^p9!Ph=l=S68lf_CQ-U?1KKQzVt3Dk?{m8w0E+T;$w7mHrXGhB=Mo`poH-E7y?pv02z_egk5DdYz#~>tYk9=yhM}gv#gQj_;=!rlD~cog6YLSog(fpt?KXmbmIFgy^~QnZo`^H7 zORfz?c3sON8iTkdXTE;uKHko>pLxzJ@rL72kb~p3L6*DG_sk>rMQrZj%Dj7nQ-6LS z|V&u^z=)H!4@;jz%;V>HH?vKi7I#$yQjFm`b99*UJl&Wa@h~x*W&{7qb zpXKyXu`*YB*vW_V)ZIidsT;AE3YnQM$Fe$SD7HI9X|&$D7pon8y~@gxb$$A3VQ|HY zj?J|hm+&}$kJv{ibSFulu8Pl)ym^20@)%=3-^o|5ti$c2W=O4BO64lsse{8Q2PgKg zH~5^Mf%7OFjCa*tH_wW{Ho16-S7{$tbM;zW!R@f)w(5XKijAmdiRIkeWn}vx@^@{| zPgr2|22`J`lpG1zO=3bPs&~V=e`CG4R#u-(sBY1J&y3r@t;fUTy(O_BiL=U!U83}5 znMktHtOl1kGHP+hXL0xS??(2%P>g8YxchoFuhp_O7x2dMCf<(I5bP(>>)Fg zXpZ-zR%TFe-(}6*b1#$*Pjk&(5xeTb*uUz3u8WErh>z+Rp?q|OIL}D6hJsh-%)aZM z(WjO(>y~alkDLZXm{r|<$jif4pZ@d_`BMw46L0TaF06VZ90fsLVDe+(N2-$^iu-*sJ+QKIDGj z4hv`A`>)MOK@0q--C;lp7e>OLk4kI;bnw5FHxp^T7`q}%MUq@cEiT*iRF8<%q58#vah{X zD{Kh%b2MMLwTmE*en{)!e4Xmas@5sKskSPA`pf9+`_>{4x3H%dsLD3CfNw`W z?~!YFpPuyJWjUhZ+7-2$PcrI-&AnS3svfZK*vG^W7Cd5RRb8jg2#xo=Q&baQiwZEdqCWnntcV~J&o#~;Jd~EUJLChJi50#65%QMfom3mNfJ{(n8)3KYqMSZ+y3;7S|zqi1+dZ1J$zIVFuua-7O6Q_DFM_<1{v~$Dmn( z@2Qt}quZlcH3N<}MkmdI$eU5on>@v~AaCF4cAqixs}9rc^gUC5{r!#$-6?TKD+>pL zY}WFsX&8IMgEqW)6l(fdPsb41u>_YeD-!ZmJk7X6`A#aB^i^9qPx(oIc-nhm^Ib<_ zhFyxY;_~aF6OL3MhNaPaJ%tc z%G-{yaX5#PuyJL7lxI(nPIm804V1FLkq?|`Ge7+?7~?SszJf8OTTs`HkQ`1^7N4cr za?A_hw9!n~SxH@wb|tq>dcAW9p)-AjG_kQSboS`cUuk$f2=TbYWEpXlD>Uyl%=J!O zw~(1nZZ2K$RnfQ4dxk6`-zes?2b|;$cPLO;0v2^%dbGNK>(EuRw z6SZ+xoJf`?nOYKPTa`C-&0ms@YxIw{X+;$ldjE+VsyR5cQv77qYwK$X9M4L0{_*V}22WDto- zr(uJI16vFMj)J{Jf7miqyI)M%R3l=XfxATI1kA)V201K9dV8L6)Pfv2P4lYcfEDxX zbi|4-(@0Tgx#fXE8^<}Pn^UKUx{QBR~4R2P*Lrk!igF-~Fef!s~KLava+T{WY4F=G<(@QH~Z?Jx#Q$D?89 z1n=v+=yqOEd+>IphM54XAsz~dKy_VQ`)Puwa26<(-dZB z3@Fa4R5YEAxOwcQGAv*9+@eFC8=7>kLI7lcEXkt9UGgY~z+P!uAdtlVfQ!cixl<2p zJUyRlkDZfyO;qCL`uK_6hTPTKg4XEl?s%@|26%*0e^%doTX(BPp6uJ1;~cZq$o9f8 z1ZOFm(hy@a|42+N3jzt#kQAve6?1ld=OLOGdnU6QXu^29Hy|$=)t7~pA@(R9b~<@b zJ4Z}@#N*AffVp2c+mFlGk*O}iRw|JUerPu!K@T89LOY!DzQAD@tsjR5(u?7E|cAIWb z!=fpYM5*9frW2%9Dj#@rDEgAvZrDERPYl3yDWQzvfuvbe>F*~v6tW^$JxF?uB0pqZ zCS+V|5xrKX`y%1;&?)0PG#lJ4!^g{S; zf3`<&fm-Q7G2(P$NKaL}w~+)~dw$jP5mWZ9R9UIngc-*{IqI<}delB48$C-QgBEy+ zuq%XX73ezDezk_-V%x5=N5*%rPu!YwIr$cmMt7?1Fw>D&UQn_5sLpjFgLus+79UW` z$~okcCajH~me>Ek>SJjrL?^XsBH>J|uR^dB$Nwzx8BCT3T z5}B}4pKBdst;m*0eql&%u7S~txj(bD@2Ep?4d(Q7Q<0HESEsy$Al*Z?@+LZ!S?vM!T0->7LM7UBfsZx^-5bt#j7hK z^Iky|Zo`Ie&gLeJKK9o>U&DQcKfVF8=jq~mO8yG*o`%)MsrOKM={xsGpHqSt-f6hC z1!1M;o?)aI5@o_4_lqeiy_UDGfAZvse|Mo;uv;?g?g4Y>C2sQMTAfX0#k#QInNz)W`wxc&(vrzqNz-XX4!Lfwm2Qz-5J+mz{ z!;gw%ky?^nybsvML^}`ZUo#lJT5nQsE`L|$k?~<3@wpR^h~BY{&02i0f9Uz(e)+Z5 zaUF^viE};WP-Q|6nL}ckOS`S7LRQHY`ah^QaC)sX*$!md8?PRtt!08fKExbq)pScP zzp3;L?&^#C)+@$JHIQCQ!rQW@&AYIUR}`S<__9TJp_vaAT$$|UVsnelG0(bG^Vq>* z$`Z~gk+SE*m86w@@^1A*e+aGnB`O7BAm@e!pqL;k+_$%2c|9zaq^w2AS#OH|E)g;X0$E^S#|Gh0$tj8!A5h zPA|*G#^-z+Zk>M1e{8W-5O_4fS|i(hd_@&*;eRJJZ{Btq|bjuN`SI(pa)m(({w6i5Y}K6fd~PIKf33?crye#H#f=;$HwbzF zfpHoigDpFF9Z?2byKvY)E*g)yMMCKlcgfI%!fkGLp{6G))t$uA)O3K2C8*+MThVSi z2QxYxnMxu<(jeUmKll2pTVV?HYw^kiqNS6#LH%mtBFHs{ZZEC$=SvWuVRp2v2t4`# z=HVjvl>KgMe+~?ce^ut)-FSs1b0Uk!2f`-C)mO9C2Q0iN=aypSUD{0wyX!nJhv_Vq zFQPNdgY(_pjf)|@Z&XaJFYz_k8rL=H*i4w{Ir-5q?rAE>=|`+E#xUi?>66}Zq5&s~ ziHDyvkN1ANr~g7M*Qtf3o}+d>q=S5Ycjk{UrB~@bf30CQTW|GWei3BNC_B{PAl3F^ zHTi~&sX+HYnV9g5ZoEb2L32d9;=aP^6Peem8qlI|Y??M08?xLqB_7oYS(EK{HZfIt zS4TTZW$ZT`VLj~(SLgbmbG}MRio$WzZ61b0weba_yR;|`q_by)6-X|d|f6dnm)3qj40 zGqYD7JUAMuNKsG^7BTDlKyhAA$}#Ljc&`3#e;#y>$cno_{0QstJ+%mZ$32v12#*!R zyWcFab-cYgW778Mg4dl^MXhDu!03b`XA>@o5FaymGl}|&ZY}sslqpKkMN zrR8>cnTN!_M>vH8(c*gI?Ki~Zmv6P4C=p1Hz_?(TUbeus{21>&Lfxh$V=0lOx^mXj zf8U3Iopm6xQo0oYkDx$cQ@WeRPusgAoALL9YL=yEHxM{Ux| z_C{96`L3BU%d}ok-@KmKKdJW|_F9sbG~K;q#+c3rJM=u@f z?o9Sn56oV^n$+=@l6>zqCQw`Zt9=SNUA=~4EJJ5E2^f-bPnB{8B}^z!pd*s*G|U=6 z;&i>OR7zH$Zlf*}>xNlrfi0CE$_wlT@)hAjWh4*u^<%BiUAbNApB0R?1kAbx~kT2lF#^JHc*vLY%wN0*peIH+0@cZ=t#oePmnwZ(ynfjw8~j<%ODPjfg_ zX+KGOdA&z~`8=FOW#7dof1t-#T_?TC4MX-?7jWL5nZd?MO6-nYU@ho%J0CGd76dcB6r{*8`g zK4`cui^(E`LpP*d`;~J0Z5L(B38@Y$YvH>mya3fJd?U&4D0TYLe_qxCCt(7zzKt!- zrp&7!rh1slHoPb@!C74sH?*q-#KbQ@rx`N1!YL-C-{zqo+|PeS`+*Ko^kIx9;XR^i zgT|cQ7fnOOrzb?wS&CyMt*as_w2xJ>vFJhH>ZgaYa@}=P+%te~0W>l11}VTcX^omw zaH`8(1bLto+P4>#e{wIhOf)C*@ERu6-aXPoedpj}>U4Z5q9l%uw6?I|&BaytnbkIv zIyW)>sik){&3RI#_0x^gK4?4UWa0$SOy9 z`(uF;Y;Q|W$UXoO)j2Wm3-7 z5kgVh-D}q$f6;fzn;wkI$XB$*QfT_kklz zgT&85Jan2beefs&Tct=mlgRFontl_X$de_RuoPC#)X5}k_Y`v`IC>d|n%&Kz%45bZ zhhF~`|tzYn;{aHC5kulwHj>7 z*u&eO$;`}Z99r}2)m$qs8g+=y3@)=Ca(@+VAY(rzs(ORW-$djF%>A^Xj?z6Vgzs45 ze$KPFD5x%lU7_h{WdB?S(HWXkUyfaZ3vz>-WhUaad;u> zjh49ngpqRR`?GvU+sf1Es$ViQhe$%;!ebR=;u>BrB^-`je|o=HD_*ri;odSggVL@JV1Flv{8M}SIi?#t&<<-= zM~(MsPKB?;ps_eCx)GAvQiamAmAQd}NdSPifE2fvf9m z#`+aC8OZiLvp<#5*bx0Rti~@@<*w2C-9fn5)S0!E(uVzez_oK5=fQN4f5)R75z|X~ zU=23PM3tx>n+z{F0;#NR>n?tw%4ApT^R*`=Z^ee+kD6sTJ`ZT|Wv#y#c`dp2SW^5+ z$>sK;FgC8}TT9Y*V?-i=29m*A!^*d4eu5mF1)43mhFzt|;S=K+F3+`JsPT?6~L&BAz{D~aV+ zJ-j|NtzTJUALZ=L!QPZi$&s-GqHR5bmlb&v^PTFa%d!O@w6*%3;5UkR6@2q}-|UCe z5+y-T5UXo%?@uSbo!xk}*SJ`{T`l0s)e&Hg(=p6$2xrzgl|8w-f9zgi`7gy|5A1?J zKGP;@mgwRv{$V3rxpE02E0?7dT-)aO?(z)(L&MqKNA*6GgLUDrSLd9^nSC#{JSg24 zgbuNE+q81Biq6&ZS^ze^8=9Ggi!uos(bAui>BNybpS_WjICSsr%+!e*VkwzJMX={w zPqh45y-n#)Wo2AFf1e+-hotVDfJ#QJ{4S67b6vsF?_Wp~l{%|*dG_Ecp&OP5%g&QB z-B;Je?LE!f!6gwIb876#snz!RSIgZKT<4FlHBAuI(}Pxv{9UFs!M$h&*MQSQ69a!wU?XIw+(&>lsEqdHZ9{OGTrE=9Ze+fW0C? zFxU+qA`dJFxnJhg^08QM9pMMTX*CxksV;HhrgG~d9(bR%H5jm)&zIdy>bOZKG_$l` zfKykoe6-Gze?p>mK(V(m8GMW^eeY24A+m!OmEm17DeP0AO+{ip87tb z>R9NYJ^DT;``z-MQ6&E}<62rqyRvhaK!@CkLda5)t*Jg-?@Y{nd3K9n+iQ-z=2Q@r zzJ+lT)m!3If8tv)+B3ICgK*w`smTOUmR$uO z+OJx#FwsZKHf-{}&z3+^=6dqaDFHRtW#qLvx&iOm9}joI&KLAT6lQpCG)c(D$um3= z*t?nhQisrO-|j_A<5Y9w+-HSp4Ode$Lo$*HqdI1dh4K<;N^Fy2-NW{9b`Oadu?D=D zr>Yvee-cE_cJfW;Q>rVaXL_;@;{uGeZxVH=9qeD_5^bl&+Q47r7qKQ*J4fC9&`OhO zy6e^}8I?jrNuhDl!lfp|{V^rHk%Bdy!!#B5Znm@ut(g+`Is2()ZwG@ELjn@!?nai&rt2nzLJSS6>-)$8*#~klWWD0#UyXSLF3@Vwrzl=o~wSY(o{ZfukxS@rpTo#IpWW?9a=_wnj)WKzk% z39AmIh=a83*k!0s0Myk0s3qnWYsF{pNo#U4ZeC$Ba4G2b3}gv-A^)H>S!jjCgymBE zN%HE-)M>ZFtqjvj$w>9E&XHga7EYF0e?Mu^;>xa7MoL(+H_;jF{Y=5Udn~71?aEk| zS|W=EZRHq|GKz)B(jzR%s#dlIr_ML})!OKF(pww%*|(Q1pWQd=B}`rrtwu30K zdAJ9`2{(av=LkPY7TD~|Syv5IOn0#eX)HAHdl zO9ejKO#1hO#(Q22#?5mFbU_E=SBvZ+P2KjT4OWqw*(C!e9>d2}$2*hfrDBJe+=f1=~9W#x;_kt2g%dl_@R^!Ba~s27|{O(V*>PEr%0 zMR$*JWbr|e{n^Ks6eFo2mi%WZkit}<;T%^wSB&>!nhSXywM_dvj&({D8~5MCk!5Hh zLuwo}VCCKA=4=xaNv8X#5=QvP--v{gYc9l&N1d00^GA?`3z6!`%!KOcf4%CiuD6-* z$w*?!?G{paeH$Jnbh~GhtNH4bS^8p?TiXn^e9h8P>o@+ZH|6Us>?|zQASr~mrgFs0 zO&fD=tOskx?_YCYob|na)`{ZQl}=mXW`2=J$Vpx7*dxWP_x{~iv3NmZIlCf zCG|OZMTIe=*qZ1>-iz zG`sOJovsrU9_n(3xGc06+9$}?`;+_BFVAI>c1wGv7_b0OyT#S(zaNl~^|5L&cgqQZ zw*+%97x*c2BncYRzV%M-Q(#Z-ok(W&cUs%0n{=x02sJN@WBaoYnt+$b$$1`dsorQ= zgMnWxF&-O&aHZvMe~7YbJY&?Ce!(s$gzhJrcp_2Yi0 zxd#Kg?w`|3>^3o)eqlaXd2Q&<1p-xh&m+2LS7hDGk!Omze@J$<++u0(SMhiusyyCo z*}S25EyT!sF08iH?)8gPP-SMXdr7a=`mHLcUOd`Jk>!oiF_kf6Bd=5EqFovuk$Y^# zScn`sn%;0B;^4LFbFExvBYls2>TgF!Z8~}2IOGf3tXhK>eHvVpjw=Os`*j45^JW@@ zqa}G-WOb{?f9p2*HLmm@_r|{1zZ}?w1J+JTfU3OWzrO6;9c+HKpG>AY^VM(-!6=b> zL=a{7l#=3^%XxIL_VBAG>w?R=0ix+qjuLv5Oh zhHq~8f01PO@CP-f%%hFwK0{u%?Nof6sdCy$Gblkj29Pg7$veO3M1)Yf~pS zCMhjpXr=$NG>8|%FI)rmbBpH;JDYQDQc;xn$@%x<=C}tirdhvPpg~M6a`bCy)Qe1TuXR zf9`#kb3id)4W19)Gl_-6?x{`p4A~B*dkXU3gjLX_2h{kMU)`h=+&m>zt9Rt6{ME}w zCG$jqjJz41gX@#`Yc4^H@7c?%8QpglWKD4aSN10ebt|tj8GmT#y?@)9GGCV9QqmfZ zu~V-olI(F17<<{;AT!_$Na=y-`FgT?e^SSL!^&{CQ^8p;-7N1u#deGye$iOVIdr9Z zX+bi%`BYe1EDxQ3R-kb~y2|6@Zp%}N*E7u4RUR0ObI+woCp&o-TZ`sgeUWmsBLSOS znnzQ8_0-zsR&3FmN%H;=&GOn^xXY0$fi3pe^cw`Lkcr1n(l^T;O{G7~S!U|&f6aec z*?L$;bRecfgXV+O6PpiKQYvMxV$~UglXT3{Xwl|%a+B~;agEuzFqXhQJx3kSo&i25 z4W$r_$Q_|3RGA<@Wc8%raS1SjQbhsOv{A|EGDJ&K2zzq}lySb{z$3zHyTIGk+J-!t z;b~H+UY>p0*Lk`s&wGFlovLS|e_Nz0-K)-h@y2G>>5@H+#}B^tI@IA$RTbtmgFNH# z#4Ybi-w;>F0VDB=-4N%qcPkR8}jKaCk zB}NI>38eQgoZ%Nf9A_(4je;LB#hG{kLxntl< zQb1lX*`xOrMQUwi4uTc0Ph47Ad)3M^)(Es`Dbp zZ&v?8vc9x?S>`wwe|GM$=pO4Bl7hog7N#?^fp=EO$$O10oDOXQ&DE)xcFQQvvM!6x z5p-zMcIDE{C^uWEA2%wVc|l? zw1%&|4_Df$n^|u3s};|E)&r%`9u&BptxMtecvu4il)3sGkit$DHnRvbf%Z z*Lr)y4k%BkF($RdR;ItW>-v1YM*8-GZ)rQDV@^nTf03}p`!ihATKo@g>r8ThY69=N z+EV5plWyOid+%{MbM$W4o+zDtmyG)bN(!Dkf{tk{D0(BUD36|{8p(YV#cP3K%vGO# zn{>uggD(LJD`dP&+kf`zl8xnJZDVCG(qi1h{<{3B%GukR=Pkzs`Ff;>`cQG#lMN(_ z&ZQVKfB97bJ&b#*uF{nFw9Y=;SZ^gxP0KLI*Uo(tC!s!Xb|ChAYGDN6y%hOLAAwiL zIfSvNhwH2q39bmOWmJ+liS*lD$s>8_D-LxN+f81q%Zhz4^P*D1Y`-^9sRMnLb9T~IC za_e4_>ththWAw-K{fbmb)dt2Y28wzDXgMZm?*-|*chSMcn#_lkFanKDC+zeM0&E+i zc{&$v?dP^1E*EnhjXzYd%o@MnJ|jHgxCbW;)o7#yJ<33TQ-5tSP>5yfWCq`}6UlcO zf4omH8@cuvX%(Ay3-auGG6TJJjeyUvOqpu(WiM+*Yl^SaElW*3RFA_V4Ybk+bfGe) z?n?Ipsq#i^EYLg#HRzTdO9^)}@h>dz!602k#3J;uUWxq}Tr&3wHXDug8xK0$b;IYI z&sJGDzkOLtIWy3HCd^r#fAr`jSLA9&e@bsNo%snzt3VS?1*2#Ry?b(N40T2uTvFE0 zk3fza9agOvA5=$GQlsEK{MXylmEGDc45sg$KKq8c^+rB2ZB+D{;Qaebr_`9OYjs_; z_tB8#ueM4yEL}e(Cf0OQ=vt)2LYZV0^6(yzFpS2$GHyfZzF~U%oag+30}nvNf3u6? z16A0%<)^04-%AZ72!)BYtoOs?=|wqplZ&;RG{;}5@g1j{O3F4XuH;=kw7R=4X7FC2 zT+1T3+KN1S#u^YF-q#&M!l|t3tOR@yf!LO{WrLtBC^iN{J`>CVTLZyN@E(??U3Mtfr0Y>0S!R%zmB-iaS(bMjtMECj`)wJT z&gjnC@8tslbJwe~7*$v{IA6K$6JT^m@T-WFPkBt-Y+R(|FxjP){;v6C7mw}52@TR#N=13>)0 zm)oQTvbU0@1yMf*02n~$znA0W1+urA|Z%nP^5aR$3H1ppgB%X@#IRwWHx7KqBO)~`mC_vZ0 zw?%mb%M7>kvk6@@1ps|Og1?tg=Lxm9BDw?<47VNh3AHnS?c7yR9KqKpa9kE!7Wc*7 z-Q8``;O-hUSa5fjMS{D9puydPJHdk!BtQsy^Z&l8`*@$ORNcz&rDv+Ts?XG%o;p+0 zJ=)3)uPyj^Z@g6UKNu?gF1e5+oe=5Fb2<0vnOey*k9Ik__-ALs(7n__Qq{Eao-0t& z6S2jXV;#YN*v0~E>k}+bISBtM^MZp%U`Y2!RGLE!6XM^RD(N*0K%bEom3Ct<=uA}Z zREnqL={fApgBGA`oQfy;K}CnaOO^Q&yHYFt8xn?Znb#o zicnI4sJ2BD&Oh?>p_T-PM>S>&AN$MJfvJngQn9HbEvofqF~I-&_+yqc&or$8OJ1JI z&04JVM)zA(!JfeHA~+AV>=Z_ghQ1t%5S;vwuEI=z%NRJg5|zusy`As)1iqWdNhR#K`mw&y@nY@W4nud*SVLGL>%+6KNXa=h?4ZkJ9!9E(L{CRh=1u}QM*!t)?9&zB z1d7M7bpf+7@K$e+niX?;M66{yILrO51~Yt%6lwU$CCMEDvVE%IKud^Bf^2qAcQ2wy*z&j1@Qtwm)W{uv={fWMR zN}|SLv$aq?70M~uWKLG}xnHE6{bPhsKgAnSnZKF$b18*WGTmo{d|)r2)JVW^3~Qm# zimN`tut?LUUWcC$D7`mv=k754*g}fq0Bg|~d7K?vE>*PDOawV5^W;6?`!;vjjm18*%&wi4ZS^yU`0%pc{Lg_wo~0!_eK1jt{3`N3CcO@~x%5Q0Y1 ztFrCn+ZPiuV_&tNSn56X_mlpAQ2XRuS{iR}bHbm;IHwjMjbtSwze%za#cE?ul-B@Q_z z+v+MHZol5UJ9e~m;$dAl^iYO2D0}AVlU^+2|XWc+B?o=w^>4($L`QVjGZV-CA}UZ$y+nz%zMAW0jdr z-q%&?*|)Dz8>*3id+;W<-_^#}xw}33+!On8|4{UUnuB>!GQ~xXU_?q0px5AhXWNy5KREpB5Hd3(E9KG3ID;jNf>c7Q9mgZa*s)`0GUp{qOj=x)HGWYrMv_|A^YS8e9Pf?FWib9`C(GaKU(bd`Nr&9OIdqlf$ z!k9w04?1a$o72C8C!{|j97JL@(E-8R2{U9NK?yV;a{REpKIDBrjypEC28E$O&x6~U zNZ1^ICeE>A+++3BY`YGn=>t9pSgd}B(l|gxxP0U(oEZaiYqKt#o2<{etaI#jnmjpK zD^v|3+;ojt?OCm|3kN#F)GPSAUBP7+ve+5fcIc(-1eyJIc|Xac&s)F4*VHTi79CS^Mtx;C_2(kJ3>kfs6|h3&iFIA>J7XiQZHDi?}{|vmXke z^IAOo2(K!{f{AB4c88jPEvhec0v%l^yY`~xH#^UoyqlgCJTr(3c0=j4!ZV0+Y77T| z1UdS)a|(xoG$V;tDT?nVen^q0NZ+$09K>Hgsn?Z$sUN;e2V@lgElI!M7QVUo4AX7z zPe;w&_VQ7vwXothP4ETH)Q<`K)|d^33mG>AJ7m(GocdEfw+^~?7F`6pAQtVZ z(H7t>&Sm7;6co?8IlLRP$mPxdRv=e@b=d{Z8ume)VLkW&U83uIblMMPlp5UP_P&@c zLe*(82`E!g!=$VJ_i$Ur-v51iPoY!2Ie zMLJ_Hjwv>Pl}(9qC5+B|+3#98_v{J!MVqQ56>hv8lXfHQ#Tr~DT;cGppCev>?Z$0& z4L)w*G~u@zfnR=}<6|0~L7Mm3lqFKWSpiKNM$Vb8#BWr!ElT>&#+#n=Icb^}N(XX; zk!%U!37H3oM)L9*qiHaf>tdg_a2thkTJ=oh2g;@`PyPsu2kc@o{sK&#)N)Rd znul3%@OmQt@GY>U;zHDORm=QOnt7NK%T!Su-(`63hj3*)sM)Ah3Fd>LJSq#T-2k&Q z;>Jh=cBr>`A>6#VkXY}``mwaA6uZ&xMdLt+=wQ$e`#kZpGIa2h*}W%!+)06*)gUco zdj5fFFnh}pKOdE0@=T+SBBBy?KA-g#w_3zU-J?kBh5|h@Jm)tDFIs?1Ad<%t(Hv#< z&`6Z{MK&?#gS8dj*V~}ZzLkJR%p}d{qfqBha9?ERB2w~fL-t50cP8cBrvz4C$<7Ii z#R3E%Vzk6vUKH_0K#u=7^Ziu5z+(7E ze=4YhlCMIaUK`?RU0y{Yzs08DuRwu$TX#5=rWrFqja(tP;gU^ zLsd3ey{o=C&H_Lxx*7_HvY5`Gz!ea>u?j&4>Qf;XD|7isgJ@g5YAZ`UAE*hrHdqF} zW#XZhN(y@deIO=HL#;~gN{77qAWt8eMV2#0{ji>|Qz6WMbtg@UpI-nXaE!(Fq|xZI z8M0&}Bh86AJ8n$ur?EqPH6k}gy5@efl4%$kx)_N?h|Qs!II@VP8eX6!yRA>TG?R=P z?=Tc$YvhtOzgC7Ehm9YDM{x^HYW0IxNT5=xU{P9oriM5(Ooy*7cGbl#Byvi7k|+Zb z2-(F9C|{X>+RnhTAy|=cS_r&Us34UoJARq$VnAl{M1QuYVw$f{K5P%Q++hqc@__cT z44Lon-^lvfv?W-=m@J?$ieoA+^T!mWbW~#Oz0>N5(Vh#e7MQa68743 zje|bpJHcJmW`Qc)O@<*}_Q#Fr&FSSt zaLJs@EQ*YZ>3BXE{F%-K!6?;0hUOXIplGA2ZcRspywm>Tu172(}cc1A4q0U9t&M2rt0PmXn3h#TQc(ODsX zKML%BdaS{;4Y-90PTY-_a~jDBO;4_nv_DZpvX1HN7+b@squb2sH0KLb_4X`Ku`rShvvNqERKiYEL4_D@3%E5p%HRCW|%lMvfn^O!iW8=|Ch zR77llzsS$jN<2RFXu(a!tLRF7kY+5HQ3wEs@q=PD9Z5O%)H9ccnL|rbL-y+x2A%?c zCAJ%yrpm5PYeo@*PXf41;u9gSfqoOJUM$gX?&eb&3x&cogw!=m?Kmkb?qkLTWXSRstY1z{nMmz@F;GLb3PzU(ADy6QuM4Oo4NOlI*TMf^vR0ugESWr?X z8bn{Em!_MX;qyyRwJ*a#0c^GEoxB@=89E{98l^*f8d(?%*Z@3-+m3gIaM3yN(aerD zS&a!*D4JcwK^e|ibZXp#GiX8ETum~dTpDFul}n^alVwOI%rN>I#Nn}1(HgbVKxaS{ zRvA|ttwCu_cy%=tvo)l@In*S}3Kox%2TtCLyl1q3KAggwb>JpkHDZoei0vbPB&FH` zSQUmxEh8OjEr6d%{Zj+-eu#Ae(I|klCvgR`AjM1wvXkEld}n4lC}%-Dy2ltDeV94X zytfRe8oo+^j&V=1D*ahb+qoEy4jS(#;y_=V#4jTWJ4tqclI;j!^UdbT|59CEs0ddz z)S9?7*Cpjoxx6NUgY3!VBs!aaNLWkjI}ydhJD?wv2YT>A*KE%i=FC6s$|dj*s`nWb8RK%e#es{# zb8|d6co-|eAu~wxeXof9OmL=%7HMZ3l8vE)I?9aTJDmt;QfBii(?S$~-m@^9!j9sa z)c8!HE3$JE$(R{2 zr>R5il#0TFZ3LpQ(rEOah&P1r&xwe-P^9@+ZGZ|?eu$ML68o@K{Sc{7Sx47PTy|C* z723lRrE&I1aT44z9A&tBRDG=o;_8%##EH=>5XlLSfSgvqkY|d2Akk_}C#F1hOCnx> z9Ar+=+Au`fj3jgz28m);6I-Gp&dD*}NrPM2(q@boYPlIlK3~ys>Rz=@>cKD;`5NeI zF4r(o$cDJ-)HsV>j@U->OovC)0ISBviCV)K78?8mwHyqGJSXkIGfJ-6A}A;2J9bf7 zjf-tQ9=ynJB`9`(M?7r?=$nV}pjJyEo<5hZ<{M?C!sL~O<7DSYJAyBfLmXC4B$@R- zT5@IHv&Qab35ymM;l$~~har(W><8fCnZPP5$?d#~F zFt51O-(_?-fDs|IHCL(edX(9fjMyveehwf3=cdB_ zfvkQI@)t;d3VQ34o)zK4PZ@5R8KgvDqkP(`o3^!!Q(U9Ow|dJZH-xo6Cgb1VtMj6b zVfX1~U_0sdc`Aj(pl^+~eb*6EKXys}a#!417bmCOc+VG-FMk#gQh6e&okZ$kK6O1>4k= zv=p91mLCh*Q%s>)3M(gUz*v@EUVn4Q#F)jsD7xNW`Zf$^sLKTQVw0VA(rt@bJ=Bkp9~sI!{i|0H*Be2|2pb_ zT5zcKBGhsWBQ|pyKem{x{E zVsC0g_zjbo!rpm6qSt;JqvV zm@i>H@;+kt=nuF;dE;`8`fzEp7ZbUEC$qnh{{lqtL!PYbl8kBWYf``TxJF&B$!0r6 zK5wgPWtAB-8^~CpT38`qnROWLUEv|^s-Av7Tl4_Wa4w=I@ zb+w_~m*$x(blTz>99Arn7_F723#n(AI(J%Tvf4SxxcrozZ8Gt6O-_Rd+kcc2t@`Qx zJ5li{aP`&Y{MH+I6)9>Sz??cLC3_^@^|JORlr5gcQY5OCS1^ZqTu?_<)`>ME=qQtj z0w7H@KXaQ=Ugu|CD1o+rznzo@a)x^Az)K*j{DqJ#S!re8czp&rKcvV^D)`=8G2w?( z=CY_PMlfD#boXqY0p`v;y=CMgG_}Ws_3!0)aTRE{A~jhmG9_O%AAoefVp{d?`-b6) zE7J5-(^-YALs=^Imno}Vq|Q(a`@>O_I;7Yxk$6L1hz}Cj4+^h;rMMQL_W|Z18QzY9 zO<0hzkSbFU5%fQsw~7sI943*rFxF5L*mnyRQ3b&*49G}21LnXM)qZ+Dg*`**83w5l zZ71m+*?tXHBKUn3MNac2=(UU|(FfS*#$7m5T2AdfC~yf!x{5|8Erc}f4_jbiKpgk% za1OR1n`9=P=d}F3=|j+je>qwhU7&t%7v%iukv{VD_k^Sl{xJI;qVL454tnE$TfmB$ zTK;^2*gB-4HDO!*T}_x^SS71wO>>1d+Ei7-VRX!Fo|qZtV?QjEo15WA{>2F^&K5CR zX1GC1QAra-2!~d-!De&!rSTPGObP5k#Ul?%Tf*c*?*KrldC;dde;$hk_s16%jHQwE zcBBqM@P%p01X112V`V3vaFxsV1)IKLAWvfbfdoog1mEqHQp|7Pp!Q>#!jzjGqs&*({>^-`}5#vL1k23ACyXh#! zzCvrwO1B$+v_p`uQ>cSInv%$EQEsH)1tyw_q40%mGV&lFe{zCiNlRp9)kL%9bqQ;W z^xP$$HjWQL!lm)(g$%to4b1kKJ@w8YM6>8|Af(rH(yau4kD9wBAFaSt9JD)=8bSZ4 zOB6WyRn+J3XvM3dOoRmMl~9RmYWi};owO3;bqsq)up{}mqwQ0)EvKV_M7!Sbg$<0j z+(7lATv`p3e?Q?d3@)(rpf8D0I5yvHo=D%5MxRq#R$G<1t|m0Om1lI>SKfPG^RN>p z@ZfI(Jq9Hp20nJ52lc75?%0~S5yIfy4N+du1E%2vhYb3XG|?Uu!=DP}@sswjsdsFt z?1HcYfU^R0Q6OME_tYz`?D`ecc4%UkLf+sYaB{hZ2~3Bm#l6?o&3CI9jzNm?H-D)|yT z86l~mfB(fI7gq}nm#bhvAmo#-du^=z`9h?nl#iQOj6LzaBh&#u3KJ(*ZIDj511^D= zI^3J8Fm0qAHaEbkezy_`(N^B0`Ok8y8%}M7nBcjS{$1)jRF&KWlx9hvP6iJEIZ2rm z_5QQ-zWK3v$u%`4?bSF!`*s6w4rnkb9fgYQf2j03m*`{PTgYK+P8`e&2-}j*-^{5K z-wu!Iw{hpL0%%sSND2>1T0hScxG0&Ljv}8wevSp89==Bv&A4epGho>^i=vUpE!2P{Mu5Phf_WG ze=&t`o_4?#!&?>iL`CdGvl?`KtGXmc^TbY?iq8M6MGtaTQH+sId-Q`F-=wckA^k0L z$Xp7r(2>y=UJUfq#fA1ygyn9q2m;su(G3bwMAcokj;6{6NR+VP_n|FaB;B% zng)gaHEiVs1=Wf3P2u zqNT?9m4LWse<;lN{zx?%$xs<;BGAEaN9ZGNBs!{QbKn*phR(QozY52BhlnOln>)@G z1>;=N`_%^C6SC1D&t<3E&xZ{6tno=#@J%Qe_Q_`Lcu<%>3NfKPgMoG9Q33}zl!g0) z@UT(jp*}Wq5#vBZQ5b1O6g%>Re;zb(9@vAFcq?$y--m<%1o=RNTF(=-RATm{^VUYN zK=B8>Y^;yxvAD+cIzq5Kej2PuU~lHWoM^Co0?Ztze%4Mw{g24s^O7Ri@vs`?E3RYv zf^bM4yyW{S8R44{gEW#B4su>8G5XZA6d4p*7?NkCLo2#=2r6H30}~Qie_txX>D-cE zfy#eY@fGncmdL$7ViOz7X)_|p+5OLc7(o;mb?R7lFA@A3Sj?PTAX(A^3D)DWAJ^>Y z<%(Y(5$-WH4f02>$fDfL`kYM433oXN=^zLO9xG!mKme$NuH2`DcyFP-#?r!c$aV&$Rw6B3G|Z}LH94kaTV*#t+y96H zZCvmMd1lu1U9Ec17+ z?@Kv{E5u#RcQYY+zCWI}SfS2BJf6Pfu)=pMO z-^q=DBjS|+e|O`fSkb_RJeshlQ336Q6l3C7!}o3RX+G54MDVEk3|g68ee?~Fd~bU+ zg;1Cr&Pxu85scx75+l*vB1VkNo^kn@v$fO6g^)t0=}=6ohCDfJ2%16>1P}Je3h)qi zVdw~%Mbf7|633X9Li@HWr<#|ygeEW06;LyOA`-ta^(rDUd@U2rTZ4|Ss@e8aMlT}_xs zf3Le%+_cuGyS-;1QpiGC(LTo0bG5Zw?e@+vJP;|vYy z3+|gPQiQ5&?Rfp{&~X3dEhoBOh%KC#DW3m(9xY3x2JaZ5PG`R@&s*L1v1jK%eQ2H(aI!z;P-JB zsF-pOmdcNkprXgKu!ld=%o*R~?K4D8y@!^p-+tiV%?MhjxgxbbnsD4Ee~W&T z5dPWa-3pt+P;1}0M0o9T6ZLW4(Vg*!SDX`oW3G}?vH%Sat5EBW=4JuzG|vLhvbd1h zImxdP8A)V~V1(nLa8j3an>YkrGYrXE%;+4#{M2_tBBuvn!D^y0Rm-L{gFt&0K5JqB z5*~%&L~N2O{XhDDy6uP=#do=ee>KD6Z8O}vrtn8;R@}@6Zj0%-$)J20Dik)vo0nEM zzh)h=cQ1kfZfS1u*PQ0(DRFp@aTe5;I7L;YPDq^UZu_eW(r@H6h(1@T==_Cf2mB+$W~klC;59T9^w3bCZZP103Gb6m$aAU!de_83W&Ff3Asaw9$U5 z{z>B|@}Z%r{bV*#V$^5yy794Rz9^MemI?GH34O&XwqzyVa?T-9xd!R+ih9HpbhCjC zB3iVK51@cPG4afmlwD9i2z=KQYX`2nJ@0^(7>F;34nj+Y1CCSU-fKKWni{~2;(3?< zei`$lig}pm?>wQ+HFIKge`$y{%wN!xNtw0)Nav6~5PL2aP1?$Joab>&=BvLK|6xFA zG-!p2Y00)fWb>o8!9Oz`HU(fBcq@9(6*(vo(4= ztTFvllV9lot^I~gPNlN?YL516nluYQPu}Ut)FCwJInOsUwf0YTy_YThEJ4bX*72$( zE&y+qBEcnj4M{EctDy)zy>l*OLP^;r_7=U+WTU7p6Yy7J@?iO-gL&!`VpJdTYx*s1 zYrKkv9!*mJ8L_~Re=N}kr8(dU4N(aF(FT_QDL(74#$1|uF)Eo~ZDN&Sm?3hALAMIzE_UT4W-QDxP-zJLzUNO^X)FuR0keE8G&qO2e{YfojuP-0$uQlBH9EJ> zCb^GA`+~QLGm?NSn(6*|6|s47%;CyeiK~`_h3gShE!reKW_MTS60|^DNqLYq(Eu~e zS#=2)2z6qB<=l_H1G4Rc4`4EuE>IHHRLEM1 zblJjEAov%R&8kT|9DM9-srhR)N~j_gdjw$~3-2s}f1*XeNz8!NVBq%r!~Cml0PpBS zYVW&|cP(=~V-El@Mpdi1S&r{yRcP5TOIUboIvYJIE85e?(T)9}N_}d`m$9Cew6)(# zBS2bX9jA>HE5#+eHBJ_KXFYF&1w>gqPeX6dHM{JOpJ?(J&wqEfUOrI>qJQh5pwPqS z$qGHme|m>LDR7AP2WVKV%NZd`h)2GRhZWz&u^Ei^a}RL|lOfaki4XMwx3Wh1OR$lp z9FSFWa#1_3_|@K>n1km0>Mft6;BT2B+7s^LCp?UEbM86~9 ze|}}{d^WFzAq(Uvz~#@-XFR`{>no1x_eICaKKBb;Y^A?9>45F#9oaz0fkjX6_rSa9zXgSs8?3p$sOCj z1lc%wOzGYETaW0HsD@4JSvMjNxZOqBe+nc9bqzT2`@Q0jHLH$x%eZ3B!lQ^^B4K-U z4$RmDyJ&DQWOffk;TOXL=~7ekmWmpbCvzTsE8t|67U?p4GTJ{(6iUPP$;i+Me!osD zn)hjTk48v=6A4jQl~?}m_2^M)H&6p&Q%sh9T_Bj}u0II6GCAUW@%za#kdHH1AUtnS6v)>egm-h9RXy z+#0f1bU!(|&(RqSK(=`3w>r19uS4W|RIpC@s7Ws;bz!JJoE5o$*1m1~9BNA38s(M! zeo3kGr{`RBnME1W?mfBS3NCaNln8!sV4{qfRqx_|`9MH*SlijHEJ^zE-%Zo*_Mr*VG~oB3>J*0|o&nv>9&r+`-=YnTREW7QI9r^i1wVYVDFpwn0jYSakz3>Nf00d|C|;~V zf-lLg!K|b4tm0Ll$n;itsNI62(!v`*HoRY4S&g}gi+t&^OnBKo*5{XzXWC{?Fm~p_ z5WnM2ErM&cn*=pDRF^Ae+Mj;4&Lx`G#FftURaJ^3GStxScfw^Vq(iO3eEQg+5%StT zxdRE=$z~S$4R%kJLZH#We=jI5`eLJTm%dl|qu(x0Vji(Io&s>`2wb$9lMiGofIJO> zjC^XTWzq*$m0InZ$PIijL3l>xu}K}Z;^PTRByPV9j{(M4X=kEe>kHubSlr}bkaWe zFtO87>R3X9o0E&);PK$6u9phmKiOJn2_hd01A4Wo<7mF)cgg}EP+<0+n!&}O=e+EpGb$WQ|DPy&I#_G09 zWGxM9a4K>rvFGrc6Mwab91l0c5QDMPde|e*;xV2OVF`?l?#b+!VVV?^>FC6xjf~Kf zXur;vl5low;wIhX$nP<}cN&B;o0OuVl20Blf-AGEqJNQ^1_MQL zP&#C^@tBC)S--8!FGN)VfsB$7oe0DP{1^?BY(Ql%0~P z5<^jTS8MoG$J@L4dK-EY{}q2M1e}W{yTeW4qr9j5%RFUF)SXSwEdpu#E=ph09uA_C zXcvH2*proh zrh8zE#OF|8Hz`Zb9mu1{{sE*Pzmb>zM*8z1+Xo+nx~Bp#%stpc2koK_RXzEauYmHwNoLGQgr_aTy6$*~iW ze?e*~H#tRH-CU}M2$PNmr69(;Z!FkosxhNZEAjk)-=lZCT8O79$3|0_ZS%PRRr91- z&L!_prOak%5C@+lP~LG+&cAykU67)#%s%RX3!bFyK`Pt3DGYr{xI<0CNFL(0aeBvi z1+14h|M6JMouhH+HZ&Fz8SO^f*p^DAe@t!}Ez@;=!+;(BGm1o`NXP6DDT4c`e1W5Bpe|P77~;xlG|=-FhWYX>fB=d#~6>f3~lO zL!i9tYOWB%Vn>>xWc)|6imJ6}1A+YK4ZawwF5@V-7#t3eG8ZJX(5?vggm4|rZ#T#- zO-+In{P3|XCV_|0WKav&c@H^*@qKY&CHND!F#^#u&qAuEYYe=+Jv&$wdx<}2`2oph zKfu*?d_qm5r*D7j>$~Iy=05D$SHhXnbhGkz&dw%9nz5e`;WD*#a3b zy^hBF9Lp0Lf*JIZRij7P24t}a(TpLr6g16@M-9|caN~ILHrnC^buVCeIfKc%rP@%m zCQ)kB^H+lLG-*_1RX^}a)u3gugj7^YrqCvqgCs#oLIqDU_=zc4RxKDgS7DZ^7Dt5I z$dJYyqV;>Dk0YCQ^l)rxe`WF86O(s{E(3hDQ#zo?5>i;r0@@#VAfP ztXLm~rOiBnhzK*-Pvh(z>FM9lc>&lqAEk_o$P zN+WeAVQ4A+#a*QZ9UA=4oxz1sV)#M7wSnE^j8F zS}!LdwZm!if3<{%k%lKhBkNZ%Y+juhk+VFOF56hUqOj!FB=ev=e&fHz_O)G{v4~5; z7c$nHc&MlW&as&@;}%A4M@1;enEWqEKiP8fLRKB~2@PhXwR!n`_#6&|jz}eW0vK2E>1!wvvD)Ya7(*_T?B!yDwcxMs+5_ z^MRp$@g6rIp#7T=wl&ZDh(`s@s`>YZlL?KvNMWD(PFKZ+Tx=ah>O@ocDg|6YL=WvL ze+&sd^zKp_ZbEDn{1ktR{^$YxtCj=BB%7q;H+CJxBSNygi+`BlByQbpjBxhqoO#Z7 zXiqBIIp=luub0lYH}A8^V>>KC1BrPJ$NAnoH!IkblD-fvRgU9cGxf5obr-c7hWsirG7nQmA{twy=Et1?l^yl>ZJ zG_j|y+u)vg8y&c2Z#)Pn|HMpO{;7yhtcWcZsR-HwGBZq>H9qY9; zh@3wxbiQkOczk_&rX^$)f#tbMtnQN9j#{3>`~B`~P&^sI(C>|KT5_GUK$5d)e+s+% zyQ)s(Cc)~TEGlNL%dW_(&BMLs(1%9BXV=d=dqJwX&*IT%t6G`H&9Rx*LbCo7&3P7E zP_8M~o}|z7$nLr3D*5qQ`py0AK6)i?!Y;@66R?(MB(qhCQ_o^;%avKg7~=2qL-(OQ z`yI0E1;qiJmB{sHxN#;`2OGR4e{sYbF4%u0)2W}^4@^ZlwZwW{w{vc8-|dmC;=Hx} z9`=8?9O(V>`RUDWi~lZ5{P|}2hwH~=X7Q^{n70`5G-dye`RwmpdD9&)q9A4XQTCeJ(n%x3s+2mM%ntr&O+RwZ#iswTe~<6(SVlxeQqZptpB^`GRs#L5*500fZ-4N!NmJzey*RZ- z&s?GYF|?QSzylVSxgVJp=tDDttxmY$1pVgq*Ztj11Fqt_iABY&1 z3d4a6^Uwc>*w}StHMJDg)&38T!SNR#56^$K{CvFs)pBtC_xXS0YlY$D;^*h)AB^dL^78OBcL#%El+2y2J^mN{{&usm`M(j+|6LqxoNT=RuY>sK vpMU=O=bwN6`RAX1{`u#hfByOBpMU=O=bwN6`RAX1{Q?{*gTcf^fN-b?3=ZdTN1;80ZBYno4`E(U zl!qrTkr)bX1%g4Xt-)ZlH53U2q0m4GL<|nK76n_0!7z6~AW{SZ`e#*?ldGq%pp`qq z8EH!dw1QY6;Rp!a3MvXlVP-;!A(3ztOauZ2!B7ZM7=IWh28LVxm$lI-gr}D~iU?yd z7$}NHp}-&!YdB2A8UceLA!2Aa5)DBjMUe>1ov5fa^55uMAYGi%j&?{-A_xo(v_e6w ztU*8|$Qp%2p+wOL6cmhxBT%B457A;`R-!;O2!Amvlob#t0)@cQNGRGGEQ&^gAz}z?D3?qlR!Nf}hC1wQ&W2_OgLPHTq5EuwY!hrughZDlx!P>>!nFub5Kp|le zkQfLk3P-`MfiN%{4MmE9VQ452jj{rX0l{z(N`LIXDtmaM+=<{2E0{GD20}t$*04YS zh>D70=7B*mQ=pJmNGM7KWerAI{j=&HzzBkfFmAy`|AZNiSq6kgK&{~*AQ*%aMMA(Z zC>$XIMTh}G2TlPWl^FSfIzIo#NhuLWhjv-6pBe55(z=TK`;>v zMO#6TVlZpWWL8i(3^NN9i9sm>@h_^PL{<>66(*uc)SvxqjYOg05E0B)!q|>k4S(Z^ zm^BRJlgPiWDu&?!G|CzYhFgmO!7v~uAu!DTLV@6DQ7Gh(IwoT%OzQvDR~QirECRPe zz>t{T2m@MS_yPhI!!QblfuJY^ToeOm2oi=t_P?mYiT=a_hRLc3Cij2xgo1$)a0~-k zgMmmFa#JOin0R3p;mu3ij@civulxJ7!<=% z)<6{83XDRaMIcuHRTHE8e}CJlD9S1j5oyWFt6?}B8}nC}LFSY5YFL)6hlAqbcz|a2 z@)r^ym>bm3h6<8ZjdG%(?&vrt5?av=bm1Jjw&uv^0mQT=?4Jb!eo<3y7+ zZpq39vh7~fa4AB3C(_3$mIuFiVp_plG3v=iNQ;a{`LTnT@Si&iJ<0n*@K!WFxU zIV`SDFCX?c`b2UC$o9=oD1T9CR-Y3%ly zh(n8w*wk$hryw8dKD0cm)!VcLM|Ow&jqWfH0>xsRwwQY9Vp+NXHeTPoTc_0Z_{+w9 zYq%|vl~R)WI~~3jiY45^;dHiQ_xwCS6n__|(@S=B2Rn$tC&$0*M}Lr;oLF{Zeq?6k zcyHtu6-C;Mrr`WwEP4ZDw4#0Oi@JO)dcYN&=ne6v8#|{X=fClGq+EZE0Zh^Ml3?vJG=J- zR~S!E%ZYMaD4Cm>Qh!0tQ=h{KKrLb*dpzAMM6=hS?O|-~D6Ymu-~NFkCy@l#B9p_7 z-adbWBQ2vt_<_`dlksl4G~{zor*Yzbd%Vh1VxLs~exwtqD7q&G6nio^Kdh)+fk zE@H&J{!=_LKWy`V6rbuO++D*K{)euH@_ZZhu<1Lc)sjwcf9%@EAoylNdh^>*BCVn5zzoHbG{y^GuonLAjQ_^hX3Qr!H3S(@rj>(EiQUF^GtNJsx(oU!9jY%hwnlbl2Cf1}K znQoppN~Us{nqjnNhyTcs+fJz+;#(Cl43v z`G3R0#$b|G2K;QEo-g_HrKdazkKOezzucQwp^Kv%+xU7TMgcse~Z=+pgnlRJdrmIWWpTSRld@;w3 zYdR_>+UEkDVI`?rF0-M0ffN;{M#v_#47eP;&md1n(%>dLG}g?adBRpr7tI`D#x1<+2Ogb;VtrwYF*z<|5X4{gC8sQ9fRB~6W1U*D-++vTf4~2yZe1C=S z;SHlaqX=it&F|>kmvDgKRXe;&C3Qxbf^&#RkK4O%jnm!yS$G~F4b(g)?@FzUa_bjd ztP@w)D|te68*gvUM~*AK&Z1-s>Tf$2Z%EjxdnmDHOx_f+H740dQ1Zll?8DE4@8w#d zO#BUWE!M3(SE0obwA)W644@8F6MvyNl@hL1?74xv-~dMn&%#cuLU%XjbW%(ZhX2$U ziic|f8X$Ttp6AK93Z8oOheU_GpQh*>`Jo-1=LCmrA-2ILvJCl7;J1Zd$l(6N)gu9toEhd2FRGWYm5Z-_ZYRC65_m{?PyQzQk;@Wq;cGw=xm#ToIMws7iS@iFGZ$&pJ&ig-zDQ`t$xPPv4#> zTWIBG_O7OAjoR%cQkon}l`emuu`G{0aZ)tNO~Yl+MEfkQx(W6*NU`4w(_K&hflF08 z*>n&Z-W1dZw+PqblVH+sdPST^UoXa!hzd(yDAQdnSY2~t#M#iHQ>=G zFr50RKAyXH52wAG0-xh${{F9xEv=4Fk~NrcWbiuN!X>V8j#aVa9wGYu4WYC1#%a2b z1o&jODgN-7**+m;JL3;k3=iAkfGC32+R8HgyJ8yrVmKI@3kL4fUD&6mK2{-h?tZtK zi$9@lst}_#c=CIdoqt)xwt>%$iy2#!M+aS*)ackTIiW~2D4-T;MatZarJ`6`5W}Z3 zl%$zqmisKtJYN=^oT5~oq0kbuUe|qlaejU4(HYpYXKGSivNTZFAW!bm+0bleyd|Yl zxwMfu*iG!Ga5DBTuKV|*;vnM{6P5Q{(&c!sW0CwRk!TrtpnuLu8r7e&{z<(TbC@}* z`pPP+l8BU$Nuwx8wYm0~!Cuh*iswYy01!KbJXCh16qqN2#X<`0m>=r!`^1sq7cy3m zJ@ARqkcbJiEVVh{=H#zE4WAf{S5h<-lVF}^snn6r=z2Ov+0kvyBN8Di(LM0=E%U1t zndk4{e|BN_%zx9Jo7D9#Ym_|9xkMU?Tb$vX_dlK=ddI$_Va(Upw>8D|>s>VIyZ1o} z3w{L|x#LT)nr+sGA|*RMuj^rlwk?zHyJLHIq5J&)V_^s4Q5GkP*3DUe!E@Li!-R^L zFK#|~Zl=ju86|P2>a+@kRZXyuA!!(IqPWLbs#%DPynpq*&9})OFH^|+EL|>M1qJ)@ zEQtCjzB?#x$l7_By4vlt_t9Q7M+C+w5H+L93!gS0PUAGLAYf{Di~Gq@adG)G*Bh%* zPd`EfZ^^4i4Psmqlv22n#4nt|{br-Z(RCCZ9*0PP zfN>cP!+OGJb@&GcGS0HhHA;pPkhN`RLdwYXbD@jWH)X-m@<`=e`hei+F}zRR1=6 z&CD&&C9-kZy_Zb@i zNhYhD((SN%H~CZ2c#(&UAoJq;=he@DH&?U!R2Cm>uDcqgT{M-n<}F;`6+S0O8;tM1 z?tktkR#G?{Gxkg8ZBrdN_I+S>0YwE*JlvfZ-Xc4S*WSwfs|{!)?fGN!vTloVl;hlq zvfN9(!)G=xyHrzPifBu`Z{Li9Vh1UJI0wn*uQH0CV!a9;)7cBr4k8?T5Rn1`C)DOr z*%kH@P+#ithFE*mt5(!RbX!eI*ajs&E&j4v5l4e z8|cLQOkc~UaSy-HY2AO{(PfKfiSE@;7{K+r`bJ`O`#I$Idr?Y`I_bh}5%-}u>wl3% zkcvB9GJ79SBv{~X<{i;FTKoas*O_xDu|B(Q%8$w#cR9RfSzKc>Y=J(z#>_Vl4v#&0 zw#SG40%a1M3w}2`)0ZvKlPq8Jg|QtY3LD={R=yo#);;5m=+QaER_olF2yJNMydxQ1 z73504QD+fco<(n3sm1fR*h-Q00Dnmyu1S>~<2`&jabqY)AezD8_kzm{_eIm&7UGf; z8%zJIqLOF=+`4aa!;R6?E27k&=Z`S4Y zei?r9WmuhGdCKRDpBgXc-`;xz;3QP=$-~q^)Uf(rjUdL#Rcuk3a4agMY3mI2u}DL# zPSztcAHOzNvXg#_v9}K zt@P{YZ3{T>5Z<*DZX9~r8Gre+GS+LedCMkn?#IcyftFVhUrUtf9pEQyDOi=MA~zf{ z6po!J``BO8U)NvFx6Pc&L%*ii@uyyKE|cnJhrg@pmENI{C&>DnrT?hdiNyDlf72-Z zG4yd#q@bv}oi2UuvXJRt6}ySzZEaS z+6{m#=%AUTa=bGOBwgC!AlNw-wDUe?>FpH#iDXPe9r@HfS-*5HOxhFGH8+4H;YUAd zm00jYEx~ruZwT&Q^nZs@$H?UG&c6F|J0tETp=2a`fRV#yilO~ZoLZkLQ44~WDCwViYsEO7A)uAIx?p`WeDIfv%MOc zz3Yr3_~u00G~^KPhBQ&AFD;)@4!iH<*hmBO5aa&R;lcCeynkAHjp5p$Wms(kv2uoW ztDX_=|HYQu0aaA7_9*S%BhPP{J2Gx33U-<`9Qh%%=^YSO*0_|cXGJwH0yhZtake;X zslFP-P+ThnmwYG7oMiFQz;)XB%}hcp(Caa~%|5B-!xcrN$$_oA6}X7wjf<1&loElH zR@;v*^{X{aFMm$g?eTD9ld%rx8@)qiW$^wC1&dAk<|H(|Y6?HQE~D#tJ!0YunL#ribpu| zCKkkUgX(hS({ZHwjvE)8&FoHFfO>wS<-$j81g-+Zp>hXTotyoj=SL7&xk z^Td2|Du0uPld~RDL>!$NjDYwYP#b(Eb5DF!ANI)}2R9=a*rI}hT7S$Ad}4F|$d@V| zINf-ADp=IbI@LmEkhBM`f=mqFz$f zGu)M>nofCS*E7twsTjruLUAVg;14!_-lNOfE`M-|#$r>^Z9cze6L6=KJJ0pz2hMYA z8=VxSabD+#$d@!&AIo|_P*PD~YhFG6zAqCyoK?XO{&A|^ijrXK6%7wY`Wv?xnRLQ~ zOlF=cnsvyvwOVDHP}w81Bg6t@`X$LbGm1LsrwstH+g_h%C7EkkXT0XR=`$_^COh00 zJ%99m2lsnrV-Z-cnLL?=EDb_TE|;{5$PFg#XX}=B0(FY^>|1B65)0wG;cV+>8eyjl zo)1ch6==wb0r!mRo%g>;j^WE}yn8PiFV0^R^ zn47w0O&iYyDB-^+alu=?C@)s*odXL|b9mTOWW zQG>gSPCbXDU1IW#;>V@Io0-p(0V51M)q)`nRTD{cQe3J%RDc(p<%Xv^B|B=8?Z2Ya zR_S*mIczdvf6%7tk^PWD>FA7qD}N(pXrd;BUlk9x$5wW59@vZ(uGke6o|yQ3@7_R! zsr#ei`0A^@!(G1|N^I100!pfzNhg_MxGs_7u6_bfR9X>v*Zs;!(yWgi`p7DZfbm4G}szeLu1`scaOt_Y>%f({gUQvUp(e zYK5f>2N5tgVe@T5ZB;`b=7wVsdi0ecR*^EW7R3DMineQKy>-BWEjGB#VWBlbvu3q@ zFON5Q;K8rpe!*cZ+?qvLB!4Pv1|nwWAhHtqD)e#vD~Ur>@-VP}v0sZcSMIyh%K>_a zt-QEqzh>K+LAEyw+4!%iMNrF01xin!Rm^x#kIBh5ndcY_Uxh^1*CnOTH+Z*y8csE@ zdn0;H{|P-GiFc)Ue=BgPpDCIs)0c)qjf9L?=#6&T)#p zW#hi?6-IC7d>c)G-gq2lpF4gDYHK|*u>GP&qdD4#?Ea*z#dfarWizy%b1DvfM|0`Ote}`mtVMld~%a zxc{&mVLXGs+I0XTGZIea3l+L}5wrf7LuP$&50vP>1Bxl?6WV$U@hK%LjMhBvXDXh) zy{}IEi>4E?{eO%6Mxxr#?a)>47LSGes`vcvi>`2?(3ucv8l_*F>!&;}(JYbydNjNr z7!A3IYnXWIT|4qm#G1SGcbl}%MO1c&Id?P|HR%Yk+27(w5CqGZXS}C7Cnx^SJ}Xt> z3lU0c)Y+z!3@!wzUoRd=>t_m2X^S@p;YFcF3V|_KzJD1C!{bcQF+zE0R5In9grbr| zoeaxY*;#H|DqX3th#K~(Z)}9udgFuG>yqAXhaN6B`Ud{~#2}*Y8KI9*N#Cc#V;BUt zH?jPA+kSaYxPxJ@7v|r`rkHJRR4(hSg%QSIk#cl2~C^_TSpv-emcJCDr#9c zGu3?XOfzCOR!AH1v~8hEE~L2!oBASg&&;e+CiHd(SIx~o%U!#gdt?h^;>7KIton0x&H%uB`}EfCN@4cmRI+rHSaSBf z(vLPY@X2j(xGy6P0mn*4_ZMJ)@|T(c=7H?x#u=ddKm+S7$Ej`hPJ~)>CZUP$;eYSo z>B{lcY+nE2ayYS#!+a!1IsA&dA&L#Zp=FI&=D~GarpI@d zS6}7b%TegU8j|Acg4CCV ztEsO`al54oDu7iGnL&Cv=;^cltJqb4avd?~-6!I#HOajqv%ca~!s%*k(tqqci1)ff zl{GJmpPXq99{~d6zn@_}8|pGu|ILGK3B)fCe*4~9MAk#4Ht+OmbDn|d-Z7X_|B@iskE;<`~&So5rcYn}WYruM0^m_}C z>$YUw@GMNpx0wV@uMm#n_>#{jp-2!o{^BYz)dI^jW+AqOky`LWKE!2}`0+xMy*VSA zWjgRRUnMmFYb4GOVle%aQ#so$2D4^Dl>r`_@+`PK}mfASs_oT16 zW@aUxu3H%Z<#v(havyyDjrq-c$HfTwMyDZl9{#la?T}2x&jAwN-pz-w^uD}HPW=_s z+E5V*a*e7>dBw(Vb_JX5R`SPt6Sp|N%%%5qaz~@4dCzKk9e+sS1y7CC#HK9p`SrlU z5(4Bg#f?9GOfQQ}H%}7@)m9wr8z(Nj#0loF>$kk~+eyPFyv3f$)VDwT0`dMxS*R;8 zS+1n5=PV4EFNRUV13}sm52|@`pYOECj+Kd8NLQN3UtCe}B(~|0oYAzRJ7Y<&8%)d5 zvfsummI2RnBY($&H5tG8AGmM=q9OOGNtlf-Rq9y80AGxBzWxZKI;Fa({#~GQOgv=7 zT%7SQKr05fFAcrHzF*PudiCBnCkFfsGek=I*AntJ_(qcMgMghfi}SseC3Qu^(^#XjzR)BYm8Z^M6*M%Pr|;6xYsuRoYOf_9Ggz zSNVoTG;4-qSkBow2Cn8cZ>*#w*NCfs+$&Kh?d0xU+c>%NYmjJUl)5MSh(c9FHTSNz zqAS5idS}5r?Lz?E1UzCZ zrf@q{I1>NRd6`h;!|Gv=+c`lkMBq;IrWz8}ZudpBm|t}kW!m8V37y`LdmNy!@uOC~ z&|yzOA0=TG*s(U!P&vD)njFv}qqJ{(cqjqYT7R!OO(HRJP_#YGi=3E{E7hZ?H9~T(FZZCfNE@6K= zy?;WD+~B;b(%HB>g<4ja)!_J>I<>^}GB(-}yK=qR1~^<1+BVzKB}LnH8@!LylOF0d zsJO0rR6ShkpsdPGT+sOb*M83pw`A_;>@jk8!j+ILieOcgC;5d2wIt3D(_~wUGvC87 zncoZ4fOrF%87I@@BB@EHAi?2BSuws@aewQ-b}W8T-e3zunBcj8;Y<~SGluY^TmGwz z6lmSO$0!{HbFUkMg0`cmH9uHiG@o{JcHkq+pYnP1W2$-DgxrBJ*u96Jfzm9EhEP*Q ze0<7~3dL3QBI(V2JqYDT^6R)VMMjIY`D+Dm$0Hpy?u z7m2?cgdFPP(8oK4j|a}v#=HYsE*6U^ow2vY?zpPW$IVQOc$P;Wxf9d0z31;KhiwgD zaQ5Zxf!#Un!@ZNGds)hbN8w&(o`1)LTQSfjkpU@D0-HnWp<8~0mzf(VI?(yMK(i+^Fw27!Ju zF88Dxrs_tL>l_TbwLO`a#svsOyIseM&!-O!5Kp^0?$R~lukvrP%GZVK0vAd$lBu7e zT*9@<=#>xcbi^lT&PQG^FlGx;UHK!I$?aDUW|budJ%*oexF(LCah*q)F$^S{KNj@3 zx13hn3WMt32PW!93+j@4n1AUlF^W|?e;L2|QW^?l^&7!rFe_|oVJ&4nO_QGfoTM4Q zX1~*rsiXZUtncArZE+&RF}i`nvB`_DX@qr>YjNds2CAtE$}G6t0XFj6Ou^9rDT=F!H0)fVJ*jJ z+OBY@laLJcntl?0?|;Dfhv3i9^#S%D$*(?CFbqupyhAf4LcUeY(L-;(;d@;4IWq27 ziB|>Msekobp=Yw8+BYitD#5y`7qKqCwgAp{lW4u4M5=Rbp(ddqw@89JZX@xSJ`~im zm4&IDInt9-7H5v0s#N?VxD-C)Pwgmm8TAmiwnAxYH+Rk#hGXy4n^nReDs zEP+c>-Jm@>1XmV^>~r6r%99KFfhn5TvK_$G9ZDHaNMylbQno8FpX8; zzot+<(Vzb!>uu*zQeh-m%&+M?lBL_2^5$t7u1K1~Pj5gc60seuNjg$|B1Rb0H&m8C zX7~ZZZ%f=Ij^tKX(#wh~xZdmhK@f=5PR_KJC;A6ypOP>@3%k6f>3AH)6y{8kF;s-z z%%*b-G!W$gJ@KbqOsgmj4n2Bo5*{*ry9dTXZZ>{ zc+X;=srg8E$v|Zql|Bc4o)fT)+5=x)Tz}iY1UPza(ajE)?G?t~t2I$5sMz}@cQ4D; zO8rCSuJ0j=l4&$|?4$dzN%(Y9OiW=EvJAWBogdqqwi`qH6X{fC#D3QCfuLJfG@F;z zaT@C@J*gR-X_b4~A_wo#O*r1Tj>n=q31SKUlKl1 z^5OQUg*^sekPVs#X@7fs>zw_N=HcZTZM|cdm1S4If|DN5CkhF~mk?bh9U)mgeqc#; zbI$##AiJu}e8)NNP|cvkg)xMnFMo%FO_$3d<({6db=8Asj|!+Fh3zUnc|BtI>*+1k z8$MM5yU0<7wINgG2Z`KOA0Jf+JSlt4pk4NsCBYB>C7`)*z`IlaPvB={g#A#&49sH5e8eyiu1GWS0t+6f-@?6i85 zpX|+hguqCYr=;gH0hX#Epyi)K**h(;#_Y#b7DKw)e13XWm+0*~Cw-FB%0_-$aT)cb zjov#|A6xzB)>(wlvm1KmZsGF< z#=floUMy3JC7FC5bC(7IVfV>6AJpNrGB0RbzE<489LxmjK0Ziolk{S@SQ2l)i%Z3Y z$kM3IM||uW9Gr^LDH={eyFWmxDwHM_l7xsmseH_@;>*h4ynjEf^(M+N%`?_Abr7N{ zBCv;FJpW{Z3wwfJMxV4nI7V!rEV-d7%N|Cx+~e|tS|eQM*v3tD&Ns;*on1=~U&m8E zO#w!Q(#9pf%2?fyspQ`+K;f}GPuXk{=4WWZT5NCO7nu(qbs<}gg9w%n@qSC2?V`Pb zc;gs^zmlZnt$!ow{9@8I3Dy}k|yj~r}_Obxr`6f093wO z1gksfXH+#_aJDU!y)p8Q+uNz_wKd$W)l7Nks$+X5DivzbRDt?_B}s0+q&^0CDSSA3 zfV0`mWy*UnTM~zs(d0w$RLeM1j?zfNI^1W5#o`16ti_|%n6I7pGk5mS5qOWIv zg(j{k_hM z+rDX^DiRNWW;=zA7V4QwZxh^)XDY1UzD@`=rJIa=3XTon5(iZAXvy9!fdB^UuQg*h?w|_bA>e|Tq>9LS`PQZ_t`L~BN2bf|RA#Ld&{31Y1iWEkAAui%Dul8OKecOC;UmWa+%JQ>2q2eH z?tfiJ^A6e{^wJu(OML=~Hl`4&%y7xh>q9#2^3%sO)p#|IxyB#8ODdL*c7GNP zFD?}1#Ll&w@M{l^x*o^JJ5k6ymG~*QPV7*S+7N>NJ>+ z41A;d<;dHC*DOu>?3a)5e&KuB)Ou81W60t;x@ANxW}%o~4Fq^nhEr#jonP@@+^+xI z*()9=0a8t!ND0`?j@zztt7>MiM1R}Dhm2|7(PyGfTr~%^Z1RAP@1;Kq#d?teo=eYs z8ormRv0CI7btFWjr5%1fzwS|;JAWyMRPi%PopS>A|8-Ecd4S_(E9Yg~gKqcDwZd=rw5uj-EwH^M9cDKJfrk zRTa~K&MzIo%S^4^PxC3Y#x&W{?t|PVPnJ(Eo1S-Ex;V%M<(6UVhuR5Qmxbcx3=t`D zeeO+pTTmq{7?zdwAfsGMeTYs)M~IY=i=UC^%(2XhfKnsuiJA!4jyqALIBm^nzKOpj zv_`0*atCK$yU+eYGNB1;<$u@(=KCvHCW^RVTeV+kC75F;sbWVt3_C`qr{>i=V#xuV?nO5n#KuBi4i2c4d1#1!HAU?6+U$J~No8DbH*DSlg7=1R z4{d*@;%vQkhJDid2EU8k#*gXFcPifs+m6sXxRX`Wx(c}SZDurPZhr(Aor!d$&-Wrf zor@84w8`hj{&cIOmf_>Kek(q|e#0OluVQO)zy0<6+1GBYsU#1Xh|HU!v)k*>#FKh7 zMkh1H?`St|0vbNLh&A7rFnX(@UADejV`^Tl%-w9olo^9_L@qd2GAp4emZ>CK%(dHI z(?vR`KsOY_X%et+xqp?prkie=qW|WXh^iNc3>Lm!)AQ|ezwkPcy zneg)29Z&5)T#qqHY55j;7=-C-UVXl3@3y``k|t= zcQA3m>HERe>VNoTBkN?n2OYatW!K+JtK?1OEJsQ_a$H}8a>Y<2*7T|oC2{4rKYHMr z5xsFgiVAD0g_}EUC?}r$g;Pw1CW`*TpUW1u=s_>Y=b>+t@S4U@cvgLPtS?(-11?x`-hpPea zrI#>WCd*>hby=&IEB5DNj*~FYA?$-~L;sV=!eW@as zzZ`|=a|eHOGU=fOZcfVlIvhMuxB-?p{@bxm&cXPiF z_2vZ+NEavVl{1vvx0OrIL%Js_8Z9qMe#R^VOn*5)$bh4_0(?6yNcZ1j85_N|mGDm- zt8ANK;i+rja-UXXZal(9GWwU%$|c~vTufsMI+QzcV`x*|&fQfn+f%NyTTD}v>}VN^ zNF?Ouv31{a+LS5a-*ftL98}HCFI??Xc#(m_@TJMmY63Eu^3bs+!C^Qk{4VRs;=Y#M z*?-V40e|@x0@ebtZN)?K%%?4E!sqbLcO@7)qd#lClLrFMT&>6fDzI&EzjECr1hh%= ztAa}>JgH)ZeK@iLROlOCj40_ti{;sy!b<~!$`jK44T&UpRCd2ayglJzF{dCxcoWJXV3 zrWICH1wPbflO+8BgborWaRddE(M$c(bXU~%Y`}Dv$atyeSn|T5wMT*#(|+(@pMS6x zSDOl<{^4wGp=`gSz{20Td{UKqRFYQd=^Mp{-eZ3wSs@)KiOz2>+p7!FJRZALzZ^LW z(fb{&g*(Pf$#eD7oTBH(>E8b z9V{txcV#jqgM978mFmu{#y3VE&s>bJt2FV$KRRZ<-F1t9bJp{fP7DzUbnAKAVAK}2 zqCBrdui=NknzQZsL?)*z+JRnBGySAMEys_?z=e=q^khi%yYku(2e*5fkAFMUs7ex4 zeLrPC79ZZm?|Q@dg1#?y$E;`W!D%1bad;uqLaA4Dp z^8L>%&&=Py!g_MlpCwcN$SXJ7=AGbI8gHTnT$L;V+kLmMi|@+)jmJR}^qHv|)qBxl zWeJaqYc6l;0T%914or`^9)EV-Ocg{Z=ypkJl{O7W;VB42OmjMARW;1*C}mN zpi|^_drETw7XF@MNSfCwG1ZE5&F-5Amhe!HKxn9?EP+CIx|PDigMVf>)qDmw@aMI= z{4c4x2M4%%u&F}tXIx>i6IBRUa#5{%Ln@8m(la{Mv*q5l+Ls$JO)}rm1@wH}!;l(H zV47wRhSW-OMot(!7`iE~D6uh>)AlB>pWDlQm|&(%Ubb-GF~sOPAAi9t&|XgsK^Xl|yj)P$55&`Ao+7PgBy##tS$2az04#2J-vJt_ zi3)tJI?V&X&Tz8HFS}osc0aroYIgg+D@rF*GD{EsDzyEA#ag!kn&koQSP@)k!be2GFpAg_wcgo+|rxP*IBZzTMV@JDoI!^_QTGZ zD6=H3HQB2uQh)d23|nozc=<;2<|I-zsLnUGQfFW`(S<4XA1Ac8p2oK&tsmZTeyYf{ zTRA>cxeeHT+zm_2*g`8dD3@2HqYa&kD$L6a7mUBxSWShDeoilRdS=$~a^NVtt-Nff z)HQ4Cg0<_2o}0eAgcQwu>%s$gMAL0TPop=r2?A)OrGL0Vst6eG+%9ysP~KomPBB6g z|MOjX(BHl(RNQmCJoM%T_Pv)ulBS#ZBQLFKDf+jo$+M;YymQhGxGHNaY1>1x7AIIg z$cIyM$CgngMak*omZ`ks;eWzM6RiBM>*NW*X=Xf2R(joCb~NmTbtvyk9jwSConw}v zsTaev8h=TbnGc9L+G^w{W!In7R{3>79I~r?+3xSHiJcPiewH~__8lr)FS6BGxhrh@ z;%yoB=Wfaf7#WG@Tg&eE|eFSKl zT5A5~o2SPd*DUFv?&L(Nw3p}}&0erpkj%2`N^4lI@F_K-#dk8haR6J2jdT1EAfzg) zXMYxsDw=L3!j^uu8_ul~>=3OkuRZ9#<+cbwaXCU?YOqiUeOis{!V8YvWWQxL>;}<#du#oj= zW#p@D`lX7BA9l3OPrBozk}6LREO~ylwSO2hDmzmOi9v9`^@5c=c#I=5Wb}ZcpPOzSxIj7EAeLo!<{b)1F_Don4y`Z7=N^l zfXJ}#QiQGL>W<(o0&s+q8IXu|+I>T;bZg2GM6%K_ZX4t!|wX z_Y-kEsf)QK6F7H6cZ~55vCoa&@2s7F;u!p{sI2nXpl9g`|8VtTvg1cPNwaa>>x3~_ z$zZpJIG^I|uhkzVIW3Z4o6fEoT7QcLNu|{hLZ2MPk&ZtaKA?I}Q8dyWFI5{^v?8Iq%bLekA#y7(TpnK+1e!owJ8ywG!6P$3Bv2s#aK8D9@pN zk&1W>8dao`=r&PJ`SB@IWbwhaZ$yNduEs#}Fh2cndEc88aYYH?x?d!(jeqSWbVw<4 zYGi4?juJ1#_T7p635N6#{V}HY&v&nb)?SsgEQOlptEj}d9W$~llKFA;Ka!7Bz5YJq z>3V%e`us$bj5KC44Lj+4pR#esjD&}5mmy?VkW|`LQ>oT=xR+uGw#CE5{ll{^`NwcC zZ58uud)KQsI>T41q95$OXn$8dZ!bzbRddc0@tgoJK+wOp3+XQi!Fix?*V%O2bh)Ow zvoTKuQOfI+BLV>eML^nPYM%u@KK?u`{0P<3ITU!sw=RySUCrpQjuYKD-++9B!rC4N|cW+zlzu22`IaQnt5dCC3u|lf5aYRqG zu|vc3b!WROJ-f%XraS+!`a=qQ$tn9SRewl+Xe4Z<`&uf zP7g?FOpwfdC+W@3`$R9Hyf9k$%Ug>*?lx)R(WN7pI#*@a)@o{2FL8gcmLj4`wmbJ% zAc@GrT=V_hi~tW%cJ0aMBc`K+9AR)410Yz=-rPO#5!zf_eselc9nWFXVLna9w6eoK z39VrGnooi7J|K#bjmfbt4rY${*>V2J^(xi@-_cBLD*yE7Pm;SwVuIe|uRJdHdZnF{qx3nz{g=;G=2i6o2Xc|HIfh#t74OYr1XQwr$(CZQFmgZ9Q$2c+wPwC zJDHq!GC7k>>Q7Z_)y}H@F_`-;O^nVA_BCTOSH8W~zasn=I;zitEP)$7m9 zXyzuetzEXr+719#I*OK#j%G%AdWuNG9RB%NePXl0=+GHZsi3uMKbuAvkgBRlS~@^% z6;eK0){BIhk^S~6aW&l^>n;l$ky8q+@!6Yr?AJb9TYx%hZ<*7RR>y*6PVk>Hr2uX{ zn66yYh8R%PPEnZEOK@(?Jq|lan$_yAbylYX3863>0N{b~Y(;SYb+o4F*<* zxk-xgX+w^EUi*P$-}r?GV>a_<+4l9L&HHy;fRjiBfI_H$!3k*mDvGY24@E z%Tc3VGPTL+v|_3od5D`xP^*8P;&<3bO3+qMzH_jBFV%%~9^^~W&4&3nNm8|!+Kq>qnq0JmXpi03y&eU+X%BhJwh;ml)p%w zwSfP-=!%Dk!m23IU)FziQ1Vk4&nrNJEjzccFb$BoX-(<{G1NK*PjX&2`7tK7IS3?X&=y`z64lT<*|Yy92PvZ4a! zzJJC!&1UaNhPKh1(kG!wAEvbnj(m$`r0FWlPRx-@8Xr@N;J8BE}nr4+2ZEkMO#_5*UX^F5~M@e}RGGhNP} zYH{hY@G7#JR*H^hetJG;dRlxE=h|T%;zYIAtml3`l(SwHWB2NPF>ipQn!M@%V`9sV z_TaD0-bhW_KCjJ2XKv1~KW-WT1{GiwtHJ)S@L2ap_$ZfIcLiX7rv1MPCFXS8K8<$D zW*!cgv)g3!M^v32#p4M@{vocFBBMlX#%H%F{LQLQ9NWgjGx_A{cJfJQH8=p_0)b)~ z=)dkEB{M@u8$mBcOE*q0^`CLuU8s*AkAXq^8!^HCo~Af<%A1(q+X+P+?TpOyB(3y} z^q4eC0`Fsq*Zue&HjqWqbG}sjQV(_YMr{G$$4JGBVg9WMXUI7C{|uK_cm*DRVrje` zjJmEeU&pIgvWRc7Ebsg{_jl?doKI~HJ^j*dkx}z z&nSULBo!_cONGgXl0O>3@M;}Gi=gW}__q5Ol_B;q0%$rYI{nWz>M_&mWBQz~e!u%` zhpd+J`fm98^hGZmQ5p0Vw8WE;btd*5KZ5oF?_c-N;plgO9u!>fkSD+HGqJPR?t$H@eJHGC$nI`Lf z*E4f1m;tIPr)jC=WagviXQrpYD`mZk)ILvL&9VV)l5L&xsN&Q-btK^fXf86<6hQpH z-6Fvt-+b=Z`Eg-?ltvi@Me4$crtQcDLul#bsOv0}KzlmAp~_ahY{{VVx=7#YC#jlQz@UwVy= z%g?ULPDskktWb|ho8M)j)nd<#8K!le`7A++eooaOqtmi~i7092C2A%?sdb3oVjn6+ zTR-~E#P&W@6VkntFGiCCjQtSWG{Af0@XAa6=bg~*Ps&6r{5K%}JwOUaSw@pVN9u`7 zOGF2(ShM+@GvN669Ru~7%ebz`n2TsTG)4JI!#Cg@K2e@z;xPURPV)= zbLRlH?6_lp5Zi9Vkq&_kvW<}jdfg7YCsoi_7#M+Wj(1a>dn;uMs-5p&SS*BIhk#EB z&il$Ndl)elXwfqjqB25A=vU%$CD&)vZgpD2_u|VQ$19n-0n_IcZOj4~JaRtA-f|oV zoB^QKft6bSnSg4X?tdl_yz3mLS0HiNkS_SmsQgENyNpEi>cu4+>|nZ~Ph%z-e;=l; zzVp(Q0I<&~go9}$t0XE8h7hV@-ve15C*53uTo1wCX z?+nWY)128x^j-SIO1+Uee#MLpqfx*;l(1}wnP#_k|{FU&Fwf7 z6J!t(dFKZ*nZC~I>=pBM-C}z5@=3Qk7Yo8lYakE^1lXC2%dWhq+`AnryT0t7er|Vv z;rv_w>@feZn$6~c8Mmu6`jKI`zwtY|NZS0C)f-84sW83*M(owasRQ2L=+q?Nu z@o4?7sij)0{opZcO4rpZw$FJjD(SPTo`0#aoxm2JZ8P>YOmHQim=Y8|Nv9$r4^=OEy+On?M zVaQ7tgU^=g>u0kvIEQKps}#=+n7b$s;o^x-9TJ5jpPJ0fQg|JC4W zd~37pcGmX?cF1l?RJpqPW_b>MQk!S1UuSz7jJ!FKyz$c9b#?JUzm4>}uany00=Fj) z&oaNkI8D2kc%Erkml36B%BZQ*a=ytgQ1+_Q$Wq!l{yC#XyN3G9KI8j;guJN!s?ZTh zuey6ULbc0jQgU&J4PlNU8Z5U7Ax9reK1fIz#yrGOzPs(YkZP*)Y?5?E=|DzgI;$`( zjlZKepqpHhX7gBrdav(k$S#Uhwwy(D_1b%0p>9?~&gZam25!XfMkjxV#~!`76n{1* z8T4)?BbS}G_yyHuNEjx6PrO1)<@&)*Ulg8xej%#SZTg-uGRmJ#m*f(R|1G(^y`n+q ztHTXtHce*V-q{cG)+ESj2Q3f2AVCPS(B9Y zs-(L4%zpBvcOF@2GJy0FDB6)!pvc|*?Yq?8nz_2>@*M$#Nh5oIzUAv`Vm#A$whBPR zLYTnFE&w$Hds0<3;SD5)n}_3#>?-)`>Rki2cJQOR0D}^=hUVHZbO(UR^%^7#Q~P!m zgcuHd*#E=rO7(=Emb#RaI8@SnfSR*!i>nw}0>GBfEY8njAv(5VFs0JSkdYKC#ryGm zSUT?tH|-BJe-`e4lpa)?Pqtv<-}L*|0Zp2XStdu(Mz2Dx?q_z8fsJT_h3wwzw=06& zBJy!ZZE9n|kosCI>d9)z2Lmq~2C6!$EYKyI%nDQO{gz`0mAY+oPJS=+dWlUbfCyFE zk5-Cw7Xa3!KochAy;58Wv0)25slAZXVX$_! zPNHk^06aBzM5wkU$<#m2cD@@Z#qm3I;^n7}w)VJb;GrbKdy*a{xEzB5yp4soMRnNV z7ALW0(*y~BeRN@fzhi>HV+5Wjqg7SW<@p#ri+)k6`&c*FwbE!TU7GF*>J;mzH!aey>8^e}>#xCAc75_42sB5cIKGN?48HuuNFweJU= zx*wO+BBHAB0^K?rc7HRDC*bsA11z2{-*JG!#^3^f%>4#A4SgVrXw@{FS%Hr67|)he z;fV>%e6_(75ZOd#!ppD7*kvKY6kh0n4?G zrITpD=#RhM_5V@IGlc=jXWo$~j8 zJ_TN;u`EtAo54DkSR238LRnGbX}OwZRL~?@?}`>uAeT8Eub3FaNVU<{ z3^^)90{Yvt)4F4(`ID_h@Dlgfzg?zNCe?hd7!D_Xk**h)5!1l3LVvmc;Ciutv5qYr zx$b)Pfn&)WVJw>PMbyymfz~ONrI(T0&n)xPhP5MKwzg_ds;JC#Y>vp zXsTxqp<`iw2b2d>7|4|#a}vgXe)0?1ZO_CwBwu-h!%#;TDdpd^Sq!Ze%BKcL-3g2u zAQ{0QcS8hM?E1)o6OpYBxRz8-;``-fASF}D%zjRZOjh>yH3OQ84vH|I zD$fpNaJ0Oyks9?up~EBVm4&8~)|0zI_-?^nzg8of;RAt|6Bo;UQF~W^v?#|KhRrPJ zw~2b>XCqznG9S-3Vsfwf!e@yWCi!sUNOmH*kEv$~+^oUNIeqrLcVS$0>URvp@}Hf; z{M*<*j9Ahk*lE@|PEse&@J@Tmo)9Xi5UpEh_hen-G=HtK79btrIS!LgWNmVGytjuT zaPLv%iC?tN|IL%24^`)XQr=%xz!A7HpEiLRsLtS#mX?W0&v+QnEyh*;7Zu6V!ZY83 z0lvycc~r1sJbG*|{oP9k76wr>sT`PLGcck%16TIwbFI7dn+WG@Pu92#N$=ZwjfkiN}qfJF=!{sm_FRpJoG_jhoY>$Aw`MVuc;rqugMH;XPY zNBfnVr$`&x^QFzvkG^%}V{D*6Sobi09AWqOj;GtB{h0_h*>HS<4ecpjNPc46Cq`S2 z?TjFP?Sw@vhy~<-m{1{j5lr!n{mQ>7;)Y6kW4NHLYXoi*lXfGc3V-(G4uz2p5d zJU;!zhVR#di=Di$n=yaJkB`}&UneU%zHTSKhYdX)-;c}JH#9uG>|^t@FH3*+#QdKV zS;=kcW$9-(OFrEm?w$`PELk>z;=DdY~ zh*W5*WWo}J6IDxANRi3AMR7oUh9$Q(A%BdvOds-Y*WQ;2(jDMnJTq}1D7HfSC^D4@ ze8~X!P#*eA5iFvB<5^(nk2uhD#RRIT3f56`M7CFWV7dst*^o z+q(M2ba$}uys@?|k`HW-#swpBc)GSO2NR&u)i=(6*5X-jqz?uM=j-!IEuZ2vjU?`Q zsD5ciNu4^M24P7^h|AcD33_Q8YPzd2lg9rZd$YZw1et^9VfN z;m)@z?IJyK!kiV=3qMG$<2%2I!EqKyZ{L=#<(r3aYR;u`y&>!6P&Xcg9+^t4(~7Ur6^;G-R%^`Q~vrW`xNUu3m=vE#=04H2TwNeMg{ z>DKijXt4E->7lGDEB;y70k*oj2mX=IBZqW&7PD@xD&{qR7-}ZWa!QlY@c!jLh+zfFcAr!j% z9Q{Koo^aT?Kz=W3)?!F7uau^hQ@1b+X+$m;2_|D0ePj~3iK3u*2z9YB8IZ}J-K{Bq zn!MnaAjx(=8D*s1*n>F?AtopUmIX#op|ZGMyypl5;Fc+vkhyGA@esLgI zTvi%F7SJ&2OVA((Qg1&tcDuMu7kpuV1dU!K&x8j+DsHsSg_d^EHBYb@z^vSB3EeuHA@wefXjoENnB*;ID)x??yXf z<~FRcBB8}4AOse-UJvOt8_D&6DI$~xWw)A7t`lj6kuo#HTBnkttW+v}43Rp$X2fV( zH6Mk^3{b~D#u_jJi*45lL>O2lit57MFa~hh?Dax(QPqz-URI%UR?z5`#dCNv`ZQSW za9+LGCyc}j*`T&zOpAJ z#atr%Z3FvSc1Q>NyCWj|zkT%?a<_>Y38;I&eUSF&_28R^mbECw6LI5_-Q(0bcwpwh zrf~vEaK=@=P;(@IGzB+du|tNWLBu@7D_6~>QUSG%MWh3L_oT#K%QAuup|CELSxdJpMO48YK&LbK2 zfoNslVWW-p3o6o1RlOJ*+>^@L^n9)27RGR~if^LO5`HdKepx3Xl$Ua;E? zYXhNFetA@HSK6u{Edb}UX;2~R8iWuq#~4@lu1$PY9QQG*YRUwo5~7qD`l$VQ2dzp9 z5hmdnc_!h1KckULI0;D2?)bnroQ)bBbJmjq`Wh1YLu58;dge5sm2Xc06VnPhY*EO? zQyO#~?sYQsgd6AM={z0m(Uv2zjV0KGKTj4ylSOUJSU*YD8ZX;L=rFv;4Z~IFP7xq@ z(wO%t%3(?4dXEz^l+lm_($+#kix2Gtqp()QC*^2=y5Z&H;^KW3Sh0H5YB3Ix&& zqZr^#sl@0gt{IiSWr=RTzSOt8sbBOS5E!0I5ltvkLEHAya*kxm84R7C|6TBG54{3s zAvhm@n$1+7#?zb}Iy`M7&L!UZ%Sos8a{I1Z2IRTnLG`61>B1O}_t3uet>SiPq>yzMkTUrna=oBmFSU z33%bjHtQ$MO7^W`q@dkEfugxg158noF3Ey_#bRT$z_*~(U6i%bG}ed~E6+LQxxH}} zOCpzXl*`HhOZE$kR|+Y8o>v>ZQcCQH5Y?0iJu^$qS{7v8ceQo znvY?V00I7Q;c_7}+Mc)jWog6UQcL@P+q|Kq7508bicx8`4_UmX9cdP4sZ&l#+H_|E zR3(btpD!1OUZiaZJ|&0v;199HGGZ`PYjmOC@*+@C-k@iVz;+=mbl-VBLY8|y?hEqr;=v1&}aRBsb&`}nZAnJ0iFO%~wVW96f?S@03#u?PB7h#Mp{Nx>9 z&wM*HKY%o$NEEJMNMm};sle%=x)9ZraIjle58K=iA9{giXlfh=_-uMRKfiz^Z^sUY(idQ~ze)qa8q)TF{QLsv^^G4URvB`aq`=Eq&591#a2DutI;Mt=E1(2yvO z)lm&*KHC!$&3mP#rh5#eP`N84PR5IC?6+EfoE`9cL6af&>_hc_ zg}5+{NUe&7W2-aJgbJ!~Yr5)lP)KbWoZ~_zYy$m;JSI~(C}$L+u~7i0$DYQ1r!>&`^(e-weMmIOpwF@88;sG z6lmk{B9#O)4r0QDU4{0X6oDhQ=Z3$Q3CuA|nQ+$tJwI`LhMY0A=+<)hSGla(jkabt znbtxKlIJl|W&cj-I#>*wa)+|7?5xOQYt7_!Kg39KS4E(I@%Y13YQpyK2?s!Ki}GoL zRnAdiJR6Em;MotJOeI>~{UbIN&JYmiN)p6d5*#i@bE;423bdh)lQb{0)2Q?{TR)=T?7e~V$eiwK)L ze{?h$$+i_^s8-s(h|>cU38Q|_HZ=o{vz5h23}z6u@Onb;_}O@vc8=-_a}PPmKQ@g+ z4ZjANZOS-byWywGLh~2-hW=VuGZYQ*jGA(%{Ylw>UOswgy>00dWQBMMqUWZl*ps3xCs-4m zE^L%F7}D=3Rdq8d9zVhFrUy%43}*6dJRNSPKMYGgWjoOmZRfX2hj>ARII2-4*9Me? z+pcshG}I?>rtl~pX&Y>@Lu0|TuiS(SCdrzA=}jFC$TOMy6yN)4z_~!#6RBrLEIr&i zT8~%5{n9lCdDiVA_Lh`ZG{%vP=?#peXwSY5hEi!&_)&XRFEz(RNf`TooRA+(p_~kb zsN$k2JqjGK3Cg~oo`}(%q})g{?6gKf`$XN%E9zl6-k3HX_E3haDo14iVH6J| z!s63eM(}Dk=%9Vf6!6DUzz>+p0z-p;>$FJpGKMRH=-b12J6x+(I`H3O`{CGywSP}U zso< z{&u02jj3dZV>wdx%toQ_ZHOFs9R&j@3pZ`|b~0p)gkEC{Xu-Jlk(#+%+HjZ7Qy!S_ zouH$8C{saAm?#vTf9{I?QH@9gYYL^-L*y~Lo=U( zP7ueafRzr#C0)u&@+ehE9M`vi%Dl0U4Wf}9TwSOTRr88NLMMRpJVtIuJ}6x)n@)pX zKtB617uI6Upjk1YAt!p-68iAZyt}i&cs&?D4GSqQzQ;BjA8(WrD zCo%o&fD}pcN(^zL$QWd7J4#Q}jh2;T6Y<2=!V7hy-zfGyv{Bt@5KrGrqScL2E4Njd zL6wiw5y<>_=|I8KLN1lo%L}OM^Sr5*0)~Y?DfIG9z$i{Zajvz0E+nwPvo_Z4HD=2X z^wltWc}JR9Z{J~-N$P8dputnF2zg=2-_N>FHrqzpu)Ejc{MN$Ag;x=^U~OiOcUH2g4iZxFv!gFD)_0-Lwv{xwJ4_C~w+Jz_ci@u?sXJP}duyr`RR|>l{!X@{#g4 ze@2!ow(2Zp#7L5VWpQb+B{*Mf(+!lQsb8=TDDmkL8{n4ru*Tx@Y4>a1ULtD>4iCmu zzjWqbl<=~f=FYF(z8;FQp>ZScONR;dR5*xr{s?Ps7fG9mTh zD5GY(EiF2pXNkA}5@Dr6E6{~df)H4HR{$jS))ha0K*6eis)ex0f}6>SUt1V6xk$H@X%CAcpZb(rYQZ-YQbVt>q}Ja*PK+quYdBet{+vgAj{q!k}V+)aJu zTB@Gp1d@w;+HROTM^Z|slT_IZ#4%i%ao<@72eNGAHC?2vS zODV3>BO5}B$WWXS?_Cyx)l9}glUub(K=zh3+7f_`vIwzu=7ird)e9O^*i`?;qtq|H z;>g8+OdP(4Y#Zj#8PoeOa{STevT(>W2WJ;0V`fgRAH5~Dp8(fDWGg}9b7dwHG^Qc~ zHAY3|Owhh<>pVI5Ych}XY8qs5Aq#G9_^0)FDNCWZVlxR56WjfID08^y!1b~=3Y9Y~ z*!VhN>Xd61fBHe@Y@*o1;gE>G(@THy+CMUX*%eaUIrC?&XE>1vs~`TJo%Sj8w$Ty)(?bs{xU8>-=KERx`e4yE(H9u1*S$65pjAkCv2aGU(H7 zj>+B)%T*2MN48!Dcs#ca8BeG`eG=FwK*vUHkWV+~z5w*L-3ujmMo(h>MC9PZ%ea7l zc&Jx+sY;fqh;<##&Ml($k+Yjz_xb&Y^da{tYywVwZf>Zz)aW(d z5H3UlShA!(5RqxL9#~YxW1}N@l78u%plcI$1rYhm$e9HOAR`q0 z7mWN&=i_P4`vBoBk7#WBp*(Un+aeu*Kgq;OnL=Z8N)rLdvOv1qnn65raf5E zR~H|n;mgd^)5TR82T#DkzcFJ_OJ-EB>-RROR4X>*$@p(Wt(&C0^~l&cQe1>qgjPd$ zE(%jgH)oa408ILq_e_6Up6kkgLdVlfv?iU_XFD*bIwGCzIyr4RJ(lQV=KOvGWIGyS z8<1{(?UFkwcMTD_AC-=4O0L^%HL0nYbrb-qHA7Q*XZEmCy;UJz z=Tu??F0tkpwJ{wIH^Rt%jB9)$zm7_|P#Rr41jS37U$W=3K#&7}y$t4ma2k{|7xi@I z*>~7SCy(vgxG&OmUaV>MFD;x5hd$x)MeR`67n(6~6bJNb+?c3S=Vn^!-9hX8J~a@1 z)sRv1MpOgb6e+vN4-H3v9?W1;=W`da+uoB#q2gj8GY&DVDBp?1!x0_`X zT{J8k-E2g$9+Uxeza@D$A-4rAR3Z$0X(qsrG|O^=rVq%)<1Gq*wlx(zIlwS~#xmcy zz9Q8;m*2$F=&OlO!)UY`=v zY7aS#=MCtQV(DkEf!0h2rn3e;0i^^%lKWBHj%2U2`9RSGeF(9SraB1~HiAha`f6uz z%k`UDW}=pDttL5tuuMlcC$HPd1@+@oDgu!UyWP zTuZxdQ+9>s;o;(iLv`sR-y{g^6#eKNRZHXaTX`Bdx4aF!{J^)!;b}P5j z{p<1abM$TL@_CD07~IRC@aKS7#OE((eTkGPVfW!ZP8E0(%ivEJ@jV`;tVXQlEF|dF zWT8N-LaR~+7-vYbI#@6Lb1qe8pjeS>`A5G}@i9fmkX_NEtN`cBRx+^~?RNs2L(g-> z67^tAay@^46lRwn=s4k|Y;`@Um0|(I5$5l=bS^1OZdM$fhtUEcTx1 zNEbsoE3H&1c73X{#&t9>lD4Gad?^+n7PO=VK6VFC5M^ErysmK;4FrV9ZxM(1=t(0V zlAspvaQ|l3<-T1Jjk;n6gi*0Rx2M7|F2xmaf%YPQ+l__oRHsUeyW7aap8WpnUhs4o z=DMHj`M58B>qIR;){Jo+UiMoG`hHWQeY)Pjtf&sS-_puE@qHrf@fN7DGbvFk5JXa^ za6N5NK)k8a`CfN_V#ekeV!l@HZtCYz45GVOK{Fa-sSvWD6y}C{EUF9U&tAI)ga2LW z)aomLgm(gO^0<$mYen%iJ1^PxuMEMXX99Bhgh@RSBG{d|m1qa+m@{A2`f_-GXBi11 zLURx_U~wRG>V!-KdO0M>HvvLUwGvvSG}3mr43Tx%&h>qMKJKoP6pi5+J{c1#WN{j0 zQL;E=I^$te~`7Xi;3b2JSaZ}3v!}DzGepkhC-AoZ}wNH`+cS36AIK)R^c?N?OPTW z3dy|O^X%teLe*-mL@#0{DDr4klc70nTVBf_sgrEEPn$o*e)- zNksTp!YcHoV^koPd-xmI8e1dZ1{selSHsEV;~?{FgZ!Lr9l5eUQgWQ1ILB6%5=Y7E zQ4@AoW?mkE zM9AO844E^i?`Cy$C>CI9>uL@ziY*ByNRb~YW8rcU6X~OrK5}=73BbGegkF--JZ`lk z0?uo!=ecRL0_UQJt?!^)8Ue~DLQ~zPLK5&Fkq!=yrZ*?En_l~RU^t3f?9Bat$t{=& z8w%#0(=c3Q50Fyi1Deu}!-wh1Mr^3nV% zCnrMPs^a$?RL%+5mC24GxK9v&3zyQil_B=2(CKLGdk>ahTsMSGd66U~qlXMR2V*oi zel!8W#Ty3_p>Y+@oYSeA-4sGJfVj%TsGmQNC|4Asfma}|F!moe5bn7hZ1;d6RhpMc zaj0+Knq^e1p~O|y)=#Bnd#~=U)I){?T7*+pC_kbh1yZ>uX~#JZ>mnt8B_3f%_S2)l zwTV=tXu`ODAE=Ju->aN-ShY{Y#`;OA$T(hxY_f-HDbU-!UkyLv=ke=TqqZC!GhH?N z+_#T1U?6Hj`$gH3aP`+hf6BExT`Caap=~#KLy9D`>=ArNl)_Rj^jTu0^ zk}X_wou`25sO%GG;ps95i=s>Ss#-stvc#dF0As$O?~$Lw;H*t;LjO{0cw_j1$rBT-EM+ znYzv0b8{Cwhd_ycrol33UxsUHb}7Ow^CuWWM=c?zukXXpYEv7&Ur(MJ|BQuL4D+i! zsxB0ONP|&(?`#dzfo!!3A&y3}6M0&y4ZPF)l2n`FlYzu2WKB3iD5}VkCBSL@h&K)sWG4RDhl zN{lhX)21+g4EBW35EQnz`?br&?(+H8sd)CM6}y&HE<@1>V;Y|SV3`;1e22U*@V zl(TySK}|{hbxJ4ns(9%OHv0EOpooZ)xWxsZ;#(*??NSML1Vj=o?E@ksaQ6MX0qO;p zGN?W}f(SGfzpqjp7`(=}msHS&UVh`zJiF!jTV?=%09StYveapo7pWV+*3iJ!9LkxT zt(jGgWE9+(m*6qkatQO_IkICH&_k^ z31IbTSIzQ`J2)|IKT#5ND^rbOo^qANN8OGwqImW?CWQnT0$$nA-lSNC#fZON1Z8C> zVOsEoBkK;QpT*fBYe3JQ>Ps~BkBVcmU$J6;9XsrDKac`}%dU1>QM){EiIPAUu*jKO z2;h9c36$4pZb*NuJS)E@WmiCOjxcW{23E+;>^fk*5DSyzV}`;yDsYh|UdYE7@%?E8 z?AQ>Mcy6mAOgSH+l14gYXao*slB#vUA5Y%ZC)-i% zrFr-8%t)<4lKz479)U37jVOUE?p~R~B{O;r>B{!qR%YxdJ>8&+$qUh@-qt-u-C0`H zkEtM}e)Z{BrwG&lWlA}n?tAXWcXmGqoYDY{0V{FNLp!hNFFa&ccg~Q4~`wTFq6Wxlp31*nH#m$AliWq1tB#&uVYh1cw zB?>dZI-PMuVP#OBSzO2JwY}j0X*yueT-fKp*-<83S{1K4IU1j3VMH?^=EYsI%(f=CkNX)j@90=Pe<7M6| z9o-L&*S*)@R1fkinslodEau-aMrjhRlwN(;+o5KxKtYupXr9I?53_JLX-bc;D!QvC zlKcxaeV=R89R}!;184)0{Hh=g41xjx@y|xmrX})!{-quq00BVU)Yi;@(#BL(0|vnE z22Pn+6;AmX5CtGrUDtlA6VdmzjsRtk3as+E*8Q3T%nN$7L-Iy+0n06_P##*Uuz5E7n`|Hd8;r6Nfug6z&g6*FVrLSvKEVts*t91Rf z=0llg)B19gP5)1Sm=9R~HgI!IqjnXxcWCLKN9s+Qv}jW#bgrUYiX4izEl%Rc9mwpr zlBL^m7rRhTw2@N5321WH&3mJK*KV}UAaw5a75>^V{<7yL^sAbGa*sM3?~_XOG}Vpz zF7cH!B?{~<%HWX|Ynwj^zIx*M`t@bKm(78LSJ&C?6`UJ&7f4wx^SATmHTY_AF3==1bcdaWA z#!mA2{Cxe*;{jO%-$|3o*mJEvU{+GVBoHAF zQ&@eWr{x|r&|zE@6uvZg>)5uR8{wT6eK|~(InF%Kbsl&4kQIOn4QHxsk+QL6oTTSb zF)A8dSqzkaM4G>aO0q3>uEA0@JksTj9ox|NGqG^1LQhlK>#*~}4bMD>$q_)fJT(qB z{19}!Rk#Dtr@MQ{Ruu!%R8EY%>#<0QI624V^DgkU@)FB{*q~I-WKldYd7M9h|N7T@ zeTJ^#6t*`Ohq$S;a7^%VaJwvC(0mj-6_n`_Pg=BpmJ2+|5@GdBvL9B51^kDm8w(MZ zU&GANkc68;wG;2Kc|;IdR>0K&0@mJ~PV1dEAwhr#fgEr6ZK`sI-uJ*v|3X-r^=n=IQL-^Rdyxn&<7SN+*EhlKzS{H;i0Ax1-E|;>J4r*HmM@8^sJ%!~mPz@@bHN zGn6!G5RPJ_7LT5G826;@Z#b2^9>2z9-N4Wa5%vb!KIIPpo-6+?q>AP!sHLOE+?CJy zk+8}DJNm3N?R9qk21Xjwc`QR2G~`h*=wq&zn`bw^yMj(diQ>6MTUrD%A(t5<0{If= z517q74{BVC=w}Y}9m04-U&nrH-VnuqsQawR6|OXF807#3q8jN$-)H$!C9yDMH80lS0^P&3j+*_gb{(o34Ylv zf1DTn_{+0gZn`DOs4+hsdFLA3EX-RbD9w;3uZ(pCs+!3+L5*!0OE@Y=9^#a9dZ!hX zG+^#ax17{8Keec%FhWI&ZNL>zl<*=80l&sg0K2b@|lR8otd%?r8al%g@e0?d7e z_M)R}jbw_(L_FSrIa1TGj-I56^cx9ze^hm~96|J>lWS%}7%=eGXlL!_r0~JP0}F0& zRDcR?T|+bYW^UYQ2U}-^t=30n%CIRGoF_GOG%4B^Z{C~)4HYjW6r6}mMP3NK#^5nV z+bi&{X0-9|(Eua6ejKJ~Yb}c>)OIufZkAjY@8-WSW;Xq=i_bRTeDrR>wM9iEe{O{s zR+JM^JGjnvZxm-!j$hnF5RL$nu}WB=77`n1Qg@nS$ittlYq6V)QOc7%Mjvce*t+*K z{1{s}6bqt&g~GuG;3|w+xJlQ81hl}F8av8V(jqDI)XNjOxo1XQY?~)5mzE zfPw2sGZ;{zs0vn4YkM9ACy0hL!Z$Xr@!!_HrH=fPnXJL z0RL!8?M3aJrD^lp51Mgck!T0AJ&Ye(q3n+yN6~|1u`b|D4$M;NM%sz4A0vq8@D7VE>pzx|#D$*8Yr}mWPE(iPP?3|oFwj;X7JS_ZszDZh!7aID zOkw^upXcM`91CQye~Qg3BZM5R5o_F0(7&yiskzIkQ1^zAnTCIht;YUq zZ|W?R;af-8my&dJRC0Q*Le7LpjkSJYG&bW|LCQ?v=oLi%K6XTC72;2XnPNgEOqxSb zEPjOk=h;&CXfFJ=VY%QPvTKOOMb3Ff!v1hiE040nf)XONf77z=>HdfyBdk_*frWZM z+=fj3HV-T5)+tY}+U;EdkD~)fy3e#lcenaPi6GUV)WrwPrIx(qv&JgT3Vk}aWUh}S zkQT3K!MX)KerPxKdAe>6rzwzb%}c4faW;vw@`^fw95DV^FviB&OiqYBee-4VA~y6Rux6 z9N?-7_EBHc0FK&+?tT9cR%eV%M4*^qtYA)cb z0QGJxX+x6Q6dUWLU$x=Q$P+PwDD&DPeTU|}YWIlMf7~to`da+tg_>BJ-3$<1#E^7H ziDg0Aa0(}snU@G~{ijN$b3u|A?1?)o_F5sj2=6@KF7$0=_+6T7M%l%3rayHK=8SCn zl4}?fOIBeOJkH=!rD8g=(OMWWc;7uR3Cev{V?7yScW6yEE}zbC!C#P^MH&Yk8eVz! z>eCKDe-@P9OM0yH;`ZdJYtl>txThsD5kv^9MS>Wx^2)YRZ8At9hRa)iIUU8MW3$Qa zeB8OYzu;di_Z8Jv6>;%)>8tX{_3S=$G1JMgrRPOrrMvlY_R^aKy@ zrKzuWrravmSL4!ke5_*`@bg2I4ZO;37)vZXf5;r>)DPQDa6Aih20-==Re)s~qRE0~{fE~M=^Ct6YFKml>69Xr~ ze{s!Txbmh`BaTs&ZVBJACujA3B*^5Zt>@4fC{KzVI^ZBSB?*_07WHh~8?_dmYB=s< zN92b~2I--}G|BYQEIW9gh%iMBxvYleAq80>Ey*#WjHaAF6>npVb^oU8a=d!na1{-U zgJ;n~O}!~{r<_z0R$|va9@ChPmq)7Ie_#3+t({xhdR1{~*MRX9EZ)J%F;O#VscM`9 z_Bm7e0iZ1#GpO#VT*(Drua#s-5x$1WI7v(hm80L{SFI_2VP zEa^Ip<%+?(smJ02FOzY^mKG|Jt88g~An)+z@9VO1EZ+@sF2c2}Vf8w0W> zeo&Mn9$;G-xDD`RdH4+UFKM`3cL$6tBk*8`>JU;+f55p#bP!7jWTXcZHLTtq{U($uW=Qr2HaD9{{xUrr zeQkoA2y4se*2T4|F1}2`qngeq^q}z3)IbA-SKhUbtt);9=GUBIur@pA#leX4Z|+rY zy?TOK?P$7bdyC^Z#G4R`+TTVkgE1C?{_}kxFQO_o%jF9EYV#9lp1~jee`i8o6uVYG znoMKSoc(Ll0NWNU?6%o7*OJA> zcUy*mqyFZ$2OXL#vV6AN`n@fkRQ{gxYl_=Af8-OL)%>f}Psgg;%V^5Dh=k!H0ZD5Y z=EWj28YJc07!|E--c9I4e*}J2afNUvE$?Pb208kj6Lm^w1{UDSfOvQ~tR?!hF~)iu zTalg4a?N0dzV$iIr-3AIq@lbi;*=Q1K$GbuJW_V#n5#H)XMkC6%83=#uCDLVhKKx4 zblnR+(5tEKc{XNSd7_MN5S>rVq6>g46f=FcW~EuI{+tu{j85Yff5}Y^`57O2s)@y? z)EW)AqiI1$gQAu3V4cgYUckjQp{v(Yj%G+w{NWLbNwm0F3`@9Rh7*Wmv8nlMCQM+_ z&K@ARYyoJnyyyIl09B`9ZadG__$%Pd$4hYJ64&6h9{-Y*7YsF673~8hYVn(8SPo)w zOXM0Zl5S&;-kER)fA%kaPrm)C9e4?b4Hg52!>`ENw5d$C9$3=lOpVppVB8^n-=y)f z`{%*ad$9XuN}1xnCQ{vLOTNu;geLe8Yt_mfXh<`wj49Z5 z00*)RG*&v4K)2)Wg(M6V|)Z^b+{CVf8K@!?AW%K#?|e$OUSXm zCQHaXIvA{#SiYc~Nse(C=yWMkDcYelaZOkhu3KiZ(q?3CzxEfa>Yg^K$kcgxZ^B(O z$?m>I*&$wAjaoJSmS-Z*$puXrv^%NxBY7NA?5~WL$w3w7iQar8{7nkJf&C-WH8)Jo z@=uezDhVPQe@E=)Xu56%p|b9XOq(IagILc$Qp%xiFS^P6v8fO>J^kOmFa^OigG*eq17&wMp?@s~uTle1q9_=Xh;CrO&O*otaS zgrCx%Jd(HkPO1y?EjQ8ZIJU$^SXKDStu%-G=UYR8f53Z_cFmvw9R|&A5t7dEj@9Fu zwd^FzopXIm8WardhO{6X2DdW1@cp~z1o3%~Ut+TtdD~O!2#1UEcuf@Kc<@f*Z@Y9$ zkcA_AfgHBS+Yw80yOln&9-Gms4crAoHLSc8Po&7vw2=0m5T&3V{0GXB9Oz-nB8*Kf zh&?n0f8tgC$bIV8!k60Tm3-l*EZU-$qh2Lu@rMurNu%lA%JyG=mU0_ox+p7{`dy`9 zt&(A)|hM;Z#rC^ zw{Yfoby^+e;$Kr2AH8eIB)G>Kd)vZp>65q8U}L?cLKe^ATrx7?BxD99KnMj8m(x>H zWAx%g)9W?LCxD&@jCLU+x@u)y8ma6@eSH)T ze;NpV(fkx~b&y8z&sNBYEtj5p**n5NINuEG;bBY{_S1-zZBYHYVxV%b%^ z1)DJ}7YyO$|Mf2B~I7m|#bj1HI|G?IUla4(V8>FWQ37g4^; zwpH&M6_b(`(OwcQ>Bv4SqWG7Q+{S7+d*M=wR%3=qOrImLTJaro!j5)PAY|+2L{9RZ zWR)z32GeA9N-zZxS=R-GDkdpVS$xb~vA*)0&H{CspABhBgS3tWjB~Sw-y3Sje?uqU-2fvYT0D&wVBK<8chj?$yLFIVMJiY`=Ai7sHuufk3Dj9{{ z#Sbn`tW6LcZayK+nLo8mU(4uz!?`kvsw>_mtoRs}6UD5jg!t|jHGN#Ff8v}<-zTX& z0|w@2NxF@2u{w7v0P#94HE?3t7}W`B zX2piHM;Hr_QSV;2`*m@xf8P6JOt;$~;ElRqIY5yh2_pQ~K$vuZV|I+)uCo%8gh!qz zbI%+KL!bZ4C>Mam=9NY;Xn~AEW|frmkZF;Ob7w?5gSx5X%RWKd!Fk`_V6aHPVse^Dd`1Xe|#wwf6~F&m>ifwyRld{ z8a!6NxmY~Dx-wnRdOX%kPan7dPdYfo z{@_JXG9li~Y}RfKWN(4&@@HwuR?Bo;+rf4#>w=~kPRz7c3mX*7Mj zf%D(I&uEgpuf*8#$4c>C|CJB9OQq+G&CCZnwUrps!6>At2y~}W zHRgi>P_?b9e_#uR$!Lww#Uwsl_kKPF-s0LS=$>gU6&F^fQQoaa&UpgiS-LH8qX3Nx`@2$4gHue-q z^%#Hz^=+ba5dgI;3W$J^UH2a1WWk7+a!B~L`d#S&-Olrm?h}a$_{otSGR2?cH~Jby zOg9sae^ANeV|?UVz695D=MrB|g_h$KOOI!&WwpM*8B=m6miN0L3Zb3tT&ie>R>MH| zXH-5qt{rHP?5a$~QqPmK-^^9R2lDS09DPd)u*He@ocDCGOufrhI@>oi2(^lD$Qb~4 zzwUrXnDBv9(iV6%j8On(kM}GF>{wmsP5d1>f1vixPx)94o*VDhr-P>KoKU6=*7$%K76(N?HQ_aH$Mm!lUBA-Kw!--obLiOwRH%-ZJG+b1&Vcp|# zLs)7na>#ynq|ni8FnWYza^I%mDZh69Eu~wDK=OQ}w-I->I@|0T1C!t%pIu-;_}IGW zf40(x8}Wd7>E^yr(5=tB0reBe%?3SS4gJOVNov`x1UhgzEFmXCa%Du=jQtS?=q8TeI<4rz7vimt#|R z97qSaS023#Bh#e9Ni!rkQ~mzvc1WIj_@9*!zwp*ivT(E_Hw%MqF&_&VMUxaUe_b0B z8EX|AR&0=;F|;>6uRQi;_I36JdK%diFc5@#FmGY6yhk}kt^a#nng+|t5f})a5yYU- z|Ia@J1ECCnNag*{o?w=lu2p6^1_MD+1)KXnod4dSsDsV3d*$&zM8bnWsDMs)fO_Ti zG(HXY$0CYsI~$LO=fh#^G1+xCe?AU7fQ-4KXb$|>&Dd^jJXK%Vx!Sl&xcV$FmS4v! z>MM{GL(jIwFU}q)=;bE3-Pmkxx5Cg2on)o_NzzTu%PC3vpY^rlCn-6px+yUX5Fq5% z$9U%q*3h{8>4kS!q@eM~K20o}SQ!tBln)a^7Ak^YJn#3#$o(=bqx}npwLcuWMesg2e{8~&;2Ttb5Nu|` z;ml($kReT^MDd|I5{+t_-k1tppfPS#7UdzKe|rEc2b!Q`He zV2>DvSq^vTSzKYUf!4thErEqJ8QE91b8RaoYokknZ&`Fl)DT!lzKlZ`I>SLIQ!roF zinwlM7tVp{GP*%LP{PR?H%To7VHK^D^bZ;JuUmB}*$)w*f7-!4$dsegf{a% zo>T8^7O zgI)_QdA6~qr>9e!Bmrz4q9%L@%onQCHpRkmAlcq2oAw2`n!b}7C5QH4*I_LY3)aWl&L2r?>m2pr_GojYmk zoTE5qEW>-(^Z)o7a4Y>actRLEs;W!zHt=L&Ou>ER&01StxT7F+6{D6KYlGDf4G@Q? z(uqniiP3qC7IqZUIeQq1CNbBa_uNH$fNlytGPg4if1o?t>KO=FU)|eToc05MjK3Nf zmfuo&#MRcRTMg1s5$}Af*9r~!Ps4#>aj@Nl%mE(B9hdKFj$aACF6(iHM_#F8S7v`TOCQg|N8e?aUw8e_DnM%y|m)w5fy(a=7LQ zatXe;)60tfPdP;%T3iOMpU7p-bFIHs%q{#Ac6$cz`p&$q@%QlI?m|39N~sC+s{yGc zfA_>#+Y*Gd-T6VQZTp6B`2ckZ+*dokh1S*^t?M=YEH{`jA7XmE9R|@LGd~FkduF1? zwx9f^r*haq2e*NU6Zm{weD8mxl>9@GnY1IQ{QprW|InqMHoeh1(;oPpFtN*Xo(|v# z+`Mu3ecCfmgFmNX5`F7c*<_B`~pQj2U_;v(O;^5TQ@(c36ThFIGfA6oF zOV?{r|DU$@du-tF&}83#pLl$dpb|JMLd5GgTqP|J2@)?Mb1rmWfYOPgptSH?Vi}ck z)GvbGBA6aifw+J>cO1Z!lFKvpe~B1;w}Ll)NcnPEusIkd{#18RfYJgwTpBJ9%S#di znoZX(c_($%>zF>lB(0zoVa z#<3qp>Of5OyW8SoH!eK{;7FvbOvg&^dS!{vJE<9qpXcGtK3df0x$n&6BoA zEc6|R`_a#Anw=GO#cEbzm(K93oh@p3LmY3KgzQ5XwThxAdy2%Efz+0iDwGtM8`rcF zw=;kCI)D4`_ufE%!&!I1W!Ied+>8FJ_sxgUSssegDM$gmMTP|k38_e`iiJ-Icy}rP82a)(NKT1}46mt9EC5buSqM&kW(oBMDkL za!=))hZq2mHt(2ZC-Dl{09zXT`k0PYuM=K#CE}w6!Raho(ot&m|8jNG}5dVUZ|{e>9%aK4h@BDD_Sd z1PI8?5B}dDYy=}1a&-2n@MjKS9<&h%D+`;*pgf8s3=Dz^WWL2CSe&2bN>*I{3YAaF+-aOq@UBEVHoih$1h0}#d(M1B~fag96Kl5~EG#0F1$ zH>(q(zk;;>h*a%s+hAz%^urtR*(BqESDO;c?ZXy>%92+We{DQ@j6pkkCv%$;&1H+< z$k&3HK)n1xC$TxGvVNF1CX>pMh4kDRqZDTlz2dh2GH&R)Q$fz1H8uf`#Cw%HJmq-= zIZ(w27sJMEdkS1(>d2P+K&6U;r^Cns^1-Fjs-ZiC+#wofQ-$>Zz`@-i`(Ztkv`t(? z6rpMp)v_0Wf2@-MSeL5~N#^*NxE{+Blz1X`PV_lw;842R#lO}s-{?anZ_RD7&}{yY z!*ss9(0~k*S@0`?^d&K&y;U>EP29Y&^=3lkNRXh+$eBqBs5wNDg~(^1L|_&F;U1GI zT_%fnn~yszE}p5}uU!Sa{=lFn7B6o57R=-Q^{sL?f0?}=-mL5S`?ierEilTe?45IdDc`NuAJ6!EBwzMsj+} zEZVGA2s>Ho$QGf*fGSS(0@jJF?G+*Xt`sp^e=@@sD6jVw9~G|6cAgohNQ4ey=|yXB z+dn<;dYy_k%AiTg+gn7pwoD92L>fyQ>{1MRWJ2>uHFKk)gAoZ2Hpv3n3?(z6u{ffU z8E2g%Pr(y`2+Kk`Jly_D$PEHn*2Tb%$xTr~EAF^E&LGN%V9{{AP8P|S3E(~O0vzl` ze~xK?q0(6(nr_ihCx9cdDFr`(j@V==1V#Q6O~(GR#n-)Lug3iik(=1gm%dPJbpwV) z!)I_ItudUqEiZV-Fot`a@EHx?-S4oQU`g=LM}!;%IXgC~S3!3R9yNl#61r$XnFG=l zNh&Uja_+Lo(uV!51Rpsu_jE)N1WOeof9iCXiS4IjBApmh=yjr!oF&Hxg920rh838O z++?%!SLc3aKj&pUS+unBi0V}NP(RA$7&T)xpP-2Dn;jz`uWfP#*pH#50%VuD)!-uS zCkqYm8|$#v%Lma)CKavqN*Mo&L_S-rP;}@C_;+ z>eB;06%@ex>iBXIu+y$hs{P(S9eMr3O}DcXPz(?hQ1Di@L&L?b!bqS5f6!?;4&=z7 zxX*CfveEp*bxx5LeOLS7@w#1m<-C#>XE8?$P_Dh|K}+bndPpX8G$qDRL!6M%Wz|w) zSU!q-ZW=ah@m?`Ta)SnU%i`eA?jT_<(2X)CZc40lg?mXrojj9A4|IZJFE2z6CA)k; znUR;xjKyMIxx*o{Jx<06e{tIn`|(Lz5wuv^tEv^27b6&5&C{xu3l+N(j62$Qol|88 z#l<9i`1)S|+zgu%wO?7tLfz8tjwbvom64EzN*pu9Q-Az^71KqfmSM5b9reD>HvVTU^xgHrUdDGny3@@BrG}S!(Idgf9RvNm0`O>;C#>D z7g8H?q>E16+ptMk#`M?=;RQ!oY1Ug(4q4eGeu!;G1}xIV>(@-LEj?6%!n*UQ6_=7hT%>XAoMC-Lp5a_Hf~4Z zhb1#^brUpXV`&gF2-y9d!O@4yp{Lq~F?-f4O@0n9dV>Ag#GR1NhjkuyYGDkn`;o;n zqP$9g2{~0Hnph~V|E0oa+3++I`!>}C>q_L2EY4aJpiHCcf097Wva7l!--SO?Hk(0c zvtNpV@rQ!1$+H^allR%hAdGB{r=`BRCcfszKB^Su z+Jxe^cV-} zuKcque`#aqafY=fmyRQJ8Hf|5*~7iSkK5+1sX#FZT`c##T!Oeg#}B$SX#NnJms>lE zI2y49!XsIx&|y;3W(^5)VJ=nZB7psREDN|Y6VJtUu7V08zHpR+($8b@N_lpmnh4eyM_$y}Xb`)8ApIP{9TJJsFR5Y_U z(DYtPa_J+9_BzEWKDQD;ELWeqCYd0mx?6i`$4{hv+iWEB^D4d|5! zN*Z16PLnaW6?tW?$_AIuNau3I??ct?-RZ~fGjIf*N}9&9X_8vm;0R7TQ!D9TEAD6~ zvs8n>g3W`^M-rp3V*--!9-MfSx6~#eV$UPq z2;VuB3=IhUbrdVAuOXuy4ga!j`CY`CP&{y&?@N|O6!a%@k15w3~>0pe+|z)Vne(C zG?rs}6_1MfAq6xnHDlSC5gj2ec5! zh+@e`Qja@1GWrV6fBKE<0(*D5TA7QJR-T-snvOBf{)sT>W!rYX8`IC7F=9`LwB@_k z$Qx?*#$@LVDec-6W{a1|RDO8Wlv_)#<%<>nKF)}#g&}@Mi!50)hg~W33xwS%fU0*6 zr@V2o-ZP@+j|Earca`pA$$+JkMb^GYBTt~ism|f9BuZ|Be^eG8Lr0gOEOPxBNOt{t zKQR2;(TAEm{J8}zsW zn%V=%Ph`VF((JTAoAYx!7WC+aR^1+86I_)+&{UJgX*J$Hrcu{$W58K|Rx+FEuu@1Q zH@mOS@8OIne{E<$~l5`om0si(B7m8#jc2JPm zb4ljuhIq^2FGohH=nh4P1H4|6(XN!<*d5D}p+C~wq=mS|Bc%ND^Kb#JY;WAJD^pNV z_V5`CyB6v8lMOf&(7+_1QH%tvfp?Zu0{A&gcH=aFZ(vsy45071HmNkcU-v<#6i`m3 zD)OkHXW{vV%*A&xA#4f}2Gz%Oes71vw7R=Ng)CbXdE)e2VvqpCdhE*yo#A`^0&0s4 z)Dugve@MYz<#HtQ0i8^c5UKc`C%^DD_rfS_eo)`?uS6_Uo$dLY=e|Zjv2Fr}V6`Ar zI?x1Q5*(7)GlVaFDw6pg0fn3&(#*d;nlGi978xHkuznP}YxOQ)C2DhTQbN=D1MmIU|{O9OUUi1&L{0yU)91{MHNH<++spe6QiSKDj#pvq=tm}vHc12;t>$8sK0lWR3xp$O*FO!+j@}E zwl=6rvBijD20Lv1pk;(EMN8(@R~a+^v50jqWSz~tiiPSa35F&yT_>&C76TUyq|7+T zB9OqpZ;4^ls&Ed7rANgu2E|}wNcxUBfA->PgxZ8g4WoPPuNZ$_RU~&+eGIk`y-69L}+qG9La>}9lE09C+o-7=N`m!rm zSNc=5>zq0k=yR4TRxkA#eBPd!F$Zcg7*g>Zq4>-~fln<#lgwiTg}KG+iv@*qe|)=z zy89tDlnF@h$)Y6TU`-&SM9rgMppC9eGTRy~fc__zG)e_oCG<)+rw#ICqzMs+vnmIP zOq6FYZ{v2-Ifxq?N=QkrdkG|Q1H7S&W>zYo*c@6r(PNVBT}xB6H|{FCwaP)VJ(%Se zN;}8O3j>jh*Hx!MpL*@*JDTi3e?Ed4@UkCh^x0h@2S*{U3!)$!ZfgYfEiPriYG)HX zvxPi(Oq=ys%BZ!DQs(vU)H(&5gn+1MCjXZ)hyH3l2OJD&1yOb~p2wOj;c3uzxb?Vs z8+v3{=1+KZOU%9e>s5cgJ?(R z{abs!z!}miq7dA%(0X})165v^gD-d+?PrAyYajhEhRL`Cf%PZQLC9UMKMJeiMru9ko!ixbxN9LWSjT1=|@VGj^ z(2uX#dQ_so)YE*dlzh%pDogLNHUw>h%7ks`yAhDj@rrabY{e%>e-|^18mJ$R6}%PW z(TEYZ`!&q6{^lT61sZ)d*6aGR%V55LKAJH&zUOip{mnz*st>itzfwo5N&@(vBP&>w zEv5*lo_<*}XWn!qHoXWiwSRrrdb@%Zap1pXw=A5oLoW&o(XV{6X#K=ylF;44nhbok zBf0VR|3$^ea#08nfB5tr-pID-K&@ADwt!kmvg!bX%J;0>edTGLK+N`SRTQeh934k7 z%{wT>2#*09cTP>|x3C&=5?kl(u9@`Og=2ED=e9NDV{y3f7lCrP*$pKZ(>xklOEDk zqQvrB(Qd&U#kiXfyFG$jHmMlX72lM;k>E4=jDS)yMX@Kw+NPig(JBB7^-M5RWGVnH z*ys~pOv$dqn=Pzz&xlV3;PY8K!qo+fE;aXEm|X!5H(6=Lz`2Q(rQA8!8*}VZ4#N3& znT2Q-YLWcAf1>kRji8LqBUojUmke0@p@1G0viCQR$f5Q3RZtiDbeS0!MjU3WdRE*Yf7$=(ce_;dVxIN+@V)er!xoww@pWi7{qOB+$%Y3z(wG5X-rDef0igt%Hr*p!7&{z$_i@7u{rmylSiN^B_dK zFdH8De~Itbta*i|mmoU}1Vc7Wf{jP;$u$32dYy44zPf+Bl!kBbpa+G(PR6aPnw*;u}-3?D9cSTS{egdk0Vz z7tr&c^a@BdPszb(8F?QEM0aqcXXb48D+O>9e>j6>Wn%|&-(3UJbHCE&RB5Nb7f>op zCogtOG9Q3B7}dfL(mRLjPcy6)eV5f%rM2SWzi>pt*>Jqs5yOH@;E`t&V`6Pyqk^#z6SFRvl!TP zeeyS7RTfMU0#F4kWSGSP+J}DxRwVjN2aL1SL6?i5Q1LX6`Uo|yykf!sM=AH-$)(4W z|5EfuOBa0Y`{BIth49p(3qX?`e{)U#?h+G8ncjPwZDDQZAw;7_rT&rzO3>@Q=zDX|%^44uWC|M0v5SooE(^rsV#nB!-v zK*`%)@4fx$0#b;FQ2eK6Rwh&T% zco$3aK%u1(eqljK?w-SdPkmH#;9gRvgF9I7h^!s*ADi+RhQ@^|bR*6t{>f3DAGPYR z%d7fLLC5`BKH9sie~FrH7oBBnXS#w(4h<&aaBjsat?dvZj4onY9qd&U)|20$L(0~O zh8`MCeCGAP`G+dV%5A4SpSRgAapD}PPAs$kD<(JRx1H#;&dDlz3bRU@`QxFVyB;)N zY3}7f_8+Pnx>}ou{I-D__=O9->{Dv6*W_zKRdTHAS0x=Bf2CQwDO^&A{5Ao%O_}o( zCXMhqSz;3N)pg4;x6gN%@QdM<93Mf`klupsx274< zY`lZdthS*qrF*8}3|}jyIq%%vr&dlUCqV>(go1O-MGpupSJ$q0~>#-$d*2a*kU!@NS z+R=-Hqs*<=^#h+(c4*(v(nGi+oFm7RG-p1v8-}Q)Jsa@NggY=Cq>RhWe~+SX=o?o6Qvztpx)GVQ1!?g zC>-~eelLryS7-)ewvhQQh^Mshl>Zaz^oYLoCQxTdt!XC8> zt*kkX_y4(ZW%=aI^_v%L9V=V{xDc8~|3sNfJgUkZW)AR}3Pq$wS-r-Rq^=9*?^Kx; zP0fq9a@nyCvCCGvuwKr#w8OG4zj*jae}$NWDuXITQ9(lBv{#*4&^9O()TxnyHuMdF zKNSD5ABdLpD|>SOZ4=ZU_0^EeY5uyijv9X*c{5|;E?K*93P1 zrI?P}q~Mt-!lWO$x9Gcn!OQ@FF44&z-aB=78shSla;#$dOB;ev$TN&VARF5ZX810D z5B1W0?O{q0*X70|nDx#rUtiv#$zde|YDHd4(D(7~MtaN9bYk2OuE+=e$r&N_T3ufp zIDy#-Vj+P-tIrd)HGqV+-$O=re;9e?6d#=5FiHhJ<1!(LF(LML!L}rtc0o@6oiiqD zD5bgEw^Z;sO6i-=^dDudP#oC0toBjA2b}7Hx;l}&DNgBy&-0Ms$$l?;6#U4}rm#l3 zgl!j&{%zwwab(zRL3u$_+8SMUpv{`j{ ziSEhYG@Q@W>eaB8*5P*hc-%PcAK#=J#dT!_C)0xGxk6dw89)t)QSay0L#f}2fk4g( zr&MRDuI}mMYJW^)sfWdKLt<7EVMmyh%C)m_SCgdr{=#gbpb+Y}WhwRBlES84-m9c? zBQO0c>EKxV1B-$ga_6F=f7s_5rM~s=gw0ICNe)qg*K>aESfgVz*jFD>?L^WAv+U$4`Dz9u7{%u)5CxIujK-9=Ol) z509yDu_XxaifPp$U;PDb?fLMpE|CiT&JXZTSs=xM*sL#k2rpmef5JZrer07=wQot@ zp{oAme-sU*zeY*FNG%r-CX&jLh7NXDNPDL`2Ig3?c{vn3d{5 z5R!Vvke!w{zae}4xS@O5^8esM2{e7&{P|P(aNG59&o#x8e_4~RfN7}cfunx^RC?Hhni)6=f zWC{N8@FqcBQ&Yx$+AcoZ`NJONe+*5Ha$%{iXCI~f6)j7ncFufQZ*ZT_0l%&)`G z!KRABnJMyTf2@*dKqh3dYbb|U2UIbGDFO7`e-^?J_6s;O=V4fO<%qOl*u(myp8n+> zG^KhC!2CNvbs(MK`DFwY|_E8{v~381nAPGs#>;)}|>*-q`> z<(~{N`?rkc*b}Gix;Ze670I)F7rN$I!&v4kPvd8Vf4_JVA5Wk1y!}&`No=44IfVTn z`8+1#Pqn|PU%u7F9GBaBWvh!T{QBJVg{Lvag4i(bXP{dP(IGS zq3byBnn$W!j1_vFE}$e`Wmq0fuSSZyYoRz4hvM#~xVyU-E6(C>#VPLY?heJRxVy`P z`*V2D_xHZ8$?nc1liWL#1jofZz3_96blLRcc(gd+cj;ZM1oQRN*Qjh1)v0zBQB3+n z_J)HQR@pgVW;`S2#z{@$Dyj0fd}(HkykD_K&IsokHZ(*@LE_M9e9UQMY?L^9zI)N( zTX!Co)&k4hH{*s$J}iEJ#%_zLkW zJBBwDxbloS9Lcusz0(ZOt}DI2(V<)MDfxE*R|QQxDQaX&l8rRT;Ei=earGVS{WqV3 zl>Lun(i0rLU&u}aeHAO_>Dm$=`24BOWi2RKVn|;Ya;b&U20=a`oqt4_wR1_G`Uw;J zl)mvkam}Q8A_I~%IT+2P`*IGKJn$_K=ebf2fb$}m&a+RswjBr!c+9XYO|UqWn|ZV; zYsfMj61r@InPFwr9$XUxW8c`c$qUXW!~H{8==SUBhOmNudMjm4)DS9yktcPhJk&gm zT{!Hx93Vku5~oS*_VnfKkrU8(Qy(xI(M(*0y6leb-P!~6^eNhoV7)fNM-(28(KLQ) z%JqBy%57w%M%Er1WaJwR0@3w_l*Tt4u%-H*-4kKgnblpEZGw|*dl2wm$Qi$wUxnwpZJQu;yS!i4>JR(Kg<&9ggonCQ7TI7I zn)jd~O@v?|*n}s#QwW_u0CI6i-4B3Fc%wT-z5WBx3WAjR0Puv5x>NjbJ^)|inkwRr*>3hqO$kZ@0TO1m@MLUXk^l-0*56yfXclur#Gz)cVomrx4Z z02DVup7H8dl`%<@NVClVRFyCq7z}|VeA^wzPHDUtJZaxd3j+=PA&f+LySrK01^y3Y z^Qa_rkRS|%lyFOTvu6W*4rKF92z2oW!XiA?-8^>tA0jji9ruC!_nyr#90(ty?BPE7 zd>~lDXWh-zuKytsQlC5oQ6RnuZ+7$Abq>@|d{S>l5BY>I44mn~`K=8sbL2Lo^9D6# z95VXD0&~v(pkk8vH`;_M8HrxTRBd9n*fzPU3!`^dIbhA^)2=uPQ zUq{Pfxb;J*g6Ap8c`6HZmttYt`i3NAUwd@!7|F%EI~RH3e!uOEdsZ`c85*;4o}{;^ z1LD6u>S-lGiaz@mzRg{7df>C9iY{N%`?x1IA~_=y0_WDUz=~s ztuhWI^WNJ5Pn+v*;7lP>$Mwq1TfUbDgwqM$qc_rniu&8TnW<`UkB5S-`(PnZ<9l2W zMl}F3-6g^5C~~A%1KKZvzptK3FDsps-MeD6ABX9<)++RU=4WrDHe46j@2zE+w0FaO zQ@XF$b8Yk!TF%hAy-o}2Y0lrPT#q`kCp#U+9KSWYm(QWDmViYJ8U)@!ua{G8hEvQb zw+5b%4b>s`z-W~T7;$mK^EDu!ndd(3co-lB-%+gaIZtlf^)$KNFI``!<>Pk5DOAsc z_oZcgxsR`rd;xI!-2T&Jwc?R~Z055mQ!0PvcGTShB)`{GV5(#Gm-y6K`K9tJ$>z-h5=<%ZU{xN~uWddAl4|i%)-m=B? z8{K0gMB~KI=YM>%Uw3>VqXUN#fuPsf!=MCGf~RLs;Hlq=w3GKb;5Weg5a^xFXz}`Z zOMm(HG@Va^T|a6NZzJS09Pse|-iz9O%kxs2ACnD!v-+rtDEJTt$O%}7_Ny>HF#dxp zyzn%;47^NzJ!)sReV=reIgA3fTVq2vJ=QcB>jhU$^IR7;;O;hox9(jaO{}PkS_rjhl92x-fJVF8G8+YL^Xb;1;SiMDz3CEdWZ78W zy5Y8XbAL2fxA)4-xpD|pRO+XJFUGf}Z9qfC4$c?vM6w+(sJroU8*r_cLho~jaHwxa zfm&A`Kv&y5tjwj^=&jALFQ~7AtKQlE<#DQ<=?~vQ;ko{+o6W`5=EKWm$4)z6$hl}j zx^B(S<`KNNhU;yxDf8z0+|pFYCa_(cEm-?r5hx|_+>`6p1r6X4&SgDrx7C04uR10g zZ#C-+1dsXzICwe4MuR;s_3jCvea}wu%OBo;Ely0eojmWRSju>eeYAAAUx*ndKwG=H zTfYIbTSl{x1Kd()@pyJ%Y+MVkUVdJ0Bb2f21^sy5GKV!0Hey`F+WCI)R5 z1AFEAFSo5?BtTlj3QxLsVP!LDqWt{V-!nmtZqA)av1a0LPoeV`R2PC4z}?1!{-3v= zQX&Np%k=Q{Y95;tIU8`zMMY*&RrfGmJ*vmWfxu;(*G9syzhJkA*Pvj^o6*Sw+-B{+ zRG*{8<~Nr`ZLn_3J50H(7bewnhPa0Jb`UGx3&NPen_x;*KftAa+-eG>u!yPw^4(Hd%hlgdO5sy4K z=8fG=EZp^%ndgUWHk)y>h_>rUK*#D(4l|JCQl{H`CqEMP^*Ab@^XZ%OM6-^4=VRQ> z-&BD^1ub6lvt8)wmx%x$RF>+@+N%K%xAl%wfMoCRbe`E^eV_XIIDyEP=cQfh%&MK( z2^`suI_gs%-6qg^u-k0g_PlkezhR2xGmmodd=*XiqWdb79lDUtVc2OS=*8SA-ECuD zRRj8rHj~7;vOB53zPxCFMPJi+uj#Tp0>`X>cPobWvYy&JMEWw$R6a9|+Hpp79S+L= zXgKV1aX=~+-(K}>wCJYM^O@S`Kcf)Fm?`6E}Vm@1nDfN0+Xi>-{_;O*{ zp_+8zr52n3{%?bps;7yaX#U7S-Gc)Tgqn^i*h%<2HddBt490!t-1hXQfR>B?1)dRu zXI-Z=l`8{-Oz=P-1=w@FfS_1z^{@vI0B^&&#Ry$aP08B%+&CmuyIVSuyWQc03K@TR zlBMn!raz#;azM`a=3Y{vx_i`I${RGwcWCfF-JI_5{+^)8`)ae#z$On3}6EMwO0P z-fu#ae3kbmUhAA{h!kuCKqM9dTqmQBp#@;4-okXj>4(il*$npAy0tq-2WH-_Gn1i8 zVB$e4+f(7i`?0qX?eqI66_KvvgnF~Q?_0%~le2?;>q+>Wpzj&b7z^lL?ozSiR=@TC z-klV5RX2YD>lh6uba}e0-e@dYg!07*xTlD;BYPXaq#W3ScRdZ5(khrdOU{c59Xg*c zEZ&Coer^tjCu#6ny~{tVqgC-f$8G`u;h67ZiDk`eMI$pe_~yW2>hVa{d0j7b!oJh0 z*d%s2YP0op+!fgTYsW6h^9=b`l60TV3a)l87U=GuD7JrnK6E>Cd4M@PTNQkCPp=LE zGyF^X&zDRlipG91OS1 zzs}_wWVM9W4u6%|9u^YnxGj3<<~i^55#o2a+dj0fKL_S-{VKutTYST^UZ(d$Vw{A} zL;u2Qe96`6u;jbm?uZT!7J1IkH+`J@UEfGkn-5e@E4@aJiQbAfw~_?;?@Dp1AMN|| zahV93k4kvTr-1j5!((3)*fnr_GaQK!hu4|IBEfB6V(V)e(LWC&A8!zi!{+@tLbJjO zxTu$TA8=@6Y@fT**<7>TX|R(dnXhwi{N2xwK4|-8hCzxd7=m8X*NY+vk%^noF&^^_a+FM(^hr35{asOS!Df z&b^{Vc~9GDxum<7jho3?uI%;atKDG${8H$w;B9r3@LckAqcOGV`4<7u<+k~!S5E4B zHFMQZ#$|@^HumaTEqJz#C*&@4Gan#bZTB{XB(!vufXBtN-I!V2)xCUoYUecfYZ3eu zWaQv|ce}pqp%L?BJn2yJ-ks4gqush%ybiiuQMmB4*Y#d}(EvUY=ibn&9<713R~7a3 z9oAo)O%Ctgd9~M>avD>lEl+{z4EQ%!XmbbMTxR_~@6TIB2Cr}JZotZO(&i-#xYezz z?NRM@NkS;wl`s8ai~`Jkt+4w3qIY)&osn&k?Q@9RKWRx)dyGZX{m~)==(N)h29tOl z+JEIaK4;u~d#^m#zF)ZwssyU_USn6QTAp^?LQo|w-oKq()43V&x!miA>p7uyca5x9 z3)DYG;w;^#0G?ATvEaj}!H1Ykp{=*_MfL+Q)&*#w2#v%x12~LtWLkSpmZ|R8$rs=f z+6|d1uI3=o<2@a_?A^anSbI%jJgn^OFTBy`G2dSV3!Vr5D`UQY0bUCb&}^@7e85>8 z?>aX3rxe*Mb`L4)uUE@Sp+b#wYuhHFuNFgRa_U(v%jbM(?^&|xpvSlF7x#6zd-t;{ zqL>^SgP+?^fhrcXX*3sJ55J|+z&`K!cpWXHuGMFpMx*USpWRQ>%A-8qirL*pqa4<) z_smQVD_c(PsAPiH9ortWKk! ztBjY8vMW{tItsGg&mUI)lFik|QYPs^;@8hZAajZ+aT`Wwkj(5=?(S^0cV9y+`2UBSL))``Z090dQ*V zH$Pb6A@iN*sa$?`-f2`&&_5p9oz!wHZ0;63JzbDN&3$Ml@p+M|KL2+18@y`x${|+e zeKZFrbjf~vaH`+(Qi5W@#pTsuW^_~Wt^x*lw&It)G9I2rvzdLKJMDa5zq%bqBX#*1 z2ywksXgO5>=0CaU7xeknw}!^GVO}0<|Ma$|maP=)X*MtgZgCmV|FEFV9h4Vjo%5-B zRKljY<5eNg`~1)M^Cgfj$acG6WRJ6LS8#n3f=WPykPDN=E$O~jy}L| z*&*9S?7Hm+>^o%r#JKR@=OOS=-D)@_wz~1yry-VTC8Ln(bB;s*xnnq7;dS$u&v>K| zk?SUiPk_z#O3f}C`PDS@l*H$8Nw2Bp>~BAH1+X|SA~kNJu`xUKKBalPn+XT_jGuy^ zkKRBlM?PJTXX}ks{Jx>Xn;pAJb3kzoM(oDTj03Y~oqK;SQ8Uwq@pb-c<;zJ3jWSG|oykV0tx1)A{`CG~8mnsh7~p)_r_p$_(Ifo?K=YIeDDm;d@>{qkH zJ9V$QWy=(h999?q>-3C{T`|y*{Vcl)+1=qfKEsDf+B($IOrzlYGG^h>eYGL?uxc_R zMAFv!=0RV`YqQZS^z6h3oc4RIEaNGl*}lI%5S40pd+b@`tv4O}Hj~!hgm7Kd40f&R zH-YHN*EoI4*AGbE$8XP{CwPDDah@9(xI8h!UDjOo(KLCpJKz1$+2kqqDNMTrZ-*nD zS?KeF2H)FBfOqEA4q#o1*?<$2@U)mv9YcCc&Ij+E=q*enaJdJtQZ^24eSYw{bc;N$ zM`PlBy0z)9nQ5x0$$0sfd~nvTuIV`5lQ8$d$9L&A8+Li$4vr2Uu6zeM#0VH|jiX%n zzP$VnC-bUqepe~By@-l!X*{%Ate*o-&%0w&)%8dEEIwdn^|nW`SJ#uHezcDF+9`$2vhx-tu9(+*5FDrX z;Q-JGhCn_o(b!z_xO#53TYNZQMmJ@PY+kkPzDWS|9vV2@o-NOIkuz>VR2paON26TD zq|W0~6hj6+XMZ`k@LwlR-f$n}41C8&&$ zPMeAAce%>(t;*%10}y*UG3e{rW}>rGWk+c%9WY$q`pNcW)3iuujsPTTP;nG8GC&X0 zAQ#syA|V`7PuxshlM$v2p$Z4#0|8}{Gb?M!K9i72yE{<5zgqd-k!NFJ<16_avzC+F z1)g(vP{L$bJN?GxfGqFkg)i0R;o9vl4T{LHS zgvwORY%trLH(?~QC5TEVibj)fio1d_%}{F$H``|a>C;#z^QBI*9anISe~FgJgt#2} z_p(MJD_F`>8~Y6Ru>DZ3w94ZOVJ9$kG2o}`f33>YVg@s2Z=M#;&y_o^+#i85x7R(F z>)27v&;?KbE`W&m<5KeU+J1C^bWF@CZIPg#|;41egO^OzF$ro0_BOSsX# zRFjx4h)HoouV*N+o>6Bh-Uirh%u_o3qzxBX-0dQttS<2pAnm zg8MT|U>QN!7}?+nC3o!ELWiY6V!6$vET&hWdYQLNQt9f6rDFZiTmG68F}(z`RVPxXYId%?xd$zJP$Ri*w+3I`iR=3l6Eb3EGrCVO4ai3N7n zk7jt`U_SEQ7=sIC22tZ#*}h#94(qfVP9s|?SANU>6+^%I**fhajQ=jjpdH|a2gVSg zb<$c+)-kl>>e*y2XJh`d%^;~aHIRyyClpz``TZ*>Q`K=!9!R=Gt8@nZ{=Vh@D;HXG zSiWn}qOS4;g6{o8FbajNHJ|ai&}~B~rIi-*RnuCo*K<-l7!?26``sPGUh3?W#Y%8j zo!X;&aZ8Ou=e`l4-2Kf-oC6Lh2Z;Y{8B=G++vBveI`%g8g)pSE4E`h04yQ`pZ{X9K z`;8TzYLF35H%WudDYs3(_>F1T+%LZ7#DucRK8(_T5jeN1^>?`>xOHG-V=!xy{a)LY z1Cn`w803=)`)uB{&ic8Q^vGN~JLIaOgAGRa= zpzmdn&NN1|7!~RdRvCcNT*kAe4@;A}N@o1t;iFP6S&wMW*A1H;XerQr$39DK**3x? z+vn}H1Rt98J`5WYdIx~l&bSzFIp;omrT*#^?%Qd><0p1I7-++`%88L+^sP;iT8jF)dZ-@3in>;W zWRumwt2%e&Eb_}km!Y(y0?pH)7zg;ZVx8hdzkfjK9u^}j?;cQ(nRF2;2T#kX4q=F! zuL_Cl|0ylRJ}n{!fdc=8cN#v0y%7MRW^en{EV9<6bqseL=P*oB{+v5QzkSn^5{7+> zBbZ6XoN8Os!F^z~TE!LfQ(0=KM3ecP{Nt?Q@HXh>H!az(e6u!|+Q7MmtjRD=*`+iW z9b;0dtOP1Vfi_@QenuFE!Z6}QEv00;1-9rUq*O#bouVgxjHNc|98-HKbYWwBkAR7@ zJ6zUM7n3yo`~K=cDt6z3Ve$yPA&SWy%+M$~@^COqMi2{P-)jqOpRpu92!nI2Uy1y* z!0Ccq4kEg_DZ;KZb*WDFb&FYlKzC`Vh{q1fPckowU`Jsaa^LQ`QT(I}- znwGC9qR0F+I>4cb&yF|`5v*HPKAW5%|99T{$69uVVxXBbM4f<#Btw^M7Jin!*%*mQ z$#dQ};>8}#ar`;&sLzQBNUm;;B)o01g@ZIfi00CA<=$wpvc~i}V_ppZwIY$C|oE^Ai-3;0gt}Cwbqpg{Fp-A<}+`4jV*fJrc7` z<*$-2{zRFfnip+B?Nkegv+8flRLfBsQ?+&06*_~{rWju~uUQe_!aYr;UfW5m8;bWW z4@;b0-pK&*7-`?4g+W`4w_)u^Xhc6Wj0kD;ep&-Q8YM=*E*tCC7-i)V2HS^|d_xe! zJO*yzsW@g)`hF&QNv&awaUmRWCVy{d2uM}iAL?DDef&OFyjP*KR`zQI@#|O?j`%l3 zdiaySh?u&K>3xnIH35`4?jcQ0A8kEc(^th{YHN==b=!PRv*QcqlN7gGNYd4NoZ2jv z&~rjikmY%(IfuVaV;5Mr6{hZx>Zsv}%|if9r*iig#DWq|l=vOPY7yf!hjUfL_7TLT z{NEWIf=El=qk?t`Tgr&4$QeVVg@=)G^Xt;E>I0h76!uh-@hvLILB>Vw*AR3%NauJI zlZG&AN@*>ylg2}7gn~sbaLoSDt!ZdBx&xmM5u3C#!}-m4!gYBy*hlav4hG^WFb@Dk zN0jlws8)1HieWa7R8>t-h`1wEU?ZzHD-^QCj{b*2_ZY)!_H>@9$v*5t86ZsRmQC%y z4qOP(b1JPHJsFD=R%I1p#@KveG%tWz8$(Z#K^5;HU}D;dtandur(>aFrqKWUg7JVSAY4CocOWRDgK{L||ljNBaKRx%8Xvgf6+=pQv;O4I(^zihtiQ?xlQv%{7^+6-c=?rh3;nLgdUq%?fU-c3nSM2{ z{WVU3TMO)xF>JcNlXu*<@s7)s0FrajDZySt(?O(^`gKVICnBw6 z4H@H#sdku+AESBA3_1)pd0l;LfcZ4L6FMn{z~{A_@(UIbRwz^(CHaaEJ=)rVAwK>I zpX~&q=6a&b;`n^2DW(j>W-*)E=_*9AP+-s~&8CW{AdDNj52`n${=Ptq;s1{H-3Bj? z9v>0M8FgL!-HB-K>pz948Wk&SH+Z2c$o5ntjh&FhZARm5>R3rky5d2rJBWj_udk{; z8iM8rd;Sh`#EMa=bLC#2Lw5;NBVn9pxN}0t>Ki)<*KoPYW7(w zs5$S+;sh!#HlFMz{?>Yj^nGi~ld0z;>%@IjS?e-ozEi9Xk07T+UAWJ+i;Xu}pOcY3 zt?4NXyYuAu@e&*+=lh-PiC^ADsoxzV4$lii=5BcdisdRbyrVb;tZbzUKVUkQMA?21 z-g&*1kj52okN(>QhVPdC3?jE|ecEt~pbMCkJEmjk zBG%}mnaALW7hn~Y3+Ha4i>|dx6K3QFQhp&ontdh~OCpZKrNX(`Y2louk(|y&EbRGk zRKj@7M?ZhU3US8C7JTv@IK<=7+Zfu^*}y9RZD0s<9cAO^hEnX?yf~s94I+1L>H1da zILMQXyfhvF1*2-pvGQf^)CNRgEQ-nR1>SZ-RsQv?uZOTZAs?40-e@5o*lBfJ zrFSS)$UPmCm^LuKJGDpvL#m}qg_sDRcC=6YD1(&h#y>1=?F6>@yNw;y7k^&b@=rgB z%Vm3cT7Q)WgTpaweo$h$eN1p;YAx=S5Zn_$t~80bHiZoml{PC@T`5U}jKHv^ji-+$ zU4+p2$lKAP2%kvSA(qvi!bUXvk<4m}PwuMtw1VYp97I%gG5tBlriW3#CD-qTKz|QM zj4E@@*cj7UzKl;?A&Q&g$2Tj@j~L^>#Y7i?Yiz9 zEg(#!@Zy`n3xGGv3Fv<%VS>gn22kKD6=BPqb%|@Vvqps(iBu&haK)Z}s0h0ngM>%O za8J8r9Y+{>$VXK%4IWj{Q*pSf3YLCr{%W?AT)ON1W1x#1S8zcEPAMiBtKn0Y$BZ_w zP_b6nwkMA-($`Jd&wa+bg!inEh2A8ElS&?ZSEqg}J<@UA{BU0P+^Y837{! z0s;ppG(By{EODfu)!L=>wN_nFKD>@p(NcNN@!b1($0uX_@PRq!GbGtu5JMxB|O}7gM%l#3!G>{tR2+k@%3O zTvnv#W7+2OM_dCwq7&75VBe)uQVm}2yP6DikY=(ydO;a7845Wo1#R2NH*r7p2Xal8 zFV(15Sz0OVKM#ALR6ExF(j44A>Im=tepHf(wIcn(l7Bi=qZVdkSZ==*(SYU$X~Ch2 zsN)le@KDmPfz`_C%2AVt7>#7~4Z#pQ=*bZ!XfUeAuY~ZAQ!8!0Auyj<75y58r4lFJ zulk`YrS7bSL2Er7PzZxjaXIcba(c{_h< zCMSnNF~!^LNbU}N0U$9x*^B5x2eO*5Y?Z<`f&z*Y`G# zRm}WbE}!M1HzU|m#p9&roYL=z;k5UiV12T#t2oK$2M5PwFw>YX>^;3{ir$-S~3m~eJ4qa z*8IWqc?mVkI0^p?V^vag@;}2MWs;BiwsRHJDM;C9R{!^QMzHb=)EYmXm(ItwKy

* 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≀Ok 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 K2bEa>_zVEANpz|J From 77b7bfd463bf57d38cb6aa30f277cd19ffbb6504 Mon Sep 17 00:00:00 2001 From: James Lopez Date: Thu, 29 Sep 2016 13:15:18 +0200 Subject: [PATCH 105/174] Fix import/export labels to cope with project and group labels. Added relevant specs. --- doc/user/project/settings/import_export.md | 3 +- lib/gitlab/import_export.rb | 2 +- lib/gitlab/import_export/import_export.yml | 2 +- .../import_export/project_tree_restorer.rb | 7 ++++- lib/gitlab/import_export/relation_factory.rb | 20 +++++++++++-- spec/lib/gitlab/import_export/project.json | 27 +++++++++++++++-- .../project_tree_restorer_spec.rb | 29 ++++++++++++++++++- .../import_export/project_tree_saver_spec.rb | 16 ++++++++-- 8 files changed, 94 insertions(+), 12 deletions(-) diff --git a/doc/user/project/settings/import_export.md b/doc/user/project/settings/import_export.md index 65ed9fae4ec..dfc762fe1d3 100644 --- a/doc/user/project/settings/import_export.md +++ b/doc/user/project/settings/import_export.md @@ -22,7 +22,8 @@ with all their related data and be moved into a new GitLab instance. | GitLab version | Import/Export version | | -------- | -------- | -| 8.12.0 to current | 0.1.4 | +| 8.13.0 to current | 0.1.5 | +| 8.12.0 | 0.1.4 | | 8.10.3 | 0.1.3 | | 8.10.0 | 0.1.2 | | 8.9.5 | 0.1.1 | diff --git a/lib/gitlab/import_export.rb b/lib/gitlab/import_export.rb index 181e288a014..eb667a85b78 100644 --- a/lib/gitlab/import_export.rb +++ b/lib/gitlab/import_export.rb @@ -3,7 +3,7 @@ module Gitlab extend self # For every version update, the version history in import_export.md has to be kept up to date. - VERSION = '0.1.4' + VERSION = '0.1.5' FILENAME_LIMIT = 50 def export_path(relative_path:) diff --git a/lib/gitlab/import_export/import_export.yml b/lib/gitlab/import_export/import_export.yml index 59abca04b35..8882f146632 100644 --- a/lib/gitlab/import_export/import_export.yml +++ b/lib/gitlab/import_export/import_export.yml @@ -71,7 +71,7 @@ excluded_attributes: - :awardable_id methods: - project_labels: + labels: - :type label: - :type diff --git a/lib/gitlab/import_export/project_tree_restorer.rb b/lib/gitlab/import_export/project_tree_restorer.rb index 5a109f24f9f..accac5325f8 100644 --- a/lib/gitlab/import_export/project_tree_restorer.rb +++ b/lib/gitlab/import_export/project_tree_restorer.rb @@ -110,7 +110,7 @@ module Gitlab def create_relation(relation, relation_hash_list) relation_array = [relation_hash_list].flatten.map do |relation_hash| Gitlab::ImportExport::RelationFactory.create(relation_sym: relation.to_sym, - relation_hash: relation_hash, + relation_hash: parsed_relation_hash(relation_hash), members_mapper: members_mapper, user: @user, project_id: restored_project.id) @@ -118,6 +118,11 @@ module Gitlab relation_hash_list.is_a?(Array) ? relation_array : relation_array.first end + + def parsed_relation_hash(relation_hash) + group_id = restored_project.group ? restored_project.group.id : nil + relation_hash.merge!('group_id' => group_id, 'project_id' => restored_project.id) + end end end end diff --git a/lib/gitlab/import_export/relation_factory.rb b/lib/gitlab/import_export/relation_factory.rb index 5a84bc97226..8bc4ab85c18 100644 --- a/lib/gitlab/import_export/relation_factory.rb +++ b/lib/gitlab/import_export/relation_factory.rb @@ -10,7 +10,8 @@ module Gitlab hooks: 'ProjectHook', merge_access_levels: 'ProtectedBranch::MergeAccessLevel', push_access_levels: 'ProtectedBranch::PushAccessLevel', - labels: :project_labels }.freeze + labels: :project_labels, + label: :project_label }.freeze USER_REFERENCES = %w[author_id assignee_id updated_by_id user_id].freeze @@ -20,7 +21,7 @@ module Gitlab IMPORTED_OBJECT_MAX_RETRIES = 5.freeze - EXISTING_OBJECT_CHECK = %i[milestone milestones label labels project_label project_labels].freeze + EXISTING_OBJECT_CHECK = %i[milestone milestones label labels project_label project_labels project_label group_label].freeze FINDER_ATTRIBUTES = %w[title project_id].freeze @@ -57,6 +58,8 @@ module Gitlab update_user_references update_project_references + + handle_group_label if group_label? reset_ci_tokens if @relation_name == 'Ci::Trigger' @relation_hash['data'].deep_symbolize_keys! if @relation_name == :events && @relation_hash['data'] set_st_diffs if @relation_name == :merge_request_diff @@ -124,6 +127,19 @@ module Gitlab @relation_hash['target_project_id'] && @relation_hash['target_project_id'] == @relation_hash['source_project_id'] end + def group_label? + @relation_hash['type'] == 'GroupLabel' + end + + def handle_group_label + # If there's no group, move the label to a project label + if @relation_hash['group_id'] + @relation_name = :group_label + else + @relation_hash['type'] = 'ProjectLabel' + end + end + def reset_ci_tokens return unless Gitlab::ImportExport.reset_tokens? diff --git a/spec/lib/gitlab/import_export/project.json b/spec/lib/gitlab/import_export/project.json index 98323fe6be4..bf9dc279f7d 100644 --- a/spec/lib/gitlab/import_export/project.json +++ b/spec/lib/gitlab/import_export/project.json @@ -64,7 +64,29 @@ "updated_at": "2016-07-22T08:55:44.161Z", "template": false, "description": "", - "priority": null + "priority": null, + "type": "ProjectLabel" + } + }, + { + "id": 3, + "label_id": 3, + "target_id": 40, + "target_type": "Issue", + "created_at": "2016-07-22T08:57:02.841Z", + "updated_at": "2016-07-22T08:57:02.841Z", + "label": { + "id": 3, + "title": "test3", + "color": "#428bca", + "group_id": 8, + "created_at": "2016-07-22T08:55:44.161Z", + "updated_at": "2016-07-22T08:55:44.161Z", + "template": false, + "description": "", + "priority": null, + "project_id": null, + "type": "GroupLabel" } } ], @@ -536,7 +558,8 @@ "updated_at": "2016-07-22T08:55:44.161Z", "template": false, "description": "", - "priority": null + "priority": null, + "type": "ProjectLabel" } } ], diff --git a/spec/lib/gitlab/import_export/project_tree_restorer_spec.rb b/spec/lib/gitlab/import_export/project_tree_restorer_spec.rb index 7582a732cdf..365d08940ba 100644 --- a/spec/lib/gitlab/import_export/project_tree_restorer_spec.rb +++ b/spec/lib/gitlab/import_export/project_tree_restorer_spec.rb @@ -32,7 +32,7 @@ describe Gitlab::ImportExport::ProjectTreeRestorer, services: true do it 'has the same label associated to two issues' do restored_project_json - expect(Label.first.issues.count).to eq(2) + expect(ProjectLabel.find_by_title('test2').issues.count).to eq(2) end it 'has milestones associated to two separate issues' do @@ -107,6 +107,33 @@ describe Gitlab::ImportExport::ProjectTreeRestorer, services: true do expect(Label.first.label_links.first.target).not_to be_nil end + it 'has project labels' do + restored_project_json + + expect(ProjectLabel.count).to eq(2) + end + + it 'has no group labels' do + restored_project_json + + expect(GroupLabel.count).to eq(0) + end + + context 'with group' do + let!(:project) { create(:empty_project, + name: 'project', + path: 'project', + builds_access_level: ProjectFeature::DISABLED, + issues_access_level: ProjectFeature::DISABLED, + group: create(:group)) } + + it 'has group labels' do + restored_project_json + + expect(GroupLabel.count).to eq(1) + end + end + it 'has a project feature' do restored_project_json diff --git a/spec/lib/gitlab/import_export/project_tree_saver_spec.rb b/spec/lib/gitlab/import_export/project_tree_saver_spec.rb index cf8f2200c57..9a8ba61559b 100644 --- a/spec/lib/gitlab/import_export/project_tree_saver_spec.rb +++ b/spec/lib/gitlab/import_export/project_tree_saver_spec.rb @@ -111,6 +111,12 @@ describe Gitlab::ImportExport::ProjectTreeSaver, services: true do expect(saved_project_json['issues'].first['label_links'].first['label']).not_to be_empty end + it 'has project and group labels' do + label_types = saved_project_json['issues'].first['label_links'].map { |link| link['label']['type']} + + expect(label_types).to match(['ProjectLabel', 'GroupLabel']) + end + it 'saves the correct service type' do expect(saved_project_json['services'].first['type']).to eq('CustomIssueTrackerService') end @@ -135,15 +141,19 @@ describe Gitlab::ImportExport::ProjectTreeSaver, services: true do issue = create(:issue, assignee: user) snippet = create(:project_snippet) release = create(:release) + group = create(:group) project = create(:project, :public, issues: [issue], snippets: [snippet], - releases: [release] + releases: [release], + group: group ) - label = create(:label, project: project) - create(:label_link, label: label, target: issue) + project_label = create(:label, project: project) + group_label = create(:group_label, group: group) + create(:label_link, label: project_label, target: issue) + create(:label_link, label: group_label, target: issue) milestone = create(:milestone, project: project) merge_request = create(:merge_request, source_project: project, milestone: milestone) commit_status = create(:commit_status, project: project) From 723e576782aefa339a4db8916908c7ebe5a92f48 Mon Sep 17 00:00:00 2001 From: James Lopez Date: Thu, 29 Sep 2016 15:06:10 +0200 Subject: [PATCH 106/174] fix rubocop warning --- spec/lib/gitlab/import_export/project_tree_restorer_spec.rb | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/spec/lib/gitlab/import_export/project_tree_restorer_spec.rb b/spec/lib/gitlab/import_export/project_tree_restorer_spec.rb index 365d08940ba..6312b990a66 100644 --- a/spec/lib/gitlab/import_export/project_tree_restorer_spec.rb +++ b/spec/lib/gitlab/import_export/project_tree_restorer_spec.rb @@ -120,12 +120,14 @@ describe Gitlab::ImportExport::ProjectTreeRestorer, services: true do end context 'with group' do - let!(:project) { create(:empty_project, + let!(:project) do + create(:empty_project, name: 'project', path: 'project', builds_access_level: ProjectFeature::DISABLED, issues_access_level: ProjectFeature::DISABLED, - group: create(:group)) } + group: create(:group)) + end it 'has group labels' do restored_project_json From 3db2261005c438faad8bf4a339d46eb7798f05b5 Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Thu, 29 Sep 2016 15:50:14 -0300 Subject: [PATCH 107/174] Reuse LabelsFinder on Banzai::Filter::LabelReferenceFilter --- app/finders/issuable_finder.rb | 5 ++- app/finders/labels_finder.rb | 38 ++++++++++++++++++--- app/models/project.rb | 4 +++ lib/banzai/filter/label_reference_filter.rb | 12 +++---- 4 files changed, 44 insertions(+), 15 deletions(-) diff --git a/app/finders/issuable_finder.rb b/app/finders/issuable_finder.rb index 6f2adf47c3a..41ea8f801c1 100644 --- a/app/finders/issuable_finder.rb +++ b/app/finders/issuable_finder.rb @@ -128,8 +128,7 @@ class IssuableFinder @labels = Label.where(title: label_names) if projects - label_ids = LabelsFinder.new(current_user, project_id: projects).execute.select(:id) - @labels = @labels.where(labels: { id: label_ids }) + @labels = LabelsFinder.new(current_user, project_ids: projects, title: label_names).execute end else @labels = Label.none @@ -277,7 +276,7 @@ class IssuableFinder items = items.with_label(label_names, params[:sort]) if projects - label_ids = LabelsFinder.new(current_user, project_id: projects).execute.select(:id) + label_ids = LabelsFinder.new(current_user, project_ids: projects).execute.select(:id) items = items.where(labels: { id: label_ids }) end end diff --git a/app/finders/labels_finder.rb b/app/finders/labels_finder.rb index b8828bcdd32..28110be7097 100644 --- a/app/finders/labels_finder.rb +++ b/app/finders/labels_finder.rb @@ -16,8 +16,16 @@ class LabelsFinder < UnionFinder def label_ids label_ids = [] - label_ids << Label.where(group_id: projects.joins(:namespace).where(namespaces: { type: 'Group' }).select(:namespace_id)).select(:id) - label_ids << Label.where(project_id: projects.select(:id)).select(:id) + + if project + label_ids << project.group.labels if project.group.present? + label_ids << project.labels + else + label_ids << Label.where(group_id: projects.group_ids) + label_ids << Label.where(project_id: projects.select(:id)) + end + + label_ids end def sort(items) @@ -37,18 +45,38 @@ class LabelsFinder < UnionFinder params[:project_id].presence end + def project_ids + params[:project_ids].presence + end + def title params[:title].presence end + def project + return @project if defined?(@project) + + if project_id + @project = available_projects.find(project_id) rescue nil + else + @project = nil + end + + @project + end + def projects return @projects if defined?(@projects) - @projects = ProjectsFinder.new.execute(current_user) - @projects = @projects.joins(:namespace).where(namespaces: { id: group_id, type: 'Group' }) if group_id - @projects = @projects.where(id: project_id) if project_id + @projects = available_projects + @projects = @projects.in_namespace(group_id) if group_id + @projects = @projects.where(id: project_ids) if project_ids @projects = @projects.reorder(nil) @projects end + + def available_projects + @available_projects ||= ProjectsFinder.new.execute(current_user) + end end diff --git a/app/models/project.rb b/app/models/project.rb index 41125223044..a04817987b4 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -388,6 +388,10 @@ class Project < ActiveRecord::Base Project.count end end + + def group_ids + joins(:namespace).where(namespaces: { type: 'Group' }).pluck(:namespace_id) + end end def lfs_enabled? diff --git a/lib/banzai/filter/label_reference_filter.rb b/lib/banzai/filter/label_reference_filter.rb index 649c697b415..2ce33aa1d15 100644 --- a/lib/banzai/filter/label_reference_filter.rb +++ b/lib/banzai/filter/label_reference_filter.rb @@ -39,13 +39,7 @@ module Banzai end def find_labels(project) - label_ids = [] - label_ids << project.group.labels.select(:id) if project.group.present? - label_ids << project.labels.select(:id) - - union = Gitlab::SQL::Union.new(label_ids) - - object_class.where("labels.id IN (#{union.to_sql})") + LabelsFinder.new(user, project_id: project.id).execute end # Parameters to pass to `Label.find_by` based on the given arguments @@ -91,6 +85,10 @@ module Banzai object.is_a?(ProjectLabel) && object.project == project end + def user + context[:current_user] || context[:author] + end + def project context[:project] end From 7e11ca86fdb23c967c25b19735770f99f936b32c Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Mon, 3 Oct 2016 18:41:46 -0300 Subject: [PATCH 108/174] Reuse LabelsFinder on Issueable#add_labels_by_names --- app/models/concerns/issuable.rb | 12 +++--------- lib/api/merge_requests.rb | 4 ++-- lib/gitlab/fogbugz_import/importer.rb | 2 +- lib/gitlab/google_code_import/importer.rb | 2 +- spec/lib/gitlab/google_code_import/importer_spec.rb | 7 ++++--- 5 files changed, 11 insertions(+), 16 deletions(-) diff --git a/app/models/concerns/issuable.rb b/app/models/concerns/issuable.rb index 1647d693a9d..fee68d9cc8f 100644 --- a/app/models/concerns/issuable.rb +++ b/app/models/concerns/issuable.rb @@ -234,19 +234,13 @@ module Issuable labels.delete_all end - def add_labels_by_names(label_names) - label_ids = [] - label_ids << project.group.labels.select(:id) if project.group.present? - label_ids << project.labels.select(:id) - - union = Gitlab::SQL::Union.new(label_ids) - - available_labels = Label.where("labels.id IN (#{union.to_sql})") + def add_labels_by_names(label_names, current_user) + available_labels = LabelsFinder.new(current_user, project_id: project.id).execute label_names.each do |label_name| title = label_name.strip label = available_labels.find_by(title: title) - label = project.labels.build(title: title, color: Label::DEFAULT_COLOR) if label.nil? + label ||= project.labels.build(title: title, color: Label::DEFAULT_COLOR) self.labels << label end diff --git a/lib/api/merge_requests.rb b/lib/api/merge_requests.rb index 2b685621da9..67fdd0be927 100644 --- a/lib/api/merge_requests.rb +++ b/lib/api/merge_requests.rb @@ -91,7 +91,7 @@ module API if merge_request.valid? # Find or create labels and attach to issue if params[:labels].present? - merge_request.add_labels_by_names(params[:labels].split(",")) + merge_request.add_labels_by_names(params[:labels].split(","), current_user) end present merge_request, with: Entities::MergeRequest, current_user: current_user @@ -201,7 +201,7 @@ module API # Find or create labels and attach to issue unless params[:labels].nil? merge_request.remove_labels - merge_request.add_labels_by_names(params[:labels].split(",")) + merge_request.add_labels_by_names(params[:labels].split(","), current_user) end present merge_request, with: Entities::MergeRequest, current_user: current_user diff --git a/lib/gitlab/fogbugz_import/importer.rb b/lib/gitlab/fogbugz_import/importer.rb index 501d5a95547..1d6f97b99c7 100644 --- a/lib/gitlab/fogbugz_import/importer.rb +++ b/lib/gitlab/fogbugz_import/importer.rb @@ -129,7 +129,7 @@ module Gitlab assignee_id: assignee_id, state: bug['fOpen'] == 'true' ? 'opened' : 'closed' ) - issue.add_labels_by_names(labels) + issue.add_labels_by_names(labels, project.creator) if issue.iid != bug['ixBug'] issue.update_attribute(:iid, bug['ixBug']) diff --git a/lib/gitlab/google_code_import/importer.rb b/lib/gitlab/google_code_import/importer.rb index ef8c3e35619..8d757da2264 100644 --- a/lib/gitlab/google_code_import/importer.rb +++ b/lib/gitlab/google_code_import/importer.rb @@ -100,7 +100,7 @@ module Gitlab state: raw_issue["state"] == "closed" ? "closed" : "opened" ) - issue.add_labels_by_names(labels) + issue.add_labels_by_names(labels, project.creator) if issue.iid != raw_issue["id"] issue.update_attribute(:iid, raw_issue["id"]) diff --git a/spec/lib/gitlab/google_code_import/importer_spec.rb b/spec/lib/gitlab/google_code_import/importer_spec.rb index 54f85f8cffc..097861fd34d 100644 --- a/spec/lib/gitlab/google_code_import/importer_spec.rb +++ b/spec/lib/gitlab/google_code_import/importer_spec.rb @@ -15,6 +15,7 @@ describe Gitlab::GoogleCodeImport::Importer, lib: true do subject { described_class.new(project) } before do + project.team << [project.creator, :master] project.create_import_data(data: import_data) end @@ -31,9 +32,9 @@ describe Gitlab::GoogleCodeImport::Importer, lib: true do subject.execute %w( - Type-Defect Type-Enhancement Type-Task Type-Review Type-Other Milestone-0.12 Priority-Critical - Priority-High Priority-Medium Priority-Low OpSys-All OpSys-Windows OpSys-Linux OpSys-OSX Security - Performance Usability Maintainability Component-Panel Component-Taskbar Component-Battery + Type-Defect Type-Enhancement Type-Task Type-Review Type-Other Milestone-0.12 Priority-Critical + Priority-High Priority-Medium Priority-Low OpSys-All OpSys-Windows OpSys-Linux OpSys-OSX Security + Performance Usability Maintainability Component-Panel Component-Taskbar Component-Battery Component-Systray Component-Clock Component-Launcher Component-Tint2conf Component-Docs Component-New ).each do |label| label.sub!("-", ": ") From 9629bb962cd3666ac58cfbaba9d79df011221f41 Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Mon, 3 Oct 2016 18:43:39 -0300 Subject: [PATCH 109/174] Add column type to labels and do the batch update in the same migration --- db/migrate/20160919144305_add_type_to_labels.rb | 7 ++++++- ...20191518_set_project_label_type_on_labels.rb | 17 ----------------- 2 files changed, 6 insertions(+), 18 deletions(-) delete mode 100644 db/migrate/20160920191518_set_project_label_type_on_labels.rb diff --git a/db/migrate/20160919144305_add_type_to_labels.rb b/db/migrate/20160919144305_add_type_to_labels.rb index 43aac7846d3..66172bda6ff 100644 --- a/db/migrate/20160919144305_add_type_to_labels.rb +++ b/db/migrate/20160919144305_add_type_to_labels.rb @@ -1,9 +1,14 @@ class AddTypeToLabels < ActiveRecord::Migration include Gitlab::Database::MigrationHelpers - DOWNTIME = false + DOWNTIME = true + DOWNTIME_REASON = 'Labels will not work as expected until this migration is complete.' def change add_column :labels, :type, :string + + update_column_in_batches(:labels, :type, 'ProjectLabel') do |table, query| + query.where(table[:project_id].not_eq(nil)) + end end end diff --git a/db/migrate/20160920191518_set_project_label_type_on_labels.rb b/db/migrate/20160920191518_set_project_label_type_on_labels.rb deleted file mode 100644 index af47d0320e2..00000000000 --- a/db/migrate/20160920191518_set_project_label_type_on_labels.rb +++ /dev/null @@ -1,17 +0,0 @@ -class SetProjectLabelTypeOnLabels < ActiveRecord::Migration - include Gitlab::Database::MigrationHelpers - - DOWNTIME = false - - def up - update_column_in_batches(:labels, :type, 'ProjectLabel') do |table, query| - query.where(table[:project_id].not_eq(nil)) - end - end - - def down - update_column_in_batches(:labels, :type, nil) do |table, query| - query.where(table[:project_id].not_eq(nil)) - end - end -end From 11d786e7da9f767a877bbdd4fd482c0d0c4cd747 Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Mon, 3 Oct 2016 18:59:04 -0300 Subject: [PATCH 110/174] Use try instead of ternary operator on Gitlab::ImportExport::ProjectTreeRestorer --- lib/gitlab/import_export/project_tree_restorer.rb | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/gitlab/import_export/project_tree_restorer.rb b/lib/gitlab/import_export/project_tree_restorer.rb index accac5325f8..7cdba880a93 100644 --- a/lib/gitlab/import_export/project_tree_restorer.rb +++ b/lib/gitlab/import_export/project_tree_restorer.rb @@ -120,8 +120,7 @@ module Gitlab end def parsed_relation_hash(relation_hash) - group_id = restored_project.group ? restored_project.group.id : nil - relation_hash.merge!('group_id' => group_id, 'project_id' => restored_project.id) + relation_hash.merge!('group_id' => restored_project.group.try(:id), 'project_id' => restored_project.id) end end end From 1fd84700874ed29a7852b0f090dbaffd86cb8d00 Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Mon, 10 Oct 2016 22:30:18 -0300 Subject: [PATCH 111/174] Hide prioritized labels only when no labels are available to project --- app/views/projects/labels/index.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/projects/labels/index.html.haml b/app/views/projects/labels/index.html.haml index c1ec9cabc40..f135bf6f6b4 100644 --- a/app/views/projects/labels/index.html.haml +++ b/app/views/projects/labels/index.html.haml @@ -16,7 +16,7 @@ .labels - if can?(current_user, :admin_label, @project) -# Only show it in the first page - - hide = @project.labels.empty? || (params[:page].present? && params[:page] != '1') + - hide = @available_labels.empty? || (params[:page].present? && params[:page] != '1') .prioritized-labels{ class: ('hide' if hide) } %h5 Prioritized Labels %ul.content-list.manage-labels-list.js-prioritized-labels{ "data-url" => set_priorities_namespace_project_labels_path(@project.namespace, @project) } From 00e3c2e00f1c81aa2f7a76e4d93c8a1fb2074d6e Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Mon, 10 Oct 2016 23:37:07 -0300 Subject: [PATCH 112/174] Fix replace label references with links for group labels --- lib/banzai/filter/label_reference_filter.rb | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/lib/banzai/filter/label_reference_filter.rb b/lib/banzai/filter/label_reference_filter.rb index 2ce33aa1d15..21085ae6d49 100644 --- a/lib/banzai/filter/label_reference_filter.rb +++ b/lib/banzai/filter/label_reference_filter.rb @@ -39,7 +39,13 @@ module Banzai end def find_labels(project) - LabelsFinder.new(user, project_id: project.id).execute + label_ids = [] + label_ids << project.group.labels.select(:id) if project.group.present? + label_ids << project.labels.select(:id) + + union = Gitlab::SQL::Union.new(label_ids) + + Label.where("labels.id IN (#{union.to_sql})") end # Parameters to pass to `Label.find_by` based on the given arguments From f98e97fe78dce11a1f88c3961be402d179e63927 Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Tue, 11 Oct 2016 00:04:15 -0300 Subject: [PATCH 113/174] Reduce duplication between the project and group label forms --- app/controllers/groups/labels_controller.rb | 1 + app/views/groups/labels/_form.html.haml | 33 ------------------- app/views/groups/labels/edit.html.haml | 2 +- app/views/groups/labels/new.html.haml | 2 +- app/views/projects/labels/edit.html.haml | 2 +- app/views/projects/labels/new.html.haml | 2 +- .../labels/_form.html.haml | 2 +- 7 files changed, 6 insertions(+), 38 deletions(-) delete mode 100644 app/views/groups/labels/_form.html.haml rename app/views/{projects => shared}/labels/_form.html.haml (91%) diff --git a/app/controllers/groups/labels_controller.rb b/app/controllers/groups/labels_controller.rb index 0ebdee55c79..483a5aedf12 100644 --- a/app/controllers/groups/labels_controller.rb +++ b/app/controllers/groups/labels_controller.rb @@ -21,6 +21,7 @@ class Groups::LabelsController < Groups::ApplicationController def new @label = @group.labels.new + @previous_labels_path = previous_labels_path end def create diff --git a/app/views/groups/labels/_form.html.haml b/app/views/groups/labels/_form.html.haml deleted file mode 100644 index a0b44b0dcfb..00000000000 --- a/app/views/groups/labels/_form.html.haml +++ /dev/null @@ -1,33 +0,0 @@ -= form_for @label, as: :label, url: url, html: { class: 'form-horizontal label-form js-quick-submit js-requires-input' } do |f| - = form_errors(@label) - - .form-group - = f.label :title, class: 'control-label' - .col-sm-10 - = f.text_field :title, class: "form-control", required: true, autofocus: true - .form-group - = f.label :description, class: 'control-label' - .col-sm-10 - = f.text_field :description, class: "form-control js-quick-submit" - .form-group - = f.label :color, "Background color", class: 'control-label' - .col-sm-10 - .input-group - .input-group-addon.label-color-preview   - = f.color_field :color, class: "form-control" - .help-block - Choose any color. - %br - Or you can choose one of suggested colors below - - .suggest-colors - - suggested_colors.each do |color| - = link_to '#', style: "background-color: #{color}", data: { color: color } do -   - - .form-actions - - if @label.persisted? - = f.submit 'Save changes', class: 'btn btn-save js-save-button' - - else - = f.submit 'Create Label', class: 'btn btn-create js-save-button' - = link_to 'Cancel', @previous_labels_path, class: 'btn btn-cancel' diff --git a/app/views/groups/labels/edit.html.haml b/app/views/groups/labels/edit.html.haml index 28471f407ad..836981fc6fd 100644 --- a/app/views/groups/labels/edit.html.haml +++ b/app/views/groups/labels/edit.html.haml @@ -4,4 +4,4 @@ Edit Label %hr -= render 'form', url: group_label_path(@group, @label) += render 'shared/labels/form', url: group_label_path(@group, @label), back_path: @previous_labels_path diff --git a/app/views/groups/labels/new.html.haml b/app/views/groups/labels/new.html.haml index 257ae97de03..2be87460b1d 100644 --- a/app/views/groups/labels/new.html.haml +++ b/app/views/groups/labels/new.html.haml @@ -5,4 +5,4 @@ New Label %hr -= render 'form', url: group_labels_path += render 'shared/labels/form', url: group_labels_path, back_path: @previous_labels_path diff --git a/app/views/projects/labels/edit.html.haml b/app/views/projects/labels/edit.html.haml index 49adb593559..a80a07b52e6 100644 --- a/app/views/projects/labels/edit.html.haml +++ b/app/views/projects/labels/edit.html.haml @@ -6,4 +6,4 @@ %h3.page-title Edit Label %hr - = render 'form', url: namespace_project_label_path(@project.namespace.becomes(Namespace), @project, @label) + = render 'shared/labels/form', url: namespace_project_label_path(@project.namespace.becomes(Namespace), @project, @label), back_path: namespace_project_labels_path(@project.namespace, @project) diff --git a/app/views/projects/labels/new.html.haml b/app/views/projects/labels/new.html.haml index 0c177feb43c..f0d9be744d1 100644 --- a/app/views/projects/labels/new.html.haml +++ b/app/views/projects/labels/new.html.haml @@ -6,4 +6,4 @@ %h3.page-title New Label %hr - = render 'form', url: namespace_project_labels_path(@project.namespace.becomes(Namespace), @project) + = render 'shared/labels/form', url: namespace_project_labels_path(@project.namespace.becomes(Namespace), @project), back_path: namespace_project_labels_path(@project.namespace, @project) diff --git a/app/views/projects/labels/_form.html.haml b/app/views/shared/labels/_form.html.haml similarity index 91% rename from app/views/projects/labels/_form.html.haml rename to app/views/shared/labels/_form.html.haml index 28a062c7eb5..647e05e5ff7 100644 --- a/app/views/projects/labels/_form.html.haml +++ b/app/views/shared/labels/_form.html.haml @@ -30,4 +30,4 @@ = f.submit 'Save changes', class: 'btn btn-save js-save-button' - else = f.submit 'Create Label', class: 'btn btn-create js-save-button' - = link_to 'Cancel', namespace_project_labels_path(@project.namespace, @project), class: 'btn btn-cancel' + = link_to 'Cancel', back_path, class: 'btn btn-cancel' From bdf365e64f35e76ba6d9a372111ce502db11827e Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Tue, 11 Oct 2016 13:57:52 -0300 Subject: [PATCH 114/174] Use delegate! on group and project labels policies --- app/policies/group_label_policy.rb | 2 +- app/policies/project_label_policy.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/policies/group_label_policy.rb b/app/policies/group_label_policy.rb index 4d4052c5800..7b34aa182eb 100644 --- a/app/policies/group_label_policy.rb +++ b/app/policies/group_label_policy.rb @@ -1,5 +1,5 @@ class GroupLabelPolicy < BasePolicy def rules - can! :admin_label if Ability.allowed?(@user, :admin_label, @subject.group) + delegate! @subject.group end end diff --git a/app/policies/project_label_policy.rb b/app/policies/project_label_policy.rb index e7bd58372a6..b12b4c5166b 100644 --- a/app/policies/project_label_policy.rb +++ b/app/policies/project_label_policy.rb @@ -1,5 +1,5 @@ class ProjectLabelPolicy < BasePolicy def rules - can! :admin_label if Ability.allowed?(@user, :admin_label, @subject.project) + delegate! @subject.project end end From 2deef25eb0c87db2fddf8b25c95891650d9c43a7 Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Tue, 11 Oct 2016 14:13:26 -0300 Subject: [PATCH 115/174] Use Label.attributes instead of Label.dup when creating label templates --- app/models/project.rb | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/app/models/project.rb b/app/models/project.rb index a04817987b4..7ab624eafdf 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -733,12 +733,7 @@ class Project < ActiveRecord::Base def create_labels Label.templates.each do |label| - label = label.dup - label.template = false - label.project_id = self.id - label.type = 'ProjectLabel' - - label.save + self.labels.create!(label.attributes.symbolize_keys.except(:id, :template)) end end From 73bfc15cd4fc681015e84f7db8507e38e4ca8b59 Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Tue, 11 Oct 2016 14:18:21 -0300 Subject: [PATCH 116/174] Always use symbols for type on LabelsHelper#link_to_label --- app/helpers/labels_helper.rb | 2 +- app/views/projects/merge_requests/_merge_request.html.haml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/helpers/labels_helper.rb b/app/helpers/labels_helper.rb index e8992c114b0..af8741f5e06 100644 --- a/app/helpers/labels_helper.rb +++ b/app/helpers/labels_helper.rb @@ -46,7 +46,7 @@ module LabelsHelper end end - def label_filter_path(subject, label, type: issue) + def label_filter_path(subject, label, type: :issue) case subject when Group send("#{type.to_s.pluralize}_group_path", diff --git a/app/views/projects/merge_requests/_merge_request.html.haml b/app/views/projects/merge_requests/_merge_request.html.haml index ad62bf50b57..12408068834 100644 --- a/app/views/projects/merge_requests/_merge_request.html.haml +++ b/app/views/projects/merge_requests/_merge_request.html.haml @@ -62,7 +62,7 @@ - if merge_request.labels.any?   - merge_request.labels.each do |label| - = link_to_label(label, subject: merge_request.project, type: 'merge_request') + = link_to_label(label, subject: merge_request.project, type: :merge_request) - if merge_request.tasks?   %span.task-status From 933ebb8f9b289cc077e4d16fd62e1e7b04bc10de Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Tue, 11 Oct 2016 14:35:50 -0300 Subject: [PATCH 117/174] Use present? instead of presence on Projects::MergeRequestsController --- app/controllers/projects/merge_requests_controller.rb | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/controllers/projects/merge_requests_controller.rb b/app/controllers/projects/merge_requests_controller.rb index 9171b47cda1..0f593d1a936 100644 --- a/app/controllers/projects/merge_requests_controller.rb +++ b/app/controllers/projects/merge_requests_controller.rb @@ -40,7 +40,10 @@ class Projects::MergeRequestsController < Projects::ApplicationController @merge_requests = @merge_requests.page(params[:page]) @merge_requests = @merge_requests.preload(:target_project) - @labels = LabelsFinder.new(current_user, project_id: @project.id, title: params[:label_name]).execute if params[:label_name].presence + if params[:label_name].present? + labels_params = { project_id: @project.id, title: params[:label_name] } + @labels = LabelsFinder.new(current_user, labels_params).execute + end respond_to do |format| format.html From 504682db9e2dd99fe827940ac18d5ea8030ae49c Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Tue, 11 Oct 2016 14:39:32 -0300 Subject: [PATCH 118/174] Limit what label fields we expose on Dashboard::LabelsController#index --- app/controllers/dashboard/labels_controller.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/controllers/dashboard/labels_controller.rb b/app/controllers/dashboard/labels_controller.rb index 05f7bc37952..d5031da867a 100644 --- a/app/controllers/dashboard/labels_controller.rb +++ b/app/controllers/dashboard/labels_controller.rb @@ -1,7 +1,9 @@ class Dashboard::LabelsController < Dashboard::ApplicationController def index + labels = LabelsFinder.new(current_user).execute + respond_to do |format| - format.json { render json: LabelsFinder.new(current_user).execute } + format.json { render json: labels.as_json(only: [:id, :title, :color]) } end end end From 36fee24c80afa1e1c5f55cd5f5e5f45a60531d8e Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Tue, 11 Oct 2016 14:46:07 -0300 Subject: [PATCH 119/174] Limit what label fields we expose on Groups::LabelsController#index --- app/controllers/groups/labels_controller.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/controllers/groups/labels_controller.rb b/app/controllers/groups/labels_controller.rb index 483a5aedf12..0a3dee5ce39 100644 --- a/app/controllers/groups/labels_controller.rb +++ b/app/controllers/groups/labels_controller.rb @@ -14,7 +14,8 @@ class Groups::LabelsController < Groups::ApplicationController end format.json do - render json: LabelsFinder.new(current_user, group_id: @group.id).execute + available_labels = LabelsFinder.new(current_user, group_id: @group.id).execute + render json: available_labels.as_json(only: [:id, :title, :color]) end end end From bde992a83a9e0655dd9c2f59d7314c14b714bd31 Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Tue, 11 Oct 2016 14:47:02 -0300 Subject: [PATCH 120/174] Limit what label fields we expose on Projects::LabelsController#index --- app/controllers/projects/labels_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/projects/labels_controller.rb b/app/controllers/projects/labels_controller.rb index 3154a4435f6..87c9101551b 100644 --- a/app/controllers/projects/labels_controller.rb +++ b/app/controllers/projects/labels_controller.rb @@ -18,7 +18,7 @@ class Projects::LabelsController < Projects::ApplicationController respond_to do |format| format.html format.json do - render json: @labels + render json: @labels.as_json(only: [:id, :title, :color]) end end end From f74d5f2750c638f30020ba727e2947b7207bf0e2 Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Tue, 11 Oct 2016 15:50:17 -0300 Subject: [PATCH 121/174] Fix shared labels filter --- app/views/shared/issuable/_filter.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/shared/issuable/_filter.html.haml b/app/views/shared/issuable/_filter.html.haml index 8c2036a1cde..f8018fc3de0 100644 --- a/app/views/shared/issuable/_filter.html.haml +++ b/app/views/shared/issuable/_filter.html.haml @@ -27,7 +27,7 @@ = render "shared/issuable/milestone_dropdown", selected: finder.milestones.try(:first), name: :milestone_title, show_any: true, show_upcoming: true .filter-item.inline.labels-filter - = render "shared/issuable/label_dropdown", selected: finder.labels.select(:title).uniq, use_id: false, selected_toggle: params[:label_name], data_options: { field_name: "label_name[]" } + = render "shared/issuable/label_dropdown", selected: finder.labels.select(:title, :type).uniq, use_id: false, selected_toggle: params[:label_name], data_options: { field_name: "label_name[]" } .filter-item.inline.reset-filters %a{href: page_filter_path(without: [:assignee_id, :author_id, :milestone_title, :label_name, :search])} Reset filters From 1e6d136af31b0b91a03881a0c20b9bfa448201ee Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Tue, 11 Oct 2016 16:30:40 -0300 Subject: [PATCH 122/174] Keep cross project reference logic in GroupLabel#to_reference --- app/models/group_label.rb | 16 ++++++++++++++-- lib/gitlab/gfm/reference_rewriter.rb | 10 +--------- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/app/models/group_label.rb b/app/models/group_label.rb index bfcaf3df27e..c7efa29a5f6 100644 --- a/app/models/group_label.rb +++ b/app/models/group_label.rb @@ -15,8 +15,20 @@ class GroupLabel < Label # # Returns a String # - def to_reference(from_project = nil, format: :id) + def to_reference(source_project = nil, target_project = nil, format: :id) format_reference = label_format_reference(format) - "#{self.class.reference_prefix}#{format_reference}" + reference = "#{self.class.reference_prefix}#{format_reference}" + + if cross_project_reference?(source_project, target_project) + source_project.to_reference + reference + else + reference + end + end + + private + + def cross_project_reference?(source_project, target_project) + source_project && target_project && source_project != target_project end end diff --git a/lib/gitlab/gfm/reference_rewriter.rb b/lib/gitlab/gfm/reference_rewriter.rb index d0b8cd90e0e..a7c596dced0 100644 --- a/lib/gitlab/gfm/reference_rewriter.rb +++ b/lib/gitlab/gfm/reference_rewriter.rb @@ -76,15 +76,7 @@ module Gitlab if referable.respond_to?(:project) referable.to_reference(target_project) else - to_reference(referable, target_project) - end - end - - def to_reference(referable, target_project) - if @source_project != target_project - @source_project.to_reference + referable.to_reference - else - referable.to_reference + referable.to_reference(@source_project, target_project) end end From 247859c82915a0ee88944c1fcda3f6faf49e54c0 Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Tue, 11 Oct 2016 16:33:55 -0300 Subject: [PATCH 123/174] Render all available labels to project on project labels dropdown --- app/controllers/projects/labels_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/projects/labels_controller.rb b/app/controllers/projects/labels_controller.rb index 87c9101551b..f4ad503c9a6 100644 --- a/app/controllers/projects/labels_controller.rb +++ b/app/controllers/projects/labels_controller.rb @@ -18,7 +18,7 @@ class Projects::LabelsController < Projects::ApplicationController respond_to do |format| format.html format.json do - render json: @labels.as_json(only: [:id, :title, :color]) + render json: @available_labels.as_json(only: [:id, :title, :color]) end end end From 0e8dd599134f17e58cf533ab21cf3c4a5b50c353 Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Tue, 11 Oct 2016 16:51:11 -0300 Subject: [PATCH 124/174] Move common logic to reference group/project label to Label#to_reference --- app/models/group_label.rb | 27 +-------------------------- app/models/label.rb | 28 ++++++++++++++++++++++++++++ app/models/project_label.rb | 24 ++---------------------- 3 files changed, 31 insertions(+), 48 deletions(-) diff --git a/app/models/group_label.rb b/app/models/group_label.rb index c7efa29a5f6..a1d8d087726 100644 --- a/app/models/group_label.rb +++ b/app/models/group_label.rb @@ -3,32 +3,7 @@ class GroupLabel < Label validates :group, presence: true - ## - # Returns the String necessary to reference this GroupLabel in Markdown - # - # format - Symbol format to use (default: :id, optional: :name) - # - # Examples: - # - # GroupLabel.first.to_reference # => "~1" - # GroupLabel.first.to_reference(format: :name) # => "~\"bug\"" - # - # Returns a String - # def to_reference(source_project = nil, target_project = nil, format: :id) - format_reference = label_format_reference(format) - reference = "#{self.class.reference_prefix}#{format_reference}" - - if cross_project_reference?(source_project, target_project) - source_project.to_reference + reference - else - reference - end - end - - private - - def cross_project_reference?(source_project, target_project) - source_project && target_project && source_project != target_project + super(source_project, target_project, format: format) end end diff --git a/app/models/label.rb b/app/models/label.rb index 7dd2d8790b0..444f45fa09e 100644 --- a/app/models/label.rb +++ b/app/models/label.rb @@ -97,8 +97,36 @@ class Label < ActiveRecord::Base write_attribute(:title, sanitize_title(value)) if value.present? end + ## + # Returns the String necessary to reference this Label in Markdown + # + # format - Symbol format to use (default: :id, optional: :name) + # + # Examples: + # + # Label.first.to_reference # => "~1" + # Label.first.to_reference(format: :name) # => "~\"bug\"" + # Label.first.to_reference(project1, project2) # => "gitlab-org/gitlab-ce~1" + # + # Returns a String + # + def to_reference(source_project = nil, target_project = nil, format: :id) + format_reference = label_format_reference(format) + reference = "#{self.class.reference_prefix}#{format_reference}" + + if cross_project_reference?(source_project, target_project) + source_project.to_reference + reference + else + reference + end + end + private + def cross_project_reference?(source_project, target_project) + source_project && target_project && source_project != target_project + end + def issues_count(user, params = {}) IssuesFinder.new(user, { label_name: title, scope: 'all' }.merge(params)) .execute diff --git a/app/models/project_label.rb b/app/models/project_label.rb index 2fc074dc401..a246a90435d 100644 --- a/app/models/project_label.rb +++ b/app/models/project_label.rb @@ -7,28 +7,8 @@ class ProjectLabel < Label delegate :group, to: :project, allow_nil: true - ## - # Returns the String necessary to reference this ProjectLabel in Markdown - # - # format - Symbol format to use (default: :id, optional: :name) - # - # Examples: - # - # ProjectLabel.first.to_reference # => "~1" - # ProjectLabel.first.to_reference(format: :name) # => "~\"bug\"" - # ProjectLabel.first.to_reference(project) # => "gitlab-org/gitlab-ce~1" - # - # Returns a String - # - def to_reference(from_project = nil, format: :id) - format_reference = label_format_reference(format) - reference = "#{self.class.reference_prefix}#{format_reference}" - - if cross_project_reference?(from_project) - project.to_reference + reference - else - reference - end + def to_reference(target_project = nil, format: :id) + super(project, target_project, format: format) end private From 6792644ae77476af88343d4a5b9e370326d331ea Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Thu, 13 Oct 2016 17:14:05 -0300 Subject: [PATCH 125/174] Use present? instead of presence on Projects::IssuesController#index --- app/controllers/projects/issues_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/projects/issues_controller.rb b/app/controllers/projects/issues_controller.rb index 9f18c8c03df..cb649264146 100644 --- a/app/controllers/projects/issues_controller.rb +++ b/app/controllers/projects/issues_controller.rb @@ -26,7 +26,7 @@ class Projects::IssuesController < Projects::ApplicationController @issues = issues_collection @issues = @issues.page(params[:page]) - if params[:label_name].presence + if params[:label_name].present? @labels = LabelsFinder.new(current_user, project_id: @project.id, title: params[:label_name]).execute end From da9407927be1dd4a6b0b00be360e61d6bb507da8 Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Thu, 13 Oct 2016 17:16:51 -0300 Subject: [PATCH 126/174] Remove unnecessary `title.present?` on LabelsFinder --- app/finders/labels_finder.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/finders/labels_finder.rb b/app/finders/labels_finder.rb index 28110be7097..5ee2e1ee6e8 100644 --- a/app/finders/labels_finder.rb +++ b/app/finders/labels_finder.rb @@ -33,7 +33,7 @@ class LabelsFinder < UnionFinder end def with_title(items) - items = items.where(title: title) if title.present? + items = items.where(title: title) if title items end From 5912251e614421b4798ac235c7f408a1b45a2b4c Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Thu, 13 Oct 2016 17:22:11 -0300 Subject: [PATCH 127/174] Use reverse_merge on Label#issues_count and Label#merge_requests_count --- app/models/label.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/models/label.rb b/app/models/label.rb index 444f45fa09e..112d9f3fbe5 100644 --- a/app/models/label.rb +++ b/app/models/label.rb @@ -128,13 +128,13 @@ class Label < ActiveRecord::Base end def issues_count(user, params = {}) - IssuesFinder.new(user, { label_name: title, scope: 'all' }.merge(params)) + IssuesFinder.new(user, params.reverse_merge(label_name: title, scope: 'all')) .execute .count end def merge_requests_count(user, params = {}) - MergeRequestsFinder.new(user, { label_name: title, scope: 'all' }.merge(params)) + MergeRequestsFinder.new(user, params.reverse_merge(label_name: title, scope: 'all')) .execute .count end From fc59d357201a907e6079f6f0a7fc9a31f2957f88 Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Thu, 13 Oct 2016 17:25:25 -0300 Subject: [PATCH 128/174] Skip update query if label have the same id on Labels::TransferService --- app/services/labels/transfer_service.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/services/labels/transfer_service.rb b/app/services/labels/transfer_service.rb index 81897c62c0f..04312c114ef 100644 --- a/app/services/labels/transfer_service.rb +++ b/app/services/labels/transfer_service.rb @@ -19,6 +19,8 @@ module Labels labels_to_transfer.find_each do |label| new_label_id = find_or_create_label!(label) + next if new_label_id == label.id + LabelLink.where(label_id: label.id).update_all(label_id: new_label_id) end end From cece77f273407da4a9ed66acda53e9ac4117dbaf Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Thu, 13 Oct 2016 17:45:39 -0300 Subject: [PATCH 129/174] Fix validation to allow updates to description/color of project label --- app/models/project_label.rb | 2 +- spec/models/project_label_spec.rb | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/app/models/project_label.rb b/app/models/project_label.rb index a246a90435d..5b739bcdadf 100644 --- a/app/models/project_label.rb +++ b/app/models/project_label.rb @@ -14,7 +14,7 @@ class ProjectLabel < Label private def title_must_not_exist_at_group_level - return unless group.present? + return unless group.present? && title_changed? if group.labels.with_title(self.title).exists? errors.add(:title, :label_already_exists_at_group_level, group: group.name) diff --git a/spec/models/project_label_spec.rb b/spec/models/project_label_spec.rb index 7966c52c38d..c861d4b73bb 100644 --- a/spec/models/project_label_spec.rb +++ b/spec/models/project_label_spec.rb @@ -40,6 +40,16 @@ describe ProjectLabel, models: true do expect(label.errors[:title]).to be_empty end + + it 'does not returns error when title does not change' do + project_label = create(:label, project: project, name: 'Security') + create(:group_label, group: group, name: 'Security') + project_label.description = 'Security related stuff.' + + project_label.valid? + + expect(project_label .errors[:title]).to be_empty + end end end From 0dbb47f00ee7333bbe76ddda853511c9120e2ad6 Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Thu, 13 Oct 2016 18:03:52 -0300 Subject: [PATCH 130/174] Fix IssuableBaseService#find_or_create_label_ids --- app/services/issuable_base_service.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/services/issuable_base_service.rb b/app/services/issuable_base_service.rb index b3e4f8dcf27..deadf1fe283 100644 --- a/app/services/issuable_base_service.rb +++ b/app/services/issuable_base_service.rb @@ -88,7 +88,7 @@ class IssuableBaseService < BaseService return unless labels params[:label_ids] = labels.split(',').map do |label_name| - label = available_labels.find_by(title: title).select(:id) + label = available_labels.find_by(title: label_name) label ||= project.labels.create(title: label_name.strip, color: Label::DEFAULT_COLOR) label.id From 033ea9d1e80544df5236ca045c88f649e41afbc7 Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Thu, 13 Oct 2016 18:04:55 -0300 Subject: [PATCH 131/174] Move label management to services on merge requests API --- lib/api/merge_requests.rb | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/lib/api/merge_requests.rb b/lib/api/merge_requests.rb index 67fdd0be927..bf8504e1101 100644 --- a/lib/api/merge_requests.rb +++ b/lib/api/merge_requests.rb @@ -86,14 +86,11 @@ module API render_api_error!({ labels: errors }, 400) end + attrs[:labels] = params[:labels] if params[:labels] + merge_request = ::MergeRequests::CreateService.new(user_project, current_user, attrs).execute if merge_request.valid? - # Find or create labels and attach to issue - if params[:labels].present? - merge_request.add_labels_by_names(params[:labels].split(","), current_user) - end - present merge_request, with: Entities::MergeRequest, current_user: current_user else handle_merge_request_errors! merge_request.errors @@ -195,15 +192,11 @@ module API render_api_error!({ labels: errors }, 400) end + attrs[:labels] = params[:labels] if params[:labels] + merge_request = ::MergeRequests::UpdateService.new(user_project, current_user, attrs).execute(merge_request) if merge_request.valid? - # Find or create labels and attach to issue - unless params[:labels].nil? - merge_request.remove_labels - merge_request.add_labels_by_names(params[:labels].split(","), current_user) - end - present merge_request, with: Entities::MergeRequest, current_user: current_user else handle_merge_request_errors! merge_request.errors From bf710b5119dce329a1ffd43b01b3a4dbb3e94b09 Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Thu, 13 Oct 2016 18:34:44 -0300 Subject: [PATCH 132/174] Validate label params against all labels available to project on the API --- lib/api/helpers.rb | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/lib/api/helpers.rb b/lib/api/helpers.rb index 67473f300c9..45120898b76 100644 --- a/lib/api/helpers.rb +++ b/lib/api/helpers.rb @@ -71,6 +71,10 @@ module API @project ||= find_project(params[:id]) end + def available_labels + @available_labels ||= LabelsFinder.new(current_user, project_id: user_project.id).execute + end + def find_project(id) project = Project.find_with_namespace(id) || Project.find_by(id: id) @@ -118,7 +122,7 @@ module API end def find_project_label(id) - label = user_project.labels.find_by_id(id) || user_project.labels.find_by_title(id) + label = available_labels.find_by_id(id) || available_labels.find_by_title(id) label || not_found!('Label') end @@ -197,16 +201,11 @@ module API def validate_label_params(params) errors = {} - if params[:labels].present? - params[:labels].split(',').each do |label_name| - label = user_project.labels.create_with( - color: Label::DEFAULT_COLOR).find_or_initialize_by( - title: label_name.strip) + params[:labels].to_s.split(',').each do |label_name| + label = available_labels.find_or_initialize_by(title: label_name.strip) + next if label.valid? - if label.invalid? - errors[label.title] = label.errors - end - end + errors[label.title] = label.errors end errors From 68f30b2fff362805568588f416709e7000d75ce3 Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Thu, 13 Oct 2016 18:48:59 -0300 Subject: [PATCH 133/174] Add support to group labels on issues board API --- lib/api/boards.rb | 4 ++-- spec/requests/api/boards_spec.rb | 25 +++++++++++++++++-------- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/lib/api/boards.rb b/lib/api/boards.rb index b14dd4f6e83..4ac491edc1b 100644 --- a/lib/api/boards.rb +++ b/lib/api/boards.rb @@ -65,8 +65,8 @@ module API requires :label_id, type: Integer, desc: 'The ID of an existing label' end post '/lists' do - unless user_project.labels.exists?(params[:label_id]) - render_api_error!({ error: "Label not found!" }, 400) + unless available_labels.exists?(params[:label_id]) + render_api_error!({ error: 'Label not found!' }, 400) end authorize!(:admin_list, user_project) diff --git a/spec/requests/api/boards_spec.rb b/spec/requests/api/boards_spec.rb index f4b04445c6c..4f5c09a3029 100644 --- a/spec/requests/api/boards_spec.rb +++ b/spec/requests/api/boards_spec.rb @@ -106,9 +106,20 @@ describe API::API, api: true do describe "POST /projects/:id/board/lists" do let(:base_url) { "/projects/#{project.id}/boards/#{board.id}/lists" } - it 'creates a new issue board list' do - post api(base_url, user), - label_id: ux_label.id + it 'creates a new issue board list for group labels' do + group = create(:group) + group_label = create(:group_label, group: group) + project.update(group: group) + + post api(base_url, user), label_id: group_label.id + + expect(response).to have_http_status(201) + expect(json_response['label']['name']).to eq(group_label.title) + expect(json_response['position']).to eq(3) + end + + it 'creates a new issue board list for project labels' do + post api(base_url, user), label_id: ux_label.id expect(response).to have_http_status(201) expect(json_response['label']['name']).to eq(ux_label.title) @@ -116,15 +127,13 @@ describe API::API, api: true do end it 'returns 400 when creating a new list if label_id is invalid' do - post api(base_url, user), - label_id: 23423 + post api(base_url, user), label_id: 23423 expect(response).to have_http_status(400) end - it "returns 403 for project members with guest role" do - put api("#{base_url}/#{test_list.id}", guest), - position: 1 + it 'returns 403 for project members with guest role' do + put api("#{base_url}/#{test_list.id}", guest), position: 1 expect(response).to have_http_status(403) end From 9b288238549dac5b59fd467f6ee1fdc53b6c783e Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Thu, 13 Oct 2016 18:53:06 -0300 Subject: [PATCH 134/174] List all available labels to the project on the labels API --- lib/api/labels.rb | 2 +- spec/requests/api/labels_spec.rb | 12 +++++++++--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/lib/api/labels.rb b/lib/api/labels.rb index c806829d69e..642e6345b9e 100644 --- a/lib/api/labels.rb +++ b/lib/api/labels.rb @@ -11,7 +11,7 @@ module API # Example Request: # GET /projects/:id/labels get ':id/labels' do - present user_project.labels, with: Entities::Label, current_user: current_user + present available_labels, with: Entities::Label, current_user: current_user end # Creates a new label diff --git a/spec/requests/api/labels_spec.rb b/spec/requests/api/labels_spec.rb index 83789223019..1da9988978b 100644 --- a/spec/requests/api/labels_spec.rb +++ b/spec/requests/api/labels_spec.rb @@ -12,12 +12,18 @@ describe API::API, api: true do end describe 'GET /projects/:id/labels' do - it 'returns project labels' do + it 'returns all available labels to the project' do + group = create(:group) + group_label = create(:group_label, group: group) + project.update(group: group) + get api("/projects/#{project.id}/labels", user) + expect(response).to have_http_status(200) expect(json_response).to be_an Array - expect(json_response.size).to eq(1) - expect(json_response.first['name']).to eq(label1.name) + expect(json_response.size).to eq(2) + expect(json_response.first['name']).to eq(group_label.name) + expect(json_response.second['name']).to eq(label1.name) end end From ed7591f7b8c55498e3e38be41cc049a92b9fe4a6 Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Thu, 13 Oct 2016 19:05:07 -0300 Subject: [PATCH 135/174] Remove unused method Issuable#remove_labels --- app/models/concerns/issuable.rb | 4 ---- 1 file changed, 4 deletions(-) diff --git a/app/models/concerns/issuable.rb b/app/models/concerns/issuable.rb index fee68d9cc8f..0b57e318662 100644 --- a/app/models/concerns/issuable.rb +++ b/app/models/concerns/issuable.rb @@ -230,10 +230,6 @@ module Issuable labels.order('title ASC').pluck(:title) end - def remove_labels - labels.delete_all - end - def add_labels_by_names(label_names, current_user) available_labels = LabelsFinder.new(current_user, project_id: project.id).execute From f008cdf218952556a0dc93962f55c0ff50733594 Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Thu, 13 Oct 2016 19:30:02 -0300 Subject: [PATCH 136/174] Remove Issuable#add_labels_by_names --- app/models/concerns/issuable.rb | 12 ----------- lib/gitlab/fogbugz_import/importer.rb | 25 +++++++++-------------- lib/gitlab/google_code_import/importer.rb | 19 ++++++++--------- 3 files changed, 18 insertions(+), 38 deletions(-) diff --git a/app/models/concerns/issuable.rb b/app/models/concerns/issuable.rb index 0b57e318662..76de927ceab 100644 --- a/app/models/concerns/issuable.rb +++ b/app/models/concerns/issuable.rb @@ -230,18 +230,6 @@ module Issuable labels.order('title ASC').pluck(:title) end - def add_labels_by_names(label_names, current_user) - available_labels = LabelsFinder.new(current_user, project_id: project.id).execute - - label_names.each do |label_name| - title = label_name.strip - label = available_labels.find_by(title: title) - label ||= project.labels.build(title: title, color: Label::DEFAULT_COLOR) - - self.labels << label - end - end - # Convert this Issuable class name to a format usable by Ability definitions # # Examples: diff --git a/lib/gitlab/fogbugz_import/importer.rb b/lib/gitlab/fogbugz_import/importer.rb index 1d6f97b99c7..9e926e2681a 100644 --- a/lib/gitlab/fogbugz_import/importer.rb +++ b/lib/gitlab/fogbugz_import/importer.rb @@ -122,25 +122,20 @@ module Gitlab author_id = user_info(bug['ixPersonOpenedBy'])[:gitlab_id] || project.creator_id issue = Issue.create!( - project_id: project.id, - title: bug['sTitle'], - description: body, - author_id: author_id, - assignee_id: assignee_id, - state: bug['fOpen'] == 'true' ? 'opened' : 'closed' + iid: bug['ixBug'], + project_id: project.id, + title: bug['sTitle'], + description: body, + author_id: author_id, + assignee_id: assignee_id, + state: bug['fOpen'] == 'true' ? 'opened' : 'closed', + created_at: date, + updated_at: DateTime.parse(bug['dtLastUpdated']) ) - issue.add_labels_by_names(labels, project.creator) - if issue.iid != bug['ixBug'] - issue.update_attribute(:iid, bug['ixBug']) - end + issue.update_attribute(:label_ids, project.labels.where(title: labels).pluck(:id)) import_issue_comments(issue, comments) - - issue.update_attribute(:created_at, date) - - last_update = DateTime.parse(bug['dtLastUpdated']) - issue.update_attribute(:updated_at, last_update) end end diff --git a/lib/gitlab/google_code_import/importer.rb b/lib/gitlab/google_code_import/importer.rb index 8d757da2264..79a0eaba1e8 100644 --- a/lib/gitlab/google_code_import/importer.rb +++ b/lib/gitlab/google_code_import/importer.rb @@ -92,19 +92,16 @@ module Gitlab end issue = Issue.create!( - project_id: project.id, - title: raw_issue["title"], - description: body, - author_id: project.creator_id, - assignee_id: assignee_id, - state: raw_issue["state"] == "closed" ? "closed" : "opened" + iid: raw_issue['id'], + project_id: project.id, + title: raw_issue['title'], + description: body, + author_id: project.creator_id, + assignee_id: assignee_id, + state: raw_issue['state'] == 'closed' ? 'closed' : 'opened' ) - issue.add_labels_by_names(labels, project.creator) - - if issue.iid != raw_issue["id"] - issue.update_attribute(:iid, raw_issue["id"]) - end + issue.update_attribute(:label_ids, project.labels.where(title: labels).pluck(:id)) import_issue_comments(issue, comments) end From de9d3915d249a59e65226f6dd2ebe1f50a47306e Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Thu, 13 Oct 2016 19:38:22 -0300 Subject: [PATCH 137/174] Remove `::` for method call on Label#text_color --- app/models/label.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/label.rb b/app/models/label.rb index 112d9f3fbe5..8b775e81db7 100644 --- a/app/models/label.rb +++ b/app/models/label.rb @@ -90,7 +90,7 @@ class Label < ActiveRecord::Base end def text_color - LabelsHelper::text_color_for_bg(self.color) + LabelsHelper.text_color_for_bg(self.color) end def title=(value) From 297892011330ecdd2fa7cbe47fbc6fd4f3b62171 Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Fri, 14 Oct 2016 16:12:07 -0300 Subject: [PATCH 138/174] Add LabelPriority model --- app/models/label.rb | 7 +-- app/models/label_priority.rb | 8 +++ .../20161014173530_create_label_priorities.rb | 55 +++++++++++++++++++ db/schema.rb | 15 ++++- spec/factories/label_priorities.rb | 7 +++ spec/models/label_priority_spec.rb | 21 +++++++ spec/models/label_spec.rb | 1 + 7 files changed, 106 insertions(+), 8 deletions(-) create mode 100644 app/models/label_priority.rb create mode 100644 db/migrate/20161014173530_create_label_priorities.rb create mode 100644 spec/factories/label_priorities.rb create mode 100644 spec/models/label_priority_spec.rb diff --git a/app/models/label.rb b/app/models/label.rb index 8b775e81db7..3ce4e253035 100644 --- a/app/models/label.rb +++ b/app/models/label.rb @@ -16,6 +16,7 @@ class Label < ActiveRecord::Base default_value_for :color, DEFAULT_COLOR has_many :lists, dependent: :destroy + has_many :priorities, class_name: 'LabelPriority' has_many :label_links, dependent: :destroy has_many :issues, through: :label_links, source: :target, source_type: 'Issue' has_many :merge_requests, through: :label_links, source: :target, source_type: 'MergeRequest' @@ -26,8 +27,6 @@ class Label < ActiveRecord::Base validates :title, presence: true, format: { with: /\A[^,]+\z/ } validates :title, uniqueness: { scope: [:group_id, :project_id] } - before_save :nullify_priority - default_scope { order(title: :asc) } scope :templates, -> { where(template: true) } @@ -149,10 +148,6 @@ class Label < ActiveRecord::Base end end - def nullify_priority - self.priority = nil if priority.blank? - end - def sanitize_title(value) CGI.unescapeHTML(Sanitize.clean(value.to_s)) end diff --git a/app/models/label_priority.rb b/app/models/label_priority.rb new file mode 100644 index 00000000000..5b85e0b6533 --- /dev/null +++ b/app/models/label_priority.rb @@ -0,0 +1,8 @@ +class LabelPriority < ActiveRecord::Base + belongs_to :project + belongs_to :label + + validates :project, :label, :priority, presence: true + validates :label_id, uniqueness: { scope: :project_id } + validates :priority, numericality: { only_integer: true, greater_than_or_equal_to: 0 } +end diff --git a/db/migrate/20161014173530_create_label_priorities.rb b/db/migrate/20161014173530_create_label_priorities.rb new file mode 100644 index 00000000000..f9d94ebdc70 --- /dev/null +++ b/db/migrate/20161014173530_create_label_priorities.rb @@ -0,0 +1,55 @@ +class CreateLabelPriorities < ActiveRecord::Migration + include Gitlab::Database::MigrationHelpers + + DOWNTIME = true + DOWNTIME_REASON = 'Prioritezed labels will not work as expected until this migration is complete.' + + disable_ddl_transaction! + + def up + create_table :label_priorities do |t| + t.references :project, foreign_key: { on_delete: :cascade }, null: false + t.references :label, foreign_key: { on_delete: :cascade }, null: false + t.integer :priority, null: false + + t.timestamps null: false + end + + execute <<-EOF.strip_heredoc + INSERT INTO label_priorities (project_id, label_id, priority, created_at, updated_at) + SELECT labels.project_id, labels.id, labels.priority, NOW(), NOW() + FROM labels + WHERE labels.project_id IS NOT NULL + AND labels.priority IS NOT NULL; + EOF + + add_concurrent_index :label_priorities, [:project_id, :label_id], unique: true + add_concurrent_index :label_priorities, :priority + + remove_column :labels, :priority + end + + def down + add_column :labels, :priority, :integer + + if Gitlab::Database.mysql? + execute <<-EOF.strip_heredoc + UPDATE labels + INNER JOIN label_priorities ON labels.id = label_priorities.label_id AND labels.project_id = label_priorities.project_id + SET labels.priority = label_priorities.priority; + EOF + else + execute <<-EOF.strip_heredoc + UPDATE labels + SET priority = label_priorities.priority + FROM label_priorities + WHERE labels.id = label_priorities.label_id + AND labels.project_id = label_priorities.project_id; + EOF + end + + add_concurrent_index :labels, :priority + + drop_table :label_priorities + end +end diff --git a/db/schema.rb b/db/schema.rb index 37f0be0e834..e17fdf75f88 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -519,6 +519,17 @@ ActiveRecord::Schema.define(version: 20161017095000) do add_index "label_links", ["label_id"], name: "index_label_links_on_label_id", using: :btree add_index "label_links", ["target_id", "target_type"], name: "index_label_links_on_target_id_and_target_type", using: :btree + create_table "label_priorities", force: :cascade do |t| + t.integer "project_id", null: false + t.integer "label_id", null: false + t.integer "priority", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + end + + add_index "label_priorities", ["priority"], name: "index_label_priorities_on_priority", using: :btree + add_index "label_priorities", ["project_id", "label_id"], name: "index_label_priorities_on_project_id_and_label_id", unique: true, using: :btree + create_table "labels", force: :cascade do |t| t.string "title" t.string "color" @@ -527,14 +538,12 @@ ActiveRecord::Schema.define(version: 20161017095000) do t.datetime "updated_at" t.boolean "template", default: false t.string "description" - t.integer "priority" t.text "description_html" t.string "type" t.integer "group_id" end add_index "labels", ["group_id"], name: "index_labels_on_group_id", using: :btree - add_index "labels", ["priority"], name: "index_labels_on_priority", using: :btree add_index "labels", ["project_id"], name: "index_labels_on_project_id", using: :btree add_index "labels", ["title"], name: "index_labels_on_title", using: :btree @@ -1216,6 +1225,8 @@ ActiveRecord::Schema.define(version: 20161017095000) do add_foreign_key "boards", "projects" add_foreign_key "issue_metrics", "issues", on_delete: :cascade + add_foreign_key "label_priorities", "labels", on_delete: :cascade + add_foreign_key "label_priorities", "projects", on_delete: :cascade add_foreign_key "labels", "namespaces", column: "group_id", on_delete: :cascade add_foreign_key "lists", "boards" add_foreign_key "lists", "labels" diff --git a/spec/factories/label_priorities.rb b/spec/factories/label_priorities.rb new file mode 100644 index 00000000000..f25939d2d3e --- /dev/null +++ b/spec/factories/label_priorities.rb @@ -0,0 +1,7 @@ +FactoryGirl.define do + factory :label_priority do + project factory: :empty_project + label + sequence(:priority) + end +end diff --git a/spec/models/label_priority_spec.rb b/spec/models/label_priority_spec.rb new file mode 100644 index 00000000000..5f7fa3aa047 --- /dev/null +++ b/spec/models/label_priority_spec.rb @@ -0,0 +1,21 @@ +require 'spec_helper' + +describe LabelPriority, models: true do + describe 'relationships' do + it { is_expected.to belong_to(:project) } + it { is_expected.to belong_to(:label) } + end + + describe 'validations' do + it { is_expected.to validate_presence_of(:project) } + it { is_expected.to validate_presence_of(:label) } + it { is_expected.to validate_presence_of(:priority) } + it { is_expected.to validate_numericality_of(:priority).only_integer.is_greater_than_or_equal_to(0) } + + it 'validates uniqueness of label_id scoped to project_id' do + create(:label_priority) + + expect(subject).to validate_uniqueness_of(:label_id).scoped_to(:project_id) + end + end +end diff --git a/spec/models/label_spec.rb b/spec/models/label_spec.rb index c6e1ea19987..4af0fb6afa9 100644 --- a/spec/models/label_spec.rb +++ b/spec/models/label_spec.rb @@ -10,6 +10,7 @@ describe Label, models: true do it { is_expected.to have_many(:issues).through(:label_links).source(:target) } it { is_expected.to have_many(:label_links).dependent(:destroy) } it { is_expected.to have_many(:lists).dependent(:destroy) } + it { is_expected.to have_many(:priorities).class_name('LabelPriority') } end describe 'validation' do From 67314e95ae836365fa1989439a6379aac781a0b4 Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Fri, 14 Oct 2016 18:32:44 -0300 Subject: [PATCH 139/174] Add support to group labels prioritization on project level --- app/controllers/projects/labels_controller.rb | 13 +++++++------ app/models/label.rb | 10 ++++++---- .../projects/labels/update_prioritization_spec.rb | 8 ++++---- spec/models/label_priority_spec.rb | 1 - 4 files changed, 17 insertions(+), 15 deletions(-) diff --git a/app/controllers/projects/labels_controller.rb b/app/controllers/projects/labels_controller.rb index f4ad503c9a6..f453b70fb5d 100644 --- a/app/controllers/projects/labels_controller.rb +++ b/app/controllers/projects/labels_controller.rb @@ -12,8 +12,8 @@ class Projects::LabelsController < Projects::ApplicationController respond_to :js, :html def index - @prioritized_labels = @available_labels.prioritized - @labels = @available_labels.unprioritized.page(params[:page]) + @prioritized_labels = @available_labels.prioritized(@project) + @labels = @available_labels.unprioritized(@project).page(params[:page]) respond_to do |format| format.html @@ -84,11 +84,10 @@ class Projects::LabelsController < Projects::ApplicationController respond_to do |format| label = @available_labels.find(params[:id]) - if label.update_attribute(:priority, nil) + if label.priorities.where(project_id: project).delete_all format.json { render json: label } else - message = label.errors.full_messages.uniq.join('. ') - format.json { render json: { message: message }, status: :unprocessable_entity } + format.json { head :unprocessable_entity } end end end @@ -100,7 +99,9 @@ class Projects::LabelsController < Projects::ApplicationController params[:label_ids].each_with_index do |label_id, index| next unless label_ids.include?(label_id.to_i) - Label.where(id: label_id).update_all(priority: index) + label_priority = LabelPriority.find_or_initialize_by(project_id: @project.id, label_id: label_id) + label_priority.priority = index + label_priority.save! end end diff --git a/app/models/label.rb b/app/models/label.rb index 3ce4e253035..ea11d9d7864 100644 --- a/app/models/label.rb +++ b/app/models/label.rb @@ -32,12 +32,14 @@ class Label < ActiveRecord::Base scope :templates, -> { where(template: true) } scope :with_title, ->(title) { where(title: title) } - def self.prioritized - where.not(priority: nil).reorder(:priority, :title) + def self.prioritized(project) + joins(:priorities) + .where(label_priorities: { project_id: project }) + .reorder('label_priorities.priority ASC, labels.title ASC') end - def self.unprioritized - where(priority: nil) + def self.unprioritized(project) + where.not(id: prioritized(project).select(:id)) end alias_attribute :name, :title diff --git a/spec/features/projects/labels/update_prioritization_spec.rb b/spec/features/projects/labels/update_prioritization_spec.rb index 84a12a38c26..c9fa8315e79 100644 --- a/spec/features/projects/labels/update_prioritization_spec.rb +++ b/spec/features/projects/labels/update_prioritization_spec.rb @@ -35,7 +35,7 @@ feature 'Prioritize labels', feature: true do end scenario 'user can unprioritize a group label', js: true do - feature.update(priority: 1) + create(:label_priority, project: project, label: feature, priority: 1) visit namespace_project_labels_path(project.namespace, project) @@ -70,7 +70,7 @@ feature 'Prioritize labels', feature: true do end scenario 'user can unprioritize a project label', js: true do - bug.update(priority: 1) + create(:label_priority, project: project, label: bug, priority: 1) visit namespace_project_labels_path(project.namespace, project) @@ -89,8 +89,8 @@ feature 'Prioritize labels', feature: true do end scenario 'user can sort prioritized labels and persist across reloads', js: true do - bug.update(priority: 1) - feature.update(priority: 2) + create(:label_priority, project: project, label: bug, priority: 1) + create(:label_priority, project: project, label: feature, priority: 2) visit namespace_project_labels_path(project.namespace, project) diff --git a/spec/models/label_priority_spec.rb b/spec/models/label_priority_spec.rb index 5f7fa3aa047..d18c2f7949a 100644 --- a/spec/models/label_priority_spec.rb +++ b/spec/models/label_priority_spec.rb @@ -9,7 +9,6 @@ describe LabelPriority, models: true do describe 'validations' do it { is_expected.to validate_presence_of(:project) } it { is_expected.to validate_presence_of(:label) } - it { is_expected.to validate_presence_of(:priority) } it { is_expected.to validate_numericality_of(:priority).only_integer.is_greater_than_or_equal_to(0) } it 'validates uniqueness of label_id scoped to project_id' do From 99e928f103182b58156edb107b55344eaafc6772 Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Fri, 14 Oct 2016 18:51:34 -0300 Subject: [PATCH 140/174] Add restriction to number of permitted priorities per project label --- app/models/project_label.rb | 9 +++++++++ spec/models/project_label_spec.rb | 13 ++++++++++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/app/models/project_label.rb b/app/models/project_label.rb index 5b739bcdadf..f863d442c21 100644 --- a/app/models/project_label.rb +++ b/app/models/project_label.rb @@ -1,8 +1,11 @@ class ProjectLabel < Label + NUMBER_OF_PRIORITIES = 1 + belongs_to :project validates :project, presence: true + validate :permitted_numbers_of_priorities validate :title_must_not_exist_at_group_level delegate :group, to: :project, allow_nil: true @@ -20,4 +23,10 @@ class ProjectLabel < Label errors.add(:title, :label_already_exists_at_group_level, group: group.name) end end + + def permitted_numbers_of_priorities + if priorities && priorities.size >= NUMBER_OF_PRIORITIES + errors.add(:priorities, 'Number of permitted priorities exceeded') + end + end end diff --git a/spec/models/project_label_spec.rb b/spec/models/project_label_spec.rb index c861d4b73bb..cd4732fb737 100644 --- a/spec/models/project_label_spec.rb +++ b/spec/models/project_label_spec.rb @@ -48,7 +48,18 @@ describe ProjectLabel, models: true do project_label.valid? - expect(project_label .errors[:title]).to be_empty + expect(project_label.errors[:title]).to be_empty + end + end + + context 'when attempting to add more than one priority to the project label' do + it 'returns error' do + subject.priorities.build + subject.priorities.build + + subject.valid? + + expect(subject.errors[:priorities]).to include 'Number of permitted priorities exceeded' end end end From 3c2aaec1f2624ad4817e7ac52120985682afa448 Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Fri, 14 Oct 2016 20:06:26 -0300 Subject: [PATCH 141/174] Fix sorting by label priorities --- app/models/concerns/issuable.rb | 3 +- app/models/concerns/sortable.rb | 6 ++-- app/models/label.rb | 11 ++++++ app/models/todo.rb | 2 +- .../projects/labels_controller_spec.rb | 35 +++++++++++-------- spec/factories/labels.rb | 10 ++++++ 6 files changed, 49 insertions(+), 18 deletions(-) diff --git a/app/models/concerns/issuable.rb b/app/models/concerns/issuable.rb index 76de927ceab..d726cb6b7aa 100644 --- a/app/models/concerns/issuable.rb +++ b/app/models/concerns/issuable.rb @@ -146,7 +146,8 @@ module Issuable def order_labels_priority(excluded_labels: []) condition_field = "#{table_name}.id" - highest_priority = highest_label_priority(name, condition_field, excluded_labels: excluded_labels).to_sql + project_field = "#{table_name}.project_id" + highest_priority = highest_label_priority(name, project_field, condition_field, excluded_labels: excluded_labels).to_sql select("#{table_name}.*, (#{highest_priority}) AS highest_priority"). group(arel_table[:id]). diff --git a/app/models/concerns/sortable.rb b/app/models/concerns/sortable.rb index 1ebecd86af9..83e551fd152 100644 --- a/app/models/concerns/sortable.rb +++ b/app/models/concerns/sortable.rb @@ -38,10 +38,12 @@ module Sortable private - def highest_label_priority(object_types, condition_field, excluded_labels: []) - query = Label.select(Label.arel_table[:priority].minimum). + def highest_label_priority(object_types, project_field, condition_field, excluded_labels: []) + query = Label.select(LabelPriority.arel_table[:priority].minimum). + left_join_priorities. joins(:label_links). where(label_links: { target_type: object_types }). + where("label_priorities.project_id = #{project_field}"). where("label_links.target_id = #{condition_field}"). reorder(nil) diff --git a/app/models/label.rb b/app/models/label.rb index ea11d9d7864..1d775a83f96 100644 --- a/app/models/label.rb +++ b/app/models/label.rb @@ -42,6 +42,17 @@ class Label < ActiveRecord::Base where.not(id: prioritized(project).select(:id)) end + def self.left_join_priorities + labels = Label.arel_table + priorities = LabelPriority.arel_table + + label_priorities = labels.join(priorities, Arel::Nodes::OuterJoin). + on(labels[:id].eq(priorities[:label_id])). + join_sources + + joins(label_priorities) + end + alias_attribute :name, :title def self.reference_prefix diff --git a/app/models/todo.rb b/app/models/todo.rb index 6ae9956ade5..fd90a893d2e 100644 --- a/app/models/todo.rb +++ b/app/models/todo.rb @@ -52,7 +52,7 @@ class Todo < ActiveRecord::Base # Todos with highest priority first then oldest todos # Need to order by created_at last because of differences on Mysql and Postgres when joining by type "Merge_request/Issue" def order_by_labels_priority - highest_priority = highest_label_priority(["Issue", "MergeRequest"], "todos.target_id").to_sql + highest_priority = highest_label_priority(["Issue", "MergeRequest"], "todos.project_id", "todos.target_id").to_sql select("#{table_name}.*, (#{highest_priority}) AS highest_priority"). order(Gitlab::Database.nulls_last_order('highest_priority', 'ASC')). diff --git a/spec/controllers/projects/labels_controller_spec.rb b/spec/controllers/projects/labels_controller_spec.rb index 29251f49810..622ab154493 100644 --- a/spec/controllers/projects/labels_controller_spec.rb +++ b/spec/controllers/projects/labels_controller_spec.rb @@ -15,21 +15,28 @@ describe Projects::LabelsController do let!(:label_1) { create(:label, project: project, priority: 1, title: 'Label 1') } let!(:label_2) { create(:label, project: project, priority: 3, title: 'Label 2') } let!(:label_3) { create(:label, project: project, priority: 1, title: 'Label 3') } - let!(:label_4) { create(:label, project: project, priority: nil, title: 'Label 4') } - let!(:label_5) { create(:label, project: project, priority: nil, title: 'Label 5') } + let!(:label_4) { create(:label, project: project, title: 'Label 4') } + let!(:label_5) { create(:label, project: project, title: 'Label 5') } - let!(:group_label_1) { create(:group_label, group: group, priority: 3, title: 'Group Label 1') } - let!(:group_label_2) { create(:group_label, group: group, priority: 1, title: 'Group Label 2') } - let!(:group_label_3) { create(:group_label, group: group, priority: nil, title: 'Group Label 3') } - let!(:group_label_4) { create(:group_label, group: group, priority: nil, title: 'Group Label 4') } + let!(:group_label_1) { create(:group_label, group: group, title: 'Group Label 1') } + let!(:group_label_2) { create(:group_label, group: group, title: 'Group Label 2') } + let!(:group_label_3) { create(:group_label, group: group, title: 'Group Label 3') } + let!(:group_label_4) { create(:group_label, group: group, title: 'Group Label 4') } + + before do + create(:label_priority, project: project, label: group_label_1, priority: 3) + create(:label_priority, project: project, label: group_label_2, priority: 1) + end context '@prioritized_labels' do before do list_labels end - it 'contains only prioritized labels' do - expect(assigns(:prioritized_labels)).to all(have_attributes(priority: a_value > 0)) + it 'does not include labels without priority' do + list_labels + + expect(assigns(:prioritized_labels)).not_to include(group_label_3, group_label_4, label_4, label_5) end it 'is sorted by priority, then label title' do @@ -38,18 +45,18 @@ describe Projects::LabelsController do end context '@labels' do - it 'contains only unprioritized labels' do - list_labels - - expect(assigns(:labels)).to all(have_attributes(priority: nil)) - end - it 'is sorted by label title' do list_labels expect(assigns(:labels)).to eq [group_label_3, group_label_4, label_4, label_5] end + it 'does not include labels with priority' do + list_labels + + expect(assigns(:labels)).not_to include(group_label_2, label_1, label_3, group_label_1, label_2) + end + it 'does not include group labels when project does not belong to a group' do project.update(namespace: create(:namespace)) diff --git a/spec/factories/labels.rb b/spec/factories/labels.rb index 5c789d72bac..3e8822faf97 100644 --- a/spec/factories/labels.rb +++ b/spec/factories/labels.rb @@ -3,6 +3,16 @@ FactoryGirl.define do sequence(:title) { |n| "label#{n}" } color "#990000" project + + transient do + priority nil + end + + after(:create) do |label, evaluator| + if evaluator.priority + label.priorities.create(project: label.project, priority: evaluator.priority) + end + end end factory :group_label, class: GroupLabel do From 86e0b5d643df21503281115774da550e06a4e878 Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Fri, 14 Oct 2016 20:51:41 -0300 Subject: [PATCH 142/174] Fix issue board related controllers to expose label priority per project --- app/controllers/projects/boards/issues_controller.rb | 4 ++-- app/controllers/projects/boards/lists_controller.rb | 5 ++--- app/models/issue.rb | 12 ++++++++++++ app/models/label.rb | 6 ++++++ app/models/list.rb | 11 +++++++++++ spec/fixtures/api/schemas/list.json | 2 +- 6 files changed, 34 insertions(+), 6 deletions(-) diff --git a/app/controllers/projects/boards/issues_controller.rb b/app/controllers/projects/boards/issues_controller.rb index 71eb56aed0b..a2b01ff43dc 100644 --- a/app/controllers/projects/boards/issues_controller.rb +++ b/app/controllers/projects/boards/issues_controller.rb @@ -72,10 +72,10 @@ module Projects def serialize_as_json(resource) resource.as_json( + labels: true, only: [:iid, :title, :confidential], include: { - assignee: { only: [:id, :name, :username], methods: [:avatar_url] }, - labels: { only: [:id, :title, :description, :color, :priority], methods: [:text_color] } + assignee: { only: [:id, :name, :username], methods: [:avatar_url] } }) end end diff --git a/app/controllers/projects/boards/lists_controller.rb b/app/controllers/projects/boards/lists_controller.rb index 76ae41319c4..67e3c9add81 100644 --- a/app/controllers/projects/boards/lists_controller.rb +++ b/app/controllers/projects/boards/lists_controller.rb @@ -76,9 +76,8 @@ module Projects resource.as_json( only: [:id, :list_type, :position], methods: [:title], - include: { - label: { only: [:id, :title, :description, :color, :priority] } - }) + label: true + ) end end end diff --git a/app/models/issue.rb b/app/models/issue.rb index abd58e0454a..f7ccce2924a 100644 --- a/app/models/issue.rb +++ b/app/models/issue.rb @@ -274,4 +274,16 @@ class Issue < ActiveRecord::Base def check_for_spam? project.public? end + + def as_json(options = {}) + super(options).tap do |json| + if options.has_key?(:labels) + json[:labels] = labels.as_json( + project: project, + only: [:id, :title, :description, :color], + methods: [:text_color] + ) + end + end + end end diff --git a/app/models/label.rb b/app/models/label.rb index 1d775a83f96..6fd45d251a8 100644 --- a/app/models/label.rb +++ b/app/models/label.rb @@ -133,6 +133,12 @@ class Label < ActiveRecord::Base end end + def as_json(options = {}) + super(options).tap do |json| + json[:priority] = priorities.find_by(project: options[:project]).try(:priority) if options.has_key?(:project) + end + end + private def cross_project_reference?(source_project, target_project) diff --git a/app/models/list.rb b/app/models/list.rb index eb87decdbc8..065d75bd1dc 100644 --- a/app/models/list.rb +++ b/app/models/list.rb @@ -26,6 +26,17 @@ class List < ActiveRecord::Base label? ? label.name : list_type.humanize end + def as_json(options = {}) + super(options).tap do |json| + if options.has_key?(:label) + json[:label] = label.as_json( + project: board.project, + only: [:id, :title, :description, :color] + ) + end + end + end + private def can_be_destroyed diff --git a/spec/fixtures/api/schemas/list.json b/spec/fixtures/api/schemas/list.json index f070fa3b254..8d94cf26ecb 100644 --- a/spec/fixtures/api/schemas/list.json +++ b/spec/fixtures/api/schemas/list.json @@ -13,7 +13,7 @@ "enum": ["backlog", "label", "done"] }, "label": { - "type": ["object"], + "type": ["object", "null"], "required": [ "id", "color", From 9cb123843474d60c452c02bf5701f11769661829 Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Sat, 15 Oct 2016 12:23:16 -0300 Subject: [PATCH 143/174] Fix project issues labels feature spec --- features/steps/project/issues/labels.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/features/steps/project/issues/labels.rb b/features/steps/project/issues/labels.rb index 2937d5d7ca8..f74a9b5df47 100644 --- a/features/steps/project/issues/labels.rb +++ b/features/steps/project/issues/labels.rb @@ -8,7 +8,7 @@ class Spinach::Features::ProjectIssuesLabels < Spinach::FeatureSteps end step 'I remove label \'bug\'' do - page.within "#label_#{bug_label.id}" do + page.within "#project_label_#{bug_label.id}" do first(:link, 'Delete').click end end From 074c964913218e99c42f0d8b5855c4ad2ad93267 Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Sat, 15 Oct 2016 12:46:20 -0300 Subject: [PATCH 144/174] Add label type to group and project labels lists --- app/assets/stylesheets/pages/labels.scss | 16 +++++++++- app/views/groups/labels/index.html.haml | 2 +- app/views/shared/_label_row.html.haml | 2 ++ ...161017125927_add_unique_index_to_labels.rb | 32 +++++++++++++++++++ db/schema.rb | 5 ++- 5 files changed, 52 insertions(+), 5 deletions(-) create mode 100644 db/migrate/20161017125927_add_unique_index_to_labels.rb diff --git a/app/assets/stylesheets/pages/labels.scss b/app/assets/stylesheets/pages/labels.scss index 9bac6d46355..2f7f7325877 100644 --- a/app/assets/stylesheets/pages/labels.scss +++ b/app/assets/stylesheets/pages/labels.scss @@ -66,7 +66,21 @@ text-overflow: ellipsis; vertical-align: middle; max-width: 100%; - } + } + } + + .label-type { + display: block; + margin-bottom: 10px; + margin-left: 50px; + + @media (min-width: $screen-sm-min) { + display: inline-block; + width: 100px; + margin-left: 10px; + margin-bottom: 0; + vertical-align: middle; + } } .label-description { diff --git a/app/views/groups/labels/index.html.haml b/app/views/groups/labels/index.html.haml index 6c69e3465f4..70783a63409 100644 --- a/app/views/groups/labels/index.html.haml +++ b/app/views/groups/labels/index.html.haml @@ -2,7 +2,7 @@ .top-area.adjust .nav-text - Labels can be applied to issues and merge requests. + Labels can be applied to issues and merge requests. Group labels are available for any project within the group. .nav-controls - if can?(current_user, :admin_label, @group) diff --git a/app/views/shared/_label_row.html.haml b/app/views/shared/_label_row.html.haml index 813ce4f1405..76c3327fefc 100644 --- a/app/views/shared/_label_row.html.haml +++ b/app/views/shared/_label_row.html.haml @@ -10,6 +10,8 @@ = icon('star') %span.label-name = link_to_label(label, subject: @project, tooltip: false) + %span.label-type + = label.model_name.human.titleize - if label.description %span.label-description = markdown_field(label, :description) diff --git a/db/migrate/20161017125927_add_unique_index_to_labels.rb b/db/migrate/20161017125927_add_unique_index_to_labels.rb new file mode 100644 index 00000000000..16ae38612de --- /dev/null +++ b/db/migrate/20161017125927_add_unique_index_to_labels.rb @@ -0,0 +1,32 @@ +class AddUniqueIndexToLabels < ActiveRecord::Migration + include Gitlab::Database::MigrationHelpers + + DOWNTIME = true + DOWNTIME_REASON = 'This migration removes duplicated labels.' + + disable_ddl_transaction! + + def up + select_all('SELECT title, COUNT(id) as cnt FROM labels GROUP BY project_id, title HAVING COUNT(id) > 1').each do |label| + label_title = quote_string(label['title']) + duplicated_ids = select_all("SELECT id FROM labels WHERE title = '#{label_title}' ORDER BY id ASC").map{ |label| label['id'] } + label_id = duplicated_ids.first + duplicated_ids.delete(label_id) + + execute("UPDATE label_links SET label_id = #{label_id} WHERE label_id IN(#{duplicated_ids.join(",")})") + execute("DELETE FROM labels WHERE id IN(#{duplicated_ids.join(",")})") + end + + remove_index :labels, column: :project_id if index_exists?(:labels, :project_id) + remove_index :labels, column: :title if index_exists?(:labels, :title) + + add_concurrent_index :labels, [:group_id, :project_id, :title], unique: true + end + + def down + remove_index :labels, column: [:group_id, :project_id, :title] if index_exists?(:labels, [:group_id, :project_id, :title], unique: true) + + add_concurrent_index :labels, :project_id + add_concurrent_index :labels, :title + end +end diff --git a/db/schema.rb b/db/schema.rb index e17fdf75f88..f9353290abf 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20161017095000) do +ActiveRecord::Schema.define(version: 20161017125927) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -543,9 +543,8 @@ ActiveRecord::Schema.define(version: 20161017095000) do t.integer "group_id" end + add_index "labels", ["group_id", "project_id", "title"], name: "index_labels_on_group_id_and_project_id_and_title", unique: true, using: :btree add_index "labels", ["group_id"], name: "index_labels_on_group_id", using: :btree - add_index "labels", ["project_id"], name: "index_labels_on_project_id", using: :btree - add_index "labels", ["title"], name: "index_labels_on_title", using: :btree create_table "lfs_objects", force: :cascade do |t| t.string "oid", null: false From 530aae9080942646b130510e970d9d82c009d8e5 Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Mon, 17 Oct 2016 16:34:22 -0200 Subject: [PATCH 145/174] Abstract LabelPriority away into methods on Label model --- app/controllers/projects/labels_controller.rb | 14 ++--- app/models/label.rb | 16 ++++- spec/models/label_spec.rb | 58 +++++++++++++++++++ 3 files changed, 79 insertions(+), 9 deletions(-) diff --git a/app/controllers/projects/labels_controller.rb b/app/controllers/projects/labels_controller.rb index f453b70fb5d..42fd09e9b7e 100644 --- a/app/controllers/projects/labels_controller.rb +++ b/app/controllers/projects/labels_controller.rb @@ -84,7 +84,7 @@ class Projects::LabelsController < Projects::ApplicationController respond_to do |format| label = @available_labels.find(params[:id]) - if label.priorities.where(project_id: project).delete_all + if label.unprioritize!(project) format.json { render json: label } else format.json { head :unprocessable_entity } @@ -94,14 +94,12 @@ class Projects::LabelsController < Projects::ApplicationController def set_priorities Label.transaction do - label_ids = @available_labels.where(id: params[:label_ids]).pluck(:id) + available_labels_ids = @available_labels.where(id: params[:label_ids]).pluck(:id) + label_ids = params[:label_ids].select { |id| available_labels_ids.include?(id.to_i) } - params[:label_ids].each_with_index do |label_id, index| - next unless label_ids.include?(label_id.to_i) - - label_priority = LabelPriority.find_or_initialize_by(project_id: @project.id, label_id: label_id) - label_priority.priority = index - label_priority.save! + label_ids.each_with_index do |label_id, index| + label = @available_labels.find(label_id) + label.prioritize!(project, index) end end diff --git a/app/models/label.rb b/app/models/label.rb index 6fd45d251a8..ae07e8f60e1 100644 --- a/app/models/label.rb +++ b/app/models/label.rb @@ -97,6 +97,20 @@ class Label < ActiveRecord::Base merge_requests_count(user, project_id: project.try(:id) || project_id, state: 'opened') end + def prioritize!(project, value) + label_priority = priorities.find_or_initialize_by(project_id: project.id) + label_priority.priority = value + label_priority.save! + end + + def unprioritize!(project) + priorities.where(project: project).delete_all + end + + def priority(project) + priorities.find_by(project: project).try(:priority) + end + def template? template end @@ -135,7 +149,7 @@ class Label < ActiveRecord::Base def as_json(options = {}) super(options).tap do |json| - json[:priority] = priorities.find_by(project: options[:project]).try(:priority) if options.has_key?(:project) + json[:priority] = priority(options[:project]) if options.has_key?(:project) end end diff --git a/spec/models/label_spec.rb b/spec/models/label_spec.rb index 4af0fb6afa9..0c163659a71 100644 --- a/spec/models/label_spec.rb +++ b/spec/models/label_spec.rb @@ -46,4 +46,62 @@ describe Label, models: true do expect(label.title).to eq('foo & bar?') end end + + describe 'priorization' do + subject(:label) { create(:label) } + + let(:project) { label.project } + + describe '#prioritize!' do + context 'when label is not prioritized' do + it 'creates a label priority' do + expect { label.prioritize!(project, 1) }.to change(label.priorities, :count).by(1) + end + + it 'sets label priority' do + label.prioritize!(project, 1) + + expect(label.priorities.first.priority).to eq 1 + end + end + + context 'when label is prioritized' do + let!(:priority) { create(:label_priority, project: project, label: label, priority: 0) } + + it 'does not create a label priority' do + expect { label.prioritize!(project, 1) }.not_to change(label.priorities, :count) + end + + it 'updates label priority' do + label.prioritize!(project, 1) + + expect(priority.reload.priority).to eq 1 + end + end + end + + describe '#unprioritize!' do + it 'removes label priority' do + create(:label_priority, project: project, label: label, priority: 0) + + expect { label.unprioritize!(project) }.to change(label.priorities, :count).by(-1) + end + end + + describe '#priority' do + context 'when label is not prioritized' do + it 'returns nil' do + expect(label.priority(project)).to be_nil + end + end + + context 'when label is prioritized' do + it 'returns label priority' do + create(:label_priority, project: project, label: label, priority: 1) + + expect(label.priority(project)).to eq 1 + end + end + end + end end From 1e5ea6e7e05cd45fc56d0341ac8b5c32e57779b5 Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Mon, 17 Oct 2016 16:55:46 -0200 Subject: [PATCH 146/174] Return only labels that user have access on IssuableFinder#labels --- app/finders/issuable_finder.rb | 13 +++++-------- app/finders/labels_finder.rb | 4 ++-- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/app/finders/issuable_finder.rb b/app/finders/issuable_finder.rb index 41ea8f801c1..e27986ef95b 100644 --- a/app/finders/issuable_finder.rb +++ b/app/finders/issuable_finder.rb @@ -124,15 +124,12 @@ class IssuableFinder def labels return @labels if defined?(@labels) - if labels? && !filter_by_no_label? - @labels = Label.where(title: label_names) - - if projects - @labels = LabelsFinder.new(current_user, project_ids: projects, title: label_names).execute + @labels = + if labels? && !filter_by_no_label? + LabelsFinder.new(current_user, project_ids: projects, title: label_names).execute + else + Label.none end - else - @labels = Label.none - end end def assignee? diff --git a/app/finders/labels_finder.rb b/app/finders/labels_finder.rb index 5ee2e1ee6e8..48fd1280ed2 100644 --- a/app/finders/labels_finder.rb +++ b/app/finders/labels_finder.rb @@ -45,7 +45,7 @@ class LabelsFinder < UnionFinder params[:project_id].presence end - def project_ids + def projects_ids params[:project_ids].presence end @@ -70,7 +70,7 @@ class LabelsFinder < UnionFinder @projects = available_projects @projects = @projects.in_namespace(group_id) if group_id - @projects = @projects.where(id: project_ids) if project_ids + @projects = @projects.where(id: projects_ids) if projects_ids @projects = @projects.reorder(nil) @projects From d3b76e832f0afc38e2d0ffdff540c708a74ac26c Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Mon, 17 Oct 2016 17:30:49 -0200 Subject: [PATCH 147/174] Reuse LabelsFinder on Banzai::Filter::LabelReferenceFilter --- app/finders/labels_finder.rb | 18 ++++++++++++++---- lib/banzai/filter/label_reference_filter.rb | 8 +------- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/app/finders/labels_finder.rb b/app/finders/labels_finder.rb index 48fd1280ed2..65db4184ecf 100644 --- a/app/finders/labels_finder.rb +++ b/app/finders/labels_finder.rb @@ -4,7 +4,9 @@ class LabelsFinder < UnionFinder @params = params end - def execute + def execute(authorized_only: true) + @authorized_only = authorized_only + items = find_union(label_ids, Label) items = with_title(items) sort(items) @@ -12,7 +14,7 @@ class LabelsFinder < UnionFinder private - attr_reader :current_user, :params + attr_reader :current_user, :params, :authorized_only def label_ids label_ids = [] @@ -57,7 +59,7 @@ class LabelsFinder < UnionFinder return @project if defined?(@project) if project_id - @project = available_projects.find(project_id) rescue nil + @project = find_project else @project = nil end @@ -65,10 +67,18 @@ class LabelsFinder < UnionFinder @project end + def find_project + if authorized_only + available_projects.find_by(id: project_id) + else + Project.find_by(id: project_id) + end + end + def projects return @projects if defined?(@projects) - @projects = available_projects + @projects = authorized_only ? available_projects : Project.all @projects = @projects.in_namespace(group_id) if group_id @projects = @projects.where(id: projects_ids) if projects_ids @projects = @projects.reorder(nil) diff --git a/lib/banzai/filter/label_reference_filter.rb b/lib/banzai/filter/label_reference_filter.rb index 21085ae6d49..c24831e68ee 100644 --- a/lib/banzai/filter/label_reference_filter.rb +++ b/lib/banzai/filter/label_reference_filter.rb @@ -39,13 +39,7 @@ module Banzai end def find_labels(project) - label_ids = [] - label_ids << project.group.labels.select(:id) if project.group.present? - label_ids << project.labels.select(:id) - - union = Gitlab::SQL::Union.new(label_ids) - - Label.where("labels.id IN (#{union.to_sql})") + LabelsFinder.new(nil, project_id: project.id).execute(authorized_only: false) end # Parameters to pass to `Label.find_by` based on the given arguments From 8379fbcd47930320bf4dd6a3ac41c6efd427a91a Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Mon, 17 Oct 2016 17:48:46 -0200 Subject: [PATCH 148/174] Add subject to group and projects labels which return group/project --- app/helpers/labels_helper.rb | 10 ++-------- app/models/group_label.rb | 2 ++ app/models/project_label.rb | 2 ++ spec/models/group_label_spec.rb | 8 ++++++++ spec/models/project_label_spec.rb | 8 ++++++++ 5 files changed, 22 insertions(+), 8 deletions(-) diff --git a/app/helpers/labels_helper.rb b/app/helpers/labels_helper.rb index af8741f5e06..a1d7713b45f 100644 --- a/app/helpers/labels_helper.rb +++ b/app/helpers/labels_helper.rb @@ -14,7 +14,7 @@ module LabelsHelper # # Examples: # - # # Allow the generated link to use the label's own project + # # Allow the generated link to use the label's own subject # link_to_label(label) # # # Force the generated link to use a provided group @@ -31,13 +31,7 @@ module LabelsHelper # # Returns a String def link_to_label(label, subject: nil, type: :issue, tooltip: true, css_class: nil, &block) - subject ||= - case label - when GroupLabel then label.group - when ProjectLabel then label.project - end - - link = label_filter_path(subject, label, type: type) + link = label_filter_path(subject || label.subject, label, type: type) if block_given? link_to link, class: css_class, &block diff --git a/app/models/group_label.rb b/app/models/group_label.rb index a1d8d087726..a698b532d19 100644 --- a/app/models/group_label.rb +++ b/app/models/group_label.rb @@ -3,6 +3,8 @@ class GroupLabel < Label validates :group, presence: true + alias_attribute :subject, :group + def to_reference(source_project = nil, target_project = nil, format: :id) super(source_project, target_project, format: format) end diff --git a/app/models/project_label.rb b/app/models/project_label.rb index f863d442c21..0a79521ed09 100644 --- a/app/models/project_label.rb +++ b/app/models/project_label.rb @@ -10,6 +10,8 @@ class ProjectLabel < Label delegate :group, to: :project, allow_nil: true + alias_attribute :subject, :project + def to_reference(target_project = nil, format: :id) super(project, target_project, format: format) end diff --git a/spec/models/group_label_spec.rb b/spec/models/group_label_spec.rb index 92b07a3cd44..85eb889225b 100644 --- a/spec/models/group_label_spec.rb +++ b/spec/models/group_label_spec.rb @@ -9,6 +9,14 @@ describe GroupLabel, models: true do it { is_expected.to validate_presence_of(:group) } end + describe '#subject' do + it 'aliases group to subject' do + subject = described_class.new(group: build(:group)) + + expect(subject.subject).to be(subject.group) + end + end + describe '#to_reference' do let(:label) { create(:group_label) } diff --git a/spec/models/project_label_spec.rb b/spec/models/project_label_spec.rb index cd4732fb737..18c9d449ee5 100644 --- a/spec/models/project_label_spec.rb +++ b/spec/models/project_label_spec.rb @@ -64,6 +64,14 @@ describe ProjectLabel, models: true do end end + describe '#subject' do + it 'aliases project to subject' do + subject = described_class.new(project: build(:empty_project)) + + expect(subject.subject).to be(subject.project) + end + end + describe '#to_reference' do let(:label) { create(:label) } From 928acba4c0ae31626dac621f0f240f18cbad548a Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Mon, 17 Oct 2016 18:03:06 -0200 Subject: [PATCH 149/174] Use keyword arguments on Sortable#highest_label_priority --- app/models/concerns/issuable.rb | 11 ++++++++--- app/models/concerns/sortable.rb | 8 ++++---- app/models/todo.rb | 8 +++++++- 3 files changed, 19 insertions(+), 8 deletions(-) diff --git a/app/models/concerns/issuable.rb b/app/models/concerns/issuable.rb index d726cb6b7aa..245a865bcba 100644 --- a/app/models/concerns/issuable.rb +++ b/app/models/concerns/issuable.rb @@ -145,9 +145,14 @@ module Issuable end def order_labels_priority(excluded_labels: []) - condition_field = "#{table_name}.id" - project_field = "#{table_name}.project_id" - highest_priority = highest_label_priority(name, project_field, condition_field, excluded_labels: excluded_labels).to_sql + params = { + target_type: name, + target_column: "#{table_name}.id", + project_column: "#{table_name}.project_id", + excluded_labels: excluded_labels + } + + highest_priority = highest_label_priority(params).to_sql select("#{table_name}.*, (#{highest_priority}) AS highest_priority"). group(arel_table[:id]). diff --git a/app/models/concerns/sortable.rb b/app/models/concerns/sortable.rb index 83e551fd152..12b23f00769 100644 --- a/app/models/concerns/sortable.rb +++ b/app/models/concerns/sortable.rb @@ -38,13 +38,13 @@ module Sortable private - def highest_label_priority(object_types, project_field, condition_field, excluded_labels: []) + def highest_label_priority(target_type:, target_column:, project_column:, excluded_labels: []) query = Label.select(LabelPriority.arel_table[:priority].minimum). left_join_priorities. joins(:label_links). - where(label_links: { target_type: object_types }). - where("label_priorities.project_id = #{project_field}"). - where("label_links.target_id = #{condition_field}"). + where("label_priorities.project_id = #{project_column}"). + where(label_links: { target_type: target_type }). + where("label_links.target_id = #{target_column}"). reorder(nil) query.where.not(title: excluded_labels) if excluded_labels.present? diff --git a/app/models/todo.rb b/app/models/todo.rb index fd90a893d2e..11c072dd000 100644 --- a/app/models/todo.rb +++ b/app/models/todo.rb @@ -52,7 +52,13 @@ class Todo < ActiveRecord::Base # Todos with highest priority first then oldest todos # Need to order by created_at last because of differences on Mysql and Postgres when joining by type "Merge_request/Issue" def order_by_labels_priority - highest_priority = highest_label_priority(["Issue", "MergeRequest"], "todos.project_id", "todos.target_id").to_sql + params = { + target_type: ['Issue', 'MergeRequest'], + target_column: "todos.target_id", + project_column: "todos.project_id" + } + + highest_priority = highest_label_priority(params).to_sql select("#{table_name}.*, (#{highest_priority}) AS highest_priority"). order(Gitlab::Database.nulls_last_order('highest_priority', 'ASC')). From 301264beada6aaf7dd0e4244c3f41131f9b4f359 Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Mon, 17 Oct 2016 18:50:49 -0200 Subject: [PATCH 150/174] Fix sorting merge requests by priority --- app/models/concerns/issuable.rb | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/app/models/concerns/issuable.rb b/app/models/concerns/issuable.rb index 245a865bcba..9a9b562af02 100644 --- a/app/models/concerns/issuable.rb +++ b/app/models/concerns/issuable.rb @@ -145,10 +145,16 @@ module Issuable end def order_labels_priority(excluded_labels: []) + project_column = + case table_name + when Issue.table_name then "#{table_name}.project_id" + when MergeRequest.table_name then "#{table_name}.target_project_id" + end + params = { target_type: name, target_column: "#{table_name}.id", - project_column: "#{table_name}.project_id", + project_column: project_column, excluded_labels: excluded_labels } From 49ec98d1b2ca6f57f3f9434a0be0018fa5a53681 Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Mon, 17 Oct 2016 22:39:21 -0200 Subject: [PATCH 151/174] Recreates the label priorities when moving project to another group --- app/services/labels/transfer_service.rb | 3 ++- spec/services/labels/transfer_service_spec.rb | 10 ++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/app/services/labels/transfer_service.rb b/app/services/labels/transfer_service.rb index 04312c114ef..559d2860d97 100644 --- a/app/services/labels/transfer_service.rb +++ b/app/services/labels/transfer_service.rb @@ -14,7 +14,7 @@ module Labels return unless group.present? Label.transaction do - labels_to_transfer = Label.where(id: label_links.select(:label_id).uniq) + labels_to_transfer = Label.where(id: label_links.select(:label_id)) labels_to_transfer.find_each do |label| new_label_id = find_or_create_label!(label) @@ -22,6 +22,7 @@ module Labels next if new_label_id == label.id LabelLink.where(label_id: label.id).update_all(label_id: new_label_id) + LabelPriority.where(project_id: project.id, label_id: label.id).update_all(label_id: new_label_id) end end end diff --git a/spec/services/labels/transfer_service_spec.rb b/spec/services/labels/transfer_service_spec.rb index a72a05f6c99..cb09c16698a 100644 --- a/spec/services/labels/transfer_service_spec.rb +++ b/spec/services/labels/transfer_service_spec.rb @@ -26,6 +26,16 @@ describe Labels::TransferService, services: true do expect { service.execute }.to change(project.labels, :count).by(2) end + it 'recreates label priorities related to the missing group labels' do + create(:label_priority, project: project, label: group_label_1, priority: 1) + + service.execute + + new_project_label = project.labels.find_by(title: group_label_1.title) + expect(new_project_label.id).not_to eq group_label_1.id + expect(new_project_label.priorities).not_to be_empty + end + it 'does not recreate missing group labels that are not applied to issues or merge requests' do service.execute From 6c189dcc8e76d5ddb348832500b003bf0d1b49a6 Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Tue, 18 Oct 2016 00:11:33 -0200 Subject: [PATCH 152/174] Add service to create project labels --- app/services/labels/create_service.rb | 33 +++++++++++++ spec/services/labels/create_service_spec.rb | 51 +++++++++++++++++++++ 2 files changed, 84 insertions(+) create mode 100644 app/services/labels/create_service.rb create mode 100644 spec/services/labels/create_service_spec.rb diff --git a/app/services/labels/create_service.rb b/app/services/labels/create_service.rb new file mode 100644 index 00000000000..bb475ce741d --- /dev/null +++ b/app/services/labels/create_service.rb @@ -0,0 +1,33 @@ +module Labels + class CreateService + def initialize(current_user, project, params = {}) + @current_user = current_user + @group = project.group + @project = project + @params = params.dup + end + + def execute + find_or_create_label + end + + private + + attr_reader :current_user, :group, :project, :params + + def available_labels + @available_labels ||= LabelsFinder.new(current_user, project_id: project.id).execute + end + + def find_or_create_label + new_label = available_labels.find_by(title: title) + new_label ||= project.labels.create(params) + + new_label + end + + def title + params[:title] || params[:name] + end + end +end diff --git a/spec/services/labels/create_service_spec.rb b/spec/services/labels/create_service_spec.rb new file mode 100644 index 00000000000..1e4bc294b46 --- /dev/null +++ b/spec/services/labels/create_service_spec.rb @@ -0,0 +1,51 @@ +require 'spec_helper' + +describe Labels::CreateService, services: true do + describe '#execute' do + let(:user) { create(:user) } + let(:group) { create(:group) } + let(:project) { create(:project, namespace: group) } + + let(:params) do + { + title: 'Security', + description: 'Security related stuff.', + color: '#FF0000' + } + end + + subject(:service) { described_class.new(user, project, params) } + + before do + project.team << [user, :developer] + end + + context 'when label does not exist at group level' do + it 'creates a new label at project level' do + expect { service.execute }.to change(project.labels, :count).by(1) + end + end + + context 'when label exists at group level' do + it 'returns the group label' do + group_label = create(:group_label, group: group, title: 'Security') + + expect(service.execute).to eq group_label + end + end + + context 'when label does not exist at group level' do + it 'creates a new label at project leve' do + expect { service.execute }.to change(project.labels, :count).by(1) + end + end + + context 'when label exists at project level' do + it 'returns the project label' do + project_label = create(:label, project: project, title: 'Security') + + expect(service.execute).to eq project_label + end + end + end +end From d009d38ed6ab5459f596194ce808c304e6379161 Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Tue, 18 Oct 2016 00:27:10 -0200 Subject: [PATCH 153/174] User Labes::CreateService to create labels --- app/models/project.rb | 3 ++- app/services/boards/lists/generate_service.rb | 3 +-- app/services/issuable_base_service.rb | 4 ++-- app/services/labels/transfer_service.rb | 8 ++------ lib/gitlab/fogbugz_import/importer.rb | 4 ++-- lib/gitlab/github_import/label_formatter.rb | 7 ++++--- lib/gitlab/google_code_import/importer.rb | 4 ++-- lib/gitlab/issues_labels.rb | 4 ++-- 8 files changed, 17 insertions(+), 20 deletions(-) diff --git a/app/models/project.rb b/app/models/project.rb index 7ab624eafdf..bc15ca3fc2e 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -733,7 +733,8 @@ class Project < ActiveRecord::Base def create_labels Label.templates.each do |label| - self.labels.create!(label.attributes.symbolize_keys.except(:id, :template)) + params = label.attributes.except('id', 'template', 'created_at', 'updated_at') + Labels::CreateService.new(owner, self, params).execute end end diff --git a/app/services/boards/lists/generate_service.rb b/app/services/boards/lists/generate_service.rb index d8048f1c67e..1d3c7f2071b 100644 --- a/app/services/boards/lists/generate_service.rb +++ b/app/services/boards/lists/generate_service.rb @@ -19,8 +19,7 @@ module Boards end def find_or_create_label(params) - project.labels.create_with(color: params[:color]) - .find_or_create_by(name: params[:name]) + ::Labels::CreateService.new(current_user, project, params).execute end def label_params diff --git a/app/services/issuable_base_service.rb b/app/services/issuable_base_service.rb index deadf1fe283..4554963370f 100644 --- a/app/services/issuable_base_service.rb +++ b/app/services/issuable_base_service.rb @@ -88,8 +88,8 @@ class IssuableBaseService < BaseService return unless labels params[:label_ids] = labels.split(',').map do |label_name| - label = available_labels.find_by(title: label_name) - label ||= project.labels.create(title: label_name.strip, color: Label::DEFAULT_COLOR) + service = Labels::CreateService.new(current_user, project, title: label_name.strip) + label = service.execute label.id end diff --git a/app/services/labels/transfer_service.rb b/app/services/labels/transfer_service.rb index 559d2860d97..65b4bdbaff9 100644 --- a/app/services/labels/transfer_service.rb +++ b/app/services/labels/transfer_service.rb @@ -41,13 +41,9 @@ module Labels LabelLink.where("label_links.id IN (#{union.to_sql})") end - def labels - @labels ||= LabelsFinder.new(current_user, project_id: project.id).execute - end - def find_or_create_label!(label) - new_label = labels.find_by(title: label.title) - new_label ||= project.labels.create!(label.attributes.slice("title", "description", "color")) + params = label.attributes.slice('title', 'description', 'color') + new_label = CreateService.new(current_user, project, params).execute new_label.id end diff --git a/lib/gitlab/fogbugz_import/importer.rb b/lib/gitlab/fogbugz_import/importer.rb index 9e926e2681a..f154ee689cf 100644 --- a/lib/gitlab/fogbugz_import/importer.rb +++ b/lib/gitlab/fogbugz_import/importer.rb @@ -74,8 +74,8 @@ module Gitlab end def create_label(name) - color = nice_label_color(name) - Label.create!(project_id: project.id, title: name, color: color) + params = { title: name, color: nice_label_color(name) } + ::Labels::CreateService.new(project.owner, project, params).execute end def user_info(person_id) diff --git a/lib/gitlab/github_import/label_formatter.rb b/lib/gitlab/github_import/label_formatter.rb index 2cad7fca88e..3101116a614 100644 --- a/lib/gitlab/github_import/label_formatter.rb +++ b/lib/gitlab/github_import/label_formatter.rb @@ -14,9 +14,10 @@ module Gitlab end def create! - project.labels.find_or_create_by!(title: title) do |label| - label.color = color - end + params = attributes.except(:project) + service = ::Labels::CreateService.new(project.owner, project, params) + + service.execute end private diff --git a/lib/gitlab/google_code_import/importer.rb b/lib/gitlab/google_code_import/importer.rb index 79a0eaba1e8..904a228aeef 100644 --- a/lib/gitlab/google_code_import/importer.rb +++ b/lib/gitlab/google_code_import/importer.rb @@ -233,8 +233,8 @@ module Gitlab end def create_label(name) - color = nice_label_color(name) - project.labels.create!(name: name, color: color) + params = { name: name, color: nice_label_color(name) } + ::Labels::CreateService.new(project.owner, project, params).execute end def format_content(raw_content) diff --git a/lib/gitlab/issues_labels.rb b/lib/gitlab/issues_labels.rb index 1bec6088292..6788eca7146 100644 --- a/lib/gitlab/issues_labels.rb +++ b/lib/gitlab/issues_labels.rb @@ -18,8 +18,8 @@ module Gitlab { title: "enhancement", color: green } ] - labels.each do |label| - project.labels.create(label) + labels.each do |params| + ::Labels::CreateService.new(project.owner, project).execute(params) end end end From 771d3fc3cbaa2b473c87d23fc1c067fb9bad6206 Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Tue, 18 Oct 2016 00:56:05 -0200 Subject: [PATCH 154/174] Split migration to create label priorities --- .../20161014173530_create_label_priorities.rb | 32 +---------------- .../20161018024215_migrate_labels_priority.rb | 36 +++++++++++++++++++ ...61018024550_remove_priority_from_labels.rb | 17 +++++++++ db/schema.rb | 2 +- 4 files changed, 55 insertions(+), 32 deletions(-) create mode 100644 db/migrate/20161018024215_migrate_labels_priority.rb create mode 100644 db/migrate/20161018024550_remove_priority_from_labels.rb diff --git a/db/migrate/20161014173530_create_label_priorities.rb b/db/migrate/20161014173530_create_label_priorities.rb index f9d94ebdc70..2c22841c28a 100644 --- a/db/migrate/20161014173530_create_label_priorities.rb +++ b/db/migrate/20161014173530_create_label_priorities.rb @@ -2,7 +2,7 @@ class CreateLabelPriorities < ActiveRecord::Migration include Gitlab::Database::MigrationHelpers DOWNTIME = true - DOWNTIME_REASON = 'Prioritezed labels will not work as expected until this migration is complete.' + DOWNTIME_REASON = 'This migration adds foreign keys' disable_ddl_transaction! @@ -15,41 +15,11 @@ class CreateLabelPriorities < ActiveRecord::Migration t.timestamps null: false end - execute <<-EOF.strip_heredoc - INSERT INTO label_priorities (project_id, label_id, priority, created_at, updated_at) - SELECT labels.project_id, labels.id, labels.priority, NOW(), NOW() - FROM labels - WHERE labels.project_id IS NOT NULL - AND labels.priority IS NOT NULL; - EOF - add_concurrent_index :label_priorities, [:project_id, :label_id], unique: true add_concurrent_index :label_priorities, :priority - - remove_column :labels, :priority end def down - add_column :labels, :priority, :integer - - if Gitlab::Database.mysql? - execute <<-EOF.strip_heredoc - UPDATE labels - INNER JOIN label_priorities ON labels.id = label_priorities.label_id AND labels.project_id = label_priorities.project_id - SET labels.priority = label_priorities.priority; - EOF - else - execute <<-EOF.strip_heredoc - UPDATE labels - SET priority = label_priorities.priority - FROM label_priorities - WHERE labels.id = label_priorities.label_id - AND labels.project_id = label_priorities.project_id; - EOF - end - - add_concurrent_index :labels, :priority - drop_table :label_priorities end end diff --git a/db/migrate/20161018024215_migrate_labels_priority.rb b/db/migrate/20161018024215_migrate_labels_priority.rb new file mode 100644 index 00000000000..22bec2382f4 --- /dev/null +++ b/db/migrate/20161018024215_migrate_labels_priority.rb @@ -0,0 +1,36 @@ +class MigrateLabelsPriority < ActiveRecord::Migration + include Gitlab::Database::MigrationHelpers + + DOWNTIME = true + DOWNTIME_REASON = 'Prioritized labels will not work as expected until this migration is complete.' + + disable_ddl_transaction! + + def up + execute <<-EOF.strip_heredoc + INSERT INTO label_priorities (project_id, label_id, priority, created_at, updated_at) + SELECT labels.project_id, labels.id, labels.priority, NOW(), NOW() + FROM labels + WHERE labels.project_id IS NOT NULL + AND labels.priority IS NOT NULL; + EOF + end + + def down + if Gitlab::Database.mysql? + execute <<-EOF.strip_heredoc + UPDATE labels + INNER JOIN label_priorities ON labels.id = label_priorities.label_id AND labels.project_id = label_priorities.project_id + SET labels.priority = label_priorities.priority; + EOF + else + execute <<-EOF.strip_heredoc + UPDATE labels + SET priority = label_priorities.priority + FROM label_priorities + WHERE labels.id = label_priorities.label_id + AND labels.project_id = label_priorities.project_id; + EOF + end + end +end diff --git a/db/migrate/20161018024550_remove_priority_from_labels.rb b/db/migrate/20161018024550_remove_priority_from_labels.rb new file mode 100644 index 00000000000..b7416cca664 --- /dev/null +++ b/db/migrate/20161018024550_remove_priority_from_labels.rb @@ -0,0 +1,17 @@ +class RemovePriorityFromLabels < ActiveRecord::Migration + include Gitlab::Database::MigrationHelpers + + DOWNTIME = true + DOWNTIME_REASON = 'This migration removes an existing column' + + disable_ddl_transaction! + + def up + remove_column :labels, :priority, :integer, index: true + end + + def down + add_column :labels, :priority, :integer + add_concurrent_index :labels, :priority + end +end diff --git a/db/schema.rb b/db/schema.rb index f9353290abf..65f55aa109b 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20161017125927) do +ActiveRecord::Schema.define(version: 20161018024550) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" From 007267ef8b927646bab0932b5704ff0f3720253f Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Tue, 18 Oct 2016 01:00:45 -0200 Subject: [PATCH 155/174] Use `includes(:priorities)` on Projects::LabelsController --- app/controllers/projects/labels_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/projects/labels_controller.rb b/app/controllers/projects/labels_controller.rb index 42fd09e9b7e..4f855134368 100644 --- a/app/controllers/projects/labels_controller.rb +++ b/app/controllers/projects/labels_controller.rb @@ -126,7 +126,7 @@ class Projects::LabelsController < Projects::ApplicationController alias_method :subscribable_resource, :label def find_labels - @available_labels ||= LabelsFinder.new(current_user, project_id: @project.id).execute + @available_labels ||= LabelsFinder.new(current_user, project_id: @project.id).execute.includes(:priorities) end def authorize_admin_labels! From 4c9241075dc1b2f1cda5648cf9ad1f553db3d03b Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Tue, 18 Oct 2016 01:32:00 -0200 Subject: [PATCH 156/174] Warn user deleting a group label affect all projects within the group --- app/helpers/labels_helper.rb | 7 +++++++ app/views/shared/_label.html.haml | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/app/helpers/labels_helper.rb b/app/helpers/labels_helper.rb index a1d7713b45f..d7cfd24c918 100644 --- a/app/helpers/labels_helper.rb +++ b/app/helpers/labels_helper.rb @@ -155,6 +155,13 @@ module LabelsHelper label.subscribed?(current_user) ? 'Unsubscribe' : 'Subscribe' end + def label_deletion_confirm_text(label) + case label + when GroupLabel then 'Remove this label? This will affect all projects within the group. Are you sure?' + when ProjectLabel then 'Remove this label? Are you sure?' + end + end + # Required for Banzai::Filter::LabelReferenceFilter module_function :render_colored_label, :render_colored_cross_project_label, :text_color_for_bg, :escape_once diff --git a/app/views/shared/_label.html.haml b/app/views/shared/_label.html.haml index ba8a3efccda..5cdd18d24f0 100644 --- a/app/views/shared/_label.html.haml +++ b/app/views/shared/_label.html.haml @@ -44,7 +44,7 @@ = link_to edit_label_path(label), title: "Edit", class: 'btn btn-transparent btn-action', data: {toggle: "tooltip"} do %span.sr-only Edit = icon('pencil-square-o') - = link_to destroy_label_path(label), title: "Delete", class: 'btn btn-transparent btn-action remove-row', method: :delete, remote: true, data: {confirm: "Remove this label? Are you sure?", toggle: "tooltip"} do + = link_to destroy_label_path(label), title: "Delete", class: 'btn btn-transparent btn-action remove-row', method: :delete, remote: true, data: {confirm: label_deletion_confirm_text(label), toggle: "tooltip"} do %span.sr-only Delete = icon('trash-o') From f99744d00de10094d6e483776313c52d86437a9d Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Tue, 18 Oct 2016 04:00:33 -0200 Subject: [PATCH 157/174] Use join instead of subquery on Label.unprioritized scope --- app/models/label.rb | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/app/models/label.rb b/app/models/label.rb index ae07e8f60e1..149fd98ecb3 100644 --- a/app/models/label.rb +++ b/app/models/label.rb @@ -39,7 +39,14 @@ class Label < ActiveRecord::Base end def self.unprioritized(project) - where.not(id: prioritized(project).select(:id)) + labels = Label.arel_table + priorities = LabelPriority.arel_table + + label_priorities = labels.join(priorities, Arel::Nodes::OuterJoin). + on(labels[:id].eq(priorities[:label_id]).and(priorities[:project_id].eq(project.id))). + join_sources + + joins(label_priorities).where(priorities[:priority].eq(nil)) end def self.left_join_priorities From a9938e227bfb0ee1908beb9238bb95fece72805e Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Tue, 18 Oct 2016 04:30:43 -0200 Subject: [PATCH 158/174] Add support to group labels to SlashCommands::InterpretService --- app/finders/labels_finder.rb | 2 +- app/services/slash_commands/interpret_service.rb | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/app/finders/labels_finder.rb b/app/finders/labels_finder.rb index 65db4184ecf..a5802171b6c 100644 --- a/app/finders/labels_finder.rb +++ b/app/finders/labels_finder.rb @@ -52,7 +52,7 @@ class LabelsFinder < UnionFinder end def title - params[:title].presence + params[:title].presence || params[:name].presence end def project diff --git a/app/services/slash_commands/interpret_service.rb b/app/services/slash_commands/interpret_service.rb index e4ae3dec8aa..5a81194a5f4 100644 --- a/app/services/slash_commands/interpret_service.rb +++ b/app/services/slash_commands/interpret_service.rb @@ -116,8 +116,10 @@ module SlashCommands desc 'Add label(s)' params '~label1 ~"label 2"' condition do + available_labels = LabelsFinder.new(current_user, project_id: project.id).execute + current_user.can?(:"admin_#{issuable.to_ability_name}", project) && - project.labels.any? + available_labels.any? end command :label do |labels_param| label_ids = find_label_ids(labels_param) @@ -248,7 +250,7 @@ module SlashCommands def find_label_ids(labels_param) label_ids_by_reference = extract_references(labels_param, :label).map(&:id) - labels_ids_by_name = @project.labels.where(name: labels_param.split).select(:id) + labels_ids_by_name = LabelsFinder.new(current_user, project_id: project.id, name: labels_param.split).execute.select(:id) label_ids_by_reference | labels_ids_by_name end From 1a41a89cb383d286e21a125e8a643eb0fbb2442b Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Tue, 18 Oct 2016 04:18:54 -0200 Subject: [PATCH 159/174] Update CHANGELOG --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c866696889e..dd37b0a6a62 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ Please view this file on the master branch, on stable branches it's out of date. - Add `/projects/visible` API endpoint (Ben Boeckel) - Fix centering of custom header logos (Ashley Dumaine) - ExpireBuildArtifactsWorker query builds table without ordering enqueuing one job per build to cleanup + - Add group level labels. (!6425) - Add an example for testing a phoenix application with Gitlab CI in the docs (Manthan Mallikarjun) - Cancelled pipelines could be retried. !6927 - Updating verbiage on git basics to be more intuitive From f0ad0ceff5236f3ee5babee47bfec217a54c3b07 Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Tue, 18 Oct 2016 06:26:16 -0200 Subject: [PATCH 160/174] Fix GitHub importer spec --- lib/gitlab/github_import/label_formatter.rb | 5 ++++- spec/lib/gitlab/github_import/importer_spec.rb | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/lib/gitlab/github_import/label_formatter.rb b/lib/gitlab/github_import/label_formatter.rb index 3101116a614..8ed1574c4fc 100644 --- a/lib/gitlab/github_import/label_formatter.rb +++ b/lib/gitlab/github_import/label_formatter.rb @@ -16,8 +16,11 @@ module Gitlab def create! params = attributes.except(:project) service = ::Labels::CreateService.new(project.owner, project, params) + label = service.execute - service.execute + raise ActiveRecord::RecordInvalid.new(label) unless label.persisted? + + label end private diff --git a/spec/lib/gitlab/github_import/importer_spec.rb b/spec/lib/gitlab/github_import/importer_spec.rb index 8854c8431b5..1af553f8f03 100644 --- a/spec/lib/gitlab/github_import/importer_spec.rb +++ b/spec/lib/gitlab/github_import/importer_spec.rb @@ -157,7 +157,7 @@ describe Gitlab::GithubImport::Importer, lib: true do { type: :pull_request, url: "https://api.github.com/repos/octocat/Hello-World/pulls/1347", errors: "Validation failed: Validate branches Cannot Create: This merge request already exists: [\"New feature\"]" }, { type: :wiki, errors: "Gitlab::Shell::Error" }, { type: :release, url: 'https://api.github.com/repos/octocat/Hello-World/releases/2', errors: "Validation failed: Description can't be blank" } - ] + ] } described_class.new(project).execute From 2f7260b460f2a893241039115a201c2522fb47ca Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Tue, 18 Oct 2016 09:46:11 -0200 Subject: [PATCH 161/174] Fix max number of permitted priorities per project label --- app/models/project_label.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/models/project_label.rb b/app/models/project_label.rb index 0a79521ed09..33c2b617715 100644 --- a/app/models/project_label.rb +++ b/app/models/project_label.rb @@ -1,5 +1,5 @@ class ProjectLabel < Label - NUMBER_OF_PRIORITIES = 1 + MAX_NUMBER_OF_PRIORITIES = 1 belongs_to :project @@ -27,7 +27,7 @@ class ProjectLabel < Label end def permitted_numbers_of_priorities - if priorities && priorities.size >= NUMBER_OF_PRIORITIES + if priorities && priorities.size > MAX_NUMBER_OF_PRIORITIES errors.add(:priorities, 'Number of permitted priorities exceeded') end end From 891e5f4851c2067daba12a1750651170a1583481 Mon Sep 17 00:00:00 2001 From: James Lopez Date: Tue, 18 Oct 2016 19:31:10 +0200 Subject: [PATCH 162/174] Update specs to cope with new label types and priorities Fixed all related specs and also changed the logic to handle edge cases. This includes exporting and exporting of group labels, which will get associated with the new group (if any) or they will become normal project labels otherwise. Found other issues to do with not being able to import all labels at once in the beginning of the JSON - code was much simpler when we import all labels and milestones associated to a project first, then the associations will find the already created labels instead of creating them from the associations themselves. --- app/models/project.rb | 4 +++ lib/gitlab/import_export/attribute_cleaner.rb | 2 +- lib/gitlab/import_export/import_export.yml | 9 +++-- lib/gitlab/import_export/json_hash_builder.rb | 6 ++++ lib/gitlab/import_export/relation_factory.rb | 22 +++++++----- .../import_export/test_project_export.tar.gz | Bin 680856 -> 681774 bytes spec/lib/gitlab/import_export/all_models.yml | 3 ++ spec/lib/gitlab/import_export/project.json | 33 ++++++++++++++---- .../project_tree_restorer_spec.rb | 6 ++++ .../import_export/project_tree_saver_spec.rb | 9 ++++- .../import_export/safe_model_attributes.yml | 9 ++++- 11 files changed, 82 insertions(+), 21 deletions(-) diff --git a/app/models/project.rb b/app/models/project.rb index bc15ca3fc2e..94105a8ea79 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -738,6 +738,10 @@ class Project < ActiveRecord::Base end end + def all_labels + Label.find_by_project_id(self.id) + end + def find_service(list, name) list.find { |service| service.to_param == name } end diff --git a/lib/gitlab/import_export/attribute_cleaner.rb b/lib/gitlab/import_export/attribute_cleaner.rb index b9e4042220a..f755a404693 100644 --- a/lib/gitlab/import_export/attribute_cleaner.rb +++ b/lib/gitlab/import_export/attribute_cleaner.rb @@ -1,7 +1,7 @@ module Gitlab module ImportExport class AttributeCleaner - ALLOWED_REFERENCES = RelationFactory::PROJECT_REFERENCES + RelationFactory::USER_REFERENCES + ALLOWED_REFERENCES = RelationFactory::PROJECT_REFERENCES + RelationFactory::USER_REFERENCES + ['group_id'] def self.clean!(relation_hash:) relation_hash.reject! do |key, _value| diff --git a/lib/gitlab/import_export/import_export.yml b/lib/gitlab/import_export/import_export.yml index 8882f146632..e6ecd118609 100644 --- a/lib/gitlab/import_export/import_export.yml +++ b/lib/gitlab/import_export/import_export.yml @@ -1,6 +1,7 @@ # Model relationships to be included in the project import/export project_tree: - - :labels + - labels: + :priorities - milestones: - :events - issues: @@ -9,7 +10,8 @@ project_tree: - :author - :events - label_links: - - :label + - label: + :priorities - milestone: - :events - snippets: @@ -26,7 +28,8 @@ project_tree: - :merge_request_diff - :events - label_links: - - :label + - label: + :priorities - milestone: - :events - pipelines: diff --git a/lib/gitlab/import_export/json_hash_builder.rb b/lib/gitlab/import_export/json_hash_builder.rb index 0cc10f40087..48c09dafcb6 100644 --- a/lib/gitlab/import_export/json_hash_builder.rb +++ b/lib/gitlab/import_export/json_hash_builder.rb @@ -65,11 +65,17 @@ module Gitlab # +value+ existing model to be included in the hash # +parsed_hash+ the original hash def parse_hash(value) + return nil if already_contains_methods?(value) + @attributes_finder.parse(value) do |hash| { include: hash_or_merge(value, hash) } end end + def already_contains_methods?(value) + value.is_a?(Hash) && value.values.detect { |val| val[:methods]} + end + # Adds new model configuration to an existing hash with key +current_key+ # It may include exceptions or other attribute detail configuration, parsed by +@attributes_finder+ # diff --git a/lib/gitlab/import_export/relation_factory.rb b/lib/gitlab/import_export/relation_factory.rb index 8bc4ab85c18..dc630e76411 100644 --- a/lib/gitlab/import_export/relation_factory.rb +++ b/lib/gitlab/import_export/relation_factory.rb @@ -11,6 +11,7 @@ module Gitlab merge_access_levels: 'ProtectedBranch::MergeAccessLevel', push_access_levels: 'ProtectedBranch::PushAccessLevel', labels: :project_labels, + priorities: :label_priorities, label: :project_label }.freeze USER_REFERENCES = %w[author_id assignee_id updated_by_id user_id].freeze @@ -23,8 +24,6 @@ module Gitlab EXISTING_OBJECT_CHECK = %i[milestone milestones label labels project_label project_labels project_label group_label].freeze - FINDER_ATTRIBUTES = %w[title project_id].freeze - def self.create(*args) new(*args).create end @@ -134,6 +133,7 @@ module Gitlab def handle_group_label # If there's no group, move the label to a project label if @relation_hash['group_id'] + @relation_hash['project_id'] = nil @relation_name = :group_label else @relation_hash['type'] = 'ProjectLabel' @@ -188,11 +188,9 @@ module Gitlab # Otherwise always create the record, skipping the extra SELECT clause. @existing_or_new_object ||= begin if EXISTING_OBJECT_CHECK.include?(@relation_name) - events = parsed_relation_hash.delete('events') + attribute_hash = attribute_hash_for(['events', 'priorities']) - unless events.blank? - existing_object.assign_attributes(events: events) - end + existing_object.assign_attributes(attribute_hash) if attribute_hash.any? existing_object else @@ -201,14 +199,22 @@ module Gitlab end end + def attribute_hash_for(attributes) + attributes.inject({}) do |hash, value| + hash[value] = parsed_relation_hash.delete(value) if parsed_relation_hash[value] + hash + end + end + def existing_object @existing_object ||= begin - finder_hash = parsed_relation_hash.slice(*FINDER_ATTRIBUTES) + finder_attributes = @relation_name == :group_label ? %w[title group_id] : %w[title project_id] + finder_hash = parsed_relation_hash.slice(*finder_attributes) existing_object = relation_class.find_or_create_by(finder_hash) # Done in two steps, as MySQL behaves differently than PostgreSQL using # the +find_or_create_by+ method and does not return the ID the second time. - existing_object.update(parsed_relation_hash) + existing_object.update!(parsed_relation_hash) existing_object end end diff --git a/spec/features/projects/import_export/test_project_export.tar.gz b/spec/features/projects/import_export/test_project_export.tar.gz index 8f683cf89aa281dc252fd753aa69c8f875ffae80..bfe59bdb90e75cb869cab6aa86cb9dc81ac5e225 100644 GIT binary patch delta 132702 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 delta 125001 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 diff --git a/spec/lib/gitlab/import_export/all_models.yml b/spec/lib/gitlab/import_export/all_models.yml index 8fcbf12eab8..02b11bd999a 100644 --- a/spec/lib/gitlab/import_export/all_models.yml +++ b/spec/lib/gitlab/import_export/all_models.yml @@ -38,6 +38,7 @@ label: - label_links - issues - merge_requests +- priorities milestone: - project - issues @@ -186,3 +187,5 @@ project: award_emoji: - awardable - user +priorities: +- label \ No newline at end of file diff --git a/spec/lib/gitlab/import_export/project.json b/spec/lib/gitlab/import_export/project.json index bf9dc279f7d..ed9df468ced 100644 --- a/spec/lib/gitlab/import_export/project.json +++ b/spec/lib/gitlab/import_export/project.json @@ -2,6 +2,21 @@ "description": "Nisi et repellendus ut enim quo accusamus vel magnam.", "visibility_level": 10, "archived": false, + "labels": [ + { + "id": 2, + "title": "test2", + "color": "#428bca", + "project_id": 8, + "created_at": "2016-07-22T08:55:44.161Z", + "updated_at": "2016-07-22T08:55:44.161Z", + "template": false, + "description": "", + "type": "ProjectLabel", + "priorities": [ + ] + } + ], "issues": [ { "id": 40, @@ -64,7 +79,6 @@ "updated_at": "2016-07-22T08:55:44.161Z", "template": false, "description": "", - "priority": null, "type": "ProjectLabel" } }, @@ -84,9 +98,18 @@ "updated_at": "2016-07-22T08:55:44.161Z", "template": false, "description": "", - "priority": null, "project_id": null, - "type": "GroupLabel" + "type": "GroupLabel", + "priorities": [ + { + "id": 1, + "project_id": 5, + "label_id": 1, + "priority": 1, + "created_at": "2016-10-18T09:35:43.338Z", + "updated_at": "2016-10-18T09:35:43.338Z" + } + ] } } ], @@ -558,7 +581,6 @@ "updated_at": "2016-07-22T08:55:44.161Z", "template": false, "description": "", - "priority": null, "type": "ProjectLabel" } } @@ -2249,9 +2271,6 @@ } ] } - ], - "labels": [ - ], "milestones": [ { diff --git a/spec/lib/gitlab/import_export/project_tree_restorer_spec.rb b/spec/lib/gitlab/import_export/project_tree_restorer_spec.rb index 6312b990a66..069ea960321 100644 --- a/spec/lib/gitlab/import_export/project_tree_restorer_spec.rb +++ b/spec/lib/gitlab/import_export/project_tree_restorer_spec.rb @@ -134,6 +134,12 @@ describe Gitlab::ImportExport::ProjectTreeRestorer, services: true do expect(GroupLabel.count).to eq(1) end + + it 'has label priorities' do + restored_project_json + + expect(GroupLabel.first.priorities).not_to be_empty + end end it 'has a project feature' do diff --git a/spec/lib/gitlab/import_export/project_tree_saver_spec.rb b/spec/lib/gitlab/import_export/project_tree_saver_spec.rb index 9a8ba61559b..c8bba553558 100644 --- a/spec/lib/gitlab/import_export/project_tree_saver_spec.rb +++ b/spec/lib/gitlab/import_export/project_tree_saver_spec.rb @@ -114,7 +114,13 @@ describe Gitlab::ImportExport::ProjectTreeSaver, services: true do it 'has project and group labels' do label_types = saved_project_json['issues'].first['label_links'].map { |link| link['label']['type']} - expect(label_types).to match(['ProjectLabel', 'GroupLabel']) + expect(label_types).to match_array(['ProjectLabel', 'GroupLabel']) + end + + it 'has priorities associated to labels' do + priorities = saved_project_json['issues'].first['label_links'].map { |link| link['label']['priorities']} + + expect(priorities.flatten).not_to be_empty end it 'saves the correct service type' do @@ -154,6 +160,7 @@ describe Gitlab::ImportExport::ProjectTreeSaver, services: true do group_label = create(:group_label, group: group) create(:label_link, label: project_label, target: issue) create(:label_link, label: group_label, target: issue) + create(:label_priority, label: group_label, priority: 1) milestone = create(:milestone, project: project) merge_request = create(:merge_request, source_project: project, milestone: milestone) commit_status = create(:commit_status, project: project) diff --git a/spec/lib/gitlab/import_export/safe_model_attributes.yml b/spec/lib/gitlab/import_export/safe_model_attributes.yml index 26049914bac..feee0f025d8 100644 --- a/spec/lib/gitlab/import_export/safe_model_attributes.yml +++ b/spec/lib/gitlab/import_export/safe_model_attributes.yml @@ -60,7 +60,7 @@ LabelLink: - target_type - created_at - updated_at -Label: +ProjectLabel: - id - title - color @@ -331,3 +331,10 @@ AwardEmoji: - awardable_type - created_at - updated_at +LabelPriority: +- id +- project_id +- label_id +- priority +- created_at +- updated_at \ No newline at end of file From aa78148901cd3877936bc2afcea9c329077bf951 Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Tue, 18 Oct 2016 17:00:43 -0200 Subject: [PATCH 163/174] Remove unused method Project#all_labels --- app/models/project.rb | 4 ---- 1 file changed, 4 deletions(-) diff --git a/app/models/project.rb b/app/models/project.rb index 94105a8ea79..bc15ca3fc2e 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -738,10 +738,6 @@ class Project < ActiveRecord::Base end end - def all_labels - Label.find_by_project_id(self.id) - end - def find_service(list, name) list.find { |service| service.to_param == name } end From 355389d065216739a2b8e8150a1a569c410f4ff6 Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Wed, 19 Oct 2016 11:31:08 -0200 Subject: [PATCH 164/174] Disable subscribing to group-level labels --- app/assets/stylesheets/pages/labels.scss | 7 +++++++ app/controllers/groups/labels_controller.rb | 5 +---- app/helpers/labels_helper.rb | 21 ++++++++++++++------- app/views/shared/_label.html.haml | 8 ++++---- config/routes/group.rb | 6 +----- 5 files changed, 27 insertions(+), 20 deletions(-) diff --git a/app/assets/stylesheets/pages/labels.scss b/app/assets/stylesheets/pages/labels.scss index 2f7f7325877..397f89f501a 100644 --- a/app/assets/stylesheets/pages/labels.scss +++ b/app/assets/stylesheets/pages/labels.scss @@ -223,6 +223,13 @@ } .label-subscribe-button { + .label-subscribe-button-icon { + &[disabled] { + opacity: 0.5; + pointer-events: none; + } + } + .label-subscribe-button-loading { display: none; } diff --git a/app/controllers/groups/labels_controller.rb b/app/controllers/groups/labels_controller.rb index 0a3dee5ce39..29528b2cfaa 100644 --- a/app/controllers/groups/labels_controller.rb +++ b/app/controllers/groups/labels_controller.rb @@ -1,7 +1,5 @@ class Groups::LabelsController < Groups::ApplicationController - include ToggleSubscriptionAction - - before_action :label, only: [:edit, :update, :destroy, :toggle_subscription] + before_action :label, only: [:edit, :update, :destroy] before_action :authorize_admin_labels!, only: [:new, :create, :edit, :update, :destroy] before_action :save_previous_label_path, only: [:edit] @@ -71,7 +69,6 @@ class Groups::LabelsController < Groups::ApplicationController def label @label ||= @group.labels.find(params[:id]) end - alias_method :subscribable_resource, :label def label_params params.require(:label).permit(:title, :description, :color) diff --git a/app/helpers/labels_helper.rb b/app/helpers/labels_helper.rb index d7cfd24c918..221a84b042f 100644 --- a/app/helpers/labels_helper.rb +++ b/app/helpers/labels_helper.rb @@ -68,11 +68,12 @@ module LabelsHelper end end - def toggle_subscription_label_path(label) - case label - when GroupLabel then toggle_subscription_group_label_path(label.group, label) - when ProjectLabel then toggle_subscription_namespace_project_label_path(label.project.namespace, label.project, label) - end + def toggle_subscription_data(label) + return unless label.is_a?(ProjectLabel) + + { + url: toggle_subscription_namespace_project_label_path(label.project.namespace, label.project, label) + } end def render_colored_label(label, label_suffix = '', tooltip: true) @@ -148,11 +149,17 @@ module LabelsHelper end def label_subscription_status(label) - label.subscribed?(current_user) ? 'subscribed' : 'unsubscribed' + case label + when GroupLabel then 'Subscribing to group labels is currently not supported.' + when ProjectLabel then label.subscribed?(current_user) ? 'subscribed' : 'unsubscribed' + end end def label_subscription_toggle_button_text(label) - label.subscribed?(current_user) ? 'Unsubscribe' : 'Subscribe' + case label + when GroupLabel then 'Subscribing to group labels is currently not supported.' + when ProjectLabel then label.subscribed?(current_user) ? 'Unsubscribe' : 'Subscribe' + end end def label_deletion_confirm_text(label) diff --git a/app/views/shared/_label.html.haml b/app/views/shared/_label.html.haml index 5cdd18d24f0..40c8d2af226 100644 --- a/app/views/shared/_label.html.haml +++ b/app/views/shared/_label.html.haml @@ -18,7 +18,7 @@ = link_to_label(label, subject: @project) do = pluralize open_issues_count, 'open issue' - if current_user - %li.label-subscription{ data: { url: toggle_subscription_label_path(label) } } + %li.label-subscription{ data: toggle_subscription_data(label) } %a.js-subscribe-button.label-subscribe-button.subscription-status{ role: "button", href: "#", data: { toggle: "tooltip", status: label_subscription_status(label) } } %span= label_subscription_toggle_button_text(label) - if can?(current_user, :admin_label, label) @@ -34,10 +34,10 @@ = pluralize open_issues_count, 'open issue' - if current_user - .label-subscription.inline{ data: { url: toggle_subscription_label_path(label) } } + .label-subscription.inline{ data: toggle_subscription_data(label) } %button.js-subscribe-button.label-subscribe-button.btn.btn-transparent.btn-action.subscription-status{ type: "button", title: label_subscription_toggle_button_text(label), data: { toggle: "tooltip", status: label_subscription_status(label) } } %span.sr-only= label_subscription_toggle_button_text(label) - = icon('eye', class: 'label-subscribe-button-icon') + = icon('eye', class: 'label-subscribe-button-icon', disabled: label.is_a?(GroupLabel)) = icon('spinner spin', class: 'label-subscribe-button-loading') - if can?(current_user, :admin_label, label) @@ -48,6 +48,6 @@ %span.sr-only Delete = icon('trash-o') - - if current_user + - if current_user && label.is_a?(ProjectLabel) :javascript new Subscription('##{dom_id(label)} .label-subscription'); diff --git a/config/routes/group.rb b/config/routes/group.rb index 7bb9aa50875..4838c9d91c6 100644 --- a/config/routes/group.rb +++ b/config/routes/group.rb @@ -29,10 +29,6 @@ resources :groups, constraints: { id: /[a-zA-Z.0-9_\-]+(? Date: Wed, 19 Oct 2016 11:37:10 -0200 Subject: [PATCH 165/174] Only show label type for projects that belong to a group --- app/views/shared/_label_row.html.haml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/views/shared/_label_row.html.haml b/app/views/shared/_label_row.html.haml index 76c3327fefc..d28f9421ecf 100644 --- a/app/views/shared/_label_row.html.haml +++ b/app/views/shared/_label_row.html.haml @@ -10,8 +10,9 @@ = icon('star') %span.label-name = link_to_label(label, subject: @project, tooltip: false) - %span.label-type - = label.model_name.human.titleize + - if defined?(@project) && @project.group.present? + %span.label-type + = label.model_name.human.titleize - if label.description %span.label-description = markdown_field(label, :description) From fc2c64fcdf913a37f987ab5e5626ef9bb9e8b854 Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Wed, 19 Oct 2016 11:49:07 -0200 Subject: [PATCH 166/174] Add self.project_foreign_key on both Issue and MergeRequest --- app/models/concerns/issuable.rb | 8 +------- app/models/issue.rb | 4 ++++ app/models/merge_request.rb | 4 ++++ 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/app/models/concerns/issuable.rb b/app/models/concerns/issuable.rb index 9a9b562af02..17c3b526c97 100644 --- a/app/models/concerns/issuable.rb +++ b/app/models/concerns/issuable.rb @@ -145,16 +145,10 @@ module Issuable end def order_labels_priority(excluded_labels: []) - project_column = - case table_name - when Issue.table_name then "#{table_name}.project_id" - when MergeRequest.table_name then "#{table_name}.target_project_id" - end - params = { target_type: name, target_column: "#{table_name}.id", - project_column: project_column, + project_column: "#{table_name}.#{project_foreign_key}", excluded_labels: excluded_labels } diff --git a/app/models/issue.rb b/app/models/issue.rb index f7ccce2924a..133a5993815 100644 --- a/app/models/issue.rb +++ b/app/models/issue.rb @@ -138,6 +138,10 @@ class Issue < ActiveRecord::Base reference.to_i > 0 && reference.to_i <= Gitlab::Database::MAX_INT_VALUE end + def self.project_foreign_key + 'project_id' + end + def self.sort(method, excluded_labels: []) case method.to_s when 'due_date_asc' then order_due_date_asc diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb index fedc35102ef..0cc0b3c2a0e 100644 --- a/app/models/merge_request.rb +++ b/app/models/merge_request.rb @@ -137,6 +137,10 @@ class MergeRequest < ActiveRecord::Base reference.to_i > 0 && reference.to_i <= Gitlab::Database::MAX_INT_VALUE end + def self.project_foreign_key + 'target_project_id' + end + # Returns all the merge requests from an ActiveRecord:Relation. # # This method uses a UNION as it usually operates on the result of From 4f6d1c1d70d744ff599ae9c51e1cbc3a3c23e13e Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Wed, 19 Oct 2016 11:53:31 -0200 Subject: [PATCH 167/174] Rename Labels::CreateService to Labels::FindOrCreateService --- app/models/project.rb | 2 +- app/services/boards/lists/generate_service.rb | 2 +- app/services/issuable_base_service.rb | 2 +- .../labels/{create_service.rb => find_or_create_service.rb} | 2 +- app/services/labels/transfer_service.rb | 2 +- lib/gitlab/fogbugz_import/importer.rb | 2 +- lib/gitlab/github_import/label_formatter.rb | 2 +- lib/gitlab/google_code_import/importer.rb | 2 +- lib/gitlab/issues_labels.rb | 2 +- .../{create_service_spec.rb => find_or_create_service_spec.rb} | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) rename app/services/labels/{create_service.rb => find_or_create_service.rb} (96%) rename spec/services/labels/{create_service_spec.rb => find_or_create_service_spec.rb} (96%) diff --git a/app/models/project.rb b/app/models/project.rb index bc15ca3fc2e..a6039bb8cc4 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -734,7 +734,7 @@ class Project < ActiveRecord::Base def create_labels Label.templates.each do |label| params = label.attributes.except('id', 'template', 'created_at', 'updated_at') - Labels::CreateService.new(owner, self, params).execute + Labels::FindOrCreateService.new(owner, self, params).execute end end diff --git a/app/services/boards/lists/generate_service.rb b/app/services/boards/lists/generate_service.rb index 1d3c7f2071b..939f9bfd068 100644 --- a/app/services/boards/lists/generate_service.rb +++ b/app/services/boards/lists/generate_service.rb @@ -19,7 +19,7 @@ module Boards end def find_or_create_label(params) - ::Labels::CreateService.new(current_user, project, params).execute + ::Labels::FindOrCreateService.new(current_user, project, params).execute end def label_params diff --git a/app/services/issuable_base_service.rb b/app/services/issuable_base_service.rb index 4554963370f..bb92cd80cc9 100644 --- a/app/services/issuable_base_service.rb +++ b/app/services/issuable_base_service.rb @@ -88,7 +88,7 @@ class IssuableBaseService < BaseService return unless labels params[:label_ids] = labels.split(',').map do |label_name| - service = Labels::CreateService.new(current_user, project, title: label_name.strip) + service = Labels::FindOrCreateService.new(current_user, project, title: label_name.strip) label = service.execute label.id diff --git a/app/services/labels/create_service.rb b/app/services/labels/find_or_create_service.rb similarity index 96% rename from app/services/labels/create_service.rb rename to app/services/labels/find_or_create_service.rb index bb475ce741d..74291312c4e 100644 --- a/app/services/labels/create_service.rb +++ b/app/services/labels/find_or_create_service.rb @@ -1,5 +1,5 @@ module Labels - class CreateService + class FindOrCreateService def initialize(current_user, project, params = {}) @current_user = current_user @group = project.group diff --git a/app/services/labels/transfer_service.rb b/app/services/labels/transfer_service.rb index 65b4bdbaff9..f91b3724aef 100644 --- a/app/services/labels/transfer_service.rb +++ b/app/services/labels/transfer_service.rb @@ -43,7 +43,7 @@ module Labels def find_or_create_label!(label) params = label.attributes.slice('title', 'description', 'color') - new_label = CreateService.new(current_user, project, params).execute + new_label = FindOrCreateService.new(current_user, project, params).execute new_label.id end diff --git a/lib/gitlab/fogbugz_import/importer.rb b/lib/gitlab/fogbugz_import/importer.rb index f154ee689cf..ce4d87a0741 100644 --- a/lib/gitlab/fogbugz_import/importer.rb +++ b/lib/gitlab/fogbugz_import/importer.rb @@ -75,7 +75,7 @@ module Gitlab def create_label(name) params = { title: name, color: nice_label_color(name) } - ::Labels::CreateService.new(project.owner, project, params).execute + ::Labels::FindOrCreateService.new(project.owner, project, params).execute end def user_info(person_id) diff --git a/lib/gitlab/github_import/label_formatter.rb b/lib/gitlab/github_import/label_formatter.rb index 8ed1574c4fc..942dfb3312b 100644 --- a/lib/gitlab/github_import/label_formatter.rb +++ b/lib/gitlab/github_import/label_formatter.rb @@ -15,7 +15,7 @@ module Gitlab def create! params = attributes.except(:project) - service = ::Labels::CreateService.new(project.owner, project, params) + service = ::Labels::FindOrCreateService.new(project.owner, project, params) label = service.execute raise ActiveRecord::RecordInvalid.new(label) unless label.persisted? diff --git a/lib/gitlab/google_code_import/importer.rb b/lib/gitlab/google_code_import/importer.rb index 904a228aeef..b16a5654096 100644 --- a/lib/gitlab/google_code_import/importer.rb +++ b/lib/gitlab/google_code_import/importer.rb @@ -234,7 +234,7 @@ module Gitlab def create_label(name) params = { name: name, color: nice_label_color(name) } - ::Labels::CreateService.new(project.owner, project, params).execute + ::Labels::FindOrCreateService.new(project.owner, project, params).execute end def format_content(raw_content) diff --git a/lib/gitlab/issues_labels.rb b/lib/gitlab/issues_labels.rb index 6788eca7146..01a2c19ab23 100644 --- a/lib/gitlab/issues_labels.rb +++ b/lib/gitlab/issues_labels.rb @@ -19,7 +19,7 @@ module Gitlab ] labels.each do |params| - ::Labels::CreateService.new(project.owner, project).execute(params) + ::Labels::FindOrCreateService.new(project.owner, project).execute(params) end end end diff --git a/spec/services/labels/create_service_spec.rb b/spec/services/labels/find_or_create_service_spec.rb similarity index 96% rename from spec/services/labels/create_service_spec.rb rename to spec/services/labels/find_or_create_service_spec.rb index 1e4bc294b46..cbfc63de811 100644 --- a/spec/services/labels/create_service_spec.rb +++ b/spec/services/labels/find_or_create_service_spec.rb @@ -1,6 +1,6 @@ require 'spec_helper' -describe Labels::CreateService, services: true do +describe Labels::FindOrCreateService, services: true do describe '#execute' do let(:user) { create(:user) } let(:group) { create(:group) } From e6957a6b4776c47e7f21bd7494e4efafa63501ca Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Wed, 19 Oct 2016 11:59:31 -0200 Subject: [PATCH 168/174] Remove order by label type on LabelsFinder --- app/finders/labels_finder.rb | 2 +- app/views/shared/issuable/_filter.html.haml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/finders/labels_finder.rb b/app/finders/labels_finder.rb index a5802171b6c..6ace14a4bb5 100644 --- a/app/finders/labels_finder.rb +++ b/app/finders/labels_finder.rb @@ -31,7 +31,7 @@ class LabelsFinder < UnionFinder end def sort(items) - items.reorder(title: :asc, type: :desc) + items.reorder(title: :asc) end def with_title(items) diff --git a/app/views/shared/issuable/_filter.html.haml b/app/views/shared/issuable/_filter.html.haml index f8018fc3de0..8c2036a1cde 100644 --- a/app/views/shared/issuable/_filter.html.haml +++ b/app/views/shared/issuable/_filter.html.haml @@ -27,7 +27,7 @@ = render "shared/issuable/milestone_dropdown", selected: finder.milestones.try(:first), name: :milestone_title, show_any: true, show_upcoming: true .filter-item.inline.labels-filter - = render "shared/issuable/label_dropdown", selected: finder.labels.select(:title, :type).uniq, use_id: false, selected_toggle: params[:label_name], data_options: { field_name: "label_name[]" } + = render "shared/issuable/label_dropdown", selected: finder.labels.select(:title).uniq, use_id: false, selected_toggle: params[:label_name], data_options: { field_name: "label_name[]" } .filter-item.inline.reset-filters %a{href: page_filter_path(without: [:assignee_id, :author_id, :milestone_title, :label_name, :search])} Reset filters From 1d8b74fee34af0f13e69a3363417493746279488 Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Wed, 19 Oct 2016 14:47:17 -0200 Subject: [PATCH 169/174] Avoid touch label links that does not belongs to project when moving it --- app/services/labels/transfer_service.rb | 57 ++++++++++++++----- spec/services/labels/transfer_service_spec.rb | 29 ++++++---- 2 files changed, 59 insertions(+), 27 deletions(-) diff --git a/app/services/labels/transfer_service.rb b/app/services/labels/transfer_service.rb index f91b3724aef..514679ed29d 100644 --- a/app/services/labels/transfer_service.rb +++ b/app/services/labels/transfer_service.rb @@ -4,48 +4,75 @@ # module Labels class TransferService - def initialize(current_user, group, project) + def initialize(current_user, old_group, project) @current_user = current_user - @group = group + @old_group = old_group @project = project end def execute - return unless group.present? + return unless old_group.present? Label.transaction do - labels_to_transfer = Label.where(id: label_links.select(:label_id)) - labels_to_transfer.find_each do |label| new_label_id = find_or_create_label!(label) next if new_label_id == label.id - LabelLink.where(label_id: label.id).update_all(label_id: new_label_id) - LabelPriority.where(project_id: project.id, label_id: label.id).update_all(label_id: new_label_id) + update_label_links(group_labels_applied_to_issues, old_label_id: label.id, new_label_id: new_label_id) + update_label_links(group_labels_applied_to_merge_requests, old_label_id: label.id, new_label_id: new_label_id) + update_label_priorities(old_label_id: label.id, new_label_id: new_label_id) end end end private - attr_reader :current_user, :group, :project + attr_reader :current_user, :old_group, :project - def label_links - label_link_ids = [] - label_link_ids << LabelLink.where(target: project.issues, label: group.labels).select(:id) - label_link_ids << LabelLink.where(target: project.merge_requests, label: group.labels).select(:id) + def labels_to_transfer + label_ids = [] + label_ids << group_labels_applied_to_issues.select(:id) + label_ids << group_labels_applied_to_merge_requests.select(:id) - union = Gitlab::SQL::Union.new(label_link_ids) + union = Gitlab::SQL::Union.new(label_ids) - LabelLink.where("label_links.id IN (#{union.to_sql})") + Label.where("labels.id IN (#{union.to_sql})").reorder(nil).uniq + end + + def group_labels_applied_to_issues + Label.joins(:issues). + where( + issues: { project_id: project.id }, + labels: { type: 'GroupLabel', group_id: old_group.id } + ) + end + + def group_labels_applied_to_merge_requests + Label.joins(:merge_requests). + where( + merge_requests: { target_project_id: project.id }, + labels: { type: 'GroupLabel', group_id: old_group.id } + ) end def find_or_create_label!(label) - params = label.attributes.slice('title', 'description', 'color') + params = label.attributes.slice('title', 'description', 'color') new_label = FindOrCreateService.new(current_user, project, params).execute new_label.id end + + def update_label_links(labels, old_label_id:, new_label_id:) + LabelLink.joins(:label). + merge(labels). + where(label_id: old_label_id). + update_all(label_id: new_label_id) + end + + def update_label_priorities(old_label_id:, new_label_id:) + LabelPriority.where(project_id: project.id, label_id: old_label_id). + update_all(label_id: new_label_id) + end end end diff --git a/spec/services/labels/transfer_service_spec.rb b/spec/services/labels/transfer_service_spec.rb index cb09c16698a..ddf3527dc0f 100644 --- a/spec/services/labels/transfer_service_spec.rb +++ b/spec/services/labels/transfer_service_spec.rb @@ -5,33 +5,38 @@ describe Labels::TransferService, services: true do let(:user) { create(:user) } let(:group_1) { create(:group) } let(:group_2) { create(:group) } - let(:project) { create(:project, namespace: group_2) } + let(:group_3) { create(:group) } + let(:project_1) { create(:project, namespace: group_2) } + let(:project_2) { create(:project, namespace: group_3) } let(:group_label_1) { create(:group_label, group: group_1, name: 'Group Label 1') } let(:group_label_2) { create(:group_label, group: group_1, name: 'Group Label 2') } let(:group_label_3) { create(:group_label, group: group_1, name: 'Group Label 3') } let(:group_label_4) { create(:group_label, group: group_2, name: 'Group Label 4') } - let(:project_label_1) { create(:label, project: project, name: 'Project Label 1') } + let(:group_label_5) { create(:group_label, group: group_3, name: 'Group Label 5') } + let(:project_label_1) { create(:label, project: project_1, name: 'Project Label 1') } - subject(:service) { described_class.new(user, group_1, project) } + subject(:service) { described_class.new(user, group_1, project_1) } before do - create(:labeled_issue, project: project, labels: [group_label_1]) - create(:labeled_issue, project: project, labels: [group_label_4]) - create(:labeled_issue, project: project, labels: [project_label_1]) - create(:labeled_merge_request, source_project: project, labels: [group_label_1, group_label_2]) + create(:labeled_issue, project: project_1, labels: [group_label_1]) + create(:labeled_issue, project: project_1, labels: [group_label_4]) + create(:labeled_issue, project: project_1, labels: [project_label_1]) + create(:labeled_issue, project: project_2, labels: [group_label_5]) + create(:labeled_merge_request, source_project: project_1, labels: [group_label_1, group_label_2]) + create(:labeled_merge_request, source_project: project_2, labels: [group_label_5]) end it 'recreates the missing group labels at project level' do - expect { service.execute }.to change(project.labels, :count).by(2) + expect { service.execute }.to change(project_1.labels, :count).by(2) end it 'recreates label priorities related to the missing group labels' do - create(:label_priority, project: project, label: group_label_1, priority: 1) + create(:label_priority, project: project_1, label: group_label_1, priority: 1) service.execute - new_project_label = project.labels.find_by(title: group_label_1.title) + new_project_label = project_1.labels.find_by(title: group_label_1.title) expect(new_project_label.id).not_to eq group_label_1.id expect(new_project_label.priorities).not_to be_empty end @@ -39,13 +44,13 @@ describe Labels::TransferService, services: true do it 'does not recreate missing group labels that are not applied to issues or merge requests' do service.execute - expect(project.labels.where(title: group_label_3.title)).to be_empty + expect(project_1.labels.where(title: group_label_3.title)).to be_empty end it 'does not recreate missing group labels that already exist in the project group' do service.execute - expect(project.labels.where(title: group_label_4.title)).to be_empty + expect(project_1.labels.where(title: group_label_4.title)).to be_empty end end end From 2fad811d0d028a7bb663ae9c2ff1ed3b251a82a0 Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Wed, 19 Oct 2016 17:27:10 +0000 Subject: [PATCH 170/174] Spaces before `}`! --- app/views/projects/cycle_analytics/show.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/projects/cycle_analytics/show.html.haml b/app/views/projects/cycle_analytics/show.html.haml index ef24ec0cf29..b647882efa0 100644 --- a/app/views/projects/cycle_analytics/show.html.haml +++ b/app/views/projects/cycle_analytics/show.html.haml @@ -2,7 +2,7 @@ - page_title "Cycle Analytics" = render "projects/pipelines/head" -#cycle-analytics{class: container_class, "v-cloak" => "true", data: { request_path: project_cycle_analytics_path(@project)}} +#cycle-analytics{class: container_class, "v-cloak" => "true", data: { request_path: project_cycle_analytics_path(@project) }} .bordered-box.landing.content-block{"v-if" => "!isHelpDismissed"} = icon('times', class: 'dismiss-icon', "@click" => "dismissLanding()") From c90a31ebcf56aa095e471edb2cd21df887318d1a Mon Sep 17 00:00:00 2001 From: Fatih Acet Date: Wed, 19 Oct 2016 22:09:18 +0300 Subject: [PATCH 171/174] Remove show_menu_above attribute from issuable dropdowns. --- app/views/shared/issuable/_form.html.haml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/views/shared/issuable/_form.html.haml b/app/views/shared/issuable/_form.html.haml index a7944a60130..ee5c21f0762 100644 --- a/app/views/shared/issuable/_form.html.haml +++ b/app/views/shared/issuable/_form.html.haml @@ -88,19 +88,19 @@ - if issuable.assignee_id = f.hidden_field :assignee_id = dropdown_tag(user_dropdown_label(issuable.assignee_id, "Assignee"), options: { toggle_class: "js-dropdown-keep-input js-user-search js-issuable-form-dropdown js-assignee-search", title: "Select assignee", filter: true, dropdown_class: "dropdown-menu-user dropdown-menu-selectable dropdown-menu-assignee js-filter-submit", - placeholder: "Search assignee", data: { first_user: current_user.try(:username), null_user: true, current_user: true, project_id: project.try(:id), selected: issuable.assignee_id, field_name: "#{issuable.class.model_name.param_key}[assignee_id]", default_label: "Assignee", show_menu_above: true } }) + placeholder: "Search assignee", data: { first_user: current_user.try(:username), null_user: true, current_user: true, project_id: project.try(:id), selected: issuable.assignee_id, field_name: "#{issuable.class.model_name.param_key}[assignee_id]", default_label: "Assignee"} }) .form-group.issue-milestone = f.label :milestone_id, "Milestone", class: "control-label #{"col-lg-4" if has_due_date}" .col-sm-10{ class: ("col-lg-8" if has_due_date) } .issuable-form-select-holder - = render "shared/issuable/milestone_dropdown", selected: issuable.milestone, name: "#{issuable.class.model_name.param_key}[milestone_id]", show_any: false, show_menu_above: true, show_upcoming: false, extra_class: "js-issuable-form-dropdown js-dropdown-keep-input", dropdown_title: "Select milestone" + = render "shared/issuable/milestone_dropdown", selected: issuable.milestone, name: "#{issuable.class.model_name.param_key}[milestone_id]", show_any: false, show_upcoming: false, extra_class: "js-issuable-form-dropdown js-dropdown-keep-input", dropdown_title: "Select milestone" .form-group - has_labels = issuable.project.labels.any? = f.label :label_ids, "Labels", class: "control-label #{"col-lg-4" if has_due_date}" = f.hidden_field :label_ids, multiple: true, value: '' .col-sm-10{ class: "#{"col-lg-8" if has_due_date} #{'issuable-form-padding-top' if !has_labels}" } .issuable-form-select-holder - = render "shared/issuable/label_dropdown", classes: ["js-issuable-form-dropdown"], selected: issuable.labels, data_options: { field_name: "#{issuable.class.model_name.param_key}[label_ids][]", show_any: false, show_menu_above: 'true' }, dropdown_title: "Select label" + = render "shared/issuable/label_dropdown", classes: ["js-issuable-form-dropdown"], selected: issuable.labels, data_options: { field_name: "#{issuable.class.model_name.param_key}[label_ids][]", show_any: false}, dropdown_title: "Select label" - if has_due_date .col-lg-6 .form-group From 2fabd1a123e2bcbf8f372679cacd50fc1da11252 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Wed, 19 Oct 2016 22:14:57 +0300 Subject: [PATCH 172/174] Change the order of tested methods in project_members_controller_spec Signed-off-by: Dmitriy Zaporozhets --- .../project_members_controller_spec.rb | 88 +++++++++---------- 1 file changed, 44 insertions(+), 44 deletions(-) diff --git a/spec/controllers/projects/project_members_controller_spec.rb b/spec/controllers/projects/project_members_controller_spec.rb index ea56bd72912..8519ebc1d5f 100644 --- a/spec/controllers/projects/project_members_controller_spec.rb +++ b/spec/controllers/projects/project_members_controller_spec.rb @@ -4,50 +4,6 @@ describe Projects::ProjectMembersController do let(:user) { create(:user) } let(:project) { create(:project, :public) } - describe 'POST apply_import' do - let(:another_project) { create(:project, :private) } - let(:member) { create(:user) } - - before do - project.team << [user, :master] - another_project.team << [member, :guest] - sign_in(user) - end - - shared_context 'import applied' do - before do - post(:apply_import, namespace_id: project.namespace, - project_id: project, - source_project_id: another_project.id) - end - end - - context 'when user can access source project members' do - before { another_project.team << [user, :guest] } - include_context 'import applied' - - it 'imports source project members' do - expect(project.team_members).to include member - expect(response).to set_flash.to 'Successfully imported' - expect(response).to redirect_to( - namespace_project_project_members_path(project.namespace, project) - ) - end - end - - context 'when user is not member of a source project' do - include_context 'import applied' - - it 'does not import team members' do - expect(project.team_members).not_to include member - end - - it 'responds with not found' do - expect(response.status).to eq 404 - end - end - end - describe 'GET index' do it 'renders index with 200 status code' do get :index, namespace_id: project.namespace, project_id: project @@ -228,4 +184,48 @@ describe Projects::ProjectMembersController do end end end + + describe 'POST apply_import' do + let(:another_project) { create(:project, :private) } + let(:member) { create(:user) } + + before do + project.team << [user, :master] + another_project.team << [member, :guest] + sign_in(user) + end + + shared_context 'import applied' do + before do + post(:apply_import, namespace_id: project.namespace, + project_id: project, + source_project_id: another_project.id) + end + end + + context 'when user can access source project members' do + before { another_project.team << [user, :guest] } + include_context 'import applied' + + it 'imports source project members' do + expect(project.team_members).to include member + expect(response).to set_flash.to 'Successfully imported' + expect(response).to redirect_to( + namespace_project_project_members_path(project.namespace, project) + ) + end + end + + context 'when user is not member of a source project' do + include_context 'import applied' + + it 'does not import team members' do + expect(project.team_members).not_to include member + end + + it 'responds with not found' do + expect(response.status).to eq 404 + end + end + end end From 97762a5858864dd39aa744e19bc16b555832ebba Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Wed, 19 Oct 2016 17:27:58 -0200 Subject: [PATCH 173/174] Use LabelsFinder on Google Code importer --- lib/gitlab/google_code_import/importer.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/gitlab/google_code_import/importer.rb b/lib/gitlab/google_code_import/importer.rb index b16a5654096..6a68e786b4f 100644 --- a/lib/gitlab/google_code_import/importer.rb +++ b/lib/gitlab/google_code_import/importer.rb @@ -101,7 +101,8 @@ module Gitlab state: raw_issue['state'] == 'closed' ? 'closed' : 'opened' ) - issue.update_attribute(:label_ids, project.labels.where(title: labels).pluck(:id)) + issue_labels = ::LabelsFinder.new(project.owner, project_id: project.id, title: labels).execute + issue.update_attribute(:label_ids, issue_labels.pluck(:id)) import_issue_comments(issue, comments) end From edef2d15f9f3b357074b73db3b26acc5b7ab2d5a Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Wed, 19 Oct 2016 17:28:14 -0200 Subject: [PATCH 174/174] Use LabelsFinder on Fogbuz importer --- lib/gitlab/fogbugz_import/importer.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/gitlab/fogbugz_import/importer.rb b/lib/gitlab/fogbugz_import/importer.rb index ce4d87a0741..65ee85ca5a9 100644 --- a/lib/gitlab/fogbugz_import/importer.rb +++ b/lib/gitlab/fogbugz_import/importer.rb @@ -133,7 +133,8 @@ module Gitlab updated_at: DateTime.parse(bug['dtLastUpdated']) ) - issue.update_attribute(:label_ids, project.labels.where(title: labels).pluck(:id)) + issue_labels = ::LabelsFinder.new(project.owner, project_id: project.id, title: labels).execute + issue.update_attribute(:label_ids, issue_labels.pluck(:id)) import_issue_comments(issue, comments) end

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�KtyAQ_uUK6_PYVa@tpjEk6%b2_X5grR~K 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%0DWhqRV$Stc{wOqzKww61$ z$5*0IJ>r8sqt6Y0N8RSXBFiYDs&m^+m0?z76U8NB4{U`al-YvLGws~@p-vmLXWg{slE9b z31z2CxPv;AMu6AhiVb zs!p`APSR`Prxs1%)b3+k+}G#WLJ#~OL|#8t<}Dl2ZVKXIID7?2Mk_L1$#DGCf_meB zw^0kY0c~sacmd@~jbAv^3q;g}?hC&r+^0@Qk#spac#P*~8GBq~vilr}ZuEfF5^#~u zUyDeFoHglj_ywZQftcYB5YykyjZWJN&MML$(7|)6mRk&33C~y$_v&Gowa@K4BHq*D zjVK-ES(gtft;$~A9-IHbU2Zw$@l&M%>6csG0waI3qxokI?{!vY|ods$B62zq?+w050Rl-Ct!o z*ji&)@S>N-q>+CX5s*F-!+K7$8qJBTuXN>94)!8W@tpF%`bc|m2Q{ZMX5m(essv-E znI-Y$u5k$v9kVo)ahXr#uSN5S8%-IWS$ur?rE%$ru5ZFkE1_W zV6kkR&#kPzAkzxgSz9NS>n2i=Te(quwR%mShE1CpbG3ilWEcm<8_(A*?Ic|d-#-)U z8iQ$u5cw*J(|!7SKy+njZ}QuMHr8$BfaEQmq;7^{x!yObK*MPeL3(?T-jr4xg`|1% zp6HK=gt+W9=K~Rs^cuJ~udEX)yG_uQbS^*FpDuHwD9q?smkmA!jMbmSOd7Xe8;7;e zM<#Ch#)^M$1QL~xVTT)*J4MvF7}~0+#rxfr6GI5|+A=f)19l*cdB=@~;slj{PDL=|g4E0!1FA>1}1z zA|kIMoG4}+wZKb2Dcp!~z?Mq#Kc%QCRclpB!JU6lQImoDb&^r7FHxb9r5Jk+o3!;Q zd-6z__z*NK97QEf6VM|2$Bv`VlTa{C9{ODULGcoul=knXq@X3G{54aO5d()vBS?z~ z?_vGlSQ)@&O-&R*4fDrTr9YCo(wzyfvNn5v4+9wn&;y2Agy_#f{YC!f&cs`giQvSb zL_U8yG{5{Wb>&L^3i+x$RK%---}+W1^6~14`SKHBiIa3c$0lcjM#;^78>4Fkn2={O z{*u+5dVvC1hht*3%DQKzD9glU(j#`=Q*}m`hdSFNT{fSIrkv(@Ugw7mTN~@Yn7<@C zj7JuIUN+@}LS~9L8FL%;JY&Z3$U1$e0p5SGCxSb`1uahef)I03q7b>IM!l5t@+s0`rkMGM9vdlpwy!-5mN37yfY=arg}PQ-A5hn&cUXCNvwe2K3i_LI;d7Cd>z;AR}aJU_n*u>HVWvzCwXE4rU12Ev0dWme+mx&O+8Li zq@t1##Hk=IPAjO1tD|`wP}vI5^rTS1UYzMt#958%<mB#Lf8R;i1gWC(wq1Miw=Rynn5dokBde7KXoW6!KiTAJU+R;t1) z95gV#%N6kRdEe$Hrss@1SL84EF`#SUfxVGqa&fikKtOrfgXnKEQ zVO6s_?ZKwnHbNk6M7@0?jq&sV`|IfhM>KJhD-9z^Q*O^jaAxiRc27p`#YcZt=UgKG zT*7}YBxl7?ZGF)7&qPgd!#S|p^8)UQ_w&*x9g#6t+$B)p->moQYYT7+;vtUf7F977 zkdZJ{i1AoDBpWu$RCz{r0FWCzct9tX-SwwM8G<(TWF0I$&B!3aM{s$OyU7CFKB zUvpT}dZl!-h?@8~amgU!gYg`vevu?e!dh#a zEkj81_aLB6#$>96{)%Z}!G~Y=ScwLKYKJ?{%4)D=**YxWo<~xy(72ZfgJ(4{oMJ79>hE%PeJ#-*M^&ndA(NsAvjhqaV9iz3i*clAHGZ@-_pI9S0PAAc z;Z1arUs7tXHtD`#73eOg3d7NWln+GAhDlY1t?t3p^iMV7FYRs0T^v$%#wOOWfX+RR_MeG&874sxg`+i(i8{F$ zCs%G+WQnT!PB)S=`ystk4ACFa0LU=-@?BtmMfWVOnZFJVaEd0Z517b~f3m@AGg-Se zL(M~*{kc2I@eZ%U0PKCkfu4f+`?+TUu>(fFXFz8_<8@I-1YBx=<}loGJJVQ=nKBSG zGPN3H>m0d(P<;km1&QNUdzTr)gt!$c)qo=9V3PWQVzQ&q$4)^4ME{2vj4PB1s!vzS zuk^2>1ncA~Rra#5f0*Vetin@}K)C-QW@4fSvFPh&f*H2X+KTae=v}x!_8(@#9=rc9 zM)`k;!G(#QuZD4dD+hMa^Xw|w^9VWQ^Ztj)e8H4E1qs6WA7aSgMO6i|B`T_H2KAFK zi#VbDtKa@%Dk!mt{$dROhZt{Xj}+AC*gTs(!jt)yB-ONu88!4>MQ#gP4e_^dp zEZUy!?VTJH7MLMr=WQkF`I)kJ9XymuJ7)Sm<6CI-(Xris5J>(oK$=$YFqt^{z#UKN zRxRbn%gdU3>+m@Ttr2U+4X<}p91rSI)Htt2X3Z)-RW&=mI8x5><$xFgzx{+BKvvQ$(P+9~ca(yy&C@4?|XWuoWH9 z!3_(w3rzE0-Y5K5Qoq!Le02l&VNC5ne4_a{n5x9-RK6ZUM85(~u;C-ELKyy)%U`V! z)xqIsv=snv26X)dI7IB<>G?6nKE+_4`8nC;=iKb3s6($##YyXTX4~q2jZ>>Wb`QS7 zXJcYADFACK{P8X@^WV@B0(QP5KqEkFtAS7_F_z&kUNp;pWhN<1)353xBG$404UyP6 zK0MVG*uOyQ0`mW=LqSOy=;>LRnF(oymGqRH?Ho-2pYetB^LSQrnSZF6-u)!pVO4JC z<2g`2%hxfK)6(4qcno5H_ug?qEtZRo>tqaoP&b%kmhzc?6R)dXl{u{?^oA&()Fqt* z5m2a64(tJ2|GgIxVEa21bPuGC^#5nt2@t`XKYYR8I{)9f9QxO`cs5iq==qP^1Gco= znjv>Q$YWUkM|{sZsc;}vM6Ky601a$0KOs2#PL<>94DNdBKTMr}FQ)b`@ZTx4GO{pQ zvrktLZefbnlG4~eEgGTgNpsVg<+k_PJ{z0CIs#hVfM47NcKXlU{kvoB!vDvgzvS01 zL<&pVf8e$m?!Cid1jA?mRtTu?KCs|l!VkdKU&0PZ{8+-x0V;(Gu|__5j8x1F)q>0) zqM7Z{DeHd>Jb%Q0#eHDM|3}ZIvW-2^D4!pXu25Kmdq6~F&O`HG`V0h;ePI6||IY;# z&UTTrtx~9t@t}Bp++!nELlpG?E}*zUR6GLmSNd-=*%erv_r0qk2$IRkna1UO`+hP&x%x z|657p?*0mwvg-m9e-cG_UQhwk@g7ri`z4cx0D#*>P&ozmhy6?c30V0{?*$_IPimXk z*gJawj*tn*q@pOQ-85JG52KY5;&TNik#$WY=H1-0v<6pu+4F$_5T3v+EdSky z_kaQ5KY=Eg+_RMab!0#lK&r79!aeI!Q_C7v1@r6ML~D8yf521Js7PO{No{4`RMe;) z={_3miB%D7A=*LclD)1B=jYzKD^_j6|?2fD-ez zpD9OXxu4EqmTF@mLxL>r)ouJXl{GP)weUUp?ZX5DSWRcj1WE+(`!nePA*ul(V^0Dj zZP=&}vl?rWIPR3}zP#cO+`{^&vFSlTK}CGS8TPK&aj*NKf6PBxMRPP0Ftcp+uGYJ2 zygC+?u18*3y6pI8-xH+cvY>v8k8A!WNU-#1 zL1X21ld1O}f6_owEsQ$47RlWjw))Hrcij#y!>&cab!fNh5=>-i)%u@&R$%-6!Udr7L1 z8q-hc_W^x&h51Otke@=0u8#E{Bh8`0PEs4nLWcEie{D@|M0JHWCyS^)Dnw10TI&ed z+xI7Q+TOSGM^sFPtk4b09A*N(>YS$@W`ga`XY zBDlm(zoTk!e*GFj4$8T#v+Z(Ez?br@6#4j)^Q1nji^P`--oTAhfp>i{zk*fYP2DCd zEOD2jf6x#Hp`GsC50~+0)Xjq3`M%b9dFT6!6M>C(E9u}e*n_az>v#g)kj3Ea{U87i z_xaIU_M4j2J>#C|4U+%ZFa6u(i|)`5>i>)g(!d@dbpFrc3)Be0zs;k}Tq0io?{KD+ zVKCMQFmPZJHUgdp1?wU_6O-Va)ky-p!ByiqfAiQugrJ4Ugz$wt6+ImKOa+35{$xeN z>i70_z2*h8Pnf#okWUs=>Nh9`Kqq0{8EBG8{p>^YmJ49x{*9$CPRVUtKTi? z%=+kb4tMgOmIR4B0jQvrppu`E9G#rd+fs9n{v3sMNCst#w+DMQYakqPJ0APs%t`w6 ze_&_FB+@lW!<}Jrxu-)@5UsZce*0#6K88Uq(EuVP6&Y&LnS6bOg>-DDz% zG)`tIhctft2uYqSSUgPpD41L{47r<3gv|@gS{zKC>~s!E{y^rT1#mW^j9Ww;{_PfC zIP4pAxZ+ziTm7Z#R!+X!C0Jl; zkc=F#Yyi*m=dbqfE)fV9aPU0{lnazV8ih)HE`#*DYfb-3iEwDbq^aSvQ-7l|2j20Y zR_7m=J=dYYvSoCru|x}##it_nvz5Uv38UoLA0TGm|p>p?ZLMhWZ68-Im6{6RBub1InaK^OA!Ob2>oPt^jR7;cAAe_32yoLqus zod)w%j@!2+g$aaaU~IX175P+jXI4KWZRRw|?rXDF?G&Ks5_2#FiJk|HnI49!bj3jyRA z$08R_7?wdfT1ShXHBhVzf5eJ^2+$876bXt9e2rLoesMx7K(U}O87#i5%n?Msm>l(5 zpoMnr0aL+N!Ae0BkZ1@!)fqPzGSLqIGjW8{^GhkjDWCG9qg_eizIg{fdOY3swnqeJ zxOl_D5#A~ea(aW{=MQ^g3ud#R$mMHuPazaI@k9HQMr3YEEAwP5f9g11@o4R{-c_s@ z>)x>Qz&~aeYysjwilK8C{g)_zg!HrG^nxr^d&~zTB#Ld{`Gb8SwMe`=K89zm<7q1s zR6K`SGD13hTsiPaqCxlS9P3yOS9_x3Wd3-pRoFGpk!P(K4t4-GIW_+U)3^(H+Ef*Q(g^9wSMn@m+^!JbXmrR^qB!ey--!WaFogw zugdK7wzygLc5CYKX|Dw5m|%itu2eUY^k8Ofp~3znU?Z=>qN~x|^YbRoTPTIwx*zg# zjP5EB8;Ns_S_Qu1SCoun5;U+x-cO-C5{*w)jkva*lFrS2e*!Wf2`N+!sVNC#KWNPm z@l>{=rvNie*w2*JPS@V+cRR+<@BX%69+y9KkVeA}v3qGELedkg2~pIYb|l)Gi=;;O z;JHr~)Un=s)1L41#5_RJTZpl=76U|d6}x~_l}z!%KNg;ro{R9)7A3;05UGu1(=8FF zm8&S-q^U3gf3(09k~xDy9@1AS`8^dM>TWBG=g<%sZc|yywHXv^lV?en?d*?-c%Uk> zdR`oq7YnV{7YoUH{hxg+P2lcXQL8u{{5(e<#FE)__3`HxEYJf#Kt*67 zMc4`{JTO4fMFq3(rE|a%Uhs6hz0W{ahz%oT`&Ot{y;aqC2NH*Z<9I=Z;D~U_Ows7$ z06|N9e;zEbN%O~{%bLW#pLs~|PV97Y=oJJwtQ1*YC$M`~mzs^;#wgNPwH|}K|8ni*PE6riaW+{hG+h zi=s3kNiDKFW0ZY$NJY-`v(_>(6yi9V;t3K=1^1g)0(z_N?)*21eoA06lsFgWWESjQ z+~2PcZ+~vy_LtT+h%So?RAo^~%A-}sX?~)(3Y6Ewum5(kq{OT%V|C;U&WMb31albF zfB&5lyWGxzN=!z;0NYr?sTP6@2M*aV4^c_-@~DVP$>pA0T3=bOj5Pq1tgem?Ql+R# zb&Ms zSGMQ7p{sjlh5XU(mCi0_I~Y_emt$qOPRX*e{5YAhi@nb#V_q?0v=lQNgPS{=e|m## zIoLIX;rHIj0#>L#1Wi^<$}ivccK3-(gCd3ScQ>dEPNbK#v-7xWD?+UaxUP%>7DjORg0kwY zPB)-#X6I**5P-fT=`zUBlI@=8e>F2$X|X5CiM)~mDgc$zP}QDq4wol1R{0+6d!)}Y zpivcfV*J$7m*0_@0Pc+^J_{Fb?)h|gVt2|-b%jv}7gH>Jk)zNQ&J%;Ns6Ge0ZLSD` zJe2G1=CJ+eL*xzyG{xjnB2lS$(1R4ITJ)`8P5bd^=Jq7v!a+>KU3yK$YYwXk6hRYV4_HRM)#Zo%ay#mAvKe}i z9Gr;aF=TLJO0NpoK%35$&OP@9!k1YMQnjwsY}XkM@<1rIt~PiSVh@L>w?A*xXCV&4 z7;ap|kQP$Xql!Tul5Y-~e`A96Exz6c%hyeY?=;Y#p3i~ngR{V}!tc%_qXQ2#R+qhW zt*Hh3o_6k3tO1%M1MIDJncjzqc7S-LRocV!$u`$@l#Y4&2Gnx>(6BKm+_{=RP#?P+ zBCn|IY|{R+FoxPF&On}X?Y&1dH-}yI8}RvTkswDvehf!yePUGte_pmN>Y1~f+!XIC zz?0gc&uKX_Qmd?&Lb;==Yx&=Z4sqkf{t#Mo*K0l`wk8RFmA+bwG59U&U%kF=YL9D8 z6E}qc4&o&proq!4SGGL1!=h=zy1f(_*KFO;HpCmqceAB|BbS-2Qzd%W+oXe2v$|Tk zB(~Uy$yt^3r(jfbe}PQVg}b|HzO$yq_0euo1LBRe=GXpEeZ?KUEt_F2n-~G3;e@)% zeSJ_}A*%@3T8dHX!5oh;pg00zHtTC0KqM!0`#hamL}pQaLoE-Yzy*_DoNz!sBv>1Z zO|1Ns=3gN>7nF3$*cIu+}jez&PxgDI$j4I=*kSSRupZ5$~%0^w4k|EM& ziR(i+UgbN*fAkkmbX^Mfo_8`ZeeGI&tY6tJB5|!=`-R?CXX|R^iz}b?UTOZetQ|$q zJihP87*FR)7K$fI(31lLB!39zsx2QMg88k+pE(=mTb+5kobMlhlH@|StX`pfucE<@ zGH3NvSZ(FLmWyr^ruc&U+I))a{P}8cuh-o>FKhI_f7cwecle&`>c*bGZ`SINPJX31 zySxP=Bz~t{n2qS&p*?{5F{3%Dcrb$pxk+1Y>%1{-zMb{$9QhKqRf&|~NOe|yK*hlS zAa4wlQwm^l5FA@DCUDA#E3+I=XV#U>*bqyciLG5t-p@&ijqTK&)n}w4mzs#VV52(q zO7eB*e><5efOZ3={`Lga{N9D03SoCzuINJJ zh1|lL)0miw+>!05&Oq{8`noK|ofytB&I`d<(zpB4wfm>bG#Bjln~rH=)W#I2cXqAr zbB9lq00lt$zd#=y<=0A1SG-I9%7bL}E!jOne~X*@X|1}E56zia)it61=fY)Ru4Y84 zC>zW6)Tf`{_)on^u1&-K?OUCXi(@EVXHHi4r#OKZkNoz?#i%#?SR0v1_`d#UuSr=L z&wcB;Np7wQl&~F>E_z3v?O$f-(tcT|A^17X*3YQT6VizmH2t>VF$A zE8^eAD?mc9OjdWmZfD~UG=aQgvB^H2MW`OyS1huwNS%}+K13(<{T}<odlPli@UqKyD#qY_}+WJcFyTLvok$i zRkx=5R@b|tk-T_8=2q?YY`sjkxx%BVu|Ct@f3E@*2(U*uc76^ymY*&PZv5&j{(-F#P``cvwt7}`M=+G9S`>$`$9Md&TI<y^x$dDO|=dn%;aZ^Q^HnrHYTchYO@+sN1R7 ze*Um|UL$^A7$OVK?O`z)Dm6xRNDYhz2pKG)7My!b=krGzG#Ec$%!|l%he2+v5~X=W z)>d4%LU>*k87?daASh0dMv?7x_I#u|W!( zS@Zh$dL)Qbg~PSE_KcU&jpWr=P^j#2e|%Hj+gh@KapGV_&bl{*jvQ~Vf6hI4lygH& ze(u-z=b3g5qowC)RiY)Gf%Yl%R~(Juy6hn&K*l$Ou09dL2>zKOM^ew3ej#gKC_Ws> zz;#;N6WuE)qiC(E9*F;%G*(1SoDe0Y=!|_?Mvd7G)}_GKoRFd+6u`vX*(;2}$31r( z4hZiQ!@(k@ph{Mbk1z{mz#IPpwSA~e(gEEuZIijV^!29^mxmQOR|{T%D-Ckepg1#4 zDddA1dO-q;7&jt#-zKiaY2TCUIVpPxHIkZ(WDzp zc4=JE2=)UDnLlp;nwVw>9t+s_*2J~bH~^$0KvaJ9~-HOMf}BO zERk_*6@#az6iTuz^MM(Bp6pmyF$u(e+RH6TXYdGZZ20&QmtaL>&U7W35~c|VBics0 zZ`R~E`a6ruIYJ}L6xz+yuR8dp#t`IgwnF;RMU{{ZS>+O{NWJr(nJj_#n(wmn&xnM< z(TAiaJ}#{LGA5hO9m>X{ZwE!94>qx=0YZPfI@rE@F-r}K&?hy!NOd?Skq(a_7O|;k zV8~3?eAFV>jVscUXceAhYle*iLY)skatYIYL*m75p0zM>v27E)w)h*KCVX7jIe zSbz^GZu7;9q(`Unf9_BZ{}T1!56E8AhQXiwl|=pS!+~$HxO?GxG`(@f%lD_V&5|zh zH6HTZd{5odR@XGXb&eHT54ctW+ z%a!Z?y5yPg2tP_*S&9kR9)d--mY;)2@Y5NO0j5JZIoVMLK+f zLN~hWx|?X39-`v7md&-Idixsc`w$c&4DgVJvc!{f*w2}$E$D7f0d8wBPCT2+i<4!C zeo&49ZWFND^RUkn1^P-im z_NXgyD4jFi&8QI2+z<}L-(>4Vdfd4cwsJV}D(Fnu&uw}pq!{cBn}w$1Mi3ID9r>g! z?XqDN(I$|0%jDt$NGY9p^{k%$Oszzgxo%otdHt$R6U!Q!`so~i{!gR)y89XQ(^{i4 z+NSUt4QzG%&qt&p=8OoPyn+SEYD;T(y28Un;7Wwca-7^y0>s%srtLeIY>@hfuD#-d zmJ!kw>8ru}m+n;IW@*tMOVPtUN&1|cms6dutW0sPlDG$0+)8YTPfA}Gm0M8zyO$9g z+?_;ctRn#`Gqh+e_T6sT`dgjiuYN;IEOPp$05|JD6pfH6fjNx?4^P7{X6Lwv&@{^C z&>7hq)#i$hsiv*SZ6=vr%`sJK`?+CSPEJA;=CA>@0&acY&RdrKrkMA>nG)ytt;obJ z$){~(wph+WR(RNVJvousZabJ&1eOWm|Fq%B-=tvIz%VXIY0%(#X;^38|CgN0`oi+O zLuAAn+LM7G*cC8i4N?wteJE_?JK}#8=SC+;V(*Cmm7Hf^B7tDQ3jMII@2$jQJMG~2 zO-cW2#TPqhPlAVA0oQSUc>f1)M7Zzo2yC&FcJQ(YocKH9zvE<*FYk~!m;WHiGH}}O z5L&UtcJO4`2kCdn|7zIrYd*NcfGb1c%->tx#lqXc&nF+gAOI%@h#5Fv=K47cuX=(k ziSRkuT!Sml3{}O&ztDVD6JIGktFX|suuMwToYYE^M~+a4+yU+-+D#^XNJoNk2R*0W@3hURk4-?@KLTTQtGCOL-!1_wK6M z%DgYbEw~=n!~mzqae0jI(dB7{@ZpsvMChe^U4)q5WhdN#_h+NK;hml`3HSbCsr^q# zIWoG>#Z~+2zm4;9kIsEU?EbZuFgwuEmFq2LXltGb*yN1=3f!_i;0?eVB(t9K+yT*V-;C#N+CaDx?}SebwzS)`0au z!11D@226HyUW!PUmEt~8ZV74LN(;YxDGd?k+b>{3Tx;Iu@p##ulW%Lah{4})ckQPE zb5@i9M3NQ;^*a!7`O4ihDYpC?=}m7uIZI2j{2yQAjGaXlr^tN6$Q-@8%xX2{bKYje3La6LrIdcPI%WaxFd75qec-|ydz=2fFS zkIMQ*`7RT@-QF&`vl7Vrt#K3^Am_B*ttqWjv#Ahns+@L>Fx{8 zs(1EAhU~yu5U;3FbqVAs-01Zpu^*B7WuFEh;J1DdY_EJV$XIdI_ZWl66SR4Q7djWkWFY_U z>9!2ns{n`V?|h9ODKjd3rNXzSQQNjQ3zpa6p5-%Y-nD;^)w$>+zLQI~v$%Rf%iBx5 zfROQUI@bL2Av$EV>Bn;?c^ciw+fBTTJ9+u8_LBb@Os-Jc}FU^ zpWg>OzxEr6ycx$dbHo6R=T`*=d-j44o&IxL-mTt4d&~M)rwom~`Pz0hSNI79S*{mr zclx)_f9ax*>P~K_d9?u@uTYbgeffSSqqK1=;jR6Km94*c94{R;>i z?`=P8Jm@(e9>$P1TIP+Z>4n4yF2SrHQj;zQfpUAcwcdQvGHr{^J{yJi+R(xv@cd1l1w(|RW; z%o>mXEbz1;%3=jo%IbAAax7zay_SMY)#R6LN&dXJpB+O|V-1<@{{w!%jf7jl@QlXk zqL?Q#u1z`50gB3uyVc3`iWTeLWjZ5YgRP+5VMXEI3eu(*t6V4P#;!5@ zC95xN-WG~Hz*6mBR_h$HUUni(f!6O9VAg8hmw!)LOfl^mWKIVG;iWQB-)8QT)|rL2 z2)6f%BgfO;Ix>CG;(+GgAeTFTz~hIJ5cuVc(-$<92HLoYX`3rFdPOu}Xia6tU#+{^ zdjUZC%l1bF%cAEOg4i()&Wg!&O-hj2n*!Eki>8|ft0e@%)w`hj$>`9Pw=X>49lHvD zJGX%dn=ujl-GcpW$1QT{7T&#DeDoCs@4W?^wq()iH%;9=70SW3pDj1w}YF%2a<#NkN#yhzfN5>idL>{KW|<)PN%7b z8uD&d!H=Ij&&*hkWwirtXN~ih>mKBf9Zcj7Pk(+oy+7c)VsyNa+vC=sndY|?$5m`>tOw#s;-^IZzw?|%Zbs~G4|;&I@7rrMt1Wnt zg^n4x3LLKR*$OrAFyP_M{4#GIQhDg?^)k|1hn{u55VcGv3iw>tvb@kd%m;^d`}?>L zwmudT8o1wwv~aY!PrNI`283JJQoZIEe#@Y(lr6WQ-hG=k_rm-9csBNz_pN0|;;G`d zL*?P6PK-?XAWG(WZ|CK6*1U({Nj*DY4q>UiBe{G|$aL3W`C7?jq&R%# zzPJlhJ@4?=20$`b#||H;9wya*V}5VPWPA$+qF55A4PkQB2iP|ON5|wrZP4YxkfcSs z(8=RuzvU~>{!u3R@$0PO_8wXrEnxHV#1!3lFf+NldOgjsFEY~r1#-Q@HeGMAemb^a z+CKXrZ()>>?P2+XI-YfR$msw)%FionD;hN3jMK#cZ3iodi#~5Hov$@*K3p zlnu^-yPpY0i;yuFk8hVZK8Qkmp@y#GGTCQ0ryJ{m>dhm~t*-^ig_(7pV;uX(ST%;( z?%yr$j2<%!TjyGrsXTVw%hyltwaMFF`}?f2Zwc=JWx!>Q;*lb~3?cjVcIQYi$p=`Q zq7rR$z3NOpsk{5N#P0pNeSxl&`8*SqiEsk&ooC8!k3B}&Ft}N+H}BN{R9w!udnIpc zKTXPt8C}18s8}|1dyQ^Co&@q^#(jLdk9}8+_qH_iwMR0V9|E*}tCDXBCXXjYTh{NQ zWE-b_+ZEfj>BdZXSETnK_lLi;TY+(O%QeB*1Hs4kHP?ROMp%UPmot`aS_rqR#S1Vr z8iF=v0RWdC5C>-n?C@(|SuNSiL$?h}llS8nWIC=>-+P3oii4@Y!!2#R`j11|WS);z zxZ0v3=gMw3X7422w4#q&363=Vyf)`*yoy8waoE-%-lp}u zf<}7<4Mm>AcIFya(MCm{Rt)*zG2q-$ud|b1UtqCmVZxV8Ua*znPijVrM)7 z|8r(THzojp_IKZ&FS?EHKvywO%$^T{4wWEeQI}qa_ZiEpd7+!igf|CBr3f`Xsp%Wf zcHWZ*v8(uLY-YCb6Z1n-e)HK4-o5qA3nJ#vxu<5}e%kwKhP?hN)qAbw(&$d#WB)ff z%1I2%v)e))HhBy1b0ex73vn-7f9kXoY^2`^f^CA-841LB`W0>_gyA8@B+h?b{uut@19A0_+r(J^H znoyDbR;VDE_g!#$l+NXGFrr!ipIZX2(V_=pdr4NI`>Yo&(T7PY!1Mm14e;F)Wh$JM zXK6kYp8!m6q4%HJa91DB_b%nZHx3OpRxkIkAuV?&iNtS@^T4ayd}$IjYs=ly>e%zi z9=~v5tJBJ+c8eqA&+$Hb(O`DX<1ct%JSTI_*WtFk$?ncN*_4Hhe`|O7s`)dC$J$VH zTg&l{5z$p;d);xksY_o(`--ESkJs7&=9|Y&6yPIcRO6}X1r8C%&wd*kWqNhGYu1}? zM1-#0?7aH5>d<-)HfmQ;@ID%Ji5A6%@I3YoqZvHB+`XA;gQl;yPWSN8MLGVABMYxB z?(7Qw;(jYCCgpOP8$@*Af1PU5Mi<)bq1qRoK~x~U>p37!qEQB&C28*_M?-$z*WB2+ z1FZ*{;Ftvqu!w_D?8@VmcLmYiqVY&)$GMEor532rYV10UMliM00e zBmVOJFXOS z{A&lzneL()AlTi`A5tNbI=;3k8(m+2SXL0a{JgCk6Lb2wV4PpCZ}I%NSG}U^V|f3) z+wRrvaa~J6z&p^8b1mCV?=orl^=GGrVzXWAieda4D2wYRyww4?0hXa1FOOU-S3s-M z{iM!wHNaY7q|@KemHEsU_S-abNz&?yEB!AqwbI~eaG2T!r{@twT z>6LA_e#Cp&2OU`nqzPWWlsb3=v$^Zce69UyeMZ&T+9Hl;iR#J1JdSVd`zO3_;3bG5 zIge$RMZ5j^+=b|y<*pzxSKFn=8?Qy{jqg#};+<`KFNI)+*Zy!LH$GVtXzTaWxX9V0 zX|%!1))0Er7P+MZ43y#_f8~bNIyQIxkmM zTG{-OF-dQ8&BqpyB|$R2f`YU3Dms*PQ}UaH{DH_-@A99J8TDIoA=k)Bh;qvLD=+J+ z_d~ZJ`8(+bgqyFYzDed|&!W2i?}+OSs|Qoq%Rq3vbsp zZ(rO6odJlAyMSeaci)NAL`xN`(qdu%^>oPD?ENb4{F>W}uMCT?`<+J(uYKeGiwiMt zTK$Rg_*j)8=(KF!>z04Jn%kSXc{hQ#g79uJKyTM!{NRp=l))z+q(CV0c7o~b75Vx^ z-gu49RF_O<^j9&WzXU?wxVYFi&MTIMfwAaz;P5%ElN@4a)PC2pYQH$@RruB!-n^L4$&&(fF>#6# zaaeT|6JzaXW;9j}OD><)^c$^tny2HU%d1BlwoU#f--b*TMhV}}S+Az@B@=8`th7SNd01{s^9b`h@%}7P`RkR><6G zwiP$+FrjWUyMyHvcOCZ&XR$(kF$Ft&g0=O?w9uQX@?@>mzMWw5M)l|A#4$RZCHt>j z)n&caQSGVnWzmSAHcNJs zi;qv$zE`f_Q(;(9xHz~#cg)!7r7|PZO%weLDC|p%JIeaV9T-O`EL8)FNn^`gyD?FN zYGsZtYvyS>nTMdNCvVA+7&8MA?8gF)J^~}&ICGca=3U9`F~n_T%^t)Qi~cH*fv;SC zL%+WXg7vd@`e=ZMd0Js`_OifS8jf9=Fu!#}H&VpDXWv2=_o2d?|Hn7>FK$UC@{5NT zYsjeX5xbYETEj2V|7H2Gzn3NDiO3M$4 zf!*}qLlo*|cHNIT3FVfg8rm}~{~yZRLv;c+oEF!v*|74RAQXka_emVNgLCQ5w02+r zDX>hY3|er0Xe+_`IoAPTLTHF;5*>Iz298ci%3Nk@AjvAL>IWbTN_NuCxQ7|qnhL5U zxIwE+R*@E$jDVpIi7t+@&PV=$uD(^MJyU^lm`IoL%hd;}h3_uUnr#UMMV&pwsb!w; zf<^lgZfYCJD7eOXpRr`6Wob6@-Ex?VYvEy{>`7TA zrDY|N#3)fD(fL7Oy1p#HQx*l`xcem&)+-~kptxzz!AuumNl4RyQ+WHE=dklJWHJ%^ ztE*vI=fD(qfr@Ow0+f__dSJE&$IelZ1Cluy+4m39w znNTAmnMt=KFr=C4YJ!p3Rb8G7^HfAI@`VAMXPb+p$fHBGPGW1UwM+D1FVV|x#%r#d z$B?}dGn-f#UTfe`c)!@=X6P+}9f?GgqXG9TBT)=Ul7azGlU~#tW!Y9vW>%Z2wA2|ZiTz4`KvNu(m>yvo zB)kj!`${8yoLVd1PlteJi%JxM{;NBUsOL2f?@c8))uLtvr>>Vh!2Mc|LxV(+K8)v5&>G3%uAVX$VIJcx6-*Xrt{*9Bw)$K?6}ca*WuFGUEBW z>mA%UfkweRj?MiZxj_r?uceuC=6Tlim^lG;^acM|wS(nsRSqqA7CT z)LdF$YyfUW5>@uMA>5YUUe|yecA;|^zkpHuSjQ^Msga9aF1A;s@XzbdL9=y*)k%)- zgourJOtNB(9N5NMlBC`}Ve`Ng08f4dO@#((qrze;i(Xt2q~NyFQ2T`4q}5~yLy)6HL5 zs4gE%{R2G%4!wV}i}kPxn`Rs4hGTRgRahs>)hvT{A8 z6Xm|y>QvwsBn0t!;zU#&&hL1lH8$CQlt}oXmrd-PDkX3(1KwDay&5ekKPk@xq%T+# zsQcuWb#I|piUtS}%n@*rsdk>6^+`+??~|;LYnyJ@Eoa4%g^S@zqvv?O7XC0~B%U{J zL=qPu+mh(tHm10&8BknJWW~r=w7Mu*G+XG>K_Lu#X1s7Zc8>R(%h!_|aGSwoEO2bC z#YFiI^(8qRjXSTDqZ470I*@<}P^pS=6+@Ny_a`r<(TzW>Hj zRDlK+DoFl8N`1-fLltk~g9~Dl8shnhK1IMc>XCPw8R-d0MG|TzkunMbOwK`fZXyYV z0Rp2bS<4({TsU8=dCtk>_}o#Ysl?t5{<{gR0#~#Fnh7Tf?8rJd7XQ)@7pFb?Q7${) zg=e-Q?u$XT;+j>0hk}fJDZ!427#BL(4|!iBYUs4#6>W3Edm4wu_4_(ptK5$r&u;1| zX7mC1s&qam$-W^e-#=e~Su;ka2I>zgiNbx!rCl^U4YmHik^{wlK|dR$GqKqJNOp(` z-Cj4ip~Vjh6%_xg&=V((CR8ypo?GBOfBJdc`Np8;1qLx0H7}0m{Kwb_(^+!(G(~Db^+I38>WH3#9k3xi;bI1qL%fn|NB*EKQ6CsYah< z^Q1QML5++!Tfq`G&oIywG1=HKkY4uvOHcwHH!}&H5+Ah)fK3%D7BBZleK5Ini;_oQ zY6C;!qC}rTNoCr8$LRC~m!IxmhrQzpx43nCAera^zsQ*%wI+9(OJ71M3=L0?)Hd4J z4qj9zH7Y4C#oT|A^eAhiu^W(ZB7utwI61Y5o%@^J5~y(0PjQ|wSVK>4`mG`9AzyAB zYa@rPm#vahf$P@J;4b;9cQDoleQo@^Uz4|Ww1QO@gK@SJ>)XZe?h$J!3bNGfmqw(Q z4a*}OdH1>$RTR`%q+(weA~4AWjF6p%YJ%NyE4{?7e}vHQD>i<=#&Xv5>_Lc;JAwKT zmglP!>=zEIyf8ibh-=l8Jng6M8o4M{F0Z~=ix~~n(qG51YQulEg(_A<&>Y$T(m7OM zo_{fBn0|o=>$K&F>8@5(AG>sBBt!D^G|o5t2}kES46g_h z3XInf<0@ZCDBYqq%&6_-q=(++`m|rL-iQb!WwIn*V0}P|7I)Y&kmlfc!}&s}J$yh& z^B$hUQ1LN65oo^WBJ8wgij&;8oqe|c(kDYpFRK_Kq44Ca$<-4Q^200u3qx5l^Jt;d zYD)$2=eQSmdJGb$PECdJ!CEbzvE<6Qk&({?R)(5V{6koQ1Q=lxA1@?kfSaDr)g&MI zI1{ExJ{w)}xbOjb5}`!w!#>O6jN8>>DhYGJ2a=_wx_sTdtdG}xvL5v1wBE=(`44bG&Sy{f87GKiI@cNgk#izN>|c zs=!!S{V3{>v1xDemcB?b@vdsI=ivzjG;BWyq*1FS_Q1aTl7xltSjBlpIZ-&X9nNWj z;U57T#Go7%V%Z_{lBMKWJ$x~p>G>@*#Tv1T-1XURRnW5MtcpA`u6ntU2`pB(y^7sv&C)=tw3 zVQye;guj_3q9VqA*Mxziq~)=V1HlzI+m6=;JQ<1m(dv zREzqVV%`fw40%ZNLszOq6_iydV2@0Hkyu_sDPvWG79c+2DRIoWmF=ZCio&X*!FRP@LpO zbPn$=Q{&k`M8yk#S+&1>X({^gI~aB0(Lb*$$%sx#Y66Zsiv(W=v{Q;#1%Q+0CR^(S zC`c${E3LmbqPZ4vmk6>jSJd>#G+N7I6sJV6YWIrS5`;-NmgIi?GxqGQ8Q*S@swO$|?63H@&!@KKdJ1T~vR=`eN1|(yC{h5t-rdC={ zE;XU!Igz5Yn)Mrn&^`X(_hq&uXMm!^L0-2l#N0B(cM&CeC!2B?+LYkTXunTtwCMRk z`ncj%6h&A-X~?%;1fr-w*i2^RbL|>1dvQ}$s)1a`<>Tplg zI;Q)UIgP;DoC*t!Fx1+mm&ICa=Z#nXQw{sga+;nz54+w%(#y-*e~_NM^J7sZOaHpd zn$c=A?JnLRL#YefAW!M~-qj@*HW>sG@nkO6^lka4ADYR1>E$&?Py2T!C`}31x8tC| z0tTC2fgNYCBfglPV^RZYi>0Oj?{6+*uL7Js&O|i z5$;n!C&_@OKNhRXH<#g3XkE^-hA>)fb@;1qlsjyFjJBXIP0!Ol#a{%^m3{x%F| z&0cPDA9B|RsA^UCKJi$JWP6eP#n$+w9sJc6BYbCM9>(614a{uY|MhZowiZcRp&^)R z>vHU>G08ZHt4XXPB7A{u5&_bJHz7o&&Tw?|jp5IRK<_H7y5Ks{A&iyiXg^UrZR%w+T|Nip%s zTLR^ZkG~gk)CLhN;o-*oKzaU6lT}^JO9XPomx;Q(IHOA5XAcc4=b$Z3l1^0e0ZnKu zVlhf{W%y5r=O+y13iS%|jc(9EHw=PX?SX;T%p&M*v)@3+PRt@C8xB8IW=bYl{|>Ou z?|flA2c}2liT0mT!)ix$@U(MIGxUy&Xy9qU=Zkf}w#8(BOYt9ysZsnpC7ChqJsi{D z=4>qA*sEs)o1l;4|6ZdX71_M;^XXDupd%rE>amm#?-F@%E*GoDdHE9zLn@TSw*Ly(`Mt_PP6Rc5+F_}#&10~cN;-`|yK>gv#)aNjtn(h%6y!mNu! z{zw>fi}8L+8ck`WWBx?DYW?&}iI9elW^|O~(%R$+4Nx7d~c!%$ts>B*cf`^D+zE z#>7FBP_~MS@rIGbp?Rc<{XZhKne`9nU&7|e?pCZF@8HU;hVb%Ar5Oe?Y40yB5q6^E~si^@mLVK|aLyM5Myn86j z22S}$M4T(kq_qj0vt~mNLUJ7)aV^H8A7cV4<-d9K3P!klfjS8TrX{6F;tfDX^GQvd zaeCRfaq1ezUN=ED@+fuQL=nEYfw9ZE9AOhN`X|oFEK=pK##ydtJgqtv{0vXHB=m1v zNTT%VBh?}K-j{UtNJ~pzeRlE?kc+nMvQG!KT)kj`>@3sT0xjg(ahc&xovkBClVzo& z7p-*)?Po0+-;OFys8GZtg)&eZ@fBtGi^qT|!>8I++6KZ&QhubmbOMolju7$GPT<02 zf7@jw@DDX+~x%~X|zG) zpK%1)d!+=aUar9YKgZz}PJ+R*J3)k(vEBF)s7?llqST%v zo$!yX`#DPwCG`y>U73t_H!L(#Us&HHM20$B2+DXhUnNpsg{S_!#nF~)$+xS-qp1Py zv7VR%b3&q)-q7paJdzeB)CT3zVJ-`F1DYkb_+lNcKLPjfR+7KOOkGBhA>R_ee|d++ zE?}sg#!Y(3WHP1p;m5REgbypFUNB^6?c;L@z z+pX~!XSj(IjEXz#&5>@k#3UZL=6i#+J!R%*2kSf=bOoZJCqXYVy6JV-@NZb>_n~zz zF86^|2tfL3OxG~$Run;aSsieHvYU?wj^3~hl`VH3t$z?v~HRSW)puWue zp>ZKYms#P(F&l&kXh5?oB=nxzB0`gLazK(cowaSo+*8Fc&x9teLMHH}G~7$_|KKpJ zj3k#*QW{Ft?r9)Gzf5IA@ff+HnWz@2ApCBsFDOD_~2==SplAJJ9 z9894@zo2qm%gCIjZg3FibBp`G&*m}M_8PnxA|jyzauPT+Y8~&?fSM;t%B3jK&ykS9 z9R<^T%PIgn@<-Es#sPh}N@6_ydsc~4R}>y{&R^3P;R}@ha6??=xzDY99WImj@KPC#x8U)RL_Ttc<)cHp2(0n&=uQv8#E7Zmqn{d`tEhv zj5fwDq39E*UmL&sWufvq-U9*9MZv=-bw1SX_mA*Isg;<8nk&~)h8m1#P=p#Fv#qkq z9Ohu@?DTl(ge4upalTtp6pqS0`Fzc$0X@p#2$>PNf*rZnn%dji#nit^NoP_ep?iPj z_*I*f@ug%T2gIxgDxOLbs~7>_Gj&$3`NFB*r8ca4Wq&1F*-fa~8$g-(SlgYicS>?eNTXtM{NtdY`e+wX(ATB7 z$JWL_*HYso=uE`eB;D=&*NR{!K14Ntip@HM3#EkMJ7E%&_DlA-HjACh-%pTH!=&_R zuKt$wj~;U!M6OAwvu60Ce^6Cds#$tNsdsOu$IR2J5txL4kh^qV7RglyEO4f&zjAsd z^KvyRok{DtCa$aO>ksF6je5~;=U@oaHwkyIyi7~CGXJGwi^^TjZQZ6to2{S3SEES< zHRHIgeQrO}Sr;dmw)|fzj-OLokp(KZ+iW@PekfE?ue-N&Ud&})xhty5oNrOc*pWN4 zmR0&l8WuPJ(jOXcECzZx@k3fv6MNFWst-P*h$7pXg4Q!svs0zie^XXkQiDIpSYcL+3sx2tO zTl!Y%U$@|9hDDP)lC0+tB2s%8Wtw`zmtHVk3-J^LgjuW#%M~tic+b@%Ep*%Z_(@5E zE5@45E}%C^9az>!MSrk62}K5urw8sqWe&~Z@XJf8F z=IjF)*!ZPfBjd{Tp)Pf7T3y<5|@#Y2fP@jP1c}nu_n*LNZ~`l#fFznSw6q%<-8v5e(fs0HH!|3&!*Yv`*d zw%Qv0W}^#eg*&z8;$G@nOtoaDvR?{Ik8l<0ho!_MND!---b5(Yi6cxz`5}ujoF?uX z4p74R+j1x-Xuwl;DSYpd@5kmx8Y74u4uviINb;?|C@D}+YA8kpPqY^EGj6L92^=4# zjw2m>WU=I+nxX`>n8NHmSvPf%nQj%EF=G&pY966l=${Ep!q72FN!R49bcCzv3S`Wm zWf)hpJRpsN-G`Q8RYo~@=S(#6CToHST0pfRO&}?ph6;XICwPRTIB%f3fFcSfKYytY zgFkGaZ;GeI)fOyaY#Ko>$^}70sGqVaK@nrTWB_f+5;|CYXdFYtkkX7I;Q6czrk;eF zn_`%`kCROGSB$i#4TxA1KQ##>8SB~=494G=Z@mps(#lMSV5uqU+i7!o-f$<^0~B-- zUZnv@)OMfd5B*H(^})T2nh*SeRrV!NjxR~%yzvyNMBPO)W4K>{Co(BjyTWY z10T|mxnKU77CytG9xVkkn$^emEDJ<2I=_&R5rtu(Vhy;75Ey@%3Pbp`{Z^6|q4AYI zk@`y#5|qMzN0-W^PQT-elsz7z36Sn9;h&>xo7?l}J^=xf(ibl(88^Yyj=O>>Pg-7% z?V~lQQ7M$jmO{Zim?HBasq4m|NX?8M16!RNx0ge)PeGodN(LH(KXLt-fn}tWySoLd zCa1q70eMpTFD;A!RCEZMa>Z4y>xuDA`?(uQq{#ku?0*Vb68=;bwp~hqw9X z(qxgpJd@c*pKX+7qY8ed+FDo(5AS2q@yKFvDBNZ4%xq+~ZNvSh9gqWLf-+O^9P{)M z@pCZl^r>vV=7vb&W*+KG^`)5)Bz*`s7b{ay=OqyBrzj=VBTyFcu@{Q$_>7nGI}CrC zy892ctT6QexbC|y&Wa{8L@1WQ(bt?jufXpBbnQ(K%IUI$GnqX5^DkVAy#3tvN}Vpw zW{Q}@LOp_}%(j4neQXT4q8dmoabr7-=)oaXTit1DF0rYGXVz7viMltSTBXL@jPV;eC8MECVW`FE*YxqHFJTi{Aj#lwzn_G(tT8r-G<|p~X#Vg|PdEF+9bnQ2S?gDB?iz#wg<;{%!)8#3udu+=VUtH6`oy z(hz^z7RDB>jOrOe@byBUv(zKExx4Kj`V+fWL0(_ zem{Hgzq1F)_y88>y@t1QH=fZ%hJgv1-iZcOGYZ|n6qv!Sl7G=iJeV`NR+P41QY>bz z@b1<#_weo}RHs)YVptC#zq`wJA}Cy} zbO)<^73$nN>#+WPVlu8r+4;W6CQatidtB3VkqRMA^h+aM#lbAnUkj(2VAz( zpn!FJJES^dkJ44R!|%o-gXp=kT1eeJ&t&l>TI}UAPK?ZrQmT()vuP1gYro5qv)V zBy>%~&rR7l+uEof?3k%FzK9bjHDDxc23eXbAU6FJwbDF+X2~~fgZ}=MFNxbWcx6y) z@?A-%BEKcpWM7As|Dy?37@K)41`2o1$8r_bPrn<)zlL}Ii;iRDZ&HYw%w_zzf6$|XJ&bugT zu#$6V(lz=sg%JVw>Ef>}Ck}_ted$tGEYmF4&%;6Y4skIA4g-aOP&AZkiAoVT$k4-F zuF+_L2LdJni3*y3(>nc%U2qL~QBhMY1YsNi#!yg6uIqlM1irI|pURtYT*1;DTiZvc ztTD6F9Fqb|or)`e7*k)bPw?rqp~1zHpRh~P2h75Xs^L@M{Heioi=Wgo3L_+ZLW7+x zo!yr3>Np!5D8Z&m`UGj?6Hd_Mcq#U zRn!&U^hpTCL-(vi{z;~!?qWOdm-FXRY7=jmvnv|mHdhM&J*Srn793G84pvhu$rvO^ zI(DTut{zJ<77u~mTcS#I!_^Ce{W9rhF+i*8D!J9KBop$pgpa<}S!aTQE6&nt-zYOb zs+3;oVxqRDvEhFJxIjn0apq~K5S-VeFV@gb2Y(VksThV8mg{uTF%^PL$V{wi7C(Y8 z6xuB^OiQPlge^=|m8-g>9V%^<&`uQx0XQRzjvEmKoU+~aEbR%=t9bbEIp-!_By4zc zoempNoH8;ZSXLE{snApv!{ooKROY7-lo@})Qq^{BD-{AbRU9r`-Qel2O|E@Y)W)-c zn}0oyddp4YqSUuo13DcPV5wp%ZCI|;p+%$EQ_@u3)R;~bDnX6U zJpT_MqA>t}2FJ zu1HhOFqvg>{fHr5ra(6>iCM(5%nmDA7uf21f<$*9CA!BHgODNLY2fd(>htfA@No~Fo^_cRwHYqzQSb4-%3jGbpmU6EvBQI#M++{FEuhIQ4HRbXJ%RK+iZ5TF26 zR-wfV-H;h#{M+QCvzMgb0W10~1P1KM9vm}faO*RSC6_x)aNe03|tbdLYOS=<} zLc8}dYH~ZCDICO>3{|42lER=UvT3R+zou*%7LbruE}5b&-_gGFE>sbxttDF9y?-cf z1=cc^wOYz`HZ_PZ1f&BEsR(1;;DFQ&#C3c=-uRv9FMc;|x{AOq|FI ztVCFEuzi$>&Ez`(h6>azzJD?d3qc?e#XwBMCc&mmp^Pk*zuH>epDu4RGT{%~^YZ=wr zhBGl7)rv|+wYFhNmWXPNe9o5As!{Z)RwtS<2Hn~*p;aY{sVygwRut8Wn(5Ys!?LAy z(1Fhp07T_>V8uq0rJkc%bgmMy5H|@G;+85G;yzZ8lZ7xwmpl+EgHwX0&;Z_R(d>oU zB@@CfscBDv?#crp*MCYfpLn_T0^Kb;PeM^3Hd=-5wGF!V{ZukY;&N_)mU0!~DYuNI z?x1HVo{@;1Ym0qyrK*e_2V&EuJ!H9c(v0qpk@ zObp`6VFN9Mbmxjfog2LMow9XNDJTd{cH<8c!@OO<=`vSTj$hRO;3sh2jd!WWESHU0 z#zD2o{)K>W+bk~fl`-88=l=Ya?&!BRfyz)y%9Ts)gylNSNW<%?s}iY9(|`gcOeL-c z89EUKHMpuqWq)ik73(sQ3`niETWMtjm2nW%?)LL5bS5v@VhZSzg8!9w46{|8K$Y7StG$K=rO5CmoK*Jg{xQ5?Oth5%yj01}6 zP(Fjyt^8&Pt}A00l!^NGPB&S9XO1&una{UUxgb+mu7A_vLenHDOUP82C{GJCqC!kW zqC1qRMi3LR?+Ve{5eXC_WElq`?xTX^C46ujO>U`lad?Xn7J(m5{!yDNl2#05<{(hZ zRBb9D*Xh7QObZ)Cv~V)9f>ce%jHVD(0NRd^NHNK>)Xb_WWaS2ahBUYBos5T)O+?ow zDj6hURz7wm!p~ za({;1C|t~w8&kGH^^EJHDx}0TP}`|bTyTpNYNflatK$w%21yhtl--x>bfBRIH+D74 zf`V)U1~g2l%BF70vdZ;U0*DS(i=Rpz6wMdvu;4qx!y%q~#}uzz?vX=GDdlI`nMDHDmZ<>yg^ zkVG}9;;79&qf)jlz&b#9SY5vw)eGdT>pMv^(b`rt_7U}@+=5Udfm3v7Nq_V+_(@4c zFBiw9pEc_3Jil1R^UCoPQk0YBA;}boyw`T%A{wO|>M}VX?-qN=B&gqkG^j5me6FH$DRn}LVkdV& zQjJtI#+U1KNC8aIRDVn5!?&pbDQ2RV7fBH3B5nUiU4%)vB%x1rPMdW|Z)@~WWqubXrAYgSFW31{q7#MdtEwd#s((R6X?$IV)Px3*0WpDM zYGPM`?I>y&jo;P6`-c;6-{1zDGdDCuu)A^dx-bbM=^wsar$YsX*t9H#8H#Ko3aLzx zp+c(gQw3XqawS!>kYTo?A!H?9H&i?5Sf_xl9h8Mn#WSe93z|rxJ;F?mU2-F@&r!ZVa(&RobZ#rmY@UDhMh@T%#NuC za-sH)s2^3X5lu_EPPe5I#ZUp{=;kLKp-3|^W)Ko$m{d{-SB)9Bv#pNlfy`kMxO7Vg zC&gNHg@1?yaUxgT=fZNG4G^kKB&s7#2dajN4goWlGWn@W&$Q>1}hD$}O zxnyXpWeE8ct4RzZ)b9%9IvW%eYET3uQzn>Wz?3Q99}tuktXM!nn!*%KR<*d})B-4w zb-OpnY7&(x_Fh7+vjKu@y`mna36aW;6AefZNq<}s0y5NON;PQlJ%TGk9R>&`r2k5Z zJwakmCFatUiU|6_q~Zw?mg{VqFp(I664nvYWrn#ftV6132tvu?RuJM!uqo@b9lnyv zny?Z@6BaOuLlbt|J#(N(h==m!qG-Z_i&&I^@yfu&h+uA?Ls(Ji4a>EwFr~^2jY{13 zF@GgZM?jOP!PNx_Wnk($;M;*rC0WtTI=K#^nhpkgQBB5S1N!wJG$7gFC=5YK#_-EQ zMMiJ?^@}nhR8*2t)(}4iC93F5mn0-(%`#+e^byN|SfM6YjWCrV^W#^&Qc(((OiLpg zVUUW{cF90MM|=t_EJ1*o#8eAnze<(YHh-0wszD5*@Gs;)FiH?pbPZA&D7qz613*bL zR4Gbf%1$u|?I)Z~!1!T?D4-hUD0T{ZS(c_Ms-; zsTKQP!FMjXVz_dVTu1K}PTuza$X+2%n*W7m(xH3B|H>e=zZD74iAi)_L8`)GtA7Fm z5M6Vg1wjkzm?DZ~y_`kdmhWh1mKScJRfu5!_*jB)?03affFik$-Z4nUy4UN^jv?s2 z|AocUp*zO^${@7gM1oLs?97i7?u?}#xC5JgV| zj69OzG{BM0LQC)+#%y2-E0awWa(`hGB3mYRV*14NaEBY{m9eZ|`jpy4e}37lJtZ-k zHfFM!sr4+MOPtumfnu2MJISfRJ3*;jN2FBsWW_|fWGSMEw1pH|L6lKVF*t%unP`wv zKvYeGxRq=}ENboYT@Hd;S*iu)%KDbL^FXGM{a5xO{EaOi{T^E6AC|t2mVbGOtGG=rHI_V_xO=*as@#fioWAKL%&M7O+$j+*Gwsizf!&%ETZXsM?dNTpLx z+i(z7-ZY)AmfVJTVc7<38`|6$sGM<JGs%!aj z9mXHR^^`jzl3__i(|-`OBuQ0~&W~dQASR2h;u6#ulx50r+_i#9kc!;T^m0kXE+bOF zg5yXmU3aPGSQ}G&B4m|{mW)yAB>8fk4jihXTZ#rKkf4eTRgrZ56M(XgDWMq3imCzC zFmXG<(OOn12_n-5xGftjYB0WGl&A*~d&($Gk}~ZaO2~CORDS@>tqRJw2%;)LCfH&o zVw7o;ikM0P&{P0SK-v*=5Furh;Lyh5Wr$`O*K7EO!POQ4eMVBRSqonUrTF7`Z9 zm{dTN`r^J^=L3r_F-3ufrea;x0oD|gZyLvR~=RVG_9f)whO zg%CCvHBCl^H=ddXX8aWsA=ZwF=r-h$k|5M=h@V(2tbe66e@KCmLKU5Y(cG-e1-Csd zuERK|l$(Fr<_)KEwkb+-{VbB*rZT1bQuy;vkW9Q8A(LUX_BV4 zC$BJ4wkZih&4!3-OQB{LPK_+Lq*bWg6~~XTjT%GVo4AuvQ4&Ntqwh*G~SBIs6oKdKt3>q9#@`9>sK3g9CSIyc^h|1 zDoR2SrGULJ*Xhu~by-!`3=PT1U<@gmMs-D$lC@+(NSKx?A#9e7Tx)aqZ6($iMrVyJ zO;ag1?y135Eo=dqX(IJr(kQVoBcf@Pt|;2NFMl43YcX<;s&!U8w$v5lDIQy(YTHoB zH5hDX`6gVyZ(`pD%GW@4-vn1pGyZQUW=~9u|Bg9)cp{^V^_OVOa0!-87TzlSH=MEN zeY8nSrqHu#vk>NYEMtxeu9X|6uBhDT2dasgibZmzgjEFsQIo*S3)=npmqUrIOiMjE1%PDUV0)5BX zd9H(%ZO&Wfk}c-Dh!9T*zA4Bzo(SMW`gPoef6?>LT@0(BLxL%jZ@+qNtqh3_= zucv}QnkbHl1ohUGdxNzJZlUnk+}{%QtYp`46Pj4m=Oc=O3`$j@M_7s>%NoX#!u1Qw zl=)54)+dl}TWACz;s7qYa@M|`b(u@Gr=4|)$%;H0t#6Hd(0k=3j%#Ia6cI1pf!$qj@}2Xm(2lAAd!hj*4T9G*K*kos4nIOT{$CZ2)I$t8J3-q~;o_ z!CF~xVh;?2+y!RYDdw-DOg1~EXJTN&w8duGz%^Yuo;eB&pUH$hE-hGM*3g)r;(RWb zbU(#E;cl;KzEVqFAX#Re;ugRFd?-Zo2WBZm#}FD!1aDIdY5b5z5E+IcD}NY?4-&$- ziccj|hZ59vq#2lD%+-8@LT=k@1alLS7;+^HiL!9DSXvhtDs`!tFcf(-!Wa@W=S){l z1Yd+^&p}4ZWy{w-gcg)#OHv{KQbRHo6KN*Upd?GGjKpL?y^MP4jsvOXPY=s&jbB}J z)0gue`s(~^OXxRtI%khhPJhW{(tUHZA=i{17iH{AU9-j5hc8<~y=mpjfr1%ze8Q99 zMwIZSm2Y&HR&qa`QG@1KVqB?}w}0!4xs+yV5DYE8q*PtApvsjnD4PnSnv8_Mgeh3T z!kMB+m@`R46RqPpYjMrE=d2Ao&RT80?m8>HGQ!hw^7VEu(b$wq6@NCx>L&z0h>!Hv6j|9{eA`h?{HuyVkt?_FqLwI8ES<@cp%@AVnyD!g zV2qzf+%UFGY8c40WL-0b;~_3U$s%YE;B~R@mbz3-`)=gXXuj`;)~^VB6U)2A>g6EB zm|LuxEK_P>*&?Q7sDG-3BnA~rHKBol!3?SLV2h?5@;Y6;rLGzG>Ww@;&4)kOPfP8Y zQCCBhQJ2a=yn{wvs(|&i9Q8Kr7R5%vz~MuBsj94n^v{-~&txK+1?v11MO2fh44{TA zgP1ZPimEDz&o)xE)_p0$7cP$gO0A5_r=V2YVEF1B&+=0I0(b3}eEe7ayh0l-ucX{KymM5g%^;MvC$QNY{z)-B0|rzt{_fzzF`!k?w^WGG>#& ziF=ZbDL%@&Lw`jc8$L2Ur=Ry@uS|Aa;YWk@E^^Z6dh^eA7qmv5BARF6{R`J7qZEBzktYzJ&{ixHJMnafrck{o965$#bP~ zxP7viZqq)w1g?cd6sK&NYqo@R%gdI)cJnLyu#P-F&40J>=qPRf^i`M>Zc(VUpq#t5 zfo8ca?G(Li=^%IBiJ-=mxmt_a2wkwGZ@l?6TS;iDKvjE*1r>ucoxB@K0qY>4sSVs& ziG(K6*jOSKV^H|HRAdULCssr;TWlD_p!_F7OrvB%6Kq356O1vT2~=i-!*ZqbVjzi@ z&;+zlLVpvgoX{k?h*;FHQz8^J)E6Qrdb>9@2yZrE%IT&985M96Mx z*>+D3z|k*d)0~LH68UVl>Gh8*bRn83iu*f>Pk%-xD}p|`{mU!aSK6 zK(mEL2rOR+F5%zL|MoL;s!jFErZy>3I9b7K9pLUZZg!YAo^Hra5MS!F-itlq2_;da zoPQQyuEU~rz&)oQ85p*0%S8#$uV^4NMNnAOhH7wWZfB_f*T$6)LB8s6ipo;D_3Sl}B9ow0v z0%%DxX-6sfvdKK&OA;>|PG~np$qG(qTt?ko zO3Jd7D*(3PXuyRm<~9K*LIM;@DpEAycygT%I8;_4qC~TF{*SH@L_{b9VWNJwtbYPi z)E%Qnd)gF4OMp^>gt-9){m*IE>MA6zs_2+VTnl3DNt25bVXjKi4j)gh)1gE~iiC94 zq=uvzOho`m3{V+D(*zpBfDnopmD-Vp9Vrb;2{q#Mdvyorjb}gj*)DFkZ9h%H$!`(o zmFRe$wsWzkNTH+_sa=*Y*Xi)Xh<~Z+mc(^h-Lm*erJ07ph@vsmv`kZ%L?EPMsqMf| z8&af{PUup;Y32dX8@mZr%_gG7Y} zRWTp~}D=sRMkjT4~Bpu6`D%esii&!1feoqN9 zR7o*qm8g2m32*@*Ds`oavmc3=Xqc4BlvOMt*VzC;3_~_d1Pu*g$>R5GX#h$xP?!XP z%tRIxfy^@E1w{FbND$C6P8?QEaW-U_Iw&HgE1Vb(J)}q#o3^@g1b@XzO1t;ml9g_A z`R3vxow~(L18OFcpek`QLX`<-K(mO9WmPnI*O*w(C0S|E238ux#!B;%jY`l-6{I=HinsQS#5k8BoJSQ(Gzj}d(0)xtHK(`<6Ds0RAYLPJ z&8Q5N1NBo*Lbu~tOk6W;4%lIiZASCr`GiL~sMIL@&Mxg7*2MY#oww6suAGW(>5OjY zl8GZdf|=&*fO}_wAF}YBg`z1OP_(H21r@}8GBJpb<0pVaX@3`-P(d*`pWSy%1#To% z3vyOut%JG}ZsgH{bdB?Fl;bJJ=N!Z5JG37Yb%Zl?K;U^k`n&1)HjYt^*5w&0DqJr;1Ge(6m|cxp(A8zhD;EmM5a(j97XNWu*;Iw|Igl=fK#=$|Ko~6 z2t_HGi3och6f$KdL#Bv5n&&BGCYd8jrpg$FWF8_@%8)3LLPCZ@gv|bX)8L#sC#Qe! z`M&S(oONAY+H2o?t!J&z{oK#}+#}*^6odK(+ueqR?|+M{ktjmg@s4ZhWW;EgU+%Mp z2*DtmGx~m_`^PZ}0WL5UL6{K>m5(Otn6(|r3gZ_k}W)nVZ z#Mih6sSOcNp9@+M-9>Aj0iw_7FIUyugl8He1mC0#f&W8g2ntFN7DxmRgGYk^2*S1y z1|SF&Ab$XZ1j5l+2mp=&VsQx6f6OzD_!`x)9{KV`?PIrIa}p4fJa7bYL|lQ;1h5Hu z;@2APzuZX;5kma9f5Aq&e;mVL;Y3zJ;;~pf6buJpKyWx32f%<(SUdy|0|2l9Gzf@a zYc2Ypa8e^SL^6Dh?ItL!jvMRf5q@X-SC!Yz=zp$A=nri?8|nUW%mKpTpa2LS3&LWt zP#_MBfB+B(C;$vZVUdI_EdYgrp|NQ6PZaw73m$01*Ej}g!oJ;RB8Xs8h2Pdb%i7>J;_ z0$^A)76XR?2zy}^VV!}3&}aY-4S=Je2srE~0vCSdh(>(%Gs>XYQ4U0{^>c0!(I|s) zaI{~GcG}1i5Nef3=UAX#CsEYJc>F?jOfC7!U@7#KLfJ1OSCapkW{c1P&tX zk70N`1^`5ZPyis3K=Ko+%FlbC06*!00&K!)3<3PmvbIjQo<8}l2kI{*dT+u5^%t)8 z9S;-+h=f3iktYyhy)PsZ00*MbNHpOu228vLv04=h2*!Wc1NCjQus`-d{i1$hYkzMR z3fN4iy)Sfs=+*eQ&)ffcpEu;U-l+9j2j6ir^` zqE+B)*ETdUeaf2Mn)r(iW=SFTlYb6tzazS)KBYMl|NA*nQixq0XXA)9U2lf>IY|%W zfFoM0h(4vyH?aHc75j3L^$gN~y-k1SZ9;sF>67`g9s82pg!<&TBW}wq*HhvMZ2QaI zPf)@lxj9|?6WxDGX+r*&>P%QL1PBGAL4+k1PE3QupwVC~4vU535yU7E41clYCLD?U zi7>7|_db1fMXC{{m5l`oLjZDPK(OVy_t)}MQ2AP1@Go~dK{vC6Z>0OD@dp|XKtfOi z9SjHtVxf2>9*YNKu}BOM4M3qF2pANNAZ+Y$Kiewsk9}TK7=iY(8+_MA~LVz~MD4*#5X^euzA#iXY1P#R?Fjy!Cft0R)IO<2!5`m(6})oiuRD59Hd_y+w?H+=hVWd{fnfI}b= zU@#g_P%Dr)3>HSzKYsxLAOed*qmjf61H#FlP(=TND+&44+o(b`^5WK#fpSFNs zyN~{ApAuo;4cg3({(GV044hF!1Kqw9a{SUNkL&7%fXNlpoUqV*C#x9#$VN9`(>xPc6 zF)m+syuaFE1QP;5Hlu-jq5G$?3qf>1u|z!;hycQoa3lzXfk3f91PY9W5G!{8&=3q9 z4*E~!G(x`aV1JZ}`l+=QK`k}4`h8W{Uzx}ThKfMoLI~&|Tfe_U_cyS`e^VYC9E(5! zp#+fu!b9;m5Mjpx$3dVVJRE~u^JoDO7(4`v`ib>rbBT@MO>qVES8~Og86SxJQNHVM z=>B0`0frDn0s;fY!H@_v5QzmqP;eL&g@M5ciUl7y<<%a45py5pWO^{o9J($JgCd#C{Jr>{`icq8kb; zXpP4UqFqGTr3v@2Gj(CtLlG7*YgZGTgFU;xBLD!#VAsD9a{c#S5Dky({7~d9C{_~N1zpgTJ6AnJ$CgTTyaM1VT2R4n^ zZ_6qZ_i*2a5Bvol{a#t+&Gy**PWS-q+giMT7=J$Si>mRiz1L0DBiTszZ&l_0=c_6c zfU_~R!4a3t4G#tTW=M88{BHsb)}{awhQeV8+AJIhfFW^&B?>_-%z=S}5O^p6k3$3D z01#pGOw=dQI6MJ4!@vAH8%KK+!;P=%&$J4p2mmewMf?%aNP?{V)GZ5$5CTEhWRU~P z_9}f?ZAFK4B&ckGlF`6*-Y;E`ddeU{wPW6cNa$h^}hRh z2wPLD-^31JtetRnYkI*qN*s|ti62o`#D8_16YXe)wIKEyB3#wNLf;B^28VHUzzMDk z7eNB!37T22)deB^*{B7sFN&YO!{Tf#tX;nF!dh&H)mnVST2oE}p`9Z^2>}VMWqaf7 zoJ=umFQ2FiIuHXF*0cmXaT#5|G4VS)qUoRT@(2=xpmB2&hG*?;NW_8|jq`PHx_^HC zwaALKH*aceOt{R()pdQuYm|h~XVwBhHnQ&T=I2J9`6PtCXvn{lyPuRqI|oyO@O7{^ zB(|>ky+-{l$A6`_#5thWC+Kf~LjceI_d4#Ub6-*adKrSmHzf#&uV3M;oJ{Skt=1L% z-&1dl3nWIR5Tk&s)`L>)i7L(7On-Jl*_jfx{7(~x@G>3$n1u)A|jG& zfVh9zD-mk~{U_xjV3WsRmy1O2;2+k;{Ot^d{nyDw*#AGd2nPUuiCp~TbN>r+an04X z$+r%I{Q|iN|5q;lD;IyMTqL>&|5z>(e*L?PeZuI|r*+;jG{?Doo}6F#V}E0ZnT>k! zU)s|Ez(Sxusq^w3x=-Q3pZSAuHya$`^$~~UMnH#X9Jg3g{XY{B1?^|0f89Q0YHv^A zzu%qwZ3C{~eM#U*!|z;ZtwYyuPpwB+{`MS(Fdk!TJHi}XzqKJz1eve#GZu$OIa)Y; zrgSznH#M{&&V}Dz;j@bW<$v_2hr?J~;n&)em=gBN-+8RBrEfOWq*1^*NZO$YQiWX; zhq9D1b#P&qlK*yd_vf1!2v`UR{b64HM!NrP;4r2e(fTyR{~TP9uW)Ht5SZm>;DP)w zdSD~npTR?XU#55$Lu)Gw7eln2wfW~T;xFU=uZNFVVA$$!g%JD|LVtA}(PE4HDG-0? zkK0K1zdgtPP&od_vD#3n?F8XTh#K0@fCb(}j>uQK|821T4`vi_14^b&)&!+k^9!&1 zb*z3EGP9BHU#$KjRvS{!6y((f*N55^P`_uIcWn;R&Pv9hOmQ3wXhF@fj)w;WH z-Dd~l{OyTA}Ps9W8$f#Z9V_!2bu-$iE*Y*jJQ}TUa|| zt$%LA_T%P98|nT9>92vb!2%+4#sOz%g|cARCfw|&klN(J1%LQ=;ra=rHW)u-h(Rm% z?ABK7#Ao>lr~t^#tzVz${)OtVLAAliA#F!&sPI#kM8KZ}5`Ks7e;lO0(~^kXVA+r& z7UQ;LmnTxQ|NPDwfY{`WLi|54qyEn}TN`X0QYcFsys6#Km=6Jn&FOug=>E5{`unBd z1|x^0qp_>0g?|O=XF!5)PVf6f_rDF&|J8&-AU9$~+;p<91A?W`LQ|NC)$lx%i ziM91w4#g+e*WvYOF-{W)2OAM#VPYGpPx(Ka>VO3xLID7XKoLTSKPe{k9lB4kSsRnw zehA8Miobn>%BOF?f#uWr-{A7;9L{PjFVEiIf>`Oz6mN?86!ZB#-2M=h&o?IOL!9ef zx;TFhq<=M%wJZrc!e}vTd4OxB@jeHwXdg>QpFgLqeVVo)T8SpJW2f(rsdpfQ`B zd_;smB2Xj|A;_Oph5ruSH?!-vi8h~K2QgjT)WPL*Wa6h7=ifa5=;t5ca||H_A_Ry2 zFx7J--47n%+re+lKl%y=bb}=jjsAAnzrCtGYJaVF9_L@{oCg#ELWPjv9~G|r4c+%k zl_I{=IS;zo&Us&-^yjjReltqQ4?E{=r2FISqR%X~VN#&J!#&@^fWq4U7KaVo&iUt0 z01yGggkXP|jq+W(@8bdg4jz!r;sO3Oczhb=58J?Qr28=*|2CHVuV^fJ_}?o91K+t_OK=K$JF(AihI?*jz> z79hlC0YdyrfPS1=v61eNv&Fw4w860B1pF~VT5C;~)+=nT*U( zE8X`Y0(}b+e6tY2e>F!SQ@9}?n2nl~;G9e<52(72i{^ENOQ@3Fd$l6~x47&Cg09yY{JfL6@2@nK_ z5rj1e0)deLfM7TjM8XdE#pC$y;eSX>J!WSoQ9xPZ?Ei$0K!(Tv9RvD%4=#2m5IeDp z@H+B4plCb>iN~X`P%sP(1)#tPC>%k62m;4qu*6#9a0C*G0-@RMaCm!RVr?ON;q@%z z&Hq$RMnZbWjuR46ii81dCHy13N_8eaq4CJhY5+CKyYMaC&+*O*xF^ zh5br=xm=0WE!x{0C3KOLT>2qkJiBRD=9H(~Fz1e^`=Y7d6~AZEGF{r%xm$E=^42r) z1brI-2C6-H(4ySlsEj)QE`Jok(poos4-*ytG_exfccA2+07<1GwFL4^ynwu*kQ!f0 z(<3sHT}-6W?3u4H-g#S|$(F|PxsHy%`M*YXbBB<{jYjkTSF5aHbk8N2@A z9)BkP2@5@tumJo{{(pmkK={A%|L-{1f+BaUj5kPehNYU+p8Qj>W}96P}j(#;Y$MOP?O zoh9n$A{xP(Snh|Gi(;hPkz2TjUP4!jj*flTHWJ@DBRX?6dI2Ec!VZ#SUia>;-U@QC zo0;C7Zx?Wc%Yt%?mXQD%_0Ds;64EjkOcdpSWLwYq`G4G_V`re;>mPKiPTELob+Ctz z`{k2H7WwnDI%MoYlAJPL?B+}iSegJydLtkMwf9yox+Dt3f`aDL{gb`JdhGh~YGFZvkAJ#->9&#vR?(9b$1t|-pmC>QIwyJT#52w$K0gW_YAZ|sV?KR!^aGwSqanYZ zk{&r!F>PB-9i=?QF+HhPDn>@B#_Ph5C%1Cc-7?}dv97&!f)25jZ>tx_HLq2R8p`o; zqp{chN+$k(-qP36Ny7-=EH8F?5>4uD+qb+jGJogWvBf7i35wD}qtCBqzUvEg;Pvy) zy7r8Yk8aC3J*m~Rbc~EL);K;gejiEBTXb~X6sCec`3o(Xo+Mlp+|t5S2N!so0DL>P zN>_0_1F#<>JI^5FC3B6A=>VB`@D?wdx1L(t=s3Lq05bj{$+Ey%=Ix~CxAbY5*pSrH zU4IjgkllKL4ngO)U~It7aUjG`C;5UF-))LrG(s_a($WlJ$J}<3>2cIPwk2b)lDoO8 zqV0ErVU`zS1Y~FOzQ03ViR`c$%`V1*t-f?}?7OxHNJ+5YV0>TM>Q7f)`-;SzL5bn6 z2|Z$A)+EN;ON*W41jDxDIm{um`+|0D@qb;B*YT;g$eoRH5cP^=eY+!6x(#J&u^usmjdsI^=6ktC~1-f;Ys;+Y@6pj z*;!euS6@Y_|mjiS}d6}Es-;$SJ`Sw7cPf-W>qiw(sUZaR^Gw+Vv)y8Jmzb* z$=#qhaBj9vkIajXkzQtzdxuZ(wG~0uL>p#Wl=U^bV-&|I{DbewL}+mW&VNTUo}f0` zwl$gFpH2$QLv2cPtooMp1setmiy1>`Yw2o>ZPqPzE>*c3hq%&%#;I;U_ACfYsVK=o zKc!eCd3xqDz&~-9Q}Ej-jrGgT6>9n|*zJ4L86HB-S|$@FPh1M#>fdrEN-pr?xk@^2 zjQGOSU4kFZ4c@5;U7}B^J%4|)dArAs>D2wl9_H%Yl~;AZ+Vge3qxpDGn=g0dyk!)B z#C7-k4R4D)hoTB2Y@RQ5@5culUB7T`K_WOk5F2J=gGk8fIwJ0QFsLY?dyFTqFqlzk zB98g7J>$EB0+%jo(nT{upR*Mx%O|cR@uaYmU3_$pDb>huHR(FZ#ebds`;X7zNvY;0 zrYu4SXV?~!r>WS)BXmcv3{!^n?X?&%fko-YP#mltw&ZxMeDEYC={RH>m6WhW_DRdL+lu0m$z|{nw#XYia3CHxvYg&^XGMH5LE`q^nU7vn^;pJogSo4z#($KvQznnEDQRldZ{Hq?}N4euu}x=dP&BBB^o;6=Z|JUd4;&rp60c zM-=oaVtl#ZNq@oIGif`x-H|;9J36wpGy7UHVdo8A_M~=LiH^ouxkdn&b%Xkk9T8By zA3VC?XyMo9lR1=JJbJMgO6szx#xYy+gj!G}ZOloUxshv6uyFs`tBPVm?EE$63H;!h zK6vF7Bj4_QVrN(CTE@?evEZMIo_Z|}n%2Xdlwa)30DlVESF+v!im`KrY<(8f7B_#l zm{-DHjvy)Dx~{*N+H6BYC^W zSo^T_CV%6t#<=laHNHv#SwmZ_!j%jIx|unr=Ky2Yy{g+;P6R5XOgAeB?{)T|Wxq`O zAaC?Bk2~GdC3Y5z*5-ReOhg>ZUXjYtzRUE?-6Njn2Sb^?&IT_t9?;))7l{VhuEJvBA-0H-NSU zEd+Tg=!=|zw?9XAzE`mdn5RD}RO_gIzskHJ*lD?_m6g*VX40c^CiQI#UH8qFH;73= zSsuUM5-;PJhy0febs{`Srud(5y`Gf!Xyz^7l2ns++*#+!%Yy^^9EMZ5&2G$+J|GXP zo_~;oH%yec&(Yw84|2yX&?tIUwDbxcD~MkW`um6b+V1}_wad^(%@77DSs`XBP|H)-P zq^)d3Vk?>b(3_9>Z0C=7*_yMQPK`itDSyk@1&Xma&-UyyF5U+Ca8z`ErkldEi_hrB zV0^_d-^(fIC|!OpRMit7PAzNZtJ}H<(P_JKewW6#~7u;-HOwBV^qB!p0BCW4fLEl3v-(P{2 zF1z$JtB01IwfwA|d{9@-4FroihO=1M%yd4Q-8oIM)geNo`R3hd?Z|5tR+j9`<5%(n z%NBHOu1=f@jX4|r@Tl%PiYJQ_6XdTy9J(~Z+{=ILr3?FD>#!M8Ym!E}!hd#b&tTG? zx4V|>yiQKQc@_4=y67&OXT)B8H+zv!X(vx(VSue^{7V4`RrRIlsh5v zcWlqSwZQ84op`2Nbii*Lxe23~{&nZxmF2=}Sp!Ppnpq#SgT5_YXU~4HBr_s+R(-xj zY;Q?Al5#ks?#vV=orL4ln16c)cfz}$D~8pt+`HucFvswWm!N8jAOlwa{$Bm#mu&*H--fK;bA z94Xm4vFFr)XuixXGt7Es;`xT_cKu`=FWOciHb@u)gKOjRbY7JoI)Q#~9}w{Ld-)swo2 zB8#%o`)5f>Uw}g@d+uK-ci$UdJYX1e1zxf>>jlb`Un{@=L+L)p;ZE4dUGZE`wy6Yh zBhIB)YWa16K91(Iy|0jF;dn{^#=S)oqD5`EtdPi(C;2b7Rhy@E9;ACpUDW#W;?064 zzvE&HVsDP5sDD;oXq?N|7cwLdnEP-zaDl&El+U!G$34FA+1s+!s?(6YWH`F>i5h+W z&9UKW_DtG+V5ic$Rcuaa@zRwc-{-f|*)qb)Ubm<3fMrvu2zDvG+52cfsN2HcVc9Q8 z?p~%~IBbbCz8au|Rp*}-(Jp{E`XH?Xb9E};RWy(BkAJmP`0l-gzP58Ie18*XYTgOi z#wPHs@Mm3et#0G*e79H*X}GlbL8Fhwoe-)~Gcl|!hpj$7@kY0>#PzueXHrGKk{o5O zt&l^+rAQ%xI*^6NO6=f#>ix$JX{Hqqf*xBAyS-!951D#DJ5bqY-?o#5DI{>n%&M}+ zfEm(eTYoHS8gllHq21xL2M4yhoHKm70&{Dw6|CRZRsOEKr7GaQYNIcIuZ6OmG`(|h zCC~f*{f?b%Hufgj*tTukw#}1l?2T>PIk9a!C${bEFW*l+&wo?%x*BuW)bvz$-+gI% zwcF&&e9oQjBa&P;A%S4c=H?z4iTF|pTAosuI1e0^&g^Mth8Je2$p~}0>R>95Z|i;C z{rA!dt2|ieIikdQytrTHv)76jTZhi_+v0J@J8n7v9>qZ=(H`3dYZ}x2apli>c9_Nh zN8&;dUF(}zByBMWL2sr8w45D}u_v5UU4knl{|4JE`HW~mo`~XM>V?hHb+t%8!+uX( zWsL0EW*}I5bG*b1;C$_MSl$oC%&TZQ3Or)tYT~h}2+U~J^r5b-kSOW|RsM%4c;6EZ z|M&s;nG#yFALC&9Lh%fXTe&fsD-ZX^_;ND$p})@~w)DbY@8_F3jh92&hG7g_v$3p7 zVHw9d!V|my(SeAE@sjK5x!l1Yt3q@xFErL7SdHYTY^&1@3j*6sCGDlP#A{Fx&cW9jO`)tqPmYl%%8tk=a5RQfGR zcPWJTA*H@Qn6{l^%@^}Isfc@M)t8-EXEsUXZgN~?CP!@z3~Fqz3j^_Tu<#Qu-pOx< zi-mYeYD0D{-tCuq6ucMMnce=^a>IbOrhj$QcY2P$Lo-o)eC9hoqKoAA?)<#GTD zT+z-NekKjsjUTabXhr%V`Fb?e-xS4 zH?2qP=ts-Chd*-WDN$LSq~XbAx`|xPw9tdV+^xlEOF+u@gH*+*yNpZs?l{?|h}<9?su8O7jd*8_9vTGD0V z>&3=9$9car>t7UZ;g;I(!!qDpqJEuLPhlx%6C!ud=wxSHVK}ZYo#8FLyN=%n_*{Sy zcFX#Ob$)Ex zzv&D2xtfpvtYdNWe z(j+d0nSqKaW#zGzb5-bUIC0$fZxGBhuOb#2k-2ItBg>hE{(kO4Mv-%ri)jAzDRvS9 zIKOXMOoLKY+8p+;zGQt4nl@?XNl;QH;x5$>YE+NeB+T81?^u`n29lV)OLVw1>6}fs zW$|}2szh6k!hW?zaV0?m((s@{3o6!rNT!7*S=!aNHcq@Z8gtEgpC${U9VKr0b48Tp zAZ|J}G=>Dpk33mgL`Jl0g!({jHNammpWnz%&C z$Y-@vIeGFwRBgJfx9F63ii|*x=T{Y!JQqPbU2TwVIPb?lT1ts3pHP>XMi%d5PHc#&tF;7O8yoJgg8Mx^J( zJ~XT_i%r+(cd*y!tF#-0bK(#!s?D86#0T3bFtiH*OvgIYX=(UyICfVVBshN7 zV>PR+if=2g*1_rj-UHv&f^0`@(l0k|pKT~U$iL0Dad42&=6ZsT?=PEg$UW?pK`DE2 z6@6zeH>x@^iHf5%JEWziLVNP|u+27JjY-;okV}opJJNOk%19`TvUb_`82^OFOTcj` zzsv2W)JZo6#4A(LhD7U>O|`@}s2_xvatr+8P#duwTF(S+x{MOn!Ta2$m!BwhN2$nf z#)Hz=2%^ZK^5s94!pFs)OC!zYnxZGr!d?iEgd1vWCgJLPO_0ulFY#G62C$s?i;smCQK5m5oF1wX2cK!mh$DT${zfd}o%#k;8 zOWMyJ51nPS*Cr+k76`!>Yl6gU70gDE1n!pjHQa6*1Z@f2-xJqRSi#MH>bXTVnh@pP zF$1rac?-d2I#(R+;CiJL_=coehKNx77HMkA9;89-{n;E(pRdyS^5xMy9aGuI$jW5u z=T+1In&n_f5ar$`2K(;S4fRpRw&_-yZPv(Izz8`;x<1Ag7Mq+<>3X{e+x=4Q3(|XK zB7Q7Qr@$`SCfgb-(@PyAZaLXfpGU5VXq8`XpW47KO*47((Vd4X5$^SIavJyB-v_>t z(V`)VsG2zYRDCOgxqRfmyjyDUYM^m9-&{|?+a~*YeV!O~2q^B%ZIf_Pxns&T`q$D|OrL z-mz8OBHco_%KKo4(H!nLMRxt`*15l5-fLwYj9fis0t}N=X^Fbz07NTpJuyiGZ#4&i zI3pcvwy0Q?oiW8l2OT(MV{x7kT9e@~`u(*I+)T*D!1?;i^f9N4swu*5r|SGw6m$6p z>S_~2r^WQZBU%ajR`o*59H7$nZjJuDuz+T}e=l+-jz8Q%N^%|QN{}I65)XKGG6%}c zTR{&A>+~*$*G?`35iDS&F)0iGNU9m%6Zd%n%>~}{z zPe#U*Qyo-NmnGGz`LW?}c&TcPh4hJq?hnq^k2~}5eo(Qd+0Xhtj~D+S=?3sowGw%h z>O~8eAGJdAO;wb<&KysDw3SY0KAJ{ zXl2R40It!u?aDNHiS)G%HfRp_9WhiZj%Q%Wi~lUEQZb>#UDqu;bXQ4^kFWByR6}uU z0Sj^s`EHTuTubSpW{6!r%OPD;RqbckMO|Gs;i@)q&gIDFd@6v=B|wya@p??RId}F{ zyRxu#f=`z307izq#rV(IC%jMBCLUGL++W5!zsMK3WxR(8sr_T}6wV23mpo(%{PhWI zN0^D>AsUTDPqJ6qVAh}qa)#|50Htm`cP%EZ_40lETUK|I$>`jyZIE5(3GEydN8c*( zQ(uR*5p?W^)dQe~kUrR>J7?e0$HlC_=y2C7ZeuD^`yTWa?*uhX&YK{lZ+;{0{0OyW zU8mogQ)}l8DL!1e(5Y+F&N+<`Qa-loE%hAtC zYQ>y7@uxct%xZl8qpo!?|NXyi7b@3LrqjQEewBS2#;F}B~Yn?7( zKC=FyHK_cRp4q2oeO+Z+YtfW#gY%mYjeSCFe#d;p^X`-Yt+EN{2~F4CnA%x&f2%D+ zcT!Iej2RG%`nv2%CxlsAuyZiS=c-PGa>9q_C!?0DJ>~*pm=2Wb z!H|1;8?lfp)Era$?fQVsC+Rs6Ra+{LlhP?9 zo@1BR*^+V&9QdRf_`FAc0ryEk(H=7ecRA~g(b?!+Qt#11DZjlldoBq!AUw);+f)EfnpQ?-tVrQkFgp+vG$}+ErBYPzhxs{ zD5SMM6UbR5=8WKg=j2GlOzk=96=DdAE4wTXsWHsTADQCRHH%JI?Zt0~dNDoZO%4y+O08ym+igEhM2BfdX^ynvQ#TQncD62)jd~+bm$cvao6Hu{&|mYGNB?oxJa*bX*aBQf zYeI_&(<~H6A}CyU;smiWZ885eQ?=YzzZo=>FRkYnkX4a#mubz&VmF)G5wzu9=UMKU zlnU#Hog#fPr*v+M9QkUFRi(GABM%xPiIL$bQ+qFVKCfmOPjM*Tu&frl!hifvmHq~W zth;pXRLn;cfiMVe+?3Cl6!c+Syg3M@32Rbc*vCuxn=TWE7Or z2p!l3p4xnU{#X2J#M-_~M%zj=xB2pqRo&o=4wGx>9<0}Wf#uJELbO&(*B+0F;Suucz&y4Mz zr!7+fWoS?Vx4`vdh*&GgI7%v}vbAq@^Sxpi|8#HN>B!_7UMoARVur8+C54}hWoUSS zBwk}jy?kUBZ{mlJiy-qA+4p*9O#dSKI}FId}ZQQbvQp2~oLF~{@K~ASJhbd8g$^sB_QyA6Nery1B z9QjdX-2HYwVqy6&;B93>ZR370{loMbW3*zxlPPUtJ|kAyOO0Zd&{M`^$LQ%l9x-{6%22pWP!=awz8L1Hk*n5 zSsyTB|HkLD76c`yAwH?+Mkh^RQe2xHi~C6Ec9EHXlO@~e7Z32iBzazgUK^m0cImtB z%N8kOMm2iIS5BlSI|92Zq$+H=BKE;`RWH5W8)+0Xto%JznvkwHzh7&z@5NHIcO)#W zwXS7)nPd0}PI_!qHfEGs0qUo~Y!mY7c*2|M zC~0LRxubNy?^ypmARFsX)~)8w{5d_lTslHQ&h|vt=3zsRfr-c?S^|@ziPG8?&B|*p zK<>WBU0fS+;+D1{MM_ZIp$>Z;{}OdnJ1K9Id5b@;HV1I6T#(}dEpPe(`-kicAZAy_ zGPO_#%tkzg^1r{#neIaCn>d{sEjevsZi}1#!2MMp>(h_X<-UVf z;l?5AX2NqsXM?R|8VckR&@z8Lsgko5J}g#ESJNS9QW8&hKF=A7R?kD%dmzbq&x`LOX@jSP&v8 zjGATslI(K{Fh84G&#`i|BQHGX0|Z#o`x0rng#dk9bi(R?TcCVj{h#`RlO`J8p-{9t zi=^etIDSQB@qQoU`FXhCL?BU9!qKRuTO|3m+R4|`zt;3bc<#@A46(w6p)fBYQN&{__#RE#YlQE$EdOTqKm8<6a*mGXDgT>pMr=Lq_){;m&&STT$}%}J!N{u zyX`|6Ft>`G`N-&8v$+m6kgMX)`r#vM-R<@(IEdozC@Xpkwwy9A_B;2W>;p+V;5ULp z;8D0odE0Ey(3;VFR1niK@7wfEKjC%q&-}H5NQy@GtO^8lb; zA&2Y;2>cXkf=LU_An^8ik139~UScz|X zEuA-rKjVrG^JeBUP9=j9yG$}sP(@J%lDl0?RoMWJ2QXKqZ<~vQZdbhVj-(#H|7Z^@l zP{QIB6dmSE`;BZtzfRa*!(lBywg2D}FaD1;SGTarm@wa1w}1myJgFjxjLF-+xe_b7 z675DvrzJuZV(o1nm))`!PQdV=kIk~q7uKO8Mtzqn9R_kkP8Am=uMG5C$P}4(i!^mN zMM(~KK68Js_kkD}r~#cRIyNVN9#IIxy7SH=3nyJw{!^3tutJox@J$ri^7bF{KJhRD zDSBw`+xJP;M!8$AH5b;x8%W~25p9ROo$VEe17}xi zDAioJdbod)?bp0L)K&Gt5BA!LoThiG>MTi=hw`UxP#Nm0_YRnB=Xt?}Pn`UBI z!nVJ+#pIrW8gvrur)jY|>N;Va6om%O zo5+WhojApOPA;7PU4KtGXG#7vT8n?Ke~f$tp8z?owX1!hq$fyb*m?v~k>wrTIeFRD z$oIlbO9T7-T>=h`yK168Jq1iI@rvxM zeY~-}2DNb<*>8^9pe}Bcr%^rl*%wMP?b}}OTCMpDD7QI{j*NrmYRX8u9rG)mgx(rD zI5M<@Q)PiqobP332St8K)r{H?f@@U6v*XtAGAKDegAYbzXKz8U_!5w^t0UvjYVB*b zZL7XVA<1hU$AH6}f|TL5;Vu2xx7&WdN&;tx5^y`q^792ye+)@le zC^nAz@{{75%aa)v8_&aG@?pmyt--b8GbfQr4@-w+dRytm&ONyDrP78cwK-;n42s($ z3*&U?-YC|FuqNh}xHF9k{m_V{JYACXa*_f;3U)EP%)3K?(r01V1 zd)Hu8v%@z1Y+($aM#OL1`By~sd8@bqp!$V;!hcq4PK2dA@QNA`c}JR=RT#Pcd1d3$ z9Zu;(H?sP*9Riu#F0b!H5&Z}Ukl5A%l96arDIYGH(TxZlTUk}T1%3ka|jVTH*G$lFpuoW{L zw_ZP(us)@=!fbldC*jnUUY|TODk(){YPNouPXKhBJou7?w>Kdnu>JkmN5e}Pr51U` zayRnVOL05IJcWHq7ov6swaa zhMGqBl}Xw&7A_vomqAOPy(U*ygim*0S8;fovKjuq^VBCYF=vItD=B_MId#XPwj$RS zCV+3*wh4?&OW0TJA^#(9@&WpMw9SElo9vICfE!(l@JA0oih27@g-V>WSL+YvY zleusgXU9OsJ4GY-?0vMpw>JhJ8XLQk4#51+)drpr4E?P?60qB6+J{!1%;qWFI=k!4 zLKFsU9;0u~*Lz5>+6X)d2yBw`%b6xxdq*XYS}Um#Y$hIbZBz2z20VwNe)rBD)slq) zCn5(tdYgqWBhS`{DgBCxF!5#`xcY09@Au;{R8L~%zmU6%uNcrkB2wyx#1D5j5CEU` zcX6IlPM?4?u=?X1P!~utp43l|daR6rIcS;pVN$chg-5vQYkvyT@abV<{~eEO0oU6* z_1Z1zq>hob+@A$Euou|-k^Ig{&8J6;bBAvUNj$cPPC3~@`iVA zy30j5#ZxZ9k&&a-w}(RVogq|e&^s?h4F_Fc@62%;3W}hova`nEDq9XS9$=LBI0;Ss zIicH+)=YP9-Mt(_3w0&GLpM0a!aW2Xy4jt&>~v5eiHJAb;*z(++hk7pOi2T%0l0bQwt!>D;CKKo%IwZiEEMh?#3&!drCL|m?v%~!swIhDz!nO>8j-h|#upvY)V zH}0t8gc+N9Yvi=Y3Z6n&QL4IyQaZ;ZhAnJ-s-cbFl{!q?jU;(aZGh)+imTTeuYbtA zb#K|O(<jd`~c9(VA;{~d6%+PwJE@GP+Y7SkI~Y1{A3Z6qHbC}WsDh`J}c4e z`Dr>g>Lt)qd9+&fk~3V|K^dn}(t}?`f?J+9G1WC{PJ!{nS%S4KpDB|aANM%0sHQ6$)MR2HNl=kRKc_MAH`&BTDa*+- zHVnsSqiMIfTt~#Za4{d253*%H(o0w8Jt4Cv>nk%qS|w#kW+8sA1)Ycw8PXF+OL7 ztR_weO!({v^CV+wMGGvuZFiW-CDO<^Ga13nY}Oe3kbkB8FS^6jF72umM!B8Ay(Xn0 zrT_LSj~TG3M#i`wQhAt7(b}^6Idfjw21BngJtaxTUJ+a*de8i3{(^U0T*1%1$1Q*f zpqsMQdhFgk=_^N17o~U>wyCe8nMp)$9@_mG<#Iw(TSlvAJ&e)mFR}DqucY4r0ie=d z>KXg05Xx4BV*VPf?}~8_OL)FIre|_{LT@dy#8rb* z9FXR^PX~j(^IbjP$ZK+O>mahPZo2PLE4LfWB+MX*IXl`a_lp4*er#&Z@+WI!4r>kX z5dh9$7<3J$IJKIxUq^E^2;bLzt!RX^$p3mH$LYDyKO^2WT@FijZb3WovswF?<#8=m zgSV)tIx&+i1?UY>9|~H|&!?|^s8T)WSE70X%U@vgar+iQIDBC7pTsE=shmT;(~`1& zhFcE(H+@w!@|HWQ-+mu@XL(l3EMuJ?CV&TgAI#rbYHCw~{$blmY|Wif8^yjR7w#sj zAQi0W#G?+Z3_5tM-sk8tG^uF|EYT)?9s!zt%pEW4?7?0-0IUqrR!x8Wf{O*4-;eOJ zNiUDJhrOm>|9rUY>4)D(%xj>CN0mL@Oa{T;95kS12d~Y1Mq5_oA=T+vJqe-^`2gq; zKmW>V`??67A1yu*O9)j$%I^JsUE)cf8{2BlFr>!X(tWS8Fui((ka1Bt`d;f z8FnA>VoAu=;*K2LGv%J*GJjIaoRj4wpf2pAc&E%lH_4RfjFZEV)XXu~<>IS$W{moJ z-G?Z)7?@1+fWf;lSXm7vTxR|=f(T%?1i20L9}k0=LJfYy@gAdxIM$uj*-|m>v{`A! z;y3|ZJV`z^&vP!64K(OXCD}LfS`fWoJDmywJVF{g2c)(JRD{erT61{wt7R{;r#bNr zaL5LLqgmWInU-X~XHR_p6C>Altqo=0Zqz#VN|`C@dliMi0VX^s5pFK}*8?t>l@7e# zNoi#%$Uhwz6qVfYbT}_{pfV~K8fNEMT9)N_VVJG+u**|f)!wxAN{`m(sQH2+ro@{i zL*~&{_`MTCw3?x6cin^~QjDhK>4KF`8%1&qRg+ZXUm{t=rw5TTXdb7Wa;XLRfZt=| z(iu2Z$vO0zFzw@Rh5AqomC=^Sa(__Of&Rl-o%`_11#Phlrd>VB8sN=4T$buExxiU} z_;%&zbe3!mCo^<~Xo0ueVC#|bl~eF@NtZfWW70@~9^$%dM&h@Fo{TyO9H0&uY|tBX zWNVUTPiwQxAc)|>kj?qq2rM?n{0!falgHfdI=1%k7_~nHT2I2s%^jA{T(|OO)+DsC z?dxrhU!-B6YyT>^1qj7i=*sMT(Pew+=28FSp>JVr3p3O9Fx&Q19mj2(Dy9*(I2PO2 z?{sWLYDTqRSr2V}j(s%ls6f+lo2cWfI6G`(RrazUapplX} zmY_0^=+fM1Fd|u@ka-!)pPEGk{qjrBZBpju5S1QvbF6QDR_O6gMD4&hV$EU__pYEO zNpvrH3X@u!M|usah6}P=TUzgj7RKkSbzsXRXF8$!d=CA(d^UWYcAhMJ+V>h*N%5@F z(W&h!l=MZN0HCXKhn4b|+tB5!iv9YybNIAV94~eq2m5VpS?sQ5W^>bR*1t}5(~Q&I0L1HaLI2(~ z+e&KDW>n@K{qy0+0tgRUrtz!a)?{S|80eNPS7 zqZGk>*@3lnVKyZNlINgfdsNaxZhV+^W|)1wE6bS3WtM(?IJ_8>Jqi_F( zwUE$`2f&$%wv6jE}`yd z(Z-J5=JPsZ)4PAvH65>8Rm(p`!BSh)tgieg@E?-kU5}Qh1~Mv4{ri;2&`X}YfWUYe zLvEb#W1C1f7cMk2H#@3LXWEx+uVL}ro!e;3eH4n;Vc7=6IC*?cNJJdkZepi#^*;Biq*}>h5((O&y4$`**5zpD>G`nY#ZGb@U^1VtpbmIWWKs$`c#vKM28(9^i`~6dd{gcMVnq6%7VVD2B57rci=! zJ;3)aDCBR7EqL4mggf{@nsEqa{!Q5h$9h`6pvb==zhGZaWBa2n5-^Mjx)u@YKVHFs z9w0kEG|M;S6YTE+TA6;IWDgAI0GmVrjypk@eQPKLS9^dT3SeB{8a%;+9$;k=^mpxj z9$@1LKs0XOn0%n8+WV(Zn`lkOY#XAc|_f4?`Prh4u z0y9MdDl@}`d{Y#`n;zf_KMeghnEz}2 zf042vgZ=LR3puRR{~tRc0a(Uw`oGvYnSIkzPA&*UAh-*x=ywJ5f^$7UUnL01Z;7B_ zPY*D*81}mh%3cs~h(PK_Sm|$#gkWnAus9yV;9K**Kti@c6e0nA?qLPLDW%{_53u7O ztoAp>6g=$#3cWyNA_1FO;OM{U|H1?R6H@M*q6?n)0KYe%e0Ol43laknxa_{ zyyyY`QihcI*8HzF8&Ak$B;b7`9N{-55!~tlqV~d>eN#`tupXfM5nLP?kfa?F4G~E2 z0EhXl`M>+kEbzVLfXhuaMS>|HrK2u;%UY|$<`x0_mAs<|5-x3P$AtKw4k(INA4dvL z$3Kv;Lf6j%rDyygpo_y&_4V^Si<;h&jkUT$b@?fw?9<_M4RLYS7@m|KY{bmkmo4M~ ze1`I<5=AOEr3x}kK^7`uLRlKL0;ZbX;?(bB9$rmNl#+i*fG;+qP`wt;Us#q}NNIUz zzDQLnH~V-?^1-S!CwVTeZ2F>#P1l7kV++<*DZ>=M6qb2hs@11&j z$9mr9L7m{1?n(J8FB9J=?`pMzrTn?)rHML}g0=2jqH|Zs4Yxl2Gg~ZaQ_Ex?=VStR zjMWyT7%1bJfG{rBu^2-d5cj1=_l6h2D;TJ5)7)%r?e%hRg1uO=*&ohBm(xy?r24DE zZm#Hl2EglAM%Fjy6qEjO9N2(lc=nU|H@jMqS}}+g`o(|N z&B`RIP~u2jHiT%x!DwP>`y5Zy{=||HZo-dJ^k+UrF(JpZG&UgK!oTy3M7OJ@fynnx z0X)Pg-X0aNSznSjI=oP++s0eJeG;w=d!vBzpd6yWf`rng^uMga0B826^vG-Qq5akN z005VjXXP`+RHPSQ0hgZQncTl6YE{z}Wz(xMwzJ>}Z5jTgTXz(Qe^GxP(5CK8Zw1J% z&@Oma=sP8ZrP*T>$8l446~Ck}uJ3Wd?nciR6~F3;dVP?tl&@7G%wxJIgT}t33x-h} z9~Jq`#;wv#<<%cvw~O>3_Jb7#LUfc)0RZOf6=(QT)Akw4*ByVs^7w#V&Sm3#3=O~F zZ~H*GE@S~>MQgwvXv^rJJQ;liY`H+-?l(^hzH-y1aPjoeBPaS9Kkw!=I(bDNWB6pd z1&hT_UkviEL7}^}t(~Gdt)-L?*H!S?(;8q)V zYzX?^qhMNa*~U)8zRll_?W+i_w;O39l%gpb!WZJf$1=NBGeOxjS&G0W_HP}nE3WBYQ1pg;jbFR|n-GP*ZEy({88vOj z!TRH{)AwMrhz)w_5K{;j@h(4c@@Z=-TKI5`O5OwkzczlshKJ+ z%yU1T^dX-7nlp~sGT$JXLF(183OWrJbhzHMkEDvKWn;7;A(FIwDhen)KjLH|fyT)i zs!dfLi^*)(YQOl%Esff zY5_~(aGROBKnk$k{?nyLOLQWWdE+k2%hQXoIp*siZ6oM0Hmg^HVn%FB(+CLxO_;=5EX|-vRP!5LwM6gM)Wt%N} z#b{W$Z%9jN_v~fpg0X}Pn-K`t&9mVm{1Neojb&eJsVmVI-Ke>& zKAj|{JqKv!4(!peVE*@bS|xtq?>%}`s-RRW7U|pLJjYmidi(ggo~ryj4kOxe-Jd4x z5yx#6qr(FDLs866iZA}1FbUSj1J`IuECk1z>-z~V zoT1KS)8tXrt|PAK1cDzNe))%Soh3kLwUomn;0QSEZ!mch%VMWc$i z)OLzn&)u+YiizSDT&{8Z+#WPRZ&t_Ba5*cp2FDC@apxZ|VbJs$P+RWSDJdjLu`vah zy7M(yTH5~T6d8Bt_w^X(O);RZ#qUWIK)P==Z?NMQzUxN-ulu z;OB>5Qdj>dk?PJ{dvh|{#%;`ZB;F4-43lkNU;&J$wh*t>6wnlA%xoH`4iwspR4BbZj!wD)O|@`pE8h2`c=xPB_g!{kT*&9}3^o@gUc%?6NL z;ISH*?ro#KP4|x`VL2Febn1Xr+5(=ME#X(!{^(tY=q~C;AU55<_D1kYAJx&V6g3|0 zr5Oilt|d{f^q)*>K-47PGvwrLH#v~pLo1YjA)&Ch;tj{k2!O~%-pM}$ zK$Y8(>p(J$)Pfuv?IXa#Nz~p;P5(Q82+gk0)NqwFBN5W~0nM71(COKz91?hS zB3)AmyO@(9gKy>>@C^?R$Q10p?O=m0!ak3(7 z8?i61Wr!-rxNhjE$z=$yRRE9HB@%vXLNRS1`bqpQ7l6}q4!j5=o;M}ph^jJ7qHvI* zF@lSzy85Pj3(D=W7Mj(V+^QQtj2jSWladoBIo61@Mv=dno#2*>sp&)7@rx1@;fEqt zA=wqZgjMnqkiI!h3QQ445mSR%3wA-_^wOs42HG}^;S$9@)>I+*v5F5RQ>wdOH?FlUQzxJOI63mqjUQrPFk$Sh5JP4*iL^k5 z#D>H(=D2F>FSq;k8qLa&?ZboxYYxcK;188dRn;O5yp9&G*Xi5+pD}R+#{!5a$5M}E z;XYy}rB+P>K0C3iP5^M4bQol5e#>X9K(J=E%P@5!F;oXA(^my%0r_JD+7Q4~sq&Ud zy<>HD1S6;D!TRO;gt94m%a1(0)D!DX>a0UDiOK5Cr^S)31MB#2Q zW1EJOsVmPizi?e7vGdW7o$?KUr2FGdB#C(>CzPR+iqye1bpS3#X)+%$DBuI9s%gSf z`?<~@?SDlDHu;W}GN*`lx?uU4HfJY-e$)rXWb{N-KkPC!?99rKN!f^3$R~E5WqB8s zrHmBv;@YJa95V|#_E2m2M;9c#BM!5a1gf4lTwz_dtW@?^Gy-7pP3rlqSleYo5!X&E zWeTQi@X+41E&z-MF{9P-HEr8jrnsS@^y0>-#xf_Ev53ayp;(q{_U|(EQ|N`mFo;mA zxND|U4#~t6Mraf}Oq;@q+MhdWKPg3_Xr*mt7JpcTp59Ci)wH)Ji>f;r{4`SpC+e25SR*&QN(LE!jP?pI4YZiKl-F9c@KCT3;Rw{D~0v!KBO84QVLgOAU6b19-uH0%L9}TBep!Q!4e2KW94V0%x(w35pUjQ^B8tOjjXrf7w`c}+M^GWAlz<*Hg zq|1iG(3{dw6j$OCTtNrHB@{Z6+<(i6wMHK7vZ?{QlXG@YwxRdQ<=z&^Wr}HvLF%D9 z8t7czSu*?dRvM;S=o29;uhrNXAVx`{_HNceE7PKUwra$}&Zx^mGP+rvGJU=w94m}+ zh!{wT6T#@-PI}V_6MN*EU#nsCQE?hGgoyMleS#<0$c4LgX|K>fYVH3VlDr&aq67!^ znJWVj2eF1Ley|PIEuUfj43P31MT{i>Abw&HL82L`S5$RJH%|Pqp?jakS%+6p$vUs;5bo)X;Ph8D){94L0Z;Ua}Uv zjFP(?c^z@oKMLTjvU>=`wSoR<75cPuL{}*Q7Au6;e%9bcH`zKQ$vXb#2^!B1J$9?$<|5TpROZGN zH7HIk$;{fl*HI`I7!V?~Z9dBG#KPgGI>jv(@xj!>Mp%XH4Bn7;4Rf61x|y4d;n0c! zAgEEM=?x3vOl!GXZw9eg3i0U5&FAUjlIb4O6j3E&Jj$k_KDfDsmC{4mEJ{OU3n^)m z>Do0x4>|2NH!DuI{0&S|Or)jJ*M!E82j4$etPCo)LvPM^+CZLQqoCU;8<;g`N9~^E-TIRtKMYBI%qP^Tn1)fV#s0^>ZJYCPbap2U)mpLJ zGI;oEA1-h>-VTY}K#`buqDx|=G$mN23&)KTg)NHABaKBE48FzEv{7+%_v$YP*kVLH zBr{b_)wG|p8AkjU5vJrp9U0~!DL@bNuoF_Vk;5{X`Mt49Zih(uoP&~i_|P#50xRhF z*vs*TQ9Ve+JRb9H`v*+gjw~wO{502ZJP|0jB<#LtZq(_b$s@Ir5X#PDBleK&A-3|{ zbm0|KtltSt)s9m+Z+$$;wFkUL0Ks5JFGeEjpdUH(m1zM=fymt*&L^G(%?CfT!T$!y zB>Yo#$AUJsuF>D=jgmH776-#j2SUBHd5lo+j^H)jh(~E1jng6pWH4T9qpk5T?h%WU z#kM4Hf3a#fq6ex|u}mx&au9)aKe6jS>>ED+ZNFE_1El4EpLpM} zEE2m%iW&8>gDYuTv3k!8W(vPxiHdGfDu39p3wlut42~;BK&)1Pxs9e)?Pr?N^U%b? zU!q3LbNUo=l2g(u)hoxmdg9LgeZ0f>raC7N_5LVr)+PH{3UI@84Z<`>*gc3B541{v|*(akRD zwiq@1MRJ-bcS7#Kug^XRL5?c{Q%{aTYYt_gWqqNr=E6qy(jO1Bh}LaXQ^efk@z>Id ziL&EI?HqIc3SfvA!&j32-X6iP z?`{SH4qq9;MPXv@4xWyL5y$i4{wA~&{LI#*vpGdhK@HT73wNwYRgfH-Q^zo3gvAV2;jViWb|1(HW(LY-D$bM z`q_@ND&PK@6G_Z;vSD&5;2OLrubYsmu(FEa^?O$&N>zi$rkr{>SGh}h_$Ks49YQtv z7~4jHvd$g$XH6O$vn}^A_ugBC&?j&vU0l5atAgQu1 z_jApt=S}-!6VMyk8-Pf}?|5466oM-_A##RGj%4j)-ni`XL=dAJfj(|utS#}*39z_d zHt8mAvhw6cH$~+6>F^7+M1@+pYsCx>@oJ6j{{dq_oWFr;BLRc<)YnYAe954_aybwEk84hg?cwL9+5#T$@4cQ61f*EUn@*Iv7LG%+pZbFuh z11s33rlhs-G_w3e$ev;v#Zp))VH3u(^y=ojLng)??q$)<&hqyKXu0+L?jc^|iJ*~c zQ+eD|`?e8}mCCM`(AqCT6=}?P^PRzsF+vL7GDRWR%ENv_tPtKUaUVc~QZXbk5|MlW zl;fPynqDo>6eAaZO)hzG_}IH4V@WxD)s9%kJHus{?R`3AFawi=gx|2OcJuqhgV9a6 zNGQla?)iLX@y$m%njVy}=osIFr)9RB>xLjiu5!lNLuX-ueo`^kLhL>IBPyS|j_y`S zR)gppXwjk8i%`okjM&U+;>2RAlD9`c5*W(VF~(Dtatqaed(<0GjCLT0b|ZUIE5mPdmWearDiS*k(UxAD7)eY_8bc~@tDwA1N- z$Cyti&28t_HAt~GoC+?)S#F{I9qM!%8(MLaX%^ckHBiMt+u2kxZLPp>&{MRPfPO8Fh}M*^x} zccz~Lwry=*#a|O^BvHK1Vivd%WqWw?TE2WgU#^iv-&f=`#DG|HrRi4D$2!(X*`1rB zg$DMw(=s51bS7IagTpI{5m-?V=knGVz*}6%!|aPoE!nYKgMbXY1|yU-zBE5nI+V;* zk|l?KY9$kW)y$vTY3Z)Ih*akD8m+E~(LGEpdgL#1%*H&G*eN ziB<#j{#~ee6uA0ovVI#4yb2UGk6=z6l#+dto_ZO36UtW4VhD*!`b> z2s*|jA`eK@%+K6ml+*c@7fPV*ZwJvp&QNO`d<|rkyA+ZkE3NFGsLvqhS1&Sy1V4Cx zDNy7UR(v*ZAeX)3QWn@Er%f8ZKigYX!Y2f@`=3hoYNnB|)U1eK7CZGLQ z85SM?YJ?Kp_kun!%+(FNINT|JYB4a!Ca;nJvEk*h3&vj^8-~s~9Aq;r0|p=TFzbl9 z?%9rH8t=Tu;1MRfj2+ajUFqph?x>|oUJ~2@;Fx8WsFF|rVADe#(>*J{maN&7c9I)N zuA?rYY4j`xw!qkuj5xl3N-+C;L^pn~oFP!pPv`f3C+3=;K3z@KkOhl>sdTlJ}-5gq9uixgxKWl!=-*cW4DIdS?@PNQcLw>jd^g>kV^eojn zlQFcFpzH=QEm$1Wsh|OWvwUH5;8G&)Nyb$CRm7&+U{}3wl+2v_!(u^;vl$bjc>d2jn5P=rS~rlEOA^;R=g)?#yDq{wFmQAt@nFZ z7Rj_tC$Lc~*byXumno2O<_EobM4LZT&TGrP9Lv84*I)&@VYxqLH5a=$b=nl8x!<1@ zAMAale&ZZ&l+iCmKt*Mki9rforR8Ztxd0`c0vClE6gCMzg>SvQ_?j0@i44UV=SO^R z>LOHH{h$*QY^)#skfLbfQ^?iwat*xxNiD{2dHOi7h0BQwn*`=s$n<#`#e?K^IAQBQhr zH%S?#T^=2)p<;;^*}ThTnfQ6vHFHy`uj%f$D0P!xp5CefvF+y@Qf|R=?fpu^cvreH9S+3Mbeb7U~6w5jjCfZ zRZ}YZz|{StNVF)}z`+qnZMZyxTIqZ0_1Sb~iQL`Rgpq)Y2J8~rCEj-KN9NpF({I*| zra6IG+@9k)?l;x~zKQj9(y^-ZDJ+Zq)c*d2yDYoxTUbF3*CHIE-zZ2#NB4BtessT2 z3#pZV_7GL?QQ~_n`poDQ=~3r1id&HANw2K;Ra;QdQ*tt~CeOi_uGl#K!H596S3L}=1D;%>=7nh|fhs$O8VO+ND!%{u> zXA=tyrxDEUx#3pQkEI^Ge?b4S>L(!$*r!E*=<1uzMdWEG!1~ww2E8D>8R%+~cKNHQK|o z<)~)d=pYAPPMuKMQqj>S(-g7uwUK)0ykEoP;;6gT39bK)?84f-t6Jk*GkTPC1QBu7zIN-6QSwYE~XON?!i(vE(AW7IfF zuJzR!{8ehoLET=F4C^BKOQfmYs@-F*xAAG?txSUrf|ZYoPZhhr?fOmnMe0}fXOO?- zqh+GknVEVwJ{Utm)v3tM$>*GBR78|AlX$3AR$3VP99t<(td#aKRea_v*eyBc z%s1+7u6Yz|Hv{qXDnyeO3kIowhEWafeuf=DhqYsau?fF(nLmaFK8VKZ zx98DB)~<23Di-*TVO;vGPBNDjyuL?Josxd?thZU>?cJPl(_j>v)3>sJ^V<OMSo4b5M3+b9)Ps8)1QSmg?8TPy{w0nI<>F`-@I zdhHED)GEIY^9H#MScKgie8R>Tc{=M}y*5p^q9oQDH|T8Iwy^)a!?%evi*`-hX!yLkFZgsLGAO<$X6P4f-;knB}tUk;JBB zY|p)aw;is4_x1obekSd(+M#-MEpcpPz$WZHg#VhOl&?;i+YeQ;IpEYCcqVjS70dGe zMV0bvChU|c=T9KZ_UZ}~MjO(sFOmJ8&C>+E58H6pB0J7x-i+waV}6Vt7dV9m|M*Sq z7{_SzGQx+E>VOD;5w?`G=aF>~Dw>!_^8G`9O2dx_9~8lY%PGI*_)>lbNpR`Eu~hEV zAC^!Fj?Vqk$9$&@w7!mP9wiq(V>WGic^4HR!DsV&EBV(i-e2uew!KR2#FviJzn*1~ zRXQB^Io{AvtTytgO>z4ST@2Q#Da)bNjo-Y8R52o#bU(x)}&E199;^3 z#hgjP!S~g}`;<&39M{O*KLa@IfrW1PC)yIkF*!`ZxRp_Zy8PJ_#8^KJepQ9tsCaKE zP}C|_oZju-{itO}Q7y02j}ylR%NfFwitwqtZ=(5`E}W(aKcyQKd6wlJ(NKw16dZ#6A9lleu|? zT<0YvOP2m5TA#BlRVMJB*;)uvf6{n3LG0?Spgl&QDI)Vx7mU|6xkx@|Q+T8GJ9|)V zLqX+)f6L*?b^; zFq!PM$xEXYdSR8NU8$B;hwjKrlMJb5t`( ztg7K(h}}R!3x%f*?^KG;zq6m<#}fCkF42k@e?ud-{8{Jm`>$svjifbyIJ{~GLzSs5 z7##-DI2oG|j>g4z5$va@f-SKGoXGS!qciE0xPm6N?&ZjjA)CphG-Vo5PyPFycA6Wj zj~>zc3M<`M4`4~u%QB>H1#%0^PVXj&wBjfp87M%uCa0pGe!RA$tR(IuPI|oUdoOOP zQI~Dd<=UVM`pGP93e$^!)vAZ?kW#GheS&grYksOhPRC8LFi(skK6Z-P)4a%vQ!PHx zNGv4&(4}YTgz#<_5tlC_fhuC0#rG~eZLsbqBWPqmI>asVs?=tM2h%Kxcrs4E&~4u# z`O2U{$R``dPS8^DirI9A+$epJ>Fw(Wt#)wzmRx{tq1puE{JiLYon%ZyT55!C3JCz5 zqx;M`NRt~+|4Yb@AL|11FLIRX>O_md4+5t|Ge#MLOo>M~PoaE(qNWR>qe~4W%_ml? zvzC_moPF1%3h%V#8#hU(>&fVM%if`YU0(ggu$e&yIO07<>2cau-h|JU=PZ5XxzAgY z78k+=g_1m`!q(w`DH<(udI{VvUSfpRh==LCa;{I1u?*V~s?+|wRk7nw1DF@Y@GGWD^_-XwP1KC; z3Sopr!ZR-OsjP>%ul#o!| zA-8I5vWjd+8%x0^ASisGE$4ngsP_h+xBk&LMx!2^uJijDKsr!$-fvA77e4!w#vMJ%Yf7QK|kY*cSVA~tX`XCdJD!wQ@+#p4vo8UjU~CO%%*_F0{4s}@ zW1F^rT*dRWZG#6!pFrqw4t)Bt#k)U=G=x$9akNevv4;pH$a{oaEF|lL*yi=CWd^~W z1%c8y{_C!nMP0L`9*d=^*GZj`Ld|r9%H^+n2&U72tFR=MMp#dzYiqOOj^cnX54J9C zoa=gz;QemkF5T~~zmi~wPXbn}UZ=q*R~C^9X}L=KIw#bd&Ass)J?dusESsTQ0|@e) zsL-p|jaSnh)ZzSzg%}wUGI>X9uJ5~GcHJ~g+*iFq&QTZKEZ=7dOcP3k<<)TIKUS(H zU^m}?7CX<}U6X}B7n1yrpL(29lgn3;ZK-3sRzY;%Phbg$O7DTL4jY~C@rLyqJp&gZ zKg&CMtMv_Fwb!AOc!f#<1+>umTcp^ICkv7~a;o}R=xFm0F_FB3VfT=qYhj$?1^JQ>;sV7yvem9SgXdQY0f@U%yC6T#)5GZmJ9>8!VLYjCfL>7)Z6F;N;=dtA&*c--t8Fl2#0VEYjPNHG&vR-KKu=XRC}qQT_c9JnpNW`|WRa zb`g4Yw`7mDly6cQKK1Cxn0mHRyMogbTYP81EHI;-5;=(%^|m;72U3b1(>t$Se(g|e zPzlYDOS#qA1NQaBD!r#^K%KhGcFikg4L=7*Nmw%UW-Xtuvzhq`P?~zFpZ+d?-pusO zq>O#-1L!|&)s9)2|6U?VLOQ)k`0CtxxymgH1#u|``Rh`xM-mG++{kbWId;%99d(8hSn7^I?i;u_?D zyEod$%ARLvw|m+nJOFLya>ZtUQ6f@lb9dAw_a$>N?EOG)+C8jeevg5wmq@BQg z^tj>U!)8h91@2SDz~}Hy9HgoW?s1=gm*8;!`Gz=!Q|unovxbw;L}jaIzbLI$v($fw z<){yDV{&2K4MIX+hZJr$ltPl9+wo1$c)1%Il&s}XwP_L!X$ z57)7%I;oEo$nI7<G4?{nvnSwo!vNLdrv1sHWLT-w<(c=af|cvjX8^YX;6vvoI4 zc%5LLPMen@PNxQ}jYz^5oHD02*&Ck3hDr-jKdZqH!c%KGI{p;ioNCXM$+dp^Yu;$k z?ksp3k@3NheriQ$L(_6}RYd3(_3kBT0!xN?P<k;9$T8brw zlnGFfv_`>Alcw^QhvmnQoS68?nNxH+I1^&B-Lu)7M}Ljm;txA$MTaXt@u8Ja zR?Uu{m})?3?uP&uNg@f7`SH)7(ou#3xxg`87>%fz(9i0J%Gz@0^g&L!+zty_Upua; zXu}Dl>Iq%@KN>uLOiB--qmWS_Sul@y;Fjc-+0v`H`~D?cH1V+TEt_%Aw1XqqxBZy$ zH%Am%7EZyYq6{YHR~_#GvOd?$G^axbljXqcvrpfuv!7z6R#iR3C!Jf@f4=Rj8I8ky zv0roW!@}$4^T|B6U#gBN!-nocqrYh8N@VS#R~4qgqMFLEw&0@6xDquSaxTh&;R z%WAtS^CMC^6atPslKQlnFl>E}Iy`_~qONL%5Pm`W85sne?n-uzTA9lAdG&{sA90u^ZXNxRl>c z&_1Ot5;WA)P8GdMd)BW|#`Ro->|l`s?ofoG$zJf_XvmgQ*-U<}v1JHW%Aq|~-KS>-Q4IDI4}f-L742*-@`Qyw1c%7iK@glLhk_jyq}K+-aSrPJQG0ZWA!ZAMYnJVQfT znT{uatr)sQMFw9uSw>k=^^iyzq5C{6FdmvGVo8G1WqkDsk5_|BZTymk&z*>5%qS0@ zrT~&7S{-wq08Fv>H$MeDnReZ_VQeKyh>(?UABQ%TYVjr+$*XvoErQG=?xKrS8J)+| z;4Qmh)L3sDlPT+(A_K@~g8?fpArb?$QI@NJ*PKXLHA1fU#d1QXB-ZMj1)laS`hVj-cN422W_m^znE3aC9d&#b0 z>+Gg=Q#PjI`6fc$J_ZjHHPm8jj9? zulX1kvCfpAokaQtgfmq{2qm~sV_QV}I z;*a&I{9Z}eY~KHf()@nCPmN>JLIwLBxju-g{p5niC{=I7jm@DMBg3evkF4%2+a{Nn zKQqrZ8Cdo8!0Jt($fK83a4#fL^sU!m>OBb0wt7j9TsD_`XBC=HslH!l#zfW-R zxBTdFiZHA2`eOwV-}v;oYM2tI)v+E=JxG zs{(gU{Zhi2blya~$$gs_pK8U5A7;u48GwC*9VMw_$UoESsYy+K@}7_sz!gz{=Qw;L zV4`(_DX$00tTL)3k+Y|GXq4MU8EdUr$X1CLIQj^$T7|QyfP7avTc0!;M~(m~_Ho6! z#GG#0e8c!Ryu^_4z8$*^y_-k1MD`8iTmwR3eWX%lIqy}6j62;*NI(g__iZou^`_sF zr6-N{a4SFc;BCHhAjWsA2sinEW%jHYOu6*LUOVcs+y3koZc815wCcAnAK@a1d9S>m z7R(Rq{MNj6&$V}FlYNQa4-6qV3^PEqLU)!!>1EJO18`SJZn_>roGo5sVk_iyyOtYH%Xj-eEtRXTSh@l zjCQoOH>YI{rN$E`S)?+;@NBi@IpM&{CUbT{8*n2~f1>V5s;>*biO+~4M5#;L_O4^) zHW>+lOBJ-Ii<^e$Rj@-2&uy!}$D)R%=HtA$@ouxljy5|WF8`~#yiMSK8q5wPvu@VPh0Q2trr>&Uw+nlxq z+DnpmTzC1$(3b7TJg1JGYWwq2u7Ly{+Fi^RJ-@bQa``W4f_o}|GuQDrJ2=RhHg_T| zJ-)qPh|4^i%@ghiaZq~BB`a?^aq5N8NIhRoyL?!lq5JfnIwLRdr(Y!>52bBn#*77D z*lpQ5PLa?P+RC=u((*bzd^69({jjmm_M$N~A}N?#ik%@*#K9n&F|AQ7>Cu95S4qvr z49CeEF`whMNe@Zq;u=S0N~ zVqK9#zvBFfj8$SU#2tiK=HG5Xa-An$eEu}|;HY8g@+|{L)lqKjN>ySDIvb5e&wE+*Y{!dMWA_H8M61>~U zdQO+Ijy>CUKk~}lCIC_v+|{u&vsvqaZ=kkD^Mz2idgA>;5Kd$)LsW7ZwELND=m3l#I1ay8oY_QkzCB+17o_-7f&$maW9(L!;j*ek-Sg`oE7Pwi`g%gTE{-x(56r8p!-gYxxh@k)%4#>qTyOl%~;AjHjvWFcfZHK*O2h$mW?vopfk zNm=)q!=rCCv4&}`ei}Y?$-lebezb8lQ)}*j5kCx(!q&B(@>M3&nQ(HJZRYFwtrGxk3C@BrBz%hBVVjjiv-Dj#^TM%?1`KXW!>H;P4E z4Ba%p@dgF2N@TA#Y=~|LacqxMd6He|nhdH1Pj~63exBDePSQ1$zx?P+5R~yo+hIOw*>Dsf$cQLzP zPR#A+ztdE0Kk4dD=u%KERcl(-Jv@in?d&fEo6dUmV;zY1`z2h_c!@`&ks8 zHJ1vu-F`v-I>fm#_Nkw)c z=ib@<{_TBNxw&$Acyc#L)c0{XCp#pL30QArAKp+$Z6oFy@K_XBv z2m*pYpcnuk7yyD|umb*n|0w3)9}hQo3s+WF3}p*Pq}%_)I`lFW>iIs#wvOnN>xmSy z@ItydIU)%GNGlk+QK$%d9r^`5FECQX5)MLFBVvgXwm<-XK>#=c2KaLfM+;YbD<`k# zgm9<@5&?q%MSuV(90|7qz(6RJFhT?bLkR;=NK2py00ajjMgA4+=8kkFghMQ0R>CkK z0s^yw{qY3~g`(rYgwY|82up-85{$G0Auaz5{ev(9Ktgm|aOfXnhNIH}Q5M2ha3BB# zL_!e|5KI_gn2m<~OEQrv`$_j$+6$rI}gMq>@G@0STNJ|Jx*b)Rr!5|O_nk!H^ z2=*UPFd+&Khgl$CXoA7f@`?fqBjE_3Fc1K@K&M4Q(FB25iip7fbIQVmP+?*8)*%oO z3pfye1_q(&4?&2)tkA(Mh2b!C6k!CKr4|5fLjGx+m~|W)(r}019b^0Ku)$HUI;lHw1=0Uq~Pv1r>(;0Y~o`620~R*(;0? z2?E0{Eno=rX@mhR(Ru+97C|ctT7iU-7H}wkn$8de49)ESfWrT#`q(3p&H@&$PH5E> z`m4yl+1S6P_-n|&sRI9!;x8fzfffKuFw_!^u(GfMqUnJ|`?jzM0)2APg9liO0EE%1 z34?yi$4q<2u3p!Vg&|Sg3xLNLH%cnzl!{uiudOf ze--&RZ#n;x;x8fzEs=0A6z!;J<$_oO!63jNb_WKaH57(IfGwbC4S=KV;(to<7mcpk?Qc%v-(rCN z8RPHC@xR3Y|1-wl8`rjK1>zA*M(e$O4Y$nH30tfP$cCzCpnjAk=@|N!%@etlfk> zfr0=*03pl*WC2B5g5biIe@M9{7=mU4LIizzha;^3NVp~F550s~{worV{p*&ZC?_RL zNT?|#qk{gaiiQ5G%Ov&Ac|9UU+RI8VIqt8~v-Fi10OAA=G9v?}l%gHUDLXsQ2nCll zUOKT2Us*Sg=mG|SG?7Dzb$9(VN?eCM4eGV7QGe0x>^Np_hbH}t^327GT!U)p@ zUVR$Y2TVWG&JentRp3bcqqrC~!d?Is-UVE)yO`DN^7ulsztKC2!(VEDV17cLT;tst z{&PH(`8WlR^fE##uY#Rkl3))vP=Z^{9b43lM9dZGi1 zef~yIm>a%av2}ZF{gYxTYJX;KpZy!hwDp9G#_v{e8wAsRG0IbFJWV8HxV`=HY}MY` znLiY754+1lYGoHIkk&hY$FKWWpo_Ffc2a)StEln*s4WWe^x&qT{2)x4XND*_yV~Ho zd`udQOE_WKIu`K1*R#}@*M97e(kqZumRjf@>kf?J6R2lv)R&qY3naqmX(I6bXV*%E zSU_@&Lm#>BLe_7)U+~y+2Q)Zdk;cP_!1w!S_kZCC;p%ES-X9l#OyMNDFDvb?$7+B< z34SK^bGl!UYQOWTo1vA1s0s&7M;~iW5;2b1D^?d8yZjB-^vq77N8$^PhNqk)b$k1e z5hIqv?3{oX4x6m|O6*3U55#(hn3y`R!tS{c`D6saB6_*U|5~1uAGZ0wT|U)Cu(ygO z^xvx`Qj&K2qh{FTO9A80-@*!n{r76Jn4sc+q=9~d^flIb{r{noB~e29 zO)S9wsynPWX!U)oO*H(!u7+)(7=Ux&u4-?CSxG1ZWfy1F$^#sY`%+pB^ zUL_V3N~N@a3=F$r`w`E3Tf3n`27O`}DYO+|;k~QUe!}iY+;v59^G28STU-!?jU@DA z7Hz5*$2e^{-Ui27=WCTP|EhIjCzto>?>0qyCmVt@Cci#m`=RwJSIUF(@=a{G!kmh` zXk7Kt-P?iO{iqgLv-!w4?*MUs$$X+xyyl5gV=q3_t1%Y%jsBy6 zB_G?LEAKI*?%5D0lA(KzRY4086~;x*+7C5)9x}ox;9Fx_6QAIFVh^tJ%WYyyo2{MU zDW9go=o+kIvtpBFL6##*espaQrqguCo+Oi)F!ZYuX*~Ee-8^rQLSa8OLubVT|CK4d zomxA8%xM*2I##(ff@N)ZjH8fsdHnL6u8G|r?{cfID=syHE8XQD;dmiyYxiY)HM2bCAqt zqF%%HtOP@es;oF@@d@FJV0SQ?cV^Nsu~^N2_I(d?HZBgPGs(inAmTP!ylk%Cule)k z$6Sf3u6h?=+2<9hq*Wmnr!Sq=3z zJxsBh$8%^e*(H4Gt36J(k`sQh)Jnj*Hw#0Kz7bxgLEsl79u&p!k zOxT`cA{4v&vGZG&+?RVGe}~8Jgl-3la^In`(3vQMfF#__*`73@}PNvAWD=C>& zh+%0%Ma>Rc#0i-@7p+MZ*D3se(b8T`)tFxHYE#c{{ZNfbE@i?yM6;^(*caRgo5C<` zdD+Hg+bZ2#?L9+62%^(1{CvDjXb&ub`@Y)r-=HVYq(#>t-(A#8YE`*;thiM|UeM3}BlE zUKb7qEDbI#RCRKrL+9j#9N`Ckl_*ORhGtAfx$=ToUd7>LjZBl=7wM+?QlOMn`N~Y$ zme}>Wo}2Tts~fkjm%aPOM(;|$4b?Tskhyg=G@BT1i7Qrr+erG*L*y%aG}ap5bGIn> zf$ox?!mEsADZ%4^Cpdo!93vqE&^k(|_`}vetM#KVGly^2n4}bw5RWC&$qUk~uiR#^ z7M`x*I+8SCh#Wv96&&vK&y&L9AceLJl3IM;@uYZ#bXBB}ykpfL$G$W#xBkJ&##ehB zKJg(zUQS=+F~c-twU$g~x98aX&K@f+aD>$3o*~aNhS$q~5&`euk2++wyu` zjo7zu8TC9I+kYthozHJ9?1yNy*^!)8bJjoTIbw%aLb;3J>pu6*bZJY2WX?3LHvX`; z6D(s0D!S``XwLEFcZ`GvUV2`p+oY;XE*38XgM7Ibpx$z=KZ+Z&b|uqRdc5~P z+Cg)`FgpI|86|G`wCPAXn_(3`eTPf@Z`P{wi{H6kn2ox65$d?#JbG0ihBbkyg&WCy zLYbT;8!ZmbUr^x*SntZC^_PTF=mraoN<`k|sFb9Cjxpvg&=={IKD54GrvBagBiLL7 z+>ZZQgAr6R4RbKhJi+>GrGzNLqnM-S*Gfx zBZ-LG_7gz`#QK@wd0I-k^b@8J*5z-Q0xmR$zHJ!ifxZb|hxB1z;bN4BwI%<9pX0XZ z!C;Jk1*o~)g*n%0q~mb9KQQo`jbxkqO2`Rz4?BN%XYz)DQ-%Y)anZA%jSq{Tlm%Co zZH}`)x~Fooal<%N28B)ZgR_MlCq(Y>no8GibQgr2LO9wK?!lQBcz4DNQNPd|Mg znVbtFgC->R=7qLM4-=klz52(`fOeAJKT2NGZc&JKm^)ICj?_JPVIA46lnRqWnd9#4 z7zDu;>xtU?^ux>8MSXgUeBn_#s@W0^8T1@oYX%_CpuvKMk<|iBv`BM`}@vr z8x&(qzh2@Hj_>6TvBAw~$lZJBeb%~vCxzKy*Wq}pPf0*USLzg&0j?+z|HD`JpmPuK zhP2r3N9GiiN;IXrNJo61^#jK<`es&&(Q8#k(lXaYNbWaA{t-(D_jta(nvR{wD?J7sXYGBFC$aU^z4byn0@X_ zUGHlBfWLUBn}77nZJ)(iA2BR{4<_H}Pt=~Y_dl1c%jn+ffA*nWnP2wg^}$O^koN27 zzs6uAkoC?(`yg^e?H@k`(N(TsL8-zqDG^%mEG2C8*AZ)_3N-fcBj!}h>NM~*Yb?1#7t${7c6x37^?duxv5fFq zMjc<;CEF5-c6NB{+x{oJc51F5Epq zwRD}j#LY9aVap8a*KJ3WZ3ado%RA< zQ-QnhQ@@o>(Hx1zHq?<#u}k@8aGL$o5GI{=@UZut{f` z%3-BN+wle_ii_^9Wp@k#K9_k$wuPhhSx?w~DZmVaYg56GnK3+GLnJ$Wn4TW<>vRt! zkjJH8mOZ4LFG8x|WTUt$_U(fCe3=77swb^KtBK9!@a)6qNc(pQs=-s(7x zyLSx4MEw13v)e3_D&8E?R2r;U+FLIdvAuAx(;QPHu+wXQ2T|p|wZ<968QQ&WF3b{E z;k;k&QCL2Ee}aU?CGR*2POlilPp%3OPqr4$E)OZ5eBS5%(e+7kpK{?vosY@a6BkQ6 zLyW!W`bCd*?Gfz-+V}q$Q}>p|7yA7ou{9*fK_DMA9GBq${W6N%R~x&e@t- z9Jes)`3RSP3YFXOog+CFqt&|Y5l94U_7?TvEmqN zQ>IsDL^D%(*H?Ul>TK@@$?tey)(^iVJ@g>V<_3;`s_o^8c;{3nkECQtl1Ch#Jo^OX zwMTC78qMi=D@hJW{S0chpkI?<&nrXrnk%!K_^IhCDiwqMr7l6vcF^vTg4O@1|TB2N21Y zcGdI%~VYDF%~SQM>t!-P-?N7iXUH^)KuID{HM(gkfG+UsNO&=EsWuzWWs9 zSQ?kAr{5*wMzX5-K);Tkwjm!g_d~;j5PpU&21Z@*K%*H?Ig?K5_BP9GBMLi2c7({w z*g-L}uFRrNn(1d4aoZlFvtkUjOfw#HJv5nr7ygr-u8VHEcR_<5*_im|t42DrkZ&I# zMi<{Si^!f$+RfH|+kL53v~Slo`!=Z%z8B8CZlWG`OzZxrlt`9}j0l6>p#J&yuVQ0( z5*w}Wp$VdVHGysll^s~SAFf_mq|n#yJk>B^AnK`zu)y~`{Na$GfU)Fq+M*ZVE;y2Z zr^2si*YKnynI-Aw>PfUhsTlNJ!4IBA{nqE4gUaE=C-P{^(iE$%a|Gjnbf5Bsrq?Ir zL~JDdjX2qtR0~SLPqgk$5)O~yAkY-zW44YhT+N#xq1bU28KK94w-0!}* z22*(VJt-pb>2HqRJ{B|+%l#wSi6dYbSs-zQpW?I)6lfFT#*PupFLc3>^&gq7LlP7{aGHg z`6?g<;}h-fJAsgfw-d?K;v7o76d1v5mHNk8rMoI(9k(&*D>Qpitk$n!f3Qt|$t_!w zT>kKcZ!0r(c%mkRPYD;N*GB5YJfImfT&_DXJSpjPpM5C8*j2eW;oar_!JcoFEe&yTlmjSSno`ztf=e3 zT(F;o9k=uHFF#tV4!oNggzm*r??AvTJ^MSc! zAsg=vB^bGsTp;iHqH4x#dQ4iT$u!4M=rSaxzAiaqzQL>G^GKR$U76Gw$FgINF3eBZ zlmtU#(4CjJ7v6>(+51tGmKGNDfB8dK+nE-Bw)Q)@X~H8%`seX-{T1Uru2lvlb3Tnm z054otlhMvwfv1|v&uqS`P-%P_z;XiFQq2r!ztm^>9jEyX5F=jOkw^PX8L_N2ZAA>1VxR8qo!C6+daO!)f1OlW8a5qT z%7k0hZf~GG%c{)5_gU%THe5wGgiS z6;t=&VQSfmHug~S9T(*9{=Pv-AC}n|JVba>#}klY(s^cR!LpG1>e(;%i_3k@3fR{!O;-9Kd(UN(;joyp`@B zKvDytG~Q6b^WfNZRaS}h5BtC**Ii(2(SYDq8N|DsurNmB=OBIYfAkHH8qqCPm&Nui z+4bXh`Ys2~x;MCtWS9MC4}-hI1w&^-o>0l(YOEh~ImIxF`Rh_~_tEKd5Y^Cg)jN0Q zABi+~>+LmZo`DtjM%Z@M=`^Sbuvp5lAL9o}m}b7GJ|iPKWtkPP@_`5@H)?HDiv<+| z)vgwQJkfh4H1$-pe>o608u_UZ5PRv9DLXPwFFZydBOIM_f9|oIynUSnF_>St@f7?!Gch5qVa_xujeF(_F zF|A=T`_M1qqa;QoJNdZTN$oIpx2V8aVcqM3$0A!x6oB#^-*kqW7tTyI|9GJhF&iiN z)WWlU;jMH?b1xRzRO%8HO4S&+RMQ& zrpVzzx4gaN>xOQP+B25$mtBu@JFkuKt2FU7f&LVGhS)vC^;Nn_vsz;1{C>(3d3P#o z)n*r^^cm^@P&bu7ymaXBgcq%Djck2xP02c%m`MLOe{7XYDBA9)%*R@*lM(;rr5-nz z2H)=5h-DOYs+6Lu0CY+fib?A1%BieY6w_2Q?QK=sRXi*5!+^^Cf;j0oHfg%6SXmw| zh(CwQ(?E{lDaAP2WI9$g|1T;qH6N2>>f8?kLMI1|GY_r@pRCqgVFwKIu6_i3m}JpR zt>HjCe;p8Ij2*MV@tuD*wHjbYv%D5P^mDUsuteNUYSwf0`SW+gPF=zQZWuQ;Ro=Os z(vR(pjr5bdJsoilZD90lI9;krzgOm-VQ}Ag-q>Es&YmBOm9G$q&7M{JJ_voOa}yNq zLx+vex}4eb6)>3cwPuK6D0``K2H-l>z;wfUe{7Sz8==ztioi(w;4WyodOR(g+izrP zi&z&ou(VKtw)tQmq5Zw$LAo`n&FoQFdgYw;#j)oYdpZ(Ca(%FTx9}2=cWB@vjS)Q)}Pi_sV4z zF;;-2&oU~3o-e*%#;y2~X^99w)DdN>e@W>F&-#c`2xX`+KVjjrc&|NNT@zWXbD}YF zi19Mv^aS(8aJRAA9T%240IxE<1a6;9E|1LZ&7393XPLkd*89mjcGS5?6{>@kA0^bipI$mX+pjFFNpy)SI{ zS*$+&Y-Sz$h4^cPh;E-0^TvKeOjwv%C(K=NUp!$*AdEvLQ~-6M#VS|0Ky8RA%G3cP zEWlXAFDE8Ev|>Wg2MsJg9x~N$e`l+xAxI;((RoRTzr;)?7^NBZ9qo7D$u-2Mco@NW zF(Pf3P*nC!Uj(u+oUGbFonC>VNcfjxdx2ycjUPQe+j8Uso<?b0XZR6ds z0vN+xq#m(tQ}g9*V7w2W=PphAD9Y5$E;PZbDXna;ngL5#&O8@&DfR_jaB5{HdTtu{ zh{DDfH?5}vt%KWGD5-5ri^jP}XD-OKxB5fZ+z!~lIahWs{`wBDe-#$jQN(;jn)z~3 zd1V`Vz*->(BBu|dd@xltS=R59j>wrZHeJ3-O`*qE1hUw61(-XOHk0m1*tZ6)a+9CO zGrC&ZKF7DMCY#|alhsU9gD*kS>h z9EfCjklhpZ&V~o7fJ*%~eO95Jp;ddIs$Gmj8OPG>qWN6qJ3q3HF#u=`7_;M7(z=zv#Kyh-YX)PEHZl_T|nVUeulszjH%nzOez-inl7s z>hV%be=!MC=)A_R&-1=_Ql6~o^ci>usBQl=1V0I5C-_HMWFC-bt#~tpJNL^#{;zdp zK(s2#lC{=#0q;DPFYUNwT7-LA)ZXWb?kD0qFg*(vXV!l>llbNgBk1ab`ZXniwT@WY zSV13qz+N8#wX>it*H48l7xiFycogR!`@DKye`sFRgtvt9bLgYSK-5k`fszyFnq5#s zGA1eb6IVo`%z`+ok>?BESYW___A4SLPakJbjfjFYtYA{kPw ze`Q^i$@NLT^zcK{jH`Fc<3=H(4e${=gq_q{)Y2leQ+fE612jr|7j<7b$KmidXDcNa z<`1X>XE&R~X=3?TLC)Gv*HDKMteeckyt1|MELH0;0)UftXq7t4rX)*>2arx=WS%ZP|)hh)uu*;9L=ge9{je%d<_eA z6Y+JHYQ6GK*qgI7kZiqnGldU}m#X?MJ)MMTjo>@fhqyv@L5d9P#VPT~UdFaTfAVnX zVwdI$T=Pp06FKXc>2yf1o`zfS7CRTqV%#H+i0`H7Vj3IyL(E5h&WB@6yt_vmImW^Ak z39P6Q1Lw;+NfpPlX#N^-HT`8k`V2|@e z+~^_^gqY-LU3~KT5wdcn%i9HSFXuBS*ur0_BR`TD<0z7p6Gf4-4Jsfhe+My$%VZY< zMC&q0a^SEvTo?*|gc0k6G8XEG8PQ1Q_7sQt60yW0k%$_^5m18ZZ{wDOV;xmk)^YO$ zI4>$i6JKaN)4l}k4dXw@XZBZM3@^Swpv*ACAJ!7|q3i6sUl&Y=Mtv4LSD082?HuPj z#j8mjBcWH()-C*rwEa8;f7qDMn<&5hkXUUG&p^SZpY2V(N!8gyV zduQb&@k?0*TI_no+4*hEep+!80!tMZ1fgew*-(4_o^n3qa@CI!MtYuVousJ^xo&}e zaTCQe$wc>jfM*IdKbf?_9KXrX=DZV*pl=B#QJ%5Fe*8wB_&{ONe?}#?n3D(T-Ndnz zc6(#Y{4_LW<&OudXMYEaNkZoQ+1M6{+ZMKc^m3qKi!xki<^5)?~F)3e|=|bBYNQC30fA=fd4C>yJ7eP5lL&qp38}5TJ_+wY$WmOUVEKh zTq;Sz#K+$$8*|TzOZQA(xOlIXn0VNn3kX>T^#vATh$x&#`|gMKy*C7j8!Q1)#-eCZ=EHSF-oa(tq=tYS5Guvs6a$wMRkL8K#DgT7{MF>YA3t) zzR*vCZttNtf2cHd7hv#H)T^&nY5!WkZj^y5ho+wgY_yR+9nE66%(k36BHnSHEt=_y z`92Tgd%CtVUpf5zQzK)cV2&AG zM9o$3tj~0imhtr}3)$(Ij4HU)>i7f>&|aX)6->eFfAFLRL+95YI}WclVI~?*BTeR~ zaD2UWSJRt!UVNFS{4*8i&;XzcEna0*5pA>|^4f;wu)zZISVH7MC=RF(vI-%S57X`< zdv@+5A_IYZi`L_Cg9*$OzE%chy?YN98kb84HZ7PB~LyGsRk+QS=XyRH;;k=5oPeI}|I|G^i%2W4CV??Z}teH`V zam}E`xQK}SFvBw7mR1kEqV{(+iyOW~G5zzjf9nfc`?PR8XM^h`+)QQOC6GmN;&gwn zm|)2E5$*;d^Fk!wz+WPgv7+mNNY*pmLi^Ge&W-NWgSSWhQsiu*rabS=L5V%bNbO8T$i ze_NY$0Th9!JJfosKm)y=Az^D}2DdOn25@e+E!YW|oogyRr1uBX$-MNcGMy8fs7oo; zVp~jq$iWN(JVg@A1Y%`Hqbe#d$vmV`dh?1&XGx6zjNT#@QA*I5hfZPaj%kTe#gbNy zN>KpJp<3t{^hqlAGbe9Q#x+@OT|e< z`}8gl1`J99Ddl)!w*HHS&U%hcZnxhvh0W#LMe&2+9wYi0YraEgw)*;k^8=*4^Ih$6 z9OxUyH(LeYY{iSLEqA=a>{ztfcuXoC?+Iz6<9hk3Z?kXaQ^=OTy0Vn7qX+=*e>yW$ zg7m8tK+@kPd$C3a8BQZ3*~jZM?s7D;UJy8gJedn?BjH<;CN0pH(D2tSX@H*Z!_IHq z@TX=~gboE?cIP4qB)t(e$_KrVDp9i_Yt3n|`cB$h;cw2?9Q`?9#1{BgQvrGs{)}5M zW9cU?9F6JHNV;Q+@{}IRRZk{Ie-Jl=Jd0xL9*0pW^{|buCsm_uo@-G+=0H3VxkWRT zq1N6Dyu&v*SE+8YBOaS`Pv;$s4H17tY|-?I;K)K;cw5l|9hTae6QaD%s3)_}xEn-)e}2tk5&X?? zz22aUwuUP0zuJVPoeTXiQ`JtRk^t&mX{wp%V%0sy}{s3 zrXMoEH6{h!jW9@(m|z4G^I@~WX?MYHUhnAGz4Q<3n1gBmr&%Tx@?g13la~52a8SSz zQPqL8VXw>U<%sNmH)b?-f1^~1?L5x-x|>`bgrGAoFerSM_A;TY0kh4*OcZ+faj?BRbU(FBiPU3 z;v1^cEI5$1`fQ((WrO&yP3w-y33DJB%Y(wdf2Qp0^H)-z<{5+G z{7yJ%p{K@Z0ov$jp=MqSnzDu4iDIEGA0t0bTJAx8XK@8l4a(#}B(H<%UNLw4Cjgj6 zJ4G+^V1clgl{rEWUyrzN@=$2>s>M1?V}>ftxP*(ZMWhhw+3iCs`(r zq&`aAz8dV!sKSFFt<2(Hs2G6Ae`?6tq6S++;vyarCl zm|D6{je4%>T^PcL={^mWDpML;H8WZKOwyez7LB)63kRtA%8NKNgmO{)NiePWw%cWQ zTa@Qdvvzikf4GyPj}QN-=N*1v?LY)kKz6V166VwHUyX7f(P^Q z?r06Ss*@~CF8*h3fXh0P(MX-hKm&y{3R;lyFNxo7f4>L;0$MPV2{0i{pa=%SuUFP7 z&5;pBOLlH9MRW*EFOdem#&ZPhk!{S8JB?{mMxV&P+Ywx@gXfI`->5 zwzK3Jk-vAQIqu?}(9l-l#p{vALy;zL>;xH6z;x~t&2D~Up(oqN57@oRhlR0#XpH=c z3W8bXe_c8K1`TmpMq%F;;UF{ckego^&0xnrRh~J>Pglj~L;AKFK&QLhsdH!15Tl7= z4pMx*)?|Fgmffw=h;OE{z~~Dg^JG;rQdb{hQh01@_h{*$L2nCln$1TxILaee-td^( zn9!$o6Wp5DOgcbj84Jcj1`JjXNpQ0=EA!@Me-DmSJ4jxgd79TANol%Es_t$M(!`o- zu^^=e@pQjkqRE%vN~2VR)mUX|jJg(AY+jvgs69Rk3$j1RH%Cj2u~X1iM|%oyV7H#C zm^L~zGL~I{Q>zpXYb|OsqGq ze{1yLcra<1V2@ZYM3-U&D3yWKX{YB_ba9yv9p7b=S<}GEDTH!!ES=b&+O$ce4sf@x z_opn9PkFI5kw-giS>#}qe|Jj&&gn1+BosD!DngLrb|3-dp^i8*(1Jz1 z*N^nFe{_|+@y(O}J8Pm0UwMV`kr`7?k})Joh$J!Cgjg|cVYT(Tk;6A}7$GfI z+PZma`rY|tYbofPRR*jQU`}UL766tp_Cu6pdLW@Buj(glU|JegO8GCDF*I=ne>zww z5^7A8JF7ASNJQB{B`Ic-6New6T&OiuxtgAOtTl8El_wzQ@`DzSJTXl`+t;=n?w@}A zVbFO;5<_&`egr3R6(_&sdmzIQ96)fnG;XtpP?cwAfFt<(YBF1)d4@rHH|$OI_t&#C zKp0E0$Hvfi64m{fZeOet1 ziyMt(Y=gs!?4_w~Ba>&{8XSuiFKVcn59@KCZqAIpYX5Q7X|oBKd)Oar5aO=CEBcAQ z{t+5x%LH*5K&$K?U8x*He_LaSQ6G3TZ_$VamWyw7YtjEUgT?#Hy}&s`bV4LHY`Xzj z&Wc}=9%rVBfd)U&B{?j9TjItZ_ldh9+Esr#N%U5WY&|7qGtmf6tH0jOC^yx!XdUVy zM0S@NLT5Y;MuBhJx_xO|x~CGeh?5j!2AT?T7_5N;3a_3Azc@Pie|IhM6Lj+vPC&x{ zvdv!zflp7W8^#I=4hMt`-*N`xPrxT2V&v)vop;+cvQr%$uWl5tOx1b%TK0BdS|y|@ zs5epUm|^!PfFuGTwq`);M;u9pgCvz*O87oS7!uGz3n^*fSVZ)ZZgDGr?|qyot4e<;AlyyK!^=ZJZFG{b=NqDnM#F7A7hSKrAV{Cg@YN4Lyg*)x!7 zM;~FJRDgSIv?z5ss4lb&Ba+)67Ij!oqI;QA z%+Df^z6Y z5%u#kg&%smck9BQmjG#~mzZ&T#?Dl>&*6~OHIO(gN?|u%0UKg^mZ1v9fQ4)%VfkJP z-q>TbOB`jL%9Ndn)tPT3N%3^Hj0ML+k&>A?99kdnf9Fx3SwCOj{61?;@)hW|1!TD`=s#{YJtSfV?PqPgim#8!J~iR>~1aomNWFb zHi&FShNahSK|lqtDd=AkLMT8x548kS>6{Z%B>h*M$Tc+N7UucClTQC6%%R1Sf;2nAn7vI| zS`y|!0;))YfWO9sM+zd16z1%JQgUoe`3gy1gtPWfbG{LTO$J5zc~D=vk6fEv&DpL( z*OZ(ho3mk{C*1d}-+i;+kf|$$B;{9B`3T74fAPTfGq8?8#S!@W!J+eh$~lNAIyHQ! zOT%d1-#|k20kv1O6^kC6pOZivJ5Bklo&YA#7g2L)DqBxMLgdIlFF ze^M!vbGOFpN_S+)ao%B%S&GRWZ#1#FH{lroPafIM--Xofyk>>%nWve-wh^i_4-@6; zqQ}RDyPME;%D0>qw{aq^qQ|yQoPC#-|N8mk0n19d*BTuyZR;g|WO{~V(Q*}iL*d{J$ zHR)Y1J3H84WY(wC|i9N9#|G5U0CzK<_7{ zaBs4Ku)syLy+kgCJ=63qA$15+@5nGoA23n?ManA>{*MY8JrblHSC&eR5_C-Kdc3TU zHj8pqta&UfWn! z@>#OTj@L5os%MI{k9z)sH@FL(eXsjk5It7fA56AOKdnTU87P5+j4S_kCKwZMW~|?~ z%|2J=DNmI+p;=UqR+OgOIN3_e{wRh=6Cf|p@D;nOD#$ucWe&$Df8_r)C`JsHUT2@& zth0xc_ST~M>#Pz6SNA;d0ShsW$4Cyp3L)_q zHJzMq?WNrrGJKWZe_md8QfilW_=wwcg-(jzTMTQ0{b5T6kVNU#L`P9xIA8?GCMDRj zR6$}we5`l3Aie|hEMT(6{yUfM`(Jko74}_kjTQX?CJyoC(K-O12r)uM7&@wkPv`w- z&PmbxwXD6k{mc-zFvf@~mlKgRvJ5FMOi%^1OuUthT8R?He^0En=SB%&y)>KllW))A z=TzVyqX6;{1)$J4g=?I#g+Jq{vT;wTRL}(NHA3@0_mpa@JbG9x)2rO^D9(1-Z=uMi z`LD&?$IA8!%w)F->COI>lmSooA_jB7!8n!Z-San6uh&&ea(ucmBd_DZ*a3*KJv}l4 z4!=1Ia`9eVf1pQLP6o)Ss{4UN?4ZiDKnY%l$2vEceg4?-O8IWlVlZ}E%%ga5`auk> zznC)NbZg;R%-fIz0OgJ96HeZ2^v*n*+_m*~>15s@U<=$%Lnt#K>Dd|J=hKxL! zPiI6HQzYURR{iNP)I z^XZMlz`S@wvzGum2{vWzAmf6ibs40Csd&yRGxKG)VRPrvHPJK?x;DqlKKt!B4)HrJ zeJ{O7&5jFefU}}**uHs8_{5dqm;4X}<7M{aR#Y|jc(`eEP;-i*3Z*8N^@8S&$siNd zM~7j8fAF2viXeQT|6aJ5VP-n|W<|xbIcl>~ZxnA_7Re7)*AlAMc#XSsH}q5Wxb*j;@@R(q4HkjIs=m;9_JBUPs4 zQNnfX+a$Gb^@sd@Z!vh0>AMVY4zeH=O_~P+e@%By8J)g+DI^#{*;rbfef@Uy-SBvK z2$T=d-77Y0D(p9H6O3@cgb0DVS&9>28vqcxcnm}RJ=AkGpkyONf5Y7@ojBSK--EZf zC&zF^@rzh82Q$SwQBox?Fy6=2O-)YHhTaH`XZGpF-c}=<7ZBC2ipna-eRQ0@p#InX zfBDYm4wz<*sGOJ?j^dGCSuRSE<Ee+b` zRke2^%(y4N@kN2C?wO@Em$fJ)B!w09d=SOS=t?$yj`O@x6M(pY#eOu(I0G@*4jiJy zpGeh`%CF29B9MPf)R$(Q5<%ha)s#qhf1V6w-k>^i4-VE=lpT&A2S@)Ba(}h}P^iS){gRX2+a2uh8#y@Gi1{SoxQBDZ#uIHAGPqL=|5I96K07(lTC?#1e}plP zLozJVXQ#UO=kWp5D(vNsp3EYJ@z));e)ARis^1+2vA0q-+00IB=Ke!@{vcGsgf?17 zT3a>M-HqAI`laM<8O$sU49tx3Gg8wuqtesk^peIc-D5tllzUuY^3|A@hYtMHoz%aJ zMiFwU$QdQrITfp!*n@vk+I;nDe~TP>YgY+(&fU8&OvKkZ(8rB!yeG_MEEohmsjg33 zm8#?0KAVuA#7l+IkayKJ)SMu-ipk7vrU@KZNn<= zU!f!IpP*p3OHWFTe=k!_RPUK- zW+$D~qVvvIuc#FbcIeL7E576UWz3f~RprxL1p}0Bp+NfBiZgp-ot^YBB6K*oK!RU_ zq$?)ZjiAae#&4<`lc{LyqxR~>UcS9CJ}<=Wy1~En5>gFP#zZi(y~@ggQDE`g-0u`I ztHAUt**l>zh9|3)#}%Jke@Qu}JU^U%r9}6Pw4INBYV(RihNQCRa3?Ws0NU@Dh%C z(Nl*vy}mJloz*+u!RTP(gW8zwDxi#dszT2$#nxwENcc2<`v>m8xx3;B64fN?fy-eZh^;VG|b(Vra zLnWsKhwi-GuQQ}(_B7#U3NLN@=tb_>mPbD&>;V5JT?BCH z#B}DG)W`Tif9(*4S+M};!rW=Mg`{4g>RfGc)E5&7vj%|hi)PD*`#w&L0N}ugxDA}3 zKzbi7SKj$gw?awB0U5=M3x4#9bz|V9sR+`P-tQjysDzP7K? zMMeQ5N96E2#oO^aj8D-KlBrLwqpNC88JWXH?89T%Br1UflteORCW`J`RIR!vlfHJn z!2DvxW}DA;^4+FfKflz_P(gQ56A26Zp9T(8Le{+?#=+WR!2GOP+|#W7@!oAuk=_7u zNxeS>f588(8w{)rGvgGallmOHytaMu-qCZnhHRz{GA*n7>o+gBfWuG(K;Dmk7iVUu zWnpNDU}t2eSQ@7iH{IdbHu$}lEiGVv5ghnvsx?PaY~5-LDW4vnomHKl5TBA!sTz|! zwZlrQ#hww{PvbiKQi2-xn5s!mrx8(6$3t9Ce}Y=!5WU4dREV~G_>qC_eWog?bt_kd zE|)_!?)VTkK8IDtJnF( ze=|2;--hxwWhB2y!mxt?=$Y{6%l|a(zHy)lPow^OU zT!ol)>kxti5_*u@s(}6{bOi%MLFJU_e~&9$DA@^&CuSL(>zKV8X0;rEA}{El|J%9y zkLJtD(CWFdJ{CIN4MD@OUPXd13tA8Y|nthiQO`Qr~wOKFQ8YTF^sjE zc)$dV|9LAV!9TD60vu-kO|P3>5|Rq1ta8;@>D!M`jJ01tMlJmJk02eKoo<}}e^Y;! zCfBT(e&Ml?{(PgUaW-fwMW#0#U?d4<@Be)++;Uy$T--gfO9dsQP8GIcj^0ZQ^MVi( zM_*c7Q%MCxJVsy4%}YyRZhEI2ldN|3rD;3745Dd|jJuHfCjksw`11sA86f|>vJt2V z`2Xg3c1LaZM|*~MnE1>1l`#iye?xoM%2huAFqiP7rBMG?^*<$#TGHTpx5tr+p4v2MbVu7q2q{buWknRMyp6yG zLAHIew6mSY=+R>>2UG2i?kZ8qk?=|~>K5|$CO$e|COR5?;wPFxtztw~e;2GLKAn`) z9;G8Us@)OKK*Q?1$(PVkY;GBEqqk|se|87Vv}5<83eV`nR7cKJ^^**E!ucIs?oGNw z9jiiXhMB}&R9NvhMjs9Te4bmwx}qOfrfdwAsAuHEKxq5JyI83xW zZVdn+Q50_DF^le3Xe11>f2m_pu0Dz#Z>2zN-Gl8ytp1l}`A5c7xdis6i~KC=0|tXC zD?Dn)MHfscFg`3mV_ry5l0`i^(TsWfwfj3Rnr<_ZI;fA@U!{17qLc)yR) zTsZWb^GVef)m_iX008r`VND9#Kyq=cLxWx+qZ^SL3L2A z!d}65Z!|_!Df#A!0H!_&gW3!HH#IwRK=}#}v6jbaNoL1>Q6|L5#z5Xh(#IXIe;YD& zU{&|%{e!i*e{{6NqaWvEN&ze+E^n?tGDs$n{LTP|SK~k!UDwXL<#&EDVmBi|-A>-& z|9+jhO*MHLKP0Q(Y=7Axt0X+V=s(@R(+h=^{dxbhz!Q^pEcy{Wg!T&myZSr2m+mc2 zio`ol3oN1(78R@bE@++e*XkZk@(pf!8YatlJoHZ;e~YJs{r|hr*0F?6^CAA#;t_iB z$@zaOy7&AzoC(oo7s%|_2oO-_PWNP7~ldYCw$W&>U)+c@G;#;Lq-jl&11&ofo#K>okI zGDa`ke{|-{@osLIMiCT6^3;H)dEW^`aN%&j_~?x6fP~ES40XSd*-Zv|8P;^4VO-mZ z&mu6-`*0~V9F4e~W_pB10<3%^|0&YGbgajC( zL_4fVli7$nEU1jDT-QJFFet}k0=bopW*8aW8nQc$>{~Q#Mx+AxM@(ekS}hUEH)4vJ ze=|TDHrx@2&6i?Gdmwu0hDd!~E_)s0O6W@rjKG%%+X;?cWzsnnjyI1iW`a)xAV&lz z-NojejF`V@(Nlkgr38@BFGXcatWK$1X*C7!L>J$UmN9hzCC|uPnfNk%YwO5!hJBwS z09qA9q3L@El%ur&*#ZA;$1t57@x9vQf1e+Win*G_BqHaJPU+x(Cu_UarsDB;VVY~& z&Ws6wx*Y;In1<2{!=hjaf3&C$$q*fhL^CvSqNebKzbb^hYxn*Jl@mq4T!ZFf$!g3! zh;u1K*c9ngIF-CF(O=2Ib=AFHZtHa;W((xiT2EfRs4jM;r{bJcf7(NS z2P&MDYVJaC%W#gI{1Lza6EOWq8Rj~veJwE{R6Z9nYw^2hn4JPzeWNpA!iY&1yv6bQg%}D|+`2W)k~e({F}ne=>|jc)0yxnN|Sow6=n=@3&B%89Joy00Y24fJ#k# zQU3X^(aWI^27s6bcIb+ScFUO5Ie?5+fkLhbhf%fREJ(J?n>))PDo(|6cT{|J9U21nfHi$yH#o1f1CZy$K^Vh zf8+ZD^CzpxbVfqqjp1_Rhn~&aR!6YA*8^*!X{C=28tIaH}Xh))Z>vy*`mDXG3fvIn5gC2;l zHJc*mR$141&!yY^WU|U8bXB8f(TasTRNUo`jqPch@swZKZBa4%e^_Zffy?EgjMCXW z>4@Y1V)M9p4)*lC8*o0Bhd(~OF&TV`LVXK2Ag)LkE-0bs@|&4 zOBaF9mgwzcwbVa@e|vSMtNZn=@8j$p`Sr}f-}!#9|9=1KA$m1dwAM8ws~7!V>uz{u zwdiu(oeMi)vml~aQE|CAgFddwv(c-yISEeQ5KCTnX6n2=f2-R}`qAA+ZFh>>8HHz_ zU2B-6*+o3dG^ovp(m7#JUuHgA@8c(PUS?n}Uvr*kkEB!4 zF&LuU?l3Mfzr}_y!w?RhS&xvRizW9*P!Yy7Kwqw-`5}*LqV0H`bV=c_wD4qFUQ!Z& zYnN{axdhGnfjIR}_x*rP7^zGNi^%eY=j^ZQX*F4|y|yX1A)iaF>@6N!^nxP%>4!p-TcHV+Ve^jFZA($+&QVpexTNhmsc>3A7usWB?8^+ME-)!0>XW;zL@g*&#wOa43 zF1VwGe0>{!B>iNa&$0VapTO7mB>P*m3^H7WE;w%M*m1^5a>1g+c=wmkY`zWZq^#$K z6%EI>ts^N4wK-f%( zz`({AH3fTISvlqzG=iIlTBaS=ygaW}weVik0AbcQPoI zb&i{qe+$i@hC8A2BgrfMXKYXMO;evb&Du1Ry-1x$o<_$5J80ipIKfp3aDE>4=V<$YN|A_1)9`SW6j;h14yOnO>|Cv5A+)GbxA;oGVN;< zMY0osb-~YwNpYtLS6p<^>-y?yHjObmDm-!Yf5fSik{yBK=L`eX{qE>a6E5uZkhrzM z#*yxR07Tp(uC`GtJ(1j(yz;dBhwYDUod&gCW=xyxr$>z^w5wM*Vg|{bfTKb17L_)l z3o&0j6?ViQ%?lEVxsEp8YbXWLTXbS2M|IY=xJeL!Btkn9ZiToU{Q|soc~|+>*brui ze~~7W1To!oK|o(4KS4$a+z*G#%fm~uF*@gc!jyNhG6r5&Urz7{E)Kzi8>Gr1rp8uM z0uEM3VRRZVcJ!sW?i7L>I$)!KXfEktexBhHI2nr1P;m*f5rash(hOVO91K>y{B6^I zJ);&DQHB@j&|0(UNjVsU(~0yoyFYuue*pm>f%7%>>F3n%nz#6uwd9KcH2=Bs8K-c6i>^j-DZ*Q1j}dgw z%Z!OjJr9i>-PBLo1LUt!H+NraNGNd==;TV;crd@V2E^n_oMgL*1< zhjaUml#as5$4$02X|Rks9~x5W7+G$wf%}N@20tE_Dav0(=)W`Q``h-tNT(t3o)aQ- zOVjF+XV!vD*XrKo5QM_Wuxg1m;?JC5MWJnp=W1|uD+;;t;udt|5HttRe{M*$L-x*_ zz~dyA*->f(cJFzb(JdVBA4CdMFAO|%t# zj#6RY-j?*Fj)+PAcuQft*d6u{r^$qI6|ZxKy|FK(i}^*wB=EGre=qJ_Tn{$Zk%fKd zZI5mUEa`oWc_Y4%O8OnJYK7wDVshK5MSj|#7UZ+0Ce4XVzz@q;qI)Vyzj;aoR(jBA z9dMpD$Y8a&>mDi4-y51-`E;RFl;^Q{q@}aoy9)v?RVc1FRX>CqTL{_O=GTw#;>OqN zYuE$mSeRdcwZK6EVsi`oKk}0L8KO}_4EB^L20iFo|6Jj_~ zlJ3V~Z+=rLIqZc(hey^W15G8RBYTPP(TKZxp+Ypp2MR4Ke0m4Gm;`-OC*;L7a3t#lN95aAr}$QU*OS~bTn3C%b% z@2Adm<(_nKaJn|QUmxH6k2I?l17aeQ1%q`prO)jie~(t5=F#C@Wj>F>PqOJ1M+8~N zCXV=-$e(~&ueLL^j+vYZ>6=aZSVVE*A7K`s#P@K#zxubi-txU3#rScgi#+eO)97L| zG@rP6@-?B|ADiuc=$nRKNBVMvwD+<{5w^dsc{$ zjtQbye-2qh|FD1_5dQL?2bVu)KmT1Ha!Dn%Hki}gJ_I+8NxPO(jz4{P_4B z9G!e<#rNgL#ZKPc!I(Ye!^dpPuay=aUA>jv$%dYc@5ANo9T=Qk{JQ?uou)f|X!`v_ zT70u=aq{uyf>(!|tNZOCOPZCR7_S%6C?#B~e+cvaag7wOgeOVKzG5YG3yAM4PXQ!5 zA{Cl4nUFZ)SowklQfT~keiSgDe&JPRK(4`t@om=C%F7}_vK<_Zdnyhj#YR9kMXCaU zHyO|l%585Ef>{`d9NHhzlojF|P;!^wgpfqwYpI#_^dk1qSdkYvEHNU2 ze=&uND~>Zeu}?|~oM~f*f0DUgM|I^4Fy15bpLTkVlI1Yh$4j{11&J<@^s82%-b<~Q zUifW!qE9f(^^3QQV27i|bIRR{9` zNkF#0TCAOYB05@Gc%E6C=gIrlhok(FINY6^7JvN-Q0Z#wrmOHQ*OL4F{j+s>B^Qry z>W5-?+?3zd!z7O!kN#kZi;GEHi~jV`)K_;^VJ46I^N6G(qrdL4uSPm=7@5peeX!v_ zbHXEVca1ySq_B;2&k1v!Un6uYxr*=jC<@1!Bei)|w32Naz^Oiy#Py7<%-4S*~p z*v&m5#0$m6Z@DTNl#o!67U~}p^ACbqv-n_ozJp0ID}A~upr)H1PmeepAg@nQRqE>j zP9%ha*KfnQq+&69ZFA%|A|{Rc1hWcB8X47d(@+NFvZ3J8`r-RVq3bBWtcu`L~`V%I-wWWFlorX+v3-z~%irpuu_ zke*%O#}$>9gpdY2i2C@ap986@7k?YOMa-%lKCcvIf(vpBo6Y!~){om18`if;C3R&g zjIqj#=u7W--9c+D*qwO<^ff7?pamPNl6%6xOx?*Z!?)LzF@vWWVh60s zbc%FfZZ%e7BCD3gC{taIPt%B2{lTbc&cF1C|MX9SzcXr-3=bGy{>6vH7`nbTpmwd# zbu>D+OL)%l&z3o0fQIH-^?!_eeO?oe$4I`SB^$YEz#+t|C9aKjJ+;D++*rZm%agRB zU~+RP3ZsS50=AsRKe$_l9N2!Oa+mTgCfD&M=jx-nB-&0Jbc|ICyLCf)H&P=lp?NXC zO#hIU&It$ueg(;=rM1M6ZKwDr( z;VI^^U{op@w7iK>*a`^MYy*lMmV2O3l-9W7ozJ>~ome%4g86ZHSQLo~UdOa}m%6$> zp2Pd2;0!=RI5@ng8kM56zT^4`H!GiRsui$c86Lt1#h<|7;q>3Xk%7Y|_0cBj6 zLT#ipp12eHtB>3h(t>vQlIIPc!<7q4cVopb&$kei!4SrqI#H#OcAbMGijbZE0AF@6LknrwTcTI}yRcuNO>dsd;l}+Nc!EN8tK>AXd}Hpk zSW+WT*{udOflexX0l?pplC^2uMzEdBN8n59=Lp){p^t>l6NlOs!LQ&!|N!*_;3& zru}KRK_MGWsn@=@)5g#lY?zIwb^mvVwgic7B*rTEVLT6-ENpGc@?N6KaM312i{T|| z5Ux~vf&jst#i~Pl>PzY=-UPi(tIbcsiN%SDpRi$Mi2_Du zAV=Br0)8}uD0+AkN)cM}D+Wc+X(F3Xk2Q_Ys;6Cl3G`1SiN@rqpsl-TIfqhZ^#+bk zdVl8JTLRA^SO`uArc+fX@zlo$_Kuo~Gl@5PIO#MVuU@o^f!){KsNNMMoEU@gZtEF! z(~rCr=P>35-PO@%4gZQ}y9R#Z*ao8WZLpX2T!EJvaca0?Gp~*NR5U^&(HiW_)llry zR27xGCGQ0}fXv-nr+o%l$UN5$<+SMiqJL;8Rs)y+A6&dsurNBXg}H58|F&)0wr$(C zZQHhO+qP|E&Yc?Enbi+nS;=$y>q?~+XcNtu%{RyLeez4)L|7_KVhm}pa-EW2+8fuf zgrlxKxV(C*$%Vn%TU8ES@6@Mb<1A#NZH0-IB+X0Eg100;{=8= z<}{A|`F#UpFe4x^tH)Vd%u!`k(6Dpyc~t)7CbwOEsXd|6y79Kkq~_K$vq7u~PorPC zjim-F{V3lJK^%H}RUVNE*B2tBd4CH*3Yo+DQ}I9PZ0Z({Z#e0NhQ(7474KK1CDCh`>;-&;|d>i$Fzq0$$A_IF`f!&N`(6)HY?I&clkLLh?0PWhj}D4^u3Yg3yAI z46-j*x03Rq-4bVF-{MOf_O6&oq?%9GjMWIun~>i568MUsWSd-bM5%Krv^BoZi1HG(wdpG7Lu z?d)*3K$y;+t*EqtE{wn(9O+1!$1WF!IXXMSM)0n{9rmQlV$l4E04*0u&*r1zV=M+s z6T5(A>zD--oO}{~r@RfbJ)n1kwvvcAVV6^VnXFd{J>7swHyi>L&VP_@y)Z*m;TO-u zM#lS**&(Dcd4f;{eJbNqb_Grc<)w&*xV`O$t1DLLWFxZa9bQvlLLIaCZgEV5XX`(0 zz}{TZLgtMD4N1|x^oaJtkw#+KY2rJ9VU%G+UC38u8Bjqd>NNW&Ig2y|(azH8c_zekS zSRK`1W^+B!Q9Re0syZh?@|AmnVx&BXDw!EMZLL5SzGsy6Nxo~vS^j^Q)ajxx-jpBL zh>J6bR4QmVHrj(tsG#z9CTre@g;XX%+0K+g#?bG`8H5u1yeL9?$ETx?8z zfxUNeUja(Q^?&>NVV-{7GKxb&N91!mP=a~yGELI?V-+TlY~e7+2V5-+TO>$bA9U3f z(E5Ee${l=Q&h7cj|1bn9H^|NH8@}x3THGs6A*-gafI=en{umpe4xCMZ@e|o0V<$qN z1FY>|B@Pd-f~CvEyq*#UA|l+NNU zvyThoSW&bC&VO;GE79s6p0Fu#hJiR%6CvIc;r?MXr+AmHLK|pHn!KC!J@a-G^3{7o zXHO2a#D9w;LOjR^(OyN|mLQij!l%28Kc2lYahytNW#aW2;>ZL9=I+rJ3c}YGw5aSP|;I6S(=YVV}Axx32nspPMlAKYGtdeGWC!V|5v7Q zsNmNjvrHHkYBzmVn5p}bZ|QD?G(yk-SO+n<%}|{t&-NEgCo=xX(TXzzRCNhS8?hbB z2lGBwkCbEtqd%)+)`d&a;vjc$%P=*r9Vw7?Vsabn!F$3;3vuH`E=*9dr$m@fu_im6 zSt)8Tq&`rp>SmMOe}g_u4wu2`P32g*JAYhFe(9IJ%XXtC+b-@Dk8lGCa8x2oZuBV# zc3fzgsi{ukOyE)6Q#V;-hR1_w-na-BjgvIenmQVgXEP4Se-2WCbAYlYQ_c;Ud$@Kr zpRPv+q-ykYt=fa_EGR6gjUpJ*8W>2>UVQ8gBvY&KBKNCaYfcCgF%AkGksnQ<9DfZ2 zDPyB3-1F_R@ymXmpNY^NC0&WrZ8gV0`$XK#D(Yd`-x)U__fbZwV}0KS@vHy>Y0Zt@ z&e~@x&aad@Y$Hua|E*O4=6in`3K4~rW4<*ea>YW5PKLNR=hLTB%@$+$WhS7^Rc%$$ zA7y3XbXa)7(mnuy#A2T1p6+^sZ+|3Yc1%O{sh!D`ky{T*O}zO~hllHWR*p#n!YCYt zhsLEbkK)#D(n5Qi%HvI-fFClJ1%w3EX%g$Ek5mNGwTJO^xKt~5;JwETz_AHw{hf+X z!aaNTs|HS#tiw^RX%a0S^idB-m`3|Iq0C zY(pv=Q%H}-vnB1A3`0KJ5ZQA(@&{2CZ`&ShrAZkGJjWN&g8tb>Xyj~b!Cg5`yJLQI zf{yK@Ob0e$qL6nM+!y=G5r2Hu#^hzXKaC;dHxK{)mggg|iqlYF`_)Jr%A)h88}Y$g zBC@JTqRubh29SPXeVoW$2cPIF+{|nOk{^)RE&4{V2_&V~p?aeR;!U}@X^u&RWIP9+ zB92o6D;|kSIG2^=QYaHUY-|ISd10UEM)NO@}nvRM>N{WEAayNH`od>&iwyKnjy>O3J=8wyda3 zVfxhpDG=wD7~n*b(o5TPl%Ay-t|-MM;EJh+73xI2lOMQip?|tjBc6SfM5!5}R_>@U zfhwJ(A&~m=(1L=c245*|l;=~`=Xy~o`i}^Hk?ZCegOQ(s;@oInierIiZf@AA&y^qQ zsbcim?w`wJ=b)I2_Q$)Y9#(({mT%#N;uz4tXK1fGrU_|P} zQ9{jfU0!my$P{b;Bg9I9mZuG-0KvENssKprtt)={go0I34Q7=AH&X-rAk__)rnNpI`_lV+$a6ag z6j7BMQ-9GB;os)=!kqg22;84dI9Si|B_{MOFp8JWe`gA$<4U#Mc%-7&k7DnRCfaMH$sEPvZPJzH{{|HCz^11kvRPBNI4lMivt^=i-8Y-hYUbv=DqRHWe2(wmGPWGJ|^w*eGiwS3bvr zjjIEuO1@$CqZ?w%B8)j22@da{SuV(J|IA>MPj=(To3ol_kES$|Mz2vUYB2vyM2Qgf zoj>5`*v4wfwc0gQ7B%xqH}$FpMAE7AjSgK)|DNmS$jZMy%|A}~ka9R)R-#U)OMkOI zA^k8YS20)^-F_Y9_Si9CIHmgXj%S+$9UrqsKHHlA2GHGcE0owBJB{%bmW2;1;{@WS zTIHcES)nA-u|K~sk32xmYH~T?^BdNKJRrCBKl8r5rP`KbuvAp8bK>~c>%mc_Q-4Re z6!vG%l>9_Qrq+C9RuPMd3g=Gzqkn6Hu8rU0N8~G$Yl#$73%;v>$)Y_aW8xo#3|H`5 zH1suDh@-yf1BACYrnVV?a?jpsi*WcN6)j~9iODWa03gi->27NVanH`t+;YV3K=e6N z!!M!CG8S&gzTQMF(Z;T+*6BKol5}*%LrDqF0FvT3WawYWBzh5wZG$na0 zMdi})^7K_RB8Pp$Mg@ngGbUkeq?P=S0-Gxu>bEHgL@cIr;&ruQO<#boTFk2_Qk>S7 zo}%E(%+k`tR2YU%!NGqpqkmCLW>s$L_ctk3DmLXv`R+ojnk2n+N!i$wods6~*FttL z3sXq8=9JC>j0aZsO@3Qm>dHbU(n>U^95?1VFsC~roNPNetUKM8X`|!G~ z*~X?$Y}>dl)3jf$s1L5p9Sw%R;PFIkQ8yNwF>w?Ib!%K1sZ!==Tk73F>wLe|5xv)g z4=n0ebIV3m{9P3&x_?OJdG$xp3r9-6jJiU^CL_=aM$2MK#-l zkK%azdnB0$*neuEHR6M4tw2vfDL{~9e^qxP*eb0*Q8YjwgYBXyPeX(ZVG;?y+v#0% ze5Y3!sbpHKi4QH((9Ou|c5^^|IonJ@2S*nBcT_k5$)`?K*`#;lNcQaK9Y=XVJyvRI zHmu98(cImgJ#i?nyycn%fE}ZroFZ$f9serN0>)PHIe)*#g?VAd-@HhQN23`hmrca2 zlWbZna>h4Vay1n!(kPbcWF+tim4K+=RHi*z(deLBR7xz^xvHTUM9T*uYs>Crcf0@G zUw@B(ES$gYunU8F>E#O!iG;oTIqFL!MF_f&9&oC_6Pbs8yNDieDP+`RB<3JNucr$6 zTjg67(|^G@f|Jz1dg)$rC^G^?i(JY-2Na7>$UBB@i=JfoIbOGuh*W8Q;?eATUc#5D zhN6?|`64m9d_f2EJ>wJ6eHA4*5hTu2W=B>eD+q^(c_XdX#wYO^>xH+3NMNz|O-8%u z(^zOEOR?)yl+TMX6w)CKi}koXKJLpMyzK|glwof8 zx?D{7;I&TH0%Xn_#o}hYC!-%UCD^6u4$g^agZnP8eh@t*z@BV_8aa^=wgN#Ub_&(g z6o2{0nJ8ZDcMl|_Z;d17Y3A&ud>uz4x{2mDqcM~UA`3`jZmPwgI%EFsx0}=Z-Iq?U zy+L@z^CV4p`?^#V&#>{3?)*vPKY7F>mrokk6C#4$n^}rpXd+_B(`!{Bx%tHigX6pWD@QDek3R~2 zROTIVZW{=+5^^?HScM1WBWFfVkk8ZTK){fXRN=|`4sm;^ba+OATFxw-LA80$#D78| zUXXp6`|2l9sn$&JBw~aji&8Njp4YPBvG|od&654HE=V%D=|la(p^*;#LqFIkuTLbz zyB1QWD;=i)M)XzR$4`IVIA_`*4{tQ0>^Qj46l zcjW^Ukd^k$_rPPU91Ze#`ZyNzbbkoYY$=hEY;uLfhe$-Fr3ABkq&@~jF49y|s^__iv1QI6u z5H(;*r@Eih)+S$ssjaIyyeziBpCmzkqKJXZK}?{FRQ$}@Bf+6AGFK)3l^CL57BxuN= ze@Vq~mN`U9mh*q6mWp7)z9_E>7yE)0#zfWS#(E1?hTF=F99v7pC2>k7Q^<+`!iy)P z=D;@TsubLq#6ii-rW2N8et#+^KO~I>(nU;bkMS0Dh41{d;fBpAAR$3y%*f%T{!>ay zfVxw`>p85P=eI4B8AEWJBoZp6X)8nQQ>N8cKkynVzr1M(o%SS7OhOMHb_&91aQJKj zf{QZ>AVlLVp1q(|F}*E>XaI4MgHgM98C9w%L<6rtTxA$IX&~5lJ%8Nk0Yj=ZE0bhb z+qpAMuUJQkt*Wh`PR;UK+gq)N3N=!J$ju@arfol`4 zM$v$A`8iY>$9qsd?XYa0jEV7;RF-zQ3f^K1(UhmN{kR@^!pr5;t43`(K4H9W_I_wP zAtwi8x}@PWgqejdB0lJ(Zou0t0l-&`X7Cam zE}|llZEP)oh5JGXeUBDVEM30F_W>_=*qH&>!AD4PotE8w49cCX)V9FyzlzLt4nJew z#`F@4%mPz=41btjnqCno{I4_i9mp0Y@=gO8GJ4EQEu}G^wuoB=2!?Sa+?%i3+bC1B zzJF=%f@kM1(a>K3?Mrt_$tp#-WBLL^=%^*&@bP*4U2AH?^XP!7s-J zk9w09saCG-+SRB+{E!a@Pa1OX6_SvuW^ocR;r^M|AsuO1EHNnY?=e)?lb9)-4^k}r z@>ws6!hbmH*$+fpT(d zz^^H(ze(`3=kGp6f?i%Rd^3!qkma0!48K=q@j64WB|^3_|Qka(&Cey?>Hf}vpUQ(<8q%@MK>yZQqTxPA)lFIpITZ9-opIO$#oFC^C zj=#J{V^ivL^+o9|F{=WCW0YwJF`zJVTL7tN&;ZiQzkhh=_uzzDy zMEs?#iXi!7lu`=mh`tdxh*7fE9&aLPPlx+tSke zg@H<)IPDYXBOGDU3sD?d%&jt+Q+n(M(uMV>t<1_PKf zi#Dm+BB>D0|LI~%feiGM*uhtCbgql`o5p_uSh}y%eBdp}frxdzIRLg%+S9C6Drx{4 zw|jq}sUGA{B=Jr+NYt-moWeLvF|GQ(w?oxPo}4l%z$}$R4rcLw%726oPeo);RXFJn zXyzfuusamcJsZ#(BI!+D3K#?h0OG$OZqpP7_+J7CKmZUku`#unXrRNTGx zIk&sRO#ECY_A$rlUw^e{$C=IMU~2AU3(=pL?U>!w)lTQ-TPfji6 zt8!Z)>geG&@dN9m$=|=twc{%*{tspTRm4K z$KIw08eO%rEg^O)b&y zCJ%0zws_U$9C_N(`UcB(94a`YQ~e5|@m*-y|6MtZw0{MoitB$JAxaeM+E5ybnd0^S z{qE1@23ZH+O_faFcd1WWv3JS?lS)f25itYlC4#XlIA^&dPp~pQ0XFg&c(Pr% z3(%*tch6cC4boIjguLgzM1eRp&*}Za|GoMeLw}FhpjggmUOYH;k~fI=)^D{jOWSY; z+Z%&J)YMrxF7Pz8Qx+#+Hin%7%J_sUB~r@?o@jxvb}lghtIZ7lOWloy2+OB#>R>?3 zMXu6`d(=ECfGorBq7MOUXGW{}K@%U(&y7HaJMunVxl8ABXsUN9B*pT6@U-8CNRoXC zLVpnPOVX=(pA_vbbYfQC?z0yI=-#rP9k^zt1482uvKJ4RLs3l&wWAI4e%mX$0@}+{ zN?EQ~=T5Q8Ru`3`j#^cs_&dU9#%)N_y}qj5SyYQhWA8sE4)GU1{=Sd`v> zy3#2-L1@hV9L0nuSfT_qa10z$i^7F z1DIL;@J}Q<-^mbLWH)86<_6TMJ60bcN^{;FOk&2V@ObsAM?fbbuKxp_xx-(+${1N= z1Bo3rZ_SWurCv3%=ljy&8ZuEi_}{%4CZHSc567FPh0w`TSFIb$m|&Y~m3sgoHGh2Z zYr+{sKG7kbcBG!k=YQ+%i!1Maey4(X@%)kv4Faj4^DH60TnW=B%vP>D z)j#v77k2brf;dDUhXE^|V1>ws%&Aq*RBRZfaruC2SS5@Zkzv&@c@_-n1WJ?zdL9vY zM&`k$0|>5CMxfHlV0Ofpmc)GxWWF8Q`Q*qYFojFcBrE2sANo-rK;0RJtbZx+b_(r7 z#&tfG)7$zb2ZKvphewIRMFfF4$FwD5=IS>`MG13#4D$F<{-sGinQfd`y|}CM94^{r ziO6wZZ8@i!f0>wfj8GcE&z|WU@{~1G?*i&O(iU)(4%|e^7j%xRD5=0)SFYJ9slKX_ z$DsrY=%@XcKR zqU>#)5Vl*Nlqf={nQ@*~(a|JnTD*9&^&ftrhNqDkIsh$4@CwXVl(Ek!C#aT|WJT4L)w%<^Gu4PgXWd2LM8N#Olu76bDRicy%#QEtno~wWNt{YrI>Zzv^pPoMc#=~}^Ut1bCEk?(aGQuvl<+lbmjRF>gC}R$` zy62iZ_Ce%X%eV^w!BNiaI5gJ=n)0+E&`1Iv`xInqchxcKF@FtgIdX9tN2ZD;VTYUf z?~aHNY$!*SJYRF1A$OTdRcSz-Tj5O!G>bx9uU&-lJRmuAEs>&j)F*;OeL+2Qamu9n zi+pS=U!aZ72ErRDPx4QT=G0JLJ9l-{!o{GqL<5&4^}Dz;a8&lq-QPgc1%qWeJ2;JK zaOlerE*eB-&wt#~Ludmz;XaZ*TzkaY^ANqf=K4p=`c%i8idA2sbN0nP;}1w)3LFC1 z1Ke*O8~`8>5dc753J?et`2WR%|Gfte0P}wn0)KJ9|D^v15+ME`NRXET1^Yk$%KsMv z|7BE&|5-6DE;9WWx8p zZZ_``xT}Z6O2l%8&-C~}A&sy@j}R!f)3oO1@_z&)!Kajefrj`n*aA=XJ_jl4+%8R| z*y&LQjiE6b|Bz;d>|*|n5K5pup@}^@n^g3k!w@Am!~5;fl(se$OHi<^2I=ho^rd1a z*I+0AwYvi(q{|1?x}KF20W%gH_Lly`Ag&2GOFB(Ca#BHooHzh zFH#-S2tOXlgD|Jg-*affq4WS-$=1}Xt$)Tvl&6ZO+DQ$1J>qyl?h~1&Os-ICHW%O5LYeK`gFS?2{zGxm?#_j+t zRxGF?8KH&}iS^qB5i8$QG18SPc#qUz>G$G zUKSl=ow6bgU(4i4899{zS$v)^SiGAPZ6m&s`F`B_&FKC%%$fQ;UYzu1ZN#QDwBw51&euSfW7lfs?7_&Ot+Ipq zwIa*I(MPMsW%P6x6xpeBC(u$bLz=f}F}h=Yd){C&<&JJTXQ*q>Gp5=NRe#!Ws?R)( z&?)Ry^6a483kRCeu=x@c3Fbz;L%G$DPJ++ssYW)_@=m6Pr5J*_&=&UPm`ZS{JB2@W zG{Xek!_P-tMI@?+gz%*+l-M3}MNC&8S zDphpB*=;Twn2)VuIEJ4Y49?Nlh(={Axw)5`_x5~Ym*rR>&G#;p>tDGisrRW#QJYFKl3yQcMbB8>Ge<}OMkp;rZW_ zWNGjW@RA@zs7%<>Fw-L5FRHO{*4XMm>UZ%Et6K z8um7jxLQZQsXx-x&u6X&;8j4ua;a2?OKEN#$t~ck_l(z_cz@UYPnC8gf~9wLYSgL; z4ZUS1*{Nt@A)(#;a*~teTJm_(gk6a2TQs8DuS8N!w_?zCM73n;a<^%4YuLxc>Yz<^ zS(4LgTf4idoz%x|ZdG<0qfk1|LCL2=`E;bRwS>Hc6_*bxY&3rL!lZzIS_Qv!8>Ot7 z(W3zw7stCII)4x9r0K($RyR|-eY{5QOxF}RVKfFB3T=_c z<+(5318yLD5-%~5#?NqS5sQEcKJq%6$YIpDJMqMvbXU{sXx&wMC!*#Rd&|9{6HwpaXE$-_(k=>yQi5{X2? zrJ-17@}gHG)IUS)N1}HEHFl}K!wLz#yr4t{^VLfEHYB*|6`DkJ>rq?6R3rvU1V88F z&iQy01o=uwiH!lo7KKhUxQqgV<~689+wQtp^na+9*ZP(1)hp1EOT$HYb`2DUax^bM zmUz2p6lBUou|)MC^5_OMVy8`GNpWLBXOaDdikjyQQbJ`8j@uBYG{XB|0Va^QX8mTB z%hELXStrr-s}lq3YM*e?+5D0L(xJcZJL_Gz9n%-XOL7 z6(_PN{p3i9Zg*@!$HqZQJtiwj3nIc{_72`v!0YDtEcnSDg3F4Tq26+Z+4%1{?W7k( zo6Z6m(Ts5mkc!ado5{8hFL!#}eh-GNs(=2z8q}(t{P^u5Z7auBs~PcTJLlS{LTnF-D%*es={4@V`Tnh49N+8xC}&7#2qrK}VD9&;y| zLg@`BP%O}lbTfTUZa>g0Dr~OqI0K*bY3sc))2Z6w{1=in;5ek8qIc6F>gr= zPaf5T!fYe;-7Ud)R0*5OkWubpfeYtQj;X0o!V>+$0ROmQmr@dwBDJCgQfgI7$G6-L zX!d|BIsk$+2>=Cwl|YGZ(!I%KqOfUMjl;KMC@bYL$;C3Bw6zhK$w9OQa(@zqlmY62 zzneirH_0zO{Bfz*T&({X(SQVZ^!QH?qjl7rkWH=^PrHc8@B=^U{ilbl!UgA(0;vZ_ z!AzzJX;cZcg0*Y#X>N&*P>o(Bo%qHVhy1Q1v4r*ayKIBQM5uIXa`LS z>`+`hQXc~ycdrt0i@{hfM1N`0Xlzlx$VD&XF|Xj(C~N)zYM~vIe{HP-TcFJwo_jHUSUdd3nTyD!8yGTI&APanxvNQ@Qo6_iS3K*L$Vq~nTW zcs56dfKnU+G5l&JTZP`#vPzz+7y$1(zUYkY5tfaM%kv3*h#2Hi_>L<;8C&%sCIK8k z7JzQ-kwmvudEAig?|;V;7-OGcQHfgQDZn@m;mtxpug9q8uN?ySrrP0L^VJ=_`S}h# zKkth}?AZ03eK3R}ASv(BnRt66whG6aCNV{5+!5UZel^nK*9izrj^0qof-OA2P;;@# z4qQnk+G_d_>kj4dq#ZGq!3D>NEC|M3MR@mjh$&-YW#^>Yo`3PBsSpTfX%UM@U7Swd zAF^!*z>pmxIx~g#QILm>ciVXjm;S`_Wngdqtv?8 z?EYNbD0lxEP=D_B`g$PFoAnXLiURPx*Zqq>z%V{WZ`D|ijK?C1lX##Df}qL~(a#!1 zV{}i(={JQ(AT*DU|4LzhmOx1`cbS(IrH^^>W4{WwKTg*zA-k$(b`X*CecK!Qf=H4%)#R+gvq zUyC7}hd%X_nhj|N#q!Z4p!d;|0*3Y;4DR(z<@s^;HVc}k#S9HGrG6W*p*#jI7m0tU z#C=qrLZ8dq8GEv|!JdM1@SMJ#iI=E4X*3VtW1Expb@PPsb)$rm?G0FvM%rImSSs^- zKc$#RoqrU!4B#XVp*mm)hh)ojMK#H+m7jpe>}>>XCNd!UnHLEZ#R0>>1lR;9%|?S8 zxlLzyaBi1GG%6$CugrOmDTmnJl08({&ie)SN`p-DSyS%j_K4T!T%NHMmwLU%8knj* zK}UJjKN);TU4a=h3p#3geJ8fRW~zJYV1zo7?(#f@;M9x86qEgzaM8t9e;#RyZd?b6!iM}U!8_}T^H?`PX zgQ(xvUPDIhY0=>vg0RrQB}=tB6g2`q6ng~|zlSw!B^?|Lbm6UyTr{{8%Be_VFa68u zrOgP}>Ypzpn3*O59N%;*&y7kSR5je?}={@`wjz>8i0aMQIX@79! zRJsV&bnh5bN{W_q-MT0&k|X5FPN>98xGUTcrKPdO`)Qz`8O;b5#73F1MehH zN?*&Kx!=fI#R>3v2aLQaHoD1z^^*O3u|&4ZT0GM;&=0nPt;gaE^{{4(^)L1dqo~F2 zdJrWS%m(X4aI0-)zB^7QtWW8Ki+|*)5;!Zyxkm#@-XT5z>S*;!UNfS0$xp?=2hsk5 zi6&Sab23ygEwhrH5eRQ0f?qn50D}dyhM!dAPKUfm2MH6Aa8UDjOb?RGoCvhn1ukg# z28asgn8>SPaMHV#Yg6t{*pDbj|9!|ssm3a!O4l&p&vSRnH)Lc@U|a6X8Goe5+4D?}2{vvCXv2!e;FjOCd+Us7`bG*hHnB$6C`k^nvJZ zrOK~Mq_UJ;@y>f3zx3yk)Ed#6jngQWGwlp3t+&Cf*|cu#fuW|z*y~W<=g_KIZNIAjllqo>YX|@} z38);jfIk1khG`MIC{*!f`a6%&p3h@Dm@w;YzopS&q}`5V{l~7MGa8@`*gcy{f`)cN z=A;o6n6`F*csnp#Iizqo&^x60n=k|^-`P~RQ_#~?Le?-*P}9;-!hb@+k^vpyZv^R` z(>{m-F8l1ZAK(CiiTv$1rFB5Cy=gHbD36uKMS}-Y8i9Z3ly~ zkQ^vcCS#25o0`QrZn1z`G z8Lg~X=UdCo?Pdt_fs^#a!g$Su?98J0{~6vpc9NKxq?s5=4FW)9LB!mQ>YnY@=k<3q zIuV!UiOW{&x4r$^ZgF;W3RjE%_13G-5On46)IB!ih0Av1zJJaB<8ahC7V{H_jm~YG z{n_3S0xitq!fUGytAd@Id7O}!_tWmM^CZ%xTYY)rxxM_{-f%M!8(P+M1`9P2_zS#l*kRv%I zU!M>DUjwJ5Wq*yLg7G_hd+pkq+(@&&%36J-+MH(7)GUCFeGWF@3^^hhlvrQ-+PDsO ze&`y(!r;(w5+f>uM;|Jjc^;IhP6q-1IX^l)48DxvG59mKJR|3)+~W^)?T?MQ1bM@S zSUUI*G*1@z;$^=lQc6UxgyIqiZGSLq6X&CU?f_gsqrcdYJ=V*=_8`F6klBIVggaFn zSC05gaVP@OD5XAWYo5#)+jL^Q6`F1%GphQL`lG}+jIkv9C+2#t{`&0Nt}NLDk$>ig zY;wzbi|0JDew%;zOW;*%0=<3Q!`Il93g(;m=KW-?*rID`ULe8xd|)fF*2M-pQWysN7Zc1=mqeGchRkd zDJ3O^%rJh`$~Ju56USt}B6&kF1Ot@ugQQ`fo3$b2Pk=RHsG7hd;lxi5_fC@_j%6I0 zgM9o9)H{FmJ1^urNb252>VB8R-3O8HWN}~4OByq^qz5OpYzN0y8r`9tqQ)VddD<+b zdo8EXOP5XVQui5Vjbo+c6Vi6eb=Y5t!0pOYY&*hmYcc95?SG^s{-tYM_a zQv{zKug2NqPz1h-_MF=;(j$07z>$fyi7(~ZW>7*EZr~|aQ;1@1pyIwwq zH>(5#B2wTW!W=;ryctd4=F*Cj{u-~FSzAM!9dqtBvK;1ud2?Ak+fs4B3!xkDxDks? zQ+|KkVIVyE3js0p&YYXEPyjG@t9=Sua>tNLEVQ)*B6wGZ=u(bNZU~jJD6VzUx+84y zt{WGuaHW8xy5&6k8q|uvih@x4d#zef;C~wQ3yy~D{72{On$ULjp=9^t`Vv9#_f>ag z?tPwwH#nR_re<6wHa_8Th{M6Ld9z^2dB*Da$2L_?+! zK*EZuU-I>|=oSY%9Osy0@szV4a+L>(Io3+|g;n6-0_=sSLNgC$<_gT43}6H>|F&=P2`5My2*b7 zYPIu+RNe9m;`jyV=(n$QdEw;qNQ-y zMhUeJi{bZjT=3v?B$x1qlNP_jBme(VJJ-OKw>p*n2kjp4Js+OqOSZ=7AFxUN?#Gmi z?`suf$7)^klO9=`1AE9H`YVw@*f)QYE1M{}^x+8Vh8!q2p;l@$kx<)fqG`?XSWaU? zLjV1M;J`%Bf0uYnJdYeO15D`KFH{m}y!=w7Vb|0mAsR6!KEddA&X(|T;<&5I?cULD zM9xIs-IbW_E!^E#T-^~g2xgKNiyz?6zA8YBu*5mn)FH|1RqjTAxX^RWK`ufQ;9zlxG$aRpBwz+*tLVMh zb+=v0IIXyhTBrppyjIy;bDz%S&L8<&RQmlM}dRTSo%V>N5MaV}~-*1FNX4e#}dvj10X2aY0cjAyR#tSwa`evJ+1uRR zr_NqqZ{1mE?p4RE$Ly>2o5$@J?^!m2+$lgVm1(Le00amSwJhEKF~)q4v6-d!(xxo9 z>s@W4UHlr4dV6Lg<+XpddbwObPx=X}(>f})l9PISYh^bfHT(3xlP7$nQuwa&Syw?I zT0s5KzmdP&{Uv{TfnRiLY3XR`YHDliYU=80Yn*Ky>uc@n>gw$7Z0&7s?rv^t9Pe*$ z?(ecW?!PLK=e|UJh$#yJTvt`s+`lV!0)TF6n1A^K^x|0h`=EaT9s*=L{vZGV(|_2P zf9Np!5JbpK;UO=~TiM|H01Whu{Qc4hq7V=;hM+m7Pe9S$X3Oc(86PD!pxZ$j#>+>I zdeE8stT&v#({_*pbnf*~VZ(VV?Zkvt9|r=nSxb>1zkV{`eGh%gyMIhBQ2PKuvRn|S zpfG@*`*xu_dm?|9(~x>$Egn}wSXs;K?7h(XoR$e#z?DXLQu~kvfRaSz`RmWFBjA5_9tmtlxU(5Tx6;)Bh9Iwn z$oQ5A6&86%hxoIcw5(61v2yI8J15%AZ-4&>00BV$zX%bJq0!uXp3fTUd#QhMV$JQs+G=J%jw++fQbTJ~uSi_u zYE(o96Ps}>o*+_$EKHd_2*n7d%z^&(8fhs`;K5&lNkwy7F^romT9nv2?b5iixcxZ} zp4FcODZQYh@D9a^g?6ou_$+e~t}U!?W>jdSp-B+%&zZ!*1d-6%r(&3lgYcy6jD%_0 z(WZZK-9+ObjIk|JRRYm2On}5u@!FP5Q?XIO4U&MAE3*@&72k3Bnc)*gTwC2_n|A5C zbzliFpP*TT=m^US#0VrrH&WvJ%2f1@iI8`d=VA6*q~OG;zvmohCyurxFKLuAAm-*T zL9$by3CW~yGKNnq5knsK0=N%Yc!oduPlkWQqs%gYOk4eph=o`(=$DL69uov-cqv}* zzRS;Z?UNG3ELI^oyr3%9(;vo<4#kwfxlVxdE)sT=WOODf2tb8_VweEggCb%mX5%PH z$1%<$k{Un+gqRNE;@tg?n}7h*S`-(Go03ryp||klmL8o1Fja5ukwBKremUWI#^Hb8 zhs9X^5h`X4W7;Sujsp%dPl56Q!)lmKfQR})kr(}I8(Ql#su^7bn~%0SmC&JR?gADl zI$r5WRl<+lOg-={#Tn#|{D}*?zHZ)*XB_%^KqCMTnTwFTO2M zB7=T>#kXl&od8#nAwjHrGy;1@V9#kD*9v;h-ye%0MA)=-M=UVVrVi5tq+WkTiD=d_ zM*&Pd3ljH~+@pjRNcf9rAo}ab=g21p8zC4IeL#s&8YC6^Z(m{ z4zlcMq4oe=W;3n31jELtaJmZ(ihSn6z^#v!U^-q{!f^dQNEDIRZxq(w%o`KwPXvmn z+XThyG;mr_QQah&EN;euAr^mQ-8u~mCJ7Jt{g0>z3yGM&>niw*wN}5}Vz|UcRPX)e z!_(;m9Z1kj>(+z^3r>i#(`n%Unz4o*#Y%Z>=lwB|)c%j46R=3@aO%u4?(oRFI>1ii zTr0->O-%#6tvZ_w7nJQ{s(ktUZ#jL1W89gJ5MB&T5E|83gM~wAgdl$gJQFE2;Y%V0 zH|H3&nG$`4S>_K;d)2)Q8oG15OL&mc%@xF+5bb!b0i!FqyCBF}Rz$@Sf^ZHKN>h^v zF#Dmq?yuNu8ut{#n}ERHrHl*b@C69z6JVCe?xSd0KfE9TaCec!;aPx->*+w^M!9+c zFAvjXVM2>@H-!Y5cIAJ^9T~Rbz8fL53|BC=sj5xW(S|K^Wt6GYpH8`sVYjy4ag$2G zLqbG)I=%Oz?!sdpw(Mp~2Jb1}#E$x;NkmEpkHudaO#}iB_B-Ac2698&=|@LF49iRC zbbN;eIXX^w0jN!BHh5LQS;pIo0-6j}V;q&=RuRZ;ATXNf!gzli923N>sD$3Z13LBo z=||X0A<=L*+zF5tVJjEVg`VS>lxf;W^82Naph>J)q*3!85*k`XUjPC)Gfx`}?twCZ znioL+u{KZ&CXH#u9kY7L)LUN#7~HG zu@H3M=VN~yi=y#hf810`KJ$MT-Lc*ODVR~BzwRDWGe!{2irkBl1Ql=*4$fJ}+8Hn@ zhB9v5%zROr!`fOCI|<tYK(#1r6{mKZ*= zas2hp8(vljA*o5``0!*boX>nLN_s=`_V7vwHxm)yH{vkua_~Q>B+M87h zru=`ckl5Yx%rUE*Dl~)B+Zc#eyEo7~8MSp*O(ehvp-cYLqYd27I|16jW%7%ho2}cI7X#Sw_>ZcX$1i3Wk;WKJQw%mO2+JDLz@|KsRn=_>2FE|EckH*al*mJhn}y) zNkEnr#cz%+z^vqO;XRf)G~)s%B>;7?m;HYnl#_}zB#!}Ju*Fu)3+6Mrw*5@Sgre-~tHpZdey@i*d7VK@nRGn(zng8N^8+Dot%4~`07Jp8s0#jI$RNGIs6w)XIsI6Re} zAkMc6q^7uaP_A8IScrj06=WX*rjk9#13 z!9(afzYhWo^$>+t>fDOZTu+RN#GqG=&h+yN846P`{5kSGx}<@$*DFAs{!ml z5R@vL-LYXeXd|esQP?(m!?@FiUE)&Q-plj4=K~B`s3@?d%OI>ufrd3~V`xZ4)O8Z& z%_hJ_fn|Z{!%bwF48ubr_#1y257heWJOSgmO1BZ%Bh_0-TU!+C;pKTFv#gE{7tamu zKN!va>Fj1AC4QD5cxZKitYgo5>+d2}$1)VHyG7&xEqhRrcyY%fTE`h&U<`>5(Q)-^ zsk~$sA=m%g>2yx;4AT>bbZZ3n#5-v@PMa> zq0)h8T7a^0WM>%P^VjMsWi%}+#-<1=H6q@&Si3o!Q~9nb7#+M3_yqD85uHK=<99(G zB+_a|TQ`x1iR^z0Y4|qj7v9UNP&PFwOd}wwDlLp{^c|Y^+-uLe6?}CqhTmBsv;Mqb zc?QkyV%_HslIDc;DS>oPC5SxFmN0=Hcx4At^53c6`nXcEq z+lBsbdM6`=^{*6h3j?1GhG+}lQ7tAiO$x>>6gPEcZ9V3gT-*#yn)PmAq3afLdt&UQ zle@;9k1`exR=8#o&U|#_J$AeYQry2XJ=IAJR#QkAv|-%jC{$H+EEw1IPh`xuXibkJ zWbvw@Zx*@UUx;9}ZMsmUK+g*1rAG$b<$#8A0J8t0m$#{cJ$bTwWJuQO6Tek;4}VyIv7*Ln{nJW!J+ zpmwJ#FgX4Nn;UXs9kGHx0bCVv`L+rbXz=b41*OqI^fi3aEJOkp^Szpb%sTh|+gL!q zt{;CyFh>dOn>3F)+i+qI4JJEr$^9Ev--IM;{}K3|>_BIeacw$r&i%sy7Vdt*30DMB zw-P)Ej&6`MmOtxyr;$4I#-BC&NH0bEvg=4L(Jk{;7XMAUtXu2%Mj2iSwfUMdONXIf zf>ytO76{Sr(3`uM!E{^w&H}`TQU8jGTY7&ceQ&Y;(rs_lZs7fO@?jSfk76+y6Cw{eAk|Jj2fW~XQ+S3 ztjWM4J171C6IfA%bc%x!kBNv$sPperN5MWj7kwR^jSLLzC;r|~QATJ(VpZC}wYv`z z+Sn$f7eXG2z_)9B2T4BbL8H%9)h(C$FhaV}nCHy*LW5gRJ%f-g?U2@Mq1(`2M`Sc2 zh7JS%?;i+LsTkoONW?-Ez(NU%AiaO&G~bM?KD9o?Ux~YI>@7v?r;vHra6mmu3$o~& zywN_0WG&Z#Dmfb`{bcdduwpi3=nx+Q6rw@Y~^k#29y_u-h z)V`8ft#G%{E1J@$)$3d=dieD(6~C*NERz~<20CPe+w`-5$uGqmpPQlA(Vl;w&N|+o zTHu1KC5{gHkwGAZ0Gpq z%-RpYdM0Z}b;@b1s z?}OuPrF|g`jY2+a0sR}39)~fwrb%8y#%%s zIqIzF&^3azKuv+S(6sCE?gpl!e}1*BM@Ub0+9g4JWLNwm_Bj*;Dk6E9SQv*We)HAO z(7qd1wBw^qF1xbiPm$<2q)IDx*1-pA5iS>Bd)R)RH1`hU!f1awODc-O5r15T7J=G| zcCZwT-u=Qb*Z6KnsR4=X#k_O&-YjL{=){)5$KP`1iT*eob6f`BJJhWyQXt0u&LW=H zN}(ivs>}A$WiQ!pA7kl$V{P~OSNQA+KyEwhGiRU7Y!je_f?TNdX0-elE<{?|7Ri72 zY#{D=eMKfZFzJ7v#ytFc!q}N+w-K&Sab^b8kZ8982Ay}U-uF1P$PJl$v`#*&6~xC7 zW1Qii6orZc$8nRAx$F%ynNP`6a|{Gxg&`Ra#{HKFy}F+=OEmUUswATm$}*VuT$sbZ zC|;?M^UL7OM8R=uFkggB(VV!F(I|tZzsd5@*G#QtxfQv7Ztj?rq1(>LlG2;bbM9pqq%>Aoi9CZNYxKQ6l;HG>5_0`PBh(E0syia&InA5EN%O z(a3N(pK29m&%3&q*w#hlkSy8i6TQShnwpN< zR#g6LNNLC%0E%HPj~rH(GJeV^mO`5GbMtwkX;~K;uTS$R;V(#ue2KAU57lc_dh$Lg z(9M5^fBYMCvR3R8TaHT2+X4?`kO_?pdY5JY()Y}BAMEk->qrZ>w<`ez7m*pQsmadF z_;f`SR;M3eXDn!hNUBQJO^F{tF~MDgPXj<2uDrXSsR|Q__qnGmAniQ%(@<`p{GxW?cr@iZ{Xr!z|g+&-Zg)$g4Ep2+v>cwP^5>=|va%VSdag8qrfa+RQwTN6lT#?VxS^j%u#_BdOa<3E6z^0 zUu8q@2>D=dE*A%@@K4dPoH}}Ost@EyekPfkSomDUHFG2## zu95yash9|$4BJrxg2FIv2YNfh2|$VGSpqerZdx`RpHAkSC*u)}rl-(-|4*CoaB{nM zJL^I2S6Tzs{_^Os_8sPCxyFAek&5jj`ErVfC6&DInPzEZc1$)f9043|Ar4^|r%2Gb zZRsa$-SLJ(6L_MuVonV757X~1f0+9%&dR$%SKAiJsZ@*+UmFsd3i2>;Bhyjx92q|t zZrC<-ND{3UIJ$G+``woVJtea9SEFf2GteL}44M#)0O1z^J1CSBRN67&zJDaa{-7ZyvSFF zyss7x&>YLTblMSCV$eIM&{WJKEigp)rRpuNV;^KWNh)T}eZtR80)^~hNc?a(LT~(& zJfryEyzy=3&<=uL)~tV=mBHI#QvJW<9}n)UhD3c6B}3n zzJyfd_6Wyo3;6wu*mEOs`jq>?6^5c|%v^c<{izaICfHPexX6Eb_NWvJN+idUGrIj6 z!=%_iFn*Vd_vodNtyf!VOn9$xBj9$ld3Kyo#1%m>x|vX$-zR1%OCCCYZX%L(wSpmB z3vy>=e?HQ~J3l=IH@o6~{9F-b+uxA5Zgm2@!%A!qqH3m!EU?h26JRy5JITaZ|5K`j z>+G)CJ#XO6Iw^nfn8>T#a#_sTv|s_fLOW7*EY?${8VUowYo4*-7Z- zE>(rCN*^F))z@dmbo}{prs5i!yCOeYDhPh>ab?uPwq;Y3C!`7I7uIg-7*x%+0)r2; zvqa$h7D9h5E??jb#@VTq)8L*wTP@u>Yp%2J%PZD6G*o-?)}^kez_YoZyQ+!hF{cC5 zOrCgf=XmJS#a_&Z70qAk_Rar=CssjbQ9s?ibW-<g9$A5cG=h6N7@*GqX{F)4o zPZ|R*Zs(P(E{Xi=sZqAYtyrH>aW5lkL9VjG*>_&X=N88$-)#YBX~ohHF|dNEMWpf! zSc%cV#4ogIuD|@LY!d$UNWmFEHN)h|DCc@9*k2JLyZg_Lm>7a8s@hLD|0wxg{m}Mj z*Pee83ym)~2oeQmw;XiR58L~q8n@oXSiAkiUY36+aPyy2+70U^xfl1pcJZaL75TQ! zZRqd*qY~+_tG4gd_CNjZ_5B3kdRvw7JD;Vn{AGQ`8YDh!@0RQdkXl3ntylg9K8rMu zHR*Al;)>pBW+RTX`PMesuxTl5snsl#7Hog@Gy8>+?%@fb2ogUp4}i(J86n}q;+X}) zjvg=IS^c;?A^U0a>SNCv;$|-RH%7L8@w!K(GCc8{t zP2{|!{jv0}L<(^(EzzuK!(kom@@H?3_r>#4zkr8eJjfo#WB+L;oz_eaq#j|#i|&7{ zDY*v(&XVyLMZo?eK@l{9kcnQ4Tacv;URMBbGvF7`ID%qIT9cfs<}01;CLLmL3FEXr z)YfpvzM}4PF#I{2e9t|!#h=o~avfud|A=Ko^HNFTm%lh;K8BNsX!naClh-|+-Kk`t z%FjczHf%A$GfJp(G3(8qN}_VlpqFzytc5N$(8Cfxp>SNc8EthLR-4ZSrhDaz6uO*XIQ6;K%M>TCjiOlwP+% zB+HE1Bsj>R6)VH>X1($D6_&;U(ke>g@o>7hUl};0G}RS-NM8UXOf1C&4`FJ+mV49w z!MrN{-xWt6t(%PuWW3JP?d$LoOBRpDtU&jp6W|)~!@Q;vS&DVx>?6PWOJEMXXzl6Y zZ~|;S77hUiRL>r@uKS$E)Bf73A2x5xdqGW&S4_2 zq$u#a{!NZ!Fof5cU#J+Qif=#9k!zOc)TsJ-BZIi7&p8(ivupBIJK!h_GiyYSnJ` ziMyTIU(c6Uyj5vPSvPe1^VsIT$Jr*t8FMWIB3BDI>=4m7zY%_lRK7P`5U$#a1P_*l zB~&n~s=K{5w)2!Qt_c=&4lhqYGYrW`n`~xvQ${BK{S~t$BtE`tFr<9iM;9s6->4>Z zBc$p^Zf~sr2@n;6@N$1qPQ7!8RNDIGGGs(>OASpqchAn`RkzuJdsdhigIYy~X>CAI zn&ySVd}S5~9phHK2y5?m-UqI@>3MauBL|}76YTzP{5v5yG&L=Rt^9r}Vo@qM3jC(~ zcFO)j(gb;@%TmF6T+mop&xQTDK&M=|`vbU2+a%#a&3hw)IXZur(E3C>P*5>b{zf^$ zslJi=B(EVw#34J{XrpXiygz94V-3dD(WPnc_#rE#U)o6db6zGoA=$T_x1YjmV+;rN z0msCs(0k4vDQjmGhbYH0?TTgwiL%JWnfMO}8Ic6&V2J$yyKB)Mn%q*n{O!xS?BI|{ z*pZ=Lu<>p6*S~)fGg?!$|CBnwK45jhr-TN++=bT6M5kjF93L~#PWehLzNR465;0BP zIRW%|6Iuu4*`rSYm0f}YE-BOHRms9DD(c*m0Z;_P%<)5*PW~i@iA+tv3_r#%Pp$wA zkh{eXaMRiT1-pDV2fQ+!q8SD}vHR|#qM!2bx%=@p$}oSItCdX^Uru%yRPpqr><})6 zJ#+NZ=g+Y!_8vWlG`R#-y`k|Wk$JzQE9zlF{pS+^u{L#W#6ZcMBWEJzh2+{G-EYIv z3*zGLj#O4wNp;I?jhS)#Z4mLy^oGq|>@`zyjW@cH3=bkETuYpuVwqFV?ImP1YZgL+sw{(U#0AC4%lD2G4xcG{ds`O zQtieS>c1x8y{@n%`<$gC>)gK+SFHrSB*QGvI6q2BbH8WCCT!ctnBS-yK}q;)%HZ&w z<-ad|v&EWiAC%s7ZY;&1OfdeRbDU`iXPr>X8DLrvA%_+Yqkf&T$n}-wf3%L0xQrk^`O~>cIs?T*L1s_nIEVP^| zEX#i?D9q-^IX0<=I;GYj%2VdV$ODz95=yV`p~l7$AthngMsL@w^DQ0(#2RDhzD0?T zFxC}(Rf<>WxQ=(*vzOjGnjT8h)>T_d>MR<{N)Hu<)0lD~V?dOsr@m{KXn9o5;Qu;SgJP zy%dLJcP!%ly7@t5C8Uyb(5Dl6WU0-h?0C+Foll#7OpQB}E_z#f#<(?+PCx1q%74A1 z*~67e%>3KQeLm0M@-w$}z_kDDF2vdX`&Egr{i)EMVd6US;+a$*EPQtE)y4_nDkp!M z9qrCI^nE7KbL3AuC9$mh{!fW@!K7;c3bz9aW=+G-8#WMRh1uJBJo78{;y72&io}#A zm!cMaC?w{&jIf6m=wW*s`1S3i$6_fkNo_n$+pye9X9FM^k;yD1%h9!^M)rVvv zk-Kc%FP000m>URf;Ci)!Nf-84gZ_V5DhcR*vs7%7^4fT&_S)6QnB(O!wq^=yy zeVpyH4R4f*QDt^q<`w4cCkVE4Z63Z9ul zbN8lEB?7%odO7*3VhVH(8KAT5!tWdf07^i$zq8xlJ0q8eF$UJR@dE)l90dS4K*ztg zn@$E^7q^Hv0n7`R%5etPw=YBiI2;84A3)&0x805gS{Jv$cLB-^mj<#1*0*Ma0VNy- z02@H$zqgB^0VX4tG4cl1w~WLA9~=b$A3)&0x2xa*A|sblG6&YTs00Eh90dRwK<2-< z&maO4BbRG(2iCW|L;^7!1pp~P*1xyyU;;QJm$b46*0zNL8yp1y6hQ00w;Q1X93z*@ z@(0#`ZoInt$~cZ{QXn7oE;qiIEX1xGL)vQAP* zEVvwK5ia9V(;2M3`cN5uiT&=hH?imXC?Y!IMv3ZB;Q|hQwo*$PjP3?M^)azW2I*nucs6IY+ z9u=zbI$VStEd5GzG*WvU_kk$=7^aQFhFSY%pr^#&whXsOFZETJnR^nt8eyG(JDf|9 z6Ml6YpwRDIO47uT(pP0@LXVyCxcymwvPftS8f9lz4uj=Qwr2TNIV$iaQ{daM-y$^G zJ3kIy6JAz@Y1US=yN&fl%{(#O#&}kD!FbA1MdkVqO*l*Qj?Tb~N7+J(GCyjqyY29< zm9w7eT(jLwG7W%Mg#_+4Xk;!iI})@7wUV~uU? zEa-S@HqIa7n6i0&2cZc#G=^GdiDf0sAFVqMZpk#9d=WQD^)rwU9*UwHCmh^Glz&M| zzO~SDaNcQn#*5GWHK9e`Jbd%?gtItK(_oe($|7(Ye;MzlMGD6v;)tz(^yy`XYe{r- zDPN0L%+QN|EA%wh5Jw%9fU4HVQf$8>Hc^%s!${yk*4 z3W>5G3k-IFEV>3{!s)=TF7RBmU@!px@TJWaudd_pG6!~#EL?jgR4n4?s|;8)fV!FU z#z(+vRfdVL*bbJx(9SP^iCPST>2$!UL9|U#j7nZ2G+n;?`s>5zKMJI*d}se1-M)R) ztG>K*`_Ap!%P;6(>Yc2P?TvWHf4k zUWu~M5A^ibh*xM#JbRJ&-6FeYVv~&3MC3DnC~T0a84#8KmD~e=gaC{iinmSy7f3kL zm2N;TEa-yb)(H6YwgyN&Jv@3l^5PbSdD(kh(XAdE6<+9TZ`(-SmSi4L*Vn)gV?eE~ zW4>48h~A5JSR@Oct~tR|Zj*bpjF`8aZN_Qj4}|TJ^L4~Y=Q;fHp;#NChgmRDV_X|7 zgm*|Axp^{)?Y~}s^*u$hkQjfymPQAX<{Dm7yD5S_J2)@D2+T);gn zmwDS{-%Qgih7gsToLl?mQtQ&~P6)j-0ne>H7My5+13@paxKot!W-gA7)bTzIvK$Xr zUeln4@`>-%`5kYvqHxQUi|c2OkpM?V6gY*r~x$BF+5Z4`2N8-@e4jMyvB8$bS`8xjOhmOO&~g?U4|J!iw@* zOzYcuc8R#=7NtjbNXJIl^Vs>0q&AD(;_Z_uVihf^ouuqTbQm za*~yik}ZYl-QR*uj2joWnvxHX7YHHtJ5nF{V#AVva`^de9Nl&c!{sjFdWLa_T9C&hLtRFxRP`vPXo52U;`6TphyM` zUwNXr6(oU3vMAy#=?6&)kxQ8hcgk6RK?qeOV$1Qh(3bGd3MYW9&(EKmwz=D;Km1D8 zh2Gt-CuXR(vbX=vHT1#U)n8oh!~MM*G~kk6WajRt+5L8}7+B96P-)Gaefdfa%o~Bo z@gF2=A@nN}i-dEjAi5HaJwwh2%&`+VWKxlNMKoop#I~wJmF6rXEBpgK^o)If>3J1= z*z-sIaGI?0TA%}oA0kZnFY6?i>1-ApK?Ha5KssWEsU@4)m_IvqmXQ?70+PcJxKFZS z&(wFL%wV-lVS&T0Ea)-JJi{B)c_n(khh4_PX|f*gEceK&;=^2T6-qquBS z(eAapf}W{gLt0$FhdLY{d2kR&9x5aYO=w!d0&P(}?`eK}ET4zOWUoSBFX*Qsu@}xC zJLPHu;O$fPfK!_?Vj_t(px`E-dg*)}jM+cZB?@t=xeLr~$y^nCCB|fb86Jx0)Z~0k zSlmOz6A<1Wa9eaMi)ao#zRPJSdJ)-0^(^H@kg|&KJ9=kUe=J z#?b5BjNW}fsMKW5QBc%>dL6razDUNU+@)+R1)YoAeav)lR?DsQ@c%3q!j`ukXbCyC ziD)qW6pxMGtbXVFMMry0tye6Bf1h70KYXIAWs{nC>4Nw^xcI)WkM;AnR`Q)bmyaqh z(CI5yC+&-Ga}t*^!#Xf?T0zcJdd}e=BrZ^}CLxRHH}9L>kpa|yN|VTpMzZCdy8liD zp+0*5(63MDntG_>&8lR*qPfUEZ{Ty?%@g5IO09#Vq@A{o&)KN@nXq9!fseLx_b!o+ z$38p83b|a(+})w3n=gtFIgWEnoDV=R#i<TDQhO`o#hV7tGfgI0HRr2k9L^B|jcDdFQcF%S?JeU4 zAz*b&dQn8CB-jzqEDu=3F14Y*#3UqKt`^BggCx+pa~MN^iDshE=X77u(pd~;EYW$b zH;_i~mG=l1hfiNV>CdzExHI_2Pub@`y&sT7(zbN%J(Gyg#iV*~8iIw;%Lea)_ZF1Y zfvh!DIJUi?;!;ca>9_GyOtpWCyr}Wbz2{__No^YP;FpSwx zKY~lzN9R$QP&Kq`Qy;Q6hBvoFr$i7^;#c7M1xymmIwly5`*2hfyrf!Yoj#PtR4oiV(M^r>2mIVfG%aZ|^Rr<$KyDyx!h2ylyMxkUGUz-wu6*{6jM@n& zmwS?b`;haxFT!~++4xSFVJvbPU$g0A3$$f1aI$wspB!<*_d6rb2+>uSl-FEbL`5!r z8o%8Ybzsnu4rtW({-;8kKfoEQdhUx+iTR|SwcLKHcYowva8?dQi5_DyA}g|PL5s~H z<(UKqlXF@{FXjsb6-l9Dt3srfY8(*inji~**H8S~DOKlBNN{%<28dlVTQA@}djE#a zmur>O4vuHH&ZKAJZpc#33NpmMw+^2qZEdCjx--=%Q-2?RP$$CmNQ}+wOP@B?SOdWJdrhfj1}>u&0latjf)jU-a9o4f@=`R z@ow5aN{sHAPt$i!e*!I5aeQ!xc@b6er>uOuF#n=)y@9t{tiv0*>xzj?T^tou;=ysS z$dBIB|L$~cNAv@*^^8?5fAZnV2ky5eSn~0q2}FoT8VyEZl}05R!q_C24SL~!BPvy* z*%RQ>b5$3(rTetg9d$H)Ip-~bm7Qd0`1F5_x{}9Clv5=RQ;=2TTZlTXq>NIYJtSJm z0dh-<9SPl9=Ubf}hUIU!n%mG`swlrCoV@UgpLXs}qYEKG_x7-?d-qT53f~>jxBJ$? zthj(|Ut6c$s*IpCDciM`vG(78{j%nm!5>7)QtxqZThYBzN98cr{tWN`6yGJBjP0n$ z(R`0&2`{4(NfRi5f?K8?SYVf&<4i}FHYF;)Q5(| zLi^o8KE2;y#5MZ#myxIIQ+pp@DI^FsYAZF}18)EYOx|~lcvT+;l29jqGkz3CXMtt= z4q#TqOkZ&_iQdZk5)-`S(3#2ru8qg2Dwa=w>3ElQ0s>r}$)~SO0wco7xqNV0z4+ta z-#9H;BxZeCuz9dozpHnOO7BL{?_|$)u~+S)-OxcjN%W_wIt+szG)WOIqt?MvvMB`d z0f!4{584GhcPGV8J0$dfxygyCocHk`gHHdT`$-*zNm!ImgBoDC8qve~;Lh!%Bfo)d z7DA&>uY6>LgY!J$YxzWVH+(y>Tn09W8T>s}Va;mFA~1xeSE1IT^Kh}*t-nO&dce@CJpn4Be2gP-Kfb+gMxe8-c8uyeHffI_*<`+G`%4BC|M8b-&$RLJhy z8(H?G*gNWrt6_)&y?L;zTs@x|E`8t96-maqr$w}kc&Bmx8(Q(vr_M+dNespJ0|=;E zXKEF!9!EMtf`VYR3Rzvw4zZ0AZmiz_bOe&Tl4R^i%PXwumV9kDGS|HusaXgUNC{a* zg%apNc$_U$47~?`iyVz5rFW#lakMilNnVo-{^~_(A zGZMsuXxguvMAfpvYa^ZQjd++s9Kwq*54>bk1@_=zT?o%#DxsGKl24Dxr`4UqsKN`u z3{lqR!4P};C}d8$V{0ezdAK=TSx$P1T%M9dLRc9NmkI2Dl_)p3{2yr=s+r`CvR2cA zr-vo|tGL=3b67~#R;1llyk|9y8oqKg9De)k`P1Q051`@j`Lmb!*>gE=_>#)Ge%r{O z28FhWTXavBM*Y_Smn-ngKFvQd^mSp7S0jB=<0QG!wqClk_EZUE3$e-s4wMuKhw=B z+TB@MP2LF#U8Bmw<~8TIhJLWy0L6VZqnH3}SSey(2ZUh*c{8-HfR01r;s!G20m+uD zbv{Jy!+c|-MgREnxR&u&9lFj}Z<-d=e6D%or&1?p?YaErb zrB>K~#_mS5(Xzh-7WNmRMMWlTbn(=Us&QpBZ;7PLtW43t2iC(b=pUCz`3{Gvh zG#fl<5oH>tbF{CX`5J%DFj0j^_)oZlYT zk}#Z;`yfBICeglduGEBPaYf@x(mG*NU6}w>K&!vif5t4WEnyWR$3hq%g)S|}DPQhr zRG?9@ZEckYBhR2WnfI4LIyt0?ry=bDu#vY1#7RmwTIG;vSOo9!J}z~-+~X^b14@OYtdqJDo_=a6V!<6m$O97YB<-#kSI20fgZ53PTWy*TvwCf0(H!#yBiTl6nzklOjnTudg}097(=q zo6Soojy3OtrLYDgEj$ttH&1VIZ2&sri;{#R(>*X9xghsU7}BhomR5W()&Hzp^lNvI zpY!hMwt4>QvFS+uE=7+nQG+S_c=w2<%yMtvi9b2(x3md@!k1{HZ=SNZp|qq4)i_Fk ze*n%V%e5KKP{j?+&7a9-d5Gf3fzSi&HCsSRa+iTf63*=iP`C@v0qy{BVZ>ukSP|e^O^LM*V>N0jV5`$R!}AprTB*@;fUZHOehJ zLFo?2q?(Q6+*I6ij2gX(mSI0mF0H$m{6+|39xZVTDW>7&S5D~E?JzpCP#guS_rkY02i=;;gDa#nV?bUY^|oAm9ly&k?V{=quwM5 z6xQE`De`NGrXH_2kx#f-@m?yK(U7Pf(h$|?6X)g}R)Tq}u#oFZYD6lMJWf`v)~P