From 0f87f1397f3d0246804b35279ccfcdaa6ca0d63e Mon Sep 17 00:00:00 2001 From: Manuel Cillero Date: Fri, 14 May 2021 19:47:20 +0200 Subject: [PATCH] Elimina defintivamente plugin Redmine Git Server --- plugins/redmine_base_deface/LICENSE | 21 ------- plugins/redmine_base_deface/PluginGemfile | 1 - plugins/redmine_base_deface/README.md | 36 ------------ .../app/overrides/README.txt | 1 - plugins/redmine_base_deface/init.rb | 20 ------- .../spec/models/deface_paths_spec.rb | 10 ---- plugins/redmine_git_server/Gemfile | 1 - plugins/redmine_git_server/LICENSE | 21 ------- plugins/redmine_git_server/README.md | 52 ------------------ .../app/controllers/git_server_controller.rb | 50 ----------------- .../app/overrides/repositories/show.rb | 5 -- .../views/repositories/_clone_button.html.erb | 14 ----- .../views/repositories/_clone_form.html.erb | 28 ---------- .../app/views/repositories/empty.html.erb | 10 ---- .../assets/images/copy-to-clipboard.png | Bin 543 -> 0 bytes .../assets/images/screenshot.png | Bin 21906 -> 0 bytes .../assets/javascripts/git_server.js | 15 ----- .../assets/stylesheets/git_server.css | 47 ---------------- .../redmine_git_server/config/locales/en.yml | 9 --- .../redmine_git_server/config/locales/es.yml | 9 --- .../redmine_git_server/config/locales/fr.yml | 10 ---- plugins/redmine_git_server/config/routes.rb | 15 ----- plugins/redmine_git_server/init.rb | 21 ------- .../lib/redmine_git_server/grack_app.rb | 15 ----- .../redmine_git_server/grack_git_adapter.rb | 26 --------- .../lib/redmine_git_server/hooks.rb | 11 ---- .../patches/repositories_controller_patch.rb | 12 ---- .../controllers/git_server_controller_spec.rb | 16 ------ .../spec/helpers/git_server_helper_spec.rb | 8 --- .../spec/support/additional_environment.rb | 4 -- .../spec/support/database.yml.travis | 6 -- .../circlepro/stylesheets/application.css | 4 -- 32 files changed, 498 deletions(-) delete mode 100644 plugins/redmine_base_deface/LICENSE delete mode 100644 plugins/redmine_base_deface/PluginGemfile delete mode 100644 plugins/redmine_base_deface/README.md delete mode 100644 plugins/redmine_base_deface/app/overrides/README.txt delete mode 100644 plugins/redmine_base_deface/init.rb delete mode 100644 plugins/redmine_base_deface/spec/models/deface_paths_spec.rb delete mode 100644 plugins/redmine_git_server/Gemfile delete mode 100644 plugins/redmine_git_server/LICENSE delete mode 100644 plugins/redmine_git_server/README.md delete mode 100644 plugins/redmine_git_server/app/controllers/git_server_controller.rb delete mode 100644 plugins/redmine_git_server/app/overrides/repositories/show.rb delete mode 100644 plugins/redmine_git_server/app/views/repositories/_clone_button.html.erb delete mode 100644 plugins/redmine_git_server/app/views/repositories/_clone_form.html.erb delete mode 100644 plugins/redmine_git_server/app/views/repositories/empty.html.erb delete mode 100644 plugins/redmine_git_server/assets/images/copy-to-clipboard.png delete mode 100644 plugins/redmine_git_server/assets/images/screenshot.png delete mode 100644 plugins/redmine_git_server/assets/javascripts/git_server.js delete mode 100644 plugins/redmine_git_server/assets/stylesheets/git_server.css delete mode 100644 plugins/redmine_git_server/config/locales/en.yml delete mode 100644 plugins/redmine_git_server/config/locales/es.yml delete mode 100644 plugins/redmine_git_server/config/locales/fr.yml delete mode 100644 plugins/redmine_git_server/config/routes.rb delete mode 100644 plugins/redmine_git_server/init.rb delete mode 100644 plugins/redmine_git_server/lib/redmine_git_server/grack_app.rb delete mode 100644 plugins/redmine_git_server/lib/redmine_git_server/grack_git_adapter.rb delete mode 100644 plugins/redmine_git_server/lib/redmine_git_server/hooks.rb delete mode 100644 plugins/redmine_git_server/lib/redmine_git_server/patches/repositories_controller_patch.rb delete mode 100644 plugins/redmine_git_server/spec/controllers/git_server_controller_spec.rb delete mode 100644 plugins/redmine_git_server/spec/helpers/git_server_helper_spec.rb delete mode 100644 plugins/redmine_git_server/spec/support/additional_environment.rb delete mode 100644 plugins/redmine_git_server/spec/support/database.yml.travis diff --git a/plugins/redmine_base_deface/LICENSE b/plugins/redmine_base_deface/LICENSE deleted file mode 100644 index 5010104..0000000 --- a/plugins/redmine_base_deface/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2016 Jean-Baptiste Barth - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/plugins/redmine_base_deface/PluginGemfile b/plugins/redmine_base_deface/PluginGemfile deleted file mode 100644 index 811428d..0000000 --- a/plugins/redmine_base_deface/PluginGemfile +++ /dev/null @@ -1 +0,0 @@ -gem 'deface', '1.5.3' diff --git a/plugins/redmine_base_deface/README.md b/plugins/redmine_base_deface/README.md deleted file mode 100644 index cea4bcd..0000000 --- a/plugins/redmine_base_deface/README.md +++ /dev/null @@ -1,36 +0,0 @@ -Redmine base_deface plugin -====================== - -Integrate with the deface gem to manage view modifications in plugins - -Installation ------------- - -This plugin is compatible with Redmine 2.1.0+. - -Please apply general instructions for plugins [here](http://www.redmine.org/wiki/redmine/Plugins). - -First download the source or clone the plugin and put it in the "plugins/" directory of your redmine instance. Note that this is crucial that the directory is named redmine_base_deface ! - -Then execute from redmine root directory: - - $ bundle install - $ rake redmine:plugins - -And finally restart your Redmine instance. - - -Contributing ------------- - -1. Fork it -2. Create your feature branch (`git checkout -b my-new-feature`) -3. Commit your changes (`git commit -am 'Add some feature'`) -4. Push to the branch (`git push origin my-new-feature`) -5. Create new Pull Request - - -License -------- - -This project is released under the MIT license, see LICENSE file. diff --git a/plugins/redmine_base_deface/app/overrides/README.txt b/plugins/redmine_base_deface/app/overrides/README.txt deleted file mode 100644 index f1ea528..0000000 --- a/plugins/redmine_base_deface/app/overrides/README.txt +++ /dev/null @@ -1 +0,0 @@ -This directory is only here to ensure the plugin works through unit tests. It is automatically added to Rails.application.paths["app/overrides"] diff --git a/plugins/redmine_base_deface/init.rb b/plugins/redmine_base_deface/init.rb deleted file mode 100644 index 018d869..0000000 --- a/plugins/redmine_base_deface/init.rb +++ /dev/null @@ -1,20 +0,0 @@ -Redmine::Plugin.register :redmine_base_deface do - name 'Redmine Base Deface plugin' - author 'Jean-Baptiste BARTH' - description 'This is a plugin for Redmine' - version '1.5.3' - url 'https://github.com/jbbarth/redmine_base_deface' - author_url 'jeanbaptiste.barth@gmail.com' - #doesn't work since redmine evaluates dependencies as it loads, and loads in lexical order - #TODO: see if it works in Redmine 2.6.x or 3.x when they're released - # requires_redmine_plugin :redmine_base_rspec, :version_or_higher => '0.0.3' if Rails.env.test? -end - -# Little hack for deface in redmine: -# - redmine plugins are not railties nor engines, so deface overrides are not detected automatically -# - deface doesn't support direct loading anymore ; it unloads everything at boot so that reload in dev works -# - hack consists in adding "app/overrides" path of all plugins in Redmine's main #paths -Rails.application.paths["app/overrides"] ||= [] -Dir.glob("#{Rails.root}/plugins/*/app/overrides").each do |dir| - Rails.application.paths["app/overrides"] << dir unless Rails.application.paths["app/overrides"].include?(dir) -end diff --git a/plugins/redmine_base_deface/spec/models/deface_paths_spec.rb b/plugins/redmine_base_deface/spec/models/deface_paths_spec.rb deleted file mode 100644 index 00b62a2..0000000 --- a/plugins/redmine_base_deface/spec/models/deface_paths_spec.rb +++ /dev/null @@ -1,10 +0,0 @@ -require "spec_helper" - -describe "DefacePaths" do - it "should app overrides paths" do - overrides_paths = Rails.application.paths["app/overrides"] - this_plugin_paths = Rails.root.join("plugins/redmine_base_deface/app/overrides") - assert overrides_paths.include?(this_plugin_paths.to_s), - "The init.rb of this very plugin should add every plugins' app/overrides to rails paths for app/overrides" - end -end diff --git a/plugins/redmine_git_server/Gemfile b/plugins/redmine_git_server/Gemfile deleted file mode 100644 index ae94895..0000000 --- a/plugins/redmine_git_server/Gemfile +++ /dev/null @@ -1 +0,0 @@ -gem 'grack', '0.1.1' diff --git a/plugins/redmine_git_server/LICENSE b/plugins/redmine_git_server/LICENSE deleted file mode 100644 index 48a575d..0000000 --- a/plugins/redmine_git_server/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2020 Romain Lalaut - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/plugins/redmine_git_server/README.md b/plugins/redmine_git_server/README.md deleted file mode 100644 index 1422d28..0000000 --- a/plugins/redmine_git_server/README.md +++ /dev/null @@ -1,52 +0,0 @@ -Redmine plugin - Git Server -============ - -This Redmine plugin lets your users pull and push to/from your git repositories hosted on Redmine with HTTP - without any complex setup. - -Under the hood, it relies on [Grack](https://github.com/grackorg/grack), a Ruby/Rack Git Smart HTTP Server Handler. - - -Screenshot ------------- - -![redmine_git_server example](assets/images/screenshot.png) - - -Installation ------------- - -This plugin is tested with Redmine 4.1+ (but it could be compatible with other versions). - -Please apply general instructions for plugins [here](http://www.redmine.org/wiki/redmine/Plugins). - -Note that this plugin depends on this other plugin: -* **redmine_base_deface** [here](https://github.com/jbbarth/redmine_base_deface) - -First download the source or clone the plugin and put it in the "plugins/" directory of your redmine instance. Note that this is crucial that the directory is named 'redmine_git_server'! - -Then execute: - - $ bundle install - $ rake redmine:plugins - -And finally restart your Redmine instance. - - -Permissions ------------ - -* *Git Server > Enable git server* : allows a user to enable/disable the project module "Git Server" -* *(Redmine built-in) Repository > View changesets* : allows a user to fetch changesets (pull) from a repository -* *(Redmine built-in) Repository > Commit access* : allows a user to push to a repository - - -Alternatives ------------- - -* [redmine_git_hosting](http://redmine-git-hosting.io/) - based on Gitolite, this plugin offer a **lot** more features but it is also more complex to setup. - - -Knowns issues -------------- - -Puma 3.7 which is currently bundled with Redmine has an issue with chunked uploads. You can upgrade to Puma 4.3 or configure git locally to avoid chunked uploads (eg. `git config --global http.postBuffer 524288000`) diff --git a/plugins/redmine_git_server/app/controllers/git_server_controller.rb b/plugins/redmine_git_server/app/controllers/git_server_controller.rb deleted file mode 100644 index d8c9b53..0000000 --- a/plugins/redmine_git_server/app/controllers/git_server_controller.rb +++ /dev/null @@ -1,50 +0,0 @@ -class GitServerController < ApplicationController - - skip_before_action :verify_authenticity_token - skip_before_action :check_if_login_required - - before_action do - begin - authenticate_or_request_with_http_basic do |username, password| - @user = User.try_to_login(username, password, false) - if @user.nil? or @user.new_record? or !@user.active? - logger.info "(Git Server) Authentication failed from #{request.remote_ip} at #{Time.now.utc}" - false - else - logger.info "(Git Server) Successful authentication for '#{@user.login}' from #{request.remote_ip} at #{Time.now.utc}" - true - end - end - next false unless @user - project = Project.find(params[:id]) - unless project.module_enabled?("git_server") - logger.warn "(Git Server) project '#{project.identifier}' doesn't have the git_server module enabled" - render_404 - next false - end - repository = project.repositories.find_by_identifier_param(params[:repository_id]) - unless repository - render_404 - next false - end - @grack_app = RedmineGitServer::GrackApp.new \ - request: request, - repository_path: repository.url, - allow_push: @user.allowed_to?(:commit_access, project), - allow_pull: @user.allowed_to?(:view_changesets, project) - rescue ActiveRecord::RecordNotFound - render_404 - end - end - - Grack::App::ROUTES.collect{|o| o[2] }.uniq.each do |action| - define_method action do - path = request.params["path"] - params = action == :info_refs ? [] : [path] - rack_response = @grack_app.send(action, *params) - self.response = ActionDispatch::Response.new(*rack_response) - response.sending! - end - end - -end diff --git a/plugins/redmine_git_server/app/overrides/repositories/show.rb b/plugins/redmine_git_server/app/overrides/repositories/show.rb deleted file mode 100644 index 9a7744d..0000000 --- a/plugins/redmine_git_server/app/overrides/repositories/show.rb +++ /dev/null @@ -1,5 +0,0 @@ -Deface::Override.new virtual_path: 'repositories/show', - name: 'insert_clone_button', - insert_bottom: 'div.contextual', - partial: 'repositories/clone_button' - diff --git a/plugins/redmine_git_server/app/views/repositories/_clone_button.html.erb b/plugins/redmine_git_server/app/views/repositories/_clone_button.html.erb deleted file mode 100644 index d65cdf9..0000000 --- a/plugins/redmine_git_server/app/views/repositories/_clone_button.html.erb +++ /dev/null @@ -1,14 +0,0 @@ -<% user = User.current %> -<% write_access = user.allowed_to?(:commit_access, @project) %> -<% read_access = user.allowed_to?(:view_changesets, @project) %> -<% if @project.module_enabled?("git_server") and read_access %> - | - <%= content_tag :div, class: 'drdn clone-wrapper' do %> - <%= button_tag l(:clone), type: 'button', class: 'drdn-trigger clone-button' %> - <%= content_tag :div, class: 'drdn-content clone-dropdown' do %> - <% protocol = Setting['protocol'] %> -

<%= l(:clone_with_protocol, protocol: protocol.upcase) %>

- <%= render 'clone_form' %> - <% end %> - <% end %> -<% end %> diff --git a/plugins/redmine_git_server/app/views/repositories/_clone_form.html.erb b/plugins/redmine_git_server/app/views/repositories/_clone_form.html.erb deleted file mode 100644 index cb16636..0000000 --- a/plugins/redmine_git_server/app/views/repositories/_clone_form.html.erb +++ /dev/null @@ -1,28 +0,0 @@ -<% user = User.current %> -<% write_access = user.allowed_to?(:commit_access, @project) %> -<% read_access = user.allowed_to?(:view_changesets, @project) %> -<%= content_tag :div, class: 'clone-form' do %> - <% protocol = Setting['protocol'] %> -

- <%= l(:use_git_with_this_web_url) %> - <% if write_access %> - <%= l(:git_read_write_access) %> - <% else %> - <%= l(:git_read_only_access) %> - <% end %> -

- <%= content_tag :code, class: 'clone-input-group' do %> - <% url = url_for( - controller: 'repositories', - action: 'show', - id: @project.identifier, - repository_id: @repository.identifier, - user: User.current.login, - password: '', - only_path: false, - protocol: protocol).sub(':@', '@') %> - <%= text_field_tag 'url', url, readonly: true %> - <%= button_tag image_tag('../plugin_assets/redmine_git_server/images/copy-to-clipboard.png') %> - <% end %> -
<%= l(:url_copied) %>
-<% end %> diff --git a/plugins/redmine_git_server/app/views/repositories/empty.html.erb b/plugins/redmine_git_server/app/views/repositories/empty.html.erb deleted file mode 100644 index baf61b9..0000000 --- a/plugins/redmine_git_server/app/views/repositories/empty.html.erb +++ /dev/null @@ -1,10 +0,0 @@ -<% user = User.current %> -<% write_access = user.allowed_to?(:commit_access, @project) %> -<% read_access = user.allowed_to?(:view_changesets, @project) %> -
- <%= l(:empty_repository) %> -
- -
- <%= render 'clone_form' %> -
diff --git a/plugins/redmine_git_server/assets/images/copy-to-clipboard.png b/plugins/redmine_git_server/assets/images/copy-to-clipboard.png deleted file mode 100644 index e20cc34a2e1b90b912b891d8d6664ce07f60a21d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 543 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6SkfJR9T^xl_H+M9WCijSl0AZa z85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP=YDR+uenMVO6iP5s=4O z;1OBOz`%C|gc+x5^GO2**-JcqUD=Xe2F{@^LWOlJx5tW4ZC+fl0}y-#wbN>crYp{O`HvM$Wh}<;1=h~m;KYk_7#Ugtk*SHcfq|8QLH%z2eJC1o^HVa@DsgMzd$yeks6i5BLvVgt pNqJ&XDnogBxn5>oc5!lIL8@MUQTpt6Hc~)E44$rjF6*2UngDvf#rFUJ diff --git a/plugins/redmine_git_server/assets/images/screenshot.png b/plugins/redmine_git_server/assets/images/screenshot.png deleted file mode 100644 index 7eaff2a670cae8c7531a6de5957dc78626f88de2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21906 zcmcG$by$?$`!D(c3JMBJHwc1AhjdE{(%qmiG)TjcqDYIVbPCc8;V^VcNq2XHbT{nf z_jmTb&feGl@BGeOuf;nvJhRrl?)y^@p{mMq53$LyAqaZ-N?uwWg3x-vuRHh9!B<)v z&-lO}_ut9uxj+zZ%fDY}F)X+g5JU^Tl9tr;G~Sx=G9+AC!rJSbeb$9y<-d0iJ%fok zFk{g-2`hnWQfH_hcC4h-l{xI7$imZbT~?gu6=xZn_$fOh1UroOUaq0@9P3yrvOyfC z7yFnnhOK+;`e4QO#49zy!qQUwvYQ9VQ>bS`jUoByjv1F73=RA_P$b`re@9Z6xI-_H z_FfmApd$ExdQUCy2hy^JFSANM`e+fI%y2KTg!L=(j^v|Q8RuBqd%u7EcfY8Ml{O?N z2_?O^6~KN&eNwLe1i7=3S*Vk<`u*029Z{{^Q%FA<0j}o-kG-lyZUYbU$eMuw=Qq0H zIO}Nk+t6;IjGjN0Xp%36db-~09SzfOE^~qF4uMId|N7Q0J=*d1|Mtm5J;!Ct=x^*s zX`#C-r~>!oF^x|U-ldG%kBQb1n(Z))@*U{4KPMz=kz1%{RHNZTCsy!Fd!*J(&YXk5 zmrM97H|eU+wJ@^i+SR?(NQmu0V_;;?_hWLrAiEXCYcwAhCb8!Q-@D9iPa_u$aW4xn zbhyLw`D(=|8^dVc9(39I>k5!JX6)X+FiD_88>@}XyNd21qoO39e`AdALcg1XurzoX&ViN=mY5 z7n+t|UjAvh;`$*b>O)wrZdRwSqp9XC#<2TRK@4e>d1GW`8M)=hQ{l6H)8*Phf~4QJ z$Qbcnav;(~*X0%cJ=0_}wlO>uD%i8?lOZBtsbsj7MeprRRg>INxSspXchn>Br{-Y4CSX|xJxu3JGnpY(A^8!ugMQ`CL(tyk5Eer;W*yXqp zLSBdaD!JvWg-sAK&Qh}vM-CBpexdZ$bBt=&)Rr`!h~g zBvpWS;V3A&6%{-DyZxpb@3_tX)=G6VTL$w1-i9lk*yfsxb>GKJ<$Jq6JQcN)nK`qm)E5&U-K_GU~=fDNL_JOO2p{jHDB++5o0023`I*43b81IBD*sl zuC?K}{-qk2&4}7C2V>l}WH-ldJr8e4tf(9Ui)HOf2vyrwi8Iz&`!y=G+?vXML`jz% zYIdfLxfs|T#(zaBR`AYI>wCwJYCGf6w2rINka*`c1uW)Qr}buAENgMD`kK#FyCn&G zum=R;kgTq(tSpnxec#&JGOBU6fWgr3J$R5T=#rh1GSer1TkC)8=kM?TLp44%)xpw| z-?BHku~7oDu&@wz->URF%$CjE-`n%NIbXv-M~9YIS9d0m&*Q ziO1KcbKahwg+?{Rjo@wEccv$DRMJ|*NhnOFG7sEP-weVbpW4m9U&a`Xy$Ynm9iGa% z9477HyeYd63dNi#z!!etkcsv3A!XgM9?hHGHvb-Ym5_xl)^5y*USh6K8W82)>h6vL zn-rI9gxz@bqd;d992kn>$&?(8uiT1gm7R!eyzRd~zQjDII5RB&fbyK`SdORgdV@BW z@nlHWo+=HYVN2jZbXc`T670^)u~wqzC>JDqr>b>^Re;>1=3D0RRfq4-m(!~v|zimgq=u($rKhCPH?1cJd%;REy`o}aX@L+O|eWohKWMD+Yp?>)!qi~F}#s^EH zq$032Fucxn0Qp0VylDS&LysH~}1{sr53JCt@Xed0%L0Y3zd#r{yWcShs zJTl4Y)JG{~9yj-g=D` z|2#bH49zO@*%5b*^%PYr8yV%CsQ$Slq6|tI;&s;R%#h0|RxdGLgfZG09 z6W1)PaXEOqbDM8q*g=gwK|uf)oKjSIwwkI~4?fh)vUay14W5jeo}L~N5fLOJDvCx( zLeg-1bLp`&ogm`nY-P2cr5HDgFtD^S(bQaCSQtRrj$K_{6*t`IXAW4sNW>F6n+JV) zc6Qdx%#4hTjK=p!&Dc0qIp=b(8IJ%T|Keza$M4Fs%Fyp{RcXi>Vj>Ld?^lIBfBxJj zdOF?s9>c)kyLIdbEIh_%&o*7F_x9d_;!jFa^yhDBYeOd$^Qp{Rp)bhg+TmbNA-);x zFY>)M(j=d$TCRaET%A(+#XdH}ZhcN*dT!Ubv&Ku!LUCGS&!(9%Rn@ip*I&wR^<2d- z*Bsq+f)@m{o0kbNEw91a&5+Et5qu2 z!6gzpNqx1w%CNh$Vyd461qumP3hQRAX@tvVw+)i z;ho_un^g9#V5sllYC~U<3TTz%ifC447l8+fy>;xftmE$73DhMHs+(dn zE{_{8yqcfBO#Q80IHK_(P_#_QrYrPmN-F+-l^RC%M|USanekL{jU@--k64x6)Kpu{ zap(du@jSmO;?O>U`bRTmd;F)x2XbTHMqG7@7r`_zrG|#YKP6RJK()z*!ZqXfypmgl zTRCZ28?%t%h$tl6P7)F{U$@QWF9sRY)V?3|#{3Ey&}~BlQnMS%^q(%f7#MW05M#)+%e=7y`{iOi4vfR#sM88WM0?{HTwh=69IhTWEfWDP?D8r>{>= z)dIbI`O+A^!4Q@K>q|8Ih`)7+%-N?QN5H2omo%daGsDj#&Q{+xf~xdn%?58;~mtra%70;W74!fc5p7(F~)wJRQ1BLh$L*`I zZaA7@A1m6sqrsH8V65YD^E(H_a3UMHLdA(IG8{7`GGc zm)ux4xNqNK;D& zZd)Aah?+Pji!irHBdscxf^3VcI_h*?Y*tA0cxWOihhXXlj#oulwsuwwwwDy#9sNtJ zK~c^FGcCoPqw-6lk~rrBBsbXe-Xee?Yo~$!25E@XR9CoJh-C zP)}T30Fto(0J~oJC>(^S&kbH#US8hX^4Xr`{NH!%U1?_um?BwJmE{)h#l=zK+^YR}s<0=hzBFK1T zBgrl5DL;)8TiDFc&zo9WPP376o6Ebp9-SYq$LGHJuX9N`QcBG9ET?rKr2n#sapT>#m)H_^>ELO)Dw!? zuFYP@vBaJ$QgjTA+v{C_|Dypp&#*a$EPzw;Fm_BdhlKaXJHa)TopJIryZ%H4HezIr@i z*p+pksNEMm7r~9{(jLtV;#>6P+Q@$5j288w4G$-2=KH~EY}ubH9=V(^A5bB8Nuk5y zhz3S;>h%R@Z51;2G-V@!tf;)@$?e4h@)!WKC({GEGnh*Q*4AL&0w>z9w0zaIU*XXN zB~Aa8bx+WiW3Y@76Yi&OY)!g*#H_!sers?yMzB=@!c3P$*v=iI!9H)by(#rcwg;o$ zBJwW)%1|%kiY%u05svF!Q~Jk$5Hd0`ZqEfR?1-^DeF1M_G2ZehNFUTNGtxI|*syxz z71=qfa5j0C8nl7}0EIhksh-(Z>wZO;_qk9nDe?F3TAi?_p@9pBJnqXV8`zNSh?`AH z>Z0>FQVwg54e_dj-PglL_X?5mHD5?5eK&TLbInT=01i+KrMgTSeBYl_K!n=Ef>W>h z1>jSOM>Ry3y;(iv6TW{XZhv;;3vJx6BM{2~bD4<>15R03s53NY?x7gdoj`*Z-U`1y z9wTAX*EBS|0uZz>P2B%%ZvkvnczF1b4GQdTZLP@j=Nnxd4L_%He*UzZtrZj$Ob}CE zSy))u+A36K3JVVxzue+6Fqn#uCk318y59fw>sPG;?c?pKv5t<=o##VK4Xew}f&mc` z5mdtNXJ=erb#PnoFgu)J7 zP#EtR>QoUUawa`~X7clus%Zu8gP4({1KMuE-Yz6^CGwb_ym zY>AW$9`rR4)Kk9c0JfpDcTL%DOl7506gF-75*;_bSZ5NSXzg+^K zt5R(lR`GC8?wzO+YK;!)efe%NZCMp<6xPP22fa#QIBJQBpwsa#0GEbQT{ZWI-3Yn+ z)jF-t2+%tZCuBk1*p(l{VY3m*I!?_>+*r|!zaX+CzoPhCPUdmU(Qnix$L7&@SvlXT zTj%abk>~)Dfe|IT<*e23XlMK8&em>qnUT88i*wc%jq74J9wJWuudDS7Hs?lAjsZC2 zW3skK-_1_b@?uc=Vt&0Js;hLy@`etX14UK)pH$+|LUU_pK+y z*cjhz=rQ6l*S_E9baUkDK)(v5t3uXUKmiTsmzDVZDSK=?8rL3gac7?}(;sc1e*Lie z(*v@XY1pHWDM4%797Plr6`A;7^CF8FihbOY^@gKG_?aZ=maX03!U?%GaUT>iy)6&P z+TMR_7-){9cywnU&yTCrrNVlTU>&w_UQeZ4O?tdg9% z8RD0C{Y{rhs%fdHJ|K=g!VCJpC}FK{u3|%J?*&@P0lf56{J%>#yL|r0Ufs~pP+L1& zJujY!DpZx}d)Lb6&v+g+-JiEYb+_@3&UO{s4e{*#jhIWo*yH?W7+2x`zHjYup(>stwbJY4Dg_ z#hNDWRM^ag{xn1?WKJI>){*e6Zye~y%rrCj`Esc$$8-tF@646;ftX?Dpyq zNCsSr@ALEXXY0Jj#>RM9LSoA*S8fl>Ed57IT)80C?~(;PR&K|}yZOABF{9}tYA;ib z^9Fe=IS;+ndslg$H?WiMnzOMNs9nR^3X~CdrEA{u)Dn$4xT~)|h^#-`{wur$9~k0d z$pEbV5DxueE0~~&<6@h}3#il7J(#g$Zx1x#+_nPO))mW!QR1;X8wmuC>B{Jd#ST}1 z>;N<1RJ_GKA|JJS0iH2c?Y2qbSleVb5C-H7o^S}_2dj&wt?ri^xlUedlxEL~}NAOr<6PFbA%?A%{>a_75_odhF zR!YJ`2U}$q&Dk(%EAV?MNg>nQm8mgjg*AtBjqWwSz)A zN|jJcUw;y1s{`4f;Qi^6KrIz(2xMEx%>_uFZN<$DLueEj6)L-IZ}c%SYpwMT8b3aO~{#jxlAsVb+e>}bYg?(UbE z7?f#Kpj0rfJ=nOuwZ2qQVKK3rg5rAhf)SuU-dvpnHR1Z=xW?z4J3##Q%4H~9Ngpvf zHRXMNumU!4&hOG54zE_u(O`}N8flu}#q;21w7p*8-SMfZAr;B80X*?5RU@N1w@q!n zBq|Du8lZjA_+Ld&o$nq*xL;{B6F*GTWO| zy;tQ{wNbw>wAF|#8ZQXO=&uZkBOeZ|=h_Npt#)12fZi{{$5;O2ha^Hf>BQ$4UWY^; zE;I*M89HcbjR5*1O{XR)*@VMU%L!-^L?{Cu=a-l5?d|@DJ^X+{i@N>Q1Z?JHdx`=7 zm7yV}@3*&nNnlw<0U>&>k^MS>TZTCXJzmfS22fYe&BseY_pR}POgTWCTwGi(k2iI6 zb>pL>_ZNa`^!4-*#&wgXoPn*a;X>3eac zB6cpFr)h(lyuDfzSI={83cL$`2SPr}={ zG1t=4dZv<^Eab)zkcKN)xz=gj8@kT^!=BweH)KfccRIyk@+d|A6NyG7Cx# zzQ5QS5^@g$swrW3YqnQtxq#2v-e)S|aXY>Mzw3(us>k~7?k6NBK2Hd-^;ky_R=QC7 z+f$AWRF5910>Ofi@P+ruR%K>m9bFR`c!4r zHYiC%7WwdZZO1RzO!=SThr_QCvN;1*C}xB{;@Ye2@lY*0-`6f0F(8`zy>Zw`4JT9d z3lqKR9^UmufcQxG( zyE`pENgk{(E@qZs&TpDyq}K#rh0oy+3;EJGwl}?Z=q5`Ph99lh`(A=&lYjR6nnvsw z*y*7q%%Gqkm(^}3clVu16iZwe@9qP?%k2uFA47jPH?^3Fl6qF(2^?WAY;5SMtE1C0 zGOi|Arbf#@g?|73y-pVVfQ%0O13%P|or8rX)8!;9&X}96ifwCqd(L~e4rqJXSy^lb z<#x9>*IZm&qVS{m|0s)A>gt04e*bQ620L40J;WF-|2;Wb1oU!*K}G#RCktpGZfj>l9ES_^p2;DpnM{tqWZeJ zfabmv&-E5+X=(YHon3!2X$t|Uf4VcX;_L-}2g9rnw61H=wjz|jH8k9UNdX`iK6nrk z{v0BUk}|A=qjZXmv4hYXf4=&*{s?P+ZLNK2AM*6{1S;uJ5a?f7&qB%zii*JW$PNb1 zP4)(mN9)g5lhDx61_lPeVDeds(E-zPJ+<@WeF9i-auxjeFQ6g1dV0PG9nV0!eSn9@ z-(wrPjR;DHn}1j68Qn-%mnsO7)i99Dd+`bLVb%bJras1qM5MdFWX{;;u@GC{a36ICCP`*An8>deBTq|naz2=_S&;vzclQ6cI6 zx+)m^!1nh>f=_F?I%`kOUXsNl8-^PcIXGlq>)&_`yfWy^+VS!w%zR%3WHh+9H#j;8 z%7d5UK0W|A0UM*nZ8P>fjxV5M7S6)W?F_o|%O9NF++TNc6H9bit6NMt%PR4$A`HEm z*xA{kk1wB4F`>UtFE0m6;||n3@ZVeHgiy-o<^@*$vh^VqaYSL^i`It$Qx%SDtE(^z z3$*m5j-HR}Sw#hZv3`~F%1D9Ex36Ediwp&=2Y*@*We==GoGu#M@m;>R z54kKsA_17>yIws$o%84SHJYjO=BK5FBve)VQ$@WY0b$`GQ4{t!1JI{5G!8d%($H0z zV_Z#ITJWa~ys2?B$Tj=_rfW-O1uEy*_UEHCKYX(3S7m0iu=I0^^I0T9QwN$j@)+0SM_Y2Ea}+m5@Q$yyS4?N=q`zA6}1;8!@Nz zGnPS|uj(5b`STW-8}=y|WFKuWZO7}W+p|1g)*0T&gBiGaS^_QL{OI=~vyCH(&aKl@ zQ2}Cknbf%VyeRa#4UXdA=RdtT-UNI2_PdUj)f}pSwSP`gC(L<#>dr1Gw|fAx>+qR>HWV|+nK!}+f z9v*&3!DlyFW_`HYlMPD|aw8XbH*cBdTkdmy@I>lUdQ28tNJNCIyE{88tH`_g#wEw2 zQ}{+!Twq|}tnaB&it<>oNrPK<-`D?{1pw7HNDl#UvA@3$fy<2h_6-TJ*sE`hT&tqK z7p|Z|0GEo_>%ja%_yaLMzVk{aQFS}~Y|m`SK{_0?Ubp>48Q60tlcl!EsnWMt*Lh-q zH5M7wtW({E0JyidwuaQz)u(4>27HEofq8{O8I`_i1((bRn59s359;z{wCH*QPV|EO z#S4joAZ^7FHRgvS<7rvBn04AY*8M=Pv_WYjY*LX%Gg}Q}e)cQx6-98TWa)GTvezX1 zNg$VC_oRyB?zIL+J5RxbCCg?@`>^tF*hY2?*<>V9IAo<4CDM&GCBLk{pB&EN&rbVk z)6E|rsK4G?X!CMPPE>0|~-kY~? zr97S)@PN5qTU!fMw$#=)Ktvg6Z_+OV@aWmI9I$>|EYxl3k{@m^=WdN_J=K^9wKX;6 zvj#6NF8F6XKQu4&&xwL%EYL>i|1$58qw#&=f8&#-F8H?X!K!+qZE>oMEis3&2(azJ zk!v`e^#(8m9Mq8wSM>L$JJVH=0A(-0m|&{#U!-SL9j^6(0x)JJo|>BaXEtR!12zWW zc?0O2@VeQqE?WTeU_4wY0#3hyv*fcIi873VqlCgLs*@w+O+Jk4t76@^26{YwYOw(CxJHF2B5^>e0VvAYOj z3@kyahZN%4sd|N@>koI_ufEmb0NGKg(pw3kg(Zk}^UhrAYHchb+*2QLr^V%tZ{35q z^iQ7r(BW9>aPcpWh|8%Ma_+vE=cqBU+PmaU-U^ga+{Sa*9{Xfn?9nUem#(Kw_g>rt~dRIq~qDv(1VoN!ObH$ zmCQyv*P4Hr=pIXoCnY#jKKYIV zBp;prue3-g76Eq9!-o&SXU+TZz_b~z* z!heNsn0R=;Mf|&n{~5`#>6?4*YEB-RU07HMI7#NieQ>2u@v(!-%gddslKa+pHh1J!BzAYdPIwKowPnE%jUV}^Tl~A^U%%AzG{NYa6StW<7viSU*3(OP&6rs%uLR!b zOq%ZTj5P}ji??aH2++NrCZ4LA$e%qIlR-T`qcmMLIj8TyJgaZ^0 z54z}FwqT#iW%eZSU5Jl0|8v1tk^i4kK@(W2d72tI%G&}u?{$Ix2*7H5)*VS#Q9AOP5cUJf+)gUQiW zI}-jsrudy1qQ7h9GiMSiIMD{&!VVT?cE(bHp5 z?&%3yLWW5fz{Z&w8Ss;>`vL7sN-07_60cu(0|#Yemq;U(UALrhWaPLvMOggij9x|! zFaSG!O36p|vd-llV5Eb7&+mO=ckv@F%>*!h;LC|QFNdh-9UUGfiF%j6{2>5_Jit|V z&?OZV!X#)tw^3tP*VkyvD=YRBzg7UX0T2OD88S}OfOBWDtG#B>&<1?l04{$>#@*7~ zjL`^0LICZ4c^$&SGJx)f{PpW(XGT$N_#bcb+?yA4S%sLGm~`uXyp)xd$BK;Rd=8ZW zd#PU@6#$)*z>aSUAQ%8WYe(DKK6R}mVs9wcO#n6ukf5h00GG4%zEicL;3ENjC{jT| z0UI0p6VMh5ISFWJ8h}0Nb+`(cuG$Y(kg$l&V1mFZHwWX*RXV-3vSJeT)CWuz$d%&a z4UP@h?rjldbN;u!Ha7X^8FX}X>_*jhBr*q*0h$F(2mW~vc8$}LY_*=L>3o^> z5co_$2vGu79vHEDNSH5>)j`sv;pW12i7x5svu7%fM}Wa`7ff}Va<02pC-FNPH~7s= zO(p3mJ(8aKa#N`0=Ee(E8TJ-({4DWt(4Q>; zmnkMD1_97NG&Gbj5&+srt=HlD1_;Cy*I(p&`5M%LfdGx$odlp^v_;YM6*At-u$S*8 zfAtg}0^|@oC{S-Kx3)I9R|Dcsh-hBmbkJ*BJ4ETT1q==jhJ|5kj9a57LB!xN7C-bS zNWuI&5=u&uVPVzp7JgT`tg#zb?y0^_7ok?k9N<($doN*1&H#X24-3uj-$6KawYA_% zJVmIHpJ_w*=ml+o?PzCd=>e1y;$Vx78uY1&iG)B@M#jtHF)+O1Vq$o0u_09^LI($j z0-a)*c06#F$A4Mi#C2^CF_(Vt|Xpf_DvXEiEl2kAwjQ2dp|sX&fIPgE~0c-#4RF z;@+5R@PGBH15CgSO=d*}h4ml0pN#9^)-Mtt)62dS_!k|rwcP|?xgYdWmIn(fxW;3b zn2-<;g;|kOxwD`n9BlQ%KgbFSX8gtOy*~;NV~#ZEfI} z#R0^0b8`dAlP|pW4f|cl^zBdD$2`O`qzR%`PB*I zUo>+OTV}a_@n64{zWA>w=I0M&3{RhOhJ#E0JLA8F0{xd9)iwF_USK5&89$Jw|9=Q= zPMHIh0HDY0U>p*5&{#PO99hCL{yE8`299+Xe+vKtHmGrDs~ZRPKB!|N;WP*Tcr25XlY!ag(mN_TS$lc98x>zkkSJd8BXlAu12~fYhu}x7Ck$-y!frAto8al9f40v5}-AUqk zPa_UCc9CJ#FSBOMi&c~e^*?atI?@@#VggP*=um*tIgXdS?^|mCs{~5N)!xBjC(gw0 z)!cylENB#Ky@1DG{*Vejg8OP}YK9-8|LN^D2A~{_F+el<0Knv{vBp|yr}6*EWV7%) z2&z9@#DRcx3s^P42FV~s!qX>`Ikx%l8v?LXenxJM`N6C=SrAZ_QWR>Y#O#A1dm5j; zKJbMBqXRTh&(N?INMHH+%wZX+z9$o6z86q#QITkI0m*BvFKw=^_znR$HeiMT zLxG3o-ePELmSf6wA3(${tTsqsAb$OdFLVRw#QImT+A8AL-+N%Y;IjY}4h|6?s;|5I z=;+99A9tY)q)gV=*TMNtz>i&BSWq)DDb{4}>g?2I{f|rKvFitno&BZuq)Er z`hmAe=Kb(i><15CtElXPu#L91w!1rD3KB#N@9u3^%z;80>*)a#t^TlASk(LEPP%$t zs`rkdj?NfZ?cE9F8aSCROy)6GR#(9&^9B>B8#~bRO|;Vo#-qPZW%Q~Q77Q8{gZr;FK(_c8-Rk-V}MErodg^p0QkU# z&DD5t$fyDKQD0x*?G6LOY8^K-E>6eGOAuLI1-kZsbR^J$L6uViv;W^Gs{%=nva%PU z(t}`=LG%oe7+~dcy=?9XcF5ZUsu&|I&bxjQhpq_?ESmb#|f2TtBGXR6? z0TKo{2GEkej*dJpmO#(I=wy4qi!@A39O1ee8gJjerH|_ZbKe_i&fq9pWD@$*-J!vIFx%OCGRG&4IE z0_frO5TQ&$bvGkhkvSX=w&NcGA1e~|zY&=+VGQxdbgq~D1_CPpS`4($^`!_u`_=(g z4KS@t?E)}F*18kG!2sb20Li?7=-Sz-00Fryg32BcEl`vozL!W{n9c;2xw94x%G1;b zx?VtZ1V~eZfdf)hK4Rjmtajkzowh029+u0q5`$4ETC!4CJWxB@+M1P}%_u5b2T&<+v~(tBc6Q~QAv91N!25de39Q)3`arXfnw14ZlFfwO322@% z2?<`HUb4Lsfz~*8aBu+N@4$OhUh&a)QbA{PASDC-x{hH8@UAIx0@xUU+mlCr0{Ajj zWCF0l+1dKS!mST@V(Cm_?MoorYF8 z=S>9a>vgO?yo26Uvs(|W4CgAtoxgweH8o$@jk6Hvw63|1rEKB~q6#eKp zAf%o34ri7yE&~rvsQ*vPz>

$h}ZlC}NDT7%F#|fvkCwpH>?!`C(-|fbyK$?2+$U5oWVDN>N5ZjCw3&6;g?1&g zHdSvn@g`+YU%a*!3yy&dGc%-Z5xMe7(evZr!#TW=WDd}dO2d!Vv1d&qy(5mbCwL}M zt#|4Ecrnb(Z=JQh;4%?g?tCes$a7mlql4Z%_q4YQS8c`&@}#6xl2QLrI&B;=b}5w^ zEE{#q)vwleu+tkqNcB+PT*uV$&60XR$IPSkdwe+UL+@4`Gz8fs-c!hQ|8`$sZN5VD zJY_=GZlhC~v9+{P!p^T}YL3N*Z5*SYo7>vhE)})Vgp2W7bP{?~Y;GG=000`(`Ub7v z2E_w7CE!}XI_5C0B_$*4FbuQ!lI#m*ktZ$nPo?N7e=B!p)U{oSYHY^zD0t_{_xXO~ z{tMWGui+nA6@HjmxO#Y_{S^D(WrwpvKJ_p(Q)SW{5=+*chHtYWoV<1_I)_fYX;pi3 zL;ZTQh0D>R!`|&?O9jZb;-c1QCBaK)nnLlYd`wrjmSNMadQ6Ctn9;R0pMVn@@@_JD zUxp9umAp?GKT9dIxr2|BK0*;EMX?g~kR&mtj3f)YA&VP_20IO-sX6CQox!dY;>0`Q zWqEm#!&p5AK;;W&3lAUWf1Iwl)hj8{i8AF&>VY9Q%I?yB>-f7lHT}xV4zJ-;ssc5i zE}`}G#jQ7*5H=;T@ov=Yj;Hq{DEIhm*NYU=u@xD^cv94MP>4R8VPP!Ai3lPF>WmW{LzQJn{)qpsG7s50yHEYdA#gREzJ%J){cCAh)YQheU8!k3W1P@{4G95ltVU=j*B* zOnvw%hm8rt6>eAm5zYoly9MX4L6y3hvNJ~!??00c+=V>t46CNfVkSfOoE=N_I3XJ< z?EHO2?B61sr4)AzkDM_AToRO0_PuqA1rHGwtx?_doTLwgQrLGCd@Qs^e)AjStuN*b zZO$2TDt%=F0?A^#=UM6^k zHuX8gzBmIF5krng{O=A9mG1&-t-P<4BIO=eUiIem$4Z_1GO z@g-)af>$Qrk4uQ>Hv# zf!*8=YE|Tm2C)goM|LvG9+LwLeP_r-9gmd2S=ec!jQ8xH4-T6 zxui1bHeM$Pnb5s8i?-SCKVnE<^hRC|Pp4&t_BX|?s3R*sv`fXW%KVcYx?4L-Gs66Ib;&2Tw8!`RsM+Up3ec>A0qr?gz)joR~OKz86Kazl4~y9yuqC z;z^m{oe7d&#z4BPxo+|-?@^C}6yE+p4`~QL^Tv$snejiK1+8D~Lz9FWp^Vyyf`zJS zdfxOz#|BUYE7Ua#Tj)Sw8>o?OZbHMOYam#%8Gh&#+wb|00rlG~1r zjqywbi&ilLVjxtcNp;M_cd=yNoxR+I{3rHk5x9+|NlJJIKY8y8rdx}Zga`W!X$eWs zy=kL^aHr0QX5A5pS?`M3lb5HKTFfZ<@v;*OZS6YvG4}3^w?qS{SX$r0yBpvv17QSE z%H5SX6X1be0r&7Tjra{9bqQ>F*U^WTG&oas*Lq3*W%|rC6#Xx*efnTE`exMQ2b6~9 zN(|5^*S3wR9tEoI(>rLNo6dXhh4z#&mHK|^6(4oFKS_`cuPk= z9YXA<>nguQmPU$}+@yRldJ`4x$#*wdU+i+X|^2d0Czxdmt6PXJnUZcg* z%Iv#R*_YHi+GffoNAFsL?3U6;XvlQ=2$`wIS*M>n3eoJjlM&0klzZO=)>r-yMu3S1 zfLEjsOp#8j?n9RN0UrqcaKGG7dUzXDxezX%L_Jt|r(dn-(=GILc>#g8zIk5^i|Du{ zj*V@_^^#p= zd!9~8?V-C-5c0uW^hbZ+kL0BD&nM7Y9k=OxSN|Ao^p1|okgs+tB6Oa$`B1b8Jjz8h1FoW?L%lY7X9g4i6(W-wnS8iH z$N+x2#x+tB+<6J^Uo4MyLRCEgrVwYy2*!Ci!-d2vH?}^06=WE3!vFb8SY^-W7v(3Z z3U}8RA-Mv;JbktzS)?1A29lJ#M?pJAyjR^!&q;J&evX0r)NJHluInE@;lX&L_nmN7 zDr{xTA$QzbOr8x zM>FJeXG}Mq`uo@3X)}vUj5}(6_G8xZ)&x(XPI1UyJ)zA1L+e1a0Q1Abbd^h=*d=R# zjNaO-ge zqI+5Wvsu{ZWXu%h-rf*@t8UW4?F=w+DC<9@qi&ymXIDM`oBf31v656#lw&%7K6xUh z4_p4Wfn#_>js3n<;+HQ#7?o1{E}N;Ar#WYLF?TkQ$*4l=Xv4WQQuP@Z*V$XxLubs_ z`?OHEbP+_7LPA4dy?(s~qH!Ra1dR6E!?ar;z=vUqy!nNNKBlfBoW|TdJg@xAKXevK zz?MoGT^h>D`i}W+PScJaF`n*vm&dV(HS8!|8I&7;Xrhf#(6Z^-h(FXi&R_mcXmT4s zT?a?pUTgx@Yv5s-KHJPvS$~J|Q_EXyzL(wDL77C;g=}uW1^2(l6MRzjV5R(Mbie0w zylA1dXhd`N`3O_N+fgw|eadgV{1(3}LzmhyLTY?0wl5s{eHy@x%kiymw1!7mY;9WT z)Ly;}tf>)}QFHyHPiOP0_l786^K1_f_C!)7@V1rrdS}Ne{`T)_s1#PghCcyJ7=oyN zLBC&KK8U1zT2b-$(IY1aB4Yjba{(wsOid-72BKBMw{YIwj2up~@pC1V&;T=<}<#esIqWVW3)?0tTJ<(sc|LZ%O5X@!#i!>rF$Ie`A$*~Rji z@^+@ZU?|zYu6yMjMEc;N|@_~BjPmmcb9&@QOtR5>=&!eQIjNhid z-=UYuRX>V}Q6ItPu%DWENAfDt5aB6RS19XIKDgnk^R3ACMPhmYBxH^TZm>bS{_TzF zVRGwFffE*XeBtfqJB=BmrG<&1rKSclaaBNF?bBf*?CrI${3T2ACE1>Pv=3fra%ju& z7_3IW@B!wB9|jVp&YeAJxYS@R+9S!WZD?cUXN@@hci(?_iQJ?pOOeeyK011Ui%T3T z4FsF3H>jwn2#`YGH&6ed!ia=h+k9_uT+4i>+}6T($%Yl&?6okFTO#J$jWd<2pI7$v zg)!OBx_>{iVKKA`h7_dyEI}JD;2u$t)1G>bOEKV zLBX!2{X6LIBT>gZZ)HK%v9nWs3DdAtx0{vzUf_D}`Tz!WB!SRnr51j3)|+;E3%~L>?CKT! zZj*%{kS9L1^Y2GPJW`=14ws3d-aGf9;V7n_sg_L>OiGy=ynZ$*p{LOdLo(o(g6G!1 zztmi2P3v>CvNDbRx9k~1U&PwOKTkgXfMxJ1Ys!6R^sj!ywcciaenBhUlejM5@h|pP zR#shobg5yZhnq8-M^*8aU9gG~yCj<|b;cO6 zVMluka&n-F07Ev_r3YXz866^?VGR)1RY?l02(c0~g>!WRr!5xSS- z|1iC7Qv%MJskA?Ab97~OMr(WuI21;-kM=xk%a3d}l*=@kR}N`>f*Nw@EYUz%gaSN} z1y|ss;7O#-WDRYU=_3@foZa2UoUcypYfcRndJF$HwhLUGQ%MgaP))C47NNqU z{qnsxE``Q*7a+O~0q^xG{wp{f4g~h#9=$*-5?9t=6Lue(8i5`@{ovvK`x~=H1tT`( zj--AZeoJRiaPz|9Ir{qm5a>~x+5vARWmw}Li96wcdpQSkZvT|$ldTD3JR2Efg^ zz|#Zqh{ul~1L>Y5R2ukI;Upa86%{lf?ggyWGW~6Ezs^tf4FJx7Ee*VCVm5uCc!NEu z2Qo15TtKA0r9~RJDIRma{NO$=@SZ{`JFO%p$uF$&A%u1fcqTAN20?Fs`Iv}^7k*>~ z{jU?}^iKC(W0S_GBB4w3}Q=8slwWw|gZcn813cVm5oB%cl>Qmbf5R?Os^xL;f zz*fz8V`^Gr+Jp|tD=G?u(3y!zT2fMyA^R=JpN5jgbeQuy&T8gqKERYRF=+s*I`9;# zt0%j=w}6KTk{-mw#M#-|z|#l0HlVfx`#MV<)C#z*Z;6k{(dfuRL!K5DSa6a`!*L@!%<)Zt`0+;UQdV$kW=0f*@obJQ6tcd?zWN`< zoM$+kTf4^}k-Q`#dI>>D$PUq>chMOkh!LZcAc7%?Hd+uhQFe?LEsTjWh!UcVvenIm zXrtRg5Xlf_lo{n+=RN1c`Eb6UkI!|j>$%pmuKW4lYu*3fz3x(op_IMbka2-}o-&l0 zo_-DjJ9J?BfzW{f>_4%vV3M4ZmGxhy3MiQ0QkRa6i;EynSZNh8LmLL|c6FZ9wSW@_ z_%Q=GX~IEA_``?nxrEIhKY$@bB9VYK<8n6}^nw8h4b$%0nGtd~gMQJZjO0cD-|O-FS&0oeD$s90-&}G3KM&)B4Px4w82rY znRLitAI6&8^LTq2#X!rj(ec~yiwX0&sDHpQnKj|2uyAaasJwy#Xn#}(edxfGzrzW; z$!cR`lWnZ`E-Fvni%0sxWY9z)_f?GkZhDiWiH!|)q)5Axi|LFz$SA5+QQFA%*x;Hq zZ+6b7oZfsrUO!$mza10bz2$LceOEdj3bkE(UJxBmouRn$43)fLq+R`WeraU|V0_1b z;RX;p=>DOljRuafpW-`UECGzKue0v273QJbw@Z>vg zWinS}!*z9Z;&p^9EG)8(;T9G$pwteIcr=kMEmTk<08R<{Cvn1q3`+9RFJFFONSOgu zV<0S5SZpBh+yRvV`S|;n$fp_S$O1G3Fh_C<3JPj!dCIDue0F@?wd)R%m_DBEkGI8R zweH~rWy4EUjjWy9V-ULW|5AFQl)n|4E(Sg%Iv*ucfy03!h!*`<20u>0nDtntBxbF> zu6Me~hWgR^^uJLa97WQx#DJnkE5uVo+1+;5ap-!Dy(XWYd-6Xh&NfV~QT1EVU0g7V zKc&DvSiW8M^$ZOJq48*r0FIo@k7vn@M)c<*SFwa+9O@K~?~!L%GFkcx(+{OmkezF_ z!@|Wkwd?w)5>MPJi7b*H0aC-E`MZrf9A4uLi7#1Snk*{bzkOxNbKkoC&+wegb7_To z2yGq#r6_|3mJS!71^qVD@EKzvrxhF>k8%15 zH_Lssv_CL=M-3hj*5Hu5xEF{;+BavPC0BsW>s;D(5n)%|sYE3jzpmk!gS~x7 zGsKqyRwUuo`*NXSdQ&Pym2;>rtE{-0*cjgS{nH|$cX)NorGS;AcCb+b%Y_yA?9)9; zG-sDQ7m2VY-8wr;nCE&S)&*agClv1y2YHl;rX4wa&(I2=w+#GI{w z#0cBMd=^N*nAe#pjU!*&@}LK{cCG$f=0ArkF9_Z1chJfY(4dVhr-))5u_Z$#Ob4hY zRez;cZ^_q6L)NlsW#i?CqsvyJ!4XRs){Q!J*HwY!CIk2vU9wE0@6xJ55+ouiM za&1gG@+)ZUtNh?vXL-bK!M?;-EVyU9Pg}bJ0q>iBAK`u{@UXXs%RLjGYhH}Ny zv!hp^1D`V;T~ihaQQz{me_<`(`i+oEl<}z;D1JOao?!6ew7=M1>$zE*ch+W6C$>2` zuU1Pk7|k!K9Ibr&k{xP#7pT-AMV`a^S*Ka=z=KzM44|OJ-zVMwbl1kz{wkiv<>A)w z8v1u6kQr90<%-)q35sTO&kjbj{(7g&#>rBvdL^!J31!3MAXsG}c7G7QI{W(&dSGsS zn?Ioc%f&30AJ0CEhuEMTTiZUX1q4ZfMUmK-7`!kz9pYKk;FC0n9`AZ+MMn&V@9t$& zXf|nfusba&o2&$t$zNH70xzV~RztVgLFVG7%tdJ6!hnEMczuU!6dFCrv&1tYV`=AS z=i#&=)S}D3tF|B)M07&aevWt`d;kNhj6ze_rOE2`)RF1Q?7L&v#!piYRED0{$keeR zE++g{8jZiYBShPnqiQ6-7;+l2Mn>H@{nDV4i^$>so1c|z_bhPQW@Py}= zsEM*XF$_n!dbt1XzoD3!5%C72A#%H z-$T*J=1e`NY6VR;G(I11jyVsh_dRm-3bRCULY_gYP=F!kk?n1K^BMWT($QU}e>f{- zVb?aL3>$2n|6pNkw(hRy_v(~z4g`Z7SeqKEFhYI0VSU@Ai${>E?itBdceu|Ey>6zY^MFbShLl6=x*##{A~MTkVO#Ru=319 zuef0W&cSXv4K;Ts=d`T+sq4s~r%n(QG}a~?l2zv}q|&+<)Nh%FzFbDTVDqWfq(q;M*(4n+>G>P7Ikkq_Zm4Mj#bqru#+v7xW@y|&A*Zk_m! z%o1lmc*?GDr}ILE_|M_J^;cICrHMhWeF#Jwya<=y=1S|n)WzY;REH=3EhrAK2~5Z+C8l-)8o7?Vo~UPgBl~@X3+B>oSmu*LuM2QJBs0nrj?sNqs!$sVH?Cp5SAS>NHc1Xrfm3_A!# z1(>%)gM-lz76e0>#tx$iy*J5ISd>)$LO1v2;aE}l4-wOf(204)8VuJ zqqsg)3a`c@(Buyr=0L)-l!MDj)K5Bo!Ct}7+@5`Hd+)bcFk9nJ8?45!l``Hno}8Wx z#EsFEN8;G02vhuI;FqvMcyk&R=4~04vFd;I0`gMzZ+oZQa$Fh4P|BhZhY6$fJ`KpE z#5sibQ{|8tHgacPYhW-(iYSi_4<_;6rjRN39wC+YU*2-TZ;f|!cAAcScgI#~-I(aT zVsZqOx~u-El2AW8ISODP(sazkJ~IsqEUzl7!W0W{7>$Ex8pl^l$wQ+{yn^6!u+HEp&$cvFaI9I%q?(OLQcp|vrdi}x^{Za zgRP^gp=C#G=OAw(lQ|251S2kfy^M2cQs1cig8*a5@40x!W|moeZkg82IQOFq;fh~= zaJ_^7VYW}1mIu^O`n*v#|FTgw`@-dPhK!`G)^cBL=vrK`Lw7(QF$!^_CrCYmU1znu)bhBKcd5?2w-_X| zg7Sz&#(2z?WA&A{-#u$7S+-`XX-sSQc*O!;WRjUZB61{tY1=x6`90ScHx^2sXo6%B zT12_viMskA>chk~(^?(9ppN9we@3kS&qnJt($h}zNltT?jtGLtgvY6I(6O9)AYaL>p+a1m%1m9)tZ5YsK4V{T~zk-#bEj!4Rh}LNUy3Qf@5&zr!gS(-T|T$*H$B R!6mDZp{|Kem6qene*^o$gRKAn diff --git a/plugins/redmine_git_server/assets/javascripts/git_server.js b/plugins/redmine_git_server/assets/javascripts/git_server.js deleted file mode 100644 index cb05c2b..0000000 --- a/plugins/redmine_git_server/assets/javascripts/git_server.js +++ /dev/null @@ -1,15 +0,0 @@ -$(() => { - $('body.controller-repositories.action-show code.clone-input-group input').click(function() { - $(this).select() - }) - $('body.controller-repositories.action-show code.clone-input-group button').click(function() { - const $this = $(this) - $this.siblings('input').click() - document.execCommand("copy") - const $flash = $this.parent().siblings('.flash.notice') - $flash.show() - setTimeout(function() { - $flash.hide("fast") - }, 1000) - }) -}) diff --git a/plugins/redmine_git_server/assets/stylesheets/git_server.css b/plugins/redmine_git_server/assets/stylesheets/git_server.css deleted file mode 100644 index 66f13fd..0000000 --- a/plugins/redmine_git_server/assets/stylesheets/git_server.css +++ /dev/null @@ -1,47 +0,0 @@ -.clone-wrapper { - display: inline-block; - margin-left: O!important; -} -.clone-button { - background-color: #fff; - background-image: url(../../../images/arrow_down.png); - background-repeat: no-repeat; - background-position: calc(100% - 7px) 50%; - padding-right: 20px; - font-size: 0.9em; -} -.clone-dropdown { - top: 28px!important; - padding: 1em; - width: 350px; - } -.clone-input-group { - display: flex; - flex-direction: row; -} -.clone-input-group > * { - height: 26px!important; -} -.clone-input-group input { - flex: 1; - font-size: 1.2em; - font-family: inherit; -} -.clone-input-group button { - flex: none; - margin-left: 0.5em; -} -.clone-input-group button img { - vertical-align: middle; -} -.clone-form .flash.notice { - display: none; - position: absolute; - padding-right: 1em; - right: .5em; - margin-top: 1.5em; -} -.empty-clone-form { - max-width: 600px; - position: relative; -} diff --git a/plugins/redmine_git_server/config/locales/en.yml b/plugins/redmine_git_server/config/locales/en.yml deleted file mode 100644 index eb2d415..0000000 --- a/plugins/redmine_git_server/config/locales/en.yml +++ /dev/null @@ -1,9 +0,0 @@ -en: - project_module_git_server: Git Server - clone: Clone - clone_with_protocol: Clone with %{protocol} - use_git_with_this_web_url: Use Git with this web URL. - url_copied: URL copied to the clipboard - git_read_write_access: Read/write access. - git_read_only_access: Read only access. - empty_repository: This repository is empty. diff --git a/plugins/redmine_git_server/config/locales/es.yml b/plugins/redmine_git_server/config/locales/es.yml deleted file mode 100644 index f6c486c..0000000 --- a/plugins/redmine_git_server/config/locales/es.yml +++ /dev/null @@ -1,9 +0,0 @@ -es: - project_module_git_server: Git Server - clone: Clonar - clone_with_protocol: Clonar usando %{protocol} - use_git_with_this_web_url: Usar Git con esta URL. - url_copied: URL copiada al portapapeles - git_read_write_access: Acceso de lectura/escritura. - git_read_only_access: Acceso de sólo lectura. - empty_repository: Este repositorio está vacío. diff --git a/plugins/redmine_git_server/config/locales/fr.yml b/plugins/redmine_git_server/config/locales/fr.yml deleted file mode 100644 index 1b0efa2..0000000 --- a/plugins/redmine_git_server/config/locales/fr.yml +++ /dev/null @@ -1,10 +0,0 @@ -fr: - project_module_git_server: Serveur Git - clone: Cloner - clone_with_protocol: Cloner via %{protocol} - use_git_with_this_web_url: Utilisez Git avec cette URL. - url_copied: URL copiée dans le presse-papiers - git_read_write_access: Accès en lecture/écriture. - git_read_only_access: Accès en lecture seule. - empty_repository: Ce dépôt est vide. - diff --git a/plugins/redmine_git_server/config/routes.rb b/plugins/redmine_git_server/config/routes.rb deleted file mode 100644 index c86c96a..0000000 --- a/plugins/redmine_git_server/config/routes.rb +++ /dev/null @@ -1,15 +0,0 @@ - -Grack::App::ROUTES.each do |grack_route| - regex = grack_route[0] - method = grack_route[1].downcase.to_sym - action = grack_route[2] - match 'projects/:id/repository/:repository_id/*path', - controller: 'git_server', - action: action, - via: method, - format: false, - constraints: -> (request) { - regex.match(request.path) - } -end - diff --git a/plugins/redmine_git_server/init.rb b/plugins/redmine_git_server/init.rb deleted file mode 100644 index b56cfdd..0000000 --- a/plugins/redmine_git_server/init.rb +++ /dev/null @@ -1,21 +0,0 @@ -Redmine::Plugin.register :redmine_git_server do - name 'Redmine Git Server plugin' - author 'Romain Lalaut' - description 'This is a plugin for Redmine allowing to serve the git repositories through the http connection' - url 'https://github.com/voondo/redmine_git_server' - version '0.4' - author_url 'https://github.com/voondo' - project_module :git_server do - permission :enable_git_server, {} - end -end - -require_dependency 'redmine_git_server/hooks' - -app = Rails.application -app.config.to_prepare do - plugin = Redmine::Plugin.find(:redmine_git_server) - plugin.requires_redmine_plugin :redmine_base_rspec, :version_or_higher => '0.0.4' if Rails.env.test? - plugin.requires_redmine_plugin :redmine_base_deface, :version_or_higher => '0.0.1' - require_dependency 'redmine_git_server/patches/repositories_controller_patch' -end diff --git a/plugins/redmine_git_server/lib/redmine_git_server/grack_app.rb b/plugins/redmine_git_server/lib/redmine_git_server/grack_app.rb deleted file mode 100644 index d763f3a..0000000 --- a/plugins/redmine_git_server/lib/redmine_git_server/grack_app.rb +++ /dev/null @@ -1,15 +0,0 @@ -module RedmineGitServer - class GrackApp < Grack::App - - def initialize opts - @request = opts.fetch(:request, nil) - @env = @request.env - @git = RedmineGitServer::GrackGitAdapter.new Redmine::Scm::Adapters::GitAdapter::GIT_BIN - @git.repository_path = opts.fetch(:repository_path, nil) - @allow_push = opts.fetch(:allow_push, nil) - @allow_pull = opts.fetch(:allow_pull, nil) - @request_verb = @request.method - end - - end -end diff --git a/plugins/redmine_git_server/lib/redmine_git_server/grack_git_adapter.rb b/plugins/redmine_git_server/lib/redmine_git_server/grack_git_adapter.rb deleted file mode 100644 index 6784443..0000000 --- a/plugins/redmine_git_server/lib/redmine_git_server/grack_git_adapter.rb +++ /dev/null @@ -1,26 +0,0 @@ - -module RedmineGitServer - class GrackGitAdapter < Grack::GitAdapter - - def command(cmd, args, io_in, io_out, dir = nil) - cmd = [git_path, cmd] + args - opts = {:err => :close} - opts[:chdir] = dir unless dir.nil? - cmd << opts - IO.popen(cmd, 'r+b') do |pipe| - while !io_in.nil? and !io_in.closed? and !io_in.eof? do - chunk = io_in.read(READ_SIZE) - pipe.write(chunk) - end - pipe.close_write - while !pipe.eof? do - chunk = pipe.read(READ_SIZE) - unless io_out.nil? - io_out.write(chunk) - end - end - end - end - - end -end diff --git a/plugins/redmine_git_server/lib/redmine_git_server/hooks.rb b/plugins/redmine_git_server/lib/redmine_git_server/hooks.rb deleted file mode 100644 index b637c21..0000000 --- a/plugins/redmine_git_server/lib/redmine_git_server/hooks.rb +++ /dev/null @@ -1,11 +0,0 @@ -module RedmineGitServer - class Hooks < Redmine::Hook::ViewListener - - # Add our css/js on each page - def view_layouts_base_html_head(context) - tags = stylesheet_link_tag('git_server.css', plugin: 'redmine_git_server') - tags += javascript_include_tag('git_server.js', plugin: 'redmine_git_server') - end - - end -end diff --git a/plugins/redmine_git_server/lib/redmine_git_server/patches/repositories_controller_patch.rb b/plugins/redmine_git_server/lib/redmine_git_server/patches/repositories_controller_patch.rb deleted file mode 100644 index 84dd740..0000000 --- a/plugins/redmine_git_server/lib/redmine_git_server/patches/repositories_controller_patch.rb +++ /dev/null @@ -1,12 +0,0 @@ -require_dependency 'repositories_controller' - -module RepositoriesControllerWithGitServerSupport - - def show_error_not_found - return super if params[:action] != 'show' - render action: 'empty' - end - -end - -RepositoriesController.send(:prepend, RepositoriesControllerWithGitServerSupport) diff --git a/plugins/redmine_git_server/spec/controllers/git_server_controller_spec.rb b/plugins/redmine_git_server/spec/controllers/git_server_controller_spec.rb deleted file mode 100644 index cb4c2e4..0000000 --- a/plugins/redmine_git_server/spec/controllers/git_server_controller_spec.rb +++ /dev/null @@ -1,16 +0,0 @@ -require "spec_helper" - -describe GitServerController, :type => :controller do - - fixtures :roles, :users - - before do - @request.session[:user_id] = 1 # Admin - User.current = User.find(1) - Setting.default_language = 'en' - end - - it "should be tested (FIXME)" do - end - -end diff --git a/plugins/redmine_git_server/spec/helpers/git_server_helper_spec.rb b/plugins/redmine_git_server/spec/helpers/git_server_helper_spec.rb deleted file mode 100644 index 353f339..0000000 --- a/plugins/redmine_git_server/spec/helpers/git_server_helper_spec.rb +++ /dev/null @@ -1,8 +0,0 @@ -require 'spec_helper' - -describe GitServerHelper, type: :helper do - - it "should be tested (FIXME)" do - end - -end diff --git a/plugins/redmine_git_server/spec/support/additional_environment.rb b/plugins/redmine_git_server/spec/support/additional_environment.rb deleted file mode 100644 index 0b0cde6..0000000 --- a/plugins/redmine_git_server/spec/support/additional_environment.rb +++ /dev/null @@ -1,4 +0,0 @@ -# for travis debugging -# config.logger = Logger.new(STDOUT) -# config.logger.level = Logger::INFO -# config.log_level = :info diff --git a/plugins/redmine_git_server/spec/support/database.yml.travis b/plugins/redmine_git_server/spec/support/database.yml.travis deleted file mode 100644 index ee88b7a..0000000 --- a/plugins/redmine_git_server/spec/support/database.yml.travis +++ /dev/null @@ -1,6 +0,0 @@ -test: - adapter: postgresql - encoding: unicode - pool: 5 - database: travis_ci_test - user: postgres diff --git a/public/themes/circlepro/stylesheets/application.css b/public/themes/circlepro/stylesheets/application.css index c7295c0..d72726e 100644 --- a/public/themes/circlepro/stylesheets/application.css +++ b/public/themes/circlepro/stylesheets/application.css @@ -1305,10 +1305,6 @@ input[type="submit"].small { font-size: 12px; } -div.clone-wrapper .clone-button { - line-height: normal; -} - /******************************************************************************* 19. GANTT CHART */